TT12-MCU/applications/cfg.c
CSSC-WORK\murmur a436e04622 更新mem和malloc相关函数为rt_,确保内存使用对齐
修复TTIsReady 等函数bug, 解决TIMEOUT关闭无法关机的问题
屏蔽rtc更新的相关代码,避免死机
添加 RS_485.c,实现电量读取
cfg参数调整为5分钟关机,1分钟上报位置。测试ok,等待外场挂机测试。
2023-08-31 16:12:44 +08:00

466 lines
9.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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"
#include "cfg.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 <ulog.h>
volatile static uint8_t islock=0;
static void setLock()
{
while(islock)
{
rt_thread_mdelay(1000);
LOG_W("------file locked");
}
islock=1;
}
static void clearLock()
{
islock=0;
}
extern rt_sem_t cfgUpdate;
int get_cfg(const char *k);
typedef struct
{
char fname[60];
uint8_t index;
}FILE_INFO;
/**
* 设置config项
* @param s
* @param k
* @param v
* @return
*/
int set_cfg(const char *k, long v)
{
int rst = 0;
if (v == get_cfg(k)) {
// LOG_D("nothing needs to change.");
rst = 1;
}
else {
setLock();
// int rst = ini_puts("config",k,v,LJW_CFG_FILE_NAME);
rst = ini_putl("config", k, v, LJW_CFG_FILE_NAME);
clearLock();
}
if (rst == 1) {
// LOG_I("set value success.");
}
else {
LOG_E("set %s value fault.",k);
}
return rst;
}
int set_cfgs(const char *k, const char * v)
{
int rst=0;
if (strcmp(v,"NULL") == 0) {//delete key
v = NULL;
}
char tmp[30];
get_cfgs(k,tmp);
// LOG_D("v=%s-----%s",v,tmp);
if (strcmp(v,tmp) == 0) {
// LOG_D("nothing needs to change.");
rst = 1;
}
else {
setLock();
rst = ini_puts("config",k,v,LJW_CFG_FILE_NAME);
clearLock();
}
// int rst = ini_putl("config", k, v, LJW_CFG_FILE_NAME);
if (rst == 1) {
// LOG_I("set value success.");
}
else {
LOG_E("set %s value fault.",k);
}
return rst;
}
/**
* 返回指定键的值
* @param k
* @return
*/
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;
}
int get_cfgs(const char *k, char *str)
{
// 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);
strcpy(str,buf);
}
// 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_cfgs(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);
}
}
//以下针对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.");
}
}
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, )
volatile size_t nislock=0;
static void nsetLock()
{
// LOG_D("--%d--",nislock);
size_t cnt=10;
while(nislock)
{
rt_thread_mdelay(1000);
LOG_W("file is locked.");
cnt += 1;
if (cnt>10) {
break;
}
}
nislock=1;
}
static void nclearLock()
{
nislock=0;
LOG_W("file is unlocked.");
}
static int setFileToSend_thread_entry(void *parameter)
{
FILE_INFO *msg;
msg=(FILE_INFO * )parameter;
nsetLock();
int rst = ini_putl(SECTION_TO_SEND, msg->fname, msg->index, FILE_TO_SEND);
nclearLock();
if (!rst) {
LOG_E("add file to send error.");
}
LOG_D("add %s-%d to list.",msg->fname,msg->index);
fileIsReady();
// list_thread();
// return RT_EOK;
}
/**
* 添加待发文件到列表
* @param fin
* @param index
*/
void postFileInfo(const char *fin, uint8_t index)
{
static FILE_INFO msg;
strcpy(msg.fname,fin);
msg.index=index;
/* 创建 serial 线程 */
rt_thread_t thread = rt_thread_create("filelist", setFileToSend_thread_entry, (void *)&msg, 1024*5, 30-2, 10);
/* 创建成功则启动线程 */
if (thread != RT_NULL)
{
rt_thread_startup(thread);
}
else
{
LOG_E("thread 'updatelist' create failure.");
}
}
/**
* 获取待发送文件列表未减小内存占用暂每次只读取5个
* @param kstr 待发包文件名,二维数组
* @param v 对应包文件的索引默认为0即全发
* @return 待发文件个数
*/
size_t 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;
if (len>5) {
break;
}
}
// 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);
if (!cnt) {
LOG_D("no files waiting to be sent");
}
else
{
for (size_t var = 0; var < cnt; var++)
{
LOG_I("%s -- %d", kstr[var], v[var]);
}
// cnt = getFilesToSend(kstr, v);
}
}
static void add(int argc, char **argv)
{
postFileInfo(argv[1],atoi(argv[2]));
gf();
// clearFileToSend(argv[1]);
// gf();
}
/**
* 更新最后缓存的文件
* @param k
* @return
*/
int updateLstFile(const char *fin)
{
nsetLock();
int rst = ini_puts(SECTION_LST_FILE, "lst", fin, FILE_TO_SEND);
nclearLock();
if (!rst) {
LOG_E("update lst file error.");
return RT_ERROR;
}
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 (strcmp(tmp,"000") == 0) {
rst=0;
}
strcpy(k,tmp);
// nclearLock();
return rst;
}
MSH_CMD_EXPORT(gf, )
MSH_CMD_EXPORT_ALIAS(add, cf,)
MSH_CMD_EXPORT(sta, )
MSH_CMD_EXPORT(cfg, config params. )
//set_if()
#endif