From 3d9fb6a6bce7e5d29a2239a0d42b0f11f2413fab Mon Sep 17 00:00:00 2001 From: "CSSC-WORK\\murmur" Date: Mon, 24 Jul 2023 14:57:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0appendInfo=E5=87=BD=E6=95=B0?= =?UTF-8?q?=20=E6=9B=B4=E6=96=B0getLoc=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/func/func.c | 2 +- applications/getinfo.c | 84 +++++++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/applications/func/func.c b/applications/func/func.c index 1567e31..2b60e66 100644 --- a/applications/func/func.c +++ b/applications/func/func.c @@ -265,7 +265,7 @@ static int getAndCheckLoc(uint8_t *dout, size_t pairCnt) size_t cnt = getLoc(loc,pairCnt); while (!cnt) { - static i=0; + static uint8_t i=0; LOG_W("位置信息还未准备好。"); rt_thread_mdelay(4000);//状态数据默认3s更新一次 cnt = getLoc(loc,pairCnt); diff --git a/applications/getinfo.c b/applications/getinfo.c index 421ba4e..a2c7b84 100644 --- a/applications/getinfo.c +++ b/applications/getinfo.c @@ -10,6 +10,7 @@ #define LOG_LVL LOG_LVL_INFO #include +#include #include #include @@ -50,14 +51,12 @@ typedef struct // char *ele; // 高度 }TT; -TT tmp={.sim="-",.xh="-",.jh="-",.jd="-",.wd="-",.ele="-"}; -//memset(&tmp,0x00,sizeof(TT)); +TT tmp={.sim="-",.xh="-",.rw="-",.jh="-",.jd="-",.wd="-",.ele="-"}; TT *TTinfo=&tmp; static rt_tick_t bootstamp=0; +#define RST_LEN 100//存储info的数组的长度 +static uint8_t rstInfo[RST_LEN];//存储info的数组 -//rt_memset(TTinfo,0,sizeof(TT)); -//TT *TTinfo=RT_NULL; -//TTinfo = rt_malloc(sizeof(TT)); /** * @description: 将TT结构体转换为数组 * @param {TT} *TTinfo TT结构体 @@ -68,7 +67,7 @@ rt_uint8_t info2HEX(TT *TTinfo, rt_uint8_t *buffer) { // 功能:将tt数据转换为9字节HEX数据并返回,存在data // 第1节为高3位分别为sim、rw和jh,其余位为xh,xh值若大于31则为31(31=b0001 1111) - // 第2-5字节为经度。114.410050= 0xF2 0xD1 0xE4 0x42 + // 第2-5字节为经度。114.410050= 0xF2 0xD1 0xE4 0x42//根据系统大小端的不同可能是反序 // 第6-9字节为纬度。30.426840= 0x2B 0x6A 0xF3 0x41 // 第10字节为高度,只保留整数。-31.5= 0x0A rt_uint8_t tmp = (atoi(TTinfo->sim) << 7) + (atoi(TTinfo->rw) << 6) + (atoi(TTinfo->jh) << 5) @@ -95,7 +94,47 @@ rt_uint8_t info2HEX(TT *TTinfo, rt_uint8_t *buffer) return offset; } +/** + * @brief 将新采集到的数据压入结果数组中。采用固定长度的队列方式压入,空间不足时自动弹出最旧的数据 + * + * @param rst 存储采集结果的数组 + * @param cnt 数组长度 + * @param din 新采集的数据 + * @param len 数据长度 + * @return size_t 0-正常,-1异常 + */ +int appendInfo(uint8_t *rst, size_t cnt, uint8_t *din, size_t len ) +{ + if (cnt < len) + { + return -1; + } + uint8_t tmp[cnt]; + memcpy(tmp, rst + len, cnt - len); + memcpy(rst, tmp, cnt - len); + + memcpy(rst + cnt - len, din, len); + return 0; +} + +/** + * 获取当前经纬度信息 + * @param dout 存储结果的数组 + * @param cnt 获取几组位置数据 + * @return 数组长度。0表示位置数据未准备好。 + */ +int getLoc(uint8_t * dout, size_t cnt) +{ +// LOG_D("待实现获取位置函数,此处以0xCD代替"); +// uint8_t tmp[200]; +// memset(tmp,0xCD,200); + if (rstInfo[RST_LEN-1] == 0x3f) { + return 0; + } + memcpy(dout,rstInfo+RST_LEN-cnt*10,cnt*10);//从后开始取 + return cnt*10;//1+4+4+1 +} static int minTTPeriCnt=5; static int minTTsinal=3; @@ -296,35 +335,10 @@ void getTTinfo_thread_entry(void* parameter) cfg = (CFG*) parameter; // TT TTinfo; - rt_uint8_t var = 0, isize = 0, i = 0; - isize = sizeof(infoH) / sizeof(infoH[0]); rt_kprintf("\n%10s%s\n", " ", "↓---------getTT START.--------↓"); rt_kprintf("%5s%5s%5s%5s%15s%15s%10s\n", "SIM", "xh", "rw", "jh", "N", "E", "ele"); - for (i = 0; i < cfg->cnt; ++i) //按指定次数轮询 + for (uint8_t i = 0; i < cfg->cnt; ++i) //按指定次数轮询 { -// for (var = 0; var < isize; var++) //轮询每个参数 -// { -// static char *url = RT_NULL; -// url = web_strdup(*(infoH + var)); -// if (url == RT_NULL) -// { -// LOG_E("no memory for create getTT url buffer.\n"); -//// return -RT_ENOMEM; -// } -// if (webclient_get_data(url) != RT_EOK) -// { -// strcpy(TTinfo->sim,"-"); -// strcpy(TTinfo->xh,"-"); -// strcpy(TTinfo->jh,"-"); -// strcpy(TTinfo->jd,"-"); -// strcpy(TTinfo->wd,"-"); -// strcpy(TTinfo->ele,"-"); -// break; -// } -// web_free(url); -// rt_thread_mdelay(100); -// } -// rulecheck(); rt_kprintf("%5s%5s%5s%5s%15s%15s%10s\n", TTinfo->sim, TTinfo->xh, TTinfo->rw, TTinfo->jh, TTinfo->jd, TTinfo->wd, TTinfo->ele); if (i != cfg->cnt - 1) //最后一次采集不延时 @@ -410,6 +424,11 @@ void repGetTT_thread_entry(void* parameter) } web_free(url); // rt_thread_mdelay(100); + + //trans© new info to arrBuf + uint8_t buffer[10]; + int len = info2HEX(TTinfo, buffer); + appendInfo(rstInfo, RST_LEN, buffer, len); } rulecheck(); rt_thread_mdelay(3 * 1000);//间隔3s更新一次数据 @@ -421,6 +440,7 @@ void repGetTT_thread_entry(void* parameter) */ void repGetTT(void) { + memset(rstInfo,0x3f,RST_LEN);//初始化 /* 创建 serial 线程 */ rt_thread_t thread = rt_thread_create("repGetTT", repGetTT_thread_entry, RT_NULL, 1024 * 3, 27, 10); /* 创建成功则启动线程 */