mc0051gs_sm.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include "mc0051gs_sm.h"
  2. #include "mc0051gs.h"
  3. #include "mc0051gs_comm.h"
  4. #include "plt.h"
  5. static struct state_t mc0051gs_states[] = {
  6. {SMST_LAUNCH, "launch"},
  7. {SMST_READY, "ready"},
  8. {SMST_ERR, "err"},
  9. };
  10. static struct err_t mc0051gs_errs[] = {
  11. {MC0051GSERR_NONE, "none"},
  12. // launch
  13. {MC0051GSERR_LAUNCH_COMMERR, "launch, comm err"},
  14. // err
  15. {MC0051GSERR_ERR_COMMERR, "err comm err"},
  16. // ready
  17. {MC0051GSERR_READY_COMMERR, "ready comm err"},
  18. };
  19. int mc0051gs_sm_init(int idx)
  20. {
  21. struct statemachine_t *sm = &mc0051gs[idx].sm;
  22. sm_reset_timing(sm, 1, 1);
  23. sm->states = mc0051gs_states;
  24. sm->state_nbr = sizeof(mc0051gs_states) / sizeof(struct state_t);
  25. sm->errs = mc0051gs_errs;
  26. sm->err_nbr = sizeof(mc0051gs_errs) / sizeof(struct err_t);
  27. sm_set_state(sm, SMST_LAUNCH, MC0051GSERR_NONE);
  28. return 0;
  29. }
  30. static void mc0051gs_sm_launch(int idx)
  31. {
  32. struct mc0051gs_t *dev = &mc0051gs[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. mc0051gs_reset_cmd(idx);
  39. mc0051gs_comm_reset(idx);
  40. sm_set_step(sm, 20);
  41. }
  42. else if (sm_get_step(sm) == 20)
  43. { // chk comm state
  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. mc0051gs_set_dev_start(idx); // 进入 ready 自启动
  49. sm_set_state(sm, SMST_READY, MC0051GSERR_NONE);
  50. }
  51. else
  52. {
  53. log_dbg("%s, idx:%d, state:%s, step:%d, comm err, goto err",
  54. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  55. sm_set_state(sm, SMST_ERR, MC0051GSERR_LAUNCH_COMMERR);
  56. }
  57. }
  58. }
  59. static void mc0051gs_sm_err(int idx)
  60. {
  61. struct mc0051gs_t *dev = &mc0051gs[idx];
  62. struct comm_t *comm = &dev->comm;
  63. struct statemachine_t *sm = &dev->sm;
  64. static double ts_last_try;
  65. double ts;
  66. if (sm_get_step(sm) == 0)
  67. { // entry
  68. mc0051gs_reset_cmd(idx);
  69. sm_set_step(sm, 10);
  70. ts_last_try = sm_get_timeofday();
  71. }
  72. else if (sm_get_step(sm) == 10)
  73. { // wait cmd
  74. ts = sm_get_timeofday();
  75. if (mc0051gs_get_cmd(idx) == CMD_SM_READY)
  76. {
  77. log_dbg("%s, idx:%d, state:%s, step:%d, get ready cmd, try to comm",
  78. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  79. mc0051gs_reset_cmd(idx);
  80. mc0051gs_comm_reset(idx);
  81. sm_set_step(sm, 20);
  82. }
  83. else if (ts - ts_last_try > 60000)
  84. { // 60s
  85. ts_last_try = ts;
  86. mc0051gs_comm_reset(idx);
  87. sm_set_step(sm, 20);
  88. }
  89. }
  90. else if (sm_get_step(sm) == 20)
  91. { // chk comm state
  92. if (comm_get_state(comm) == COMMST_NORMAL)
  93. {
  94. log_dbg("%s, idx:%d, state:%s, step:%d, comm ok, goto ready", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  95. sm_set_state(sm, SMST_READY, MC0051GSERR_NONE);
  96. }
  97. else
  98. {
  99. log_dbg("%s, idx:%d, state:%s, step:%d, comm err, stay err", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  100. sm_set_state(sm, SMST_ERR, MC0051GSERR_ERR_COMMERR);
  101. }
  102. }
  103. }
  104. static void mc0051gs_sm_ready(int idx)
  105. {
  106. struct mc0051gs_t *dev = &mc0051gs[idx];
  107. struct comm_t *comm = &dev->comm;
  108. struct statemachine_t *sm = &dev->sm;
  109. /* chk comm state */
  110. if (comm_get_state(comm) != COMMST_NORMAL)
  111. {
  112. log_dbg("%s, idx:%d, state:%s, step:%d, comm err detected, goto err",
  113. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  114. sm_set_state(sm, SMST_ERR, MC0051GSERR_READY_COMMERR);
  115. return;
  116. }
  117. if(pack_get_state() == SMST_READY)
  118. {
  119. mc0051gs_set_cellt_running(idx,1);
  120. }
  121. else
  122. {
  123. mc0051gs_set_cellt_running(idx,0);
  124. }
  125. mc0051gs_set_cellt_max(idx,pack_get_celltmax());
  126. mc0051gs_set_cellt_min(idx,pack_get_celltmin());
  127. mc0051gs_set_cellt_avg(idx,pack_get_celltave());
  128. }
  129. void *mc0051gs_sm(int idx)
  130. {
  131. struct mc0051gs_t *dev = &mc0051gs[idx];
  132. struct statemachine_t *sm = &dev->sm;
  133. sm_cal_timing(sm);
  134. switch (sm_get_state(sm))
  135. {
  136. case SMST_LAUNCH:
  137. mc0051gs_sm_launch(idx);
  138. break;
  139. case SMST_READY:
  140. mc0051gs_sm_ready(idx);
  141. break;
  142. case SMST_ERR:
  143. mc0051gs_sm_err(idx);
  144. break;
  145. default:
  146. log_dbg("%s unknown state : %d", __func__, sm_get_state(sm));
  147. break;
  148. }
  149. }