#include "plt.h" #include "rs311_comm.h" #include "rs311.h" #include "rs311_sm.h" static struct state_t rs311_states[] = { {SMST_LAUNCH, "launch"}, {SMST_READY, "ready"}, {SMST_ERR, "err"}, }; static struct err_t rs311_errs[] = { {RS311_NONE, "none"}, // launch {RS311_LAUNCH_COMMERR, "launch, comm err"}, // err {RS311_ERR_COMMERR, "err comm err"}, // ready {RS311_READY_COMMERR, "ready comm err"}, }; int rs311_sm_init(int idx) { struct statemachine_t *sm = &rs311[idx].sm; sm_reset_timing(sm, 1, 1); sm->states = rs311_states; sm->state_nbr = sizeof(rs311_states) / sizeof(struct state_t); sm->errs = rs311_errs; sm->err_nbr = sizeof(rs311_errs) / sizeof(struct err_t); sm_set_state(sm, SMST_LAUNCH, RS311_NONE); return 0; } static void rs311_sm_launch(int idx) { struct rs311_t *dev = &rs311[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)); rs311_reset_cmd(idx); rs311_comm_reset(idx); sm_set_step(sm, 20); } /* 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)); rs311_reset_cmd(idx); sm_set_step(sm, 10); }else if( sm_get_step(sm) == 10){ // wait cmd if( rs311_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)); rs311_reset_cmd(idx); rs311_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, RS311_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, RS311_LAUNCH_COMMERR); } } } static void rs311_sm_err(int idx) { struct rs311_t *dev = &rs311[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 rs311_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 (rs311_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)); rs311_reset_cmd(idx); rs311_comm_reset(idx); sm_set_step(sm, 20); } else if (ts - ts_last_try > 60000) { // 60s ts_last_try = ts; rs311_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, RS311_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, RS311_ERR_COMMERR); } } } static void rs311_sm_ready(int idx) { struct rs311_t *dev = &rs311[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, RS311_READY_COMMERR); return; } } void *rs311_sm(int idx) { struct rs311_t *dev = &rs311[idx]; struct statemachine_t *sm = &dev->sm; sm_cal_timing(sm); switch (sm_get_state(sm)) { case SMST_LAUNCH: rs311_sm_launch(idx); break; case SMST_READY: rs311_sm_ready(idx); break; case SMST_ERR: rs311_sm_err(idx); break; default: log_dbg("%s unknown state : %d", __func__, sm_get_state(sm)); break; } }