#include "cw1310.h" #include "cw1310_comm.h" #include "cw1310_sm.h" #include "plt.h" int cw1310_nbr; struct cw1310_t cw1310[CW1310_NBR_MAX + 1]; int cw1310_send_sm_cmd(int idx, int cmd) { int ret = 0; struct cw1310_t *dev = &cw1310[idx]; dev->cmd = cmd; log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, cmd, ret); return ret; } int cw1310_send_sm_cmd_all(int cmd) { int ret = 0; int idx; struct cw1310_t *dev = NULL; for (idx = 1; idx <= cw1310_nbr; idx++) { cw1310_send_sm_cmd(idx, cmd); } return ret; } int cw1310_chk_state_all(int stat) { return 0; int idx; for (idx = 1; idx <= cw1310_nbr; idx++) { if (cw1310_get_state(idx) != stat) { return -1; } } return 0; } int cw1310_get_cmd(int idx) { return cw1310[idx].cmd; } void cw1310_reset_cmd(int idx) { cw1310[idx].cmd = CMD_SM_DONE; } int cw1310_get_state(int idx) { return cw1310[idx].sm.state; } void cw1310_aux(int idx) { static int cnt = 0; if (cnt < cw1310_nbr && mqtt_get_state() == SMST_READY) // if (cloud.fa_init == 1) { cnt++; if (cnt >= cw1310_nbr) // if (idx >= cw1310_nbr) { cloud.fa_init = 0; } char buf[4096] = {0}; cw1310_get_init_data(ctn_get_idx_in_ess(), idx, buf); cloud_send_init(buf); } } static void *cw1310_thrd_main(void *param) { struct cw1310_t *dev = NULL; int idx; log_dbg("%s, ++", __func__); for (idx = 1; idx <= cw1310_nbr; idx++) { cw1310_sm_init(idx); cw1310_comm_init(idx); } while (1) { for (idx = 1; idx <= cw1310_nbr; idx++) { cw1310_comm_dac(idx); cw1310_sm(idx); cw1310_aux(idx); } sleep(1); } log_dbg("%s, --, idx:%d", __func__, idx); } static int cw1310_dbcb(void *para, int ncolumn, char **columnvalue, char *columnname[]) { int i; struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para; struct cw1310_t *pdev; int idx = 0; pcbparam->nrow++; log_dbg("%s, ++, row:%d, col:%d", __func__, pcbparam->nrow, ncolumn); //default value pdev = &cw1310[pcbparam->nrow]; if(pdev->level1_co == 0) { pdev->level1_co = 100; pdev->level1_voc=1000; pdev->level1_tmp=60; pdev->level2_co=190; pdev->level2_voc=1500; pdev->level2_tmp=70; pdev->level3_co=500; pdev->level3_voc=2000; pdev->level3_tmp=80; pdev->level4_co=500; pdev->level4_voc=2000; pdev->level4_tmp=90; } for (i = 0; i < ncolumn; i++) { if (strcmp("chan_idx", columnname[i]) == 0) { pdev->comm.chanidx = atoi(columnvalue[i]); } else if (strcmp("info", columnname[i]) == 0) { strcpy(pdev->szinfo, columnvalue[i]); } else if (strcmp("adr", columnname[i]) == 0) { pdev->comm.adr = atoi(columnvalue[i]); } else if (strcmp("idx", columnname[i]) == 0) { pdev->idx = atoi(columnvalue[i]); } else if (strcmp("devid", columnname[i]) == 0) { if (columnvalue[i] != NULL && strcmp(columnvalue[i], "") != 0) { strcpy(pdev->szdev_id, columnvalue[i]); } else { log_dbg("%s, devid is null", __func__); } } else if (strcmp("level1_co", columnname[i]) == 0) { pdev->level1_co = atoi(columnvalue[i]); } else if (strcmp("level1_voc", columnname[i]) == 0) { pdev->level1_voc = atoi(columnvalue[i]); } else if (strcmp("level1_tmp", columnname[i]) == 0) { pdev->level1_tmp = atoi(columnvalue[i]); } else if (strcmp("level2_co", columnname[i]) == 0) { pdev->level2_co = atoi(columnvalue[i]); } else if (strcmp("level2_voc", columnname[i]) == 0) { pdev->level2_voc = atoi(columnvalue[i]); } else if (strcmp("level2_tmp", columnname[i]) == 0) { pdev->level2_tmp = atoi(columnvalue[i]); } else if (strcmp("level3_co", columnname[i]) == 0) { pdev->level3_co = atoi(columnvalue[i]); } else if (strcmp("level3_voc", columnname[i]) == 0) { pdev->level3_voc = atoi(columnvalue[i]); } else if (strcmp("level3_tmp", columnname[i]) == 0) { pdev->level3_tmp = atoi(columnvalue[i]); } else if (strcmp("level4_co", columnname[i]) == 0) { pdev->level4_co = atoi(columnvalue[i]); } else if (strcmp("level4_voc", columnname[i]) == 0) { pdev->level4_voc = atoi(columnvalue[i]); } else if (strcmp("level4_tmp", columnname[i]) == 0) { pdev->level4_tmp = atoi(columnvalue[i]); } } pcbparam->ret = 0; log_dbg("%s, --,ret:%d", __func__, pcbparam->ret); return 0; } int cw1310_init(void) { pthread_t thrd; int result = 0; int ret = 0; int idx = 0; struct cw1310_t *dev = NULL; char *errmsg = NULL; char sql[1024]; struct dbcbparam_t cbparam; sqlite3 *db = plt_get_ctndb(); log_dbg("%s, ++", __func__); plt_lock_ctndb(); sprintf(sql, "select * from cw1310"); cbparam.nrow = 0; result = sqlite3_exec(db, sql, cw1310_dbcb, (void *)&cbparam, &errmsg); plt_unlock_ctndb(); if (result != SQLITE_OK) { log_dbg("%s, result != SQLITE_OK : %d", __func__, result); ret = -1; } else if (cbparam.ret != 0) { log_dbg("%s, cbparam.ret != 0 : %d", __func__, cbparam.ret); ret = -2; } else { cw1310_nbr = cbparam.nrow; cbparam.nrow = 0; db = plt_get_devdb(); plt_lock_devdb(); sprintf(sql, "select * from cw1310"); result = sqlite3_exec(db, sql, cw1310_dbcb, (void *)&cbparam, &errmsg); plt_unlock_devdb(); for (int i = 1; i <= cw1310_nbr; ++i) { if (strcmp(cw1310[i].szdev_id, "") == 0) { if (get_snow_id(cw1310[i].szdev_id) != 0) { ret = -4; } else { char sql[1024]; char *errmsg = NULL; sprintf(sql, "update cw1310 set devid=\"%s\" where idx=%d", cw1310[i].szdev_id, cw1310[i].idx); plt_lock_devdb(); int rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg); plt_unlock_devdb(); if (rc != SQLITE_OK) { log_dbg("%s, failed to update level device id:%s", __func__, errmsg); ret = -4; goto leave; } else { log_dbg("%s, update device id:%s", __func__, cw1310[i].szdev_id); } } } } if (pthread_create(&thrd, NULL, cw1310_thrd_main, NULL) != 0) { ret = -1; log_dbg("%s, create cw1310 thrd main fail", __func__); } } leave: log_dbg("%s--, ret:%d", __func__, ret); return ret; } int cw1310_get_addr(int idx) { return cw1310[idx].comm.adr; } int cw1310_get_comm_st(int idx) { struct cw1310_t *dev = &cw1310[idx]; struct comm_t *comm = &dev->comm; return comm_get_state(comm); } int cw1310_get_chan_idx(int idx) { struct cw1310_t *dev = &cw1310[idx]; struct comm_t *comm = &dev->comm; return comm_get_chan_idx(comm); } char *cw1310_get_comm_st_str(int idx) { struct cw1310_t *dev = &cw1310[idx]; struct comm_t *comm = &dev->comm; return comm_get_state_str(comm); } int cw1310_get_tick(int idx) { return cw1310[idx].sm.tick; } int cw1310_get_nbr() { return cw1310_nbr; } int cw1310_get_warning(int idx) { return cw1310[idx].fa_pack.warningLevel; } int cw1310_get_tool_data(int idx, char *buf) { if (idx < 1 || idx > cw1310_nbr || buf == NULL) return -1; struct cw1310_t *dev = &cw1310[idx]; struct statemachine_t *sm = &dev->sm; struct comm_t *comm = &dev->comm; char buf_temp[1024]; sm_get_summary(sm, buf_temp, sizeof(buf_temp)); sprintf(buf, " [%d] %s ", idx, buf_temp); comm_get_summary(comm, buf_temp, sizeof(buf_temp)); strcat(buf, buf_temp); sprintf(buf_temp, "dev id: %s t1:%d t2:%d co:%d voc:%d smoke flag:%02X smoke status:%s fire level:%02X status code:%02X status:%s \n", dev->szdev_id, dev->fa_pack.t1, dev->fa_pack.t2, dev->fa_pack.co, dev->fa_pack.voc, dev->fa_pack.smoke_flag, dev->fa_pack.szSmokeFlags, dev->fa_pack.fireLevel, dev->fa_pack.status_code, dev->fa_pack.szStatus); strcat(buf, buf_temp); return 0; } int cw1310_get_tbmqtt_data(int idx, char *buf) { struct cw1310_t *dev = &cw1310[idx]; sprintf(buf, "'fa%d_t1':%d, 'fa%d_t2':%d, 'fa%d_co':%d, 'fa%d_voc':%d, 'fa%d_smoke':'%s', 'fa%d_fire':%d, 'fa%d_status':'%s', 'fa%d_state':'%s'", idx, dev->fa_pack.t1, idx, dev->fa_pack.t2, idx, dev->fa_pack.co, idx, dev->fa_pack.voc, idx, dev->fa_pack.szSmokeFlags, idx, dev->fa_pack.fireLevel, idx, dev->fa_pack.szStatus, idx, dev->sm.szState); return 0; } int cw1310_get_cloud_data(int ctn_idx, int idx, char *buf) { struct cw1310_t *dev = &cw1310[idx]; sprintf(buf, "{\"device_id\":\"%s\", \"type\":14, \"t1\":%d, \"t2\":%d, \"co\":%d, \"voc\":%d, \"smoke\":\"%s\", \"fire\":%d, \"status\":\"%s\", \"state\":\"%d\"}", dev->szdev_id, dev->fa_pack.t1, dev->fa_pack.t2, dev->fa_pack.co, dev->fa_pack.voc, dev->fa_pack.szSmokeFlags, dev->fa_pack.fireLevel, dev->fa_pack.szStatus, dev->sm.state); return 0; } int cw1310_get_init_data(int ctn_idx, int idx, char *buf) { sprintf(buf, "{\"device_id\":\"%s\", \"type\":14, \"idx\":%d, \"pid\":\"%s\", \"config\":{\"chan_idx\":%d, \"adr\":%d }}", cw1310[idx].szdev_id, idx, ctn_get_dev_id(), cw1310[idx].comm.chanidx, cw1310[idx].comm.adr); return 0; } int cw1310_get_modbus_data(int idx, unsigned short* data) { struct cw1310_t *dev = &cw1310[idx]; data[0] = (unsigned short)DEVM_CW1310; data[1] = (unsigned short)1; data[2] = (unsigned short)dev->sm.state; data[3] = (unsigned short)dev->sm.step; data[4] = (unsigned short)dev->sm.err; data[5] = (unsigned short)dev->comm.adr; data[6] = (unsigned short)dev->comm.state; data[7] = (unsigned short)dev->fa_pack.t1+40; data[8] = (unsigned short)dev->fa_pack.t2+40; data[9] = (unsigned short)dev->fa_pack.co; data[10] = (unsigned short)dev->fa_pack.voc; data[11] = (unsigned short)dev->fa_pack.smoke_flag; data[12] = (unsigned short)dev->fa_pack.fireLevel; data[13] = (unsigned short)dev->fa_pack.status_code; return 0; }