Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rb8a2cf224258eccbf81347a0b61291c69253a5d9 -r0a4dcd288d4347b85baaa0b07da568b6add5eac7 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision b8a2cf224258eccbf81347a0b61291c69253a5d9) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 0a4dcd288d4347b85baaa0b07da568b6add5eac7) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2023 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) 18-Oct-2022 +* @date (last) 19-Dec-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -48,6 +48,8 @@ #define DISINFECTS_DATA_PUB_INTERVAL ( 1 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Disinfects data publish interval in counts. #define DISINFECTS_TIME_INTERVAL_S ( 2 * SECONDS_IN_A_DAY ) ///< HD/DG 2-day service interval in seconds. +#define FLUSH_TIME_INTERVAL_S ( 30 * SEC_PER_MIN * MS_PER_SECOND ) ///< Flush time interval in seconds. +#define MAX_ALLOWED_RO_FILTER_TEMP_FOR_TX_C 44.0F ///< Maximum allowed temperature to start a treatment in C. // ********** private data ********** @@ -129,6 +131,8 @@ initStandbyMode(); initDGInterface(); resetAirTrap(); + resetBloodPumpRotorCount(); + resetDialInPumpRotorCount(); doorClosedRequired( FALSE, FALSE ); syringeDetectionRequired( FALSE ); @@ -307,6 +311,11 @@ { rejReason = REQUEST_REJECT_REASON_DG_DISINFECT_HAS_BEEN_EXPIRED; } + + if ( getHeatDisinfectTemperatureSensorValue() > MAX_ALLOWED_RO_FILTER_TEMP_FOR_TX_C ) + { + rejReason = REQUEST_REJECT_REASON_DG_RO_FILTER_TEMPERATURE_OUT_OF_RANGE; + } } if ( REQUEST_REJECT_REASON_NONE == rejReason ) @@ -611,26 +620,35 @@ homingInitiated = TRUE; } + else + { + // If homing has been initiated, wait for syringe pump to home and the verify force sensor calibration +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_SYRINGE_PUMP ) ) + { + state = STANDBY_WAIT_FOR_TREATMENT_STATE; // Go to wait for treatment state after above check + } + else +#endif + { + if ( ( TRUE == homingInitiated ) && ( TRUE == isSyringePumpHome() ) && ( TRUE == isSyringePumpStopped() ) ) + { + syringePumpVerifyForceSensorDACCalibration(); + homingInitiated = FALSE; // reset for next time + state = STANDBY_WAIT_FOR_TREATMENT_STATE; // Go to wait for treatment state after above check + } + } + } } else { // Trigger door open alarm to prompt user to close the door activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); } - // If homing has been initiated, wait for syringe pump to home and the verify force sensor calibration - if ( ( TRUE == homingInitiated ) && ( TRUE == isSyringePumpHome() ) ) - { - syringePumpVerifyForceSensorDACCalibration(); - homingInitiated = FALSE; // reset for next time - state = STANDBY_WAIT_FOR_TREATMENT_STATE; // Go to wait for treatment state after above check - } - return state; } -// Verify calibration - /*********************************************************************//** * @brief * The handleStandbyModeWaitForTreatmentState function handles wait for @@ -958,27 +976,44 @@ static BOOL isDGDisinfectValid( void ) { DG_SERVICE_AND_USAGE_DATA_T data; - BOOL status = TRUE; + BOOL status = FALSE; getHDVersionDGServiceAndUsageData( &data ); if ( TRUE == data.isDGUsageInfoAviable ) { - if ( TRUE == data.dgUsageInfo.isDisinfected ) - { - U32 chemDisElapsedTimeS = getRTCTimestamp() - data.dgUsageInfo.lastChemicalDisDateEpoch; - BOOL hasChemDisBeenExpired = ( chemDisElapsedTimeS > DISINFECTS_TIME_INTERVAL_S ? TRUE : FALSE ); - U32 heatDisElapsedTimeS = getRTCTimestamp() - data.dgUsageInfo.lastHeatDisDateEpoch; - BOOL hasHeatDisBeenExpired = ( heatDisElapsedTimeS > DISINFECTS_TIME_INTERVAL_S ? TRUE : FALSE ); + HD_USAGE_INFO_RECORD_T usageRecord; + getNVRecord2Driver( GET_USAGE_RECORD, (U08*)&usageRecord, sizeof( HD_USAGE_INFO_RECORD_T ), 0, ALARM_ID_NO_ALARM ); - if ( ( TRUE == hasChemDisBeenExpired ) && ( TRUE == hasHeatDisBeenExpired ) ) - { - status = FALSE; - } - } - else + U32 lastChemCompleteDate = data.dgUsageInfo.lastChemDisCompleteDateEpoch; + U32 lastChemFlushCompleteDate = data.dgUsageInfo.lastChemDisFlushCompleteDateEpoch; + U32 lastHeatCompleteDate = data.dgUsageInfo.lastHeatDisCompleteDateEpoch; + U32 lastFlushCompleteDate = data.dgUsageInfo.lastBasicFlushCompleteDateEpoch; + U32 lastStartTxTimeDate = usageRecord.txLastStartTimeEpoch; + + // Last Treatment Start < Last Heat Disinfect Complete or Last Treatment Start < Last Chem Disinfect Complete so it means at least a heat disinfect + // or a chemical disinfect has been done since the last treatment + BOOL hasDisBeenDone = ( ( ( lastStartTxTimeDate < lastChemCompleteDate ) || ( lastStartTxTimeDate < lastHeatCompleteDate ) ) ? TRUE : FALSE ); + + // Last Chem Disinfect Complete < Current Time – Chem Disinfect Interval, so the chemical disinfect that has been done has not been expired + BOOL isChemDisValid = ( lastChemCompleteDate < ( getRTCTimestamp() - DISINFECTS_TIME_INTERVAL_S ) ? TRUE : FALSE ); + + // Last Heat Disinfect Complete < Current Time – Heat Disinfect Interval, so the heat disinfect that has been done has not been expired + BOOL isHeatDisValid = ( lastHeatCompleteDate < ( getRTCTimestamp() - DISINFECTS_TIME_INTERVAL_S ) ? TRUE : FALSE ); + + // Last Chem Flush Complete < Last Chem Disinfect Start, so after running a chemical disinfect, a chemical disinfect flush has been done + BOOL isChemFlushComplete = ( lastChemFlushCompleteDate > lastChemCompleteDate ? TRUE : FALSE ); + + // If either of the basic flush, heat disinfect, or chemical disinfect flush have been done within the interval, it means the filters have been flushed + BOOL isBasicFlushValid = ( lastFlushCompleteDate < ( getRTCTimestamp() - FLUSH_TIME_INTERVAL_S ) ? TRUE : TRUE ); + BOOL isHeatDisFlushValid = ( lastHeatCompleteDate < ( getRTCTimestamp() - FLUSH_TIME_INTERVAL_S ) ? TRUE : TRUE ); + BOOL isChemFlushValid = ( lastChemFlushCompleteDate < ( getRTCTimestamp() - FLUSH_TIME_INTERVAL_S ) ? TRUE : TRUE ); + BOOL isFlushValid = ( isBasicFlushValid || isHeatDisFlushValid || isChemFlushValid ); + + // If all of the above conditions are true, it means we can start a treatment + if ( ( TRUE == hasDisBeenDone ) && ( TRUE == isChemDisValid ) && ( TRUE == isHeatDisValid ) && ( TRUE == isChemFlushComplete ) && ( TRUE == isFlushValid ) ) { - status = FALSE; + status = TRUE; } } @@ -1005,7 +1040,7 @@ if ( TRUE == dgData.isDGServiceRecordAvailable ) { - U32 dgSrvcElapsedTimeS = getRTCTimestamp() - dgData.dgServiceRecord.lastServiceDateEpoch; + U32 dgSrvcElapsedTimeS = getRTCTimestamp() - dgData.dgServiceRecord.lastServiceEpochDate; BOOL hasDGSrvcBeenExpired = ( dgSrvcElapsedTimeS > SERVICE_TIME_INTERVAL_S ? TRUE : FALSE ); U32 hdSrvcElapsedTimeS = getRTCTimestamp() - hdServiceRecord.lastServiceEpochDate; BOOL hasHDSrvcBeenExpied = ( hdSrvcElapsedTimeS > SERVICE_TIME_INTERVAL_S ? TRUE : FALSE );