/* This program is part of the TACLeBench benchmark suite. Version V 1.x Name: powerwindow_powerwindow_control.c Author: CoSys-Lab, University of Antwerp Function: powerwindow_control is the main functionality of the power window benchmark. It contains 3 states: System, EndReached and Pinch, which are used to controll the position of the glass, if the window is fully closed and sensing pinch force to realize the powerwindow function. Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c Changes: a brief summary of major functional changes and formatting) License: GNU General Public License */ #include "wcclib.h" #include "powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" #include "powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h" /* Named constants for Chart: '/stateflow control model' */ #define powerwindow_powerwindow__IN_NO_ACTIVE_CHILD ((powerwindow_uint8_T)0U) #define powerwindow_powerwindow_contr_IN_EndReached ((powerwindow_uint8_T)1U) #define powerwindow_powerwindow_contr_IN_SensePinch ((powerwindow_uint8_T)2U) #define powerwindow_powerwindow_control_IN_AutoDown ((powerwindow_uint8_T)1U) #define powerwindow_powerwindow_control_IN_AutoUp ((powerwindow_uint8_T)1U) #define powerwindow_powerwindow_control_IN_Down ((powerwindow_uint8_T)2U) #define powerwindow_powerwindow_control_IN_Down_d ((powerwindow_uint8_T)1U) #define powerwindow_powerwindow_control_IN_InitDown ((powerwindow_uint8_T)3U) #define powerwindow_powerwindow_control_IN_InitUp ((powerwindow_uint8_T)2U) #define powerwindow_powerwindow_control_IN_Neutral ((powerwindow_uint8_T)2U) #define powerwindow_powerwindow_control_IN_Pinch ((powerwindow_uint8_T)2U) #define powerwindow_powerwindow_control_IN_SenseEnd ((powerwindow_uint8_T)1U) #define powerwindow_powerwindow_control_IN_Start ((powerwindow_uint8_T)3U) #define powerwindow_powerwindow_control_IN_System ((powerwindow_uint8_T)3U) #define powerwindow_powerwindow_control_IN_Up ((powerwindow_uint8_T)3U) /* Forward declaration for local functions */ void powerwindow_powerwindow_control_Start( powerwindow_rtDW_PowerWindow_control *localDW ); void powerwindow_powerwindow_control_Init( powerwindow_boolean_T *rty_window_up, powerwindow_boolean_T *rty_window_down, powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T * rty_wake, powerwindow_rtDW_PowerWindow_control *localDW ); void powerwindow_powerwindow_control_Start( powerwindow_rtDW_PowerWindow_control *localDW ); void powerwindow_powerwindow_control_initialize( const powerwindow_char_T **rt_errorStatus, powerwindow_RT_MODEL_PowerWindow_control *const PowerWindow_control_M, powerwindow_rtB_PowerWindow_control *localB, powerwindow_rtDW_PowerWindow_control *localDW, powerwindow_rtZCE_PowerWindow_control *localZCE ); void powerwindow_powerwindow_control_main( const powerwindow_boolean_T *rtu_up, const powerwindow_boolean_T *rtu_down, const powerwindow_boolean_T *rtu_endofdetectionrange, const powerwindow_uint8_T *rtu_currentsense, powerwindow_boolean_T *rty_window_up, powerwindow_boolean_T *rty_window_down, powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T *rty_wake, powerwindow_rtB_PowerWindow_control *localB, powerwindow_rtDW_PowerWindow_control *localDW, powerwindow_rtZCE_PowerWindow_control *localZCE ); void powerwindow_powerwindow_con_broadcast_ticks( powerwindow_boolean_T *rty_window_up, powerwindow_boolean_T * rty_window_down, powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T *rty_wake, powerwindow_rtB_PowerWindow_control *localB, powerwindow_rtDW_PowerWindow_control *localDW ); /* Function for Chart: '/stateflow control model' */ void powerwindow_powerwindow_con_broadcast_ticks( powerwindow_boolean_T *rty_window_up, powerwindow_boolean_T * rty_window_down, powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T *rty_wake, powerwindow_rtB_PowerWindow_control *localB, powerwindow_rtDW_PowerWindow_control *localDW ) { /* Event: ':30' */ /* During: PW_PSG/PWExternalClock/stateflow control model */ if ( localDW->is_active_c2_PowerWindow_contro == 0U ) { /* Entry: PW_PSG/PWExternalClock/stateflow control model */ localDW->is_active_c2_PowerWindow_contro = 1U; /* Entry Internal: PW_PSG/PWExternalClock/stateflow control model */ /* Transition: ':102' */ localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_control_IN_System; /* Entry Internal 'System': ':94' */ localDW->is_active_Logic = 1U; /* Entry Internal 'Logic': ':95' */ /* Transition: ':82' */ localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; /* Chart: '/stateflow control model' incorporates: TriggerPort: '/ticks' */ /* Entry 'Neutral': ':16' */ *rty_window_up = false; *rty_window_down = false; *rty_wake = false; localDW->is_active_Sensing = 1U; /* Entry Internal 'Sensing': ':96' */ /* Transition: ':153' */ localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; localDW->temporalCounter_i2 = 0U; /* Chart: '/stateflow control model' incorporates: TriggerPort: '/ticks' */ /* Entry 'Start': ':170' */ *rty_overcurrent = false; *rty_pinch = false; } else { switch ( localDW->is_c2_PowerWindow_control ) { case powerwindow_powerwindow_contr_IN_EndReached: /* During 'EndReached': ':97' */ if ( localDW->temporalCounter_i1 >= 10 ) { /* Transition: ':101' */ localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_control_IN_System; /* Entry Internal 'System': ':94' */ localDW->is_active_Logic = 1U; /* Entry Internal 'Logic': ':95' */ /* Transition: ':82' */ localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; /* Chart: '/stateflow control model' incorporates: TriggerPort: '/ticks' */ /* Entry 'Neutral': ':16' */ *rty_window_up = false; *rty_window_down = false; *rty_wake = false; localDW->is_active_Sensing = 1U; /* Entry Internal 'Sensing': ':96' */ /* Transition: ':153' */ localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; localDW->temporalCounter_i2 = 0U; /* Chart: '/stateflow control model' incorporates: TriggerPort: '/ticks' */ /* Entry 'Start': ':170' */ *rty_overcurrent = false; *rty_pinch = false; } break; case powerwindow_powerwindow_control_IN_Pinch: /* During 'Pinch': ':152' */ if ( localDW->temporalCounter_i1 >= 40 ) { /* Transition: ':157' */ localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_control_IN_System; /* Entry Internal 'System': ':94' */ localDW->is_active_Logic = 1U; /* Entry Internal 'Logic': ':95' */ /* Transition: ':82' */ localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; /* Chart: '/stateflow control model' incorporates: TriggerPort: '/ticks' */ /* Entry 'Neutral': ':16' */ *rty_window_up = false; *rty_window_down = false; *rty_wake = false; localDW->is_active_Sensing = 1U; /* Entry Internal 'Sensing': ':96' */ /* Transition: ':153' */ localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; localDW->temporalCounter_i2 = 0U; /* Chart: '/stateflow control model' incorporates: TriggerPort: '/ticks' */ /* Entry 'Start': ':170' */ *rty_overcurrent = false; *rty_pinch = false; } break; default: /* Chart: '/stateflow control model' incorporates: TriggerPort: '/ticks' */ /* During 'System': ':94' */ if ( *rty_pinch == 1 ) { /* Transition: ':155' */ /* Exit Internal 'System': ':94' */ /* Exit Internal 'Sensing': ':96' */ localDW->is_Sensing = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_active_Sensing = 0U; /* Exit Internal 'Logic': ':95' */ /* Exit Internal 'Down': ':18' */ localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; /* Exit Internal 'Up': ':17' */ localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_active_Logic = 0U; localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_control_IN_Pinch; localDW->temporalCounter_i1 = 0U; /* Entry 'Pinch': ':152' */ *rty_window_up = false; *rty_window_down = true; } else if ( *rty_overcurrent == 1 ) { /* Transition: ':100' */ /* Exit Internal 'System': ':94' */ /* Exit Internal 'Sensing': ':96' */ localDW->is_Sensing = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_active_Sensing = 0U; /* Exit Internal 'Logic': ':95' */ /* Exit Internal 'Down': ':18' */ localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; /* Exit Internal 'Up': ':17' */ localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_active_Logic = 0U; localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_contr_IN_EndReached; localDW->temporalCounter_i1 = 0U; /* Entry 'EndReached': ':97' */ *rty_window_up = false; *rty_window_down = false; } else { /* During 'Logic': ':95' */ switch ( localDW->is_Logic ) { case powerwindow_powerwindow_control_IN_Down_d: /* During 'Down': ':18' */ if ( localB->map[ 1 ] ) { /* Transition: ':169' */ /* Exit Internal 'Down': ':18' */ localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_Logic = powerwindow_powerwindow_control_IN_Up; /* Entry 'Up': ':17' */ *rty_window_up = true; *rty_window_down = false; *rty_wake = true; localDW->is_Up = powerwindow_powerwindow_control_IN_Up; } else { switch ( localDW->is_Down ) { case powerwindow_powerwindow_control_IN_AutoDown: /* During 'AutoDown': ':111' */ break; case powerwindow_powerwindow_control_IN_Down: /* During 'Down': ':110' */ if ( localB->map[ 0 ] ) { /* Transition: ':26' */ localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; /* Entry 'Neutral': ':16' */ *rty_window_up = false; *rty_window_down = false; *rty_wake = false; } break; default: /* During 'InitDown': ':109' */ if ( localDW->temporalCounter_i1 >= 20 ) { /* Transition: ':119' */ if ( localB->map[ 0 ] ) { /* Transition: ':120' */ localDW->is_Down = powerwindow_powerwindow_control_IN_AutoDown; } else { if ( localB->map[ 2 ] ) { /* Transition: ':121' */ localDW->is_Down = powerwindow_powerwindow_control_IN_Down; } } } break; } } break; case powerwindow_powerwindow_control_IN_Neutral: /* During 'Neutral': ':16' */ if ( localB->map[ 1 ] ) { /* Transition: ':24' */ localDW->is_Logic = powerwindow_powerwindow_control_IN_Up; /* Entry 'Up': ':17' */ *rty_window_up = true; *rty_window_down = false; *rty_wake = true; localDW->is_Up = powerwindow_powerwindow_control_IN_InitUp; localDW->temporalCounter_i1 = 0U; } else { if ( localB->map[ 2 ] ) { /* Transition: ':25' */ localDW->is_Logic = powerwindow_powerwindow_control_IN_Down_d; /* Entry 'Down': ':18' */ *rty_window_up = false; *rty_window_down = true; *rty_wake = true; localDW->is_Down = powerwindow_powerwindow_control_IN_InitDown; localDW->temporalCounter_i1 = 0U; } } break; default: /* During 'Up': ':17' */ if ( localB->map[ 2 ] ) { /* Transition: ':166' */ /* Exit Internal 'Up': ':17' */ localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_Logic = powerwindow_powerwindow_control_IN_Down_d; /* Entry 'Down': ':18' */ *rty_window_up = false; *rty_window_down = true; *rty_wake = true; localDW->is_Down = powerwindow_powerwindow_control_IN_Down; } else { switch ( localDW->is_Up ) { case powerwindow_powerwindow_control_IN_AutoUp: /* During 'AutoUp': ':108' */ break; case powerwindow_powerwindow_control_IN_InitUp: /* During 'InitUp': ':106' */ if ( localDW->temporalCounter_i1 >= 20 ) { /* Transition: ':115' */ if ( localB->map[ 0 ] ) { /* Transition: ':118' */ localDW->is_Up = powerwindow_powerwindow_control_IN_AutoUp; } else { if ( localB->map[ 1 ] ) { /* Transition: ':117' */ localDW->is_Up = powerwindow_powerwindow_control_IN_Up; } } } break; default: /* During 'Up': ':107' */ if ( localB->map[ 0 ] ) { /* Transition: ':23' */ localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; /* Entry 'Neutral': ':16' */ *rty_window_up = false; *rty_window_down = false; *rty_wake = false; } break; } } break; } /* During 'Sensing': ':96' */ switch ( localDW->is_Sensing ) { case powerwindow_powerwindow_control_IN_SenseEnd: /* During 'SenseEnd': ':147' */ if ( ( localB->LogicalOperator == 0 ) && ( *rty_window_up == 1 ) ) { /* Transition: ':173' */ localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; localDW->temporalCounter_i2 = 0U; /* Entry 'Start': ':170' */ *rty_overcurrent = false; *rty_pinch = false; } else *rty_overcurrent = ( localB->RateTransition1 > 184 ); break; case powerwindow_powerwindow_contr_IN_SensePinch: /* During 'SensePinch': ':148' */ if ( ( localB->LogicalOperator == 1 ) || ( *rty_window_down == 1 ) ) { /* Transition: ':150' */ localDW->is_Sensing = powerwindow_powerwindow_control_IN_SenseEnd; } else *rty_pinch = ( localB->RateTransition1 > 92 ); break; default: /* During 'Start': ':170' */ if ( localDW->temporalCounter_i2 >= 6 ) { /* Transition: ':171' */ localDW->is_Sensing = powerwindow_powerwindow_contr_IN_SensePinch; } break; } } break; } } } /* Initial conditions for referenced model: 'powerwindow_powerwindow_control' */ void powerwindow_powerwindow_control_Init( powerwindow_boolean_T *rty_window_up, powerwindow_boolean_T *rty_window_down, powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T * rty_wake, powerwindow_rtDW_PowerWindow_control *localDW ) { /* InitializeConditions for Chart: '/stateflow control model' */ localDW->is_active_Logic = 0U; localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->temporalCounter_i1 = 0U; localDW->is_active_Sensing = 0U; localDW->is_Sensing = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; localDW->temporalCounter_i2 = 0U; localDW->is_active_c2_PowerWindow_contro = 0U; localDW->is_c2_PowerWindow_control = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; *rty_window_up = false; *rty_window_down = false; *rty_overcurrent = false; *rty_pinch = false; *rty_wake = false; } /* Start for referenced model: 'powerwindow_powerwindow_control' */ void powerwindow_powerwindow_control_Start( powerwindow_rtDW_PowerWindow_control *localDW ) { /* Start for DiscretePulseGenerator: '/period of 50ms' */ localDW->clockTickCounter = 0L; } /* Output and update for referenced model: 'powerwindow_powerwindow_control' */ void powerwindow_powerwindow_control_main( const powerwindow_boolean_T *rtu_up, const powerwindow_boolean_T *rtu_down, const powerwindow_boolean_T *rtu_endofdetectionrange, const powerwindow_uint8_T *rtu_currentsense, powerwindow_boolean_T *rty_window_up, powerwindow_boolean_T *rty_window_down, powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T *rty_wake, powerwindow_rtB_PowerWindow_control *localB, powerwindow_rtDW_PowerWindow_control *localDW, powerwindow_rtZCE_PowerWindow_control *localZCE ) { powerwindow_int16_T rowIdx; powerwindow_int16_T rtb_periodof50ms; /* DiscretePulseGenerator: '/period of 50ms' */ rtb_periodof50ms = ( localDW->clockTickCounter < 5L ) && ( localDW->clockTickCounter >= 0L ) ? 1 : 0; if ( localDW->clockTickCounter >= 9L ) localDW->clockTickCounter = 0L; else localDW->clockTickCounter++; /* End of DiscretePulseGenerator: '/period of 50ms' */ /* Logic: '/Logical Operator' */ localB->LogicalOperator = !*rtu_endofdetectionrange; /* RateTransition: '/Rate Transition1' */ localB->RateTransition1 = *rtu_currentsense; /* CombinatorialLogic: '/map' */ rowIdx = ( powerwindow_int16_T )( ( ( powerwindow_uint16_T ) * rtu_up << 1 ) + *rtu_down ); localB->map[ 0U ] = rtCP_map_table[ ( powerwindow_uint16_T )rowIdx ]; localB->map[ 1U ] = rtCP_map_table[ rowIdx + 4U ]; localB->map[ 2U ] = rtCP_map_table[ rowIdx + 8U ]; /* Chart: '/stateflow control model' incorporates: TriggerPort: '/ticks' */ /* DataTypeConversion: '/Data Type Conversion' */ if ( ( ( rtb_periodof50ms != 0 ) != ( localZCE->stateflowcontrolmodel_Trig_ZCE == powerwindow_POS_ZCSIG ) ) && ( localZCE->stateflowcontrolmodel_Trig_ZCE != powerwindow_UNINITIALIZED_ZCSIG ) ) { /* Gateway: PW_PSG/PWExternalClock/stateflow control model */ if ( localDW->temporalCounter_i1 < 63U ) localDW->temporalCounter_i1++; if ( localDW->temporalCounter_i2 < 7U ) localDW->temporalCounter_i2++; powerwindow_powerwindow_con_broadcast_ticks( rty_window_up, rty_window_down, rty_overcurrent, rty_pinch, rty_wake, localB, localDW ); } localZCE->stateflowcontrolmodel_Trig_ZCE = ( powerwindow_uint8_T )( rtb_periodof50ms != 0 ? ( powerwindow_int16_T )powerwindow_POS_ZCSIG : ( powerwindow_int16_T ) powerwindow_ZERO_ZCSIG ); /* End of DataTypeConversion: '/Data Type Conversion' */ } /* Model initialize function */ void powerwindow_powerwindow_control_initialize( const powerwindow_char_T **rt_errorStatus, powerwindow_RT_MODEL_PowerWindow_control *const PowerWindow_control_M, powerwindow_rtB_PowerWindow_control *localB, powerwindow_rtDW_PowerWindow_control *localDW, powerwindow_rtZCE_PowerWindow_control *localZCE ) { /* Registration code */ /* initialize error status */ powerwindow_powerwindow_control_rtmSetErrorStatusPointer( PowerWindow_control_M, rt_errorStatus ); /* block I/O */ ( void ) wcclib_memset( ( ( void * ) localB ), 0, sizeof( powerwindow_rtB_PowerWindow_control ) ); /* states (dwork) */ ( void ) wcclib_memset( ( void * )localDW, 0, sizeof( powerwindow_rtDW_PowerWindow_control ) ); localZCE->stateflowcontrolmodel_Trig_ZCE = powerwindow_UNINITIALIZED_ZCSIG; } /* File trailer for generated code. [ EOF ] */