it6000.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. #include "plt.h"
  2. struct it6000_t it6000[IT6000_NBR_MAX + 1];
  3. int it6000_reset_bsytikchk(int idx)
  4. {
  5. it6000[idx].bsytik.timer = 0;
  6. it6000[idx].bsytik.timeout = 0;
  7. it6000[idx].bsytik.chkcnt = 0;
  8. return 0;
  9. }
  10. // 0 : not timeout
  11. // 1 : timeout
  12. int it6000_is_bsytikchk_timeout(int idx)
  13. {
  14. struct it6000_t* dev = &it6000[1];
  15. if( dev->bsytik.chken == 1 ){
  16. return it6000[idx].bsytik.timeout;
  17. }else{
  18. return 0;
  19. }
  20. }
  21. int it6000_set_bsytik(int idx)
  22. {
  23. it6000[idx].bsytik.from_host++;
  24. return 0;
  25. }
  26. int it6000_get_bsytikchk_from_host(int idx)
  27. {
  28. it6000[idx].bsytik.from_host++;
  29. return 0;
  30. }
  31. int it6000_get_bsytikchk_en(int idx)
  32. {
  33. return it6000[idx].bsytik.chken;
  34. }
  35. int it6000_set_bsytikchk_en(int idx, int val)
  36. {
  37. it6000[idx].bsytik.chken = val;
  38. return 0;
  39. }
  40. int it6000_set_dac_param_en(int idx, int val)
  41. {
  42. struct it6000_t* dev = &it6000[1];
  43. struct comm_t* comm = &dev->comm;
  44. comm_set_dac_param_en(comm, val);
  45. return 0;
  46. }
  47. static int it6000_dbcb_0(void *para,int ncolumn,char ** columnvalue,char *columnname[])
  48. {
  49. int i;
  50. struct dbcbparam_t* pcbparam = (struct dbcbparam_t*)para;
  51. struct it6000_t* dev = &it6000[1];
  52. pcbparam->nrow++;
  53. log_dbg("%s, ++, row:%d, col:%d", __func__,pcbparam->nrow,ncolumn);
  54. for( i = 0; i < ncolumn; i++){
  55. if( strcmp("info",columnname[i]) == 0){
  56. strcpy(dev->szinfo,columnvalue[i]);
  57. }else if( strcmp("adr",columnname[i]) == 0){
  58. dev->comm.adr = atoi(columnvalue[i]);
  59. }else if( strcmp("chan_idx",columnname[i]) == 0){
  60. dev->comm.chanidx = atoi(columnvalue[i]);
  61. }else if( strcmp("Vh",columnname[i]) == 0){
  62. dev->Vh_set = atof(columnvalue[i]);
  63. }else if( strcmp("Vl",columnname[i]) == 0){
  64. dev->Vl_set = atof(columnvalue[i]);
  65. }else if( strcmp("ovp",columnname[i]) == 0){
  66. dev->ovp_set = atof(columnvalue[i]);
  67. }else if( strcmp("uvp",columnname[i]) == 0){
  68. dev->uvp_set = atof(columnvalue[i]);
  69. }else if( strcmp("ocp",columnname[i]) == 0){
  70. dev->ocp_set = atof(columnvalue[i]);
  71. }
  72. }
  73. pcbparam->ret = 0;
  74. log_dbg("%s, --,ret:%d",__func__,pcbparam->ret);
  75. return 0;
  76. }
  77. int it6000_get_cmd( int idx )
  78. {
  79. return it6000[idx].cmd;
  80. }
  81. int it6000_get_comm_st(int idx)
  82. {
  83. struct it6000_t* dev = &it6000[idx];
  84. struct comm_t* comm = &dev->comm;
  85. return comm_get_state(comm);
  86. }
  87. void it6000_reset_cmd(int idx)
  88. {
  89. it6000[idx].cmd = CMD_SM_DONE;
  90. }
  91. int it6000_get_state( int idx )
  92. {
  93. return it6000[idx].sm.state;
  94. }
  95. char* it6000_get_state_str( int idx )
  96. {
  97. return it6000[idx].sm.szState;
  98. }
  99. int it6000_get_step( int idx )
  100. {
  101. return it6000[idx].sm.step;
  102. }
  103. int it6000_get_tick( int idx )
  104. {
  105. return it6000[idx].sm.tick;
  106. }
  107. double it6000_get_tick_ave( int idx )
  108. {
  109. return it6000[idx].sm.timing_ave;
  110. }
  111. double it6000_get_tick_cur( int idx )
  112. {
  113. return it6000[idx].sm.timing_cur;
  114. }
  115. double it6000_get_tick_max( int idx )
  116. {
  117. return it6000[idx].sm.timing_max;
  118. }
  119. char* it6000_get_err_str( int idx )
  120. {
  121. return it6000[idx].sm.szerr;
  122. }
  123. int it6000_chk_state( int idx, int stat )
  124. {
  125. return it6000_get_state(idx) == stat ? 0 : -1;
  126. }
  127. int it6000_get_sysstatus( int idx )
  128. {
  129. return it6000[idx].sysStatus;
  130. }
  131. int it6000_get_dc_mode( int idx )
  132. {
  133. return it6000[idx].dc_mode;
  134. }
  135. float it6000_get_dc_volt( int idx )
  136. {
  137. return it6000[idx].dc_volt;
  138. }
  139. float it6000_get_dc_volt_rise( int idx )
  140. {
  141. return it6000[idx].dc_volt_rise;
  142. }
  143. float it6000_get_dc_volt_fall( int idx )
  144. {
  145. return it6000[idx].dc_volt_fall;
  146. }
  147. float it6000_get_dc_current( int idx )
  148. {
  149. return it6000[idx].dc_current;
  150. }
  151. float it6000_get_dc_current_rise( int idx )
  152. {
  153. return it6000[idx].dc_current_rise;
  154. }
  155. float it6000_get_dc_current_fall( int idx )
  156. {
  157. return it6000[idx].dc_current_fall;
  158. }
  159. float it6000_get_dc_v_high( int idx )
  160. {
  161. return it6000[idx].dc_v_high;
  162. }
  163. float it6000_get_dc_v_low( int idx )
  164. {
  165. return it6000[idx].dc_v_low;
  166. }
  167. float it6000_get_dc_i_high( int idx )
  168. {
  169. return it6000[idx].dc_i_high;
  170. }
  171. float it6000_get_dc_i_low( int idx )
  172. {
  173. return it6000[idx].dc_i_low;
  174. }
  175. int it6000_get_cc_speed_state( int idx )
  176. {
  177. return it6000[idx].cc_speed_state;
  178. }
  179. int it6000_get_cv_speed_state( int idx )
  180. {
  181. return it6000[idx].cv_speed_state;
  182. }
  183. float it6000_get_power_high( int idx )
  184. {
  185. return it6000[idx].power_high;
  186. }
  187. float it6000_get_power_low( int idx )
  188. {
  189. return it6000[idx].power_low;
  190. }
  191. float it6000_get_meter_v_rms( int idx )
  192. {
  193. return it6000[idx].meter_v_rms;
  194. }
  195. float it6000_get_meter_i_rms( int idx )
  196. {
  197. return it6000[idx].meter_i_rms;
  198. }
  199. float it6000_get_meter_p_rms( int idx )
  200. {
  201. return it6000[idx].meter_p_rms;
  202. }
  203. int it6000_get_meter_op_reg( int idx )
  204. {
  205. return it6000[idx].meter_op_reg;
  206. }
  207. int it6000_get_meter_state_reg( int idx )
  208. {
  209. return it6000[idx].meter_state_reg;
  210. }
  211. int it6000_get_meter_ques_reg( int idx )
  212. {
  213. return it6000[idx].meter_ques_reg;
  214. }
  215. int it6000_get_dc_ovp_enable( int idx )
  216. {
  217. return it6000[idx].dc_ovp_enable;
  218. }
  219. float it6000_get_dc_ovp( int idx )
  220. {
  221. return it6000[idx].dc_ovp;
  222. }
  223. float it6000_get_dc_ovp_delay( int idx )
  224. {
  225. return it6000[idx].dc_ovp_delay;
  226. }
  227. int it6000_get_dc_ocp_enable( int idx )
  228. {
  229. return it6000[idx].dc_ocp_enable;
  230. }
  231. float it6000_get_dc_ocp( int idx )
  232. {
  233. return it6000[idx].dc_ocp;
  234. }
  235. float it6000_get_dc_ocp_delay( int idx )
  236. {
  237. return it6000[idx].dc_ocp_delay;
  238. }
  239. int it6000_get_dc_opp_enable( int idx )
  240. {
  241. return it6000[idx].dc_opp_enable;
  242. }
  243. float it6000_get_dc_opp( int idx )
  244. {
  245. return it6000[idx].dc_opp;
  246. }
  247. float it6000_get_dc_opp_delay( int idx )
  248. {
  249. return it6000[idx].dc_opp_delay;
  250. }
  251. int it6000_get_dc_ucp_enable( int idx )
  252. {
  253. return it6000[idx].dc_ucp_enable;
  254. }
  255. float it6000_get_dc_ucp( int idx )
  256. {
  257. return it6000[idx].dc_ucp;
  258. }
  259. float it6000_get_dc_ucp_delay( int idx )
  260. {
  261. return it6000[idx].dc_ucp_delay;
  262. }
  263. float it6000_get_dc_ucp_warmup( int idx )
  264. {
  265. return it6000[idx].dc_ucp_warmup;
  266. }
  267. int it6000_get_dc_uvp_enable( int idx )
  268. {
  269. return it6000[idx].dc_uvp_enable;
  270. }
  271. float it6000_get_dc_uvp( int idx )
  272. {
  273. return it6000[idx].dc_uvp;
  274. }
  275. float it6000_get_dc_uvp_delay( int idx )
  276. {
  277. return it6000[idx].dc_uvp_delay;
  278. }
  279. float it6000_get_dc_uvp_warmup( int idx )
  280. {
  281. return it6000[idx].dc_uvp_warmup;
  282. }
  283. int it6000_get_sw_prot( int idx )
  284. {
  285. return it6000[idx].sw_prot;
  286. }
  287. int it6000_get_hw_prot( int idx )
  288. {
  289. return it6000[idx].hw_prot;
  290. }
  291. static void it6000_update(int idx)
  292. {
  293. struct it6000_t* dev = &it6000[idx];
  294. dev->pow.ap = dev->meter_i_rms;
  295. }
  296. static void* it6000_thrd_main(void* param)
  297. {
  298. int idx = 1;
  299. struct it6000_t* dev = &it6000[idx];
  300. log_dbg("%s, idx:%d, ++",__func__, idx);
  301. it6000_set_bsytikchk_en(idx, 1);
  302. it6000_sm_init(1);
  303. it6000_comm_init(1);
  304. while(1){
  305. it6000_comm_dac(1);
  306. it6000_sm(1);
  307. it6000_update(1);
  308. usleep(10000); /* 10ms */
  309. }
  310. log_dbg("%s, --",__func__);
  311. }
  312. static void* it6000_thrd_aux(void* param)
  313. {
  314. int idx = 1;
  315. struct it6000_t* dev = &it6000[idx];
  316. struct statemachine_t* sm = &dev->sm;
  317. log_dbg("%s, ++",__func__);
  318. while(1){
  319. if( dev->bsytik.timer++ >= 10 ){ // chk every 1 second
  320. dev->bsytik.timer = 0;
  321. if( dev->bsytik.last_from_host != dev->bsytik.from_host ){ // refresh
  322. dev->bsytik.last_from_host = dev->bsytik.from_host;
  323. dev->bsytik.chkcnt = 0;
  324. }else{ // counting
  325. if( dev->bsytik.chkcnt++ >= 5){ // 5s
  326. dev->bsytik.timeout = 1;
  327. dev->bsytik.chkcnt = 0;
  328. }
  329. }
  330. }
  331. usleep(100000); /* 100ms */
  332. }
  333. log_dbg("%s, --",__func__);
  334. }
  335. int it6000_init()
  336. {
  337. pthread_t thrd;
  338. int ret = 0;
  339. int result;
  340. char *errmsg = NULL;
  341. char sql[1024];
  342. struct dbcbparam_t cbparam;
  343. sqlite3* db = NULL;
  344. struct it6000_t* dev = &it6000[1];
  345. log_dbg( "%s, ++",__func__);
  346. plt_lock_ctndb();
  347. db = plt_get_ctndb();
  348. sprintf(sql,"select * from it6000");
  349. cbparam.nrow = 0;
  350. result = sqlite3_exec(db,sql, it6000_dbcb_0,(void*)&cbparam,&errmsg);
  351. plt_unlock_ctndb();
  352. if( result != SQLITE_OK ){
  353. log_dbg("%s, result != SQLITE_OK, result:%d", __func__, result);
  354. ret = -1;
  355. }else if( cbparam.ret != 0){
  356. log_dbg("%s, cbparam.ret != 0, %d", __func__, cbparam.ret);
  357. ret = -2;
  358. }else if( cbparam.nrow != 1 ){
  359. log_dbg("%s, cbparam.nrow != 1, %d", __func__, cbparam.nrow);
  360. ret = -3;
  361. }else{
  362. if(pthread_create(&thrd, NULL, it6000_thrd_main, NULL) != 0){
  363. log_dbg( "%s, create it6000 thrd main fail", __func__);
  364. ret = -1;
  365. }else if(pthread_create(&thrd, NULL, it6000_thrd_aux, NULL) != 0){
  366. log_dbg( "%s, create it6000 thrd aux fail", __func__);
  367. ret = -1;
  368. }
  369. }
  370. log_dbg( "%s, --, ret:%d", __func__, ret);
  371. return ret;
  372. }
  373. int it6000_send_sm_cmd( int idx, int val )
  374. {
  375. int ret = 0;
  376. struct it6000_t* dev = &it6000[idx];
  377. dev->cmd = val;
  378. log_dbg("%s, idx:%d, cmd:%d, ret:%d",__func__, idx, val, ret);
  379. return ret;
  380. }
  381. int it6000_set_aps(int idx, int aps)
  382. {
  383. struct it6000_t* dev = &it6000[idx];
  384. int ret = 0;
  385. dev->pow.last_aps = dev->pow.aps;
  386. dev->pow.aps = aps;
  387. log_dbg( "%s, idx:%d, aps:%d, last_aps:%d", __func__, idx, dev->pow.aps, dev->pow.last_aps);
  388. return ret;
  389. }
  390. int it6000_reset_aps(int idx)
  391. {
  392. struct it6000_t* dev = &it6000[idx];
  393. int ret = 0;
  394. dev->pow.last_aps = 0;
  395. dev->pow.aps = 0;
  396. //log_dbg( "%s, idx:%d, val:%d, ret:%d", __func__, idx, aps, ret);
  397. return ret;
  398. }
  399. int it6000_get_aps(int idx)
  400. {
  401. return it6000[idx].pow.aps;
  402. }
  403. int it6000_get_last_aps(int idx)
  404. {
  405. return it6000[idx].pow.last_aps;
  406. }
  407. int it6000_is_aps_changed(int idx)
  408. {
  409. return (it6000[idx].pow.aps != it6000[idx].pow.last_aps)?1:0;
  410. }
  411. int it6000_get_chan_idx(int idx)
  412. {
  413. return it6000[idx].comm.chanidx;
  414. }
  415. int it6000_get_adr(int idx)
  416. {
  417. return it6000[idx].comm.adr;
  418. }
  419. char* it6000_get_comm_state_str(int idx)
  420. {
  421. return it6000[idx].comm.szState;
  422. }
  423. double it6000_get_dac_ave(int idx)
  424. {
  425. return it6000[idx].comm.dac.timing_ave;
  426. }
  427. double it6000_get_dac_cur(int idx)
  428. {
  429. return it6000[idx].comm.dac.timing_cur;
  430. }
  431. double it6000_get_dac_max(int idx)
  432. {
  433. return it6000[idx].comm.dac.timing_max;
  434. }
  435. int it6000_get_dac_param_en(int idx)
  436. {
  437. return it6000[idx].comm.dac.param_en;
  438. }
  439. char* it6000_get_info_str(int idx)
  440. {
  441. return it6000[idx].szinfo;
  442. }
  443. struct it6000_t* it6000_get_all_data_ptr()
  444. {
  445. return it6000;
  446. }
  447. int it6000_get_tool_data(int idx,char* buf)
  448. {
  449. if(idx < 1 || idx > IES1000_NBR_MAX || buf == NULL){
  450. return -1;
  451. }
  452. struct it6000_t* dev = &it6000[idx];
  453. struct statemachine_t* sm = &dev->sm;
  454. struct comm_t* comm = &dev->comm;
  455. char temp_buf[1000];
  456. int i = 0;
  457. sm_get_summary(sm, temp_buf, sizeof(temp_buf));
  458. sprintf(buf,"%s ", temp_buf);
  459. comm_get_summary(comm, temp_buf, sizeof(temp_buf));
  460. strcat(buf, temp_buf);
  461. // 0xF100
  462. sprintf(temp_buf,"bsytik_from_host:%03d timeout:%d en:%d\n",
  463. dev->bsytik.from_host, dev->bsytik.timeout, dev->bsytik.chken);
  464. strcat(buf, temp_buf);
  465. sprintf(temp_buf,"param vh_set:%.3f,vl_set:%.3f,aps:%d,aps_last:%d ",dev->Vh_set,dev->Vl_set,dev->pow.aps,dev->pow.last_aps);
  466. strcat(buf, temp_buf);
  467. sprintf(temp_buf,"SysStatus:%s,dc_mode:%s,Iset:%.3f,v_high:%.3f,v_low:%.3f\n",
  468. dev->szSysStatus,dev->szDc_mode,it6000_get_dc_current(idx),it6000_get_dc_v_high(idx),it6000_get_dc_v_low(idx));
  469. strcat(buf, temp_buf);
  470. sprintf(temp_buf,"ovp_e:%d,ovp:%.3f,uvp_e:%d,uvp:%.3f,ocp_e:%d,ocp:%.3f\n",
  471. it6000_get_dc_ovp_enable(idx),it6000_get_dc_ovp(idx),
  472. it6000_get_dc_uvp_enable(idx),it6000_get_dc_uvp(idx),
  473. it6000_get_dc_ocp_enable(idx),it6000_get_dc_ocp(idx));
  474. strcat(buf, temp_buf);
  475. sprintf(temp_buf,"v_rms:%.3f,i_rms:%.3f,p_rms:%.3f\n",it6000_get_meter_v_rms(idx),it6000_get_meter_i_rms(idx),it6000_get_meter_p_rms(idx));
  476. strcat(buf, temp_buf);
  477. }
  478. int it6000_get_ap( int idx )
  479. {
  480. return it6000[idx].pow.ap;
  481. }
  482. int it6000_get_tbmqtt_main_data(int idx,char* buf)
  483. {
  484. sprintf(buf,"'pcs_state':'%s','pcs_dc_v':%.3f,'pcs_dc_i':%.3f,'pcs_dc_p':%.3f",
  485. it6000_get_state_str(idx),it6000_get_meter_v_rms(idx),it6000_get_meter_i_rms(idx),it6000_get_meter_p_rms(idx));
  486. }
  487. int it6000_get_tbmqtt_secondy_data(int idx,char* buf)
  488. {
  489. sprintf(buf, "'Vh':%.1f, 'Vl':%.1f, 'Iset':%.1f,'ovp':%.1f,'uvp':%.1f, 'ocp':%.1f",
  490. it6000_get_dc_v_high(idx),it6000_get_dc_v_low(idx),it6000_get_dc_current(idx),
  491. it6000_get_dc_ovp(idx),it6000_get_dc_uvp(idx),it6000_get_dc_ocp(idx));
  492. }
  493. int it6000_get_cloud_main_data(int cnt_idx,int idx,char* buf)
  494. {
  495. // sprintf(buf, "'ctn%d_pcs_state':%d, 'ctn%d_pcs_runstat':%d, 'ctn%d_pcs_dcv':%d, 'ctn%d_pcs_dcc':%d,\
  496. // 'ctn%d_pcs_ac_brk':%d, 'ctn%d_pcs_dc_brk':%d, 'ctn%d_pcs_emg_btn':%d, 'ctn%d_pcs_errstat':%d, 'ctn%d_pcs_gf':%.1f, 'ctn%d_pcs_ap':%d",
  497. // cnt_idx, it6000_get_state( idx ),
  498. // cnt_idx, it6000_get_runstat( idx ),
  499. // cnt_idx, it6000_get_dcv( idx ),
  500. // cnt_idx, it6000_get_dcc( idx ),
  501. // cnt_idx, it6000_get_ac_brk( idx ),
  502. // cnt_idx, it6000_get_dc_brk( idx ),
  503. // cnt_idx, it6000_get_emg_btn( idx ),
  504. // cnt_idx, it6000_get_errstat( idx ),
  505. // cnt_idx, it6000_get_grid_freq( idx ),
  506. // cnt_idx, it6000_get_ap( idx ));
  507. }
  508. int it6000_get_cloud_secondy_data(int cnt_idx,int idx,char* buf)
  509. {
  510. // sprintf(buf, "'ctn%d_pcs_ua':%.1f, 'ctn%d_pcs_ub':%.1f, 'ctn%d_pcs_uc':%.1f,\
  511. // 'ctn%d_pcs_ia':%.1f, 'ctn%d_pcs_ib':%.1f, 'ctn%d_pcs_ic':%.1f,'ctn%d_pcs_gf':%.1f,\
  512. // 'ctn%d_pcs_t_a':%d, 'ctn%d_pcs_t_b':%d, 'ctn%d_pcs_t_c':%d, 'ctn%d_pcs_t_rct':%d,'ctn%d_pcs_t_env':%d",
  513. // cnt_idx, it6000_get_ua( idx ),
  514. // cnt_idx, it6000_get_ub( idx ),
  515. // cnt_idx, it6000_get_uc( idx ),
  516. // cnt_idx, it6000_get_ia( idx ),
  517. // cnt_idx, it6000_get_ib( idx ),
  518. // cnt_idx, it6000_get_ic( idx ),
  519. // cnt_idx, it6000_get_grid_freq( idx ),
  520. // cnt_idx, it6000_get_temp_igbt_a( idx ),
  521. // cnt_idx, it6000_get_temp_igbt_b( idx ),
  522. // cnt_idx, it6000_get_temp_igbt_c( idx ),
  523. // cnt_idx, it6000_get_temp_reactor( idx ),
  524. // cnt_idx, it6000_get_temp_env( idx ));
  525. }