Files
MXC_A59/app/moto/protocol/tire_pressure_protocol.c

548 lines
20 KiB
C

#include "awtk.h"
#include "chip.h"//bool声明
#include "tire_pressure_protocol.h"
#include "user_data.h"
#include "data_port.h"
#include "universal.h"
extern void SaveDataToFlash(SfudData_t user_data);
uint8_t power_on_flag = 0;
uint32_t tire_pressure_flag = 0;
uint32_t tire_front_time = 0;
uint32_t tire_rear_time = 0;
//保存里程信息
static void Save_tire_data(void){
Pressure_t ago_pressure = Get_sys_front_pressure();
Pressure_t after_pressure = Get_sys_rear_pressure();
DEBUG_PRINT("****************\r\n");
DEBUG_PRINT("mac: %02X%02X%02X%02X%02X%02X , %02X%02X%02X%02X%02X%02X \r\n",
ago_pressure.mac_address[0],ago_pressure.mac_address[1],ago_pressure.mac_address[2],
ago_pressure.mac_address[3],ago_pressure.mac_address[4],ago_pressure.mac_address[5],
after_pressure.mac_address[0],after_pressure.mac_address[1],after_pressure.mac_address[2],
after_pressure.mac_address[3],after_pressure.mac_address[4],after_pressure.mac_address[5]);
DEBUG_PRINT("****************\r\n");
DEBUG_PRINT("mac: %02X%02X%02X%02X%02X%02X , %02X%02X%02X%02X%02X%02X \r\n",
custom_data.user_data.f_mac_address[0],custom_data.user_data.f_mac_address[1],custom_data.user_data.f_mac_address[2],
custom_data.user_data.f_mac_address[3],custom_data.user_data.f_mac_address[4],custom_data.user_data.f_mac_address[5],
custom_data.user_data.r_mac_address[0],custom_data.user_data.r_mac_address[1],custom_data.user_data.r_mac_address[2],
custom_data.user_data.r_mac_address[3],custom_data.user_data.r_mac_address[4],custom_data.user_data.r_mac_address[5]);
DEBUG_PRINT("****************\r\n");
strcpy(custom_data.user_data.f_mac_address,ago_pressure.mac_address);
custom_data.user_data.f_mac_address[6]=ago_pressure.temp&0xFF;
custom_data.user_data.f_mac_address[7]=ago_pressure.psi>>8&0xFF;
custom_data.user_data.f_mac_address[8]=ago_pressure.psi&0xFF;
strcpy(custom_data.user_data.r_mac_address,after_pressure.mac_address);
custom_data.user_data.r_mac_address[6]=after_pressure.temp&0xFF;
custom_data.user_data.r_mac_address[7]=after_pressure.psi>>8&0xFF;
custom_data.user_data.r_mac_address[8]=after_pressure.psi&0xFF;
Set_sys_pressure_signal(0);
//保存flash
SaveDataToFlash(custom_data.user_data);//保存数据
}
//数据刷新函数
void pressure_buffer_event_handing(Pressure_t pressure,char buffer[],uint8_t type,uint8_t pairing_status){
uint8_t len = strlen(buffer);
// uint8_t buffer_state=0;
// uint8_t buffer_check=0;
uint8_t data = 0;
//double value = 0;
//double auxiliary_value=0;
uint32_t auxiliary_data;
uint32_t sum;
char *sign;
//S
sign=&buffer[6];
data = *(sign++);
// //若配对模式 检测配对标识是否为1 是则继续 反之则退出
// if(pairing_status){//若配对模式
// if(!(JUDGE_BIN_0(data) || JUDGE_BIN_1(data) || JUDGE_BIN_6(data))){
// DEBUG_PRINT("pairing_status = 1 && JUDGE_BIN_0(data) =0.\r\n");
// return;
// }
// }
//DEBUG_PRINT("%x, ",data);
pressure.blow_by_state = JUDGE_BIN_1(data);
pressure.voltage_state = JUDGE_BIN_2(data);
//pressure.temp_state = JUDGE_BIN_3(data);
//V
data = *(sign++);//电压 0x1e=>30=>3.0V
pressure.voltage = data;
//DEBUG_PRINT("%x, ",data);
//T
data = *(sign++);//温度 0x14=>20=>20°C
pressure.temp = data;
if(data>=70 && data<128){
pressure.temp_state = 1;
}
//DEBUG_PRINT("%x, ",data);
//P
sum = 0;
data = *(sign++);//压强 0x00AF=>175=>17.5 17.5-14.6=2.9
//DEBUG_PRINT("%x, ",data);
auxiliary_data = data<<8;
sum += auxiliary_data;
data = *(sign++);
//DEBUG_PRINT("%x, ",data);
auxiliary_data = data;
sum += auxiliary_data;
//DEBUG_PRINT(" == %d ",sum);
//data = *(sign++);//压强 0x00AF=>175=>17.5 17.5-14.6=2.9
//data = *(sign++);//压强 0x00AF=>175=>17.5 17.5-14.6=2.9
pressure.psi = sum;
date_time_t dt;
date_time_init(&dt);
uint32_t check_buffer[6];
check_buffer[0] = dt.year;
check_buffer[1] = dt.month;
check_buffer[2] = dt.day;
check_buffer[3] = dt.hour;
check_buffer[4] = dt.minute;
check_buffer[5] = dt.second;
sum = fml_time_to_stamp(check_buffer);
pressure.lose_flag = 0;
//pressure.state = 1;
DEBUG_PRINT("type =%d pressure >>>>>>> mac = %02X%02X%02X%02X%02X%02X, %d-%d-%d, temp=%d, psi=%d \n",type,pressure.mac_address[0],pressure.mac_address[1],pressure.mac_address[2],
pressure.mac_address[3],pressure.mac_address[4],pressure.mac_address[5],
pressure.blow_by_state,pressure.voltage_state,pressure.temp_state,pressure.temp,pressure.psi);
switch(type){
case 1:
if((sum - tire_front_time)>3600){
pressure.lose_flag = 1;
}
Set_sys_front_pressure(pressure);
break;
case 2:
if((sum - tire_rear_time)>3600){
pressure.lose_flag = 1;
}
Set_sys_rear_pressure(pressure);
break;
default:break;
}
if(pairing_status){//若配对模式
Send_tire_pressure_information();
Set_sys_tire_pressure_mesg(10);
}
}
bool compare_arrays(char arr1[], char arr2[], uint8_t size) {
for (uint8_t i = 0; i < size; i++) {
if (arr1[i] != arr2[i]) {
return false; // 只要有一个元素不相同,即返回 false
}
}
return true; // 所有元素都相同,返回 true
}
//协议解析
void tire_pressure_data_analysis(uint8_t *buf){
uint8_t data;
char trip_buffer1[11] = {0};
char trip_buffer2[11] = {0};
char mac1[6] = {0};
char mac2[6] = {0};
uint8_t data_flag = 0;
Pressure_t ago_pressure = Get_sys_front_pressure();
Pressure_t after_pressure = Get_sys_rear_pressure();
data = *(buf++);
if(data!=0xAA)
return;
data = *(buf++);
if(data!=0x1b)
return;
data = *(buf++);
if(data!=0x03)
return;
data = *(buf++);
if(data!=0x51)
return;
data = *(buf++);
if(data!=0x17)
return;
data_flag = *(buf++);
if(!data_flag && !power_on_flag){
return;
}else{
date_time_t dt;
date_time_init(&dt);
uint32_t check_buffer[6];
check_buffer[0] = dt.year;
check_buffer[1] = dt.month;
check_buffer[2] = dt.day;
check_buffer[3] = dt.hour;
check_buffer[4] = dt.minute;
check_buffer[5] = dt.second;
uint32_t sum = fml_time_to_stamp(check_buffer);
switch(data_flag){
case 1:tire_front_time =sum;break;
case 2:tire_rear_time =sum;break;
case 3:tire_front_time =sum;tire_rear_time =sum;break;
default:break;
}
}
for(uint8_t i=0;i<11;i++){
trip_buffer1[i] = *(buf++);
if(i<6)
mac1[i]=trip_buffer1[i];
}
for(uint8_t i=0;i<11;i++){
trip_buffer2[i] = *(buf++);
if(i<6)
mac2[i]=trip_buffer2[i];
}
//tk_snDEBUG_PRINT(mac1, sizeof(mac1), "%02X%02X%02X%02X%02X%02X",trip_buffer1[0],trip_buffer1[1],trip_buffer1[2],trip_buffer1[3],trip_buffer1[4],trip_buffer1[5]);
//tk_snDEBUG_PRINT(mac2, sizeof(mac2), "%02X%02X%02X%02X%02X%02X",trip_buffer2[0],trip_buffer2[1],trip_buffer2[2],trip_buffer2[3],trip_buffer2[4],trip_buffer2[5]);
DEBUG_PRINT("***************************\r\n");
for(uint8_t i=0;i<11;i++){
DEBUG_PRINT("%02x ",trip_buffer1[i]);
}
for(uint8_t i=0;i<11;i++){
DEBUG_PRINT("%02x ",trip_buffer2[i]);
}
DEBUG_PRINT("\r\n");
DEBUG_PRINT("***************************\r\n");
switch(Get_sys_pressure_signal()){
case 0://正常情况下需要刷新数据
DEBUG_PRINT("0>>>> data_flag = %d \n",data_flag);
//if(strcmp(ago_pressure.mac_address,mac1)==0){//若和前胎压地址相同,则将数据丢给前胎压
if(compare_arrays(ago_pressure.mac_address,mac1,6)==1 && (data_flag == 1 || data_flag == 3) || power_on_flag){//若和前胎压地址相同,则将数据丢给前胎压
pressure_buffer_event_handing(ago_pressure,trip_buffer1,1,0);
strcpy(custom_data.user_data.f_mac_address,ago_pressure.mac_address);
custom_data.user_data.f_mac_address[6]=ago_pressure.temp&0xFF;
custom_data.user_data.f_mac_address[7]=ago_pressure.psi>>8&0xFF;
custom_data.user_data.f_mac_address[8]=ago_pressure.psi&0xFF;
}
//if(strcmp(after_pressure.mac_address,mac2)==0){//若和后胎压地址相同,则将数据丢给后胎压
if(compare_arrays(after_pressure.mac_address,mac2,6)==1 && (data_flag == 2 || data_flag == 3 || power_on_flag)){//若和后胎压地址相同,则将数据丢给后胎压
pressure_buffer_event_handing(after_pressure,trip_buffer2,2,0);
strcpy(custom_data.user_data.r_mac_address,after_pressure.mac_address);
custom_data.user_data.r_mac_address[6]=after_pressure.temp&0xFF;
custom_data.user_data.r_mac_address[7]=after_pressure.psi>>8&0xFF;
custom_data.user_data.r_mac_address[8]=after_pressure.psi&0xFF;
}
if(power_on_flag){
DEBUG_PRINT("power_on_flag = %d, tire_pressure ,ago_pressure.psi = %d , after_pressure.psi =%d .\r\n",power_on_flag,ago_pressure.psi,after_pressure.psi);
power_on_flag--;
}
break;
case 1://学习前胎压 前胎压不能于后胎压相同 前胎压mac清零
DEBUG_PRINT("1>>>> data_flag = %d \n",data_flag);
if(data_flag==1){//只做mac1的判断
DEBUG_PRINT("mac1-------------------.\r\n");
//判断mac是否正常
if(mac_address_normal(mac1,6) == 1){//正常进
DEBUG_PRINT("mac1 ok-------------------.\r\n");
//判断是否等于后胎压mac地址
if(compare_arrays(after_pressure.mac_address,mac1,6)==1){//若等于,那么刷新后胎压
pressure_buffer_event_handing(after_pressure,trip_buffer1,2,0);
}else{//若不等于 那么就学习前胎压
//S
data = trip_buffer1[6];
//配对模式
if(!(JUDGE_BIN_0(data) || JUDGE_BIN_1(data) || JUDGE_BIN_6(data))){
DEBUG_PRINT("Learning tire pressure ago_pressure error >> JUDGE_BIN_0(data) =0.\r\n");
return;
}
strcpy(ago_pressure.mac_address,mac1);
pressure_buffer_event_handing(ago_pressure,trip_buffer1,1,1);
Save_tire_data();
}
}
}else if(data_flag==2){//只做mac2的判断
DEBUG_PRINT("mac2 -------------------.\r\n");
//判断mac是否正常
if(mac_address_normal(mac2,6) == 1){//正常进
DEBUG_PRINT("mac2 ok-------------------.\r\n");
//判断是否等于后胎压mac地址
if(compare_arrays(after_pressure.mac_address,mac2,6)==1){//若等于,那么刷新后胎压
pressure_buffer_event_handing(after_pressure,trip_buffer2,2,0);
}else{//若不等于 那么就学习前胎压
//S
data = trip_buffer2[6];
//配对模式
if(!(JUDGE_BIN_0(data) || JUDGE_BIN_1(data) || JUDGE_BIN_6(data))){
DEBUG_PRINT("Learning tire pressure ago_pressure error >> JUDGE_BIN_0(data) =0.\r\n");
return;
}
strcpy(ago_pressure.mac_address,mac2);
pressure_buffer_event_handing(ago_pressure,trip_buffer2,1,1);
Save_tire_data();
}
}
}else{
//先判断mac1是否正常 再判断mac2
if(mac_address_normal(mac1,6) == 1){//正常进
DEBUG_PRINT("mac1 -------------------.\r\n");
//判断是否等于后胎压mac地址
if(compare_arrays(after_pressure.mac_address,mac1,6)==1){//若等于,那么刷新后胎压
DEBUG_PRINT("mac1 after -------------------.\r\n");
pressure_buffer_event_handing(after_pressure,trip_buffer1,2,0);
//后胎压刷新完毕
//1.判断mac2 1.是否正常 是转2 否退出
//2.是否等于后胎压 是则刷后胎压 否转3
//3.学习前胎压
if(mac_address_normal(mac2,6) == 1){//判断mac2是否正常
DEBUG_PRINT("mac2 -------------------.\r\n");
if(compare_arrays(after_pressure.mac_address,mac2,6)==1){//若等于,那么刷新后胎压
pressure_buffer_event_handing(after_pressure,trip_buffer2,2,0);
}else{//反之学习前胎压
//S
data = trip_buffer2[6];
//配对模式
if(!(JUDGE_BIN_0(data) || JUDGE_BIN_1(data) || JUDGE_BIN_6(data))){
DEBUG_PRINT("Learning tire pressure ago_pressure error >> JUDGE_BIN_0(data) =0.\r\n");
return;
}
strcpy(ago_pressure.mac_address,mac2);
pressure_buffer_event_handing(ago_pressure,trip_buffer2,1,1);
Save_tire_data();
}
}else{
DEBUG_PRINT("mac2 error-------------------.\r\n");
}
}else{//若不等于 那么就学习前胎压
DEBUG_PRINT("mac2 ago-------------------.\r\n");
//S
data = trip_buffer1[6];
//配对模式
if(!(JUDGE_BIN_0(data) || JUDGE_BIN_1(data) || JUDGE_BIN_6(data))){
DEBUG_PRINT("Learning tire pressure ago_pressure error >> JUDGE_BIN_0(data) =0.\r\n");
return;
}
strcpy(ago_pressure.mac_address,mac1);
pressure_buffer_event_handing(ago_pressure,trip_buffer1,1,1);
// strcpy(custom_data.user_data.f_mac_address,ago_pressure.mac_address);
//前胎压学习完毕
//1.判断mac2 1.是否正常 是转2 否退出
//2.是否等于前胎压 是刷前胎压 否转3
//3.是否等于后胎压 是则刷新后胎压 否则退出
if(mac_address_normal(mac2,6) == 1){//判断mac2是否正常
if(compare_arrays(after_pressure.mac_address,mac2,6)==1){//若等于,那么刷新后胎压
pressure_buffer_event_handing(after_pressure,trip_buffer2,2,0);
}else if(compare_arrays(ago_pressure.mac_address,mac2,6)==1){//若等于,那么刷新后胎压
pressure_buffer_event_handing(ago_pressure,trip_buffer2,1,0);
}
}
Save_tire_data();
}
}else if(mac_address_normal(mac2,6) == 1){//是否正常
//判断是否等于后胎压mac地址
if(compare_arrays(after_pressure.mac_address,mac2,6)==1){//若等于,那么刷新后胎压
pressure_buffer_event_handing(after_pressure,trip_buffer2,2,0);
}else{//若不等于 那么就学习前胎压
//S
data = trip_buffer2[6];
//配对模式
if(!(JUDGE_BIN_0(data) || JUDGE_BIN_1(data) || JUDGE_BIN_6(data))){
DEBUG_PRINT("Learning tire pressure ago_pressure error >> JUDGE_BIN_0(data) =0.\r\n");
return;
}
strcpy(ago_pressure.mac_address,mac2);
pressure_buffer_event_handing(ago_pressure,trip_buffer2,1,1);
Save_tire_data();
}
}
}
break;
case 2://学习后胎压
DEBUG_PRINT("2>>>> data_flag =%d\n",data_flag);
if(data_flag==1){//只做mac1的判断
DEBUG_PRINT("mac1-------------------.\r\n");
//判断mac是否正常
if(mac_address_normal(mac1,6) == 1){//正常进
DEBUG_PRINT("mac1 ok-------------------.\r\n");
//判断是否等于前胎压mac地址
if(compare_arrays(ago_pressure.mac_address,mac1,6)==1){//若等于,那么刷新前胎压
pressure_buffer_event_handing(ago_pressure,trip_buffer1,1,0);
}else{//若不等于 那么就学习后胎压
//S
data = trip_buffer1[6];
//配对模式
if(!(JUDGE_BIN_0(data) || JUDGE_BIN_1(data) || JUDGE_BIN_6(data))){
DEBUG_PRINT("Learning tire pressure after_pressure error >> JUDGE_BIN_0(data) =0.\r\n");
return;
}
strcpy(after_pressure.mac_address,mac1);
pressure_buffer_event_handing(after_pressure,trip_buffer1,2,1);
Save_tire_data();
}
}
}else if(data_flag==2){
DEBUG_PRINT("mac2 -------------------.\r\n");
//判断mac是否正常
if(mac_address_normal(mac2,6) == 1){//正常进
DEBUG_PRINT("mac2 ok-------------------.\r\n");
//判断是否等于前胎压mac地址
if(compare_arrays(ago_pressure.mac_address,mac2,6)==1){//若等于,那么刷新前胎压
pressure_buffer_event_handing(ago_pressure,trip_buffer2,1,0);
}else{//若不等于 那么就学习后胎压
//S
data = trip_buffer2[6];
//配对模式
if(!(JUDGE_BIN_0(data) || JUDGE_BIN_1(data) || JUDGE_BIN_6(data))){
DEBUG_PRINT("Learning tire pressure after_pressure error >> JUDGE_BIN_0(data) =0.\r\n");
return;
}
strcpy(after_pressure.mac_address,mac2);
pressure_buffer_event_handing(after_pressure,trip_buffer2,2,1);
Save_tire_data();
}
}
}else{
//先判断mac1是否正常 再判断mac2
if(mac_address_normal(mac1,6) == 1){//正常进
DEBUG_PRINT("mac1 -------------------.\r\n");
//判断是否等于前胎压mac地址
if(compare_arrays(ago_pressure.mac_address,mac1,6)==1){//若等于,那么刷新前胎压
pressure_buffer_event_handing(ago_pressure,trip_buffer1,1,0);
//前胎压刷新完毕
//1.判断mac2 1.是否正常 是转2 否退出
//2.是否等于前胎压 是则刷前胎压 否转3
//3.学习后胎压
if(mac_address_normal(mac2,6) == 1){//判断mac2是否正常
DEBUG_PRINT("mac2 -------------------.\r\n");
if(compare_arrays(ago_pressure.mac_address,mac2,6)==1){//若等于,那么刷新后胎压
pressure_buffer_event_handing(ago_pressure,trip_buffer2,1,0);
}else{//反之学习后胎压
//S
data = trip_buffer2[6];
//配对模式
if(!(JUDGE_BIN_0(data) || JUDGE_BIN_1(data) || JUDGE_BIN_6(data))){
DEBUG_PRINT("Learning tire pressure after_pressure error >> JUDGE_BIN_0(data) =0.\r\n");
return;
}
strcpy(after_pressure.mac_address,mac2);
pressure_buffer_event_handing(after_pressure,trip_buffer2,2,1);
Save_tire_data();
}
}
}else{//若不等于 那么就学习后胎压
//S
data = trip_buffer1[6];
//配对模式
if(!(JUDGE_BIN_0(data) || JUDGE_BIN_1(data) || JUDGE_BIN_6(data))){
DEBUG_PRINT("Learning tire pressure after_pressure error >> JUDGE_BIN_0(data) =0.\r\n");
return;
}
strcpy(after_pressure.mac_address,mac1);
pressure_buffer_event_handing(after_pressure,trip_buffer1,1,1);
//后胎压学习完毕
//1.判断mac2 1.是否正常 是转2 否退出
//2.是否等于前胎压 是刷前胎压 否转3
//3.是否等于后胎压 是则刷新后胎压 否则退出
if(mac_address_normal(mac2,6) == 1){//判断mac2是否正常
if(compare_arrays(after_pressure.mac_address,mac2,6)==1){//若等于,那么刷新后胎压
pressure_buffer_event_handing(after_pressure,trip_buffer2,2,0);
}else if(compare_arrays(ago_pressure.mac_address,mac2,6)==1){//若等于,那么刷新后胎压
pressure_buffer_event_handing(ago_pressure,trip_buffer2,1,0);
}
}
Save_tire_data();
}
}else{
if(mac_address_normal(mac2,6) == 1){//是否正常
DEBUG_PRINT("mac error mac2 -------------------.\r\n");
//判断是否等于前胎压mac地址
if(compare_arrays(ago_pressure.mac_address,mac2,6)==1){//若等于,那么刷新前胎压
pressure_buffer_event_handing(ago_pressure,trip_buffer2,1,0);
}else{//若不等于 那么就学习后胎压
//S
data = trip_buffer2[6];
//配对模式
if(!(JUDGE_BIN_0(data) || JUDGE_BIN_1(data) || JUDGE_BIN_6(data))){
DEBUG_PRINT("Learning tire pressure after_pressure error >> JUDGE_BIN_0(data) =0.\r\n");
return;
}
strcpy(after_pressure.mac_address,mac2);
pressure_buffer_event_handing(after_pressure,trip_buffer2,2,1);
Save_tire_data();
}
}
}
}
break;//学习后胎压
default:break;
}
}