BaseClass.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import asyncio,time
  2. from sockets import ConnectionManager
  3. from utils.common import message_queue
  4. from mcu.capture.smart_shooter_class import SmartShooter
  5. class BaseClass:
  6. def __init__(
  7. self, websocket_manager: ConnectionManager, smart_shooter: SmartShooter = None
  8. ):
  9. self.websocket_manager = websocket_manager
  10. self.smart_shooter = smart_shooter
  11. self.msg_type = ""
  12. self.websocket = None
  13. # -1连接失败 0未连接 1连接中 2连接成功 3端口占用
  14. # self.device_status = 2
  15. def sendSocketMessage(self, code=0, msg="", data=None, device_status=2):
  16. t_start = time.time()
  17. payload = {
  18. "code": code,
  19. "msg": msg,
  20. "status": device_status,
  21. "data": data,
  22. "msg_type": self.msg_type,
  23. }
  24. print(f"[T1: {t_start:.4f}] sendSocketMessage 调用, msg={msg}")
  25. loop = asyncio.get_event_loop()
  26. if self.websocket == None:
  27. print(f"[T1: {time.time()-t_start:.4f}s] 走队列路径")
  28. loop.create_task(message_queue.put(payload))
  29. else:
  30. print(f"[T1: {time.time()-t_start:.4f}s] 走直接发送路径")
  31. async def _do_send():
  32. t2 = time.time()
  33. print(f"[T2: {t2-t_start:.4f}s] 任务开始执行, 准备调用 send_personal_message")
  34. await self.websocket_manager.send_personal_message(payload, self.websocket)
  35. t3 = time.time()
  36. print(f"[T3: {t3-t_start:.4f}s] send_personal_message 完成, 总耗时: {t3-t2:.4f}s")
  37. loop.create_task(_do_send())
  38. print("\033[1;32;40m 发送消息===>sendSocketMessage \033[0m", data)
  39. async def asyncSendSocketMessage(self, code=0, msg="", data=None, device_status=2):
  40. data = {
  41. "code": code,
  42. "msg": msg,
  43. "status": device_status,
  44. "data": data,
  45. "msg_type": self.msg_type,
  46. }
  47. if self.websocket == None:
  48. await asyncio.wait_for(message_queue.put(data), timeout=0.1)
  49. else:
  50. await self.websocket_manager.send_personal_message(data, self.websocket)
  51. def change_hex_to_int(self, _bytearray):
  52. return " ".join([hex(x) for x in _bytearray])
  53. def read_cmd(self, serial_handle, check=None):
  54. n = 0
  55. while 1:
  56. try:
  57. read_d = serial_handle.read_all() # 读取接收到的数据
  58. self.receive_data += read_d
  59. except BaseException as e:
  60. print("171串口接收报错", e)
  61. self.serial_handle = None
  62. return False
  63. if len(self.receive_data) < 4:
  64. break
  65. if self.receive_data[0] == 0x55 and self.receive_data[1] == 0x55:
  66. # print("read ori ", self.change_hex_to_int(self.receive_data))
  67. data_len = self.receive_data[2]
  68. if len(self.receive_data) < data_len + 4:
  69. # 此处需要超时机制
  70. # print("数据长度不够,等待下次读取")
  71. # 超时退出
  72. # if not self.serial_handle.txdone():
  73. # return None
  74. # n += 1
  75. # if n > out_time_n:
  76. # return None
  77. # time.sleep(0.01)
  78. continue
  79. _data = self.receive_data[3 : data_len + 4]
  80. # 更新缓存区
  81. self.receive_data = self.receive_data[data_len + 4 :]
  82. # 校验数据
  83. if 0xFF & ~sum(_data[:-1]) == _data[-1]:
  84. # print("receive_data:", self.change_hex_to_int(self.receive_data[:-1]))
  85. return _data[:-1]
  86. else:
  87. return None
  88. else:
  89. # print("起始位不是 55 55 进行移除", self.receive_data[0])
  90. # 起始位不是 55 55 进行移除
  91. while self.receive_data:
  92. if len(self.receive_data) == 1:
  93. if self.receive_data[0] == 0x55:
  94. break
  95. else:
  96. self.receive_data = b""
  97. else:
  98. if (
  99. self.receive_data[0] == 0x55
  100. and self.receive_data[1] == 0x55
  101. ):
  102. break
  103. else:
  104. self.receive_data = self.receive_data[1:]
  105. def write_cmd(self, serial_handle, data: list):
  106. if serial_handle:
  107. # data = [(0xff & par1), (0xff & (par1 >> 8))]
  108. # self.clearn_flush()
  109. buf = bytearray(b"")
  110. buf.extend([0x55, 0x55, (0xFF & len(data))])
  111. buf.extend(data)
  112. buf.extend([0xFF & ~sum(data)])
  113. # 55 55 02 5a 01 a4
  114. # print("send buf {}".format(self.change_hex_to_int(buf)))
  115. try:
  116. serial_handle.write(buf)
  117. return True
  118. except:
  119. serial_handle = None
  120. _recv_data = b""
  121. return False