extern int32_t ciaaSerialDevices_read(ciaaDevices_deviceType const * const device, uint8_t * const buf, uint32_t nbyte) { /* get serial device */ ciaaSerialDevices_deviceType * serialDevice = (ciaaSerialDevices_deviceType*) device->layer; int32_t ret = 0; /* if the rx buffer is not empty */ if (!ciaaLibs_circBufEmpty(&serialDevice->rxBuf)) { /* try to read nbyte from rxBuf and store it to the user buffer */ ret = ciaaLibs_circBufGet(&serialDevice->rxBuf, buf, nbyte); } else { /* There aren't data */ if(serialDevice->flags & ciaaSerialDevices_NONBLOCK_MODE) { /* We are in non blocking mode */ /* We should do a blocking call...*/ ciaaPOSIX_errno = EAGAIN; /* shall return -1 and set errno to [EAGAIN]. */ ret = -1; } else { /* We are in blocking mode */ /* TODO improve this: https://github.com/ciaa/Firmware/issues/88 */ serialDevice->device->ioctl(device->loLayer, ciaaPOSIX_IOCTL_SET_ENABLE_RX_INTERRUPT, (void*)false); /* get task id and function for waking up the task later */ GetTaskID(&serialDevice->blocked.taskID); serialDevice->blocked.fct = (void*) ciaaSerialDevices_read; /* TODO improve this: https://github.com/ciaa/Firmware/issues/88 */ serialDevice->device->ioctl(device->loLayer, ciaaPOSIX_IOCTL_SET_ENABLE_RX_INTERRUPT, (void*)true); /* if no data wait for it */ #ifdef POSIXE WaitEvent(POSIXE); ClearEvent(POSIXE); #endif /* after the wait is not needed to check if data is avaibale on the * buffer. The event will be set first after adding some data into it */ /* try to read nbyte from rxBuf and store it to the user buffer */ ret = ciaaLibs_circBufGet(&serialDevice->rxBuf, buf, nbyte); } } return ret; }
/** \brief test ciaaLibs_circBufEmpty and ciaaLibs_circBufFull **/ void test_ciaaLibs_circBufEmptyFull(void) { ciaaLibs_CircBufType * cbuf; size_t ret; char * from = "0hallo123-10HALLO12-20hallo12-30HALLO12-40HALLO12-50hallo12-60-4"; /*0123456789012345678901234567890123456789012345678901234567890123*/ char to[100]; /* use linux malloc, free and memcpy */ ciaaPOSIX_malloc_StubWithCallback(malloc); ciaaPOSIX_memcpy_StubWithCallback(memcpy); ciaaPOSIX_free_StubWithCallback(free); /* creates a cicular buffer with 64 bytes */ cbuf = ciaaLibs_circBufNew(64); TEST_ASSERT_TRUE(NULL != cbuf); /* buffer is empty */ TEST_ASSERT_TRUE(ciaaLibs_circBufEmpty(cbuf)); TEST_ASSERT_FALSE(ciaaLibs_circBufFull(cbuf)); ciaaLibs_circBufPut(cbuf, (void*)from, 10); /* buffer is not empty neither full */ TEST_ASSERT_FALSE(ciaaLibs_circBufEmpty(cbuf)); TEST_ASSERT_FALSE(ciaaLibs_circBufFull(cbuf)); ciaaLibs_circBufPut(cbuf, (void*)from, 53); /* buffer is full */ TEST_ASSERT_FALSE(ciaaLibs_circBufEmpty(cbuf)); TEST_ASSERT_TRUE(ciaaLibs_circBufFull(cbuf)); ciaaLibs_circBufGet(cbuf, to, 30); /* buffer is not empty neither full */ TEST_ASSERT_FALSE(ciaaLibs_circBufEmpty(cbuf)); TEST_ASSERT_FALSE(ciaaLibs_circBufFull(cbuf)); ciaaLibs_circBufPut(cbuf, from, 30); /* buffer is full */ TEST_ASSERT_FALSE(ciaaLibs_circBufEmpty(cbuf)); TEST_ASSERT_TRUE(ciaaLibs_circBufFull(cbuf)); ciaaLibs_circBufGet(cbuf, to, 63); /* buffer is empty */ TEST_ASSERT_TRUE(ciaaLibs_circBufEmpty(cbuf)); TEST_ASSERT_FALSE(ciaaLibs_circBufFull(cbuf)); /* release buffer */ ciaaLibs_circBufRel(cbuf); }
/** \brief test: ** - ciaaLibs_circBufSpace ** - ciaaLibs_circBufRawSpace ** - ciaaLibs_circBufCount ** - ciaaLibs_circBufRawCount **/ void test_ciaaLibs_circBufSpaceAndCount(void) { ciaaLibs_CircBufType * cbuf; char * data = "hallo world 123456789012345678901234567890213456789012345678901234567890"; char to[100]; size_t ret; /* use linux malloc */ ciaaPOSIX_malloc_StubWithCallback(malloc); ciaaPOSIX_memcpy_StubWithCallback(memcpy); /* try to create a buffer but no mem is available */ cbuf = ciaaLibs_circBufNew(64); TEST_ASSERT_TRUE(cbuf != NULL); /* 63 bytes shall be free */ TEST_ASSERT_EQUAL_INT(63, ciaaLibs_circBufSpace(cbuf, cbuf->head)); TEST_ASSERT_EQUAL_INT(63, ciaaLibs_circBufRawSpace(cbuf, cbuf->head)); /* 0 bytes shall be occupied */ TEST_ASSERT_EQUAL_INT(0, ciaaLibs_circBufCount(cbuf, cbuf->tail)); TEST_ASSERT_EQUAL_INT(0, ciaaLibs_circBufRawCount(cbuf, cbuf->tail)); /* put 40 bytes */ TEST_ASSERT_TRUE(40 == ciaaLibs_circBufPut(cbuf, data, 40)); /* 23 bytes shall be free */ TEST_ASSERT_EQUAL_INT(23, ciaaLibs_circBufSpace(cbuf, cbuf->head)); TEST_ASSERT_EQUAL_INT(23, ciaaLibs_circBufRawSpace(cbuf, cbuf->head)); /* 40 bytes shall be occupied */ TEST_ASSERT_EQUAL_INT(40, ciaaLibs_circBufCount(cbuf, cbuf->tail)); TEST_ASSERT_EQUAL_INT(40, ciaaLibs_circBufRawCount(cbuf, cbuf->tail)); /* get 30 bytes */ ret = ciaaLibs_circBufGet(cbuf, to, 30); TEST_ASSERT_EQUAL_INT(30, ret); /* 53 bytes shall be free */ TEST_ASSERT_EQUAL_INT(53, ciaaLibs_circBufSpace(cbuf, cbuf->head)); TEST_ASSERT_EQUAL_INT(24, ciaaLibs_circBufRawSpace(cbuf, cbuf->head)); /* 10 bytes shall be occupied */ TEST_ASSERT_EQUAL_INT(10, ciaaLibs_circBufCount(cbuf, cbuf->tail)); TEST_ASSERT_EQUAL_INT(10, ciaaLibs_circBufRawCount(cbuf, cbuf->tail)); /* put 50 */ TEST_ASSERT_EQUAL_INT(50, ciaaLibs_circBufPut(cbuf, data, 50)); /* 3 bytes shall be free */ TEST_ASSERT_EQUAL_INT(3, ciaaLibs_circBufSpace(cbuf, cbuf->head)); TEST_ASSERT_EQUAL_INT(3, ciaaLibs_circBufRawSpace(cbuf, cbuf->head)); /* 60 bytes shall be occupied */ TEST_ASSERT_EQUAL_INT(60, ciaaLibs_circBufCount(cbuf, cbuf->tail)); TEST_ASSERT_EQUAL_INT(34, ciaaLibs_circBufRawCount(cbuf, cbuf->tail)); /* free memory */ free(cbuf); }
/** \brief test ciaaLibs_circBufGet and ciaaLibs_circBufPut **/ void test_ciaaLibs_circBufPutGet(void) { ciaaLibs_CircBufType * cbuf; size_t ret; char * from = "0hallo123-10HALLO12-20hallo12-30HALLO12-40HALLO12-50hallo12-60-4"; /*0123456789012345678901234567890123456789012345678901234567890123*/ char to[100]; /* use linux malloc, free and memcpy */ ciaaPOSIX_malloc_StubWithCallback(malloc); ciaaPOSIX_memcpy_StubWithCallback(memcpy); ciaaPOSIX_free_StubWithCallback(free); /* creates a cicular buffer with 64 bytes */ cbuf = ciaaLibs_circBufNew(64); TEST_ASSERT_TRUE(NULL != cbuf); /* write 25 */ ret = ciaaLibs_circBufPut(cbuf, from, 25); TEST_ASSERT_TRUE(25 == ret); memset((void*)to, 0, 100); /* get 20 */ ret = ciaaLibs_circBufGet(cbuf, to, 20); TEST_ASSERT_EQUAL_INT(20, ret); TEST_ASSERT_EQUAL_UINT8_ARRAY(to, from, 20); /* put 51 */ ret = ciaaLibs_circBufPut(cbuf, &from[10], 51); TEST_ASSERT_EQUAL_INT(51, ret); memset((void*)to, 0, 100); /* get 50: 5 old and 45 new */ memset((void*)to, 0, 100); ret = ciaaLibs_circBufGet(cbuf, to, 50); TEST_ASSERT_EQUAL_INT(50, ret); TEST_ASSERT_EQUAL_UINT8_ARRAY(to, &from[20], 5); TEST_ASSERT_EQUAL_UINT8_ARRAY(&to[5], &from[10], 45); memset((void*)to, 0, 100); ret = ciaaLibs_circBufGet(cbuf, to, 50); TEST_ASSERT_EQUAL_INT(6, ret); TEST_ASSERT_EQUAL_UINT8_ARRAY(to, &from[55], 6); /* release buffer */ ciaaLibs_circBufRel(cbuf); } /* end test_ciaaLibs_circBufPutGet */