adl200_sm.c 4.3 KB

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