Exemple #1
0
void Data_Protocal_Package(Data_Protocal * package, U8 property, INT8 *buf, U8 data_length)
{
    if(package == NULL || buf == NULL || data_length == 0)
    {
        printf("Input error!\n");
        return;
    }

    if(data_length > MAX_DATA_LENGTH)
    {
        printf("Data is too long, Please consider subpackage.\n");
        return;
    }
    package->head[0] = HEAD;
    package->length[0] = data_length + 6; /*length = 一帧数据的长度 =  协议长度+数据长度*/
    package->property[0] = property;

    memcpy(package->data, buf, data_length);

    package->crc_fsc = CRC16_Check((U8 *)package + 1,data_length + 3,CRC_INIT);
#ifdef DEBUG
    printf("CRC is %d\n",package->crc_fsc);
#endif
    package->tail[0] = TAIL;
}
Exemple #2
0
int Rev_Process(U8 * rev_buf, int data_start_pos, int data_end_pos)
{
    int i = 0;
    int pos = 0;
    int head_flag = 0, tail_flag = 0;
    msg_que msg_buf;
    int err = 0;
    U8 one_frame[(MAX_DATA_LENGTH + PROTOCAL_LENGTH)*2] = {0}; //考虑到发生端发送的所有数据都经过转义这种情况 所以大小是2倍协议长
    U8 package[(MAX_DATA_LENGTH + PROTOCAL_LENGTH)] = {0};
    int crc = 0;
    for( ; data_start_pos < data_end_pos; data_start_pos++ )
    {
        if( HEAD == rev_buf[data_start_pos] )
        {
            pos = data_start_pos;
            head_flag  = 1;
        }
        else if(TAIL == rev_buf[data_start_pos] && 1 == head_flag )
        {
            tail_flag = 1;
        }
        if( 1 == tail_flag ) //tai_flag =1 为接受完整的一帧数据 下面进一步处理如 反转义和CRC校验
        {
            memcpy(one_frame, rev_buf + pos, data_start_pos - pos + 1);
#ifdef DEBUG
            printf("Before Reveres_Escape:\n");
            for(i = 0; i < data_start_pos - pos + 1; i++)
            {
                printf(" %x ",one_frame[i]);
            }
            printf("\n");
#endif
            Reverse_Escape_Character(one_frame, package);
#ifdef DEBUG
            printf("REV CRC value is %d \n", package[package[1] - 3]*256 + package[package[1] - 2]);
#endif
            crc = CRC16_Check(package + 1, package[1] - 2, CRC_INIT);
            if( 0 == crc )
            {
#ifdef DEBUG
                printf("crc check is success!\n");
#endif
#ifdef RESULT
                printf("Property is :%d\n Key is:%d\n", package[2], package[3]);
#endif
                msg_buf.msg_type = package[2];
                msg_buf.data[0]  =  package[3];
                //MSG_QUE_ID = msgget(MSG_QUE_KEY,IPC_EXCL);
              //  printf("%d\n",MSG_QUE_ID);
                err = msgsnd(MSG_QUE_ID, (void *)&msg_buf, sizeof(msg_buf) - sizeof(long), IPC_NOWAIT);
                if(err < 0)
               {
                   printf("Mssage queue send data failed!\n");
               }
               else
               {
#ifdef RESULT
                    printf("Mssage queue send data success!\n");
#endif
               }

            }
            else
            {
                printf("crc check is failed!\n");
            }
            head_flag = 0;
            tail_flag = 0;
            pos = 0;
#ifdef DEBUG
            printf("After Reveres_Escape:\n");
            for(i = 0; i < package[1]; i++)
            {
                printf(" %x ",package[i]);
            }
            printf("\n");
#endif
        }

    }
    return pos;
}
uint8_t*
iM880A_CbProcessRxMessage(uint8_t* rxBuffer, uint16_t length)
{
    // 1. check CRC
    if (CRC16_Check(rxBuffer, length, CRC16_INIT_VALUE))
    {
        // 2. check min length, 2 bytes for SapID + MsgID + 2 bytes CRC16
        if(length >= (WIMODLR_HCI_MSG_HEADER_SIZE + WIMODLR_HCI_MSG_FCS_SIZE))
        {
            // add length
            RxMessage.Length = length - (WIMODLR_HCI_MSG_HEADER_SIZE + WIMODLR_HCI_MSG_FCS_SIZE);

            // dispatch completed RxMessage
            // 3. forward message according to SapID / MsgID
            switch(RxMessage.SapID)
            {
                case    DEVMGMT_ID:

                        // forward Msg IDs to application, e.g. ping response
                        (*cbLoRaWANHCIResponse)(RxMessage.MsgID, RxMessage.Payload, length);

                        break;

                case    LORAWAN_ID:
                        // handle TX indications
                        if((RxMessage.MsgID == LORAWAN_MSG_SEND_UDATA_TX_IND)   ||
                           (RxMessage.MsgID == LORAWAN_MSG_SEND_CDATA_TX_IND)   ||
                           (RxMessage.MsgID == LORAWAN_MSG_JOIN_NETWORK_TX_IND))
                        {
                            (*cbMsgIndication)(NULL, 0, trx_TXDone);
                        }
                        // handle RX messages
                        else if((RxMessage.MsgID == LORAWAN_MSG_RECV_UDATA_IND) ||
                                (RxMessage.MsgID == LORAWAN_MSG_RECV_CDATA_IND))
                        {
                            (*cbMsgIndication)(RxMessage.Payload, length, trx_RXDone);
                        }

                        // handle ACKs
                        else if(RxMessage.MsgID == LORAWAN_MSG_RECV_ACK_IND)
                        {
                            (*cbMsgIndication)(NULL, 0, trx_ACKDone);
                        }

                        // handle other responses
                        else
                        {
                            (*cbLoRaWANHCIResponse)(RxMessage.MsgID, RxMessage.Payload, length);
                        }

                        break;

                default:
                        // handle unsupported SapIDs here
                        break;
            }
        }
    }
    else
    {
        // handle CRC error
    }

    // return same buffer again, keep receiver enabled
    return &RxMessage.SapID;

}