estats.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. #include "plt.h"
  2. sqlite3 *s_es_db = NULL;
  3. static pthread_mutex_t s_es_db_mut;
  4. // ms
  5. static double estats_get_timeofday()
  6. {
  7. struct timeval tv;
  8. struct timezone tz;
  9. gettimeofday(&tv, &tz);
  10. return (double)tv.tv_sec * 1000 + (double)tv.tv_usec / 1000;
  11. }
  12. static void es_lock_db()
  13. {
  14. pthread_mutex_lock(&s_es_db_mut);
  15. }
  16. static void es_unlock_db()
  17. {
  18. pthread_mutex_unlock(&s_es_db_mut);
  19. }
  20. static int estats_get_datetime(int *y, int *m, int *d, int *h, int *min, int *s)
  21. {
  22. time_t timep;
  23. struct tm *tsp;
  24. int ret = 0;
  25. time(&timep);
  26. // tsp = gmtime(&timep);
  27. tsp = localtime(&timep);
  28. *y = 1900 + tsp->tm_year;
  29. *m = 1 + tsp->tm_mon;
  30. *d = tsp->tm_mday;
  31. *h = tsp->tm_hour;
  32. *min = tsp->tm_min;
  33. *s = tsp->tm_sec;
  34. return ret;
  35. }
  36. static int estats_dbcb_0(void *para, int ncolumn, char **columnvalue, char *columnname[])
  37. {
  38. int i;
  39. struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para;
  40. struct ems_t *e = &ems;
  41. struct estats_t *dev = &e->estats;
  42. pcbparam->nrow++;
  43. log_dbg("%s, ++, row:%d; col:%d", __func__, pcbparam->nrow, ncolumn);
  44. for (i = 0; i < ncolumn; i++)
  45. {
  46. if (strcmp("sharp_pos_ae", columnname[i]) == 0)
  47. {
  48. dev->day_sharp_pos_ae = atof(columnvalue[i]);
  49. }
  50. else if (strcmp("sharp_neg_ae", columnname[i]) == 0)
  51. {
  52. dev->day_sharp_neg_ae = atof(columnvalue[i]);
  53. }
  54. else if (strcmp("peak_pos_ae", columnname[i]) == 0)
  55. {
  56. dev->day_peak_pos_ae = atof(columnvalue[i]);
  57. }
  58. else if (strcmp("peak_neg_ae", columnname[i]) == 0)
  59. {
  60. dev->day_peak_neg_ae = atof(columnvalue[i]);
  61. }
  62. else if (strcmp("flat_pos_ae", columnname[i]) == 0)
  63. {
  64. dev->day_flat_pos_ae = atof(columnvalue[i]);
  65. }
  66. else if (strcmp("flat_neg_ae", columnname[i]) == 0)
  67. {
  68. dev->day_flat_neg_ae = atof(columnvalue[i]);
  69. }
  70. else if (strcmp("valley_pos_ae", columnname[i]) == 0)
  71. {
  72. dev->day_valley_pos_ae = atof(columnvalue[i]);
  73. }
  74. else if (strcmp("valley_neg_ae", columnname[i]) == 0)
  75. {
  76. dev->day_valley_neg_ae = atof(columnvalue[i]);
  77. }
  78. }
  79. pcbparam->ret = 0;
  80. log_dbg("%s, --,ret:%d", __func__, pcbparam->ret);
  81. return 0;
  82. }
  83. static int estats_save_day_sum()
  84. {
  85. int ret = 0;
  86. int i, rc;
  87. char *errmsg = NULL;
  88. sqlite3 *db = s_es_db;
  89. struct timeseg_t *ts = NULL;
  90. int hh;
  91. int nn;
  92. char sql[1024];
  93. struct estats_t *es = &ems.estats;
  94. if (es->cur_timeseg_type == TIMESEGTYPE_SHARP)
  95. {
  96. sprintf(sql, "update year%d set sharp_pos_ae=%.1f where month=%d and day=%d", es->yy, es->day_sharp_pos_ae, es->mm, es->last_dd);
  97. es_lock_db();
  98. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  99. es_unlock_db();
  100. if (rc != SQLITE_OK)
  101. {
  102. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql);
  103. }
  104. sprintf(sql, "update year%d set sharp_neg_ae=%.1f where month=%d and day=%d", es->yy, es->day_sharp_neg_ae, es->mm, es->last_dd);
  105. es_lock_db();
  106. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  107. es_unlock_db();
  108. if (rc != SQLITE_OK)
  109. {
  110. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql);
  111. }
  112. }
  113. else if (es->cur_timeseg_type == TIMESEGTYPE_PEAK)
  114. {
  115. sprintf(sql, "update year%d set peak_pos_ae=%.1f where month=%d and day=%d", es->yy, es->day_peak_pos_ae, es->mm, es->last_dd);
  116. es_lock_db();
  117. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  118. es_unlock_db();
  119. if (rc != SQLITE_OK)
  120. {
  121. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql);
  122. }
  123. sprintf(sql, "update year%d set peak_neg_ae=%.1f where month=%d and day=%d", es->yy, es->day_peak_neg_ae, es->mm, es->last_dd);
  124. es_lock_db();
  125. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  126. es_unlock_db();
  127. if (rc != SQLITE_OK)
  128. {
  129. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql);
  130. }
  131. }
  132. else if (es->cur_timeseg_type == TIMESEGTYPE_FLAT)
  133. {
  134. sprintf(sql, "update year%d set flat_pos_ae=%.1f where month=%d and day=%d", es->yy, es->day_flat_pos_ae, es->mm, es->last_dd);
  135. es_lock_db();
  136. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  137. es_unlock_db();
  138. if (rc != SQLITE_OK)
  139. {
  140. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql);
  141. }
  142. sprintf(sql, "update year%d set flat_neg_ae=%.1f where month=%d and day=%d", es->yy, es->day_flat_neg_ae, es->mm, es->last_dd);
  143. es_lock_db();
  144. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  145. es_unlock_db();
  146. if (rc != SQLITE_OK)
  147. {
  148. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql);
  149. }
  150. }
  151. else if (es->cur_timeseg_type == TIMESEGTYPE_VALLEY)
  152. {
  153. sprintf(sql, "update year%d set valley_pos_ae=%.1f where month=%d and day=%d", es->yy, es->day_valley_pos_ae, es->mm, es->last_dd);
  154. es_lock_db();
  155. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  156. es_unlock_db();
  157. if (rc != SQLITE_OK)
  158. {
  159. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql);
  160. }
  161. sprintf(sql, "update year%d set valley_neg_ae=%.1f where month=%d and day=%d", es->yy, es->day_valley_neg_ae, es->mm, es->last_dd);
  162. es_lock_db();
  163. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  164. es_unlock_db();
  165. if (rc != SQLITE_OK)
  166. {
  167. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql);
  168. }
  169. }
  170. else
  171. {
  172. ret = -1;
  173. goto leave;
  174. }
  175. leave:
  176. if (ret != 0)
  177. {
  178. log_dbg("%s, --, ret:%d", __func__, ret);
  179. }
  180. return ret;
  181. }
  182. // period = 1s
  183. void estats_exe()
  184. {
  185. struct estats_t *es = &ems.estats;
  186. static double ts_last = 0;
  187. static int st = 0;
  188. int state = 0;
  189. static double seg_start_pos_ae = 0.0;
  190. static double seg_start_neg_ae = 0.0;
  191. static double start_day_sharp_pos_ae;
  192. static double start_day_sharp_neg_ae;
  193. static double start_day_peak_pos_ae;
  194. static double start_day_peak_neg_ae;
  195. static double start_day_flat_pos_ae;
  196. static double start_day_flat_neg_ae;
  197. static double start_day_valley_pos_ae;
  198. static double start_day_valley_neg_ae;
  199. double ts = estats_get_timeofday();
  200. double pos_ae = 0.0;
  201. double neg_ae = 0.0;
  202. meter_get_ctn_pos_ae(&pos_ae);
  203. meter_get_ctn_neg_ae(&neg_ae);
  204. estats_get_datetime(&es->yy, &es->mm, &es->dd, &es->hh, &es->nn, &es->ss);
  205. es->cur_timeseg_type = ems_get_cur_timeseg_type();
  206. // log_dbg("%s, meter state:%d\n", __func__, meter_get_state(DEVM_DTSD1352, 1));
  207. switch (es->step)
  208. {
  209. case 0: // restart
  210. meter_get_ctn_meter_state(&state);
  211. if (state == SMST_READY)
  212. {
  213. seg_start_pos_ae = pos_ae;
  214. seg_start_neg_ae = neg_ae;
  215. es->last_timeseg_type = es->cur_timeseg_type;
  216. es->last_dd = es->dd;
  217. ts_last = ts;
  218. es->step = 1;
  219. start_day_sharp_pos_ae = es->day_sharp_pos_ae;
  220. start_day_sharp_neg_ae = es->day_sharp_neg_ae;
  221. start_day_peak_pos_ae = es->day_peak_pos_ae;
  222. start_day_peak_neg_ae = es->day_peak_neg_ae;
  223. start_day_flat_pos_ae = es->day_flat_pos_ae;
  224. start_day_flat_neg_ae = es->day_flat_neg_ae;
  225. start_day_valley_pos_ae = es->day_valley_pos_ae;
  226. start_day_valley_neg_ae = es->day_valley_neg_ae;
  227. }
  228. break;
  229. case 1: // recording
  230. meter_get_ctn_meter_state(&state);
  231. if (state != SMST_READY)
  232. {
  233. estats_save_day_sum();
  234. es->step = 0;
  235. }
  236. else if (es->cur_timeseg_type != es->last_timeseg_type)
  237. {
  238. seg_start_pos_ae = pos_ae;
  239. seg_start_neg_ae = neg_ae;
  240. es->last_timeseg_type = es->cur_timeseg_type;
  241. start_day_sharp_pos_ae = es->day_sharp_pos_ae;
  242. start_day_sharp_neg_ae = es->day_sharp_neg_ae;
  243. start_day_peak_pos_ae = es->day_peak_pos_ae;
  244. start_day_peak_neg_ae = es->day_peak_neg_ae;
  245. start_day_flat_pos_ae = es->day_flat_pos_ae;
  246. start_day_flat_neg_ae = es->day_flat_neg_ae;
  247. start_day_valley_pos_ae = es->day_valley_pos_ae;
  248. start_day_valley_neg_ae = es->day_valley_neg_ae;
  249. }
  250. else if (es->last_dd != es->dd)
  251. {
  252. estats_save_day_sum();
  253. es->last_dd = es->dd;
  254. seg_start_pos_ae = pos_ae;
  255. seg_start_neg_ae = neg_ae;
  256. es->day_sharp_pos_ae = 0.0;
  257. es->day_sharp_neg_ae = 0.0;
  258. es->day_peak_pos_ae = 0.0;
  259. es->day_peak_neg_ae = 0.0;
  260. es->day_flat_pos_ae = 0.0;
  261. es->day_flat_neg_ae = 0.0;
  262. es->day_valley_pos_ae = 0.0;
  263. es->day_valley_neg_ae = 0.0;
  264. start_day_sharp_pos_ae = es->day_sharp_pos_ae;
  265. start_day_sharp_neg_ae = es->day_sharp_neg_ae;
  266. start_day_peak_pos_ae = es->day_peak_pos_ae;
  267. start_day_peak_neg_ae = es->day_peak_neg_ae;
  268. start_day_flat_pos_ae = es->day_flat_pos_ae;
  269. start_day_flat_neg_ae = es->day_flat_neg_ae;
  270. start_day_valley_pos_ae = es->day_valley_pos_ae;
  271. start_day_valley_neg_ae = es->day_valley_neg_ae;
  272. }
  273. else if (ts - ts_last > 60000)
  274. {
  275. ts_last = ts;
  276. estats_save_day_sum();
  277. }
  278. else
  279. {
  280. if (es->cur_timeseg_type == TIMESEGTYPE_SHARP)
  281. {
  282. if (pos_ae > seg_start_pos_ae)
  283. {
  284. es->day_sharp_pos_ae = pos_ae - seg_start_pos_ae + start_day_sharp_pos_ae;
  285. }
  286. if (neg_ae > seg_start_neg_ae)
  287. {
  288. es->day_sharp_neg_ae = neg_ae - seg_start_neg_ae + start_day_sharp_neg_ae;
  289. }
  290. }
  291. else if (es->cur_timeseg_type == TIMESEGTYPE_PEAK)
  292. {
  293. if (pos_ae > seg_start_pos_ae)
  294. {
  295. es->day_peak_pos_ae = pos_ae - seg_start_pos_ae + start_day_peak_pos_ae;
  296. }
  297. if (neg_ae > seg_start_neg_ae)
  298. {
  299. es->day_peak_neg_ae = neg_ae - seg_start_neg_ae + start_day_peak_neg_ae;
  300. }
  301. }
  302. else if (es->cur_timeseg_type == TIMESEGTYPE_FLAT)
  303. {
  304. if (pos_ae > seg_start_pos_ae)
  305. {
  306. es->day_flat_pos_ae = pos_ae - seg_start_pos_ae + start_day_flat_pos_ae;
  307. }
  308. if (neg_ae > seg_start_neg_ae)
  309. {
  310. es->day_flat_neg_ae = neg_ae - seg_start_neg_ae + start_day_flat_neg_ae;
  311. }
  312. }
  313. else if (es->cur_timeseg_type == TIMESEGTYPE_VALLEY)
  314. {
  315. if (pos_ae > seg_start_pos_ae)
  316. {
  317. es->day_valley_pos_ae = pos_ae - seg_start_pos_ae + start_day_valley_pos_ae;
  318. }
  319. if (neg_ae > seg_start_neg_ae)
  320. {
  321. es->day_valley_neg_ae = neg_ae - seg_start_neg_ae + start_day_valley_neg_ae;
  322. }
  323. }
  324. }
  325. break;
  326. default:
  327. break;
  328. }
  329. }
  330. int estats_load_day_sum()
  331. {
  332. int ret = 0;
  333. int result = 0;
  334. int yy, mm, dd, hh, nn, ss;
  335. char *errmsg = NULL;
  336. char sql[1024];
  337. struct dbcbparam_t cbparam;
  338. sqlite3 *db = s_es_db;
  339. estats_get_datetime(&yy, &mm, &dd, &hh, &nn, &ss);
  340. sprintf(sql, "select * from year%d where month=%d and day=%d", yy, mm, dd);
  341. log_dbg("estats, sql : %s", sql);
  342. cbparam.ret = 0;
  343. cbparam.nrow = 0;
  344. es_lock_db();
  345. result = sqlite3_exec(db, sql, estats_dbcb_0, (void *)&cbparam, &errmsg);
  346. es_unlock_db();
  347. if (result != SQLITE_OK)
  348. {
  349. log_dbg("%s, result != SQLITE_OK : %d", __func__, result);
  350. ret = -1;
  351. }
  352. else if (cbparam.ret != 0)
  353. {
  354. log_dbg("%s, cbparam.ret != 0 : %d", __func__, cbparam.ret);
  355. ret = -2;
  356. }
  357. else
  358. {
  359. }
  360. log_dbg("%s, ret:%d", __func__, ret);
  361. return ret;
  362. }
  363. int estats_init()
  364. {
  365. int ret = 0;
  366. char buf[128];
  367. int rc;
  368. struct ems_t *e = &ems;
  369. struct estats_t *es = &ems.estats;
  370. sprintf(buf, "../data/estats.db");
  371. if (access(buf, 0) < 0)
  372. {
  373. log_dbg("%s, access estats db fail, path:%s", __func__, buf);
  374. ret = -1;
  375. }
  376. else
  377. {
  378. rc = sqlite3_open(buf, &s_es_db);
  379. if (rc == SQLITE_OK)
  380. {
  381. pthread_mutex_init(&s_es_db_mut, NULL);
  382. ret = estats_load_day_sum();
  383. }
  384. else
  385. {
  386. ret = -2;
  387. }
  388. }
  389. log_dbg("%s, ret:%d", __func__, ret);
  390. return ret;
  391. }
  392. int estats_reset_year(int year)
  393. {
  394. int rc;
  395. char *errmsg = NULL;
  396. sqlite3 *db = s_es_db;
  397. char sql[1024];
  398. int mm, dd;
  399. int ret = 0;
  400. /* delete */
  401. sprintf(sql, "delete from year%d", year);
  402. es_lock_db();
  403. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  404. es_unlock_db();
  405. if (rc != SQLITE_OK)
  406. {
  407. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql);
  408. ret = -1;
  409. goto leave;
  410. }
  411. /* insert */
  412. mm = 1;
  413. dd = 1;
  414. while (mm <= 12)
  415. {
  416. while (dd <= 31)
  417. {
  418. sprintf(sql, "insert into year%d VALUES(%d,%d,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0)", year, mm, dd);
  419. es_lock_db();
  420. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  421. es_unlock_db();
  422. if (rc != SQLITE_OK)
  423. {
  424. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql);
  425. ret = -2;
  426. goto leave;
  427. }
  428. dd++;
  429. }
  430. dd = 1;
  431. mm++;
  432. }
  433. leave:
  434. log_dbg("%s, year:%d, ret:%d", __func__, year, ret);
  435. return ret;
  436. }