sm.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include "plt.h"
  2. #define NONE "\e[0m"
  3. #define BLACK "\e[0;30m"
  4. #define L_BLACK "\e[1;30m"
  5. #define RED "\e[0;31m"
  6. #define L_RED "\e[1;31m"
  7. #define GREEN "\e[0;32m"
  8. #define L_GREEN "\e[1;32m"
  9. #define BROWN "\e[0;33m"
  10. #define YELLOW "\e[1;33m"
  11. #define BLUE "\e[0;34m"
  12. #define L_BLUE "\e[1;34m"
  13. #define PURPLE "\e[0;35m"
  14. #define L_PURPLE "\e[1;35m"
  15. #define CYAN "\e[0;36m"
  16. #define L_CYAN "\e[1;36m"
  17. #define GRAY "\e[0;37m"
  18. #define WHITE "\e[1;37m"
  19. #define BOLD "\e[1m"
  20. #define UNDERLINE "\e[4m"
  21. #define BLINK "\e[5m"
  22. #define REVERSE "\e[7m"
  23. #define HIDE "\e[8m"
  24. #define CLEAR "\e[2J"
  25. #define CLRLINE "\r\e[K"
  26. /* ms */
  27. double sm_get_timeofday()
  28. {
  29. struct timeval tv;
  30. struct timezone tz;
  31. gettimeofday(&tv,&tz);
  32. return (double)tv.tv_sec * 1000 + (double)tv.tv_usec/1000;
  33. }
  34. void sm_reset_timing(struct statemachine_t* sm, int timing_prd, int tick_prd)
  35. {
  36. sm->timing_timer = -1;
  37. sm->timing_prd = timing_prd;
  38. sm->timing_ave = -1.0;
  39. sm->timing_max = -1.0;
  40. sm->timing_cur = -1.0;
  41. sm->tick_timer = 0;
  42. sm->tick = 0;
  43. sm->tick_prd = tick_prd;
  44. }
  45. void sm_cal_timing(struct statemachine_t* sm)
  46. {
  47. /* state machine timing statistics */
  48. double tseclipsed = 0.0;
  49. double ts = 0.0;
  50. if( sm->timing_timer < 0 ){ /* reset */
  51. sm->timing_timer = 0;
  52. sm->timing_tslastrun = sm_get_timeofday();
  53. sm->timing_totalcnt = 0.0;
  54. sm->timing_totaltime = 0.0;
  55. sm->timing_ave = -1.0;
  56. sm->timing_max = -1.0;
  57. sm->timing_cur = -1.0;
  58. }else{
  59. if( ++sm->timing_timer >= sm->timing_prd ){ /* cal every prd times */
  60. sm->timing_timer = 0;
  61. ts = sm_get_timeofday();
  62. tseclipsed = ts - sm->timing_tslastrun;
  63. sm->timing_totalcnt += sm->timing_prd;
  64. sm->timing_totaltime += tseclipsed;
  65. sm->timing_tslastrun = ts;
  66. sm->timing_ave = sm->timing_totaltime/sm->timing_totalcnt;
  67. sm->timing_cur = tseclipsed/sm->timing_prd;
  68. if( sm->timing_cur > sm->timing_max ){
  69. sm->timing_max = sm->timing_cur;
  70. }
  71. if( sm->timing_totalcnt > 8640000 ){ /* auto reset */
  72. sm->timing_timer = -1;
  73. }
  74. }
  75. }
  76. if( sm->tick_timer++ >= sm->tick_prd ){ //
  77. sm->tick_timer = 0;
  78. sm->tick++;
  79. }
  80. }
  81. void sm_set_state(struct statemachine_t* sm, int state, int err)
  82. {
  83. int i, found;
  84. sm->state = state;
  85. sm->step = 0;
  86. sm->count = 0;
  87. found = 0;
  88. for( i = 0; i < sm->state_nbr; i++ ){
  89. if( state == sm->states[i].code ){
  90. found = 1;
  91. strcpy(sm->szstate, sm->states[i].szstr);
  92. }
  93. }
  94. if( found != 1 ){
  95. strcpy(sm->szstate, "unknown");
  96. }
  97. found = 0;
  98. for( i = 0; i < sm->err_nbr; i++ ){
  99. if( err == sm->errs[i].code ){
  100. found = 1;
  101. strcpy(sm->szerrcode, sm->errs[i].szstr);
  102. }
  103. }
  104. if( found != 1 ){
  105. strcpy(sm->szerrcode, "unknown");
  106. }
  107. }
  108. int sm_get_state(struct statemachine_t* sm)
  109. {
  110. return sm->state;
  111. }
  112. char* sm_get_szstate(struct statemachine_t* sm)
  113. {
  114. return sm->szstate;
  115. }
  116. int sm_get_step(struct statemachine_t* sm)
  117. {
  118. return sm->step;
  119. }
  120. void sm_set_step(struct statemachine_t* sm, int step)
  121. {
  122. sm->step = step;
  123. }
  124. int sm_get_count(struct statemachine_t* sm)
  125. {
  126. return sm->count;
  127. }
  128. void sm_set_count(struct statemachine_t* sm, int val)
  129. {
  130. sm->count = val;
  131. }
  132. void sm_inc_count(struct statemachine_t* sm)
  133. {
  134. sm->count++;
  135. }
  136. void sm_get_summary(struct statemachine_t* sm, char* buf, int len)
  137. {
  138. sprintf(buf, "SM stat:" YELLOW "%s" NONE " stp:%d err:[%s] tick:%03d timing_ave(ms):%.0f cur:%.0f max:%.0f",
  139. sm->szstate, sm->step, sm->szerrcode, sm->tick, sm->timing_ave, sm->timing_cur, sm->timing_max);
  140. }