LineControl.py 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. import time
  2. # from import_qt_mode import *
  3. import asyncio
  4. from .SerialIns import SerialIns
  5. from .BaseClass import BaseClass
  6. from utils.SingletonType import SingletonType
  7. from databases import SqlQuery, PhotoRecord, DeviceConfig, CRUD, insert_photo_records
  8. from .capture.module_digicam import DigiCam
  9. from .capture.module_watch_dog import FileEventHandler
  10. class LineControl(BaseClass, metaclass=SingletonType):
  11. # sign_data = Signal(dict)
  12. def __init__(self, windows=None):
  13. super().__init__()
  14. self.windows = windows
  15. self.serial_ins = None
  16. self.connect_state = False
  17. self.is_running = False
  18. self.msg_type = "line_control"
  19. self.goods_art_no = None
  20. # 0 闲置;1进行中;2已完成;
  21. self.photo_take_state = 0
  22. async def to_connect_com(self, port_name):
  23. self.close_connect()
  24. await asyncio.sleep(0.5)
  25. try:
  26. # 原值为9600
  27. self.serial_ins = SerialIns(port_name=port_name, baud=115200)
  28. if self.serial_ins.serial_handle:
  29. self.connect_state = True
  30. message = {
  31. "_type": "show_info",
  32. "plugins_mode": "remote_control",
  33. "data": {"msg": "有线遥控器 打开串口成功", "port_name": port_name},
  34. }
  35. self.sendSocketMessage(
  36. code=0,
  37. msg="有线遥控器 打开串口成功",
  38. data=message,
  39. device_status=2,
  40. )
  41. # 循环监听消息
  42. await self.run()
  43. return True
  44. else:
  45. message = {
  46. "_type": "show_info",
  47. "plugins_mode": "remote_control",
  48. "data": {"msg": "有线遥控器 打开串口失败"},
  49. }
  50. self.sendSocketMessage(
  51. code=1,
  52. msg="有线遥控器 打开串口失败",
  53. data=message,
  54. device_status=-1,
  55. )
  56. self.serial_ins = None
  57. self.connect_state = False
  58. except:
  59. message = {
  60. "_type": "show_info",
  61. "plugins_mode": "remote_control",
  62. "data": {"msg": "有线遥控器 打开串口失败"},
  63. }
  64. self.sendSocketMessage(
  65. code=1,
  66. msg="有线遥控器 打开串口失败",
  67. data=message,
  68. device_status=-1,
  69. )
  70. self.serial_ins = None
  71. self.connect_state = False
  72. return False
  73. def close_connect(self):
  74. if self.connect_state:
  75. self.serial_ins.close_serial_port()
  76. self.connect_state = False
  77. def __del__(self):
  78. self.close_connect()
  79. def handlerAction(self, button_value):
  80. """处理拍照动作按键[左 右]"""
  81. control_program = "执行左脚程序" if button_value == 1 else "执行右脚程序"
  82. if self.goods_art_no == None or self.goods_art_no == "":
  83. input_data = {
  84. "data": {
  85. "action": control_program,
  86. "goods_art_no": "",
  87. },
  88. "type": "run_mcu",
  89. }
  90. self.msg_type = "blue_tooth_scan"
  91. self.sendSocketMessage(
  92. code=0,
  93. msg=f"准备执行[{control_program}]",
  94. data=input_data,
  95. device_status=2,
  96. )
  97. self.msg_type = "blue_tooth"
  98. return
  99. self.photo_take_state = 1
  100. input_data = {
  101. "data": {
  102. "action": control_program,
  103. "goods_art_no": self.goods_art_no,
  104. },
  105. "type": "run_mcu",
  106. }
  107. self.msg_type = "blue_tooth_scan"
  108. self.sendSocketMessage(
  109. code=0,
  110. msg=f"准备执行[{control_program}]",
  111. data=input_data,
  112. device_status=2,
  113. )
  114. self.goods_art_no = None
  115. self.msg_type = "blue_tooth"
  116. self.photo_take_state = 2
  117. async def handlerTakePhoto(self):
  118. """处理单独拍照"""
  119. await asyncio.sleep(0.1)
  120. print("开始单拍0")
  121. session = SqlQuery()
  122. crud = CRUD(PhotoRecord)
  123. record = crud.read(session=session, order_by="id", ascending=False)
  124. print("开始单拍0-读取数据库")
  125. if record == None:
  126. # 发送失败消息
  127. self.sendSocketMessage(
  128. code=1,
  129. msg="单拍失败,请先输入货号或扫码进行组合拍摄",
  130. data=None,
  131. device_status=2,
  132. )
  133. else:
  134. print("开始单拍1")
  135. if record.image_index == 19:
  136. self.msg_type = "photo_take"
  137. self.sendSocketMessage(
  138. code=1,
  139. msg="单拍失败,单个货号最多允许拍摄20张产品图",
  140. data=None,
  141. device_status=2,
  142. )
  143. self.msg_type = "blue_tooth"
  144. return
  145. deviceConfig = CRUD(DeviceConfig)
  146. deviceConfigData = deviceConfig.read(
  147. session=session, conditions={"id": record.action_id}
  148. )
  149. select_tab_id = deviceConfigData.tab_id
  150. AllTabConfig = deviceConfig.read_all(
  151. session=session, conditions={"tab_id": select_tab_id}
  152. )
  153. action_id = 0
  154. if AllTabConfig[len(AllTabConfig) - 1].take_picture == True:
  155. action_id = AllTabConfig[0].id
  156. else:
  157. action_id = AllTabConfig[len(AllTabConfig) - 1].id
  158. image_index = record.image_index + 1
  159. self.photo_take_state = 1
  160. state, record_id = insert_photo_records(
  161. record.image_deal_mode,
  162. record.goods_art_no,
  163. image_index,
  164. action_id,
  165. )
  166. print("开始单拍1-插入数据")
  167. capture_one = DigiCam()
  168. try:
  169. watch_dog = FileEventHandler()
  170. if watch_dog.observer is None:
  171. captrure_folder_path = capture_one.getCaptureFolderPath()
  172. watch_dog.start_observer(captrure_folder_path)
  173. watch_dog.goods_art_no = record.goods_art_no
  174. watch_dog.image_index = image_index
  175. watch_dog.record_id = record_id
  176. print("开始单拍1-检查相机")
  177. # camera_is_connect = capture_one.checkCameraConnect()
  178. # if camera_is_connect is not True:
  179. # self.sendSocketMessage(1, "相机未连接,请检查", device_status=-1)
  180. # return
  181. capture_one.run_capture_action("Capture")
  182. print("开始单拍1-完成拍照")
  183. await asyncio.sleep(1)
  184. self.msg_type = "photo_take"
  185. self.sendSocketMessage(
  186. code=0,
  187. msg="{} 执行完成~".format(
  188. "执行右脚程序"
  189. if record.image_deal_mode == 1
  190. else "执行左脚程序"
  191. ),
  192. data={"goods_art_no": record.goods_art_no},
  193. device_status=2,
  194. )
  195. self.msg_type = "blue_tooth"
  196. except Exception as e:
  197. self.sendSocketMessage(1, "digicam未初始化,请检查", device_status=-1)
  198. self.photo_take_state = 0
  199. async def analysis_received_data(self):
  200. await asyncio.sleep(0.01)
  201. if not self.connect_state:
  202. return
  203. receive_data = self.serial_ins.read_cmd(out_time=1, check=0x6B)
  204. if receive_data is False:
  205. self.connect_state = False
  206. return False
  207. if not receive_data:
  208. return
  209. else:
  210. print(
  211. "read receive_data {}".format(
  212. self.serial_ins.change_hex_to_int(receive_data)
  213. )
  214. )
  215. pass
  216. # 数据 结构 command,按命令解析
  217. if receive_data[0] == 1:
  218. # 扫码数据
  219. bar_code = receive_data[1:].decode()
  220. bar_code = bar_code.replace("\r", "")
  221. bar_code = bar_code.replace("\n", "")
  222. self.sign_data.emit(
  223. {"_type": 0, "plugins_mode": "remote_control", "data": bar_code}
  224. )
  225. return
  226. if receive_data[0] == 9:
  227. switch_1, switch_2, button_value = receive_data[1:]
  228. data = {
  229. "switch_1": True if switch_1 == 1 else False,
  230. "switch_2": True if switch_2 == 1 else False,
  231. "button_value": button_value,
  232. }
  233. self.sign_data.emit(
  234. {"_type": 9, "plugins_mode": "remote_control", "data": data}
  235. )
  236. return
  237. pass
  238. async def run(self):
  239. # self.show_info.emit("未连接")
  240. # self.data_command_sign.emit(data)
  241. self.is_running = True
  242. while self.is_running:
  243. await asyncio.sleep(0.06)
  244. if not self.connect_state:
  245. self.sign_data.emit(
  246. {
  247. "_type": "show_info",
  248. "plugins_mode": "remote_control",
  249. "data": "遥控设备 未连接",
  250. }
  251. )
  252. break
  253. await self.analysis_received_data()
  254. self.is_running = False
  255. if not self.connect_state:
  256. self.sign_data.emit(
  257. {
  258. "_type": "show_info",
  259. "plugins_mode": "remote_control",
  260. "data": "遥控设备 未连接",
  261. }
  262. )