interfaces.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. import socket
  2. import struct
  3. import subprocess
  4. import numpy as np
  5. import serial
  6. import time as tm
  7. probe = {
  8. '10mV': np.int8(0),
  9. '20mV': np.int8(1),
  10. '50mV': np.int8(2),
  11. '100mV': np.int8(3),
  12. '200mV': np.int8(4),
  13. '500mV': np.int8(5),
  14. '1V': np.int8(6),
  15. '2V': np.int8(7),
  16. '5V': np.int8(8),
  17. '10V': np.int8(9),
  18. '20V': np.int8(10),
  19. '50V': np.int8(11),
  20. '100V': np.int8(12),
  21. '200V': np.int8(13)
  22. }
  23. class adc_default:
  24. def __init__(self, port):
  25. self.port = port
  26. self.ndata = []
  27. self.channels_data = []
  28. self.measure_code = (0x00, 0)
  29. self.proto = {
  30. 'open': 0x01,
  31. 'set_rate': 0x07,
  32. 'set_points': 0x06,
  33. 'config_channels': 0x09,
  34. 'set_premeasure': 0x28,
  35. 'set_trignum': 0x19,
  36. 'start': 0x3B,
  37. 'stop': 0x03,
  38. }
  39. def connect(self, port=0):
  40. self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  41. self.client_socket.settimeout(10.0)
  42. resp = self.client_socket.connect(('127.0.0.1', self.port))
  43. return resp
  44. def resp_handler(self, resp, cmd):
  45. if(resp[0] != 0xAA):
  46. return (-1, 0)
  47. if(resp[1] == 0xFF):
  48. return (0xFF, resp[3])
  49. return (resp[1], 0)
  50. def open(self):
  51. msg = struct.pack('<BB', 0xAA, self.proto['open'])
  52. self.client_socket.send(msg)
  53. resp = self.client_socket.recv(4096)
  54. return self.resp_handler(resp, self.proto['open'])
  55. def set_rate(self, rate):
  56. print('send sample_rate')
  57. msg = struct.pack('<BBI', 0xAA, self.proto['set_rate'], np.uint32(rate))
  58. self.client_socket.send(msg)
  59. resp = self.client_socket.recv(4096)
  60. return resp
  61. def set_points(self, points):
  62. print('send points')
  63. msg = struct.pack('<BBI', 0xAA, self.proto['set_points'], len(points))
  64. for p in points:
  65. msg += p.to_bytes(length=4, byteorder='little')
  66. self.client_socket.send(msg)
  67. resp = self.client_socket.recv(4096)
  68. return self.resp_handler(resp, self.proto['set_points'])
  69. def config_channels(self, nchannels, channel_ranges, trig_channel, trig_dirrection, trig_threshold, auto_trigger_time):
  70. print('configure')
  71. print(channel_ranges)
  72. channel_ranges_bytes = b''
  73. for r in channel_ranges:
  74. channel_ranges_bytes += r.to_bytes(length=1)
  75. print(channel_ranges_bytes)
  76. msg = struct.pack(f'<BBI{nchannels}sBiHh', 0xAA, self.proto['config_channels'], nchannels, channel_ranges_bytes, trig_channel, trig_dirrection, trig_threshold, auto_trigger_time)
  77. print(msg[6:8])
  78. self.client_socket.send(msg)
  79. resp = self.client_socket.recv(4096)
  80. return self.resp_handler(resp, self.proto['config_channels'])
  81. def set_premeasure(self, trig_premeasure):
  82. print('set pre-measure')
  83. msg = struct.pack('<BBI', 0xAA, self.proto['set_premeasure'], trig_premeasure)
  84. self.client_socket.send(msg)
  85. resp = self.client_socket.recv(4096)
  86. return self.resp_handler(resp, self.proto['set_premeasure'])
  87. def set_trignum(self, trig_num):
  88. print('set trignum')
  89. msg = struct.pack('<BBI', 0xAA, self.proto['set_trignum'], trig_num)
  90. self.client_socket.send(msg)
  91. resp = self.client_socket.recv(4096)
  92. return self.resp_handler(resp, self.proto['set_trignum'])
  93. def start(self):
  94. data = b''
  95. temp = b''
  96. print('start')
  97. msg = struct.pack('<BB', 0xAA, self.proto['start'])
  98. self.client_socket.send(msg)
  99. resp = b'\x00\x00'
  100. resp = self.client_socket.recv(4096)
  101. if(resp[1] == 0xFB):
  102. try:
  103. print(f"Data confirmed with code {resp[1]}")
  104. msg = struct.pack('<BB', 0xAA, 0xCB)
  105. self.client_socket.send(msg)
  106. except TimeoutError as e:
  107. print("Timeout!")
  108. resp = b'\x00\x00'
  109. else:
  110. print('error')
  111. return (self.resp_handler(resp, self.proto['start']), self.ndata)
  112. nsignal = 0
  113. nchannel = 0
  114. last_signal = 0
  115. last_channel = 0
  116. resp = self.client_socket.recv(4096)
  117. while(resp[1] != 0xFC):
  118. if(resp[1] == 0xFF):
  119. self.measure_code = self.resp_handler(resp, self.proto['start'])
  120. print('error')
  121. return (self.resp_handler(resp, self.proto['start']), self.ndata)
  122. elif(resp[1] == 0xFD):
  123. magic, cmd, nsignal, nchannel, total_packets, npacket, ndata_sent, first = struct.unpack(f'<BBIIIIIh', resp[0:24])
  124. eod = ndata_sent+22
  125. print(f'sig {nsignal}, ch {nchannel}, packet {npacket} / {total_packets}')
  126. temp = resp[22:eod]
  127. #print(f'First: {first} or First: {struct.unpack('<h', temp[0:2])}')
  128. msg = struct.pack('<BB', 0xAA, 0x3D)
  129. self.client_socket.send(msg)
  130. if(nchannel > last_channel):
  131. print('append channel')
  132. self.channels_data.append(data)
  133. data = b''
  134. last_channel += 1
  135. if(nsignal > last_signal):
  136. print('append channel')
  137. self.channels_data.append(data)
  138. data = b''
  139. last_channel = 0
  140. last_signal += 1
  141. print('append data')
  142. self.ndata.append(self.channels_data)
  143. self.channels_data = []
  144. data += temp
  145. resp = self.client_socket.recv(4096)
  146. print(f'RESP: {resp[1]}')
  147. msg = struct.pack('<BB', 0xAA, 0x3C)
  148. self.client_socket.send(msg)
  149. print('append channel')
  150. self.channels_data.append(data)
  151. print('append data')
  152. self.ndata.append(self.channels_data)
  153. self.measure_code = self.resp_handler(resp, self.proto['start'])
  154. return (self.resp_handler(resp, self.proto['start']), self.ndata)
  155. def stop(self):
  156. print('set post-measure')
  157. msg = struct.pack('<BB', 0xAA, self.proto['stop'])
  158. self.client_socket.send(msg)
  159. #resp = self.client_socket.recv(4096)
  160. return self.resp_handler((0x00, 0x00), self.proto['stop'])
  161. def clear_ndata(self):
  162. self.ndata = []
  163. self.channels_data = []
  164. class sync_default:
  165. def __init__(self, port):
  166. if(port != -1):
  167. self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  168. self.proto = {
  169. 'upload': 0x01,
  170. 'trig_wait': 0x02
  171. }
  172. self.serial = None
  173. def connect(self, port):
  174. self.client_socket.settimeout(5.0)
  175. resp = self.client_socket.connect(('localhost', port))
  176. return resp
  177. def resp_handler(self, resp, cmd):
  178. if(resp[0] != 0xAA):
  179. return (-1, 0)
  180. if(resp[1] == 0xFF):
  181. return (0xFF, resp[3])
  182. return (resp[1], 0)
  183. def upload(self, programPath, filePath, port):
  184. try:
  185. process = subprocess.run([programPath, filePath, '-p', str(port), '--debug'])
  186. except subprocess.CalledProcessError as e:
  187. print(f"Ошибка команды {e.cmd}!")
  188. return process.returncode
  189. def serial_open(self, port):
  190. try:
  191. self.serial = serial.Serial('COM' + str(port), 9600, timeout=1)
  192. except serial.SerialException as e:
  193. print(e)
  194. return (0xFF, -1)
  195. return(0x00, 0)
  196. def trig_wait(self, port):
  197. try:
  198. self.serial.write(b'e')
  199. except serial.SerialException as e:
  200. print(e)
  201. return (0xFF, -1)
  202. return(0x00, 0)
  203. def serial_close(self):
  204. try:
  205. self.serial.close()
  206. except:
  207. return (0xFF, -1)
  208. return (0x00, 0)
  209. class sdr_default:
  210. def __init__(self, port):
  211. if(port != -1):
  212. self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  213. self.proto = {
  214. 'transf': 0x01
  215. }
  216. def connect(self, port):
  217. self.client_socket.settimeout(5.0)
  218. resp = self.client_socket.connect(('localhost', port))
  219. return resp
  220. def transf(self, programPath, filePath, freq, rate, ampl, gain):
  221. try:
  222. process = subprocess.run([programPath, '-t', filePath, '-f', str(freq), '-s', str(rate), '-a', str(ampl), '-x', str(gain)], check=True)
  223. except subprocess.CalledProcessError as e:
  224. print(f"Ошибка команды {e.cmd}!")
  225. return (0xFF, -1)
  226. return (0x00, process.returncode)
  227. class gra_default:
  228. def __init__(self, ip, port):
  229. if(port != -1):
  230. self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  231. self.client_socket.settimeout(5.0)
  232. self.client_socket.connect((ip, port))
  233. self.proto = {
  234. 'reset': 0x0001,
  235. 'ps_on': 0x0003,
  236. 'ps_off': 0x0004,
  237. 'state': 0x0005,
  238. 'upload': 0x0006,
  239. 'send_packet': 0x0007,
  240. 'confirm': 0x0008
  241. }
  242. def connect(self, port):
  243. self.client_socket.settimeout(5.0)
  244. resp = self.client_socket.connect(('localhost', port))
  245. return resp
  246. def reset(self):
  247. msg = struct.pack('<HH', 0xAAAA, self.proto['reset'])
  248. self.client_socket.send(msg)
  249. def ps_on(self):
  250. msg = struct.pack('<HH', 0xAAAA, self.proto['ps_on'])
  251. self.client_socket.send(msg)
  252. def ps_off(self):
  253. msg = struct.pack('<HH', 0xAAAA, self.proto['ps_off'])
  254. self.client_socket.send(msg)
  255. def ps_off(self):
  256. msg = struct.pack('<HH', 0xAAAA, self.proto['ps_off'])
  257. self.client_socket.send(msg)
  258. def state(self):
  259. msg = struct.pack('<HH', 0xAAAA, self.proto['state'])
  260. self.client_socket.send(msg)
  261. resp = self.client_socket.recv(4096)
  262. if(len(resp) == 6):
  263. magic, cmd, state = struct.unpack('<HHH', resp)
  264. return (cmd, state, 0, 0)
  265. elif(len(resp) > 6):
  266. magic, cmd, state, errbits, errpoint, current_setting_amp, current_amp, first_sensor, second_sensor = struct.unpack('<HHHIIiiii', resp)
  267. return (cmd, state, errbits, errpoint)
  268. def send_packet(self, nom, nodes_num, nodes_buf):
  269. i = 0
  270. time1, time2 = struct.unpack('<HH', nodes_buf[i][0].to_bytes(4, 'little'))
  271. nom = nom | 0x8000
  272. msg = struct.pack('<HHHHHHH', 0xAAAA, self.proto['send_packet'], nom, nodes_num, time1, time2, nodes_buf[i][1].to_bytes(2, 'little'))
  273. while(i < nodes_num):
  274. i += 1
  275. time1, time2 = struct.unpack('<HH', nodes_buf[i][0].to_bytes(4, 'little'))
  276. msg += struct.pack('<HHH', time1, time2, nodes_buf[i][1].to_bytes(2, 'little'))
  277. self.client_socket.send(msg)
  278. resp = self.client_socket.recv(4096)
  279. data_resp = struct.unpack('<HHH', resp)
  280. return data_resp[3]
  281. def upload(self, points, nodes):
  282. points1, points2 = struct.unpack('<HH', points.to_bytes(4, 'little'))
  283. nodes1, nodes2 = struct.unpack('<HH', nodes[points-1][0].to_bytes(4, 'little'))
  284. msg = struct.pack('<HHHHHH', 0xAAAA, self.proto['upload'], points1, points2, nodes1, nodes2)
  285. self.client_socket.send(msg)
  286. seg_num = 0
  287. total_packets = points // 200 + 1
  288. first_idx = 0
  289. while(seg_num < total_packets):
  290. if((points - first_idx) < 200):
  291. nodes_packet = points - first_idx
  292. else:
  293. nodes_packet = 200
  294. last_idx = first_idx + nodes_packet
  295. resp = self.send_packet(seg_num, nodes_packet, nodes[first_idx:last_idx])
  296. print(resp)
  297. first_idx = last_idx
  298. seg_num += 1
  299. msg = struct.pack('<HH', 0xAAAA, 0x0008)
  300. self.client_socket.send(msg)