overrun error in meterbus uart handled
This commit is contained in:
parent
3fd30aaa36
commit
bd435dd5d6
@ -2014,6 +2014,10 @@ HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart)
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
inline void dts(uint8_t v) {
|
||||
for (uint8_t xx = 0; xx < v; xx++) HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_10);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles UART interrupt request.
|
||||
* @param huart Pointer to a UART_HandleTypeDef structure that contains
|
||||
@ -2022,6 +2026,8 @@ HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart)
|
||||
*/
|
||||
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
|
||||
{
|
||||
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_12);
|
||||
|
||||
uint32_t isrflags = READ_REG(huart->Instance->SR);
|
||||
uint32_t cr1its = READ_REG(huart->Instance->CR1);
|
||||
uint32_t cr3its = READ_REG(huart->Instance->CR3);
|
||||
@ -2032,9 +2038,10 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
|
||||
errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
|
||||
if (errorflags == RESET)
|
||||
{
|
||||
/* UART in mode Receiver -------------------------------------------------*/
|
||||
/* UART in mode Receiver -------------------------------------------------*/
|
||||
if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
|
||||
{
|
||||
dts(1);
|
||||
UART_Receive_IT(huart);
|
||||
return;
|
||||
}
|
||||
@ -2043,6 +2050,7 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
|
||||
/* If some errors occur */
|
||||
if ((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
|
||||
{
|
||||
dts(2);
|
||||
/* UART parity error interrupt occurred ----------------------------------*/
|
||||
if (((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
|
||||
{
|
||||
@ -2070,6 +2078,7 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
|
||||
/* Call UART Error Call back function if need be --------------------------*/
|
||||
if (huart->ErrorCode != HAL_UART_ERROR_NONE)
|
||||
{
|
||||
dts(3);
|
||||
/* UART in mode Receiver -----------------------------------------------*/
|
||||
if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
|
||||
{
|
||||
@ -2089,11 +2098,13 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
|
||||
/* Disable the UART DMA Rx request if enabled */
|
||||
if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
|
||||
{
|
||||
dts(4);
|
||||
CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
|
||||
|
||||
/* Abort the UART DMA Rx channel */
|
||||
if (huart->hdmarx != NULL)
|
||||
{
|
||||
dts(5);
|
||||
/* Set the UART DMA Abort callback :
|
||||
will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */
|
||||
huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError;
|
||||
|
@ -10,6 +10,7 @@ typedef struct __attribute__((__packed__)) s_deviceStats {
|
||||
uint32_t totalPowercycles;
|
||||
uint32_t totalRequests;
|
||||
uint32_t totalFailures;
|
||||
uint32_t totalOverruns;
|
||||
} t_deviceStats;
|
||||
|
||||
void eepromInit();
|
||||
@ -18,5 +19,4 @@ void eepromRead(uint16_t addr, uint8_t *buf, uint8_t len);
|
||||
void eepromSpiTxCpltCallback(SPI_HandleTypeDef *hspi);
|
||||
t_deviceStats* getGlobalDeviceStats();
|
||||
|
||||
|
||||
#endif /* EEPROM_H_ */
|
||||
|
@ -28,6 +28,7 @@ typedef enum {
|
||||
typedef struct {
|
||||
uint32_t requestCnt;
|
||||
uint32_t errorCnt;
|
||||
uint32_t overrunCnt;
|
||||
} t_mbusCommStats;
|
||||
|
||||
// e_mbusCommRequestResult mbusCommRequest(t_mbusDevice *mbusDevice);
|
||||
@ -35,6 +36,7 @@ void mbusCommInit();
|
||||
void mbusCommEnable(bool enable);
|
||||
void mbusCommTxCpltCallback(UART_HandleTypeDef *huart);
|
||||
void mbusCommRxCpltCallback(UART_HandleTypeDef *huart);
|
||||
void mbusCommErrorCallback(UART_HandleTypeDef *huart);
|
||||
void mbusCommSetStats(t_mbusCommStats stats);
|
||||
t_mbusCommStats *mbusCommGetStats();
|
||||
|
||||
|
@ -20,7 +20,7 @@ static const uint8_t EEPROM_WREN = 0x06;
|
||||
// static const uint8_t EEPROM_WRSR = 0x01;
|
||||
|
||||
|
||||
static const uint32_t EEPROM_MAGIC = 0xaffe0006;
|
||||
static const uint32_t EEPROM_MAGIC = 0xaffe0007;
|
||||
|
||||
|
||||
typedef union {
|
||||
@ -116,12 +116,14 @@ static void eepromHourlyUpdateDeviceStats(void *handle) {
|
||||
|
||||
deviceStats.s.totalRequests = stats->requestCnt;
|
||||
deviceStats.s.totalFailures = stats->errorCnt;
|
||||
deviceStats.s.totalOverruns = stats->overrunCnt;
|
||||
|
||||
logMsg("eeHUDS, about to write updated device stats");
|
||||
logMsg("eeHUDS, total powercycles so far: %d", deviceStats.s.totalPowercycles);
|
||||
logMsg("eeHUDS, total running hours so far: %d", deviceStats.s.totalRunningHours);
|
||||
logMsg("eeHUDS, total requests so far: %d", deviceStats.s.totalRequests);
|
||||
logMsg("eeHUDS, total failures so far: %d", deviceStats.s.totalFailures);
|
||||
logMsg("eeHUDS, total overruns so far: %d", deviceStats.s.totalOverruns);
|
||||
|
||||
eepromWrite(DEVICE_STATS_ADDR, deviceStats.b, sizeof(deviceStats));
|
||||
}
|
||||
@ -145,6 +147,7 @@ void eepromInit() {
|
||||
deviceStats.s.totalRunningHours = 0;
|
||||
deviceStats.s.totalRequests = 0;
|
||||
deviceStats.s.totalFailures = 0;
|
||||
deviceStats.s.totalOverruns = 0;
|
||||
logMsg("eeI, about to write device stats for the first time");
|
||||
eepromWrite(DEVICE_STATS_ADDR, deviceStats.b, sizeof(deviceStats));
|
||||
eepromActiveDelay(7);
|
||||
@ -178,8 +181,9 @@ void eepromInit() {
|
||||
logMsg("eeI, total running hours so far: %d", deviceStats.s.totalRunningHours);
|
||||
logMsg("eeI, total requests so far: %d", deviceStats.s.totalRequests);
|
||||
logMsg("eeI, total failures so far: %d", deviceStats.s.totalFailures);
|
||||
logMsg("eeI, total overruns so far: %d", deviceStats.s.totalOverruns);
|
||||
|
||||
t_mbusCommStats stats = { .requestCnt = deviceStats.s.totalRequests, .errorCnt = deviceStats.s.totalFailures};
|
||||
t_mbusCommStats stats = { .requestCnt = deviceStats.s.totalRequests, .errorCnt = deviceStats.s.totalFailures, .overrunCnt = deviceStats.s.totalOverruns };
|
||||
mbusCommSetStats(stats);
|
||||
|
||||
deviceStats.s.totalPowercycles += 1;
|
||||
|
@ -37,7 +37,7 @@ void frontendDisable() {
|
||||
void frontendAdcCallback(ADC_HandleTypeDef* hadc) {
|
||||
static int32_t holdValue = 0;
|
||||
|
||||
show(DEBUG_2, TOGGLE);
|
||||
// show(DEBUG_2, TOGGLE);
|
||||
|
||||
if (frontendEnabled) {
|
||||
int32_t currentValue = (int32_t) HAL_ADC_GetValue(hadc);
|
||||
|
@ -64,7 +64,7 @@ void my_setup_2() {
|
||||
}
|
||||
|
||||
void my_loop() {
|
||||
show(DEBUG_1, TOGGLE);
|
||||
// show(DEBUG_1, TOGGLE);
|
||||
|
||||
schExec();
|
||||
|
||||
@ -111,3 +111,9 @@ void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) {
|
||||
eepromSpiTxCpltCallback(hspi);
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
|
||||
if (huart == &mbusUart) {
|
||||
mbusCommErrorCallback(huart);
|
||||
}
|
||||
}
|
@ -95,7 +95,7 @@ typedef struct {
|
||||
|
||||
static t_mbusCommHandle mbusCommHandle = { .requestId = 0, .state = MBCS_IDLE, .retryCnt = 0, .cmd = 0, .addr = 0, .receiveCnt = 0, .receivedOctet = 0, .receiving = false };
|
||||
|
||||
static t_mbusCommStats mbusCommStats = { .requestCnt = 0, .errorCnt = 0 };
|
||||
static t_mbusCommStats mbusCommStats = { .requestCnt = 0, .errorCnt = 0, .overrunCnt = 0 };
|
||||
|
||||
static bool mbusCommEnabled = true;
|
||||
|
||||
@ -255,9 +255,26 @@ static void timeoutHandler(void *handle) {
|
||||
|
||||
static void receiveNext(t_mbusCommHandle *localMbusCommHandle) {
|
||||
localMbusCommHandle->receiving = true;
|
||||
coloredMsg(LOG_RED, false, "RN1: %d", localMbusCommHandle->state);
|
||||
HAL_StatusTypeDef res = HAL_UART_Receive_IT(&mbusUart, &(localMbusCommHandle->receivedOctet), 1);
|
||||
coloredMsg(LOG_RED, false, "RN2: 0x%02x", res);
|
||||
// coloredMsg(LOG_RED, false, "RN1: %d", localMbusCommHandle->state);
|
||||
__attribute__((unused)) HAL_StatusTypeDef res = HAL_UART_Receive_IT(&mbusUart, &(localMbusCommHandle->receivedOctet), 1);
|
||||
// coloredMsg(LOG_RED, false, "RN2: 0x%02x", res);
|
||||
}
|
||||
|
||||
void mbusCommRxCpltCallback(UART_HandleTypeDef *huart) {
|
||||
if (mbusCommHandle.receiving) {
|
||||
// coloredMsg(LOG_RED, false, "RO: 0x%02x", mbusCommHandle.receivedOctet);
|
||||
schAdd(handleRequestEngine, (void*) &mbusCommHandle, 0, 0);
|
||||
mbusCommHandle.receiving = false;
|
||||
}
|
||||
}
|
||||
|
||||
void mbusCommErrorCallback(UART_HandleTypeDef *huart) {
|
||||
if (huart->ErrorCode == HAL_UART_ERROR_ORE) {
|
||||
coloredMsg(LOG_RED, false, "mbc errcb overrun error, restart receiving");
|
||||
mbusCommStats.overrunCnt += 1;
|
||||
HAL_StatusTypeDef res = HAL_UART_Receive_IT(&mbusUart, &(mbusCommHandle.receivedOctet), 1);
|
||||
coloredMsg(LOG_RED, false, "mbc errcb, recv: 0x%02x", res);
|
||||
}
|
||||
}
|
||||
|
||||
static void handleRequestEngine(void *handle) {
|
||||
@ -492,13 +509,6 @@ void mbusCommTxCpltCallback(UART_HandleTypeDef *huart) {
|
||||
schAdd(handleRequestEngine, (void*) &mbusCommHandle, 0, 0);
|
||||
}
|
||||
|
||||
void mbusCommRxCpltCallback(UART_HandleTypeDef *huart) {
|
||||
if (mbusCommHandle.receiving) {
|
||||
coloredMsg(LOG_RED, false, "RO: 0x%02x", mbusCommHandle.receivedOctet);
|
||||
schAdd(handleRequestEngine, (void*) &mbusCommHandle, 0, 0);
|
||||
mbusCommHandle.receiving = false;
|
||||
}
|
||||
}
|
||||
|
||||
void mbusCommEnable(bool enable) {
|
||||
mbusCommEnabled = enable;
|
||||
@ -539,6 +549,8 @@ static e_mbusCommRequestResult mbusCommRequest(t_mbusDevice *mbusDevice) {
|
||||
}
|
||||
|
||||
|
||||
#define PERIOD 60
|
||||
|
||||
static uint8_t numOfDevices = 8;
|
||||
static t_mbusDevice devices[] = {
|
||||
{
|
||||
@ -547,7 +559,7 @@ static t_mbusDevice devices[] = {
|
||||
.consideredField = { 0, 17, -1, -1 },
|
||||
.requests = 0,
|
||||
.failures = 0,
|
||||
.period = 60,
|
||||
.period = PERIOD,
|
||||
.delay = 0,
|
||||
.waiting = false
|
||||
},
|
||||
@ -557,7 +569,7 @@ static t_mbusDevice devices[] = {
|
||||
.consideredField = { 0, 4, 2, 3 },
|
||||
.requests = 0,
|
||||
.failures = 0,
|
||||
.period = 60,
|
||||
.period = PERIOD,
|
||||
.delay = 0,
|
||||
.waiting = false
|
||||
},
|
||||
@ -567,7 +579,7 @@ static t_mbusDevice devices[] = {
|
||||
.consideredField = { 0, 4, 2, 3 },
|
||||
.requests = 0,
|
||||
.failures = 0,
|
||||
.period = 60,
|
||||
.period = PERIOD,
|
||||
.delay = 0,
|
||||
.waiting = false
|
||||
},
|
||||
@ -577,7 +589,7 @@ static t_mbusDevice devices[] = {
|
||||
.consideredField = { 0, 4, 2, 3 },
|
||||
.requests = 0,
|
||||
.failures = 0,
|
||||
.period = 60,
|
||||
.period = PERIOD,
|
||||
.delay = 0,
|
||||
.waiting = false
|
||||
},
|
||||
@ -587,7 +599,7 @@ static t_mbusDevice devices[] = {
|
||||
.consideredField = { 0, 4, 2, 3 },
|
||||
.requests = 0,
|
||||
.failures = 0,
|
||||
.period = 60,
|
||||
.period = PERIOD,
|
||||
.delay = 0,
|
||||
.waiting = false
|
||||
},
|
||||
@ -597,7 +609,7 @@ static t_mbusDevice devices[] = {
|
||||
.consideredField = { 0, 4, 2, 3 },
|
||||
.requests = 0,
|
||||
.failures = 0,
|
||||
.period = 15,
|
||||
.period = PERIOD,
|
||||
.delay = 0,
|
||||
.waiting = false
|
||||
},
|
||||
@ -607,7 +619,7 @@ static t_mbusDevice devices[] = {
|
||||
.consideredField = { 0, 4, 2, 3 },
|
||||
.requests = 0,
|
||||
.failures = 0,
|
||||
.period = 60,
|
||||
.period = PERIOD,
|
||||
.delay = 0,
|
||||
.waiting = false
|
||||
},
|
||||
@ -617,7 +629,7 @@ static t_mbusDevice devices[] = {
|
||||
.consideredField = { 0, 4, 2, 3 },
|
||||
.requests = 0,
|
||||
.failures = 0,
|
||||
.period = 60,
|
||||
.period = PERIOD,
|
||||
.delay = 0,
|
||||
.waiting = false
|
||||
}
|
||||
|
@ -58,8 +58,8 @@ static void mqttStatusPublisher(void *handle) {
|
||||
|
||||
char buf[128];
|
||||
uint32_t uptime = HAL_GetTick() / 1000;
|
||||
snprintf(buf, sizeof(buf), "{\"uptime\":\"%ld\", \"runningHours\":\"%ld\", \"powerCycles\":\"%ld\", \"tasks\":\"%d\", \"requests\":\"%ld\", \"errors\":\"%ld\"}",
|
||||
uptime, globalDeviceStats->totalRunningHours, globalDeviceStats->totalPowercycles, schTaskCnt(), mbusCommStats->requestCnt, mbusCommStats->errorCnt);
|
||||
snprintf(buf, sizeof(buf), "{\"uptime\":\"%ld\", \"runningHours\":\"%ld\", \"powerCycles\":\"%ld\", \"tasks\":\"%d\", \"requests\":\"%ld\", \"errors\":\"%ld\", \"overruns\":\"%ld\"}",
|
||||
uptime, globalDeviceStats->totalRunningHours, globalDeviceStats->totalPowercycles, schTaskCnt(), mbusCommStats->requestCnt, mbusCommStats->errorCnt, mbusCommStats->overrunCnt);
|
||||
bool res = publish(&mqttClient, StatusTopic, (const uint8_t*)buf, strlen(buf), false);
|
||||
coloredMsg(LOG_GREEN, false, "mqch, publish returned %d", res);
|
||||
|
||||
@ -69,11 +69,10 @@ static void mqttStatusPublisher(void *handle) {
|
||||
oledPrintf(OLED_SCREEN1, "Addr:%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
|
||||
oledPrintf(OLED_SCREEN1, "Network available:%d", isNetworkAvailable());
|
||||
oledPrintf(OLED_SCREEN1, "Uptime:%ld", uptime);
|
||||
oledPrintf(OLED_SCREEN1, "RunHours:%d", globalDeviceStats->totalRunningHours);
|
||||
oledPrintf(OLED_SCREEN1, "PowerCycl:%d", globalDeviceStats->totalPowercycles);
|
||||
oledPrintf(OLED_SCREEN1, "Req:%ld", mbusCommStats->requestCnt);
|
||||
oledPrintf(OLED_SCREEN1, "Err:%ld", mbusCommStats->errorCnt);
|
||||
|
||||
oledPrintf(OLED_SCREEN1, "Ovrrn:%d", mbusCommStats->overrunCnt);
|
||||
}
|
||||
|
||||
void mqttCommHandler(void *handle) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user