ImageViewerRoom.js 3.6 KB
Newer Older
Alexander Bazo committed
1 2
/* eslint-env node */

Alexander Bazo committed
3
const MAX_GAZE_POINT_AGE = 2000,
Alexander Bazo committed
4 5 6 7 8 9 10 11 12
  GAZE_POINT_UPDATE_DELAY = 250;

const colyseus = require("colyseus"),
  Logger = require("../utils/Logger.js"),
  ServerConfiguration = require("../config/ServerConfig.js"),
  GazePoint = require("../logic/GazePoint.js"),
  Task = require("../logic/Task.js"),
  ImageViewerState = require("../logic/ImageViewerState.js");

Alexander Bazo committed
13 14
var tasks = Task.getTasks(), 
  availableTasks,
Alexander Bazo committed
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
  currentTask,
  currentTaskIndex,
  gazePoints,
  gazeSubscribers,
  lastGazePointUpdate = 0;

class ImageViewerRoom extends colyseus.Room {

  onCreate() {
    Logger.log("Creating ImageViewer room", "ImageViewer Room");
    gazePoints = [];
    gazeSubscribers = [];
    this.createTasks();
    this.setState(new ImageViewerState());
    this.setSimulationInterval(this.update.bind(this), ServerConfiguration.getUpdateInterval());
    this.setTask();
  }

  createTasks() {
    availableTasks = [];
Alexander Bazo committed
35 36 37
    for (let i = 0; i < tasks.length; i++) {
      availableTasks.push(new Task(tasks[i].imageUrl, tasks[i].taskDescription,
        tasks[i].taskSource, tasks[i].duration));
Alexander Bazo committed
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
    }
    currentTaskIndex = 0;
  }

  onJoin(client, options) {
    Logger.log(`Viewer ${client.sessionId} joined ImageViewer room`,
      "ImageViewer Room");
  }

  onMessage(client, message) {
    if (message.type === "gaze") {
      message.data.source = client.id;
      let point = GazePoint.fromClientData(message.data);
      gazePoints.push(point);
      Logger.log(`Adding new gaze point (${gazePoints.length} points stored)`, "ImageViewer Room");
    }
    if (message.type === "subscribeToGazeData") {
      Logger.log("Gaze observer subsribed", "ImageViewer Room");
      gazeSubscribers.push(client);
    }
  }

  onLeave(client, consented) {
    Logger.log(`Viewer ${client.sessionId} left ImageViewer room`,
      "ImageViewer Room");
  }

  onDispose() {
    Logger.log("Disposing ImageViewer room", "ImageViewer Room");
  }

  onTaskFinished() {
    Logger.log(`Switching to next task`, "ImageViewer Room");
    this.setTask();
  }

Alexander Bazo committed
74
  // Run on each tick (~30FPS)
Alexander Bazo committed
75 76
  update() {
    let now = Date.now();
Alexander Bazo committed
77
    // Remove old gaze points
Alexander Bazo committed
78
    this.updateGazePoints(now);
Alexander Bazo committed
79 80 81 82 83
    // Sanity check to prevent empty updates to subscribers
    if(gazePoints.length === 0) {
      return;
    }
    // Sanity check to prevent high frequency gaze updates to subscribers
Alexander Bazo committed
84 85 86 87 88
    if(now - lastGazePointUpdate < GAZE_POINT_UPDATE_DELAY) {
      return;
    }
    for (let i = 0; i < gazeSubscribers.length; i++) {
      Logger.log(`${gazePoints.length} gaze points available`);
Alexander Bazo committed
89 90 91
      if (gazeSubscribers[i]) {
        Logger.log(`Sending ${gazePoints.length} gaze points to subscriber`, "ImageViewer Room");
        this.send(gazeSubscribers[i],{
Alexander Bazo committed
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
          type: "gazelist",
          data: gazePoints,
        });
      }
    }
    lastGazePointUpdate = now;
  }

  updateGazePoints(now) {
    for (let i = gazePoints.length - 1; i >= 0; i--) {
      let age = now - gazePoints[i].createdAt;
      if (age > MAX_GAZE_POINT_AGE) {
        gazePoints.splice(i, 1);
      } else {
        gazePoints[i].relativeAge = age / MAX_GAZE_POINT_AGE;
      }
    }
  }

  setTask() {
    Logger.log("Sending current task to state", "ImageViewrRoom");
Alexander Bazo committed
113
    // Cycle through available tasks
Alexander Bazo committed
114 115 116 117 118
    currentTaskIndex += 1;
    if (currentTaskIndex >= availableTasks.length) {
      currentTaskIndex = 0;
    }
    currentTask = availableTasks[currentTaskIndex];
Alexander Bazo committed
119 120
    // Send task to state to auto update clients
    // Set listener for task change event (is based on task's duration property)
Alexander Bazo committed
121 122 123 124 125
    this.state.setTask(currentTask, this.onTaskFinished.bind(this));
  }
}

module.exports = ImageViewerRoom;