Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rcc52e0daf66905c55ee62a9c6fa88a3c60125e63 -r7acc14a8f6eeaf6b26757fc2b5d2f6fc7edbdcec --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision cc52e0daf66905c55ee62a9c6fa88a3c60125e63) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 7acc14a8f6eeaf6b26757fc2b5d2f6fc7edbdcec) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2019-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2025 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) 13-Jun-2023 +* @date (last) 08-Mar-2025 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -23,6 +23,7 @@ #include "MessageSupport.h" #include "ModeChemicalDisinfect.h" #include "ModeFault.h" +#include "ModeFill.h" #include "ModeHeatDisinfect.h" #include "ModeStandby.h" #include "NVDataMgmt.h" @@ -111,10 +112,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 +123,8 @@ *************************************************************************/ U32 transitionToStandbyMode( void ) { + MESSAGE_T usageMsg; + // re-initialize standby mode each time we transition to standby mode initStandbyMode(); @@ -143,6 +142,17 @@ 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 + // The message ID will not be put here because the messages list script will pick this up for another send command + // The only important item is the payload length that must be 0 for the handler + usageMsg.hdr.msgID = 0; + usageMsg.hdr.payloadLen = 0; + handleHDRequestDGUsageInfo( &usageMsg ); + return standbyState; } @@ -254,6 +264,7 @@ { pendingStartDGRequest = FALSE; signalSyncToHD(); + sendMaxRORejectionRatioRequestToHD(); requestNewOperationMode( DG_MODE_GENE ); } else if ( TRUE == pendingStartDGFlushRequest ) @@ -274,7 +285,6 @@ else if ( TRUE == pendingStartDGHeatDisinfectActiveCoolRequest ) { pendingStartDGHeatDisinfectActiveCoolRequest = FALSE; - requestNewOperationMode( DG_MODE_HCOL ); } else if ( TRUE == pendingStartDGChemicalDisinfectFlushRequest ) @@ -546,8 +556,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 @@ -557,7 +568,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; @@ -579,9 +590,11 @@ * The startDGHeatDisinfect function starts heat disinfect mode. * @details Inputs: standbyState * @details Outputs: none + * @param isPassive: boolean flag to indicate whether this is passive cool heat + * or active cool heat disinfect * @return: TRUE if the switch was successful *************************************************************************/ -BOOL startDGHeatDisinfect( void ) +BOOL startDGHeatDisinfect( BOOL isPassive ) { BOOL status = FALSE; @@ -590,23 +603,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 = ( FALSE == isPassive ? DG_CMD_START_HEAT_DISINFECT_ACTIVE_COOL : DG_CMD_START_HEAT_DISINFECT_PASSIVE_COOL ); + 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 @@ -616,7 +630,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; @@ -655,7 +669,7 @@ 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.commandID = DG_CMD_START_ACTIVE_COOL; cmdResponse.rejected = FALSE; cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; @@ -665,8 +679,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 @@ -676,7 +691,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; @@ -813,14 +828,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 @@ -830,6 +852,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;