更新参数配置和更新功能
更新isInFence() 更新TT发送逻辑(待完善)
This commit is contained in:
parent
7d06ab7e7b
commit
114c8ee82c
@ -20,8 +20,8 @@
|
|||||||
#include <usrcfg.h>
|
#include <usrcfg.h>
|
||||||
#include <ttTR.h>
|
#include <ttTR.h>
|
||||||
|
|
||||||
static struct rt_event sw_check; //软件条件
|
//static struct rt_event sw_check; //软件条件
|
||||||
static struct rt_event hw_check; //硬件条件
|
static struct rt_event chkSta; //发送条件,含两部分,1-超时或文件准备好,2-TT满足通信条件
|
||||||
|
|
||||||
|
|
||||||
#define ALL_READY 1
|
#define ALL_READY 1
|
||||||
@ -36,10 +36,10 @@ rt_sem_t cfgUpdate = RT_NULL;
|
|||||||
rt_sem_t shuntDownTT = RT_NULL;
|
rt_sem_t shuntDownTT = RT_NULL;
|
||||||
|
|
||||||
|
|
||||||
void TTisReady(void)
|
//void TTisReady(void)
|
||||||
{
|
//{
|
||||||
rt_sem_release(TTReady);
|
// rt_sem_release(TTReady);
|
||||||
}
|
//}
|
||||||
|
|
||||||
SYS_CFG scfg={
|
SYS_CFG scfg={
|
||||||
.sendInterval =60,
|
.sendInterval =60,
|
||||||
@ -79,7 +79,7 @@ static void updatecfg(void)
|
|||||||
|
|
||||||
void sysSemInit()
|
void sysSemInit()
|
||||||
{
|
{
|
||||||
TTReady = rt_sem_create("TTisReady", 0, RT_IPC_FLAG_PRIO);
|
// TTReady = rt_sem_create("TTisReady", 0, RT_IPC_FLAG_PRIO);
|
||||||
cfgUpdate = rt_sem_create("cfgUpdate", 0, RT_IPC_FLAG_PRIO);
|
cfgUpdate = rt_sem_create("cfgUpdate", 0, RT_IPC_FLAG_PRIO);
|
||||||
shuntDownTT = rt_sem_create("shuntDNTT", 0, RT_IPC_FLAG_PRIO);
|
shuntDownTT = rt_sem_create("shuntDNTT", 0, RT_IPC_FLAG_PRIO);
|
||||||
rt_sem_release(cfgUpdate); //上电更新值
|
rt_sem_release(cfgUpdate); //上电更新值
|
||||||
@ -95,34 +95,38 @@ void sysSemInit()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void initEvent(void)
|
static void sysEventInit(void)
|
||||||
{
|
{
|
||||||
/* 事 件 控 制 块 */
|
rt_err_t result = rt_event_init(&chkSta, "chkSta", RT_IPC_FLAG_PRIO);
|
||||||
|
|
||||||
rt_err_t result = rt_event_init(&sw_check, "SHcheck", RT_IPC_FLAG_PRIO);
|
|
||||||
result = rt_event_init(&hw_check, "HWcheck", RT_IPC_FLAG_PRIO) | result;
|
|
||||||
|
|
||||||
if (result != RT_EOK)
|
if (result != RT_EOK)
|
||||||
{
|
{
|
||||||
LOG_E("init event failed.\n");
|
LOG_E("init event failed.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
INIT_COMPONENT_EXPORT(initEvent);
|
|
||||||
|
|
||||||
void upSWflag(void)
|
void sysInit(void)
|
||||||
{
|
{
|
||||||
rt_event_send(&sw_check, FILE_IS_OK);
|
sysSemInit();
|
||||||
|
sysEventInit();
|
||||||
}
|
}
|
||||||
void upTTflag(void)
|
//INIT_COMPONENT_EXPORT(sysInit);
|
||||||
|
|
||||||
|
void timerIsReady(void)
|
||||||
{
|
{
|
||||||
rt_event_send(&sw_check, TT_IS_OK);
|
rt_event_send(&sysInit, TIMER_IS_OUT);
|
||||||
}
|
}
|
||||||
void d_upSWflag()
|
void fileIsReady(void)
|
||||||
{
|
{
|
||||||
// extern struct rt_event sw_check;//软件条件
|
rt_event_send(&sysInit, FILE_IS_OK);
|
||||||
// rt_event_send(&sw_check, FILE_IS_OK);
|
}
|
||||||
// void upSWflag(void);
|
void TTIsReady(void)
|
||||||
upSWflag();
|
{
|
||||||
|
rt_event_send(&sysInit, TT_IS_OK);
|
||||||
|
}
|
||||||
|
void d_upSta()
|
||||||
|
{
|
||||||
|
TTIsReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -136,46 +140,52 @@ void checkTT()
|
|||||||
repGetTT(); //持续更新
|
repGetTT(); //持续更新
|
||||||
}
|
}
|
||||||
|
|
||||||
static void upSendFile_thread_entry(void)
|
typedef struct
|
||||||
{
|
{
|
||||||
//等待事件
|
char fname[60];
|
||||||
extern struct rt_event hw_check; //硬件条件
|
uint8_t index;
|
||||||
|
}FILE_INFO;
|
||||||
|
|
||||||
|
static void upSendFile_thread_entry(void *parameter)
|
||||||
|
{
|
||||||
|
FILE_INFO *f = RT_NULL;
|
||||||
|
f = (FILE_INFO *) parameter;
|
||||||
|
|
||||||
static rt_uint8_t d[10][200] = { };
|
static rt_uint8_t d[10][200] = { };
|
||||||
static rt_uint8_t s[10] = { };
|
static rt_uint8_t s[10] = { };
|
||||||
|
LOG_D("%s---%d",f->fname,f->index);
|
||||||
|
rt_uint8_t len = pack_File(f->fname, 0, d, s);
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
if (rt_event_recv(&hw_check, ALL_READY, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
|
|
||||||
RT_WAITING_FOREVER, RT_NULL) == RT_EOK)
|
|
||||||
{
|
|
||||||
|
|
||||||
//get file to be send
|
|
||||||
char *f = "2023_06_16_10_28_00_123.bin";
|
|
||||||
// char *f="1023_05_19_15_29_59_254.txt";
|
|
||||||
// pack file
|
|
||||||
rt_uint8_t len = 0;
|
|
||||||
len = pack_File(f, 0, d, s);
|
|
||||||
rt_kprintf("len is %d\n", len);
|
|
||||||
if (len)
|
if (len)
|
||||||
{
|
{
|
||||||
|
LOG_D("%d pack(s) to send", f->index ? 1 : len);
|
||||||
for (size_t var = 0; var < len; var++)
|
for (size_t var = 0; var < len; var++)
|
||||||
{
|
{
|
||||||
|
if (!f->index || (var+1) == f->index)
|
||||||
|
{ //index=0 全发,或者仅发index
|
||||||
sendMsg(d[var], s[var]);
|
sendMsg(d[var], s[var]);
|
||||||
|
LOG_D("send pack[%d] done.",var+1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tcpClose();
|
|
||||||
LOG_I("Done.");
|
LOG_I("Done.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//MSH_CMD_EXPORT(getFileData_thread_entry,tet);
|
/**
|
||||||
static void upSendFile(void)
|
* 发送文件
|
||||||
|
* @param f 待发文件,指完整路径名
|
||||||
|
* @param index 指定发送的切片索引,为0时表示全部发送
|
||||||
|
*/
|
||||||
|
void upSendFile(const char *f, int index)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
static FILE_INFO info;
|
||||||
|
memset(&info, 0, sizeof(FILE_INFO));
|
||||||
|
strcpy(info.fname, f);
|
||||||
|
info.index = index;
|
||||||
|
|
||||||
/* 创建 serial 线程 */
|
/* 创建 serial 线程 */
|
||||||
rt_thread_t thread = rt_thread_create("upSendFile", upSendFile_thread_entry, RT_NULL, 1024 * 12, 27, 10);
|
rt_thread_t thread = rt_thread_create("upSendFile", upSendFile_thread_entry, (void *) &info, 1024 * 12, 27, 10);
|
||||||
/* 创建成功则启动线程 */
|
/* 创建成功则启动线程 */
|
||||||
if (thread != RT_NULL)
|
if (thread != RT_NULL)
|
||||||
{
|
{
|
||||||
@ -187,53 +197,67 @@ static void upSendFile(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void d_upSendFile(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int index=0;
|
||||||
|
if (argc == 3) {
|
||||||
|
index = atoi(argv[2]);
|
||||||
|
}
|
||||||
|
upSendFile(argv[1], index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取本地待发文件列表并倒序发送
|
||||||
|
*/
|
||||||
|
void getAndSendFile()
|
||||||
|
{
|
||||||
|
int index[MAX_KEY_LEN];
|
||||||
|
char f[30][MAX_KEY_LEN];
|
||||||
|
size_t cnt = getFilesToSend(f, index);
|
||||||
|
|
||||||
|
LOG_I("%d files to be send");
|
||||||
|
|
||||||
|
for (size_t i = cnt-1; i > 0; i--)
|
||||||
|
{
|
||||||
|
upSendFile(f[i],index[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void chkAndSendFile_thread_entry()
|
static void chkAndSendFile_thread_entry()
|
||||||
{
|
{
|
||||||
static rt_err_t rst = RT_ERROR;
|
|
||||||
updatecfg();
|
|
||||||
static rt_uint8_t d[10][200] = { };
|
|
||||||
static rt_uint8_t s[10] = { };
|
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
// int e;
|
// int e;
|
||||||
LOG_I("等待软件就绪");
|
LOG_I("等待文件就绪(或定时%d分钟超时)",scfg.sendInterval);
|
||||||
rst = rt_event_recv(&sw_check, FILE_IS_OK | TIMER_IS_OUT, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
|
int rst = rt_event_recv(&chkSta, FILE_IS_OK | TIMER_IS_OUT, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
|
||||||
RT_WAITING_FOREVER, RT_NULL);
|
RT_WAITING_FOREVER, RT_NULL);
|
||||||
if (rst == RT_EOK) //软件条件满足
|
if (rst == RT_EOK) //条件1满足
|
||||||
{
|
{
|
||||||
//检查硬件条件
|
LOG_I("等待TT就绪");
|
||||||
LOG_I("软件就绪,开始等待TT");
|
|
||||||
// continue;
|
|
||||||
checkTT();
|
|
||||||
//打包数据
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t var = 0; var < maxTTRetryCnt; var++) //轮询尝试
|
for (size_t var = 0; var < scfg.maxTTRetryCnt; var++) //轮询尝试
|
||||||
{
|
{
|
||||||
LOG_I("第%d次尝试。", var + 1);
|
LOG_I("第%d/%d次尝试。", var + 1,scfg.maxTTRetryCnt);
|
||||||
// rst = rt_event_recv(&sw_check, TT_IS_OK, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, maxTTWaitTime*60*1000,
|
rst = rt_event_recv(&chkSta, TT_IS_OK, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, rt_tick_from_millisecond(scfg.maxTTWaitTime*60*1000),
|
||||||
// RT_NULL);
|
RT_NULL);
|
||||||
rst = rt_sem_take(TTReady, rt_tick_from_millisecond(maxTTWaitTime * 60 * 1000));
|
// rst = rt_sem_take(TTReady, rt_tick_from_millisecond(maxTTWaitTime * 60 * 1000));
|
||||||
if (rst == RT_EOK) //硬件条件满足
|
if (rst == RT_EOK) //条件2满足
|
||||||
{
|
{
|
||||||
LOG_I("TT准备就绪");
|
LOG_I("TT准备就绪");
|
||||||
rt_event_send(&hw_check, ALL_READY);
|
getAndSendFile();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (rst == -RT_ETIMEOUT)
|
else if (rst == -RT_ETIMEOUT)//超时则重试
|
||||||
; //超时则重试
|
|
||||||
{
|
{
|
||||||
LOG_W("第%d次尝试中TT准备失败。", var + 1);
|
LOG_W("第%d次尝试中TT准备失败。", var + 1);
|
||||||
// pwTT_thread_entry("0");
|
// pwTT_thread_entry("0");
|
||||||
rt_thread_mdelay(1000);
|
rt_thread_mdelay(1000);
|
||||||
checkTT();
|
// checkTT();
|
||||||
// continue;
|
// continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//continue;
|
//continue;
|
||||||
//发送数据
|
//发送数据
|
||||||
//可能有多个待发文件,每个文件打包后为一个二维数组
|
//可能有多个待发文件,每个文件打包后为一个二维数组
|
||||||
@ -241,13 +265,15 @@ static void chkAndSendFile_thread_entry()
|
|||||||
//故改为“打包-发送”轮询操作
|
//故改为“打包-发送”轮询操作
|
||||||
// upSendFile();
|
// upSendFile();
|
||||||
|
|
||||||
LOG_I("----------------------------");
|
// LOG_I("----------------------------");
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查状态并发送文件
|
||||||
|
*/
|
||||||
void chkAndSendFile()
|
void chkAndSendFile()
|
||||||
{
|
{
|
||||||
/* 创建 serial 线程 */
|
/* 创建 serial 线程 */
|
||||||
@ -306,7 +332,7 @@ void d_getRemain()
|
|||||||
arg2=rt_timer_control(tmrToPNTT, RT_TIMER_CTRL_GET_REMAIN_TIME, (void*)arg2);
|
arg2=rt_timer_control(tmrToPNTT, RT_TIMER_CTRL_GET_REMAIN_TIME, (void*)arg2);
|
||||||
LOG_D("tm=%d-%d",&arg1,&arg2);
|
LOG_D("tm=%d-%d",&arg1,&arg2);
|
||||||
}
|
}
|
||||||
static int toPN=0;
|
|
||||||
/* 定时器超时函数 */
|
/* 定时器超时函数 */
|
||||||
static void timeoutFunc(void *parameter)
|
static void timeoutFunc(void *parameter)
|
||||||
{
|
{
|
||||||
@ -446,10 +472,11 @@ void deInitTT()
|
|||||||
|
|
||||||
#define FUNC_DEMO
|
#define FUNC_DEMO
|
||||||
#ifdef FUNC_DEMO //测试时导出命令到控制台
|
#ifdef FUNC_DEMO //测试时导出命令到控制台
|
||||||
MSH_CMD_EXPORT(d_upSWflag,FILE_IS_OK);
|
MSH_CMD_EXPORT(d_upSta,FILE_IS_OK);
|
||||||
MSH_CMD_EXPORT(chkAndSendFile, chkAndSendFile);
|
MSH_CMD_EXPORT(chkAndSendFile, chkAndSendFile);
|
||||||
MSH_CMD_EXPORT(upSendFile, upSendFile);
|
MSH_CMD_EXPORT(upSendFile, upSendFile);
|
||||||
MSH_CMD_EXPORT(initTT,初始化TT);
|
MSH_CMD_EXPORT(initTT,初始化TT);
|
||||||
MSH_CMD_EXPORT(deInitTT,初始化TT);
|
MSH_CMD_EXPORT(deInitTT,初始化TT);
|
||||||
MSH_CMD_EXPORT(d_getRemain,d_getRemain);
|
MSH_CMD_EXPORT(d_getRemain,d_getRemain);
|
||||||
|
MSH_CMD_EXPORT(d_upSendFile,d_upSendFile);
|
||||||
#endif
|
#endif
|
||||||
|
@ -39,7 +39,7 @@ extern rt_sem_t cfgUpdate;
|
|||||||
static struct rt_messagequeue upfilelist;
|
static struct rt_messagequeue upfilelist;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
char msg[60];
|
char fname[60];
|
||||||
uint8_t index;
|
uint8_t index;
|
||||||
}FILE_INFO;
|
}FILE_INFO;
|
||||||
static uint8_t msg_pool[512] ;
|
static uint8_t msg_pool[512] ;
|
||||||
@ -282,7 +282,7 @@ int setFileToSend(const char *f, int v)
|
|||||||
int rst = ini_putl(SECTION_TO_SEND, f, v, FILE_TO_SEND);
|
int rst = ini_putl(SECTION_TO_SEND, f, v, FILE_TO_SEND);
|
||||||
if (!rst) {
|
if (!rst) {
|
||||||
LOG_E("add file to send error.");
|
LOG_E("add file to send error.");
|
||||||
clearLock();
|
nclearLock();
|
||||||
return RT_ERROR;
|
return RT_ERROR;
|
||||||
}
|
}
|
||||||
nclearLock();
|
nclearLock();
|
||||||
@ -290,9 +290,9 @@ int setFileToSend(const char *f, int v)
|
|||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 获取待发送文件列表
|
* 获取待发送文件列表
|
||||||
* @param kstr 文件名
|
* @param kstr 待发包文件名,二维数组
|
||||||
* @param v 对应包,默认为0即全发
|
* @param v 对应包文件的索引,默认为0即全发
|
||||||
* @return 文件个数
|
* @return 待发文件个数
|
||||||
*/
|
*/
|
||||||
int getFilesToSend(char (*kstr)[MAX_KEY_LEN], int *v)
|
int getFilesToSend(char (*kstr)[MAX_KEY_LEN], int *v)
|
||||||
{
|
{
|
||||||
@ -325,9 +325,9 @@ int clearFileToSend(const char *k)
|
|||||||
static void gf()
|
static void gf()
|
||||||
{
|
{
|
||||||
int v[MAX_KEY_LEN];
|
int v[MAX_KEY_LEN];
|
||||||
char kstr[10][MAX_KEY_LEN];
|
char kstr[30][MAX_KEY_LEN];
|
||||||
size_t cnt = getFilesToSend(kstr, v);
|
size_t cnt = getFilesToSend(kstr, v);
|
||||||
for (size_t var = 0; var < cnt; ++var)
|
for (size_t var = 0; var < cnt; var++)
|
||||||
{
|
{
|
||||||
LOG_I("%s -- %d", kstr[var], v[var]);
|
LOG_I("%s -- %d", kstr[var], v[var]);
|
||||||
}
|
}
|
||||||
@ -348,8 +348,8 @@ void addToList_thread_entry(void *parameter)
|
|||||||
{
|
{
|
||||||
rt_memset(&msg, 0, sizeof(msg));
|
rt_memset(&msg, 0, sizeof(msg));
|
||||||
if (rt_mq_recv(&upfilelist, &msg, sizeof(msg), RT_WAITING_FOREVER) == RT_EOK) {
|
if (rt_mq_recv(&upfilelist, &msg, sizeof(msg), RT_WAITING_FOREVER) == RT_EOK) {
|
||||||
LOG_D("get %s",msg.msg);
|
LOG_D("get %s",msg.fname);
|
||||||
setFileToSend(msg.msg,msg.index);
|
setFileToSend(msg.fname,msg.index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -358,7 +358,7 @@ void postFileInfo(const char *fin, uint8_t index)
|
|||||||
{
|
{
|
||||||
// setFileToSend(fin,0);
|
// setFileToSend(fin,0);
|
||||||
FILE_INFO msg;
|
FILE_INFO msg;
|
||||||
strcpy(msg.msg,fin);
|
strcpy(msg.fname,fin);
|
||||||
msg.index=index;
|
msg.index=index;
|
||||||
rt_mq_send(&upfilelist, &msg, sizeof(msg));
|
rt_mq_send(&upfilelist, &msg, sizeof(msg));
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,11 @@
|
|||||||
#define SECTION_TO_SEND "tosend"
|
#define SECTION_TO_SEND "tosend"
|
||||||
#define SECTION_LST_FILE "lstfile"
|
#define SECTION_LST_FILE "lstfile"
|
||||||
|
|
||||||
|
//typedef struct
|
||||||
|
//{
|
||||||
|
// char fname[60];
|
||||||
|
// uint8_t index;
|
||||||
|
//}FILE_INFO;
|
||||||
|
|
||||||
int get_cfg(const char *k);
|
int get_cfg(const char *k);
|
||||||
int set_cfg(const char *k, const char*v);
|
int set_cfg(const char *k, const char*v);
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
[config]
|
[config]
|
||||||
# V1.8
|
# V1.81
|
||||||
#发送间隔(M),以零点为基准时刻
|
#发送间隔(M),以零点为基准时刻
|
||||||
sendInterval=60
|
sendInterval=60
|
||||||
# 最大文件大小,超过此大小则进入发送流程
|
# 最大文件大小,超过此大小则进入发送流程
|
||||||
maxSizePerFile=4096
|
maxSizePerFile=1024
|
||||||
# 最小等待时间(S),超时后进入待机模式
|
# 最小等待时间(S),超时后进入待机模式
|
||||||
minSecToSleep=30
|
minSecToSleep=30
|
||||||
# TT最长等待激活时间(M),超时后重启
|
# TT最长等待激活时间(M),超时后重启
|
||||||
@ -15,13 +15,20 @@ minTTsinal=5
|
|||||||
# TT状态检测周期数
|
# TT状态检测周期数
|
||||||
minTTPeriCnt=2
|
minTTPeriCnt=2
|
||||||
compressType=1
|
compressType=1
|
||||||
|
# 加密方式,0-不加密
|
||||||
encrytType=1
|
encrytType=1
|
||||||
# 开窗时间(UTC+8),持续时间(H)。支持多组,组与组之间采用【;】为分隔符
|
# 开窗时间(UTC+8),持续时间(H)。以【,】为分隔符
|
||||||
openWindowTime=1,2,7,8
|
openWindowTime=1,2,7,8
|
||||||
#超时定时器时间(M),超时后关闭TT
|
#超时时间(M),主动开机上报数据情况下最后一次通信后开始计时,超时后关闭TT
|
||||||
timeout=5
|
timeout=5
|
||||||
|
# 工作模式,1-TT,2-BD
|
||||||
commMode=1
|
commMode=1
|
||||||
|
# 自毁功能开关,1-开启,0-跟关闭
|
||||||
selfDesSW=0
|
selfDesSW=0
|
||||||
|
# 位置告警功能开关,1-开启,0-关闭
|
||||||
|
locAlert=1;
|
||||||
|
# 定时上报位置信息间隔(M)
|
||||||
|
locReportInterval=5
|
||||||
[stats]
|
[stats]
|
||||||
# 继电器开关次数,影响继电器寿命(<10W次)
|
# 继电器开关次数,影响继电器寿命(<10W次)
|
||||||
swCnt=12
|
swCnt=12
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
#define LOG_LVL LOG_LVL_DBG
|
#define LOG_LVL LOG_LVL_DBG
|
||||||
#include <ulog.h>
|
#include <ulog.h>
|
||||||
|
|
||||||
|
extern SYS_CFG scfg;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将收发数据以ASCII字符形式存入log
|
* 将收发数据以ASCII字符形式存入log
|
||||||
* @param din 待存储数据
|
* @param din 待存储数据
|
||||||
@ -206,31 +208,7 @@ void upSend_thread_entry(void* parameter)
|
|||||||
RT_WEAK int upSend(uint8_t *din, size_t len)
|
RT_WEAK int upSend(uint8_t *din, size_t len)
|
||||||
{
|
{
|
||||||
LOG_D("try to upsend to TT.");
|
LOG_D("try to upsend to TT.");
|
||||||
//
|
|
||||||
// uint8_t sta = 1;
|
|
||||||
// while (1 && !isTTjh()) //判断TT状态
|
|
||||||
// {
|
|
||||||
// static uint8_t trycnt = 0;
|
|
||||||
// rt_thread_mdelay(4000);
|
|
||||||
// trycnt += 1;
|
|
||||||
// if (trycnt > 3)
|
|
||||||
// {
|
|
||||||
// sta = 0; //try 3 time
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (!sta) {
|
|
||||||
// //cache to file
|
|
||||||
// LOG_W("TT is not ready, try to cache %d bytes data to file.",len);
|
|
||||||
// cacheDataToFile(din, len);
|
|
||||||
//// trDataTolog(din, len, 1);
|
|
||||||
// return -RT_ERROR;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// //此函数有打包操作,需线程操作
|
|
||||||
//// LOG_D("upsend.");
|
|
||||||
// return 0;
|
|
||||||
//
|
|
||||||
static SMSG msg;
|
static SMSG msg;
|
||||||
memset(&msg, 0, sizeof(SMSG));
|
memset(&msg, 0, sizeof(SMSG));
|
||||||
memcpy(msg.data,din,len);
|
memcpy(msg.data,din,len);
|
||||||
@ -423,7 +401,7 @@ static int getAndCheckLoc(uint8_t *dout, size_t pairCnt)
|
|||||||
memcpy(dout,loc,cnt);
|
memcpy(dout,loc,cnt);
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
int cryptLocMsg(uint8_t *din, size_t len, uint8_t *dout);
|
static int cryptLocMsg(uint8_t *din, size_t len, uint8_t *dout);
|
||||||
/**
|
/**
|
||||||
* c回应深度数据,含位置信息
|
* c回应深度数据,含位置信息
|
||||||
* @param din
|
* @param din
|
||||||
@ -448,15 +426,58 @@ int reportDepth(uint8_t *din,size_t len)
|
|||||||
upSend(dout, nlen);
|
upSend(dout, nlen);
|
||||||
}
|
}
|
||||||
//天通指令类型:0x70 0x01
|
//天通指令类型:0x70 0x01
|
||||||
|
/**
|
||||||
|
* 更新系统各项工作参数
|
||||||
|
* @param cfg 参数数组
|
||||||
|
* @param len 数组长度
|
||||||
|
*/
|
||||||
|
void updateSysCfg(uint8_t *cfg, size_t len)
|
||||||
|
{
|
||||||
|
LOG_I("FUNC = update SYSCFG");
|
||||||
|
// SYS_CFG ts;
|
||||||
|
memcpy(&scfg,cfg,len);
|
||||||
|
// LOG_D("--%d",ts.maxSizePerFile);
|
||||||
|
// scfg = (SYS_CFG)tmp;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 上报系统各项工作参数
|
||||||
|
*/
|
||||||
|
void reportSysCfg()
|
||||||
|
{
|
||||||
|
LOG_I("FUNC = report SYSCFG");
|
||||||
|
// scfg.commMode=0xab;
|
||||||
|
// scfg.timeout=0x37;
|
||||||
|
// scfg.maxSizePerFile=2046;
|
||||||
|
|
||||||
|
uint8_t size = sizeof(scfg);
|
||||||
|
uint8_t rst[200] = { 0x5A, 0xA5, ADDR_ANJI, ADDR_TT, _CFG_UPDATE_CFG >> 8, _CFG_UPDATE_CFG & 0xff };
|
||||||
|
int p = 6;
|
||||||
|
rst[p++] = 0;
|
||||||
|
rst[p++] = size;
|
||||||
|
|
||||||
|
memcpy(rst + p,&scfg, size);
|
||||||
|
p+=size;
|
||||||
|
rst[p] = bccCRC(rst + 2, p-2);
|
||||||
|
rst[++p] = 0xED;
|
||||||
|
|
||||||
|
size = p+1;
|
||||||
|
upSend(rst, size);
|
||||||
|
|
||||||
|
// LOG_HEX("scfg",16,&scfg,size);
|
||||||
|
LOG_HEX("cfg",16,rst,p+1);
|
||||||
|
// updateSysCfg(rst, p+1);;
|
||||||
|
}
|
||||||
|
|
||||||
//3.2.8定时自报位置信息
|
//3.2.8定时自报位置信息
|
||||||
//每小时传数据时同步传位置信息
|
//每小时传数据时同步传位置信息
|
||||||
//与告警信息共用编码方式
|
//与告警信息共用编码方式
|
||||||
//首字节00为定时发送,未检测围栏;其它为在围栏外
|
//首字节为是否越界,默认为00,此处为预留。
|
||||||
//单次最多可上报15条位置信息
|
//单次最多可上报15条位置信息
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按15条经纬度打包位置信息
|
* 按15条经纬度打包位置信息。由[是否越界]+[时戳]+[15组数据]组成。
|
||||||
|
* 是否越界为预留,不在此判断。
|
||||||
|
* 15组数据采集顺序为MOB(most oldest bit),越新的数据离时戳越近
|
||||||
* @param dout 存储位置信息的数组
|
* @param dout 存储位置信息的数组
|
||||||
* @return 数组大小
|
* @return 数组大小
|
||||||
*/
|
*/
|
||||||
@ -468,7 +489,7 @@ static int packLocMsg(uint8_t *dout)
|
|||||||
|
|
||||||
alertMsg[8] = 0; //首字节00为定时发送,未检测围栏;其它为在围栏外
|
alertMsg[8] = 0; //首字节00为定时发送,未检测围栏;其它为在围栏外
|
||||||
int len = time2Byte(alertMsg+9);//添加时间戳
|
int len = time2Byte(alertMsg+9);//添加时间戳
|
||||||
len += (getAndCheckLoc(alertMsg + 9 + len, 15)+1); //p指向第2个数据
|
len += getAndCheckLoc(alertMsg + 9 + len, 15) + 1; //p指向第2个数据
|
||||||
|
|
||||||
alertMsg[7] = len; //update len of raw data
|
alertMsg[7] = len; //update len of raw data
|
||||||
alertMsg[8 + len] = bccCRC(alertMsg + 2, 8 + len - 2); //update CRC
|
alertMsg[8 + len] = bccCRC(alertMsg + 2, 8 + len - 2); //update CRC
|
||||||
@ -492,7 +513,7 @@ static void d_packLocMsg(void)
|
|||||||
* @param dout 存储加密结果的数组
|
* @param dout 存储加密结果的数组
|
||||||
* @return 加密后的长度
|
* @return 加密后的长度
|
||||||
*/
|
*/
|
||||||
int cryptLocMsg(uint8_t *din, size_t len, uint8_t *dout)
|
static int cryptLocMsg(uint8_t *din, size_t len, uint8_t *dout)
|
||||||
{ //加密。因加密后数据长度会变化,故不能只加密位置数据。
|
{ //加密。因加密后数据长度会变化,故不能只加密位置数据。
|
||||||
uint8_t cd[200]={0xAB,0xAB};
|
uint8_t cd[200]={0xAB,0xAB};
|
||||||
size_t nlen = 0;
|
size_t nlen = 0;
|
||||||
@ -508,14 +529,109 @@ int cryptLocMsg(uint8_t *din, size_t len, uint8_t *dout)
|
|||||||
return nlen;
|
return nlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
int packAndSendLoc()
|
//static uint8_t locMsg[200];
|
||||||
|
//static rt_timer_t repLoc;
|
||||||
|
//static rt_sem_t isReadyToSendLoc;
|
||||||
|
|
||||||
|
int isInFence(uint8_t *loc);
|
||||||
|
/**
|
||||||
|
* 打包并检测位置数据 默认10s更新一次
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
static void packAndChkLoc_thread_entry(void *parameter)
|
||||||
{
|
{
|
||||||
|
while (isTCPok())
|
||||||
|
{
|
||||||
|
static size_t i = 0;
|
||||||
|
int isReadyToSendLoc=0;
|
||||||
uint8_t rst[200];
|
uint8_t rst[200];
|
||||||
|
|
||||||
int len = packLocMsg(rst);
|
int len = packLocMsg(rst);
|
||||||
LOG_D("len=%d",len);
|
// LOG_D("len=%d", len);
|
||||||
len = cryptLocMsg(rst, len, rst);
|
len = cryptLocMsg(rst, len, rst);
|
||||||
LOG_D("len=%d",len);
|
// LOG_D("len=%d", len);
|
||||||
LOG_HEX("crypt",16,rst,len);
|
LOG_HEX("crypt", 16, rst, len);
|
||||||
|
|
||||||
|
//检测是否在围栏内
|
||||||
|
if (!isInFence(rst-9))//不在围栏内
|
||||||
|
{
|
||||||
|
rst[8]=1;
|
||||||
|
isReadyToSendLoc = 1;
|
||||||
|
}
|
||||||
|
rt_thread_mdelay(10000); //默认10s刷新一次
|
||||||
|
|
||||||
|
if (i++ > scfg.maxTTWaitTime * 60)//定时发送,默认5分钟
|
||||||
|
{
|
||||||
|
i=0;
|
||||||
|
isReadyToSendLoc = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isReadyToSendLoc) {
|
||||||
|
upSend(rst, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//创建定时任务,默认时间5分钟,采集发送
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上报时间到或位置异常时上报
|
||||||
|
*/
|
||||||
|
//static void upSendLoc_thread_entry(void *parameter)
|
||||||
|
//{
|
||||||
|
// while(1)
|
||||||
|
// {
|
||||||
|
// if (rt_sem_take(isReadyToSendLoc, RT_WAITING_FOREVER)) {
|
||||||
|
// uint8_t rst[200];
|
||||||
|
// size_t len = packAndChkLoc(rst);
|
||||||
|
// upSend(rst, len);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//cb_upSendLoc()
|
||||||
|
//{
|
||||||
|
// if (isTCPok()) {
|
||||||
|
//// packAndSendLoc();
|
||||||
|
// rt_sem_release(isReadyToSendLoc);
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// rt_timer_delete(repLoc);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
void initUpSendLoc()
|
||||||
|
{
|
||||||
|
// isReadyToSendLoc = rt_sem_create("SendLoc", 0, RT_IPC_FLAG_PRIO);
|
||||||
|
// repLoc = rt_timer_create("repLoc", cb_upSendLoc,
|
||||||
|
// RT_NULL, 10,
|
||||||
|
// RT_TIMER_FLAG_PERIODIC);
|
||||||
|
|
||||||
|
/* 创建 serial 线程 */
|
||||||
|
// rt_thread_t thread = rt_thread_create("sendLoc", upSendLoc_thread_entry, RT_NULL, 1024 * 1, 27, 10);
|
||||||
|
// /* 创建成功则启动线程 */
|
||||||
|
// if (thread != RT_NULL)
|
||||||
|
// {
|
||||||
|
// rt_thread_startup(thread);
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// LOG_E("thread 'sendLoc' create failure.");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
rt_thread_t thread = rt_thread_create("PCLoc", packAndChkLoc_thread_entry, RT_NULL, 1024 * 1, 27, 10);
|
||||||
|
/* 创建成功则启动线程 */
|
||||||
|
if (thread != RT_NULL)
|
||||||
|
{
|
||||||
|
rt_thread_startup(thread);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_E("thread 'PCLoc' create failure.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -553,7 +669,7 @@ int depthAlert(uint8_t *din, int len)
|
|||||||
* @param y 当前位置纬度
|
* @param y 当前位置纬度
|
||||||
* @return 在内部则返回true,反之false
|
* @return 在内部则返回true,反之false
|
||||||
*/
|
*/
|
||||||
static int isInFence(float x, float y)
|
static int isInPolgon(float x, float y)
|
||||||
{
|
{
|
||||||
float polyX[]={},polyY[]={};
|
float polyX[]={},polyY[]={};
|
||||||
int polyCorners = mapParse("/map.geojson",polyX,polyY);
|
int polyCorners = mapParse("/map.geojson",polyX,polyY);
|
||||||
@ -570,37 +686,27 @@ void setLocationAlertSWT(int setON)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查是否在电子围栏内部,并发出告警
|
* 判断给定位置是否在电子围栏内部
|
||||||
|
* @param loc 经纬度数组,8个字节
|
||||||
|
* @return 1-
|
||||||
*/
|
*/
|
||||||
void checkLocAndAlert()
|
int isInFence(uint8_t *loc)
|
||||||
{
|
{
|
||||||
//get Lon and Lat
|
|
||||||
uint8_t loc[8];
|
|
||||||
getAndCheckLoc(loc,1);
|
|
||||||
float x,y =0;
|
float x,y =0;
|
||||||
memcpy(&x,loc,4);
|
memcpy(&x,loc,4);
|
||||||
memcpy(&y,loc+4,4);
|
memcpy(&y,loc+4,4);
|
||||||
|
|
||||||
int isIN = isInFence(x, y);
|
int isIN = isInPolgon(x, y);
|
||||||
if (isIN) {
|
if (isIN) {
|
||||||
LOG_I("设备在预设范围内,位置正常。");
|
// LOG_I("设备在预设范围内,位置正常。");
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_W("警告!设备不在预设范围内!");
|
LOG_W("警告!设备不在预设范围内!");
|
||||||
uint8_t msg[200];
|
return 0;
|
||||||
int len = packLocMsg(msg);
|
|
||||||
len = cryptLocMsg(msg,len,msg);
|
|
||||||
//告警信息与3.2.8定时自报位置信息的共用编码方式
|
|
||||||
// uint8_t alertMsg[]={0x5A,0xA5,ADDR_ANJI,ADDR_TT};
|
|
||||||
// alertMsg[4] = _CFG_LOCATION_ALERT >> 8;
|
|
||||||
// alertMsg[5] = _CFG_LOCATION_ALERT & 0xFF;
|
|
||||||
//
|
|
||||||
// //加密。
|
|
||||||
// uint8_t cd[200];
|
|
||||||
// size_t nlen = cryptByte(din, len, cd);
|
|
||||||
// upSend(alertMsg, sizeof(alertMsg));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//创建定时任务,默认时间10秒钟,异常则发送
|
||||||
|
|
||||||
//3.2.12数据存储区清空
|
//3.2.12数据存储区清空
|
||||||
//
|
//
|
||||||
@ -648,7 +754,7 @@ void ttRunCMD(uint8_t *din, size_t len)
|
|||||||
selfDestruct();
|
selfDestruct();
|
||||||
break;
|
break;
|
||||||
case _CFG_COMM_WINDOW:
|
case _CFG_COMM_WINDOW:
|
||||||
setCommWindow(din+8,din+7);//只支持两组开窗,开窗时间为小时、分钟,UTC+0
|
setCommWindow(din+8,din[7]);//只支持两组开窗,开窗时间为小时、分钟,UTC+0
|
||||||
break;
|
break;
|
||||||
case _CMD_OPEN_WINDOW:
|
case _CMD_OPEN_WINDOW:
|
||||||
openWindow(din[7]?((din[8] << 8) + din[9]):0);//两字节开窗时间
|
openWindow(din[7]?((din[8] << 8) + din[9]):0);//两字节开窗时间
|
||||||
@ -662,6 +768,13 @@ void ttRunCMD(uint8_t *din, size_t len)
|
|||||||
case _CMD_CLEAR_DATA:
|
case _CMD_CLEAR_DATA:
|
||||||
clearAllData();
|
clearAllData();
|
||||||
break;
|
break;
|
||||||
|
case _CFG_UPDATE_CFG:
|
||||||
|
if (din[7]) {//数据长度不为0则为覆写参数
|
||||||
|
updateSysCfg(din+8, din[7]);
|
||||||
|
}
|
||||||
|
else {//数据长度为0则为请求参数
|
||||||
|
reportSysCfg();
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
LOG_W("0x%04X=未支持的指令。",cmd);
|
LOG_W("0x%04X=未支持的指令。",cmd);
|
||||||
break;
|
break;
|
||||||
@ -1089,10 +1202,11 @@ int isEthUP()
|
|||||||
MSH_CMD_EXPORT(d_getFreeSpace,getFreeSpace);
|
MSH_CMD_EXPORT(d_getFreeSpace,getFreeSpace);
|
||||||
MSH_CMD_EXPORT(selfTest,sysSelfTest);
|
MSH_CMD_EXPORT(selfTest,sysSelfTest);
|
||||||
MSH_CMD_EXPORT(d_packLocMsg,dpackLocMsg);
|
MSH_CMD_EXPORT(d_packLocMsg,dpackLocMsg);
|
||||||
MSH_CMD_EXPORT(packAndSendLoc,packAndSendLoc);
|
MSH_CMD_EXPORT(initUpSendLoc,initUpSendLoc);
|
||||||
MSH_CMD_EXPORT(d_cacheData,d_cacheData);
|
MSH_CMD_EXPORT(d_cacheData,d_cacheData);
|
||||||
MSH_CMD_EXPORT(d_getFileSize,d_getFileSize);
|
MSH_CMD_EXPORT(d_getFileSize,d_getFileSize);
|
||||||
MSH_CMD_EXPORT(isEthUP,isEthUP);
|
MSH_CMD_EXPORT(isEthUP,isEthUP);
|
||||||
|
MSH_CMD_EXPORT(reportSysCfg,reportSysCfg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,9 +65,9 @@ enum
|
|||||||
|
|
||||||
#define _CMD_CLEAR_DATA 0x7005 // 执行清空数据
|
#define _CMD_CLEAR_DATA 0x7005 // 执行清空数据
|
||||||
|
|
||||||
#define _CMD_RETRY_DATA 0x7006 //
|
#define _CMD_RETRY_DATA 0x7006 //数据重发
|
||||||
|
|
||||||
#define _CFG_UPDATE_CFG 0x7007
|
#define _CFG_UPDATE_CFG 0x7007 //更新、回传配置信息
|
||||||
|
|
||||||
//3S
|
//3S
|
||||||
#define _CMD_DEPTH_REQUEST 0x0601
|
#define _CMD_DEPTH_REQUEST 0x0601
|
||||||
|
@ -199,9 +199,8 @@ static void rulecheck(void)
|
|||||||
}
|
}
|
||||||
if (okCnt >= minTTPeriCnt) {
|
if (okCnt >= minTTPeriCnt) {
|
||||||
//TT具备发送条件
|
//TT具备发送条件
|
||||||
// rt_event_send(&sw_check, TT_IS_OK);
|
// TTisReady();
|
||||||
// upTTflag();
|
TTIsReady();
|
||||||
TTisReady();
|
|
||||||
LOG_I("符合规则,TT具备发送状态。");
|
LOG_I("符合规则,TT具备发送状态。");
|
||||||
// updateSta();
|
// updateSta();
|
||||||
okCnt = minTTPeriCnt -1;
|
okCnt = minTTPeriCnt -1;
|
||||||
|
@ -270,15 +270,9 @@ static int tcpAck()
|
|||||||
*/
|
*/
|
||||||
int sendMsg(const rt_uint8_t *msg, size_t len)
|
int sendMsg(const rt_uint8_t *msg, size_t len)
|
||||||
{
|
{
|
||||||
|
|
||||||
// if (tcpInit() != RT_EOK)
|
|
||||||
// {
|
|
||||||
// return RT_ERROR;
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (tcpSend(msg, len) != RT_EOK)
|
if (tcpSend(msg, len) != RT_EOK)
|
||||||
{
|
{
|
||||||
tcpClose();
|
// tcpClose();
|
||||||
return RT_ERROR;
|
return RT_ERROR;
|
||||||
}
|
}
|
||||||
//#define CHK_ACK
|
//#define CHK_ACK
|
||||||
@ -290,9 +284,11 @@ int sendMsg(const rt_uint8_t *msg, size_t len)
|
|||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
//已发送数据存入log文件
|
||||||
char str[400];
|
char str[400];
|
||||||
bytes2str(msg, len, 16, " ", str);
|
bytes2str(msg, len, 16, " ", str);
|
||||||
trDataTolog(str, strlen(str), 1);
|
trDataTolog(str, strlen(str), 1);
|
||||||
|
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -29,15 +29,21 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int sendInterval;
|
uint8_t sendInterval;
|
||||||
int maxTTWaitTime;
|
uint8_t maxTTWaitTime;
|
||||||
int maxTTRetryCnt;
|
uint8_t maxTTRetryCnt;
|
||||||
int minTTPeriCnt;
|
uint8_t minTTPeriCnt;
|
||||||
int minTTsinal;
|
uint8_t minTTsinal;
|
||||||
int minActiveTime;
|
uint8_t minActiveTime;
|
||||||
int maxActiveTime;
|
uint8_t maxActiveTime;
|
||||||
int timeout;
|
uint8_t timeout;
|
||||||
int maxSizePerFile;
|
uint8_t openWindowTime[4];
|
||||||
|
uint16_t maxSizePerFile;
|
||||||
|
uint8_t commMode;
|
||||||
|
uint8_t selfDesSW;
|
||||||
|
uint8_t locAlert;
|
||||||
|
uint8_t locReportInterval;
|
||||||
|
|
||||||
} SYS_CFG;
|
} SYS_CFG;
|
||||||
|
|
||||||
//struct rt_event sw_check;//软件条件
|
//struct rt_event sw_check;//软件条件
|
||||||
|
Loading…
Reference in New Issue
Block a user