Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r413eacfaf3a6a960bdfe1c0bbe5c2787520a726d -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 413eacfaf3a6a960bdfe1c0bbe5c2787520a726d) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -875,9 +875,9 @@ BOOL isSmallPriOut = ( fabs( smallPriExpectedVoltage - smallPriVoltage ) > HEATERS_VOLTAGE_TOLERANCE_V ? TRUE : FALSE ); BOOL isTrimmerOut = ( fabs( trimmerExpectedVoltage - trimmerVoltage ) > HEATERS_VOLTAGE_TOLERANCE_V ? TRUE : FALSE ); - checkPersistentAlarm( ALARM_ID_DG_MAIN_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, isMainPriOut, mainPriDC, HEATERS_VOLTAGE_TOLERANCE_V ); - checkPersistentAlarm( ALARM_ID_DG_SMALL_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, isSmallPriOut, smallPriDC, HEATERS_VOLTAGE_TOLERANCE_V ); - checkPersistentAlarm( ALARM_ID_DG_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE, isTrimmerOut, trimmerDC, HEATERS_VOLTAGE_TOLERANCE_V ); + //checkPersistentAlarm( ALARM_ID_DG_MAIN_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, isMainPriOut, mainPriDC, HEATERS_VOLTAGE_TOLERANCE_V ); + //checkPersistentAlarm( ALARM_ID_DG_SMALL_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, isSmallPriOut, smallPriDC, HEATERS_VOLTAGE_TOLERANCE_V ); + //checkPersistentAlarm( ALARM_ID_DG_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE, isTrimmerOut, trimmerDC, HEATERS_VOLTAGE_TOLERANCE_V ); } Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -r4b667a7ec18a6196849bbeefdfb23d25d1d58c5a -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 4b667a7ec18a6196849bbeefdfb23d25d1d58c5a) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -76,7 +76,7 @@ static OVERRIDE_U32_T loadCellDataPublishInterval = { LOAD_CELL_REPORT_PERIOD, LOAD_CELL_REPORT_PERIOD, 0, 0 }; ///< Broadcast load cell data publish interval. static LOADCELL_T loadcells[ NUM_OF_LOAD_CELLS ]; ///< Load cell data structures. -static U32 loadCellFilterTimerCount = 0; ///< Load cell filtering timer count. +static U32 loadCellFilterTimerCount; ///< Load cell filtering timer count. static U32 loadCellDataPublicationTimerCounter; ///< Load cell data publication timer counter to CAN bus. static U32 smallReadingsIdx; ///< Index for next sample in load cell small rolling average sample array. @@ -250,6 +250,11 @@ loadCellData.loadCellB1inGram = getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); loadCellData.loadCellB2inGram = getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_2_BACKUP ); + loadCellData.loadCellA1Raw = loadcells[ LOAD_CELL_RESERVOIR_1_PRIMARY ].rawReading; + loadCellData.loadCellA2Raw = loadcells[ LOAD_CELL_RESERVOIR_1_BACKUP ].rawReading; + loadCellData.loadCellB1Raw = loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].rawReading; + loadCellData.loadCellB2Raw = loadcells[ LOAD_CELL_RESERVOIR_2_BACKUP ].rawReading; + // Broadcast small filtered load cell data broadcastData( MSG_ID_LOAD_CELL_READINGS, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&loadCellData, sizeof( LOAD_CELL_DATA_T ) ); Index: firmware/App/Controllers/LoadCell.h =================================================================== diff -u -ra9315539f527b92523b1598ff91e47db4d71dae2 -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Controllers/LoadCell.h (.../LoadCell.h) (revision a9315539f527b92523b1598ff91e47db4d71dae2) +++ firmware/App/Controllers/LoadCell.h (.../LoadCell.h) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -39,6 +39,10 @@ F32 loadCellA2inGram; ///< Loadcell A2 measurement in gram F32 loadCellB1inGram; ///< Loadcell B1 measurement in gram F32 loadCellB2inGram; ///< Loadcell B2 measurement in gram + F32 loadCellA1Raw; ///< TODO temporary variables? + F32 loadCellA2Raw; ///< TODO temporary variables? + F32 loadCellB1Raw; ///< TODO temporary variables? + F32 loadCellB2Raw; ///< TODO temporary variables? } LOAD_CELL_DATA_T; #pragma pack(pop) Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r334cbb3b55e65147523b3cc952c8ada41192441f -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 334cbb3b55e65147523b3cc952c8ada41192441f) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -601,6 +601,18 @@ /*********************************************************************//** * @brief + * The resetROGenerateVolumeL function resets the RO generated volume in liters. + * @details Inputs: none + * @details Outputs: roVolumeL + * @return none + *************************************************************************/ +void resetROGenerateVolumeL( void ) +{ + roVolumeL = 0.0; +} + +/*********************************************************************//** + * @brief * The handleROPumpOffState function handles the RO pump off state of the * controller state machine. * @details Inputs: roPumpControlMode, roPumpPWMDutyCyclePctSet, Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -ra89d6b091874136d75a9bfbdbbc1ff00f42467b3 -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision a89d6b091874136d75a9bfbdbbc1ff00f42467b3) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -68,6 +68,7 @@ F32 getTargetROPumpPressure( void ); F32 getROGeneratedVolumeL( void ); +void resetROGenerateVolumeL( void ); BOOL testSetROPumpDataPublishIntervalOverride( U32 value ); BOOL testResetROPumpDataPublishIntervalOverride( void ); Index: firmware/App/Controllers/Voltages.c =================================================================== diff -u -rb49fcf5c295e49f7133ea07398c54b083bf65d49 -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Controllers/Voltages.c (.../Voltages.c) (revision b49fcf5c295e49f7133ea07398c54b083bf65d49) +++ firmware/App/Controllers/Voltages.c (.../Voltages.c) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -34,7 +34,7 @@ #define VOLTAGES_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the voltages data is published on the CAN bus. #define VOLTAGES_ALARM_PERSISTENCE ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Alarm persistence period for voltage monitor alarms. #define DATA_PUBLISH_COUNTER_START_COUNT 1 ///< Data publish counter start count. -#define SIZE_OF_ROLLING_AVG 16 ///< Number of DG FPGA ADC samples in rolling average calculations for each channel. +/*#define SIZE_OF_ROLLING_AVG 16 ///< Number of DG FPGA ADC samples in rolling average calculations for each channel. #define ROLLING_AVG_SHIFT_DIVIDER 4 ///< Rolling average shift divider for DG FPGA ADC readings. #define FPGA_ADC_BITS_PER_CHANNEL 12 ///< DG FPGA ADC bits per channel. #define FPGA_ADC_FULL_SCALE_BITS ((1<> ROLLING_AVG_SHIFT_DIVIDER; adcReadingsIdx[ ch ] = INC_WRAP( adcReadingsIdx[ ch ], 0, SIZE_OF_ROLLING_AVG - 1 ); fpgaVoltage[ch] = (F32)adcReadingsAvgs[ ch ] * FPGA_ADC_READ_TO_UNITS[ ch ]; - } + }*/ } /*********************************************************************//** Index: firmware/App/Modes/ModeChemicalDisinfect.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -1301,7 +1301,7 @@ // Set the disinfect flags setDisinfectStatus( TRUE ); - setLastDisinfectDate( getRTCTimestamp() ); + setLastDisinfectDate( USAGE_INFO_CHEMICAL_DISINFECT, getRTCTimestamp() ); break; } Index: firmware/App/Modes/ModeGenIdle.c =================================================================== diff -u -raa2517012c7b26de27143c135a5f284ca6721fa1 -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision aa2517012c7b26de27143c135a5f284ca6721fa1) +++ firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -61,10 +61,9 @@ static U32 hdLostCommStartTime_ms; ///< Lost communication with HD start time in ms. static U32 targetFillVolumeML; ///< Save the target fill volume before calling startFillCmd(). static BOOL handleBadFillFlag; ///< Internal signal flag to handle bad fill. -static HD_OP_MODE_T hdMode = MODE_STAN; ///< HD operations mode. -static OVERRIDE_U32_T badFillSubstatesPublishInterval = { BAD_FILL_SUBSTATES_PUB_INTERVAL, ///< Interval (in ms) at which to publish bad fill sub-states to CAN bus. +static OVERRIDE_U32_T badFillSubstatesPublishInterval = { BAD_FILL_SUBSTATES_PUB_INTERVAL, BAD_FILL_SUBSTATES_PUB_INTERVAL, - 0, 0 }; + 0, 0 }; ///< Interval (in ms) at which to publish bad fill sub-states to CAN bus. // ********** private function prototypes ********** @@ -89,8 +88,8 @@ *************************************************************************/ void initGenIdleMode( void ) { - genIdleState = DG_GEN_IDLE_MODE_STATE_START; - hdLostCommStartTime_ms = 0; + genIdleState = DG_GEN_IDLE_MODE_STATE_START; + hdLostCommStartTime_ms = 0; } /*********************************************************************//** @@ -105,12 +104,6 @@ // Re-initialize each time we transition to generation idle mode initGenIdleMode(); - // TODO should we write to RAM that disinfect has been voided all the time during the treatment? - if ( MODE_TREA == hdMode ) - { - setDisinfectStatus( FALSE ); - } - // Set initial actuator states setValveState( VSP, VALVE_STATE_CLOSED ); setValveState( VPI, VALVE_STATE_OPEN ); @@ -172,18 +165,6 @@ /*********************************************************************//** * @brief - * The setHDOperationMode function sets HD operation mode value. - * @details Inputs: none - * @details Outputs: hdMode - * @return none - *************************************************************************/ -void setHDOperationMode( U32 mode ) -{ - hdMode = (HD_OP_MODE_T)mode; -} - -/*********************************************************************//** - * @brief * The setBadAvgConductivityDetectedFlag function sets a flag to indicate * that bad average conductivity is detected. * @details Inputs: none Index: firmware/App/Modes/ModeGenIdle.h =================================================================== diff -u -r22176ce95e49213c48454f34ddf5d29b8109f2cb -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Modes/ModeGenIdle.h (.../ModeGenIdle.h) (revision 22176ce95e49213c48454f34ddf5d29b8109f2cb) +++ firmware/App/Modes/ModeGenIdle.h (.../ModeGenIdle.h) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -48,8 +48,6 @@ BOOL requestDGStop( void ); // HD requests DG stop (go back to standby mode) -void setHDOperationMode( U32 mode ); - BOOL testSetBadFillSubstatesPublishIntervalOverride( U32 value ); BOOL testResetBadFillSubstatesPublishIntervalOverride( void ); Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -1227,7 +1227,7 @@ // Set the disinfect flags setDisinfectStatus( TRUE ); - setLastDisinfectDate( getRTCTimestamp() ); + setLastDisinfectDate( USAGE_INFO_HEAT_DISINFECT, getRTCTimestamp() ); break; case HEAT_DISINFECT_HEAT_UP_IN_PROGRESS: Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -182,29 +182,35 @@ // if HD requests water sample, go to water sample state else if ( TRUE == flushFilterRequest ) { - flushFilterRequest = FALSE; + flushFilterRequest = FALSE; filterFlushStartTime = getMSTimerCount(); + setValveState( VPI, VALVE_STATE_OPEN ); + state = DG_STANDBY_MODE_STATE_FLUSH_FILTER; } else if ( TRUE == pendingStartDGRequest ) { pendingStartDGRequest = FALSE; + requestNewOperationMode( DG_MODE_GENE ); } else if ( TRUE == pendingStartDGFlushRequest ) { pendingStartDGFlushRequest = FALSE; + requestNewOperationMode( DG_MODE_FLUS ); } else if ( TRUE == pendingStartDGHeatDisinfectRequest ) { pendingStartDGHeatDisinfectRequest = FALSE; + requestNewOperationMode( DG_MODE_HEAT ); } else if ( TRUE == pendingStartDGChemicalDisinfectRequest ) { pendingStartDGChemicalDisinfectRequest = FALSE; + requestNewOperationMode( DG_MODE_CHEM ); } @@ -382,8 +388,11 @@ if ( DG_STANDBY_MODE_STATE_IDLE == standbyState ) { - result = TRUE; + result = TRUE; pendingStartDGRequest = TRUE; + + // Reset the volume accumulator for the next run + resetROGenerateVolumeL(); } return result; @@ -401,9 +410,10 @@ BOOL result = FALSE; // If DG is in standby mode or in the solo mode and the standby mode is in Idle state, request DG flush - if ( ( DG_MODE_STAN == getCurrentOperationMode() && DG_STANDBY_MODE_STATE_IDLE == standbyState ) || ( DG_MODE_SOLO == getCurrentOperationMode() ) ) + if ( ( DG_MODE_STAN == getCurrentOperationMode() ) && ( DG_STANDBY_MODE_STATE_IDLE == standbyState ) || ( DG_MODE_SOLO == getCurrentOperationMode() ) ) { DG_CMD_RESPONSE_T cmdResponse; + OPN_CLS_STATE_T concCap = getSwitchStatus( CONCENTRATE_CAP ); OPN_CLS_STATE_T diaCap = getSwitchStatus( DIALYSATE_CAP ); cmdResponse.commandID = DG_CMD_START_FLUSH; Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -ra89d6b091874136d75a9bfbdbbc1ff00f42467b3 -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision a89d6b091874136d75a9bfbdbbc1ff00f42467b3) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -154,10 +154,6 @@ lastMode = currentMode; transitionToNewOperationMode( newMode ); currentMode = newMode; - - // Mode is changing, write the RO generated volume to the RTC RAM and set the service flag to FALSE - // since this is not a from a service change - setROWaterGeneratedL( getROGeneratedVolumeL(), FALSE ); } // mode specific processing to be done continuously Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r9826fc85bd1497ec617ae0e825f78b91972de2b3 -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -103,6 +103,9 @@ static F32 targetFillFlowRateLPM; ///< Target fill flow rate in L/min. static BOOL isThisTheFirstCycle; ///< Boolean flag to indicate whether this is the first cycle. static RESERVOIRS_PREVIOUS_STATUS reservoirPreviousStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Reservoirs previous status. +static HD_MODE_SUB_MODE_T hdModes; ///< HD operations mode. +static BOOL hasROVolBeenWrittenToNV; ///< Boolean flag to indicate whether the RO volume has been written to NV RAM or not. +static BOOL hasDisinfectStatusBeenSet; ///< Boolean flag to indicate whether disinfect has been voided after starting treatment. /*********************************************************************//** * @brief @@ -115,15 +118,17 @@ *************************************************************************/ void initReservoirs( void ) { - activeReservoir.data = (U32)DG_RESERVOIR_1; - fillVolumeTargetMl.data = DEFAULT_FILL_VOLUME_ML; - drainVolumeTargetMl.data = DEFAULT_DRAIN_VOLUME_ML; - targetFillFlowRateLPM = 0.0; - isThisTheFirstCycle = TRUE; - dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; + activeReservoir.data = (U32)DG_RESERVOIR_1; + fillVolumeTargetMl.data = DEFAULT_FILL_VOLUME_ML; + drainVolumeTargetMl.data = DEFAULT_DRAIN_VOLUME_ML; + targetFillFlowRateLPM = 0.0; + isThisTheFirstCycle = TRUE; + dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; + hasROVolBeenWrittenToNV = FALSE; + hasDisinfectStatusBeenSet = FALSE; memset( &reservoirPreviousStatus, 0.0, sizeof( RESERVOIRS_PREVIOUS_STATUS ) * NUM_OF_DG_RESERVOIRS ); -} +} /*********************************************************************//** * @brief @@ -145,7 +150,42 @@ getNVRecord2Driver( GET_CAL_HEATING_RECORD, (U08*)&heatingConstsCalRecord, sizeof( heatingConstsCalRecord ), NUM_OF_CAL_DATA_RSRVRS, ALARM_ID_DG_HEATING_INVALID_CAL_RECORD ); } - + + if ( ( ( DG_MODE_FAUL == getCurrentOperationMode() ) || ( DG_MODE_STAN == getCurrentOperationMode() ) ) && ( FALSE == hasROVolBeenWrittenToNV ) ) + { + BOOL status; + DG_OP_MODE_T prevMode = getPreviousOperationMode(); + + switch( prevMode ) + { + case DG_MODE_GENE: + case DG_MODE_FILL: + case DG_MODE_DRAI: + case DG_MODE_FLUS: + case DG_MODE_HEAT: + case DG_MODE_CHEM: + // Mode is changing, write the RO generated volume to the RTC RAM and set the service flag to FALSE + // since this is not a from a service change + status = setROWaterGeneratedL( getROGeneratedVolumeL() ); + break; + } + + if ( TRUE == status ) + { + hasROVolBeenWrittenToNV = TRUE; + } + } + + if ( ( FALSE == hasDisinfectStatusBeenSet ) && ( MODE_TREA == hdModes.hdMode ) ) + { + BOOL status = setDisinfectStatus( FALSE ); + + if ( TRUE == status ) + { + hasDisinfectStatusBeenSet = TRUE; + } + } + // publish active reservoir, fill/drain volume targets at 1 Hz. if ( ++dataPublishCounter >= RESERVOIR_DATA_PUB_INTERVAL ) { @@ -202,8 +242,8 @@ } return result; -} - +} + /*********************************************************************//** * @brief * The setActiveReservoirCmd function sets the given reservoir as active @@ -457,6 +497,35 @@ /*********************************************************************//** * @brief + * The setHDOperationMode function sets HD operation mode value. + * @details Inputs: none + * @details Outputs: hdMode + * @param mode which is HD mode + * @param subMode which is HD submode + * @return none + *************************************************************************/ +void setHDOperationMode( U32 mode, U32 subMode ) +{ + hdModes.hdMode = (HD_OP_MODE_T)mode; + hdModes.hdSubMode = subMode; +} + +/*********************************************************************//** + * @brief + * The getHDOperationMode function copies the provided buffer with the HD + * mode and submode. + * @details Inputs: none + * @details Outputs: hdMode + * @param mode* pointer to the buffer of type HD_MODE_SUB_MODE_T + * @return none + *************************************************************************/ +void getHDOperationMode( HD_MODE_SUB_MODE_T* mode ) +{ + memcpy( mode, &hdModes, sizeof( HD_MODE_SUB_MODE_T ) ); +} + +/*********************************************************************//** + * @brief * The getInactiveReservoir function gets the inactive reservoir. * @details Inputs: activeReservoir * @details Outputs: none Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -r9826fc85bd1497ec617ae0e825f78b91972de2b3 -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -20,6 +20,7 @@ #include "DGCommon.h" #include "DGDefs.h" +#include "HDDefs.h" #include "NVDataMgmt.h" /** @@ -70,6 +71,13 @@ F32 dialysateFlowLPM; ///< Dialysate flow rate in L/min } DG_CMD_DIALYSATE_HEATING_PARAMS_T; +/// HD mode and HD submode +typedef struct +{ + HD_OP_MODE_T hdMode; ///< HD mode + U32 hdSubMode; ///< HD submode +} HD_MODE_SUB_MODE_T; + /// Reservoir data struct. typedef struct { @@ -104,6 +112,9 @@ void startDrainCmd( DRAIN_CMD_T drainCmd ); // handle drain command from HD void stopDrainCmd( void ); // handle stop drain command from HD +void setHDOperationMode( U32 mode, U32 subMode ); +void getHDOperationMode( HD_MODE_SUB_MODE_T* mode ); + DG_RESERVOIR_ID_T getInactiveReservoir( void ); F32 getReservoirWeight( DG_RESERVOIR_ID_T reservoirId ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r9826fc85bd1497ec617ae0e825f78b91972de2b3 -r98a1a2a624373a1d140daed0136522ab6e635237 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 98a1a2a624373a1d140daed0136522ab6e635237) @@ -1384,12 +1384,13 @@ if ( message->hdr.payloadLen == sizeof( U32 ) + sizeof( U32 ) ) { U32 mode; + U32 subMode; - // NOTE: the HD operations modes broadcast message contains the mode and submode states - // In this case, only the mode is needed. The mode is received to check if HD is in treatment - // and therefore, DG can void the last disinfect. memcpy( payloadPtr, &mode, sizeof( U32 ) ); - setHDOperationMode( mode ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &subMode, sizeof( U32 ) ); + + setHDOperationMode( mode, subMode ); status = TRUE; }