diff --git a/App/app.cpp b/App/app.cpp index b8802ae..1ec35eb 100644 --- a/App/app.cpp +++ b/App/app.cpp @@ -39,7 +39,7 @@ extern "C" { #include "tim.h" UartBridge bridge(true, USART1, USART2, 9600, 9600); -uint8_t timerCounter = 0; +uint8_t flagTransmitCompleted = 1; void zummerOff(void); void zummerOn(void); @@ -119,7 +119,7 @@ uint32_t waitAnswerFromReaderMs = 0; uint32_t lightStartMs = 0; uint8_t uart1Buf[1024]; uint8_t uart2Buf[1024]; - +uint32_t msms ; uint8_t uartTask(void) // return 0 if data received , otherwise return 1 { @@ -133,8 +133,6 @@ uint8_t uartTask(void) // return 0 if data received , otherwise return 1 } if (!bridge.uart1Buf->is_empty() && bridge.getHuart2()->gState == 0x20) { - HAL_UART_AbortReceive_IT(bridge.getHuart1()); - HAL_UARTEx_ReceiveToIdle_IT(bridge.getHuart1(), (uint8_t *) bridge.dataFromUart1, BUF_SIZE); waitAnswerFromReaderMs = HAL_GetTick(); std::string_view stringView{bridge.uart1Buf->dequeue()}; uint32_t size = stringView.size(); @@ -156,12 +154,11 @@ uint8_t uartTask(void) // return 0 if data received , otherwise return 1 } if (!bridge.uart2Buf->is_empty() && bridge.getHuart1()->gState == 0x20) { - HAL_TIM_Base_Stop(&htimSecTimer); + msms = HAL_GetTick(); + __HAL_TIM_CLEAR_FLAG(&htimSecTimer, TIM_FLAG_UPDATE); HAL_TIM_Base_Start_IT(&htimSecTimer); - timerCounter = 0; + flagTransmitCompleted = 0; waitAnswerFromReaderMs = 0; - HAL_UART_AbortReceive_IT(bridge.getHuart2()); - HAL_UARTEx_ReceiveToIdle_IT(bridge.getHuart2(), (uint8_t *) bridge.dataFromUart2, BUF_SIZE); std::string_view stringView{bridge.uart2Buf->dequeue()}; uint32_t size = stringView.size(); stringView.copy(reinterpret_cast(uart2Buf), size, 0); @@ -178,10 +175,7 @@ void AppTask(void) { lightStartMs = 0; lightingOff(); } - if (timerCounter == 1) { - timerCounter = 0; - if (vl6180_is_ready() >= 0) - vl6180_single_shot(); + if (flagTransmitCompleted == 1) { if (proximityCompleteMessure == 1) { proximityCompleteMessure = 0; if (getRange(&VL6180_Range) == 0) { @@ -191,7 +185,11 @@ void AppTask(void) { } } } + if (vl6180_is_ready() >= 0) + vl6180_single_shot(); + } + } else { BootComCheckActivationRequest(); } @@ -202,7 +200,8 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) if (htim->Instance == htimSecTimer.Instance) { HAL_TIM_Base_Stop_IT(htim); - timerCounter = 1; + msms = HAL_GetTick() - msms; + flagTransmitCompleted = 1; } } diff --git a/main_prog/Core/Src/tim.c b/main_prog/Core/Src/tim.c index 1e7100a..f7633ae 100644 --- a/main_prog/Core/Src/tim.c +++ b/main_prog/Core/Src/tim.c @@ -135,7 +135,7 @@ void MX_TIM16_Init(void) /* USER CODE END TIM16_Init 1 */ htimSecTimer.Instance = TIM16; - htimSecTimer.Init.Prescaler = 999; + htimSecTimer.Init.Prescaler = 99; htimSecTimer.Init.CounterMode = TIM_COUNTERMODE_UP; htimSecTimer.Init.Period = 63999; htimSecTimer.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; diff --git a/main_prog/Core/Src/uart_bridge.cpp b/main_prog/Core/Src/uart_bridge.cpp index cf35dfb..da2c68f 100644 --- a/main_prog/Core/Src/uart_bridge.cpp +++ b/main_prog/Core/Src/uart_bridge.cpp @@ -2,38 +2,41 @@ // Created by Mysteo on 14.07.2023. // extern "C" { - #include "usart.h" +#include "usart.h" #include "tim.h" } + #include "uart_bridge.hpp" -UartBridge* bridgePnt; +UartBridge *bridgePnt; +extern "C" void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { - -extern "C" void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){ - - if (huart == bridgePnt->getHuart1()) - { + if (huart == bridgePnt->getHuart1()) { + HAL_UARTEx_ReceiveToIdle_IT(bridgePnt->getHuart1(), (uint8_t *) bridgePnt->dataFromUart1, BUF_SIZE); + if (Size < 4) + return; std::string_view stringView{(const char *) bridgePnt->dataFromUart1, Size}; - bridgePnt->uart1Buf->enqueue(stringView); - } - else if (huart == bridgePnt->getHuart2()) - { + bridgePnt->uart1Buf->enqueue(stringView); + } else if (huart == bridgePnt->getHuart2()) { + HAL_UARTEx_ReceiveToIdle_IT(bridgePnt->getHuart2(), (uint8_t *) bridgePnt->dataFromUart2, BUF_SIZE); + + if (Size < 4) + return; std::string_view stringView{(const char *) bridgePnt->dataFromUart2, Size}; bridgePnt->uart2Buf->enqueue(stringView); + } } UartBridge::UartBridge(bool isOn, USART_TypeDef *uart1, USART_TypeDef *uart2, uint16_t baudRate1, uint16_t baudRate2) : turnOn(isOn), - uart1(uart1), - uart2(uart2) -{ + uart1(uart1), + uart2(uart2) { bridgePnt = this; UartBridge::uart1Buf = new Circular_Buffer(MAX_QUEUE); UartBridge::uart2Buf = new Circular_Buffer(MAX_QUEUE); @@ -62,45 +65,45 @@ void UartBridge::setTurnOn(bool isTurnOn) { } void UartBridge::uartInit(UART_HandleTypeDef *huart) { - if (HAL_UART_Init(huart) != HAL_OK) - { + if (HAL_UART_Init(huart) != HAL_OK) { Error_Handler(); } - if (HAL_UARTEx_SetTxFifoThreshold(huart, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) - { + if (HAL_UARTEx_SetTxFifoThreshold(huart, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } - if (HAL_UARTEx_SetRxFifoThreshold(huart, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) - { + if (HAL_UARTEx_SetRxFifoThreshold(huart, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } - if (HAL_UARTEx_DisableFifoMode(huart) != HAL_OK) - { + if (HAL_UARTEx_DisableFifoMode(huart) != HAL_OK) { Error_Handler(); } } -UART_HandleTypeDef* UartBridge::getHuart1() { +UART_HandleTypeDef *UartBridge::getHuart1() { return &uart1Handle; } -UART_HandleTypeDef* UartBridge::getHuart2() { +UART_HandleTypeDef *UartBridge::getHuart2() { return &uart2Handle; } void UartBridge::init(void) { uartInit(&uart1Handle); uartInit(&uart2Handle); - HAL_UARTEx_ReceiveToIdle_IT(&uart1Handle,(uint8_t*)dataFromUart1, BUF_SIZE ); - HAL_UARTEx_ReceiveToIdle_IT(&uart2Handle,(uint8_t*)dataFromUart2, BUF_SIZE ); + __HAL_UART_CLEAR_FLAG(&uart1Handle, UART_FLAG_TXE); + __HAL_UART_CLEAR_FLAG(&uart1Handle, UART_FLAG_TC); + __HAL_UART_CLEAR_FLAG(&uart1Handle, UART_FLAG_IDLE); + __HAL_UART_CLEAR_FLAG(&uart2Handle, UART_FLAG_TXE); + __HAL_UART_CLEAR_FLAG(&uart2Handle, UART_FLAG_TC); + __HAL_UART_CLEAR_FLAG(&uart2Handle, UART_FLAG_IDLE); + HAL_UARTEx_ReceiveToIdle_IT(&uart1Handle, (uint8_t *) dataFromUart1, BUF_SIZE); + HAL_UARTEx_ReceiveToIdle_IT(&uart2Handle, (uint8_t *) dataFromUart2, BUF_SIZE); } - -extern "C" void USART1_IRQHandler(void) -{ +extern "C" void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ @@ -113,8 +116,7 @@ extern "C" void USART1_IRQHandler(void) /** * @brief This function handles USART2 global interrupt / USART2 wake-up interrupt through EXTI line 26. */ -extern "C" void USART2_IRQHandler(void) -{ +extern "C" void USART2_IRQHandler(void) { /* USER CODE BEGIN USART2_IRQn 0 */ /* USER CODE END USART2_IRQn 0 */ @@ -124,3 +126,10 @@ extern "C" void USART2_IRQHandler(void) /* USER CODE END USART2_IRQn 1 */ } +extern "C" void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { + if (bridgePnt->getHuart1() == huart) { + HAL_UARTEx_ReceiveToIdle_IT(huart, (uint8_t *) bridgePnt->dataFromUart1, BUF_SIZE); + } else if (bridgePnt->getHuart2() == huart) { + HAL_UARTEx_ReceiveToIdle_IT(huart, (uint8_t *) bridgePnt->dataFromUart2, BUF_SIZE); + } +} \ No newline at end of file diff --git a/main_prog/vl6180/App/vl6180_app.c b/main_prog/vl6180/App/vl6180_app.c index 99ea8ea..aed564f 100644 --- a/main_prog/vl6180/App/vl6180_app.c +++ b/main_prog/vl6180/App/vl6180_app.c @@ -103,6 +103,7 @@ void vl6180_init (void) /* Enable Dmax calculation only if value is displayed (to save computation power) */ //VL6180_DMaxSetState(theVL6180Dev, DMaxDispTime>0); VL6180_ClearAllInterrupt(theVL6180Dev); + VL6180_RangeStartSingleShot(theVL6180Dev); allowIT = 1; } @@ -279,6 +280,8 @@ void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) uint8_t vl6180_single_shot () { VL6180_RangeStartSingleShot(theVL6180Dev); + VL6180_ClearAllInterrupt(theVL6180Dev); + } int32_t vl6180_is_ready ()