BaseClass.py 5.3 KB

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