Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -ref398e685d6cfbdcb8c18fd9319819672c6c9d89 -r7de21ac8b699cafdfeaefbf2c062c3e21bcc956d --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision ef398e685d6cfbdcb8c18fd9319819672c6c9d89) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 7de21ac8b699cafdfeaefbf2c062c3e21bcc956d) @@ -119,6 +119,7 @@ static void checkDGRestart( void ); static void checkDGTrimmerHeaterStatus( void ); +static void checkDGDataFreshness( ALARM_ID_T alarmID, BOOL *dgFreshDataFlag ); /*********************************************************************//** * @brief @@ -201,7 +202,7 @@ * @param flag to signal the fresh data processing * @return None *************************************************************************/ -void checkDGDataFreshness( ALARM_ID_T alarmID, BOOL *dgFreshDataFlag ) +static void checkDGDataFreshness( ALARM_ID_T alarmID, BOOL *dgFreshDataFlag ) { if ( TRUE == *dgFreshDataFlag ) { @@ -234,7 +235,7 @@ void execDGInterfaceMonitor( void ) { // Trigger alarm if not receiving new load cell data message in timely manner - checkDGDataFreshness( ALARM_ID_HD_NEW_LOAD_CELL_DATA_MESSAGE_NOT_RECEIVE, &dgLoadCellDataFreshFlag ); + /*checkDGDataFreshness( ALARM_ID_HD_NEW_LOAD_CELL_DATA_MESSAGE_NOT_RECEIVE, &dgLoadCellDataFreshFlag ); // Trigger alarm if not receiving new dialysate temperature data message in timely manner checkDGDataFreshness( ALARM_ID_HD_NEW_DIALYSATE_TEMPERATURE_DATA_MESSAGE_NOT_RECEIVE, &dgDialysateTemperatureDataFreshFlag ); @@ -245,7 +246,8 @@ // Trigger alarm if not receiving new DG op mode message in timely manner checkDGDataFreshness( ALARM_ID_HD_NEW_DG_OPERATION_MODE_MESSAGE_NOT_RECEIVE, &dgOpModeDataFreshFlag ); - // Check to see if DG has restarted + // Check to see if DG has restarted*/ + checkDGRestart(); // Check the status of the trimmer heater @@ -451,26 +453,26 @@ /*********************************************************************//** * @brief - * The getDialysateTemperature function gets the latest dialysate temperature. - * @details Inputs: dgDialysateTemp + * The getDGDisinfectsStates function returns the DG disinfects readings. + * @details Inputs: none * @details Outputs: none - * @return the current dialysate temperature + * @return the current DG disinfects readings *************************************************************************/ -F32 getDialysateTemperature( void ) +DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ) { - return dgDialysateTemp; + return disinfectsStatus; } /*********************************************************************//** * @brief - * The getDGDisinfectsStates function returns the DG disinfects readings. - * @details Inputs: none + * The getDialysateTemperature function gets the latest dialysate temperature. + * @details Inputs: dgDialysateTemp * @details Outputs: none - * @return the current DG disinfects readings + * @return the current dialysate temperature *************************************************************************/ -DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ) +F32 getDialysateTemperature( void ) { - return disinfectsStatus; + return dgDialysateTemp; } /*********************************************************************//** Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -ref398e685d6cfbdcb8c18fd9319819672c6c9d89 -r7de21ac8b699cafdfeaefbf2c062c3e21bcc956d --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision ef398e685d6cfbdcb8c18fd9319819672c6c9d89) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 7de21ac8b699cafdfeaefbf2c062c3e21bcc956d) @@ -145,6 +145,7 @@ F32 getReservoirBackupWeightLargeFilter( DG_RESERVOIR_ID_T resID ); F32 getDialysateTemperature( void ); DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ); +F32 getDialysateTemperature( void ); DG_MIXING_RATIOS_T getDGMixingRatios( void ); void getHDVersionDGServiceAndUsageData( DG_SERVICE_AND_USAGE_DATA_T* data ); Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -ref6283257df7c1f993d58fb934da57ea3e0a7067 -r7de21ac8b699cafdfeaefbf2c062c3e21bcc956d --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision ef6283257df7c1f993d58fb934da57ea3e0a7067) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 7de21ac8b699cafdfeaefbf2c062c3e21bcc956d) @@ -71,6 +71,7 @@ #define PSI_TO_MMHG ( 51.7149F ) ///< Conversion factor for converting PSI to mmHg. +// The new arterial pressure sensor is the same as the venous pressure sensor #define VENOUS_PRESSURE_NORMAL_OP 0 ///< Venous pressure status bits indicate normal operation. #define VENOUS_PRESSURE_CMD_MODE 1 ///< Venous pressure status bits indicate sensor in command mode. #define VENOUS_PRESSURE_STALE_DATA 2 ///< Venous pressure status bits indicate data is stale (no new data since last fpga read). @@ -107,7 +108,10 @@ #define SHIFT_14_BITS 14 ///< Shift 14 bits. #define PRES_SENSORS_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Occlusion sensor FPGA error timeout in milliseconds. - + +#ifndef _RELEASE_ +#define MIN_OCCLUSION_COUNTS_V3 1500 ///< Minimum occlusion count for v3 hardware +#endif /// Defined states for the pressure and occlusion monitor state machine. typedef enum PresOccl_States { @@ -609,6 +613,14 @@ BOOL outOfRange = ( bpOccl < MIN_OCCLUSION_COUNTS || bpOccl > MAX_OCCLUSION_COUNTS ? TRUE : FALSE ); #ifndef _RELEASE_ + if ( HW_CONFIG_BETA == getHardwareConfigStatus() ) + { + outOfRange = (( bpOccl < MIN_OCCLUSION_COUNTS_V3 || bpOccl > MAX_OCCLUSION_COUNTS ? TRUE : FALSE )); + } +#endif + + +#ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRESSURE_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) #endif { @@ -628,7 +640,7 @@ // and setOcclusionInstallLevel has been called. if ( MODE_PRET == getCurrentOperationMode() ) { - if ( getPreTreatmentSubState() > HD_PRE_TREATMENT_CART_INSTALL_STATE && getDrySelfTestsState() > DRY_SELF_TESTS_START_STATE ) + if( getPreTreatmentSubState() > HD_PRE_TREATMENT_CART_INSTALL_STATE && getDrySelfTestsState() > DRY_SELF_TESTS_START_STATE ) { // Check for occlusion if ( bpOccl > ( OCCLUSION_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) ) @@ -638,7 +650,6 @@ } } } - // Check for occlusion in Treatment modes where pumps are moving else if ( MODE_TREA == getCurrentOperationMode() ) { Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -rcf7f4d116efb36b993fd9b27af677d9da468c50e -r7de21ac8b699cafdfeaefbf2c062c3e21bcc956d --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision cf7f4d116efb36b993fd9b27af677d9da468c50e) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 7de21ac8b699cafdfeaefbf2c062c3e21bcc956d) @@ -91,6 +91,7 @@ /// Expected position of empty in relation to home position. #define SYRINGE_PUMP_EMPTY_POS ( SYRINGE_ENCODER_COUNTS_PER_ML * 10.84F ) + /// Margin of error for empty position determination. #define SYRINGE_PUMP_EMPTY_POS_MARGIN ( SYRINGE_ENCODER_COUNTS_PER_ML * 0.5F ) /// Minimum retract position. @@ -154,8 +155,10 @@ #define SYRINGE_PUMP_STALL_SPEED_THRESHOLD 0.05F ///< Minimum syringe pump speed to be considered not stalled. #define SYRINGE_PUMP_ADC_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Syringe pump ADC FPGA error timeout in milliseconds. + #define SYRINGE_PUMP_DAC_MAX_RETRIES 5 ///< Syringe pump DAC retries to write. #define SYRINGE_PUMP_DAC_TIMER ( 200 / TASK_PRIORITY_INTERVAL ) ///< Syringe pump DAC timer between retries. + /// Defined states for the syringe pump control state machine. typedef enum SyringePump_States { Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -ref398e685d6cfbdcb8c18fd9319819672c6c9d89 -r7de21ac8b699cafdfeaefbf2c062c3e21bcc956d --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision ef398e685d6cfbdcb8c18fd9319819672c6c9d89) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 7de21ac8b699cafdfeaefbf2c062c3e21bcc956d) @@ -59,7 +59,8 @@ PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE, ///< Command DG to start filling reservoir PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE, ///< After sending fill command, process DG fill command response PRE_TREATMENT_RESERVOIR_MGMT_FILL_COMPLETE_STATE, ///< Reservoir fill has completed - PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE, ///< Wait for prime operation to switch reservoir + PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE, ///< Command DG to switch (toggle) reservoirs + PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE, ///< After sending switch command, process DG fill command response PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE, ///< Pre-treatment reservoir management complete state NUM_OF_PRE_TREATMENT_RESERVOIR_MGMT_STATES ///< Number of pre-treatments reservoir mgmt. states } PRE_TREATMENT_RESERVOIR_MGMT_STATE_T; @@ -75,15 +76,17 @@ static BOOL alarmActionResumeReceived = FALSE; ///< Flag indicates alarm action resume received. static HD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current state of pre-treatment mode state machine. +static BOOL fillReservoirOneStartRequested; ///< Flag indicates fill reservoir one has been requested. static U32 preTreatmentPublishTimerCounter; ///< Pre-treatment data broadcast timer counter used to schedule when to transmit data. /// Interval (in task intervals) at which to publish pre-treatment mode data to CAN bus. static OVERRIDE_U32_T preTreatmentModePublishInterval = { PRE_TREATMENT_DATA_PUB_INTERVAL, PRE_TREATMENT_DATA_PUB_INTERVAL, PRE_TREATMENT_DATA_PUB_INTERVAL, 0 }; static U32 submodeCompleteTransitionTimeCounter; ///< Sub-mode completed transition wait time counter. static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current pre-treatment reservoir management state. -static BOOL fillReservoirOneStartRequested; ///< Flag indicates fill reservoir one has been requested. static BOOL reservoirFilledStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Flag indicates a reservoir has been filled. static BOOL reservoirFlushedStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Flag indicates a reservoir has been flushed. +static PRE_TREATMENT_RESERVOIR_FLAGS_T reservoirFlags[ NUM_OF_DG_RESERVOIRS ]; ///< Set of Flags that signal if the DG should wait to fill. +static BOOL initialReservoirDrain[ NUM_OF_DG_RESERVOIRS ]; ///< Flags indicate whether a reservoir has been requested to initially drain. // ********** private function prototypes ********** @@ -108,7 +111,9 @@ static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCmdState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCmdRespState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCompleteState( void ); +static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtRequestReservoirSwitchState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtWaitReservoirSwitchState( void ); +static U32 getPreTreatmentFillVolume( DG_RESERVOIR_ID_T inactiveRes ); /*********************************************************************//** * @brief @@ -128,7 +133,17 @@ reservoirFilledStatus[ DG_RESERVOIR_1 ] = FALSE; reservoirFilledStatus[ DG_RESERVOIR_2 ] = FALSE; + reservoirFlushedStatus[ DG_RESERVOIR_1 ] = FALSE; + reservoirFlushedStatus[ DG_RESERVOIR_2 ] = FALSE; + reservoirFlags[ DG_RESERVOIR_1 ].startFlushFill = FALSE; + reservoirFlags[ DG_RESERVOIR_1 ].startNormalFill = FALSE; + reservoirFlags[ DG_RESERVOIR_2 ].startFlushFill = FALSE; + reservoirFlags[ DG_RESERVOIR_2 ].startNormalFill = FALSE; + + initialReservoirDrain[ DG_RESERVOIR_1 ] = FALSE; + initialReservoirDrain[ DG_RESERVOIR_2 ] = FALSE; + initSampleWater(); initConsumableSelfTest(); initPrime(); @@ -474,6 +489,22 @@ /*********************************************************************//** * @brief + * The signalActionToResumeFill function sets the remaining reservior fill + * flags to resume filling while in PreTreatment Mode. + * @details Inputs: none + * @details Outputs: reservoirFlags + * @return none + *************************************************************************/ +void signalActionToResumeFill( void ) +{ + reservoirFlags[ DG_RESERVOIR_1 ].startFlushFill = TRUE; + reservoirFlags[ DG_RESERVOIR_1 ].startNormalFill = TRUE; + reservoirFlags[ DG_RESERVOIR_2 ].startFlushFill = TRUE; + reservoirFlags[ DG_RESERVOIR_2 ].startNormalFill = TRUE; +} + +/*********************************************************************//** + * @brief * The getReservoirFillStatus function returns the fill complete status for * given reservoir. * @details Inputs: reservoirFilledStatus @@ -598,8 +629,7 @@ signalBloodPumpHardStop(); signalDialOutPumpHardStop(); - //setDialInPumpTargetFlowRate( DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialInPumpTargetFlowRate( 250, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); // TODO remove this line once the new flow control is implemented + setDialInPumpTargetFlowRate( DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); cmdStartDGTrimmerHeater(); } @@ -651,8 +681,8 @@ * @brief * The handleSelfTestConsumableState function handles consumable self-test state * during pre-treatment mode. - * @details Inputs: none - * @details Outputs: executed consumable self-test state machine + * @details Inputs: submodeCompleteTransitionTimeCounter + * @details Outputs: execute consumable self-test state machine * @return current state (sub-mode) *************************************************************************/ static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestConsumableState( void ) @@ -897,6 +927,10 @@ currentReservoirMgmtState = handlePreTreatmentReservoirMgmtFillCompleteState(); break; + case PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE: + currentReservoirMgmtState = handlePreTreatmentReservoirMgmtRequestReservoirSwitchState(); + break; + case PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE: currentReservoirMgmtState = handlePreTreatmentReservoirMgmtWaitReservoirSwitchState(); break; @@ -916,7 +950,7 @@ * The handlePreTreatmentReservoirMgmtStartState function handles reservoir * management start state for pre-treatment mode. * @details Inputs: fillReservoirOneStartRequested - * @details Outputs: processed fill reservoir one request + * @details Outputs: fillReservoirOneStartRequested * @return current state of pre-treatment reservoir management *************************************************************************/ static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtStartState( void ) @@ -942,7 +976,7 @@ * @brief * The handlePreTreatmentReservoirMgmtDrainCmdState function sends drain * command to DG when DG is in re-circulate mode. - * @details Inputs: fillReservoirOneStartRequested + * @details Inputs: none * @details Outputs: processed fill reservoir one request * @return current state of pre-treatment reservoir management *************************************************************************/ @@ -1003,7 +1037,8 @@ * @brief * The handlePreTreatmentReservoirMgmtFillCmdState function sends fill * command to DG when DG is in re-circulate mode. - * @details Inputs: DG operation mode and operation sub-mode + * @details Inputs: DG operation mode, DG operation sub-mode, + * reservoirFlushedStatus, reservoirFlags * @details Outputs: sent fill command to DG * @return current state of pre-treatment reservoir management *************************************************************************/ @@ -1012,52 +1047,41 @@ PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; DG_OP_MODE_T dgOpMode = getDGOpMode(); U32 dgSubMode = getDGSubMode(); + U32 volume = 0; + DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { - state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; - - if ( ( TRUE == reservoirFlushedStatus[ DG_RESERVOIR_1 ] ) && ( TRUE == reservoirFlushedStatus[ DG_RESERVOIR_2 ] ) ) + // if fills not yet enabled, check to see if we want to move on to drain the other reservoir + if ( reservoirFlags[ DG_RESERVOIR_1 ].startFlushFill != TRUE ) { - if ( DG_RESERVOIR_1 == getDGInactiveReservoir() ) + if ( ( initialReservoirDrain[ inactiveReservoir ] != TRUE ) || + ( inactiveReservoir != DG_RESERVOIR_1 ) ) { - U32 volume = FILL_RESERVOIR_TO_VOLUME_ML; - -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) != SW_CONFIG_ENABLE_VALUE ) - { - volume = PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML; - } -#endif - - cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); + initialReservoirDrain[ inactiveReservoir ] = TRUE; + state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; } - else - { - U32 volume = FILL_RESERVOIR_TO_VOLUME_ML; - -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) != SW_CONFIG_ENABLE_VALUE ) - { - volume = PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML; - } -#endif - - cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); - } } + else { - U32 volume = PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML; + volume = getPreTreatmentFillVolume( inactiveReservoir ); -#ifndef _RELEASE_ - if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) + // not flushed and need to fill + if ( ( TRUE != reservoirFlushedStatus[ inactiveReservoir ] ) && + ( TRUE == reservoirFlags[ inactiveReservoir ].startFlushFill ) ) { - volume = FILL_RESERVOIR_TO_VOLUME_ML; + cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); + state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; } -#endif - cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); + // flushed and need to fill + if ( ( TRUE == reservoirFlushedStatus[ inactiveReservoir ] ) && + ( TRUE == reservoirFlags[ inactiveReservoir ].startNormalFill ) ) + { + cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); + state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; + } } } @@ -1121,7 +1145,7 @@ { if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) { - state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; } else @@ -1135,7 +1159,7 @@ } else { - state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; if ( FALSE == reservoirFlushedStatus[ DG_RESERVOIR_1 ] ) { @@ -1174,6 +1198,36 @@ /*********************************************************************//** * @brief + * The handlePreTreatmentReservoirMgmtRequestReservoirSwitchState function waits + * until prime operation switches the active reservoir before filling up next reservoir. + * @details Inputs: DG intactive reservoir + * @details Outputs: start filling next reservoir + * @return current state of pre-treatment reservoir management + *************************************************************************/ +static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtRequestReservoirSwitchState( void ) +{ + PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; + DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); + DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); + + //wait after drain or fill + if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) + { + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + + rsrvrCmd.reservoirID = (U32)inactiveReservoir; + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + cmdSetDGActiveReservoir( &rsrvrCmd ); + } + + return state; +} + +/*********************************************************************//** + * @brief * The handlePreTreatmentReservoirMgmtWaitReservoirSwitchState function waits * until prime operation switches the active reservoir before filling up next reservoir. * @details Inputs: DG intactive reservoir @@ -1183,23 +1237,80 @@ static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtWaitReservoirSwitchState( void ) { PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + DG_CMD_RESPONSE_T dgCmdResp; - if ( ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) && ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) ) + // handle fill command response from DG + if ( TRUE == getDGCommandResponse( DG_CMD_SWITCH_RESERVOIR, &dgCmdResp ) ) { - if ( DG_RESERVOIR_2 == getDGInactiveReservoir() ) + if ( DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE == dgCmdResp.rejectCode ) { + + state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; + } + else if ( dgCmdResp.rejectCode != DG_CMD_REQUEST_REJECT_REASON_NONE ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_DG_INVALID_FILL_COMMAND_REJECTED, dgCmdResp.rejectCode ) + } + else + { state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; } } + + return state; +} + +/*********************************************************************//** + * @brief + * The getPreTreatmentFillVolume function determines which volume to fill + * the inactive reservoir. + * @details Inputs: reservoirFlushedStatus + * @details Outputs: none + * @param DG inactive Reservoir + * @return volume to fill + *************************************************************************/ +static U32 getPreTreatmentFillVolume( DG_RESERVOIR_ID_T inactiveRes ) +{ + U32 volume = 0; + + // Fill volumes after flushing + if ( TRUE == reservoirFlushedStatus[ inactiveRes ] ) + { + if ( DG_RESERVOIR_1 == inactiveRes ) + { + volume = FILL_RESERVOIR_TO_VOLUME_ML; +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) != SW_CONFIG_ENABLE_VALUE ) + { + volume = PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML; + } +#endif + } + // Reservoir 2 + else + { + volume = FILL_RESERVOIR_TO_VOLUME_ML; +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) != SW_CONFIG_ENABLE_VALUE ) + { + volume = PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML; + } +#endif + } + } + // Flush fill volumes else { - if ( TRUE == hasDGCompletedReservoirSwitch() ) + volume = PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML; +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) { - state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + volume = FILL_RESERVOIR_TO_VOLUME_ML; } +#endif } - return state; + return volume; } Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r1c17c977d1615b0c96078fd142aa90cd44ef9118 -r7de21ac8b699cafdfeaefbf2c062c3e21bcc956d --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 1c17c977d1615b0c96078fd142aa90cd44ef9118) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 7de21ac8b699cafdfeaefbf2c062c3e21bcc956d) @@ -589,8 +589,13 @@ if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_1 ) ) { - cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + cmdSetDGActiveReservoir( &rsrvrCmd ); + if ( TRUE == hasDGCompletedReservoirSwitch() ) { U32 dialyzerDialysateVolume = getDialyzerDialysateVolume(); @@ -770,8 +775,13 @@ if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_2 ) ) { - cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + cmdSetDGActiveReservoir( &rsrvrCmd ); + if ( TRUE == hasDGCompletedReservoirSwitch() ) { signalBloodPumpHardStop(); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -ref398e685d6cfbdcb8c18fd9319819672c6c9d89 -r7de21ac8b699cafdfeaefbf2c062c3e21bcc956d --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision ef398e685d6cfbdcb8c18fd9319819672c6c9d89) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 7de21ac8b699cafdfeaefbf2c062c3e21bcc956d) @@ -3684,6 +3684,38 @@ /*********************************************************************//** * @brief + * The handleHDDialInPumpRotorCountOverrideRequest function handles a request to + * override the dialysate inlet pump rotor count. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleHDDialInPumpRotorCountOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetDialysateInPumpRotorCountOverride( payload.state.u32 ); + } + else + { + result = testResetDialysateInPumpRotorCountOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The handleTestBloodPumpRotorMeasuredSpeedOverrideRequest function handles a request to * override the measured blood pump rotor speed (RPM). * @details Inputs: none @@ -5219,6 +5251,7 @@ if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) { result = testSetBatteryRemainingPercentOverride( payload.state.f32 ); Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -ref398e685d6cfbdcb8c18fd9319819672c6c9d89 -r7de21ac8b699cafdfeaefbf2c062c3e21bcc956d --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision ef398e685d6cfbdcb8c18fd9319819672c6c9d89) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 7de21ac8b699cafdfeaefbf2c062c3e21bcc956d) @@ -488,6 +488,9 @@ // MSG_ID_BLOOD_ROTOR_COUNT_OVERRIDE void handleHDBloodPumpRotorCountOverrideRequest( MESSAGE_T *message ); +// MSG_ID_DIALYSATE_INLET_PUMP_ROTOR_COUNT_OVERRIDE +void handleHDDialInPumpRotorCountOverrideRequest( MESSAGE_T *message ); + // MSG_ID_BLOOD_PUMP_MC_MEAS_SPEED_OVERRIDE void handleTestBloodPumpMCMeasuredSpeedOverrideRequest( MESSAGE_T *message ); @@ -830,9 +833,6 @@ // MSG_ID_HD_SEND_BLOOD_LEAK_EMB_MODE_RESPONSE BOOL sendBloodLeakEmbeddedModeCommandResponse( U32 responseLen, U08* response ); -// MSG_ID_HD_SEND_ALARMS_COMMAND -void handleResendAllAlarmsCommand( MESSAGE_T* message ); - // MSG_ID_HD_BLOOD_PUMP_SET_PWM void handleTestBloodPumpSetPWM( MESSAGE_T* message );