#include "plt.h" int sga500e_nbr; struct sga500e_t sga500e[SGA500E_NBR_MAX + 1]; static int sga500e_dbcb_0(void *para, int ncolumn, char **columnvalue, char *columnname[]) { int i; struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para; struct sga500e_t *dev = NULL; pcbparam->nrow++; log_dbg("%s, ++,row:%d, col:%d", __func__, pcbparam->nrow, ncolumn); dev = &sga500e[pcbparam->nrow]; for (i = 0; i < ncolumn; i++) { if (strcmp("chan_idx", columnname[i]) == 0) { dev->comm.chanidx = atoi(columnvalue[i]); } else if (strcmp("info", columnname[i]) == 0) { strcpy(dev->szinfo, columnvalue[i]); } else if (strcmp("adr", columnname[i]) == 0) { dev->comm.adr = atoi(columnvalue[i]); } } pcbparam->ret = 0; log_dbg("%s, --,ret:%d", __func__, pcbparam->ret); return 0; } int sga500e_get_addr(int idx) { return sga500e[idx].comm.adr; } void *sga500e_thrd_main(void *param) { struct sga500e_t *dev = NULL; int idx; log_dbg("%s, ++", __func__); for (idx = 1; idx <= sga500e_nbr; idx++) { sga500e_comm_init(idx); sga500e_sm_init(idx); } while (1) { for (idx = 1; idx <= sga500e_nbr; idx++) { sga500e_comm_dac(idx); sga500e_sm(idx); sleep(1); // 1s } } log_dbg("%s, --, idx:%d", __func__, idx); return NULL; } int sga500e_chk_stat_all(int stat) { int idx; for (idx = 1; idx <= sga500e_nbr; idx++) { if (sga500e_get_state(idx) != stat) { return -1; } } return 0; } int sga500e_send_sm_cmd_all(int cmd) { int ret = 0; int idx; for (idx = 1; idx <= sga500e_nbr; idx++) { sga500e_send_sm_cmd(idx, cmd); } log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, cmd, ret); return ret; } int sga500e_init() { pthread_t thrd; int result = 0; int ret = 0; int idx = 0; struct sga500e_t *dev = NULL; char *errmsg = NULL; char sql[1024]; struct dbcbparam_t cbparam; sqlite3 *db = NULL; log_dbg("%s, ++", __func__); plt_lock_ctndb(); db = plt_get_ctndb(); sprintf(sql, "select * from sga500e"); cbparam.nrow = 0; result = sqlite3_exec(db, sql, sga500e_dbcb_0, (void *)&cbparam, &errmsg); plt_unlock_ctndb(); if (result != SQLITE_OK) { ret = -1; } else if (cbparam.ret != 0) { ret = -2; } else { sga500e_nbr = cbparam.nrow; if (pthread_create(&thrd, NULL, sga500e_thrd_main, NULL) != 0) { log_dbg("%s, create sga500e thrd main fail", __func__); ret = -1; } } log_dbg("%s--, ret:%d", __func__, ret); return ret; } int sga500e_get_state(int idx) { return sga500e[idx].sm.state; } char *sga500e_get_state_str(int idx) { return sga500e[idx].sm.szState; } double sga500e_get_density(int idx) { return sga500e[idx].density; } int sga500e_get_cmd(int idx) { return sga500e[idx].cmd; } void sga500e_reset_cmd(int idx) { sga500e[idx].cmd = CMD_SM_DONE; } int sga500e_send_sm_cmd(int idx, int val) { int ret = 0; struct sga500e_t *dev = &sga500e[idx]; dev->cmd = val; leave: log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, val, ret); return ret; } int sga500e_get_comm_st(int idx) { struct sga500e_t *dev = &sga500e[idx]; struct comm_t *comm = &dev->comm; return comm_get_state(comm); } int sga500e_get_chan_idx(int idx) { struct sga500e_t *dev = &sga500e[idx]; struct comm_t *comm = &dev->comm; return comm_get_chan_idx(comm); } int sga500e_get_tick(int idx) { return sga500e[idx].sm.tick; } char *sga500e_get_comm_state_str(int idx) { return sga500e[idx].sm.szState; } int sga500e_get_nbr() { return sga500e_nbr; } int sga500e_get_tool_data(int idx, char *buf) { if (idx < 1 || idx > sga500e_nbr || buf == NULL) return -1; struct sga500e_t *dev = &sga500e[idx]; struct statemachine_t *sm = &dev->sm; char buf_temp[1024]; sm_get_summary(sm, buf_temp, sizeof(buf_temp)); sprintf(buf, " %s state:%d density:" L_GREEN "%.1lf" NONE " pos:%d name:%d unit:%d hi:%d lo:%d\n", buf_temp, dev->state, dev->density, dev->decimal_pos, dev->name, dev->unit, dev->alarm_hi, dev->alarm_lo); return 0; } int sga500e_get_tbmqtt_data(int idx, char *buf) { sprintf(buf, "'gase%d_state':'%s','gas%d_density':%.1f", idx, sga500e_get_state_str(idx), idx, sga500e_get_density(idx)); } int sga500e_get_cloud_data(int ctn_idx, int idx, char *buf) { sprintf(buf, "'id':'env_%d', 'gas%d_density':%.1f,'gas%d_state':%d", idx, idx, sga500e_get_density(idx), idx, sga500e_get_state(idx)); return 0; } int sga500e_get_bkds_data(int idx, char *buf) { sprintf(buf, "\ \"info\":\"%d#gas\",\"model\":\"%s\",\"state\":\"%s\",\"chan_idx\":%d,\"adr\":%d,\ \"tick\":%d,\"comm_state\":\"%s\",\"dens\":%f\ ", idx, "sga500e", sga500e_get_state_str(idx), sga500e_get_chan_idx(idx), sga500e_get_addr(idx), sga500e_get_tick(idx), sga500e_get_comm_state_str(idx), sga500e_get_density(idx)); }