bleSDK_expansion_board/projects/blezongkong/src/app_PAD.c

252 lines
9.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "b6x.h"
#include "drvs.h"
#include "dbg.h"
#include "rbuf.h"
#include "CRCxx.h"
#include "sys_config.h"
#include "app_PAD.h"
// void app_otas_txd(uint16_t len, const uint8_t *data){
// app_PAD_Sendcmd(OTA_CMD_ID ,OTA_REG_ADDR ,data ,len);
// }
// 用于PAD通信处理
PAD_daraframe_t PAD_daraframe;
volatile uint8_t Rec_state =0;
volatile uint8_t Rec_data_cnt =0;
static void PAD_Data_Hande(void){
uint8_t ret_data[MAX_LEN]={0,0};
uint8_t length=0;
if((PAD_daraframe.cmd_id == OTA_CMD_ID) && (PAD_daraframe.reg_addr == OTA_REG_ADDR) && (PAD_daraframe.length == 18)){
app_otas_rxd(PAD_daraframe.length ,PAD_daraframe.data);
goto PAD_Data_Hande_end;
}
switch(PAD_daraframe.reg_addr){
case 0x01: // 写入系统配置
if(PAD_daraframe.cmd_id == 0x06){// 写入
write_cfg(&sys_conf);
}
break;
case 0x02: // 管理员模式油门极限寄存器(Unit:%)
if(PAD_daraframe.cmd_id == 0x03){// 读取
// ret_data[length++] =0;
ret_data[length++] =sys_conf.Manager_sLim;
// if(0 == --PAD_daraframe.length){
break;
// }
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
sys_conf.Manager_sLim =PAD_daraframe.data[0];
break;
}
case 0x03: // 游客模式油门极限寄存器(Unit:%)
if(PAD_daraframe.cmd_id == 0x03){// 读取
// ret_data[length++] =0;
ret_data[length++] =sys_conf.Tourist_sLim;
// if(0 == --PAD_daraframe.length){
break;
// }
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
sys_conf.Tourist_sLim =PAD_daraframe.data[0];
break;
}
case 0x04: // 减速油门极限寄存器(Unit:%)(自动减速时油门极限)
if(PAD_daraframe.cmd_id == 0x03){// 读取
// ret_data[length++] =0;
ret_data[length++] =sys_conf.Speed_Cut_sLim;
// if(0 == --PAD_daraframe.length){
break;
// }
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
sys_conf.Speed_Cut_sLim =PAD_daraframe.data[0];
break;
}
case 0x05: // 刹车距离极限寄存器(前进)(Unit:mm)
if(PAD_daraframe.cmd_id == 0x03){// 读取
ret_data[length++] =sys_conf.Brake_DLimit & 0x00FF;
ret_data[length++] =sys_conf.Brake_DLimit >> 8;
// if(0 == --PAD_daraframe.length){
break;
// }
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
sys_conf.Brake_DLimit =(((uint16_t)PAD_daraframe.data[1]) << 8) | PAD_daraframe.data[0];
break;
}
case 0x06: // 减速距离极限寄存器(Unit:mm)
if(PAD_daraframe.cmd_id == 0x03){// 读取
ret_data[length++] =sys_conf.Speed_Cut_DLimit & 0x00FF;
ret_data[length++] =sys_conf.Speed_Cut_DLimit >> 8;
// if(0 == --PAD_daraframe.length){
break;
// }
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
sys_conf.Speed_Cut_DLimit =(((uint16_t)PAD_daraframe.data[1]) << 8) | PAD_daraframe.data[0];
break;
}
case 0x07: // 刹车距离极限寄存器(前进)(Unit:mm)
if(PAD_daraframe.cmd_id == 0x03){// 读取
ret_data[length++] =sys_conf.Brake_DLimit_B & 0x00FF;
ret_data[length++] =sys_conf.Brake_DLimit_B >> 8;
// if(0 == --PAD_daraframe.length){
break;
// }
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
sys_conf.Brake_DLimit_B =(((uint16_t)PAD_daraframe.data[1]) << 8) | PAD_daraframe.data[0];
break;
}
case 0x08: // 减速距离极限寄存器(Unit:mm)
if(PAD_daraframe.cmd_id == 0x03){// 读取
ret_data[length++] =sys_conf.Speed_Cut_DLimit_B & 0x00FF;
ret_data[length++] =sys_conf.Speed_Cut_DLimit_B >> 8;
// if(0 == --PAD_daraframe.length){
break;
// }
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
sys_conf.Speed_Cut_DLimit_B = (((uint16_t)PAD_daraframe.data[1]) << 8) | PAD_daraframe.data[0];
break;
}
case 0x09: //PAD模式寄存器
if(PAD_daraframe.cmd_id == 0x03){// 读取
// ret_data[length++] =0;
ret_data[length++] =sys_sta.Pmode;
// if(0 == --PAD_daraframe.length){
break;
// }
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
sys_sta.Pmode = PAD_daraframe.data[0] & 0x03;//0 退出模式//1 进入游客模式//2 进入管理员模式
break;
}
case 0x0A: //系统模式寄存器
if(PAD_daraframe.cmd_id == 0x03){// 读取
// ret_data[length++] =0;
ret_data[length++] =sys_sta.Smode;
// if(0 == --PAD_daraframe.length){
break;
// }
}
case 0x0B: //0 关闭12V输出//1 开启12V输出
if(PAD_daraframe.cmd_id == 0x03){// 读取
// ret_data[length++] =0;
ret_data[length++] =sys_sta.O_12V;
// if(0 == --PAD_daraframe.length){
break;
// }
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
sys_sta.O_12V = PAD_daraframe.data[0] & 0x01;
break;
}
break;
// default :
// app_PAD_Sendcmd(PAD_daraframe.cmd_id,PAD_daraframe.reg_addr,PAD_daraframe.data,PAD_daraframe.length);
// break;
}
app_PAD_Sendcmd(PAD_daraframe.cmd_id ,PAD_daraframe.reg_addr ,ret_data ,length);
PAD_Data_Hande_end:
Rec_state =0;//数据处理完要清零,准备接收下一帧数据
}
void app_PAD_Receive(uint8_t data){
uint8_t *frame = (uint8_t *)&PAD_daraframe;
switch(Rec_state){
case 0://header
if ((data == (uint8_t)(FRAME_HEADER >> 8)) && (PAD_daraframe.header == 0x0)) {
PAD_daraframe.header = (FRAME_HEADER >> 8);
} else if ((data == (uint8_t)(FRAME_HEADER & 0x00FF)) && (PAD_daraframe.header == (uint8_t)(FRAME_HEADER >> 8))) {
PAD_daraframe.header = ((uint16_t)((FRAME_HEADER << 8)|(FRAME_HEADER >> 8)));//0xA100;
PAD_daraframe.length = 0;
Rec_state = 1;//to cmd id
//debug("header");
}
break;
case 1://cmd_id
//debug("rxcmd:%x", data);
PAD_daraframe.cmd_id = data;
Rec_state = 2;//to device addr
break;
case 2://reg addr
//debug("reg_addr");
PAD_daraframe.reg_addr = data;
Rec_state = 3;//to data length
break;
case 3://data length
//debug("length");
PAD_daraframe.length = (data < MAX_LEN) ? data : MAX_LEN;
if (PAD_daraframe.length == 0) {
Rec_state = 5;//to crc
} else {
Rec_state = 4;//to data
Rec_data_cnt = 0;
}
break;
case 4://data
//debug("data");
if (Rec_data_cnt < PAD_daraframe.length) {
PAD_daraframe.data[Rec_data_cnt++] = data;
}
if (Rec_data_cnt == PAD_daraframe.length) {
Rec_data_cnt = 0;
Rec_state = 5;//to crc
}
break;
case 5://CRC8
PAD_daraframe.crc = crc8_maxim(frame, 5 + PAD_daraframe.length);
#if !PAD_CRC8_EN
PAD_daraframe.crc = data;
#endif
//计算并验证crc8
if (PAD_daraframe.crc == data) {
Rec_state = 6;//to ack
//debug("crc correct cmd:%x", PAD_daraframe.cmd_id);
} else {
Rec_state = 0;//to haeder
PAD_daraframe.header = 0;
//debug("crc error cmd:%x-%x", PAD_daraframe.cmd_id, PAD_daraframe.crc);
}
break;
}
// uart_putc(UART1_PORT,data);//debug
// uart_putc(UART1_PORT,'0'+Rec_state);
if(Rec_state == 6){
PAD_daraframe.header = 0;
Rec_state = 7;//数据处理完需要将状态位归零才会接收下一帧数据uart1_state =0时。
PAD_Data_Hande();
Rec_state =0;
/*
rx handler codes....
*/
}
}
//发送命令
void app_PAD_Sendcmd(uint8_t cmd_id ,uint8_t reg_addr ,const uint8_t *data, uint8_t length){
PAD_daraframe_t frame;
uint8_t *cmd_data =(uint8_t *)&frame;
uint8_t i;
frame.header = ((uint16_t)((FRAME_HEADER << 8)|(FRAME_HEADER >> 8)));//0xA100
frame.cmd_id = cmd_id;
frame.reg_addr = reg_addr;
frame.length = length < MAX_LEN ? length:MAX_LEN;
for(i = 0;i < frame.length ;i ++){
frame.data[i] = * data++;
}
length =5 + frame.length;
frame.crc = crc8_maxim(cmd_data, length);
while(length--)
uart_putc(UART1_PORT, (uint32_t)(*cmd_data ++));
uart_putc(UART1_PORT, (uint32_t)(frame.crc));
}