conifg_info.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. import functools
  2. def return_false_on_error(func):
  3. """装饰器:当函数执行出现异常时返回 False"""
  4. @functools.wraps(func)
  5. def wrapper(*args, **kwargs):
  6. try:
  7. return func(*args, **kwargs)
  8. except Exception as e:
  9. print(f"Error in {func.__name__}: {e}")
  10. return False
  11. return wrapper
  12. class ConfigManager:
  13. def __init__(self, device_control):
  14. self.CONFIG_METADATA = {}
  15. self.CONFIG_METADATA_BY_ADDR = {}
  16. self.device_control = device_control
  17. # 初始化配置项
  18. self._init_config_keys()
  19. def _set_key_float(self, _key, _addr, _tips="", _readonly=False, _precision=1):
  20. self.CONFIG_METADATA[_key] = {
  21. "addr": _addr,
  22. "tips": _tips,
  23. "readonly": _readonly,
  24. "type": "float",
  25. "precision": _precision,
  26. }
  27. if _addr in self.CONFIG_METADATA_BY_ADDR:
  28. print("{} 有重复".format(_addr))
  29. raise Exception("地址重复")
  30. self.CONFIG_METADATA_BY_ADDR[_addr] = _key
  31. def _set_key_int(self, _key, _addr, _tips="", _readonly=False, _precision=0):
  32. self.CONFIG_METADATA[_key] = {
  33. "addr": _addr,
  34. "tips": _tips,
  35. "readonly": _readonly,
  36. "type": "int",
  37. "precision": _precision,
  38. }
  39. if _addr in self.CONFIG_METADATA_BY_ADDR:
  40. print("{} 有重复".format(_addr))
  41. raise Exception("地址重复")
  42. self.CONFIG_METADATA_BY_ADDR[_addr] = _key
  43. def get_dynamic_value(self, data):
  44. cmd = [124]
  45. addr = data["addr"]
  46. cmd.extend([0xff & addr >> 8, 0xff & addr])
  47. data = self.device_control.get_basic_info_mcu_without_async(data=cmd)
  48. if not data:
  49. return False
  50. return_data = self.analysis_data(data[1:])
  51. if return_data:
  52. return str(return_data["value"])
  53. return False
  54. # 地址、正负、类型(整数、浮点)、精度(0.01)、数据(6个字节)、是否只读
  55. def set_dynamic_value(self, data):
  56. try:
  57. value = float(data["value"])
  58. except:
  59. return False
  60. addr = data['addr']
  61. print("config_data", value, addr)
  62. cmd = [125]
  63. cmd.extend(self.read_addr_value(value, addr))
  64. print("config_data cmd", cmd)
  65. data = self.device_control.get_basic_info_mcu_without_async(data=cmd)
  66. if not data:
  67. return False
  68. return_data = self.analysis_data(data[1:])
  69. if return_data:
  70. print("参数设置成功", return_data)
  71. return True
  72. return False
  73. def read_addr_value(self, value, addr):
  74. if addr not in self.CONFIG_METADATA_BY_ADDR:
  75. return []
  76. try:
  77. buf = []
  78. # 地址、正负、类型(整数、浮点)、精度(0.01)、数据(6个字节)、是否只读
  79. __key_name = self.CONFIG_METADATA_BY_ADDR[addr]
  80. __meta = self.CONFIG_METADATA[__key_name]
  81. buf.extend([0xff & addr >> 8, 0xff & addr]) # 地址
  82. _read_only = 1 if __meta["readonly"] else 0 # 是否只读
  83. _dir = 1 if value >= 0 else 0 # 是否正负
  84. _type = 1 if __meta["type"] == "int" else 0 # 是否整数
  85. _precision = __meta["precision"] # 精度
  86. abs_int_value = int(abs(value * 10 ** __meta["precision"]))
  87. buf.extend([0xff & abs_int_value >> 40, 0xff & abs_int_value >> 32, 0xff & abs_int_value >> 24,
  88. 0xff & abs_int_value >> 16, 0xff & abs_int_value >> 8, 0xff & abs_int_value])
  89. buf.extend([_read_only, _dir, _type, _precision])
  90. print("127----buf-{}:{}".format(addr, buf))
  91. return buf
  92. except:
  93. return []
  94. @return_false_on_error
  95. def analysis_data(self, _data):
  96. _addr = _data[0] << 8 | _data[1]
  97. if _addr not in self.CONFIG_METADATA_BY_ADDR:
  98. return False
  99. start = 2
  100. _value = _data[start] << 40 | _data[start + 1] << 32 | _data[start + 2] << 24 | _data[start + 3] << 16 | \
  101. _data[start + 4] << 8 | _data[start + 5]
  102. start = start + 5
  103. _read_only = True if _data[start + 1] == 1 else False # 是否只读
  104. _dir = 1 if _data[start + 2] == 1 else -1
  105. _type = "int" if _data[start + 3] == 1 else "float"
  106. _precision = _data[start + 4]
  107. if _dir < 0:
  108. _value = _value * _dir
  109. if _type == "float":
  110. if _precision > 0:
  111. _round_x = _precision
  112. _precision = _precision * -1
  113. _value = _value * 10 ** _precision
  114. _value = round(_value, _round_x)
  115. else:
  116. _value = int(_value)
  117. return_data = {"addr": _addr,
  118. "key_name": self.CONFIG_METADATA_BY_ADDR[_addr],
  119. "readonly": _read_only,
  120. "value": _value}
  121. return return_data
  122. def camera_focal_data(self):
  123. """
  124. 定焦器参数获取
  125. """
  126. dataParams = {}
  127. data = [{"addr": 208, "key": "is_camera_has_focal"},
  128. {"addr": 209, "key": "camera_focal_distance"},
  129. {"addr": 210, "key": "camera_focal_ratio"}]
  130. for item in data:
  131. value = self.get_dynamic_value(item)
  132. match item["key"]:
  133. case "is_camera_has_focal":
  134. dataParams[item["key"]] = True if value else False
  135. case "camera_focal_distance":
  136. dataParams[item["key"]] = int(value)
  137. case "camera_focal_ratio":
  138. dataParams[item["key"]] = float(value)
  139. return dataParams
  140. def _init_config_keys(self):
  141. # test keys
  142. # self.test_key1 = 0.5
  143. # self._set_key_float(_key="test_key1", _addr=1, _precision=2)
  144. # self.test_key2 = 1
  145. # self._set_key_int(_key="test_key2", _addr=2, _tips="测试-2")
  146. # 升降机上次命令位置
  147. self.camera_high_motor_target_value = 0
  148. self._set_key_float(
  149. _key="camera_high_motor_target_value",
  150. _addr=3,
  151. _tips="升降机当前位置",
  152. _readonly=True,
  153. )
  154. # 相机角度上次命令位置
  155. self.camera_steering_target_value = 0
  156. self._set_key_float(
  157. _key="camera_steering_target_value",
  158. _addr=4,
  159. _tips="相机角度上次命令位置",
  160. _readonly=True,
  161. )
  162. # ---------------------50开始处理--------------------
  163. # 升降机当前实时位置
  164. self.camera_high_motor_current_value = 0
  165. self._set_key_float(
  166. _key="camera_high_motor_current_value",
  167. _addr=51,
  168. _tips="升降机当前实时位置",
  169. _readonly=True,
  170. )
  171. # 相机角度当前实时位置
  172. self.camera_steering_current_value = 0
  173. self._set_key_float(
  174. _key="camera_steering_current_value",
  175. _addr=52,
  176. _tips="相机角度当前实时位置",
  177. _readonly=True,
  178. )
  179. # 转盘角度当前实时位置
  180. self.turntable_steering_current_value = 0
  181. self._set_key_float(
  182. _key="turntable_steering_current_value",
  183. _addr=53,
  184. _tips="转盘角度当前实时位置",
  185. _readonly=True,
  186. )
  187. # 转盘前后当前实时位置
  188. self.move_turntable_steering_current_value = 0
  189. self._set_key_float(
  190. _key="move_turntable_steering_current_value",
  191. _addr=54,
  192. _tips="转盘前后当前实时位置",
  193. _readonly=True,
  194. )
  195. # 翻板通讯是否正常
  196. self.over_steering_is_online = 0
  197. self._set_key_int(
  198. _key="over_steering_is_online",
  199. _addr=55,
  200. _tips="翻板是否在线",
  201. _readonly=True,
  202. )
  203. # --------------------------基础设置--------------从ID 100开始
  204. # 自动关机时间;单位秒
  205. self.auto_power_off_diff_time = 7200
  206. self._set_key_int(
  207. _key="auto_power_off_diff_time", _addr=101, _tips="自动关机时间单位秒"
  208. )
  209. # 自动去使能;单位秒 MOTOR_TO_DISABLE
  210. self.auto_motor_disable_diff_time = 180
  211. self._set_key_int(
  212. _key="auto_motor_disable_diff_time", _addr=102, _tips="自动去使能时间单位秒"
  213. )
  214. # 220V继电器是否转换方向
  215. self.relay_220v_is_change_dir = 0
  216. self._set_key_int(
  217. _key="relay_220v_is_change_dir", _addr=103, _tips="220V继电器是否转换方向"
  218. )
  219. # 伺服急停继电器是否转换方向
  220. self.relay_motor_stop_is_change_dir = 0
  221. self._set_key_int(
  222. _key="relay_motor_stop_is_change_dir",
  223. _addr=104,
  224. _tips="伺服急停继电器是否转换方向",
  225. )
  226. # 刹车继电器是否转换方向
  227. self.relay_brake_is_change_dir = 0
  228. self._set_key_int(
  229. _key="relay_brake_is_change_dir", _addr=105, _tips="刹车继电器是否转换方向"
  230. )
  231. # 增加升降的限位高度,单位mm
  232. self.camera_high_motor_max_height = 387
  233. self._set_key_int(
  234. _key="camera_high_motor_max_height", _addr=106, _tips="升降的限位高度"
  235. )
  236. # 是否检查设备是否在线
  237. self.is_check_motor_online = 1
  238. self._set_key_int(
  239. _key="is_check_motor_online", _addr=107, _tips="是否检查设备是否在线"
  240. )
  241. # 是否检查设备是否堵转
  242. self.is_check_motor_blocked = 1
  243. self._set_key_int(
  244. _key="is_check_motor_blocked", _addr=108, _tips="是否检查设备是否堵转"
  245. )
  246. # 是否完成设备自动参数设定
  247. self.has_been_set_motor_config = 0
  248. self._set_key_int(
  249. _key="has_been_set_motor_config",
  250. _addr=109,
  251. _tips="是否完成设备自动参数设定",
  252. )
  253. # 校准角度方向
  254. self.angle_diff_dir = 0
  255. self._set_key_int(_key="angle_diff_dir", _addr=110, _tips="校准角度方向")
  256. # LED的默认亮度
  257. self.led_default_brightness = 60
  258. self._set_key_int(
  259. _key="led_default_brightness", _addr=111, _tips="LED的默认亮度"
  260. )
  261. # 是否自动关闭使能
  262. self.is_auto_motor_to_disable = 1
  263. self._set_key_int(
  264. _key="is_auto_motor_to_disable", _addr=112, _tips="是否自动关闭使能"
  265. )
  266. # 转盘转速比
  267. self.turntable_steering_angle_ratio = 35.6
  268. self._set_key_float(
  269. _key="turntable_steering_angle_ratio", _addr=113, _tips="转盘转速比"
  270. )
  271. # LED灯的数量
  272. self.led_count = 20
  273. self._set_key_int(_key="led_count", _addr=114, _tips="LED灯的数量")
  274. # 转盘前后移动设备的初始化模式 1表示碰撞 0表示限位
  275. self.turntable_move_to_init_mode = 0
  276. self._set_key_int(
  277. _key="turntable_move_to_init_mode",
  278. _addr=115,
  279. _tips="转盘前后移动设备的初始化模式 1表示碰撞 0表示限位",
  280. )
  281. # 是否测试
  282. self.is_test = 0
  283. self._set_key_int(_key="is_test", _addr=116, _tips="is_test")
  284. # 电机停止速度检测
  285. self.low_speed = 300
  286. self._set_key_int(_key="low_speed", _addr=117, _tips="电机停止速度检测")
  287. # 自动发送基础信息
  288. self.is_auto_send_base_info = 0
  289. self._set_key_int(
  290. _key="is_auto_send_base_info", _addr=118, _tips="自动发送基础信息"
  291. )
  292. # 失去使能升降自动归零
  293. self.disable_camera_high_to_zero = 0
  294. self._set_key_int(
  295. _key="disable_camera_high_to_zero", _addr=119, _tips="失去使能升降自动归零"
  296. )
  297. # 前后移动电机初始化后距离
  298. self.front_rear_motor_init_distance = 0
  299. self._set_key_int(
  300. _key="front_rear_motor_init_distance",
  301. _addr=120,
  302. _tips="前后移动电机初始化后距离",
  303. )
  304. # 每秒自动检查电机是否停止
  305. self.auto_check_motor_stop = 0
  306. self._set_key_int(
  307. _key="auto_check_motor_stop", _addr=121, _tips="每秒自动检查电机是否停止"
  308. )
  309. # 前后移动电机是否存在
  310. self.turntable_move_is_exist = 1
  311. self._set_key_int(
  312. _key="turntable_move_is_exist", _addr=122, _tips="前后移动电机是否存在"
  313. )
  314. # 升降电机的到位偏差
  315. self.camera_high_motor_arrived_deviation = 100
  316. self._set_key_int(
  317. _key="camera_high_motor_arrived_deviation", _addr=123, _tips="升降电机的到位偏差"
  318. )
  319. # 相机角度电机的到位偏差
  320. self.camera_steering_arrived_deviation = 100
  321. self._set_key_int(
  322. _key="camera_steering_arrived_deviation", _addr=124, _tips="相机角度电机的到位偏差"
  323. )
  324. # 焦段电机的到位偏差
  325. self.camera_zoom_arrived_deviation = 100
  326. self._set_key_int(
  327. _key="camera_zoom_arrived_deviation", _addr=125, _tips="焦段电机的到位偏差"
  328. )
  329. # 前后移动电机的到位偏差
  330. self.move_turntable_arrived_deviation = 100
  331. self._set_key_int(
  332. _key="move_turntable_arrived_deviation", _addr=126, _tips="前后移动电机的到位偏差"
  333. )
  334. # 转盘角度电机的到位偏差
  335. self.turntable_steering_arrived_deviation = 100
  336. self._set_key_int(
  337. _key="turntable_steering_arrived_deviation", _addr=127, _tips="转盘角度电机的到位偏差"
  338. )
  339. # 转盘转速比例
  340. self.turntable_speed_raito = 1.0
  341. self._set_key_float(
  342. _key="turntable_speed_raito", _addr=128, _tips="转盘转速比例"
  343. )
  344. # 变焦初始化力矩
  345. self.c_torque_max_electric = 800
  346. self._set_key_int(
  347. _key="c_torque_max_electric", _addr=129, _tips="变焦初始化力矩"
  348. )
  349. # 变焦运动方向
  350. self.zoom_dir = 0
  351. self._set_key_int(
  352. _key="zoom_dir", _addr=130, _tips="变焦运动方向"
  353. )
  354. # -------------------------------------
  355. # 转盘偏移角度 单位1度
  356. self.turntable_steering_deviation = 0
  357. self._set_key_float(
  358. _key="turntable_steering_deviation", _addr=200, _tips="转盘偏移角度"
  359. )
  360. # 相机偏移角度 单位1度
  361. self.camera_steering_deviation = 0
  362. self._set_key_float(
  363. _key="camera_steering_deviation", _addr=201, _tips="相机偏移角度"
  364. )
  365. # 升降偏移距离mm
  366. self.camera_high_motor_deviation = 0
  367. self._set_key_int(
  368. _key="camera_high_motor_deviation", _addr=202, _tips="升降偏移距离mm"
  369. )
  370. # 翻板中位 单位1度
  371. self.overturn_steering_middle = 95
  372. self._set_key_float(
  373. _key="overturn_steering_middle", _addr=203, _tips="翻板中位 单位0.1度"
  374. )
  375. # 翻板高位 单位1度
  376. self.overturn_steering_high = 150
  377. self._set_key_float(
  378. _key="overturn_steering_high", _addr=204, _tips="翻板高位 单位0.1度"
  379. )
  380. # 翻板上升速度
  381. self.overturn_steering_up_speed = 2
  382. self._set_key_int(
  383. _key="overturn_steering_up_speed", _addr=205, _tips="翻板上升速度"
  384. )
  385. # 翻板下降速度
  386. self.overturn_steering_down_speed = 4
  387. self._set_key_int(
  388. _key="overturn_steering_down_speed", _addr=206, _tips="翻板下降速度"
  389. )
  390. # 是否完成初始化
  391. self.has_been_set = 0
  392. self._set_key_int(
  393. _key="has_been_set", _addr=207, _tips="是否完成初始化", _readonly=True
  394. )
  395. # 相机调焦功能支持
  396. self.camera_has_focal = 0
  397. self._set_key_int(_key="camera_has_focal", _addr=208, _tips="相机调焦功能支持")
  398. # 相机焦段最大运动距离
  399. self.camera_max_distance = 8000
  400. self._set_key_int(_key="camera_max_distance", _addr=209, _tips="相机焦段最大运动距离")
  401. # 相机焦段步进ratio
  402. self.camera_focal_ratio = 0.0
  403. self._set_key_float(
  404. _key="camera_focal_ratio", _addr=210, _tips="相机焦段步进ratio"
  405. )
  406. # 相机焦段当前实时位置
  407. self.camera_zoom_motor_current_value = 0
  408. self._set_key_float(
  409. _key="camera_zoom_motor_current_value",
  410. _addr=211,
  411. _tips="相机焦段当前实时位置",
  412. _readonly=True,
  413. )
  414. # 伺服电机每次运动后的偏移数值
  415. self.servo_add_v = 0
  416. self._set_key_int(
  417. _key="servo_add_v", _addr=212, _tips="伺服电机每次运动后的偏移数值"
  418. )
  419. # =====================================================
  420. # 获取剩余内存
  421. self.get_memory = 0
  422. self._set_key_float(
  423. _key="get_memory", _addr=300, _tips="获取剩余内存", _readonly=True
  424. )
  425. # =====================================================
  426. # ===============调试用======================
  427. # 相机焦段功能设置
  428. self.camera_focal_set = 0
  429. self._set_key_float(
  430. _key="camera_focal_set", _addr=400, _tips="相机焦段功能设置", _readonly=True
  431. )