Files
MXC_A59/app/moto/protocol/user_protocol.c
2024-10-10 17:41:53 +08:00

384 lines
9.0 KiB
C
Raw Permalink 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 "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;
}
}
}