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.

167 lines
4.9 KiB

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 encoder_t m_uarts[] = {
  11. {&camera_encoder, TIM_CHANNEL_1 | TIM_CHANNEL_2}, // 相机编码器
  12. {&driven_encoder_gear, TIM_CHANNEL_1 | TIM_CHANNEL_2} // 从动编码器
  13. };
  14. void encoder_all_start(void)
  15. {
  16. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  17. {
  18. HAL_TIM_Encoder_Start(m_uarts[i].tim_handler, m_uarts[i].tim_channel);
  19. }
  20. }
  21. void encoder_all_stop(void)
  22. {
  23. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  24. {
  25. HAL_TIM_Encoder_Stop(m_uarts[i].tim_handler, m_uarts[i].tim_channel);
  26. }
  27. }
  28. bool encoder_clear_counter(encoder_usage_t encoder)
  29. {
  30. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  31. {
  32. if (encoder == i)
  33. {
  34. __HAL_TIM_GET_COUNTER(m_uarts[i].tim_handler) = 0;
  35. return true;
  36. }
  37. }
  38. return false;
  39. }
  40. void encoder_all_clear_counter(void)
  41. {
  42. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  43. {
  44. __HAL_TIM_GET_COUNTER(m_uarts[i].tim_handler) = 0; // 计数器值重新置位
  45. }
  46. }
  47. bool encoder_read_with_encoder(encoder_usage_t encoder, uint32_t *encoder_value)
  48. {
  49. bool get_encoder_value_flag = false;
  50. switch (encoder)
  51. {
  52. case CAMERA_ENCODER:
  53. *encoder_value += (short)__HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler);
  54. __HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler) = 0; /* 清零 */
  55. get_encoder_value_flag = true;
  56. break;
  57. case DRIVEN_ENCODER_GEAR:
  58. *encoder_value += (short)__HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler);
  59. __HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler) = 0; /* 清零 */
  60. get_encoder_value_flag = true;
  61. break;
  62. default:
  63. break;
  64. }
  65. return get_encoder_value_flag;
  66. }
  67. void encoder_light_schedule(void)
  68. {
  69. if (camera_encoder_state == STANDBY)
  70. {
  71. if (sys_haspassedms(camera_encoder_lastprocess) > 500)
  72. {
  73. camera_encoder_lastprocess = HAL_GetTick();
  74. HAL_GPIO_TogglePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin);
  75. }
  76. }
  77. if (driven_encoder_gear_state == STANDBY)
  78. {
  79. if (sys_haspassedms(camera_encoder_lastprocess) > 500)
  80. {
  81. driven_encoder_gear_lastprocess = HAL_GetTick();
  82. // HAL_GPIO_TogglePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin);
  83. }
  84. }
  85. }
  86. void encoder_set_state(encoder_usage_t encoder, encoder_light_state_t state)
  87. {
  88. /* 主动上报的时候常亮,接收到触发指令直接翻转led,待机中0.5s周期闪烁 */
  89. if (encoder == CAMERA_ENCODER)
  90. {
  91. camera_encoder_state = state;
  92. if (state == STANDBY)
  93. {
  94. camera_encoder_lastprocess = HAL_GetTick();
  95. HAL_GPIO_TogglePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin);
  96. }
  97. else if (state == WORKING)
  98. {
  99. /* 如果工作状态的时候触发了genlock等,灯的状态不应该变成待机状态,只有同为待机的时候闪烁,上层写的时候需要加判断 */
  100. HAL_GPIO_WritePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin, GPIO_PIN_RESET);
  101. }
  102. }
  103. else if (encoder == DRIVEN_ENCODER_GEAR)
  104. {
  105. driven_encoder_gear_state = state;
  106. if (state == STANDBY)
  107. {
  108. driven_encoder_gear_lastprocess = HAL_GetTick();
  109. // HAL_GPIO_TogglePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin);
  110. }
  111. else if (state == WORKING)
  112. {
  113. // HAL_GPIO_WritePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin, GPIO_PIN_SET);
  114. }
  115. }
  116. }
  117. encoder_light_state_t encoder_get_state(encoder_usage_t encoder)
  118. {
  119. if (encoder == CAMERA_ENCODER)
  120. {
  121. return camera_encoder_state;
  122. }
  123. else if (encoder == DRIVEN_ENCODER_GEAR)
  124. {
  125. return driven_encoder_gear_state;
  126. }
  127. return ENCODER_STATE_NUMBER_AND_ERR_STATE;
  128. }
  129. void encoder_all_encoder_clear_counter_and_structer_count(void)
  130. {
  131. udp_client_get_active_report_data_structer()->encoder_1_count = 0;
  132. udp_client_get_active_report_data_structer()->encoder_2_count = 0;
  133. encoder_all_clear_counter();
  134. }
  135. void encoder_switch_encoder_clear_count_and_structer_count(encoder_usage_t encoder)
  136. {
  137. switch (encoder)
  138. {
  139. case CAMERA_ENCODER:
  140. udp_client_get_active_report_data_structer()->encoder_1_count = 0;
  141. encoder_clear_counter(CAMERA_ENCODER);
  142. break;
  143. case DRIVEN_ENCODER_GEAR:
  144. udp_client_get_active_report_data_structer()->encoder_2_count = 0;
  145. encoder_clear_counter(DRIVEN_ENCODER_GEAR);
  146. break;
  147. default:
  148. break;
  149. }
  150. }