Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rfab0257d4913c021698418277e742c2a61e0368e -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision fab0257d4913c021698418277e742c2a61e0368e) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2019-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2024 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file ModeStandby.c * * @author (last) Dara Navaei -* @date (last) 03-May-2023 +* @date (last) 10-Nov-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -111,10 +111,6 @@ // Reset the heaters efficiency for another treatment resetHeatersEstimationGain(); - - // Initialize the reservoirs parameters for another treatment. - // This is to make sure the boolean flag for the first fill is set to TRUE. - initReservoirs(); } /*********************************************************************//** @@ -126,6 +122,8 @@ *************************************************************************/ U32 transitionToStandbyMode( void ) { + MESSAGE_T usageMsg; + // re-initialize standby mode each time we transition to standby mode initStandbyMode(); @@ -143,6 +141,15 @@ setChemNelsonSupportMode( NELSON_NONE ); #endif + // Initialize the reservoirs parameters for another treatment. + // This is to make sure the boolean flag for the first fill is set to TRUE. + initReservoirs(); + + // Send DG usage data to HD + usageMsg.hdr.msgID = MSG_ID_HD_DG_USAGE_INFO_REQUEST; + usageMsg.hdr.payloadLen = 0; + handleHDRequestDGUsageInfo( &usageMsg ); + return standbyState; } @@ -206,20 +213,17 @@ // Check inlet water conductivity, temperature, pressure, and RO rejection ratio BOOL status = FALSE; - if ( VALVE_STATE_OPEN == getValveStateName( VPI ) ) - { - checkInletWaterConductivity(); - checkInletWaterTemperature(); - checkInletWaterPressure(); + checkInletWaterConductivity(); + checkInletWaterTemperature(); + checkInletWaterPressure(); - status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_CONDUCTIVITY_IN_LOW_RANGE ); - status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_CONDUCTIVITY_IN_HIGH_RANGE ); - status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_TEMPERATURE_IN_HIGH_RANGE ); - status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_TEMPERATURE_IN_LOW_RANGE ); - status |= isAlarmConditionActive( ALARM_ID_DG_OUTLET_PRIMARY_CONDUCTIVITY_OUT_OF_RANGE ); - status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_PRESSURE_IN_HIGH_RANGE ); - status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_PRESSURE_IN_LOW_RANGE ); - } + status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_CONDUCTIVITY_IN_LOW_RANGE ); + status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_CONDUCTIVITY_IN_HIGH_RANGE ); + status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_TEMPERATURE_IN_HIGH_RANGE ); + status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_TEMPERATURE_IN_LOW_RANGE ); + status |= isAlarmConditionActive( ALARM_ID_DG_OUTLET_PRIMARY_CONDUCTIVITY_OUT_OF_RANGE ); + status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_PRESSURE_IN_HIGH_RANGE ); + status |= isAlarmConditionActive( ALARM_ID_DG_INLET_WATER_PRESSURE_IN_LOW_RANGE ); return status; } @@ -497,6 +501,29 @@ /*********************************************************************//** * @brief + * The signalAbortWaterSampling function handles an HD request to abort water + * sampling (return to standby idle state). + * @details Inputs: none + * @details Outputs: standby mode variable initialized + * @return TRUE if request accepted, FALSE if not + *************************************************************************/ +BOOL signalAbortWaterSampling( void ) +{ + BOOL result = FALSE; + + if ( ( DG_MODE_STAN == getCurrentOperationMode() ) && ( standbyState != DG_STANDBY_MODE_STATE_IDLE ) ) + { + result = TRUE; + initStandbyMode(); + setValveState( VSP, VALVE_STATE_CLOSED ); + setValveState( VPI, VALVE_STATE_CLOSED ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The startDGFlush function starts DG flush mode. * @details Inputs: standbyState * @details Outputs: none @@ -526,8 +553,9 @@ concCap = STATE_CLOSED; diaCap = STATE_CLOSED; // Using the caps switch to disable the chemical disinfect date checks + // This is for debug builds only to simulate that a chem flush has been done after chem usageInfo.lastChemDisFlushCompleteDateEpoch = 40; - usageInfo.lastChemDisCompleteDateEpoch = 32; + usageInfo.lastChemDisStartDateEpoch = 32; } #endif @@ -537,7 +565,7 @@ cmdResponse.rejectCode = ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ? REQUEST_REJECT_REASON_DG_DIALYSATE_CAP_OPEN : REQUEST_REJECT_REASON_DG_CONCENTRATE_CAP_OPEN ); } - else if ( usageInfo.lastChemDisFlushCompleteDateEpoch < usageInfo.lastChemDisCompleteDateEpoch ) + else if ( usageInfo.lastChemDisFlushCompleteDateEpoch < usageInfo.lastChemDisStartDateEpoch ) { cmdResponse.rejected = TRUE; cmdResponse.rejectCode = REQUEST_REJECT_REASON_DG_CHEM_FLUSH_NOT_COMPLETED; @@ -570,23 +598,24 @@ { DG_CMD_RESPONSE_T cmdResponse; DG_USAGE_INFO_RECORD_T usageInfo; + OPN_CLS_STATE_T concCap = getSwitchStatus( CONCENTRATE_CAP ); + OPN_CLS_STATE_T diaCap = getSwitchStatus( DIALYSATE_CAP ); getNVRecord2Driver( GET_USAGE_RECORD, (U08*)&usageInfo, sizeof( DG_USAGE_INFO_RECORD_T ), 0, ALARM_ID_NO_ALARM ); - cmdResponse.commandID = DG_CMD_START_HEAT_DISINFECT; - cmdResponse.rejected = FALSE; - cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; - OPN_CLS_STATE_T concCap = getSwitchStatus( CONCENTRATE_CAP ); - OPN_CLS_STATE_T diaCap = getSwitchStatus( DIALYSATE_CAP ); + cmdResponse.commandID = DG_CMD_START_HEAT_DISINFECT; + cmdResponse.rejected = FALSE; + cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; #ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_CAPS_MONITOR ) ) { concCap = STATE_CLOSED; diaCap = STATE_CLOSED; // Using the caps switch to disable the chemical disinfect date checks + // This is for debug builds only to simulate that a chem flush has been done after chem usageInfo.lastChemDisFlushCompleteDateEpoch = 40; - usageInfo.lastChemDisCompleteDateEpoch = 32; + usageInfo.lastChemDisStartDateEpoch = 32; } #endif @@ -596,7 +625,7 @@ cmdResponse.rejectCode = ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ? REQUEST_REJECT_REASON_DG_DIALYSATE_CAP_OPEN : REQUEST_REJECT_REASON_DG_CONCENTRATE_CAP_OPEN ); } - else if ( usageInfo.lastChemDisFlushCompleteDateEpoch < usageInfo.lastChemDisCompleteDateEpoch ) + else if ( usageInfo.lastChemDisFlushCompleteDateEpoch < usageInfo.lastChemDisStartDateEpoch ) { cmdResponse.rejected = TRUE; cmdResponse.rejectCode = REQUEST_REJECT_REASON_DG_CHEM_FLUSH_NOT_COMPLETED; @@ -645,8 +674,9 @@ concCap = STATE_CLOSED; diaCap = STATE_CLOSED; // Using the caps switch to disable the chemical disinfect date checks + // This is for debug builds only to simulate that a chem flush has been done after chem usageInfo.lastChemDisFlushCompleteDateEpoch = 40; - usageInfo.lastChemDisCompleteDateEpoch = 32; + usageInfo.lastChemDisStartDateEpoch = 32; } #endif @@ -656,7 +686,7 @@ cmdResponse.rejectCode = ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ? REQUEST_REJECT_REASON_DG_DIALYSATE_CAP_OPEN : REQUEST_REJECT_REASON_DG_CONCENTRATE_CAP_OPEN ); } - else if ( usageInfo.lastChemDisFlushCompleteDateEpoch < usageInfo.lastChemDisCompleteDateEpoch ) + else if ( usageInfo.lastChemDisFlushCompleteDateEpoch < usageInfo.lastChemDisStartDateEpoch ) { cmdResponse.rejected = TRUE; cmdResponse.rejectCode = REQUEST_REJECT_REASON_DG_CHEM_FLUSH_NOT_COMPLETED; @@ -793,14 +823,21 @@ // If DG is in standby mode and the standby mode is in Idle, request RO permeate sample if ( ( DG_MODE_STAN == getCurrentOperationMode() ) && ( DG_STANDBY_MODE_STATE_IDLE == standbyState ) ) { + DG_USAGE_INFO_RECORD_T usageInfo; OPN_CLS_STATE_T concCap = getSwitchStatus( CONCENTRATE_CAP ); OPN_CLS_STATE_T diaCap = getSwitchStatus( DIALYSATE_CAP ); + getNVRecord2Driver( GET_USAGE_RECORD, (U08*)&usageInfo, sizeof( DG_USAGE_INFO_RECORD_T ), 0, ALARM_ID_NO_ALARM ); + #ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_CAPS_MONITOR ) ) { concCap = STATE_CLOSED; diaCap = STATE_CLOSED; + // Using the caps switch to disable the chemical disinfect date checks. + // This is for debug builds only to simulate that a chem flush has been done after chem + usageInfo.lastChemDisFlushCompleteDateEpoch = 40; + usageInfo.lastChemDisStartDateEpoch = 32; } #endif @@ -810,6 +847,11 @@ cmdResponse.rejectCode = ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ? REQUEST_REJECT_REASON_DG_DIALYSATE_CAP_OPEN : REQUEST_REJECT_REASON_DG_CONCENTRATE_CAP_OPEN ); } + else if ( usageInfo.lastChemDisFlushCompleteDateEpoch < usageInfo.lastChemDisStartDateEpoch ) + { + cmdResponse.rejected = TRUE; + cmdResponse.rejectCode = REQUEST_REJECT_REASON_DG_CHEM_FLUSH_NOT_COMPLETED; + } else { pendingStartDGROPermeateSampleRequest = TRUE;