event-system.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /**
  2. * Author(s)...: Pashgan http://ChipEnable.Ru
  3. * Target(s)...: any MCU
  4. * Compiler....: IAR 5.11A
  5. * Description.: Template for tables based event system
  6. * Data........: 30.09.12
  7. */
  8. #include "event-system.h"
  9. static void EmptyFunc(void);
  10. /* ring buffer */
  11. static volatile es_event_t cycleBuf[SIZE_BUF];
  12. static volatile int tailBuf = 0;
  13. static volatile int headBuf = 0;
  14. static volatile int countBuf = 0;
  15. static volatile es_state_t _State;
  16. typedef struct {
  17. es_state_t state;
  18. es_event_t event;
  19. es_state_t nextState;
  20. void (*pStateFunc1)(void);
  21. void (*pStateFunc2)(void);
  22. } table_state_t;
  23. /**
  24. * Sate Table - heart of state machine
  25. */
  26. const table_state_t stateTable[] = {
  27. /* STATE EVENT NEXT STATE STATE_FUNC1 STATE_FUNC2 */
  28. /* show date, time, ... */
  29. // 'Hour+' Button pressed
  30. {stShowTime, evBTN1Pressed, stShowDate, show_Date, NULL},
  31. //{stShowMMSS, evBTN1Pressed, stShowDate, show_Date, NULL},
  32. // 'Min+' Button pressed
  33. {stShowTime, evSwitch2On, stShowMMSS, show_MMSS, NULL},
  34. {stShowMMSS, evSwitch2Off, stShowTime, show_Time, NULL},
  35. // 'Reset' Button pressed
  36. {stShowTime, evBTN3Pressed, stShowMMSS, setTimeCorrect, show_MMSS},
  37. {stShowMMSS, evBTN3Pressed, stShowTime, setTimeCorrect, show_Time},
  38. /* display wdt events */
  39. {stShowDate, evDisplayWDT, stShowTime, show_Time, NULL},
  40. /* refresh output */
  41. {stShowTime, evNewSecond, stNoChange, show_Time, NULL},
  42. {stShowMMSS, evNewSecond, stNoChange, show_MMSS, NULL},
  43. /* set time */
  44. {stShowTime, evSwitch1On, stSetHH, setTimeBegin, setHHBegin},
  45. {stSetHH, evSwitch1Off, stShowTime, setTimeEnd, show_Time},
  46. {stSetMM, evSwitch1Off, stShowTime, setTimeEnd, show_Time},
  47. {stSetHH, evBTN3Pressed, stSetMM, setMMBegin, NULL},
  48. {stSetMM, evBTN3Pressed, stSetHH, setHHBegin, NULL},
  49. {stSetHH, evBTN1Pressed, stNoChange, setHHInc, setTimeShow},
  50. {stSetHH, evBTN2Pressed, stNoChange, setHHDec, setTimeShow},
  51. {stSetMM, evBTN1Pressed, stNoChange, setMMInc, setTimeShow},
  52. {stSetMM, evBTN2Pressed, stNoChange, setMMDec, setTimeShow},
  53. {stSetHH, evDisplayWDT, stShowTime, show_Time, NULL},
  54. {stSetMM, evDisplayWDT, stShowTime, show_Time, NULL},
  55. /* set calendar */
  56. // begin
  57. {stShowDate, evBTN1Holded, stSetWD, setDateBegin, setWDBegin},
  58. // end
  59. {stSetWD, evBTN1Holded, stShowDate, setDateEnd, show_Date},
  60. // next
  61. {stSetWD, evBTN1Pressed, stSetMD, setMDBegin, NULL},
  62. {stSetMD, evBTN1Pressed, stSetMon, setMonthBegin, NULL},
  63. {stSetMon, evBTN1Pressed, stSetYear, setYearBegin, NULL},
  64. {stSetYear, evBTN1Pressed, stSetWD, setWDBegin, NULL},
  65. // change
  66. {stSetWD, evBTN2Pressed, stNoChange, setIncWDay, setWDShow},
  67. {stSetWD, evBTN3Pressed, stNoChange, setDecWDay, setWDShow},
  68. {stSetMD, evBTN2Pressed, stNoChange, setIncMDay, setDMShow},
  69. {stSetMD, evBTN3Pressed, stNoChange, setDecMDay, setDMShow},
  70. {stSetMon, evBTN2Pressed, stNoChange, setIncMonth, setDMShow},
  71. {stSetMon, evBTN3Pressed, stNoChange, setDecMonth, setDMShow},
  72. {stSetYear, evBTN2Pressed, stNoChange, setIncYear, setYearShow},
  73. {stSetYear, evBTN3Pressed, stNoChange, setDecYear, setYearShow},
  74. // WDT
  75. {stSetWD, evDisplayWDT, stShowTime, show_Time, NULL},
  76. {stSetMD, evDisplayWDT, stShowTime, show_Time, NULL},
  77. {stSetMon, evDisplayWDT, stShowTime, show_Time, NULL},
  78. {stSetYear, evDisplayWDT, stShowTime, show_Time, NULL},
  79. /* mandatory empty table row */
  80. {stNoChange, eventNull, stNoChange, EmptyFunc, EmptyFunc}
  81. };
  82. /**
  83. * @brief Take event.
  84. * @param None
  85. * @retval Event code
  86. */
  87. es_event_t ES_GetEvent(void)
  88. {
  89. es_event_t event;
  90. if (countBuf > 0) {
  91. event = cycleBuf[headBuf];
  92. countBuf --;
  93. headBuf = (headBuf + 1) & (SIZE_BUF - 1);
  94. return event;
  95. }
  96. return eventNull;
  97. }
  98. /**
  99. * @brief Place event.
  100. * @param Event
  101. * @retval None
  102. */
  103. void ES_PlaceEvent(es_event_t event)
  104. {
  105. if (countBuf < SIZE_BUF) {
  106. cycleBuf[tailBuf] = event;
  107. tailBuf = (tailBuf + 1) & (SIZE_BUF - 1);
  108. countBuf ++;
  109. } else {
  110. /* event buffer overflow alarm */
  111. display_String("ES Error: No space for Events!\0", 3);
  112. while(1);
  113. }
  114. }
  115. /**
  116. * @brief Initialize event system.
  117. * @param Start Event
  118. * @retval None
  119. */
  120. void ES_Init(es_state_t init_state)
  121. {
  122. tailBuf = 0;
  123. headBuf = 0;
  124. countBuf = 0;
  125. _State = init_state;
  126. }
  127. /**
  128. * @brief Fake function.
  129. * @param None
  130. * @retval None
  131. */
  132. static void EmptyFunc(void)
  133. {
  134. }
  135. /**
  136. * @brief Dispatcher of event system.
  137. * @param Event
  138. * @retval None
  139. */
  140. void ES_Dispatch(es_event_t event)
  141. {
  142. int i;
  143. void (*pStateFunc1)(void);
  144. void (*pStateFunc2)(void);
  145. pStateFunc1 = NULL;
  146. pStateFunc2 = NULL;
  147. /* get next state */
  148. for (i=0; stateTable[i].state; i++) {
  149. /* if the current state and the received event match */
  150. if (stateTable[i].state == _State && stateTable[i].event == event) {
  151. /* change current state if needed */
  152. if (stateTable[i].nextState != stNoChange) {
  153. _State = stateTable[i].nextState;
  154. }
  155. /* get functions */
  156. pStateFunc1 = stateTable[i].pStateFunc1;
  157. pStateFunc2 = stateTable[i].pStateFunc2;
  158. break;
  159. }
  160. }
  161. if (pStateFunc1) {
  162. pStateFunc1();
  163. }
  164. if (pStateFunc2) {
  165. pStateFunc2();
  166. }
  167. }
  168. /**
  169. * @brief Return current state code.
  170. * @param None
  171. * @retval State code
  172. */
  173. es_state_t ES_GetState(void)
  174. {
  175. return _State;
  176. }
  177. /**
  178. * @brief Set current state to given code .
  179. * @param State
  180. * @retval None
  181. */
  182. void ES_SetState(es_state_t new_state)
  183. {
  184. _State = new_state;
  185. }