sga500e.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #include "plt.h"
  2. int sga500e_nbr;
  3. struct sga500e_t sga500e[SGA500E_NBR_MAX + 1];
  4. static int sga500e_dbcb_0(void *para, int ncolumn, char **columnvalue, char *columnname[])
  5. {
  6. int i;
  7. struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para;
  8. struct sga500e_t *dev = NULL;
  9. pcbparam->nrow++;
  10. log_dbg("%s, ++,row:%d, col:%d", __func__, pcbparam->nrow, ncolumn);
  11. dev = &sga500e[pcbparam->nrow];
  12. for (i = 0; i < ncolumn; i++)
  13. {
  14. if (strcmp("chan_idx", columnname[i]) == 0)
  15. {
  16. dev->comm.chanidx = atoi(columnvalue[i]);
  17. }
  18. else if (strcmp("info", columnname[i]) == 0)
  19. {
  20. strcpy(dev->szinfo, columnvalue[i]);
  21. }
  22. else if (strcmp("adr", columnname[i]) == 0)
  23. {
  24. dev->comm.adr = atoi(columnvalue[i]);
  25. }
  26. }
  27. pcbparam->ret = 0;
  28. log_dbg("%s, --,ret:%d", __func__, pcbparam->ret);
  29. return 0;
  30. }
  31. int sga500e_get_addr(int idx)
  32. {
  33. return sga500e[idx].comm.adr;
  34. }
  35. void *sga500e_thrd_main(void *param)
  36. {
  37. struct sga500e_t *dev = NULL;
  38. int idx;
  39. log_dbg("%s, ++", __func__);
  40. for (idx = 1; idx <= sga500e_nbr; idx++)
  41. {
  42. sga500e_comm_init(idx);
  43. sga500e_sm_init(idx);
  44. }
  45. while (1)
  46. {
  47. for (idx = 1; idx <= sga500e_nbr; idx++)
  48. {
  49. sga500e_comm_dac(idx);
  50. sga500e_sm(idx);
  51. sleep(1); // 1s
  52. }
  53. }
  54. log_dbg("%s, --, idx:%d", __func__, idx);
  55. return NULL;
  56. }
  57. int sga500e_chk_stat_all(int stat)
  58. {
  59. int idx;
  60. for (idx = 1; idx <= sga500e_nbr; idx++)
  61. {
  62. if (sga500e_get_state(idx) != stat)
  63. {
  64. return -1;
  65. }
  66. }
  67. return 0;
  68. }
  69. int sga500e_send_sm_cmd_all(int cmd)
  70. {
  71. int ret = 0;
  72. int idx;
  73. for (idx = 1; idx <= sga500e_nbr; idx++)
  74. {
  75. sga500e_send_sm_cmd(idx, cmd);
  76. }
  77. log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, cmd, ret);
  78. return ret;
  79. }
  80. int sga500e_init()
  81. {
  82. pthread_t thrd;
  83. int result = 0;
  84. int ret = 0;
  85. int idx = 0;
  86. struct sga500e_t *dev = NULL;
  87. char *errmsg = NULL;
  88. char sql[1024];
  89. struct dbcbparam_t cbparam;
  90. sqlite3 *db = NULL;
  91. log_dbg("%s, ++", __func__);
  92. plt_lock_ctndb();
  93. db = plt_get_ctndb();
  94. sprintf(sql, "select * from sga500e");
  95. cbparam.nrow = 0;
  96. result = sqlite3_exec(db, sql, sga500e_dbcb_0, (void *)&cbparam, &errmsg);
  97. plt_unlock_ctndb();
  98. if (result != SQLITE_OK)
  99. {
  100. ret = -1;
  101. }
  102. else if (cbparam.ret != 0)
  103. {
  104. ret = -2;
  105. }
  106. else
  107. {
  108. sga500e_nbr = cbparam.nrow;
  109. if (pthread_create(&thrd, NULL, sga500e_thrd_main, NULL) != 0)
  110. {
  111. log_dbg("%s, create sga500e thrd main fail", __func__);
  112. ret = -1;
  113. }
  114. }
  115. log_dbg("%s--, ret:%d", __func__, ret);
  116. return ret;
  117. }
  118. int sga500e_get_state(int idx)
  119. {
  120. return sga500e[idx].sm.state;
  121. }
  122. char *sga500e_get_state_str(int idx)
  123. {
  124. return sga500e[idx].sm.szState;
  125. }
  126. double sga500e_get_density(int idx)
  127. {
  128. return sga500e[idx].density;
  129. }
  130. int sga500e_get_cmd(int idx)
  131. {
  132. return sga500e[idx].cmd;
  133. }
  134. void sga500e_reset_cmd(int idx)
  135. {
  136. sga500e[idx].cmd = CMD_SM_DONE;
  137. }
  138. int sga500e_send_sm_cmd(int idx, int val)
  139. {
  140. int ret = 0;
  141. struct sga500e_t *dev = &sga500e[idx];
  142. dev->cmd = val;
  143. leave:
  144. log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, val, ret);
  145. return ret;
  146. }
  147. int sga500e_get_comm_st(int idx)
  148. {
  149. struct sga500e_t *dev = &sga500e[idx];
  150. struct comm_t *comm = &dev->comm;
  151. return comm_get_state(comm);
  152. }
  153. int sga500e_get_chan_idx(int idx)
  154. {
  155. struct sga500e_t *dev = &sga500e[idx];
  156. struct comm_t *comm = &dev->comm;
  157. return comm_get_chan_idx(comm);
  158. }
  159. int sga500e_get_tick(int idx)
  160. {
  161. return sga500e[idx].sm.tick;
  162. }
  163. char *sga500e_get_comm_state_str(int idx)
  164. {
  165. return sga500e[idx].sm.szState;
  166. }
  167. int sga500e_get_nbr()
  168. {
  169. return sga500e_nbr;
  170. }
  171. int sga500e_get_tool_data(int idx, char *buf)
  172. {
  173. if (idx < 1 || idx > sga500e_nbr || buf == NULL)
  174. return -1;
  175. struct sga500e_t *dev = &sga500e[idx];
  176. struct statemachine_t *sm = &dev->sm;
  177. char buf_temp[1024];
  178. sm_get_summary(sm, buf_temp, sizeof(buf_temp));
  179. sprintf(buf, " %s state:%d density:" L_GREEN "%.1lf" NONE " pos:%d name:%d unit:%d hi:%d lo:%d\n",
  180. buf_temp, dev->state, dev->density, dev->decimal_pos, dev->name, dev->unit,
  181. dev->alarm_hi, dev->alarm_lo);
  182. return 0;
  183. }
  184. int sga500e_get_tbmqtt_data(int idx, char *buf)
  185. {
  186. sprintf(buf, "'gase%d_state':'%s','gas%d_density':%.1f",
  187. idx, sga500e_get_state_str(idx), idx, sga500e_get_density(idx));
  188. }
  189. int sga500e_get_cloud_data(int ctn_idx, int idx, char *buf)
  190. {
  191. sprintf(buf, "'id':'env_%d', 'gas%d_density':%.1f,'gas%d_state':%d",
  192. idx,
  193. idx, sga500e_get_density(idx),
  194. idx, sga500e_get_state(idx));
  195. return 0;
  196. }
  197. int sga500e_get_bkds_data(int idx, char *buf)
  198. {
  199. sprintf(buf, "\
  200. \"info\":\"%d#gas\",\"model\":\"%s\",\"state\":\"%s\",\"chan_idx\":%d,\"adr\":%d,\
  201. \"tick\":%d,\"comm_state\":\"%s\",\"dens\":%f\
  202. ",
  203. idx, "sga500e", sga500e_get_state_str(idx), sga500e_get_chan_idx(idx), sga500e_get_addr(idx),
  204. sga500e_get_tick(idx), sga500e_get_comm_state_str(idx), sga500e_get_density(idx));
  205. }