Exemplo n.º 1
0
// 向前(左)移动数据,被移动的数据为从p_start_pos开始,到p_end_pos,移动长度为move_len
void move_data_backward( uint8 *buf, int32 pos_start, int32 pos_end, int32 move_len)
{
    int32 k;
    int32 pos_new_start;
    int32 move_data_len = get_data_len(pos_start, pos_end);

    pos_new_start = pos_start + (-1)*move_len;
    
    for(k=0; k < move_data_len; k++)
    {
        __halbuf_write(pos_new_start + k, __halbuf_read(pos_start + k));
    }
}
Exemplo n.º 2
0
/****************************************************************
FunctionName    :   Local_decode_data
Description     :   decode local data in local cycle buf.transfer 0xff55 to 0xff.
start           :   the posation in local cycle buf where will be decode  
length          :   decode data length

will change the global pointer "put"--pos_current
****************************************************************/
void hal_decode_data(uint32 start, uint32 length)
{
    static uint8 isSyncHead = 0;
    uint8 data;
    uint32 i;
    uint32 offRec;
    uint32 invalidLen;
    int32 ret;
    
    if(0 == length)
    {
        return ;
    }

    offRec = start;
    for(i = 0; i < length; i++)
    {
        data = __halbuf_read(offRec);
        if(isSyncHead)
        {
            isSyncHead = 0;
            /* check if is a new packet */
            if(0xFF == data)
            {
                /* check if pre byte is in one packet */
                ret = check_isInPacket(offRec - 1);
                if(0 == ret)
                {   /* new packet */
                    offRec++;
                    continue;
                }
                else
                {
                    ret = find_packet_backward(offRec);
                    invalidLen = get_data_len(ret, offRec + 1);
                    move_data_backward(hal_RxBuffer, offRec + 1, pos_current, invalidLen);
                    offRec -= invalidLen;
                    pos_current = pos_current - invalidLen;
                }
            }
            /* check if is 0xff 0x55 */
            else if(0x55 == data)
            {
                if((offRec & HAL_BUF_MASK) == ((pos_current - 1) & HAL_BUF_MASK))
                {
                    /* the last byte has received */
                    __halbuf_write(offRec, 0x00);
                }
                else
                {
                    move_data_backward(hal_RxBuffer, offRec + 1, pos_current, 1);
                }
                offRec -= 1;
                pos_current -= 1;
            }
            /* invalid packet */
            else
            {
                /* 找到当前字节处于哪一个packet */
                ret = find_packet_backward(offRec);
                invalidLen = get_data_len(ret, offRec + 1);
                move_data_backward(hal_RxBuffer, offRec + 1, pos_current, invalidLen);
                offRec -= invalidLen;
                pos_current = pos_current - invalidLen;
            }
        }
        else if(MCU_HDR_FF == data)
        {
            isSyncHead = 1;
        }
        offRec++;
    }
}