更新 getAndSendFile 中逻辑,添加 getCntOfFileToSend 功能

This commit is contained in:
CSSC-WORK\murmur 2023-09-06 11:18:11 +08:00
parent 47fe7c90ee
commit 04c090e9b2
2 changed files with 54 additions and 35 deletions

View File

@ -310,7 +310,7 @@ volatile size_t nislock=0;
static void nsetLock() static void nsetLock()
{ {
rt_mutex_take(isTosendOk, RT_WAITING_FOREVER); rt_mutex_take(isTosendOk, RT_WAITING_FOREVER);
LOG_W("------file locked------"); // LOG_W("------file locked------");
return; return;
// LOG_D("--%d--",nislock); // LOG_D("--%d--",nislock);
size_t cnt=10; size_t cnt=10;
@ -328,7 +328,7 @@ static void nsetLock()
static void nclearLock() static void nclearLock()
{ {
rt_mutex_release(isTosendOk); rt_mutex_release(isTosendOk);
LOG_W("=====file unlocked====="); // LOG_W("=====file unlocked=====");
return; return;
nislock=0; nislock=0;
LOG_W("file is unlocked."); LOG_W("file is unlocked.");
@ -392,12 +392,27 @@ size_t getFilesToSend(char (*kstr)[MAX_KEY_LEN], int *v)
v[len] = ini_getl(SECTION_TO_SEND, kstr[len], -1, FILE_TO_SEND); v[len] = ini_getl(SECTION_TO_SEND, kstr[len], -1, FILE_TO_SEND);
len +=1; len +=1;
if (len>5) { if (len>5) {
break; // break;
} }
} }
// nclearLock(); // nclearLock();
return len; return len;
} }
/**
*
* @return
*/
size_t getCntOfFileToSend(void)
{
size_t len=0;
char tmp[100];
for (size_t k = 0; ini_getkey(SECTION_TO_SEND, k, tmp, sizeof(tmp), FILE_TO_SEND) > 0; k++) {
len = k + 1;
}
// LOG_D("cnt=%d",len);
return len;
}
/** /**
* *
*/ */
@ -415,26 +430,28 @@ int clearFileToSend(const char *k)
static void gf() static void gf()
{ {
size_t cnt = getCntOfFileToSend();
// return;
int v[MAX_KEY_LEN]; int v[MAX_KEY_LEN];
char kstr[10][MAX_KEY_LEN]; char kstr[cnt][MAX_KEY_LEN];
size_t cnt = getFilesToSend(kstr, v);
if (!cnt) { if (!cnt) {
LOG_D("no files waiting to be sent"); LOG_D("no files waiting to be sent");
} }
else else
{ {
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]);
} }
// cnt = getFilesToSend(kstr, v);
} }
} }
static void add(int argc, char **argv) static void add(int argc, char **argv)
{ {
postFileInfo(argv[1],atoi(argv[2])); postFileInfo(argv[1],atoi(argv[2]));
gf(); // gf();
// clearFileToSend(argv[1]); // clearFileToSend(argv[1]);
// gf(); // gf();
} }

View File

@ -34,7 +34,7 @@ static struct rt_event chkSta; //发送条件含两部分1-超时或文件
rt_sem_t TTReady= RT_NULL;//天通具备发送状态后 rt_sem_release(TTReady); rt_sem_t TTReady= RT_NULL;//天通具备发送状态后 rt_sem_release(TTReady);
rt_sem_t cfgUpdate = RT_NULL;//配置文件更新 rt_sem_t cfgUpdate = RT_NULL;//配置文件更新
rt_sem_t shuntDownTT = RT_NULL;//关闭TT rt_sem_t shuntDownTT = RT_NULL;//关闭TT
rt_sem_t okTosend = RT_NULL;//可以发送后续文件 rt_mutex_t okTosend = RT_NULL;//可以发送后续文件。仅一个线程,文件依次发送
rt_sem_t okToreport = RT_NULL;//配置信息ACK rt_sem_t okToreport = RT_NULL;//配置信息ACK
static rt_thread_t initThread=RT_NULL; static rt_thread_t initThread=RT_NULL;
static rt_thread_t deinitThread=RT_NULL; static rt_thread_t deinitThread=RT_NULL;
@ -209,7 +209,7 @@ static void updatecfg(void)
void sysSemInit() void sysSemInit()
{ {
okTosend = rt_sem_create("okTosend", 0, RT_IPC_FLAG_FIFO);//同一时间仅一个线程发送文件 okTosend = rt_mutex_create("okTosend", RT_IPC_FLAG_FIFO);//同一时间仅一个线程发送文件
cfgUpdate = rt_sem_create("cfgUpdate", 0, RT_IPC_FLAG_FIFO);//更新cfg cfgUpdate = rt_sem_create("cfgUpdate", 0, RT_IPC_FLAG_FIFO);//更新cfg
shuntDownTT = rt_sem_create("shuntDNTT", 0, RT_IPC_FLAG_FIFO);//关闭TT shuntDownTT = rt_sem_create("shuntDNTT", 0, RT_IPC_FLAG_FIFO);//关闭TT
okToreport = rt_sem_create("reportINFO", 0, RT_IPC_FLAG_FIFO);//关闭TT okToreport = rt_sem_create("reportINFO", 0, RT_IPC_FLAG_FIFO);//关闭TT
@ -418,12 +418,19 @@ static void upSendFile_thread_entry(void *parameter)
static rt_uint8_t d[BUFFER_ROW][200] = { };//need static? static rt_uint8_t d[BUFFER_ROW][200] = { };//need static?
static rt_uint8_t s[BUFFER_ROW] = { }; static rt_uint8_t s[BUFFER_ROW] = { };
if (!getFileSize(f->fname)) {
LOG_W("file '%s' is empty.",f->fname);
clearFileToSend(f->fname);
rt_mutex_release(okTosend);
return;
}
if (getFileSize(f->fname) > scfg.maxSizePerFile+200) {//部分demo数据体积>>1k if (getFileSize(f->fname) > scfg.maxSizePerFile+200) {//部分demo数据体积>>1k
LOG_W("file '%s' is too large to send.",f->fname); LOG_W("file '%s' is too large to send.",f->fname);
clearFileToSend(f->fname); clearFileToSend(f->fname);
rt_sem_release(okTosend); rt_mutex_release(okTosend);
return; return;
} }
LOG_D("ready to send '%s---%d'",f->fname,f->index); LOG_D("ready to send '%s---%d'",f->fname,f->index);
rt_uint8_t len = pack_File(f->fname, 0, d, s); rt_uint8_t len = pack_File(f->fname, 0, d, s);
for (size_t i = 0; i < len; i++) { for (size_t i = 0; i < len; i++) {
@ -444,13 +451,13 @@ static void upSendFile_thread_entry(void *parameter)
} }
} }
LOG_I("upSendFile '%s' done.",f->fname); LOG_I("upSendFile '%s' done.",f->fname);
clearFileToSend(f->fname); clearFileToSend(f->fname);//由于没有准确的校核机制,此处自能认为是发送成功
// list_thread(); // list_thread();
} }
//当前文件处理完后置位 //当前文件处理完后置位
rt_sem_release(okTosend); rt_mutex_release(okTosend);
} }
/** /**
@ -467,7 +474,7 @@ void upSendFile(const char *f, int index)
info.index = index; info.index = index;
/* 创建 serial 线程 */ /* 创建 serial 线程 */
rt_thread_t thread = rt_thread_create("SendFile", upSendFile_thread_entry, (void *) &info, 1024 * 3, 27, 10); rt_thread_t thread = rt_thread_create("SendFile", upSendFile_thread_entry, (void *) &info, 1024 * 5, 27, 10);
/* 创建成功则启动线程 */ /* 创建成功则启动线程 */
if (thread != RT_NULL) if (thread != RT_NULL)
{ {
@ -500,15 +507,14 @@ void getAndSendFile()
if (getFileSize(fnow)) {//有数据才发 if (getFileSize(fnow)) {//有数据才发
updateCacheFileName(); updateCacheFileName();
LOG_I("send latest data first"); LOG_I("send latest data first");
// rt_sem_release(okTosend);//初始赋值 rt_mutex_take(okTosend, RT_WAITING_FOREVER);
upSendFile(fnow,0); upSendFile(fnow,0);
rt_thread_mdelay(10*1000); // rt_mutex_release(okTosend);//由upSendFile释放
} }
static int index[MAX_KEY_LEN];
static char f[5][MAX_KEY_LEN]; uint8_t cnt = (uint8_t)getCntOfFileToSend();
int cnt = getFilesToSend(f, index);
if(cnt) if(cnt)
{ {
LOG_I("ready to send %d file(s).",cnt); LOG_I("ready to send %d file(s).",cnt);
@ -519,25 +525,21 @@ void getAndSendFile()
return; return;
} }
rt_sem_release(okTosend);//初始赋值 // rt_sem_release(okTosend);//初始赋值
while(cnt) static int index[MAX_KEY_LEN];
char f[cnt][MAX_KEY_LEN];
getFilesToSend(f, index);
for (int i = cnt-1; i > -1; i--)//倒序发送
{ {
int i=0; // LOG_D("f[%d]=%s",i,f[i]);
for (i = cnt-1; i > -1; i--)//倒序发送 // continue;
{ if (rt_mutex_take(okTosend, RT_WAITING_FOREVER) == RT_EOK) {
if (rt_sem_take(okTosend, RT_WAITING_FOREVER) == RT_EOK) {
rt_thread_mdelay(1000);//thread close rt_thread_mdelay(1000);//thread close
upSendFile(f[i],index[i]); upSendFile(f[i],index[i]);
} }
} }
rt_thread_mdelay(3000);
if (rt_sem_take(okTosend, RT_WAITING_FOREVER) == RT_EOK) {//等待上一轮最后一个文件发送完毕
cnt = getFilesToSend(f, index);
}
}
//发送完毕 //发送完毕
// rt_sem_take(sem, timeout)
LOG_D("mission done."); LOG_D("mission done.");
resetTM(); resetTM();
} }
@ -547,7 +549,7 @@ static void chkAndSendFile_thread_entry()
while (1) while (1)
{ {
// int e; // int e;
LOG_I("等待发送条件(文件就绪或定时%d分钟超时",scfg.sendInterval); LOG_I("ready and waiting",scfg.sendInterval);
if (rt_event_recv(&chkSta, FILE_IS_OK | TIMER_IS_OUT, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, if (rt_event_recv(&chkSta, FILE_IS_OK | TIMER_IS_OUT, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
RT_WAITING_FOREVER, RT_NULL) == RT_EOK) //条件1满足 RT_WAITING_FOREVER, RT_NULL) == RT_EOK) //条件1满足
{ {