working now?
This commit is contained in:
parent
7c63579390
commit
edf1942ad3
@ -10,7 +10,6 @@ typedef struct __attribute__((__packed__)) s_deviceStats {
|
|||||||
uint32_t totalPowercycles;
|
uint32_t totalPowercycles;
|
||||||
uint32_t totalRequests;
|
uint32_t totalRequests;
|
||||||
uint32_t totalFailures;
|
uint32_t totalFailures;
|
||||||
uint32_t totalOverruns;
|
|
||||||
} t_deviceStats;
|
} t_deviceStats;
|
||||||
|
|
||||||
void eepromInit();
|
void eepromInit();
|
||||||
|
@ -26,9 +26,11 @@ typedef enum {
|
|||||||
} e_mbusCommRequestResult;
|
} e_mbusCommRequestResult;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t requestCnt;
|
uint32_t mbusRequestCnt;
|
||||||
uint32_t errorCnt;
|
uint32_t mbusErrorCnt;
|
||||||
uint32_t overrunCnt;
|
uint32_t uartOverrunCnt;
|
||||||
|
uint32_t uartFramingErrCnt;
|
||||||
|
uint32_t uartParityErrCnt;
|
||||||
} t_mbusCommStats;
|
} t_mbusCommStats;
|
||||||
|
|
||||||
// e_mbusCommRequestResult mbusCommRequest(t_mbusDevice *mbusDevice);
|
// e_mbusCommRequestResult mbusCommRequest(t_mbusDevice *mbusDevice);
|
||||||
|
@ -44,7 +44,7 @@ typedef struct {
|
|||||||
|
|
||||||
// clear statistics
|
// clear statistics
|
||||||
bool clearCmd(uint8_t argc, char **args) {
|
bool clearCmd(uint8_t argc, char **args) {
|
||||||
t_mbusCommStats zeroedStats = { .requestCnt = 0, .errorCnt = 0 };
|
t_mbusCommStats zeroedStats = { .mbusRequestCnt = 0, .mbusErrorCnt = 0, .uartOverrunCnt = 0, .uartFramingErrCnt = 0, .uartParityErrCnt = 0 };
|
||||||
mbusCommSetStats(zeroedStats);
|
mbusCommSetStats(zeroedStats);
|
||||||
coloredMsg(LOG_YELLOW, true, "ch cc global statistics cleared");
|
coloredMsg(LOG_YELLOW, true, "ch cc global statistics cleared");
|
||||||
return true;
|
return true;
|
||||||
@ -55,9 +55,13 @@ bool globalStatsCmd(uint8_t argc, char **args) {
|
|||||||
char buf[256];
|
char buf[256];
|
||||||
sprintf(buf, \
|
sprintf(buf, \
|
||||||
"Global statistics\n\r" \
|
"Global statistics\n\r" \
|
||||||
" Requests: %ld\n\r" \
|
" Meterbus Requests: %ld\n\r" \
|
||||||
" Errors: %ld\n\r",
|
" Meterbus Errors: %ld\n\r" \
|
||||||
stats->requestCnt, stats->errorCnt
|
" UART Overruns: %ld\n\r" \
|
||||||
|
" UART Framing Errs: %ld\n\r" \
|
||||||
|
" UART Parity Errs: %ld\n\r",
|
||||||
|
stats->mbusRequestCnt, stats->mbusErrorCnt,
|
||||||
|
stats->uartOverrunCnt, stats->uartFramingErrCnt, stats->uartParityErrCnt
|
||||||
);
|
);
|
||||||
send(CMD_SOCK, (uint8_t*)buf, strlen(buf));
|
send(CMD_SOCK, (uint8_t*)buf, strlen(buf));
|
||||||
return true;
|
return true;
|
||||||
|
@ -20,7 +20,7 @@ static const uint8_t EEPROM_WREN = 0x06;
|
|||||||
// static const uint8_t EEPROM_WRSR = 0x01;
|
// static const uint8_t EEPROM_WRSR = 0x01;
|
||||||
|
|
||||||
|
|
||||||
static const uint32_t EEPROM_MAGIC = 0xaffe0007;
|
static const uint32_t EEPROM_MAGIC = 0xaffe0008;
|
||||||
|
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
@ -114,16 +114,14 @@ static void eepromHourlyUpdateDeviceStats(void *handle) {
|
|||||||
|
|
||||||
t_mbusCommStats *stats = mbusCommGetStats();
|
t_mbusCommStats *stats = mbusCommGetStats();
|
||||||
|
|
||||||
deviceStats.s.totalRequests = stats->requestCnt;
|
deviceStats.s.totalRequests += stats->mbusRequestCnt;
|
||||||
deviceStats.s.totalFailures = stats->errorCnt;
|
deviceStats.s.totalFailures += stats->mbusErrorCnt;
|
||||||
deviceStats.s.totalOverruns = stats->overrunCnt;
|
|
||||||
|
|
||||||
logMsg("eeHUDS, about to write updated device stats");
|
logMsg("eeHUDS, about to write updated device stats");
|
||||||
logMsg("eeHUDS, total powercycles so far: %d", deviceStats.s.totalPowercycles);
|
logMsg("eeHUDS, total powercycles so far: %d", deviceStats.s.totalPowercycles);
|
||||||
logMsg("eeHUDS, total running hours so far: %d", deviceStats.s.totalRunningHours);
|
logMsg("eeHUDS, total running hours so far: %d", deviceStats.s.totalRunningHours);
|
||||||
logMsg("eeHUDS, total requests so far: %d", deviceStats.s.totalRequests);
|
logMsg("eeHUDS, total requests so far: %d", deviceStats.s.totalRequests);
|
||||||
logMsg("eeHUDS, total failures so far: %d", deviceStats.s.totalFailures);
|
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));
|
eepromWrite(DEVICE_STATS_ADDR, deviceStats.b, sizeof(deviceStats));
|
||||||
}
|
}
|
||||||
@ -147,7 +145,6 @@ void eepromInit() {
|
|||||||
deviceStats.s.totalRunningHours = 0;
|
deviceStats.s.totalRunningHours = 0;
|
||||||
deviceStats.s.totalRequests = 0;
|
deviceStats.s.totalRequests = 0;
|
||||||
deviceStats.s.totalFailures = 0;
|
deviceStats.s.totalFailures = 0;
|
||||||
deviceStats.s.totalOverruns = 0;
|
|
||||||
logMsg("eeI, about to write device stats for the first time");
|
logMsg("eeI, about to write device stats for the first time");
|
||||||
eepromWrite(DEVICE_STATS_ADDR, deviceStats.b, sizeof(deviceStats));
|
eepromWrite(DEVICE_STATS_ADDR, deviceStats.b, sizeof(deviceStats));
|
||||||
eepromActiveDelay(7);
|
eepromActiveDelay(7);
|
||||||
@ -181,10 +178,6 @@ void eepromInit() {
|
|||||||
logMsg("eeI, total running hours so far: %d", deviceStats.s.totalRunningHours);
|
logMsg("eeI, total running hours so far: %d", deviceStats.s.totalRunningHours);
|
||||||
logMsg("eeI, total requests so far: %d", deviceStats.s.totalRequests);
|
logMsg("eeI, total requests so far: %d", deviceStats.s.totalRequests);
|
||||||
logMsg("eeI, total failures so far: %d", deviceStats.s.totalFailures);
|
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, .overrunCnt = deviceStats.s.totalOverruns };
|
|
||||||
mbusCommSetStats(stats);
|
|
||||||
|
|
||||||
deviceStats.s.totalPowercycles += 1;
|
deviceStats.s.totalPowercycles += 1;
|
||||||
logMsg("eeI, about to write device stats with updated power cycles counter");
|
logMsg("eeI, about to write device stats with updated power cycles counter");
|
||||||
|
@ -106,7 +106,7 @@ typedef struct {
|
|||||||
|
|
||||||
static t_mbusCommHandle mbusCommHandle = { .requestId = 0, .state = MBCS_IDLE, .retryCnt = 0, .cmd = 0, .addr = 0, .startTime = 0, .receiveCnt = 0, .waitForOctet = false, .receiving = false };
|
static t_mbusCommHandle mbusCommHandle = { .requestId = 0, .state = MBCS_IDLE, .retryCnt = 0, .cmd = 0, .addr = 0, .startTime = 0, .receiveCnt = 0, .waitForOctet = false, .receiving = false };
|
||||||
|
|
||||||
static t_mbusCommStats mbusCommStats = { .requestCnt = 0, .errorCnt = 0, .overrunCnt = 0 };
|
static t_mbusCommStats mbusCommStats = { .mbusRequestCnt = 0, .mbusErrorCnt = 0, .uartOverrunCnt = 0, .uartFramingErrCnt = 0, .uartParityErrCnt = 0 };
|
||||||
|
|
||||||
static bool mbusCommEnabled = true;
|
static bool mbusCommEnabled = true;
|
||||||
|
|
||||||
@ -262,15 +262,25 @@ void mbusCommISR() {
|
|||||||
uint32_t isrflags = READ_REG(mbusUart.Instance->SR);
|
uint32_t isrflags = READ_REG(mbusUart.Instance->SR);
|
||||||
|
|
||||||
if (((isrflags & USART_SR_RXNE) != RESET) || ((isrflags & USART_SR_ORE) != RESET)) {
|
if (((isrflags & USART_SR_RXNE) != RESET) || ((isrflags & USART_SR_ORE) != RESET)) {
|
||||||
|
if ((isrflags & USART_SR_ORE) != RESET) {
|
||||||
|
mbusCommStats.uartOverrunCnt += 1;
|
||||||
|
}
|
||||||
|
// it is required to read the DR in any case here, not only when the buffer has space
|
||||||
|
// otherwise the interrupt flag won't be disabled, particularly important in case of
|
||||||
|
// ORE
|
||||||
uint8_t data = (uint8_t)(mbusUart.Instance->DR & (uint8_t)0x00FF);
|
uint8_t data = (uint8_t)(mbusUart.Instance->DR & (uint8_t)0x00FF);
|
||||||
// coloredMsg(LOG_RED, false, "mbc isr 0x%02x", data);
|
|
||||||
if (mbusCommHandle.receiveBuffer.writeIdx < mbusCommHandle.receiveBuffer.size) {
|
if (mbusCommHandle.receiveBuffer.writeIdx < mbusCommHandle.receiveBuffer.size) {
|
||||||
mbusCommHandle.receiveBuffer.buffer[mbusCommHandle.receiveBuffer.writeIdx] = data;
|
mbusCommHandle.receiveBuffer.buffer[mbusCommHandle.receiveBuffer.writeIdx] = data;
|
||||||
mbusCommHandle.receiveBuffer.writeIdx += 1;
|
mbusCommHandle.receiveBuffer.writeIdx += 1;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
coloredMsg(LOG_RED, false, "mbc isr error 0x%02x", isrflags);
|
if ((isrflags & USART_SR_FE) != RESET) {
|
||||||
|
mbusCommStats.uartFramingErrCnt += 1;
|
||||||
|
}
|
||||||
|
if ((isrflags & USART_SR_PE) != RESET) {
|
||||||
|
mbusCommStats.uartParityErrCnt += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -484,7 +494,7 @@ void mbusCommExec() {
|
|||||||
|
|
||||||
case MBCS_TIMEOUT:
|
case MBCS_TIMEOUT:
|
||||||
coloredMsg(LOG_RED, false, "mbc hre [%d] state TIMEOUT", mbusCommHandle.requestId);
|
coloredMsg(LOG_RED, false, "mbc hre [%d] state TIMEOUT", mbusCommHandle.requestId);
|
||||||
mbusCommStats.errorCnt += 1;
|
mbusCommStats.mbusErrorCnt += 1;
|
||||||
mbusCommHandle.device->failures += 1;
|
mbusCommHandle.device->failures += 1;
|
||||||
mbusCommHandle.startTime = 0; // disable timeout
|
mbusCommHandle.startTime = 0; // disable timeout
|
||||||
mbusCommHandle.waitForOctet = false; // disable receiver
|
mbusCommHandle.waitForOctet = false; // disable receiver
|
||||||
@ -527,18 +537,14 @@ static e_mbusCommRequestResult mbusCommRequest(t_mbusDevice *mbusDevice) {
|
|||||||
mbusCommHandle.device = mbusDevice;
|
mbusCommHandle.device = mbusDevice;
|
||||||
mbusDevice->requests += 1;
|
mbusDevice->requests += 1;
|
||||||
|
|
||||||
coloredMsg(LOG_YELLOW, true, "mbc mcr [%d] new request %s R:%d F:%d GRC:%d GEC:%d",
|
coloredMsg(LOG_YELLOW, true, "mbc mcr [%d] new request %s",
|
||||||
mbusCommHandle.requestId,
|
mbusCommHandle.requestId,
|
||||||
mbusDevice->deviceName,
|
mbusDevice->deviceName);
|
||||||
mbusDevice->requests,
|
|
||||||
mbusDevice->failures,
|
|
||||||
mbusCommStats.requestCnt,
|
|
||||||
mbusCommStats.errorCnt);
|
|
||||||
|
|
||||||
oledPrint(OLED_SCREEN0, mbusDevice->deviceName);
|
oledPrint(OLED_SCREEN0, mbusDevice->deviceName);
|
||||||
res = MBCRR_TRIGGERED;
|
res = MBCRR_TRIGGERED;
|
||||||
|
|
||||||
mbusCommStats.requestCnt += 1;
|
mbusCommStats.mbusRequestCnt += 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
res = MBCRR_DISABLED;
|
res = MBCRR_DISABLED;
|
||||||
|
@ -56,10 +56,11 @@ static void mqttStatusPublisher(void *handle) {
|
|||||||
t_mbusCommStats *mbusCommStats = mbusCommGetStats();
|
t_mbusCommStats *mbusCommStats = mbusCommGetStats();
|
||||||
t_deviceStats* globalDeviceStats = getGlobalDeviceStats();
|
t_deviceStats* globalDeviceStats = getGlobalDeviceStats();
|
||||||
|
|
||||||
char buf[128];
|
char buf[256];
|
||||||
uint32_t uptime = HAL_GetTick() / 1000;
|
uint32_t uptime = HAL_GetTick() / 1000;
|
||||||
snprintf(buf, sizeof(buf), "{\"uptime\":\"%ld\", \"runningHours\":\"%ld\", \"powerCycles\":\"%ld\", \"tasks\":\"%d\", \"requests\":\"%ld\", \"errors\":\"%ld\", \"overruns\":\"%ld\"}",
|
snprintf(buf, sizeof(buf), "{\"uptime\":\"%ld\", \"runningHours\":\"%ld\", \"powerCycles\":\"%ld\", \"tasks\":\"%d\", \"requests\":\"%ld\", \"errors\":\"%ld\", \"overrun\":\"%ld\", \"framing\":\"%ld\", \"parity\":\"%ld\"}",
|
||||||
uptime, globalDeviceStats->totalRunningHours, globalDeviceStats->totalPowercycles, schTaskCnt(), mbusCommStats->requestCnt, mbusCommStats->errorCnt, mbusCommStats->overrunCnt);
|
uptime, globalDeviceStats->totalRunningHours, globalDeviceStats->totalPowercycles, schTaskCnt(), mbusCommStats->mbusRequestCnt, mbusCommStats->mbusErrorCnt,
|
||||||
|
mbusCommStats->uartOverrunCnt, mbusCommStats->uartFramingErrCnt, mbusCommStats->uartParityErrCnt);
|
||||||
bool res = publish(&mqttClient, StatusTopic, (const uint8_t*)buf, strlen(buf), false);
|
bool res = publish(&mqttClient, StatusTopic, (const uint8_t*)buf, strlen(buf), false);
|
||||||
coloredMsg(LOG_GREEN, false, "mqch, publish returned %d", res);
|
coloredMsg(LOG_GREEN, false, "mqch, publish returned %d", res);
|
||||||
|
|
||||||
@ -70,9 +71,9 @@ static void mqttStatusPublisher(void *handle) {
|
|||||||
oledPrintf(OLED_SCREEN1, "Network available:%d", isNetworkAvailable());
|
oledPrintf(OLED_SCREEN1, "Network available:%d", isNetworkAvailable());
|
||||||
oledPrintf(OLED_SCREEN1, "Uptime:%ld", uptime);
|
oledPrintf(OLED_SCREEN1, "Uptime:%ld", uptime);
|
||||||
oledPrintf(OLED_SCREEN1, "PowerCycl:%d", globalDeviceStats->totalPowercycles);
|
oledPrintf(OLED_SCREEN1, "PowerCycl:%d", globalDeviceStats->totalPowercycles);
|
||||||
oledPrintf(OLED_SCREEN1, "Req:%ld", mbusCommStats->requestCnt);
|
oledPrintf(OLED_SCREEN1, "Req:%ld", mbusCommStats->mbusRequestCnt);
|
||||||
oledPrintf(OLED_SCREEN1, "Err:%ld", mbusCommStats->errorCnt);
|
oledPrintf(OLED_SCREEN1, "Err:%ld", mbusCommStats->mbusErrorCnt);
|
||||||
oledPrintf(OLED_SCREEN1, "Ovrrn:%d", mbusCommStats->overrunCnt);
|
oledPrintf(OLED_SCREEN1, "Uart:%d", mbusCommStats->uartOverrunCnt + mbusCommStats->uartFramingErrCnt + mbusCommStats->uartParityErrCnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mqttCommHandler(void *handle) {
|
void mqttCommHandler(void *handle) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user