sdcs_sm.c 4.7 KB

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