From 4d56091f3f22165080f52d32d4a25f02d951aab6 Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Sat, 15 Feb 2014 17:47:54 +0100 Subject: [PATCH] Extend IRC Input block to allow counter reset at startup. Signed-off-by: Pavel Pisa --- sfIRCInput.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/sfIRCInput.c b/sfIRCInput.c index 1cd4367..6779455 100644 --- a/sfIRCInput.c +++ b/sfIRCInput.c @@ -24,8 +24,9 @@ #define PRM_COUNTER_GATING(S) (mxGetScalar(ssGetSFcnParam(S, 3))) #define PRM_RESET_CONTROL(S) (mxGetScalar(ssGetSFcnParam(S, 4))) #define PRM_DIGITAL_FILTER(S) (mxGetScalar(ssGetSFcnParam(S, 5))) +#define PRM_RESET_AT_STARTUP(S) (mxGetScalar(ssGetSFcnParam(S, 6))) -#define PRM_COUNT 6 +#define PRM_COUNT 7 #define IWORK_IDX_CHANNEL 0 #define IWORK_IDX_IRCCTRL 1 @@ -114,6 +115,8 @@ static void mdlCheckParameters(SimStruct *S) if ((PRM_DIGITAL_FILTER(S) < 0) || PRM_DIGITAL_FILTER(S) > __mfld2val(IRCCTRL_IRC0FILTER_mask, IRCCTRL_IRC0FILTER_mask)) ssSetErrorStatus(S, "Digital Filter out of valid range"); + if ((PRM_RESET_AT_STARTUP(S) != 0) && (PRM_RESET_AT_STARTUP(S) != 1)) + ssSetErrorStatus(S, "Reset at startup can be only 0 or 1"); } #endif /* MDL_CHECK_PARAMETERS */ @@ -213,9 +216,27 @@ static void mdlInitializeSampleTimes(SimStruct *S) * configured to reset states, it will be call when the enabled subsystem * restarts execution to reset the states. */ - static void mdlInitializeConditions(SimStruct *S) - { - } +static void mdlInitializeConditions(SimStruct *S) +{ + int_T shift; + int_T mask; + int_T reset_mode; + int_T reset_mode_save; + + if (mf624_check(S) != 0) + return; + + if (PRM_RESET_AT_STARTUP(S)) { + shift = IWORK_CHANNEL(S) * IRCCTRL_CHANNEL_SHIFT; + + mask = IRCCTRL_IRC0RESET_mask << shift; + reset_mode = __val2mfld(IRCCTRL_IRC0RESET_mask, IRCCTRL_RESET_ALWAYS) << shift; + + reset_mode_save = IRC_mode_change(mfst, 0, 0); + IRC_mode_change(mfst, mask, reset_mode); + IRC_mode_change(mfst, mask, reset_mode_save & mask); + } +} #endif /* MDL_INITIALIZE_CONDITIONS */ @@ -261,6 +282,8 @@ static void mdlStart(SimStruct *S) shift = IWORK_CHANNEL(S) * IRCCTRL_CHANNEL_SHIFT; IRC_mode_change(mfst, mask << shift, IWORK_IRCCTRL(S) << shift); + + mdlInitializeConditions(S); } #endif /* MDL_START */ -- 2.39.2