Compare commits

...

6 Commits

Author SHA1 Message Date
kkkjtr fc25d27567 收个尾巴 2026-03-12 09:02:03 +08:00
kkkjtr df31dd8c4e 定时器版本暂时修改完成,等待安卓回复 2026-03-11 16:55:48 +08:00
kkkjtr 71c5dbc702 开始更改定时器版本架构 2026-03-10 17:01:43 +08:00
kkkjtr c2b6056b66 ota包更新 2026-03-06 09:43:31 +08:00
kkkjtr 2a78fd2a71 增加电池容量协议 2026-01-13 17:39:47 +08:00
kkkjtr 66b9795b9e 更新铅酸电池电量换算方式,锂电池后续待更新 2025-12-16 16:15:56 +08:00
9 changed files with 141 additions and 38 deletions

View File

@ -139,6 +139,11 @@ typedef struct{
extern sys_sta_t sys_sta;
extern BAT_Message_t BAT_Message;
extern uint16_t g_car_ctrl_time; // 定时时间(单位由平台定义)
extern uint16_t g_car_ctrl_rest_time; // 剩余时间(单位由平台定义)
extern uint16_t g_car_ctrl_interval; // 本地播报间隔(单位由平台定义)
void control_out_init(void);
#endif //__CONTROL_OUT_H__

View File

@ -25,6 +25,21 @@
osThreadId_t control_out_TaskHandle = NULL;
const uint16_t coulomp_voltage_table[11] = {
BAT_LEVEL_0PERCENT_VOLT,
BAT_LEVEL_10PERCENT_VOLT,
BAT_LEVEL_20PERCENT_VOLT,
BAT_LEVEL_30PERCENT_VOLT,
BAT_LEVEL_40PERCENT_VOLT,
BAT_LEVEL_50PERCENT_VOLT,
BAT_LEVEL_60PERCENT_VOLT,
BAT_LEVEL_70PERCENT_VOLT,
BAT_LEVEL_80PERCENT_VOLT,
BAT_LEVEL_90PERCENT_VOLT,
BAT_LEVEL_100PERCENT_VOLT,
};
// SYS_CONF_t sys_conf ={
// .SW_version = 1,
// .HW_version = 1,
@ -110,20 +125,6 @@ void set_out_acc_percent(uint8_t percent){//1000000设置频率为10KHz
// }
// }
const uint16_t coulomp_voltage_table[11] = {
BAT_LEVEL_0PERCENT_VOLT,
BAT_LEVEL_10PERCENT_VOLT,
BAT_LEVEL_20PERCENT_VOLT,
BAT_LEVEL_30PERCENT_VOLT,
BAT_LEVEL_40PERCENT_VOLT,
BAT_LEVEL_50PERCENT_VOLT,
BAT_LEVEL_60PERCENT_VOLT,
BAT_LEVEL_70PERCENT_VOLT,
BAT_LEVEL_80PERCENT_VOLT,
BAT_LEVEL_90PERCENT_VOLT,
BAT_LEVEL_100PERCENT_VOLT,
};
uint8_t pmu_voltage_to_percent(uint32_t volt){//电压转百分比
uint8_t i, percent;
float step, base;
@ -146,6 +147,7 @@ uint8_t pmu_voltage_to_percent(uint32_t volt){//电压转百分比
return 0;
}
#define _out_UPDETE_TIME 10
// static uint32_t back_timecount = 0;
static uint8_t door_lock_last_status = 0;

View File

@ -39,6 +39,9 @@ typedef enum {
ID_SpeedCutLimit_B = 0xF007, //WORD 后退自动减速刹车距离
ID_Ban_Fence_Polygon_Delay_OFF = 0xF008, //BYTE 禁止围栏延时关闭时间, 单位秒
ID_RadarEN = 0xF009, //BYTE 雷达使能位, 0 代表关闭, 1 代表开启 2代表临时关闭
ID_BatType = 0xF00A, //BYTE 电池类型位0 代表铅酸电池, 1 代表锂电池
ID_VoltageType = 0xF00B, //DWORD 电池电压可设置成48v 60v 72v 或其他电压
ID_BatCap = 0xF00c, //DWORD 电池容量可设置成52AH58AH或其他容量
}set_TermParamID_t;
typedef struct{
uint32_t HeartBeatInterval;// DWORD, 终端心跳发送间隔(s)
@ -61,6 +64,9 @@ typedef struct{
uint32_t BrakeLimit_B; // 后退刹车距离
uint32_t SpeedCutLimit_B; // 后退自动减速刹车距离
uint8_t Ban_Fence_Polygon_Delay_OFF; // 禁止围栏延时关闭时间, 单位秒
uint8_t BatType; //电池种类
uint8_t VoltageType; //电池种类
uint8_t BatCap; //电池种类
}set_TermParam_t;
// 支持的附加消息ID
@ -83,6 +89,7 @@ typedef enum{
Scenic_Fence_Polygon_area_ID = 0xE3, // 当前位置所在景区围栏多边形区域ID, DWORD
Ban_Fence_Polygon_area_ID = 0xE4, // 当前位置所在禁止围栏多边形区域ID, DWORD
Locked_Condition_ID = 0xE7, // 锁车状态, BYTE
Rest_Time = 0xE8,
}addi_infoID_t;
// big_标记的参数需以大端方式存储需手动转换为大端

View File

@ -268,12 +268,17 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){
break;
}
case ID_Car_Ctrl:{// 车辆控制
if(Result->msg_head.msgbody_attr.msgbodylen == 1){ // 车辆控制
jt808_Set_CarStatus(((uint8_t *)Prsmsg_body)[0]); // 设置车辆状态
if(Result->msg_head.msgbody_attr.msgbodylen >= 5){ // 车辆控制
jt808_Set_CarStatus((uint8_t *)Prsmsg_body); // 设置车辆状态
Result->Rsp_result = Msg_ok;
}else if(Result->msg_head.msgbody_attr.msgbodylen == 1) {
JT808_DEBUG("WARN: Received 1-byte car control, consider upgrading platform\n");
uint8_t temp[5] = {((uint8_t *)Prsmsg_body)[0], 0, 0, 0, 0};
jt808_Set_CarStatus(temp);
Result->Rsp_result = Msg_ok;
}else{
Result->Rsp_result = Msg_invalid;
}
Result->Rsp_result = Msg_invalid;
}
Result->Rsp_flow_num = Result->msg_head.msg_flow_num;
Result->Rsp_msg_id = Result->msg_head.msg_id;
jt808_pkg_send(ID_Car_CtrlResp, 0);// 发送车辆控制应答,设置本消息无发送应答

View File

@ -28,6 +28,10 @@ osMutexId_t term_param_mutex = NULL; // 终端参数项互斥锁
osMutexId_t Polygon_fence_mutex = NULL; // 多边形围栏互斥锁
osMutexId_t update_mutex = NULL; //更新数据状态互斥锁
osTimerId_t g_car_ctrl_timer = NULL;
osTimerId_t g_car_ctrl_interval_timer = NULL;
// 定义全局变量
UpdateStatus_t update_status = {
.state = UPDATE_IDLE,
@ -53,6 +57,33 @@ static const ParamDescriptor param_descriptors[] = {
{ID_Ban_Fence_Polygon_Delay_OFF, offsetof(set_TermParam_t, Ban_Fence_Polygon_Delay_OFF), sizeof(uint8_t), 0},
};
// 定时时间定时器回调函数
void main_timer_callback(void *argument) {
// 定时器到期时执行的代码
// argument 是创建定时器时传入的参数
sys_sta.O_door_lock = 0; // 关闭电门锁
osTimerStop(g_car_ctrl_interval_timer); // 停止循环播报定时器
// 更改上报数据
g_car_ctrl_time = 0; //定时时间清零
g_car_ctrl_rest_time = 0; // 剩余时间清零
g_car_ctrl_interval = 0; //播报时间清零
}
// 播报定时器回调函数
void interval_timer_callback(void *argument) {
// 定时器到期时执行的代码
// argument 是创建定时器时传入的参数
g_car_ctrl_rest_time = g_car_ctrl_rest_time - g_car_ctrl_interval;
uint16_t res = (g_car_ctrl_time - g_car_ctrl_rest_time) / 60000; //转换成分钟
uint16_t res2 = g_car_ctrl_rest_time / 60000;
static char buffer[50];
snprintf(buffer, sizeof(buffer),"您已游玩%d分钟,还剩下%d分钟", res, res2);
local_tts_text_play(buffer,0,0);
}
// 释放参数链表
void free_param_list(TermParamlist_t* head) {
TermParamlist_t* current = head;
@ -262,25 +293,57 @@ void update_manager_check_timeout(void) {
osMutexRelease(update_mutex);
}
// 控制车辆状态
void jt808_Set_CarStatus(uint8_t status){
// (void)status;
// TODO: 车辆控制状态
if(status & 0x80){ // 恢复厂设置
jt808_delete_TermParam(); // 删除终端参数文件
jt808_delete_Fence_area(); // 删除围栏区域文件
local_tts_text_play("即将重启系统",0,0); // 语音播报
osDelay(7000/5);
cm_pm_reboot(); // 重启系统
}
if(status & 0x70){ // 重启系统
local_tts_text_play("即将重启系统",0,0); // 语音播报
osDelay(7000/5);
cm_pm_reboot(); // 重启系统
}
sys_sta.O_door_lock = (status & 0x01)? 1 : 0; // 设置电门锁状态
sys_sta.PLT_MODE = (status & 0x02)? 1 : 0; // 平台设置的模式 //1:游客模式,0:管理模式
// sys_sta.P_Radar_EN = (status & 0x04)? 1 : 0; // 1:雷达使能,0:雷达禁止
// 控制车辆状态参数为5字节数据byte0控制位byte1-2定时时间(大端)byte3-4播报间隔(大端)
void jt808_Set_CarStatus(const uint8_t status[5]) {
uint8_t ctrl = status[0];
uint16_t timer = (status[1] << 8) | status[2];
uint16_t interval = (status[3] << 8) | status[4];
// 保存定时时间和播报间隔到系统状态
g_car_ctrl_time = timer;
g_car_ctrl_rest_time = timer * 60000; //分钟转换成毫秒
g_car_ctrl_interval = interval * 60000; //分钟转换成毫秒
if(g_car_ctrl_timer == NULL)
{
// 创建主定时器(到期后只触发一次)
g_car_ctrl_timer = osTimerNew(main_timer_callback, // 回调函数
osTimerOnce, // 定时器类型osTimerOnce一次性或 osTimerPeriodic周期性
NULL, // 传递给回调的参数指针
NULL); // 属性指针,使用默认属性传 NULL
}
if(g_car_ctrl_interval_timer == NULL)
{
g_car_ctrl_interval_timer = osTimerNew(interval_timer_callback, // 回调函数
osTimerPeriodic, // 定时器类型osTimerOnce一次性或 osTimerPeriodic周期性
NULL, // 传递给回调的参数指针
NULL); // 属性指针,使用默认属性传 NULL
}
if(g_car_ctrl_time >> 0 || g_car_ctrl_interval >> 0) //正常下发定时时间和播放间隔时间
{
sys_sta.O_door_lock = 1; // 关闭电门锁
osTimerStart(g_car_ctrl_timer, g_car_ctrl_time);
osTimerStart(g_car_ctrl_interval_timer, g_car_ctrl_interval);
}
// 原有控制逻辑基于ctrl字节
if(ctrl & 0x80) { // 恢复出厂设置
jt808_delete_TermParam(); // 删除终端参数文件
jt808_delete_Fence_area(); // 删除围栏区域文件
local_tts_text_play("即将重启系统", 0, 0);
osDelay(7000 / 5);
cm_pm_reboot();
}
if(ctrl & 0x70) { // 重启系统(任意位)
local_tts_text_play("即将重启系统", 0, 0);
osDelay(7000 / 5);
cm_pm_reboot();
}
sys_sta.O_door_lock = (ctrl & 0x01) ? 1 : 0; // 电门锁
sys_sta.PLT_MODE = (ctrl & 0x02) ? 1 : 0; // 平台模式
// sys_sta.P_Radar_EN = (ctrl & 0x04) ? 1 : 0; // 雷达使能(注释未用)
}
// 获取车辆状态
@ -496,6 +559,21 @@ int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_le
// JT808_DEBUG("RadarEN=%d", radar_en);
jt808_term_param_item.set_term_param.RadarEN = param_val32 & 0xFF;
break;
}
case ID_BatType:{
jt808_term_param_item.set_term_param.BatType = param_val32 & 0xFF;
break;
}
case ID_BatCap:{
jt808_term_param_item.set_term_param.BatCap = param_val32 & 0xFF;
break;
}
case ID_VoltageType:{
jt808_term_param_item.set_term_param.VoltageType = param_val32 & 0xFF;
break;
}
default:{
// TODO: 未知参数
@ -576,6 +654,11 @@ void jt808_LocReport_add_tail_addi_info(uint8_t msg_id){
p_head->msg = (void *)(&Rsp_locked_condition);
break;
}
case Rest_Time:{
p_head->msg_len = 2;
p_head->msg = (void *)(&g_car_ctrl_rest_time);
break;
}
default:{
// TODO: 未知消息ID
jt808_free(p_head);
@ -779,6 +862,7 @@ void Autoreport_param_Task(void *arg){
jt808_LocReport_add_tail_addi_info(Scenic_Fence_Polygon_area_ID); // 增加景区围栏多边形区域ID信息
jt808_LocReport_add_tail_addi_info(Ban_Fence_Polygon_area_ID); // 增加景区围栏多边形区域ID信息
jt808_LocReport_add_tail_addi_info(Locked_Condition_ID);
jt808_LocReport_add_tail_addi_info(Rest_Time);
#if 0 // 测试用
uint32_t area_ID=0;
@ -961,7 +1045,7 @@ void jt808_set_term_param_init(void){
// memcpy(jt808_term_param_item.big_term_attr_resp.term_ICCID+4, jt808_term_param_item.phone_BCDnum, 6); // 终端手机号码 但是你照这个来云端收到的iccid全是因为BCDnum参数本身没有初始化
char str_hw_ver[] = "1.0.0"; // 硬件版本
char str_fw_ver[] = "1.2.4"; // 固件版本 原本为1.0.0
char str_fw_ver[] = "1.2.5"; // 固件版本 原本为1.0.0
jt808_term_param_item.big_term_attr_resp.hw_ver_len = strlen(str_hw_ver); // 硬件版本长度
jt808_term_param_item.big_term_attr_resp.fw_ver_len = strlen(str_fw_ver); // 固件版本长度
memcpy(jt808_term_param_item.big_term_attr_resp.str_hw_ver, str_hw_ver, strlen(str_hw_ver)); // 硬件版本

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.