فهرست منبع

处理拍照过程中得问题
1、先拍照后执行问题
2、消息队列时序问题

rambo 8 ماه پیش
والد
کامیت
5f746ad671
5فایلهای تغییر یافته به همراه100 افزوده شده و 185 حذف شده
  1. 18 19
      python/action.json
  2. 41 21
      python/mcu/DeviceControl.py
  3. 30 141
      python/mcu/ProgramItem.py
  4. 8 3
      python/mcu/capture/capture_basic_mode.py
  5. 3 1
      python/mcu/capture/module_watch_dog.py

+ 18 - 19
python/action.json

@@ -2,40 +2,39 @@
     "type": "left",
     "actions": [
         {
-            "id": 2,
+            "id": 1,
             "mode_type": "执行左脚程序",
             "execution_type": "程序1",
-            "action_name": "侧视图",
-            "action_index": 10,
+            "action_name": "左脚俯拍鞋子",
+            "action_index": 20,
             "picture_index": 99,
-            "camera_height": 0,
-            "camera_angle": 3.0,
-            "number_focus": 0,
+            "camera_height": 100,
+            "camera_angle": 14.0,
+            "number_focus": 2,
             "take_picture": true,
             "turntable_position": 300.0,
-            "turntable_angle": 0.0,
+            "turntable_angle": -32.0,
             "shoe_upturn": false,
             "pre_delay": 0.0,
             "after_delay": 0.0,
             "led_switch": false,
             "is_wait": false,
             "is_need_confirm": false
-        },
-        {
-            "id": 1,
+        },{
+            "id": 2,
             "mode_type": "执行左脚程序",
             "execution_type": "程序1",
-            "action_name": "左脚俯拍鞋子",
-            "action_index": 20,
+            "action_name": "侧视图",
+            "action_index": 10,
             "picture_index": 99,
-            "camera_height": 200,
-            "camera_angle": 14.0,
-            "number_focus": 2,
+            "camera_height": 0,
+            "camera_angle": 3.0,
+            "number_focus": 0,
             "take_picture": true,
             "turntable_position": 300.0,
-            "turntable_angle": -32.0,
+            "turntable_angle": 0.0,
             "shoe_upturn": false,
-            "pre_delay": 1.0,
+            "pre_delay": 0.0,
             "after_delay": 0.0,
             "led_switch": false,
             "is_wait": false,
@@ -75,7 +74,7 @@
             "turntable_position": 100.0,
             "turntable_angle": 0.0,
             "shoe_upturn": true,
-            "pre_delay": 3.0,
+            "pre_delay": 0.0,
             "after_delay": 0.0,
             "led_switch": false,
             "is_wait": false,
@@ -96,7 +95,7 @@
             "turntable_angle": 180.0,
             "shoe_upturn": false,
             "pre_delay": 0.0,
-            "after_delay": 1.0,
+            "after_delay": 0.0,
             "led_switch": false,
             "is_wait": false,
             "is_need_confirm": false

+ 41 - 21
python/mcu/DeviceControl.py

@@ -215,7 +215,15 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             # print("send_data_queue  append  :{}".format(data))
             self.send_data_queue.append(data)
         self.lock.release()
-
+    def send_all_cmd(self):
+        while True:
+            if self.send_data_queue:
+                self.sendSocketMessage(msg="正在发送命令", device_status=1)
+                data = self.send_data_queue.pop(0)
+                self.serial_ins.write_cmd(data)
+                self.sendSocketMessage(msg="命令发送完成", device_status=2)
+            else:
+                break
     def send_cmd(self):
         self.lock.acquire()
         if self.send_data_queue:
@@ -275,7 +283,11 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             self.is_just_init_time = False
 
         return True
-
+    def cleanAllReceiveData(self):
+        while True:
+            receive_data = self.serial_ins.read_cmd(out_time=1)
+            if not receive_data:
+                break
     def get_basic_info_mcu(self):
         receive_data = self.serial_ins.read_cmd(out_time=1)
         if receive_data is False:
@@ -725,6 +737,15 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             self.sendSocketMessage(
                 msg="MCU连接成功", data=message_data, device_status=2
             )
+            time.sleep(2)
+            loop = asyncio.get_event_loop()
+            loop.create_task(self.initDevice(), name="init_mcu")
+            async def getBaseInfo():
+                while True:
+                    await asyncio.sleep(1)
+                    # 异步循环获取设备信息
+                    self.to_get_mcu_base_info()
+            asyncio.gather(getBaseInfo())
         else:
             print("串口无法识别")
             # 走其他途径处理
@@ -902,7 +923,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         """
         此处输入单位为 毫米,以及度  需要先缩小,再放大
         """
-
+        print("移动",time.time())
         speed = settings.moveSpeed()
 
         cmd = 1
@@ -1099,19 +1120,20 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
     async def run_mcu_config(self,config_list,goods_art_no):
         if config_list:
             total_len = len(config_list)
+            self.action_state = 1
             for index, action in enumerate(config_list):
                 await asyncio.sleep(0.1)
-                # # config_data = config_list[-1]
                 program_item = ProgramItem(
                     websocket_manager=self.websocket_manager,
                     action_data=action,
                     mcu=self,
                     goods_art_no=goods_art_no,
                 )
-                # if self.action_state != 1:
-                #     # 异常终止
-                #     print("action异常终止")
-                #     break
+                print("self.action_state===>", self.action_state)
+                if self.action_state != 1:
+                    # 异常终止
+                    print("action异常终止")
+                    break
                 if not program_item.run(total_len):
                     self.sendSocketMessage(
                         code=1,
@@ -1129,22 +1151,20 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                     )
 
                 # 在第三张图时检查是否有对应图片生成
-                if index == 3:
-                    # if not self.image_process_data.check_photo_is_get():
-                    # self.lineEdit.setText("")
-                    self.sendSocketMessage(
-                            code=1,
-                            msg="未获取到图片数据",
-                            device_status=0,
-                        )
-                    self.action_state = 2
-                    return
+                # if index == 3:
+                #     # if not self.image_process_data.check_photo_is_get():
+                #     self.sendSocketMessage(
+                #             code=1,
+                #             msg="未获取到图片数据",
+                #             device_status=0,
+                #         )
+                #     self.action_state = 2
+                #     return
                 if index == total_len - 1:
                     #  最后一个初始化处理
                     pass
-                    # if action.mode_type != "其他配置":
-                    #     self.lineEdit.setText("")
-                self.action_state = 2
+                # self.action_state = 2
+            self.action_state = 2
 
 
 async def checkMcuConnection(device_ctrl: DeviceControl):

+ 30 - 141
python/mcu/ProgramItem.py

@@ -60,13 +60,12 @@ class ProgramItem(BaseClass):
         #     self.show()
 
     def set_other(self):
-        pass
-        # if self.mode_type == "其他配置":
-        #     self.turntable_position = None
-        #     self.turntable_angle = None
-        #     self.delay_time = 0
-        #     self.after_delay_time = 0
-        #     self.is_led = False
+        if self.mode_type == "其他配置":
+            self.turntable_position = None
+            self.turntable_angle = None
+            self.delay_time = 0
+            self.after_delay_time = 0
+            self.is_led = False
 
     def get_value(self, data, key, default=None):
         if key not in data:
@@ -88,25 +87,12 @@ class ProgramItem(BaseClass):
         if self.is_wait:
             msg = "{}--等待".format(self.action_name)
             self.sendSocketMessage(msg=msg,device_status=0)
-            # self.ui_action_name.setText("{}--等待".format(self.action_name))
         else:
             msg = "{}".format(self.action_name)
             self.sendSocketMessage(msg=msg, device_status=2)
-            # self.ui_action_name.setText("{}".format(self.action_name))
-
-        # self.next_step.hide()
         tips_text = "程序:{},对焦:{}".format(1, 1)
-        # msg = "{}".format(self.action_name)
         self.sendSocketMessage(msg=tips_text, device_status=2)
-        # self.ui_action_name.setToolTip(tips_text)
-        # self.setStyleSheet("background-color: rgb(255, 235, 12);")
-        # 执行单步命令
-        # self.ui_retry.mousePressEvent = self.do_retry
-        # self.next_step.mousePressEvent = self.next_step_clicked
         self.set_state(state_value=0)
-        # if settings.IS_TEST:
-        #     self.ui_retry.setText("单步")
-        #     self.ui_retry.setEnabled(True)
 
     # def next_step_clicked(self, *args, **kwargs):
     #     self.windows.event.set()
@@ -135,17 +121,17 @@ class ProgramItem(BaseClass):
     def check_mcu_move_is_stop(self, re_check=False):
         self.error_info_text = ""
         # 发送基础数据信息
-        self.mcu.to_get_mcu_base_info()
+        # self.mcu.to_get_mcu_base_info()
         _s = time.time()
         last_num_1 = self.mcu.last_mcu_info_data["num"]
+        self.mcu.cleanAllReceiveData()
         while 1:
-            # if settings.IS_TEST:
-            #     time.sleep(2)
-            #     return True
             if self.mcu.action_state != 1:
                 # 外部终止,停止运行
                 return False
-            if time.time() - _s > 8:
+            cr_time = time.time()
+            print(cr_time - _s, cr_time,_s)
+            if cr_time - _s > 8:
                 self.error_info_text = "MCU检测运动未停止,自动退出"
                 self.set_state(state_value=99)  # 标记异常
                 print("MCU检测运动未停止,自动退出")
@@ -154,24 +140,16 @@ class ProgramItem(BaseClass):
                 # return True
             # 存在时间间隙,导致误认为所有设备已完成运动
             if self.mcu.mcu_move_state == 2:
-                # print("last_mcu_info_data  1", self.mcu.last_mcu_info_data["time"] - _s)
-                if last_num_1 < self.mcu.last_mcu_info_data["num"]:
-                    # print("self.mcu.mcu_move_state", self.mcu.mcu_move_state)
-                    # print("运动时间:{}".format(time.time() - s))
-                    if re_check:
-                        last_num_2 = self.mcu.last_mcu_info_data["num"]
-                        self.mcu.to_get_mcu_base_info()
-                        time.sleep(0.5)
-                        # print("last_mcu_info_data  2", self.mcu.last_mcu_info_data["time"])
-                        # print("last_mcu_info_data  3", _t_2)
-                        if last_num_2 < self.mcu.last_mcu_info_data["num"]:
-                            if self.mcu.mcu_move_state == 2:
-                                return True
-                    else:
-                        return True
+                return True
+            else:
+                self.mcu.to_get_mcu_base_info()
+                self.mcu.send_all_cmd()
+                time.sleep(0.5)
+                self.mcu.get_basic_info_mcu()
+                # return True
 
             time.sleep(0.1)
-            self.mcu.to_get_mcu_base_info()
+            # self.mcu.to_get_mcu_base_info()
 
     def run(self, total_len=5, *args):
         if total_len == 1:
@@ -229,51 +207,30 @@ class ProgramItem(BaseClass):
         start_time = time.time()
         # ============连接MCU 处理步进电机与舵机等
         if settings.IS_MCU:
-            if settings.IS_LIN_SHI_TEST:
-                self.mcu.to_deal_device(
-                    device_name="split", value=self.image_index
-                )
-                time.sleep(0.1)
-
-            # if self.mcu.action_state != 1:
-            #     # 外部终止,停止运行
-            #     print("外部终止,停止运行")
-            #     return
-
-            # if self.mode_type != "其他配置":
+            if self.mode_type != "其他配置" and self.check_mcu_move_is_stop() is False:
                 # MCU运动是否有停止检查,设定超时时间
-                # if self.check_mcu_move_is_stop() is False:
-                #     return
-
-            # print("{} 检查停止时间1:{}".format(self.action_name, time.time() - start_time))
+                return
+            print("{} 检查停止时间1:{}".format(self.action_name, time.time() - start_time))
             if self.is_led:
                 self.mcu.to_deal_device(device_name="laser_position", value=1)
             else:
                 self.mcu.to_deal_device(device_name="laser_position", value=0)
 
             if self.shoe_overturn:
-                # if self.mcu.action_state != 1:
-                #     return
                 self.mcu.to_deal_device(device_name="overturn_steering")
                 # time.sleep(0.1)
             if self.camera_height is not None:
-                # if self.mcu.action_state != 1:
-                #     return
                 self.mcu.to_device_move(
                     device_name="camera_high_motor", value=self.camera_height
                 )
                 # time.sleep(0.1)
             if self.camera_angle is not None:
-                # if self.mcu.action_state != 1:
-                #     return
                 self.mcu.to_device_move(
                     device_name="camera_steering", value=self.camera_angle
                 )
                 # time.sleep(0.1)
 
             if self.turntable_position is not None:
-                # if self.mcu.action_state != 1:
-                #     return
                 self.mcu.to_device_move(
                     device_name="turntable_position_motor",
                     value=self.turntable_position,
@@ -281,103 +238,35 @@ class ProgramItem(BaseClass):
                 # time.sleep(0.1)
 
             if self.turntable_angle is not None:
-                # if self.mcu.action_state != 1:
-                #     return
                 self.mcu.to_device_move(
                     device_name="turntable_steering", value=self.turntable_angle
                 )
                 # time.sleep(0.1)
 
             # MCU运动是否有停止检查,设定超时时间
-            # if self.mcu.action_state != 1:
-            #     return
+            self.mcu.send_all_cmd()
             if self.mode_type != "其他配置":
                 time.sleep(1.2)
-                # if self.check_mcu_move_is_stop(re_check=True) is False:
-                #     print("MCU检测运动未停止,自动退出,   提前退出")
-                #     return
-                # print("{} 检查停止时间2:{}".format(self.action_name, time.time() - start_time))
+                print("二次检查")
+                if self.check_mcu_move_is_stop(re_check=True) is False:
+                    print("MCU检测运动未停止,自动退出,   提前退出")
+                    return
 
         if self.delay_time:
             # print("拍照前延时:{}".format(self.delay_time))
             time.sleep(self.delay_time)
-        # print("{} 检查停止时间3:{}".format(self.action_name, time.time() - start_time))
-        # if settings.CaptureSoftwareName == "capture_one":
-        #     if self.af_times > 0:
-        #         if self.mcu.action_state != 1:
-        #             return
-        #         for i in range(int(self.af_times)):
-        #             try:
-        #                 self.windows.capture_one.auto_focus()
-        #             except:
-        #                 pass
-
-        # if self.mcu.action_state != 1:
-        #     return
-        # print("{} 检查停止时间4:{}".format(self.action_name, time.time() - start_time))
-        # if self.is_wait:
-        #     self.windows.playsound.tips_type = "wait"
-        #     self.windows.playsound.start()
-        #     self.next_step.show()
-        #     self.wait_state = 1
-        #     self.windows.event.clear()
-        #     self.windows.event.wait()
-        #     self.windows.event.clear()
-        #     self.wait_state = 2
-        # if self.mcu.action_state != 1:
-        #     print("==={},中途退出".format(self.action_name))
-        #     return
-        #     self.next_step.hide()
-
-        # print("self.is_photograph", self.is_photograph)
 
         if self.is_photograph:
+            print("拍照==>", time.time())
             # print("photograph==================")
             self.mcu.to_deal_device(device_name="buzzer", times=1)
             # 用于临时拍照计数
-            # self.windows.add_goods_images_count(self.goods_art_no)
-
-            if self.af_times > 0:
-                self.capture_one.photograph(is_af=True)
-            else:
-                self.capture_one.photograph(is_af=False)
-
+            is_af = True if self.af_times > 0 else False
+            self.capture_one.photograph(is_af=is_af)
             self.last_photograph_time = time.time()  # 记录最近一次拍照时间
-
-            # 拍照后,进行等待确认
-            # if settings.RUNNING_MODE == "待用户确认模式":
-            #     _f = False
-            #     if settings.RUNNING_MODE_DETAIL == "所有节点待确认":
-            #         _f = True
-            #     else:
-            #         if self.is_need_confirm:
-            #             _f = True
-            #         else:
-            #             _f = False
-
-            #     if _f:
-            #         # time.sleep(1.2)
-            #         # self.windows.playsound.tips_type = 'wait'
-            #         # self.windows.playsound.start()
-            #         # self.next_step.show()
-            #         self.wait_state = 1
-            #         # self.windows.event.clear()
-            #         # self.windows.event.wait()
-            #         # self.windows.event.clear()
-            #         self.wait_state = 2
-            #         if self.mcu.action_state != 1:
-            #             print("==={},中途退出".format(self.action_name))
-            #             return
-            # self.next_step.hide()
-
         # print("{} 拍照时间:{}".format(self.action_name, time.time() - start_time))
         print("{}-{}已完成".format(self.action_type, self.action_name))
 
-        # print("{} 检查停止时间5:{}".format(self.action_name, time.time() - start_time))
-        # if settings.RUNNING_MODE == "普通模式":
-        #     if self.after_delay_time:
-        #         print("拍照后延时:{}".format(self.after_delay_time))
-        #         time.sleep(self.after_delay_time)
         if True:
             if self.after_delay_time:
                 print("拍照后延时:{}".format(self.after_delay_time))

+ 8 - 3
python/mcu/capture/capture_basic_mode.py

@@ -38,12 +38,15 @@ class CaptureBasic():
 
     def getCaptureFolderPath(self) -> Image:
         """获取预览图"""
-        response = httpGetHandler(
+        try:
+            response = httpGetHandler(
             url=self.base_host,
             params={"slc": "get", "param1": "session.folder"},
             headers={},
-        )
-        return response.text
+            )
+            return response.text
+        except:
+          return None
 
     def run_capture_action(self,command):
         '''执行capture动作'''
@@ -181,5 +184,7 @@ class CaptureBasic():
         # self.keyboard.release(Key.ctrl)
 if __name__ == "__main__":
     cap = CaptureBasic()
+    # cap.auto_focus()
     cap.auto_focus()
+    cap.run_capture_action("Capture")
     print("cccc")

+ 3 - 1
python/mcu/capture/module_watch_dog.py

@@ -27,6 +27,8 @@ class FileEventHandler(FileSystemEventHandler, metaclass=SingletonType):
         self.last_create_time = datetime.datetime.now()
 
     def start_observer(self,path):
+        if self.observer != None:
+            return
         print("图片保存目录:", path)
         if path == None or path == "":
             return
@@ -45,7 +47,7 @@ class FileEventHandler(FileSystemEventHandler, metaclass=SingletonType):
         逻辑:
         1、检查当前路径如包含Originals 则定位到对应Originals的父级目录
         2、如没有Originals,则认定为一个普通目录(且子文件夹没有Originals),否则定位到父级目录
-        3、根据父级目录,获取当天应该创建的拍摄子目录,如没有则自动创建并定位
+        
         """
         if not os.path.exists(watch_path):
             return None