diff --git a/cube/User/Inc/ringbuffer.h b/cube/User/Inc/ringbuffer.h index e4c141b..6d48ab6 100644 --- a/cube/User/Inc/ringbuffer.h +++ b/cube/User/Inc/ringbuffer.h @@ -16,7 +16,6 @@ void ringbufferInit(ringbuffer_t *handle, uint32_t bufferSize); void ringbufferFree(ringbuffer_t *handle); int ringbufferPut(ringbuffer_t *handle, uint8_t *data, uint32_t dataLen); -int ringbufferPutOne(ringbuffer_t *handle, uint8_t data); bool ringbufferEmpty(ringbuffer_t *handle); int ringbufferGetOne(ringbuffer_t *handle); // if positive, cast to uint8_t and be happy, if negative error diff --git a/cube/User/Src/mbusComm.c b/cube/User/Src/mbusComm.c index 4a287e9..3f88bbb 100644 --- a/cube/User/Src/mbusComm.c +++ b/cube/User/Src/mbusComm.c @@ -79,17 +79,24 @@ typedef struct { uint8_t stop; } t_longframe; +typedef struct { + uint16_t size; + uint16_t readIdx; + uint16_t writeIdx; + uint8_t *buffer; +} linearBuffer_t; + typedef struct { uint32_t requestId; e_mbusCommState state; uint8_t retryCnt; uint8_t cmd; uint8_t addr; - uint8_t sendBuf[5]; + linearBuffer_t sendBuffer; + linearBuffer_t receiveBuffer; uint8_t receiveCnt; bool waitForOctet; bool receiving; - ringbuffer_t receiveBuffer; e_mbusCommResult result; t_longframe frame; t_mbusDevice *device; @@ -249,18 +256,17 @@ static void parseAndPrintFrame() { void mbusCommISR() { -// coloredMsg(LOG_RED, false, "mbc isr"); show(DEBUG_1, TOGGLE); 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)) { uint8_t data = (uint8_t)(mbusUart.Instance->DR & (uint8_t)0x00FF); 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; } else { coloredMsg(LOG_RED, false, "mbc isr error 0x%02x", isrflags); @@ -274,17 +280,14 @@ void mbusCommExec() { uint8_t receivedOctet = 0; if (mbusCommHandle.waitForOctet) { - // when data available, take from buffer and put into receivedOctet - // otherwise return - int ro = ringbufferGetOne(&(mbusCommHandle.receiveBuffer)); - if (-1 == ro) { - // coloredMsg(LOG_RED, false, "RO: nothing"); + if (mbusCommHandle.receiveBuffer.readIdx >= mbusCommHandle.receiveBuffer.writeIdx) { return; } + receivedOctet = mbusCommHandle.receiveBuffer.buffer[mbusCommHandle.receiveBuffer.readIdx]; + mbusCommHandle.receiveBuffer.readIdx += 1; + mbusCommHandle.waitForOctet = false; - receivedOctet = (uint8_t) ro; - coloredMsg(LOG_RED, false, "RO: 0x%02x", receivedOctet); } @@ -295,11 +298,13 @@ void mbusCommExec() { case MBCS_SEND: coloredMsg(LOG_YELLOW, false, "mbc hre [%d] state SEND", mbusCommHandle.requestId); - mbusCommHandle.sendBuf[0] = 0x10; - mbusCommHandle.sendBuf[1] = mbusCommHandle.cmd; - mbusCommHandle.sendBuf[2] = mbusCommHandle.addr; - mbusCommHandle.sendBuf[3] = mbusCommHandle.cmd + mbusCommHandle.addr; // checksum - mbusCommHandle.sendBuf[4] = 0x16; + mbusCommHandle.sendBuffer.buffer[0] = 0x10; + mbusCommHandle.sendBuffer.buffer[1] = mbusCommHandle.cmd; + mbusCommHandle.sendBuffer.buffer[2] = mbusCommHandle.addr; + mbusCommHandle.sendBuffer.buffer[3] = mbusCommHandle.cmd + mbusCommHandle.addr; // checksum + mbusCommHandle.sendBuffer.buffer[4] = 0x16; + mbusCommHandle.sendBuffer.readIdx = 0; + mbusCommHandle.sendBuffer.writeIdx = 5; mbusCommHandle.state = MBCS_SEND_CONTINUED; // no break !! @@ -314,7 +319,7 @@ void mbusCommExec() { } else { mbusCommHandle.retryCnt = 0; // 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 // interrupt callback mbusCommHandle.state = MBCS_SENDING_DONE; @@ -332,6 +337,8 @@ void mbusCommExec() { frontendEnable(); calculatedChksum = 0; userdataIdx = 0; + mbusCommHandle.receiveBuffer.readIdx = 0; + mbusCommHandle.receiveBuffer.writeIdx = 0; mbusCommHandle.waitForOctet = true; mbusCommHandle.state = MBCS_START1; break; @@ -707,7 +714,16 @@ void mbusCommInit() { __HAL_UART_ENABLE_IT(&mbusUart, UART_IT_ERR); __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 schAdd(mbusCommScheduler, NULL, 0, 1000); diff --git a/cube/User/Src/ringbuffer.c b/cube/User/Src/ringbuffer.c index 4273706..b98105f 100644 --- a/cube/User/Src/ringbuffer.c +++ b/cube/User/Src/ringbuffer.c @@ -19,18 +19,6 @@ void ringbufferFree(ringbuffer_t *handle) { 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) { uint32_t freeSpace = 0; diff --git a/tests/Makefile b/tests/Makefile index f7af580..5a21bf4 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,6 +1,6 @@ CFLAGS=-I../cube/User/Inc -DTEST -test: ringbuffer.o logger.o test.o +test: ringbuffer.o test.o gcc -o $@ -lcunit $^ ringbuffer.o: ../cube/User/Src/ringbuffer.c diff --git a/tests/test.c b/tests/test.c index b97d100..972cf74 100644 --- a/tests/test.c +++ b/tests/test.c @@ -2,7 +2,7 @@ #include #include #include -#include +//#include // #define DEBUG @@ -10,6 +10,7 @@ ringbuffer_t rb; + void printRingbuffer(ringbuffer_t *rb) { printf("Ringbuffer:\n"); 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) { logInit(); return 0; @@ -949,7 +1017,7 @@ void testLogger2() { CU_ASSERT(strcmp(goldValueFullNotOk, buffer) != 0); CU_ASSERT(strcmp(goldValueFullOk, buffer) == 0); } - +*/ 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", testRingbuffer16)) || (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 ) { CU_cleanup_registry(); return CU_get_error(); } +/* CU_pSuite loggerSuite = CU_add_suite("Suite_Logger", init_suite_logger, clean_suite_logger); if (NULL == loggerSuite) { CU_cleanup_registry(); @@ -999,7 +1070,7 @@ int main() { CU_cleanup_registry(); return CU_get_error(); } - +*/ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests();