/* This program is part of the TACLeBench benchmark suite. Version V 1.x Name: powerwindow_debounce.c Author: CoSys-Lab, University of Antwerp Function: powerwindow_debounce_main is used to powerwindow_debounce_main the push-down button of the power window. In order to input a manual switch signal into a digital circuit, debouncing is necessary so that a single press does not appear like multiple presses. Without debouncing, pressing the button once may cause unpredictable results. powerwindow_debounce_main.c defines all the functions that will be used in debounce_PSG_Front which is a part of the Power window. Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_debounce.c Changes: a brief summary of major functional changes and formatting) License: GNU General Public License */ #include "wcclib.h" #include "powerwindow_HeaderFiles/powerwindow_debounce.h" #include "powerwindow_HeaderFiles/powerwindow_debounce_private.h" /* Named constants for Chart: '/Chart' */ #define debounce_IN_debounce ((powerwindow_uint8_T)1U) #define debounce_IN_NO_ACTIVE_CHILD ((powerwindow_uint8_T)0U) #define debounce_IN_Off ((powerwindow_uint8_T)2U) #define debounce_IN_Off_h ((powerwindow_uint8_T)1U) #define debounce_IN_On ((powerwindow_uint8_T)3U) #define debounce_IN_On_b ((powerwindow_uint8_T)2U) /* Forward declaration of functions */ void powerwindow_debounce_Init(powerwindow_rtB_debounce_T *, powerwindow_rtDW_debounce_T *); void powerwindow_debounce_Start(powerwindow_rtDW_debounce_T *); void powerwindow_debounce_initialize(const powerwindow_char_T **, powerwindow_RT_MODEL_debounce_T * const, powerwindow_rtB_debounce_T *, powerwindow_rtDW_debounce_T *, powerwindow_rtZCE_debounce_T *); void powerwindow_debounce_main(const powerwindow_boolean_T *, powerwindow_boolean_T *, powerwindow_rtB_debounce_T *, powerwindow_rtDW_debounce_T *, powerwindow_rtZCE_debounce_T *); /* Initialization- and return-value-related functions */ /* Initial conditions for referenced model: 'powerwindow_debounce_main' */ void powerwindow_debounce_Init(powerwindow_rtB_debounce_T *localB, powerwindow_rtDW_debounce_T *localDW) { /* InitializeConditions for Chart: '/Chart' */ localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; localDW->temporalCounter_i1 = 0U; localDW->is_active_c3_debounce = 0U; localDW->is_c3_debounce = debounce_IN_NO_ACTIVE_CHILD; localB->Q = false; } /* Start for referenced model: 'powerwindow_debounce_main' */ void powerwindow_debounce_Start(powerwindow_rtDW_debounce_T *localDW) { /* Start for DiscretePulseGenerator: '/period of 10ms' */ localDW->clockTickCounter = 0L; } /* Model initialize function */ void powerwindow_debounce_initialize(const powerwindow_char_T **rt_errorStatus, powerwindow_RT_MODEL_debounce_T * const debounce_M, powerwindow_rtB_debounce_T *localB, powerwindow_rtDW_debounce_T *localDW, powerwindow_rtZCE_debounce_T *localZCE) { /* Registration code */ /* initialize error status */ powerwindow_rtmSetErrorStatusPointer(debounce_M, rt_errorStatus); /* block I/O */ (void) memset(((void *) localB), 0, sizeof(powerwindow_rtB_debounce_T)); /* states (dwork) */ (void) memset((void *)localDW, 0, sizeof(powerwindow_rtDW_debounce_T)); localZCE->Chart_Trig_ZCE = powerwindow_POS_ZCSIG; } /* Algorithm core functions */ /* Output and update for referenced model: 'powerwindow_debounce_main' */ void powerwindow_debounce_main(const powerwindow_boolean_T *rtu_Switch, powerwindow_boolean_T *rty_debounced_Switch, powerwindow_rtB_debounce_T *localB, powerwindow_rtDW_debounce_T *localDW, powerwindow_rtZCE_debounce_T *localZCE) { powerwindow_int16_T rtb_periodof10ms; /* DiscretePulseGenerator: '/period of 10ms' */ rtb_periodof10ms = (localDW->clockTickCounter < 1L) && (localDW->clockTickCounter >= 0L) ? 1 : 0; if (localDW->clockTickCounter >= 1L) { localDW->clockTickCounter = 0L; } else { localDW->clockTickCounter++; } /* End of DiscretePulseGenerator: '/period of 10ms' */ /* Chart: '/Chart' incorporates: * TriggerPort: '/ticks' */ /* DataTypeConversion: '/Data Type Conversion' */ if ((rtb_periodof10ms != 0) && (localZCE->Chart_Trig_ZCE != powerwindow_POS_ZCSIG)) { /* Gateway: Chart */ if (localDW->temporalCounter_i1 < 7U) { localDW->temporalCounter_i1++; } /* Event: ':13' */ /* During: Chart */ if (localDW->is_active_c3_debounce == 0U) { /* Entry: Chart */ localDW->is_active_c3_debounce = 1U; /* Entry Internal: Chart */ /* Transition: ':9' */ localDW->is_c3_debounce = debounce_IN_Off; /* Entry 'Off': ':1' */ localB->Q = true; } else { switch (localDW->is_c3_debounce) { case debounce_IN_debounce: /* During 'powerwindow_debounce_main': ':6' */ if (localDW->is_debounce == debounce_IN_Off_h) { /* During 'Off': ':8' */ if ((powerwindow_int16_T)*rtu_Switch < 1) { /* Transition: ':12' */ localDW->is_debounce = debounce_IN_On_b; localDW->temporalCounter_i1 = 0U; } else { if (localDW->temporalCounter_i1 >= 3) { /* Transition: ':16' */ localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; localDW->is_c3_debounce = debounce_IN_Off; /* Entry 'Off': ':1' */ localB->Q = true; } } } else { /* During 'On': ':7' */ if ((powerwindow_int16_T)*rtu_Switch > 0) { /* Transition: ':11' */ localDW->is_debounce = debounce_IN_Off_h; localDW->temporalCounter_i1 = 0U; } else { if (localDW->temporalCounter_i1 >= 3) { /* Transition: ':14' */ localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; localDW->is_c3_debounce = debounce_IN_On; /* Entry 'On': ':5' */ localB->Q = false; } } } break; case debounce_IN_Off: /* During 'Off': ':1' */ if ((powerwindow_int16_T)*rtu_Switch < 1) { /* Transition: ':10' */ localDW->is_c3_debounce = debounce_IN_debounce; localDW->is_debounce = debounce_IN_On_b; localDW->temporalCounter_i1 = 0U; } break; default: /* During 'On': ':5' */ if ((powerwindow_int16_T)*rtu_Switch > 0) { /* Transition: ':15' */ localDW->is_c3_debounce = debounce_IN_debounce; localDW->is_debounce = debounce_IN_Off_h; localDW->temporalCounter_i1 = 0U; } break; } } } localZCE->Chart_Trig_ZCE = (powerwindow_uint8_T)(rtb_periodof10ms != 0 ? (powerwindow_int16_T) powerwindow_POS_ZCSIG : (powerwindow_int16_T)powerwindow_ZERO_ZCSIG); /* End of DataTypeConversion: '/Data Type Conversion' */ /* DataTypeConversion: '/Data Type Conversion2' */ *rty_debounced_Switch = localB->Q; } /* * File trailer for generated code. * * [EOF] */