loco.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. function setCookie(name, value ) {
  2. var expires = "";
  3. document.cookie = name+"="+value+expires+"; path=/";
  4. }
  5. function getCookie(name) {
  6. var nameEQ = name + "=";
  7. var ca = document.cookie.split(';');
  8. for(var i=0;i < ca.length;i++) {
  9. var c = ca[i];
  10. while (c.charAt(0)==' ') c = c.substring(1,c.length);
  11. if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  12. }
  13. return '';
  14. }
  15. function updateHTML_Locate(apname, ts, rssi, delta){
  16. $('tr.aprow#' + apname +' td.rssi' ).text(rssi);
  17. $('tr.aprow#' + apname +' td.delta' ).text(delta);
  18. }
  19. function updateHTML_Measure(apname, ts, rssi, delta){
  20. $('tr.aprow#' + apname +' td.rssi' ).text(rssi);
  21. $('tr.aprow#' + apname +' td.delta' ).text(delta);
  22. }
  23. function updateHTML_view(data){
  24. var collected_aps = []
  25. for (var apname in data) {
  26. if (data.hasOwnProperty(apname)) {
  27. for (var i in data[apname]) {
  28. var apinfo = data[apname][i];
  29. var rssi = apinfo[0];
  30. var ts = apinfo[1];
  31. var delta = apinfo[3];
  32. var aptable = $('table#aps')
  33. var aprow = $('tr.aprow#' + apname)
  34. aprow.show()
  35. var rgbval = $('span#rgb_' + (Math.round(rssi))).text()
  36. $('td.history', aprow).append('<span class="full" style="background-color:' + rgbval + '">' + rssi +'</span>')
  37. $('td.history span', aprow)
  38. collected_aps.push(apname)
  39. };
  40. };
  41. }
  42. var MAX_SIGNALS = 30
  43. $('table#aps tr.aprow:visible').each(function(){
  44. var aprow = $(this)
  45. if ($.inArray(aprow.attr('id'), collected_aps) == -1){
  46. $('td.history', aprow).append('<span class="empty" style="color:silver">-00</span>')
  47. };
  48. while ($('td.history span', aprow).length > MAX_SIGNALS){
  49. $('td.history span:first', aprow).remove()
  50. };
  51. if ($('td.history span.full', aprow).length == 0){
  52. aprow.hide()
  53. };
  54. });
  55. $('table#aps tr.aprow:visible').each(function(){
  56. var aprow = $(this)
  57. var sum = 0
  58. var values = $('td.history span.full', aprow)
  59. values.each(function(){
  60. sum = sum + parseFloat($(this).text())
  61. });
  62. var mean = sum / values.length;
  63. var sum = 0
  64. values.each(function(){
  65. var rssi = parseFloat($(this).text())
  66. sum = sum + (mean - rssi) * (mean - rssi)
  67. });
  68. var sigma = sum / values.length;
  69. $('td.sigma', aprow).text(Math.round(sigma * 10) / 10)
  70. //~ var variance = Math.sqrt(sum / values.length);
  71. $('td.mean', aprow).text(Math.round(mean * 10) / 10)
  72. var rgbval = $('span#rgb_' + (Math.round(mean))).text()
  73. $('td.mean', aprow).css('background-color', rgbval)
  74. });
  75. }
  76. function receiveAPs(jsid, station, updatefuncSingle, updatefuncAll, filter){
  77. $.get('/getAPInfo?name=' + station + '&jsid=' + jsid + filter, function(data){
  78. if (updatefuncAll){
  79. updatefuncAll(data)
  80. } else {
  81. for (var apname in data) {
  82. if (data.hasOwnProperty(apname)) {
  83. for (var i in data[apname]) {
  84. var apinfo = data[apname][i];
  85. var rssi = apinfo[0];
  86. var ts = apinfo[1];
  87. var delta = apinfo[3];
  88. updatefuncSingle(apname, ts, rssi, delta)
  89. //~ console.log(apinfo[1]);
  90. };
  91. }
  92. }
  93. };
  94. //~ timer.stop()
  95. });
  96. };
  97. $(document).ready(function() {
  98. // id for this javascript session
  99. var jsid = parseInt(Math.random() * 100000000)
  100. var station = $('div#stationinfo span#name').text();
  101. var updatefunc = null;
  102. var updatefuncAll = null;
  103. var filter = ''
  104. try {
  105. if ($('div#meta span#pagename').text() == 'view2'){
  106. updatefuncAll = updateHTML_view;
  107. $('span#clear_hist').click(function(){
  108. $('td.history span').remove()
  109. });
  110. } else if ($('div#meta span#pagename').text() == 'locate'){
  111. updatefunc = updateHTML_Locate;
  112. filter = '&filter='
  113. $('td.apid').each(function(){
  114. filter = filter + $(this).text() + ','
  115. });
  116. } else if ($('div#meta span#pagename').text() == 'measure'){
  117. // move cut image to end of div onclick
  118. $('img.cutplot').dblclick(function(){
  119. $(this).appendTo('div#cutplots')
  120. });
  121. $('input#locid').val(getCookie('measure.locid'))
  122. $('input#locid').change(function(){
  123. setCookie('measure.locid', $('input#locid').val())
  124. });
  125. updatefunc = updateHTML_Measure;
  126. $('form#locationinfo').submit(function(){
  127. var locid = $('form#locationinfo input#locid').val();
  128. var dur = $('form#locationinfo input#duration').val();
  129. if (locid == ''){
  130. alert('need location != ""');
  131. return false;
  132. };
  133. $('form#locationinfo span#activity').text('starting...');
  134. $.get('/startMeasureLoc?name=' + station + '&locid=' + locid + '&duration=' + dur, function(data){
  135. if (data.started == ''){
  136. $('form#locationinfo span#activity').text('error: ' + data.error);
  137. return false
  138. };
  139. $('form#locationinfo td#startts').text(data.started);
  140. var dur_in_ms = parseInt(dur) * 1000 + 1000
  141. $('form#locationinfo span#activity').text('started, waiting ' + dur_in_ms + ' ms');
  142. $.timer(dur_in_ms, function(timer){
  143. timer.stop()
  144. $('form#locationinfo span#activity').text('checking results...');
  145. $.get('/getMeasurementResults?name=' + station + '&locid=' + locid, function(result_data){
  146. if (result_data.stopped == ''){
  147. alert('measurement not stopped!')
  148. return false;
  149. };
  150. $('form#locationinfo span#activity').text('got results');
  151. $('form#locationinfo td#endts').text(result_data.stopped);
  152. $('table#aplist thead tr').append('<td>loc ' + locid + '</td>')
  153. var d = result_data.data;
  154. for (var apname in d) {
  155. if (d.hasOwnProperty(apname)) {
  156. var title = d[apname].rssis
  157. $('tr.aprow#' + apname).append('<td title="' + title + '">' + d[apname].avg + '</td>')
  158. };
  159. };
  160. });
  161. });
  162. });
  163. return false;
  164. });
  165. } else if ($('div#meta span#pagename').text() == 'collect'){
  166. $('span#startButton').click(function(){
  167. var startstopval = $('span#startButton').text();
  168. var pathid = $('select#pathid').val();
  169. if (startstopval == 'start'){
  170. $('span#startButton').css('background-color', '#F87217');
  171. $.get('/startCollectPath?station=' + station + '&pathid=' + pathid, function(data){
  172. $('span#startButton').text('stop');
  173. $('span#startButton').css('background-color', '#F76541');
  174. });
  175. } else {
  176. $('span#startButton').css('background-color', '#F87217');
  177. if ($('span.untriggeredLocidButton').length > 0){
  178. $.get('/stopCollectPath?station=' + station + '&pathid=' + pathid + '&broken', function(data){
  179. $('span#startButton').text('start');
  180. $('span#startButton').css('background-color', '#52D017');
  181. $('span.locidButton').css('background-color', '#FFFFFF');
  182. });
  183. } else {
  184. $.get('/stopCollectPath?station=' + station + '&pathid=' + pathid, function(data){
  185. $('span#startButton').text('start');
  186. $('span#startButton').css('background-color', '#52D017');
  187. $('span.locidButton').css('background-color', '#FFFFFF');
  188. });
  189. };
  190. $('span.locidButton').addClass('untriggeredLocidButton')
  191. }
  192. return false;
  193. });
  194. $('span#nextButton').click(function(){
  195. if ($('span#startButton').text() == 'start'){
  196. // if unstarted - start by clicking next
  197. $('span#startButton').click();
  198. return
  199. };
  200. var button = $('span.untriggeredLocidButton:first')
  201. var locid = button.text()
  202. var pathid = $('select#pathid').val();
  203. button.css('background-color', '#F87217');
  204. button.removeClass('untriggeredLocidButton');
  205. var rts = new Date().getTime() / 1000
  206. $.get('/newCollectPathPosition?station=' + station + '&pathid=' + pathid + '&locid=' + locid + '&remotets=' + rts, function(data){
  207. button.css('background-color', '#52D017');
  208. if ($('span.untriggeredLocidButton').length == 0){
  209. $('span#startButton').click()
  210. };
  211. //~ alert(data)
  212. console.log($('root', data).attr('value'))
  213. $('div#feedback').text($('root', data).attr('value') + ' measurements')
  214. $('div#feedback').css('opacity', 1.0)
  215. $('div#feedback').animate({'opacity': 0.0}, 2000)
  216. });
  217. });
  218. buildPushButtons = function(locids){
  219. $('span.locidButton').remove();
  220. $(locids).each(function(i, locid){
  221. if (locid.trim() != ''){
  222. var s = '<span class="locidButton untriggeredLocidButton" style="cursor:pointer;padding:2px;border:1px solid grey;">' + locid.trim() + '</span>';
  223. $('div#pushButtons').append(s)
  224. };
  225. })
  226. };
  227. var stored_pathid = getCookie('collectpath.pathid');
  228. if (stored_pathid != ''){
  229. $('select#pathid option[value=' + stored_pathid +']').attr('selected', 'true')
  230. var locids = $('span.path#' + stored_pathid).text().split(',');
  231. buildPushButtons(locids);
  232. };
  233. $('select#pathid').change(function(){
  234. var pathid = $(this).val()
  235. var locids = $('span.path#' + pathid).text().split(',')
  236. buildPushButtons(locids)
  237. setCookie('collectpath.pathid', pathid);
  238. });
  239. // move cut image to end of div onclick
  240. $('img.cutplot').dblclick(function(){
  241. $(this).appendTo('div#cutplots')
  242. });
  243. } else if ($('div#meta span#pagename').text() == 'evaluate'){
  244. $('tr.path').click(function(){
  245. //~ alert($(this).attr('pathid'))
  246. $('tr.run#' + $(this).attr('pathid')).toggle()
  247. });
  248. if ($('table.optrun:first tr.path').length < 5){
  249. $('tr.run').show()
  250. };
  251. } else if ($('div#meta span#pagename').text() == 'evaluatePath'){
  252. $('td#imgs1 img:nth-child(1)').show()
  253. $('td#imgs2 img:nth-child(2)').show()
  254. // make first set of images switchable
  255. var pos = 1;
  256. $('td#switch1 span').each(function(){
  257. $(this).attr('pos', pos)
  258. $(this).click(function(){
  259. $('td#imgs1 img').hide();
  260. $('td#imgs1 img:nth-child(' + $(this).attr('pos') + ')').show()
  261. });
  262. pos += 1;
  263. })
  264. // duplicated from above
  265. pos = 1;
  266. $('td#switch2 span').each(function(){
  267. $(this).attr('pos', pos)
  268. $(this).click(function(){
  269. $('td#imgs2 img').hide();
  270. $('td#imgs2 img:nth-child(' + $(this).attr('pos') + ')').show()
  271. });
  272. pos += 1;
  273. })
  274. } else if ($('div#meta span#pagename').text() == 'optruns'){
  275. var selected_values = []
  276. $('tr.param').click(function(){
  277. $('#curr_hist').remove()
  278. var data = selected_values[0]
  279. $(selected_values).each(function(i, val){
  280. if (i > 0)
  281. data = data + '|' + val
  282. });
  283. var title = $('td.name', this).text()
  284. $('body').append('<img width="1350" height="540" id="curr_hist" src="/plotHistogram?title=' + title +'&data=' + data + '&format=materials"/>')
  285. $('#curr_hist').css({'position': 'absolute', 'border': '2px solid grey'})
  286. $('#curr_hist').click(function(){$(this).remove()})
  287. $('#curr_hist').center()
  288. });
  289. $('tr.param').hover(function(){
  290. $(this).css('background-color', '#CCCCCC');
  291. var our_class = $('tr.p_' + $(this).attr('n'))
  292. our_class.css('background-color', '#CCCCCC');
  293. // clear array
  294. selected_values = []
  295. $('td.value', our_class).each(function(){
  296. selected_values.push($(this).text());
  297. });
  298. }, function(){
  299. $(this).css('background-color', 'white');
  300. $('tr.p_' + $(this).attr('n')).css('background-color', 'white');
  301. });
  302. };
  303. if (updatefunc != null || updatefuncAll != null){
  304. $.timer(1000, function(timer){
  305. receiveAPs(jsid, station, updatefunc, updatefuncAll, filter)
  306. });
  307. };
  308. } catch(err) {
  309. alert(err)
  310. }
  311. });