rh811ad053f.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. #include "rh811ad053f.h"
  2. #include "plt.h"
  3. #include "rh811ad053f.h"
  4. int rh811ad053f_nbr;
  5. struct rh811ad053f_t rh811ad053f[RH811AD053F_NBR_MAX + 1];
  6. static int rh811ad053f_dbcb_0(void *para, int ncolumn, char **columnvalue, char *columnname[])
  7. {
  8. int i;
  9. struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para;
  10. struct rh811ad053f_t *dev = NULL;
  11. pcbparam->nrow++;
  12. log_dbg("%s, ++,row:%d, col:%d", __func__, pcbparam->nrow, ncolumn);
  13. dev = &rh811ad053f[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. int rh811ad053f_get_addr(int idx)
  49. {
  50. return rh811ad053f[idx].comm.adr;
  51. }
  52. static void aux(int idx)
  53. {
  54. static int cnt = 0;
  55. if (cnt < rh811ad053f_nbr && mqtt_get_state() == SMST_READY)
  56. {
  57. if (idx == rh811ad053f_nbr)
  58. {
  59. cloud.th_init = 0;
  60. }
  61. char buf[4096] = {0};
  62. rh811ad053f_get_init_data(ctn_get_idx_in_ess(), idx, buf);
  63. cloud_send_init(buf);
  64. cnt++;
  65. }
  66. }
  67. void* rh811ad053f_thrd_main(void *param)
  68. {
  69. struct rh811ad053f_t *dev = NULL;
  70. int idx;
  71. log_dbg("%s, ++", __func__);
  72. for (idx = 1; idx <= rh811ad053f_nbr; idx++)
  73. {
  74. rh811ad053f_comm_init(idx);
  75. rh811ad053f_sm_init(idx);
  76. }
  77. while (1)
  78. {
  79. for (idx = 1; idx <= rh811ad053f_nbr; idx++)
  80. {
  81. rh811ad053f_comm_dac(idx);
  82. rh811ad053f_sm(idx);
  83. aux(idx);
  84. sleep(1); // 1s
  85. }
  86. }
  87. log_dbg("%s, --, idx:%d", __func__, idx);
  88. return NULL;
  89. }
  90. int rh811ad053f_chk_stat_all(int stat)
  91. {
  92. int idx;
  93. for (idx = 1; idx <= rh811ad053f_nbr; idx++)
  94. {
  95. if (rh811ad053f_get_state(idx) != stat)
  96. {
  97. return -1;
  98. }
  99. }
  100. return 0;
  101. }
  102. int rh811ad053f_send_sm_cmd_all(int cmd)
  103. {
  104. int ret = 0;
  105. int idx;
  106. for (idx = 1; idx <= rh811ad053f_nbr; idx++)
  107. {
  108. rh811ad053f_send_sm_cmd(idx, cmd);
  109. }
  110. log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, cmd, ret);
  111. return ret;
  112. }
  113. int rh811ad053f_init()
  114. {
  115. pthread_t thrd;
  116. int result = 0;
  117. int ret = 0;
  118. int idx = 0;
  119. struct rh811ad053f_t *dev = NULL;
  120. char *errmsg = NULL;
  121. char sql[1024];
  122. struct dbcbparam_t cbparam;
  123. sqlite3 *db = NULL;
  124. log_dbg("%s, ++", __func__);
  125. plt_lock_ctndb();
  126. db = plt_get_ctndb();
  127. sprintf(sql, "select * from rh811ad053f");
  128. cbparam.nrow = 0;
  129. result = sqlite3_exec(db, sql, rh811ad053f_dbcb_0, (void *)&cbparam, &errmsg);
  130. plt_unlock_ctndb();
  131. if (result != SQLITE_OK)
  132. {
  133. ret = -1;
  134. }
  135. else if (cbparam.ret != 0)
  136. {
  137. ret = -2;
  138. }
  139. else
  140. {
  141. rh811ad053f_nbr = cbparam.nrow;
  142. cbparam.nrow = 0;
  143. db = plt_get_devdb();
  144. plt_lock_devdb();
  145. sprintf(sql, "select * from rh811ad053f");
  146. result = sqlite3_exec(db, sql, rh811ad053f_dbcb_0, (void *)&cbparam, &errmsg);
  147. plt_unlock_devdb();
  148. for (int i = 1; i <= rh811ad053f_nbr; ++i)
  149. {
  150. if (strcmp(rh811ad053f[i].szdev_id, "") == 0)
  151. {
  152. if (get_snow_id(rh811ad053f[i].szdev_id) != 0)
  153. {
  154. ret = -4;
  155. }
  156. else
  157. {
  158. char sql[1024];
  159. char *errmsg = NULL;
  160. plt_lock_devdb();
  161. sprintf(sql, "update rh811ad053f set devid=\"%s\" where idx=%d", rh811ad053f[i].szdev_id, rh811ad053f[i].idx);
  162. plt_unlock_devdb();
  163. int rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  164. if (rc != SQLITE_OK)
  165. {
  166. log_dbg("%s, failed to update level device id:%s", __func__, errmsg);
  167. ret = -4;
  168. goto leave;
  169. }
  170. else
  171. {
  172. log_dbg("%s, update device id:%s", __func__, rh811ad053f[i].szdev_id);
  173. }
  174. }
  175. }
  176. }
  177. if (pthread_create(&thrd, NULL, rh811ad053f_thrd_main, NULL) != 0)
  178. {
  179. log_dbg("%s, create rh811ad053f thrd main fail", __func__);
  180. ret = -1;
  181. }
  182. }
  183. leave:
  184. log_dbg("%s--, ret:%d", __func__, ret);
  185. return ret;
  186. }
  187. int rh811ad053f_get_state(int idx)
  188. {
  189. return rh811ad053f[idx].sm.state;
  190. }
  191. char *rh811ad053f_get_state_str(int idx)
  192. {
  193. return rh811ad053f[idx].sm.szState;
  194. }
  195. int rh811ad053f_get_cmd(int idx)
  196. {
  197. return rh811ad053f[idx].cmd;
  198. }
  199. void rh811ad053f_reset_cmd(int idx)
  200. {
  201. rh811ad053f[idx].cmd = CMD_SM_DONE;
  202. }
  203. double rh811ad053f_get_temp(int idx)
  204. {
  205. return rh811ad053f[idx].temp;
  206. }
  207. double rh811ad053f_get_humi(int idx)
  208. {
  209. return rh811ad053f[idx].humi;
  210. }
  211. int rh811ad053f_send_sm_cmd(int idx, int val)
  212. {
  213. int ret = 0;
  214. struct rh811ad053f_t *dev = &rh811ad053f[idx];
  215. dev->cmd = val;
  216. leave:
  217. log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, val, ret);
  218. return ret;
  219. }
  220. int rh811ad053f_get_comm_st(int idx)
  221. {
  222. struct rh811ad053f_t *dev = &rh811ad053f[idx];
  223. struct comm_t *comm = &dev->comm;
  224. return comm_get_state(comm);
  225. }
  226. int rh811ad053f_get_chan_idx(int idx)
  227. {
  228. struct rh811ad053f_t *dev = &rh811ad053f[idx];
  229. struct comm_t *comm = &dev->comm;
  230. return comm_get_chan_idx(comm);
  231. }
  232. int rh811ad053f_get_tick(int idx)
  233. {
  234. return rh811ad053f[idx].sm.tick;
  235. }
  236. char *rh811ad053f_get_comm_state_str(int idx)
  237. {
  238. struct rh811ad053f_t *dev = &rh811ad053f[idx];
  239. struct comm_t *comm = &dev->comm;
  240. return comm_get_state_str(comm);
  241. }
  242. int rh811ad053f_get_nbr()
  243. {
  244. return rh811ad053f_nbr;
  245. }
  246. struct rh811ad053f_t *rh811ad053f_get_all_data_ptr()
  247. {
  248. return rh811ad053f;
  249. }
  250. int rh811ad053f_get_tool_data(int idx, char *buf)
  251. {
  252. if (idx < 1 || idx > rh811ad053f_nbr || buf == NULL)
  253. return -1;
  254. struct rh811ad053f_t *dev = &rh811ad053f[idx];
  255. struct statemachine_t *sm = &dev->sm;
  256. char buf_temp[1024];
  257. sm_get_summary(sm, buf_temp, sizeof(buf_temp));
  258. sprintf(buf, "dev id :%s %s temp:" L_GREEN "%.1lf" NONE " humi:%.1lf\n", dev->szdev_id, buf_temp, dev->temp, dev->humi);
  259. return 0;
  260. }
  261. int rh811ad053f_get_tbmqtt_data(int idx, char *buf)
  262. {
  263. sprintf(buf, "'env%d_state':'%s','env%d_t':%.1f, 'env%d_h':%.1f",
  264. idx, rh811ad053f_get_state_str(idx), idx, rh811ad053f_get_temp(idx), idx, rh811ad053f_get_humi(idx));
  265. }
  266. int rh811ad053f_get_cloud_data(int ctn_idx, int idx, char *buf)
  267. {
  268. sprintf(
  269. buf, "{\"device_id\":\"%s\",\"type\":6, \"temp\":%.1f, \"humi\":%.1f, \"state\":\"%d\"}",
  270. rh811ad053f[idx].szdev_id, rh811ad053f_get_temp(idx),
  271. rh811ad053f_get_humi(idx),
  272. rh811ad053f_get_state(idx));
  273. }
  274. int rh811ad053f_get_init_data(int ctn_idx, int idx, char *buf)
  275. {
  276. sprintf(buf, "{\"device_id\":\"%s\", \"type\":6, \"idx\":%d, \"pid\":\"%s\", \"config\":{ \
  277. \"chan_idx\":%d, \"adr\":%d}}",
  278. rh811ad053f[idx].szdev_id,
  279. idx,
  280. ctn_get_dev_id(),
  281. rh811ad053f_get_chan_idx(idx),
  282. rh811ad053f[idx].comm.adr);
  283. return 0;
  284. }
  285. int rh811ad053f_get_modbus_data(int idx,unsigned short* data)
  286. {
  287. struct rh811ad053f_t *dev = &rh811ad053f[idx];
  288. data[0] = (unsigned short)DEVM_RH811AD053F;
  289. data[1] = (unsigned short)1;
  290. data[2] = (unsigned short)dev->sm.state;
  291. data[3] = (unsigned short)dev->sm.step;
  292. data[4] = (unsigned short)dev->sm.err;
  293. data[5] = (unsigned short)dev->comm.adr;
  294. data[6] = (unsigned short)dev->comm.state;
  295. data[7] = (unsigned short)dev->temp;
  296. data[8] = (unsigned short)dev->humi;
  297. return 0;
  298. }