conifg_info.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  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 is_camera_has_focal(self):
  123. """
  124. 是否有定焦器
  125. """
  126. data = {"addr": 208}
  127. is_camera_has_focal = self.get_dynamic_value(data)
  128. if is_camera_has_focal:
  129. return True
  130. return False
  131. def _init_config_keys(self):
  132. # test keys
  133. # self.test_key1 = 0.5
  134. # self._set_key_float(_key="test_key1", _addr=1, _precision=2)
  135. # self.test_key2 = 1
  136. # self._set_key_int(_key="test_key2", _addr=2, _tips="测试-2")
  137. # 升降机上次命令位置
  138. self.camera_high_motor_target_value = 0
  139. self._set_key_float(
  140. _key="camera_high_motor_target_value",
  141. _addr=3,
  142. _tips="升降机当前位置",
  143. _readonly=True,
  144. )
  145. # 相机角度上次命令位置
  146. self.camera_steering_target_value = 0
  147. self._set_key_float(
  148. _key="camera_steering_target_value",
  149. _addr=4,
  150. _tips="相机角度上次命令位置",
  151. _readonly=True,
  152. )
  153. # ---------------------50开始处理--------------------
  154. # 升降机当前实时位置
  155. self.camera_high_motor_current_value = 0
  156. self._set_key_float(
  157. _key="camera_high_motor_current_value",
  158. _addr=51,
  159. _tips="升降机当前实时位置",
  160. _readonly=True,
  161. )
  162. # 相机角度当前实时位置
  163. self.camera_steering_current_value = 0
  164. self._set_key_float(
  165. _key="camera_steering_current_value",
  166. _addr=52,
  167. _tips="相机角度当前实时位置",
  168. _readonly=True,
  169. )
  170. # 转盘角度当前实时位置
  171. self.turntable_steering_current_value = 0
  172. self._set_key_float(
  173. _key="turntable_steering_current_value",
  174. _addr=53,
  175. _tips="转盘角度当前实时位置",
  176. _readonly=True,
  177. )
  178. # 转盘前后当前实时位置
  179. self.move_turntable_steering_current_value = 0
  180. self._set_key_float(
  181. _key="move_turntable_steering_current_value",
  182. _addr=54,
  183. _tips="转盘前后当前实时位置",
  184. _readonly=True,
  185. )
  186. # 翻板通讯是否正常
  187. self.over_steering_is_online = 0
  188. self._set_key_int(
  189. _key="over_steering_is_online",
  190. _addr=55,
  191. _tips="翻板是否在线",
  192. _readonly=True,
  193. )
  194. # --------------------------基础设置--------------从ID 100开始
  195. # 自动关机时间;单位秒
  196. self.auto_power_off_diff_time = 7200
  197. self._set_key_int(
  198. _key="auto_power_off_diff_time", _addr=101, _tips="自动关机时间单位秒"
  199. )
  200. # 自动去使能;单位秒 MOTOR_TO_DISABLE
  201. self.auto_motor_disable_diff_time = 180
  202. self._set_key_int(
  203. _key="auto_motor_disable_diff_time", _addr=102, _tips="自动去使能时间单位秒"
  204. )
  205. # 220V继电器是否转换方向
  206. self.relay_220v_is_change_dir = 0
  207. self._set_key_int(
  208. _key="relay_220v_is_change_dir", _addr=103, _tips="220V继电器是否转换方向"
  209. )
  210. # 伺服急停继电器是否转换方向
  211. self.relay_motor_stop_is_change_dir = 0
  212. self._set_key_int(
  213. _key="relay_motor_stop_is_change_dir",
  214. _addr=104,
  215. _tips="伺服急停继电器是否转换方向",
  216. )
  217. # 刹车继电器是否转换方向
  218. self.relay_brake_is_change_dir = 0
  219. self._set_key_int(
  220. _key="relay_brake_is_change_dir", _addr=105, _tips="刹车继电器是否转换方向"
  221. )
  222. # 增加升降的限位高度,单位mm
  223. self.camera_high_motor_max_height = 387
  224. self._set_key_int(
  225. _key="camera_high_motor_max_height", _addr=106, _tips="升降的限位高度"
  226. )
  227. # 是否检查设备是否在线
  228. self.is_check_motor_online = 1
  229. self._set_key_int(
  230. _key="is_check_motor_online", _addr=107, _tips="是否检查设备是否在线"
  231. )
  232. # 是否检查设备是否堵转
  233. self.is_check_motor_blocked = 1
  234. self._set_key_int(
  235. _key="is_check_motor_blocked", _addr=108, _tips="是否检查设备是否堵转"
  236. )
  237. # 是否完成设备自动参数设定
  238. self.has_been_set_motor_config = 0
  239. self._set_key_int(
  240. _key="has_been_set_motor_config",
  241. _addr=109,
  242. _tips="是否完成设备自动参数设定",
  243. )
  244. # 校准角度方向
  245. self.angle_diff_dir = 0
  246. self._set_key_int(_key="angle_diff_dir", _addr=110, _tips="校准角度方向")
  247. # LED的默认亮度
  248. self.led_default_brightness = 60
  249. self._set_key_int(
  250. _key="led_default_brightness", _addr=111, _tips="LED的默认亮度"
  251. )
  252. # 是否自动关闭使能
  253. self.is_auto_motor_to_disable = 1
  254. self._set_key_int(
  255. _key="is_auto_motor_to_disable", _addr=112, _tips="是否自动关闭使能"
  256. )
  257. # 转盘转速比
  258. self.turntable_steering_angle_ratio = 35.6
  259. self._set_key_float(
  260. _key="turntable_steering_angle_ratio", _addr=113, _tips="转盘转速比"
  261. )
  262. # LED灯的数量
  263. self.led_count = 20
  264. self._set_key_int(_key="led_count", _addr=114, _tips="LED灯的数量")
  265. # 转盘前后移动设备的初始化模式 1表示碰撞 0表示限位
  266. self.turntable_move_to_init_mode = 0
  267. self._set_key_int(
  268. _key="turntable_move_to_init_mode",
  269. _addr=115,
  270. _tips="转盘前后移动设备的初始化模式 1表示碰撞 0表示限位",
  271. )
  272. # 是否测试
  273. self.is_test = 0
  274. self._set_key_int(_key="is_test", _addr=116, _tips="is_test")
  275. # 电机停止速度检测
  276. self.low_speed = 300
  277. self._set_key_int(_key="low_speed", _addr=117, _tips="电机停止速度检测")
  278. # 自动发送基础信息
  279. self.is_auto_send_base_info = 0
  280. self._set_key_int(
  281. _key="is_auto_send_base_info", _addr=118, _tips="自动发送基础信息"
  282. )
  283. # 失去使能升降自动归零
  284. self.disable_camera_high_to_zero = 0
  285. self._set_key_int(
  286. _key="disable_camera_high_to_zero", _addr=119, _tips="失去使能升降自动归零"
  287. )
  288. # 前后移动电机初始化后距离
  289. self.front_rear_motor_init_distance = 0
  290. self._set_key_int(
  291. _key="front_rear_motor_init_distance",
  292. _addr=120,
  293. _tips="前后移动电机初始化后距离",
  294. )
  295. # 每秒自动检查电机是否停止
  296. self.auto_check_motor_stop = 0
  297. self._set_key_int(
  298. _key="auto_check_motor_stop", _addr=121, _tips="每秒自动检查电机是否停止"
  299. )
  300. # 前后移动电机是否存在
  301. self.turntable_move_is_exist = 1
  302. self._set_key_int(
  303. _key="turntable_move_is_exist", _addr=122, _tips="前后移动电机是否存在"
  304. )
  305. # 升降电机的到位偏差
  306. self.camera_high_motor_arrived_deviation = 100
  307. self._set_key_int(
  308. _key="camera_high_motor_arrived_deviation", _addr=123, _tips="升降电机的到位偏差"
  309. )
  310. # 相机角度电机的到位偏差
  311. self.camera_steering_arrived_deviation = 100
  312. self._set_key_int(
  313. _key="camera_steering_arrived_deviation", _addr=124, _tips="相机角度电机的到位偏差"
  314. )
  315. # 焦段电机的到位偏差
  316. self.camera_zoom_arrived_deviation = 100
  317. self._set_key_int(
  318. _key="camera_zoom_arrived_deviation", _addr=125, _tips="焦段电机的到位偏差"
  319. )
  320. # 前后移动电机的到位偏差
  321. self.move_turntable_arrived_deviation = 100
  322. self._set_key_int(
  323. _key="move_turntable_arrived_deviation", _addr=126, _tips="前后移动电机的到位偏差"
  324. )
  325. # 转盘角度电机的到位偏差
  326. self.turntable_steering_arrived_deviation = 100
  327. self._set_key_int(
  328. _key="turntable_steering_arrived_deviation", _addr=127, _tips="转盘角度电机的到位偏差"
  329. )
  330. # 转盘转速比例
  331. self.turntable_speed_raito = 1.0
  332. self._set_key_float(
  333. _key="turntable_speed_raito", _addr=128, _tips="转盘转速比例"
  334. )
  335. # 变焦初始化力矩
  336. self.c_torque_max_electric = 800
  337. self._set_key_int(
  338. _key="c_torque_max_electric", _addr=129, _tips="变焦初始化力矩"
  339. )
  340. # 变焦运动方向
  341. self.zoom_dir = 0
  342. self._set_key_int(
  343. _key="zoom_dir", _addr=130, _tips="变焦运动方向"
  344. )
  345. # -------------------------------------
  346. # 转盘偏移角度 单位1度
  347. self.turntable_steering_deviation = 0
  348. self._set_key_float(
  349. _key="turntable_steering_deviation", _addr=200, _tips="转盘偏移角度"
  350. )
  351. # 相机偏移角度 单位1度
  352. self.camera_steering_deviation = 0
  353. self._set_key_float(
  354. _key="camera_steering_deviation", _addr=201, _tips="相机偏移角度"
  355. )
  356. # 升降偏移距离mm
  357. self.camera_high_motor_deviation = 0
  358. self._set_key_int(
  359. _key="camera_high_motor_deviation", _addr=202, _tips="升降偏移距离mm"
  360. )
  361. # 翻板中位 单位1度
  362. self.overturn_steering_middle = 95
  363. self._set_key_float(
  364. _key="overturn_steering_middle", _addr=203, _tips="翻板中位 单位0.1度"
  365. )
  366. # 翻板高位 单位1度
  367. self.overturn_steering_high = 150
  368. self._set_key_float(
  369. _key="overturn_steering_high", _addr=204, _tips="翻板高位 单位0.1度"
  370. )
  371. # 翻板上升速度
  372. self.overturn_steering_up_speed = 2
  373. self._set_key_int(
  374. _key="overturn_steering_up_speed", _addr=205, _tips="翻板上升速度"
  375. )
  376. # 翻板下降速度
  377. self.overturn_steering_down_speed = 4
  378. self._set_key_int(
  379. _key="overturn_steering_down_speed", _addr=206, _tips="翻板下降速度"
  380. )
  381. # 是否完成初始化
  382. self.has_been_set = 0
  383. self._set_key_int(
  384. _key="has_been_set", _addr=207, _tips="是否完成初始化", _readonly=True
  385. )
  386. # 相机调焦功能支持
  387. self.camera_has_focal = 0
  388. self._set_key_int(_key="camera_has_focal", _addr=208, _tips="相机调焦功能支持")
  389. # 相机焦段最大运动距离
  390. self.camera_max_distance = 8000
  391. self._set_key_int(_key="camera_max_distance", _addr=209, _tips="相机焦段最大运动距离")
  392. # 相机焦段步进ratio
  393. self.camera_focal_ratio = 0.0
  394. self._set_key_float(
  395. _key="camera_focal_ratio", _addr=210, _tips="相机焦段步进ratio"
  396. )
  397. # 相机焦段当前实时位置
  398. self.camera_zoom_motor_current_value = 0
  399. self._set_key_float(
  400. _key="camera_zoom_motor_current_value",
  401. _addr=211,
  402. _tips="相机焦段当前实时位置",
  403. _readonly=True,
  404. )
  405. # 伺服电机每次运动后的偏移数值
  406. self.servo_add_v = 0
  407. self._set_key_int(
  408. _key="servo_add_v", _addr=212, _tips="伺服电机每次运动后的偏移数值"
  409. )
  410. # =====================================================
  411. # 获取剩余内存
  412. self.get_memory = 0
  413. self._set_key_float(
  414. _key="get_memory", _addr=300, _tips="获取剩余内存", _readonly=True
  415. )
  416. # =====================================================
  417. # ===============调试用======================
  418. # 相机焦段功能设置
  419. self.camera_focal_set = 0
  420. self._set_key_float(
  421. _key="camera_focal_set", _addr=400, _tips="相机焦段功能设置", _readonly=True
  422. )