message_handler.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. from .connect_manager import ConnectionManager
  2. from models import WebSocket
  3. import json, asyncio
  4. from mcu.DeviceControl import DeviceControl, checkMcuConnection
  5. from mcu.BlueToothMode import BlueToothMode
  6. from databases import DeviceConfig, SqlQuery, CRUD, PhotoRecord, SysConfigs
  7. from mcu.capture.module_digicam import DigiCam
  8. from mcu.capture.smart_shooter_class import SmartShooter
  9. from models import RecordUpdate
  10. # socket消息发送逻辑处理方法
  11. async def handlerSend(
  12. manager: ConnectionManager,
  13. receiveData: str,
  14. websocket: WebSocket,
  15. smart_shooter: SmartShooter,
  16. ):
  17. loop = asyncio.get_event_loop()
  18. receiveData = json.loads(receiveData)
  19. # 处理消息发送逻辑
  20. receiveData = json.loads(receiveData.get("text"))
  21. jsonType = receiveData.get("type")
  22. code = receiveData.get("code")
  23. msg = receiveData.get("msg")
  24. data = receiveData.get("data")
  25. match jsonType:
  26. case "ping":
  27. """发送心跳"""
  28. data = manager.jsonMessage("pong")
  29. await manager.send_personal_message(data, websocket)
  30. case "pong":
  31. """发送心跳"""
  32. pass
  33. case "forward_message":
  34. data = receiveData.get("data")
  35. dictMsg = {"code": code, "msg": msg, "data": data}
  36. await manager.broadcast(dictMsg)
  37. case "connect_mcu":
  38. device_ctrl = DeviceControl(
  39. websocket_manager=manager, smart_shooter=smart_shooter
  40. )
  41. device_ctrl.mcu_exit = False
  42. if device_ctrl.is_init_while == True:
  43. return
  44. # if device_ctrl.serial_ins.check_connect():
  45. # print("未连接")
  46. loop.create_task(checkMcuConnection(device_ctrl), name="mcu")
  47. case "connect_bluetooth":
  48. blue_tooth = BlueToothMode(websocket_manager=manager)
  49. blue_tooth.bluetooth_exit = False
  50. # await blue_tooth.main_func()
  51. print("连接蓝牙信息")
  52. loop.create_task(blue_tooth.main_func(), name="blue_tooth")
  53. # loop.close()
  54. case "init_mcu":
  55. device_ctrl = DeviceControl(
  56. websocket_manager=manager, smart_shooter=smart_shooter
  57. )
  58. # 是否强制初始化
  59. is_force_init = data.get("value", False)
  60. loop.create_task(device_ctrl.initDevice(is_force_init), name="init_mcu")
  61. case "control_mcu":
  62. device_name = data.get("device_name")
  63. value = data.get("value")
  64. if (device_name == "" or device_name == None) or (
  65. value == "" or value == None
  66. ):
  67. data = manager.jsonMessage(code=1, msg="参数错误", msg_type="mcu")
  68. await manager.send_personal_message(data, websocket)
  69. return
  70. device_ctrl = DeviceControl(
  71. websocket_manager=manager, smart_shooter=smart_shooter
  72. )
  73. await device_ctrl.controlDevice(device_name, value)
  74. case "stop_action":
  75. device_ctrl = DeviceControl(
  76. websocket_manager=manager, smart_shooter=smart_shooter
  77. )
  78. if device_ctrl.is_runn_action == True:
  79. print("动作执行中,停止")
  80. device_ctrl.is_stop_action = True
  81. else:
  82. print("动作没有执行,略过")
  83. case "run_mcu":
  84. msg_type = "run_mcu"
  85. action_info = data.get("action", "执行左脚程序")
  86. goods_art_no = data.get("goods_art_no", None)
  87. if goods_art_no == None or goods_art_no == "":
  88. # 判断货号是否存在
  89. data = manager.jsonMessage(
  90. code=1, msg="goods_art_no不能为空", msg_type=msg_type
  91. )
  92. await manager.send_personal_message(data, websocket)
  93. return
  94. session = SqlQuery()
  95. sys_configs = CRUD(SysConfigs)
  96. action_configs = sys_configs.read(
  97. session, conditions={"key": "action_configs"}
  98. )
  99. action_configs_json = json.loads(action_configs.value)
  100. action_flag = "left"
  101. if "右" in action_info:
  102. action_flag = "right"
  103. tab_id = action_configs_json.get(action_flag)
  104. photoRecord = CRUD(PhotoRecord)
  105. goods_art_record = photoRecord.read(
  106. session, conditions={"goods_art_no": goods_art_no}
  107. )
  108. if goods_art_record != None:
  109. data = manager.jsonMessage(
  110. code=1,
  111. msg=f"货号[{goods_art_no}]已存在,请勿重复拍摄~",
  112. msg_type=msg_type,
  113. )
  114. await manager.send_personal_message(data, websocket)
  115. return
  116. crud = CRUD(DeviceConfig)
  117. condtions = {"tab_id": tab_id}
  118. all_devices = crud.read_all(
  119. session, conditions=condtions, order_by="action_index", ascending=True
  120. )
  121. if len(all_devices) == 0:
  122. # 判断是否有可用配置
  123. data = manager.jsonMessage(code=1, msg="当前没有可用配置")
  124. await manager.send_personal_message(data, websocket, msg_type=msg_type)
  125. return
  126. action_list = [dict(device.__dict__) for device in all_devices]
  127. print("handl send smart_shooter", smart_shooter)
  128. device_ctrl = DeviceControl(
  129. websocket_manager=manager, smart_shooter=smart_shooter
  130. )
  131. loop.create_task(
  132. device_ctrl.run_mcu_config(
  133. action_list, goods_art_no, action_info, smart_shooter
  134. ),
  135. name="run_mcu_config",
  136. )
  137. case "run_mcu_single":
  138. device_ctrl = DeviceControl(
  139. websocket_manager=manager, smart_shooter=smart_shooter
  140. )
  141. loop.create_task(
  142. device_ctrl.run_mcu_config_single(
  143. data, None, "run_mcu_single", -1, smart_shooter
  144. ),
  145. name="run_mcu_single",
  146. )
  147. case "handler_take_picture":
  148. device_ctrl = DeviceControl(
  149. websocket_manager=manager, smart_shooter=smart_shooter
  150. )
  151. await device_ctrl.controlDevice("laser_position", 0)
  152. blue_tooth = BlueToothMode(
  153. websocket_manager=manager, smart_shooter=smart_shooter
  154. )
  155. loop.create_task(
  156. blue_tooth.remote_control_v2.handlerTakePhoto(smart_shooter),
  157. name="run_mcu_config",
  158. )
  159. await asyncio.sleep(2.5)
  160. await device_ctrl.controlDevice("laser_position", 1)
  161. case "re_take_picture": # 重拍
  162. msg_type = "re_take_picture"
  163. record_id = data.get("record_id")
  164. session = SqlQuery()
  165. photoRecord = CRUD(PhotoRecord)
  166. goods_art_record = photoRecord.read(session, conditions={"id": record_id})
  167. if goods_art_record == None:
  168. data = manager.jsonMessage(
  169. code=1,
  170. msg=f"记录不存在,请核实后重新操作~",
  171. msg_type=msg_type,
  172. )
  173. await manager.send_personal_message(data, websocket)
  174. return
  175. action_id = goods_art_record.action_id
  176. goods_art_no = goods_art_record.goods_art_no
  177. image_index = goods_art_record.image_index
  178. crud = CRUD(DeviceConfig)
  179. condtions = {"id": action_id}
  180. device_action = crud.read(session, conditions=condtions)
  181. result_dict = dict(device_action.__dict__)
  182. print("device_action打印输出====>>>", result_dict)
  183. if device_action == None:
  184. # 判断是否有可用配置
  185. data = manager.jsonMessage(code=1, msg="当前没有可用配置")
  186. await manager.send_personal_message(data, websocket, msg_type=msg_type)
  187. return
  188. # 清除图片记录,执行重拍
  189. reset_data = {"image_path": None}
  190. photoRecord.update(session, record_id, **reset_data)
  191. device_ctrl = DeviceControl(
  192. websocket_manager=manager, smart_shooter=smart_shooter
  193. )
  194. loop.create_task(
  195. device_ctrl.run_mcu_config_single(
  196. result_dict,
  197. goods_art_no,
  198. msg_type=msg_type,
  199. image_index=image_index,
  200. smart_shooter=smart_shooter,
  201. action_id=record_id,
  202. ),
  203. name="run_mcu_config_single",
  204. )
  205. case "get_deviation":
  206. device_ctrl = DeviceControl(
  207. websocket_manager=manager, smart_shooter=smart_shooter
  208. )
  209. loop.create_task(
  210. device_ctrl.getDeviationInfo(),
  211. name="get_deviation",
  212. )
  213. case "set_deviation":
  214. device_ctrl = DeviceControl(
  215. websocket_manager=manager, smart_shooter=smart_shooter
  216. )
  217. value = data.get("value", None)
  218. action_name = data.get("action_name", None)
  219. loop.create_task(
  220. device_ctrl.set_deviation_cmd(value, action_name, "set"),
  221. name="set_deviation",
  222. )
  223. case "move_deviation":
  224. device_ctrl = DeviceControl(
  225. websocket_manager=manager, smart_shooter=smart_shooter
  226. )
  227. value = data.get("value", None)
  228. action_name = data.get("action_name", None)
  229. loop.create_task(
  230. device_ctrl.set_deviation_cmd(value, action_name, "move"),
  231. name="move_deviation",
  232. )
  233. case "get_mcu_other_info":
  234. device_ctrl = DeviceControl(
  235. websocket_manager=manager, smart_shooter=smart_shooter
  236. )
  237. loop.create_task(
  238. device_ctrl.getMcuOtherInfo(),
  239. name="mcu_other_set_get",
  240. )
  241. case "set_mcu_other_info":
  242. device_ctrl = DeviceControl(
  243. websocket_manager=manager, smart_shooter=smart_shooter
  244. )
  245. loop.create_task(
  246. device_ctrl.setMcuOtherInfo(data),
  247. name="setMcuOtherInfo",
  248. )
  249. case "send_command":
  250. device_ctrl = DeviceControl(
  251. websocket_manager=manager, smart_shooter=smart_shooter
  252. )
  253. loop.create_task(
  254. device_ctrl.sendCommand(data.get("command", None)),
  255. name="sendCommand",
  256. )
  257. case "smart_shooter_getinfo":
  258. """
  259. 获取相机信息,是否连接
  260. """
  261. loop.create_task(
  262. smart_shooter.GetCameraInfo(msg_type="smart_shooter_getinfo"),
  263. name="smart_shooter_getinfo",
  264. )
  265. case "smart_shooter_enable_preview":
  266. """
  267. 启动相机或关闭实时预览
  268. """
  269. value = data.get("value", True)
  270. loop.create_task(
  271. smart_shooter.EnableCameraPreview(
  272. enable_status=value, msg_type="smart_shooter_enable_preview"
  273. ),
  274. name="smart_shooter_enable_preview",
  275. )
  276. case "smart_shooter_photo_take":
  277. """
  278. 获取相机信息,是否连接
  279. """
  280. device_ctrl = DeviceControl(
  281. websocket_manager=manager, smart_shooter=smart_shooter
  282. )
  283. await device_ctrl.controlDevice("laser_position", 0)
  284. # 兼容主图测试
  285. id = data.get("id", 0)
  286. goods_art_no = data.get("goods_art_no", "")
  287. is_af = True
  288. loop.create_task(
  289. smart_shooter.CameraShooter(
  290. msg_type="smart_shooter_photo_take",
  291. id=id,
  292. goods_art_no=goods_art_no,
  293. is_af=is_af,
  294. ),
  295. name="smart_shooter_photo_take",)
  296. await asyncio.sleep(2.5)
  297. await device_ctrl.controlDevice("laser_position", 1)
  298. case "digicam_take_picture":
  299. msg_type = "re_take_picture"
  300. id = data.get("id", 0)
  301. goods_art_no = data.get("goods_art_no", "")
  302. session = SqlQuery()
  303. photoRecord = CRUD(PhotoRecord)
  304. goods_art_record = photoRecord.read(session, conditions={"id": id})
  305. if goods_art_record == None:
  306. data = manager.jsonMessage(
  307. code=1,
  308. msg=f"记录不存在,请核实后重新操作~",
  309. msg_type=msg_type,
  310. )
  311. await manager.send_personal_message(data, websocket)
  312. return
  313. reset_data = {"image_path": None}
  314. photoRecord.update(session, id, **reset_data)
  315. device_ctrl = DeviceControl(websocket_manager=manager)
  316. loop.create_task(
  317. device_ctrl.only_take_photo(
  318. goods_art_no=goods_art_no,
  319. image_index=goods_art_record.image_index,
  320. record_id=id,
  321. ),
  322. name="sendCommand",
  323. )
  324. case _:
  325. data = manager.jsonMessage(code=1, msg="未知消息")
  326. await manager.send_personal_message(data, websocket)
  327. return