initial solution
This commit is contained in:
commit
37d1d83b47
19 changed files with 2775 additions and 0 deletions
874
robot_cdt/src-gen/Statechart.c
Normal file
874
robot_cdt/src-gen/Statechart.c
Normal file
|
|
@ -0,0 +1,874 @@
|
|||
/* 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_on_r1_responding(Statechart* handle);
|
||||
static void enact_main_region_on_r1_sensor_error(Statechart* handle);
|
||||
static void enact_main_region_on_r2_pressed(Statechart* handle);
|
||||
static void exact_main_region_on_r2_pressed(Statechart* handle);
|
||||
static void enseq_main_region_on_default(Statechart* handle);
|
||||
static void enseq_main_region_on_r1_responding_default(Statechart* handle);
|
||||
static void enseq_main_region_on_r1_sensor_error_default(Statechart* handle);
|
||||
static void enseq_main_region_on_r2_not_pressed_default(Statechart* handle);
|
||||
static void enseq_main_region_on_r2_pressed_default(Statechart* handle);
|
||||
static void enseq_main_region_off_default(Statechart* handle);
|
||||
static void enseq_main_region_default(Statechart* handle);
|
||||
static void enseq_main_region_on_r1_default(Statechart* handle);
|
||||
static void enseq_main_region_on_r2_default(Statechart* handle);
|
||||
static void exseq_main_region_on(Statechart* handle);
|
||||
static void exseq_main_region_on_r1_responding(Statechart* handle);
|
||||
static void exseq_main_region_on_r1_sensor_error(Statechart* handle);
|
||||
static void exseq_main_region_on_r2_not_pressed(Statechart* handle);
|
||||
static void exseq_main_region_on_r2_pressed(Statechart* handle);
|
||||
static void exseq_main_region_off(Statechart* handle);
|
||||
static void exseq_main_region(Statechart* handle);
|
||||
static void exseq_main_region_on_r1(Statechart* handle);
|
||||
static void exseq_main_region_on_r2(Statechart* handle);
|
||||
static void react_main_region_on_r1__choice_0(Statechart* handle);
|
||||
static void react_main_region_on_r1__entry_Default(Statechart* handle);
|
||||
static void react_main_region_on_r2__entry_Default(Statechart* handle);
|
||||
static void react_main_region__entry_Default(Statechart* handle);
|
||||
|
||||
/*! The reactions of state responding. */
|
||||
static sc_integer main_region_on_r1_responding_react(Statechart* handle, const sc_integer transitioned_before);
|
||||
|
||||
/*! The reactions of state sensor_error. */
|
||||
static sc_integer main_region_on_r1_sensor_error_react(Statechart* handle, const sc_integer transitioned_before);
|
||||
|
||||
/*! The reactions of state not_pressed. */
|
||||
static sc_integer main_region_on_r2_not_pressed_react(Statechart* handle, const sc_integer transitioned_before);
|
||||
|
||||
/*! The reactions of state pressed. */
|
||||
static sc_integer main_region_on_r2_pressed_react(Statechart* handle, const sc_integer transitioned_before);
|
||||
|
||||
/*! The reactions of state off. */
|
||||
static sc_integer main_region_off_react(Statechart* handle, const sc_integer transitioned_before);
|
||||
|
||||
|
||||
static void clear_in_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, sc_real 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);
|
||||
|
||||
sc_observable_sc_real_init(&handle->iface.setMotorR);
|
||||
sc_observable_sc_real_init(&handle->iface.setMotorL);
|
||||
|
||||
/* Default init sequence for statechart Statechart */
|
||||
statechart_internal_set_speed(handle, 0.0);
|
||||
|
||||
handle->isExecuting = bool_false;
|
||||
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->stateConfVectorPosition = 1;
|
||||
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_on :
|
||||
result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_ON] >= Statechart_main_region_on
|
||||
&& handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_ON] <= Statechart_main_region_on_r2_pressed);
|
||||
break;
|
||||
case Statechart_main_region_on_r1_responding :
|
||||
result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_ON_R1_RESPONDING] == Statechart_main_region_on_r1_responding
|
||||
);
|
||||
break;
|
||||
case Statechart_main_region_on_r1_sensor_error :
|
||||
result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_ON_R1_SENSOR_ERROR] == Statechart_main_region_on_r1_sensor_error
|
||||
);
|
||||
break;
|
||||
case Statechart_main_region_on_r2_not_pressed :
|
||||
result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_ON_R2_NOT_PRESSED] == Statechart_main_region_on_r2_not_pressed
|
||||
);
|
||||
break;
|
||||
case Statechart_main_region_on_r2_pressed :
|
||||
result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_ON_R2_PRESSED] == Statechart_main_region_on_r2_pressed
|
||||
);
|
||||
break;
|
||||
case Statechart_main_region_off :
|
||||
result = (sc_boolean) (handle->stateConfVector[SCVI_STATECHART_MAIN_REGION_OFF] == Statechart_main_region_off
|
||||
);
|
||||
break;
|
||||
default:
|
||||
result = bool_false;
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static void clear_in_events(Statechart* handle)
|
||||
{
|
||||
handle->iface.sensor_raised = bool_false;
|
||||
handle->iface.buttonPressed_raised = bool_false;
|
||||
handle->iface.buttonReleased_raised = bool_false;
|
||||
handle->timeEvents.statechart_main_region_on_r2_pressed_tev0_raised = bool_false;
|
||||
}
|
||||
|
||||
static void micro_step(Statechart* handle)
|
||||
{
|
||||
sc_integer transitioned = -1;
|
||||
handle->stateConfVectorPosition = 0;
|
||||
switch(handle->stateConfVector[ 0 ])
|
||||
{
|
||||
case Statechart_main_region_on_r1_responding :
|
||||
{
|
||||
transitioned = main_region_on_r1_responding_react(handle,transitioned);
|
||||
break;
|
||||
}
|
||||
case Statechart_main_region_on_r1_sensor_error :
|
||||
{
|
||||
transitioned = main_region_on_r1_sensor_error_react(handle,transitioned);
|
||||
break;
|
||||
}
|
||||
case Statechart_main_region_off :
|
||||
{
|
||||
transitioned = main_region_off_react(handle,transitioned);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
if ((handle->stateConfVectorPosition) < (1))
|
||||
{
|
||||
switch(handle->stateConfVector[ 1 ])
|
||||
{
|
||||
case Statechart_main_region_on_r2_not_pressed :
|
||||
{
|
||||
main_region_on_r2_not_pressed_react(handle,transitioned);
|
||||
break;
|
||||
}
|
||||
case Statechart_main_region_on_r2_pressed :
|
||||
{
|
||||
main_region_on_r2_pressed_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);
|
||||
} while (statechart_dispatch_next_event(handle) == bool_true);
|
||||
handle->isExecuting = bool_false;
|
||||
}
|
||||
|
||||
|
||||
void statechart_raise_sensor(Statechart* handle, sc_real value)
|
||||
{
|
||||
statechart_add_value_event_to_queue(&(handle->in_event_queue), Statechart_sensor, &value);
|
||||
run_cycle(handle);
|
||||
}
|
||||
|
||||
void statechart_raise_buttonPressed(Statechart* handle)
|
||||
{
|
||||
statechart_add_event_to_queue(&(handle->in_event_queue), Statechart_buttonPressed);
|
||||
run_cycle(handle);
|
||||
}
|
||||
|
||||
void statechart_raise_buttonReleased(Statechart* handle)
|
||||
{
|
||||
statechart_add_event_to_queue(&(handle->in_event_queue), Statechart_buttonReleased);
|
||||
run_cycle(handle);
|
||||
}
|
||||
|
||||
|
||||
sc_observable_sc_real* statechart_get_setMotorR(Statechart* handle)
|
||||
{
|
||||
return &handle->iface.setMotorR;
|
||||
}
|
||||
sc_observable_sc_real* statechart_get_setMotorL(Statechart* handle)
|
||||
{
|
||||
return &handle->iface.setMotorL;
|
||||
}
|
||||
|
||||
|
||||
static void statechart_internal_set_speed(Statechart* handle, sc_real 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_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));
|
||||
{
|
||||
sc_real iface_setMotorL_value = handle->internal.speed;
|
||||
sc_observable_sc_real_next(&handle->iface.setMotorL, iface_setMotorL_value);
|
||||
};
|
||||
{
|
||||
sc_real iface_setMotorR_value = handle->internal.speed;
|
||||
sc_observable_sc_real_next(&handle->iface.setMotorR, iface_setMotorR_value);
|
||||
};
|
||||
}
|
||||
|
||||
/* Entry action for state 'sensor_error'. */
|
||||
static void enact_main_region_on_r1_sensor_error(Statechart* handle)
|
||||
{
|
||||
/* Entry action for state 'sensor_error'. */
|
||||
{
|
||||
sc_real iface_setMotorL_value = 1;
|
||||
sc_observable_sc_real_next(&handle->iface.setMotorL, iface_setMotorL_value);
|
||||
};
|
||||
{
|
||||
sc_real iface_setMotorR_value = -(1);
|
||||
sc_observable_sc_real_next(&handle->iface.setMotorR, iface_setMotorR_value);
|
||||
};
|
||||
}
|
||||
|
||||
/* Entry action for state 'pressed'. */
|
||||
static void enact_main_region_on_r2_pressed(Statechart* handle)
|
||||
{
|
||||
/* Entry action for state 'pressed'. */
|
||||
statechart_set_timer(handle, (sc_eventid) &(handle->timeEvents.statechart_main_region_on_r2_pressed_tev0_raised) , (((sc_time) 2) * 1000), bool_false);
|
||||
}
|
||||
|
||||
/* Exit action for state 'pressed'. */
|
||||
static void exact_main_region_on_r2_pressed(Statechart* handle)
|
||||
{
|
||||
/* Exit action for state 'pressed'. */
|
||||
statechart_unset_timer(handle, (sc_eventid) &(handle->timeEvents.statechart_main_region_on_r2_pressed_tev0_raised) );
|
||||
}
|
||||
|
||||
/* 'default' enter sequence for state on */
|
||||
static void enseq_main_region_on_default(Statechart* handle)
|
||||
{
|
||||
/* 'default' enter sequence for state on */
|
||||
enseq_main_region_on_r1_default(handle);
|
||||
enseq_main_region_on_r2_default(handle);
|
||||
}
|
||||
|
||||
/* 'default' enter sequence for state responding */
|
||||
static void enseq_main_region_on_r1_responding_default(Statechart* handle)
|
||||
{
|
||||
/* 'default' enter sequence for state responding */
|
||||
enact_main_region_on_r1_responding(handle);
|
||||
handle->stateConfVector[0] = Statechart_main_region_on_r1_responding;
|
||||
handle->stateConfVectorPosition = 0;
|
||||
}
|
||||
|
||||
/* 'default' enter sequence for state sensor_error */
|
||||
static void enseq_main_region_on_r1_sensor_error_default(Statechart* handle)
|
||||
{
|
||||
/* 'default' enter sequence for state sensor_error */
|
||||
enact_main_region_on_r1_sensor_error(handle);
|
||||
handle->stateConfVector[0] = Statechart_main_region_on_r1_sensor_error;
|
||||
handle->stateConfVectorPosition = 0;
|
||||
}
|
||||
|
||||
/* 'default' enter sequence for state not_pressed */
|
||||
static void enseq_main_region_on_r2_not_pressed_default(Statechart* handle)
|
||||
{
|
||||
/* 'default' enter sequence for state not_pressed */
|
||||
handle->stateConfVector[1] = Statechart_main_region_on_r2_not_pressed;
|
||||
handle->stateConfVectorPosition = 1;
|
||||
}
|
||||
|
||||
/* 'default' enter sequence for state pressed */
|
||||
static void enseq_main_region_on_r2_pressed_default(Statechart* handle)
|
||||
{
|
||||
/* 'default' enter sequence for state pressed */
|
||||
enact_main_region_on_r2_pressed(handle);
|
||||
handle->stateConfVector[1] = Statechart_main_region_on_r2_pressed;
|
||||
handle->stateConfVectorPosition = 1;
|
||||
}
|
||||
|
||||
/* 'default' enter sequence for state off */
|
||||
static void enseq_main_region_off_default(Statechart* handle)
|
||||
{
|
||||
/* 'default' enter sequence for state off */
|
||||
handle->stateConfVector[0] = Statechart_main_region_off;
|
||||
handle->stateConfVectorPosition = 0;
|
||||
}
|
||||
|
||||
/* '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_on_r1_default(Statechart* handle)
|
||||
{
|
||||
/* 'default' enter sequence for region r1 */
|
||||
react_main_region_on_r1__entry_Default(handle);
|
||||
}
|
||||
|
||||
/* 'default' enter sequence for region r2 */
|
||||
static void enseq_main_region_on_r2_default(Statechart* handle)
|
||||
{
|
||||
/* 'default' enter sequence for region r2 */
|
||||
react_main_region_on_r2__entry_Default(handle);
|
||||
}
|
||||
|
||||
/* Default exit sequence for state on */
|
||||
static void exseq_main_region_on(Statechart* handle)
|
||||
{
|
||||
/* Default exit sequence for state on */
|
||||
exseq_main_region_on_r1(handle);
|
||||
exseq_main_region_on_r2(handle);
|
||||
handle->stateConfVector[0] = Statechart_last_state;
|
||||
handle->stateConfVector[1] = Statechart_last_state;
|
||||
handle->stateConfVectorPosition = 1;
|
||||
}
|
||||
|
||||
/* Default exit sequence for state responding */
|
||||
static void exseq_main_region_on_r1_responding(Statechart* handle)
|
||||
{
|
||||
/* Default exit sequence for state responding */
|
||||
handle->stateConfVector[0] = Statechart_main_region_on;
|
||||
handle->stateConfVectorPosition = 0;
|
||||
}
|
||||
|
||||
/* Default exit sequence for state sensor_error */
|
||||
static void exseq_main_region_on_r1_sensor_error(Statechart* handle)
|
||||
{
|
||||
/* Default exit sequence for state sensor_error */
|
||||
handle->stateConfVector[0] = Statechart_main_region_on;
|
||||
handle->stateConfVectorPosition = 0;
|
||||
}
|
||||
|
||||
/* Default exit sequence for state not_pressed */
|
||||
static void exseq_main_region_on_r2_not_pressed(Statechart* handle)
|
||||
{
|
||||
/* Default exit sequence for state not_pressed */
|
||||
handle->stateConfVector[1] = Statechart_main_region_on;
|
||||
handle->stateConfVectorPosition = 1;
|
||||
}
|
||||
|
||||
/* Default exit sequence for state pressed */
|
||||
static void exseq_main_region_on_r2_pressed(Statechart* handle)
|
||||
{
|
||||
/* Default exit sequence for state pressed */
|
||||
handle->stateConfVector[1] = Statechart_main_region_on;
|
||||
handle->stateConfVectorPosition = 1;
|
||||
exact_main_region_on_r2_pressed(handle);
|
||||
}
|
||||
|
||||
/* Default exit sequence for state off */
|
||||
static void exseq_main_region_off(Statechart* handle)
|
||||
{
|
||||
/* Default exit sequence for state off */
|
||||
handle->stateConfVector[0] = Statechart_last_state;
|
||||
handle->stateConfVectorPosition = 0;
|
||||
}
|
||||
|
||||
/* 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_on_r1_responding :
|
||||
{
|
||||
exseq_main_region_on_r1_responding(handle);
|
||||
break;
|
||||
}
|
||||
case Statechart_main_region_on_r1_sensor_error :
|
||||
{
|
||||
exseq_main_region_on_r1_sensor_error(handle);
|
||||
break;
|
||||
}
|
||||
case Statechart_main_region_off :
|
||||
{
|
||||
exseq_main_region_off(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_on_r2_not_pressed :
|
||||
{
|
||||
exseq_main_region_on_r2_not_pressed(handle);
|
||||
break;
|
||||
}
|
||||
case Statechart_main_region_on_r2_pressed :
|
||||
{
|
||||
exseq_main_region_on_r2_pressed(handle);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Default exit sequence for region r1 */
|
||||
static void exseq_main_region_on_r1(Statechart* handle)
|
||||
{
|
||||
/* Default exit sequence for region r1 */
|
||||
/* Handle exit of all possible states (of Statechart.main_region.on.r1) at position 0... */
|
||||
switch(handle->stateConfVector[ 0 ])
|
||||
{
|
||||
case Statechart_main_region_on_r1_responding :
|
||||
{
|
||||
exseq_main_region_on_r1_responding(handle);
|
||||
break;
|
||||
}
|
||||
case Statechart_main_region_on_r1_sensor_error :
|
||||
{
|
||||
exseq_main_region_on_r1_sensor_error(handle);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Default exit sequence for region r2 */
|
||||
static void exseq_main_region_on_r2(Statechart* handle)
|
||||
{
|
||||
/* Default exit sequence for region r2 */
|
||||
/* Handle exit of all possible states (of Statechart.main_region.on.r2) at position 1... */
|
||||
switch(handle->stateConfVector[ 1 ])
|
||||
{
|
||||
case Statechart_main_region_on_r2_not_pressed :
|
||||
{
|
||||
exseq_main_region_on_r2_not_pressed(handle);
|
||||
break;
|
||||
}
|
||||
case Statechart_main_region_on_r2_pressed :
|
||||
{
|
||||
exseq_main_region_on_r2_pressed(handle);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* The reactions of state null. */
|
||||
static void react_main_region_on_r1__choice_0(Statechart* handle)
|
||||
{
|
||||
/* The reactions of state null. */
|
||||
if ((handle->iface.sensor_value) < (0))
|
||||
{
|
||||
enseq_main_region_on_r1_sensor_error_default(handle);
|
||||
} else
|
||||
{
|
||||
enseq_main_region_on_r1_responding_default(handle);
|
||||
}
|
||||
}
|
||||
|
||||
/* Default react sequence for initial entry */
|
||||
static void react_main_region_on_r1__entry_Default(Statechart* handle)
|
||||
{
|
||||
/* Default react sequence for initial entry */
|
||||
enseq_main_region_on_r1_responding_default(handle);
|
||||
}
|
||||
|
||||
/* Default react sequence for initial entry */
|
||||
static void react_main_region_on_r2__entry_Default(Statechart* handle)
|
||||
{
|
||||
/* Default react sequence for initial entry */
|
||||
enseq_main_region_on_r2_not_pressed_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_off_default(handle);
|
||||
}
|
||||
|
||||
|
||||
static sc_integer main_region_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_on_r1_responding(handle);
|
||||
react_main_region_on_r1__choice_0(handle);
|
||||
transitioned_after = 0;
|
||||
}
|
||||
}
|
||||
return transitioned_after;
|
||||
}
|
||||
|
||||
static sc_integer main_region_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_on_r1_sensor_error(handle);
|
||||
react_main_region_on_r1__choice_0(handle);
|
||||
transitioned_after = 0;
|
||||
}
|
||||
}
|
||||
return transitioned_after;
|
||||
}
|
||||
|
||||
static sc_integer main_region_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->iface.buttonPressed_raised == bool_true)
|
||||
{
|
||||
exseq_main_region_on_r2_not_pressed(handle);
|
||||
enseq_main_region_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_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_on_r2_pressed_tev0_raised == bool_true)
|
||||
{
|
||||
exseq_main_region_on(handle);
|
||||
handle->timeEvents.statechart_main_region_on_r2_pressed_tev0_raised = bool_false;
|
||||
enseq_main_region_off_default(handle);
|
||||
transitioned_after = 1;
|
||||
} else
|
||||
{
|
||||
if (handle->iface.buttonReleased_raised == bool_true)
|
||||
{
|
||||
exseq_main_region_on_r2_pressed(handle);
|
||||
enseq_main_region_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_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->iface.buttonPressed_raised == bool_true)
|
||||
{
|
||||
exseq_main_region_off(handle);
|
||||
enseq_main_region_on_default(handle);
|
||||
transitioned_after = 0;
|
||||
}
|
||||
}
|
||||
/* 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_buttonPressed:
|
||||
{
|
||||
handle->iface.buttonPressed_raised = bool_true;
|
||||
return bool_true;
|
||||
}
|
||||
case Statechart_buttonReleased:
|
||||
{
|
||||
handle->iface.buttonReleased_raised = bool_true;
|
||||
return bool_true;
|
||||
}
|
||||
case Statechart_Statechart_main_region_on_r2_pressed_time_event_0:
|
||||
{
|
||||
handle->timeEvents.statechart_main_region_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->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_on_r2_pressed_tev0_raised) {
|
||||
return Statechart_Statechart_main_region_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 = *((sc_real*)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);
|
||||
}
|
||||
227
robot_cdt/src-gen/Statechart.h
Normal file
227
robot_cdt/src-gen/Statechart.h
Normal file
|
|
@ -0,0 +1,227 @@
|
|||
/* Generated by itemis CREATE code generator. */
|
||||
|
||||
#ifndef STATECHART_H_
|
||||
#define STATECHART_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* Forward declaration for the Statechart state machine.
|
||||
*/
|
||||
typedef struct Statechart Statechart;
|
||||
|
||||
/*!
|
||||
* Forward declaration of the data structure for the StatechartIface interface scope.
|
||||
*/
|
||||
typedef struct StatechartIface StatechartIface;
|
||||
|
||||
/*!
|
||||
* Forward declaration of the data structure for the StatechartInternal interface scope.
|
||||
*/
|
||||
typedef struct StatechartInternal StatechartInternal;
|
||||
|
||||
/*!
|
||||
* Forward declaration of the data structure for the StatechartTimeEvents interface scope.
|
||||
*/
|
||||
typedef struct StatechartTimeEvents StatechartTimeEvents;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#include "../src/data_types.h"
|
||||
#include "../src/sc_types.h"
|
||||
#include "../src/sc_rxc.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! \file
|
||||
Header of the state machine 'Statechart'.
|
||||
*/
|
||||
|
||||
#ifndef STATECHART_EVENTQUEUE_BUFFERSIZE
|
||||
#define STATECHART_EVENTQUEUE_BUFFERSIZE 20
|
||||
#endif
|
||||
#ifndef STATECHART_IN_EVENTQUEUE_BUFFERSIZE
|
||||
#define STATECHART_IN_EVENTQUEUE_BUFFERSIZE STATECHART_EVENTQUEUE_BUFFERSIZE
|
||||
#endif
|
||||
#ifndef SC_INVALID_EVENT_VALUE
|
||||
#define SC_INVALID_EVENT_VALUE 0
|
||||
#endif
|
||||
/*! Define number of states in the state enum */
|
||||
#define STATECHART_STATE_COUNT 6
|
||||
|
||||
/*! Define dimension of the state configuration vector for orthogonal states. */
|
||||
#define STATECHART_MAX_ORTHOGONAL_STATES 2
|
||||
/*! Define maximum number of time events that can be active at once */
|
||||
#define STATECHART_MAX_PARALLEL_TIME_EVENTS 1
|
||||
|
||||
/*! Define indices of states in the StateConfVector */
|
||||
#define SCVI_STATECHART_MAIN_REGION_ON 0
|
||||
#define SCVI_STATECHART_MAIN_REGION_ON_R1_RESPONDING 0
|
||||
#define SCVI_STATECHART_MAIN_REGION_ON_R1_SENSOR_ERROR 0
|
||||
#define SCVI_STATECHART_MAIN_REGION_ON_R2_NOT_PRESSED 1
|
||||
#define SCVI_STATECHART_MAIN_REGION_ON_R2_PRESSED 1
|
||||
#define SCVI_STATECHART_MAIN_REGION_OFF 0
|
||||
|
||||
/*
|
||||
* Union of all possible event value types.
|
||||
*/
|
||||
typedef union {
|
||||
sc_real Statechart_sensor_value;
|
||||
} statechart_event_value;
|
||||
|
||||
/*
|
||||
* Enum of event names in the statechart.
|
||||
*/
|
||||
typedef enum {
|
||||
Statechart_invalid_event = SC_INVALID_EVENT_VALUE,
|
||||
Statechart_sensor,
|
||||
Statechart_buttonPressed,
|
||||
Statechart_buttonReleased,
|
||||
Statechart_Statechart_main_region_on_r2_pressed_time_event_0
|
||||
} StatechartEventID;
|
||||
|
||||
/*
|
||||
* Struct that represents a single event.
|
||||
*/
|
||||
typedef struct {
|
||||
StatechartEventID name;
|
||||
sc_boolean has_value;
|
||||
statechart_event_value value;
|
||||
} statechart_event;
|
||||
|
||||
/*
|
||||
* Queue that holds the raised events.
|
||||
*/
|
||||
typedef struct statechart_eventqueue_s {
|
||||
statechart_event *events;
|
||||
sc_integer capacity;
|
||||
sc_integer pop_index;
|
||||
sc_integer push_index;
|
||||
sc_integer size;
|
||||
} statechart_eventqueue;
|
||||
|
||||
/*! Enumeration of all states */
|
||||
typedef enum
|
||||
{
|
||||
Statechart_last_state,
|
||||
Statechart_main_region_on,
|
||||
Statechart_main_region_on_r1_responding,
|
||||
Statechart_main_region_on_r1_sensor_error,
|
||||
Statechart_main_region_on_r2_not_pressed,
|
||||
Statechart_main_region_on_r2_pressed,
|
||||
Statechart_main_region_off
|
||||
} StatechartStates;
|
||||
|
||||
|
||||
|
||||
|
||||
/*! Type declaration of the data structure for the StatechartIface interface scope. */
|
||||
struct StatechartIface
|
||||
{
|
||||
sc_boolean sensor_raised;
|
||||
sc_real sensor_value;
|
||||
sc_boolean buttonPressed_raised;
|
||||
sc_boolean buttonReleased_raised;
|
||||
sc_observable_sc_real setMotorR;
|
||||
sc_observable_sc_real setMotorL;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*! Type declaration of the data structure for the StatechartInternal interface scope. */
|
||||
struct StatechartInternal
|
||||
{
|
||||
sc_real speed;
|
||||
pid_vars_t pid_vars;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*! Type declaration of the data structure for the StatechartTimeEvents interface scope. */
|
||||
struct StatechartTimeEvents
|
||||
{
|
||||
sc_boolean statechart_main_region_on_r2_pressed_tev0_raised;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* Type declaration of the data structure for the Statechart state machine.
|
||||
* This data structure has to be allocated by the client code.
|
||||
*/
|
||||
struct Statechart
|
||||
{
|
||||
StatechartStates stateConfVector[STATECHART_MAX_ORTHOGONAL_STATES];
|
||||
StatechartIface iface;
|
||||
StatechartInternal internal;
|
||||
StatechartTimeEvents timeEvents;
|
||||
sc_boolean isExecuting;
|
||||
sc_integer stateConfVectorPosition;
|
||||
statechart_eventqueue in_event_queue;
|
||||
statechart_event in_buffer[STATECHART_IN_EVENTQUEUE_BUFFERSIZE];
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*! Initializes the Statechart state machine data structures. Must be called before first usage.*/
|
||||
extern void statechart_init(Statechart* handle);
|
||||
|
||||
|
||||
/*! Activates the state machine. */
|
||||
extern void statechart_enter(Statechart* handle);
|
||||
|
||||
/*! Deactivates the state machine. */
|
||||
extern void statechart_exit(Statechart* handle);
|
||||
|
||||
/*!
|
||||
Can be used by the client code to trigger a run to completion step without raising an event.
|
||||
*/
|
||||
extern void statechart_trigger_without_event(Statechart* handle);
|
||||
|
||||
|
||||
/*! Raises a time event. */
|
||||
extern void statechart_raise_time_event(Statechart* handle, sc_eventid evid);
|
||||
|
||||
/*! Raises the in event 'sensor' that is defined in the default interface scope. */
|
||||
extern void statechart_raise_sensor(Statechart* handle, sc_real value);
|
||||
/*! Raises the in event 'buttonPressed' that is defined in the default interface scope. */
|
||||
extern void statechart_raise_buttonPressed(Statechart* handle);
|
||||
/*! Raises the in event 'buttonReleased' that is defined in the default interface scope. */
|
||||
extern void statechart_raise_buttonReleased(Statechart* handle);
|
||||
/*! Returns the observable for the out event 'setMotorR' that is defined in the default interface scope. */
|
||||
extern sc_observable_sc_real* statechart_get_setMotorR(Statechart* handle);
|
||||
|
||||
/*! Returns the observable for the out event 'setMotorL' that is defined in the default interface scope. */
|
||||
extern sc_observable_sc_real* statechart_get_setMotorL(Statechart* handle);
|
||||
|
||||
|
||||
/*!
|
||||
* Checks whether the state machine is active (until 2.4.1 this method was used for states).
|
||||
* A state machine is active if it was entered. It is inactive if it has not been entered at all or if it has been exited.
|
||||
*/
|
||||
extern sc_boolean statechart_is_active(const Statechart* handle);
|
||||
|
||||
/*!
|
||||
* Checks if all active states are final.
|
||||
* If there are no active states then the state machine is considered being inactive. In this case this method returns false.
|
||||
*/
|
||||
extern sc_boolean statechart_is_final(const Statechart* handle);
|
||||
|
||||
/*! Checks if the specified state is active (until 2.4.1 the used method for states was called isActive()). */
|
||||
extern sc_boolean statechart_is_state_active(const Statechart* handle, StatechartStates state);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* STATECHART_H_ */
|
||||
56
robot_cdt/src-gen/Statechart_required.h
Normal file
56
robot_cdt/src-gen/Statechart_required.h
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
/* Generated by itemis CREATE code generator. */
|
||||
|
||||
#ifndef STATECHART_REQUIRED_H_
|
||||
#define STATECHART_REQUIRED_H_
|
||||
|
||||
#include "../src/sc_types.h"
|
||||
#include "Statechart.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/*! \file
|
||||
This header defines prototypes for all functions that are required by the state machine implementation.
|
||||
|
||||
This is a state machine uses time events which require access to a timing service. Thus the function prototypes:
|
||||
- statechart_set_timer and
|
||||
- statechart_unset_timer
|
||||
are defined.
|
||||
This state machine makes use of operations declared in the state machines interface or internal scopes. Thus the function prototypes:
|
||||
- statechart_pid
|
||||
are defined.
|
||||
|
||||
These functions will be called during a 'run to completion step' (runCycle) of the statechart.
|
||||
There are some constraints that have to be considered for the implementation of these functions:
|
||||
- make sure that the execution time is as short as possible.
|
||||
*/
|
||||
|
||||
extern sc_real statechart_pid( Statechart* handle, const sc_real sensor, const pid_vars_t pid_vars);
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
This function has to set up timers for the time events that are required by the state machine.
|
||||
It will be called for each time event that is relevant for a state when a state will be entered.
|
||||
\param evid An unique identifier of the event.
|
||||
\time_ms The time in milliseconds
|
||||
\periodic Indicates the the time event must be raised periodically until the timer is unset
|
||||
*/
|
||||
extern void statechart_set_timer(Statechart* handle, const sc_eventid evid, const sc_time time_ms, const sc_boolean periodic);
|
||||
|
||||
/*!
|
||||
This function has to unset timers for the time events that are required by the state machine.
|
||||
It will be called for each time event that is relevant for a state when a state will be left.
|
||||
\param evid An unique identifier of the event.
|
||||
*/
|
||||
extern void statechart_unset_timer(Statechart* handle, const sc_eventid evid);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* STATECHART_REQUIRED_H_ */
|
||||
Loading…
Add table
Add a link
Reference in a new issue