message_handler.py 14 KB

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