Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
Archivo: reader.cpp Proyecto: stdk/u2
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;
}
Ejemplo n.º 3
0
Archivo: reader.cpp Proyecto: stdk/u2
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);
    }
}