diff --git a/robot_cdt/Makefile b/robot_cdt/Makefile index f20b2ad..f148970 100644 --- a/robot_cdt/Makefile +++ b/robot_cdt/Makefile @@ -2,6 +2,7 @@ SRCS = \ src/controller.c \ src/pid.c \ src/sc_rxc.c \ + src/sc_rxc_int32_t.c \ src/sc_timer_service.c \ src-gen/Statechart.c \ diff --git a/robot_cdt/Statechart.ysc b/robot_cdt/Statechart.ysc index 550bc0a..f51085a 100644 --- a/robot_cdt/Statechart.ysc +++ b/robot_cdt/Statechart.ysc @@ -1,6 +1,6 @@ - + diff --git a/robot_cdt/src-gen/Statechart.c b/robot_cdt/src-gen/Statechart.c index 9dc338c..0271011 100644 --- a/robot_cdt/src-gen/Statechart.c +++ b/robot_cdt/src-gen/Statechart.c @@ -68,7 +68,7 @@ static void run_cycle(Statechart* handle); -static void statechart_internal_set_speed(Statechart* handle, sc_real value) +static void statechart_internal_set_speed(Statechart* handle, int32_t value) ; static void statechart_internal_set_pid_vars(Statechart* handle, pid_vars_t value) ; @@ -100,11 +100,11 @@ void statechart_init(Statechart* handle) clear_in_events(handle); - sc_observable_sc_real_init(&handle->iface.setMotorR); - sc_observable_sc_real_init(&handle->iface.setMotorL); + 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.0); + statechart_internal_set_speed(handle, 0); handle->isExecuting = bool_false; statechart_eventqueue_init(&handle->in_event_queue, handle->in_buffer, STATECHART_IN_EVENTQUEUE_BUFFERSIZE); @@ -287,7 +287,7 @@ static void run_cycle(Statechart* handle) } -void statechart_raise_sensor(Statechart* handle, sc_real value) +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); @@ -306,17 +306,17 @@ void statechart_raise_buttonReleased(Statechart* handle) } -sc_observable_sc_real* statechart_get_setMotorR(Statechart* handle) +sc_observable_int32_t* statechart_get_setMotorR(Statechart* handle) { return &handle->iface.setMotorR; } -sc_observable_sc_real* statechart_get_setMotorL(Statechart* handle) +sc_observable_int32_t* statechart_get_setMotorL(Statechart* handle) { return &handle->iface.setMotorL; } -static void statechart_internal_set_speed(Statechart* handle, sc_real value) +static void statechart_internal_set_speed(Statechart* handle, int32_t value) { handle->internal.speed = value; } @@ -334,12 +334,12 @@ 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); + int32_t iface_setMotorL_value = handle->internal.speed; + sc_observable_int32_t_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); + int32_t iface_setMotorR_value = handle->internal.speed; + sc_observable_int32_t_next(&handle->iface.setMotorR, iface_setMotorR_value); }; } @@ -348,12 +348,12 @@ 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); + int32_t iface_setMotorL_value = 1; + sc_observable_int32_t_next(&handle->iface.setMotorL, iface_setMotorL_value); }; { - sc_real iface_setMotorR_value = -(1); - sc_observable_sc_real_next(&handle->iface.setMotorR, iface_setMotorR_value); + int32_t iface_setMotorR_value = -(1); + sc_observable_int32_t_next(&handle->iface.setMotorR, iface_setMotorR_value); }; } @@ -858,7 +858,7 @@ static void statechart_event_value_init(statechart_event * ev, StatechartEventID switch(name) { case Statechart_sensor: - ev->value.Statechart_sensor_value = *((sc_real*)value); + ev->value.Statechart_sensor_value = *((int32_t*)value); break; default: /* do nothing */ diff --git a/robot_cdt/src-gen/Statechart.h b/robot_cdt/src-gen/Statechart.h index 477a930..1e833fc 100644 --- a/robot_cdt/src-gen/Statechart.h +++ b/robot_cdt/src-gen/Statechart.h @@ -34,6 +34,9 @@ typedef struct StatechartTimeEvents StatechartTimeEvents; #include "../src/data_types.h" #include "../src/sc_types.h" #include "../src/sc_rxc.h" +#include "../src/sc_rxc_int32_t.h" +#include "../src/sc_rxc_int32_t.h" +#include "../src/sc_rxc_int32_t.h" #ifdef __cplusplus extern "C" { @@ -72,7 +75,7 @@ Header of the state machine 'Statechart'. * Union of all possible event value types. */ typedef union { - sc_real Statechart_sensor_value; + int32_t Statechart_sensor_value; } statechart_event_value; /* @@ -125,11 +128,11 @@ typedef enum struct StatechartIface { sc_boolean sensor_raised; - sc_real sensor_value; + int32_t sensor_value; sc_boolean buttonPressed_raised; sc_boolean buttonReleased_raised; - sc_observable_sc_real setMotorR; - sc_observable_sc_real setMotorL; + sc_observable_int32_t setMotorR; + sc_observable_int32_t setMotorL; }; @@ -137,7 +140,7 @@ struct StatechartIface /*! Type declaration of the data structure for the StatechartInternal interface scope. */ struct StatechartInternal { - sc_real speed; + int32_t speed; pid_vars_t pid_vars; }; @@ -192,16 +195,16 @@ extern void statechart_trigger_without_event(Statechart* handle); 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); +extern void statechart_raise_sensor(Statechart* handle, int32_t 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); +extern sc_observable_int32_t* 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); +extern sc_observable_int32_t* statechart_get_setMotorL(Statechart* handle); /*! diff --git a/robot_cdt/src-gen/Statechart_required.h b/robot_cdt/src-gen/Statechart_required.h index 0fe22a6..633e324 100644 --- a/robot_cdt/src-gen/Statechart_required.h +++ b/robot_cdt/src-gen/Statechart_required.h @@ -27,7 +27,7 @@ There are some constraints that have to be considered for the implementation of - 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); +extern int32_t statechart_pid( Statechart* handle, const int32_t sensor, const pid_vars_t pid_vars); diff --git a/robot_cdt/src/controller.c b/robot_cdt/src/controller.c index 7ecea62..341d37f 100644 --- a/robot_cdt/src/controller.c +++ b/robot_cdt/src/controller.c @@ -15,18 +15,18 @@ static sc_timer_t timers[MAX_TIMERS]; static sc_timer_service_t timer_service; // Observers are stateless (they just link to callbacks) so it's safe to use global variables here -static sc_single_subscription_observer_sc_integer observer_motorL; -static sc_single_subscription_observer_sc_integer observer_motorR; +static sc_single_subscription_observer_int32_t observer_motorL; +static sc_single_subscription_observer_int32_t observer_motorR; -static sc_integer motor_left_speed; -static sc_integer motor_right_speed; +static int32_t motor_left_speed; +static int32_t motor_right_speed; // event handler callback functions -void on_motorL(Statechart* sc, sc_integer value) { +void on_motorL(Statechart* sc, int32_t value) { fprintf(stderr, "got event motorL: %f\n", value); motor_left_speed = value; } -void on_motorR(Statechart* sc, sc_integer value) { +void on_motorR(Statechart* sc, int32_t value) { fprintf(stderr, "got event motorR: %f\n", value); motor_right_speed = value; } @@ -42,16 +42,16 @@ void controller_init(Statechart* sc) { // subscribe to output events: // motorL observer - sc_single_subscription_observer_sc_integer_init(&observer_motorL, sc, (sc_observer_next_sc_integer_fp) on_motorL); - sc_single_subscription_observer_sc_integer_subscribe(&observer_motorL, statechart_get_setMotorL(sc)); + sc_single_subscription_observer_int32_t_init(&observer_motorL, sc, (sc_observer_next_int32_t_fp) on_motorL); + sc_single_subscription_observer_int32_t_subscribe(&observer_motorL, statechart_get_setMotorL(sc)); // motorR observer - sc_single_subscription_observer_sc_integer_init(&observer_motorR, sc, (sc_observer_next_sc_integer_fp) on_motorR); - sc_single_subscription_observer_sc_integer_subscribe(&observer_motorR, statechart_get_setMotorR(sc)); + sc_single_subscription_observer_int32_t_init(&observer_motorR, sc, (sc_observer_next_int32_t_fp) on_motorR); + sc_single_subscription_observer_int32_t_subscribe(&observer_motorR, statechart_get_setMotorR(sc)); } // to be called every 10 ms -void controller_poll(sc_integer* _motor_left_speed, sc_integer* _motor_right_speed) { +void controller_poll(int32_t* _motor_left_speed, int32_t* _motor_right_speed) { sc_time elapsed = 10; // ms sc_timer_service_proceed(&timer_service, elapsed); fprintf(stderr, "made 10ms step\n"); @@ -61,13 +61,13 @@ void controller_poll(sc_integer* _motor_left_speed, sc_integer* _motor_right_spe } // finally, we need to implemented these functions (defined in "Statechart_required.h") -sc_integer statechart_pid(Statechart* handle, const sc_integer sensor, pid_vars_t pid_vars) { - sc_integer error = TARGET_DIST - sensor; // is this correct? +int32_t statechart_pid(Statechart* handle, const int32_t sensor, pid_vars_t pid_vars) { + int32_t error = TARGET_DIST - sensor; // is this correct? return pid(pid_vars, error); } // here you see the reason we need global variables for the timer service: // the signature of these functions is mandated by YAKINDU, and there is no 'timer service' parameter -void statechart_set_timer(Statechart *sc, const sc_eventid evid, const sc_integer time_ms, const sc_boolean periodic) { +void statechart_set_timer(Statechart *sc, const sc_eventid evid, const int32_t time_ms, const sc_boolean periodic) { sc_timer_set(&timer_service, sc, evid, time_ms, periodic); } void statechart_unset_timer(Statechart *sc, const sc_eventid evid) { @@ -76,5 +76,6 @@ void statechart_unset_timer(Statechart *sc, const sc_eventid evid) { void main() { + // find out how big the Statechart-struct is: fprintf(stderr, "%d", sizeof(Statechart)); } diff --git a/robot_cdt/src/sc_rxc_int32_t.c b/robot_cdt/src/sc_rxc_int32_t.c new file mode 100644 index 0000000..32b2f61 --- /dev/null +++ b/robot_cdt/src/sc_rxc_int32_t.c @@ -0,0 +1,6 @@ +/* Generated by itemis CREATE code generator. */ + +#include "sc_rxc_int32_t.h" + +define_sc_reactive_extensions(int32_t) + diff --git a/robot_cdt/src/sc_rxc_int32_t.h b/robot_cdt/src/sc_rxc_int32_t.h new file mode 100644 index 0000000..07f09eb --- /dev/null +++ b/robot_cdt/src/sc_rxc_int32_t.h @@ -0,0 +1,19 @@ +/* Generated by itemis CREATE code generator. */ + +#ifndef SC_RXC_INT32_T_H_ +#define SC_RXC_INT32_T_H_ + +#include "sc_rxc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +declare_sc_reactive_extensions(int32_t) + +#ifdef __cplusplus +} +#endif + + +#endif /* SC_RXC_INT32_T_H_ */