#include "plt.h" static double ts_last_meter_record = 0.0; static double ts_last_meter_clean = 0.0; static sqlite3* s_ev_db; static pthread_mutex_t s_ev_db_mut; /* ms */ static double ev_get_timeofday() { struct timeval tv; struct timezone tz; gettimeofday(&tv,&tz); return (double)tv.tv_sec * 1000 + (double)tv.tv_usec/1000; } static int ev_init_db() { int ret = 0; int rc = 0; char buf[128]; sprintf(buf,"../data/event.db"); if( access(buf, 0) < 0){ log_dbg("%s, access ev db fail, path:%s", __func__, buf); ret = -1; }else{ rc = sqlite3_open(buf,&s_ev_db); if(rc == SQLITE_OK) { pthread_mutex_init(&s_ev_db_mut, NULL); }else{ ret = -2; } } log_dbg("%s, ret:%d", __func__, ret); return ret; } void ev_lock_db() { pthread_mutex_lock(&s_ev_db_mut); } void ev_unlock_db() { pthread_mutex_unlock(&s_ev_db_mut); } static void ev_record_meter() { char *errmsg = NULL; sqlite3* db = s_ev_db; struct timeseg_t* ts = NULL; char sql[1024]; int idx, rc; double com_ae = 0.0; double pos_ae = 0.0; double neg_ae = 0.0; double com_ap = 0.0; int state = 0; meter_get_ctn_meter_state(&state); if(state == SMST_READY){ meter_get_ctn_com_ae(&com_ae); meter_get_ctn_pos_ae(&pos_ae); meter_get_ctn_neg_ae(&neg_ae); meter_get_ctn_ap(&com_ap); sprintf(sql, "insert into m%d (ts,com_ae,pos_ae,neg_ae,com_ap) values(%.0f,%.1f,%.1f,%.1f,%.1f)", 1, ev_get_timeofday()/1000.0, com_ae,pos_ae,neg_ae,com_ap); ev_lock_db(); rc = sqlite3_exec(db,sql,NULL,NULL,&errmsg); ev_unlock_db(); if( rc != SQLITE_OK ){ log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql ); } } meter_get_aux_meter_state(&state); if(state == SMST_READY){ com_ae = 0.0; pos_ae = 0.0; neg_ae = 0.0; com_ap = 0.0; meter_get_aux_com_ae(&com_ae); meter_get_aux_pos_ae(&pos_ae); meter_get_aux_neg_ae(&neg_ae); meter_get_aux_ap(&com_ap); sprintf(sql, "insert into m%d (ts,com_ae,pos_ae,neg_ae,com_ap) values(%.0f,%.1f,%.1f,%.1f,%.1f)", 2, ev_get_timeofday()/1000.0, com_ae,pos_ae,neg_ae,com_ap); ev_lock_db(); rc = sqlite3_exec(db,sql,NULL,NULL,&errmsg); ev_unlock_db(); if( rc != SQLITE_OK ){ log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql ); } } } static void ev_clean_meter() { char *errmsg = NULL; sqlite3* db = s_ev_db; struct timeseg_t* ts = NULL; char sql[1024]; int idx, rc; for(idx = 1; idx <= 2; idx++){ sprintf(sql, "delete from m%d where ts<%.0f", idx, ev_get_timeofday()/1000.0-3600*24*31); ev_lock_db(); rc = sqlite3_exec(db,sql,NULL,NULL,&errmsg); ev_unlock_db(); if( rc != SQLITE_OK ){ log_dbg("%s, sqlite3_exec fail:%d, when %s", __func__, rc, sql ); } } } void ev_exe() { double ts = ev_get_timeofday(); if( ts - ts_last_meter_record > 60000 ){ // 60s ts_last_meter_record = ts; ev_record_meter(); } if( ts - ts_last_meter_clean > 3600*24 ){ // every day ts_last_meter_clean = ts; ev_clean_meter(); } } int ev_init() { int ret = 0; if( ev_init_db() != 0 ){ ret = -1; } return ret; }