engine.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. from os import times
  2. import struct
  3. from .interfaces import adc_default, gra_default, sdr_default, sync_default
  4. from . import models
  5. from . import serializers
  6. from multiprocessing import *
  7. import numpy as np
  8. from rest_framework import permissions, viewsets
  9. from rest_framework.views import APIView
  10. from rest_framework.response import Response
  11. from rest_framework.parsers import JSONParser,ParseError
  12. from rest_framework import status
  13. from django.conf import settings
  14. import threading
  15. import subprocess
  16. import base64
  17. import time as tm
  18. class NewThread(threading.Thread):
  19. def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
  20. threading.Thread.__init__(self, group, target, name, args, kwargs)
  21. self._return = None
  22. def run(self):
  23. if self._target != None:
  24. self._return = self._target(*self._args, **self._kwargs)
  25. else:
  26. self._return = ((0x00, 0), 0)
  27. def join(self, *args):
  28. threading.Thread.join(self, *args)
  29. return self._return
  30. class DefaultEngine:
  31. def __init__(self, instance, lock):
  32. self.measure = instance
  33. if(self.measure.info.iadc.enabled):
  34. if(self.measure.info.iadc.device.proto == 'USB'):
  35. self.adc_interface = adc_default(port=-1)
  36. else:
  37. self.adc_interface = adc_default(port=5003)
  38. if(self.measure.info.isync.device.proto == 'USB'):
  39. self.sync_interface = sync_default(port=-1)
  40. else:
  41. self.sync_interface = sync_default(port=5001)
  42. if(self.measure.info.isdr.device.proto == 'USB'):
  43. self.sdr_interface = sdr_default(port=-1)
  44. else:
  45. self.sdr_interface = sdr_default(port=5003)
  46. if(self.measure.info.igrax.enabled):
  47. self.grax_interface = gra_default(ip = self.measure.info.igrax.ip, port=5002)
  48. if(self.measure.info.igray.enabled):
  49. self.gray_interface = gra_default(ip = self.measure.info.igray.ip, port=5002)
  50. if(self.measure.info.igraz.enabled):
  51. self.graz_interface = gra_default(ip = self.measure.info.igraz.ip, port=5002)
  52. self.engine_thread = threading.Thread(target=self.run)
  53. self.lock = lock
  54. self.engine_thread.start()
  55. self.measure.state.status = 'STARTING'
  56. self.lock.acquire()
  57. self.measure.state.save()
  58. self.measure.save()
  59. self.lock.release()
  60. def getThread(self):
  61. return self.engine_thread
  62. def syncUp(self):
  63. ret = self.sync_interface.upload(str(settings.BASE_DIR) + '\\bin\\Sync.exe',
  64. self.measure.info.isync.file,
  65. self.measure.info.isync.port)
  66. if(ret != 0):
  67. self.measure.state.grax.status = 'CONFIG ERROR'
  68. self.measure.state.grax.code = -1
  69. self.measure.state.status = 'SYNC ERROR'
  70. self.measure.state.code = -1
  71. self.lock.acquire()
  72. self.measure.state.grax.save()
  73. self.measure.state.save()
  74. self.measure.save()
  75. self.lock.release()
  76. return -1
  77. # Final configuration: set the status to configured for sync and overall.
  78. self.measure.state.sync.status = 'CONFIGURED'
  79. self.measure.state.sync.code = 1
  80. self.measure.state.status = 'SYNC CONFIGURED'
  81. self.measure.state.code = 1
  82. self.lock.acquire()
  83. self.measure.state.sync.save()
  84. self.measure.state.save()
  85. self.measure.save()
  86. self.lock.release()
  87. print('UPDATED')
  88. return 0
  89. def syncWait(self):
  90. ret = self.sync_interface.trig_wait(self.measure.info.isync.port)
  91. if(ret[0] == 0xFF):
  92. self.measure.state.sync.status = 'TRIG SET ERROR'
  93. self.measure.state.sync.code = -4
  94. self.measure.state.status = 'SYNC ERROR'
  95. self.measure.state.code = -1
  96. self.lock.acquire()
  97. self.measure.state.sync.save()
  98. self.measure.state.save()
  99. self.measure.save()
  100. self.lock.release()
  101. return -1
  102. self.measure.state.sync.status = 'WAIT FOR TRIGGER'
  103. self.measure.state.sync.code = 2
  104. self.measure.state.status = 'SYNC WAIT'
  105. self.measure.state.code = 2
  106. print('SENDED')
  107. return 0
  108. def syncDown(self):
  109. ret = self.sync_interface.serial_close()
  110. if(self.measure.info.iadc.enabled):
  111. self.adc_interface.client_socket.close()
  112. self.measure.state.sync.status = 'TRIGGERING COMPLETE'
  113. self.measure.state.sync.code = 0
  114. return 0
  115. def graUp(self):
  116. if(self.measure.info.igrax.enabled == True):
  117. try:
  118. self.grax_interface.connect()
  119. except Exception as e:
  120. self.measure.state.grax.status = 'CONN ERROR'
  121. self.measure.state.grax.code = -1
  122. self.measure.state.status = 'GRA X ERROR'
  123. self.measure.state.code = -2
  124. self.lock.acquire()
  125. self.measure.state.grax.save()
  126. self.measure.state.save()
  127. self.measure.save()
  128. self.lock.release()
  129. return -1
  130. # Reset and power on
  131. self.grax_interface.reset()
  132. ret = self.grax_interface.state()
  133. self.measure.state.grax.code = ret[2]
  134. self.measure.state.grax.status = f'RETCODE {ret}'
  135. # Power on
  136. self.grax_interface.ps_on()
  137. ret = self.grax_interface.state()
  138. self.measure.state.grax.code = ret[2]
  139. self.measure.state.grax.status = f'RETCODE {ret}'
  140. data = b''
  141. with open(self.measure.info.igrax.file, 'rb') as file:
  142. data = file.read()
  143. i = 0
  144. nodes = []
  145. while(i < len(nodes)):
  146. time, ampl = struct.unpack('<IH', data[i:])
  147. node = []
  148. node.append(time)
  149. node.append(ampl)
  150. nodes.append(node)
  151. i += 6
  152. points = len(nodes)
  153. self.grax_interface.upload(points, nodes)
  154. ret = self.grax_interface.state()
  155. self.measure.state.grax.code = ret[2]
  156. self.measure.state.grax.status = f'RETCODE {ret}'
  157. self.grax_interface.ps_off()
  158. ret = self.grax_interface.state()
  159. self.measure.state.grax.code = ret[2]
  160. self.measure.state.grax.status = f'RETCODE {ret}'
  161. self.measure.state.grax.code = 1
  162. self.measure.state.grax.status = 'CONFIGURED'
  163. self.lock.acquire()
  164. self.measure.state.grax.save()
  165. self.measure.state.save()
  166. self.measure.save()
  167. self.lock.release()
  168. if(self.measure.info.igray.enabled == True):
  169. try:
  170. self.gray_interface.connect()
  171. except Exception as e:
  172. self.measure.state.gray.status = 'CONN ERROR'
  173. self.measure.state.gray.code = -1
  174. self.measure.state.status = 'GRA Y ERROR'
  175. self.measure.state.code = -2
  176. self.lock.acquire()
  177. self.measure.state.gray.save()
  178. self.measure.state.save()
  179. self.measure.save()
  180. self.lock.release()
  181. return -1
  182. self.gray_interface.reset()
  183. ret = self.gray_interface.state()
  184. self.measure.state.gray.code = ret[2]
  185. self.measure.state.gray.status = f'RETCODE {ret}'
  186. self.gray_interface.ps_on()
  187. ret = self.gray_interface.state()
  188. self.measure.state.gray.code = ret[2]
  189. self.measure.state.gray.status = f'RETCODE {ret}'
  190. data = b''
  191. with open(self.measure.info.igray.file, 'rb') as file:
  192. data = file.read()
  193. i = 0
  194. nodes = []
  195. while(i < len(nodes)):
  196. time, ampl = struct.unpack('<IH', data[i:])
  197. node = []
  198. node.append(time)
  199. node.append(ampl)
  200. nodes.append(node)
  201. i += 6
  202. points = len(nodes)
  203. self.gray_interface.upload(points, nodes)
  204. ret = self.gray_interface.state()
  205. self.measure.state.gray.code = ret[2]
  206. self.measure.state.gray.status = f'RETCODE {ret}'
  207. self.gray_interface.ps_off()
  208. ret = self.gray_interface.state()
  209. self.measure.state.gray.code = ret[2]
  210. self.measure.state.gray.status = f'RETCODE {ret}'
  211. self.measure.state.gray.code = 1
  212. self.measure.state.gray.status = 'CONFIGURED'
  213. self.lock.acquire()
  214. self.measure.state.gray.save()
  215. self.measure.state.save()
  216. self.measure.save()
  217. self.lock.release()
  218. if(self.measure.info.igraz.enabled == True):
  219. try:
  220. self.graz_interface.connect()
  221. except Exception as e:
  222. self.measure.state.graz.status = 'CONN ERROR'
  223. self.measure.state.graz.code = -1
  224. self.measure.state.status = 'GRA Z ERROR'
  225. self.measure.state.code = -2
  226. self.lock.acquire()
  227. self.measure.state.graz.save()
  228. self.measure.state.save()
  229. self.measure.save()
  230. self.lock.release()
  231. return -1
  232. self.graz_interface.reset()
  233. ret = self.graz_interface.state()
  234. self.measure.state.graz.code = ret[2]
  235. self.measure.state.graz.status = f'RETCODE {ret}'
  236. self.graz_interface.ps_on()
  237. ret = self.graz_interface.state()
  238. self.measure.state.graz.code = ret[2]
  239. self.measure.state.graz.status = f'RETCODE {ret}'
  240. data = b''
  241. with open(self.measure.info.igraz.file, 'rb') as file:
  242. data = file.read()
  243. i = 0
  244. nodes = []
  245. while(i < len(nodes)):
  246. time, ampl = struct.unpack('<IH', data[i:])
  247. node = []
  248. node.append(time)
  249. node.append(ampl)
  250. nodes.append(node)
  251. i += 6
  252. points = len(nodes)
  253. self.graz_interface.upload(points, nodes)
  254. ret = self.graz_interface.state()
  255. self.measure.state.graz.code = ret[2]
  256. self.measure.state.graz.status = f'RETCODE {ret}'
  257. self.graz_interface.ps_off()
  258. ret = self.graz_interface.state()
  259. self.measure.state.graz.code = ret[2]
  260. self.measure.state.graz.status = f'RETCODE {ret}'
  261. self.measure.state.graz.code = 1
  262. self.measure.state.graz.status = 'CONFIGURED'
  263. self.measure.state.status = 'GRA CONFIGURED'
  264. self.measure.state.code = 2
  265. self.lock.acquire()
  266. self.measure.state.graz.save()
  267. self.measure.state.save()
  268. self.measure.save()
  269. self.lock.release()
  270. return 0
  271. def adcUp(self):
  272. try:
  273. self.adc_interface.connect()
  274. except:
  275. self.measure.state.adc.status = 'CONN ERROR'
  276. self.measure.state.adc.code = -1
  277. self.measure.state.status = 'ADC ERROR'
  278. self.measure.state.code = -3
  279. self.lock.acquire()
  280. self.measure.state.adc.save()
  281. self.measure.state.save()
  282. self.measure.save()
  283. self.lock.release()
  284. self.adc_interface.client_socket.close()
  285. return -1
  286. ret = self.adc_interface.open()
  287. if(ret[0] == 0xFF):
  288. self.measure.state.adc.status = 'OPEN ERROR'
  289. self.measure.state.adc.code = -2
  290. self.measure.state.status = 'ADC ERROR'
  291. self.measure.state.code = -3
  292. self.lock.acquire()
  293. self.measure.state.adc.save()
  294. self.measure.state.save()
  295. self.measure.save()
  296. self.lock.release()
  297. self.adc_interface.client_socket.close()
  298. return ret
  299. self.measure.state.adc.status = 'OPENED'
  300. self.measure.state.adc.code = 1
  301. self.measure.state.status = 'ADC OPENED'
  302. self.measure.state.code = 3
  303. self.lock.acquire()
  304. self.measure.state.sync.save()
  305. self.measure.state.save()
  306. self.measure.save()
  307. self.lock.release()
  308. print('UPDATED')
  309. return 0
  310. def adcConfig(self):
  311. rate = self.measure.info.iadc.srate
  312. ret = self.adc_interface.set_rate(rate)
  313. if(ret[0] == 0xFF):
  314. self.measure.state.adc.status = 'RATE ERROR'
  315. self.measure.state.adc.code = -3
  316. self.measure.state.status = 'ADC ERROR'
  317. self.measure.state.code = -3
  318. self.lock.acquire()
  319. self.measure.state.adc.save()
  320. self.measure.state.save()
  321. self.measure.save()
  322. self.lock.release()
  323. self.adc_interface.client_socket.close()
  324. return ret
  325. points = self.measure.info.iadc.points
  326. ret = self.adc_interface.set_points(points)
  327. if(ret[0] == 0xFF):
  328. self.measure.state.adc.status = 'POINTS ERROR'
  329. self.measure.state.adc.code = -4
  330. self.measure.state.status = 'ADC ERROR'
  331. self.measure.state.code = -3
  332. self.lock.acquire()
  333. self.measure.state.adc.save()
  334. self.measure.state.save()
  335. self.measure.save()
  336. self.lock.release()
  337. self.adc_interface.client_socket.close()
  338. return ret
  339. ret = self.adc_interface.config_channels(self.measure.info.iadc.n_channels,
  340. self.measure.info.iadc.channel_ranges,
  341. self.measure.info.iadc.trigger_channel,
  342. self.measure.info.iadc.trig_direction,
  343. self.measure.info.iadc.threshold,
  344. self.measure.info.iadc.auto_measure_time)
  345. if(ret[0] == 0xFF):
  346. self.measure.state.adc.status = 'TRIGGER CONFIG ERROR'
  347. self.measure.state.adc.code = -5
  348. self.measure.state.status = 'ADC ERROR'
  349. self.measure.state.code = -3
  350. self.lock.acquire()
  351. self.measure.state.adc.save()
  352. self.measure.state.save()
  353. self.measure.save()
  354. self.lock.release()
  355. self.adc_interface.client_socket.close()
  356. return ret
  357. ret = self.adc_interface.set_premeasure(0)
  358. if(ret[0] == 0xFF):
  359. self.measure.state.adc.status = 'SET PREMEASURE ERROR'
  360. self.measure.state.adc.code = -6
  361. self.measure.state.status = 'ADC ERROR'
  362. self.measure.state.code = -3
  363. self.lock.acquire()
  364. self.measure.state.adc.save()
  365. self.measure.state.save()
  366. self.measure.save()
  367. self.lock.release()
  368. self.adc_interface.client_socket.close()
  369. return ret
  370. ret = self.adc_interface.set_trignum(self.measure.info.iadc.n_triggers)
  371. if(ret[0] == 0xFF):
  372. self.measure.state.adc.status = 'SET PREMEASURE ERROR'
  373. self.measure.state.adc.code = -6
  374. self.measure.state.status = 'ADC ERROR'
  375. self.measure.state.code = -3
  376. self.lock.acquire()
  377. self.measure.state.adc.save()
  378. self.measure.state.save()
  379. self.measure.save()
  380. self.lock.release()
  381. self.adc_interface.client_socket.close()
  382. return ret
  383. self.measure.state.adc.status = 'CONFIGURED'
  384. self.measure.state.adc.code = 2
  385. self.measure.state.status = 'ADC CONFIGURED'
  386. self.measure.state.code = 3
  387. self.lock.acquire()
  388. self.measure.state.sync.save()
  389. self.measure.state.save()
  390. self.measure.save()
  391. self.lock.release()
  392. print('UPDATED')
  393. return 0
  394. def sdrUp(self, thr):
  395. ret = self.sdr_interface.transf(str(settings.BASE_DIR) + '\\bin\\hackrftrans00.exe',
  396. self.measure.info.isdr.file,
  397. self.measure.info.isdr.freq,
  398. self.measure.info.isdr.srate,
  399. int(self.measure.info.isdr.ampl),
  400. self.measure.info.isdr.gain)
  401. if(ret[0] == 0xFF):
  402. self.measure.state.sdr.status = 'SDR ERROR (WAIT FOR STOPING ADC!)'
  403. self.measure.state.sdr.code = -1
  404. self.measure.state.status = 'SDR ERROR'
  405. self.measure.state.code = -3
  406. self.lock.acquire()
  407. self.measure.state.sdr.save()
  408. self.measure.state.save()
  409. self.measure.save()
  410. self.lock.release()
  411. if(thr != None):
  412. thr.join()
  413. self.measure.state.sdr.status = 'SDR ERROR'
  414. self.measure.state.sdr.code = -2
  415. self.lock.acquire()
  416. self.measure.state.sdr.save()
  417. self.measure.state.save()
  418. self.measure.save()
  419. self.lock.release()
  420. self.adc_interface.client_socket.close()
  421. return ret
  422. self.measure.state.sdr.status = 'STARTED'
  423. self.measure.state.sdr.code = 1
  424. self.measure.state.status = 'SDR START'
  425. self.measure.state.code = 4
  426. self.lock.acquire()
  427. self.measure.state.sdr.save()
  428. self.measure.state.save()
  429. self.measure.save()
  430. self.lock.release()
  431. return 0
  432. def adcWrite(self, k):
  433. self.lock.acquire()
  434. for i in range(len(self.adc_interface.ndata)):
  435. data = models.measurement_data.objects.create(data_num=i, averaging_num=k, measurement=self.measure)
  436. for j in range(len(self.adc_interface.ndata[i])):
  437. cdata = data.channel_data.create(channel_num=j,
  438. measurement_data=data,
  439. channel_data=base64.b64encode(self.adc_interface.ndata[i][j]).decode('utf-8'))
  440. cdata.save()
  441. data.save()
  442. self.measure.save()
  443. self.lock.release()
  444. self.adc_interface.clear_ndata()
  445. tm.sleep(1)
  446. return 0
  447. def close(self):
  448. ret = self.sync_interface.serial_close()
  449. if(self.measure.info.iadc.enabled):
  450. self.adc_interface.client_socket.close()
  451. self.measure.state.adc.status = 'MEASURE COMPLETED'
  452. self.measure.state.data_ready = True
  453. self.measure.state.adc.code = 1
  454. self.measure.state.status = 'MEASURE COMPLETED'
  455. self.measure.state.code = 1
  456. self.lock.acquire()
  457. self.measure.state.grax.save()
  458. self.measure.state.gray.save()
  459. self.measure.state.graz.save()
  460. self.measure.state.sync.save()
  461. self.measure.state.sdr.save()
  462. self.measure.state.adc.save()
  463. self.measure.state.save()
  464. self.measure.save()
  465. self.lock.release()
  466. return 0
  467. def run(self):
  468. # Connect to the sync product first
  469. # Open the sync product, check for errors if any returned with status byte 0xFF
  470. self.syncUp()
  471. self.graUp()
  472. self.sync_interface.serial_open(self.measure.info.isync.port)
  473. if(self.measure.info.iadc.enabled == True):
  474. for k in range(0, self.measure.info.iadc.averaging):
  475. print('SENDING TRIGGER')
  476. # Set trigger wait, check for errors
  477. ret = self.syncWait()
  478. if(ret != 0):
  479. return ret
  480. ret = self.adcUp()
  481. if(ret != 0):
  482. return ret
  483. ret = self.adcConfig()
  484. if(ret != 0):
  485. return ret
  486. t = NewThread(target=self.adc_interface.start)
  487. t.start()
  488. tm.sleep(1)
  489. ret = self.sdrUp(t)
  490. t.join()
  491. ret = self.adc_interface.measure_code
  492. if(ret[0] == 0xFF):
  493. self.measure.state.adc.status = 'MEASURE ERROR'
  494. self.measure.state.adc.code = -7
  495. self.measure.state.status = 'ADC ERROR'
  496. self.measure.state.code = -3
  497. self.lock.acquire()
  498. self.measure.state.adc.save()
  499. self.measure.state.save()
  500. self.measure.save()
  501. self.lock.release()
  502. self.adc_interface.client_socket.close()
  503. return ret
  504. self.adcWrite(k)
  505. else:
  506. print('SENDING TRIGGER')
  507. # Set trigger wait, check for errors
  508. ret = self.syncWait()
  509. if(ret != 0):
  510. return ret
  511. ret = self.sdrUp(None)
  512. if(ret[0] != 0):
  513. return ret
  514. ret = self.close()
  515. if(ret != 0):
  516. return ret
  517. return 0
  518. EngineDict = {
  519. 'DefaultEngine': DefaultEngine
  520. }