event-system.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. //***************************************************************************
  2. //
  3. // Author(s)...: Pashgan http://ChipEnable.Ru
  4. // Target(s)...: любой микроконтроллер mega
  5. // Compiler....: IAR 5.11A
  6. // Description.: Заготовка для событийной системы на таблицах
  7. // Data........: 30.09.12
  8. //
  9. //***************************************************************************
  10. #include "event-system.h"
  11. //функция-заглушка
  12. static void EmptyFunc(void);
  13. //кольцевой буфер
  14. static volatile es_event_t cycleBuf[SIZE_BUF];
  15. static volatile uint8_t tailBuf = 0;
  16. static volatile uint8_t headBuf = 0;
  17. static volatile uint8_t countBuf = 0;
  18. static volatile es_state_t _State;
  19. typedef struct {
  20. es_state_t startState;
  21. es_state_t endState;
  22. es_event_t startEvent;
  23. es_event_t endEvent;
  24. es_state_t nextstate;
  25. void (*pStateFunc1)(void);
  26. void (*pStateFunc2)(void);
  27. } table_state_t;
  28. /** таблица состояний */
  29. const table_state_t table[] = {
  30. /* STATE from STATE to EVENT from EVENT to NEXT STATE STATE_FUNC1 STATE_FUNC2 */
  31. /* обязательная пустая строка таблицы */
  32. {stNoChange, stNoChange, eventNull, eventNull, stNoChange, EmptyFunc, EmptyFunc}
  33. };
  34. /**
  35. * @brief Take event.
  36. * @param None
  37. * @retval Event
  38. */
  39. es_event_t ES_GetEvent(void)
  40. {
  41. es_event_t event;
  42. if (countBuf > 0){
  43. event = cycleBuf[headBuf];
  44. countBuf--;
  45. headBuf = (headBuf + 1) & (SIZE_BUF - 1);
  46. return event;
  47. }
  48. return eventNull;
  49. }
  50. /**
  51. * @brief Place event.
  52. * @param Event
  53. * @retval None
  54. */
  55. void ES_PlaceEvent(es_event_t event)
  56. {
  57. if (countBuf < SIZE_BUF){
  58. cycleBuf[tailBuf] = event;
  59. tailBuf = (tailBuf + 1) & (SIZE_BUF - 1);
  60. countBuf++;
  61. /* сигнализация переполнения буфера событий */
  62. } else {
  63. while(1);
  64. }
  65. }
  66. /**
  67. * @brief Initialize event system.
  68. * @param Start Event
  69. * @retval None
  70. */
  71. void ES_Init(es_state_t init_state)
  72. {
  73. tailBuf = 0;
  74. headBuf = 0;
  75. countBuf = 0;
  76. _State = init_state;
  77. }
  78. /**
  79. * @brief Fake function.
  80. * @param None
  81. * @retval None
  82. */
  83. static void EmptyFunc(void)
  84. {
  85. }
  86. /**
  87. * @brief Dispatcher of event system.
  88. * @param Event
  89. * @retval None
  90. */
  91. void ES_Dispatch(es_event_t event)
  92. {
  93. void (*pStateFunc1)(void);
  94. void (*pStateFunc2)(void);
  95. uint8_t i;
  96. pStateFunc1 = NULL;
  97. pStateFunc2 = NULL;
  98. //определяем следующее состояние
  99. for (i=0; table[i].startEvent || table[i].endEvent; i++)
  100. {
  101. //если текущее состояние попадает в диапазон
  102. if ((_State >= table[i].startState)&&(_State <= table[i].endState)){
  103. //если поступившее событие попадает в диапазон
  104. if((event >= table[i].startEvent) && (event <= table[i].endEvent)){
  105. //меняем состояние если требуется
  106. if (table[i].nextstate != stNoChange)
  107. _State = table[i].nextstate;
  108. pStateFunc1 = table[i].pStateFunc1;
  109. pStateFunc2 = table[i].pStateFunc2;
  110. break;
  111. }
  112. }
  113. }
  114. if (pStateFunc1) pStateFunc1();
  115. if (pStateFunc2) pStateFunc2();
  116. }
  117. /**
  118. * @brief Return current state code.
  119. * @param None
  120. * @retval Event
  121. */
  122. es_state_t ES_GetState(void) {
  123. return _State;
  124. }
  125. /**
  126. * @brief Set current state to given code .
  127. * @param Event
  128. * @retval None
  129. */
  130. void ES_SetState(es_state_t new_state) {
  131. _State = new_state;
  132. }