#include "stm32g4xx_hal.h" #include "hal_callback.h" #include "terminal_usartbridge.h" #include "uart_bridge.h" #include "menu.h" #include "config.h" #include #define DBG if (0) static void encoder_handler(void); // -------------------------------------------------------------------------- // // EXTI // // -------------------------------------------------------------------------- // void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { static uint32_t delay_cnt = 0; static bool push_flag = false; if (GPIO_Pin == GPIO_PIN_4) { if (push_flag == false) { push_flag = true; delay_cnt = HAL_GetTick(); } if (push_flag == true) { if ((HAL_GetTick() - delay_cnt) > BUTTON_GLICH_TIMEOUT) { push_flag = false; DBG HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6); menu_send_event(CONTROL_PUSH); } } } } // -------------------------------------------------------------------------- // // UART // // -------------------------------------------------------------------------- // void UART_RxCpltCallback(UART_HandleTypeDef *huart); void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { switch((uint32_t)huart->Instance) { case USART3_BASE : // HAL USART Terminal HAL_UART_RxCpltCallbackTerminal(); break; case USART2_BASE : usart_bridge_rx_cb(); break; default : break; } } void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { switch((uint32_t)huart->Instance) { case USART3_BASE : // HAL USART Terminal HAL_UART_RxCpltCallbackTerminal(); break; case USART2_BASE : usart_bridge_rx_cb(); break; default : break; } } // -------------------------------------------------------------------------- // // TIM // // -------------------------------------------------------------------------- // // void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { switch((uint32_t)htim->Instance) { case TIM2_BASE : encoder_handler(); break; default : break; } } // static void encoder_handler(void) { static uint8_t frw_cnt = 0; static uint8_t back_cnt = 0; if (TIM2->CR1 & TIM_CR1_DIR) { if (++back_cnt > ENC_SOFT_FILTER_CNT) { menu_send_event(CONTROL_BACK); DBG printf("Encoder back\r\n"); back_cnt = 0; return; } back_cnt++; } else { if (++frw_cnt > ENC_SOFT_FILTER_CNT) { menu_send_event(CONTROL_FWD); DBG printf("Encoder forward\r\n"); frw_cnt = 0; return; } frw_cnt++; } }