DeviceControl.py 75 KB

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