From 710ffb8e62eb23093ee818d559054c4fbd8564d8 Mon Sep 17 00:00:00 2001 From: "CSSC-WORK\\murmur" Date: Tue, 5 Sep 2023 18:53:01 +0800 Subject: [PATCH] =?UTF-8?q?core.c=20=E6=B7=BB=E5=8A=A0=E6=BF=80=E6=B4=BB?= =?UTF-8?q?=E5=90=8E=E5=8F=91=E9=80=81=E5=BD=93=E5=89=8D=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=9A=84=E5=8A=9F=E8=83=BD--=E5=BE=85?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=20func.c=20=E4=B8=AD=20setCommWindow=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=96=E5=80=BC=E6=A0=B8=E9=AA=8C=20isManu?= =?UTF-8?q?alWindow=20=E9=80=BB=E8=BE=91=E6=9B=B4=E6=96=B0=20parseRS232=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0ASCII=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=88=E6=95=B0=E6=8D=AE=E6=9C=89\r\n=E4=BD=86=E6=98=AF?= =?UTF-8?q?=E5=89=8D=E6=9C=9F=E9=87=87=E9=9B=86=E6=9C=AA=E4=BD=93=E7=8E=B0?= =?UTF-8?q?=EF=BC=89=20=E6=9B=B4=E6=96=B0=E5=B2=B8=E5=9F=BA=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E4=B8=BAADDR=5FANJI=20=3D=200x3E=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?tcpRecMQ=E5=A0=86=E6=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/RS_485.c | 3 +- applications/cfg/cfg.c | 2 +- applications/core.c | 22 ++++++++- applications/func/func.c | 100 ++++++++++++++++++++++++++++----------- applications/func/func.h | 5 +- applications/main.c | 2 +- applications/ttTR/ttTR.c | 2 +- applications/usrcfg.h | 2 +- applications/w25q.c | 5 +- 9 files changed, 105 insertions(+), 38 deletions(-) diff --git a/applications/RS_485.c b/applications/RS_485.c index 5e3a620..bb0e2e0 100644 --- a/applications/RS_485.c +++ b/applications/RS_485.c @@ -57,6 +57,7 @@ static rt_err_t uart485_input(rt_device_t dev, rt_size_t size) cachecnt += size; if (cachecnt < 63) { // LOG_W("not enough data[%d byte(s)], cached and waiting...",size);//处理半包 + LOG_D("%d byte(s)",size); return -1; } msg.dev = dev; @@ -199,7 +200,7 @@ static void serial485_thread_entry(void *parameter) parseBattInfo(rx_buffer, rx_length); } - rt_thread_mdelay(30*1000); + rt_thread_mdelay(9*60*1000); } diff --git a/applications/cfg/cfg.c b/applications/cfg/cfg.c index 4b72f12..c550f0d 100644 --- a/applications/cfg/cfg.c +++ b/applications/cfg/cfg.c @@ -30,7 +30,7 @@ void initCfgMutex() isCfgOk = rt_mutex_create("cfg", RT_IPC_FLAG_FIFO); isTosendOk = rt_mutex_create("tosend", RT_IPC_FLAG_FIFO); } -//INIT_APP_EXPORT(initCfg); +INIT_APP_EXPORT(initCfgMutex); static void setLock() { diff --git a/applications/core.c b/applications/core.c index 835b030..d50483e 100644 --- a/applications/core.c +++ b/applications/core.c @@ -215,7 +215,7 @@ void sysSemInit() // rt_event_init(&chkSta, "chkSta", RT_IPC_FLAG_FIFO);//检查天通状态 // rt_sem_release(cfgUpdate); //上电更新值 - initCfgMutex(); +// initCfgMutex(); // void reportINFO(); reportINFO(); /* 创建 serial 线程 */ @@ -256,10 +256,12 @@ void sysInit(void) { sysSemInit(); initCfg(); + checkManualWindow(); if (isInWindowZone() || isManualWindow()) {//开机检查是否在开窗区间内,是则给TT开机 initTT(); setWindowMode(); } + } //INIT_COMPONENT_EXPORT(sysInit); @@ -328,6 +330,11 @@ void resetTM(void) LOG_W("TIMEOUT stopped.[isWindowMode]"); return; } + if (isManualWindow()) { + stopTM(); + LOG_W("TIMEOUT stopped.[isManualMode]"); + return; + } rt_tick_t t= rt_tick_from_millisecond(scfg.timeout*60*1000); rt_timer_control(tmrToPNTT, RT_TIMER_CTRL_SET_TIME,(void*) &t); @@ -485,6 +492,19 @@ void d_upSendFile(int argc, char **argv) */ void getAndSendFile() { + + //优先发送未达指定大小的文件 + char fnow[50]; + getLstCacheFileName(fnow); + if (getFileSize(fnow)) {//有数据才发 + updateCacheFileName(); + LOG_I("send latest data first"); +// rt_sem_release(okTosend);//初始赋值 + upSendFile(fnow,0); + rt_thread_mdelay(10*1000); + } + + static int index[MAX_KEY_LEN]; static char f[5][MAX_KEY_LEN]; int cnt = getFilesToSend(f, index); diff --git a/applications/func/func.c b/applications/func/func.c index a7b793e..1122231 100644 --- a/applications/func/func.c +++ b/applications/func/func.c @@ -153,7 +153,7 @@ return 0x63; typedef struct { rt_uint8_t len; - rt_uint8_t data[]; + rt_uint8_t data[200]; } SMSG;//single messgae @@ -185,7 +185,7 @@ void upSend_thread_entry(void* parameter) //打包数据 - uint8_t dout[200]; + uint8_t dout[300]; static MSG cfg; rt_memset(&cfg, 0, sizeof(MSG)); // 分配空间 char fin[30]; @@ -198,7 +198,9 @@ void upSend_thread_entry(void* parameter) //crypt before pack uint8_t tmp[200]; uint8_t len = cryptSingleMsg(msg->data, msg->len, tmp); - + if (len>170) { + LOG_W("length of msg is too long.[%d->%d]",msg->len,len); + } size_t rst = packMsg(&cfg, tmp, len, dout);//packMsgs #else size_t rst = packMsg(&cfg, tmpmsg->data, msg->len, dout);//packMsgs @@ -359,8 +361,13 @@ extern void updateAlarm(uint8_t *t, size_t len); void setCommWindow(uint8_t *t, size_t len) { LOG_I("FUNC = setCommWindow"); + size_t cnt = sizeof(scfg.openWindowTime); + if (len>cnt) { + LOG_W("only support %d windows",cnt/4); + len = cnt; + } + len= len/4*4;//窗口需要成对 -// extern void updateAlarm(uint8_t *t, size_t len); updateAlarm(t,len); memcpy(scfg.openWindowTime,t,len); rt_sem_release(cfgUpdate); @@ -382,6 +389,7 @@ void d_sw(void) */ void setManualWindow(int isManualWindow) { + scfg.isMaWin = isManualWindow; set_cfg("isMaWin", isManualWindow); } @@ -393,13 +401,26 @@ void closeWindow(void); */ int isManualWindow(void) { - int rst = get_cfg("isMaWin"); - if (rst < 0) {//none - return 0; + int rst = scfg.isMaWin; + if (rst >= 0) { + rst = 1; + LOG_I("is in manual open mode."); } - LOG_I("is in manual window."); + else { + rst = 0; + } + return rst; +} +void checkManualWindow(void) +{ + int rst = get_cfg("isMaWin"); + scfg.isMaWin = rst; + if (rst < 0) {//none + return; + } + if (rst == 0) {//manual open without auto close - return 1; + return; } //设置定时器,定时器到则关窗 /* 创建定时器,单次定时器 */ @@ -413,7 +434,7 @@ int isManualWindow(void) rt_timer_start(timer1); LOG_D("手动开窗完成,%d分钟后自动关窗。",rst); } - return 1; + return; } /** @@ -535,11 +556,7 @@ int reportDepth(uint8_t *din,size_t len) rt_memcpy(dout+10, din, len);//5aa5从第11字节开始,共len个字节 LOG_HEX("depth",16,dout,len+10); - //加密。因加密后数据长度会变化,故不能只加密位置数据。 - nlen = cryptSingleMsg(din, len+10, dout); - LOG_HEX("crypt",16,dout,nlen); -// LOG_D("位置数据加密完成"); - upSend(dout, nlen); + upSend(dout, len+10); } //天通指令类型:0x70 0x01 /** @@ -579,7 +596,7 @@ void updateAllSysCfg(uint8_t *cfg, size_t len) rst &= set_cfg("minTTsinal",scfg.minTTsinal); rst &= set_cfg("timeout",scfg.timeout); - char tmpstr[20]; + char tmpstr[sizeof(scfg.commMode)*4]; bytes2str(scfg.openWindowTime, 8, 10, ",", tmpstr); rst &= set_cfgs("openWindowTime",tmpstr); @@ -677,10 +694,12 @@ static int packLocMsg(uint8_t *dout) } static void d_packLocMsg(void) { - uint8_t tmp[200]; - size_t len = packLocMsg(tmp); +// uint8_t tmp[200]; +// size_t len = packLocMsg(tmp); // len = cryptSingleMsg(tmp, len, tmp); - LOG_HEX("c",16,tmp,len); + uint8_t din[]={0x5A,0xA5,0x3E,0x32,0x06,0x08,0x00,0x0A,0x17,0x09,0x05,0x0F,0x24,0x0B,0xFF,0xFF,0xFF,0xFF,0x33,0xED}; + reportDepth(din, sizeof(din)); +// LOG_HEX("c",16,tmp,len); // upSend(tmp, len); } /** @@ -1030,7 +1049,7 @@ RT_WEAK int formatAndSendTo3S(uint8_t * din, size_t len) sendTo3S(str, strlen(str));//作为字符串发送 return 0; } - +//#define CHECK_3S_DATA int chk3SDataValid(uint8_t *din, size_t count) { uint8_t head[]={0x5A,0xA5}; @@ -1071,7 +1090,9 @@ void parse3SData(uint8_t *din, size_t count) +--------+--------+------------+------------+---------+--------+------+------+-------+-----+-------+---------+------+ */ if (chk3SDataValid(din, count) != RT_EOK) { - return; +#ifdef CHECK_3S_DATA + return; +#endif } //有效的数据才能复位超时 @@ -1099,7 +1120,10 @@ void parse3SData(uint8_t *din, size_t count) int cmd = (din[4] << 8) + din[5]; switch (cmd) { - case _CMD_DEPTH_REQUEST: +// case _CMD_DEPTH_REQUEST: +// reportDepth(din, count); +// break; + case _INFO_DEPTH_ANSWER: reportDepth(din, count); break; default: @@ -1339,6 +1363,22 @@ void d_getFileSize(int argc, char ** argv) LOG_D("size = %d Byte.",size); } +/** + * 判断文件是否存在,参数为文件完整路径 + * @param f + * @return + */ +int isFileExit(char *f) +{ + int rst = 0; + int fd = open(f, O_RDONLY); + if (fd > 0) + { + rst = 1; + close(fd); + } + return rst; +} extern SYS_CFG scfg; static uint8_t iscdlock=0; /** @@ -1513,14 +1553,14 @@ void parseRS232(uint8_t *din, size_t len) //有HEX有ASCII,统一按HEX解析 //部分数据以10字节(20字符)的0数据开始,如深度查询,心跳包等 //处理思路是先不管前导0,对应指令手动加前导数据 -// uint8_t asciiHead[]={0x41, 0x54, 0x2B, 0x53, 0x4E, 0x44,};//"AT+SND" + uint8_t asciiHead[]={0x41, 0x54, 0x2B, 0x53, 0x4E, 0x44,};//"AT+SND" uint8_t hexHead[]={0x5a, 0xa5};//"5AA5" //由于帧头有多种,且ascii和hex混发,无法处理粘包 // LOG_D("data is %s",isDataASCII(din, len)?"ASCII":"BIN"); //check -// if (memcmp(din,asciiHead,sizeof(asciiHead)) == 0) { - if (isDataASCII(din, len)) { + if (memcmp(din,asciiHead,sizeof(asciiHead)) == 0) { +// if (isDataASCII(din, len) || memcmp(din,asciiHead,sizeof(asciiHead)) == 0) { //ascii LOG_I("type = ASCII"); trDataTolog(din, len, 0); @@ -1531,7 +1571,7 @@ void parseRS232(uint8_t *din, size_t len) size_t n=isInByte(din, len, tmpHead, sizeof(tmpHead), index); // LOG_D("n=%d",n); if (!n) { - LOG_W("RS232中无匹配帧"); + LOG_W("RS232中无匹配帧[ASCII]"); return; } for (size_t i = 0; i < n; i++) @@ -1542,10 +1582,12 @@ void parseRS232(uint8_t *din, size_t len) memcpy(ndin,din+index[i],cnt); ndin[cnt]='\0'; uint8_t tmp[200]; - size_t ncnt = str2Byte(ndin, 2, 16, tmp); + size_t ncnt = str2Byte(ndin, 2, 16, tmp)-1;//结尾有\r\n LOG_HEX("frame",16,tmp,ncnt); if (chk3SDataValid(tmp, ncnt) != RT_EOK) { +#ifdef CHECK_3S_DATA return; +#endif } parse3SData(tmp,ncnt); } @@ -1561,7 +1603,7 @@ void parseRS232(uint8_t *din, size_t len) uint8_t index[10]; size_t n=isInByte(din, len, hexHead, sizeof(hexHead), index); if (!n) { - LOG_W("RS232中无匹配帧"); + LOG_W("RS232中无匹配帧[BIN]"); return; } for (size_t i = 0; i < n; i++) @@ -1572,7 +1614,9 @@ void parseRS232(uint8_t *din, size_t len) memcpy(ndin,din+index[i],cnt); LOG_HEX("frame",16,ndin,cnt); if (chk3SDataValid(ndin, cnt) != RT_EOK) { +#ifdef CHECK_3S_DATA return; +#endif } parse3SData(ndin,cnt); } diff --git a/applications/func/func.h b/applications/func/func.h index ec014f3..9ba0015 100644 --- a/applications/func/func.h +++ b/applications/func/func.h @@ -74,10 +74,11 @@ enum //3S #define _CMD_DEPTH_REQUEST 0x0601 #define _CMD_RTC_REQUEST 0x410F - +//需补充信息 +#define _INFO_DEPTH_ANSWER 0x0608 //深度回复 // -#define ADDR_ANJI 0x42 //0x42? +#define ADDR_ANJI 0x3E //0x42? #define ADDR_TT 0x41 #define ADDR_3S 0x32 diff --git a/applications/main.c b/applications/main.c index cf897a2..6287008 100644 --- a/applications/main.c +++ b/applications/main.c @@ -86,7 +86,7 @@ void show_version(void) char str[30]; uint8_t t[10]; size_t len=time2Byte(t); - rt_kprintf("SW Version: %s, build-%s\n","1.8d",bytes2str(t, 3, 10, "", str)); + rt_kprintf("SW Version: %s, build-%s\n","1.9d",bytes2str(t, 3, 10, "", str)); } MSH_CMD_EXPORT(show_version,显示版本号); diff --git a/applications/ttTR/ttTR.c b/applications/ttTR/ttTR.c index 3086b36..cf5699f 100644 --- a/applications/ttTR/ttTR.c +++ b/applications/ttTR/ttTR.c @@ -202,7 +202,7 @@ void tcpRecMQ_thread_entry(void) void tcpRecMQ(void) { /* 创建 serial 线程 */ - rt_thread_t thread = rt_thread_create("tcpRecMQ", tcpRecMQ_thread_entry, RT_NULL, 1024*1, 25, 10); + rt_thread_t thread = rt_thread_create("tcpRecMQ", tcpRecMQ_thread_entry, RT_NULL, 1024*10, 25, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { diff --git a/applications/usrcfg.h b/applications/usrcfg.h index 05af32d..312fcaf 100644 --- a/applications/usrcfg.h +++ b/applications/usrcfg.h @@ -50,7 +50,7 @@ typedef struct uint8_t minTTPeriCnt; uint8_t minTTsinal; uint8_t timeout; - uint8_t openWindowTime[20]; + uint8_t openWindowTime[60]; uint16_t maxSizePerFile; uint8_t commMode; uint8_t selfDesSW; diff --git a/applications/w25q.c b/applications/w25q.c index 679e5ef..3fbc627 100644 --- a/applications/w25q.c +++ b/applications/w25q.c @@ -67,7 +67,7 @@ INIT_COMPONENT_EXPORT(w25q128_mount); void sdmnt_init(void) { - rt_thread_mdelay(100);//这段延时必须加上,系统上电过程中存在延时,否则会出现先挂载后注册块设备sd0的情况 + rt_thread_mdelay(300);//这段延时必须加上,系统上电过程中存在延时,否则会出现先挂载后注册块设备sd0的情况 // mkfs("elm","sd0");//挂在前需格式化 if(dfs_mount("sd0","/sd","elm",0,0)==0) //挂载文件系统,参数:块设备名称、挂载目录、文件系统类型、读写标志、私有数据0 { @@ -75,7 +75,8 @@ void sdmnt_init(void) } else { - LOG_E("dfs mount failed\r\n"); + LOG_E("dfs mount failed"); +// mkfs("elm","sd0"); } } /* 导出到自动初始化 */