#include "mc0051gs_sm.h" #include "mc0051gs.h" #include "mc0051gs_comm.h" #include "plt.h" static struct state_t mc0051gs_states[] = { {SMST_LAUNCH, "launch"}, {SMST_READY, "ready"}, {SMST_ERR, "err"}, }; static struct err_t mc0051gs_errs[] = { {MC0051GSERR_NONE, "none"}, // launch {MC0051GSERR_LAUNCH_COMMERR, "launch, comm err"}, // err {MC0051GSERR_ERR_COMMERR, "err comm err"}, // ready {MC0051GSERR_READY_COMMERR, "ready comm err"}, }; int mc0051gs_sm_init(int idx) { struct statemachine_t *sm = &mc0051gs[idx].sm; sm_reset_timing(sm, 1, 1); sm->states = mc0051gs_states; sm->state_nbr = sizeof(mc0051gs_states) / sizeof(struct state_t); sm->errs = mc0051gs_errs; sm->err_nbr = sizeof(mc0051gs_errs) / sizeof(struct err_t); sm_set_state(sm, SMST_LAUNCH, MC0051GSERR_NONE); return 0; } static void mc0051gs_sm_launch(int idx) { struct mc0051gs_t *dev = &mc0051gs[idx]; struct comm_t *comm = &dev->comm; struct statemachine_t *sm = &dev->sm; if (sm_get_step(sm) == 0) { // entry log_dbg("%s, idx:%d, state:%s, step:%d, entry", __func__, idx, sm_get_szstate(sm), sm_get_step(sm)); mc0051gs_reset_cmd(idx); mc0051gs_comm_reset(idx); sm_set_step(sm, 20); } else if (sm_get_step(sm) == 20) { // chk comm state if (comm_get_state(comm) == COMMST_NORMAL) { log_dbg("%s, idx:%d, state:%s, step:%d, comm ok, goto ready", __func__, idx, sm_get_szstate(sm), sm_get_step(sm)); mc0051gs_set_dev_start(idx); // 进入 ready 自启动 sm_set_state(sm, SMST_READY, MC0051GSERR_NONE); } else { log_dbg("%s, idx:%d, state:%s, step:%d, comm err, goto err", __func__, idx, sm_get_szstate(sm), sm_get_step(sm)); sm_set_state(sm, SMST_ERR, MC0051GSERR_LAUNCH_COMMERR); } } } static void mc0051gs_sm_err(int idx) { struct mc0051gs_t *dev = &mc0051gs[idx]; struct comm_t *comm = &dev->comm; struct statemachine_t *sm = &dev->sm; static double ts_last_try; double ts; if (sm_get_step(sm) == 0) { // entry mc0051gs_reset_cmd(idx); sm_set_step(sm, 10); ts_last_try = sm_get_timeofday(); } else if (sm_get_step(sm) == 10) { // wait cmd ts = sm_get_timeofday(); if (mc0051gs_get_cmd(idx) == CMD_SM_READY) { log_dbg("%s, idx:%d, state:%s, step:%d, get ready cmd, try to comm", __func__, idx, sm_get_szstate(sm), sm_get_step(sm)); mc0051gs_reset_cmd(idx); mc0051gs_comm_reset(idx); sm_set_step(sm, 20); } else if (ts - ts_last_try > 60000) { // 60s ts_last_try = ts; mc0051gs_comm_reset(idx); sm_set_step(sm, 20); } } else if (sm_get_step(sm) == 20) { // chk comm state if (comm_get_state(comm) == COMMST_NORMAL) { log_dbg("%s, idx:%d, state:%s, step:%d, comm ok, goto ready", __func__, idx, sm_get_szstate(sm), sm_get_step(sm)); sm_set_state(sm, SMST_READY, MC0051GSERR_NONE); } else { log_dbg("%s, idx:%d, state:%s, step:%d, comm err, stay err", __func__, idx, sm_get_szstate(sm), sm_get_step(sm)); sm_set_state(sm, SMST_ERR, MC0051GSERR_ERR_COMMERR); } } } static void mc0051gs_sm_ready(int idx) { struct mc0051gs_t *dev = &mc0051gs[idx]; struct comm_t *comm = &dev->comm; struct statemachine_t *sm = &dev->sm; /* chk comm state */ if (comm_get_state(comm) != COMMST_NORMAL) { log_dbg("%s, idx:%d, state:%s, step:%d, comm err detected, goto err", __func__, idx, sm_get_szstate(sm), sm_get_step(sm)); sm_set_state(sm, SMST_ERR, MC0051GSERR_READY_COMMERR); return; } if(pack_get_state() == SMST_READY) { mc0051gs_set_cellt_running(idx,1); } else { mc0051gs_set_cellt_running(idx,0); } mc0051gs_set_cellt_max(idx,pack_get_celltmax()); mc0051gs_set_cellt_min(idx,pack_get_celltmin()); mc0051gs_set_cellt_avg(idx,pack_get_celltave()); } void *mc0051gs_sm(int idx) { struct mc0051gs_t *dev = &mc0051gs[idx]; struct statemachine_t *sm = &dev->sm; sm_cal_timing(sm); switch (sm_get_state(sm)) { case SMST_LAUNCH: mc0051gs_sm_launch(idx); break; case SMST_READY: mc0051gs_sm_ready(idx); break; case SMST_ERR: mc0051gs_sm_err(idx); break; default: log_dbg("%s unknown state : %d", __func__, sm_get_state(sm)); break; } }