rambo 10 months ago
parent
commit
168f637945

+ 62 - 4
python/docs/socket命令.md

@@ -104,13 +104,15 @@ _(该命令用于单独自定义配置中某一项的单独调整测试,不进
 }
 ```
 ### 单张照片拍照完成后-服务端响应消息
-* msg_type 为photo_take时,代表拍照已完成
+* msg_type:
+    * 为photo_take时,代表拍照已完成
+    * 为photo_take_finish时,代表所有拍照任务已完成
 * data参数释义:
     * image_counts : 执行拍照任务的数量,可理解为照片张数
     * goods_art_no : 货号
     * current_time : 当前时间
 * msg 消息提示
-#### 响应示例-拍照成功
+#### 响应示例-单个任务拍照成功(前端需要刷新列表)
 ```python
 {
     "code": 0,
@@ -120,7 +122,7 @@ _(该命令用于单独自定义配置中某一项的单独调整测试,不进
     "msg_type":"photo_take"
 }
 ```
-#### 响应示例-拍照成功
+#### 响应示例-单个任务拍照失败
 ```python
 {
     "code": 1,
@@ -130,6 +132,16 @@ _(该命令用于单独自定义配置中某一项的单独调整测试,不进
     "msg_type":"photo_take"
 }
 ```
+### 响应示例-整体任务拍照完成
+```python
+{
+    "code": 1,
+    "msg": "执行左脚程序 执行成功~",
+    "status": 2,
+    "data": null,
+    "msg_type":"photo_take_finish"
+}
+```
 ### 接收遥控器扫码货号动作处理
 #### 消息示例
 * data中的子data参数释义:
@@ -151,4 +163,50 @@ _(该命令用于单独自定义配置中某一项的单独调整测试,不进
     "msg_type": "blue_tooth_scan"
 }
 ```
-### 未完待续.....
+### 接收遥控器点击拍照事件处理
+<mark>遥控器得拍照命令需要由后端转发到前端,再由前端将消息转发给后端对应得拍照命令<mark>
+当蓝牙遥控器点击拍照后,后端消息响应如下:
+* data中参数释义:
+    * type:handler_take_picture 为后端单拍任务得类型
+    * data :忽略
+* msg_type:当该字段为handler_take_picture时,前端可直接解析得到data数据包,将数据直接发送给socket服务端即可【执行单任务】
+#### 消息示例
+```python
+{
+    "code": 0,
+    "msg": "处理单拍消息",
+    "status": -1,
+    "data": {
+        "type": "handler_take_picture",
+        "data": null
+    },
+    "msg_type": "handler_take_picture"
+}
+```
+<mark>注:在多次按下拍照按钮时,前端需要在命令发送给后端时且拍照未完成之前处理拦截操作,否则会出现拍照任务在不断执行<mark>
+
+### 单拍任务命令
+#### 发送-消息示例
+```python
+{
+        "type": "handler_take_picture",
+        "data": null
+}
+```
+#### 响应-消息示例
+<mark>注意:当前响应可能会出现失败得情况,如:用户清空了所有货号数据;用户未打开拍照软件等其他错误消息响应;前端需要判断code是否为0;去释放拦截<mark>
+* data中参数释义:
+    * msg: 消息文本内容
+    * data :
+        * goods_art_no:货号,便于前端查询详情数据
+* msg_type:当该字段为photo_take时,代表照片已拍摄完成
+```python
+{
+    "code": 0,
+    "msg": "执行左脚程序 执行完成~",
+    "status": 2,
+    "data": {"goods_art_no": "执行货号"},
+    "msg_type": "photo_take"
+}
+```
+##### 未完待续.....

+ 1 - 0
python/mcu/DeviceControl.py

@@ -1208,6 +1208,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                     self.sendSocketMessage(
                         code=0,
                         msg="{} 执行完成~".format(program_item.action_name),
+                        data={"goods_art_no": goods_art_no},
                         device_status=2,
                     )
                 self.msg_type = "mcu"

+ 32 - 8
python/mcu/RemoteControlV2.py

@@ -30,6 +30,8 @@ class RemoteControlV2(BaseClass):
         self.connect_state = False
         self.is_running = False
         self.goods_art_no = None
+        # 0 闲置;1进行中;2已完成;
+        self.photo_take_state = 0
 
     def to_connect_com(self, port_name, is_test=False):
         if self.connect_state:
@@ -213,6 +215,7 @@ class RemoteControlV2(BaseClass):
             )
             self.msg_type = "blue_tooth"
             return
+        self.photo_take_state = 1
         input_data = {
             "data": {
                 "action": control_program,
@@ -229,12 +232,16 @@ class RemoteControlV2(BaseClass):
         )
         self.goods_art_no = None
         self.msg_type = "blue_tooth"
+        self.photo_take_state = 2
 
-    def handlerTakePhoto(self):
+    async def handlerTakePhoto(self):
         """处理单独拍照"""
+        await asyncio.sleep(0.1)
+        print("开始单拍0")
         session = SqlQuery()
         crud = CRUD(PhotoRecord)
         record = crud.read(session=session, order_by="id", ascending=False)
+        print("开始单拍0-读取数据库")
         if record == None:
             # 发送失败消息
             self.sendSocketMessage(
@@ -244,10 +251,13 @@ class RemoteControlV2(BaseClass):
                 device_status=2,
             )
         else:
+            print("开始单拍1")
+            self.photo_take_state = 1
             image_index = record.image_index + 1
             insert_photo_records(
                 record.image_deal_mode, record.goods_art_no, image_index
             )
+            print("开始单拍1-插入数据")
             capture_one = DigiCam()
             try:
                 captrure_folder_path = capture_one.getCaptureFolderPath()
@@ -255,12 +265,13 @@ class RemoteControlV2(BaseClass):
                 watch_dog.goods_art_no = record.goods_art_no
                 watch_dog.image_index = image_index
                 watch_dog.start_observer(captrure_folder_path)
+                print("开始单拍1-检查相机")
                 camera_is_connect = capture_one.checkCameraConnect()
                 if camera_is_connect is not True:
                     self.sendSocketMessage(1, "相机未连接,请检查", device_status=-1)
                     return
-                capture_one.getCaptureFolderPath()
                 capture_one.run_capture_action("Capture")
+                print("开始单拍1-完成拍照")
                 time.sleep(1)
                 self.msg_type = "photo_take"
                 self.sendSocketMessage(
@@ -270,24 +281,26 @@ class RemoteControlV2(BaseClass):
                         if record.image_deal_mode == 1
                         else "执行左脚程序"
                     ),
+                    data={"goods_art_no": record.goods_art_no},
                     device_status=2,
                 )
                 self.msg_type = "blue_tooth"
             except Exception as e:
-                print("错误信息:",e)
                 self.sendSocketMessage(1, "digicam未初始化,请检查", device_status=-1)
+        self.photo_take_state = 0
 
-    def analysis_received_data(self):
+    async def analysis_received_data(self):
         if not self.connect_state:
             return
-
+        await asyncio.sleep(0.01)
         if self.bluetooth_address:
             receive_data = self.bluetooth_ins.read_cmd_one(
                 address=self.bluetooth_address
             )
-            # print("received data", receive_data)
+            # print("received data", 1)
         else:
             receive_data = self.serial_ins.read_cmd(out_time=1, check=None)
+        # print("received data", 2)
         # print("self.bluetooth_ins", receive_data)
         if receive_data is False:
             self.connect_state = False
@@ -295,6 +308,9 @@ class RemoteControlV2(BaseClass):
 
         if not receive_data:
             return
+        if self.photo_take_state != 0:
+            print("正在拍照", self.photo_take_state)
+            return
         receive_data_parser = receive_data[0]
         # 数据 结构 command,按命令解析
         if receive_data_parser == 1:
@@ -316,11 +332,19 @@ class RemoteControlV2(BaseClass):
             print(message)
             if button_value in [1, 2]:
                 # 扫描货号
+                if self.photo_take_state != 0:
+                    self.sendSocketMessage(1, "前置拍照未完成,请稍后", device_status=-1)
+                    return
                 print("收到货号信息", self.goods_art_no)
                 self.handlerAction(button_value)
+                self.photo_take_state = 0
             if button_value in [3]:
                 # 处理遥控器单拍
-                self.handlerTakePhoto()
+                self.msg_type = "handler_take_picture"
+                # 0 闲置;1进行中;2已完成;
+                _data = {"type": self.msg_type,"data":None}
+                self.sendSocketMessage(0, "处理单拍消息", data=_data, device_status=-1)
+                self.msg_type = "blue_tooth"
             self.sendSocketMessage(code=0, msg="", data=message, device_status=2)
             if settings.IS_DEBUG:
                 print("收到按键", button_value)
@@ -452,7 +476,7 @@ class RemoteControlV2(BaseClass):
                     code=1, msg="遥控设备V2 未连接", data=message, device_status=-1
                 )
                 break
-            self.analysis_received_data()
+            await self.analysis_received_data()
 
         self.is_running = False
         if not self.connect_state:

+ 6 - 0
python/sockets/message_handler.py

@@ -96,6 +96,12 @@ async def handlerSend(
                 device_ctrl.run_mcu_config(action_list, goods_art_no, action_info),
                 name="run_mcu_config",
             )
+        case "handler_take_picture":
+            blue_tooth = BlueToothMode(websocket_manager=manager)
+            loop.create_task(
+                blue_tooth.remote_control_v2.handlerTakePhoto(),
+                name="run_mcu_config",
+            )
         case _:
             data = manager.jsonMessage(code=1, msg="未知消息")
             await manager.send_personal_message(data, websocket)