diff --git a/hugvey/panopticon.py b/hugvey/panopticon.py
index ad959a2..b0448b9 100644
--- a/hugvey/panopticon.py
+++ b/hugvey/panopticon.py
@@ -293,6 +293,14 @@ def getVoiceHandler(voiceStorage):
self.finish()
return VoiceHandler
+class InfoHandler(tornado.web.RequestHandler):
+ def initialize(self, command):
+ self.command = command
+
+ async def get(self):
+ self.write(json.dumps(self.command.hugvey_ids))
+
+
class StaticFileWithHeaderHandler(tornado.web.StaticFileHandler):
def set_extra_headers(self, path):
"""For subclass to add extra headers to the response"""
@@ -314,6 +322,7 @@ class Panopticon(object):
{"path": config['web']['files_dir']}),
(r"/upload", getUploadHandler(self.command)),
(r"/voice", getVoiceHandler(self.voiceStorage)),
+ (r"/count", InfoHandler, {'command': self.command}),
(r"/(.*)", StaticFileWithHeaderHandler,
{"path": web_dir, "default_filename": 'index.html'}),
], debug=True)
diff --git a/www/js/hugvey_timeline.js b/www/js/hugvey_timeline.js
index 814ab41..58dfd33 100644
--- a/www/js/hugvey_timeline.js
+++ b/www/js/hugvey_timeline.js
@@ -1,6 +1,7 @@
var ws = new ReconnectingWebSocket( window.location.origin.replace('http', 'ws') +'/ws', null, { debug: false, reconnectInterval: 3000 } );
var seeme = true;
+var tl ;
var error_audio = new Audio('siren.wav');
var playSoundOnError = true;
@@ -33,6 +34,8 @@ class Timeline{
{content: '.', start: new Date(), type: 'point', group: 1}
]);
// console.log('init timeline');
+
+ this.lightMap = {};
let groups = [];
for(let hid = 1; hid<=this.count; hid++) {
@@ -107,12 +110,25 @@ class Timeline{
}
if(msg['action'] == 'status') {
+ // reconstruct mapping of lights to hugveys
+ this.lightMap = {}
for(let hv of msg['hugveys']){
- console.log(hv['language'], hv['status']);
- let evenOdd = parseInt(hv['id'])%2 ? 'odd': 'even';
+ if(!this.lightMap.hasOwnProperty(hv['light_id'])) {
+ this.lightMap[hv['light_id']] = [];
+ }
+ this.lightMap[hv['light_id']].push(hv['id']);
+ }
+
+ // loop over statusses of hugveys and show them at the appropriate lights
+ for(let hv of msg['hugveys']){
+// console.log(hv['language'], hv['status']);
+ let evenOdd = parseInt(hv['light_id'])%2 ? 'odd': 'even';
let availableClass = hv['available'] ? 'is-available' : 'is-not-available';
- let realHugveyId = hv['id'] == hv['light_id'] ? "" : `(#${hv['id']})`;
- this.dataGroups.update({id: parseInt(hv['id']), content: `
Hugvey ${hv['light_id']} ${realHugveyId}
${hv['time_since_hugvey_spoke']}${hv['time_since_visitor_spoke']}
`, className: `status-${hv['status']} ${availableClass} lang-${hv['language']} ${evenOdd}`})
+ let realHugveyId = "";
+ if(this.lightMap[hv['light_id']].length > 1 || this.lightMap[hv['light_id']][0] != hv['light_id']) {
+ realHugveyId = '(#' + this.lightMap[hv['light_id']].join(' #') + ')';
+ }
+ this.dataGroups.update({id: parseInt(hv['light_id']), content: `Hugvey ${hv['light_id']} ${realHugveyId}
${hv['time_since_hugvey_spoke']}${hv['time_since_visitor_spoke']}
`, className: `status-${hv['status']} ${availableClass} lang-${hv['language']} ${evenOdd}`})
}
}
@@ -120,9 +136,13 @@ class Timeline{
return;
}
- console.debug(msg, this);
- let hv_id = parseInt(msg['id']);
+// let hv_id = parseInt(msg['id']);
+ let hv_machine_id = parseInt(msg['id']);
+ // map to light id:
+ let hv_id = Object.keys(this.lightMap).find(key => this.lightMap[key].indexOf(hv_machine_id) >= 0);
+
+ console.debug(msg, hv_id);
// {'action': 'log', 'id':hugvey_id, 'type': items[0], 'info', 'args'}
let d, parts;
switch(msg['type']){
@@ -135,11 +155,11 @@ class Timeline{
let msgContent = parts.join(' ');
let mId = 'm-'+msgUuid+'-'+hv_id;
d = this.eventDataSet.get(mId);
- console.log(msgId, msgEvent, msgContent);
+// console.log(msgId, msgEvent, msgContent);
if(d !== null && msgEvent == 'done'){
d['end'] = new Date();
this.eventDataSet.update(d);
- console.log('update', d);
+// console.log('update', d);
} else {
this.eventDataSet.add({id: mId, content: msgContent, title: `${msgContent} (${msgId})`, start: new Date(), end: new Date(Date.now()+5000), group: hv_id, 'className': 'message'});
}
@@ -158,13 +178,13 @@ class Timeline{
if(info.startsWith('content')){
d = this.eventDataSet.get(scId);
if(d !== null){
- console.log('alter');
+// console.log('alter');
d['content'] = content;
d['end']= new Date();
d['title'] = content;
this.eventDataSet.update(d);
} else {
- console.log('add');
+// console.log('add');
this.eventDataSet.add({id: scId, content: content, title: content, start: new Date(), end: new Date(Date.now() + 1000), group: hv_id, 'className': 'speech'});
}
}
@@ -200,12 +220,15 @@ class Timeline{
}
}
-var tl = new Timeline(ws, document.getElementById('line'), 29);
+let req = new Request('/count');
+fetch(req).then(response => response.json()).then(function(data) {
+ tl = new Timeline(ws, document.getElementById('line'), data.length);
+});
window.addEventListener('keypress', function(e){
- console.log(e.keyCode)
+// console.log(e.keyCode)
if(e.keyCode==46){
if(seeme){
seeme = false;