/* Generated by itemis CREATE code generator. */ #include "../src/sc_types.h" #include "Statechart.h" #include "Statechart_required.h" /*! \file Implementation of the state machine 'Statechart' */ #ifndef SC_UNUSED #define SC_UNUSED(P) (void)(P) #endif /* prototypes of all internal functions */ static void enact_main_region_everything_r1_on_r1_responding(Statechart* handle); static void enact_main_region_everything_r1_on_r1_sensor_error(Statechart* handle); static void enact_main_region_everything_r1_on_r2_pressed(Statechart* handle); static void exact_main_region_everything_r1_on_r2_pressed(Statechart* handle); static void enseq_main_region_everything_default(Statechart* handle); static void enseq_main_region_everything_r1_off_default(Statechart* handle); static void enseq_main_region_everything_r1_on_default(Statechart* handle); static void enseq_main_region_everything_r1_on_r1_responding_default(Statechart* handle); static void enseq_main_region_everything_r1_on_r1_sensor_error_default(Statechart* handle); static void enseq_main_region_everything_r1_on_r2_not_pressed_default(Statechart* handle); static void enseq_main_region_everything_r1_on_r2_pressed_default(Statechart* handle); static void enseq_main_region_everything_pollButton_button0_default(Statechart* handle); static void enseq_main_region_everything_pollButton_button1_default(Statechart* handle); static void enseq_main_region_default(Statechart* handle); static void enseq_main_region_everything_r1_default(Statechart* handle); static void enseq_main_region_everything_r1_on_r1_default(Statechart* handle); static void enseq_main_region_everything_r1_on_r2_default(Statechart* handle); static void enseq_main_region_everything_pollButton_default(Statechart* handle); static void exseq_main_region_everything_r1_off(Statechart* handle); static void exseq_main_region_everything_r1_on(Statechart* handle); static void exseq_main_region_everything_r1_on_r1_responding(Statechart* handle); static void exseq_main_region_everything_r1_on_r1_sensor_error(Statechart* handle); static void exseq_main_region_everything_r1_on_r2_not_pressed(Statechart* handle); static void exseq_main_region_everything_r1_on_r2_pressed(Statechart* handle); static void exseq_main_region_everything_pollButton_button0(Statechart* handle); static void exseq_main_region_everything_pollButton_button1(Statechart* handle); static void exseq_main_region(Statechart* handle); static void exseq_main_region_everything_r1_on_r1(Statechart* handle); static void exseq_main_region_everything_r1_on_r2(Statechart* handle); static void react_main_region_everything_r1_on_r1__choice_0(Statechart* handle); static void react_main_region_everything_r1__entry_Default(Statechart* handle); static void react_main_region_everything_r1_on_r1__entry_Default(Statechart* handle); static void react_main_region_everything_r1_on_r2__entry_Default(Statechart* handle); static void react_main_region_everything_pollButton__entry_Default(Statechart* handle); static void react_main_region__entry_Default(Statechart* handle); /*! The reactions of state off. */ static sc_integer main_region_everything_r1_off_react(Statechart* handle, const sc_integer transitioned_before); /*! The reactions of state responding. */ static sc_integer main_region_everything_r1_on_r1_responding_react(Statechart* handle, const sc_integer transitioned_before); /*! The reactions of state sensor_error. */ static sc_integer main_region_everything_r1_on_r1_sensor_error_react(Statechart* handle, const sc_integer transitioned_before); /*! The reactions of state not_pressed. */ static sc_integer main_region_everything_r1_on_r2_not_pressed_react(Statechart* handle, const sc_integer transitioned_before); /*! The reactions of state pressed. */ static sc_integer main_region_everything_r1_on_r2_pressed_react(Statechart* handle, const sc_integer transitioned_before); /*! The reactions of state button0. */ static sc_integer main_region_everything_pollButton_button0_react(Statechart* handle, const sc_integer transitioned_before); /*! The reactions of state button1. */ static sc_integer main_region_everything_pollButton_button1_react(Statechart* handle, const sc_integer transitioned_before); static void clear_in_events(Statechart* handle); static void clear_internal_events(Statechart* handle); static void micro_step(Statechart* handle); /*! Performs a 'run to completion' step. */ static void run_cycle(Statechart* handle); static void statechart_internal_set_speed(Statechart* handle, int32_t value) ; static void statechart_internal_set_pid_vars(Statechart* handle, pid_vars_t value) ; static void statechart_eventqueue_init(statechart_eventqueue * eq, statechart_event *buffer, sc_integer capacity); static sc_integer statechart_eventqueue_size(statechart_eventqueue * eq); static void statechart_event_init(statechart_event * ev, StatechartEventID name); static statechart_event statechart_eventqueue_pop(statechart_eventqueue * eq); static sc_boolean statechart_eventqueue_push(statechart_eventqueue * eq, statechart_event ev); static void statechart_add_event_to_queue(statechart_eventqueue * eq, StatechartEventID name); static sc_boolean statechart_dispatch_event(Statechart* handle, const statechart_event * event); static statechart_event statechart_get_next_event(Statechart* handle); static sc_boolean statechart_dispatch_next_event(Statechart* handle); static StatechartEventID statechart_get_timed_event_name(Statechart* handle, sc_eventid evid); static void statechart_event_value_init(statechart_event * ev, StatechartEventID name, void * value); static void statechart_add_value_event_to_queue(statechart_eventqueue * eq, StatechartEventID name, void * value); void statechart_init(Statechart* handle) { sc_integer i; for (i = 0; i < STATECHART_MAX_ORTHOGONAL_STATES; ++i) { handle->stateConfVector[i] = Statechart_last_state; } clear_in_events(handle); clear_internal_events(handle); sc_observable_int32_t_init(&handle->iface.setMotorR); sc_observable_int32_t_init(&handle->iface.setMotorL); /* Default init sequence for statechart Statechart */ statechart_internal_set_speed(handle, 0); handle->isExecuting = bool_false; statechart_eventqueue_init(&handle->internal_event_queue, handle->internal_buffer, STATECHART_INTERNAL_EVENTQUEUE_BUFFERSIZE); statechart_eventqueue_init(&handle->in_event_queue, handle->in_buffer, STATECHART_IN_EVENTQUEUE_BUFFERSIZE); } void statechart_enter(Statechart* handle) { /* Activates the state machine. */ if (handle->isExecuting == bool_true) { return; } handle->isExecuting = bool_true; /* Default enter sequence for statechart Statechart */ enseq_main_region_default(handle); handle->isExecuting = bool_false; } void statechart_exit(Statechart* handle) { /* Deactivates the state machine. */ if (handle->isExecuting == bool_true) { return; } handle->isExecuting = bool_true; /* Default exit sequence for statechart Statechart */ exseq_main_region(handle); handle->stateConfVector[0] = Statechart_last_state; handle->stateConfVector[1] = Statechart_last_state; handle->stateConfVector[2] = Statechart_last_state; handle->stateConfVectorPosition = 2; handle->isExecuting = bool_false; } /*! Can be used by the client code to trigger a run to completion step without raising an event. */ void statechart_trigger_without_event(Statechart* handle) { run_cycle(handle); } sc_boolean statechart_is_active(const Statechart* handle) { sc_boolean result = bool_false; sc_integer i; for(i = 0; i < STATECHART_MAX_ORTHOGONAL_STATES; i++) { result = result || handle->stateConfVector[i] != Statechart_last_state; } return result; } /* * Always returns 'false' since this state machine can never become final. */ sc_boolean statechart_is_final(const Statechart* handle) { SC_UNUSED(handle); return bool_false; } void statechart_raise_time_event(Statechart* handle, sc_eventid evid) { if ( ((sc_intptr_t)evid) >= ((sc_intptr_t)&(handle->timeEvents)) && ((sc_intptr_t)evid) < ((sc_intptr_t)&(handle->timeEvents)) + (unsigned)sizeof(StatechartTimeEvents)) { statechart_add_event_to_queue(&(handle->in_event_queue), statechart_get_timed_event_name(handle, evid)); run_cycle(handle); } } sc_boolean statechart_is_state_active(const Statechart* handle, StatechartStates state) { sc_boolean result = bool_false; switch (state) { case Statechart_main_region_everything : result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_EVERYTHING] >= Statechart_main_region_everything && handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_EVERYTHING] <= Statechart_main_region_everything_pollButton_button1); break; case Statechart_main_region_everything_r1_off : result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_EVERYTHING_R1_OFF] == Statechart_main_region_everything_r1_off ); break; case Statechart_main_region_everything_r1_on : result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_EVERYTHING_R1_ON] >= Statechart_main_region_everything_r1_on && handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_EVERYTHING_R1_ON] <= Statechart_main_region_everything_r1_on_r2_pressed); break; case Statechart_main_region_everything_r1_on_r1_responding : result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_EVERYTHING_R1_ON_R1_RESPONDING] == Statechart_main_region_everything_r1_on_r1_responding ); break; case Statechart_main_region_everything_r1_on_r1_sensor_error : result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_EVERYTHING_R1_ON_R1_SENSOR_ERROR] == Statechart_main_region_everything_r1_on_r1_sensor_error ); break; case Statechart_main_region_everything_r1_on_r2_not_pressed : result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_EVERYTHING_R1_ON_R2_NOT_PRESSED] == Statechart_main_region_everything_r1_on_r2_not_pressed ); break; case Statechart_main_region_everything_r1_on_r2_pressed : result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_EVERYTHING_R1_ON_R2_PRESSED] == Statechart_main_region_everything_r1_on_r2_pressed ); break; case Statechart_main_region_everything_pollButton_button0 : result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_EVERYTHING_POLLBUTTON_BUTTON0] == Statechart_main_region_everything_pollButton_button0 ); break; case Statechart_main_region_everything_pollButton_button1 : result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_EVERYTHING_POLLBUTTON_BUTTON1] == Statechart_main_region_everything_pollButton_button1 ); break; default: result = bool_false; break; } return result; } static void clear_in_events(Statechart* handle) { handle->iface.sensor_raised = bool_false; handle->iface.buttonState_raised = bool_false; handle->timeEvents.statechart_main_region_everything_r1_on_r2_pressed_tev0_raised = bool_false; } static void clear_internal_events(Statechart* handle) { handle->internal.buttonPressed_raised = bool_false; handle->internal.buttonReleased_raised = bool_false; } static void micro_step(Statechart* handle) { sc_integer transitioned = -1; handle->stateConfVectorPosition = 0; switch(handle->stateConfVector[ 0 ]) { case Statechart_main_region_everything_r1_off : { transitioned = main_region_everything_r1_off_react(handle,transitioned); break; } case Statechart_main_region_everything_r1_on_r1_responding : { transitioned = main_region_everything_r1_on_r1_responding_react(handle,transitioned); break; } case Statechart_main_region_everything_r1_on_r1_sensor_error : { transitioned = main_region_everything_r1_on_r1_sensor_error_react(handle,transitioned); break; } default: /* do nothing */ break; } if ((handle->stateConfVectorPosition) < (1)) { switch(handle->stateConfVector[ 1 ]) { case Statechart_main_region_everything_r1_on_r2_not_pressed : { transitioned = main_region_everything_r1_on_r2_not_pressed_react(handle,transitioned); break; } case Statechart_main_region_everything_r1_on_r2_pressed : { transitioned = main_region_everything_r1_on_r2_pressed_react(handle,transitioned); break; } default: /* do nothing */ break; } } if ((handle->stateConfVectorPosition) < (2)) { switch(handle->stateConfVector[ 2 ]) { case Statechart_main_region_everything_pollButton_button0 : { main_region_everything_pollButton_button0_react(handle,transitioned); break; } case Statechart_main_region_everything_pollButton_button1 : { main_region_everything_pollButton_button1_react(handle,transitioned); break; } default: /* do nothing */ break; } } } static void run_cycle(Statechart* handle) { /* Performs a 'run to completion' step. */ if (handle->isExecuting == bool_true) { return; } handle->isExecuting = bool_true; statechart_dispatch_next_event(handle); do { micro_step(handle); clear_in_events(handle); clear_internal_events(handle); } while (statechart_dispatch_next_event(handle) == bool_true); handle->isExecuting = bool_false; } void statechart_raise_sensor(Statechart* handle, int32_t value) { statechart_add_value_event_to_queue(&(handle->in_event_queue), Statechart_sensor, &value); run_cycle(handle); } void statechart_raise_buttonState(Statechart* handle, sc_boolean value) { statechart_add_value_event_to_queue(&(handle->in_event_queue), Statechart_buttonState, &value); run_cycle(handle); } sc_observable_int32_t* statechart_get_setMotorR(Statechart* handle) { return &handle->iface.setMotorR; } sc_observable_int32_t* statechart_get_setMotorL(Statechart* handle) { return &handle->iface.setMotorL; } static void statechart_internal_set_speed(Statechart* handle, int32_t value) { handle->internal.speed = value; } static void statechart_internal_set_pid_vars(Statechart* handle, pid_vars_t value) { handle->internal.pid_vars = value; } /* implementations of all internal functions */ /* Entry action for state 'responding'. */ static void enact_main_region_everything_r1_on_r1_responding(Statechart* handle) { /* Entry action for state 'responding'. */ statechart_internal_set_speed(handle, statechart_pid(handle,handle->iface.sensor_value, handle->internal.pid_vars)); { int32_t iface_setMotorL_value = handle->internal.speed; sc_observable_int32_t_next(&handle->iface.setMotorL, iface_setMotorL_value); }; { int32_t iface_setMotorR_value = handle->internal.speed; sc_observable_int32_t_next(&handle->iface.setMotorR, iface_setMotorR_value); }; } /* Entry action for state 'sensor_error'. */ static void enact_main_region_everything_r1_on_r1_sensor_error(Statechart* handle) { /* Entry action for state 'sensor_error'. */ { int32_t iface_setMotorL_value = 1; sc_observable_int32_t_next(&handle->iface.setMotorL, iface_setMotorL_value); }; { int32_t iface_setMotorR_value = -(1); sc_observable_int32_t_next(&handle->iface.setMotorR, iface_setMotorR_value); }; } /* Entry action for state 'pressed'. */ static void enact_main_region_everything_r1_on_r2_pressed(Statechart* handle) { /* Entry action for state 'pressed'. */ statechart_set_timer(handle, (sc_eventid) &(handle->timeEvents.statechart_main_region_everything_r1_on_r2_pressed_tev0_raised) , (((sc_time) 2) * 1000), bool_false); } /* Exit action for state 'pressed'. */ static void exact_main_region_everything_r1_on_r2_pressed(Statechart* handle) { /* Exit action for state 'pressed'. */ statechart_unset_timer(handle, (sc_eventid) &(handle->timeEvents.statechart_main_region_everything_r1_on_r2_pressed_tev0_raised) ); } /* 'default' enter sequence for state everything */ static void enseq_main_region_everything_default(Statechart* handle) { /* 'default' enter sequence for state everything */ enseq_main_region_everything_r1_default(handle); enseq_main_region_everything_pollButton_default(handle); } /* 'default' enter sequence for state off */ static void enseq_main_region_everything_r1_off_default(Statechart* handle) { /* 'default' enter sequence for state off */ handle->stateConfVector[0] = Statechart_main_region_everything_r1_off; handle->stateConfVectorPosition = 0; } /* 'default' enter sequence for state on */ static void enseq_main_region_everything_r1_on_default(Statechart* handle) { /* 'default' enter sequence for state on */ enseq_main_region_everything_r1_on_r1_default(handle); enseq_main_region_everything_r1_on_r2_default(handle); } /* 'default' enter sequence for state responding */ static void enseq_main_region_everything_r1_on_r1_responding_default(Statechart* handle) { /* 'default' enter sequence for state responding */ enact_main_region_everything_r1_on_r1_responding(handle); handle->stateConfVector[0] = Statechart_main_region_everything_r1_on_r1_responding; handle->stateConfVectorPosition = 0; } /* 'default' enter sequence for state sensor_error */ static void enseq_main_region_everything_r1_on_r1_sensor_error_default(Statechart* handle) { /* 'default' enter sequence for state sensor_error */ enact_main_region_everything_r1_on_r1_sensor_error(handle); handle->stateConfVector[0] = Statechart_main_region_everything_r1_on_r1_sensor_error; handle->stateConfVectorPosition = 0; } /* 'default' enter sequence for state not_pressed */ static void enseq_main_region_everything_r1_on_r2_not_pressed_default(Statechart* handle) { /* 'default' enter sequence for state not_pressed */ handle->stateConfVector[1] = Statechart_main_region_everything_r1_on_r2_not_pressed; handle->stateConfVectorPosition = 1; } /* 'default' enter sequence for state pressed */ static void enseq_main_region_everything_r1_on_r2_pressed_default(Statechart* handle) { /* 'default' enter sequence for state pressed */ enact_main_region_everything_r1_on_r2_pressed(handle); handle->stateConfVector[1] = Statechart_main_region_everything_r1_on_r2_pressed; handle->stateConfVectorPosition = 1; } /* 'default' enter sequence for state button0 */ static void enseq_main_region_everything_pollButton_button0_default(Statechart* handle) { /* 'default' enter sequence for state button0 */ handle->stateConfVector[2] = Statechart_main_region_everything_pollButton_button0; handle->stateConfVectorPosition = 2; } /* 'default' enter sequence for state button1 */ static void enseq_main_region_everything_pollButton_button1_default(Statechart* handle) { /* 'default' enter sequence for state button1 */ handle->stateConfVector[2] = Statechart_main_region_everything_pollButton_button1; handle->stateConfVectorPosition = 2; } /* 'default' enter sequence for region main region */ static void enseq_main_region_default(Statechart* handle) { /* 'default' enter sequence for region main region */ react_main_region__entry_Default(handle); } /* 'default' enter sequence for region r1 */ static void enseq_main_region_everything_r1_default(Statechart* handle) { /* 'default' enter sequence for region r1 */ react_main_region_everything_r1__entry_Default(handle); } /* 'default' enter sequence for region r1 */ static void enseq_main_region_everything_r1_on_r1_default(Statechart* handle) { /* 'default' enter sequence for region r1 */ react_main_region_everything_r1_on_r1__entry_Default(handle); } /* 'default' enter sequence for region r2 */ static void enseq_main_region_everything_r1_on_r2_default(Statechart* handle) { /* 'default' enter sequence for region r2 */ react_main_region_everything_r1_on_r2__entry_Default(handle); } /* 'default' enter sequence for region pollButton */ static void enseq_main_region_everything_pollButton_default(Statechart* handle) { /* 'default' enter sequence for region pollButton */ react_main_region_everything_pollButton__entry_Default(handle); } /* Default exit sequence for state off */ static void exseq_main_region_everything_r1_off(Statechart* handle) { /* Default exit sequence for state off */ handle->stateConfVector[0] = Statechart_main_region_everything; handle->stateConfVectorPosition = 0; } /* Default exit sequence for state on */ static void exseq_main_region_everything_r1_on(Statechart* handle) { /* Default exit sequence for state on */ exseq_main_region_everything_r1_on_r1(handle); exseq_main_region_everything_r1_on_r2(handle); handle->stateConfVector[0] = Statechart_main_region_everything; handle->stateConfVector[1] = Statechart_main_region_everything; handle->stateConfVectorPosition = 1; } /* Default exit sequence for state responding */ static void exseq_main_region_everything_r1_on_r1_responding(Statechart* handle) { /* Default exit sequence for state responding */ handle->stateConfVector[0] = Statechart_main_region_everything_r1_on; handle->stateConfVectorPosition = 0; } /* Default exit sequence for state sensor_error */ static void exseq_main_region_everything_r1_on_r1_sensor_error(Statechart* handle) { /* Default exit sequence for state sensor_error */ handle->stateConfVector[0] = Statechart_main_region_everything_r1_on; handle->stateConfVectorPosition = 0; } /* Default exit sequence for state not_pressed */ static void exseq_main_region_everything_r1_on_r2_not_pressed(Statechart* handle) { /* Default exit sequence for state not_pressed */ handle->stateConfVector[1] = Statechart_main_region_everything_r1_on; handle->stateConfVectorPosition = 1; } /* Default exit sequence for state pressed */ static void exseq_main_region_everything_r1_on_r2_pressed(Statechart* handle) { /* Default exit sequence for state pressed */ handle->stateConfVector[1] = Statechart_main_region_everything_r1_on; handle->stateConfVectorPosition = 1; exact_main_region_everything_r1_on_r2_pressed(handle); } /* Default exit sequence for state button0 */ static void exseq_main_region_everything_pollButton_button0(Statechart* handle) { /* Default exit sequence for state button0 */ handle->stateConfVector[2] = Statechart_main_region_everything; handle->stateConfVectorPosition = 2; } /* Default exit sequence for state button1 */ static void exseq_main_region_everything_pollButton_button1(Statechart* handle) { /* Default exit sequence for state button1 */ handle->stateConfVector[2] = Statechart_main_region_everything; handle->stateConfVectorPosition = 2; } /* Default exit sequence for region main region */ static void exseq_main_region(Statechart* handle) { /* Default exit sequence for region main region */ /* Handle exit of all possible states (of Statechart.main_region) at position 0... */ switch(handle->stateConfVector[ 0 ]) { case Statechart_main_region_everything_r1_off : { exseq_main_region_everything_r1_off(handle); break; } case Statechart_main_region_everything_r1_on_r1_responding : { exseq_main_region_everything_r1_on_r1_responding(handle); break; } case Statechart_main_region_everything_r1_on_r1_sensor_error : { exseq_main_region_everything_r1_on_r1_sensor_error(handle); break; } default: /* do nothing */ break; } /* Handle exit of all possible states (of Statechart.main_region) at position 1... */ switch(handle->stateConfVector[ 1 ]) { case Statechart_main_region_everything_r1_on_r2_not_pressed : { exseq_main_region_everything_r1_on_r2_not_pressed(handle); break; } case Statechart_main_region_everything_r1_on_r2_pressed : { exseq_main_region_everything_r1_on_r2_pressed(handle); break; } default: /* do nothing */ break; } /* Handle exit of all possible states (of Statechart.main_region) at position 2... */ switch(handle->stateConfVector[ 2 ]) { case Statechart_main_region_everything_pollButton_button0 : { exseq_main_region_everything_pollButton_button0(handle); break; } case Statechart_main_region_everything_pollButton_button1 : { exseq_main_region_everything_pollButton_button1(handle); break; } default: /* do nothing */ break; } } /* Default exit sequence for region r1 */ static void exseq_main_region_everything_r1_on_r1(Statechart* handle) { /* Default exit sequence for region r1 */ /* Handle exit of all possible states (of Statechart.main_region.everything.r1.on.r1) at position 0... */ switch(handle->stateConfVector[ 0 ]) { case Statechart_main_region_everything_r1_on_r1_responding : { exseq_main_region_everything_r1_on_r1_responding(handle); break; } case Statechart_main_region_everything_r1_on_r1_sensor_error : { exseq_main_region_everything_r1_on_r1_sensor_error(handle); break; } default: /* do nothing */ break; } } /* Default exit sequence for region r2 */ static void exseq_main_region_everything_r1_on_r2(Statechart* handle) { /* Default exit sequence for region r2 */ /* Handle exit of all possible states (of Statechart.main_region.everything.r1.on.r2) at position 1... */ switch(handle->stateConfVector[ 1 ]) { case Statechart_main_region_everything_r1_on_r2_not_pressed : { exseq_main_region_everything_r1_on_r2_not_pressed(handle); break; } case Statechart_main_region_everything_r1_on_r2_pressed : { exseq_main_region_everything_r1_on_r2_pressed(handle); break; } default: /* do nothing */ break; } } /* The reactions of state null. */ static void react_main_region_everything_r1_on_r1__choice_0(Statechart* handle) { /* The reactions of state null. */ if ((handle->iface.sensor_value) < (0)) { enseq_main_region_everything_r1_on_r1_sensor_error_default(handle); } else { enseq_main_region_everything_r1_on_r1_responding_default(handle); } } /* Default react sequence for initial entry */ static void react_main_region_everything_r1__entry_Default(Statechart* handle) { /* Default react sequence for initial entry */ enseq_main_region_everything_r1_off_default(handle); } /* Default react sequence for initial entry */ static void react_main_region_everything_r1_on_r1__entry_Default(Statechart* handle) { /* Default react sequence for initial entry */ enseq_main_region_everything_r1_on_r1_responding_default(handle); } /* Default react sequence for initial entry */ static void react_main_region_everything_r1_on_r2__entry_Default(Statechart* handle) { /* Default react sequence for initial entry */ enseq_main_region_everything_r1_on_r2_not_pressed_default(handle); } /* Default react sequence for initial entry */ static void react_main_region_everything_pollButton__entry_Default(Statechart* handle) { /* Default react sequence for initial entry */ enseq_main_region_everything_pollButton_button0_default(handle); } /* Default react sequence for initial entry */ static void react_main_region__entry_Default(Statechart* handle) { /* Default react sequence for initial entry */ enseq_main_region_everything_default(handle); } static sc_integer main_region_everything_r1_off_react(Statechart* handle, const sc_integer transitioned_before) { /* The reactions of state off. */ sc_integer transitioned_after = transitioned_before; if ((transitioned_after) < (0)) { if (handle->internal.buttonPressed_raised == bool_true) { exseq_main_region_everything_r1_off(handle); enseq_main_region_everything_r1_on_default(handle); transitioned_after = 0; } } return transitioned_after; } static sc_integer main_region_everything_r1_on_r1_responding_react(Statechart* handle, const sc_integer transitioned_before) { /* The reactions of state responding. */ sc_integer transitioned_after = transitioned_before; if ((transitioned_after) < (0)) { if (handle->iface.sensor_raised == bool_true) { exseq_main_region_everything_r1_on_r1_responding(handle); react_main_region_everything_r1_on_r1__choice_0(handle); transitioned_after = 0; } } return transitioned_after; } static sc_integer main_region_everything_r1_on_r1_sensor_error_react(Statechart* handle, const sc_integer transitioned_before) { /* The reactions of state sensor_error. */ sc_integer transitioned_after = transitioned_before; if ((transitioned_after) < (0)) { if (handle->iface.sensor_raised == bool_true) { exseq_main_region_everything_r1_on_r1_sensor_error(handle); react_main_region_everything_r1_on_r1__choice_0(handle); transitioned_after = 0; } } return transitioned_after; } static sc_integer main_region_everything_r1_on_r2_not_pressed_react(Statechart* handle, const sc_integer transitioned_before) { /* The reactions of state not_pressed. */ sc_integer transitioned_after = transitioned_before; if ((transitioned_after) < (1)) { if (handle->internal.buttonPressed_raised == bool_true) { exseq_main_region_everything_r1_on_r2_not_pressed(handle); enseq_main_region_everything_r1_on_r2_pressed_default(handle); transitioned_after = 1; } } /* If no transition was taken */ if ((transitioned_after) == (transitioned_before)) { /* then execute local reactions. */ transitioned_after = transitioned_before; } return transitioned_after; } static sc_integer main_region_everything_r1_on_r2_pressed_react(Statechart* handle, const sc_integer transitioned_before) { /* The reactions of state pressed. */ sc_integer transitioned_after = transitioned_before; if ((transitioned_after) < (1)) { if (handle->timeEvents.statechart_main_region_everything_r1_on_r2_pressed_tev0_raised == bool_true) { exseq_main_region_everything_r1_on(handle); handle->timeEvents.statechart_main_region_everything_r1_on_r2_pressed_tev0_raised = bool_false; enseq_main_region_everything_r1_off_default(handle); transitioned_after = 1; } else { if (handle->internal.buttonReleased_raised == bool_true) { exseq_main_region_everything_r1_on_r2_pressed(handle); enseq_main_region_everything_r1_on_r2_not_pressed_default(handle); transitioned_after = 1; } } } /* If no transition was taken */ if ((transitioned_after) == (transitioned_before)) { /* then execute local reactions. */ transitioned_after = transitioned_before; } return transitioned_after; } static sc_integer main_region_everything_pollButton_button0_react(Statechart* handle, const sc_integer transitioned_before) { /* The reactions of state button0. */ sc_integer transitioned_after = transitioned_before; if ((transitioned_after) < (2)) { if (((handle->iface.buttonState_raised) == bool_true) && ((handle->iface.buttonState_value) == bool_true)) { exseq_main_region_everything_pollButton_button0(handle); statechart_add_event_to_queue(&(handle->internal_event_queue), Statechart_internal_buttonPressed); enseq_main_region_everything_pollButton_button1_default(handle); transitioned_after = 2; } } /* If no transition was taken */ if ((transitioned_after) == (transitioned_before)) { /* then execute local reactions. */ transitioned_after = transitioned_before; } return transitioned_after; } static sc_integer main_region_everything_pollButton_button1_react(Statechart* handle, const sc_integer transitioned_before) { /* The reactions of state button1. */ sc_integer transitioned_after = transitioned_before; if ((transitioned_after) < (2)) { if (((handle->iface.buttonState_raised) == bool_true) && ((!(handle->iface.buttonState_value)) == bool_true)) { exseq_main_region_everything_pollButton_button1(handle); statechart_add_event_to_queue(&(handle->internal_event_queue), Statechart_internal_buttonReleased); enseq_main_region_everything_pollButton_button0_default(handle); transitioned_after = 2; } } /* If no transition was taken */ if ((transitioned_after) == (transitioned_before)) { /* then execute local reactions. */ transitioned_after = transitioned_before; } return transitioned_after; } static void statechart_eventqueue_init(statechart_eventqueue * eq, statechart_event *buffer, sc_integer capacity) { eq->events = buffer; eq->capacity = capacity; eq->push_index = 0; eq->pop_index = 0; eq->size = 0; } static sc_integer statechart_eventqueue_size(statechart_eventqueue * eq) { return eq->size; } static statechart_event statechart_eventqueue_pop(statechart_eventqueue * eq) { statechart_event event; if(statechart_eventqueue_size(eq) <= 0) { statechart_event_init(&event, Statechart_invalid_event); } else { event = eq->events[eq->pop_index]; if(eq->pop_index < eq->capacity - 1) { eq->pop_index++; } else { eq->pop_index = 0; } eq->size--; } return event; } static sc_boolean statechart_eventqueue_push(statechart_eventqueue * eq, statechart_event ev) { if(statechart_eventqueue_size(eq) == eq->capacity) { return bool_false; } else { eq->events[eq->push_index] = ev; if(eq->push_index < eq->capacity - 1) { eq->push_index++; } else { eq->push_index = 0; } eq->size++; return bool_true; } } static void statechart_event_init(statechart_event * ev, StatechartEventID name) { ev->name = name; ev->has_value = bool_false; } static void statechart_add_event_to_queue(statechart_eventqueue * eq, StatechartEventID name) { statechart_event event; statechart_event_init(&event, name); statechart_eventqueue_push(eq, event); } static sc_boolean statechart_dispatch_event(Statechart* handle, const statechart_event * event) { switch(event->name) { case Statechart_sensor: { handle->iface.sensor_raised = bool_true; handle->iface.sensor_value = event->value.Statechart_sensor_value; return bool_true; } case Statechart_buttonState: { handle->iface.buttonState_raised = bool_true; handle->iface.buttonState_value = event->value.Statechart_buttonState_value; return bool_true; } case Statechart_internal_buttonPressed: { handle->internal.buttonPressed_raised = bool_true; return bool_true; } case Statechart_internal_buttonReleased: { handle->internal.buttonReleased_raised = bool_true; return bool_true; } case Statechart_Statechart_main_region_everything_r1_on_r2_pressed_time_event_0: { handle->timeEvents.statechart_main_region_everything_r1_on_r2_pressed_tev0_raised = bool_true; return bool_true; } default: return bool_false; } } static statechart_event statechart_get_next_event(Statechart* handle) { statechart_event next_event; statechart_event_init(&next_event, Statechart_invalid_event); if(statechart_eventqueue_size(&(handle->internal_event_queue)) > 0) { next_event = statechart_eventqueue_pop(&(handle->internal_event_queue)); } else if(statechart_eventqueue_size(&(handle->in_event_queue)) > 0) { next_event = statechart_eventqueue_pop(&(handle->in_event_queue)); } return next_event; } static sc_boolean statechart_dispatch_next_event(Statechart* handle) { statechart_event nextEvent; nextEvent = statechart_get_next_event(handle); return statechart_dispatch_event(handle, &nextEvent); } static StatechartEventID statechart_get_timed_event_name(Statechart* handle, sc_eventid evid) { if(evid == &handle->timeEvents.statechart_main_region_everything_r1_on_r2_pressed_tev0_raised) { return Statechart_Statechart_main_region_everything_r1_on_r2_pressed_time_event_0; } return Statechart_invalid_event; } static void statechart_event_value_init(statechart_event * ev, StatechartEventID name, void * value) { ev->name = name; ev->has_value = bool_true; switch(name) { case Statechart_sensor: ev->value.Statechart_sensor_value = *((int32_t*)value); break; case Statechart_buttonState: ev->value.Statechart_buttonState_value = *((sc_boolean*)value); break; default: /* do nothing */ break; } } static void statechart_add_value_event_to_queue(statechart_eventqueue * eq, StatechartEventID name, void * value) { statechart_event event; statechart_event_value_init(&event, name, value); statechart_eventqueue_push(eq, event); }