TT12-MCU/applications/cfg.c
2023-06-02 14:37:58 +08:00

277 lines
5.7 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"
#ifdef PKG_USING_MININI
#define LJW_CFG_FILE_NAME "/cfg/cfg.ini"
#define LOG_TAG "cfg"
#define LOG_LVL LOG_LVL_DBG
#include <ulog.h>
#include "cfg.h"
//extern struct rt_messagequeue update_cfg;//main线程
struct rt_event update_cfg;
void iniEvent(void)
{
/* 事 件 控 制 块 */
rt_err_t result = rt_event_init(&update_cfg, "update_cfg", RT_IPC_FLAG_FIFO);
if (result != RT_EOK)
{
LOG_E("init event failed.\n");
// return -1;
}
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(iniEvent);
/**
* 设置config项
* @param s
* @param k
* @param v
* @return
*/
int set_cfg(const char *k, const char*v)
{
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.");
//以下消息队列通知各线程更新参数
// CFG_MSG msg;
rt_err_t result;
rt_event_send(&update_cfg, CFGCHANGEED|COMPRESSTYPE);
rt_event_send(&update_cfg, CFGCHANGEED|MAXSIZEPERFILE);
}
else {
LOG_E("set value fault.");
}
return rst;
}
int get_cfg(const char *k)
{
// 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);
return -RT_ERROR;
}
else {
// LOG_I("%s = %s",k,buf);
LOG_I("%s = %d",k,rst);
}
return rst;
}
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);
}
}
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
/**
*
* @param k
* return 成功返回值错误返回RT_ERROR
*/
long get_val(const char *k)
{
long v= ini_getl("stats", k, -1, LJW_CFG_FILE_NAME);
if( v == -1)
{
LOG_W("no such KEY:%s",k);
return -RT_ERROR;
}
else {
return v;
}
}
int set_val(const char *k, long v)
{
if(!ini_putl("stats",k,v,LJW_CFG_FILE_NAME))
{
LOG_E("write %s error.",k);
return -RT_ERROR;
}
return RT_EOK;
}
/**
* 更新统计值每次自加1
* @param k
* @return
*/
int add_val(const char *k)
{
long ori = get_val(k);
if (ori != -1) {
return set_val(k, ori+1);
}
else {
return ori;
}
}
static void get_sta(const char *k)
{
long v = get_val(k);
if (!v) {
LOG_I("%s = %d",k,v);
}
}
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, )
/**
* 添加文件到待发列表,指定待发包
* @param f
* @param v
* @return
*/
int setFileToSend(const char *f, int v)
{
int rst = ini_putl(SECTION_TO_SEND, f, v, LJW_CFG_FILE_NAME);
if (!rst) {
LOG_E("add file to send error.");
}
return rst;
}
/**
* 获取待发送文件列表
* @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];
size_t len=0;
for (size_t k = 0; ini_getkey(SECTION_TO_SEND, k, kstr[len], MAX_KEY_LEN, LJW_CFG_FILE_NAME) > 0; k++) {
v[len] = ini_getl(SECTION_TO_SEND, kstr[len], -1, LJW_CFG_FILE_NAME);
len +=1;
}
return len;
}
/**
* 清空待发送文件记录
*/
int clearFileToSend(const char *k)
{
int rst = ini_puts(SECTION_TO_SEND, k, NULL, LJW_CFG_FILE_NAME);
if (!rst) {
LOG_E("clear file to send error.");
}
return rst;
}
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]);
}
}
void add(int argc, char **argv)
{
setFileToSend(argv[1],atoi(argv[2]));
gf();
clearFileToSend(argv[1]);
gf();
}
MSH_CMD_EXPORT(gf, )
MSH_CMD_EXPORT_ALIAS(add, cf,)
//set_if()
#endif