#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; }else pressure.temp_state = 0; //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; } }