Files
failnix/targets/wasm-tacle/app/powerwindow/powerwindow_powerwindow_control.c

555 lines
22 KiB
C

/*
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: '<S2>/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: '<S2>/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: '<S3>: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: '<S3>:102' */
localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_control_IN_System;
/* Entry Internal 'System': '<S3>:94' */
localDW->is_active_Logic = 1U;
/* Entry Internal 'Logic': '<S3>:95' */
/* Transition: '<S3>:82' */
localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral;
/* Chart: '<S2>/stateflow control model' incorporates:
TriggerPort: '<S3>/ticks'
*/
/* Entry 'Neutral': '<S3>:16' */
*rty_window_up = false;
*rty_window_down = false;
*rty_wake = false;
localDW->is_active_Sensing = 1U;
/* Entry Internal 'Sensing': '<S3>:96' */
/* Transition: '<S3>:153' */
localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start;
localDW->temporalCounter_i2 = 0U;
/* Chart: '<S2>/stateflow control model' incorporates:
TriggerPort: '<S3>/ticks'
*/
/* Entry 'Start': '<S3>:170' */
*rty_overcurrent = false;
*rty_pinch = false;
} else {
switch ( localDW->is_c2_PowerWindow_control ) {
case powerwindow_powerwindow_contr_IN_EndReached:
/* During 'EndReached': '<S3>:97' */
if ( localDW->temporalCounter_i1 >= 10 ) {
/* Transition: '<S3>:101' */
localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_control_IN_System;
/* Entry Internal 'System': '<S3>:94' */
localDW->is_active_Logic = 1U;
/* Entry Internal 'Logic': '<S3>:95' */
/* Transition: '<S3>:82' */
localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral;
/* Chart: '<S2>/stateflow control model' incorporates:
TriggerPort: '<S3>/ticks'
*/
/* Entry 'Neutral': '<S3>:16' */
*rty_window_up = false;
*rty_window_down = false;
*rty_wake = false;
localDW->is_active_Sensing = 1U;
/* Entry Internal 'Sensing': '<S3>:96' */
/* Transition: '<S3>:153' */
localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start;
localDW->temporalCounter_i2 = 0U;
/* Chart: '<S2>/stateflow control model' incorporates:
TriggerPort: '<S3>/ticks'
*/
/* Entry 'Start': '<S3>:170' */
*rty_overcurrent = false;
*rty_pinch = false;
}
break;
case powerwindow_powerwindow_control_IN_Pinch:
/* During 'Pinch': '<S3>:152' */
if ( localDW->temporalCounter_i1 >= 40 ) {
/* Transition: '<S3>:157' */
localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_control_IN_System;
/* Entry Internal 'System': '<S3>:94' */
localDW->is_active_Logic = 1U;
/* Entry Internal 'Logic': '<S3>:95' */
/* Transition: '<S3>:82' */
localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral;
/* Chart: '<S2>/stateflow control model' incorporates:
TriggerPort: '<S3>/ticks'
*/
/* Entry 'Neutral': '<S3>:16' */
*rty_window_up = false;
*rty_window_down = false;
*rty_wake = false;
localDW->is_active_Sensing = 1U;
/* Entry Internal 'Sensing': '<S3>:96' */
/* Transition: '<S3>:153' */
localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start;
localDW->temporalCounter_i2 = 0U;
/* Chart: '<S2>/stateflow control model' incorporates:
TriggerPort: '<S3>/ticks'
*/
/* Entry 'Start': '<S3>:170' */
*rty_overcurrent = false;
*rty_pinch = false;
}
break;
default:
/* Chart: '<S2>/stateflow control model' incorporates:
TriggerPort: '<S3>/ticks'
*/
/* During 'System': '<S3>:94' */
if ( *rty_pinch == 1 ) {
/* Transition: '<S3>:155' */
/* Exit Internal 'System': '<S3>:94' */
/* Exit Internal 'Sensing': '<S3>:96' */
localDW->is_Sensing = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD;
localDW->is_active_Sensing = 0U;
/* Exit Internal 'Logic': '<S3>:95' */
/* Exit Internal 'Down': '<S3>:18' */
localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD;
localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD;
/* Exit Internal 'Up': '<S3>: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': '<S3>:152' */
*rty_window_up = false;
*rty_window_down = true;
} else
if ( *rty_overcurrent == 1 ) {
/* Transition: '<S3>:100' */
/* Exit Internal 'System': '<S3>:94' */
/* Exit Internal 'Sensing': '<S3>:96' */
localDW->is_Sensing = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD;
localDW->is_active_Sensing = 0U;
/* Exit Internal 'Logic': '<S3>:95' */
/* Exit Internal 'Down': '<S3>:18' */
localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD;
localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD;
/* Exit Internal 'Up': '<S3>: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': '<S3>:97' */
*rty_window_up = false;
*rty_window_down = false;
} else {
/* During 'Logic': '<S3>:95' */
switch ( localDW->is_Logic ) {
case powerwindow_powerwindow_control_IN_Down_d:
/* During 'Down': '<S3>:18' */
if ( localB->map[ 1 ] ) {
/* Transition: '<S3>:169' */
/* Exit Internal 'Down': '<S3>:18' */
localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD;
localDW->is_Logic = powerwindow_powerwindow_control_IN_Up;
/* Entry 'Up': '<S3>: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': '<S3>:111' */
break;
case powerwindow_powerwindow_control_IN_Down:
/* During 'Down': '<S3>:110' */
if ( localB->map[ 0 ] ) {
/* Transition: '<S3>:26' */
localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD;
localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral;
/* Entry 'Neutral': '<S3>:16' */
*rty_window_up = false;
*rty_window_down = false;
*rty_wake = false;
}
break;
default:
/* During 'InitDown': '<S3>:109' */
if ( localDW->temporalCounter_i1 >= 20 ) {
/* Transition: '<S3>:119' */
if ( localB->map[ 0 ] ) {
/* Transition: '<S3>:120' */
localDW->is_Down = powerwindow_powerwindow_control_IN_AutoDown;
} else {
if ( localB->map[ 2 ] ) {
/* Transition: '<S3>:121' */
localDW->is_Down = powerwindow_powerwindow_control_IN_Down;
}
}
}
break;
}
}
break;
case powerwindow_powerwindow_control_IN_Neutral:
/* During 'Neutral': '<S3>:16' */
if ( localB->map[ 1 ] ) {
/* Transition: '<S3>:24' */
localDW->is_Logic = powerwindow_powerwindow_control_IN_Up;
/* Entry 'Up': '<S3>: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: '<S3>:25' */
localDW->is_Logic = powerwindow_powerwindow_control_IN_Down_d;
/* Entry 'Down': '<S3>: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': '<S3>:17' */
if ( localB->map[ 2 ] ) {
/* Transition: '<S3>:166' */
/* Exit Internal 'Up': '<S3>:17' */
localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD;
localDW->is_Logic = powerwindow_powerwindow_control_IN_Down_d;
/* Entry 'Down': '<S3>: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': '<S3>:108' */
break;
case powerwindow_powerwindow_control_IN_InitUp:
/* During 'InitUp': '<S3>:106' */
if ( localDW->temporalCounter_i1 >= 20 ) {
/* Transition: '<S3>:115' */
if ( localB->map[ 0 ] ) {
/* Transition: '<S3>:118' */
localDW->is_Up = powerwindow_powerwindow_control_IN_AutoUp;
} else {
if ( localB->map[ 1 ] ) {
/* Transition: '<S3>:117' */
localDW->is_Up = powerwindow_powerwindow_control_IN_Up;
}
}
}
break;
default:
/* During 'Up': '<S3>:107' */
if ( localB->map[ 0 ] ) {
/* Transition: '<S3>:23' */
localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD;
localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral;
/* Entry 'Neutral': '<S3>:16' */
*rty_window_up = false;
*rty_window_down = false;
*rty_wake = false;
}
break;
}
}
break;
}
/* During 'Sensing': '<S3>:96' */
switch ( localDW->is_Sensing ) {
case powerwindow_powerwindow_control_IN_SenseEnd:
/* During 'SenseEnd': '<S3>:147' */
if ( ( localB->LogicalOperator == 0 ) && ( *rty_window_up == 1 ) ) {
/* Transition: '<S3>:173' */
localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start;
localDW->temporalCounter_i2 = 0U;
/* Entry 'Start': '<S3>:170' */
*rty_overcurrent = false;
*rty_pinch = false;
} else
*rty_overcurrent = ( localB->RateTransition1 > 184 );
break;
case powerwindow_powerwindow_contr_IN_SensePinch:
/* During 'SensePinch': '<S3>:148' */
if ( ( localB->LogicalOperator == 1 ) || ( *rty_window_down == 1 ) ) {
/* Transition: '<S3>:150' */
localDW->is_Sensing = powerwindow_powerwindow_control_IN_SenseEnd;
} else
*rty_pinch = ( localB->RateTransition1 > 92 );
break;
default:
/* During 'Start': '<S3>:170' */
if ( localDW->temporalCounter_i2 >= 6 ) {
/* Transition: '<S3>: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: '<S2>/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: '<S2>/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: '<S2>/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: '<S2>/period of 50ms' */
/* Logic: '<S2>/Logical Operator' */
localB->LogicalOperator = !*rtu_endofdetectionrange;
/* RateTransition: '<S2>/Rate Transition1' */
localB->RateTransition1 = *rtu_currentsense;
/* CombinatorialLogic: '<S2>/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: '<S2>/stateflow control model' incorporates:
TriggerPort: '<S3>/ticks'
*/
/* DataTypeConversion: '<S2>/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: '<S2>/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 ]
*/