evc_sm.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #include "plt.h"
  2. #include "evc_comm.h"
  3. #include "evc.h"
  4. #include "evc_sm.h"
  5. static struct state_t evc_states[] = {
  6. {SMST_LAUNCH, "launch"},
  7. {SMST_READY, "ready"},
  8. {SMST_ERR, "err"},
  9. };
  10. static struct err_t evc_errs[] = {
  11. {EVCERR_NONE, "none"},
  12. // launch
  13. {EVCERR_LAUNCH_COMMERR, "launch, comm err"},
  14. // err
  15. {EVCERR_ERR_COMMERR, "err comm err"},
  16. // ready
  17. {EVCERR_READY_COMMERR, "ready comm err"},
  18. };
  19. int evc_sm_init(int idx)
  20. {
  21. struct statemachine_t *sm = &evc[idx].sm;
  22. sm_reset_timing(sm, 1, 1);
  23. sm->states = evc_states;
  24. sm->state_nbr = sizeof(evc_states) / sizeof(struct state_t);
  25. sm->errs = evc_errs;
  26. sm->err_nbr = sizeof(evc_errs) / sizeof(struct err_t);
  27. sm_set_state(sm, SMST_LAUNCH, EVCERR_NONE);
  28. return 0;
  29. }
  30. static void evc_sm_launch(int idx)
  31. {
  32. struct evc_t *dev = &evc[idx];
  33. struct comm_t *comm = &dev->comm;
  34. struct statemachine_t *sm = &dev->sm;
  35. if (sm_get_step(sm) == 0)
  36. { // entry
  37. log_dbg("%s, idx:%d, state:%s, step:%d, entry", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  38. evc_reset_cmd(idx);
  39. evc_comm_reset(idx);
  40. sm_set_step(sm, 20);
  41. }
  42. /*
  43. if( sm_get_step(sm) == 0 ){ // entry
  44. log_dbg("%s, idx:%d, state:%s, step:%d, entry", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  45. evc_reset_cmd(idx);
  46. sm_set_step(sm, 10);
  47. }else if( sm_get_step(sm) == 10){ // wait cmd
  48. if( evc_get_cmd(idx) == CMD_SM_READY){
  49. log_dbg("%s, idx:%d, state:%s, step:%d, get ready cmd, try to comm",
  50. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  51. evc_reset_cmd(idx);
  52. evc_comm_reset(idx);
  53. sm_set_step(sm, 20);
  54. }
  55. }*/
  56. else if (sm_get_step(sm) == 20)
  57. { // chk comm state
  58. if (comm_get_state(comm) == COMMST_NORMAL)
  59. {
  60. log_dbg("%s, idx:%d, state:%s, step:%d, comm ok, goto ready",
  61. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  62. sm_set_state(sm, SMST_READY, EVCERR_NONE);
  63. }
  64. else
  65. {
  66. log_dbg("%s, idx:%d, state:%s, step:%d, comm err, goto err",
  67. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  68. sm_set_state(sm, SMST_ERR, EVCERR_LAUNCH_COMMERR);
  69. }
  70. }
  71. }
  72. static void evc_sm_err(int idx)
  73. {
  74. struct evc_t *dev = &evc[idx];
  75. struct comm_t *comm = &dev->comm;
  76. struct statemachine_t *sm = &dev->sm;
  77. static double ts_last_try;
  78. double ts;
  79. if (sm_get_step(sm) == 0)
  80. { // entry
  81. evc_reset_cmd(idx);
  82. sm_set_step(sm, 10);
  83. ts_last_try = sm_get_timeofday();
  84. }
  85. else if (sm_get_step(sm) == 10)
  86. { // wait cmd
  87. ts = sm_get_timeofday();
  88. if (evc_get_cmd(idx) == CMD_SM_READY)
  89. {
  90. log_dbg("%s, idx:%d, state:%s, step:%d, get ready cmd, try to comm",
  91. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  92. evc_reset_cmd(idx);
  93. evc_comm_reset(idx);
  94. sm_set_step(sm, 20);
  95. }
  96. else if (ts - ts_last_try > 60000)
  97. { // 60s
  98. ts_last_try = ts;
  99. evc_comm_reset(idx);
  100. sm_set_step(sm, 20);
  101. }
  102. }
  103. else if (sm_get_step(sm) == 20)
  104. { // chk comm state
  105. if (comm_get_state(comm) == COMMST_NORMAL)
  106. {
  107. log_dbg("%s, idx:%d, state:%s, step:%d, comm ok, goto ready", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  108. sm_set_state(sm, SMST_READY, EVCERR_NONE);
  109. }
  110. else
  111. {
  112. log_dbg("%s, idx:%d, state:%s, step:%d, comm err, stay err", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  113. sm_set_state(sm, SMST_ERR, EVCERR_ERR_COMMERR);
  114. }
  115. }
  116. }
  117. static void evc_sm_ready(int idx)
  118. {
  119. struct evc_t *dev = &evc[idx];
  120. struct comm_t *comm = &dev->comm;
  121. struct statemachine_t *sm = &dev->sm;
  122. /* chk comm state */
  123. if (comm_get_state(comm) != COMMST_NORMAL)
  124. {
  125. log_dbg("%s, idx:%d, state:%s, step:%d, comm err detected, goto err",
  126. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  127. sm_set_state(sm, SMST_ERR, EVCERR_READY_COMMERR);
  128. return;
  129. }
  130. }
  131. void *evc_sm(int idx)
  132. {
  133. struct evc_t *dev = &evc[idx];
  134. struct statemachine_t *sm = &dev->sm;
  135. sm_cal_timing(sm);
  136. switch (sm_get_state(sm))
  137. {
  138. case SMST_LAUNCH:
  139. evc_sm_launch(idx);
  140. break;
  141. case SMST_READY:
  142. evc_sm_ready(idx);
  143. break;
  144. case SMST_ERR:
  145. evc_sm_err(idx);
  146. break;
  147. default:
  148. log_dbg("%s unknown state : %d", __func__, sm_get_state(sm));
  149. break;
  150. }
  151. }