cess2000.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. #include "plt.h"
  2. struct cess2000_t cess2000[CESS2000_NBR_MAX + 1];
  3. int cess2000_enable_pcs_bsytiksnd(int idx)
  4. {
  5. cess2000[idx].pcstik.en = 1;
  6. return 0;
  7. }
  8. int cess2000_disable_pcs_bsytiksnd(int idx)
  9. {
  10. cess2000[idx].pcstik.en = 0;
  11. return 0;
  12. }
  13. int cess2000_get_pcs_bsytiksnd_en(int idx)
  14. {
  15. return cess2000[idx].pcstik.en;
  16. }
  17. int cess2000_reset_bsytikchk(int idx)
  18. {
  19. cess2000[idx].bsytik.timer = 0;
  20. cess2000[idx].bsytik.timeout = 0;
  21. cess2000[idx].bsytik.chkcnt = 0;
  22. return 0;
  23. }
  24. int cess2000_enable_bsytikchk(int idx)
  25. {
  26. cess2000[idx].bsytik.en = 1;
  27. return 0;
  28. }
  29. int cess2000_disable_bsytikchk(int idx)
  30. {
  31. cess2000[idx].bsytik.en = 0;
  32. return 0;
  33. }
  34. int cess2000_get_bsytikchk_en(int idx)
  35. {
  36. return cess2000[idx].bsytik.en;
  37. }
  38. int cess2000_get_bsytikchk_from_host(int idx)
  39. {
  40. return cess2000[idx].bsytik.from_host;
  41. }
  42. int cess2000_get_bsytikchk_timeout(int idx)
  43. {
  44. return cess2000[idx].bsytik.timeout;
  45. }
  46. static double cess2000_get_timeofday()
  47. {
  48. struct timeval tv;
  49. struct timezone tz;
  50. gettimeofday(&tv,&tz);
  51. return (double)tv.tv_sec * 1000 + (double)tv.tv_usec/1000;
  52. }
  53. static int cess2000_dbcb_0(void *para,int ncolumn,char ** columnvalue,char *columnname[])
  54. {
  55. int i;
  56. struct dbcbparam_t* pcbparam = (struct dbcbparam_t*)para;
  57. struct cess2000_t* dev = &cess2000[1];
  58. pcbparam->nrow++;
  59. log_dbg("%s, ++, row:%d, col:%d",__func__,pcbparam->nrow,ncolumn);
  60. for( i = 0; i < ncolumn; i++){
  61. if( strcmp("info",columnname[i]) == 0){
  62. strcpy(dev->szinfo,columnvalue[i]);
  63. }else if( strcmp("chan_idx",columnname[i]) == 0){
  64. dev->chan_idx = atoi(columnvalue[i]);
  65. }else if( strcmp("norm_cap",columnname[i]) == 0){
  66. dev->pow.norm_cap = atoi(columnvalue[i]);
  67. }else if( strcmp("norm_pow",columnname[i]) == 0){
  68. dev->pow.norm_pow = atoi(columnvalue[i]);
  69. }else if( strcmp("min_pow",columnname[i]) == 0){
  70. dev->pow.min_pow = atoi(columnvalue[i]);
  71. }else if( strcmp("socc",columnname[i]) == 0){
  72. dev->socc = atof(columnvalue[i]);
  73. }else if( strcmp("socd",columnname[i]) == 0){
  74. dev->socd = atof(columnvalue[i]);
  75. }else if( strcmp("cell_otp",columnname[i]) == 0){
  76. dev->cell_otp = atoi(columnvalue[i]);
  77. }else if( strcmp("cell_utp",columnname[i]) == 0){
  78. dev->cell_utp = atoi(columnvalue[i]);
  79. }else if( strcmp("modbus_tcp_slave_port",columnname[i]) == 0){
  80. dev->modbus_tcp_slave_port = atoi(columnvalue[i]);
  81. }else if( strcmp("modbus_tcp_slave_port_EMA",columnname[i]) == 0){
  82. dev->modbus_tcp_slave_port_EMA = atoi(columnvalue[i]);
  83. }
  84. }
  85. pcbparam->ret = 0;
  86. log_dbg("%s, --,ret:%d",__func__,pcbparam->ret);
  87. return 0;
  88. }
  89. void cess2000_set_state(int idx, int state, int err)
  90. {
  91. sm_set_state(&cess2000[idx].sm, state, err);
  92. }
  93. int cess2000_get_state( int idx )
  94. {
  95. return cess2000[idx].sm.state;
  96. }
  97. int cess2000_get_step( int idx )
  98. {
  99. return cess2000[idx].sm.step;
  100. }
  101. int cess2000_get_tick( int idx )
  102. {
  103. return cess2000[idx].sm.tick;
  104. }
  105. double cess2000_get_tick_ave( int idx )
  106. {
  107. return cess2000[idx].sm.timing_ave;
  108. }
  109. double cess2000_get_tick_cur( int idx )
  110. {
  111. return cess2000[idx].sm.timing_cur;
  112. }
  113. double cess2000_get_tick_max( int idx )
  114. {
  115. return cess2000[idx].sm.timing_max;
  116. }
  117. char* cess2000_get_state_str( int idx )
  118. {
  119. return cess2000[idx].sm.szState;
  120. }
  121. char* cess2000_get_err_str( int idx )
  122. {
  123. return cess2000[idx].sm.szerr;
  124. }
  125. int cess2000_get_err( int idx )
  126. {
  127. return cess2000[idx].sm.err;
  128. }
  129. int cess2000_set_aps(int idx, int aps)
  130. {
  131. struct cess2000_t* dev = &cess2000[idx];
  132. int ret = 0;
  133. dev->pow.last_aps = dev->pow.aps;
  134. dev->pow.aps = aps;
  135. log_dbg( "%s, idx:%d, val:%d, ret:%d", __func__, idx, aps, ret);
  136. return ret;
  137. }
  138. int cess2000_reset_aps(int idx)
  139. {
  140. struct cess2000_t* dev = &cess2000[idx];
  141. int ret = 0;
  142. dev->pow.last_aps = 0;
  143. dev->pow.aps = 0;
  144. return ret;
  145. }
  146. int cess2000_get_ap(int idx)
  147. {
  148. return cess2000[idx].pow.ap;
  149. }
  150. int cess2000_get_dhgable(int idx)
  151. {
  152. return cess2000[idx].pow.bdhgable;
  153. }
  154. void cess2000_set_dhgable(int idx, int val)
  155. {
  156. cess2000[idx].pow.bdhgable = val;
  157. }
  158. int cess2000_get_chgable(int idx)
  159. {
  160. return cess2000[idx].pow.bchgable;
  161. }
  162. void cess2000_set_chgable(int idx, int val)
  163. {
  164. cess2000[idx].pow.bchgable = val;
  165. }
  166. int cess2000_get_aps(int idx)
  167. {
  168. return cess2000[idx].pow.aps;
  169. }
  170. int cess2000_get_last_aps(int idx)
  171. {
  172. return cess2000[idx].pow.last_aps;
  173. }
  174. double cess2000_get_soc(int idx)
  175. {
  176. return cess2000[idx].pow.soc;
  177. }
  178. int cess2000_get_norm_cap(int idx)
  179. {
  180. return cess2000[idx].pow.norm_cap;
  181. }
  182. int cess2000_get_norm_pow(int idx)
  183. {
  184. return cess2000[idx].pow.norm_pow;
  185. }
  186. int cess2000_get_min_pow(int idx)
  187. {
  188. return cess2000[idx].pow.min_pow;
  189. }
  190. int cess2000_send_cmd( int idx, int cmd )
  191. {
  192. int ret = 0;
  193. cess2000[idx].cmd = cmd;
  194. log_dbg("%s, idx:%d, cmd:%d, ret:%d",__func__,idx,cmd,ret);
  195. return ret;
  196. }
  197. /*************************************
  198. static void cess2000_usleep(unsigned int nusecs)
  199. {
  200. struct timeval tval;
  201. tval.tv_sec = nusecs / 1000000;
  202. tval.tv_usec = nusecs % 1000000;
  203. select(0, NULL, NULL, NULL, &tval);
  204. }
  205. *************************************/
  206. static void cess2000_update(int idx)
  207. {
  208. struct cess2000_t* dev = &cess2000[idx];
  209. struct statemachine_t* sm = &dev->sm;
  210. dev->pow.ap = pcs_get_ap();
  211. dev->pow.soc = pack_get_soc();
  212. }
  213. static void cess2000_aux(int idx)
  214. {
  215. struct cess2000_t* dev = &cess2000[idx];
  216. struct statemachine_t* sm = &dev->sm;
  217. if( dev->bsytik.timer++ >= 100 ){
  218. dev->bsytik.timer = 0;
  219. if( dev->bsytik.last_from_host != dev->bsytik.from_host ){
  220. dev->bsytik.last_from_host = dev->bsytik.from_host;
  221. dev->bsytik.chkcnt = 0;
  222. }else{
  223. if( dev->bsytik.chkcnt++ >= 5){
  224. dev->bsytik.timeout = 1;
  225. }
  226. }
  227. }
  228. if( cess2000_get_pcs_bsytiksnd_en(idx) ){
  229. if( dev->pcstik.timer++ >= 100 ){ // 1s
  230. dev->pcstik.timer = 0;
  231. pcs_set_bsytik();
  232. }
  233. }
  234. }
  235. static void* cess2000_thrd_main( void* param )
  236. {
  237. struct cess2000_t* dev = &cess2000[1];
  238. log_dbg("%s, ++",__func__);
  239. cess2000_set_dhgable(1, 1);
  240. cess2000_set_chgable(1, 1);
  241. cess2000_enable_bsytikchk(1);
  242. cess2000_disable_pcs_bsytiksnd(1);
  243. cess2000_sm_init(1);
  244. while( 1 ){
  245. cess2000_sm(1);
  246. cess2000_update(1);
  247. cess2000_aux(1);
  248. usleep(10000); /* 10ms */
  249. }
  250. log_dbg("%s, --",__func__);
  251. return NULL;
  252. }
  253. //static void cess2000_task(int signo){
  254. // cess2000_sm( 1 );
  255. //}
  256. //static void cess2000_init_sigaction(){
  257. // struct sigaction act;
  258. // act.sa_handler = cess2000_task;
  259. // act.sa_flags = 0;
  260. // sigemptyset(&act.sa_mask);
  261. // sigaction(SIGPROF,&act,NULL); //设置信号 SIGPROF 的处理函数为 print_info
  262. //}
  263. //static void cess2000_init_timer()
  264. //{
  265. // struct itimerval value;
  266. // value.it_value.tv_sec = 0;
  267. // value.it_value.tv_usec = 10000;
  268. // value.it_interval=value.it_value;
  269. // setitimer(ITIMER_PROF,&value,NULL);
  270. //}
  271. /********************************************
  272. static int cess2000_init_timer2()
  273. {
  274. struct sigevent evp;
  275. struct itimerspec ts;
  276. timer_t timer;
  277. int ret;
  278. memset(&evp, 0, sizeof(evp));
  279. evp.sigev_value.sival_ptr = &timer;
  280. evp.sigev_notify = SIGEV_THREAD;
  281. evp.sigev_notify_function = cess2000_task;
  282. evp.sigev_value.sival_int = 3; //作为handle()的参数
  283. ret = timer_create(CLOCK_REALTIME, &evp, &timer);
  284. if( ret){
  285. perror("timer_create");
  286. }
  287. ts.it_interval.tv_sec = 0;
  288. ts.it_interval.tv_nsec = 10000000;
  289. ts.it_value.tv_sec = 0;
  290. ts.it_value.tv_nsec = 10000000;
  291. ret = timer_settime(timer, TIMER_ABSTIME, &ts, NULL);
  292. if( ret )
  293. {
  294. perror("timer_settime");
  295. }
  296. }
  297. *************************************************/
  298. int cess2000_get_cmd( int idx )
  299. {
  300. return cess2000[idx].cmd;
  301. }
  302. void cess2000_reset_cmd(int idx)
  303. {
  304. cess2000[idx].cmd = CMD_SM_DONE;
  305. }
  306. int cess2000_init( void )
  307. {
  308. pthread_t thrd;
  309. char buf[32];
  310. int result;
  311. char *errmsg = NULL;
  312. sqlite3* db = NULL;
  313. char sql[1024];
  314. struct dbcbparam_t cbparam;
  315. int ret = 0;
  316. struct cess2000_t* dev = &cess2000[1];
  317. log_dbg( "%s, ++",__func__);
  318. plt_lock_ctndb();
  319. db = plt_get_ctndb();
  320. sprintf(sql,"select * from cess2000");
  321. cbparam.nrow = 0;
  322. result = sqlite3_exec(db,sql, cess2000_dbcb_0,(void*)&cbparam,&errmsg);
  323. plt_unlock_ctndb();
  324. if( result != SQLITE_OK ){
  325. log_dbg("%s, result != SQLITE_OK : %d", __func__, result );
  326. ret = -1;
  327. }else if( cbparam.ret != 0){
  328. log_dbg("%s, cbparam.ret != 0 : %d", __func__, cbparam.ret );
  329. ret = -2;
  330. }else if( cbparam.nrow != 1 ){
  331. log_dbg("%s, cbparam.nrow != 1 : %d", __func__, cbparam.nrow );
  332. ret = -3;
  333. }else{
  334. //chan_set_mbs(dev->chan_idx, DEVM_CESS2000, 1);
  335. //chan_set_en(dev->chan_idx, 1);
  336. if(pthread_create(&thrd,NULL, cess2000_thrd_main, NULL)!=0){
  337. log_dbg("%s, create cess2000 thrd main fail", __func__);
  338. ret = -1;
  339. }
  340. }
  341. log_dbg("%s, --, ret:%d", __func__,ret);
  342. return ret;
  343. }
  344. int cess2000_is_aps_changed(int idx)
  345. {
  346. return (cess2000[idx].pow.aps != cess2000[idx].pow.last_aps)?1:0;
  347. }
  348. int cess2000_set_socd(int idx, double val)
  349. {
  350. cess2000[idx].socd = val;
  351. return 0;
  352. }
  353. int cess2000_set_socc(int idx, double val)
  354. {
  355. cess2000[idx].socc = val;
  356. return 0;
  357. }
  358. double cess2000_get_socd(int idx)
  359. {
  360. return cess2000[idx].socd;
  361. }
  362. double cess2000_get_socc(int idx)
  363. {
  364. return cess2000[idx].socc;
  365. }
  366. int cess2000_get_cell_otp(int idx)
  367. {
  368. return cess2000[idx].cell_otp;
  369. }
  370. int cess2000_get_cell_utp(int idx)
  371. {
  372. return cess2000[idx].cell_utp;
  373. }
  374. int cess2000_cfg_save_socc(int idx)
  375. {
  376. sqlite3* db = NULL;
  377. char sql[1024];
  378. int result = 0;
  379. plt_lock_ctndb();
  380. db = plt_get_ctndb();
  381. sprintf(sql,"update cess2000 set socc=%d where idx=1",(int)cess2000_get_socc(idx));
  382. result = sqlite3_exec(db,sql, NULL,NULL,NULL);
  383. plt_unlock_ctndb();
  384. if(result == SQLITE_OK){
  385. return 0;
  386. }else{
  387. return -1;
  388. }
  389. }
  390. int cess2000_cfg_save_socd(int idx)
  391. {
  392. sqlite3* db = NULL;
  393. char sql[1024];
  394. int result = 0;
  395. plt_lock_ctndb();
  396. db = plt_get_ctndb();
  397. sprintf(sql,"update cess2000 set socd=%d where idx=1",(int)cess2000_get_socd(idx));
  398. result = sqlite3_exec(db,sql, NULL,NULL,NULL);
  399. plt_unlock_ctndb();
  400. if(result == SQLITE_OK){
  401. return 0;
  402. }else{
  403. return -1;
  404. }
  405. }
  406. int cess2000_get_tool_data(int idx,char* buf)
  407. {
  408. struct cess2000_t* dev = &cess2000[idx];
  409. struct statemachine_t* sm = &dev->sm;
  410. char buf_temp[1024];
  411. if(idx < 1 || idx > CESS2000_NBR_MAX )
  412. return -1;
  413. sprintf(buf, " norm_cap:%d norm_pow:%d min_pow:%d\n", dev->pow.norm_cap, dev->pow.norm_pow, dev->pow.min_pow);
  414. sm_get_summary(sm, buf_temp, sizeof(buf_temp));
  415. strcat(buf,buf_temp);
  416. sprintf(buf_temp," ap:"L_GREEN"%d"NONE" aps:%d soc:"L_GREEN"%.1f"NONE" dhgable:%d chgable:%d socd:%.1f socc:%.1f cell_otp:%d utp:%d",
  417. dev->pow.ap, dev->pow.aps, dev->pow.soc,
  418. dev->pow.bdhgable,dev->pow.bchgable, dev->socd, dev->socc, dev->cell_otp, dev->cell_utp);
  419. strcat(buf,buf_temp);
  420. sprintf(buf_temp," bsytik_en:%d from_host:%03d tiemout:%d pcs_bsytik_en:%d\n",
  421. dev->bsytik.en, dev->bsytik.from_host, dev->bsytik.timeout,
  422. dev->pcstik.en);
  423. strcat(buf,buf_temp);
  424. return 0;
  425. }
  426. unsigned short cess2000_get_cmd_param1(int idx)
  427. {
  428. return cess2000[idx].cmdpara[0];
  429. }
  430. unsigned short cess2000_get_cmd_param2(int idx)
  431. {
  432. return cess2000[idx].cmdpara[1];
  433. }
  434. unsigned short cess2000_get_cmd_param3(int idx)
  435. {
  436. return cess2000[idx].cmdpara[2];
  437. }
  438. unsigned short cess2000_get_cmd_param4(int idx)
  439. {
  440. return cess2000[idx].cmdpara[3];
  441. }
  442. int cess2000_set_cmd(int idx,int cmd)
  443. {
  444. cess2000[idx].cmd = cmd;
  445. return 0;
  446. }
  447. int cess2000_set_cmd_param1(int idx,unsigned short param)
  448. {
  449. cess2000[idx].cmdpara[0] = param;
  450. return 0;
  451. }
  452. int cess2000_set_cmd_param2(int idx,unsigned short param)
  453. {
  454. cess2000[idx].cmdpara[1] = param;
  455. return 0;
  456. }
  457. int cess2000_set_cmd_param3(int idx,unsigned short param)
  458. {
  459. cess2000[idx].cmdpara[2] = param;
  460. return 0;
  461. }
  462. int cess2000_set_cmd_param4(int idx,unsigned short param)
  463. {
  464. cess2000[idx].cmdpara[3] = param;
  465. return 0;
  466. }
  467. int cess2000_set_bsytikchk_from_host(int idx,unsigned char tick)
  468. {
  469. cess2000[idx].bsytik.from_host = tick;
  470. return 0;
  471. }