| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667 |
- #include <stdlib.h>
- #include <stdio.h>
- #include "sys.h"
- #include "file.h"
- #include "lock.h"
- #include "paras.h"
- #include "cascade.h"
- #include "dictionary.h"
- #include "iniparser.h"
- #if 1
- #define LOGD log_d
- #define LOGE log_e
- #define LOGW log_w
- #else
- #define LOGD printf
- #define LOGE printf
- #define LOGW printf
- #endif
- enum {
- INI_READ=0,
- INI_WRITE,
- };
- extern GlobalDeviceInfo DFLT_PARAS;
- typedef struct {
- dictionary *dic;
- GlobalDeviceInfo *info;
- char path[200];
- }paras_handle_t;
- static paras_handle_t paraHandle={0};
- #if 1
- static int ini_rw_dev(dictionary *dic, int rw, GlobalDeviceInfo *info)
- {
- int r=-1,ok=1;
- char *p=NULL;
- char temp[100];
- char *token=NULL;
- if(info->product.language>=4) {
- LOGE("___ product.language %d is wrong\n", info->product.language);
- ok = 0;
- }
- if(info->product.type>=2) {
- LOGE("___ product.type %d is wrong\n", info->product.type);
- ok = 0;
- }
- if(info->product.pwr_type>SmartPDU_Tree_AC_One_B) {
- LOGE("___ product.pwr_type %d is wrong\n", info->product.pwr_type);
- ok = 0;
- }
- if(!ok) {
- return -1;
- }
- token = "product:id";
- if(rw==INI_READ) {
- r = iniparser_getint(dic, token, -1);
- if(r==-1) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- info->product.id = r;
- }
- else {
- sprintf(temp, "%d", info->product.id);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- token = "product:number";
- if(rw==INI_READ) {
- p = (char*)iniparser_getstring(dic, token, NULL);
- if(!p) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- strcpy(info->product.number, p);
- }
- else {
- r = iniparser_set(dic, token, info->product.number);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
-
- token = "product:name";
- if(rw==INI_READ) {
- p = (char*)iniparser_getstring(dic, token, NULL);
- if(!p) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- strcpy(info->product.name, p);
- }
- else {
- r = iniparser_set(dic, token, info->product.name);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
-
- token = "product:type";
- if(rw==INI_READ) {
- r = iniparser_getint(dic, token, -1);
- if(r==-1) {
- LOGE("___ iniparser_getint %s failed\n", token);
- return -1;
- }
- info->product.type = r;
- }
- else {
- sprintf(temp, "%d", info->product.type);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- token = "product:pwrtype";
- if(rw==INI_READ) {
- r = iniparser_getint(dic, token, -1);
- if(r==-1) {
- LOGE("___ iniparser_getint %s failed\n", token);
- return -1;
- }
- info->product.pwr_type = r;
- }
- else {
- sprintf(temp, "%d", info->product.pwr_type);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- #if 0
- token = "product:version";
- if(rw==INI_READ) {
- p = (char*)iniparser_getstring(dic, token, NULL);
- if(!p) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- strcpy(info->product.version, p);
- }
- else {
- r = iniparser_set(dic, token, info->product.version);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- #endif
- token = "product:language";
- if(rw==INI_READ) {
- r = iniparser_getint(dic, token, -1);
- if(r==-1) {
- LOGE("___ iniparser_getint %s failed\n", token);
- return -1;
- }
- info->product.language = r;
- }
- else {
- sprintf(temp, "%d", info->product.language);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- token = "product:samptime";
- if(rw==INI_READ) {
- p = (char*)iniparser_getstring(dic, token, NULL);
- if(!p) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- info->product.samp_time = atoi(p);
- }
- else {
- sprintf(temp, "%d", info->product.samp_time);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- token = "product:savetime";
- if(rw==INI_READ) {
- p = (char*)iniparser_getstring(dic, token, NULL);
- if(!p) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- info->product.save_time = atoi(p);
- }
- else {
- sprintf(temp, "%d", info->product.save_time);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- token = "product:ph_group";
- if(rw==INI_READ) {
- p = (char*)iniparser_getstring(dic, token, NULL);
- if(!p) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- info->product.ph_group = atoi(p);
- }
- else {
- sprintf(temp, "%d", info->product.ph_group);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- token = "product:ch_delay";
- if(rw==INI_READ) {
- p = (char*)iniparser_getstring(dic, token, NULL);
- if(!p) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- info->product.ch_delay = atoi(p);
- }
- else {
- sprintf(temp, "%d", info->product.ch_delay);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- if(rw==INI_READ) {
- info->product.count = 0;
- info->product.status[0] = 0;
- }
-
- return 0;
- }
- static int ini_rw_modbus(dictionary *dic, int rw, GlobalDeviceInfo *info)
- {
- int r=-1;
- char temp[100];
- char *token=NULL;
- ModbusInfo_t *mb=&info->cascade;
- if(rw==INI_WRITE) {
- if(mb->mode!=0 && mb->mode!=1) {
- LOGE("___ set modbus, mode %d is invalid\n", mb->mode);
- return -1;
- }
- if(mb->mode==1 && (mb->addr==0 || mb->addr>CASCADE_MAX)) { //slave
- LOGE("___ set modbus, slave addr %d is invalid\n", mb->addr);
- }
- }
- token = "modbus:mode";
- if(rw==INI_READ) {
- r = iniparser_getint(dic, token, -1);
- if(r==-1) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- mb->mode = r;
- }
- else {
- sprintf(temp, "%d", mb->mode);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- token = "modbus:address";
- if(rw==INI_READ) {
- r = iniparser_getint(dic, token, -1);
- if(r==-1) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- mb->addr = r;
- }
- else {
- sprintf(temp, "%d", mb->addr);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- token = "modbus:baudrate";
- if(rw==INI_READ) {
- r = iniparser_getint(dic, token, -1);
- if(r==-1) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- mb->baudrate = r;
- }
- else {
- sprintf(temp, "%d", mb->baudrate);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- return 0;
- }
- static int ini_rw_ptotal(dictionary *dic, int rw, PowerTotal_t *ptotal)
- {
- int r=-1;
- char temp[100];
- char *token=NULL;
- if(rw==INI_WRITE) {
- if(ptotal->voltage<=0 || ptotal->current<=0 || ptotal->power<=0 || ptotal->brdMax<=0) {
- LOGE("___ set ptotal, paras is invalid\n");
- return -1;
- }
- }
- token = "ptotal:voltage";
- if(rw==INI_READ) {
- r = iniparser_getint(dic, token, -1);
- if(r==-1) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- ptotal->voltage = r;
- }
- else {
- sprintf(temp, "%d", ptotal->voltage);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- token = "ptotal:current";
- if(rw==INI_READ) {
- r = iniparser_getint(dic, token, -1);
- if(r==-1) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- ptotal->current = r;
- }
- else {
- sprintf(temp, "%d", ptotal->current);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- token = "ptotal:power";
- if(rw==INI_READ) {
- r = iniparser_getint(dic, token, -1);
- if(r==-1) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- ptotal->power = r;
- }
- else {
- sprintf(temp, "%d", ptotal->power);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- token = "ptotal:brd_max";
- if(rw==INI_READ) {
- r = iniparser_getint(dic, token, -1);
- if(r==-1) {
- LOGE("___ iniparser_getstring %s failed\n", token);
- return -1;
- }
- ptotal->brdMax = r;
- }
- else {
- sprintf(temp, "%d", ptotal->brdMax);
- r = iniparser_set(dic, token, temp);
- if(r) {
- LOGE("___ iniparser_set %s failed\n", token);
- return -1;
- }
- }
- return 0;
- }
- static dictionary* ini_load(char *path, GlobalDeviceInfo *info)
- {
- int r=-1;
- char temp[200];
-
- dictionary *dic=iniparser_load(path);
- if(dic == NULL){
- return NULL;
- }
-
- r = ini_rw_dev(dic, INI_READ, info);
- if(r) {
- LOGE("___ini_r_dev failed\n");
- iniparser_freedict(dic);
- return NULL;
- }
- r = ini_rw_modbus(dic, INI_READ, info);
- if(r) {
- LOGE("___ini_r_modbus failed\n");
- iniparser_freedict(dic);
- return NULL;
- }
- r = ini_rw_ptotal(dic, INI_READ, &info->ptotal);
- if(r) {
- LOGE("___ini_r_modbus failed\n");
- iniparser_freedict(dic);
- return NULL;
- }
- return dic;
- }
- static int ini_check(char *path)
- {
- GlobalDeviceInfo info=DFLT_PARAS;
- dictionary *dic=ini_load(path, &info);
- if(!dic) {
- return -1;
- }
- iniparser_freedict(dic);
- return 0;
- }
- static int ini_reset(paras_handle_t *h)
- {
- int r;
- FILE *fp=NULL;
- char tmp[200];
- GlobalDeviceInfo *info=&DFLT_PARAS;
- fp = fopen(h->path, "w");
- if (fp==NULL) {
- LOGE("ini_reset, fopen %s failed\n", h->path);
- return -1;
- }
- fprintf(fp, "[product]\n");
- fprintf(fp, "id = \"%d\"\n", info->product.id);
- fprintf(fp, "number = \"%s\"\n", info->product.number);
- fprintf(fp, "name = \"%s\"\n", info->product.name);
- fprintf(fp, "type = \"%d\"\n", info->product.type);
- fprintf(fp, "pwrtype = \"%d\"\n", info->product.pwr_type);
- //fprintf(fp, "version = %s\\"n", info->product.version);
- fprintf(fp, "language = \"%d\"\n", info->product.language);
- fprintf(fp, "samptime = \"%d\"\n", info->product.samp_time);
- fprintf(fp, "savetime = \"%d\"\n", info->product.save_time);
- fprintf(fp, "ph_group = \"%d\"\n", info->product.ph_group);
- fprintf(fp, "ch_delay = \"%d\"\n", info->product.ch_delay);
- fprintf(fp, "\n");
- fprintf(fp, "[modbus]\n");
- fprintf(fp, "mode = \"%d\"\n", info->cascade.mode);
- fprintf(fp, "address = \"%d\"\n", info->cascade.addr);
- fprintf(fp, "baudrate = \"%d\"\n", info->cascade.baudrate);
- fprintf(fp, "\n");
- fprintf(fp, "[ptotal]\n");
- fprintf(fp, "voltage = \"%d\"\n", info->ptotal.voltage);
- fprintf(fp, "current = \"%d\"\n", info->ptotal.current);
- fprintf(fp, "power = \"%d\"\n", info->ptotal.power);
- fprintf(fp, "brd_max = \"%d\"\n", info->ptotal.brdMax);
- fprintf(fp, "\n");
- fclose(fp);
- sys_get_path(tmp, INI_FILE_BAK_NAME);
- file_copy(tmp, h->path);
- if(h->dic) {
- iniparser_freedict(h->dic);
- }
- h->dic = ini_load(h->path, h->info);
- return 0;
- }
- static int ini_free(paras_handle_t *h)
- {
- iniparser_freedict(h->dic);
- return 0;
- }
- static int ini_save(paras_handle_t *h)
- {
- int r=-1;
-
- r = ini_rw_dev(h->dic, INI_WRITE, h->info);
- if(r) {
- LOGE("___ini_w_dev failed\n");
- return -1;
- }
- r = ini_rw_modbus(h->dic, INI_WRITE, h->info);
- if(r) {
- LOGE("___ini_w_modbus failed\n");
- return -1;
- }
- FILE *fp=fopen(h->path, "w");
- if(!fp) {
- LOGE("___%s open failed\n", h->path);
- return -1;
- }
- iniparser_dump_ini(h->dic, fp);
- fclose(fp);
- return 0;
- }
- #endif
- static GlobalDeviceInfo *get_info(void)
- {
- return &__globalDeviceManage._globalDevInfo;
- }
- ////////////////////////////////////////////////////////////
- int paras_init(void)
- {
- int r=0;
- paras_handle_t *h=¶Handle;
-
- lock_s_hold(LOCK_ID_PARAS);
- memset(¶Handle, 0, sizeof(paraHandle));
- h->info = get_info();
- sys_get_path(h->path, INI_FILE_NAME);
- h->dic = ini_load(h->path, h->info);
- if(h->dic==NULL) {
- r = ini_reset(h);
- }
- lock_s_release(LOCK_ID_PARAS);
-
- return r;
- }
- int paras_deinit(void)
- {
- int r=0;
- paras_handle_t *h=¶Handle;
-
- lock_s_hold(LOCK_ID_PARAS);
- r = ini_free(h);
- lock_s_release(LOCK_ID_PARAS);
-
- return 0;
- }
- int paras_check(char *path)
- {
- int r=0;
-
- lock_s_hold(LOCK_ID_PARAS);
- r = ini_check(path);
- lock_s_release(LOCK_ID_PARAS);
-
- return r;
- }
- int paras_load(char *path)
- {
- int r=-1;
- paras_handle_t *h=¶Handle;
-
- lock_s_hold(LOCK_ID_PARAS);
- ini_free(h);
- h->dic = ini_load(path, h->info);
- if(h->dic) r = 0;
- lock_s_release(LOCK_ID_PARAS);
-
- return r;
- }
- int paras_reset(void)
- {
- int r=0;
- paras_handle_t *h=¶Handle;
-
- lock_s_hold(LOCK_ID_PARAS);
- ini_reset(h);
- lock_s_release(LOCK_ID_PARAS);
-
- return r;
- }
- int paras_copy(char *dst, char *src)
- {
- int r=-1;
- lock_s_hold(LOCK_ID_PARAS);
- r = file_copy(dst, src);
- lock_s_release(LOCK_ID_PARAS);
- return r;
- }
- int paras_save(void)
- {
- int r=0;
- paras_handle_t *h=¶Handle;
-
- lock_s_hold(LOCK_ID_PARAS);
- r = ini_save(h);
- lock_s_release(LOCK_ID_PARAS);
-
- return r;
- }
|