📄 slip.c
字号:
#include "crc.h"
#include "uart.h"
#include "spi.h"
#define WARNING_FLAG 0x7d
#define DATA_PACKAGE_SIZE 36
unsigned char xdata t_buffer[DATA_PACKAGE_SIZE];
unsigned char t_crc;
bit t_eof=0;
bit t_warning=0;
bit t_on=0;
unsigned char t_idx=0;
unsigned char t_len = 0;
unsigned char xdata r_buffer[DATA_PACKAGE_SIZE];
unsigned char r_crc;
bit r_warning=0;
bit r_on = 0;
unsigned char r_len=0;
unsigned char r_idx=0;
unsigned char slip_index = 0;
void upload_data(void);
void init_slip(void)
{
t_crc=CRC_INIT;
t_eof=0;
t_warning=0;
t_on=0;
t_idx=0;
t_len = 0;
r_crc=CRC_INIT;
r_warning=0;
r_on = 0;
r_len=0;
r_idx=0;
slip_index = 0;
}
void send_data_package(void){
bit b1,b2;
char temp = slip_index;
while(1){
if(t_on){
if(!t_eof){
if(send_char(DATA_EOF_FLAG)){
t_crc = CRC_INIT;
t_eof = 1;
}else return;
}else{
if(t_warning){
if(t_idx < t_len){
if(send_char(t_buffer[t_idx]^XXXX)){
t_crc = crc_val(t_crc,t_buffer[t_idx]);
t_warning = 0;
}else return;
}else{
if(send_char(t_crc^XXXX)){
t_warning = 0;
}else return;
}
t_idx ++;
}else{
if(t_idx < t_len){
switch(t_buffer[t_idx]){
case DATA_EOF_FLAG:
case MSG_EOF_FLAG:
case WARNING_FLAG:
if(send_char(WARNING_FLAG)){
t_warning = 1;
}else return;
break;
default:
if(send_char(t_buffer[t_idx])){
t_crc = crc_val(t_crc,t_buffer[t_idx]);
t_idx ++;
}else return;
break;
}
}else if(t_idx == t_len){
switch(t_crc){
case DATA_EOF_FLAG:
case WARNING_FLAG:
case MSG_EOF_FLAG:
if(send_char(WARNING_FLAG)){
t_warning = 1;
}else return;
break;
default:
if(send_char(t_crc)){
t_idx ++;
}else return;
break;
}
}else{
if(send_char(DATA_EOF_FLAG)){
t_eof = 0;
t_on = 0;
}else return;
}
}
}
}else{
b1 = spi_rx_rx_disable(slip_index);
if(!b1){
upload_data();
b2 = spi_rx_tx_disable(slip_index);
if(b2){
if(!order_busy && queue_low(spi_rx_queue[slip_index])){
order_buffer[0] = slip_index +'0';
order_buffer[1] = XON;
order_buffer[7] = 1;
if(spi_send_msg(order_buffer))
w_spi_rx_tx_disable(slip_index,0);
}
}
if(slip_index == 0) slip_index = 1;
else slip_index = 0;
if(slip_index == temp) break;
}else{slip_index = (slip_index+1)%MAX_NUMBER;break;}
}
}
}
void upload_data(void)
{
int c;
t_len = 1;
t_buffer[0] = '0' + slip_index;
while(1){
c = queue_output(&spi_rx_queue[slip_index]);
if(c == -1) break;
t_buffer[t_len] = c;
t_len++;
if(t_len >= 33) break;
}
if(t_len >= 2){
t_on = 1;
t_eof = 0;
t_warning = 0;
t_idx = 0;
t_crc = CRC_INIT;
}
}
void rece_data_package(void)
{
int c;
bit b1,b2;
while(1){
if(!r_on){
c = get_char();
if(c != -1){
switch(c){
case WARNING_FLAG:
r_warning = 1;
break;
case DATA_EOF_FLAG:
if(r_crc == 0 && r_len>2){
r_on = 1;
r_len--;
r_buffer[0]-='0';
r_idx = 1;
}else r_len = 0;
r_crc = CRC_INIT;
r_warning = 0;
break;
default:
if(r_warning){
c = c ^ XXXX;
r_warning = 0;
}
r_crc = crc_val(r_crc,c&0xff);
r_buffer[r_len++] = c;
if(r_len > 33){
r_len = 0;
r_crc = CRC_INIT;
r_warning = 0;
}
break;
}
}else break;
}else{
if(r_buffer[0] >= MAX_NUMBER){
r_on = 0;
r_len = 0;
r_crc = CRC_INIT;
r_warning = 0;
}else{
b2 = spi_exist(r_buffer[0]);
if(b2){
while(r_idx < r_len){
c = r_buffer[r_idx];
queue_input(&spi_tx_queue[r_buffer[0]],c);
if(c != -1) r_idx++;
else break;
}
}else r_idx=r_len;
if(r_idx == r_len){
r_on = 0;
r_len = 0;
r_crc = CRC_INIT;
r_warning = 0;
}
b1 = spi_tx_tx_disable(r_buffer[0]);
if(!b1){
if(queue_high(spi_tx_queue[r_buffer[0]])){
if(queue_unused(mtx_queue) > 4){
send_msg(MSG_EOF_FLAG);
send_msg(r_buffer[0]+'0');
send_msg(XOFF);
send_msg(MSG_EOF_FLAG);
w_spi_tx_tx_disable(r_buffer[0],1);
}
}
}
}
if(r_on) break;
}
}
}
void slip_scan(void)
{
rece_data_package();
send_data_package();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -