e3ks_sm.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include "plt.h"
  2. static struct state_t e3ks_states[] = {
  3. { SMST_LAUNCH, "launch" },
  4. { SMST_READY, "ready" },
  5. { SMST_ERR, "err" },
  6. };
  7. static struct err_t e3ks_errs[] = {
  8. { E3KSERR_NONE, "none" },
  9. // launch
  10. { E3KSERR_LAUNCH_COMMER, "launch, comm err" },
  11. // err
  12. { E3KSERR_ERR_COMMERR, "err, comm err" },
  13. // ready
  14. { E3KSERR_READY_COMMERR, "ready, comm err" },
  15. { E3KSERR_READY_LINEFAULT_DETECTED, "ready, line fault detected" },
  16. { E3KSERR_READY_UPSFAULT_DETECTED, "ready, ups fault detected" },
  17. };
  18. static void e3ks_sm_launch( int idx )
  19. {
  20. struct e3ks_t* dev = &e3ks[idx];
  21. struct comm_t* comm = &dev->comm;
  22. struct statemachine_t* sm = &dev->sm;
  23. if( sm_get_step(sm) == 0 ){ // entry
  24. log_dbg("%s, idx:%d, state:%s, step:%d, entry", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  25. e3ks_reset_cmd(idx);
  26. e3ks_s_comm_reset(idx);
  27. sm_set_step(sm, 20);
  28. }
  29. /*
  30. if( sm_get_step(sm) == 0 ){ // entry
  31. log_dbg("%s, idx:%d, state:%s, step:%d, entry", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  32. e3ks_reset_cmd(idx);
  33. sm_set_step(sm, 10);
  34. }else if( sm_get_step(sm) == 10){ // wait cmd
  35. if( e3ks_get_cmd(idx) == CMD_SM_READY){
  36. log_dbg("%s, idx:%d, state:%s, step:%d, get ready cmd, try to comm",
  37. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  38. e3ks_reset_cmd(idx);
  39. e3ks_s_comm_reset(idx);
  40. sm_set_step(sm, 20);
  41. }
  42. }*/else if( sm_get_step(sm) == 20){ // chk comm state
  43. if( comm_get_state(comm) == COMMST_NORMAL){
  44. log_dbg("%s, idx:%d, state:%s, step:%d, comm ok, goto ready",
  45. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  46. sm_set_state(sm, SMST_READY, E3KSERR_NONE);
  47. }else{
  48. log_dbg("%s, idx:%d, state:%s, step:%d, comm err, stay err",
  49. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  50. sm_set_state(sm, SMST_ERR, E3KSERR_LAUNCH_COMMER);
  51. }
  52. }
  53. }
  54. static void e3ks_sm_err( int idx )
  55. {
  56. struct e3ks_t* dev = &e3ks[idx];
  57. struct comm_t* comm = &dev->comm;
  58. struct statemachine_t* sm = &dev->sm;
  59. static double ts_last_try;
  60. double ts;
  61. if( sm_get_step(sm) == 0 ){ // entry
  62. log_dbg("%s, idx:%d, state:%s, step:%d, entry", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  63. e3ks_reset_cmd(idx);
  64. sm_set_step(sm, 10);
  65. ts_last_try = sm_get_timeofday();
  66. }else if( sm_get_step(sm) == 10){ // wait cmd
  67. ts = sm_get_timeofday();
  68. if( e3ks_get_cmd(idx) == CMD_SM_READY){
  69. log_dbg("%s, idx:%d, state:%s, step:%d, get ready cmd, try to comm",
  70. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  71. e3ks_reset_cmd(idx);
  72. e3ks_s_comm_reset(idx);
  73. sm_set_step(sm, 20);
  74. }else if( ts - ts_last_try > 60000 ){ // 60s
  75. ts_last_try = ts;
  76. e3ks_s_comm_reset(idx);
  77. sm_set_step(sm, 20);
  78. }
  79. }else if( sm_get_step(sm) == 20){ // chk comm state
  80. if( comm_get_state(comm) == COMMST_NORMAL){
  81. log_dbg("%s, idx:%d, state:%s, step:%d, comm ok, goto ready",
  82. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  83. sm_set_state(sm, SMST_READY, E3KSERR_NONE);
  84. }else{
  85. log_dbg("%s, idx:%d, state:%s, step:%d, comm err, stay err",
  86. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  87. sm_set_state(sm, SMST_ERR, E3KSERR_ERR_COMMERR);
  88. }
  89. }
  90. }
  91. static void e3ks_sm_ready( int idx )
  92. {
  93. struct e3ks_t* dev = &e3ks[idx];
  94. struct comm_t* comm = &dev->comm;
  95. struct statemachine_t* sm = &dev->sm;
  96. /* chk comm state */
  97. if( comm_get_state(comm) != COMMST_NORMAL){
  98. log_dbg("%s, idx:%d, state:%s, step:%d, comm err detected, goto err",
  99. __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  100. sm_set_state(sm, SMST_ERR, E3KSERR_READY_COMMERR);
  101. return;
  102. }
  103. if( sm_get_step(sm) == 0 ){ // entry
  104. log_dbg("%s, idx:%d, state:%s, step:%d, entry", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  105. e3ks_reset_cmd(idx);
  106. sm_set_step(sm, 10);
  107. }else if( sm_get_step(sm) == 10 ){ // wait and chk
  108. if( e3ks_get_line_fault(idx) == 1 ){
  109. log_dbg("%s, idx:%d, state:%s, step:%d, line fault detected, goto err", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  110. sm_set_state(sm, SMST_ERR, E3KSERR_READY_LINEFAULT_DETECTED);
  111. }else if( e3ks_get_ups_fault(idx) == 1 ){
  112. log_dbg("%s, idx:%d, state:%s, step:%d, ups fault detected, goto err", __func__, idx, sm_get_szstate(sm), sm_get_step(sm));
  113. sm_set_state(sm, SMST_ERR, E3KSERR_READY_UPSFAULT_DETECTED);
  114. }
  115. }
  116. }
  117. void e3ks_sm( int idx )
  118. {
  119. struct e3ks_t* dev = &e3ks[idx];
  120. struct statemachine_t* sm = &dev->sm;
  121. sm_cal_timing(sm);
  122. switch(sm_get_state( sm ))
  123. {
  124. case SMST_LAUNCH:
  125. e3ks_sm_launch( idx );
  126. break;
  127. case SMST_READY:
  128. e3ks_sm_ready( idx );
  129. break;
  130. case SMST_ERR:
  131. e3ks_sm_err( idx );
  132. break;
  133. default:
  134. log_dbg("%s, never reach here",__func__);
  135. break;
  136. }
  137. }
  138. int e3ks_sm_init(int idx)
  139. {
  140. struct statemachine_t* sm = &e3ks[idx].sm;
  141. sm_reset_timing(sm, 100, 100);
  142. sm->states = e3ks_states;
  143. sm->state_nbr = sizeof(e3ks_states)/sizeof(struct state_t);
  144. sm->errs = e3ks_errs;
  145. sm->err_nbr = sizeof(e3ks_errs)/sizeof(struct err_t);
  146. sm_set_state( sm, SMST_LAUNCH, E3KSERR_NONE );
  147. return 0;
  148. }