修复ACC状态问题,添加终端属性查询功能,添加定位附加信息电池电压电量 zsxfly20250211
This commit is contained in:
parent
96bf55d238
commit
75c7721ef6
|
|
@ -86,10 +86,10 @@ static void gps_TaskHandle(void *param){
|
||||||
nmea_parse(&parser, gps_rev_data, gps_rev_len, &gps_data.info);
|
nmea_parse(&parser, gps_rev_data, gps_rev_len, &gps_data.info);
|
||||||
nmea_info2pos(&gps_data.info, &gps_data.dpos);
|
nmea_info2pos(&gps_data.info, &gps_data.dpos);
|
||||||
gps_data.flow_num++;
|
gps_data.flow_num++;
|
||||||
app_printf(
|
// app_printf(
|
||||||
"[GPS]:%03d,Lat:%.02f,Lon:%.02f,Sig:%d,Fix:%d,RL=%d\n",
|
// "[GPS]:%03d,Lat:%.02f,Lon:%.02f,Sig:%d,Fix:%d,RL=%d\n",
|
||||||
it++, gps_data.info.lat, gps_data.info.lon, gps_data.info.sig, gps_data.info.fix, gps_rev_len
|
// it++, gps_data.info.lat, gps_data.info.lon, gps_data.info.sig, gps_data.info.fix, gps_rev_len
|
||||||
);
|
// );
|
||||||
|
|
||||||
if((gps_data.info.fix == 1)||(gps_data.info.sig == 0)){ // 不可用
|
if((gps_data.info.fix == 1)||(gps_data.info.sig == 0)){ // 不可用
|
||||||
gps_flag =0;
|
gps_flag =0;
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,72 @@
|
||||||
#include "cm_os.h"
|
#include "cm_os.h"
|
||||||
#include "cm_gpio.h"
|
#include "cm_gpio.h"
|
||||||
|
|
||||||
|
#define BAT_SxP1 4 // 电池四串一并
|
||||||
|
#define BAT_VOLT(_Volt) (_Volt * BAT_SxP1) //电压单位转换
|
||||||
|
#define BAT_Low_VOLT BAT_VOLT(105) //10.5V x 4 = 42V
|
||||||
|
#define BAT_Full_VOLT BAT_VOLT(144) //14.4V x 4 = 57.6V
|
||||||
|
|
||||||
|
// #define BAT_LEVEL_0PERCENT_VOLT BAT_VOLT(105) // 0%:(105~110]=(42.0V~44.0V]
|
||||||
|
// #define BAT_LEVEL_10PERCENT_VOLT BAT_VOLT(113) // 10%:(110~113]=(44.0V~45.2V]
|
||||||
|
// #define BAT_LEVEL_20PERCENT_VOLT BAT_VOLT(116) // 20%:(113~116]=(45.2V~46.4V]
|
||||||
|
// #define BAT_LEVEL_30PERCENT_VOLT BAT_VOLT(119) // 30%:(116~119]=(46.4V~47.6V]
|
||||||
|
// #define BAT_LEVEL_40PERCENT_VOLT BAT_VOLT(122) // 40%:(119~122]=(47.6V~48.8V]
|
||||||
|
// #define BAT_LEVEL_50PERCENT_VOLT BAT_VOLT(125) // 50%:(122~125]=(48.8V~50.0V]
|
||||||
|
// #define BAT_LEVEL_60PERCENT_VOLT BAT_VOLT(128) // 60%:(125~128]=(50.0V~51.2V]
|
||||||
|
// #define BAT_LEVEL_70PERCENT_VOLT BAT_VOLT(131) // 70%:(128~131]=(51.2V~52.4V]
|
||||||
|
// #define BAT_LEVEL_80PERCENT_VOLT BAT_VOLT(134) // 80%:(131~134]=(52.4V~53.6V]
|
||||||
|
// #define BAT_LEVEL_90PERCENT_VOLT BAT_VOLT(137) // 90%:(134~137]=(53.6V~54.8V]
|
||||||
|
// #define BAT_LEVEL_100PERCENT_VOLT BAT_VOLT(144) //100%:(137~144]=(54.8V~57.6V]
|
||||||
|
|
||||||
|
// 内阻 20mΩ * 4 =80mΩ // 线损 10A 0.1V
|
||||||
|
|
||||||
|
#define BAT_LEVEL_0PERCENT_VOLT BAT_VOLT(105) // 0%
|
||||||
|
#define BAT_LEVEL_10PERCENT_VOLT BAT_VOLT(107) // 10%
|
||||||
|
#define BAT_LEVEL_20PERCENT_VOLT BAT_VOLT(109) // 20%
|
||||||
|
#define BAT_LEVEL_30PERCENT_VOLT BAT_VOLT(111) // 30%
|
||||||
|
#define BAT_LEVEL_40PERCENT_VOLT BAT_VOLT(113) // 40%
|
||||||
|
#define BAT_LEVEL_50PERCENT_VOLT BAT_VOLT(115) // 50%
|
||||||
|
#define BAT_LEVEL_60PERCENT_VOLT BAT_VOLT(117) // 60%
|
||||||
|
#define BAT_LEVEL_70PERCENT_VOLT BAT_VOLT(119) // 70%
|
||||||
|
#define BAT_LEVEL_80PERCENT_VOLT BAT_VOLT(121) // 80%
|
||||||
|
#define BAT_LEVEL_90PERCENT_VOLT BAT_VOLT(123) // 90%
|
||||||
|
#define BAT_LEVEL_100PERCENT_VOLT BAT_VOLT(144) //100%
|
||||||
|
|
||||||
|
|
||||||
|
// 充电状态
|
||||||
|
typedef enum {
|
||||||
|
Bat_Low_STA=(1<<0),
|
||||||
|
Bat_30_STA=(1<<1),
|
||||||
|
Bat_60_STA=(1<<2),
|
||||||
|
Bat_80_STA=(1<<3),
|
||||||
|
Bat_100_STA=(1<<4),
|
||||||
|
Bat_NotCharge_STA=(1<<5),
|
||||||
|
Bat_Charge_STA=(1<<6),
|
||||||
|
} BAT_STA_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct BAT_Message{
|
||||||
|
uint8_t Bat_STA;
|
||||||
|
uint8_t Bat_Percent; // 42=42%
|
||||||
|
uint8_t Bat_Low_Volt_count; // 低压计数
|
||||||
|
uint16_t Bat_Voltage; // 480=48.0V
|
||||||
|
uint16_t Runing_Time; // 系统运行时间
|
||||||
|
uint16_t Deep_ACC_Time; // 深踩油门时间
|
||||||
|
} BAT_Message_t;
|
||||||
|
|
||||||
|
#if 0
|
||||||
#define ACC_RES_UP 10000
|
#define ACC_RES_UP 10000
|
||||||
#define ACC_RES_DOWN 3300
|
#define ACC_RES_DOWN 3300
|
||||||
|
|
||||||
#define VIN_RES_UP 240000
|
#define VIN_RES_UP 240000
|
||||||
#define VIN_RES_DOWN 3300
|
#define VIN_RES_DOWN 3300
|
||||||
|
#else
|
||||||
|
#define ACC_RES_UP 47000
|
||||||
|
#define ACC_RES_DOWN 20000
|
||||||
|
|
||||||
|
#define VIN_RES_UP 94000
|
||||||
|
#define VIN_RES_DOWN 3300
|
||||||
|
#endif
|
||||||
|
|
||||||
// ACC 输出设置
|
// ACC 输出设置
|
||||||
#define ACC_OUT_RES_UP 5100
|
#define ACC_OUT_RES_UP 5100
|
||||||
|
|
@ -66,7 +126,7 @@ typedef struct{
|
||||||
} sys_sta_t;
|
} sys_sta_t;
|
||||||
|
|
||||||
extern sys_sta_t sys_sta;
|
extern sys_sta_t sys_sta;
|
||||||
|
extern BAT_Message_t BAT_Message;
|
||||||
|
|
||||||
void control_out_init(void);
|
void control_out_init(void);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,12 +37,12 @@ SYS_CONF_t sys_conf ={
|
||||||
};
|
};
|
||||||
sys_sta_t sys_sta;
|
sys_sta_t sys_sta;
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ADC_power = 0,
|
ADC_power = 0,
|
||||||
ADC_acc = 1,
|
ADC_acc = 1,
|
||||||
}adc_chx_t;
|
}adc_chx_t;
|
||||||
|
|
||||||
|
// 获取电压值 unit:mV
|
||||||
int32_t get_voltage(adc_chx_t chx){
|
int32_t get_voltage(adc_chx_t chx){
|
||||||
int32_t voltage = 0;
|
int32_t voltage = 0;
|
||||||
if(chx == ADC_acc){
|
if(chx == ADC_acc){
|
||||||
|
|
@ -93,16 +93,103 @@ 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;
|
||||||
|
if((volt < coulomp_voltage_table[0])){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if((volt >= coulomp_voltage_table[10])){
|
||||||
|
return 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 10; i++) {
|
||||||
|
if((volt < coulomp_voltage_table[i+1]) && (volt >= coulomp_voltage_table[i])){
|
||||||
|
step = (coulomp_voltage_table[i+1] - coulomp_voltage_table[i]) / 10.0;
|
||||||
|
base = coulomp_voltage_table[i];
|
||||||
|
percent = (10 * i) + (volt - base) / step;
|
||||||
|
// DEBUG("\n\ni:%d,volt:%d,step:%02.2f,base:%02.2f,percent:%d\n\n",i,volt,step,base,percent);
|
||||||
|
return (uint8_t)percent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#define _out_UPDETE_TIME 10
|
#define _out_UPDETE_TIME 10
|
||||||
static uint32_t back_timecount = 0;
|
static uint32_t back_timecount = 0;
|
||||||
static uint8_t door_lock_last_status = 0;
|
static uint8_t door_lock_last_status = 0;
|
||||||
static uint8_t S_MODE_last_status = 1;
|
static uint8_t S_MODE_last_status = 1;
|
||||||
|
|
||||||
|
BAT_Message_t BAT_Message;
|
||||||
|
|
||||||
|
// 门锁状态更新标志
|
||||||
|
bool GRB_Door_lock_updata=0;
|
||||||
|
uint16_t Voltage_lag_count;
|
||||||
|
uint16_t Voltage_update_count;
|
||||||
|
float temp_bat_voltage=0;
|
||||||
|
|
||||||
void control_out_task(void *argument){
|
void control_out_task(void *argument){
|
||||||
cm_gpio_level_e level = 0;
|
cm_gpio_level_e level = 0;
|
||||||
while(1){
|
while(1){
|
||||||
|
|
||||||
|
uint16_t in_acc_percent= get_in_acc_percent();
|
||||||
|
|
||||||
|
if(BAT_Message.Runing_Time < 0xFFFF){
|
||||||
|
BAT_Message.Runing_Time++;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp_bat_voltage += get_voltage(ADC_power) / 100;
|
||||||
|
|
||||||
|
Voltage_update_count++;
|
||||||
|
if(Voltage_update_count >= (1000/_out_UPDETE_TIME)){//1s
|
||||||
|
BAT_Message.Bat_Voltage = temp_bat_voltage / Voltage_update_count;
|
||||||
|
Voltage_update_count=0;
|
||||||
|
temp_bat_voltage = 0;
|
||||||
|
}
|
||||||
|
in_acc_percent =80;
|
||||||
|
if(in_acc_percent >= 80){ // 油门大于80%时,
|
||||||
|
if(BAT_Message.Deep_ACC_Time < 0xFFFF){
|
||||||
|
BAT_Message.Deep_ACC_Time++;
|
||||||
|
}
|
||||||
|
Voltage_lag_count++;
|
||||||
|
if(Voltage_lag_count >= (2000/_out_UPDETE_TIME)){//2s
|
||||||
|
Voltage_lag_count=0;
|
||||||
|
BAT_Message.Bat_Percent = pmu_voltage_to_percent(BAT_Message.Bat_Voltage);
|
||||||
|
}
|
||||||
|
if(BAT_Message.Bat_Percent < 12){
|
||||||
|
BAT_Message.Bat_Low_Volt_count++;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
Voltage_lag_count=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(BAT_Message.Bat_Percent < 7){
|
||||||
|
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_Low_STA;
|
||||||
|
}else if(BAT_Message.Bat_Percent < 30){ // 7~30%
|
||||||
|
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_30_STA;
|
||||||
|
}else if(BAT_Message.Bat_Percent < 60){ // 30~60%
|
||||||
|
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_60_STA;
|
||||||
|
}else if(BAT_Message.Bat_Percent < 80){ // 60~80%
|
||||||
|
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_80_STA;
|
||||||
|
}else{
|
||||||
|
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_100_STA;
|
||||||
|
}
|
||||||
|
// DEBUG("Bat_Percent:%d,Bat_Voltage:%d,Bat_STA:%X\r\n",BAT_Message.Bat_Percent,BAT_Message.Bat_Voltage,BAT_Message.Bat_STA);
|
||||||
|
|
||||||
// DEBUG("ADC_acc:%dmV\r\n",get_voltage(ADC_acc));
|
// DEBUG("ADC_acc:%dmV\r\n",get_voltage(ADC_acc));
|
||||||
// DEBUG("ADC_power:%dmV\r\n\n",get_voltage(ADC_power));
|
// DEBUG("ADC_power:%dmV\r\n\n",get_voltage(ADC_power));
|
||||||
// 系统模式状态
|
// 系统模式状态
|
||||||
|
|
@ -184,12 +271,12 @@ void control_out_task(void *argument){
|
||||||
uint8_t acc_percent =0;
|
uint8_t acc_percent =0;
|
||||||
if((1 == sys_sta.MAG_MODE)&&(1 == sys_sta.PLT_MODE )){ // 游客模式
|
if((1 == sys_sta.MAG_MODE)&&(1 == sys_sta.PLT_MODE )){ // 游客模式
|
||||||
if(sys_sta.A_Speed_Cut){ // 自动减速
|
if(sys_sta.A_Speed_Cut){ // 自动减速
|
||||||
acc_percent = (get_in_acc_percent() * sys_conf.Speed_Cut_sLim) / 100.0;
|
acc_percent = (in_acc_percent * sys_conf.Speed_Cut_sLim) / 100.0;
|
||||||
}else{
|
}else{
|
||||||
acc_percent = (get_in_acc_percent() * sys_conf.Tourist_sLim) / 100.0;
|
acc_percent = (in_acc_percent * sys_conf.Tourist_sLim) / 100.0;
|
||||||
}
|
}
|
||||||
}else{ // 管理员模式
|
}else{ // 管理员模式
|
||||||
acc_percent = (get_in_acc_percent() * sys_conf.Manager_sLim) / 100.0;
|
acc_percent = (in_acc_percent * sys_conf.Manager_sLim) / 100.0;
|
||||||
}
|
}
|
||||||
set_out_acc_percent(acc_percent);
|
set_out_acc_percent(acc_percent);
|
||||||
// DEBUG("acc_percent:%d\r\n",acc_percent);
|
// DEBUG("acc_percent:%d\r\n",acc_percent);
|
||||||
|
|
|
||||||
|
|
@ -10,5 +10,5 @@ include $(CUSTOM_DIR)/jt808/jt808.mk
|
||||||
include $(CUSTOM_DIR)/tcp_client/tcp_client.mk
|
include $(CUSTOM_DIR)/tcp_client/tcp_client.mk
|
||||||
include $(CUSTOM_DIR)/control_out/control_out.mk
|
include $(CUSTOM_DIR)/control_out/control_out.mk
|
||||||
include $(CUSTOM_DIR)/local_tts/local_tts.mk
|
include $(CUSTOM_DIR)/local_tts/local_tts.mk
|
||||||
# include $(CUSTOM_DIR)/radar/radar.mk
|
include $(CUSTOM_DIR)/radar/radar.mk
|
||||||
endif
|
endif
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
#include "app_uart.h"
|
#include "app_uart.h"
|
||||||
#include "app_common.h"
|
#include "app_common.h"
|
||||||
|
|
||||||
|
#include "radar.h"
|
||||||
|
|
||||||
#define APP_UART_TASK_PRIORITY osPriorityNormal
|
#define APP_UART_TASK_PRIORITY osPriorityNormal
|
||||||
|
|
||||||
|
|
@ -41,7 +41,7 @@
|
||||||
|
|
||||||
#define UART_BUF_LEN 1024
|
#define UART_BUF_LEN 1024
|
||||||
|
|
||||||
static int rx_rev_len = 0;
|
// static int rx_rev_len = 0;
|
||||||
static char rx_rev_data[UART_BUF_LEN] = {0};
|
static char rx_rev_data[UART_BUF_LEN] = {0};
|
||||||
|
|
||||||
static osThreadId_t os_UART_RX_ThreadId = NULL; //串口数据接收、解析任务Handle
|
static osThreadId_t os_UART_RX_ThreadId = NULL; //串口数据接收、解析任务Handle
|
||||||
|
|
@ -60,18 +60,21 @@ typedef struct{
|
||||||
static void Uart_RX_TaskHandle(void *param){
|
static void Uart_RX_TaskHandle(void *param){
|
||||||
int temp_len = 0;
|
int temp_len = 0;
|
||||||
|
|
||||||
while (1){
|
while(1){
|
||||||
if (uart_rx_sem != NULL){
|
if(uart_rx_sem != NULL){
|
||||||
osSemaphoreAcquire(uart_rx_sem, osWaitForever);//阻塞
|
osSemaphoreAcquire(uart_rx_sem, osWaitForever);//阻塞
|
||||||
}
|
}
|
||||||
temp_len = cm_uart_read(APP_URAT, (void*)&rx_rev_data[rx_rev_len], UART_BUF_LEN, 1000);
|
temp_len = cm_uart_read(APP_URAT, (void*)&rx_rev_data[0], UART_BUF_LEN, 1000);
|
||||||
rx_rev_len += temp_len;
|
radar_CheckData(rx_rev_data, temp_len); // 接收数据处理
|
||||||
if (rx_rev_len < UART_BUF_LEN){ // 处理数据
|
|
||||||
|
|
||||||
memset((void*)rx_rev_data, 0, rx_rev_len);
|
// temp_len = cm_uart_read(APP_URAT, (void*)&rx_rev_data[rx_rev_len], UART_BUF_LEN, 1000);
|
||||||
temp_len = 0;
|
// rx_rev_len += temp_len;
|
||||||
rx_rev_len = 0;
|
// if (rx_rev_len < UART_BUF_LEN){ // 处理数据
|
||||||
}
|
|
||||||
|
// memset((void*)rx_rev_data, 0, rx_rev_len);
|
||||||
|
// temp_len = 0;
|
||||||
|
// rx_rev_len = 0;
|
||||||
|
// }
|
||||||
|
|
||||||
// app_printf("uart rev data len = %d\n", rx_rev_len);
|
// app_printf("uart rev data len = %d\n", rx_rev_len);
|
||||||
// if (uart_rx_sem != NULL && (strstr(rx_rev_data, "\r\n"))){
|
// if (uart_rx_sem != NULL && (strstr(rx_rev_data, "\r\n"))){
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@
|
||||||
#include "jt808_pkg_transmit.h"
|
#include "jt808_pkg_transmit.h"
|
||||||
#include "tcp_client.h"
|
#include "tcp_client.h"
|
||||||
#include "control_out.h"
|
#include "control_out.h"
|
||||||
|
#include "radar.h"
|
||||||
|
|
||||||
#include "local_tts.h"
|
#include "local_tts.h"
|
||||||
|
|
||||||
|
|
@ -240,6 +241,7 @@ void my_appimg_enter(char *param){
|
||||||
jt808_init();
|
jt808_init();
|
||||||
tcp_client_init();
|
tcp_client_init();
|
||||||
gps_config_init();
|
gps_config_init();
|
||||||
|
radar_init();// 雷达测离初始化
|
||||||
while(1){
|
while(1){
|
||||||
osDelay(1000/5);
|
osDelay(1000/5);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,8 @@
|
||||||
#include "app_uart.h"
|
#include "app_uart.h"
|
||||||
#define JT808_DEBUG(fmt, args...) app_printf("[JT808]" fmt, ##args)
|
#define JT808_DEBUG(fmt, args...) app_printf("[JT808]" fmt, ##args)
|
||||||
#else
|
#else
|
||||||
#define JT808_DEBUG(fmt, arg...)
|
#include "app_uart.h"
|
||||||
|
#define JT808_DEBUG(fmt, ...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -154,11 +154,11 @@ typedef struct {
|
||||||
uint8_t manufacturer_id[5];// 制造商ID, 固定5个字节
|
uint8_t manufacturer_id[5];// 制造商ID, 固定5个字节
|
||||||
uint8_t term_model[20];// 终端型号, 固定20个字节, 位数不足后补0x00
|
uint8_t term_model[20];// 终端型号, 固定20个字节, 位数不足后补0x00
|
||||||
uint8_t term_id[7];// 终端ID, 固定7个字节, 位数不足后补0x00
|
uint8_t term_id[7];// 终端ID, 固定7个字节, 位数不足后补0x00
|
||||||
uint8_t term_ICCID[10];// ICCID,
|
uint8_t term_ICCID[10];// ICCID
|
||||||
uint8_t hw_ver_len;// 终端硬件版本号长度
|
uint8_t hw_ver_len;// 终端硬件版本号长度
|
||||||
uint8_t *str_hw_ver;// 终端硬件版本号
|
uint8_t str_hw_ver[5];// 终端硬件版本号
|
||||||
uint8_t fw_ver_len;// 终端固件版本号长度
|
uint8_t fw_ver_len;// 终端固件版本号长度
|
||||||
uint8_t *str_fw_ver;// 终端固件版本号
|
uint8_t str_fw_ver[5];// 终端固件版本号
|
||||||
uint8_t GnssModule_attr;// GNSS模块属性
|
uint8_t GnssModule_attr;// GNSS模块属性
|
||||||
uint8_t CommModule_attr;// 通讯模块属性
|
uint8_t CommModule_attr;// 通讯模块属性
|
||||||
}GetTermAttrResp_t;
|
}GetTermAttrResp_t;
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,8 @@ typedef enum{
|
||||||
NetworkQuantityID = 0x30,// 无线通信网络信号强度, BYTE
|
NetworkQuantityID = 0x30,// 无线通信网络信号强度, BYTE
|
||||||
GnssSatellitesID = 0x31,// GNSS 定位卫星数, BYTE
|
GnssSatellitesID = 0x31,// GNSS 定位卫星数, BYTE
|
||||||
CustomInformationLengthID = 0xE0,// 后续自定义信息长度, BYTE
|
CustomInformationLengthID = 0xE0,// 后续自定义信息长度, BYTE
|
||||||
|
BAT_VoltageID = 0xE1, // 电池电压, 0.1V WORD
|
||||||
|
BAT_PercentageID = 0xE2, // 电池电量, % BYTE
|
||||||
}addi_infoID_t;
|
}addi_infoID_t;
|
||||||
|
|
||||||
// big_标记的参数需以大端方式存储,需手动转换为大端
|
// big_标记的参数需以大端方式存储,需手动转换为大端
|
||||||
|
|
@ -54,6 +56,7 @@ typedef struct {// 终端参数项
|
||||||
Term_RegInfo_t big_reg_info; // 注册信息
|
Term_RegInfo_t big_reg_info; // 注册信息
|
||||||
Term_Auth_t big_auth_info; // 终端鉴权信息
|
Term_Auth_t big_auth_info; // 终端鉴权信息
|
||||||
set_TermParam_t set_term_param; // 设置终端参数
|
set_TermParam_t set_term_param; // 设置终端参数
|
||||||
|
GetTermAttrResp_t big_term_attr_resp; // 终端属性查询响应
|
||||||
GetSpecificTermParams_t big_specific_params; // 解析出的待查询指定终端参数列表
|
GetSpecificTermParams_t big_specific_params; // 解析出的待查询指定终端参数列表
|
||||||
Term_Ctrl_t big_ctrl_info; // 解析出的终端控制信息
|
Term_Ctrl_t big_ctrl_info; // 解析出的终端控制信息
|
||||||
Term_Upgrade_t big_upgrade_info; // 解析出的升级信息
|
Term_Upgrade_t big_upgrade_info; // 解析出的升级信息
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,7 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){
|
||||||
}
|
}
|
||||||
case ID_GetTermAttr:{// 查询终端属性
|
case ID_GetTermAttr:{// 查询终端属性
|
||||||
|
|
||||||
|
jt808_pkg_send(ID_GetTermAttrResp, 0);// 发送查询终端属性应答,设置本消息无发送应答
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ID_Term_Upgrade:{// 下发终端升级包
|
case ID_Term_Upgrade:{// 下发终端升级包
|
||||||
|
|
@ -83,7 +84,9 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){
|
||||||
}
|
}
|
||||||
case ID_TxtMsgdelivery:{// 文本信息下发
|
case ID_TxtMsgdelivery:{// 文本信息下发
|
||||||
uint8_t device_volume, speed, volume, mode;
|
uint8_t device_volume, speed, volume, mode;
|
||||||
|
uint8_t txt_flag = ((uint8_t *)Prsmsg_body)[0];
|
||||||
|
JT808_DEBUG("ID_TxtMsgdelivery:%x\r\n", txt_flag);
|
||||||
|
Prsmsg_body = (void *)((uint8_t *)Prsmsg_body + 1); // 跳过标志位
|
||||||
device_volume =10*(((uint8_t *)Prsmsg_body)[0]-'0') + (((uint8_t *)Prsmsg_body)[1]-'0');
|
device_volume =10*(((uint8_t *)Prsmsg_body)[0]-'0') + (((uint8_t *)Prsmsg_body)[1]-'0');
|
||||||
speed =10*(((uint8_t *)Prsmsg_body)[3]-'0') + (((uint8_t *)Prsmsg_body)[4]-'0');
|
speed =10*(((uint8_t *)Prsmsg_body)[3]-'0') + (((uint8_t *)Prsmsg_body)[4]-'0');
|
||||||
volume =10*(((uint8_t *)Prsmsg_body)[6]-'0') + (((uint8_t *)Prsmsg_body)[7]-'0');
|
volume =10*(((uint8_t *)Prsmsg_body)[6]-'0') + (((uint8_t *)Prsmsg_body)[7]-'0');
|
||||||
|
|
@ -114,10 +117,14 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ID_Car_Ctrl:{// 车辆控制
|
case ID_Car_Ctrl:{// 车辆控制
|
||||||
jt808_Set_CarStatus(((uint8_t *)Prsmsg_body)[0]); // 设置车辆状态
|
if(Result->msg_head.msgbody_attr.msgbodylen == 1){ // 车辆控制
|
||||||
|
jt808_Set_CarStatus(((uint8_t *)Prsmsg_body)[0]); // 设置车辆状态
|
||||||
|
Result->Rsp_result = Msg_ok;
|
||||||
|
}else{
|
||||||
|
Result->Rsp_result = Msg_invalid;
|
||||||
|
}
|
||||||
Result->Rsp_flow_num = Result->msg_head.msg_flow_num;
|
Result->Rsp_flow_num = Result->msg_head.msg_flow_num;
|
||||||
Result->Rsp_msg_id = Result->msg_head.msg_id;
|
Result->Rsp_msg_id = Result->msg_head.msg_id;
|
||||||
Result->Rsp_result = Msg_ok;
|
|
||||||
jt808_pkg_send(ID_Car_CtrlResp, 0);// 发送车辆控制应答,设置本消息无发送应答
|
jt808_pkg_send(ID_Car_CtrlResp, 0);// 发送车辆控制应答,设置本消息无发送应答
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -85,13 +85,14 @@ static int jt808_BodyPackage(JT808_2013_MsgFrame_t *p_MsgFrame, MessageID_t Msg_
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ID_GetTermAttrResp:{ // 查询终端属性应答
|
case ID_GetTermAttrResp:{ // 查询终端属性应答
|
||||||
// p_MsgFrame->msg_head.msgbody_attr.msgbodylen = sizeof(GetTermAttrResp_t);// 消息体长度
|
p_MsgFrame->msg_head.msgbody_attr.msgbodylen = sizeof(GetTermAttrResp_t);// 消息体长度
|
||||||
// GetTermAttrResp_t *get_term_attr_resp = (GetTermAttrResp_t *)jt808_realloc(p_MsgFrame->p_msg_body, sizeof(GetTermAttrResp_t));
|
GetTermAttrResp_t *get_term_attr_resp = (GetTermAttrResp_t *)jt808_malloc(p_MsgFrame->msg_head.msgbody_attr.msgbodylen);
|
||||||
// if(get_term_attr_resp == NULL){
|
if(get_term_attr_resp == NULL){
|
||||||
// JT808_DEBUG("[%s,%s] malloc failed \r\n", __FUNCTION__,__LINE__);
|
JT808_DEBUG("[%s,%s] malloc failed \r\n", __FUNCTION__,__LINE__);
|
||||||
// return -1;
|
return -1;
|
||||||
// }
|
}
|
||||||
// p_MsgFrame->p_msg_body = (void *)get_term_attr_resp;
|
memcpy(get_term_attr_resp, &PrsResult.term_param_item->big_term_attr_resp, sizeof(GetTermAttrResp_t)); // 复制查询终端属性应答内容
|
||||||
|
p_MsgFrame->p_msg_body = (void *)get_term_attr_resp;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ID_Term_UpgradeResult:{ // 终端升级结果通知
|
case ID_Term_UpgradeResult:{ // 终端升级结果通知
|
||||||
|
|
|
||||||
|
|
@ -132,12 +132,85 @@ int jt808_updateLocBasicInfo(Loc_basic_info_t *loc_basic_info){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 增加附加信息(队尾增加)
|
||||||
|
void jt808_LocReport_add_tail_addi_info(uint8_t msg_id){
|
||||||
|
// TODO: 增加附加信息
|
||||||
|
Loc_addi_info_t *p_head =jt808_term_param_item.big_loc_report.addi_info;
|
||||||
|
while(p_head != NULL){
|
||||||
|
if(p_head->msg_id == msg_id){
|
||||||
|
// 已存在该消息ID
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
p_head = p_head->next;
|
||||||
|
}
|
||||||
|
// 未找到该消息ID,增加
|
||||||
|
p_head = (Loc_addi_info_t *)jt808_malloc(sizeof(Loc_addi_info_t));
|
||||||
|
if(p_head == NULL){
|
||||||
|
JT808_DEBUG("[%s,%s] malloc failed \r\n", __FUNCTION__,__LINE__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(jt808_term_param_item.big_loc_report.addi_info == NULL){
|
||||||
|
jt808_term_param_item.big_loc_report.addi_info = p_head;
|
||||||
|
}else{
|
||||||
|
Loc_addi_info_t *p_tail =jt808_term_param_item.big_loc_report.addi_info;
|
||||||
|
while(p_tail->next != NULL){
|
||||||
|
p_tail = p_tail->next;
|
||||||
|
}
|
||||||
|
p_tail->next = p_head;
|
||||||
|
}
|
||||||
|
p_head->msg_id = msg_id;
|
||||||
|
p_head->next = NULL;
|
||||||
|
|
||||||
|
// TODO: 增加附加信息
|
||||||
|
switch(msg_id){
|
||||||
|
case BAT_VoltageID:{
|
||||||
|
// 电池电压, 0.1V WORD
|
||||||
|
p_head->msg_len = 2;
|
||||||
|
p_head->msg = (void *)(&BAT_Message.Bat_Voltage);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BAT_PercentageID:{
|
||||||
|
// 电池电量 , % BYTE
|
||||||
|
p_head->msg_len = 1;
|
||||||
|
p_head->msg = (void *)(&BAT_Message.Bat_Percent);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:{
|
||||||
|
// TODO: 未知消息ID
|
||||||
|
jt808_free(p_head);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 移除附加信息(指定消息ID)
|
||||||
|
void jt808_LocReport_remove_addi_info(uint8_t msg_id){
|
||||||
|
Loc_addi_info_t *p_head =jt808_term_param_item.big_loc_report.addi_info;
|
||||||
|
Loc_addi_info_t *p_prev =NULL;
|
||||||
|
while(p_head != NULL){
|
||||||
|
if(p_head->msg_id == msg_id){
|
||||||
|
if(p_prev == NULL){
|
||||||
|
jt808_term_param_item.big_loc_report.addi_info = p_head->next;
|
||||||
|
}else{
|
||||||
|
p_prev->next = p_head->next;
|
||||||
|
}
|
||||||
|
jt808_free(p_head);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
p_prev = p_head;
|
||||||
|
p_head = p_head->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
osThreadFunc_t Autoreport_param_ThreadId;
|
osThreadFunc_t Autoreport_param_ThreadId;
|
||||||
|
|
||||||
void Autoreport_param_Task(void *arg){
|
void Autoreport_param_Task(void *arg){
|
||||||
uint32_t count_Sec = 0;// 计数器
|
uint32_t count_Sec = 0;// 计数器
|
||||||
nmeaTIME beiJingTime; // 北京时间
|
nmeaTIME beiJingTime; // 北京时间
|
||||||
|
|
||||||
|
jt808_LocReport_add_tail_addi_info(BAT_VoltageID); // 增加电池电压信息
|
||||||
|
jt808_LocReport_add_tail_addi_info(BAT_PercentageID); // 增加电池电量信息
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
// TODO: 自动上报参数
|
// TODO: 自动上报参数
|
||||||
// 1. 位置基本信息
|
// 1. 位置基本信息
|
||||||
|
|
@ -158,7 +231,7 @@ void Autoreport_param_Task(void *arg){
|
||||||
|
|
||||||
jt808_term_param_item.big_loc_report.basic_info.status.val32 = 0; // 清除状态信息
|
jt808_term_param_item.big_loc_report.basic_info.status.val32 = 0; // 清除状态信息
|
||||||
jt808_term_param_item.big_loc_report.basic_info.status.positioning = (((gps_data.info.fix == 1)||(gps_data.info.sig == 0)) ? 0 : 1); // 0:未定位,1:已定位
|
jt808_term_param_item.big_loc_report.basic_info.status.positioning = (((gps_data.info.fix == 1)||(gps_data.info.sig == 0)) ? 0 : 1); // 0:未定位,1:已定位
|
||||||
jt808_term_param_item.big_loc_report.basic_info.status.acc =sys_sta.O_door_lock; // 1:电门锁打开,0:电门锁关闭
|
jt808_term_param_item.big_loc_report.basic_info.status.acc =((1==sys_sta.O_door_lock)||(0==sys_sta.MAG_MODE)); // 1:电门锁打开,0:电门锁关闭
|
||||||
jt808_term_param_item.big_loc_report.basic_info.status.MAG_MODE =sys_sta.MAG_MODE;// 1:游客模式,0:管理模式
|
jt808_term_param_item.big_loc_report.basic_info.status.MAG_MODE =sys_sta.MAG_MODE;// 1:游客模式,0:管理模式
|
||||||
jt808_term_param_item.big_loc_report.basic_info.status.PLT_MODE =sys_sta.PLT_MODE; // 1:游客模式,0:管理模式
|
jt808_term_param_item.big_loc_report.basic_info.status.PLT_MODE =sys_sta.PLT_MODE; // 1:游客模式,0:管理模式
|
||||||
jt808_term_param_item.big_loc_report.basic_info.status.IO_RX_back =sys_sta.IO_RX_back; // 1:正常 0:倒车
|
jt808_term_param_item.big_loc_report.basic_info.status.IO_RX_back =sys_sta.IO_RX_back; // 1:正常 0:倒车
|
||||||
|
|
@ -179,6 +252,9 @@ void Autoreport_param_Task(void *arg){
|
||||||
if(0 == (count_Sec % jt808_term_param_item.set_term_param.HeartBeatInterval)){
|
if(0 == (count_Sec % jt808_term_param_item.set_term_param.HeartBeatInterval)){
|
||||||
if((gps_data.info.fix == 1)||(gps_data.info.sig == 0)){ // 不可用// 未定位时发送心跳包
|
if((gps_data.info.fix == 1)||(gps_data.info.sig == 0)){ // 不可用// 未定位时发送心跳包
|
||||||
jt808_pkg_send(ID_Term_HB,0); // 发送心跳包 // 不接收应答
|
jt808_pkg_send(ID_Term_HB,0); // 发送心跳包 // 不接收应答
|
||||||
|
// jt808_pkg_send(ID_LocReport, 0); // 发送位置信息上报包
|
||||||
|
// JT808_DEBUG("Bat_Percent:%d,Bat_Voltage:%d,Bat_STA:%X\r\n",BAT_Message.Bat_Percent,BAT_Message.Bat_Voltage,BAT_Message.Bat_STA);
|
||||||
|
// jt808_pkg_send(ID_GetTermAttrResp, 0); // 发送终端属性查询应答包
|
||||||
}else{
|
}else{
|
||||||
jt808_pkg_send(ID_LocReport,10000/5); // 发送位置信息上报包
|
jt808_pkg_send(ID_LocReport,10000/5); // 发送位置信息上报包
|
||||||
}
|
}
|
||||||
|
|
@ -274,8 +350,23 @@ void jt808_set_term_param_init(void){
|
||||||
char CarPlateNum[] ="京A12345"; // 车牌号码
|
char CarPlateNum[] ="京A12345"; // 车牌号码
|
||||||
memcpy(jt808_term_param_item.big_reg_info.car_plate_num, CarPlateNum, strlen(CarPlateNum)); // 车牌号码
|
memcpy(jt808_term_param_item.big_reg_info.car_plate_num, CarPlateNum, strlen(CarPlateNum)); // 车牌号码
|
||||||
}while(0);
|
}while(0);
|
||||||
do{// 授权信息初始化
|
do{ // 终端属性参数初始化
|
||||||
|
jt808_term_param_item.big_term_attr_resp.term_type = Swap16(0); // 终端类型
|
||||||
|
memcpy(jt808_term_param_item.big_term_attr_resp.manufacturer_id, "LAT01", 5); // 制造商ID
|
||||||
|
memcpy(jt808_term_param_item.big_term_attr_resp.term_model, jt808_term_param_item.big_reg_info.term_model, 20); // 终端型号
|
||||||
|
memcpy(jt808_term_param_item.big_term_attr_resp.term_id, jt808_term_param_item.big_reg_info.term_id, 7); // 终端ID
|
||||||
|
memcpy(jt808_term_param_item.big_term_attr_resp.term_ICCID+4, jt808_term_param_item.phone_BCDnum, 6); // 终端手机号码
|
||||||
|
|
||||||
|
char str_hw_ver[] = "1.0.0"; // 硬件版本
|
||||||
|
char str_fw_ver[] = "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)); // 硬件版本
|
||||||
|
memcpy(jt808_term_param_item.big_term_attr_resp.str_fw_ver, str_fw_ver, strlen(str_fw_ver)); // 固件版本
|
||||||
|
jt808_term_param_item.big_term_attr_resp.GnssModule_attr = 0x03; // GNSS模块属性
|
||||||
|
jt808_term_param_item.big_term_attr_resp.CommModule_attr = 0x01; // 通信模块属性
|
||||||
|
}while(0);
|
||||||
|
do{// 授权信息初始化
|
||||||
char str_auth[]="auth code error..."; // 授权码
|
char str_auth[]="auth code error..."; // 授权码
|
||||||
jt808_term_param_item.big_auth_info.str_auth_code = jt808_malloc(strlen(str_auth)+1); // 授权码
|
jt808_term_param_item.big_auth_info.str_auth_code = jt808_malloc(strlen(str_auth)+1); // 授权码
|
||||||
if(jt808_term_param_item.big_auth_info.str_auth_code == NULL){
|
if(jt808_term_param_item.big_auth_info.str_auth_code == NULL){
|
||||||
|
|
@ -287,7 +378,7 @@ void jt808_set_term_param_init(void){
|
||||||
// jt808_term_param_item.big_auth_info.str_auth_code = NULL;
|
// jt808_term_param_item.big_auth_info.str_auth_code = NULL;
|
||||||
}while(0);
|
}while(0);
|
||||||
do{// 终端参数初始化
|
do{// 终端参数初始化
|
||||||
jt808_term_param_item.set_term_param.HeartBeatInterval = 30; // 心跳包间隔(秒)
|
jt808_term_param_item.set_term_param.HeartBeatInterval = 3; // 心跳包间隔(秒)
|
||||||
char ServerAddr[] ="47.99.118.34"; // 车牌号码
|
char ServerAddr[] ="47.99.118.34"; // 车牌号码
|
||||||
uint32_t ServerPort = 5000; // 服务器端口
|
uint32_t ServerPort = 5000; // 服务器端口
|
||||||
// char ServerAddr[] ="36.137.226.30"; // 车牌号码
|
// char ServerAddr[] ="36.137.226.30"; // 车牌号码
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@
|
||||||
static osMessageQueueId_t local_tts_play_queue = NULL;
|
static osMessageQueueId_t local_tts_play_queue = NULL;
|
||||||
// static osMessageQueueId_t local_tts_free_sem_queue = NULL;
|
// static osMessageQueueId_t local_tts_free_sem_queue = NULL;
|
||||||
static osSemaphoreId_t local_tts_play_ok_sem = NULL;
|
static osSemaphoreId_t local_tts_play_ok_sem = NULL;
|
||||||
// static osSemaphoreId_t local_tts_play_stat_sem = NULL;
|
static osSemaphoreId_t local_tts_play_stat_sem = NULL;
|
||||||
// static int32_t TTS_play_finish_flag = 0; //播放完成标志位 0-完成 !=0-未完成
|
// static int32_t TTS_play_finish_flag = 0; //播放完成标志位 0-完成 !=0-未完成
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
|
|
@ -137,10 +137,11 @@ static void __local_tts_callback(cm_local_tts_event_e event, void *param)
|
||||||
break;
|
break;
|
||||||
case CM_LOCAL_TTS_EVENT_PLAY_INTERRUPT:
|
case CM_LOCAL_TTS_EVENT_PLAY_INTERRUPT:
|
||||||
DEBUG("[[%s] PLAY_INTERRUPT\n", (char *)param);
|
DEBUG("[[%s] PLAY_INTERRUPT\n", (char *)param);
|
||||||
break;
|
// break;
|
||||||
case CM_LOCAL_TTS_EVENT_PLAY_FINISH:{
|
case CM_LOCAL_TTS_EVENT_PLAY_FINISH:{
|
||||||
DEBUG("[PLAY_FINISH] %p=%x \n\n", param, *((osSemaphoreId_t *)param));
|
DEBUG("[PLAY_FINISH] %p=%x \n\n", param, *((osSemaphoreId_t *)param));
|
||||||
osSemaphoreRelease(local_tts_play_ok_sem); // 释放发送成功应答信号量
|
osSemaphoreRelease(local_tts_play_ok_sem); // 释放发送成功应答信号量
|
||||||
|
osSemaphoreRelease(local_tts_play_stat_sem);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
@ -172,22 +173,25 @@ static osThreadFunc_t local_tts_play_task(void *arg){
|
||||||
DEBUG("tts task: text= null\n");
|
DEBUG("tts task: text= null\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(0 == cm_local_tts_play_stop()){ // 停止播放
|
if(0 == cm_local_tts_play_status()){ // 正在播放中
|
||||||
ret =osSemaphoreAcquire(local_tts_play_ok_sem, 30000/5);// 等待播放结束
|
cm_local_tts_play_stop();// 停止播放
|
||||||
|
ret =osSemaphoreAcquire(local_tts_play_stat_sem, 30000/5);// 等待播放结束
|
||||||
if(osOK != ret){
|
if(osOK != ret){
|
||||||
DEBUG("local_tts_play_ok_sem:%d\n", ret);
|
DEBUG("local_tts_play_stat_sem:%d\n", ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// DEBUG("tts task: 00000000000\n\n");
|
// DEBUG("tts task: 00000000000\n\n");
|
||||||
cm_local_tts_play(tts_play_queue.text, tts_play_queue.len, __local_tts_callback, NULL);
|
cm_local_tts_play(tts_play_queue.text, tts_play_queue.len, __local_tts_callback, NULL);
|
||||||
// DEBUG("tts task: 1111111111\n\n");
|
// DEBUG("tts task: 1111111111\n\n");
|
||||||
if(0 == tts_play_queue.en_interruptible){ // 不允许被打断播放
|
// if(0 == tts_play_queue.en_interruptible){ // 不允许被打断播放
|
||||||
// DEBUG("tts task: 2222222222\n\n");
|
// DEBUG("tts task: 2222222222\n\n");
|
||||||
ret =osSemaphoreAcquire(local_tts_play_ok_sem, 30000/5);// 等待播放结束
|
ret =osSemaphoreAcquire(local_tts_play_ok_sem, (0 == tts_play_queue.en_interruptible)?(30000/5):(300/5));// 等待播放结束
|
||||||
if(osOK != ret){
|
if(osOK != ret){
|
||||||
DEBUG("local_tts_play_ok_sem:%d\n", ret);
|
DEBUG("local_tts_play_ok_sem:%d\n", ret);
|
||||||
}
|
}
|
||||||
}
|
// }else{
|
||||||
|
// osSemaphoreAcquire(local_tts_play_ok_sem, 300/5);
|
||||||
|
// }
|
||||||
// DEBUG("tts task: 3333333333\n\n");
|
// DEBUG("tts task: 3333333333\n\n");
|
||||||
cm_free(tts_play_queue.text);
|
cm_free(tts_play_queue.text);
|
||||||
tts_play_queue.text = NULL;
|
tts_play_queue.text = NULL;
|
||||||
|
|
@ -225,6 +229,9 @@ void local_tts_init(void){
|
||||||
if(local_tts_play_ok_sem == NULL){
|
if(local_tts_play_ok_sem == NULL){
|
||||||
local_tts_play_ok_sem = osSemaphoreNew(1, 0, NULL);
|
local_tts_play_ok_sem = osSemaphoreNew(1, 0, NULL);
|
||||||
}
|
}
|
||||||
|
if(local_tts_play_stat_sem == NULL){
|
||||||
|
local_tts_play_stat_sem = osSemaphoreNew(1, 0, NULL);
|
||||||
|
}
|
||||||
osThreadAttr_t local_tts_play_thread_attr = {
|
osThreadAttr_t local_tts_play_thread_attr = {
|
||||||
.name = "local_tts_play_thread",
|
.name = "local_tts_play_thread",
|
||||||
.stack_size = 4096*4,
|
.stack_size = 4096*4,
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,7 @@ void radar_CheckData(uint8_t *data, uint16_t data_len){
|
||||||
radar_data.radar_id = data[0];
|
radar_data.radar_id = data[0];
|
||||||
radar_data.distance = ((uint16_t)data[3] << 8 ) | data[4];
|
radar_data.distance = ((uint16_t)data[3] << 8 ) | data[4];
|
||||||
radar_AUTO_BrakeORSpeedCut(radar_data.radar_id ,radar_data.distance);
|
radar_AUTO_BrakeORSpeedCut(radar_data.radar_id ,radar_data.distance);
|
||||||
|
DEBUG("radar_id:%#02x,distance:%d", radar_data.radar_id, radar_data.distance);
|
||||||
radar_CMDReceive_cnt++;
|
radar_CMDReceive_cnt++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -138,9 +139,9 @@ static void RADAR_TaskHandle(void *param){
|
||||||
}
|
}
|
||||||
|
|
||||||
// 进入游客模式开启雷达 //管理员模式优先于游客模式
|
// 进入游客模式开启雷达 //管理员模式优先于游客模式
|
||||||
if(((0 != sys_sta.O_door_lock) && ((1 == sys_sta.MAG_MODE)||(1 == sys_sta.PLT_MODE ))) && sys_sta.P_Radar_EN){
|
if(((0 != sys_sta.O_door_lock) && ((1 == sys_sta.MAG_MODE)&&(1 == sys_sta.PLT_MODE ))) && sys_sta.P_Radar_EN){
|
||||||
// 根据倒车状态确定雷达ID
|
// 根据倒车状态确定雷达ID
|
||||||
DEBUG("SendCMD:ID=%#02x", (0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front);
|
// DEBUG("SendCMD:ID=%#02x", (0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front);
|
||||||
radar_Sendcmd((0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front, RADAR_MODE_Real);
|
radar_Sendcmd((0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front, RADAR_MODE_Real);
|
||||||
}
|
}
|
||||||
osDelay(140/5); // 140ms
|
osDelay(140/5); // 140ms
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
#include "app_common.h"
|
#include "app_common.h"
|
||||||
#include "local_tts.h"
|
#include "local_tts.h"
|
||||||
|
|
||||||
#define TCP_CLIENT_ENABLE 1
|
#define TCP_CLIENT_ENABLE 0
|
||||||
|
|
||||||
#if TCP_CLIENT_ENABLE
|
#if TCP_CLIENT_ENABLE
|
||||||
#include "app_uart.h"
|
#include "app_uart.h"
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
typedef struct {
|
typedef struct {
|
||||||
osThreadId_t TaskHandle; /* TTS播放管理句柄 */
|
osThreadId_t TaskHandle; /* TTS播放管理句柄 */
|
||||||
osSemaphoreId_t SemHandle; /* TTS播放信号量句柄 */
|
osSemaphoreId_t SemHandle; /* TTS播放信号量句柄 */
|
||||||
|
osSemaphoreId_t SemHandle_ack; /* TTS播放信号量句柄 */
|
||||||
cm_local_tts_state_e state; /* TTS播放状态 */
|
cm_local_tts_state_e state; /* TTS播放状态 */
|
||||||
uint8_t *TtsPcmBuf; /* TTS转码后的数据 */
|
uint8_t *TtsPcmBuf; /* TTS转码后的数据 */
|
||||||
uint32_t TtsPcmBufLen; /* 当前TTS已完成转码的数据长度 */
|
uint32_t TtsPcmBufLen; /* 当前TTS已完成转码的数据长度 */
|
||||||
|
|
@ -27,7 +28,7 @@ typedef struct {
|
||||||
void* user_cb_param; /* 回调函数中的参数,由上层应用设置 */
|
void* user_cb_param; /* 回调函数中的参数,由上层应用设置 */
|
||||||
} cm_tts_play_cfg_t;
|
} cm_tts_play_cfg_t;
|
||||||
|
|
||||||
static cm_tts_play_cfg_t cm_tts_play_cfg = {NULL, NULL, CM_LOCAL_TTS_STATE_IDLE, NULL, 0, NULL, NULL};
|
static cm_tts_play_cfg_t cm_tts_play_cfg = {NULL, NULL, NULL, CM_LOCAL_TTS_STATE_IDLE, NULL, 0, NULL, NULL};
|
||||||
|
|
||||||
static void __cm_tts_play_callback(cm_local_tts_event_e event, void *param)
|
static void __cm_tts_play_callback(cm_local_tts_event_e event, void *param)
|
||||||
{
|
{
|
||||||
|
|
@ -69,7 +70,7 @@ static void __cm_tts_play_task(void *param)
|
||||||
{
|
{
|
||||||
osSemaphoreAcquire(cm_tts_play_cfg.SemHandle, osWaitForever);
|
osSemaphoreAcquire(cm_tts_play_cfg.SemHandle, osWaitForever);
|
||||||
}
|
}
|
||||||
|
osSemaphoreRelease(cm_tts_play_cfg.SemHandle_ack);
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
bool isError = false; //播放过程中是否有错误
|
bool isError = false; //播放过程中是否有错误
|
||||||
|
|
||||||
|
|
@ -78,6 +79,9 @@ static void __cm_tts_play_task(void *param)
|
||||||
{
|
{
|
||||||
DEBUG("play_task :len:%d, index: %d\n",cm_tts_play_cfg.TtsPcmBufLen, index);
|
DEBUG("play_task :len:%d, index: %d\n",cm_tts_play_cfg.TtsPcmBufLen, index);
|
||||||
|
|
||||||
|
if(CM_LOCAL_TTS_STATE_IDLE == cm_tts_play_cfg.state){
|
||||||
|
break;
|
||||||
|
}
|
||||||
/* 每200ms传10帧PCM数据 */
|
/* 每200ms传10帧PCM数据 */
|
||||||
if (index + 3200 <= cm_tts_play_cfg.TtsPcmBufLen)
|
if (index + 3200 <= cm_tts_play_cfg.TtsPcmBufLen)
|
||||||
{
|
{
|
||||||
|
|
@ -104,11 +108,13 @@ static void __cm_tts_play_task(void *param)
|
||||||
index = cm_tts_play_cfg.TtsPcmBufLen;
|
index = cm_tts_play_cfg.TtsPcmBufLen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
osDelay(40);
|
osDelay(40);
|
||||||
}
|
}
|
||||||
|
|
||||||
cm_audio_player_stream_close();
|
cm_audio_player_stream_close();
|
||||||
|
cm_tts_play_cfg.TtsPcmBufLen = 0;
|
||||||
|
cm_free(cm_tts_play_cfg.TtsPcmBuf);
|
||||||
|
cm_tts_play_cfg.TtsPcmBuf = NULL;
|
||||||
|
|
||||||
if (cm_tts_play_cfg.user_cb)
|
if (cm_tts_play_cfg.user_cb)
|
||||||
{
|
{
|
||||||
|
|
@ -122,10 +128,7 @@ static void __cm_tts_play_task(void *param)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE;
|
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE;
|
||||||
cm_tts_play_cfg.TtsPcmBufLen = 0;
|
|
||||||
|
|
||||||
cm_free(cm_tts_play_cfg.TtsPcmBuf);
|
|
||||||
cm_tts_play_cfg.TtsPcmBuf = NULL;
|
|
||||||
|
|
||||||
//cm_heap_stats_t stats = {0};
|
//cm_heap_stats_t stats = {0};
|
||||||
//cm_mem_get_heap_stats(&stats);
|
//cm_mem_get_heap_stats(&stats);
|
||||||
|
|
@ -169,6 +172,7 @@ int32_t cm_local_tts_play(const char *text, int32_t len, cm_local_tts_callback c
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_WORKING;
|
||||||
|
|
||||||
cm_audio_sample_param_t frame = {.sample_format = CM_AUDIO_SAMPLE_FORMAT_16BIT, .rate = CM_AUDIO_SAMPLE_RATE_8000HZ, .num_channels = CM_AUDIO_SOUND_MONO};
|
cm_audio_sample_param_t frame = {.sample_format = CM_AUDIO_SAMPLE_FORMAT_16BIT, .rate = CM_AUDIO_SAMPLE_RATE_8000HZ, .num_channels = CM_AUDIO_SOUND_MONO};
|
||||||
int32_t ret = cm_audio_player_stream_open(CM_AUDIO_PLAY_FORMAT_PCM, &frame); //从pipe中播放音频(开启)
|
int32_t ret = cm_audio_player_stream_open(CM_AUDIO_PLAY_FORMAT_PCM, &frame); //从pipe中播放音频(开启)
|
||||||
|
|
@ -179,6 +183,7 @@ int32_t cm_local_tts_play(const char *text, int32_t len, cm_local_tts_callback c
|
||||||
// ret = cm_audio_player_stream_open(CM_AUDIO_PLAY_FORMAT_PCM, &frame); //从pipe中播放音频(开启)
|
// ret = cm_audio_player_stream_open(CM_AUDIO_PLAY_FORMAT_PCM, &frame); //从pipe中播放音频(开启)
|
||||||
// if (-1 == ret){
|
// if (-1 == ret){
|
||||||
// DEBUG("__%d__ stream_open1() error, ret: %d", __LINE__, ret);
|
// DEBUG("__%d__ stream_open1() error, ret: %d", __LINE__, ret);
|
||||||
|
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE;
|
||||||
return -1;
|
return -1;
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
@ -189,8 +194,21 @@ int32_t cm_local_tts_play(const char *text, int32_t len, cm_local_tts_callback c
|
||||||
|
|
||||||
if (NULL == cm_tts_play_cfg.SemHandle)
|
if (NULL == cm_tts_play_cfg.SemHandle)
|
||||||
{
|
{
|
||||||
DEBUG("__%d__ osSemaphoreNew() error",__LINE__);
|
DEBUG("__%d__ osSemaphoreNew0() error",__LINE__);
|
||||||
cm_audio_player_stream_close();
|
cm_audio_player_stream_close();
|
||||||
|
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (NULL == cm_tts_play_cfg.SemHandle_ack)
|
||||||
|
{
|
||||||
|
cm_tts_play_cfg.SemHandle_ack = osSemaphoreNew(1, 0, NULL);
|
||||||
|
|
||||||
|
if (NULL == cm_tts_play_cfg.SemHandle_ack)
|
||||||
|
{
|
||||||
|
DEBUG("__%d__ osSemaphoreNew1() error",__LINE__);
|
||||||
|
cm_audio_player_stream_close();
|
||||||
|
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -209,6 +227,7 @@ int32_t cm_local_tts_play(const char *text, int32_t len, cm_local_tts_callback c
|
||||||
{
|
{
|
||||||
DEBUG("__%d__ osThreadNew() error", __LINE__);
|
DEBUG("__%d__ osThreadNew() error", __LINE__);
|
||||||
cm_audio_player_stream_close();
|
cm_audio_player_stream_close();
|
||||||
|
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -216,15 +235,20 @@ int32_t cm_local_tts_play(const char *text, int32_t len, cm_local_tts_callback c
|
||||||
cm_tts_play_cfg.user_cb = cb;
|
cm_tts_play_cfg.user_cb = cb;
|
||||||
cm_tts_play_cfg.user_cb_param = cb_param;
|
cm_tts_play_cfg.user_cb_param = cb_param;
|
||||||
cm_tts_play_cfg.TtsPcmBufLen = 0;
|
cm_tts_play_cfg.TtsPcmBufLen = 0;
|
||||||
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_WORKING;
|
// cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_WORKING;
|
||||||
DEBUG("tts_synth_start\n\n========\n");
|
// DEBUG("tts_synth_start\n\n========\n");
|
||||||
ret = cm_local_tts_synth(text, len, __cm_tts_play_callback, cb_param);
|
ret = cm_local_tts_synth(text, len, __cm_tts_play_callback, cb_param);
|
||||||
DEBUG("tts_synth_end\n\n========\n");
|
// DEBUG("tts_synth_end\n\n========\n");
|
||||||
if (0 == ret)
|
if (0 == ret)
|
||||||
{
|
{
|
||||||
osSemaphoreRelease(cm_tts_play_cfg.SemHandle);
|
osSemaphoreRelease(cm_tts_play_cfg.SemHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(cm_tts_play_cfg.SemHandle_ack != NULL)
|
||||||
|
{
|
||||||
|
osSemaphoreAcquire(cm_tts_play_cfg.SemHandle_ack, 3000/5);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue