engine.py 22 KB

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