// 向前(左)移动数据,被移动的数据为从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)); } }
/**************************************************************** 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++; } }