/** \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; } } }