You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

301 lines
9.2 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "encoder.h"
  2. #include "zboard.h"
  3. #include <stdio.h>
  4. #include "zport.h"
  5. #include "udpclient.h"
  6. static encoder_light_state_t camera_encoder_state = STANDBY;
  7. static encoder_light_state_t driven_encoder_gear_state = STANDBY;
  8. static uint32_t camera_encoder_lastprocess = 0;
  9. static uint32_t driven_encoder_gear_lastprocess = 0;
  10. static bool camera_encoder_light_state;
  11. static bool driven_encoder_light_state;
  12. static encoder_t m_uarts[] = {
  13. {&camera_encoder, TIM_CHANNEL_1 | TIM_CHANNEL_2}, // 相机编码器
  14. {&driven_encoder_gear, TIM_CHANNEL_1 | TIM_CHANNEL_2} // 从动编码器
  15. };
  16. void encoder_all_start(void)
  17. {
  18. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  19. {
  20. HAL_TIM_Encoder_Start(m_uarts[i].tim_handler, m_uarts[i].tim_channel);
  21. }
  22. }
  23. void encoder_all_stop(void)
  24. {
  25. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  26. {
  27. HAL_TIM_Encoder_Stop(m_uarts[i].tim_handler, m_uarts[i].tim_channel);
  28. }
  29. }
  30. bool encoder_clear_counter(encoder_usage_t encoder)
  31. {
  32. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  33. {
  34. if (encoder == i)
  35. {
  36. __HAL_TIM_GET_COUNTER(m_uarts[i].tim_handler) = 0;
  37. return true;
  38. }
  39. }
  40. return false;
  41. }
  42. void encoder_all_clear_counter(void)
  43. {
  44. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  45. {
  46. __HAL_TIM_GET_COUNTER(m_uarts[i].tim_handler) = 0; // 计数器值重新置位
  47. }
  48. }
  49. bool encoder_read_with_encoder(encoder_usage_t encoder, uint32_t *encoder_value)
  50. {
  51. bool get_encoder_value_flag = false;
  52. switch (encoder)
  53. {
  54. case CAMERA_ENCODER:
  55. *encoder_value += (short)__HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler);
  56. __HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler) = 0; /* 清零 */
  57. get_encoder_value_flag = true;
  58. break;
  59. case DRIVEN_ENCODER_GEAR:
  60. *encoder_value += (short)__HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler);
  61. __HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler) = 0; /* 清零 */
  62. get_encoder_value_flag = true;
  63. break;
  64. default:
  65. break;
  66. }
  67. return get_encoder_value_flag;
  68. }
  69. void encoder_light_schedule(void)
  70. {
  71. if (camera_encoder_state == STANDBY)
  72. {
  73. if (sys_haspassedms(camera_encoder_lastprocess) > 500)
  74. {
  75. camera_encoder_lastprocess = HAL_GetTick();
  76. encoder_switch_toggle_on_off_state(CAMERA_ENCODER);
  77. }
  78. }
  79. if (driven_encoder_gear_state == STANDBY)
  80. {
  81. if (sys_haspassedms(driven_encoder_gear_lastprocess) > 500)
  82. {
  83. driven_encoder_gear_lastprocess = HAL_GetTick();
  84. encoder_switch_toggle_on_off_state(DRIVEN_ENCODER_GEAR);
  85. }
  86. }
  87. }
  88. void encoder_set_state(encoder_usage_t encoder, encoder_light_state_t state)
  89. {
  90. /* 主动上报的时候常亮,接收到触发指令直接翻转led,待机中0.5s周期闪烁 */
  91. if (encoder == CAMERA_ENCODER)
  92. {
  93. camera_encoder_state = state;
  94. if (state == STANDBY)
  95. {
  96. camera_encoder_lastprocess = HAL_GetTick();
  97. encoder_switch_toggle_on_off_state(CAMERA_ENCODER);
  98. }
  99. else if (state == WORKING)
  100. {
  101. /* 如果工作状态的时候触发了genlock等,灯的状态不应该变成待机状态,只有同为待机的时候闪烁,上层写的时候需要加判断 */
  102. encoder_light_switch_set_color_and_brightness(CAMERA_ENCODER, ENCODER_LIGHT_COLOR_BLUE, encoder_light_max_brightness);
  103. }
  104. }
  105. else if (encoder == DRIVEN_ENCODER_GEAR)
  106. {
  107. driven_encoder_gear_state = state;
  108. if (state == STANDBY)
  109. {
  110. driven_encoder_gear_lastprocess = HAL_GetTick();
  111. encoder_switch_toggle_on_off_state(DRIVEN_ENCODER_GEAR);
  112. }
  113. else if (state == WORKING)
  114. {
  115. encoder_light_switch_set_color_and_brightness(DRIVEN_ENCODER_GEAR, ENCODER_LIGHT_COLOR_BLUE, encoder_light_max_brightness);
  116. }
  117. }
  118. }
  119. encoder_light_state_t encoder_get_state(encoder_usage_t encoder)
  120. {
  121. if (encoder == CAMERA_ENCODER)
  122. {
  123. return camera_encoder_state;
  124. }
  125. else if (encoder == DRIVEN_ENCODER_GEAR)
  126. {
  127. return driven_encoder_gear_state;
  128. }
  129. return ENCODER_STATE_NUMBER_AND_ERR_STATE;
  130. }
  131. void encoder_all_encoder_clear_counter_and_structer_count(void)
  132. {
  133. udp_client_get_active_report_data_structer()->encoder_1_count = 0;
  134. udp_client_get_active_report_data_structer()->encoder_2_count = 0;
  135. encoder_all_clear_counter();
  136. }
  137. void encoder_switch_encoder_clear_count_and_structer_count(encoder_usage_t encoder)
  138. {
  139. switch (encoder)
  140. {
  141. case CAMERA_ENCODER:
  142. udp_client_get_active_report_data_structer()->encoder_1_count = 0;
  143. encoder_clear_counter(CAMERA_ENCODER);
  144. break;
  145. case DRIVEN_ENCODER_GEAR:
  146. udp_client_get_active_report_data_structer()->encoder_2_count = 0;
  147. encoder_clear_counter(DRIVEN_ENCODER_GEAR);
  148. break;
  149. default:
  150. break;
  151. }
  152. }
  153. /*
  154. R1:tim2-->TIM_CHANNEL_4
  155. G1:tim2-->TIM_CHANNEL_1
  156. B1:tim3-->TIM_CHANNEL_1
  157. R2:tim2-->TIM_CHANNEL_3
  158. G2:tim4-->TIM_CHANNEL_3
  159. B2:tim4-->TIM_CHANNEL_4
  160. */
  161. void encoder_light_switch_set_color_and_brightness(encoder_usage_t encoder, encoder_light_color_table_t color, uint16_t brightness)
  162. {
  163. uint16_t count;
  164. if (encoder == CAMERA_ENCODER)
  165. {
  166. switch (color)
  167. {
  168. case ENCODER_LIGHT_COLOR_RED:
  169. count = (1 - brightness / 1000.0) * __HAL_TIM_GET_AUTORELOAD(&htim2);
  170. __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, count);
  171. HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
  172. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);
  173. HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
  174. break;
  175. case ENCODER_LIGHT_COLOR_GREEN:
  176. count = (1 - brightness / 1000.0) * __HAL_TIM_GET_AUTORELOAD(&htim2);
  177. __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, count);
  178. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_4);
  179. HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
  180. HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
  181. break;
  182. case ENCODER_LIGHT_COLOR_BLUE:
  183. count = (1 - brightness / 1000.0) * __HAL_TIM_GET_AUTORELOAD(&htim3);
  184. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, count);
  185. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_4);
  186. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);
  187. HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  188. break;
  189. default:
  190. /* not find color */
  191. break;
  192. }
  193. }
  194. else if (encoder == DRIVEN_ENCODER_GEAR)
  195. {
  196. switch (color)
  197. {
  198. case ENCODER_LIGHT_COLOR_RED:
  199. count = (1 - brightness / 1000.0) * __HAL_TIM_GET_AUTORELOAD(&htim2);
  200. __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, count);
  201. HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
  202. HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_3);
  203. HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_4);
  204. break;
  205. case ENCODER_LIGHT_COLOR_GREEN:
  206. count = (1 - brightness / 1000.0) * __HAL_TIM_GET_AUTORELOAD(&htim4);
  207. __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, count);
  208. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_3);
  209. HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);
  210. HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_4);
  211. break;
  212. case ENCODER_LIGHT_COLOR_BLUE:
  213. count = (1 - brightness / 1000.0) * __HAL_TIM_GET_AUTORELOAD(&htim4);
  214. __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, count);
  215. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_3);
  216. HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_3);
  217. HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);
  218. break;
  219. default:
  220. /* not find color */
  221. break;
  222. }
  223. }
  224. else
  225. {
  226. // error
  227. }
  228. }
  229. void encoder_switch_close_light(encoder_usage_t encoder)
  230. {
  231. if (encoder == CAMERA_ENCODER)
  232. {
  233. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_4);
  234. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);
  235. HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
  236. }
  237. else if (encoder == DRIVEN_ENCODER_GEAR)
  238. {
  239. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_3);
  240. HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_3);
  241. HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_4);
  242. }
  243. else
  244. {
  245. // error
  246. }
  247. }
  248. void encoder_switch_toggle_on_off_state(encoder_usage_t encoder)
  249. {
  250. if (encoder == CAMERA_ENCODER)
  251. {
  252. if (camera_encoder_light_state)
  253. {
  254. encoder_switch_close_light(CAMERA_ENCODER);
  255. }
  256. else
  257. {
  258. encoder_light_switch_set_color_and_brightness(CAMERA_ENCODER, ENCODER_LIGHT_COLOR_BLUE, encoder_light_max_brightness);
  259. }
  260. camera_encoder_light_state = !camera_encoder_light_state;
  261. }
  262. else if (encoder == DRIVEN_ENCODER_GEAR)
  263. {
  264. if (driven_encoder_light_state)
  265. {
  266. encoder_switch_close_light(DRIVEN_ENCODER_GEAR);
  267. }
  268. else
  269. {
  270. encoder_light_switch_set_color_and_brightness(DRIVEN_ENCODER_GEAR, ENCODER_LIGHT_COLOR_BLUE, encoder_light_max_brightness);
  271. }
  272. driven_encoder_light_state = !driven_encoder_light_state;
  273. }
  274. else
  275. {
  276. // error
  277. }
  278. }