Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
/** \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);
}
Exemplo n.º 3
0
/** \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);
}
Exemplo n.º 4
0
/** \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 */