event-system.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /**
  2. * Author(s)...: Pashgan http://ChipEnable.Ru
  3. * Target(s)...: любой микроконтроллер mega
  4. * Compiler....: IAR 5.11A
  5. * Description.: Заготовка для событийной системы на таблицах
  6. * Data........: 30.09.12
  7. */
  8. #include "event-system.h"
  9. #include <avr/pgmspace.h>
  10. /* функция-заглушка */
  11. static void EmptyFunc(void);
  12. /* кольцевой буфер */
  13. static volatile es_event_t cycleBuf[SIZE_BUF];
  14. static volatile uint8_t tailBuf = 0;
  15. static volatile uint8_t headBuf = 0;
  16. static volatile uint8_t countBuf = 0;
  17. static volatile es_state_t _State;
  18. typedef struct {
  19. es_state_t state;
  20. es_event_t event;
  21. es_state_t nextState;
  22. void (*pStateFunc1)(void);
  23. void (*pStateFunc2)(void);
  24. } table_state_t;
  25. /** таблица состояний */
  26. const table_state_t stateTable[] PROGMEM = {
  27. /* STATE EVENT NEXT STATE STATE_FUNC1 STATE_FUNC2 */
  28. /* show date, time */
  29. {stShowTime, evBTN1Pressed, stShowMMSS, dotOnPersistent, showMMSS},
  30. {stShowMMSS, evBTN1Pressed, stShowWDay, showWDay, dotOff},
  31. {stShowWDay, evBTN1Pressed, stShowMDay, showMDay, dotOff},
  32. {stShowMDay, evBTN1Pressed, stShowMon, showMonth, dotOff},
  33. {stShowMon, evBTN1Pressed, stShowYear, showYear, dotOff},
  34. #if (USE_BRIGHT_CONTROL == 1)
  35. {stShowYear, evBTN1Pressed, stShowBright, showBright, NULL},
  36. {stShowBright, evBTN1Pressed, stShowTime, showTime, NULL},
  37. #else
  38. {stShowYear, evBTN1Pressed, stShowTime, showTime, NULL},
  39. #endif
  40. /* display wdt */
  41. {stShowWDay, evDisplayWDT, stShowTime, showTime, NULL},
  42. {stShowMDay, evDisplayWDT, stShowTime, showTime, NULL},
  43. {stShowMon, evDisplayWDT, stShowTime, showTime, NULL},
  44. {stShowYear, evDisplayWDT, stShowTime, showTime, NULL},
  45. {stShowBright, evDisplayWDT, stShowTime, showTime, NULL},
  46. /* refresh output */
  47. {stShowTime, evNewSecond, stNoChange, showTime, NULL},
  48. {stShowMMSS, evNewSecond, stNoChange, showMMSS, NULL},
  49. {stShowWDay, evRefreshCal, stNoChange, showWDay, NULL},
  50. {stShowMDay, evRefreshCal, stNoChange, showMDay, NULL},
  51. {stShowMon, evRefreshCal, stNoChange, showMonth, NULL},
  52. {stShowYear, evRefreshCal, stNoChange, showYear, NULL},
  53. /* set time */
  54. {stShowTime, evBTN1Holded, stSetHH, setTimeBegin, setHHBegin},
  55. {stShowMMSS, evBTN1Holded, stSetHH, setTimeBegin, setMMBegin},
  56. {stSetHH, evBTN1Pressed, stSetMM, setMMBegin, NULL},
  57. {stSetMM, evBTN1Pressed, stSetHH, setHHBegin, NULL},
  58. {stSetHH, evNewSecond, stNoChange, setTimeShow, NULL},
  59. {stSetMM, evNewSecond, stNoChange, setTimeShow, NULL},
  60. {stSetHH, evBTN1Holded, stShowTime, setTimeEnd, showTime},
  61. {stSetMM, evBTN1Holded, stShowTime, setTimeEnd, showTime},
  62. {stSetHH, evBTN3Pressed, stNoChange, setHHInc, setTimeShow},
  63. {stSetHH, evBTN2Pressed, stNoChange, setHHDec, setTimeShow},
  64. {stSetMM, evBTN3Pressed, stNoChange, setMMInc, setTimeShow},
  65. {stSetMM, evBTN2Pressed, stNoChange, setMMDec, setTimeShow},
  66. /* set calendar */
  67. {stShowWDay, evBTN3Pressed, stNoChange, incWDay, showWDay},
  68. {stShowMDay, evBTN3Pressed, stNoChange, incMDay, showMDay},
  69. {stShowMon, evBTN3Pressed, stNoChange, incMonth, showMonth},
  70. {stShowYear, evBTN3Pressed, stNoChange, incYear, showYear},
  71. {stShowWDay, evBTN2Pressed, stNoChange, decWDay, showWDay},
  72. {stShowMDay, evBTN2Pressed, stNoChange, decMDay, showMDay},
  73. {stShowMon, evBTN2Pressed, stNoChange, decMonth, showMonth},
  74. {stShowYear, evBTN2Pressed, stNoChange, decYear, showYear},
  75. #if (USE_BRIGHT_CONTROL == 1)
  76. /* set bright */
  77. {stShowBright, evBTN3Pressed, stNoChange, incBright, showBright},
  78. {stShowBright, evBTN2Pressed, stNoChange, decBright, showBright},
  79. #endif // USE_BRIGHT_CONTROL
  80. /* обязательная пустая строка таблицы */
  81. {stNoChange, eventNull, stNoChange, EmptyFunc, EmptyFunc}
  82. };
  83. /**
  84. * @brief Take event.
  85. * @param None
  86. * @retval Event
  87. */
  88. es_event_t ES_GetEvent(void)
  89. {
  90. es_event_t event;
  91. if (countBuf > 0){
  92. event = cycleBuf[headBuf];
  93. countBuf--;
  94. headBuf = (headBuf + 1) & (SIZE_BUF - 1);
  95. return event;
  96. }
  97. return eventNull;
  98. }
  99. /**
  100. * @brief Place event.
  101. * @param Event
  102. * @retval None
  103. */
  104. void ES_PlaceEvent(es_event_t event)
  105. {
  106. if (countBuf < SIZE_BUF){
  107. cycleBuf[tailBuf] = event;
  108. tailBuf = (tailBuf + 1) & (SIZE_BUF - 1);
  109. countBuf++;
  110. /* сигнализация переполнения буфера событий */
  111. // } else {
  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. #define prb(data) pgm_read_byte(&(data))
  137. #define prw(data) pgm_read_word(&(data))
  138. /**
  139. * @brief Dispatcher of event system.
  140. * @param Event
  141. * @retval None
  142. */
  143. void ES_Dispatch(es_event_t event)
  144. {
  145. uint8_t i;
  146. void (*pStateFunc1)(void);
  147. void (*pStateFunc2)(void);
  148. pStateFunc1 = NULL;
  149. pStateFunc2 = NULL;
  150. /* определяем следующее состояние */
  151. for (i=0; prb(stateTable[i].state); i++)
  152. {
  153. /* если совпадают текущее состояние и поступившее событие */
  154. if (prb(stateTable[i].state) == _State && prb(stateTable[i].event) == event)
  155. {
  156. /* меняем состояние если требуется */
  157. if (prb(stateTable[i].nextState) != stNoChange) {
  158. _State = prb(stateTable[i].nextState);
  159. }
  160. /* получаем адреса функций */
  161. pStateFunc1 = (void *)prw(stateTable[i].pStateFunc1);
  162. pStateFunc2 = (void *)prw(stateTable[i].pStateFunc2);
  163. break;
  164. }
  165. }
  166. if (pStateFunc1) pStateFunc1();
  167. if (pStateFunc2) pStateFunc2();
  168. }
  169. /**
  170. * @brief Return current state code.
  171. * @param None
  172. * @retval Event
  173. */
  174. es_state_t ES_GetState(void) {
  175. return _State;
  176. }
  177. /**
  178. * @brief Set current state to given code .
  179. * @param Event
  180. * @retval None
  181. */
  182. void ES_SetState(es_state_t new_state) {
  183. _State = new_state;
  184. }