#include "awtk.h" #include "user_protocol.h" #include "gpio_protocol.h" #include "moto_config.h" #include "data_port.h" #include "FreeRTOS.h" #include "chip.h" #include "board.h" #include "keypad.h" #include "moto_adc.h" uint8_t save_data = 0; #define ADC_VPLTAGE_MIN 1666 #define ADC_VPLTAGE_MAX 2486 int adc_light = 0; int adc_voltage = 0; extern uint32_t fml_stamp_to_time(uint32_t timep , uint32_t time[]); extern uint8_t light_buffer[]; extern double cell_buffer[]; extern uint8_t data_storage; extern uint32_t tire_front_time; extern uint32_t tire_rear_time; // 封装的函数,根据位位置获取对应的值 uint8_t getBitValue(uint8_t count, int bitPosition) { return (count >> bitPosition) & 0x1; } // 封装的函数,获取2个bit组合成的值 uint8_t getBit2Value(uint8_t count, int bitPosition) { return (count >> bitPosition) & 0x3; } // 封装的函数,获取3个bit组合成的值 uint8_t getBit3Value(uint8_t count, int bitPosition) { return (count >> bitPosition) & 0x7; } // 封装的函数,获取4个bit组合成的值 uint8_t getBit4Value(uint8_t count, int bitPosition) { return (count >> bitPosition) & 0xf; } double adc_voltage_calculation(void){ double value = 0; if(adc_voltage<=ADC_VPLTAGE_MIN) value = 11.0; else if(adc_voltage>=ADC_VPLTAGE_MAX) value = 16.5; else value = (adc_voltage - ADC_VPLTAGE_MIN) * (16.5 - 11.0) / (ADC_VPLTAGE_MAX - ADC_VPLTAGE_MIN) + 11.0; // printf("adc_voltage = %d value = %lf.\r\n",adc_voltage,value); return value; } //MOTO通讯 设备信息+时间戳解析协议 void device_data_analysis(uint8_t *buf){ DEBUG_PRINT("enter device_data_analysis .\r\n"); uint8_t data; uint8_t sum1,sum2,sum3,sum4; uint32_t sum; uint8_t i=0; char equipment[16] = {0}; char produce[5] = {0}; char mac[6] = {0}; data = *(buf++); // DEBUG_PRINT("0xAA -- %02x .\n",data); if(data!=0xAA) return; data = *(buf++); // DEBUG_PRINT("0x47 -- %02x .\n",data); if(data!=0x47) return; //设备相关信息 data = *(buf++);//0x01 // DEBUG_PRINT("0x01 -- %02x .\n",data); data = *(buf++);//0x1C 总长度22+6mac // DEBUG_PRINT("0x1c -- %02x .\n",data); //设备编号占16 DEBUG_PRINT("equipment > "); for(i=0;i<16;i++){ data = *(buf++);//0x16 DEBUG_PRINT("%02x ",data); equipment[i] = data; } DEBUG_PRINT("\n"); Set_device_equipment_num(equipment); //产品型号占5 DEBUG_PRINT("produce > "); for(i=0;i<5;i++){ data = *(buf++); DEBUG_PRINT("%02x ",data); produce[i] = data; } DEBUG_PRINT("\n"); Set_device_produce_num(produce); //客户编号 data = *(buf++); DEBUG_PRINT("client > %02x \n",data); Set_device_client_num(data); //mac占6 DEBUG_PRINT("mac > "); for(i=0;i<6;i++){ data = *(buf++); DEBUG_PRINT("%02x ",data); mac[i] = data; } DEBUG_PRINT("\n"); Set_device_mac(mac); //平台信息 data = *(buf++);//0x02 // DEBUG_PRINT("0x02 -- %02x .\n",data); data = *(buf++);//0x03 // DEBUG_PRINT("0x03 -- %02x .\n",data); //BottomData platform[3]; data = *(buf++);//平台ID DEBUG_PRINT("bottom_id > %02x \n",data); Set_device_bottom_id(data); data = *(buf++);//主版本 DEBUG_PRINT("bottom_softwar_host > %02x \n",data); Set_device_bottom_softwar_host(data); data = *(buf++);//次版本 DEBUG_PRINT("bottom_softwar_order > %02x \n",data); Set_device_bottom_softwar_order(data); //Set_device_bottom_data(platform); //平台认证 data = *(buf++);//0x03 DEBUG_PRINT("0x03 -- %02x .\n",data); data = *(buf++);//0x14 DEBUG_PRINT("0x14 -- %02x .\n",data); DEBUG_PRINT("voucher > "); char voucher[20] = {0}; for(i=0;i<20;i++){ data = *(buf++); DEBUG_PRINT("%02x ",data); voucher[i] = data; } DEBUG_PRINT("\n"); Set_device_voucher(voucher); //同步时间 data = *(buf++);//0x04 // printf("time >> 0x04 -- %02x .\n",data); data = *(buf++);//0x04 // printf("time >> 0x04 -- %02x .\n",data); //DEBUG_PRINT("time stamp >> "); uint32_t time_transfer[6]; sum1 = *(buf++); sum2 = *(buf++); sum3 = *(buf++); sum4 = *(buf++); //sum = sum1 | sum2<<8 | sum3<<16 | sum4<<24; sum = sum1<<24 | sum2<<16 | sum3<<8 | sum4; // printf("time > %08x \n",sum); tire_rear_time = sum; tire_front_time = sum; // if(sum<1706198400) // sum = 1706198400; fml_stamp_to_time(sum,time_transfer); // printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); // Uart_set_time(time_transfer);//去设置时间并不再发送询问时间指令 //Set_sys_ttrb_time(10); data = *(buf++);//0x05 //DEBUG_PRINT("0x05 -- %02x .\n",data); data = *(buf++);//0x02 //DEBUG_PRINT("0x02 -- %02x .\n",data); data = *(buf++); DEBUG_PRINT("device_moto_type %02x \n",data); Set_device_moto_type(data); data = *(buf++); DEBUG_PRINT("device_screen_type %02x \n",data); Set_device_screen_type(data); data = *(buf++);//0x06 //DEBUG_PRINT("0x06 -- %02x .\n",data); data = *(buf++);//0x01 //DEBUG_PRINT("0x01 -- %02x .\n",data); data = *(buf++); DEBUG_PRINT("device_ability %02x .\n",data); Set_device_ability(data); } int test_light = 0; //MOTO通讯协议 void data_analysis(uint8_t *buf){ uint32_t data; uint32_t sum,sum1,sum2,sum3,sum4; volatile double value=0; //一些标志 uint8_t temp = 0; uint8_t oil = 0; uint8_t light = 0; double cell = 0; uint8_t sys_state = 0; save_data = 0; if(Get_sys_power_on_self_test()==100) sys_state=1; data = *(buf++); if(data!=0xAA) return; data = *(buf++); if(data!=0x18) return; data = *(buf++); if(data!=0x03) return; data = *(buf++); if(data!=0x50) return; data = *(buf++); if(data!=0x14) return; //速度 data = *(buf++); #ifndef SPEED_DATA_CAN Set_sys_velocity(data); #endif //转速 sum = 0; sum = *(buf++)&0xFF; //sum = (*(buf++)&0xFF)<<8 | sum; sum = (*(buf++)&0xFF) | sum<<8; Set_sys_veer_velocity(sum); //小计里程 sum = 0; sum1 = *(buf++)&0xFF; sum2 = *(buf++)&0xFF; sum3 = *(buf++)&0xFF; sum4 = *(buf++)&0xFF; sum = sum1<<24 | sum2<<16 | sum3<<8 | sum4; Set_sys_trip_mileage(sum); //总计里程 sum = 0; sum1 = *(buf++)&0xFF; sum2 = *(buf++)&0xFF; sum3 = *(buf++)&0xFF; sum4 = *(buf++)&0xFF; sum = sum1<<24 | sum2<<16 | sum3<<8 | sum4; Set_sys_total_mileage(sum); //灯1 data = *(buf++); // DEBUG_PRINT("data = %d .\r\n",data); Set_sys_veer(getBit2Value(data,0));//UI层数据 Set_sys_lamplight(getBitValue(data,2)); Set_sys_side_marker(getBitValue(data,3)); Set_sys_warning_abs(getBitValue(data,4)); Set_sys_warning_tcs(getBitValue(data,5)); Set_sys_warning_engine(getBitValue(data,6)); save_data = getBitValue(data,7); if(sys_state){ right_led_switch(getBitValue(data,0)); left_led_switch(getBitValue(data,1)); yg_led_switch(getBitValue(data,2)); #if (MOTO_WARE_HOSE == MOTO_ICMX_A580A) abs_led_switch(getBitValue(data,4)); eng_led_switch(getBitValue(data,6)); #endif } //档位 data = *(buf++); if(data < 8){ Set_sys_grade(data); if(sys_state){ if(data == 0) n_led_switch(1); else n_led_switch(0); } } //油量 oil = *(buf++); //温度 temp = *(buf++); //电池电压 value = 0; sum = *(buf++)&0xFF; value = (*(buf++)&0xFF) | sum<<8; cell = value/1000; //光感阻值 测试范围:57-1000 sum = 0; sum = *(buf++)&0xFF; sum = (*(buf++)&0xFF) | sum<<8; // Set_sys_sensor_light(sum); // if(sum<215) // light = sum/2; // else // light = 215; data = *(buf++); if(JUDGE_BIN_0(data)){//收到小计清零,不再发送 DEBUG_PRINT("Received subtotal reset, no more sending.\n"); Set_sys_odo_reset(10); } if(JUDGE_BIN_1(data)){//需要询问时间 DEBUG_PRINT("start time select.\n"); Set_sys_ttrb(0); } if(JUDGE_BIN_2(data)){//收到故障码,不再发送 DEBUG_PRINT("Received fault code, no longer sending.\n"); Set_sys_fault_code(0); } if(JUDGE_BIN_3(data)){//收到时间,不再发送 DEBUG_PRINT("Received time, no longer sending.\n"); Set_sys_ttrb_time(10);//630发送时间给蓝牙后,蓝牙回复收到信号 } if(JUDGE_BIN_4(data)){//收到小计清零,不再发送 DEBUG_PRINT("Received tire pressure command, no longer sending.\n"); Set_sys_tire_pressure_mesg(10); } if(save_data){ // DEBUG_PRINT("save_data.\r\n"); // printf("light = %d .\r\n",light); Set_sys_gas(oil); Set_sys_temp(temp); //Set_sys_voltage(cell); // light = light-15; // light_buffer[data_storage] = light; //adc采样电压计算 // if(adc_voltage>=1700){ // cell = adc_voltage_calculation(); // Set_sys_voltage(cell); adc_light = adc_get_channel_value(ADC_CH_AUX2);//光感 adc_voltage = adc_get_channel_value(ADC_CH_AUX3);//电压 cell = adc_voltage_calculation(); cell_buffer[data_storage] = cell; // Set_sys_voltage(cell); //adc采样光感计算 int light_num = (adc_light/10); test_light = light_num; if(light_num>=200) light_num = 200; if(Get_sys_power_on_self_test()<100) light_num = 10; light_buffer[data_storage] =light_num; data_storage++; if(data_storage>=SAVE_DATA_SIZE){//满足存储大小 计算均值 data_storage=0; } } }