adl200.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. #include "adl200.h"
  2. #include "plt.h"
  3. int adl200_nbr;
  4. struct adl200_t adl200[adl200_NBR_MAX + 1];
  5. static int adl200_dbcb_0(void *para, int ncolumn, char **columnvalue,
  6. char *columnname[])
  7. {
  8. int i;
  9. struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para;
  10. struct adl200_t *dev = NULL;
  11. pcbparam->nrow++;
  12. log_dbg("%s, ++,row:%d, col:%d", __func__, pcbparam->nrow, ncolumn);
  13. dev = &adl200[pcbparam->nrow];
  14. for (i = 0; i < ncolumn; i++)
  15. {
  16. if (strcmp("chan_idx", columnname[i]) == 0)
  17. {
  18. dev->comm.chanidx = atoi(columnvalue[i]);
  19. }
  20. else if (strcmp("info", columnname[i]) == 0)
  21. {
  22. strcpy(dev->szinfo, columnvalue[i]);
  23. }
  24. else if (strcmp("adr", columnname[i]) == 0)
  25. {
  26. dev->comm.adr = atoi(columnvalue[i]);
  27. }
  28. else if (strcmp("idx", columnname[i]) == 0)
  29. {
  30. dev->idx = atoi(columnvalue[i]);
  31. }
  32. else if (strcmp("devid", columnname[i]) == 0)
  33. {
  34. if (columnvalue[i] != NULL && strcmp(columnvalue[i], "") != 0)
  35. {
  36. strcpy(dev->szdev_id, columnvalue[i]);
  37. }
  38. else
  39. {
  40. log_dbg("%s, devid is null", __func__);
  41. }
  42. }
  43. }
  44. pcbparam->ret = 0;
  45. log_dbg("%s, --,ret:%d", __func__, pcbparam->ret);
  46. return 0;
  47. }
  48. static void aux(int idx)
  49. {
  50. static int cnt = 0;
  51. if (cnt < adl200_nbr && mqtt_get_state() == SMST_READY)
  52. {
  53. cnt++;
  54. if (idx == adl200_nbr)
  55. {
  56. cloud.meter_init = 0;
  57. }
  58. char buf[4096];
  59. adl200_get_init_data(ctn_get_idx_in_ess(), idx, buf);
  60. cloud_send_init(buf);
  61. }
  62. }
  63. void *adl200_thrd_main(void *param)
  64. {
  65. struct adl200_t *dev = NULL;
  66. int idx;
  67. log_dbg("%s, ++", __func__);
  68. for (idx = 1; idx <= adl200_nbr; idx++)
  69. {
  70. dev = &adl200[idx];
  71. adl200_sm_init(idx);
  72. adl200_comm_init(idx);
  73. }
  74. while (1)
  75. {
  76. for (idx = 1; idx <= adl200_nbr; idx++)
  77. {
  78. adl200_comm_dac(idx);
  79. adl200_sm(idx);
  80. aux(idx);
  81. // usleep(100000); // 100ms
  82. sleep(2);
  83. }
  84. }
  85. log_dbg("%s, --, idx:%d", __func__, idx);
  86. return NULL;
  87. }
  88. int adl200_get_cmd(int idx) { return adl200[idx].cmd; }
  89. void adl200_reset_cmd(int idx) { adl200[idx].cmd = CMD_SM_DONE; }
  90. int adl200_init()
  91. {
  92. pthread_t thrd;
  93. int result = 0;
  94. int ret = 0;
  95. int idx = 0;
  96. struct adl200_t *dev = NULL;
  97. char *errmsg = NULL;
  98. char sql[1024];
  99. struct dbcbparam_t cbparam;
  100. sqlite3 *db = NULL;
  101. log_dbg("%s, ++", __func__);
  102. plt_lock_ctndb();
  103. db = plt_get_ctndb();
  104. sprintf(sql, "select * from adl200");
  105. cbparam.nrow = 0;
  106. result = sqlite3_exec(db, sql, adl200_dbcb_0, (void *)&cbparam, &errmsg);
  107. plt_unlock_ctndb();
  108. if (result != SQLITE_OK)
  109. {
  110. log_dbg("%s, result != SQLITE_OK, result:%d", __func__, result);
  111. ret = -1;
  112. }
  113. else if (cbparam.ret != 0)
  114. {
  115. log_dbg("%s, cbparam.ret != 0, cbparam.ret:%d", __func__, cbparam.ret);
  116. ret = -2;
  117. }
  118. else
  119. {
  120. adl200_nbr = cbparam.nrow;
  121. cbparam.nrow = 0;
  122. db = plt_get_devdb();
  123. plt_lock_devdb();
  124. sprintf(sql, "select * from adl200");
  125. result = sqlite3_exec(db, sql, adl200_dbcb_0, (void *)&cbparam, &errmsg);
  126. plt_unlock_devdb();
  127. for (int i = 1; i <= adl200_nbr; ++i)
  128. {
  129. if (strcmp(adl200[i].szdev_id, "") == 0)
  130. {
  131. if (get_snow_id(adl200[i].szdev_id) != 0)
  132. {
  133. ret = -4;
  134. }
  135. else
  136. {
  137. char sql[1024];
  138. char *errmsg = NULL;
  139. sprintf(sql, "update adl200 set devid=\"%s\" where idx=%d", adl200[i].szdev_id, adl200[i].idx);
  140. plt_lock_devdb();
  141. int rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  142. plt_unlock_devdb();
  143. if (rc != SQLITE_OK)
  144. {
  145. log_dbg("%s, failed to update level device id:%s", __func__, errmsg);
  146. ret = -4;
  147. goto leave;
  148. }
  149. else
  150. {
  151. log_dbg("%s, update device id:%s", __func__, adl200[i].szdev_id);
  152. }
  153. }
  154. }
  155. }
  156. if (pthread_create(&thrd, NULL, adl200_thrd_main, NULL) != 0)
  157. {
  158. log_dbg("%s, create adl200 thrd main fail", __func__);
  159. ret = -1;
  160. }
  161. }
  162. leave:
  163. log_dbg("%s--, ret:%d", __func__, ret);
  164. return ret;
  165. }
  166. int adl200_get_state(int idx) { return adl200[idx].sm.state; }
  167. char *adl200_get_state_string(int idx) { return adl200[idx].sm.szState; }
  168. int adl200_get_com_ap(int idx) { return adl200[idx].com_ap; }
  169. double adl200_get_com_ae(int idx) { return adl200[idx].com_ae; }
  170. double adl200_get_pos_ae(int idx) { return adl200[idx].pos_active_e; }
  171. double adl200_get_neg_ae(int idx) { return adl200[idx].neg_active_e; }
  172. double adl200_get_pf(int idx) { return adl200[idx].pwr_factor; }
  173. double adl200_get_gf(int idx) { return adl200[idx].freq; }
  174. char *adl200_get_info_str(int idx) { return adl200[idx].szinfo; }
  175. int adl200_chk_state_all(int stat)
  176. {
  177. int idx;
  178. for (idx = 1; idx <= adl200_nbr; idx++)
  179. {
  180. if (adl200_get_state(idx) != stat)
  181. {
  182. return -1;
  183. }
  184. }
  185. return 0;
  186. }
  187. int adl200_send_sm_cmd(int idx, int val)
  188. {
  189. int ret = 0;
  190. struct adl200_t *dev = &adl200[idx];
  191. dev->cmd = val;
  192. leave:
  193. log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, val, ret);
  194. return ret;
  195. }
  196. int adl200_send_sm_cmd_all(int cmd)
  197. {
  198. int ret = 0;
  199. int idx;
  200. for (idx = 1; idx <= adl200_nbr; idx++)
  201. {
  202. adl200_send_sm_cmd(idx, cmd);
  203. }
  204. log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, cmd, ret);
  205. return ret;
  206. }
  207. int adl200_get_comm_st(int idx)
  208. {
  209. struct adl200_t *dev = &adl200[idx];
  210. struct comm_t *comm = &dev->comm;
  211. return comm_get_state(comm);
  212. }
  213. void adl200_set_dac_param_en(int idx, int val)
  214. {
  215. struct adl200_t *dev = &adl200[idx];
  216. struct comm_t *comm = &dev->comm;
  217. comm_set_dac_param_en(comm, val);
  218. }
  219. int adl200_get_sm_step(int idx)
  220. {
  221. struct statemachine_t *sm = &adl200[idx].sm;
  222. return sm_get_step(sm);
  223. }
  224. char *adl200_get_sm_err_str(int idx) { return adl200[idx].sm.szerr; }
  225. int adl200_get_chan_idx(int idx)
  226. {
  227. struct comm_t *comm = &adl200[idx].comm;
  228. return comm_get_chan_idx(comm);
  229. }
  230. int adl200_get_adr(int idx)
  231. {
  232. struct comm_t *comm = &adl200[idx].comm;
  233. return comm_get_adr(comm);
  234. }
  235. int adl200_get_tick(int idx) { return adl200[idx].sm.tick; }
  236. char *adl200_get_comm_state_str(int idx)
  237. {
  238. struct comm_t *comm = &adl200[idx].comm;
  239. return comm_get_state_str(comm);
  240. }
  241. int adl200_get_nbr() { return adl200_nbr; }
  242. int adl200_get_tool_data(int idx, char *buf)
  243. {
  244. struct adl200_t *dev = &adl200[idx];
  245. struct statemachine_t *sm = &dev->sm;
  246. struct comm_t *comm = &dev->comm;
  247. char temp_buf[1024 * 8];
  248. if (idx < 1 || idx > adl200_nbr || buf == NULL)
  249. return -1;
  250. sm_get_summary(sm, temp_buf, sizeof(temp_buf));
  251. sprintf(buf, " [%d] %s ", idx, temp_buf);
  252. comm_get_summary(comm, temp_buf, sizeof(temp_buf));
  253. strcat(buf, temp_buf);
  254. sprintf(temp_buf,
  255. "dev id :%s com_ap:" L_GREEN "%.1f" NONE " com_ae:%.1f pos_ae:%.1f neg_ae:%.1f ap:%.1f ip:%.1f app:%.1f freq:%.2f pwr_fct:%.2f, v:%.2f, i:%.2f \n",
  256. dev->szdev_id,
  257. dev->com_ap, dev->com_ae, dev->pos_active_e, dev->neg_active_e, dev->ap, dev->inactive_p,
  258. dev->apparent_p, dev->freq, dev->pwr_factor, dev->u, dev->i);
  259. strcat(buf, temp_buf);
  260. return 0;
  261. }
  262. int adl200_get_tbmqtt_data(int idx, char *buf)
  263. {
  264. struct adl200_t *dev = &adl200[idx];
  265. struct statemachine_t *sm = &dev->sm;
  266. struct comm_t *comm = &dev->comm;
  267. char temp_buf[1024 * 8];
  268. sprintf(buf, "'adl200_pos_ae':%.1f,'adl200_neg_ae':%.1f,'adl200_ap':%.1f, 'adl200_ip':%.1f, 'adl200_gf':%.1f,'adl200_pf':%.1f,'adl200_state':'%s'",
  269. adl200_get_pos_ae(idx),
  270. adl200_get_neg_ae(idx),
  271. dev->ap,
  272. dev->inactive_p,
  273. adl200_get_gf(idx),
  274. adl200_get_pf(idx),
  275. adl200_get_state_string(idx));
  276. }
  277. int adl200_get_cloud_data(int ctn_idx, int idx, char *buf)
  278. {
  279. struct adl200_t *dev = &adl200[idx];
  280. sprintf(buf, "{\"device_id\":\"%s\",\"type\":10,\"pos_ae\":%.2f,\"neg_ae\":%.2f,\
  281. \"com_ap\":%.2f,\"rap\":%.2f,\"gf\":%.2f,\"pf\":%.2f,\"state\":\"%d\"}",
  282. dev->szdev_id,
  283. adl200_get_pos_ae(idx),
  284. adl200_get_neg_ae(idx),
  285. dev->ap, dev->inactive_p,
  286. adl200_get_gf(idx),
  287. adl200_get_pf(idx),
  288. adl200_get_state(idx));
  289. }
  290. int adl200_get_init_data(int ctn_idx, int idx, char *buf)
  291. {
  292. sprintf(buf, "{\"device_id\":\"%s\", \"type\":10, \"idx\":%d, \"pid\":\"%s\", \"config\":{ \
  293. \"chan_idx\":%d, \"adr\":%d}}",
  294. adl200[idx].szdev_id,
  295. idx,
  296. ctn_get_dev_id(),
  297. adl200[idx].comm.chanidx,
  298. adl200[idx].comm.adr);
  299. return 0;
  300. }
  301. int adl200_get_modbus_data(int idx,unsigned short* data)
  302. {
  303. struct adl200_t *dev = &adl200[idx];
  304. data[0] = (unsigned short)DEVM_ADL200;
  305. data[1] = (unsigned short)1;
  306. data[2] = (unsigned short)dev->sm.state;
  307. data[3] = (unsigned short)dev->sm.step;
  308. data[4] = (unsigned short)dev->sm.err;
  309. data[5] = (unsigned short)dev->comm.adr;
  310. data[6] = (unsigned short)dev->comm.state;
  311. data[7] = (unsigned short)dev->com_ae;
  312. data[8] = (unsigned short)dev->u*10;
  313. data[9] = (unsigned short)dev->i*100;
  314. data[10] = (unsigned short)dev->ap*1000;
  315. data[11] = (unsigned short)dev->inactive_p*1000;
  316. data[12] = (unsigned short)dev->apparent_p*1000;
  317. data[13] = (unsigned short)dev->pwr_factor*1000;
  318. data[14] = (unsigned short)dev->freq*100;
  319. data[15] = (unsigned short)dev->pos_active_e;
  320. data[16] = (unsigned short)dev->neg_active_e;
  321. return 0;
  322. }