添加终端参数,围栏数据缓存功能 zsxfly20250312
This commit is contained in:
parent
96f140a6f3
commit
0a46927735
|
|
@ -144,7 +144,7 @@ uint8_t pmu_voltage_to_percent(uint32_t volt){//电压转百分比
|
|||
}
|
||||
|
||||
#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 S_MODE_last_status = 1;
|
||||
static uint8_t P_MODE_last_status = 1;
|
||||
|
|
@ -251,11 +251,12 @@ void control_out_task(void *argument){
|
|||
if(1 == sys_sta.O_door_lock){ // 电门锁打开
|
||||
// DEBUG("\n\ndoor lock open\r\n\n");
|
||||
// local_tts_set(5, 15, CM_LOCAL_TTS_DIGIT_AUTO);
|
||||
local_tts_text_play("欢迎使用游园猫",0,0);
|
||||
local_tts_text_play("车辆已开锁",0,0);
|
||||
}else{ // 电门锁关闭
|
||||
// DEBUG("\n\ndoor lock close\r\n\n");
|
||||
// local_tts_set(5, 15, CM_LOCAL_TTS_DIGIT_AUTO);
|
||||
local_tts_text_play("行程结束,祝您生活愉快",0,0);
|
||||
local_tts_text_play("已锁车",0,0);
|
||||
// local_tts_text_play("行程结束,祝您生活愉快",0,0);
|
||||
}
|
||||
}
|
||||
if((S_MODE_last_status != sys_sta.MAG_MODE)||(P_MODE_last_status != sys_sta.PLT_MODE)){ // 管理员模式状态变化时触发
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
#include "local_tts.h"
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
#include "app_uart.h"
|
||||
#define DEBUG(fmt, args...) app_printf("[main]" fmt, ##args)
|
||||
#else
|
||||
|
|
@ -157,6 +157,69 @@ void my_appimg_enter(char *param){
|
|||
// local_tts_set(7, 7, CM_LOCAL_TTS_DIGIT_AUTO);
|
||||
local_tts_text_play("已开机",0,0);
|
||||
|
||||
#if 0
|
||||
int ret=0;
|
||||
uint32_t scenic_Fence_Polygon_count = 0;
|
||||
uint32_t ban_Fence_Polygon_count = 0;
|
||||
AreaPoint_t point[4] = {
|
||||
{39939236, 116369446},
|
||||
{39939236, 126379446},
|
||||
{49929236, 126379446},
|
||||
{49929236, 116369446}
|
||||
};
|
||||
for(int i=0;i<4;i++){
|
||||
point[i].lat = Swap32(point[i].lat);
|
||||
point[i].lng = Swap32(point[i].lng);
|
||||
}
|
||||
if(0 == jt808_get_areafile_state()){
|
||||
ret = jt808_load_Fence_area(); // 加载围栏区域信息
|
||||
DEBUG("load fence area ret:%d\n", ret);
|
||||
}else{
|
||||
DEBUG("no fence area file\n");
|
||||
jt808_add_tail_fence_Polygon_area(0x0003, 0x0001, 4, point); // 增加景区围栏多边形区域ID信息
|
||||
jt808_add_tail_fence_Polygon_area(0x0004, 0x0002, 4, point); // 增加景区围栏多边形区域ID信息
|
||||
jt808_add_tail_fence_Polygon_area(0x0AAA, 0x0002, 4, point); // 增加景区围栏多边形区域ID信息
|
||||
ret = jt808_save_Fence_area(); // 保存围栏区域信息
|
||||
DEBUG("save fence area ret0:%d\n", ret);
|
||||
jt808_remove_fence_Polygon_area(0);
|
||||
ret = jt808_save_Fence_area(); // 保存围栏区域信息
|
||||
DEBUG("save fence area ret1:%d\n", ret);
|
||||
}
|
||||
while(1){
|
||||
|
||||
uint32_t lat = 44939236;
|
||||
uint32_t lng = 121369446;
|
||||
|
||||
Rsp_Bigscenic_Fence_Polygon_area_ID = Swap32(jt808_Polygon_fence_check(0x0001, lat, lng));
|
||||
// lat = 34939236;
|
||||
// lng = 121369446;
|
||||
Rsp_Bigban_Fence_Polygon_area_ID = Swap32(jt808_Polygon_fence_check(0x0002, lat, lng));
|
||||
|
||||
DEBUG("scenic:%d,ban:%d\n\n",Swap32(Rsp_Bigscenic_Fence_Polygon_area_ID),Swap32(Rsp_Bigban_Fence_Polygon_area_ID));
|
||||
|
||||
if(Rsp_Bigscenic_Fence_Polygon_area_ID == 0){ // 在景区围栏
|
||||
scenic_Fence_Polygon_count++;
|
||||
if(scenic_Fence_Polygon_count >= 7){
|
||||
scenic_Fence_Polygon_count = 0;
|
||||
local_tts_text_play("您已离开景区!",0,0);
|
||||
}
|
||||
}else{
|
||||
scenic_Fence_Polygon_count = 0;
|
||||
}
|
||||
if(Rsp_Bigban_Fence_Polygon_area_ID != 0){
|
||||
ban_Fence_Polygon_count++;
|
||||
if(ban_Fence_Polygon_count >= 7){ // 7S
|
||||
ban_Fence_Polygon_count = 0;
|
||||
local_tts_text_play("您已进入禁区,请尽快离开!",0,0);
|
||||
}
|
||||
}else{
|
||||
ban_Fence_Polygon_count = 0;
|
||||
}
|
||||
|
||||
osDelay(1000/5);
|
||||
}
|
||||
#endif
|
||||
|
||||
control_out_init();
|
||||
jt808_set_term_param_init();
|
||||
// /*
|
||||
|
|
@ -255,8 +318,7 @@ void my_appimg_enter(char *param){
|
|||
}
|
||||
}
|
||||
|
||||
int cm_opencpu_entry(char * param)
|
||||
{
|
||||
int cm_opencpu_entry(char * param){
|
||||
osThreadAttr_t app_task_attr = {0};
|
||||
app_task_attr.name = "main_task";
|
||||
app_task_attr.stack_size = 4096 * 4;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
#include <stdlib.h>
|
||||
#include "jt808_util.h"
|
||||
|
||||
#define JT808_DEBUG_ENABLE 0
|
||||
#define JT808_DEBUG_ENABLE 1
|
||||
|
||||
#if JT808_DEBUG_ENABLE
|
||||
#include "app_uart.h"
|
||||
|
|
|
|||
|
|
@ -17,10 +17,19 @@ extern uint32_t Rsp_Bigscenic_Fence_Polygon_area_ID;
|
|||
extern uint32_t Rsp_Bigban_Fence_Polygon_area_ID;
|
||||
|
||||
// 增加围栏区域(队尾增加) // Area_att == 0x0001 景区围栏,Area_att == 0x0002 禁停区围栏
|
||||
void jt808_add_tail_fence_Polygon_area(uint32_t area_id ,uint16_t Area_att, uint16_t Area_Points_Num, AreaPoint_t *big_Area_Points);
|
||||
int jt808_add_tail_fence_Polygon_area(uint32_t area_id ,uint16_t Area_att, uint16_t Area_Points_Num, AreaPoint_t *big_Area_Points);
|
||||
|
||||
// 移除围栏区域(指定区域ID)
|
||||
void jt808_remove_fence_Polygon_area(uint32_t area_id);
|
||||
int jt808_remove_fence_Polygon_area(uint32_t area_id);
|
||||
|
||||
// 判断区域ID列表文件是否存在 // 0 找到
|
||||
int jt808_get_areafile_state(void);
|
||||
|
||||
// 保存围栏区域
|
||||
int jt808_save_Fence_area(void);
|
||||
|
||||
// 加载围栏区域
|
||||
int jt808_load_Fence_area(void);
|
||||
|
||||
// 遍历围栏区域,判断指定坐标是否在围栏内
|
||||
// 返回区域ID // 0 未在围栏内 // Area_att == 0x0001 景区围栏,Area_att == 0x0002 禁停区围栏
|
||||
|
|
|
|||
|
|
@ -17,19 +17,20 @@ typedef enum {
|
|||
ID_ProvinceID = 0x0081, // WORD, 车辆所在的省域 ID
|
||||
ID_CityID = 0x0082, // WORD, 车辆所在的市域 ID
|
||||
ID_CarPlateNum = 0x0083, //STRING, 公安交通管理部门颁发的机动车号牌
|
||||
ID_CarPlateColor = 0x0084, //车牌颜色,按照 JT/T415-2006 的 5.4.12
|
||||
ID_RadarEN = 0xF001, // 雷达使能位, 0 代表关闭, 1 代表开启
|
||||
ID_ManagerACC = 0xF002, // 管理员模式油门0~100%
|
||||
ID_TouristACC = 0xF003, // 游客模式油门0~100%
|
||||
ID_SpeedCutACC = 0xF004, // 自动减速油门0~100%
|
||||
ID_BrakeLimit = 0xF005, //前进刹车距离
|
||||
ID_SpeedCutLimit = 0xF006, // 前进自动减速刹车距离
|
||||
ID_BrakeLimit_B = 0xF007, // 后退刹车距离
|
||||
ID_SpeedCutLimit_B = 0xF008, // 后退自动减速刹车距离
|
||||
ID_CarPlateColor = 0x0084, //BYTE 车牌颜色,按照 JT/T415-2006 的 5.4.12
|
||||
ID_RadarEN = 0xF001, //BYTE 雷达使能位, 0 代表关闭, 1 代表开启
|
||||
ID_ManagerACC = 0xF002, //BYTE 管理员模式油门0~100%
|
||||
ID_TouristACC = 0xF003, //BYTE 游客模式油门0~100%
|
||||
ID_SpeedCutACC = 0xF004, //BYTE 自动减速油门0~100%
|
||||
ID_BrakeLimit = 0xF005, //WORD 前进刹车距离
|
||||
ID_SpeedCutLimit = 0xF006, //WORD 前进自动减速刹车距离
|
||||
ID_BrakeLimit_B = 0xF007, //WORD 后退刹车距离
|
||||
ID_SpeedCutLimit_B = 0xF008, //WORD 后退自动减速刹车距离
|
||||
ID_Ban_Fence_Polygon_Delay_OFF = 0xF009, //BYTE 禁止围栏延时关闭时间, 单位秒
|
||||
}set_TermParamID_t;
|
||||
typedef struct{
|
||||
uint32_t HeartBeatInterval;// DWORD, 终端心跳发送间隔(s)
|
||||
uint8_t MainServerAddr[50];//STRING, 主服务器地址,IP 或域名
|
||||
uint8_t MainServerAddr[20];//STRING, 主服务器地址,IP 或域名
|
||||
uint32_t ServerPort;//DWORD, 服务器 TCP 端口
|
||||
uint32_t DefaultTimeReportInterval;// DWORD, 缺省时间汇报间隔
|
||||
uint32_t InflexionAngle;// DWORD, 拐点补传角度, < 180°
|
||||
|
|
@ -47,6 +48,7 @@ typedef struct{
|
|||
uint16_t SpeedCutLimit; // 前进自动减速刹车距离
|
||||
uint16_t BrakeLimit_B; // 后退刹车距离
|
||||
uint16_t SpeedCutLimit_B; // 后退自动减速刹车距离
|
||||
uint8_t Ban_Fence_Polygon_Delay_OFF; // 禁止围栏延时关闭时间, 单位秒
|
||||
}set_TermParam_t;
|
||||
|
||||
// 支持的附加消息ID
|
||||
|
|
@ -68,6 +70,7 @@ typedef enum{
|
|||
BAT_PercentageID = 0xE2, // 电池电量, % BYTE
|
||||
Scenic_Fence_Polygon_area_ID = 0xE3, // 当前位置所在景区围栏多边形区域ID, DWORD
|
||||
Ban_Fence_Polygon_area_ID = 0xE4, // 当前位置所在禁止围栏多边形区域ID, DWORD
|
||||
Locked_Condition_ID = 0xE7, // 锁车状态, BYTE
|
||||
}addi_infoID_t;
|
||||
|
||||
// big_标记的参数需以大端方式存储,需手动转换为大端
|
||||
|
|
@ -92,6 +95,9 @@ extern Term_Param_item_t jt808_term_param_item;
|
|||
|
||||
extern osThreadFunc_t Autoreport_param_ThreadId;
|
||||
|
||||
extern uint8_t Rsp_locked_condition; // 锁车状态, BYTE
|
||||
|
||||
|
||||
// 控制车辆状态
|
||||
void jt808_Set_CarStatus(uint8_t status);
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
#include "jt808_msg_parse.h"
|
||||
#include "jt808_pkg_transmit.h"
|
||||
#include "cm_sys.h"
|
||||
#include "cm_fs.h"
|
||||
#include "cm_sim.h"
|
||||
|
||||
#include "jt808_electronic_fence.h"
|
||||
|
|
@ -60,16 +61,16 @@ int Polygon_fence_check(fence_point_t point, fence_point_t *polygon, int polygon
|
|||
}
|
||||
|
||||
// 增加围栏区域(队尾增加) // Area_att == 0x0001 景区围栏,Area_att == 0x0002 禁停区围栏
|
||||
void jt808_add_tail_fence_Polygon_area(uint32_t area_id ,uint16_t Area_att, uint16_t Area_Points_Num, AreaPoint_t *big_Area_Points){
|
||||
int jt808_add_tail_fence_Polygon_area(uint32_t area_id ,uint16_t Area_att, uint16_t Area_Points_Num, AreaPoint_t *big_Area_Points){
|
||||
if(area_id == 0 || big_Area_Points == NULL || Area_Points_Num == 0){
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
// TODO: 增加附加信息
|
||||
fence_Polygon_area_t *p_head =jt808_term_param_item.fence_polygon_area;
|
||||
while(p_head != NULL){
|
||||
if(p_head->Area_ID == area_id){
|
||||
// 已存在该消息ID
|
||||
return;
|
||||
return -2;
|
||||
}
|
||||
p_head = p_head->next;
|
||||
}
|
||||
|
|
@ -77,7 +78,7 @@ void jt808_add_tail_fence_Polygon_area(uint32_t area_id ,uint16_t Area_att, uint
|
|||
p_head = (fence_Polygon_area_t *)jt808_malloc(sizeof(fence_Polygon_area_t));
|
||||
if(p_head == NULL){
|
||||
JT808_DEBUG("[%s,%d] malloc failed \r\n", __FUNCTION__,__LINE__);
|
||||
return;
|
||||
return -3;
|
||||
}
|
||||
if(jt808_term_param_item.fence_polygon_area == NULL){
|
||||
jt808_term_param_item.fence_polygon_area = p_head;
|
||||
|
|
@ -95,16 +96,18 @@ void jt808_add_tail_fence_Polygon_area(uint32_t area_id ,uint16_t Area_att, uint
|
|||
p_head->Area_Points = (AreaPoint_t *)jt808_malloc(sizeof(AreaPoint_t)*Area_Points_Num);// 区域内点的坐标集合
|
||||
if(p_head->Area_Points == NULL){
|
||||
JT808_DEBUG("[%s,%d] malloc failed \r\n", __FUNCTION__,__LINE__);
|
||||
return;
|
||||
return -3;
|
||||
}
|
||||
for(int i = 0; i < Area_Points_Num; i++){
|
||||
p_head->Area_Points[i].lat = Swap32(big_Area_Points[i].lat);
|
||||
p_head->Area_Points[i].lng = Swap32(big_Area_Points[i].lng);
|
||||
}
|
||||
jt808_save_Fence_area();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 移除围栏区域(指定区域ID)
|
||||
void jt808_remove_fence_Polygon_area(uint32_t area_id){
|
||||
int jt808_remove_fence_Polygon_area(uint32_t area_id){
|
||||
if(area_id == 0){
|
||||
fence_Polygon_area_t *p_head =jt808_term_param_item.fence_polygon_area;
|
||||
fence_Polygon_area_t *p_next =NULL;
|
||||
|
|
@ -116,7 +119,9 @@ void jt808_remove_fence_Polygon_area(uint32_t area_id){
|
|||
jt808_free(p_head);
|
||||
p_head = p_next;
|
||||
}
|
||||
return;
|
||||
jt808_term_param_item.fence_polygon_area = NULL;
|
||||
jt808_save_Fence_area();
|
||||
return 0;
|
||||
}
|
||||
fence_Polygon_area_t *p_head =jt808_term_param_item.fence_polygon_area;
|
||||
fence_Polygon_area_t *p_prev =NULL;
|
||||
|
|
@ -134,11 +139,14 @@ void jt808_remove_fence_Polygon_area(uint32_t area_id){
|
|||
jt808_free(p_head->Area_Points);
|
||||
}
|
||||
jt808_free(p_head);
|
||||
break;
|
||||
jt808_save_Fence_area();
|
||||
return 0;
|
||||
// break;
|
||||
}
|
||||
p_prev = p_head;
|
||||
p_head = p_head->next;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint32_t Rsp_Bigscenic_Fence_Polygon_area_ID = 0;
|
||||
|
|
@ -172,3 +180,164 @@ uint32_t jt808_Polygon_fence_check(uint16_t Area_att, uint32_t lat, uint32_t lng
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define AREA_ID_LIST_FILE "area_id_list.txt" // 区域ID列表文件
|
||||
|
||||
// 判断区域ID列表文件是否存在 // 0 找到
|
||||
int jt808_get_areafile_state(void){
|
||||
if(1 == cm_fs_exist(AREA_ID_LIST_FILE)){
|
||||
JT808_DEBUG("fence area file exist\r\n");
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 保存围栏区域
|
||||
int jt808_save_Fence_area(void){
|
||||
uint32_t Area_Buff_Size = 0; // 区域缓存大小
|
||||
uint32_t Area_Buff_count = 0; // 区域缓存计数
|
||||
fence_Polygon_area_t *p_head =jt808_term_param_item.fence_polygon_area;
|
||||
fence_Polygon_area_t *p_next =NULL;
|
||||
while(p_head != NULL){ // 计算区域缓存大小
|
||||
p_next = p_head->next;
|
||||
Area_Buff_Size += 8 + 8*p_head->Area_Points_Num;
|
||||
p_head = p_next;
|
||||
}
|
||||
JT808_DEBUG("Area_Buff_Size = %d\r\n", Area_Buff_Size);
|
||||
if(Area_Buff_Size == 0){
|
||||
if(1 == cm_fs_exist(AREA_ID_LIST_FILE)){
|
||||
JT808_DEBUG("Save: delete %s\r\n", AREA_ID_LIST_FILE);
|
||||
if(0 <= cm_fs_delete(AREA_ID_LIST_FILE)){
|
||||
JT808_DEBUG("Save: delete success\r\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
char *p_data = (char *)jt808_malloc(Area_Buff_Size);
|
||||
if(p_data == NULL){
|
||||
JT808_DEBUG("[%s,%d] malloc failed \r\n", __FUNCTION__,__LINE__);
|
||||
return -1;
|
||||
}
|
||||
p_head =jt808_term_param_item.fence_polygon_area;
|
||||
p_next =NULL;
|
||||
|
||||
while(p_head != NULL){
|
||||
p_next = p_head->next;
|
||||
memcpy(p_data + Area_Buff_count, &p_head->Area_ID, 8);
|
||||
memcpy(p_data + Area_Buff_count + 8, p_head->Area_Points, 8 * p_head->Area_Points_Num);
|
||||
|
||||
Area_Buff_count += 8 + 8*p_head->Area_Points_Num;
|
||||
p_head = p_next;
|
||||
}
|
||||
int32_t fd = cm_fs_open(AREA_ID_LIST_FILE, CM_FS_WB);
|
||||
if(fd < 0){
|
||||
JT808_DEBUG("open %s failed\r\n", AREA_ID_LIST_FILE);
|
||||
return -1;
|
||||
}
|
||||
cm_fs_write(fd, p_data, Area_Buff_Size);
|
||||
cm_fs_close(fd);
|
||||
JT808_DEBUG("save fence area file size = %d == %d\r\n", Area_Buff_Size,Area_Buff_count);
|
||||
for(int i = 0; i < Area_Buff_Size; i++){
|
||||
JT808_DEBUG_DATA("%02x ",*(p_data+i));
|
||||
}
|
||||
JT808_DEBUG_DATA("\r\n");
|
||||
jt808_free(p_data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 加载围栏区域
|
||||
int jt808_load_Fence_area(void){
|
||||
if(1 != cm_fs_exist(AREA_ID_LIST_FILE)){
|
||||
JT808_DEBUG("no fence area\r\n");
|
||||
return -1;
|
||||
}
|
||||
int32_t fd = cm_fs_open(AREA_ID_LIST_FILE, CM_FS_RB);
|
||||
if(fd < 0){
|
||||
JT808_DEBUG("open %s failed\r\n", AREA_ID_LIST_FILE);
|
||||
return -1;
|
||||
}
|
||||
int32_t file_size = cm_fs_filesize(AREA_ID_LIST_FILE);
|
||||
if(file_size <= 0){
|
||||
JT808_DEBUG("file size error\r\n");
|
||||
cm_fs_close(fd);
|
||||
return -1;
|
||||
}
|
||||
char *p_data = (char *)jt808_malloc(file_size);
|
||||
if(p_data == NULL){
|
||||
JT808_DEBUG("[%s,%d] malloc failed \r\n", __FUNCTION__,__LINE__);
|
||||
cm_fs_close(fd);
|
||||
return -2;
|
||||
}
|
||||
cm_fs_read(fd, p_data, file_size);
|
||||
cm_fs_close(fd);
|
||||
|
||||
JT808_DEBUG("load fence area file size = %d\r\n", file_size);
|
||||
for(int i = 0; i < file_size; i++){
|
||||
JT808_DEBUG_DATA("%02x ",*(p_data+i));
|
||||
}
|
||||
JT808_DEBUG_DATA("\r\n");
|
||||
|
||||
uint32_t Area_Buff_Size = 0; // 区域缓存大小
|
||||
fence_Polygon_area_t *p_head = (fence_Polygon_area_t *)jt808_malloc(sizeof(fence_Polygon_area_t));
|
||||
if(p_head == NULL){
|
||||
JT808_DEBUG("[%s,%d] malloc failed \r\n", __FUNCTION__,__LINE__);
|
||||
return -2;
|
||||
}
|
||||
fence_Polygon_area_t *p_tail = p_head;
|
||||
while(Area_Buff_Size < file_size){ // 计算区域缓存大小
|
||||
memcpy(p_tail, p_data+Area_Buff_Size, 8);
|
||||
if(p_tail->Area_Points_Num < 3){
|
||||
JT808_DEBUG("Area_Points_Num error\r\n");
|
||||
goto ERR_Loal;
|
||||
}
|
||||
p_tail->Area_Points = (AreaPoint_t *)jt808_malloc(8 * p_tail->Area_Points_Num);// 区域内点的坐标集合
|
||||
if(p_tail->Area_Points == NULL){
|
||||
JT808_DEBUG("[%s,%d] malloc failed \r\n", __FUNCTION__,__LINE__);
|
||||
goto ERR_Loal;
|
||||
}
|
||||
memcpy(p_tail->Area_Points, p_data+Area_Buff_Size+8, 8 * p_tail->Area_Points_Num);
|
||||
|
||||
Area_Buff_Size += 8 + 8 * p_tail->Area_Points_Num;
|
||||
if(Area_Buff_Size < file_size){
|
||||
p_tail->next = (fence_Polygon_area_t *)jt808_malloc(sizeof(fence_Polygon_area_t));
|
||||
if(p_tail->next == NULL){
|
||||
JT808_DEBUG("[%s,%d] malloc failed \r\n", __FUNCTION__,__LINE__);
|
||||
goto ERR_Loal;
|
||||
}
|
||||
p_tail = p_tail->next;
|
||||
}else{
|
||||
p_tail->next = NULL;
|
||||
}
|
||||
}
|
||||
fence_Polygon_area_t *p_remove_head =jt808_term_param_item.fence_polygon_area;
|
||||
fence_Polygon_area_t *p_remove_next =NULL;
|
||||
while(p_remove_head != NULL){
|
||||
p_remove_next = p_remove_head->next;
|
||||
if(p_remove_head->Area_Points != NULL){
|
||||
jt808_free(p_remove_head->Area_Points);
|
||||
}
|
||||
jt808_free(p_remove_head);
|
||||
p_remove_head = p_remove_next;
|
||||
}
|
||||
jt808_term_param_item.fence_polygon_area = p_head; // 加载成功,更新全局变量
|
||||
jt808_free(p_data);
|
||||
|
||||
JT808_DEBUG("load fence area success\r\n");
|
||||
return 0;
|
||||
|
||||
ERR_Loal:
|
||||
p_remove_head =p_head; // 出错,释放已分配的内存
|
||||
p_remove_next =NULL;
|
||||
while(p_remove_head != NULL){
|
||||
p_remove_next = p_remove_head->next;
|
||||
if(p_remove_head->Area_Points != NULL){
|
||||
jt808_free(p_remove_head->Area_Points);
|
||||
}
|
||||
jt808_free(p_remove_head);
|
||||
p_remove_head = p_remove_next;
|
||||
}
|
||||
jt808_free(p_data);
|
||||
|
||||
JT808_DEBUG("load fence area failed\r\n");
|
||||
return -3;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,8 +4,10 @@
|
|||
#include "jt808_msg_parse.h"
|
||||
#include "jt808_pkg_transmit.h"
|
||||
#include "cm_sys.h"
|
||||
#include "cm_fs.h"
|
||||
#include "cm_sim.h"
|
||||
|
||||
#include "local_tts.h"
|
||||
#include "control_out.h"
|
||||
|
||||
Term_Param_item_t jt808_term_param_item; // 终端参数项
|
||||
|
|
@ -73,6 +75,68 @@ int8_t jt808_data_up_SeriaNet(uint8_t type, uint8_t *data, uint16_t len){
|
|||
return ret;
|
||||
}
|
||||
|
||||
|
||||
#define TTERMPARAM_FILE "TermParam.txt" // 区域ID列表文件
|
||||
|
||||
// 获取终端参数文件状态 0:文件存在 -1:文件不存在
|
||||
int jt808_get_TermParam_state(void){
|
||||
if(1 == cm_fs_exist(TTERMPARAM_FILE)){
|
||||
JT808_DEBUG("TermParam file exist\r\n");
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 保存终端参数
|
||||
static int jt808_save_TermParam(void){
|
||||
int32_t fd = cm_fs_open(TTERMPARAM_FILE, CM_FS_WB);
|
||||
if(fd < 0){
|
||||
JT808_DEBUG("open %s failed\r\n", TTERMPARAM_FILE);
|
||||
return -1;
|
||||
}
|
||||
cm_fs_write(fd, (void *)(&jt808_term_param_item.set_term_param), sizeof(set_TermParam_t));
|
||||
cm_fs_close(fd);
|
||||
JT808_DEBUG("save TermParam file size = %d == %d\r\n", sizeof(set_TermParam_t));
|
||||
for(int i = 0; i < sizeof(set_TermParam_t); i++){
|
||||
JT808_DEBUG_DATA("%02x ",*((char *)(&jt808_term_param_item.set_term_param)+i));
|
||||
}
|
||||
JT808_DEBUG_DATA("\r\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 加载终端参数
|
||||
static int jt808_load_TermParam(void){
|
||||
if(1 != cm_fs_exist(TTERMPARAM_FILE)){
|
||||
JT808_DEBUG("no TermParam\r\n");
|
||||
return -1;
|
||||
}
|
||||
int32_t fd = cm_fs_open(TTERMPARAM_FILE, CM_FS_RB);
|
||||
if(fd < 0){
|
||||
JT808_DEBUG("open %s failed\r\n", TTERMPARAM_FILE);
|
||||
return -1;
|
||||
}
|
||||
int32_t file_size = cm_fs_filesize(TTERMPARAM_FILE);
|
||||
if(file_size <= 0){
|
||||
JT808_DEBUG("file size error\r\n");
|
||||
cm_fs_close(fd);
|
||||
return -2;
|
||||
}
|
||||
if(file_size != sizeof(set_TermParam_t)){
|
||||
JT808_DEBUG("file size error\r\n");
|
||||
cm_fs_close(fd);
|
||||
return -3;
|
||||
}else{
|
||||
JT808_DEBUG("load TermParam file size = %d == %d\r\n", file_size, sizeof(set_TermParam_t));
|
||||
cm_fs_read(fd, (void *)(&jt808_term_param_item.set_term_param), sizeof(set_TermParam_t));
|
||||
for(int i = 0; i < sizeof(set_TermParam_t); i++){
|
||||
JT808_DEBUG_DATA("%02x ",*((char *)(&jt808_term_param_item.set_term_param)+i));
|
||||
}
|
||||
JT808_DEBUG_DATA("\r\n");
|
||||
cm_fs_close(fd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 设置终端参数
|
||||
int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_len){
|
||||
switch(param_id){
|
||||
|
|
@ -81,7 +145,7 @@ int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_le
|
|||
break;
|
||||
}
|
||||
case ID_MainServerAddr:{
|
||||
memcpy(jt808_term_param_item.set_term_param.MainServerAddr,param,50<param_len?param_len:50);
|
||||
memcpy(jt808_term_param_item.set_term_param.MainServerAddr,param,20<param_len?param_len:20);
|
||||
break;
|
||||
}
|
||||
case ID_ServerPort:{
|
||||
|
|
@ -148,12 +212,18 @@ int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_le
|
|||
jt808_term_param_item.set_term_param.SpeedCutLimit_B =Swap16(*(uint16_t*)param);
|
||||
break;
|
||||
}
|
||||
case ID_Ban_Fence_Polygon_Delay_OFF:{ // 禁止围栏报警延时关闭时间, 单位秒
|
||||
jt808_term_param_item.set_term_param.Ban_Fence_Polygon_Delay_OFF =((uint8_t*)param)[0];
|
||||
break;
|
||||
}
|
||||
default:{
|
||||
// TODO: 未知参数
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
jt808_save_TermParam(); // 保存终端参数
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -219,6 +289,12 @@ void jt808_LocReport_add_tail_addi_info(uint8_t msg_id){
|
|||
p_head->msg = (void *)(&Rsp_Bigban_Fence_Polygon_area_ID);
|
||||
break;
|
||||
}
|
||||
case Locked_Condition_ID:{
|
||||
// 锁车状态, BYTE
|
||||
p_head->msg_len = 1;
|
||||
p_head->msg = (void *)(&Rsp_locked_condition);
|
||||
break;
|
||||
}
|
||||
default:{
|
||||
// TODO: 未知消息ID
|
||||
jt808_free(p_head);
|
||||
|
|
@ -248,6 +324,12 @@ void jt808_LocReport_remove_addi_info(uint8_t msg_id){
|
|||
|
||||
osThreadFunc_t Autoreport_param_ThreadId;
|
||||
|
||||
uint16_t scenic_Fence_Polygon_count = 0;
|
||||
uint16_t ban_Fence_Polygon_count = 0;
|
||||
uint16_t delay_off_count = 0; // 延时关闭计数
|
||||
|
||||
uint8_t Rsp_locked_condition = 0; // 锁车状态, BYTE
|
||||
|
||||
// 更新自动上报参数
|
||||
void jt808_LocReport_param_update(void){
|
||||
nmeaTIME beiJingTime; // 北京时间
|
||||
|
|
@ -293,13 +375,50 @@ void jt808_LocReport_param_update(void){
|
|||
jt808_term_param_item.big_loc_report.basic_info.alarm_flag.val32 = Swap32(jt808_term_param_item.big_loc_report.basic_info.alarm_flag.val32); // 报警标志(转大端)
|
||||
|
||||
if((gps_data.info.fix == 1)||(gps_data.info.sig == 0)){ // 不可用// 未定位时发送心跳包
|
||||
|
||||
Rsp_Bigscenic_Fence_Polygon_area_ID = 0;
|
||||
Rsp_Bigban_Fence_Polygon_area_ID = 0;
|
||||
}else{
|
||||
// 更新当前所在位置区域ID
|
||||
uint32_t lat = nmea_ndeg2degree(gps_data.info.lat) * 1e6;
|
||||
uint32_t lng = nmea_ndeg2degree(gps_data.info.lon) * 1e6;
|
||||
|
||||
// lat = 44939236;
|
||||
// lng = 121369446;
|
||||
// lat = 34939236;
|
||||
// lng = 121369446;
|
||||
|
||||
if(1 == sys_sta.O_door_lock){ // 电门锁打开,
|
||||
Rsp_locked_condition = 0; // 复位锁车状态
|
||||
}
|
||||
Rsp_Bigscenic_Fence_Polygon_area_ID = Swap32(jt808_Polygon_fence_check(0x0001, lat, lng));
|
||||
Rsp_Bigban_Fence_Polygon_area_ID = Swap32(jt808_Polygon_fence_check(0x0002, lat, lng));
|
||||
|
||||
if(Rsp_Bigscenic_Fence_Polygon_area_ID == 0){ // 在景区围栏
|
||||
scenic_Fence_Polygon_count++;
|
||||
if(scenic_Fence_Polygon_count >= 10){
|
||||
scenic_Fence_Polygon_count = 0;
|
||||
local_tts_text_play("您已离开景区!",0,0);
|
||||
}
|
||||
}else{
|
||||
scenic_Fence_Polygon_count = 0;
|
||||
}
|
||||
if(Rsp_Bigban_Fence_Polygon_area_ID != 0){
|
||||
delay_off_count++;
|
||||
if(delay_off_count >= jt808_term_param_item.set_term_param.Ban_Fence_Polygon_Delay_OFF){ // 30S
|
||||
delay_off_count = 0;
|
||||
sys_sta.O_door_lock = 0; // 锁车
|
||||
Rsp_locked_condition = 1; // 锁车状态
|
||||
local_tts_text_play("已锁车,请联系管理员解除禁止入内限制!",0,0);
|
||||
}
|
||||
ban_Fence_Polygon_count++;
|
||||
if(ban_Fence_Polygon_count >= 10){ // 7S
|
||||
ban_Fence_Polygon_count = 0;
|
||||
local_tts_text_play("您已进入禁区,请尽快离开!",0,0);
|
||||
}
|
||||
}else{
|
||||
delay_off_count = 0;
|
||||
ban_Fence_Polygon_count = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -310,19 +429,22 @@ void Autoreport_param_Task(void *arg){
|
|||
jt808_LocReport_add_tail_addi_info(BAT_PercentageID); // 增加电池电量信息
|
||||
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);
|
||||
|
||||
// uint32_t area_ID=0;
|
||||
// AreaPoint_t point[4] = {
|
||||
// {39939236, 116369446},
|
||||
// {39939236, 126379446},
|
||||
// {49929236, 126379446},
|
||||
// {49929236, 116369446}
|
||||
// };
|
||||
// for(int i=0;i<4;i++){
|
||||
// point[i].lat = Swap32(point[i].lat);
|
||||
// point[i].lng = Swap32(point[i].lng);
|
||||
// }
|
||||
// jt808_add_tail_fence_Polygon_area(0x0003, 0x0001, 4, point); // 增加景区围栏多边形区域ID信息
|
||||
#if 0 // 测试用
|
||||
uint32_t area_ID=0;
|
||||
AreaPoint_t point[4] = {
|
||||
{39939236, 116369446},
|
||||
{39939236, 126379446},
|
||||
{49929236, 126379446},
|
||||
{49929236, 116369446}
|
||||
};
|
||||
for(int i=0;i<4;i++){
|
||||
point[i].lat = Swap32(point[i].lat);
|
||||
point[i].lng = Swap32(point[i].lng);
|
||||
}
|
||||
jt808_add_tail_fence_Polygon_area(0x0003, 0x0001, 4, point); // 增加景区围栏多边形区域ID信息
|
||||
jt808_add_tail_fence_Polygon_area(0x0004, 0x0002, 4, point); // 增加景区围栏多边形区域ID信息
|
||||
|
||||
// area_ID = jt808_Polygon_fence_check(0x0001, 44939236, 121369446);
|
||||
// JT808_DEBUG("area_ID0:%d\n",area_ID);
|
||||
|
|
@ -350,6 +472,7 @@ void Autoreport_param_Task(void *arg){
|
|||
// jt808_remove_fence_Polygon_area(0x0004);
|
||||
// area_ID = jt808_Polygon_fence_check(0x0001, 74939236, 151369446);
|
||||
// JT808_DEBUG("area_ID5:%d remove\n",area_ID);
|
||||
#endif
|
||||
|
||||
while(1){
|
||||
jt808_LocReport_param_update(); // 更新位置信息参数
|
||||
|
|
@ -391,8 +514,13 @@ void jt808_Autoreport_param_stop(void){
|
|||
|
||||
// 初始化终端参数
|
||||
void jt808_set_term_param_init(void){
|
||||
int ret = 0;
|
||||
memset(&jt808_term_param_item,0,sizeof(Term_Param_item_t));
|
||||
|
||||
// 加载围栏区域信息
|
||||
if(0 == jt808_get_areafile_state()){
|
||||
ret = jt808_load_Fence_area();
|
||||
JT808_DEBUG("load fence area ret:%d\n", ret);
|
||||
}
|
||||
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
|
||||
|
|
@ -421,11 +549,18 @@ void jt808_set_term_param_init(void){
|
|||
// jt808_term_param_item.big_auth_info.str_auth_code = NULL;
|
||||
}while(0);
|
||||
do{// 终端参数初始化
|
||||
if(0 == jt808_get_TermParam_state()){
|
||||
ret = jt808_load_TermParam(); // 加载终端参数
|
||||
JT808_DEBUG("load term param ret:%d\n", ret);
|
||||
}else{
|
||||
jt808_term_param_item.set_term_param.HeartBeatInterval = 30; // 心跳包间隔(秒)
|
||||
// char ServerAddr[] ="47.99.118.34"; // 测试服务器地址
|
||||
// uint32_t ServerPort = 5000; // 服务器端口
|
||||
#if 1
|
||||
char ServerAddr[] ="47.99.118.34"; // 测试服务器地址
|
||||
uint32_t ServerPort = 5000; // 服务器端口
|
||||
#else
|
||||
char ServerAddr[] ="106.14.30.23"; // 生产服务器地址
|
||||
uint32_t ServerPort = 5000; // 服务器端口
|
||||
#endif
|
||||
// memset(jt808_term_param_item.set_term_param.MainServerAddr, 0, 50);
|
||||
memcpy(jt808_term_param_item.set_term_param.MainServerAddr, ServerAddr, strlen(ServerAddr)+1); // 主服务器地址
|
||||
jt808_term_param_item.set_term_param.ServerPort = ServerPort; // 服务器端口
|
||||
|
|
@ -445,6 +580,9 @@ void jt808_set_term_param_init(void){
|
|||
jt808_term_param_item.set_term_param.SpeedCutLimit =2000; // 前进自动减速刹车距离
|
||||
jt808_term_param_item.set_term_param.BrakeLimit_B =1200; // 后退刹车距离
|
||||
jt808_term_param_item.set_term_param.SpeedCutLimit_B =2000; // 后退自动减速刹车距离
|
||||
jt808_term_param_item.set_term_param.Ban_Fence_Polygon_Delay_OFF =30; // 禁止围栏延时锁车时间
|
||||
jt808_save_TermParam(); // 保存终端参数
|
||||
}
|
||||
}while(0);
|
||||
do{// 位置信息上报初始化
|
||||
memset(&jt808_term_param_item.big_loc_report.basic_info,0,sizeof(Loc_basic_info_t));
|
||||
|
|
@ -470,7 +608,7 @@ void jt808_set_term_param_init(void){
|
|||
JT808_DEBUG("get_iccid_ok:%d\n",get_iccid_ok);
|
||||
if(get_iccid_ok == 12){ // IC CID 获取成功
|
||||
JT808_DEBUG("iccid:%d,:%s\n",strlen(cm_iccid), cm_iccid);
|
||||
rawStrToBcd(jt808_term_param_item.phone_BCDnum, cm_iccid+8, 12); // 终端手机号码
|
||||
rawStrToBcd(jt808_term_param_item.phone_BCDnum, (uint8_t *)(cm_iccid+8), 12); // 终端手机号码
|
||||
break;
|
||||
}else{
|
||||
error_count++;
|
||||
|
|
|
|||
|
|
@ -222,7 +222,7 @@ TCP_DISABLE:
|
|||
led_set_event(EVENT_NETWORK_DISCONNECT); // 网络断开连接
|
||||
DEBUG("NetwarK disconnected!\r\n");
|
||||
// local_tts_set(5, 15, CM_LOCAL_TTS_DIGIT_AUTO);
|
||||
local_tts_text_play("网络已断开",0,0);
|
||||
local_tts_text_play("网络信号弱",0,0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue