paras.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "sys.h"
  4. #include "file.h"
  5. #include "lock.h"
  6. #include "paras.h"
  7. #include "cascade.h"
  8. #include "dictionary.h"
  9. #include "iniparser.h"
  10. #if 1
  11. #define LOGD log_d
  12. #define LOGE log_e
  13. #define LOGW log_w
  14. #else
  15. #define LOGD printf
  16. #define LOGE printf
  17. #define LOGW printf
  18. #endif
  19. enum {
  20. INI_READ=0,
  21. INI_WRITE,
  22. };
  23. extern GlobalDeviceInfo DFLT_PARAS;
  24. typedef struct {
  25. dictionary *dic;
  26. GlobalDeviceInfo *info;
  27. char path[200];
  28. }paras_handle_t;
  29. static paras_handle_t paraHandle={0};
  30. #if 1
  31. static int ini_rw_dev(dictionary *dic, int rw, GlobalDeviceInfo *info)
  32. {
  33. int r=-1,ok=1;
  34. char *p=NULL;
  35. char temp[100];
  36. char *token=NULL;
  37. if(info->product.language>=4) {
  38. LOGE("___ product.language %d is wrong\n", info->product.language);
  39. ok = 0;
  40. }
  41. if(info->product.type>=2) {
  42. LOGE("___ product.type %d is wrong\n", info->product.type);
  43. ok = 0;
  44. }
  45. if(info->product.pwr_type>SmartPDU_Tree_AC_One_B) {
  46. LOGE("___ product.pwr_type %d is wrong\n", info->product.pwr_type);
  47. ok = 0;
  48. }
  49. if(!ok) {
  50. return -1;
  51. }
  52. token = "product:id";
  53. if(rw==INI_READ) {
  54. r = iniparser_getint(dic, token, -1);
  55. if(r==-1) {
  56. LOGE("___ iniparser_getstring %s failed\n", token);
  57. return -1;
  58. }
  59. info->product.id = r;
  60. }
  61. else {
  62. sprintf(temp, "%d", info->product.id);
  63. r = iniparser_set(dic, token, temp);
  64. if(r) {
  65. LOGE("___ iniparser_set %s failed\n", token);
  66. return -1;
  67. }
  68. }
  69. token = "product:number";
  70. if(rw==INI_READ) {
  71. p = (char*)iniparser_getstring(dic, token, NULL);
  72. if(!p) {
  73. LOGE("___ iniparser_getstring %s failed\n", token);
  74. return -1;
  75. }
  76. strcpy(info->product.number, p);
  77. }
  78. else {
  79. r = iniparser_set(dic, token, info->product.number);
  80. if(r) {
  81. LOGE("___ iniparser_set %s failed\n", token);
  82. return -1;
  83. }
  84. }
  85. token = "product:name";
  86. if(rw==INI_READ) {
  87. p = (char*)iniparser_getstring(dic, token, NULL);
  88. if(!p) {
  89. LOGE("___ iniparser_getstring %s failed\n", token);
  90. return -1;
  91. }
  92. strcpy(info->product.name, p);
  93. }
  94. else {
  95. r = iniparser_set(dic, token, info->product.name);
  96. if(r) {
  97. LOGE("___ iniparser_set %s failed\n", token);
  98. return -1;
  99. }
  100. }
  101. token = "product:type";
  102. if(rw==INI_READ) {
  103. r = iniparser_getint(dic, token, -1);
  104. if(r==-1) {
  105. LOGE("___ iniparser_getint %s failed\n", token);
  106. return -1;
  107. }
  108. info->product.type = r;
  109. }
  110. else {
  111. sprintf(temp, "%d", info->product.type);
  112. r = iniparser_set(dic, token, temp);
  113. if(r) {
  114. LOGE("___ iniparser_set %s failed\n", token);
  115. return -1;
  116. }
  117. }
  118. token = "product:pwrtype";
  119. if(rw==INI_READ) {
  120. r = iniparser_getint(dic, token, -1);
  121. if(r==-1) {
  122. LOGE("___ iniparser_getint %s failed\n", token);
  123. return -1;
  124. }
  125. info->product.pwr_type = r;
  126. }
  127. else {
  128. sprintf(temp, "%d", info->product.pwr_type);
  129. r = iniparser_set(dic, token, temp);
  130. if(r) {
  131. LOGE("___ iniparser_set %s failed\n", token);
  132. return -1;
  133. }
  134. }
  135. #if 0
  136. token = "product:version";
  137. if(rw==INI_READ) {
  138. p = (char*)iniparser_getstring(dic, token, NULL);
  139. if(!p) {
  140. LOGE("___ iniparser_getstring %s failed\n", token);
  141. return -1;
  142. }
  143. strcpy(info->product.version, p);
  144. }
  145. else {
  146. r = iniparser_set(dic, token, info->product.version);
  147. if(r) {
  148. LOGE("___ iniparser_set %s failed\n", token);
  149. return -1;
  150. }
  151. }
  152. #endif
  153. token = "product:language";
  154. if(rw==INI_READ) {
  155. r = iniparser_getint(dic, token, -1);
  156. if(r==-1) {
  157. LOGE("___ iniparser_getint %s failed\n", token);
  158. return -1;
  159. }
  160. info->product.language = r;
  161. }
  162. else {
  163. sprintf(temp, "%d", info->product.language);
  164. r = iniparser_set(dic, token, temp);
  165. if(r) {
  166. LOGE("___ iniparser_set %s failed\n", token);
  167. return -1;
  168. }
  169. }
  170. token = "product:samptime";
  171. if(rw==INI_READ) {
  172. p = (char*)iniparser_getstring(dic, token, NULL);
  173. if(!p) {
  174. LOGE("___ iniparser_getstring %s failed\n", token);
  175. return -1;
  176. }
  177. info->product.samp_time = atoi(p);
  178. }
  179. else {
  180. sprintf(temp, "%d", info->product.samp_time);
  181. r = iniparser_set(dic, token, temp);
  182. if(r) {
  183. LOGE("___ iniparser_set %s failed\n", token);
  184. return -1;
  185. }
  186. }
  187. token = "product:savetime";
  188. if(rw==INI_READ) {
  189. p = (char*)iniparser_getstring(dic, token, NULL);
  190. if(!p) {
  191. LOGE("___ iniparser_getstring %s failed\n", token);
  192. return -1;
  193. }
  194. info->product.save_time = atoi(p);
  195. }
  196. else {
  197. sprintf(temp, "%d", info->product.save_time);
  198. r = iniparser_set(dic, token, temp);
  199. if(r) {
  200. LOGE("___ iniparser_set %s failed\n", token);
  201. return -1;
  202. }
  203. }
  204. token = "product:ph_group";
  205. if(rw==INI_READ) {
  206. p = (char*)iniparser_getstring(dic, token, NULL);
  207. if(!p) {
  208. LOGE("___ iniparser_getstring %s failed\n", token);
  209. return -1;
  210. }
  211. info->product.ph_group = atoi(p);
  212. }
  213. else {
  214. sprintf(temp, "%d", info->product.ph_group);
  215. r = iniparser_set(dic, token, temp);
  216. if(r) {
  217. LOGE("___ iniparser_set %s failed\n", token);
  218. return -1;
  219. }
  220. }
  221. token = "product:ch_delay";
  222. if(rw==INI_READ) {
  223. p = (char*)iniparser_getstring(dic, token, NULL);
  224. if(!p) {
  225. LOGE("___ iniparser_getstring %s failed\n", token);
  226. return -1;
  227. }
  228. info->product.ch_delay = atoi(p);
  229. }
  230. else {
  231. sprintf(temp, "%d", info->product.ch_delay);
  232. r = iniparser_set(dic, token, temp);
  233. if(r) {
  234. LOGE("___ iniparser_set %s failed\n", token);
  235. return -1;
  236. }
  237. }
  238. if(rw==INI_READ) {
  239. info->product.count = 0;
  240. info->product.status[0] = 0;
  241. }
  242. return 0;
  243. }
  244. static int ini_rw_modbus(dictionary *dic, int rw, GlobalDeviceInfo *info)
  245. {
  246. int r=-1;
  247. char temp[100];
  248. char *token=NULL;
  249. ModbusInfo_t *mb=&info->cascade;
  250. if(rw==INI_WRITE) {
  251. if(mb->mode!=0 && mb->mode!=1) {
  252. LOGE("___ set modbus, mode %d is invalid\n", mb->mode);
  253. return -1;
  254. }
  255. if(mb->mode==1 && (mb->addr==0 || mb->addr>CASCADE_MAX)) { //slave
  256. LOGE("___ set modbus, slave addr %d is invalid\n", mb->addr);
  257. }
  258. }
  259. token = "modbus:mode";
  260. if(rw==INI_READ) {
  261. r = iniparser_getint(dic, token, -1);
  262. if(r==-1) {
  263. LOGE("___ iniparser_getstring %s failed\n", token);
  264. return -1;
  265. }
  266. mb->mode = r;
  267. }
  268. else {
  269. sprintf(temp, "%d", mb->mode);
  270. r = iniparser_set(dic, token, temp);
  271. if(r) {
  272. LOGE("___ iniparser_set %s failed\n", token);
  273. return -1;
  274. }
  275. }
  276. token = "modbus:address";
  277. if(rw==INI_READ) {
  278. r = iniparser_getint(dic, token, -1);
  279. if(r==-1) {
  280. LOGE("___ iniparser_getstring %s failed\n", token);
  281. return -1;
  282. }
  283. mb->addr = r;
  284. }
  285. else {
  286. sprintf(temp, "%d", mb->addr);
  287. r = iniparser_set(dic, token, temp);
  288. if(r) {
  289. LOGE("___ iniparser_set %s failed\n", token);
  290. return -1;
  291. }
  292. }
  293. token = "modbus:baudrate";
  294. if(rw==INI_READ) {
  295. r = iniparser_getint(dic, token, -1);
  296. if(r==-1) {
  297. LOGE("___ iniparser_getstring %s failed\n", token);
  298. return -1;
  299. }
  300. mb->baudrate = r;
  301. }
  302. else {
  303. sprintf(temp, "%d", mb->baudrate);
  304. r = iniparser_set(dic, token, temp);
  305. if(r) {
  306. LOGE("___ iniparser_set %s failed\n", token);
  307. return -1;
  308. }
  309. }
  310. return 0;
  311. }
  312. static int ini_rw_ptotal(dictionary *dic, int rw, PowerTotal_t *ptotal)
  313. {
  314. int r=-1;
  315. char temp[100];
  316. char *token=NULL;
  317. if(rw==INI_WRITE) {
  318. if(ptotal->voltage<=0 || ptotal->current<=0 || ptotal->power<=0 || ptotal->brdMax<=0) {
  319. LOGE("___ set ptotal, paras is invalid\n");
  320. return -1;
  321. }
  322. }
  323. token = "ptotal:voltage";
  324. if(rw==INI_READ) {
  325. r = iniparser_getint(dic, token, -1);
  326. if(r==-1) {
  327. LOGE("___ iniparser_getstring %s failed\n", token);
  328. return -1;
  329. }
  330. ptotal->voltage = r;
  331. }
  332. else {
  333. sprintf(temp, "%d", ptotal->voltage);
  334. r = iniparser_set(dic, token, temp);
  335. if(r) {
  336. LOGE("___ iniparser_set %s failed\n", token);
  337. return -1;
  338. }
  339. }
  340. token = "ptotal:current";
  341. if(rw==INI_READ) {
  342. r = iniparser_getint(dic, token, -1);
  343. if(r==-1) {
  344. LOGE("___ iniparser_getstring %s failed\n", token);
  345. return -1;
  346. }
  347. ptotal->current = r;
  348. }
  349. else {
  350. sprintf(temp, "%d", ptotal->current);
  351. r = iniparser_set(dic, token, temp);
  352. if(r) {
  353. LOGE("___ iniparser_set %s failed\n", token);
  354. return -1;
  355. }
  356. }
  357. token = "ptotal:power";
  358. if(rw==INI_READ) {
  359. r = iniparser_getint(dic, token, -1);
  360. if(r==-1) {
  361. LOGE("___ iniparser_getstring %s failed\n", token);
  362. return -1;
  363. }
  364. ptotal->power = r;
  365. }
  366. else {
  367. sprintf(temp, "%d", ptotal->power);
  368. r = iniparser_set(dic, token, temp);
  369. if(r) {
  370. LOGE("___ iniparser_set %s failed\n", token);
  371. return -1;
  372. }
  373. }
  374. token = "ptotal:brd_max";
  375. if(rw==INI_READ) {
  376. r = iniparser_getint(dic, token, -1);
  377. if(r==-1) {
  378. LOGE("___ iniparser_getstring %s failed\n", token);
  379. return -1;
  380. }
  381. ptotal->brdMax = r;
  382. }
  383. else {
  384. sprintf(temp, "%d", ptotal->brdMax);
  385. r = iniparser_set(dic, token, temp);
  386. if(r) {
  387. LOGE("___ iniparser_set %s failed\n", token);
  388. return -1;
  389. }
  390. }
  391. return 0;
  392. }
  393. static dictionary* ini_load(char *path, GlobalDeviceInfo *info)
  394. {
  395. int r=-1;
  396. char temp[200];
  397. dictionary *dic=iniparser_load(path);
  398. if(dic == NULL){
  399. return NULL;
  400. }
  401. r = ini_rw_dev(dic, INI_READ, info);
  402. if(r) {
  403. LOGE("___ini_r_dev failed\n");
  404. iniparser_freedict(dic);
  405. return NULL;
  406. }
  407. r = ini_rw_modbus(dic, INI_READ, info);
  408. if(r) {
  409. LOGE("___ini_r_modbus failed\n");
  410. iniparser_freedict(dic);
  411. return NULL;
  412. }
  413. r = ini_rw_ptotal(dic, INI_READ, &info->ptotal);
  414. if(r) {
  415. LOGE("___ini_r_modbus failed\n");
  416. iniparser_freedict(dic);
  417. return NULL;
  418. }
  419. return dic;
  420. }
  421. static int ini_check(char *path)
  422. {
  423. GlobalDeviceInfo info=DFLT_PARAS;
  424. dictionary *dic=ini_load(path, &info);
  425. if(!dic) {
  426. return -1;
  427. }
  428. iniparser_freedict(dic);
  429. return 0;
  430. }
  431. static int ini_reset(paras_handle_t *h)
  432. {
  433. int r;
  434. FILE *fp=NULL;
  435. char tmp[200];
  436. GlobalDeviceInfo *info=&DFLT_PARAS;
  437. fp = fopen(h->path, "w");
  438. if (fp==NULL) {
  439. LOGE("ini_reset, fopen %s failed\n", h->path);
  440. return -1;
  441. }
  442. fprintf(fp, "[product]\n");
  443. fprintf(fp, "id = \"%d\"\n", info->product.id);
  444. fprintf(fp, "number = \"%s\"\n", info->product.number);
  445. fprintf(fp, "name = \"%s\"\n", info->product.name);
  446. fprintf(fp, "type = \"%d\"\n", info->product.type);
  447. fprintf(fp, "pwrtype = \"%d\"\n", info->product.pwr_type);
  448. //fprintf(fp, "version = %s\\"n", info->product.version);
  449. fprintf(fp, "language = \"%d\"\n", info->product.language);
  450. fprintf(fp, "samptime = \"%d\"\n", info->product.samp_time);
  451. fprintf(fp, "savetime = \"%d\"\n", info->product.save_time);
  452. fprintf(fp, "ph_group = \"%d\"\n", info->product.ph_group);
  453. fprintf(fp, "ch_delay = \"%d\"\n", info->product.ch_delay);
  454. fprintf(fp, "\n");
  455. fprintf(fp, "[modbus]\n");
  456. fprintf(fp, "mode = \"%d\"\n", info->cascade.mode);
  457. fprintf(fp, "address = \"%d\"\n", info->cascade.addr);
  458. fprintf(fp, "baudrate = \"%d\"\n", info->cascade.baudrate);
  459. fprintf(fp, "\n");
  460. fprintf(fp, "[ptotal]\n");
  461. fprintf(fp, "voltage = \"%d\"\n", info->ptotal.voltage);
  462. fprintf(fp, "current = \"%d\"\n", info->ptotal.current);
  463. fprintf(fp, "power = \"%d\"\n", info->ptotal.power);
  464. fprintf(fp, "brd_max = \"%d\"\n", info->ptotal.brdMax);
  465. fprintf(fp, "\n");
  466. fclose(fp);
  467. sys_get_path(tmp, INI_FILE_BAK_NAME);
  468. file_copy(tmp, h->path);
  469. if(h->dic) {
  470. iniparser_freedict(h->dic);
  471. }
  472. h->dic = ini_load(h->path, h->info);
  473. return 0;
  474. }
  475. static int ini_free(paras_handle_t *h)
  476. {
  477. iniparser_freedict(h->dic);
  478. return 0;
  479. }
  480. static int ini_save(paras_handle_t *h)
  481. {
  482. int r=-1;
  483. r = ini_rw_dev(h->dic, INI_WRITE, h->info);
  484. if(r) {
  485. LOGE("___ini_w_dev failed\n");
  486. return -1;
  487. }
  488. r = ini_rw_modbus(h->dic, INI_WRITE, h->info);
  489. if(r) {
  490. LOGE("___ini_w_modbus failed\n");
  491. return -1;
  492. }
  493. FILE *fp=fopen(h->path, "w");
  494. if(!fp) {
  495. LOGE("___%s open failed\n", h->path);
  496. return -1;
  497. }
  498. iniparser_dump_ini(h->dic, fp);
  499. fclose(fp);
  500. return 0;
  501. }
  502. #endif
  503. static GlobalDeviceInfo *get_info(void)
  504. {
  505. return &__globalDeviceManage._globalDevInfo;
  506. }
  507. ////////////////////////////////////////////////////////////
  508. int paras_init(void)
  509. {
  510. int r=0;
  511. paras_handle_t *h=&paraHandle;
  512. lock_s_hold(LOCK_ID_PARAS);
  513. memset(&paraHandle, 0, sizeof(paraHandle));
  514. h->info = get_info();
  515. sys_get_path(h->path, INI_FILE_NAME);
  516. h->dic = ini_load(h->path, h->info);
  517. if(h->dic==NULL) {
  518. r = ini_reset(h);
  519. }
  520. lock_s_release(LOCK_ID_PARAS);
  521. return r;
  522. }
  523. int paras_deinit(void)
  524. {
  525. int r=0;
  526. paras_handle_t *h=&paraHandle;
  527. lock_s_hold(LOCK_ID_PARAS);
  528. r = ini_free(h);
  529. lock_s_release(LOCK_ID_PARAS);
  530. return 0;
  531. }
  532. int paras_check(char *path)
  533. {
  534. int r=0;
  535. lock_s_hold(LOCK_ID_PARAS);
  536. r = ini_check(path);
  537. lock_s_release(LOCK_ID_PARAS);
  538. return r;
  539. }
  540. int paras_load(char *path)
  541. {
  542. int r=-1;
  543. paras_handle_t *h=&paraHandle;
  544. lock_s_hold(LOCK_ID_PARAS);
  545. ini_free(h);
  546. h->dic = ini_load(path, h->info);
  547. if(h->dic) r = 0;
  548. lock_s_release(LOCK_ID_PARAS);
  549. return r;
  550. }
  551. int paras_reset(void)
  552. {
  553. int r=0;
  554. paras_handle_t *h=&paraHandle;
  555. lock_s_hold(LOCK_ID_PARAS);
  556. ini_reset(h);
  557. lock_s_release(LOCK_ID_PARAS);
  558. return r;
  559. }
  560. int paras_copy(char *dst, char *src)
  561. {
  562. int r=-1;
  563. lock_s_hold(LOCK_ID_PARAS);
  564. r = file_copy(dst, src);
  565. lock_s_release(LOCK_ID_PARAS);
  566. return r;
  567. }
  568. int paras_save(void)
  569. {
  570. int r=0;
  571. paras_handle_t *h=&paraHandle;
  572. lock_s_hold(LOCK_ID_PARAS);
  573. r = ini_save(h);
  574. lock_s_release(LOCK_ID_PARAS);
  575. return r;
  576. }