abb_b23_4_sm.c 4.3 KB

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