TimeTrigger.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "sc_types.h"
  4. #include "TimeTrigger.h"
  5. #include "TimeTriggerRequired.h"
  6. /*! \file Implementation of the state machine 'TimeTrigger'
  7. */
  8. // prototypes of all internal functions
  9. static void timeTrigger_entryaction(TimeTrigger* handle);
  10. static void timeTrigger_exitaction(TimeTrigger* handle);
  11. static void timeTrigger_react_mainRegion_StateA(TimeTrigger* handle);
  12. static void timeTrigger_react_mainRegion_StateB(TimeTrigger* handle);
  13. static void clearInEvents(TimeTrigger* handle);
  14. static void clearOutEvents(TimeTrigger* handle);
  15. void timeTrigger_init(TimeTrigger* handle)
  16. {
  17. int i;
  18. for (i = 0; i < TIMETRIGGER_MAX_ORTHOGONAL_STATES; ++i)
  19. handle->stateConfVector[i] = TimeTrigger_last_state;
  20. handle->stateConfVectorPosition = 0;
  21. // TODO: initialize all events ...
  22. // TODO: initialize all variables ... (set default values - here or inenter sequence ?!?)
  23. }
  24. void timeTrigger_enter(TimeTrigger* handle)
  25. {
  26. /* Default enter sequence for statechart TimeTrigger */
  27. timeTrigger_entryaction(handle);
  28. /* Default enter sequence for region mainRegion */
  29. /* Default react sequence for initial entry */
  30. /* Default enter sequence for state StateA */
  31. /* Entry action for state 'StateA'. */
  32. timeTrigger_setTimer( (sc_eventid) &(handle->timeEvents.StateA_time_event_0_raised) , 100, bool_false);
  33. handle->iface.value = 0;
  34. handle->stateConfVector[0] = TimeTrigger_mainRegion_StateA;
  35. handle->stateConfVectorPosition = 0;
  36. }
  37. void timeTrigger_exit(TimeTrigger* handle)
  38. {
  39. /* Default exit sequence for statechart TimeTrigger */
  40. /* Default exit sequence for region mainRegion */
  41. /* Handle exit of all possible states (of mainRegion) at position 0... */
  42. switch(handle->stateConfVector[ 0 ]) {
  43. case TimeTrigger_mainRegion_StateA : {
  44. /* Default exit sequence for state StateA */
  45. handle->stateConfVector[0] = TimeTrigger_last_state;
  46. handle->stateConfVectorPosition = 0;
  47. /* Exit action for state 'StateA'. */
  48. timeTrigger_unsetTimer( (sc_eventid) &(handle->timeEvents.StateA_time_event_0_raised) );
  49. break;
  50. }
  51. case TimeTrigger_mainRegion_StateB : {
  52. /* Default exit sequence for state StateB */
  53. handle->stateConfVector[0] = TimeTrigger_last_state;
  54. handle->stateConfVectorPosition = 0;
  55. /* Exit action for state 'StateB'. */
  56. timeTrigger_unsetTimer( (sc_eventid) &(handle->timeEvents.StateB_time_event_0_raised) );
  57. break;
  58. }
  59. default: break;
  60. }
  61. timeTrigger_exitaction(handle);
  62. }
  63. static void clearInEvents(TimeTrigger* handle) {
  64. }
  65. static void clearOutEvents(TimeTrigger* handle) {
  66. }
  67. void timeTrigger_runCycle(TimeTrigger* handle) {
  68. clearOutEvents(handle);
  69. for (handle->stateConfVectorPosition = 0;
  70. handle->stateConfVectorPosition < TIMETRIGGER_MAX_ORTHOGONAL_STATES;
  71. handle->stateConfVectorPosition++) {
  72. switch (handle->stateConfVector[handle->stateConfVectorPosition]) {
  73. case TimeTrigger_mainRegion_StateA : {
  74. timeTrigger_react_mainRegion_StateA(handle);
  75. break;
  76. }
  77. case TimeTrigger_mainRegion_StateB : {
  78. timeTrigger_react_mainRegion_StateB(handle);
  79. break;
  80. }
  81. default:
  82. break;
  83. }
  84. }
  85. clearInEvents(handle);
  86. }
  87. void timeTrigger_raiseTimeEvent(TimeTrigger* handle, sc_eventid evid) {
  88. if ( ((intptr_t)evid) >= ((intptr_t)&(handle->timeEvents))
  89. && ((intptr_t)evid) < ((intptr_t)&(handle->timeEvents)) + sizeof(TimeTriggerTimeEvents)) {
  90. *(sc_boolean*)evid = bool_true;
  91. }
  92. }
  93. sc_boolean timeTrigger_isActive(TimeTrigger* handle, TimeTriggerStates state) {
  94. switch (state) {
  95. case TimeTrigger_mainRegion_StateA :
  96. return (sc_boolean) (handle->stateConfVector[0] == TimeTrigger_mainRegion_StateA
  97. );
  98. case TimeTrigger_mainRegion_StateB :
  99. return (sc_boolean) (handle->stateConfVector[0] == TimeTrigger_mainRegion_StateB
  100. );
  101. default: return bool_false;
  102. }
  103. }
  104. sc_integer timeTriggerIface_get_value(TimeTrigger* handle) {
  105. return handle->iface.value;
  106. }
  107. void timeTriggerIface_set_value(TimeTrigger* handle, sc_integer value) {
  108. handle->iface.value = value;
  109. }
  110. // implementations of all internal functions
  111. /* Entry action for statechart 'TimeTrigger'. */
  112. static void timeTrigger_entryaction(TimeTrigger* handle) {
  113. /* Entry action for statechart 'TimeTrigger'. */
  114. }
  115. /* Exit action for state 'TimeTrigger'. */
  116. static void timeTrigger_exitaction(TimeTrigger* handle) {
  117. /* Exit action for state 'TimeTrigger'. */
  118. }
  119. /* The reactions of state StateA. */
  120. static void timeTrigger_react_mainRegion_StateA(TimeTrigger* handle) {
  121. /* The reactions of state StateA. */
  122. if (handle->timeEvents.StateA_time_event_0_raised) {
  123. /* Default exit sequence for state StateA */
  124. handle->stateConfVector[0] = TimeTrigger_last_state;
  125. handle->stateConfVectorPosition = 0;
  126. /* Exit action for state 'StateA'. */
  127. timeTrigger_unsetTimer( (sc_eventid) &(handle->timeEvents.StateA_time_event_0_raised) );
  128. /* Default enter sequence for state StateB */
  129. /* Entry action for state 'StateB'. */
  130. timeTrigger_setTimer( (sc_eventid) &(handle->timeEvents.StateB_time_event_0_raised) , 20, bool_true);
  131. handle->stateConfVector[0] = TimeTrigger_mainRegion_StateB;
  132. handle->stateConfVectorPosition = 0;
  133. }
  134. }
  135. /* The reactions of state StateB. */
  136. static void timeTrigger_react_mainRegion_StateB(TimeTrigger* handle) {
  137. /* The reactions of state StateB. */
  138. if (handle->iface.value == 10) {
  139. /* Default exit sequence for state StateB */
  140. handle->stateConfVector[0] = TimeTrigger_last_state;
  141. handle->stateConfVectorPosition = 0;
  142. /* Exit action for state 'StateB'. */
  143. timeTrigger_unsetTimer( (sc_eventid) &(handle->timeEvents.StateB_time_event_0_raised) );
  144. /* Default enter sequence for state StateA */
  145. /* Entry action for state 'StateA'. */
  146. timeTrigger_setTimer( (sc_eventid) &(handle->timeEvents.StateA_time_event_0_raised) , 100, bool_false);
  147. handle->iface.value = 0;
  148. handle->stateConfVector[0] = TimeTrigger_mainRegion_StateA;
  149. handle->stateConfVectorPosition = 0;
  150. } else {
  151. if (handle->timeEvents.StateB_time_event_0_raised) {
  152. handle->iface.value += 1;
  153. }
  154. }
  155. }