FACT++  1.0
index.js
Go to the documentation of this file.
1 function onload(load)
2 {
3  var W = window.innerWidth;
4  var H = window.innerHeight;
5 
6  document.getElementById("canvas").width = 1;
7  document.getElementById("canvas").height = 1;
8 
9  var tw = document.getElementById('table').offsetWidth;
10  var th = document.getElementById('table').offsetHeight;
11 
12  var margin = (W-tw)*2;
13 
14  var cw = tw;// - margin;
15  var ch = H - th - margin;
16 
17  document.getElementById("canvas").width = cw;
18  document.getElementById("canvas").height = ch;
19 
20  // ------ debug -----
21  document.getElementById('debug').innerHTML = "";
22  document.getElementById('debug').innerHTML += "|W="+W+"/"+H;
23  document.getElementById('debug').innerHTML += "|T="+tw+"/"+th;
24  document.getElementById('debug').innerHTML += "|C="+cw+"/"+ch;
25 
26  if (!load)
27  return;
28 
29  refresh_text();
31 }
32 
33 function onresize()
34 {
35  onload();
36 }
37 
38 function refresh_text()
39 {
40  var xmlHttp = null;
41 
42  try { xmlHttp = new XMLHttpRequest(); }
43  catch(e)
44  {
45  try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }
46  catch(e)
47  {
48  try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); }
49  catch(e)
50  {
51  alert("Your browser doesn't support dynamic reload.");
52  return;
53  }
54  }
55  }
56 
57  xmlHttp.open('POST', 'status.txt', true);
58 
59  xmlHttp.onreadystatechange =
60  function ()
61  {
62  if (xmlHttp.readyState == 4)
63  {
64  if (xmlHttp.status==0)
65  {
66  setTimeout("refresh_text()", 3000);
67  return;
68  }
69  if (xmlHttp.status!=200)
70  {
71  alert("HTTP request error: "+xmlHttp.statusText+" ["+xmlHttp.status+"]");
72  setTimeout("refresh_text()", 10000);
73  /****** invalidate ******/
74  return;
75  }
76 
77  process_status(xmlHttp.responseText);
78  setTimeout("refresh_text()", 3000);
79  }
80  };
81 
82  xmlHttp.send(null);
83 }
84 
85 function valid(str)
86 {
87  if (str==undefined)
88  return false;
89 
90  if (str.length==0)
91  return false;
92 
93  return true;
94 }
95 
96 function strike(id, status)
97 {
98  var e = document.getElementById(id);
99  if (!e)
100  return;
101 
102  if (status == false)
103  e.style.textDecoration="line-through";
104  else
105  e.style.textDecoration="";
106 }
107 
108 function gray(id, str)
109 {
110  var e = document.getElementById(id);
111  if (!e)
112  return;
113 
114  if (valid(str) == true)
115  {
116  e.style.color="#000";
117  e.style.textDecoration="";
118  }
119  else
120  {
121  e.style.color="#daa";
122  e.style.textDecoration="line-through";
123  }
124 
125 }
126 
127 var date0 = null;
128 
129 function process_status(result)
130 {
131  var temp = 1;
132  var dew = 2;
133  var gusts = 3;
134  var voltmed = 4;
135  var curmed = 5;
136  var curmax = 6;
137  var drive = 7;
138  var zd = 8;
139  var az = 9;
140 
141  var tokens = result.split('\n');
142 
143  var date1 = new Date();
144 
145  if (tokens[0].length!=13)
146  {
147  if (date0 != null)
148  strike("time", date0.getTime()+60000>date1.getTime());
149  // FIXME: Reset display to "---" values -- no connection
150  return;
151  }
152 
153  var date2 = new Date();
154  date2.setTime(tokens[0]);
155 
156  strike("time", date2.getTime()+60000>date1.getTime());
157 
158  date0 = date2;
159 
160  gray("drive", tokens[drive]);
161  gray("temp", tokens[temp]);
162  gray("volt", tokens[voltmed]);
163  gray("current", tokens[curmed]);
164 
165  document.getElementById("time").innerHTML =
166  "· "+date0.toUTCString()+" ·";//getUTCFullYear()+"/"+date0.getUTCMonth()+"/"+date0.getUTCDate()+" "+date0.getUTCHours()+":"+date0.getUTCMinutes()+":"+date0.getUTCSeconds()+"."+date0.getUTCMilliseconds();
167 
168  document.getElementById("system").innerHTML =
169  "---";
170 
171  if (valid(tokens[drive])) document.getElementById("drive").innerHTML =
172  tokens[drive]+" ["+tokens[zd]+" "+tokens[az]+"]";
173 
174  if (valid(tokens[temp]))
175  {
176  document.getElementById("temp").innerHTML =
177  tokens[temp]+"°C ["+tokens[dew]+"°C]";
178  document.getElementById("aux").innerHTML =
179  tokens[gusts]+" km/h";
180 
181  document.getElementById("temp_row").style.background="#fff8f0";
182  if (parseFloat(tokens[temp])-parseFloat(tokens[dew])>0.3)
183  document.getElementById("temp_row").style.background="#fffff0";
184  if (parseFloat(tokens[temp])-parseFloat(tokens[dew])>0.7)
185  document.getElementById("temp_row").style.background="#f0fff0";
186 
187  document.getElementById("aux_row").style.background="#fff8f0";
188  if (parseFloat(tokens[gusts])<50)
189  document.getElementById("aux_row").style.background="#fffff0";
190  if (parseFloat(tokens[gusts])<35)
191  document.getElementById("aux_row").style.background="#f0fff0";
192  }
193  else
194  {
195  document.getElementById("temp_row").style.background="#ffffff";
196  document.getElementById("aux_row").style.background="#ffffff";
197  }
198 
199 
200  if (valid(tokens[voltmed]))
201  {
202  document.getElementById("bias").innerHTML =
203  tokens[curmed]+"&micro;A / "+tokens[curmax]+"&micro;A"+
204  " ["+tokens[voltmed]+"V]";
205 
206  if (parseFloat(tokens[voltmed])>1)
207  document.getElementById("bias_row").style.background="#f0f0f0";
208  else
209  document.getElementById("bias_row").style.background="#fff0f0";
210  }
211  else
212  {
213  document.getElementById("bias_row").style.background="#ffffff";
214  }
215 
216  document.getElementById("localtime").innerHTML = "&middot;&nbsp;"+date1.toLocaleString()+"&nbsp;&middot;";//ISOlocalDateStr();//ltoString();
217 /*
218  if (tokens[1]=="Taking Data")
219  document.getElementById("row1").style.background="#d0f0d0";
220  else
221  document.getElementById("row1").style.background="#ffffff";
222 
223  if (tokens[2]=="Tracking")
224  document.getElementById("row2").style.background="#d0f0d0";
225  else
226  document.getElementById("row2").style.background="#ffffff";
227 
228  document.getElementById("volt").style.textColor="#808080";
229  document.getElementById("row2").style.textColor="#808080";
230  */
231 }
232 
233 // http://billmill.org/static/canvastutorial/index.html
234 // http://www.netmagazine.com/tutorials/learning-basics-html5-canvas
235 // http://www.alistapart.com/articles/responsive-web-design/
236 /*
237 function decode_base64(s)
238 {
239  var e={};
240  var i,k;
241  var v=[];
242  var r='';
243  var w=String.fromCharCode;
244 
245  var n=[[65,91],[97,123],[48,58],[47,48],[43,44]];
246 
247  for (z in n)
248  {
249  for(i=n[z][0]; i<n[z][1]; i++)
250  {
251  v.push(w(i));
252  }
253  }
254 
255  for(i=0;i<64;i++)
256  {
257  e[v[i]]=i;
258  }
259 
260  for(i=0;i<s.length;i+=72)
261  {
262  var b=0,c,x,l=0,o=s.substring(i,i+72);
263  for(x=0;x<o.length;x++)
264  {
265  c=e[o.charAt(x)];b=(b<<6)+c;l+=6;
266  while(l>=8)
267  {
268  r+=w((b>>>(l-=8))%256);
269  }
270  }
271  }
272  return r;
273 }*/
274 
276 {
277  var xmlHttp = null;
278 
279  try { xmlHttp = new XMLHttpRequest(); }
280  catch(e)
281  {
282  try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }
283  catch(e)
284  {
285  try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); }
286  catch(e)
287  {
288  alert("Your browser doesn't support dynamic reload.");
289  return;
290  }
291  }
292  }
293 
294  xmlHttp.open('POST', 'fadcontrol-eventdata.bin', true);
295 
296  xmlHttp.onload =
297  function ()
298  {
299  if (xmlHttp.readyState == 4)
300  {
301  if (xmlHttp.status!=200)
302  {
303  alert("HTTP request error: "+xmlHttp.statusText+" ["+xmlHttp.status+"]");
304  setTimeout("refresh_text()", 10000);
305  //****** invalidate ******
306  return;
307  }
308 
309  process_eventdata(xmlHttp.responseText);
310  setTimeout("refresh_graphics()", 5000)
311  }
312  };
313 
314  xmlHttp.send(null);
315 }
316 
317 
318 function hueToRGB(hue)
319 {
320  hue /= 3;
321  hue %= 6;
322 
323  if (hue<1) return parseInt(255*hue);
324  if (hue<3) return parseInt(255);
325  if (hue<4) return parseInt(255*(4-hue));
326 
327 /*
328  if (hue<1*5/4) return parseInt(255*hue*4/5);
329  if (hue<2*5/4) return parseInt(255);
330  if (hue<3*5/4) return parseInt(255*(3*5/4-hue)*4/5);
331 */
332 /*
333  if (hue<1.5) return parseInt(255*hue/1.5);
334  if (hue<3.0) return parseInt(255);
335  if (hue<4.5) return parseInt(255*(4.5-hue)/1.5);
336 */
337  return 0.
338 }
339 
340 function hueToHex(flt)
341 {
342  var s = hueToRGB(flt).toString(16);
343  return s.length==2 ? s : "0"+s;
344 }
345 
346 function HLStoRGB(hue)
347 {
348  hue *= 14;
349 
350  var sr = hueToHex(20-hue);
351  var sg = hueToHex(14-hue);
352  var sb = hueToHex(26-hue);
353 
354  return sr+sg+sb;
355 }
356 
357 
358 function color(col)
359 {
360  if (col==65533)
361  col = 0;
362 
363  var hue = col/128;
364  return HLStoRGB(hue);
365 }
366 
367 function toHex(str, idx)
368 {
369  var ch = str[idx].toString(16);
370  return ch.length==2 ? ch : "0"+ch;
371 }
372 
373 function drawPix(x, y, col)
374 {
375  var canv = document.getElementById("canvas");
376 
377  var cw = canv.width;
378  var ch = canv.height;
379 
380  var w = Math.min(cw/28, ch/28);
381 
382  var ctx = canv.getContext("2d");
383 
384  ctx.beginPath();
385  ctx.arc(x*w*2+cw/2, y*w*2+ch/2, w, 0, Math.PI*2, true);
386  ctx.lineWidth = 0;
387  ctx.fillStyle = "#"+color(col);
388  ctx.fill();
389  ctx.closePath();
390 }
391 
392 function process_eventdata(result)
393 {
394  if (result.length!=160)
395  return;
396 
397  var canv = document.getElementById("canvas");
398 
399  var cw = canv.width;
400  var ch = canv.height;
401 
402  var ctx = canv.getContext("2d");
403 
404  ctx.clearRect(0, 0, cw, ch);
405 /*
406  ctx.beginPath();
407  ctx.strokeStyle = "#000000";
408  ctx.moveTo(0, 0);
409  ctx.lineTo(0, ch);
410  ctx.lineTo(cw, ch);
411  ctx.lineTo(cw, 0);
412  ctx.lineTo(0, 0);
413  ctx.stroke();
414  ctx.closePath();
415  */
416 
417  drawPix(0, 0, result.charCodeAt(0));
418 
419  var gsSin60 = Math.sqrt(3)/2;
420 
421  var cnt = 1;
422  for (var ring=1; ring<=30; ring++)
423  {
424  for (var s=0; s<6; s++)
425  {
426  for (var i=1; i<=ring; i++)
427  {
428  var x=0.;
429  var y=0.;
430 
431  switch (s)
432  {
433  case 0: x = ring-i*0.5; y = i*gsSin60; break;
434  case 1: x = ring*0.5-i; y = ring*gsSin60; break;
435  case 2: x = -(ring+i)*0.5; y = (ring-i)*gsSin60; break;
436  case 3: x = 0.5*i-ring; y = -i*gsSin60; break;
437  case 4: x = i-ring*0.5; y = -ring*gsSin60; break;
438  case 5: x = (ring+i)*0.5; y = (-ring+i)*gsSin60; break;
439  }
440 
441  if (Math.sqrt(x*x+y*y)>6.7)
442  continue;
443  if (ring==7 && i==6 && s==0)
444  continue;
445  if (ring==7 && i==1 && s==1)
446  continue;
447  if (ring==7 && i==6 && s==3)
448  continue;
449  if (ring==7 && i==1 && s==4)
450  continue;
451 
452  // Rotate by 60deg
453  var px = Math.sin(Math.PI/3)*x - Math.cos(Math.PI/3)*y;
454  var py = Math.cos(Math.PI/3)*x + Math.sin(Math.PI/3)*y;
455 
456  drawPix(px, py, result.charCodeAt(cnt));
457  cnt++;
458 
459  if (cnt==159)
460  break;
461  }
462  if (cnt==159)
463  break;
464  }
465  if (cnt==159)
466  break;
467  }
468 
469  ctx.font = "8pt Arial";
470  ctx.textAlign = "right";
471  ctx.textBaseline = "top";
472 
473  ctx.strokeStyle = "#"+color(0);
474  ctx.strokeText("-2.0V", cw-5, 135);
475 
476  ctx.strokeStyle = "#"+color(16);
477  ctx.strokeText("-1.5V", cw-5, 120);
478 
479  ctx.strokeStyle = "#"+color(32);
480  ctx.strokeText("-1.0V", cw-5, 105);
481 
482  ctx.strokeStyle = "#"+color(48);
483  ctx.strokeText("-0.5V", cw-5, 90);
484 
485  ctx.strokeStyle = "#"+color(64);
486  ctx.strokeText("0V", cw-5, 70);
487 
488  ctx.strokeStyle = "#"+color(80);
489  ctx.strokeText("0.5V", cw-5, 50);
490 
491  ctx.strokeStyle = "#"+color(86);
492  ctx.strokeText("1.0V", cw-5, 35);
493 
494  ctx.strokeStyle = "#"+color(102);
495  ctx.strokeText("1.5V", cw-5, 20);
496 
497  ctx.strokeStyle = "#"+color(127);
498  ctx.strokeText("2.0V", cw-5, 5);
499 
500 }
501 
502 function save()
503 {
504  var canvas = document.getElementById("canvas");
505  var img = canvas.toDataURL("image/png");
506 
507  img = img.replace("image/png", "image/octet-stream");
508 
509  document.location.href = img;
510 }
function onload(load)
Definition: index.js:1
var date0
Definition: index.js:127
function strike(id, status)
Definition: index.js:96
int i
Definition: db_dim_client.c:21
char str[80]
Definition: test_client.c:7
po::typed_value< T > * var(T *ptr=0)
function gray(id, str)
Definition: index.js:108
function process_eventdata(result)
Definition: index.js:392
float temp
Definition: HeadersPFmini.h:56
function hueToHex(flt)
Definition: index.js:340
function valid(str)
Definition: index.js:85
function drawPix(x, y, col)
Definition: index.js:373
function refresh_text()
Definition: index.js:38
function onresize()
Definition: index.js:33
function hueToRGB(hue)
Definition: index.js:318
function color(col)
Definition: index.js:358
function process_status(result)
Definition: index.js:129
function toHex(str, idx)
Definition: index.js:367
function refresh_graphics()
Definition: index.js:275
function save()
Definition: index.js:502
function HLStoRGB(hue)
Definition: index.js:346