interfaces.py 12 KB

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