diff --git a/cube/User/Inc/mbusComm.h b/cube/User/Inc/mbusComm.h index be8ef3c..59c1118 100644 --- a/cube/User/Inc/mbusComm.h +++ b/cube/User/Inc/mbusComm.h @@ -6,5 +6,6 @@ void mbusCommRequest(uint8_t cmd, uint8_t addr); void mbusCommTxCpltCallback(UART_HandleTypeDef *huart); +void mbusCommRxCpltCallback(UART_HandleTypeDef *huart); #endif // _MBUSCOMM_H_ diff --git a/cube/User/Src/main2.c b/cube/User/Src/main2.c index 7d7ff5d..22e30c5 100644 --- a/cube/User/Src/main2.c +++ b/cube/User/Src/main2.c @@ -59,7 +59,6 @@ void HAL_GPIO_EXTI_Callback(uint16_t pin) { } } - void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { if (hadc == &frontendAdc) { frontendAdcCallback(hadc); @@ -70,4 +69,11 @@ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &mbusUart) { mbusCommTxCpltCallback(huart); } -} \ No newline at end of file +} + +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { + if (huart == &mbusUart) { + mbusCommRxCpltCallback(huart); + } +} + diff --git a/cube/User/Src/mbusComm.c b/cube/User/Src/mbusComm.c index 16fc6b4..626b3fb 100644 --- a/cube/User/Src/mbusComm.c +++ b/cube/User/Src/mbusComm.c @@ -14,6 +14,7 @@ typedef enum { SEND_CONT, SENDING_DONE, ENABLE_FRONTEND, + RECEIVING, DISABLE_FRONTEND } e_mbusCommState; @@ -23,11 +24,21 @@ typedef struct { uint8_t cmd; uint8_t addr; uint8_t sendBuf[5]; + uint8_t receivedOctet; + bool receiving; } t_mbusCommHandle; -static t_mbusCommHandle mbusCommHandle = { .state = IDLE, .retryCnt = 0, .cmd = 0, .addr = 0 }; +static t_mbusCommHandle mbusCommHandle = { .state = IDLE, .retryCnt = 0, .cmd = 0, .addr = 0, .receivedOctet = 0, .receiving = false }; +static void timeoutHandler(void *handle) { + logMsg("mbc timeout"); + t_mbusCommHandle *localMbusCommHandle = (t_mbusCommHandle*) handle; + localMbusCommHandle->state = DISABLE_FRONTEND; + localMbusCommHandle->receiving = false; + handleRequestEngine(handle); +} + static void handleRequestEngine(void *handle) { t_mbusCommHandle *localMbusCommHandle = (t_mbusCommHandle*) handle; @@ -72,8 +83,15 @@ static void handleRequestEngine(void *handle) { case ENABLE_FRONTEND: logMsg("hre state ENABLE_FRONTEND"); frontendEnable(); - localMbusCommHandle->state = DISABLE_FRONTEND; - schAdd(handleRequestEngine, handle, 500, 0); + schAdd(timeoutHandler, handle, 500, 0); // 500ms timeout + localMbusCommHandle->state = RECEIVING; + localMbusCommHandle->receiving = true; + // now waiting for the response, transitions are triggered by interrupt callback + break; + + case RECEIVING: + logMsg("hre state RECEIVING"); + logMsg("hre received octet: 0x%02x", localMbusCommHandle->receivedOctet); break; case DISABLE_FRONTEND: @@ -94,6 +112,16 @@ void mbusCommTxCpltCallback(UART_HandleTypeDef *huart) { schAdd(handleRequestEngine, (void*) &mbusCommHandle, 0, 0); } +void mbusCommRxCpltCallback(UART_HandleTypeDef *huart) { + logMsg("mcrx: mbus received something"); + HAL_UART_Receive_IT(huart, &(mbusCommHandle.receivedOctet), 1); + if (mbusCommHandle.receiving) { + schAdd(handleRequestEngine, (void*) &mbusCommHandle, 0, 0); + } else { + logMsg("mcrx: received 0x%02x but not expected", mbusCommHandle.receivedOctet); + } +} + void mbusCommRequest(uint8_t cmd, uint8_t addr) { if (mbusCommHandle.state == IDLE) { mbusCommHandle.state = SEND;