Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -r79d12d6910a03b6fe08161d0cd3c706e7d359fff -r87380906a35227f899a3bee2f6574983ea5131cf --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 79d12d6910a03b6fe08161d0cd3c706e7d359fff) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 87380906a35227f899a3bee2f6574983ea5131cf) @@ -28,9 +28,11 @@ #include "Reservoirs.h" #include "ROPump.h" #include "SystemComm.h" +#include "SystemCommMessages.h" #include "TaskGeneral.h" #include "TemperatureSensors.h" #include "Timers.h" +#include "Utilities.h" #include "Valves.h" /** @@ -62,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 + @@ -78,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 *************************************************************************/ @@ -101,6 +109,7 @@ drainEmptyTareTimerCtr = 0; rinseConcentrateLinesTimerCtr = 0; dialysateDrainStartTime = 0; + dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; } /*********************************************************************//** @@ -196,6 +205,8 @@ break; } + publishDrainModeData(); + return drainState; } @@ -398,4 +409,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; +} + /**@}*/