sga500e_sm.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "plt.h"
  2. static struct state_t sga500e_states[] = {
  3. { SMST_LAUNCH, "launch" },
  4. { SMST_READY, "ready" },
  5. { SMST_ERR, "err" },
  6. };
  7. static struct err_t sga500e_errs[] = {
  8. { SGA500EERR_NONE, "none" },
  9. // launch
  10. { SGA500EERR_LAUNCH_COMMERR, "launch, comm err" },
  11. // err
  12. { SGA500EERR_ERR_COMMERR, "err, comm err" },
  13. // ready
  14. { SGA500EERR_READY_COMMERR, "ready, comm err" },
  15. };
  16. static void sga500e_sm_launch( int idx )
  17. {
  18. struct sga500e_t* dev = &sga500e[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. sga500e_reset_cmd(idx);
  24. sga500e_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. sga500e_reset_cmd(idx);
  31. sm_set_step(sm, 10);
  32. }else if( sm_get_step(sm) == 10){ // wait cmd
  33. if( sga500e_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. sga500e_reset_cmd(idx);
  37. sga500e_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",
  43. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  44. sm_set_state(sm, SMST_READY, SGA500EERR_NONE);
  45. }else{
  46. log_dbg("%s, idx:%d, state:%s, step:%d, comm err, goto err",
  47. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  48. sm_set_state(sm, SMST_ERR, SGA500EERR_LAUNCH_COMMERR);
  49. }
  50. }
  51. }
  52. static void sga500e_sm_err( int idx )
  53. {
  54. struct sga500e_t* dev = &sga500e[idx];
  55. struct comm_t* comm = &dev->comm;
  56. struct statemachine_t* sm = &dev->sm;
  57. static double ts_last_try;
  58. double ts;
  59. if( sm_get_step(sm) == 0 ){ // entry
  60. log_dbg("%s, idx:%d, state:%s, step:%d, entry", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  61. sga500e_reset_cmd(idx);
  62. sm_set_step(sm, 10);
  63. ts_last_try = sm_get_timeofday();
  64. }else if( sm_get_step(sm) == 10){ // wait cmd
  65. ts = sm_get_timeofday();
  66. if( sga500e_get_cmd(idx) == CMD_SM_READY){
  67. 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));
  68. sga500e_reset_cmd(idx);
  69. sga500e_comm_reset(idx);
  70. sm_set_step(sm, 20);
  71. }else if( ts - ts_last_try > 60000 ){ // 60s
  72. ts_last_try = ts;
  73. sga500e_comm_reset(idx);
  74. sm_set_step(sm, 20);
  75. }
  76. }else if( sm_get_step(sm) == 20){ // chk comm state
  77. if( comm_get_state(comm) == COMMST_NORMAL){
  78. log_dbg("%s, idx:%d, state:%s, step:%d, comm ok, goto ready",
  79. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  80. sm_set_state(sm, SMST_READY, SGA500EERR_NONE);
  81. }else{
  82. log_dbg("%s, idx:%d, state:%s, step:%d, comm err, stay err",
  83. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  84. sm_set_state(sm, SMST_ERR, SGA500EERR_ERR_COMMERR);
  85. }
  86. }
  87. }
  88. static void sga500e_sm_ready( int idx )
  89. {
  90. struct sga500e_t* dev = &sga500e[idx];
  91. struct comm_t* comm = &dev->comm;
  92. struct statemachine_t* sm = &dev->sm;
  93. /* chk comm state */
  94. if( comm_get_state(comm) != COMMST_NORMAL){
  95. log_dbg("%s, idx:%d, state:%s, step:%d, comm err detected, goto err",
  96. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  97. sm_set_state(sm, SMST_ERR, SGA500EERR_READY_COMMERR);
  98. return;
  99. }
  100. }
  101. void sga500e_sm( int idx )
  102. {
  103. struct sga500e_t* dev = &sga500e[idx];
  104. struct statemachine_t* sm = &dev->sm;
  105. sm_cal_timing(sm);
  106. switch(sm_get_state( sm ))
  107. {
  108. case SMST_LAUNCH:
  109. sga500e_sm_launch( idx );
  110. break;
  111. case SMST_READY:
  112. sga500e_sm_ready( idx );
  113. break;
  114. case SMST_ERR:
  115. sga500e_sm_err( idx );
  116. break;
  117. default:
  118. log_dbg("%s, never reach here",__func__);
  119. break;
  120. }
  121. }
  122. int sga500e_sm_init(int idx)
  123. {
  124. struct statemachine_t* sm = &sga500e[idx].sm;
  125. sm_reset_timing(sm, 1, 1);
  126. sm->states = sga500e_states;
  127. sm->state_nbr = sizeof(sga500e_states)/sizeof(struct state_t);
  128. sm->errs = sga500e_errs;
  129. sm->err_nbr = sizeof(sga500e_errs)/sizeof(struct err_t);
  130. sm_set_state( sm, SMST_LAUNCH, SGA500EERR_NONE );
  131. return 0;
  132. }