rs311.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. #include "plt.h"
  2. #include "rs311.h"
  3. #include "rs311_comm.h"
  4. #include "rs311_sm.h"
  5. int rs311_nbr;
  6. struct rs311_t rs311[RS311_NBR_MAX + 1];
  7. int rs311_send_sm_cmd(int idx, int cmd)
  8. {
  9. int ret = 0;
  10. struct rs311_t *dev = &rs311[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 rs311_send_sm_cmd_all(int cmd)
  16. {
  17. int ret = 0;
  18. int idx;
  19. struct rs311_t *dev = NULL;
  20. for (idx = 1; idx <= rs311_nbr; idx++)
  21. {
  22. rs311_send_sm_cmd(idx, cmd);
  23. }
  24. return ret;
  25. }
  26. int rs311_chk_state_all(int stat)
  27. {
  28. int idx;
  29. for (idx = 1; idx <= rs311_nbr; idx++)
  30. {
  31. if (rs311_get_state(idx) != stat)
  32. {
  33. return -1;
  34. }
  35. }
  36. return 0;
  37. }
  38. int rs311_get_cmd(int idx)
  39. {
  40. return rs311[idx].cmd;
  41. }
  42. void rs311_reset_cmd(int idx)
  43. {
  44. rs311[idx].cmd = CMD_SM_DONE;
  45. }
  46. int rs311_get_state(int idx)
  47. {
  48. return rs311[idx].sm.state;
  49. }
  50. static int rs311_aux(int idx)
  51. {
  52. static int cnt = 0;
  53. if (cnt < rs311_nbr && mqtt_get_state() == SMST_READY)
  54. {
  55. cnt++;
  56. if (idx == rs311_nbr)
  57. {
  58. cloud.fe_init = 0;
  59. }
  60. char buf[4096] = {0};
  61. rs311_get_init_data(ctn_get_idx_in_ess(), idx, buf);
  62. cloud_send_init(buf);
  63. }
  64. }
  65. static void *rs311_thrd_main(void *param)
  66. {
  67. struct rs311_t *dev = NULL;
  68. int idx;
  69. log_dbg("%s, ++", __func__);
  70. for (idx = 1; idx <= rs311_nbr; idx++)
  71. {
  72. rs311_sm_init(idx);
  73. rs311_comm_init(idx);
  74. }
  75. while (1)
  76. {
  77. for (idx = 1; idx <= rs311_nbr; idx++)
  78. {
  79. rs311_comm_dac(idx);
  80. rs311_sm(idx);
  81. rs311_aux(idx);
  82. // usleep(100000); /* 100ms */
  83. sleep(1);
  84. }
  85. }
  86. log_dbg("%s, --, idx:%d", __func__, idx);
  87. }
  88. static int rs311_dbcb(void *para, int ncolumn, char **columnvalue, char *columnname[])
  89. {
  90. int i;
  91. struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para;
  92. struct rs311_t *pdev;
  93. int idx = 0;
  94. pcbparam->nrow++;
  95. log_dbg("%s, ++, row:%d, col:%d", __func__, pcbparam->nrow, ncolumn);
  96. pdev = &rs311[pcbparam->nrow];
  97. for (i = 0; i < ncolumn; i++)
  98. {
  99. if (strcmp("chan_idx", columnname[i]) == 0)
  100. {
  101. pdev->comm.chanidx = atoi(columnvalue[i]);
  102. }
  103. else if (strcmp("info", columnname[i]) == 0)
  104. {
  105. strcpy(pdev->szinfo, columnvalue[i]);
  106. }
  107. else if (strcmp("adr", columnname[i]) == 0)
  108. {
  109. pdev->comm.adr = atoi(columnvalue[i]);
  110. }
  111. else if (strcmp("idx", columnname[i]) == 0)
  112. {
  113. pdev->idx = atoi(columnvalue[i]);
  114. }
  115. else if (strcmp("devid", columnname[i]) == 0)
  116. {
  117. if (columnvalue[i] != NULL && strcmp(columnvalue[i], "") != 0)
  118. {
  119. strcpy(pdev->szdev_id, columnvalue[i]);
  120. }
  121. else
  122. {
  123. log_dbg("%s, devid is null", __func__);
  124. }
  125. }
  126. }
  127. pcbparam->ret = 0;
  128. log_dbg("%s, --,ret:%d", __func__, pcbparam->ret);
  129. return 0;
  130. }
  131. int rs311_init(void)
  132. {
  133. pthread_t thrd;
  134. int result = 0;
  135. int ret = 0;
  136. int idx = 0;
  137. struct rs311_t *dev = NULL;
  138. char *errmsg = NULL;
  139. char sql[1024];
  140. struct dbcbparam_t cbparam;
  141. sqlite3 *db = STA.cfg_db;
  142. log_dbg("%s, ++", __func__);
  143. plt_lock_ctndb();
  144. sprintf(sql, "select * from rs311");
  145. cbparam.nrow = 0;
  146. result = sqlite3_exec(db, sql, rs311_dbcb, (void *)&cbparam, &errmsg);
  147. plt_unlock_ctndb();
  148. if (result != SQLITE_OK)
  149. {
  150. log_dbg("%s, result != SQLITE_OK : %d", __func__, result);
  151. ret = -1;
  152. }
  153. else if (cbparam.ret != 0)
  154. {
  155. log_dbg("%s, cbparam.ret != 0 : %d", __func__, cbparam.ret);
  156. ret = -2;
  157. }
  158. else
  159. {
  160. rs311_nbr = cbparam.nrow;
  161. cbparam.nrow = 0;
  162. db = plt_get_devdb();
  163. plt_lock_devdb();
  164. sprintf(sql, "select * from rs311");
  165. result = sqlite3_exec(db, sql, rs311_dbcb, (void *)&cbparam, &errmsg);
  166. plt_unlock_devdb();
  167. for (int i = 1; i <= rs311_nbr; ++i)
  168. {
  169. if (strcmp(rs311[i].szdev_id, "") == 0)
  170. {
  171. if (get_snow_id(rs311[i].szdev_id) != 0)
  172. {
  173. ret = -4;
  174. }
  175. else
  176. {
  177. char sql[1024];
  178. char *errmsg = NULL;
  179. sprintf(sql, "update rs311 set devid=\"%s\" where idx=%d", rs311[i].szdev_id, rs311[i].idx);
  180. plt_lock_devdb();
  181. int rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  182. plt_unlock_devdb();
  183. if (rc != SQLITE_OK)
  184. {
  185. log_dbg("%s, failed to update level device id:%s", __func__, errmsg);
  186. ret = -4;
  187. goto leave;
  188. }
  189. else
  190. {
  191. log_dbg("%s, update device id:%s", __func__, rs311[i].szdev_id);
  192. }
  193. }
  194. }
  195. }
  196. if (pthread_create(&thrd, NULL, rs311_thrd_main, NULL) != 0)
  197. {
  198. ret = -1;
  199. log_dbg("%s, create rs311 thrd main fail", __func__);
  200. }
  201. }
  202. leave:
  203. log_dbg("%s--, ret:%d", __func__, ret);
  204. return ret;
  205. }
  206. int rs311_get_addr(int idx)
  207. {
  208. return rs311[idx].comm.adr;
  209. }
  210. int rs311_get_comm_st(int idx)
  211. {
  212. struct rs311_t *dev = &rs311[idx];
  213. struct comm_t *comm = &dev->comm;
  214. return comm_get_state(comm);
  215. }
  216. int rs311_get_chan_idx(int idx)
  217. {
  218. struct rs311_t *dev = &rs311[idx];
  219. struct comm_t *comm = &dev->comm;
  220. return comm_get_chan_idx(comm);
  221. }
  222. char *rs311_get_comm_st_str(int idx)
  223. {
  224. struct rs311_t *dev = &rs311[idx];
  225. struct comm_t *comm = &dev->comm;
  226. return comm_get_state_str(comm);
  227. }
  228. int rs311_get_tick(int idx)
  229. {
  230. return rs311[idx].sm.tick;
  231. }
  232. int rs311_get_nbr()
  233. {
  234. return rs311_nbr;
  235. }
  236. int rs311_get_tool_data(int idx, char *buf)
  237. {
  238. if (idx < 1 || idx > rs311_nbr || buf == NULL)
  239. return -1;
  240. struct rs311_t *dev = &rs311[idx];
  241. struct statemachine_t *sm = &dev->sm;
  242. struct comm_t *comm = &dev->comm;
  243. char buf_temp[1024];
  244. sm_get_summary(sm, buf_temp, sizeof(buf_temp));
  245. sprintf(buf, " [%d] %s ", idx, buf_temp);
  246. comm_get_summary(comm, buf_temp, sizeof(buf_temp));
  247. strcat(buf, buf_temp);
  248. sprintf(buf_temp, "dev id :%s spurt_flag:%d\n", dev->szdev_id, dev->spurt_flag);
  249. strcat(buf, buf_temp);
  250. return 0;
  251. }
  252. int rs311_get_tbmqtt_data(int idx, char *buf)
  253. {
  254. struct rs311_t *dev = &rs311[idx];
  255. sprintf(buf, "'fe_spurt':%d, 'fe_state':'%s'", dev->spurt_flag, dev->sm.szState);
  256. return 0;
  257. }
  258. int rs311_get_cloud_data(int ctn_idx, int idx, char *buf)
  259. {
  260. struct rs311_t *dev = &rs311[idx];
  261. sprintf(buf, "{\"device_id\":\"%s\", \"type\":5, \"spurt\":%d, \"state\":\"%d\"}",
  262. dev->szdev_id, dev->spurt_flag, dev->sm.state);
  263. return 0;
  264. }
  265. int rs311_get_init_data(int ctn_idx, int idx, char *buf)
  266. {
  267. sprintf(buf, "{\"device_id\":\"%s\", \"type\":5, \"idx\":%d, \"pid\":\"%s\", \"config\":{ \
  268. \"chan_idx\":%d, \"adr\":%d }}",
  269. rs311[idx].szdev_id,
  270. idx,
  271. ctn_get_dev_id(),
  272. rs311[idx].comm.chanidx,
  273. rs311[idx].comm.adr);
  274. return 0;
  275. }
  276. int rs311_get_modbus_data(int idx, unsigned short* data)
  277. {
  278. struct rs311_t *dev = &rs311[idx];
  279. data[0] = (unsigned short)DEVM_RS311;
  280. data[1] = (unsigned short)1;
  281. data[2] = (unsigned short)0;
  282. data[3] = (unsigned short)0;
  283. data[4] = (unsigned short)0;
  284. data[5] = (unsigned short)0;
  285. data[6] = (unsigned short)0;
  286. data[7] = (unsigned short)0;
  287. data[8] = (unsigned short)0;
  288. data[9] = (unsigned short)0;
  289. data[10] = (unsigned short)dev->spurt_flag;
  290. data[11] = (unsigned short)0;
  291. data[12] = (unsigned short)0;
  292. data[13] = (unsigned short)0;
  293. data[14] = (unsigned short)0;
  294. data[15] = (unsigned short)0;
  295. data[16] = (unsigned short)0;
  296. return 0;
  297. }