DeviceControl.py 80 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981
  1. import asyncio
  2. import datetime
  3. from cv2 import log
  4. import serial.tools.list_ports
  5. import time, json
  6. from .SerialIns import SerialIns
  7. from utils.SingletonType import SingletonType
  8. from utils.utils_func import dynamic_parameter_issuance_get
  9. from .BaseClass import BaseClass
  10. from sockets import ConnectionManager
  11. from collections import defaultdict
  12. import threading
  13. import settings
  14. from .ProgramItem import ProgramItem
  15. from .capture.module_digicam import DigiCam
  16. from databases import insert_photo_records
  17. from .McuDeviationSet import McuDeviationSet
  18. from .OtherSet import OtherSet
  19. from .DebugUart import DebugUart
  20. from .LineControl import LineControl
  21. import copy
  22. import logging
  23. from mcu.capture.smart_shooter_class import SmartShooter
  24. import logging
  25. from conifg_info import ConfigManager
  26. logger = logging.getLogger(__name__)
  27. # mcu命令
  28. class DeviceControl(BaseClass, metaclass=SingletonType):
  29. lock = threading.Lock()
  30. def __init__(
  31. self, websocket_manager: ConnectionManager, smart_shooter: SmartShooter = None
  32. ):
  33. super().__init__(
  34. websocket_manager=websocket_manager, smart_shooter=smart_shooter
  35. )
  36. self.config_manager = None
  37. self.msg_type = "mcu"
  38. self.mcu_deviation_set = McuDeviationSet(self)
  39. self.mcu_other_set = OtherSet(self)
  40. self.debug_uart = DebugUart(self)
  41. self.line_control = LineControl(websocket_manager)
  42. self.m_t = 1
  43. # 0未开始 1进行中 2已结束 99异常
  44. self.action_state = 2
  45. self._mcu_move_state = 0
  46. self.state_camera_motor = 3
  47. self.state_camera_steering = 3
  48. self.state_turntable_steering = 3
  49. self.state_overturn_steering = 3
  50. self.seed = 0
  51. self.last_camera_height = 0
  52. # 是否实时获取mcu状态信息
  53. self.is_get_mcu_state = True
  54. self.state_move_turntable_steering = 3
  55. self.last_from_mcu_move_respond_data = None
  56. self.camera_motor_speed = 0
  57. self.camera_motor_value = 0
  58. self.init_state = False
  59. self.port_name = ""
  60. self.mcu_exit = False
  61. self.t_n = 0
  62. self.serial_ins = None
  63. self.connected_ports_dict = {} # 已连接的ports
  64. self.p_list = []
  65. self.temp_ports_dict = {}
  66. self.is_running = False
  67. self.is_runn_action = False
  68. self.is_stop_action = False
  69. self.connect_state = False
  70. self.is_init_while = False
  71. self.device_name_dict = {
  72. "camera_steering": 0,
  73. "camera_high_motor": 1,
  74. "turntable_steering": 2,
  75. "overturn_steering": 3,
  76. "laser_position": 4,
  77. "buzzer": 5,
  78. "split": 6,
  79. "turntable_position_motor": 7,
  80. "mp3_player": 8,
  81. "mcu": 99,
  82. }
  83. self.last_move_time = time.time()
  84. self.device_name_dict_mapping = {
  85. 0:"相机角度",
  86. 1:"相机高度",
  87. 2:"转盘角度",
  88. 3:"翻板角度",
  89. 4:"激光灯位置",
  90. 5:"蜂鸣器",
  91. 6:"split",
  92. 7:"转盘位置",
  93. 8:"播放音频",
  94. 99:"mcu命令",
  95. }
  96. # 最近的mcu基础信息,用于获取数据状态检查
  97. self.last_mcu_info_data = {
  98. "num": 0,
  99. "time": time.time(),
  100. "data": None,
  101. }
  102. # 最近的mcu的其他配置
  103. self.last_mcu_other_info_data = {
  104. "num": 0,
  105. "time": time.time(),
  106. "data": {},
  107. }
  108. self.command = {
  109. "to_device_move": 1, # 设备运动
  110. "to_init_device": 2, # 初始化设备
  111. "to_deal_other_device": 3, # 处理其他设备
  112. "get_all_info": 29, # 获取所有信息
  113. "set_deviation": 40, # 设置偏移量
  114. "get_deviation": 41, # 读取偏移量
  115. "signal_forwarding": 91, # 信号转发处理
  116. "signal_forwarding_return": 92, # 信号转发返回
  117. "get_other_info": 44, # 获取其他信息
  118. "open_rgb_led": 43, ## RGB灯的处理与通讯
  119. "set_other_info": 45, # 设置其他信息
  120. "query_remote_control_battery": 47, # 查询遥控器电量
  121. "set_turntable_mode": 48, # 设置转盘通讯方式 1、串口、2、无线、3 混合
  122. "stop_mcu": 93, # 停止运行mcu
  123. }
  124. # self.window = window
  125. self.last_push_time = defaultdict(float)
  126. self.is_running = False
  127. self.is_wait_connect = False # 等待链接
  128. self.send_data_queue = [] # 发送队列
  129. # self.lock = Lock()
  130. # 是否是刚进行完初始化;首次初始化,需要运动到指定第一个指定位置
  131. self.is_just_init_time = False
  132. # self.init()
  133. # ===========注册命令函数============
  134. self.deal_code_func_dict = {
  135. 29: self.get_from_mcu_base_info, # 获取基本情况
  136. 32: self.get_from_mcu_button, # 获取按键信息
  137. 42: self.get_from_mcu_deviation_info, # 获取偏移量信息
  138. 44: self.get_from_mcu_other_info, # 获取其他配置参数
  139. 90: self.get_from_mcu_connect_info, # 获取链接电脑信号
  140. 92: self.get_from_mcu_move_respond_data, # 获取MCU响应
  141. 100: self.print_mcu_error_data, # 打印下位机的错误内容
  142. 255: self.print_mcu_noraml_data, # 打印回执
  143. 124: self.read_register_data_by_usb, # 读取某个寄存器数据
  144. 125: self.write_register_data_by_usb, # 写入某个寄存器数据
  145. 126: self.get_all_registers_list_by_usb, # 获取所有寄存器
  146. 150: self.dynamic_parameter_issuance, # 动态参数下发
  147. }
  148. def get_device_info(self):
  149. if not self.init_state:
  150. self.sendSocketMessage(code=1, msg="mcu设备未初始化", device_status=4)
  151. return False
  152. cmd = [124]
  153. cmd.extend([0xff & 106 >> 8, 0xff & 106])
  154. print("get_device_info cmd",cmd)
  155. data = self.get_basic_info_mcu_without_async(data=cmd)
  156. print("get_device_info====>",data)
  157. if not data:
  158. return False
  159. return_data = self.analysis_data(data[1:])
  160. if return_data:
  161. print("get_device_info====>",return_data)
  162. else:
  163. print("get_device_info====>","数据不存在")
  164. # 获取异步数据
  165. def analysis_data(self, _data):
  166. _addr = _data[0] << 8 | _data[1]
  167. if _addr not in self.config_manager.CONFIG_METADATA_BY_ADDR:
  168. return False
  169. start = 2
  170. _value = _data[start] << 40 | _data[start + 1] << 32 | _data[start + 2] << 24 | _data[start + 3] << 16 | _data[start + 4] << 8 | _data[start + 5]
  171. start = start + 5
  172. _read_only = True if _data[start + 1] == 1 else False # 是否只读
  173. _dir = 1 if _data[start + 2] == 1 else -1
  174. _type = "int" if _data[start + 3] == 1 else "float"
  175. _precision = _data[start + 4]
  176. if _dir < 0:
  177. _value = _value * _dir
  178. if _type == "float":
  179. if _precision > 0:
  180. _round_x = _precision
  181. _precision = _precision * -1
  182. _value = _value * 10 ** _precision
  183. _value = round(_value, _round_x)
  184. else:
  185. _value = int(_value)
  186. return_data = {"addr": _addr,
  187. "key_name": self.config_manager.CONFIG_METADATA_BY_ADDR[_addr],
  188. "readonly": _read_only,
  189. "value": _value}
  190. return return_data
  191. # 跳过异步,直接查询某个数据信息
  192. def get_basic_info_mcu_without_async(self, data,fiddler_cmd=0):
  193. """
  194. fiddler_cmd :只接收指定的命令内容
  195. """
  196. try:
  197. # 清空接收数据
  198. self.serial_ins.clearn_flush()
  199. self.serial_ins.write_cmd(data)
  200. time.sleep(0.06)
  201. r_data = self.get_basic_info_mcu()
  202. print("264----------r_data:", r_data)
  203. except BaseException as e:
  204. print("302---e",e)
  205. r_data = []
  206. #
  207. # self.async_lock.release()
  208. return r_data
  209. def dynamic_parameter_issuance(self, receive_data):
  210. print("dynamic_parameter_issuance receive_data", receive_data)
  211. func_code, status_code, out_par_data_list = dynamic_parameter_issuance_get(
  212. receive_data
  213. )
  214. r_data = {
  215. "func_code": func_code,
  216. "status_code": status_code,
  217. "out_par_data_list": out_par_data_list,
  218. }
  219. print(r_data)
  220. return r_data
  221. # 读取某个寄存器数据
  222. def read_register_data_by_usb(self, receive_data):
  223. return receive_data
  224. # 写入某个寄存器数据
  225. def write_register_data_by_usb(self, receive_data):
  226. return receive_data
  227. # 获取所有寄存器
  228. def get_all_registers_list_by_usb(self, receive_data):
  229. byte_list = receive_data[1:]
  230. _r_data = []
  231. for i in range(0, len(byte_list), 2):
  232. if i + 1 < len(byte_list):
  233. first_byte = byte_list[i]
  234. second_byte = byte_list[i + 1]
  235. _addr = first_byte << 8 | second_byte
  236. _r_data.append(_addr)
  237. return _r_data
  238. async def sendCommand(self, command):
  239. await asyncio.sleep(0.01)
  240. loop = asyncio.get_event_loop()
  241. loop.create_task(self.debug_uart.set(command), name="sendCommand2")
  242. async def getMcuOtherInfo(self):
  243. await asyncio.sleep(0.01)
  244. self.get_other_info()
  245. async def setMcuOtherInfo(self, data):
  246. await asyncio.sleep(0.01)
  247. for k, v in data.items():
  248. print("k:{},v:{}".format(k, v))
  249. logger.info("k:{},v:{}".format(k, v))
  250. data[k] = self.setOtherMaxMinValue(k, v)
  251. self.set_to_mcu_other_info(data)
  252. self.msg_type = "set_other_mcu_info"
  253. self.sendSocketMessage(
  254. code=0,
  255. msg="设置mcu其他配置信息完成",
  256. device_status=2,
  257. )
  258. self.msg_type = "mcu"
  259. def setOtherMaxMinValue(self, item, value):
  260. value = int(value)
  261. parameter_limits = {
  262. "is_auto_send_base_info": (0, 10000),
  263. "is_move_retry": (0, 10000),
  264. "is_data_response": (0, 10000),
  265. "low_speed": (0, 10000), # 假设低速范围是0到1000
  266. "is_test": (0, 10000),
  267. "to_init_mode": (0, 10000),
  268. "turntable_move_to_init_mode": (0, 10000), # 假设转盘通讯方式范围是0到3
  269. "led_count": (0, 10000), # 假设LED数量范围是0到10
  270. "turntable_steering_angle_ratio": (0, 10000), # 假设角度比例范围是0到100
  271. "is_manual_check": (0, 10000),
  272. "camera_steering_angle_ratio": (0, 100000), # 假设角度比例范围是0到100
  273. "is_auto_motor_to_disable": (0, 10000),
  274. "diff_dir": (0, 10000),
  275. "is_auto_send_pos_info": (0, 10000),
  276. "is_dog": (0, 10000),
  277. "has_been_set_motor_config": (0, 10000),
  278. }
  279. # 获取参数的最小值和最大值
  280. min_value, max_value = parameter_limits.get(item, (0, 10000))
  281. value = max(min_value, min(max_value, value))
  282. return value
  283. async def initDevice(self, is_force=False):
  284. if not self.is_running:
  285. self.sendSocketMessage(
  286. code=1, msg="mcu设备未连接,请先连接设备", device_status=0
  287. )
  288. return False
  289. if self.init_state == True:
  290. print("已经初始化过,请勿重复初始化")
  291. logger.info("已经初始化过,请勿重复初始化")
  292. self.sendSocketMessage(msg="设备初始化完成", device_status=2)
  293. return False
  294. self.config_manager = ConfigManager()
  295. self.serial_ins.clearn_flush()
  296. self.to_init_device_origin_point(device_name="mcu", is_force=is_force)
  297. print("MCU 开始循环~")
  298. logger.info("MCU 开始循环~")
  299. while 1:
  300. await asyncio.sleep(0.05)
  301. if not self.serial_ins or not self.connect_state:
  302. break
  303. try:
  304. self.send_cmd()
  305. if not self.get_basic_info_mcu():
  306. pass
  307. except BaseException as e:
  308. print("121231298908", e)
  309. logger.info(f"121231298908{e}")
  310. break
  311. self.is_running = False
  312. self.connect_state = False
  313. print("MCU 循环退出~")
  314. logger.info("MCU 循环退出~")
  315. print("串口未连接,请检查")
  316. logger.info("串口未连接,请检查")
  317. self.sendSocketMessage(code=1, msg="MCU串口未连接,请检查", device_status=-1)
  318. message = {"_type": "show_info", "plugins_mode": "mcu", "data": "MCU 连接失败"}
  319. self.sendSocketMessage(
  320. code=1, msg="MCU 连接失败", data=message, device_status=-1
  321. )
  322. self.close_connect()
  323. async def initControlLine(self, serial_handle):
  324. """实例化有线控制设备"""
  325. self.line_control.connect_state = True
  326. self.line_control.serial_ins = serial_handle
  327. await self.line_control.run()
  328. # if self.init_state == True:
  329. # print("已经初始化过,请勿重复初始化")
  330. # self.sendSocketMessage(msg="设备初始化完成", device_status=2)
  331. # return False
  332. # self.serial_ins.clearn_flush()
  333. # self.to_init_device_origin_point(device_name="mcu", is_force=is_force)
  334. # print("MCU 开始循环~")
  335. # while 1:
  336. # await asyncio.sleep(0.01)
  337. # if not self.serial_ins or not self.connect_state:
  338. # break
  339. # try:
  340. # # print("mcu send_cmd")
  341. # self.send_cmd()
  342. # # time.sleep(0.01)
  343. # self.get_basic_info_mcu()
  344. # # self.close_other_window()
  345. # except BaseException as e:
  346. # print("121231298908", e)
  347. # break
  348. # self.is_running = False
  349. # self.connect_state = False
  350. # print("MCU 循环退出~")
  351. # # self.sign_data.emit(
  352. # # {"_type": "show_info", "plugins_mode": "mcu", "data": "MCU 连接失败"}
  353. # # )
  354. # message = {"_type": "show_info", "plugins_mode": "mcu", "data": "MCU 连接失败"}
  355. # self.sendSocketMessage(
  356. # code=1, msg="MCU 连接失败", data=message, device_status=-1
  357. # )
  358. # self.close_connect()
  359. def stop_mcu(self):
  360. buf = [self.command["stop_mcu"]]
  361. buf.extend(self.encapsulation_data(data=1, len_data=1))
  362. self.add_send_data_queue(buf)
  363. # 设置转盘通讯方式 1、串口、2、无线、3 混合
  364. def to_set_turntable_mode(self, mode=1):
  365. buf = [self.command["set_turntable_mode"]]
  366. buf.extend(self.encapsulation_data(data=mode, len_data=1))
  367. self.add_send_data_queue(buf)
  368. def query_remote_control_battery(self):
  369. """查询遥控器电量"""
  370. buf = [self.command["query_remote_control_battery"]]
  371. buf.extend(self.encapsulation_data(data=1, len_data=1))
  372. buf.extend(self.encapsulation_data(data=1, len_data=1))
  373. buf.extend(self.encapsulation_data(data=1, len_data=1))
  374. self.add_send_data_queue(buf)
  375. def encapsulation_data(self, data, len_data, data_magnification=1):
  376. # data_magnification 数据放大倍数,或缩小倍数,默认为1
  377. data = int(data * data_magnification)
  378. if len_data == 1:
  379. return [0xFF & data]
  380. elif len_data == 2:
  381. return [0xFF & data >> 8, 0xFF & data]
  382. elif len_data == 4:
  383. return [0xFF & data >> 24, 0xFF & data >> 16, 0xFF & data >> 8, 0xFF & data]
  384. def open_rgb_led(
  385. self,
  386. color_name,
  387. led_command=1,
  388. brightness=80,
  389. enable=True,
  390. mode="loop",
  391. times=2,
  392. interval=0.1,
  393. ):
  394. color_name_value = {
  395. "红色": (156, 6, 3),
  396. "黄色": (255, 206, 25),
  397. "绿色": (0, 128, 0),
  398. "蓝色": (0, 25, 255),
  399. "白色": (255, 250, 227),
  400. }
  401. if color_name in color_name_value:
  402. buf = [self.command["open_rgb_led"]]
  403. buf.append(1 if enable else 0)
  404. buf.append(led_command)
  405. buf.extend(color_name_value[color_name])
  406. buf.extend(
  407. [
  408. brightness,
  409. 1 if mode == "loop" else 2,
  410. times,
  411. int(interval * 10),
  412. ]
  413. )
  414. self.add_send_data_queue(buf)
  415. async def getDeviationInfo(self):
  416. await asyncio.sleep(0.01)
  417. try:
  418. # 发送获取偏移量
  419. data = [self.command["get_deviation"], 1]
  420. self.add_send_data_queue(data)
  421. # if self.serial_ins:
  422. # self.serial_ins.write_cmd(data)
  423. print("发送获取偏移量")
  424. logger.info("发送获取偏移量")
  425. except Exception as e:
  426. print(e)
  427. print("getDeviationInfo", "暂未获取到self.command")
  428. logger.info("getDeviationInfo暂未获取到self.command")
  429. def set_deviation(self, device_name, _type=0, deviation=0):
  430. # turntable----0 angle_ratio 1 turntable_steering_deviation
  431. # overturn ----0 middle 1 high
  432. if device_name == "camera_high_motor":
  433. deviation = deviation / 10 # deviation 原单位为mm
  434. if device_name == "turntable_position_motor":
  435. deviation = deviation / 10 # deviation 原单位为mm
  436. if device_name == "camera_steering":
  437. pass
  438. if device_name == "turntable_steering":
  439. pass
  440. if device_name == "overturn_steering":
  441. pass
  442. device_id = self.device_name_dict[device_name]
  443. _dir = 1 if deviation >= 0 else 0
  444. deviation = int(abs(deviation * 10))
  445. data = [
  446. self.command["set_deviation"],
  447. device_id,
  448. _type,
  449. _dir,
  450. 0xFF & deviation >> 8,
  451. 0xFF & deviation,
  452. ]
  453. self.add_send_data_queue(data)
  454. # self.controlDevice(device_name, deviation)
  455. async def set_deviation_cmd(self, value, action_name, type):
  456. await asyncio.sleep(0.01)
  457. name_sets = [
  458. "相机电机", # min 0 max 400,步长1
  459. "相机舵机", # min -40 max 40,步长0.1
  460. "转盘舵机", # min -720 max 720,步长1
  461. "转盘前后电机", # min 0 max 950,步长1
  462. "翻板舵机中位", # min 0 max 180,步长0.5
  463. "翻板舵机高位", # min 0 max 180,步长0.5
  464. "翻板舵机上升速度", # min 1 max 10,步长1
  465. "翻板舵机下降速度", # min 1 max 10,步长1
  466. ]
  467. if action_name not in name_sets:
  468. self.msg_type = f"{type}_deviation"
  469. self.sendSocketMessage(msg="设置参数有误,请检查", device_status=0, code=1)
  470. self.msg_type = "mcu"
  471. return
  472. # 发送获取偏移量
  473. if type == "move":
  474. self.mcu_deviation_set.change_value(value, action_name)
  475. elif type == "set":
  476. self.mcu_deviation_set.set_deviation(action_name)
  477. self.msg_type = f"{type}_deviation"
  478. self.sendSocketMessage(msg=f"{action_name} 设置成功", device_status=2, code=0)
  479. self.msg_type = "mcu"
  480. def get_other_info(self):
  481. # 发送获取偏移量
  482. data = [self.command["get_other_info"], 1]
  483. self.add_send_data_queue(data)
  484. print("发送获取其他信息")
  485. logger.info("发送获取其他信息")
  486. def add_send_data_queue(self, data):
  487. self.lock.acquire()
  488. if self.serial_ins:
  489. print("send_data_queue append :{}".format(data))
  490. logger.info("send_data_queue append %s", data)
  491. self.send_data_queue.append(data)
  492. self.lock.release()
  493. async def send_all_cmd(self):
  494. # await asyncio.sleep(0.001)
  495. while True:
  496. await asyncio.sleep(0.1)
  497. if self.send_data_queue:
  498. # self.sendSocketMessage(msg="正在发送命令", device_status=1)
  499. data = self.send_data_queue.pop(0)
  500. # print("\033[1;32;40m 正在发送命令 \033[0m",data)
  501. self.serial_ins.write_cmd(data)
  502. # self.sendSocketMessage(msg="命令发送完成", device_status=2)
  503. else:
  504. break
  505. def send_cmd(self):
  506. self.lock.acquire()
  507. if self.send_data_queue:
  508. # self.sendSocketMessage(msg="正在发送命令", device_status=1)
  509. data = self.send_data_queue.pop(0)
  510. self.serial_ins.write_cmd(data)
  511. # self.sendSocketMessage(msg="命令发送完成", device_status=2)
  512. else:
  513. # self.t_n += 1
  514. # 加大发送获取基础数据的时间间隔
  515. # 默认为0.01秒一个循环,每隔1.5秒发送数据
  516. if self.t_n == 150:
  517. # self.t_n = 0
  518. self.send_get_all_info_to_mcu()
  519. self.lock.release()
  520. def send_get_all_info_to_mcu(self):
  521. if self.is_get_mcu_state is False:
  522. return
  523. data = [self.command["get_all_info"], 1]
  524. self.serial_ins.write_cmd(data)
  525. def print_mcu_error_data(self, receive_data):
  526. # 扫码数据
  527. try:
  528. data = receive_data[1:].decode()
  529. if "设备初始化完成" in data:
  530. self.init_state = True
  531. logger.info(f"设备初始化完成:%{data}")
  532. self.sendSocketMessage(msg=data, device_status=2)
  533. else:
  534. print("设备异常数据打印:", data)
  535. logger.info(f"115 设备异常数据打印:%{data}")
  536. except BaseException as e:
  537. print("117 error {}".format(e))
  538. logger.info(f"117 error %{e}")
  539. return
  540. def print_mcu_noraml_data(self, receive_data):
  541. # 扫码数据
  542. print("接收到255数据:", receive_data)
  543. try:
  544. command_mapping = {
  545. 1:"设备运动",
  546. 2:"初始化设备", # 初始化设备
  547. 3:"处理其他设备", # 处理其他设备
  548. 29:"获取所有信息", # 获取所有信息
  549. 40:"设置偏移量", # 设置偏移量
  550. 41:"读取偏移量", # 读取偏移量
  551. 91:"信号转发处理", # 信号转发处理
  552. 92:"信号转发返回", # 信号转发返回
  553. 44:"获取其他信息", # 获取其他信息
  554. 43:"RGB灯的处理与通讯", ## RGB灯的处理与通讯
  555. 45:"设置其他信息", # 设置其他信息
  556. 47:"查询遥控器电量", # 查询遥控器电量
  557. 48:"设置转盘通讯方式 1、串口、2、无线、3 混合", #
  558. 93:"停止运行mcu", # 停止运行mcu
  559. 90:"连接MCU",# 连接MCU
  560. }
  561. # command = int(receive_data[0])
  562. command = int(receive_data[1])
  563. command_text = command_mapping[command]
  564. # receive_data_temp = receive_data[2:]
  565. receive_data_temp_text = " ".join([hex(x) for x in receive_data])
  566. # print("255 command_text:", command_text)
  567. if command_text in ["设备运动","处理其他设备"]:
  568. device_id = int(receive_data[2])
  569. device_value = int(receive_data[3])
  570. device_name_info = self.device_name_dict_mapping[device_id]
  571. message_info = {"设备名称":device_name_info,"运动值":device_value}
  572. print("【设备运动】消息回执:", message_info)
  573. logger.info(f"设备运动消息回执:{message_info}")
  574. print("接收设备消息回执:", command_text)
  575. logger.info(f"接收设备消息回执:{receive_data_temp_text}")
  576. except BaseException as e:
  577. print(f"255 error {e}")
  578. logger.info(f"255 error {e}")
  579. return
  580. def get_from_mcu_move_respond_data(self, receive_data):
  581. self.last_from_mcu_move_respond_data = receive_data
  582. def get_from_mcu_connect_info(self, receive_data):
  583. connect_flag = receive_data[1]
  584. device_id = receive_data[2]
  585. try:
  586. mcu_has_been_set = receive_data[6] # 设备是否有初始化 ,1 表示已初始化
  587. except:
  588. mcu_has_been_set = 99 # 未知状态
  589. # self.self_sign.emit({"type": "connect_sign", "data": connect_flag})
  590. message = {"type": "connect_sign", "data": connect_flag}
  591. self.sendSocketMessage(msg="接收连接信息", data=message)
  592. print("接收链接信息")
  593. logger.info("接收链接信息")
  594. return
  595. def to_init_device_origin_point(self, device_name, is_force=False):
  596. device_id = self.device_name_dict[device_name]
  597. cmd = 2
  598. data = [cmd, device_id, 0 if is_force is False else 1]
  599. self.open_rgb_led(color_name="红色")
  600. self.add_send_data_queue(data)
  601. if device_name == "mcu":
  602. # 重置初始化标记为 从未初始化
  603. self.is_just_init_time = False
  604. return True
  605. # 设置其他信息
  606. def set_to_mcu_other_info(self, data):
  607. is_auto_send_base_info = data["is_auto_send_base_info"]
  608. is_move_retry = data["is_move_retry"]
  609. is_data_response = data["is_data_response"]
  610. low_speed = data["low_speed"]
  611. is_test = data["is_test"]
  612. to_init_mode = data["to_init_mode"]
  613. turntable_move_to_init_mode = data["turntable_move_to_init_mode"]
  614. led_count = data["led_count"]
  615. turntable_steering_angle_ratio = data["turntable_steering_angle_ratio"]
  616. is_manual_check = data["is_manual_check"]
  617. camera_steering_angle_ratio = data["camera_steering_angle_ratio"]
  618. is_auto_motor_to_disable = data["is_auto_motor_to_disable"]
  619. diff_dir = data["diff_dir"]
  620. is_auto_send_pos_info = data["is_auto_send_pos_info"]
  621. is_dog = data["is_dog"]
  622. has_been_set_motor_config = data["has_been_set_motor_config"]
  623. buf = [self.command["set_other_info"]]
  624. buf.extend(self.encapsulation_data(data=is_auto_send_base_info, len_data=1))
  625. buf.extend(self.encapsulation_data(data=is_move_retry, len_data=1))
  626. buf.extend(self.encapsulation_data(data=is_data_response, len_data=1))
  627. buf.extend(self.encapsulation_data(data=low_speed, len_data=2))
  628. buf.extend(self.encapsulation_data(data=is_test, len_data=1))
  629. buf.extend(self.encapsulation_data(data=to_init_mode, len_data=1))
  630. buf.extend(
  631. self.encapsulation_data(data=turntable_move_to_init_mode, len_data=1)
  632. )
  633. buf.extend(self.encapsulation_data(data=led_count, len_data=2))
  634. buf.extend(
  635. self.encapsulation_data(data=turntable_steering_angle_ratio, len_data=2)
  636. )
  637. buf.extend(self.encapsulation_data(data=is_manual_check, len_data=1))
  638. buf.extend(
  639. self.encapsulation_data(data=camera_steering_angle_ratio, len_data=4)
  640. )
  641. buf.extend(self.encapsulation_data(data=is_auto_motor_to_disable, len_data=1))
  642. buf.extend(self.encapsulation_data(data=diff_dir, len_data=1))
  643. buf.extend(self.encapsulation_data(data=is_auto_send_pos_info, len_data=1))
  644. buf.extend(self.encapsulation_data(data=is_dog, len_data=1))
  645. buf.extend(self.encapsulation_data(data=has_been_set_motor_config, len_data=1))
  646. self.add_send_data_queue(buf)
  647. async def cleanAllReceiveData(self):
  648. while True:
  649. await asyncio.sleep(0.001)
  650. receive_data = self.serial_ins.read_cmd(out_time=1)
  651. if not receive_data:
  652. break
  653. def get_basic_info_mcu(self):
  654. receive_data = self.serial_ins.read_cmd(out_time=1)
  655. if receive_data is False:
  656. print("------------------------------------------------4657564654")
  657. print(
  658. "------------------------------------------------get_basic_info_mcu------------------"
  659. )
  660. logger.info("------------------------------------------------4657564654")
  661. self.connect_state = False
  662. return False
  663. if not receive_data:
  664. return False
  665. command = receive_data[0]
  666. print("get_basic_info_mcu",command)
  667. if command in self.deal_code_func_dict:
  668. _data = ' '.join([hex(x) for x in receive_data])
  669. return self.deal_code_func_dict[command](receive_data)
  670. return False
  671. def get_from_mcu_button(self, receive_data):
  672. button_name = receive_data[1]
  673. self.deal_mcu_button(button_name)
  674. def deal_mcu_button(self, button_name):
  675. # 防止重复点击
  676. s = time.time()
  677. if s - self.last_push_time[button_name] > 0.1:
  678. self.last_push_time[button_name] = s
  679. # print("button_name", button_name)
  680. else:
  681. self.last_push_time[button_name] = s
  682. return
  683. if button_name == 1:
  684. # 自动执行全部
  685. # self.sign_data.emit(
  686. # {"_type": "mcu_button", "plugins_mode": "mcu", "data": "todo_1"}
  687. # )
  688. message = {"_type": "mcu_button", "plugins_mode": "mcu", "data": "todo_1"}
  689. self.sendSocketMessage(code=0, msg="", data=message)
  690. if button_name == 2:
  691. # self.sign_data.emit(
  692. # {"_type": "mcu_button", "plugins_mode": "mcu", "data": "todo_2"}
  693. # )
  694. message = {"_type": "mcu_button", "plugins_mode": "mcu", "data": "todo_2"}
  695. self.sendSocketMessage(code=0, msg="", data=message)
  696. if button_name == 3:
  697. # self.sign_data.emit(
  698. # {"_type": "mcu_button", "plugins_mode": "mcu", "data": "todo_3"}
  699. # )
  700. message = {"_type": "mcu_button", "plugins_mode": "mcu", "data": "todo_3"}
  701. self.sendSocketMessage(code=0, msg="", data=message)
  702. # 获取偏移量信息
  703. def get_from_mcu_deviation_info(self, receive_data):
  704. if len(receive_data) == 18:
  705. camera_high_motor_deviation_dir = receive_data[1]
  706. camera_high_motor_deviation = receive_data[2] << 8 | receive_data[3]
  707. camera_high_motor_deviation = (
  708. camera_high_motor_deviation * -1
  709. if camera_high_motor_deviation_dir == 0
  710. else camera_high_motor_deviation
  711. )
  712. camera_steering_deviation_dir = receive_data[4]
  713. camera_steering_deviation = (receive_data[5] << 8 | receive_data[6]) * 0.1
  714. camera_steering_deviation = (
  715. camera_steering_deviation * -1
  716. if camera_steering_deviation_dir == 0
  717. else camera_steering_deviation
  718. )
  719. turntable_steering_deviation_dir = receive_data[7]
  720. turntable_steering_deviation = (
  721. receive_data[8] << 8 | receive_data[9]
  722. ) * 0.1
  723. turntable_steering_deviation = (
  724. turntable_steering_deviation * -1
  725. if turntable_steering_deviation_dir == 0
  726. else turntable_steering_deviation
  727. )
  728. overturn_steering_middle_dir = receive_data[10]
  729. overturn_steering_middle = (receive_data[11] << 8 | receive_data[12]) * 0.1
  730. overturn_steering_middle = (
  731. overturn_steering_middle * -1
  732. if overturn_steering_middle_dir == 0
  733. else overturn_steering_middle
  734. )
  735. overturn_steering_high_dir = receive_data[13]
  736. overturn_steering_high = (receive_data[14] << 8 | receive_data[15]) * 0.1
  737. overturn_steering_high = (
  738. overturn_steering_middle * -1
  739. if overturn_steering_high_dir == 0
  740. else overturn_steering_high
  741. )
  742. overturn_steering_up_speed = receive_data[16]
  743. overturn_steering_down_speed = receive_data[17]
  744. # self.sign_data.emit(
  745. # {
  746. # "_type": "get_deviation_data",
  747. # "plugins_mode": "mcu",
  748. # "data": {
  749. # "camera_high_motor_deviation": camera_high_motor_deviation,
  750. # "camera_steering_deviation": camera_steering_deviation,
  751. # "turntable_steering_deviation": turntable_steering_deviation,
  752. # "overturn_steering_middle": overturn_steering_middle,
  753. # "overturn_steering_high": overturn_steering_high,
  754. # "overturn_steering_up_speed": overturn_steering_up_speed,
  755. # "overturn_steering_down_speed": overturn_steering_down_speed,
  756. # },
  757. # }
  758. # )
  759. # message = {
  760. # "_type": "get_deviation_data",
  761. # "plugins_mode": "mcu",
  762. # "data": {
  763. # "camera_high_motor_deviation": camera_high_motor_deviation,
  764. # "camera_steering_deviation": camera_steering_deviation,
  765. # "turntable_steering_deviation": turntable_steering_deviation,
  766. # "overturn_steering_middle": overturn_steering_middle,
  767. # "overturn_steering_high": overturn_steering_high,
  768. # "overturn_steering_up_speed": overturn_steering_up_speed,
  769. # "overturn_steering_down_speed": overturn_steering_down_speed,
  770. # },
  771. # }
  772. get_deviation_data = {
  773. "camera_high_motor_deviation": camera_high_motor_deviation,
  774. "camera_steering_deviation": camera_steering_deviation,
  775. "turntable_steering_deviation": turntable_steering_deviation,
  776. "turntable_front_end_deviation": 300,
  777. "overturn_steering_middle": overturn_steering_middle,
  778. "overturn_steering_high": overturn_steering_high,
  779. "overturn_steering_up_speed": overturn_steering_up_speed,
  780. "overturn_steering_down_speed": overturn_steering_down_speed,
  781. }
  782. self.initDeviationInfo(get_deviation_data)
  783. self.msg_type = "get_deviation_data"
  784. self.sendSocketMessage(msg="接收偏移量信息", data=get_deviation_data)
  785. self.msg_type = "mcu"
  786. print("接收偏移量信息")
  787. logger.info("接收偏移量信息")
  788. return
  789. def initDeviationInfo(self, get_deviation_data):
  790. # 初始化偏移量信息
  791. camera_high_motor_deviation = get_deviation_data["camera_high_motor_deviation"]
  792. camera_steering_deviation = get_deviation_data["camera_steering_deviation"]
  793. turntable_steering_deviation = get_deviation_data[
  794. "turntable_steering_deviation"
  795. ]
  796. overturn_steering_middle = get_deviation_data["overturn_steering_middle"]
  797. overturn_steering_high = get_deviation_data["overturn_steering_high"]
  798. overturn_steering_up_speed = get_deviation_data["overturn_steering_up_speed"]
  799. overturn_steering_down_speed = get_deviation_data[
  800. "overturn_steering_down_speed"
  801. ]
  802. self.mcu_deviation_set.last_value["相机电机"] = camera_high_motor_deviation
  803. self.mcu_deviation_set.last_value["相机舵机"] = camera_steering_deviation
  804. self.mcu_deviation_set.last_value["转盘舵机"] = turntable_steering_deviation
  805. self.mcu_deviation_set.last_value["翻板舵机中位"] = overturn_steering_middle
  806. self.mcu_deviation_set.last_value["翻板舵机高位"] = overturn_steering_high
  807. self.mcu_deviation_set.last_value["翻板舵机上升速度"] = (
  808. overturn_steering_up_speed
  809. )
  810. self.mcu_deviation_set.last_value["翻板舵机下降速度"] = (
  811. overturn_steering_down_speed
  812. )
  813. # 获取其他信息
  814. def get_from_mcu_other_info(self, receive_data):
  815. # TODO 已完成设置
  816. is_auto_send_base_info = self.get_data_from_receive_data(
  817. receive_data=receive_data, start=1, len_data=1
  818. )
  819. is_move_retry = self.get_data_from_receive_data(
  820. receive_data=receive_data, start=2, len_data=1
  821. )
  822. is_data_response = self.get_data_from_receive_data(
  823. receive_data=receive_data, start=3, len_data=1
  824. )
  825. low_speed = self.get_data_from_receive_data(
  826. receive_data=receive_data, start=4, len_data=2
  827. )
  828. is_test = self.get_data_from_receive_data(
  829. receive_data=receive_data, start=6, len_data=1
  830. )
  831. to_init_mode = self.get_data_from_receive_data(
  832. receive_data=receive_data, start=7, len_data=1
  833. )
  834. turntable_move_to_init_mode = self.get_data_from_receive_data(
  835. receive_data=receive_data, start=8, len_data=1
  836. )
  837. led_count = self.get_data_from_receive_data(
  838. receive_data=receive_data, start=9, len_data=2
  839. )
  840. turntable_steering_angle_ratio = self.get_data_from_receive_data(
  841. receive_data=receive_data, start=11, len_data=2
  842. )
  843. is_manual_check = self.get_data_from_receive_data(
  844. receive_data=receive_data, start=13, len_data=1
  845. )
  846. camera_steering_angle_ratio = self.get_data_from_receive_data(
  847. receive_data=receive_data, start=14, len_data=4
  848. )
  849. is_auto_motor_to_disable = self.get_data_from_receive_data(
  850. receive_data=receive_data, start=18, len_data=1
  851. )
  852. diff_dir = self.get_data_from_receive_data(
  853. receive_data=receive_data, start=19, len_data=1
  854. )
  855. is_auto_send_pos_info = self.get_data_from_receive_data(
  856. receive_data=receive_data, start=20, len_data=1
  857. )
  858. is_dog = self.get_data_from_receive_data(
  859. receive_data=receive_data, start=21, len_data=1
  860. )
  861. has_been_set_motor_config = self.get_data_from_receive_data(
  862. receive_data=receive_data, start=22, len_data=1
  863. )
  864. self.last_mcu_other_info_data["data"] = {
  865. "is_auto_send_base_info": is_auto_send_base_info,
  866. "is_move_retry": is_move_retry,
  867. "is_data_response": is_data_response,
  868. "low_speed": low_speed,
  869. "is_test": is_test,
  870. "to_init_mode": to_init_mode,
  871. "turntable_move_to_init_mode": turntable_move_to_init_mode,
  872. "led_count": led_count,
  873. "turntable_steering_angle_ratio": turntable_steering_angle_ratio,
  874. "is_manual_check": is_manual_check,
  875. "camera_steering_angle_ratio": camera_steering_angle_ratio,
  876. "is_auto_motor_to_disable": is_auto_motor_to_disable,
  877. "diff_dir": diff_dir,
  878. "is_auto_send_pos_info": is_auto_send_pos_info,
  879. "is_dog": is_dog,
  880. "has_been_set_motor_config": has_been_set_motor_config,
  881. }
  882. self.last_mcu_other_info_data["time"] = time.time()
  883. self.last_mcu_other_info_data["num"] += 1
  884. for k, v in self.last_mcu_other_info_data["data"].items():
  885. print("k:{},v:{}".format(k, v))
  886. logger.info("k:%s,v:%s", k, v)
  887. self.msg_type = "get_mcu_other_info"
  888. self.sendSocketMessage(
  889. code=0,
  890. msg="获取mcu其他配置信息",
  891. device_status=2,
  892. data=self.last_mcu_other_info_data["data"],
  893. )
  894. self.msg_type = "mcu"
  895. def get_data_from_receive_data(
  896. self, receive_data, start, len_data, data_magnification=1
  897. ):
  898. # data_magnification 数据放大倍数,或缩小倍数,默认为1
  899. try:
  900. if len_data == 1:
  901. data = receive_data[start]
  902. return data * data_magnification
  903. elif len_data == 2:
  904. data = receive_data[start] << 8 | receive_data[start + 1]
  905. return data * data_magnification
  906. elif len_data == 4:
  907. data = (
  908. receive_data[start] << 24
  909. | receive_data[start + 1] << 16
  910. | receive_data[start + 2] << 8
  911. | receive_data[start + 3]
  912. )
  913. return data * data_magnification
  914. return None
  915. except:
  916. return None
  917. def get_from_mcu_base_info(self, receive_data):
  918. # 数据缓存
  919. self.last_mcu_info_data["time"] = time.time()
  920. self.last_mcu_info_data["num"] += 1
  921. # print("last_mcu_info_data:{}".format(self.last_mcu_info_data["time"]))
  922. self.state_camera_motor = 3
  923. self.state_camera_steering = 3
  924. self.state_turntable_steering = 3
  925. self.state_overturn_steering = 3
  926. self.state_move_turntable_steering = 3
  927. if len(receive_data) == 7:
  928. self.m_t = 1
  929. laser_state = receive_data[1]
  930. self.state_camera_motor = receive_data[2]
  931. self.state_camera_steering = receive_data[3]
  932. self.state_turntable_steering = receive_data[4]
  933. self.state_overturn_steering = receive_data[5]
  934. flag = receive_data[6]
  935. message = {
  936. "_type": "show_mcu_info",
  937. "plugins_mode": "mcu",
  938. "data": "激光状态;{laser_state},相机高度状态:{state_camera_motor},相机角度状态:{state_camera_steering},转盘状态:{state_turntable_steering},翻板状态:{state_overturn_steering},flag:{flag}".format(
  939. laser_state=laser_state,
  940. state_camera_motor=self.state_camera_motor,
  941. state_camera_steering=self.state_camera_steering,
  942. state_turntable_steering=self.state_turntable_steering,
  943. state_overturn_steering=self.state_overturn_steering,
  944. flag=flag,
  945. ),
  946. "data_state": {
  947. "state_camera_motor": self.state_camera_motor,
  948. "state_camera_steering": self.state_camera_steering,
  949. "state_turntable_steering": self.state_turntable_steering,
  950. "state_overturn_steering": self.state_overturn_steering,
  951. },
  952. }
  953. self.msg_type = "get_mcu_info"
  954. self.sendSocketMessage(msg="获取mcu设备运行状态信息", data=message)
  955. self.msg_type = "mcu"
  956. # print("转盘:{},时间:{}".format(self.state_turntable_steering, time.time()))
  957. if len(receive_data) == 8:
  958. self.m_t = 2
  959. laser_state = receive_data[1]
  960. self.state_camera_motor = receive_data[2]
  961. self.state_camera_steering = receive_data[3]
  962. self.state_turntable_steering = receive_data[4]
  963. self.state_overturn_steering = receive_data[5]
  964. self.state_move_turntable_steering = receive_data[6]
  965. flag = receive_data[7]
  966. message = {
  967. "_type": "show_mcu_info",
  968. "plugins_mode": "mcu",
  969. "data": "激光状态;{laser_state},相机高度状态:{state_camera_motor},相机角度状态:{state_camera_steering},转盘状态:{state_turntable_steering},转盘前后移动状态:{state_move_turntable_steering},翻板状态:{state_overturn_steering},flag:{flag}".format(
  970. laser_state=laser_state,
  971. state_camera_motor=self.state_camera_motor,
  972. state_camera_steering=self.state_camera_steering,
  973. state_turntable_steering=self.state_turntable_steering,
  974. state_overturn_steering=self.state_overturn_steering,
  975. state_move_turntable_steering=self.state_move_turntable_steering,
  976. flag=flag,
  977. ),
  978. "data_state": {
  979. "state_camera_motor": self.state_camera_motor,
  980. "state_camera_steering": self.state_camera_steering,
  981. "state_turntable_steering": self.state_turntable_steering,
  982. "state_overturn_steering": self.state_overturn_steering,
  983. "state_move_turntable_steering": self.state_move_turntable_steering,
  984. },
  985. }
  986. # if self.state_camera_motor
  987. if all(
  988. value == 2
  989. for value in [
  990. self.state_camera_motor,
  991. self.state_camera_steering,
  992. self.state_turntable_steering,
  993. self.state_overturn_steering,
  994. ]
  995. ):
  996. self.init_state = True
  997. self.sendSocketMessage(msg="设备初始化完成", device_status=2)
  998. self.msg_type = "get_mcu_info"
  999. self.sendSocketMessage(msg="获取mcu设备运行状态信息", data=message)
  1000. self.msg_type = "mcu"
  1001. # 检查是否成功初始化
  1002. if self.is_just_init_time is False:
  1003. if self.mcu_move_state == 2:
  1004. self.is_just_init_time = True
  1005. print("is_just_init_time")
  1006. logger.info("设备初始化完成")
  1007. message = {
  1008. "_type": "is_just_init_time",
  1009. "plugins_mode": "mcu",
  1010. "data": "",
  1011. }
  1012. self.sendSocketMessage(msg="检查设备初始化", data=message)
  1013. return
  1014. def scan_serial_port(self) -> dict:
  1015. # 获取所有可用串口列表
  1016. ports_dict = {}
  1017. ports = serial.tools.list_ports.comports()
  1018. # 遍历所有端口并打印信息
  1019. for port in ports:
  1020. # logger.info("扫描到的串口信息:{}".format(port.description))
  1021. if "CH34" in port.description:
  1022. ports_dict[port.name] = {
  1023. "name": port.name,
  1024. "device": port.device,
  1025. "description": port.description,
  1026. "hwid": port.hwid,
  1027. "manufacturer": port.manufacturer,
  1028. "product": port.product,
  1029. "serial_number": port.serial_number,
  1030. }
  1031. if len(ports_dict) <= 0:
  1032. return {}
  1033. return ports_dict
  1034. def remove_port(self, port_name):
  1035. """移除串口"""
  1036. print("remove", port_name)
  1037. logger.info("串口被移除")
  1038. data = {
  1039. "_type": "remove_port",
  1040. "plugins_mode": "auto_select_com",
  1041. "data": {"port_name": port_name},
  1042. }
  1043. self.sendSocketMessage(1, "串口被移除", data)
  1044. def is_serial_available(self, port):
  1045. try:
  1046. ser = serial.Serial(port)
  1047. ser.close()
  1048. return True
  1049. except serial.serialException:
  1050. return False
  1051. async def add_port_by_linkage(self, port_name):
  1052. # port_value :串口基础信息
  1053. # todo 根据prot_value 信息自动进行连接
  1054. print("add port_name", port_name)
  1055. logger.info("add port_name %s", port_name)
  1056. print("self.port_name", self.port_name)
  1057. logger.info("self.port_name %s", self.port_name)
  1058. if self.port_name == port_name:
  1059. self.port_name = ""
  1060. # 对没有连接的设备进行尝试连接
  1061. # 如果存在串口被占用则进行断开
  1062. self.is_serial_available(port_name)
  1063. return False
  1064. message_data = {
  1065. "_type": "show_info",
  1066. "plugins_mode": "auto_select_com",
  1067. "data": {"text": "开始识别接口:{}".format(port_name)},
  1068. }
  1069. self.sendSocketMessage(
  1070. msg="开始识别接口:{}".format(port_name), data=message_data, device_status=1
  1071. )
  1072. await asyncio.sleep(1)
  1073. """
  1074. 步骤:
  1075. 1、进行临时连接,并发送命令,成功后,自动连接对应设备
  1076. """
  1077. try:
  1078. # 尝试使用115200波特率链接
  1079. serial_handle = serial.Serial(port=port_name, baudrate=115200, timeout=0.5)
  1080. except Exception as e:
  1081. message_data = {
  1082. "_type": "show_info",
  1083. "plugins_mode": "auto_select_com",
  1084. "data": {"text": "串口:{} 被占用,或无法识别".format(port_name)},
  1085. }
  1086. self.sendSocketMessage(
  1087. 1,
  1088. msg="串口:{} 被占用,或无法识别".format(port_name).format(port_name),
  1089. data=message_data,
  1090. device_status=-1,
  1091. )
  1092. print("串口:{} 被占用".format(port_name))
  1093. logger.info("串口:%s 被占用", port_name)
  1094. if self.serial_ins.serial_handle is not None:
  1095. self.serial_ins.serial_handle.close()
  1096. return False
  1097. await asyncio.sleep(2)
  1098. print("开始发送命令")
  1099. logger.info("开始发送命令")
  1100. data = [90, 1]
  1101. try:
  1102. serial_handle.flushInput() # 尝试重置输入缓冲区
  1103. except serial.SerialTimeoutException:
  1104. print("超时错误:无法在规定时间内重置输入缓冲区。")
  1105. logger.info("超时错误:无法在规定时间内重置输入缓冲区。")
  1106. self.sendSocketMessage(
  1107. 1,
  1108. msg="超时错误:无法在规定时间内重置输入缓冲区。",
  1109. data=None,
  1110. )
  1111. serial_handle.close()
  1112. return False
  1113. print("尝试写入数据")
  1114. logger.info("尝试写入数据")
  1115. buf = bytearray(b"")
  1116. buf.extend([0x55, 0x55, (0xFF & len(data))])
  1117. buf.extend(data)
  1118. buf.extend([0xFF & ~sum(data)])
  1119. try:
  1120. self.receive_data = b""
  1121. serial_handle.write(buf)
  1122. except serial.SerialTimeoutException:
  1123. print("写入数据错误")
  1124. logger.info("写入数据错误")
  1125. serial_handle.close()
  1126. return False
  1127. await asyncio.sleep(0.3)
  1128. receive_data = self.read_cmd(serial_handle)
  1129. # print("尝试接收命令", receive_data)
  1130. # logger.info("尝试接收命令,%s", receive_data)
  1131. device_id = 0
  1132. if receive_data:
  1133. print("receive_data", receive_data)
  1134. logger.info("receive_data %s", receive_data)
  1135. if receive_data[0] == 90:
  1136. connect_flag = receive_data[1]
  1137. device_id = receive_data[2]
  1138. else:
  1139. logger.info("串口数据未监听到,继续等待...%s", port_name)
  1140. return False
  1141. print("关闭串口:{}".format(port_name))
  1142. logger.info("关闭串口:%s", port_name)
  1143. serial_handle.close()
  1144. loop = asyncio.get_event_loop()
  1145. print("device_id============>>>", device_id)
  1146. logger.info("device_id============>>>%s", device_id)
  1147. if device_id > 0:
  1148. if device_id == settings.MCU_CODE:
  1149. state, _ = self.to_connect_com(port_name)
  1150. if not state:
  1151. return False
  1152. message_data = {
  1153. "_type": "show_info",
  1154. "plugins_mode": "auto_select_com",
  1155. "data": {"text": "MCU开始连接"},
  1156. }
  1157. self.sendSocketMessage(
  1158. msg="MCU开始连接", data=message_data, device_status=1
  1159. )
  1160. self.connected_ports_dict[port_name] = "MCU"
  1161. message_data = {
  1162. "_type": "select_port_name",
  1163. "plugins_mode": "auto_select_com",
  1164. "data": {
  1165. "device_name": "mcu" if device_id == 1 else "remote_control",
  1166. "port_name": port_name,
  1167. },
  1168. }
  1169. return True
  1170. elif device_id == 2:
  1171. # 有线接收器
  1172. self.connected_ports_dict[port_name] = "Line_Control"
  1173. # print("device_id", device_id)
  1174. # logger.info("device_id %s", device_id)
  1175. state = await self.line_control.to_connect_com(port_name)
  1176. if not state:
  1177. return False
  1178. self.line_control.connect_state = True
  1179. return True
  1180. else:
  1181. print("串口无法识别")
  1182. logger.info("串口无法识别")
  1183. self.sendSocketMessage(
  1184. code=1,
  1185. msg="串口无法识别,请重新插拔拍照机USB",
  1186. data=message_data,
  1187. device_status=-1,
  1188. )
  1189. return False
  1190. # 走其他途径处理
  1191. def clearMyInstance(self):
  1192. SingletonType.clear_instance()
  1193. def to_connect_com(self, port_name):
  1194. # 关闭串口
  1195. print("to_connect_com", port_name)
  1196. logger.info("to_connect_com %s", port_name)
  1197. self.close_connect()
  1198. time.sleep(0.3)
  1199. self.connect_state = False
  1200. try:
  1201. self.serial_ins = SerialIns(port_name=port_name, baud=115200, timeout=0.1)
  1202. if not self.serial_ins.serial_handle:
  1203. message_data = {
  1204. "_type": "show_info",
  1205. "plugins_mode": "mcu",
  1206. "data": "MCU 打开串口失败",
  1207. }
  1208. self.sendSocketMessage(
  1209. msg="MCU 打开串口失败", data=message_data, device_status=-1
  1210. )
  1211. self.serial_ins = None
  1212. self.connect_state = False
  1213. return False, None
  1214. except:
  1215. message_data = {
  1216. "_type": "show_info",
  1217. "plugins_mode": "mcu",
  1218. "data": "MCU 打开串口失败",
  1219. }
  1220. self.sendSocketMessage(
  1221. msg="MCU 打开串口失败", data=message_data, device_status=-1
  1222. )
  1223. self.serial_ins = None
  1224. self.connect_state = False
  1225. return False, None
  1226. message_data = {
  1227. "_type": "show_info",
  1228. "plugins_mode": "mcu",
  1229. "data": "MCU 开始连接",
  1230. }
  1231. self.sendSocketMessage(msg="MCU 开始连接", data=message_data, device_status=1)
  1232. # =======================发送连接请求=================================
  1233. cmd = 90
  1234. data = [cmd, 1]
  1235. print("405 发送 连接请求 -----------------------------------------")
  1236. logger.info("405 发送 连接请求 -----------------------------------------")
  1237. print(self.serial_ins)
  1238. logger.info(self.serial_ins)
  1239. # self.serial_ins.clearn_flush()
  1240. self.serial_ins.write_cmd(data)
  1241. # 延迟接收数据
  1242. time.sleep(0.3)
  1243. receive_data = self.serial_ins.read_cmd(out_time=1)
  1244. if receive_data:
  1245. print(
  1246. "409 receive_data--90:{}".format(self.change_hex_to_int(receive_data))
  1247. )
  1248. logger.info(
  1249. "409 receive_data--90:%s", str(self.change_hex_to_int(receive_data))
  1250. )
  1251. else:
  1252. return False, None
  1253. if receive_data:
  1254. # receive_data[2]=1 表示为MCU设备编号
  1255. if receive_data[0] == 90 and receive_data[2] == settings.MCU_CODE:
  1256. connect_flag = receive_data[1]
  1257. # 是否有初始化
  1258. try:
  1259. mcu_has_been_set = receive_data[
  1260. 6
  1261. ] # 设备是否有初始化 ,1 表示已初始化
  1262. except:
  1263. mcu_has_been_set = 99 # 未知状态
  1264. print("MCU初始化信息{}".format(mcu_has_been_set))
  1265. logger.info("MCU初始化信息%s", str(mcu_has_been_set))
  1266. message_data = {
  1267. "_type": "show_info",
  1268. "plugins_mode": "mcu",
  1269. "data": "MCU 已连接",
  1270. }
  1271. self.sendSocketMessage(
  1272. msg="MCU 已连接", data=message_data, device_status=1
  1273. )
  1274. self.connect_state = True
  1275. self.is_running = True
  1276. print("MCU 已连接")
  1277. logger.info("MCU 已连接")
  1278. self.port_name = port_name
  1279. # time.sleep(2)
  1280. loop = asyncio.get_event_loop()
  1281. # # 异步处理
  1282. loop.create_task(self.initDevice(), name="initDevice")
  1283. return True, None
  1284. print("MCU 连接失败")
  1285. logger.info("MCU 连接失败")
  1286. # for port in self.p_list:
  1287. # logger.info(
  1288. # "MCU 连接失败处理list移除操作,self port name %s,p_list:%s",
  1289. # port_name,
  1290. # self.p_list,
  1291. # )
  1292. # if port == port_name:
  1293. # logger.info("MCU 连接失败处理list移除操作,移除 %s", port_name)
  1294. # self.p_list.remove(port)
  1295. # self.remove_port(port)
  1296. message_data = {
  1297. "_type": "show_info",
  1298. "plugins_mode": "mcu",
  1299. "data": "MCU 连接失败",
  1300. }
  1301. self.sendSocketMessage(msg="MCU 连接失败", data=message_data, device_status=-1)
  1302. self.close_connect()
  1303. return False, None
  1304. def close_connect(self):
  1305. self.port_name = ""
  1306. if self.serial_ins:
  1307. self.serial_ins.close_serial_port()
  1308. self.is_running = False
  1309. self.connect_state = False
  1310. self.connected_ports_dict = {} # 已连接的ports
  1311. # self.p_list = []
  1312. # self.temp_ports_dict = {}
  1313. self.init_state = False
  1314. print("关闭MCU")
  1315. logger.info("关闭MCU")
  1316. def close_lineConnect(self):
  1317. """'关闭有线遥控器连接"""
  1318. self.line_control.port_name = ""
  1319. self.line_control.close_connect()
  1320. print("关闭有线遥控器")
  1321. logger.info("关闭有线遥控器")
  1322. @property
  1323. def mcu_move_state(self):
  1324. if self.is_get_mcu_state is False:
  1325. self._mcu_move_state = 2
  1326. # self.action_state = 2
  1327. else:
  1328. if self.m_t == 1:
  1329. if (
  1330. self.state_camera_motor == 2
  1331. and self.state_camera_steering == 2
  1332. and self.state_turntable_steering == 2
  1333. and self.state_overturn_steering == 2
  1334. ):
  1335. self._mcu_move_state = 2
  1336. else:
  1337. self._mcu_move_state = 1
  1338. else:
  1339. if (
  1340. self.state_camera_motor == 2
  1341. and self.state_camera_steering == 2
  1342. and self.state_turntable_steering == 2
  1343. and self.state_overturn_steering == 2
  1344. and self.state_move_turntable_steering == 2
  1345. ):
  1346. self._mcu_move_state = 2
  1347. else:
  1348. self._mcu_move_state = 1
  1349. # self._mcu_move_state = 2
  1350. return self._mcu_move_state
  1351. def to_deal_device(self, device_name, value=1, _type=0, times=1, delay=0):
  1352. """
  1353. value 激光0关 1开
  1354. mp3_player value 表示0表示关,1表示开,_type 表示歌曲切换到指定歌曲
  1355. delay:延迟处理,单位为0.1秒,即delay=100时,表示延迟10秒
  1356. """
  1357. device_id = self.device_name_dict[device_name]
  1358. if device_name == "buzzer":
  1359. value = int(value)
  1360. cmd = 3
  1361. data = [
  1362. cmd,
  1363. device_id,
  1364. value,
  1365. _type,
  1366. times,
  1367. delay,
  1368. ]
  1369. self.add_send_data_queue(data)
  1370. # if self.serial_ins:
  1371. # self.serial_ins.write_cmd(data)
  1372. return True
  1373. def to_device_move(
  1374. self,
  1375. device_name,
  1376. value=0,
  1377. max_speed=None,
  1378. up_speed=None,
  1379. down_speed=None,
  1380. _is_debug=0,
  1381. is_relative=0,
  1382. is_deviation=1,
  1383. times=2, is_response=False
  1384. ):
  1385. """
  1386. 此处输入单位为 毫米,以及度 需要先缩小,再放大
  1387. """
  1388. self.seed += 1
  1389. if self.seed > 9000:
  1390. self.seed = 1
  1391. print("移动", time.time())
  1392. logger.info("移动,%s", time.time())
  1393. speed = settings.moveSpeed()
  1394. cmd = 1
  1395. device_id = self.device_name_dict[device_name]
  1396. # if device_id != 1:
  1397. # print("F非MCU设备,禁止处理")
  1398. # return
  1399. print("正在执行", device_name)
  1400. logger.info("正在执行 %s", device_name)
  1401. match device_name:
  1402. case "camera_high_motor":
  1403. # value 单位毫米
  1404. # max_speed = 10000 if max_speed is None else max_speed
  1405. # up_speed = 800 if up_speed is None else up_speed
  1406. # down_speed = 700 if down_speed is None else down_speed
  1407. max_speed = (
  1408. speed[device_name]["max_speed"] if max_speed is None else max_speed
  1409. )
  1410. up_speed = (
  1411. speed[device_name]["up_speed"] if up_speed is None else up_speed
  1412. )
  1413. down_speed = (
  1414. speed[device_name]["down_speed"]
  1415. if down_speed is None
  1416. else down_speed
  1417. )
  1418. value = value / 10 # value 单位毫米
  1419. assert 0 <= value <= 140
  1420. assert 0 <= max_speed <= 10000
  1421. case "camera_steering":
  1422. # 角度为度 未放大 精确到0.1度
  1423. max_speed = 6000 if max_speed is None else max_speed
  1424. up_speed = 500 if up_speed is None else up_speed
  1425. down_speed = 500 if down_speed is None else down_speed
  1426. assert -360 <= value <= 360
  1427. case "turntable_steering":
  1428. # 角度为度 未放大 精确到0.1度
  1429. # max_speed = 6000 if max_speed is None else max_speed
  1430. # up_speed = 500 if up_speed is None else up_speed
  1431. # down_speed = 400 if down_speed is None else down_speed
  1432. max_speed = (
  1433. speed[device_name]["max_speed"] if max_speed is None else max_speed
  1434. )
  1435. up_speed = (
  1436. speed[device_name]["up_speed"] if up_speed is None else up_speed
  1437. )
  1438. down_speed = (
  1439. speed[device_name]["down_speed"]
  1440. if down_speed is None
  1441. else down_speed
  1442. )
  1443. assert -720 <= value <= 720
  1444. case "overturn_steering":
  1445. # 角度为度 未放大 精确到0.1度
  1446. max_speed = 2 if max_speed is None else max_speed
  1447. up_speed = 1 if up_speed is None else up_speed
  1448. down_speed = 1 if down_speed is None else down_speed
  1449. assert 0 <= value <= 360
  1450. case "turntable_position_motor":
  1451. # value 单位毫米
  1452. max_speed = 11000 if max_speed is None else max_speed
  1453. up_speed = 900 if up_speed is None else up_speed
  1454. down_speed = 900 if down_speed is None else down_speed
  1455. value = value / 10 # value 单位毫米
  1456. assert 0 <= value <= 900
  1457. assert 0 <= max_speed <= 15000
  1458. _dir = True if value >= 0 else False
  1459. value = int(abs(value * 10)) # 此处value赋值后,单位为mm以及0.1度
  1460. print("准备执行", device_name, value)
  1461. logger.info("准备执行,%s %s", device_name, value)
  1462. data = [
  1463. cmd,
  1464. device_id,
  1465. 1 if _dir else 0,
  1466. 0xFF & value >> 8,
  1467. 0xFF & value,
  1468. 0xFF & max_speed >> 8,
  1469. 0xFF & max_speed,
  1470. 0xFF & up_speed >> 8,
  1471. 0xFF & up_speed,
  1472. 0xFF & down_speed >> 8,
  1473. 0xFF & down_speed,
  1474. _is_debug,
  1475. is_deviation,
  1476. is_relative,
  1477. times, # 重试次数
  1478. 0xff & self.seed >> 8, # 随机种子
  1479. 0xff & self.seed, # 随机种子
  1480. 1 if is_response is True else 0, # 是否返回内容
  1481. ]
  1482. self.add_send_data_queue(data)
  1483. current_time = time.time()
  1484. self.last_move_time = current_time
  1485. def to_get_mcu_base_info(self):
  1486. if self.connect_state:
  1487. self.lock.acquire()
  1488. # print('==========================>1111')
  1489. print("-------------------to_get_mcu_base_info--------------------------")
  1490. data = [self.command["get_all_info"], 1]
  1491. f = True
  1492. try:
  1493. self.serial_ins.write_cmd(data)
  1494. except:
  1495. f = False
  1496. pass
  1497. self.lock.release()
  1498. if not f:
  1499. self.connect_state = False
  1500. return False
  1501. else:
  1502. return True
  1503. def check_before_action(self):
  1504. if self.state != 2:
  1505. print("check_before_action 设备正在运行中~")
  1506. logger.info("check_before_action 设备正在运行中~")
  1507. self.sendSocketMessage(code=1, msg="设备正在运行中", device_status=1)
  1508. return False
  1509. if self.mcu_move_state != 2:
  1510. if settings.IS_LIN_SHI_TEST:
  1511. return True
  1512. # self.show_info("mcu 非停止状态")
  1513. self.sendSocketMessage(code=1, msg="mcu 非停止状态", device_status=1)
  1514. return True
  1515. async def controlDevice(self, device_name, value):
  1516. """控制设备移动等"""
  1517. await asyncio.sleep(0.01)
  1518. if not self.is_running:
  1519. self.sendSocketMessage(
  1520. code=1, msg="mcu设备未连接,请先连接设备", device_status=0
  1521. )
  1522. return False
  1523. if not self.init_state:
  1524. self.sendSocketMessage(code=1, msg="mcu设备未初始化", device_status=4)
  1525. return False
  1526. _is_debug = 1 if settings.IS_DEBUG == "true" else 0
  1527. is_deviation = 0 if settings.IS_DEBUG == "true" else 1
  1528. print("控制设备==>_is_debug", _is_debug)
  1529. logger.info("控制设备==>_is_debug %s", _is_debug)
  1530. match device_name:
  1531. case "camera_high_motor":
  1532. # 相机电机
  1533. print(device_name, value)
  1534. self.to_device_move(
  1535. device_name=device_name,
  1536. value=float(value),
  1537. )
  1538. self.to_device_move(
  1539. device_name=device_name,
  1540. value=float(value),
  1541. )
  1542. case "camera_steering":
  1543. print(device_name, value)
  1544. # 相机舵机
  1545. self.to_device_move(
  1546. device_name=device_name,
  1547. value=float(value),
  1548. )
  1549. self.to_device_move(
  1550. device_name=device_name,
  1551. value=float(value),
  1552. )
  1553. case "turntable_steering":
  1554. # 转盘舵机
  1555. self.to_device_move(
  1556. device_name=device_name,
  1557. value=float(value),
  1558. )
  1559. self.to_device_move(
  1560. device_name=device_name,
  1561. value=float(value),
  1562. )
  1563. case "turntable_position_motor":
  1564. # 转盘舵机
  1565. self.to_device_move(
  1566. device_name=device_name,
  1567. value=float(value),
  1568. )
  1569. self.to_device_move(
  1570. device_name=device_name,
  1571. value=float(value),
  1572. )
  1573. case "overturn_steering":
  1574. # 翻板舵机中位
  1575. self.to_deal_device(
  1576. device_name="overturn_steering",
  1577. )
  1578. case "laser_position":
  1579. self.to_deal_device(
  1580. device_name="laser_position", value=0 if int(value) <= 0 else 1
  1581. )
  1582. case "take_picture":
  1583. # loop = asyncio.get_event_loop()
  1584. # if value>0:
  1585. # # 指定自动对焦
  1586. # loop.create_task(
  1587. # self.smart_shooter.CameraAutofocus(),
  1588. # name="CameraAutofocus",
  1589. # )
  1590. # 拍照
  1591. await self.smart_shooter.CameraShooter(msg_type="run_mcu")
  1592. case "to_deal_device":
  1593. self.to_deal_device(device_name, value=value, _type=0, times=1)
  1594. case _:
  1595. pass
  1596. def checkDevice(self):
  1597. print("检查设备是否运行中")
  1598. logger.info("检查设备是否运行中")
  1599. if not self.is_running:
  1600. self.sendSocketMessage(
  1601. code=1, msg="mcu设备未连接,请先连接设备", device_status=0
  1602. )
  1603. return False
  1604. if self.init_state is not True:
  1605. self.sendSocketMessage(code=1, msg="mcu设备未初始化", device_status=4)
  1606. return False
  1607. if self.action_state != 2:
  1608. self.sendSocketMessage(
  1609. code=1,
  1610. msg="当前有未完成的任务,请稍后再试",
  1611. device_status=0,
  1612. )
  1613. return False
  1614. async def run_mcu_config(
  1615. self, config_list, goods_art_no, action_info, smart_shooter
  1616. ):
  1617. if self.checkDevice() == False:
  1618. return
  1619. image_counts = 0
  1620. if config_list:
  1621. action_names = []
  1622. record_ids = []
  1623. if len(config_list) > 1:
  1624. if config_list[-1]["take_picture"] is True:
  1625. new_init_config = copy.copy(config_list[0])
  1626. new_init_config["action_name"] = "移动到初始位"
  1627. new_init_config["number_focus"] = 0
  1628. new_init_config["take_picture"] = False
  1629. new_init_config["shoe_upturn"] = False
  1630. new_init_config["pre_delay"] = 0.0
  1631. new_init_config["after_delay"] = 0.0
  1632. # new_init_config["point_name"] = "A"
  1633. new_init_config["is_move_device"] = True
  1634. new_init_config["led_switch"] = True
  1635. new_init_config["turntable_angle"] = 0.0
  1636. new_init_config["is_wait"] = False
  1637. new_init_config["is_need_confirm"] = False
  1638. config_list.append(new_init_config)
  1639. for idx, item in enumerate(config_list):
  1640. is_take_picture = item["take_picture"]
  1641. action_id = item["id"]
  1642. record_id = -1
  1643. if is_take_picture:
  1644. image_counts += 1
  1645. # 批量插入
  1646. image_deal_mode = 0 if action_info == "执行左脚程序" else 1
  1647. state, record_id = await insert_photo_records(
  1648. image_deal_mode=image_deal_mode,
  1649. goods_art_no=goods_art_no,
  1650. image_index=idx,
  1651. action_id=action_id,
  1652. )
  1653. config_list[idx]["record_id"] = record_id
  1654. total_len = len(config_list)
  1655. self.action_state = 1
  1656. self.msg_type = "image_process"
  1657. self.sendSocketMessage(
  1658. code=0,
  1659. msg="MCU 命令已发送完成",
  1660. device_status=2,
  1661. data={
  1662. "goods_art_no": goods_art_no,
  1663. "image_counts": image_counts,
  1664. "action_names": action_names,
  1665. "current_time": datetime.datetime.now(settings.TIME_ZONE).strftime(
  1666. "%Y-%m-%d %H:%M:%S"
  1667. ),
  1668. },
  1669. )
  1670. await self.controlDevice("laser_position", 0)
  1671. # await smart_shooter.EnableCameraPreview(
  1672. # enable_status=True, msg_type="smart_shooter_enable_preview"
  1673. # )
  1674. self.msg_type = "mcu"
  1675. self.is_runn_action = True
  1676. for index, action in enumerate(config_list):
  1677. # await asyncio.sleep(0.01)
  1678. if self.is_stop_action == True:
  1679. print("停止命令接收,立即终止")
  1680. logger.info("停止命令接收,立即终止")
  1681. break
  1682. # action_is_take_picture = action["take_picture"]
  1683. record_id = action["record_id"]
  1684. image_index = -1
  1685. if record_id == -1:
  1686. image_index = -1
  1687. else:
  1688. image_index = index
  1689. program_item = ProgramItem(
  1690. websocket_manager=self.websocket_manager,
  1691. action_data=action,
  1692. mcu=self,
  1693. goods_art_no=goods_art_no,
  1694. image_index=image_index,
  1695. smart_shooter=smart_shooter,
  1696. record_id=record_id,
  1697. is_get_mcu_state=True,
  1698. )
  1699. program_item.last_move_time = self.last_move_time
  1700. if self.action_state != 1:
  1701. # 异常终止
  1702. print("action异常终止")
  1703. logger.info("action异常终止")
  1704. break
  1705. self.msg_type = "photo_take"
  1706. if not await program_item.run(total_len):
  1707. self.sendSocketMessage(
  1708. code=1,
  1709. msg="{} 执行失败~".format(program_item.action_name),
  1710. data={"goods_art_no": goods_art_no, "id": action_id},
  1711. device_status=0,
  1712. )
  1713. self.to_deal_device(device_name="buzzer", times=3)
  1714. break
  1715. else:
  1716. if program_item.action_name == "移动到初始位":
  1717. self.msg_type = "mcu"
  1718. break
  1719. self.sendSocketMessage(
  1720. code=0,
  1721. msg="{} 执行完成~".format(program_item.action_name),
  1722. data={"goods_art_no": goods_art_no, "id": record_id},
  1723. device_status=2,
  1724. )
  1725. self.msg_type = "mcu"
  1726. if index == total_len - 1:
  1727. pass
  1728. if self.is_stop_action == True:
  1729. self.msg_type = "run_mcu_stop"
  1730. self.sendSocketMessage(
  1731. code=0,
  1732. msg=f"货号:{goods_art_no},执行终止",
  1733. device_status=2,
  1734. )
  1735. self.is_stop_action = False
  1736. self.action_state = 2
  1737. self.is_runn_action = False
  1738. self.msg_type = "photo_take_finish"
  1739. self.sendSocketMessage(
  1740. code=0,
  1741. msg=f"货号:{goods_art_no},执行完成",
  1742. device_status=2,
  1743. )
  1744. self.msg_type = "mcu"
  1745. await self.controlDevice("laser_position", 1)
  1746. self.action_state = 2
  1747. # await smart_shooter.EnableCameraPreview(
  1748. # enable_status=False, msg_type="smart_shooter_enable_preview"
  1749. # )
  1750. async def run_mcu_config_single(
  1751. self,
  1752. config_info,
  1753. goods_art_no,
  1754. msg_type="run_mcu_single_finish",
  1755. image_index=-1,
  1756. smart_shooter=None,
  1757. action_id=-1,
  1758. ):
  1759. """独立拍照 仅作测试用"""
  1760. await asyncio.sleep(0.01)
  1761. if self.checkDevice() == False:
  1762. return
  1763. print("检查完成", config_info)
  1764. logger.info("检查完成 %s", config_info)
  1765. if config_info:
  1766. self.action_state = 1
  1767. self.msg_type = "mcu"
  1768. program_item = ProgramItem(
  1769. websocket_manager=self.websocket_manager,
  1770. action_data=config_info,
  1771. mcu=self,
  1772. goods_art_no=goods_art_no,
  1773. image_index=image_index,
  1774. smart_shooter=smart_shooter,
  1775. record_id=action_id,
  1776. is_get_mcu_state=False,
  1777. )
  1778. program_item.last_move_time = self.last_move_time
  1779. if self.action_state != 1:
  1780. # 异常终止
  1781. print("action异常终止")
  1782. logger.info("action异常终止")
  1783. return
  1784. program_item.smart_shooter = smart_shooter
  1785. await program_item.run(3)
  1786. self.msg_type = "mcu"
  1787. logger.info(
  1788. "发送 run_mcu_signle消息,{} 执行完成~".format(program_item.action_name)
  1789. )
  1790. self.sendSocketMessage(
  1791. code=0,
  1792. msg="{} 执行完成~".format(program_item.action_name),
  1793. data={"goods_art_no": goods_art_no, "id": action_id},
  1794. device_status=2,
  1795. )
  1796. self.action_state = 2
  1797. self.msg_type = "run_mcu_single"
  1798. logger.info("发送 run_mcu_signle消息执行完成")
  1799. self.sendSocketMessage(
  1800. code=0,
  1801. msg=f"执行完成",
  1802. device_status=2,
  1803. )
  1804. self.msg_type = "mcu"
  1805. else:
  1806. self.sendSocketMessage(
  1807. code=1, msg="未查询到重拍记录得配置信息,请确认", device_status=0
  1808. )
  1809. self.action_state = 2
  1810. async def only_take_photo(self, goods_art_no, image_index, record_id):
  1811. await asyncio.sleep(0.1)
  1812. print("only_take_photo=====>", goods_art_no, image_index, record_id)
  1813. logger.info(
  1814. f"only_take_photo=====> {goods_art_no} {image_index} {record_id}"
  1815. )
  1816. if goods_art_no == "":
  1817. print("only_take_photo 数据查询异常")
  1818. logger.info("only_take_photo 数据查询异常")
  1819. return
  1820. # 关闭led
  1821. self.controlDevice("laser_position", 0)
  1822. program_item = ProgramItem(
  1823. websocket_manager=self.websocket_manager,
  1824. action_data={},
  1825. mcu=self,
  1826. goods_art_no=goods_art_no,
  1827. image_index=image_index,
  1828. record_id=record_id,
  1829. )
  1830. program_item.digicam_take_picture()
  1831. # 打开led
  1832. self.controlDevice("laser_position", 1)
  1833. async def checkMcuConnection(device_ctrl: DeviceControl):
  1834. if device_ctrl.is_running == True:
  1835. message = {
  1836. "_type": "select_port_name",
  1837. "plugins_mode": "auto_select_com",
  1838. "data": device_ctrl.temp_ports_dict,
  1839. }
  1840. device_ctrl.device_status = 2
  1841. device_ctrl.sendSocketMessage(code=0, msg="MCU连接成功", data=message)
  1842. return
  1843. if device_ctrl.is_init_while == True:
  1844. logger.info("mcu 初始化循环已创建,请勿重复创建")
  1845. device_ctrl.sendSocketMessage(
  1846. code=0, msg="mcu 初始化循环已创建,请勿重复创建", data={}
  1847. )
  1848. return
  1849. device_ctrl.is_init_while = True
  1850. """实时检测串口是否连接"""
  1851. while True:
  1852. await asyncio.sleep(1)
  1853. if device_ctrl.mcu_exit:
  1854. break
  1855. ports_dict = device_ctrl.scan_serial_port()
  1856. device_ctrl.temp_ports_dict = ports_dict
  1857. # print("device_ctrl.p_list", device_ctrl.p_list)
  1858. # logger.info("device_ctrl.p_list %s", device_ctrl.p_list)
  1859. if not ports_dict:
  1860. # 全部清空 移除所有串口
  1861. if device_ctrl.p_list:
  1862. _p = device_ctrl.p_list.pop()
  1863. device_ctrl.remove_port(_p)
  1864. continue
  1865. if ports_dict:
  1866. for index, _i in enumerate(device_ctrl.p_list):
  1867. if _i not in ports_dict:
  1868. _p = device_ctrl.p_list.pop(index)
  1869. device_ctrl.remove_port(_p)
  1870. for _port_name, _port_value in ports_dict.items():
  1871. if _port_name not in device_ctrl.p_list:
  1872. try:
  1873. flag = await device_ctrl.add_port_by_linkage(_port_name)
  1874. if not flag:
  1875. continue
  1876. device_ctrl.p_list.append(_port_name)
  1877. except BaseException as e:
  1878. print("串口不存在{} {}".format(_port_name, e))
  1879. logger.info("串口不存在{} {}".format(_port_name, e))
  1880. device_ctrl.is_init_while = False
  1881. print("MCU断开连接,已释放")
  1882. logger.info("MCU断开连接,已释放")