main.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. eel.expose(renderUI);
  2. eel.expose(error)
  3. eel.expose(warning)
  4. // Helper functions
  5. function range(n){
  6. return [...Array(n).keys()];
  7. }
  8. function onload(){ //Bind events
  9. // Changing tabs
  10. tabs = document.querySelector('#tabs').children
  11. for (var i = 0; i < tabs.length; i++){
  12. tabs[i].addEventListener("click", function(event){
  13. eel.set_selected_board(event.srcElement.getAttribute("i"))
  14. })
  15. }
  16. // Box information
  17. document.querySelector('#piFreq').addEventListener("focusout", function(event){
  18. eel.set_pi_freq(parseFloat(event.srcElement.value))
  19. })
  20. document.querySelector('#remoteTrigg').addEventListener("click", function(event){
  21. eel.set_remote_trigg(event.srcElement.checked ? 1 : 0)
  22. })
  23. // Learning options
  24. document.querySelector('#enabGnd').addEventListener("click", function(event){
  25. eel.set_enab_gnd(event.srcElement.checked ? 1 : 0)
  26. })
  27. document.querySelector('#Vlearn').addEventListener("focusout", function(event){
  28. eel.set_Vlearn(parseInt(event.srcElement.value))
  29. })
  30. document.querySelector('#start').addEventListener("focusout", function(event){
  31. eel.set_start(parseInt(event.srcElement.value))
  32. })
  33. document.querySelector('#stop').addEventListener("focusout", function(event){
  34. eel.set_stop(parseInt(event.srcElement.value))
  35. })
  36. document.querySelector('#startGnd').addEventListener("focusout", function(event){
  37. eel.set_start_gnd(parseInt(event.srcElement.value))
  38. })
  39. document.querySelector('#stopGnd').addEventListener("focusout", function(event){
  40. eel.set_stop_gnd(parseInt(event.srcElement.value))
  41. })
  42. document.querySelector('#N').addEventListener("focusout", function(event){
  43. eel.set_N(parseInt(event.srcElement.value))
  44. })
  45. document.querySelector('#wfLen').addEventListener("focusout", function(event){
  46. eel.set_wf_len(parseInt(event.srcElement.value))
  47. })
  48. // Locking options
  49. document.querySelector('#stepMax').addEventListener("focusout", function(event){
  50. eel.set_max_step(parseInt(event.srcElement.value))
  51. })
  52. document.querySelector('#Gain').addEventListener("focusout", function(event){
  53. eel.set_Gain(parseFloat(event.srcElement.value))
  54. })
  55. document.querySelector('#calibrateGain').addEventListener("click", function(event){
  56. eel.calibrate_gain()
  57. })
  58. // Input options
  59. document.querySelector('#autoSetPga').addEventListener("click", function(event){
  60. eel.set_auto_set_pga(event.srcElement.checked ? 1 : 0)
  61. })
  62. document.querySelector('#inputGain').addEventListener("focusout", function(event){
  63. eel.set_input_gain(parseInt(event.srcElement.value))
  64. })
  65. document.querySelector('#offset').addEventListener("focusout", function(event){
  66. eel.set_offset(parseInt(event.srcElement.value))
  67. })
  68. // Output options
  69. document.querySelector('#coarseFineRatio').addEventListener("focusout", function(event){
  70. eel.set_coarse_fine_ratio(parseFloat(event.srcElement.value))
  71. })
  72. document.querySelector('#calibrateCoarseFineRatio').addEventListener("click", function(event){
  73. eel.calibrate_coarse_fine_ratio()
  74. })
  75. // Graphs
  76. document.getElementById("waveformGraphSelect").addEventListener("change", function(){
  77. document.querySelector('#waveformGraphAutoupdate').checked = false
  78. loadGraph()
  79. })
  80. document.getElementById("longGraphX").addEventListener("change", function(){
  81. loadLongGraph()
  82. })
  83. document.getElementById("longGraphY").addEventListener("change", function(){
  84. loadLongGraph()
  85. })
  86. setTimeout(loop, 100)
  87. }
  88. j = 0
  89. function loop(){
  90. if(document.getElementById("waveformGraphSelect") != document.activeElement){
  91. loadGraphList()
  92. }
  93. if(document.querySelector('#longGraphAutoupdate').checked){
  94. // Don't update this too often
  95. if(j%10==0){loadLongGraph()}
  96. }
  97. j++
  98. setTimeout(loop, 1000)
  99. }
  100. function renderUI(state){
  101. //console.log('Updating UI')
  102. // BOX INFORMATION
  103. tabs = document.querySelector('#tabs').children
  104. for (var i = 0; i < tabs.length; i++){
  105. tabs[i].classList.remove('active')
  106. if(i>=state.n_boards){
  107. tabs[i].style.opacity = 0
  108. }
  109. else{
  110. tabs[i].style.opacity = 1
  111. }
  112. }
  113. tabs[state.selected_board].classList.add('active')
  114. document.querySelector('#boxAddress').value = "0x"+state.box_address.toString(16)
  115. document.querySelector('#isLearn').checked = false
  116. document.querySelector('#isLock').checked = false
  117. if(state.mode == 0) document.querySelector('#isLearn').checked = true
  118. if(state.mode == 1) document.querySelector('#isLock').checked = true
  119. document.querySelector('#outOfLock').checked = false
  120. if(state.out_of_lock == 1) document.querySelector('#outOfLock').checked = true
  121. document.querySelector('#piFreq').value = state.pi_freq
  122. document.querySelector('#boardFreq').value = state.board_freq
  123. document.querySelector('#remoteTrigg').checked = false
  124. if(state.remote_trigg == 1) document.querySelector('#remoteTrigg').checked = true
  125. // LEARNING OPTIONS
  126. document.querySelector('#enabGnd').checked = state.enab_gnd
  127. document.querySelector('#Vlearn').value = state.Vlearn
  128. document.querySelector('#start').value = state.start
  129. document.querySelector('#stop').value = state.stop
  130. document.querySelector('#startGnd').value = state.start_gnd
  131. document.querySelector('#stopGnd').value = state.stop_gnd
  132. document.querySelector('#N').value = state.N
  133. document.querySelector('#wfLen').value = state.wf_len
  134. // LOCKING OPTIONS
  135. document.querySelector('#stepMax').value = state.step_max
  136. document.querySelector('#Gain').value = state.Gain
  137. // INPUT OPTIONS
  138. document.querySelector('#autoSetPga').checked = state.auto_set_pga
  139. document.querySelector('#inputGain').disabled = state.auto_set_pga==1
  140. document.querySelector('#offset').disabled = state.auto_set_pga==1
  141. document.querySelector('#inputGain').value = state.input_gain
  142. document.querySelector('#offset').value = state.offset
  143. // OUTPUT OPTIONS
  144. document.querySelector('#coarseFineRatio').value = state.coarse_fine_ratio
  145. }
  146. async function loadGraphList(){
  147. files = await eel.listFiles('data/waveforms/')()
  148. timestamps = files.map(s => parseInt(s.replace('.csv', '')))
  149. timestamps.sort()
  150. dates = []
  151. for(timestamp of timestamps){
  152. var d = new Date(0);
  153. d.setUTCMilliseconds(timestamp)*1000;
  154. dates.push(d.toLocaleString() + "." + d.getMilliseconds())
  155. }
  156. var list = document.getElementById("waveformGraphSelect")
  157. index = list.selectedIndex
  158. list.innerHTML = ""
  159. for (var i = 0; i < dates.length; i++){
  160. var element = document.createElement("option")
  161. element.setAttribute('timestamp', timestamps[i])
  162. element.innerText = dates[i]
  163. list.append(element);
  164. }
  165. list.selectedIndex = index
  166. if(document.querySelector('#waveformGraphAutoupdate').checked){
  167. list.selectedIndex = list.children.length-1
  168. if(list.children.length-1 != index) loadGraph()
  169. }
  170. else if(index>-1){
  171. list.selectedIndex = index
  172. }
  173. else{
  174. loadGraph()
  175. }
  176. }
  177. async function loadGraph(){
  178. option = document.querySelector('#waveformGraphSelect')[document.querySelector('#waveformGraphSelect').selectedIndex]
  179. timestamp = option.getAttribute('timestamp')
  180. csv = await eel.loadFile('data/waveforms/'+timestamp+'.csv')()
  181. document.querySelector('#waveformGraphText').innerText = "Signal: "+csv[8]+" - Gnd: "+csv[9]+" - Signal_std: "+csv[10].toFixed(2)+" - Gnd_std: "+csv[11].toFixed(2)
  182. var data = [{
  183. x: range(csv[12]),
  184. y: csv.slice(13),
  185. type: 'scatter'
  186. },{
  187. x: [csv[2], csv[2]],
  188. y: [0, Math.max(...csv.slice(13))],
  189. line: {
  190. color: 'red'
  191. },
  192. type: 'scatter',
  193. mode: 'lines'
  194. },{
  195. x: [csv[3], csv[3]],
  196. y: [0, Math.max(...csv.slice(13))],
  197. line: {
  198. color: 'red'
  199. },
  200. type: 'scatter',
  201. mode: 'lines'
  202. },{
  203. x: [csv[4], csv[4]],
  204. y: [0, Math.max(...csv.slice(13))],
  205. line: {
  206. color: 'green'
  207. },
  208. type: 'scatter',
  209. mode: 'lines'
  210. },{
  211. x: [csv[5], csv[5]],
  212. y: [0, Math.max(...csv.slice(13))],
  213. line: {
  214. color: 'green'
  215. },
  216. type: 'scatter',
  217. mode: 'lines'
  218. }];
  219. var layout = {
  220. margin: {
  221. l: 50,
  222. r: 10,
  223. b: 50,
  224. t: 10,
  225. pad: 4
  226. },
  227. xaxis: {
  228. title: 'Time',
  229. showgrid: true,
  230. },
  231. yaxis: {
  232. title: 'Input voltage',
  233. showgrid: true
  234. },
  235. showlegend: false
  236. };
  237. Plotly.newPlot('waveformGraph', data, layout);
  238. }
  239. async function loadLongGraph(){
  240. csv = await eel.loadLongTerm()()
  241. xIndex = parseInt(document.querySelector('#longGraphX').children[document.querySelector('#longGraphX').selectedIndex].value)
  242. xTitle = document.querySelector('#longGraphX').children[document.querySelector('#longGraphX').selectedIndex].innerText
  243. yIndex = parseInt(document.querySelector('#longGraphY').children[document.querySelector('#longGraphY').selectedIndex].value)
  244. yTitle = document.querySelector('#longGraphY').children[document.querySelector('#longGraphY').selectedIndex].innerText
  245. var data = [{
  246. x: csv.map(l => l[xIndex]),
  247. y: csv.map(l => l[yIndex]),
  248. type: 'scatter'
  249. }]
  250. if(xIndex==1){
  251. max = Math.max(...data[0].x)
  252. data[0].x = data[0].x.map(v => (v-max)/60)
  253. }
  254. var layout = {
  255. margin: {
  256. l: 50,
  257. r: 10,
  258. b: 50,
  259. t: 10,
  260. pad: 4
  261. },
  262. xaxis: {
  263. title: xTitle,
  264. showgrid: true,
  265. },
  266. yaxis: {
  267. title: yTitle,
  268. showgrid: true
  269. },
  270. showlegend: false
  271. };
  272. Plotly.newPlot('longGraph', data, layout);
  273. }
  274. function error(txt){
  275. Toastify({
  276. text: "Error: "+txt,
  277. gravity: 'bottom',
  278. position: 'left',
  279. close: true,
  280. backgroundColor: "#ef4041",
  281. duration: 3000,}).showToast()
  282. }
  283. function warning(txt){
  284. Toastify({
  285. text: "Warning: "+txt,
  286. gravity: 'bottom',
  287. position: 'left',
  288. close: true,
  289. backgroundColor: "#e36d25",
  290. duration: 3000,}).showToast()
  291. }