annotate mcserver/static/app.js~ @ 54:c0b34039917a tip

Server: added an exposed function to log the start time of a performance (for log-to-audio sync)
author Mathieu Barthet <mathieu.barthet@eecs.qmul.ac.uk>
date Wed, 14 Oct 2015 19:20:08 +0100
parents 9d57fcc848c0
children
rev   line source
gyorgyf@0 1 var Application = {
gyorgyf@0 2 init: function() {
gyorgyf@0 3 this.canvas = document.getElementById('canvas');
gyorgyf@0 4 this.marker = document.getElementById('marker');
gyorgyf@0 5 this.label = document.getElementById('label');
gyorgyf@0 6
mgeorgi@23 7 this.canvas.addEventListener('mousedown', this.onMouseDown.bind(this));
mgeorgi@23 8 this.canvas.addEventListener('mousemove', this.onMouseMove.bind(this));
mgeorgi@23 9 this.canvas.addEventListener('mouseup', this.onMouseUp.bind(this));
gyorgyf@0 10
mgeorgi@23 11 this.request("/moods.csv", this.loadMoods.bind(this));
mgeorgi@9 12 this.background();
mgeorgi@9 13 },
mgeorgi@9 14
mgeorgi@9 15 tl: { r: 200, g: 0, b: 0 },
mgeorgi@9 16 tr: { r: 200, g: 150, b: 0 },
mgeorgi@9 17 bl: { r: 0, g: 50, b: 100 },
mgeorgi@9 18 br: { r: 200, g: 230, b: 80 },
mgeorgi@9 19
mgeorgi@9 20 interpolateColor: function(a, b, x) {
mgeorgi@9 21 return {
mgeorgi@9 22 r: Math.floor(a.r + (b.r - a.r) * x),
mgeorgi@9 23 g: Math.floor(a.g + (b.g - a.g) * x),
mgeorgi@9 24 b: Math.floor(a.b + (b.b - a.b) * x)
mgeorgi@9 25 };
mgeorgi@9 26 },
mgeorgi@9 27
mgeorgi@23 28 background: function() {
mgeorgi@9 29 var step = 20;
mgeorgi@9 30 var ctx = this.canvas.getContext("2d");
mgeorgi@9 31 ctx.clearRect(0, 0, 320, 320);
mgeorgi@9 32
mgeorgi@9 33 for (var y = 0; y < 320; y += step) {
mgeorgi@9 34 var left = this.interpolateColor(this.tl, this.bl, y / 320);
mgeorgi@9 35 var right = this.interpolateColor(this.tr, this.br, y / 320);
mgeorgi@9 36 for (var x = 0; x < 320; x += step) {
mgeorgi@9 37 var color = this.interpolateColor(left, right, x / 320);
mgeorgi@9 38 ctx.fillStyle = "rgb(" + color.r + "," + color.g + "," + color.b + ")";
mgeorgi@9 39 ctx.fillRect(x, y, step, step);
mgeorgi@9 40 }
mgeorgi@9 41 }
mgeorgi@9 42 ctx.strokeStyle = "rgb(0,0,0)";
mgeorgi@9 43 ctx.moveTo(0, 160);
mgeorgi@9 44 ctx.lineTo(320, 160);
mgeorgi@9 45 ctx.stroke();
mgeorgi@9 46
mgeorgi@9 47 ctx.fillStyle = "rgb(0,0,0)";
mgeorgi@9 48 ctx.beginPath();
mgeorgi@9 49 ctx.moveTo(320, 160);
mgeorgi@9 50 ctx.lineTo(310, 150);
mgeorgi@9 51 ctx.lineTo(310, 170);
mgeorgi@9 52 ctx.fill();
mgeorgi@9 53
mgeorgi@9 54 ctx.strokeStyle = "rgb(0,0,0)";
mgeorgi@9 55 ctx.moveTo(160, 320);
mgeorgi@9 56 ctx.lineTo(160, 0);
mgeorgi@9 57 ctx.stroke();
mgeorgi@9 58
mgeorgi@9 59 ctx.fillStyle = "rgb(0,0,0)";
mgeorgi@9 60 ctx.beginPath();
mgeorgi@9 61 ctx.moveTo(160, 0);
mgeorgi@9 62 ctx.lineTo(150, 10);
mgeorgi@9 63 ctx.lineTo(170, 10);
mgeorgi@9 64 ctx.fill();
mgeorgi@9 65
mgeorgi@9 66 ctx.font = "16px Arial";
mgeorgi@9 67 ctx.fillText("Valence", 200, 158);
mgeorgi@9 68
mgeorgi@9 69 ctx.save();
mgeorgi@9 70 ctx.translate(158, 120);
mgeorgi@9 71 ctx.rotate(Math.PI * 1.5);
mgeorgi@9 72 ctx.font = "16px Arial";
mgeorgi@9 73 ctx.fillText("Arousal", 0, 0);
mgeorgi@9 74 ctx.restore();
gyorgyf@0 75 },
gyorgyf@0 76
mgeorgi@6 77 loadMoods: function(text) {
gyorgyf@0 78 this.moods = [];
gyorgyf@0 79
gyorgyf@0 80 var lines = text.split("\n");
mgeorgi@6 81
mgeorgi@6 82 for (var i = 1; i < lines.length; i++) {
mgeorgi@6 83 var row = lines[i].split(",");
mgeorgi@6 84 var mood = {
mgeorgi@9 85 label: row[0],
mgeorgi@9 86 val: Number(row[1]),
mgeorgi@9 87 aro: Number(row[2]),
mgeorgi@9 88 dom: Number(row[3])
mgeorgi@6 89 };
mgeorgi@6 90 this.moods.push(mood);
mgeorgi@6 91 }
mgeorgi@6 92 },
mgeorgi@9 93
gyorgyf@0 94 request: function(url, callback) {
gyorgyf@0 95 var request = new XMLHttpRequest();
gyorgyf@0 96 request.onreadystatechange = function() {
mgeorgi@6 97 if (callback) {
mgeorgi@6 98 callback(request.responseText);
mgeorgi@6 99 }
gyorgyf@0 100 }.bind(this);
gyorgyf@0 101 request.open("GET", url);
gyorgyf@0 102 request.send(null);
gyorgyf@0 103 },
gyorgyf@0 104
mgeorgi@23 105 onMouseDown: function(event) {
mgeorgi@23 106 this.mouseDown = true;
mgeorgi@23 107 this.setMarker(event.pageX, event.pageY);
gyorgyf@0 108 },
gyorgyf@0 109
mgeorgi@23 110 onMouseMove: function(event) {
mgeorgi@23 111 if (this.mouseDown) {
mgeorgi@23 112 this.setMarker(event.pageX, event.pageY);
mgeorgi@23 113 }
gyorgyf@0 114 },
gyorgyf@0 115
mgeorgi@23 116 onMouseUp: function(event) {
mgeorgi@23 117 this.mouseDown = false;
mgeorgi@23 118 this.setMarker(event.pageX, event.pageY);
gyorgyf@0 119 },
gyorgyf@0 120
mgeorgi@6 121 setMarker: function(pageX, pageY) {
mgeorgi@9 122 this.background();
mgeorgi@9 123 this.drawMarker(pageX, pageY);
mgeorgi@9 124
mgeorgi@6 125 var x = pageX / 320;
mgeorgi@6 126 var y = 1 - pageY / 320;
mgeorgi@6 127
mgeorgi@6 128 var mood = this.findMood(x, y);
mgeorgi@6 129
mgeorgi@23 130 if (mood != this.mood) {
mgeorgi@23 131 this.label.innerHTML = mood.label;
mgeorgi@23 132 this.mood = mood;
mgeorgi@23 133 this.request("/mood?x=" + x + "&y=" + y);
mgeorgi@23 134 }
mgeorgi@23 135 },
mgeorgi@23 136
mgeorgi@23 137 drawMarker: function(x, y) {
mgeorgi@23 138 var ctx = this.canvas.getContext("2d");
mgeorgi@23 139 ctx.fillStyle = "rgba(0, 0, 0, 0.5)";
mgeorgi@23 140 ctx.beginPath();
mgeorgi@23 141 ctx.arc(x, y, 20, 0, Math.PI*2, true);
mgeorgi@23 142 ctx.fill();
mgeorgi@9 143 },
mgeorgi@6 144
mgeorgi@6 145 findMood: function(x, y) {
mgeorgi@6 146 var distance = 1;
mgeorgi@6 147 var index = null;
gyorgyf@0 148
gyorgyf@0 149 for (var i = 0; i < this.moods.length; i++) {
gyorgyf@0 150 var mood = this.moods[i];
mgeorgi@9 151 var dx = Math.abs(mood.val - x);
mgeorgi@9 152 var dy = Math.abs(mood.aro - y);
mgeorgi@6 153 var d = Math.sqrt(dx * dx + dy * dy);
gyorgyf@0 154
mgeorgi@6 155 if (d < distance) {
mgeorgi@6 156 distance = d;
mgeorgi@6 157 index = i;
gyorgyf@0 158 }
gyorgyf@0 159 }
gyorgyf@0 160
mgeorgi@6 161 return this.moods[index];
gyorgyf@0 162 }
mgeorgi@23 163 };