engine.py 22 KB

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