Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r8962d7d08d95e4eadedeacb7c04aad9bacbaa65f -r99ec83eff4683ad69a249f935d74cb9226984d21 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 8962d7d08d95e4eadedeacb7c04aad9bacbaa65f) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 99ec83eff4683ad69a249f935d74cb9226984d21) @@ -7,8 +7,8 @@ * * @file ModeStandby.c * -* @author (last) Dara Navaei -* @date (last) 19-Dec-2022 +* @author (last) Sean Nash +* @date (last) 13-Mar-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -20,6 +20,7 @@ #include "Battery.h" #include "BloodFlow.h" #include "Buttons.h" +#include "Compatible.h" #include "DGInterface.h" #include "DialInFlow.h" #include "DialOutFlow.h" @@ -133,10 +134,8 @@ resetAirTrap(); resetBloodPumpRotorCount(); resetDialInPumpRotorCount(); + resetPreLoadStatus(); - doorClosedRequired( FALSE, FALSE ); - syringeDetectionRequired( FALSE ); - // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); @@ -158,8 +157,15 @@ // If we just exited Post Treatment Mode, goto disinfect sub state. if ( MODE_POST == previousOpMode ) { + doorClosedRequired( FALSE, FALSE ); // door no longer required to be closed in standby mode currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; } + else + { + doorClosedRequired( TRUE, FALSE ); + } + syringeDetectionRequired( FALSE ); + // Request DG service record and usage information from DG sendDGServiceRequestToDG(); sendDGUsageInfoRequestToDG(); @@ -180,7 +186,6 @@ handleDisinfectCancel( stop ); -#ifndef RUN_WITHOUT_DG // State machine to get DG to prep a reservoir so we can start a treatment switch ( currentStandbyState ) { @@ -237,33 +242,7 @@ currentStandbyState = STANDBY_START_STATE; break; } -#else - // State machine to get DG to prep a reservoir so we can start a treatment - switch ( currentStandbyState ) - { - case STANDBY_START_STATE: - currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; - // Temporary test code - TODO - remove later - homeBloodPump(); - homeDialInPump(); - homeDialOutPump(); - break; - case STANDBY_WAIT_FOR_TREATMENT_STATE: - if ( TRUE == treatStartReqReceived ) - { - requestNewOperationMode( MODE_TPAR ); - treatStartReqReceived = FALSE; - } - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_STANDBY_INVALID_STATE, currentStandbyState ); - currentStandbyState = STANDBY_START_STATE; - break; - } -#endif - return currentStandbyState; } @@ -278,52 +257,63 @@ BOOL signalUserInitiateTreatment( void ) { BOOL result = FALSE; + DG_VERSIONS_T dgVersion = getDGVersion(); REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; + // Verify HD is in standby mode waiting for treatment start request if ( ( MODE_STAN != getCurrentOperationMode() ) || ( STANDBY_WAIT_FOR_TREATMENT_STATE != currentStandbyState ) ) { rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; } - - if ( TRUE != isDGCommunicating() ) + // Verify DG is communicating with HD + else if ( TRUE != isDGCommunicating() ) { rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; } - - if ( ( DG_MODE_STAN != getDGOpMode() ) || ( DG_STANDBY_MODE_STATE_IDLE != getDGSubMode() ) ) + // Verify DG software is compatible with HD software + else if ( dgVersion.compatibilityRev != SW_COMPATIBILITY_REV ) { + rejReason = REQUEST_REJECT_REASON_DG_INCOMPATIBLE; + } + // Verify DG is not busy + else if ( ( DG_MODE_STAN != getDGOpMode() ) || ( DG_STANDBY_MODE_STATE_IDLE != getDGSubMode() ) ) + { rejReason = REQUEST_REJECT_REASON_DG_NOT_IN_STANDBY_IDLE_STATE; } - - if ( FALSE == isBatteryCharged() ) + // Verify HD battery has sufficient charge to hold up logic/sensors for at least 10 minutes + else if ( FALSE == isBatteryCharged() ) { rejReason = REQUEST_REJECT_REASON_BATTERY_IS_NOT_CHARGED; } - -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SERVICE_AND_DISINFECT_CHECK ) != SW_CONFIG_ENABLE_VALUE ) +#ifdef _RELEASE_ + else +#else + else if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SERVICE_AND_DISINFECT_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif { - // This function checks both HD and DG service records and if any of them has failed, it fills the provided reject reason buffer - haveHDDGServicesBeenExpired( &rejReason ); - - if ( FALSE == isDGDisinfectValid() ) + // Verify HD and DG are not over due for service + if ( haveHDDGServicesBeenExpired( &rejReason ) != TRUE ) { - rejReason = REQUEST_REJECT_REASON_DG_DISINFECT_HAS_BEEN_EXPIRED; + // Verify DG is disinfected + if ( FALSE == isDGDisinfectValid() ) + { + rejReason = REQUEST_REJECT_REASON_DG_DISINFECT_HAS_BEEN_EXPIRED; + } + else if ( getHeatDisinfectTemperatureSensorValue() > MAX_ALLOWED_RO_FILTER_TEMP_FOR_TX_C ) + { + rejReason = REQUEST_REJECT_REASON_DG_RO_FILTER_TEMPERATURE_OUT_OF_RANGE; + } } - - if ( getHeatDisinfectTemperatureSensorValue() > MAX_ALLOWED_RO_FILTER_TEMP_FOR_TX_C ) - { - rejReason = REQUEST_REJECT_REASON_DG_RO_FILTER_TEMPERATURE_OUT_OF_RANGE; - } } + // If no reason to reject request to start treatment, set flag to initiate treatment workflow if ( REQUEST_REJECT_REASON_NONE == rejReason ) { result = TRUE; treatStartReqReceived = TRUE; } + // Respond to request to start treatment sendInitiateTreatmentResponseMsg( result, rejReason ); return result; @@ -635,16 +625,12 @@ { syringePumpVerifyForceSensorDACCalibration(); homingInitiated = FALSE; // reset for next time + doorClosedRequired( FALSE, FALSE ); // door no longer required to be closed in standby mode 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 ); - } return state; } @@ -674,24 +660,30 @@ cmdStopDG(); } - // If treatment start is requested by user, initiate treatment workflow (transition to treatment params mode). - if ( TRUE == treatStartReqReceived ) + // If DG is communicating and we don't yet have DG version info, request it + if ( TRUE == isDGCommunicating() ) { - BOOL startTreatment = TRUE; + DG_VERSIONS_T dgVersion = getDGVersion(); - if ( TRUE == startTreatment ) + if ( 0 == dgVersion.compatibilityRev ) { - // Initialize treatment modes before starting a new treatment - initTreatParamsMode(); - initPreTreatmentMode(); - initTreatmentMode(); - initPostTreatmentMode(); - // Start treatment workflow with treatment parameters mode - requestNewOperationMode( MODE_TPAR ); - treatStartReqReceived = FALSE; + sendFWVersionRequest(); } } + // If treatment start is requested by user, initiate treatment workflow (transition to treatment params mode). + if ( TRUE == treatStartReqReceived ) + { + // Initialize treatment modes before starting a new treatment + initTreatParamsMode(); + initPreTreatmentMode(); + initTreatmentMode(); + initPostTreatmentMode(); + // Start treatment workflow with treatment parameters mode + requestNewOperationMode( MODE_TPAR ); + treatStartReqReceived = FALSE; + } + return state; } @@ -980,7 +972,7 @@ getHDVersionDGServiceAndUsageData( &data ); - if ( TRUE == data.isDGUsageInfoAviable ) + if ( TRUE == data.isDGUsageInfoAvailable ) { HD_USAGE_INFO_RECORD_T usageRecord; getNVRecord2Driver( GET_USAGE_RECORD, (U08*)&usageRecord, sizeof( HD_USAGE_INFO_RECORD_T ), 0, ALARM_ID_NO_ALARM ); @@ -1027,11 +1019,11 @@ * @details Inputs: none * @details Outputs: none * @param rejReason pointer to the provided reject reason buffer to be send to UI - * @return TRUE if the service time is still valid otherwise, FALSE + * @return TRUE if the service for HD or DG has expired otherwise FALSE ***********************************************************************/ static BOOL haveHDDGServicesBeenExpired( REQUEST_REJECT_REASON_CODE_T* rejReason ) { - BOOL status = TRUE; + BOOL status = FALSE; DG_SERVICE_AND_USAGE_DATA_T dgData; HD_SERVICE_RECORD_T hdServiceRecord; @@ -1041,19 +1033,19 @@ if ( TRUE == dgData.isDGServiceRecordAvailable ) { U32 dgSrvcElapsedTimeS = getRTCTimestamp() - dgData.dgServiceRecord.lastServiceEpochDate; - BOOL hasDGSrvcBeenExpired = ( dgSrvcElapsedTimeS > SERVICE_TIME_INTERVAL_S ? TRUE : FALSE ); U32 hdSrvcElapsedTimeS = getRTCTimestamp() - hdServiceRecord.lastServiceEpochDate; + BOOL hasDGSrvcBeenExpired = ( dgSrvcElapsedTimeS > SERVICE_TIME_INTERVAL_S ? TRUE : FALSE ); BOOL hasHDSrvcBeenExpied = ( hdSrvcElapsedTimeS > SERVICE_TIME_INTERVAL_S ? TRUE : FALSE ); if ( TRUE == hasDGSrvcBeenExpired ) { - status = FALSE; + status = TRUE; *rejReason = REQUEST_REJECT_REASON_DG_SERVICE_IS_DUE; } if ( TRUE == hasHDSrvcBeenExpied ) { - status = FALSE; + status = TRUE; *rejReason = REQUEST_REJECT_REASON_HD_SERVICE_IS_DUE; } }