dido_zlgmcu_sm.c 4.6 KB

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