evc.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. #include "evc.h"
  2. #include "evc_comm.h"
  3. #include "evc_sm.h"
  4. #include "plt.h"
  5. int evc_nbr;
  6. struct evc_t evc[EVC_NBR_MAX + 1];
  7. int evc_send_sm_cmd(int idx, int cmd)
  8. {
  9. int ret = 0;
  10. struct evc_t *dev = &evc[idx];
  11. dev->cmd = cmd;
  12. log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, cmd, ret);
  13. return ret;
  14. }
  15. int evc_send_sm_cmd_all(int cmd)
  16. {
  17. int ret = 0;
  18. int idx;
  19. struct evc_t *dev = NULL;
  20. for (idx = 1; idx <= evc_nbr; idx++)
  21. {
  22. evc_send_sm_cmd(idx, cmd);
  23. }
  24. return ret;
  25. }
  26. int evc_chk_state_all(int stat)
  27. {
  28. int idx;
  29. for (idx = 1; idx <= evc_nbr; idx++)
  30. {
  31. if (evc_get_state(idx) != stat)
  32. {
  33. return -1;
  34. }
  35. }
  36. return 0;
  37. }
  38. int evc_get_cmd(int idx)
  39. {
  40. return evc[idx].cmd;
  41. }
  42. void evc_reset_cmd(int idx)
  43. {
  44. evc[idx].cmd = CMD_SM_DONE;
  45. }
  46. int evc_get_state(int idx)
  47. {
  48. return evc[idx].sm.state;
  49. }
  50. void evc_aux(int idx)
  51. {
  52. static int cnt = 0;
  53. if (cnt < evc_nbr && mqtt_get_state() == SMST_READY)
  54. {
  55. cnt++;
  56. if (cnt >= evc_nbr)
  57. {
  58. cloud.fa_init = 0;
  59. }
  60. char buf[4096] = {0};
  61. evc_get_init_data(ctn_get_idx_in_ess(), idx, buf);
  62. cloud_send_init(buf);
  63. }
  64. }
  65. static void *evc_thrd_main(void *param)
  66. {
  67. struct evc_t *dev = NULL;
  68. int idx;
  69. log_dbg("%s, ++", __func__);
  70. for (idx = 1; idx <= evc_nbr; idx++)
  71. {
  72. evc_sm_init(idx);
  73. evc_comm_init(idx);
  74. }
  75. while (1)
  76. {
  77. for (idx = 1; idx <= evc_nbr; idx++)
  78. {
  79. evc_comm_dac(idx);
  80. evc_sm(idx);
  81. evc_aux(idx);
  82. }
  83. sleep(1);
  84. //usleep(500 * 1000);
  85. }
  86. log_dbg("%s, --, idx:%d", __func__, idx);
  87. }
  88. static int evc_dbcb(void *para, int ncolumn, char **columnvalue, char *columnname[])
  89. {
  90. int i;
  91. struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para;
  92. struct evc_t *pdev;
  93. int idx = 0;
  94. pcbparam->nrow++;
  95. log_dbg("%s, ++, row:%d, col:%d", __func__, pcbparam->nrow, ncolumn);
  96. // default value
  97. pdev = &evc[pcbparam->nrow];
  98. for (i = 0; i < ncolumn; i++)
  99. {
  100. if (strcmp("chan_idx", columnname[i]) == 0)
  101. {
  102. pdev->comm.chanidx = atoi(columnvalue[i]);
  103. }
  104. else if (strcmp("info", columnname[i]) == 0)
  105. {
  106. strcpy(pdev->szinfo, columnvalue[i]);
  107. }
  108. else if (strcmp("adr", columnname[i]) == 0)
  109. {
  110. pdev->comm.adr = atoi(columnvalue[i]);
  111. }
  112. else if (strcmp("idx", columnname[i]) == 0)
  113. {
  114. pdev->idx = atoi(columnvalue[i]);
  115. }
  116. else if (strcmp("devid", columnname[i]) == 0)
  117. {
  118. if (columnvalue[i] != NULL && strcmp(columnvalue[i], "") != 0)
  119. {
  120. strcpy(pdev->szdev_id, columnvalue[i]);
  121. }
  122. else
  123. {
  124. log_dbg("%s, devid is null", __func__);
  125. }
  126. }
  127. }
  128. pcbparam->ret = 0;
  129. log_dbg("%s, --,ret:%d", __func__, pcbparam->ret);
  130. return 0;
  131. }
  132. int evc_init(void)
  133. {
  134. pthread_t thrd;
  135. int result = 0;
  136. int ret = 0;
  137. int idx = 0;
  138. struct evc_t *dev = NULL;
  139. char *errmsg = NULL;
  140. char sql[1024];
  141. struct dbcbparam_t cbparam;
  142. sqlite3 *db = plt_get_ctndb();
  143. log_dbg("%s, ++", __func__);
  144. plt_lock_ctndb();
  145. sprintf(sql, "select * from evc");
  146. cbparam.nrow = 0;
  147. result = sqlite3_exec(db, sql, evc_dbcb, (void *)&cbparam, &errmsg);
  148. plt_unlock_ctndb();
  149. if (result != SQLITE_OK)
  150. {
  151. log_dbg("%s, result != SQLITE_OK : %d", __func__, result);
  152. ret = -1;
  153. }
  154. else if (cbparam.ret != 0)
  155. {
  156. log_dbg("%s, cbparam.ret != 0 : %d", __func__, cbparam.ret);
  157. ret = -2;
  158. }
  159. else
  160. {
  161. evc_nbr = cbparam.nrow;
  162. cbparam.nrow = 0;
  163. db = plt_get_devdb();
  164. plt_lock_devdb();
  165. sprintf(sql, "select * from evc");
  166. result = sqlite3_exec(db, sql, evc_dbcb, (void *)&cbparam, &errmsg);
  167. plt_unlock_devdb();
  168. for (int i = 1; i <= evc_nbr; ++i)
  169. {
  170. if (strcmp(evc[i].szdev_id, "") == 0)
  171. {
  172. if (get_snow_id(evc[i].szdev_id) != 0)
  173. {
  174. ret = -4;
  175. }
  176. else
  177. {
  178. char sql[1024];
  179. char *errmsg = NULL;
  180. sprintf(sql, "update evc set devid=\"%s\" where idx=%d", evc[i].szdev_id, evc[i].idx);
  181. plt_lock_devdb();
  182. int rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  183. plt_unlock_devdb();
  184. if (rc != SQLITE_OK)
  185. {
  186. log_dbg("%s, failed to update level device id:%s", __func__, errmsg);
  187. ret = -4;
  188. goto leave;
  189. }
  190. else
  191. {
  192. log_dbg("%s, update device id:%s", __func__, evc[i].szdev_id);
  193. }
  194. }
  195. }
  196. }
  197. if (pthread_create(&thrd, NULL, evc_thrd_main, NULL) != 0)
  198. {
  199. ret = -1;
  200. log_dbg("%s, create evc thrd main fail", __func__);
  201. }
  202. }
  203. leave:
  204. log_dbg("%s--, ret:%d", __func__, ret);
  205. return ret;
  206. }
  207. int evc_get_addr(int idx)
  208. {
  209. return evc[idx].comm.adr;
  210. }
  211. int evc_set_dev_comp_start_temp(int idx, int val)
  212. {
  213. return 0;
  214. }
  215. int evc_set_dev_comp_gap_temp(int idx, int val)
  216. {
  217. return 0;
  218. }
  219. int evc_set_dev_heat_start_temp(int idx, int val)
  220. {
  221. // evc_set_dev_heat_stop_temp
  222. }
  223. int evc_set_dev_heat_gap_temp(int idx, int val)
  224. {
  225. return 0;
  226. }
  227. int evc_get_comm_st(int idx)
  228. {
  229. struct evc_t *dev = &evc[idx];
  230. struct comm_t *comm = &dev->comm;
  231. return comm_get_state(comm);
  232. }
  233. int evc_get_chan_idx(int idx)
  234. {
  235. struct evc_t *dev = &evc[idx];
  236. struct comm_t *comm = &dev->comm;
  237. return comm_get_chan_idx(comm);
  238. }
  239. char *evc_get_comm_st_str(int idx)
  240. {
  241. struct evc_t *dev = &evc[idx];
  242. struct comm_t *comm = &dev->comm;
  243. return comm_get_state_str(comm);
  244. }
  245. int evc_get_tick(int idx)
  246. {
  247. return evc[idx].sm.tick;
  248. }
  249. int evc_get_nbr()
  250. {
  251. return evc_nbr;
  252. }
  253. int evc_get_workstat(int idx)
  254. {
  255. return 0;
  256. }
  257. int evc_get_infan_stat(int idx)
  258. {
  259. return 0;
  260. }
  261. int evc_get_outfan_stat(int idx)
  262. {
  263. return 0;
  264. }
  265. int evc_get_cmp_stat(int idx)
  266. {
  267. return 0;
  268. }
  269. int evc_get_rtnwind_temp(int idx)
  270. {
  271. return 0;
  272. }
  273. int evc_get_eva_temp(int idx)
  274. {
  275. return 0;
  276. }
  277. int evc_get_cond_temp(int idx)
  278. {
  279. return 0;
  280. }
  281. int evc_get_infan_spd(int idx)
  282. {
  283. return 0;
  284. }
  285. int evc_get_outfan_spd(int idx)
  286. {
  287. return 0;
  288. }
  289. int evc_get_tool_data(int idx, char *buf)
  290. {
  291. if (idx < 1 || idx > evc_nbr || buf == NULL)
  292. return -1;
  293. struct evc_t *dev = &evc[idx];
  294. struct statemachine_t *sm = &dev->sm;
  295. struct comm_t *comm = &dev->comm;
  296. char buf_temp[1024];
  297. sm_get_summary(sm, buf_temp, sizeof(buf_temp));
  298. sprintf(buf, " [%d] %s ", idx, buf_temp);
  299. comm_get_summary(comm, buf_temp, sizeof(buf_temp));
  300. strcat(buf, buf_temp);
  301. sprintf(buf_temp, "\ndev id :%s sys_started:" GREEN "%d" NONE ",sys_run_state:" YELLOW "%s" NONE ",error level:" YELLOW "%d" NONE ",error code:" YELLOW "%d" NONE ",\
  302. elc_heat_state:%d,pump_state:%d,comp_state:%d,comp_heat_state:%d,\
  303. fan1_state:%d,fan2_state:%d,fan3_state:%d,\
  304. comp_rpm:%d, pump_rpm:%d,\
  305. in_water_temp:" YELLOW "%.1f" NONE ",out_water_temp:" YELLOW "%.1f" NONE ",ev_temp:" YELLOW "%.1f" NONE ",in_water_press:" YELLOW "%.1f" NONE ",\
  306. out_water_press:" YELLOW "%.1f" NONE "\n",
  307. dev->szdev_id,
  308. dev->started,
  309. dev->runModeStr, dev->err_lvl, dev->err_code, dev->elec_heat_state, dev->pump_state, dev->comp_state, dev->comp_heat_state,
  310. dev->fan1_state, dev->fan2_state, dev->fan3_state,
  311. dev->comp_rpm, dev->pump_rpm,
  312. dev->in_water_temp, dev->out_water_temp, dev->ev_temp, dev->in_water_press,
  313. dev->out_water_press);
  314. strcat(buf, buf_temp);
  315. return 0;
  316. }
  317. int evc_get_tbmqtt_data(int idx, char *buf)
  318. {
  319. struct evc_t *dev = &evc[idx];
  320. sprintf(buf, "'ac%d_state':'%s', 'ac%d_rtnwater_pre':%.1f,'ac%d_outwater_pre':%.1f,'ac%d_rtnwater_t':%.1f,'ac%d_outwater_t':%.1f,'ac%d_outside_t':%.1f, 'ac%d_run_mode':'%s',\
  321. ac%d_comp_state:%d,ac%d_comp_heat_state:%d,ac%d_elec_heat_state:%d,ac%d_pump_state:%d,ac%d_fan1_state:%d,ac%d_fan2_state:%d,ac%d_fan3_state:%d,ac%d_comp_rpm:%d,ac%d_pump_rpm:%d,\
  322. ac%d_err_code:%d,ac%d_err_lvl:%d,ac%d_in_out_water_press_sensor_err:%d,ac%d_ov_err:%d,ac%d_uv_err:%d,ac%d_lack_water_err:%d,ac%d_pump_err:%d,ac%d_pump_err_lock:%d,\
  323. ac%d_out_water_press_sensor_err:%d,ac%d_in_water_press_sensor_err:%d,ac%d_up_sensor_err:%d,ac%d_out_water_temp_sensor_err:%d,ac%d_sys_low_pressure_err:%d,ac%d_sys_high_pressure_switch_err:%d,\
  324. ac%d_out_air_over_temp_err:%d,ac%d_can_comm_err:%d,ac%d_in_air_temp_sensor_err:%d,ac%d_cooling_sys_err:%d,ac%d_in_air_over_temp_err:%d,ac%d_comp_VFD_ov_err:%d,ac%d_comp_VFD_uv_err:%d,\
  325. ac%d_comp_VFD_oc_err:%d,ac%d_comp_VFD_ot_err:%d,ac%d_comp_VFD_comm_err:%d,ac%d_comp_VFD_miss_phrase_err:%d,ac%d_comp_VFD_others_err:%d,ac%d_pump_press_diff_low_err:%d,\
  326. ac%d_out_air_over_temp_lock:%d,ac%d_sys_high_pressure_lock:%d,ac%d_sys_low_pressure_lock:%d,ac%d_comp_VFD_over_current_lock:%d,ac%d_comp_VFD_over_voltage_lock:%d,\
  327. ac%d_comp_VFD_under_voltage_lock:%d,ac%d_comp_VFD_over_temp_lock:%d,ac%d_comp_VFD_comm_lock:%d,ac%d_comp_VFD_miss_phrase_lock:%d,ac%d_comp_VFD_others_lock:%d,\
  328. ac%d_high_press_sensor_err:%d,ac%d_env_temp_sensor_err:%d,ac%d_in_water_temp_sensor_err:%d,ac%d_out_air_temp_sensor_err:%d,ac%d_condensate_sensor_err:%d,\
  329. ac%d_unexpected_power_off_err:%d,ac%d_out_water_low_temp_err:%d,ac%d_out_water_high_temp_err:%d,ac%d_out_water_over_press_err:%d",
  330. idx, dev->sm.szState,
  331. idx, dev->in_water_press,
  332. idx, dev->out_water_press,
  333. idx, dev->in_water_temp,
  334. idx, dev->out_water_temp,
  335. idx, dev->ev_temp,
  336. idx, dev->runModeStr,
  337. idx, dev->comp_state,
  338. idx, dev->comp_heat_state,
  339. idx, dev->elec_heat_state,
  340. idx, dev->pump_state,
  341. idx, dev->fan1_state,
  342. idx, dev->fan2_state,
  343. idx, dev->fan3_state,
  344. idx, dev->comp_rpm,
  345. idx, dev->pump_rpm,
  346. idx, dev->err_code,
  347. idx, dev->err_lvl,
  348. idx, dev->in_out_water_press_sensor_err,
  349. idx, dev->ov_err,
  350. idx, dev->uv_err,
  351. idx, dev->lack_water_err,
  352. idx, dev->pump_err,
  353. idx, dev->pump_err_lock,
  354. idx, dev->out_water_press_sensor_err,
  355. idx, dev->in_water_press_sensor_err,
  356. idx, dev->up_sensor_err,
  357. idx, dev->out_water_temp_sensor_err,
  358. idx, dev->sys_low_pressure_err,
  359. idx, dev->sys_high_pressure_switch_err,
  360. idx, dev->out_air_over_temp_err,
  361. idx, dev->can_comm_err,
  362. idx, dev->in_air_temp_sensor_err,
  363. idx, dev->cooling_sys_err,
  364. idx, dev->in_air_over_temp_err,
  365. idx, dev->comp_VFD_ov_err,
  366. idx, dev->comp_VFD_uv_err,
  367. idx, dev->comp_VFD_oc_err,
  368. idx, dev->comp_VFD_ot_err,
  369. idx, dev->comp_VFD_comm_err,
  370. idx, dev->comp_VFD_miss_phrase_err,
  371. idx, dev->comp_VFD_others_err,
  372. idx, dev->pump_press_diff_low_err,
  373. idx, dev->out_air_over_temp_lock,
  374. idx, dev->sys_high_pressure_lock,
  375. idx, dev->sys_low_pressure_lock,
  376. idx, dev->comp_VFD_over_current_lock,
  377. idx, dev->comp_VFD_over_voltage_lock,
  378. idx, dev->comp_VFD_under_voltage_lock,
  379. idx, dev->comp_VFD_over_temp_lock,
  380. idx, dev->comp_VFD_comm_lock,
  381. idx, dev->comp_VFD_miss_phrase_lock,
  382. idx, dev->comp_VFD_others_lock,
  383. idx, dev->high_press_sensor_err,
  384. idx, dev->env_temp_sensor_err,
  385. idx, dev->in_water_temp_sensor_err,
  386. idx, dev->out_air_temp_sensor_err,
  387. idx, dev->condensate_sensor_err,
  388. idx, dev->unexpected_power_off_err,
  389. idx, dev->out_water_low_temp_err,
  390. idx, dev->out_water_high_temp_err,
  391. idx, dev->out_water_over_press_err);
  392. return 0;
  393. }
  394. int evc_get_cloud_data(int ctn_idx, int idx, char *buf)
  395. {
  396. struct evc_t *dev = &evc[idx];
  397. sprintf(buf, "{\"device_id\":\"%s\", \"type\":4, \"rtnwater_pre\":%.1f,\"outwater_pre\":%.1f,\"rtnwater_t\":%.1f,\"outwater_t\":%.1f,\"outside_t\":%.1f,\"state\":\"%d\"}",
  398. dev->szdev_id,
  399. dev->in_water_press,
  400. dev->out_water_press,
  401. dev->in_water_temp,
  402. dev->out_water_temp,
  403. dev->ev_temp,
  404. dev->sm.state);
  405. return 0;
  406. }
  407. int evc_get_init_data(int ctn_idx, int idx, char *buf)
  408. {
  409. sprintf(buf, "{\"device_id\":\"%s\", \"type\":4, \"idx\":%d, \"pid\":\"%s\", \"config\":{\"chan_idx\":%d, \"adr\":%d }}",
  410. evc[idx].szdev_id,
  411. idx,
  412. ctn_get_dev_id(),
  413. evc[idx].comm.chanidx,
  414. evc[idx].comm.adr);
  415. return 0;
  416. }
  417. double evc_get_outwater_temp(int idx)
  418. {
  419. return evc[idx].out_water_temp;
  420. }
  421. double evc_get_rtwater_temp(int idx)
  422. {
  423. return evc[idx].in_water_temp;
  424. }
  425. double evc_get_outwater_press(int idx)
  426. {
  427. return evc[idx].out_water_press;
  428. }
  429. double evc_get_rtwater_press(int idx)
  430. {
  431. return evc[idx].in_water_press;
  432. }
  433. double evc_get_env_temp(int idx)
  434. {
  435. return evc[idx].ev_temp;
  436. }
  437. int evc_get_modbus_data(int idx,unsigned short* data)
  438. {
  439. struct evc_t *dev = &evc[idx];
  440. data[0] = (unsigned short)DEVM_EVC;
  441. data[1] = (unsigned short)1;
  442. data[2] = (unsigned short)dev->sm.state;
  443. data[3] = (unsigned short)dev->sm.step;
  444. data[4] = (unsigned short)dev->sm.err;
  445. data[5] = (unsigned short)dev->comm.adr;
  446. data[6] = (unsigned short)dev->comm.state;
  447. data[7] = (unsigned short)dev->runMode;
  448. // data[8] = (unsigned short)4;
  449. // data[9] = (unsigned short)25;
  450. // data[10] = (unsigned short)25;
  451. // data[11] = (unsigned short)4;
  452. // data[12] = (unsigned short)4;
  453. data[13] = (unsigned short)dev->pump_rpm;
  454. data[14] = (unsigned short)dev->comp_rpm;
  455. data[15] = (unsigned short)dev->out_water_temp;
  456. data[16] = (unsigned short)dev->in_water_temp;
  457. data[17] = (unsigned short)dev->out_water_press;
  458. data[18] = (unsigned short)dev->in_water_press;
  459. //data[19] = (unsigned short)dev->pump_speed;
  460. return 0;
  461. }