A59项目初版工程 1.电压+光感adc采样优化 2.串口逻辑优化
This commit is contained in:
377
app/moto/protocol/user_protocol.c
Normal file
377
app/moto/protocol/user_protocol.c
Normal file
@ -0,0 +1,377 @@
|
||||
#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 uint16_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;
|
||||
}
|
||||
extern uint8_t device_flag;
|
||||
//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;
|
||||
if(!device_flag)
|
||||
device_flag = 1;
|
||||
//设备相关信息
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
//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;
|
||||
uint8_t 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));
|
||||
// abs_led_switch(getBitValue(data,4));
|
||||
// eng_led_switch(getBitValue(data,6));
|
||||
}
|
||||
|
||||
//档位
|
||||
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);
|
||||
if(light_num>=100)
|
||||
light_num = 100;
|
||||
light_buffer[data_storage] =light_num;
|
||||
data_storage++;
|
||||
if(data_storage>=SAVE_DATA_SIZE){//满足存储大小 计算均值
|
||||
data_storage=0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user