int iM880A_SendHCIMessage(uint8_t sapID, uint8_t msgID, uint8_t* payload, uint16_t length) { // 1. check parameter // // 1.1 check length // if(length > WIMODLR_HCI_MSG_PAYLOAD_SIZE) { return WiMODLR_RESULT_PAYLOAD_LENGTH_ERROR; } // 2. init TxMessage // // 2.1 init SAP ID // TxMessage.SapID = sapID; // 2.2 init Msg ID // TxMessage.MsgID = msgID; // 2.3 copy payload, if present // if(payload && length) { uint8_t* dstPtr = TxMessage.Payload; int n = (int)length; // copy bytes while(n--) *dstPtr++ = *payload++; } // 3. Calculate CRC16 over header and optional payload // uint16_t crc16 = CRC16_Calc(&TxMessage.SapID, length + WIMODLR_HCI_MSG_HEADER_SIZE, CRC16_INIT_VALUE); // 3.1 get 1's complement // crc16 = ~crc16; // 3.2 attach CRC16 and correct length, lobyte first // TxMessage.Payload[length++] = LOBYTE(crc16); TxMessage.Payload[length++] = HIBYTE(crc16); // 4. forward message to SLIP layer // - start transmission with SAP ID // - correct length by header size if (ComSlip_SendMessage(&TxMessage.SapID, length + WIMODLR_HCI_MSG_HEADER_SIZE)) { // ok ! return WiMODLR_RESULT_OK; } // error - SLIP layer couldn't sent message return -1; }
EXPORT long crc16_calc(void *data,uint32_t len,uint8_t low_endian) { uint8_t *buffer = (uint8_t*)data; CRC16_Calc(buffer,len - 2); if(low_endian) { buffer[len-2] = CRC16_Low; buffer[len-1] = CRC16_High; } else { buffer[len-1] = CRC16_Low; buffer[len-2] = CRC16_High; } return 0; }
EXPORT long crc16_check(void* data,uint32_t len,uint8_t low_endian) { uint8_t *buffer = (uint8_t*)data; CRC16_Calc(buffer,len - 2); /* for(size_t i = 0; i < len; i++) { fprintf(stderr,"%02X ",buffer[i]); } fprintf(stderr,"[%02X %02X]\n",CRC16_Low,CRC16_High); */ if(low_endian) { return (buffer[len-2] == CRC16_Low) && (buffer[len-1] == CRC16_High); } else { return (buffer[len-1] == CRC16_Low) && (buffer[len-2] == CRC16_High); } }