working now?

This commit is contained in:
Wolfgang Hottgenroth 2020-11-25 10:02:38 +01:00
parent 7c63579390
commit edf1942ad3
Signed by: wn
GPG Key ID: 6C1E5E531E0D5D7F
6 changed files with 40 additions and 35 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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;

View File

@ -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");

View File

@ -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;

View File

@ -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) {