refactoring meterbus
This commit is contained in:
parent
bdba2a79cd
commit
14bf178664
@ -16,7 +16,6 @@ void ringbufferInit(ringbuffer_t *handle, uint32_t bufferSize);
|
|||||||
void ringbufferFree(ringbuffer_t *handle);
|
void ringbufferFree(ringbuffer_t *handle);
|
||||||
|
|
||||||
int ringbufferPut(ringbuffer_t *handle, uint8_t *data, uint32_t dataLen);
|
int ringbufferPut(ringbuffer_t *handle, uint8_t *data, uint32_t dataLen);
|
||||||
int ringbufferPutOne(ringbuffer_t *handle, uint8_t data);
|
|
||||||
bool ringbufferEmpty(ringbuffer_t *handle);
|
bool ringbufferEmpty(ringbuffer_t *handle);
|
||||||
int ringbufferGetOne(ringbuffer_t *handle); // if positive, cast to uint8_t and be happy, if negative error
|
int ringbufferGetOne(ringbuffer_t *handle); // if positive, cast to uint8_t and be happy, if negative error
|
||||||
|
|
||||||
|
@ -79,17 +79,24 @@ typedef struct {
|
|||||||
uint8_t stop;
|
uint8_t stop;
|
||||||
} t_longframe;
|
} t_longframe;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t size;
|
||||||
|
uint16_t readIdx;
|
||||||
|
uint16_t writeIdx;
|
||||||
|
uint8_t *buffer;
|
||||||
|
} linearBuffer_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t requestId;
|
uint32_t requestId;
|
||||||
e_mbusCommState state;
|
e_mbusCommState state;
|
||||||
uint8_t retryCnt;
|
uint8_t retryCnt;
|
||||||
uint8_t cmd;
|
uint8_t cmd;
|
||||||
uint8_t addr;
|
uint8_t addr;
|
||||||
uint8_t sendBuf[5];
|
linearBuffer_t sendBuffer;
|
||||||
|
linearBuffer_t receiveBuffer;
|
||||||
uint8_t receiveCnt;
|
uint8_t receiveCnt;
|
||||||
bool waitForOctet;
|
bool waitForOctet;
|
||||||
bool receiving;
|
bool receiving;
|
||||||
ringbuffer_t receiveBuffer;
|
|
||||||
e_mbusCommResult result;
|
e_mbusCommResult result;
|
||||||
t_longframe frame;
|
t_longframe frame;
|
||||||
t_mbusDevice *device;
|
t_mbusDevice *device;
|
||||||
@ -249,18 +256,17 @@ static void parseAndPrintFrame() {
|
|||||||
|
|
||||||
|
|
||||||
void mbusCommISR() {
|
void mbusCommISR() {
|
||||||
// coloredMsg(LOG_RED, false, "mbc isr");
|
|
||||||
show(DEBUG_1, TOGGLE);
|
show(DEBUG_1, TOGGLE);
|
||||||
|
|
||||||
uint32_t isrflags = READ_REG(mbusUart.Instance->SR);
|
uint32_t isrflags = READ_REG(mbusUart.Instance->SR);
|
||||||
// uint32_t cr1its = READ_REG(mbusUart.Instance->CR1);
|
|
||||||
// uint32_t cr3its = READ_REG(mbusUart.Instance->CR3);
|
|
||||||
|
|
||||||
|
|
||||||
if (((isrflags & USART_SR_RXNE) != RESET) || ((isrflags & USART_SR_ORE) != RESET)) {
|
if (((isrflags & USART_SR_RXNE) != RESET) || ((isrflags & USART_SR_ORE) != RESET)) {
|
||||||
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);
|
coloredMsg(LOG_RED, false, "mbc isr 0x%02x", data);
|
||||||
ringbufferPutOne(&(mbusCommHandle.receiveBuffer), data);
|
if (mbusCommHandle.receiveBuffer.writeIdx < mbusCommHandle.receiveBuffer.size) {
|
||||||
|
mbusCommHandle.receiveBuffer.buffer[mbusCommHandle.receiveBuffer.writeIdx] = data;
|
||||||
|
mbusCommHandle.receiveBuffer.writeIdx += 1;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
coloredMsg(LOG_RED, false, "mbc isr error 0x%02x", isrflags);
|
coloredMsg(LOG_RED, false, "mbc isr error 0x%02x", isrflags);
|
||||||
@ -274,17 +280,14 @@ void mbusCommExec() {
|
|||||||
|
|
||||||
uint8_t receivedOctet = 0;
|
uint8_t receivedOctet = 0;
|
||||||
if (mbusCommHandle.waitForOctet) {
|
if (mbusCommHandle.waitForOctet) {
|
||||||
// when data available, take from buffer and put into receivedOctet
|
if (mbusCommHandle.receiveBuffer.readIdx >= mbusCommHandle.receiveBuffer.writeIdx) {
|
||||||
// otherwise return
|
|
||||||
int ro = ringbufferGetOne(&(mbusCommHandle.receiveBuffer));
|
|
||||||
if (-1 == ro) {
|
|
||||||
// coloredMsg(LOG_RED, false, "RO: nothing");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
receivedOctet = mbusCommHandle.receiveBuffer.buffer[mbusCommHandle.receiveBuffer.readIdx];
|
||||||
|
mbusCommHandle.receiveBuffer.readIdx += 1;
|
||||||
|
|
||||||
mbusCommHandle.waitForOctet = false;
|
mbusCommHandle.waitForOctet = false;
|
||||||
receivedOctet = (uint8_t) ro;
|
|
||||||
coloredMsg(LOG_RED, false, "RO: 0x%02x", receivedOctet);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -295,11 +298,13 @@ void mbusCommExec() {
|
|||||||
|
|
||||||
case MBCS_SEND:
|
case MBCS_SEND:
|
||||||
coloredMsg(LOG_YELLOW, false, "mbc hre [%d] state SEND", mbusCommHandle.requestId);
|
coloredMsg(LOG_YELLOW, false, "mbc hre [%d] state SEND", mbusCommHandle.requestId);
|
||||||
mbusCommHandle.sendBuf[0] = 0x10;
|
mbusCommHandle.sendBuffer.buffer[0] = 0x10;
|
||||||
mbusCommHandle.sendBuf[1] = mbusCommHandle.cmd;
|
mbusCommHandle.sendBuffer.buffer[1] = mbusCommHandle.cmd;
|
||||||
mbusCommHandle.sendBuf[2] = mbusCommHandle.addr;
|
mbusCommHandle.sendBuffer.buffer[2] = mbusCommHandle.addr;
|
||||||
mbusCommHandle.sendBuf[3] = mbusCommHandle.cmd + mbusCommHandle.addr; // checksum
|
mbusCommHandle.sendBuffer.buffer[3] = mbusCommHandle.cmd + mbusCommHandle.addr; // checksum
|
||||||
mbusCommHandle.sendBuf[4] = 0x16;
|
mbusCommHandle.sendBuffer.buffer[4] = 0x16;
|
||||||
|
mbusCommHandle.sendBuffer.readIdx = 0;
|
||||||
|
mbusCommHandle.sendBuffer.writeIdx = 5;
|
||||||
mbusCommHandle.state = MBCS_SEND_CONTINUED;
|
mbusCommHandle.state = MBCS_SEND_CONTINUED;
|
||||||
// no break !!
|
// no break !!
|
||||||
|
|
||||||
@ -314,7 +319,7 @@ void mbusCommExec() {
|
|||||||
} else {
|
} else {
|
||||||
mbusCommHandle.retryCnt = 0;
|
mbusCommHandle.retryCnt = 0;
|
||||||
// FIXME sending possibly needs to be done in a different way
|
// FIXME sending possibly needs to be done in a different way
|
||||||
HAL_UART_Transmit(&mbusUart, mbusCommHandle.sendBuf, 5, HAL_MAX_DELAY);
|
HAL_UART_Transmit(&mbusUart, mbusCommHandle.sendBuffer.buffer, 5, HAL_MAX_DELAY);
|
||||||
// transition from here to SENDING_DONE is initiate by mbusCommTxCpltCallback
|
// transition from here to SENDING_DONE is initiate by mbusCommTxCpltCallback
|
||||||
// interrupt callback
|
// interrupt callback
|
||||||
mbusCommHandle.state = MBCS_SENDING_DONE;
|
mbusCommHandle.state = MBCS_SENDING_DONE;
|
||||||
@ -332,6 +337,8 @@ void mbusCommExec() {
|
|||||||
frontendEnable();
|
frontendEnable();
|
||||||
calculatedChksum = 0;
|
calculatedChksum = 0;
|
||||||
userdataIdx = 0;
|
userdataIdx = 0;
|
||||||
|
mbusCommHandle.receiveBuffer.readIdx = 0;
|
||||||
|
mbusCommHandle.receiveBuffer.writeIdx = 0;
|
||||||
mbusCommHandle.waitForOctet = true;
|
mbusCommHandle.waitForOctet = true;
|
||||||
mbusCommHandle.state = MBCS_START1;
|
mbusCommHandle.state = MBCS_START1;
|
||||||
break;
|
break;
|
||||||
@ -707,7 +714,16 @@ void mbusCommInit() {
|
|||||||
__HAL_UART_ENABLE_IT(&mbusUart, UART_IT_ERR);
|
__HAL_UART_ENABLE_IT(&mbusUart, UART_IT_ERR);
|
||||||
__HAL_UART_ENABLE_IT(&mbusUart, UART_IT_RXNE);
|
__HAL_UART_ENABLE_IT(&mbusUart, UART_IT_RXNE);
|
||||||
|
|
||||||
ringbufferInit(&(mbusCommHandle.receiveBuffer), 256);
|
mbusCommHandle.receiveBuffer.size = 256;
|
||||||
|
mbusCommHandle.receiveBuffer.buffer = (uint8_t*) malloc(mbusCommHandle.receiveBuffer.size);
|
||||||
|
mbusCommHandle.receiveBuffer.readIdx = 0;
|
||||||
|
mbusCommHandle.receiveBuffer.writeIdx = 0;
|
||||||
|
|
||||||
|
mbusCommHandle.sendBuffer.size = 8;
|
||||||
|
mbusCommHandle.sendBuffer.buffer = (uint8_t*) malloc(mbusCommHandle.sendBuffer.size);
|
||||||
|
mbusCommHandle.sendBuffer.readIdx = 0;
|
||||||
|
mbusCommHandle.sendBuffer.writeIdx = 0;
|
||||||
|
|
||||||
|
|
||||||
// FIXME
|
// FIXME
|
||||||
schAdd(mbusCommScheduler, NULL, 0, 1000);
|
schAdd(mbusCommScheduler, NULL, 0, 1000);
|
||||||
|
@ -19,18 +19,6 @@ void ringbufferFree(ringbuffer_t *handle) {
|
|||||||
handle->bufferWriteIdx = 0;
|
handle->bufferWriteIdx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ringbufferPutOne(ringbuffer_t *handle, uint8_t data) {
|
|
||||||
int retCode = -1;
|
|
||||||
if (handle->bufferReadIdx != handle->bufferWriteIdx) {
|
|
||||||
*(handle->buffer + handle->bufferWriteIdx) = data;
|
|
||||||
handle->bufferWriteIdx += 1;
|
|
||||||
if (handle->bufferWriteIdx == handle->bufferSize) {
|
|
||||||
handle->bufferWriteIdx = 0;
|
|
||||||
}
|
|
||||||
retCode = 0;
|
|
||||||
}
|
|
||||||
return retCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ringbufferPut(ringbuffer_t *handle, uint8_t *data, uint32_t dataLen) {
|
int ringbufferPut(ringbuffer_t *handle, uint8_t *data, uint32_t dataLen) {
|
||||||
uint32_t freeSpace = 0;
|
uint32_t freeSpace = 0;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
CFLAGS=-I../cube/User/Inc -DTEST
|
CFLAGS=-I../cube/User/Inc -DTEST
|
||||||
|
|
||||||
test: ringbuffer.o logger.o test.o
|
test: ringbuffer.o test.o
|
||||||
gcc -o $@ -lcunit $^
|
gcc -o $@ -lcunit $^
|
||||||
|
|
||||||
ringbuffer.o: ../cube/User/Src/ringbuffer.c
|
ringbuffer.o: ../cube/User/Src/ringbuffer.c
|
||||||
|
77
tests/test.c
77
tests/test.c
@ -2,7 +2,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <ringbuffer.h>
|
#include <ringbuffer.h>
|
||||||
#include <logger.h>
|
//#include <logger.h>
|
||||||
|
|
||||||
|
|
||||||
// #define DEBUG
|
// #define DEBUG
|
||||||
@ -10,6 +10,7 @@
|
|||||||
ringbuffer_t rb;
|
ringbuffer_t rb;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void printRingbuffer(ringbuffer_t *rb) {
|
void printRingbuffer(ringbuffer_t *rb) {
|
||||||
printf("Ringbuffer:\n");
|
printf("Ringbuffer:\n");
|
||||||
printf(" Size: %u\n", rb->bufferSize);
|
printf(" Size: %u\n", rb->bufferSize);
|
||||||
@ -817,8 +818,75 @@ void testRingbuffer99() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void testRingbuffer100() {
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("Initialize ringbuffer\n");
|
||||||
|
#endif
|
||||||
|
ringbufferInit(&rb, 16);
|
||||||
|
#ifdef DEBUG
|
||||||
|
printRingbuffer(&rb);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CU_ASSERT(rb.buffer != NULL);
|
||||||
|
CU_ASSERT(rb.bufferSize == 16);
|
||||||
|
CU_ASSERT(rb.bufferWriteIdx == 0);
|
||||||
|
CU_ASSERT(rb.bufferReadIdx == 0);
|
||||||
|
|
||||||
|
CU_ASSERT(rb.buffer[0] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[1] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[2] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[3] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[4] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[5] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[6] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[7] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[8] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[9] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[10] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[11] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[12] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[13] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[14] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[15] == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void testRingbuffer101() {
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("\nPut 1 chars in buffer\n");
|
||||||
|
#endif
|
||||||
|
int r = ringbufferPutOne(&rb, 'a');
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("r = %d\n", r);
|
||||||
|
printRingbuffer(&rb);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CU_ASSERT(r == 0);
|
||||||
|
CU_ASSERT(rb.buffer != NULL);
|
||||||
|
CU_ASSERT(rb.bufferSize == 16);
|
||||||
|
CU_ASSERT(rb.bufferWriteIdx == 1);
|
||||||
|
CU_ASSERT(rb.bufferReadIdx == 0);
|
||||||
|
|
||||||
|
CU_ASSERT(rb.buffer[0] == 'a');
|
||||||
|
CU_ASSERT(rb.buffer[1] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[2] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[3] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[4] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[5] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[6] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[7] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[8] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[9] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[10] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[11] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[12] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[13] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[14] == 0);
|
||||||
|
CU_ASSERT(rb.buffer[15] == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
int init_suite_logger(void) {
|
int init_suite_logger(void) {
|
||||||
logInit();
|
logInit();
|
||||||
return 0;
|
return 0;
|
||||||
@ -949,7 +1017,7 @@ void testLogger2() {
|
|||||||
CU_ASSERT(strcmp(goldValueFullNotOk, buffer) != 0);
|
CU_ASSERT(strcmp(goldValueFullNotOk, buffer) != 0);
|
||||||
CU_ASSERT(strcmp(goldValueFullOk, buffer) == 0);
|
CU_ASSERT(strcmp(goldValueFullOk, buffer) == 0);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
@ -980,11 +1048,14 @@ int main() {
|
|||||||
(NULL == CU_add_test(ringbufferSuite, "test 14 of ringbuffer", testRingbuffer15)) ||
|
(NULL == CU_add_test(ringbufferSuite, "test 14 of ringbuffer", testRingbuffer15)) ||
|
||||||
(NULL == CU_add_test(ringbufferSuite, "test 14 of ringbuffer", testRingbuffer16)) ||
|
(NULL == CU_add_test(ringbufferSuite, "test 14 of ringbuffer", testRingbuffer16)) ||
|
||||||
(NULL == CU_add_test(ringbufferSuite, "test 99 of ringbuffer, free", testRingbuffer99)) ||
|
(NULL == CU_add_test(ringbufferSuite, "test 99 of ringbuffer, free", testRingbuffer99)) ||
|
||||||
|
(NULL == CU_add_test(ringbufferSuite, "test 100 of ringbuffer, free", testRingbuffer100)) ||
|
||||||
|
(NULL == CU_add_test(ringbufferSuite, "test 101 of ringbuffer, free", testRingbuffer101)) ||
|
||||||
0 ) {
|
0 ) {
|
||||||
CU_cleanup_registry();
|
CU_cleanup_registry();
|
||||||
return CU_get_error();
|
return CU_get_error();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
CU_pSuite loggerSuite = CU_add_suite("Suite_Logger", init_suite_logger, clean_suite_logger);
|
CU_pSuite loggerSuite = CU_add_suite("Suite_Logger", init_suite_logger, clean_suite_logger);
|
||||||
if (NULL == loggerSuite) {
|
if (NULL == loggerSuite) {
|
||||||
CU_cleanup_registry();
|
CU_cleanup_registry();
|
||||||
@ -999,7 +1070,7 @@ int main() {
|
|||||||
CU_cleanup_registry();
|
CU_cleanup_registry();
|
||||||
return CU_get_error();
|
return CU_get_error();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
CU_basic_set_mode(CU_BRM_VERBOSE);
|
CU_basic_set_mode(CU_BRM_VERBOSE);
|
||||||
CU_basic_run_tests();
|
CU_basic_run_tests();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user