event.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #include "plt.h"
  2. static double ts_last_meter_record = 0.0;
  3. static double ts_last_meter_clean = 0.0;
  4. static sqlite3* s_ev_db;
  5. static pthread_mutex_t s_ev_db_mut;
  6. /* ms */
  7. static double ev_get_timeofday()
  8. {
  9. struct timeval tv;
  10. struct timezone tz;
  11. gettimeofday(&tv,&tz);
  12. return (double)tv.tv_sec * 1000 + (double)tv.tv_usec/1000;
  13. }
  14. static int ev_init_db()
  15. {
  16. int ret = 0;
  17. int rc = 0;
  18. char buf[128];
  19. sprintf(buf,"../data/event.db");
  20. if( access(buf, 0) < 0){
  21. log_dbg("%s, access ev db fail, path:%s", __func__, buf);
  22. ret = -1;
  23. }else{
  24. rc = sqlite3_open(buf,&s_ev_db);
  25. if(rc == SQLITE_OK) {
  26. pthread_mutex_init(&s_ev_db_mut, NULL);
  27. }else{
  28. ret = -2;
  29. }
  30. }
  31. log_dbg("%s, ret:%d", __func__, ret);
  32. return ret;
  33. }
  34. void ev_lock_db()
  35. {
  36. pthread_mutex_lock(&s_ev_db_mut);
  37. }
  38. void ev_unlock_db()
  39. {
  40. pthread_mutex_unlock(&s_ev_db_mut);
  41. }
  42. static void ev_record_meter()
  43. {
  44. char *errmsg = NULL;
  45. sqlite3* db = s_ev_db;
  46. struct timeseg_t* ts = NULL;
  47. char sql[1024];
  48. int idx, rc;
  49. double com_ae = 0.0;
  50. double pos_ae = 0.0;
  51. double neg_ae = 0.0;
  52. double com_ap = 0.0;
  53. int state = 0;
  54. meter_get_ctn_meter_state(&state);
  55. if(state == SMST_READY){
  56. meter_get_ctn_com_ae(&com_ae);
  57. meter_get_ctn_pos_ae(&pos_ae);
  58. meter_get_ctn_neg_ae(&neg_ae);
  59. meter_get_ctn_ap(&com_ap);
  60. sprintf(sql, "insert into m%d (ts,com_ae,pos_ae,neg_ae,com_ap) values(%.0f,%.1f,%.1f,%.1f,%.1f)",
  61. 1, ev_get_timeofday()/1000.0,
  62. com_ae,pos_ae,neg_ae,com_ap);
  63. ev_lock_db();
  64. rc = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
  65. ev_unlock_db();
  66. if( rc != SQLITE_OK ){
  67. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql );
  68. }
  69. }
  70. meter_get_aux_meter_state(&state);
  71. if(state == SMST_READY){
  72. com_ae = 0.0;
  73. pos_ae = 0.0;
  74. neg_ae = 0.0;
  75. com_ap = 0.0;
  76. meter_get_aux_com_ae(&com_ae);
  77. meter_get_aux_pos_ae(&pos_ae);
  78. meter_get_aux_neg_ae(&neg_ae);
  79. meter_get_aux_ap(&com_ap);
  80. sprintf(sql, "insert into m%d (ts,com_ae,pos_ae,neg_ae,com_ap) values(%.0f,%.1f,%.1f,%.1f,%.1f)",
  81. 2, ev_get_timeofday()/1000.0,
  82. com_ae,pos_ae,neg_ae,com_ap);
  83. ev_lock_db();
  84. rc = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
  85. ev_unlock_db();
  86. if( rc != SQLITE_OK ){
  87. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql );
  88. }
  89. }
  90. }
  91. static void ev_clean_meter()
  92. {
  93. char *errmsg = NULL;
  94. sqlite3* db = s_ev_db;
  95. struct timeseg_t* ts = NULL;
  96. char sql[1024];
  97. int idx, rc;
  98. for(idx = 1; idx <= 2; idx++){
  99. sprintf(sql, "delete from m%d where ts<%.0f",
  100. idx, ev_get_timeofday()/1000.0-3600*24*31);
  101. ev_lock_db();
  102. rc = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
  103. ev_unlock_db();
  104. if( rc != SQLITE_OK ){
  105. log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql );
  106. }
  107. }
  108. }
  109. void ev_exe()
  110. {
  111. double ts = ev_get_timeofday();
  112. if( ts - ts_last_meter_record > 60000 ){ // 60s
  113. ts_last_meter_record = ts;
  114. ev_record_meter();
  115. }
  116. if( ts - ts_last_meter_clean > 3600*24 ){ // every day
  117. ts_last_meter_clean = ts;
  118. ev_clean_meter();
  119. }
  120. }
  121. int ev_init()
  122. {
  123. int ret = 0;
  124. if( ev_init_db() != 0 ){
  125. ret = -1;
  126. }
  127. return ret;
  128. }