Modified FIFO
- renamed functions to fifo_add and fifo_remove
- fifo is never full
- if it is full during fifo_add, last value is forgotten and new value
is added
| | |
| | | #endif |
| | | |
| | | |
| | | #define FIFO_SIZE 100 |
| | | #define FIFO_SIZE 16 |
| | | |
| | | struct _fifo_t { |
| | | int16_t wr; |
| | |
| | | |
| | | void fifo_init(fifo_t * fifo); |
| | | void fifo_clear(fifo_t * fifo); |
| | | bool_t fifo_push(fifo_t * fifo, int16_t value); |
| | | bool_t fifo_pop(fifo_t * fifo, int16_t * value); |
| | | bool_t fifo_add(fifo_t * fifo, int16_t value); |
| | | bool_t fifo_remove(fifo_t * fifo, int16_t * value); |
| | | bool_t fifo_count(fifo_t * fifo, int16_t * value); |
| | | |
| | | #ifdef __cplusplus |
| | |
| | | */ |
| | | |
| | | #include <stdio.h> |
| | | #include <inttypes.h> |
| | | #include "scpi/debug.h" |
| | | |
| | | /** |
| | |
| | | printf("**DEBUG: %s (\"", context->paramlist.cmd->pattern); |
| | | res = fwrite(context->paramlist.parameters, 1, context->paramlist.length, stdout); |
| | | (void)res; |
| | | printf("\" - %ld\r\n", (uint32_t)context->paramlist.length); |
| | | printf("\" - %" PRIu32 "\r\n", (uint32_t)context->paramlist.length); |
| | | |
| | | return TRUE; |
| | | } |
| | |
| | | //} |
| | | |
| | | // basic FIFO |
| | | fifo_pop((fifo_t *)context->error_queue, &result); |
| | | fifo_remove((fifo_t *)context->error_queue, &result); |
| | | |
| | | return result; |
| | | } |
| | |
| | | //xQueueSend((xQueueHandle)context->error_queue, &err, 0); |
| | | |
| | | // basic FIFO |
| | | fifo_push((fifo_t *)context->error_queue, err); |
| | | fifo_add((fifo_t *)context->error_queue, err); |
| | | } |
| | | /** |
| | | * Push error to queue |
| | |
| | | fifo->rd = 0; |
| | | } |
| | | |
| | | bool_t fifo_push(fifo_t * fifo, int16_t value) { |
| | | bool_t fifo_add(fifo_t * fifo, int16_t value) { |
| | | /* FIFO full? */ |
| | | if (fifo->wr == ((fifo->rd + fifo->size) % (fifo->size + 1))) { |
| | | return FALSE; |
| | | fifo_remove(fifo, NULL); |
| | | } |
| | | |
| | | fifo->data[fifo->wr] = value; |
| | |
| | | return TRUE; |
| | | } |
| | | |
| | | bool_t fifo_pop(fifo_t * fifo, int16_t * value) { |
| | | bool_t fifo_remove(fifo_t * fifo, int16_t * value) { |
| | | /* FIFO empty? */ |
| | | if (fifo->wr == fifo->rd) { |
| | | return FALSE; |
| | | } |
| | | |
| | | *value = fifo->data[fifo->rd]; |
| | | if(value) { |
| | | *value = fifo->data[fifo->rd]; |
| | | } |
| | | |
| | | fifo->rd = (fifo->rd + 1) % (fifo->size + 1); |
| | | |
| | |
| | | |
| | | |
| | | TEST_FIFO_COUNT(0); |
| | | CU_ASSERT_TRUE(fifo_push(&fifo, 1)); |
| | | CU_ASSERT_TRUE(fifo_add(&fifo, 1)); |
| | | TEST_FIFO_COUNT(1); |
| | | CU_ASSERT_TRUE(fifo_push(&fifo, 2)); |
| | | CU_ASSERT_TRUE(fifo_add(&fifo, 2)); |
| | | TEST_FIFO_COUNT(2); |
| | | CU_ASSERT_TRUE(fifo_push(&fifo, 3)); |
| | | CU_ASSERT_TRUE(fifo_add(&fifo, 3)); |
| | | TEST_FIFO_COUNT(3); |
| | | CU_ASSERT_TRUE(fifo_push(&fifo, 4)); |
| | | CU_ASSERT_TRUE(fifo_add(&fifo, 4)); |
| | | TEST_FIFO_COUNT(4); |
| | | CU_ASSERT_FALSE(fifo_push(&fifo, 1)); |
| | | CU_ASSERT_TRUE(fifo_add(&fifo, 1)); |
| | | TEST_FIFO_COUNT(4); |
| | | |
| | | CU_ASSERT_EQUAL(fifo.data[0], 1); |
| | |
| | | CU_ASSERT_EQUAL(fifo.data[2], 3); |
| | | CU_ASSERT_EQUAL(fifo.data[3], 4); |
| | | |
| | | CU_ASSERT_TRUE(fifo_pop(&fifo, &value)); |
| | | CU_ASSERT_EQUAL(value, 1); |
| | | TEST_FIFO_COUNT(3); |
| | | |
| | | CU_ASSERT_TRUE(fifo_push(&fifo, 5)); |
| | | TEST_FIFO_COUNT(4); |
| | | |
| | | CU_ASSERT_TRUE(fifo_pop(&fifo, &value)); |
| | | CU_ASSERT_TRUE(fifo_remove(&fifo, &value)); |
| | | CU_ASSERT_EQUAL(value, 2); |
| | | TEST_FIFO_COUNT(3); |
| | | |
| | | CU_ASSERT_TRUE(fifo_pop(&fifo, &value)); |
| | | CU_ASSERT_TRUE(fifo_add(&fifo, 5)); |
| | | TEST_FIFO_COUNT(4); |
| | | |
| | | CU_ASSERT_TRUE(fifo_remove(&fifo, &value)); |
| | | CU_ASSERT_EQUAL(value, 3); |
| | | TEST_FIFO_COUNT(3); |
| | | |
| | | CU_ASSERT_TRUE(fifo_remove(&fifo, &value)); |
| | | CU_ASSERT_EQUAL(value, 4); |
| | | TEST_FIFO_COUNT(2); |
| | | |
| | | CU_ASSERT_TRUE(fifo_pop(&fifo, &value)); |
| | | CU_ASSERT_EQUAL(value, 4); |
| | | CU_ASSERT_TRUE(fifo_remove(&fifo, &value)); |
| | | CU_ASSERT_EQUAL(value, 1); |
| | | TEST_FIFO_COUNT(1); |
| | | |
| | | CU_ASSERT_TRUE(fifo_pop(&fifo, &value)); |
| | | CU_ASSERT_TRUE(fifo_remove(&fifo, &value)); |
| | | CU_ASSERT_EQUAL(value, 5); |
| | | TEST_FIFO_COUNT(0); |
| | | |
| | | CU_ASSERT_FALSE(fifo_pop(&fifo, &value)); |
| | | CU_ASSERT_FALSE(fifo_remove(&fifo, &value)); |
| | | TEST_FIFO_COUNT(0); |
| | | } |
| | | |