Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r4df8828df03ee996540084c57f9b46c0febc1e03 -rfacca88de0d4c72d943b59bad9264a9b0a031ae5 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 4df8828df03ee996540084c57f9b46c0febc1e03) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision facca88de0d4c72d943b59bad9264a9b0a031ae5) @@ -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" @@ -278,52 +279,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; @@ -674,24 +686,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 +998,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 +1045,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 +1059,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; } }