snap.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. #include "plt.h"
  2. #include "snap.h"
  3. #include "snap_abb.h"
  4. struct snap_t snap;
  5. static int snap_dbcb_0(void *para,int ncolumn,char ** columnvalue,char *columnname[])
  6. {
  7. int i;
  8. struct dbcbparam_t* pcbparam = (struct dbcbparam_t*)para;
  9. struct snap_t* s = &snap;
  10. pcbparam->nrow++;
  11. log_dbg("%s, ++, row:%d; col:%d",__func__,pcbparam->nrow,ncolumn);
  12. for( i = 0; i < ncolumn; i++){
  13. if( strcmp("en",columnname[i]) == 0){
  14. s->enable = atoi(columnvalue[i]);
  15. }else if( strcmp("intv",columnname[i]) == 0){
  16. s->intv = atoi(columnvalue[i]);
  17. }else if( strcmp("keep_day",columnname[i]) == 0){
  18. s->keep_day = atoi(columnvalue[i]);
  19. }else if( strcmp("info",columnname[i]) == 0){
  20. strcpy(s->szinfo,columnvalue[i]);
  21. }
  22. }
  23. pcbparam->ret = 0;
  24. log_dbg("%s, --,ret:%d",__func__,pcbparam->ret);
  25. return 0;
  26. }
  27. int snap_day_diff(int year_start, int month_start, int day_start, int year_end, int month_end, int day_end)
  28. {
  29. int y2, m2, d2;
  30. int y1, m1, d1;
  31. m1 = (month_start + 9) % 12;
  32. y1 = year_start - m1/10;
  33. d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1);
  34. m2 = (month_end + 9) % 12;
  35. y2 = year_end - m2/10;
  36. d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 + 5)/10 + (day_end - 1);
  37. return (d2 - d1);
  38. }
  39. int snap_get_datetime(int* y, int* m, int* d, int* h, int* min, int* s)
  40. {
  41. time_t timep;
  42. struct tm *tsp;
  43. int ret = 0;
  44. time(&timep);
  45. //tsp = gmtime(&timep);
  46. tsp = localtime(&timep);
  47. *y = 1900+tsp->tm_year;
  48. *m = 1+tsp->tm_mon;
  49. *d = tsp->tm_mday;
  50. *h = tsp->tm_hour;
  51. *min = tsp->tm_min;
  52. *s = tsp->tm_sec;
  53. return ret;
  54. }
  55. int snap_del_outofdate_file(char *basePath, int curryy, int currmm, int currdd, int keep_day)
  56. {
  57. DIR *dir;
  58. struct dirent *ptr;
  59. char base[1000];
  60. char* p = NULL;
  61. char szyy[8];
  62. char szmm[8];
  63. char szdd[8];
  64. int yy, mm, dd;
  65. int day_diff;
  66. char szfile_todel[128];
  67. int diff_day;
  68. if( (dir=opendir(basePath)) == NULL ){
  69. //printf("opendir :%s, fail\n", basePath);
  70. return -1;
  71. }
  72. //printf("opendir :%s, ok\n", basePath);
  73. while ((ptr=readdir(dir)) != NULL){
  74. if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0){ ///current dir OR parrent dir
  75. continue;
  76. }else if(ptr->d_type == 8){ ///file
  77. //printf("get file:%s\n", ptr->d_name);
  78. p = ptr->d_name;
  79. if( strlen(ptr->d_name)==23 && p[4]=='-' && p[7]=='-' && p[13]=='-' && p[16]=='-'){
  80. strncpy(szyy, p, 4);
  81. strncpy(szmm, p+5, 2);
  82. strncpy(szdd, p+8, 2);
  83. yy = atoi(szyy);
  84. mm = atoi(szmm);
  85. dd = atoi(szdd);
  86. diff_day = snap_day_diff(yy, mm, dd, curryy, currmm, currdd);
  87. //printf("diff_day:%d\n", diff_day);
  88. if( diff_day > keep_day ){
  89. sprintf(szfile_todel,"%s/%s",basePath, ptr->d_name);
  90. remove(szfile_todel);
  91. //printf("remove %s\n",szfile_todel);
  92. }
  93. }else{
  94. //printf("file format not match\n");
  95. }
  96. }else if(ptr->d_type == 10){ ///link file
  97. //printf("d_name:%s/%s\n",basePath,ptr->d_name);
  98. }else if(ptr->d_type == 4){ ///dir
  99. memset(base,'\0',sizeof(base));
  100. strcpy(base,basePath);
  101. strcat(base,"/");
  102. strcat(base,ptr->d_name);
  103. snap_del_outofdate_file(base, curryy, currmm, currdd, keep_day);
  104. }
  105. }
  106. closedir(dir);
  107. return 0;
  108. }
  109. int snap_deltest()
  110. {
  111. snap_del_outofdate_file("../snap/", 2021, 12, 13, 3);
  112. }
  113. FILE* _fp_snap = NULL;
  114. int snap_start()
  115. {
  116. struct snap_t* s = &snap;
  117. int ret = 0;
  118. int y,m,d,h,min,ss;
  119. char szfn[128];
  120. snap_get_datetime( &y, &m, &d, &h, &min, &ss);
  121. // sprintf(s->szcurr_date, "%d-%02d-%02d", y,m,d);
  122. sprintf(szfn,"../snap/%d-%02d-%02d %02d-%02d-%02d.dat",y,m,d,h,min,ss);
  123. _fp_snap = fopen(szfn, "w+");
  124. if( _fp_snap == NULL){
  125. ret = -1;
  126. }else{
  127. fprintf(_fp_snap,"%s,%s,%s,%s,", "time","cpu_occupy","mem_occupy","disk_occupy"); /* 1 2 3 4 */
  128. fprintf(_fp_snap,"%s,%s,%s,%s,%s,%s,", "state","err","ap","con_ap","load_ap","soc"); /* 5 6 7 8 */
  129. fprintf(_fp_snap,"%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,",
  130. "pcs_runstat","pcs_ap", "pcs_errstat",
  131. "pcs_dcv", "pcs_dcc",
  132. "pcs_gridv", "pcs_ua", "pcs_ub", "pcs_uc","pcs_ia", "pcs_ib", "pcs_ic");
  133. fprintf(_fp_snap,"%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,",
  134. "bms_hvstat",
  135. "bms_v",
  136. "bms_c",
  137. "bms_ap",
  138. "bms_sysstat",
  139. "bms_soc",
  140. "bms_nsub",
  141. "bms_cellvmax",
  142. "bms_cellvmin",
  143. "bms_cellvave",
  144. "bms_celltmax",
  145. "bms_celltmin",
  146. "bms_celltave",
  147. "bms_max_dhg_c",
  148. "bms_max_chg_c"); /* bms */
  149. fprintf(_fp_snap,"%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,",
  150. "ac1_workstat",
  151. "ac1_comp",
  152. "ac1_rtntemp",
  153. "ac1_condtemp",
  154. "ac1_evatemp",
  155. "ac2_workstat",
  156. "ac2_comp",
  157. "ac2_rtntemp",
  158. "ac2_condtemp",
  159. "ac2_evatemp"); /* ac */
  160. fprintf(_fp_snap,"%s,%s,%s,%s,%s,\
  161. %s,%s,%s,%s,%s,",
  162. "m1_state","m1_com_ap", "m1_com_ae","m1_pos_ae","m1_neg_ae",
  163. "m2_state","m2_com_ap", "m2_com_ae","m2_pos_ae","m2_neg_ae"); /* meter */
  164. fprintf(_fp_snap,"%s,%s,%s,%s,",
  165. "env1_temp",
  166. "env1_humi",
  167. "env2_temp",
  168. "env2_humi"); /* env */
  169. fprintf(_fp_snap,"%s\n",
  170. "plc_transtemp"); /* plc */
  171. s->started = 0;
  172. }
  173. return ret ;
  174. }
  175. int snap_stop()
  176. {
  177. if(_fp_snap != NULL){
  178. fclose(_fp_snap);
  179. }
  180. return 0;
  181. }
  182. int snap_run()
  183. {
  184. int ret = 0;
  185. int y, m, d, h, min, s;
  186. #if 1
  187. snap_get_datetime( &y, &m, &d, &h, &min, &s);
  188. /* time and mac */
  189. fprintf(_fp_snap, "%02d:%02d:%02d,%.1f,%.1f,%.1f,",
  190. h,min,s, mac_get_cpu_occupy_info(),mac_get_mem_occupy_info(),mac_get_disk_occupy_info());
  191. /* sys */
  192. fprintf(_fp_snap,"%s,%s,%d,%d,%d,%.1f,",
  193. cess2000_get_state_str(1),cess2000_get_err_str(1),cess2000_get_ap(1),
  194. ems_get_transf_con_ap(),ems_get_transf_load_ap(),
  195. cess2000_get_soc(1));
  196. /* pcs */
  197. fprintf(_fp_snap, "%s,%d,%d,\
  198. %d,%d,\
  199. %.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,",
  200. pcs_get_runstat_str(), pcs_get_ap(), pcs_get_errstat(),
  201. pcs_get_dcv(), pcs_get_dcc(),
  202. pcs_get_gridv(), pcs_get_ua(),pcs_get_ub(),pcs_get_uc(),pcs_get_ia(),pcs_get_ib(),pcs_get_ic());
  203. /* bms */
  204. fprintf(_fp_snap, "%s,%d,%d,%d,%s,%.1f,%d,%.3f,%.3f,%.3f,%d,%d,%d,%d,%d,",
  205. pack_get_hvstat(),
  206. pack_get_v(),
  207. pack_get_c(),
  208. pack_get_ap(),
  209. pack_get_sysstat_str(),
  210. pack_get_soc(),
  211. pack_get_nsub(),
  212. pack_get_cellvmax(),
  213. pack_get_cellvmin(),
  214. pack_get_cellvave(),
  215. pack_get_celltmax(),
  216. pack_get_celltmin(),
  217. pack_get_celltave(),
  218. pack_get_max_dhgc(),
  219. pack_get_max_chgc());
  220. /* ac */
  221. fprintf(_fp_snap, "%s,%s,%d,%d,%d,%s,%s,%d,%d,%d,",
  222. ac_get_work_stat_str(1), ac_get_cmp_stat_str(1), ac_get_rtnwind_temp(1), ac_get_cond_temp(1), ac_get_eva_temp(1),
  223. ac_get_work_stat_str(2), ac_get_cmp_stat_str(2), ac_get_rtnwind_temp(2), ac_get_cond_temp(2), ac_get_eva_temp(2));
  224. /* meter */
  225. fprintf(_fp_snap, "%s,%d,%.1f,%.1f,%.1f,",
  226. meter_get_state_string(DEVM_DTSD1352, 1),
  227. meter_get_com_ap(DEVM_DTSD1352, 1),
  228. meter_get_com_ae(DEVM_DTSD1352 ,1),
  229. meter_get_pos_ae(DEVM_DTSD1352 ,1),
  230. meter_get_neg_ae(DEVM_DTSD1352 ,1));
  231. fprintf(_fp_snap, "%s,%d,%.1f,%.1f,%.1f,",
  232. meter_get_state_string(DEVM_DTSD1352, 2),
  233. meter_get_com_ap(DEVM_DTSD1352, 2),
  234. meter_get_com_ae(DEVM_DTSD1352 ,2),
  235. meter_get_pos_ae(DEVM_DTSD1352 ,2),
  236. meter_get_neg_ae(DEVM_DTSD1352 ,2));
  237. /* env */
  238. fprintf(_fp_snap, "%d,%d,%d,%d,",env_get_temp(DEVM_RS_WS_N,1), env_get_humi(DEVM_RS_WS_N,1),env_get_temp(DEVM_RS_WS_N,2), env_get_humi(DEVM_RS_WS_N,2));
  239. /* plc */
  240. fprintf(_fp_snap, "%d",plc_get_transf_temp());
  241. fprintf(_fp_snap,"\n"); /* end of row */
  242. fflush(_fp_snap);
  243. #endif
  244. return 0;
  245. }
  246. int snap_init()
  247. {
  248. int ret = 0;
  249. int rc;
  250. char *errmsg = NULL;
  251. sqlite3* db = NULL;
  252. char sql[1024];
  253. struct dbcbparam_t cbparam;
  254. struct snap_t* s = &snap;
  255. plt_lock_cfgdb();
  256. db = plt_get_cfgdb();
  257. sprintf(sql,"select * from snap");
  258. cbparam.nrow = 0;
  259. rc = sqlite3_exec(db,sql, snap_dbcb_0,(void*)&cbparam,&errmsg);
  260. plt_unlock_cfgdb();
  261. if( rc != SQLITE_OK ){
  262. log_dbg("%s, result != SQLITE_OK", __func__ );
  263. ret = -1;
  264. }else if( cbparam.ret != 0){
  265. log_dbg("%s, cbparam.ret != 0", __func__ );
  266. ret = -1;
  267. }else{
  268. if( cbparam.nrow != 1 ){
  269. log_dbg("%s, cbparam.nrow(%d) != 1", __func__, cbparam.nrow );
  270. ret = -1;
  271. }else{
  272. s->timer = s->intv;
  273. s->started = 0;
  274. s->datechk_timer = 0;
  275. }
  276. }
  277. log_dbg("%s, ret:%d", __func__, ret);
  278. return ret;
  279. }
  280. void snap_exe()
  281. {
  282. struct snap_t* s = &snap;
  283. char buf[16];
  284. int y,m,d,h,min,ss;
  285. if( s->enable == 0 ){
  286. return;
  287. }
  288. if( s->started == 0 ){
  289. snap_get_datetime( &y, &m, &d, &h, &min, &ss);
  290. sprintf(s->szcurr_date, "%d-%02d-%02d", y,m,d);
  291. if(strcmp(s->szinfo,"abb") == 0){
  292. if(snap_start_abb(&_fp_snap) == 0){
  293. s->started = 1;
  294. }else{
  295. s->enable = 0;
  296. s->started = 0;
  297. return;
  298. }
  299. }else{
  300. if( snap_start() == 0){
  301. s->started = 1;
  302. }else{
  303. s->enable = 0;
  304. return;
  305. }
  306. }
  307. }else{
  308. if( s->datechk_timer++ >= 10 ){ /* chk every 10 seconds */
  309. s->datechk_timer = 0;
  310. snap_get_datetime( &y, &m, &d, &h, &min, &ss);
  311. sprintf(buf, "%d-%02d-%02d", y,m,d);
  312. if( strcmp(buf, s->szcurr_date) != 0 ){ /* new date */
  313. snap_stop();
  314. snap_del_outofdate_file("../snap/", y, m, d, s->keep_day);
  315. s->started = 0; /* start again at next second */
  316. return;
  317. }
  318. }
  319. if( s->timer++ >= s->intv ){
  320. s->timer = 0;
  321. if(strcmp(s->szinfo,"abb") == 0){
  322. snap_run_abb(_fp_snap);
  323. }else{
  324. snap_run();
  325. }
  326. }
  327. }
  328. }
  329. int snap_get_en()
  330. {
  331. struct snap_t* s = &snap;
  332. return s->enable;
  333. }
  334. int snap_get_started()
  335. {
  336. struct snap_t* s = &snap;
  337. return s->started;
  338. }