示例#1
0
/** \brief pack bit states in byte buffer
 *  \param[in] number of pins to read (normally ciaaDriverDio_OutputCount or ciaaDriverDio_InputCount)
 *  \param[out] buffer user buffer
 *  \param[in] size user buffer size
 *  \param[in] readFunction function used to read pins (normally ciaa_lpc4337_readOutput or ciaa_lpc4337_readInput)
 *  \return number bytes required in buffer to store bits
 */
static int32_t ciaa_lpc4337_readPins(int32_t pinCount, uint8_t * buffer, size_t size, int32_t (*readFunction)(uint32_t))
{
   int32_t count, i, j;
   /* amount of bytes necessary to store all input states */
   count = pinCount >> 3; /* ciaaDriverDio_InputCount / 8 */
   if( (pinCount & 0x07) != 0) /* (ciaaDriverDio_InputCount % 8) != 0 */
   {
      count += 1;
   }
   /* adjust gpios to read according to provided buffer length */
   if(count > size)
   {
      count = size;
   }
   /* read and store all inputs in user buffer */
   ciaaPOSIX_memset(buffer, 0, count);
   for(i = 0, j = 0; (i < pinCount) && (j < count); i++)
   {
      if((i > 0) && ((i & 0x07)==0))
      {
         j++;
      }
      buffer[j] |= readFunction(i) << (i - 8 * j);
   }
   return count;
}
/** \brief test memset
 **
 ** test the function ciaaPOSIX_memset
 **
 **/
void test_ciaaPOSIX_memset(void) {
   char buffer[16];
   void * ret;
   uint32_t loopi;

   for(loopi = 0; loopi < sizeof(buffer)-1; loopi++)
   {
      buffer[loopi] = 'A';
   }
   buffer[sizeof(buffer)-1] = 0;

   ret = ciaaPOSIX_memset((void*)&buffer[5], (int)'B', 5);
   TEST_ASSERT_TRUE(0 == strncmp(buffer, "AAAAA", 5));
   TEST_ASSERT_TRUE(0 == strncmp(&buffer[5], "BBBBB", 5));
   TEST_ASSERT_TRUE(0 == strncmp(&buffer[10], "AAAAA", 5));
   TEST_ASSERT_TRUE(&buffer[5] == ret);
}
/*==================[internal functions definition]==========================*/
static int32_t ciaaDriverFlash_blockErase(uint32_t start, uint32_t end) {
   int32_t ret = -1;
   int32_t index;
   uint8_t buffer[CIAADRVFLASH_BLOCK_SIZE];
   ciaaDriverFlash_flashType * flash = &ciaaDriverFlash_flash;

   if ((start <= end) && (end < CIAADRVFLASH_BLOCK_CANT))
   {
      ciaaPOSIX_memset(buffer, 0xFF, CIAADRVFLASH_BLOCK_SIZE);
      fseek(flash->storage, start * CIAADRVFLASH_BLOCK_SIZE, SEEK_SET);
      for(index = 0; index < CIAADRVFLASH_BLOCK_CANT; index++)
      {
         fwrite(buffer, CIAADRVFLASH_BLOCK_SIZE, 1, flash->storage);
      }
      ret = 0;
   }
   return ret;
}
/*==================[external functions definition]==========================*/
extern void ciaaModbus_gatewayInit(void)
{
   int32_t loopi;
   int32_t loopj;

   for (loopi = 0 ; loopi < CIAA_MODBUS_TOTAL_GATEWAY ; loopi++)
   {
      ciaaModbus_gatewayObj[loopi].inUse = false;

      for (loopj = 0 ;
           CIAA_MODBUS_GATEWAY_TOTAL_CLIENTS > loopj ;
           loopj++)
      {
         ciaaPOSIX_memset(
               ciaaModbus_gatewayObj[loopi].client[loopj].buffer,
               0,
               sizeof(ciaaModbus_gatewayObj[loopi].client[loopj].buffer));
         ciaaModbus_gatewayObj[loopi].client[loopj].getRespTimeout = NULL;
         ciaaModbus_gatewayObj[loopi].client[loopj].handler = -1;
         ciaaModbus_gatewayObj[loopi].client[loopj].id = 0;
         ciaaModbus_gatewayObj[loopi].client[loopj].inUse = false;
         ciaaModbus_gatewayObj[loopi].client[loopj].indexServer = -1;
         ciaaModbus_gatewayObj[loopi].client[loopj].recvMsg = NULL;
         ciaaModbus_gatewayObj[loopi].client[loopj].sendMsg = NULL;
         ciaaModbus_gatewayObj[loopi].client[loopj].size = 0;
         ciaaModbus_gatewayObj[loopi].client[loopj].state = CIAA_MODBUS_CLIENT_STATE_IDLE;
         ciaaModbus_gatewayObj[loopi].client[loopj].task = NULL;
         ciaaModbus_gatewayObj[loopi].client[loopj].timeout = 0;
      }

      for (loopj = 0 ;
           CIAA_MODBUS_GATEWAY_TOTAL_SERVERS > loopj ;
           loopj++)
      {
         ciaaModbus_gatewayObj[loopi].server[loopj].busy = false;
         ciaaModbus_gatewayObj[loopi].server[loopj].handler = -1;
         ciaaModbus_gatewayObj[loopi].server[loopj].id = 0;
         ciaaModbus_gatewayObj[loopi].server[loopj].inUse = false;
         ciaaModbus_gatewayObj[loopi].server[loopj].recvMsg = NULL;
         ciaaModbus_gatewayObj[loopi].server[loopj].sendMsg = NULL;
         ciaaModbus_gatewayObj[loopi].server[loopj].task = NULL;
      }
   }
}