Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -r45ceca1780ca1256252828ead6bf6112303ae79f -r1e62db4e4c11657a30823872d3a523814c9c7419 --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 45ceca1780ca1256252828ead6bf6112303ae79f) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 1e62db4e4c11657a30823872d3a523814c9c7419) @@ -7,8 +7,8 @@ * * @file ModeDrain.c * -* @author (last) Dara Navaei -* @date (last) 20-Jul-2023 +* @author (last) Michael Garthwaite +* @date (last) 09-Aug-2023 * * @author (original) Leonardo Baloa * @date (original) 20-Dec-2019 @@ -32,6 +32,7 @@ #include "TaskGeneral.h" #include "TemperatureSensors.h" #include "Timers.h" +#include "Utilities.h" #include "Valves.h" /** @@ -63,6 +64,8 @@ #define CONCENTRATE_BOTTLE_RESERVOIOR_FILLS 3 ///< Concentrate bottle reservoir vlls. #define BICARB_PERCENT_FILL 0.03514F ///< Bicarb volume percentage of reservoir volume. #define ACID_PERCENT_FILL 0.02222F ///< Acid volume percentage of reservoir volume. +#define DATA_PUBLISH_COUNTER_START_COUNT 70 ///< Data publish counter start count. +#define DRAIN_MODE_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the drain mode data is published on the CAN bus. ///< Concentrate bottle acid low volume in mL. static const F32 CONCENTRATE_BOTTLE_ACID_LOW_VOLUME_ML = ( CONCENTRATE_BOTTLE_PRIMING_VOL_ML + @@ -79,18 +82,22 @@ static BOOL rinseConcentrateLines; ///< Flag indicates to rinse concentrate lines. static U32 rinseConcentrateLinesTimerCtr; ///< Timer counter for rinsing concentrate lines. static U32 dialysateDrainStartTime; ///< Dialysate drain start time. - +static U32 dataPublishCounter; ///< Used to schedule drain mode data publication to CAN bus. +static OVERRIDE_U32_T drainModeDataPublishInterval = { DRAIN_MODE_DATA_PUB_INTERVAL, + DRAIN_MODE_DATA_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms) at which to publish drain mode data to CAN bus. // ********** private function prototypes ********** static DG_DRAIN_STATE_T handleDrainStateStart( void ); static DG_DRAIN_STATE_T handleDrainStateDrain( void ); static DG_DRAIN_STATE_T handleDrainStateTare( void ); static DG_DRAIN_STATE_T handleRinseState( void ); +static void publishDrainModeData( void ); /*********************************************************************//** * @brief * The initDrainMode function initializes the drain mode module. * @details Inputs: none * @details Outputs: drainState, drainEmptyTareTimerCtr, dialysateDrainStartTime, + * dataPublishCounter * rinseConcentrateLinesTimerCtr * @return none *************************************************************************/ @@ -102,6 +109,7 @@ drainEmptyTareTimerCtr = 0; rinseConcentrateLinesTimerCtr = 0; dialysateDrainStartTime = 0; + dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; } /*********************************************************************//** @@ -199,6 +207,8 @@ break; } + publishDrainModeData(); + return drainState; } @@ -405,4 +415,81 @@ return result; } +/*********************************************************************//** + * @brief + * The publishDrainModeData function publishes fill mode data + * at the set interval. + * @details Inputs: dataPublishCounter, drainModeDataPublishInterval + * @details Outputs: drainModeData + * @return none + *************************************************************************/ +static void publishDrainModeData( void ) +{ + // publish Drain mode data on interval + if ( ++dataPublishCounter >= getU32OverrideValue( &drainModeDataPublishInterval ) ) + { + DG_DRAIN_MODE_DATA_T drainModeData; + + drainModeData.drainModeState = drainState; + drainModeData.badFillSignal = getCurrentBadFillSignal(); + drainModeData.badFillState = getCurrentGenIdleBadFillState(); + + broadcastData( MSG_ID_DG_DRAIN_MODE_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&drainModeData, sizeof( DG_DRAIN_MODE_DATA_T ) ); + // Populate the data structure for publication + dataPublishCounter = 0; + } +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetDrainModeDataPublishIntervalOverride function overrides the + * drain mode data publish interval. + * @details Inputs: drainModeDataPublishInterval + * @details Outputs: drainModeDataPublishInterval + * @param: value override drain mode data publish interval with (in ms) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetDrainModeDataPublishIntervalOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = value / TASK_GENERAL_INTERVAL; + drainModeDataPublishInterval.ovData = intvl; + drainModeDataPublishInterval.override = OVERRIDE_KEY; + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetDrainModeDataPublishIntervalOverride function resets the + * override of the drain mode data publish interval. + * @details Inputs: drainModeDataPublishInterval + * @details Outputs: drainModeDataPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetDrainModeDataPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + drainModeDataPublishInterval.override = OVERRIDE_RESET; + drainModeDataPublishInterval.ovData = drainModeDataPublishInterval.ovInitData; + result = TRUE; + } + + return result; +} + /**@}*/