/* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2023-05-29 murmur the first version */ //#include "../packages/minIni-v1.2.0/dev/minIni.h" #include "minIni.h" #ifdef PKG_USING_MININI #define LJW_CFG_FILE_NAME "/cfg.ini" #define FILE_TO_SEND "/sd/tosend.ini"//避免读写出错造成系统配置文件丢失 #define LOG_TAG "cfg" #define LOG_LVL LOG_LVL_DBG #include #include "cfg.h" static uint8_t islock=0; static void setLock() { while(islock) { rt_thread_mdelay(1000); } islock=1; } static void clearLock() { islock=0; } extern rt_sem_t cfgUpdate; static struct rt_messagequeue upfilelist; typedef struct { char msg[60]; uint8_t index; }FILE_INFO; static uint8_t msg_pool[512] ; void addToList_thread_entry(void *parameter); static void iniUFMsg(void) { /* 初始化消息队列 */ rt_mq_init(&upfilelist, "uplist", msg_pool, /* 存放消息的缓冲区 */ sizeof(FILE_INFO), /* 一条消息的最大长度 */ sizeof(msg_pool), /* 存放消息的缓冲区大小 */ RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ /* 创建 serial 线程 */ rt_thread_t thread = rt_thread_create("filelist", addToList_thread_entry, RT_NULL, 1024*3, 30-2, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); } else { LOG_E("thread 'updatelist' create failure."); } } /* 导出到自动初始化 */ INIT_APP_EXPORT(iniUFMsg); /** * 设置config项 * @param s * @param k * @param v * @return */ int set_cfg(const char *k, const char*v) { setLock(); if (rt_strcmp(v,"NULL") == 0) {//delete key v = NULL; } int rst = ini_puts("config",k,v,LJW_CFG_FILE_NAME); if (rst == 1) { LOG_I("set value success."); //以下消息队列通知各线程更新参数 rt_sem_release(cfgUpdate); } else { LOG_E("set value fault."); } clearLock(); return rst; } int get_cfg(const char *k) { setLock(); // char buf[MAX_KEY_LEN]; // int rst = ini_gets("config",k,"000000",buf,MAX_KEY_LEN,LJW_CFG_FILE_NAME); // if(strcmp(buf, "000000") == 0) { // // 采用默认值 int rst = ini_getl("config", k, -1, LJW_CFG_FILE_NAME); if (rst == -1) { LOG_W("no such KEY:%s",k); clearLock(); return -RT_ERROR; } else { // LOG_I("%s = %s",k,buf); // LOG_I("%s = %d",k,rst); } clearLock(); return rst; } static void get_cfg_all(void) { char buf[MAX_KEY_LEN]; char kstr[MAX_KEY_LEN]; LOG_I("%23s","---CONFIG---"); for (size_t k = 0; ini_getkey("config", k, kstr, MAX_KEY_LEN, LJW_CFG_FILE_NAME) > 0; k++) { int rst = ini_gets("config",kstr,"000000",buf,MAX_KEY_LEN,LJW_CFG_FILE_NAME); LOG_I("%16s = %s",kstr,buf); } } static void cfg(int argc, char ** argv) { if (argc == 1) {//无键无值,遍历 get_cfg_all(); } if (argc == 2) {//有键无值,查询 get_cfg(argv[1]); } if (argc == 3) {//有键有值,设置 set_cfg(argv[1], argv[2]); } } static void get_sta_all(void) { char buf[MAX_KEY_LEN]; char kstr[MAX_KEY_LEN]; LOG_I("%23s","---STATS---"); for (size_t k = 0; ini_getkey("stats", k, kstr, MAX_KEY_LEN, LJW_CFG_FILE_NAME) > 0; k++) { int rst = ini_gets("stats",kstr,"000000",buf,MAX_KEY_LEN,LJW_CFG_FILE_NAME); LOG_I("%16s = %s",kstr,buf); } } MSH_CMD_EXPORT(cfg, config params. 配置系统参数,支持参数) //以下针对stats /** * 读取stats节信息 * @param k * return 成功返回值,错误返回RT_ERROR */ long get_val(const char *k) { setLock(); long v= ini_getl("stats", k, -1, LJW_CFG_FILE_NAME); if( v == -1) { LOG_W("no such KEY:%s",k); clearLock(); return -RT_ERROR; } else { clearLock(); return v; } } int set_val(const char *k, long v) { setLock(); if(!ini_putl("stats",k,v,LJW_CFG_FILE_NAME)) { LOG_E("write %s error.",k); clearLock(); return -RT_ERROR; } clearLock(); return RT_EOK; } /** * 更新统计值,每次自加1 * @param k * @return */ int add_val(const char *k) { // setLock(); long ori = get_val(k); rt_thread_mdelay(100); if (ori != -1) { int ret = set_val(k, ori+1); rt_thread_mdelay(100); return ret; } else { return ori; } // clearLock(); } static void get_sta(const char *k) { long v = get_val(k); if (!v) { LOG_I("%s = %d",k,v); } } static void sta(int argc, char ** argv) { if (argc == 1) { //无键无值,遍历 get_sta_all(); } if (argc == 2) { //有键无值,查询 get_sta(argv[1]); } if (argc == 3) { LOG_W("READ ONLY."); } } MSH_CMD_EXPORT(sta, 查询系统统计数据) static void clear_sta(void) { char buf[16]; char kstr[16]; for (size_t k = 0; ini_getkey("stats", k, kstr, 16, LJW_CFG_FILE_NAME) > 0; k++) { if (rt_strcmp("swCnt",kstr) != 0) { set_val(kstr, NULL); } } } MSH_CMD_EXPORT_ALIAS(clear_sta,clsSta, 重置系统统计数据) static uint8_t nislock=0; static void nsetLock() { while(nislock) { rt_thread_mdelay(1000); } nislock=1; } static void nclearLock() { nislock=0; } /** * 添加文件到待发列表,指定待发包 * @param f * @param v * @return */ int setFileToSend(const char *f, int v) { nsetLock(); int rst = ini_putl(SECTION_TO_SEND, f, v, FILE_TO_SEND); if (!rst) { LOG_E("add file to send error."); clearLock(); return RT_ERROR; } nclearLock(); return RT_EOK; } /** * 获取待发送文件列表 * @param kstr 文件名 * @param v 对应包,默认为0即全发 * @return 文件个数 */ int getFilesToSend(char (*kstr)[MAX_KEY_LEN], int *v) { // char buf[MAX_KEY_LEN]; // char kstr[MAX_KEY_LEN]; nsetLock(); size_t len=0; for (size_t k = 0; ini_getkey(SECTION_TO_SEND, k, kstr[len], MAX_KEY_LEN, FILE_TO_SEND) > 0; k++) { v[len] = ini_getl(SECTION_TO_SEND, kstr[len], -1, FILE_TO_SEND); len +=1; } nclearLock(); return len; } /** * 清空待发送文件记录 */ int clearFileToSend(const char *k) { nsetLock(); int rst = ini_puts(SECTION_TO_SEND, k, NULL, FILE_TO_SEND); if (!rst) { LOG_E("clear file to send error."); } nclearLock(); return rst; } static void gf() { int v[MAX_KEY_LEN]; char kstr[10][MAX_KEY_LEN]; size_t cnt = getFilesToSend(kstr, v); for (size_t var = 0; var < cnt; ++var) { LOG_I("%s -- %d", kstr[var], v[var]); } } static void add(int argc, char **argv) { setFileToSend(argv[1],atoi(argv[2])); gf(); clearFileToSend(argv[1]); gf(); } void addToList_thread_entry(void *parameter) { FILE_INFO msg; while(1) { rt_memset(&msg, 0, sizeof(msg)); if (rt_mq_recv(&upfilelist, &msg, sizeof(msg), RT_WAITING_FOREVER) == RT_EOK) { LOG_D("get %s",msg.msg); setFileToSend(msg.msg,msg.index); } } } void postFileInfo(const char *fin, uint8_t index) { // setFileToSend(fin,0); FILE_INFO msg; strcpy(msg.msg,fin); msg.index=index; rt_mq_send(&upfilelist, &msg, sizeof(msg)); } int updateLstFile(const char *fin) { nsetLock(); int rst = ini_puts(SECTION_LST_FILE, "lst", fin, FILE_TO_SEND); if (!rst) { LOG_E("update lst file error."); nclearLock(); return RT_ERROR; } nclearLock(); return RT_EOK; } /** * 获取最后缓存文件 * @param k * @return */ int getLstFile(const char *k) { nsetLock(); char tmp[60]; int rst = ini_gets(SECTION_LST_FILE, "lst", "000",tmp,60, FILE_TO_SEND); if (rst == 3) { rst=0; } strcpy(k,tmp); nclearLock(); return rst; } MSH_CMD_EXPORT(gf, 查看待发送文件列表) MSH_CMD_EXPORT_ALIAS(add, cf,查看待发送文件列表) //set_if() #endif