Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r4e6093159809ef2ddc39d88401390caebe7fa293 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 4e6093159809ef2ddc39d88401390caebe7fa293) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -19,7 +19,8 @@ #include "can.h" #include "etpwm.h" - + +#include "Battery.h" #include "BloodFlow.h" #include "FPGA.h" #include "InternalADC.h" @@ -1248,7 +1249,7 @@ BOOL const isRunningMCCurrentBad = ( ( BLOOD_PUMP_OFF_STATE != bloodPumpState ) && ( bpCurr > BP_MAX_CURR_WHEN_RUNNING_MA ) ? TRUE : FALSE ); if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, isOffMCCurrentBad || isRunningMCCurrentBad ) ) && - ( FALSE == isAlarmActive( ALARM_ID_HD_AC_POWER_LOST ) ) ) + ( FALSE == isACPowerLost() ) ) { #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_MOTOR_CURRNT_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -ra69df990617509469df4ab5763adff6c65b8157e -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision a69df990617509469df4ab5763adff6c65b8157e) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -224,7 +224,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 ); @@ -235,7 +235,7 @@ // 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 @@ -428,14 +428,14 @@ /*********************************************************************//** * @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; } /*********************************************************************//** @@ -456,11 +456,11 @@ * The getDGDisinfectsStates function returns the DG disinfects readings. * @details Inputs: none * @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 -ra69df990617509469df4ab5763adff6c65b8157e -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision a69df990617509469df4ab5763adff6c65b8157e) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -129,6 +129,7 @@ F32 getDialysateTemperature( void ); F32 getHeatDisinfectTemperatureSensorValue( 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/DialInFlow.c =================================================================== diff -u -re87ab4599bd69d195dfb4fc0ffb301df2350dceb -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision e87ab4599bd69d195dfb4fc0ffb301df2350dceb) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -20,7 +20,8 @@ #include "etpwm.h" #include "gio.h" #include "mibspi.h" - + +#include "Battery.h" #include "DialInFlow.h" #include "FPGA.h" #include "InternalADC.h" @@ -1432,7 +1433,8 @@ { F32 dipCurr; - if ( FALSE == isAlarmActive( ALARM_ID_HD_AC_POWER_LOST ) ) + // only check current when we have A/C power + if ( FALSE == isACPowerLost() ) { // DialIn pump should be off if ( DIAL_IN_PUMP_OFF_STATE == dialInPumpState ) Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r75e1ae332d1446dddf9b8d4ce6e8317449c57d67 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 75e1ae332d1446dddf9b8d4ce6e8317449c57d67) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -74,6 +74,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). @@ -635,7 +636,6 @@ } } } - // Check for occlusion in Treatment modes where pumps are moving else if ( MODE_TREA == getCurrentOperationMode() ) { Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -re83374c507e06265cfeb3ad6c96f6175f4cebfd7 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision e83374c507e06265cfeb3ad6c96f6175f4cebfd7) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -93,6 +93,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. @@ -156,8 +157,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 { @@ -296,15 +299,8 @@ syringePumpHomePositionOffset = 0; syringePumpLastPosition = 0; syringePumpVolumeRequired = 0.0; - -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SYRINGE_PUMP_ALARMS ) != SW_CONFIG_ENABLE_VALUE ) - { - syringePumpControllerMeasuredDirection = MOTOR_DIR_FORWARD; - syringePumpEncoderMeasuredDirection = MOTOR_DIR_FORWARD; - } -#endif - + syringePumpControllerMeasuredDirection = MOTOR_DIR_FORWARD; + syringePumpEncoderMeasuredDirection = MOTOR_DIR_FORWARD; syringePumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; syringePumpSpeedCalcTimerCounter = 0; syringePumpRampTimerCtr = 0; Index: firmware/App/Drivers/Battery.c =================================================================== diff -u -r88868fb5e8f2fcc82f50a952be700863f3cbe19c -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Drivers/Battery.c (.../Battery.c) (revision 88868fb5e8f2fcc82f50a952be700863f3cbe19c) +++ firmware/App/Drivers/Battery.c (.../Battery.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -194,6 +194,7 @@ if ( TRUE == didTimeout( lastBatteryMonitorTime, BATTERY_MONITOR_INTERVAL_MS ) ) { lastBatteryMonitorTime = getMSTimerCount(); + getBatteryManagementData(); } } Index: firmware/App/Modes/ConsumableSelfTest.c =================================================================== diff -u -r75e1ae332d1446dddf9b8d4ce6e8317449c57d67 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Modes/ConsumableSelfTest.c (.../ConsumableSelfTest.c) (revision 75e1ae332d1446dddf9b8d4ce6e8317449c57d67) +++ firmware/App/Modes/ConsumableSelfTest.c (.../ConsumableSelfTest.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -109,6 +109,7 @@ if ( TRUE == consumableInstallConfirmed ) // TODO - should we check that concentrate cap is off too? { consumableInstallConfirmed = FALSE; + #ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONSUMABLES_TESTS ) ) { Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -re83374c507e06265cfeb3ad6c96f6175f4cebfd7 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision e83374c507e06265cfeb3ad6c96f6175f4cebfd7) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -1,19 +1,19 @@ /************************************************************************** -* -* 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 ModePreTreat.c -* -* @author (last) Dara Navaei -* @date (last) 03-Jan-2023 -* -* @author (original) Dara Navaei -* @date (original) 05-Nov-2019 -* -***************************************************************************/ + * + * 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 ModePreTreat.c + * + * @author (last) Dara Navaei + * @date (last) 03-Jan-2023 + * + * @author (original) Dara Navaei + * @date (original) 05-Nov-2019 + * + ***************************************************************************/ #include "AlarmMgmt.h" #include "Buttons.h" @@ -46,10 +46,24 @@ /// TODO: Restore to 100 when DPi flow control is fixed. #define DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN 250 ///< Patient connection sub-mode dialysate inlet pump flow rate in mL/min. +#define PRE_TREATMENT_MIN_RESERVOIR_VOLUME_ML 400 ///< Fill reservoir to this volume minimum to prep volume during development. #define PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML 500 ///< Fill reservoir to this volume (in mL) to flush filter and lines. -#define PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML 900 ///< Fill reservoir one to this volume (in mL) during pre-treatment mode. -#define PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML 1100 ///< Fill reservoir two to this volume (in mL) during pre-treatment mode. +#define PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML 1200 ///< Fill reservoir one to this volume (in mL) during pre-treatment mode. +#define PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML 600 ///< Fill reservoir two to this volume (in mL) during pre-treatment mode. +#define PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML 1500 ///< Fill reservoir to this volume minimum to prep volume during development. +#define PRE_TREATMENT_FLUSH_COUNT 2 ///< Number of flush cycles for each reservoir. + +typedef struct +{ + BOOL initialDrain; ///< Flags indicate whether a reservoir has been requested to initially drain. + BOOL startFlushFill; ///< Flags "GO" for a flush reservoir fill, to synchronize with self-test requirements + BOOL startNormalFill; ///< Flags "GO" for a normal reservoir fill, to synchronize with self-test requirements + BOOL flushComplete; ///< Flag indicates a reservoir has been flushed. + BOOL fillComplete; ///< Flag indicates a reservoir has been filled. + U32 flushCount; ///< Flag indicates the number of reservoir flush cycles required. +} PRE_TREATMENT_RESERVOIR_VAR_T; + /// States of the pre-treatment reservoir management state machine. typedef enum PreTreatmentReservoirMgmt_States { @@ -82,12 +96,15 @@ 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 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. +static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current pre-treatment reservoir management state. +static DG_RESERVOIR_ID_T activeReservoir = DG_RESERVOIR_2; +static PRE_TREATMENT_RESERVOIR_VAR_T reservoirStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Detailed state of each reservoir. +#ifndef _RELEASE_ +const PRE_TREATMENT_RESERVOIR_VAR_T reservoirPrimingDisabled = {FALSE,FALSE,FALSE,FALSE,FALSE,(0)}; +#endif +const PRE_TREATMENT_RESERVOIR_VAR_T reservoirPretreatmentInit = {FALSE,FALSE,FALSE,FALSE,FALSE,PRE_TREATMENT_FLUSH_COUNT}; + // ********** private function prototypes ********** static void publishPreTreatmentState( void ); @@ -121,29 +138,35 @@ * @details Inputs: none * @details Outputs: Pre-Treatment Mode module initialized. * @return none -*************************************************************************/ + *************************************************************************/ void initPreTreatmentMode( void ) { + int reservoirIndex = 0; + currentPreTreatmentState = HD_PRE_TREATMENT_WATER_SAMPLE_STATE; currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_START_STATE; setUFVolStatus = FALSE; patientConnectionConfirm = FALSE; fillReservoirOneStartRequested = FALSE; submodeCompleteTransitionTimeCounter = 0; - reservoirFilledStatus[ DG_RESERVOIR_1 ] = FALSE; - reservoirFilledStatus[ DG_RESERVOIR_2 ] = FALSE; - reservoirFlushedStatus[ DG_RESERVOIR_1 ] = FALSE; - reservoirFlushedStatus[ DG_RESERVOIR_2 ] = FALSE; +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) + { + for ( reservoirIndex = 0; reservoirIndex < NUM_OF_DG_RESERVOIRS; reservoirIndex++ ) + { + reservoirStatus[reservoirIndex] = reservoirPrimingDisabled; + } + } + else +#endif + { + for ( reservoirIndex = 0; reservoirIndex < NUM_OF_DG_RESERVOIRS; reservoirIndex++ ) + { + reservoirStatus[reservoirIndex] = reservoirPretreatmentInit; + } + } - 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(); @@ -164,7 +187,7 @@ * @details Inputs: none * @details Outputs: none * @return initial state -*************************************************************************/ + *************************************************************************/ U32 transitionToPreTreatmentMode( void ) { F32 trimmerHeaterTemp = getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ); @@ -208,7 +231,7 @@ * @details Inputs: none * @details Outputs: none * @return current state (sub-mode) -*************************************************************************/ + *************************************************************************/ U32 execPreTreatmentMode( void ) { BOOL stop = isStopButtonPressed(); @@ -490,10 +513,10 @@ *************************************************************************/ 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; + reservoirStatus[ DG_RESERVOIR_1 ].startFlushFill = TRUE; + reservoirStatus[ DG_RESERVOIR_1 ].startNormalFill = TRUE; + reservoirStatus[ DG_RESERVOIR_2 ].startFlushFill = TRUE; + reservoirStatus[ DG_RESERVOIR_2 ].startNormalFill = TRUE; } /*********************************************************************//** @@ -506,7 +529,7 @@ *************************************************************************/ BOOL getReservoirFillStatus( DG_RESERVOIR_ID_T reservoirID ) { - return reservoirFilledStatus[ reservoirID ]; + return reservoirStatus[ reservoirID ].fillComplete; } /*********************************************************************//** @@ -622,8 +645,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(); } @@ -692,12 +714,7 @@ fillReservoirOneStartRequested = TRUE; transitionToNoCartSelfTests(); } -#ifndef _RELEASE_ - if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) -#endif - { - signalActionToResumeFill(); - } + signalActionToResumeFill(); } return state; @@ -911,6 +928,9 @@ *************************************************************************/ static void execPreTreatmentReservoirMgmt( void ) { + // update the active reservoir. + activeReservoir = getDGActiveReservoir(); + // treatment reservoir mgmt. state machine switch ( currentReservoirMgmtState ) { @@ -976,7 +996,6 @@ rsrvrCmd.useLastTrimmerHeaterDC = FALSE; fillReservoirOneStartRequested = FALSE; state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; - cmdSetDGActiveReservoir( &rsrvrCmd ); } @@ -1008,8 +1027,15 @@ { if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { - state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, FALSE, TRUE ); + if ( FALSE == reservoirStatus[ activeReservoir ].flushComplete ) + { + state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; + cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, FALSE, TRUE ); + } + else + { + state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; + } } } @@ -1054,7 +1080,7 @@ * The handlePreTreatmentReservoirMgmtFillCmdState function sends fill * command to DG when DG is in re-circulate mode. * @details Inputs: DG operation mode, DG operation sub-mode, - * reservoirFlushedStatus, reservoirFlags + * reservoirStatus.flushedStatus, reservoirStatus * @details Outputs: sent fill command to DG * @return current state of pre-treatment reservoir management *************************************************************************/ @@ -1064,36 +1090,40 @@ 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 ) ) { // Drain both reservoirs and return to active res 2 before initial fills - if ( initialReservoirDrain[ inactiveReservoir ] != TRUE ) + if ( reservoirStatus[ activeReservoir ].initialDrain != TRUE ) { - initialReservoirDrain[ inactiveReservoir ] = TRUE; + reservoirStatus[ activeReservoir ].initialDrain = TRUE; state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; } - // Once both reservoirs drained and returned to active res 2, wait for pre-tx workflow to get to point where fills allowed before filling - else if ( TRUE == reservoirFlags[ DG_RESERVOIR_1 ].startFlushFill ) - { - volume = getPreTreatmentFillVolume( inactiveReservoir ); - // not flushed and need to fill - if ( ( TRUE != reservoirFlushedStatus[ inactiveReservoir ] ) && - ( TRUE == reservoirFlags[ inactiveReservoir ].startFlushFill ) ) + // Once both reservoirs drained and returned to active res 2, wait for pre-tx workflow + // to get to point where fills are allowed, before starting fill + // not flushed and need to fill -OR- + // flushed and need to fill after entering dry self test state + else if ( ( TRUE == reservoirStatus[ activeReservoir ].startFlushFill ) || + ( ( TRUE == reservoirStatus[ activeReservoir ].startNormalFill ) && + ( currentPreTreatmentState >= HD_PRE_TREATMENT_SELF_TEST_DRY_STATE ) ) ) + { + // Start tracking flush cycles, flushComplete => don't drain again. + if ( FALSE == reservoirStatus[ activeReservoir ].flushComplete ) { - cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); - state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; + if (0 < reservoirStatus[ activeReservoir ].flushCount) + { + reservoirStatus[ activeReservoir ].flushCount -= 1; + } + if ( 0 == reservoirStatus[ activeReservoir ].flushCount ) + { + reservoirStatus[ activeReservoir ].flushComplete = TRUE; + } } - // 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; - } + volume = getPreTreatmentFillVolume( activeReservoir ); + cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); + state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; } } @@ -1153,53 +1183,20 @@ if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { - if ( ( TRUE == reservoirFlushedStatus[ DG_RESERVOIR_1 ] ) && ( TRUE == reservoirFlushedStatus[ DG_RESERVOIR_2 ] ) ) + state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; + + if ( ( TRUE == reservoirStatus[ DG_RESERVOIR_1 ].flushComplete ) && + ( TRUE == reservoirStatus[ DG_RESERVOIR_2 ].flushComplete ) ) { - if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) - { - state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; - reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; - } - else - { - if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) - { - reservoirFilledStatus[ DG_RESERVOIR_2 ] = TRUE; - state = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; - } - } + reservoirStatus[ activeReservoir ].fillComplete = TRUE; } else { - state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; - if ( FALSE == reservoirFlushedStatus[ DG_RESERVOIR_1 ] ) - { -#ifndef _RELEASE_ - if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) - { - reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; - } - else -#endif - { - DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; - - rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; - rsrvrCmd.useLastTrimmerHeaterDC = FALSE; - reservoirFlushedStatus[ DG_RESERVOIR_1 ] = TRUE; - cmdSetDGActiveReservoir( &rsrvrCmd ); - } - } - else - { - DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; - - rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_2; - rsrvrCmd.useLastTrimmerHeaterDC = FALSE; - reservoirFlushedStatus[ DG_RESERVOIR_2 ] = TRUE; - cmdSetDGActiveReservoir( &rsrvrCmd ); - } + rsrvrCmd.reservoirID = activeReservoir; + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + cmdSetDGActiveReservoir( &rsrvrCmd ); } } @@ -1210,7 +1207,7 @@ * @brief * The handlePreTreatmentReservoirMgmtRequestReservoirSwitchState function waits * until prime operation switches the active reservoir before filling up next reservoir. - * @details Inputs: DG intactive reservoir + * @details Inputs: DG inactive reservoir * @details Outputs: start filling next reservoir * @return current state of pre-treatment reservoir management *************************************************************************/ @@ -1239,7 +1236,7 @@ * @brief * The handlePreTreatmentReservoirMgmtWaitReservoirSwitchState function waits * until prime operation switches the active reservoir before filling up next reservoir. - * @details Inputs: DG intactive reservoir + * @details Inputs: DG inactive reservoir * @details Outputs: start filling next reservoir * @return current state of pre-treatment reservoir management *************************************************************************/ @@ -1272,7 +1269,7 @@ * @brief * The getPreTreatmentFillVolume function determines which volume to fill * the inactive reservoir. - * @details Inputs: reservoirFlushedStatus + * @details Inputs: reservoirStatus.flushedStatus * @details Outputs: none * @param DG inactive Reservoir * @return volume to fill @@ -1282,40 +1279,22 @@ U32 volume = 0; // Fill volumes after flushing - if ( TRUE == reservoirFlushedStatus[ inactiveRes ] ) + if ( TRUE == reservoirStatus[ inactiveRes ].flushComplete ) { 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 + volume = PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML; } // 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 + volume = PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML; } } // Flush fill volumes else { volume = PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML; -#ifndef _RELEASE_ - if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) - { - volume = FILL_RESERVOIR_TO_VOLUME_ML; - } -#endif } return volume; Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r949b386b5f58ab8bc534bd7e913ecb9f2c084c17 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 949b386b5f58ab8bc534bd7e913ecb9f2c084c17) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -69,6 +69,7 @@ static OVERRIDE_U32_T standbyModePublishInterval = { DISINFECTS_DATA_PUB_INTERVAL, DISINFECTS_DATA_PUB_INTERVAL, DISINFECTS_DATA_PUB_INTERVAL, 0 }; static const U32 SERVICE_TIME_INTERVAL_S = (U32)( 365 * 0.5 * SECONDS_IN_A_DAY ); ///< HD/DG 6-month service interval in seconds. +static BOOL homingInitiated; ///< Flag indicates actuator homing has been initiated from standby mode. // ********** private function prototypes ********** @@ -112,6 +113,7 @@ heatDisinfectStartReqReceived = FALSE; chemDisinfectStartReqReceived = FALSE; disinfectCancelReqID = GENERIC_CONFIRM_ID_NONE; + homingInitiated = FALSE; dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; homingInitiated = FALSE; } Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r75e1ae332d1446dddf9b8d4ce6e8317449c57d67 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 75e1ae332d1446dddf9b8d4ce6e8317449c57d67) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -46,6 +46,7 @@ #define BLOOD_PUMP_FAST_FLOW_RATE_CIRC_BLOOD_CIRCUIT_ML_MIN 300 ///< Blood pump fast flow rate during prime recirculate blood circuit state. #define BLOOD_PUMP_FLOW_RATE_SALINE_DIALYZER_ML_MIN 300 ///< Blood pump flow rate during prime the saline dialyzer dialysate state. #define DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN 300 ///< Dialysate pump flow rate during priming fluid path. +#define DIALYSATE_PUMP_FAST_PRIME_FLOW_RATE_ML_MIN 600 ///< Dialysate pump flow rate during priming fluid path. #define DPO_PUMP_PRIME_FLOW_RATE_ML_MIN 225 ///< Dialysate outlet pump flow rate needed to match PWM with dialysate inlet pump @ 300 mL/min in open loop mode. #define DIALYSATE_DIALYZER_TUBE_VOLUME_ML 115 ///< This total tube volume is used to calculate the Dpi & Dpo time out in the dialysate dialyzer state. @@ -877,15 +878,15 @@ { DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; - rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_2; rsrvrCmd.useLastTrimmerHeaterDC = FALSE; cmdSetDGActiveReservoir( &rsrvrCmd ); if ( TRUE == hasDGCompletedReservoirSwitch() ) { signalBloodPumpHardStop(); - setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialInPumpTargetFlowRate( DIALYSATE_PUMP_FAST_PRIME_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r75e1ae332d1446dddf9b8d4ce6e8317449c57d67 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 75e1ae332d1446dddf9b8d4ce6e8317449c57d67) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -76,7 +76,8 @@ #define WET_SELF_TEST_INTEGRATED_VOLUME_PCT_TOLERANCE 0.05F ///< Tolerance on integrated volume as a percentage (5%). #define WET_SELF_TEST_INTEGRATED_VOLUME_TOLERANCE 20.0F ///< Tolerance on integrated volume in grams. #define WET_SELF_TEST_DISPLACEMENT_TOLERANCE_G 20.0F ///< Tolerance in the load cell readings of the displacement in grams. -#define WET_SELF_TEST_DISPLACEMENT_TIME_MS ( SEC_PER_MIN * MS_PER_SECOND ) ///< Time to displace dialysate in wet self-test in ms. +#define WET_SELF_TEST_FIRST_DISPLACEMENT_TIME_MS ( SEC_PER_MIN * MS_PER_SECOND ) ///< Time to displace dialysate in wet self-test in ms (first). +#define WET_SELF_TEST_SECOND_DISPLACEMENT_TIME_MS ( 30 * MS_PER_SECOND ) ///< Time to displace dialysate in wet self-test in ms (second). #define RESERVOIR_SETTLE_TIME_MS ( 5 * MS_PER_SECOND ) ///< Time allotted for reservoir to settle in ms. #define MAX_NO_CARTRIDGE_SELF_TEST_TIME 30 ///< Maximum no cartridge self-test time (in seconds). @@ -359,7 +360,7 @@ } else { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_NO_CART_SELF_TEST_TIMEOUT, currentNoCartSelfTestsState ); +// SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_NO_CART_SELF_TEST_TIMEOUT, currentNoCartSelfTestsState ); } } } @@ -592,7 +593,8 @@ WET_SELF_TESTS_STATE_T priorSubState = currentWetSelfTestsState; #ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_WET_SELF_TEST ) == SW_CONFIG_ENABLE_VALUE ) + if ( ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) || + ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_WET_SELF_TEST ) ) ) { currentWetSelfTestsState = WET_SELF_TESTS_COMPLETE_STATE; } @@ -1043,7 +1045,7 @@ else { #ifndef _RELEASE_ - if ( SW_CONFIG_DISABLE_VALUE != getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) { // Wait for reservoirs to drain before starting this test @@ -1766,10 +1768,10 @@ // This is not a volume for now and it is a flow rate. fmdIntegratedVolume += getMeasuredDialInFlowRate(); - if ( TRUE == didTimeout( displacementStartTime, WET_SELF_TEST_DISPLACEMENT_TIME_MS ) ) + if ( TRUE == didTimeout( displacementStartTime, WET_SELF_TEST_FIRST_DISPLACEMENT_TIME_MS ) ) { signalDialInPumpHardStop(); - fmdIntegratedVolume = ( ( fmdIntegratedVolume * TASK_GENERAL_INTERVAL ) / ( WET_SELF_TEST_DISPLACEMENT_TIME_MS ) ); + fmdIntegratedVolume = ( ( fmdIntegratedVolume * TASK_GENERAL_INTERVAL ) / ( WET_SELF_TEST_FIRST_DISPLACEMENT_TIME_MS ) ); settleStartTime = getMSTimerCount(); state = WET_SELF_TESTS_FIRST_DISPLACEMENT_VERIFY_STATE; } @@ -1918,10 +1920,10 @@ { fmdIntegratedVolume += getMeasuredDialInFlowRate(); - if ( TRUE == didTimeout( displacementStartTime, WET_SELF_TEST_DISPLACEMENT_TIME_MS ) ) + if ( TRUE == didTimeout( displacementStartTime, WET_SELF_TEST_SECOND_DISPLACEMENT_TIME_MS ) ) { signalDialInPumpHardStop(); - fmdIntegratedVolume = ( ( fmdIntegratedVolume * TASK_GENERAL_INTERVAL ) / ( WET_SELF_TEST_DISPLACEMENT_TIME_MS ) ); + fmdIntegratedVolume = ( ( fmdIntegratedVolume * TASK_GENERAL_INTERVAL ) / ( WET_SELF_TEST_SECOND_DISPLACEMENT_TIME_MS ) ); settleStartTime = getMSTimerCount(); state = WET_SELF_TESTS_SECOND_DISPLACEMENT_VERIFY_STATE; } Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r75e1ae332d1446dddf9b8d4ce6e8317449c57d67 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 75e1ae332d1446dddf9b8d4ce6e8317449c57d67) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -998,23 +998,24 @@ else { if ( alarmStatus.alarmsState < NUM_OF_ALARM_PRIORITIES ) -#ifndef _RELEASE_ { - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_ALARM_AUDIO ) != SW_CONFIG_ENABLE_VALUE ) +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_ALARM_AUDIO ) ) { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_AUDIO_INVALID_ALARM_STATE, alarmStatus.alarmsState ) + setAlarmAudioState( ALARM_PRIORITY_HIGH, + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_GAIN], + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_DIVIDER] ); + } + + else +#endif + { setAlarmAudioState( alarmStatus.alarmsState, ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_GAIN], ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_DIVIDER] ); } } - else -#endif - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_AUDIO_INVALID_ALARM_STATE, alarmStatus.alarmsState ) - setAlarmAudioState( ALARM_PRIORITY_HIGH, - ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_GAIN], - ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_DIVIDER] ); - } } } Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -red4d9f0a8493695e63d4b226d1c3d885a00b7565 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision ed4d9f0a8493695e63d4b226d1c3d885a00b7565) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -1704,6 +1704,13 @@ handleAirPumpSetState( message ); break; + case MSD_ID_HD_RTC_CTL_REG1_STATUS_OVERRIDE: + handleHDRTCControlReg1StatusOverrideRequest( message ); + break; + + case MSD_ID_HD_RTC_CTL_REG3_STATUS_OVERRIDE: + handleHDRTCControlReg3StatusOverrideRequest( message ); + break; // The default cannot be reached in VectorCAST since the cases are run in a for loop default: // Unrecognized message ID received - ignore Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r39156e21acec61d20fa49ee0adfffedf0f8597d9 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 39156e21acec61d20fa49ee0adfffedf0f8597d9) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -5269,6 +5269,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 ); @@ -7779,4 +7780,68 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/*********************************************************************//** + * @brief + * The handleHDRTCControlReg1StatusOverrideRequest function handles a + * request to override RTC control register 1. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleHDRTCControlReg1StatusOverrideRequest( 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 = testSetRTCCtlReg1Status( payload.state.u32 ); + } + else + { + result = testResetRTCCtlReg1Status(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleHDRTCControlReg3StatusOverrideRequest function handles a + * request to override RTC control register 3. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleHDRTCControlReg3StatusOverrideRequest( 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 = testSetRTCCtlReg3Status( payload.state.u32 ); + } + else + { + result = testResetRTCCtlReg3Status(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r03bd494bf7b7c96f79cf9b8bd0f99432982b9571 -r364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 03bd494bf7b7c96f79cf9b8bd0f99432982b9571) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 364631fbb6ffd3ab52271e1cc5b71ee9e2cc777f) @@ -843,9 +843,6 @@ // MSG_ID_HD_SEND_BLOOD_LEAK_EMB_MODE_RESPONSE BOOL sendBloodLeakEmbeddedModeCommandResponse( U08 cmd, 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 ); @@ -864,6 +861,12 @@ // MSG_ID_HD_AIR_PUMP_SET_STATE void handleAirPumpSetState( MESSAGE_T * message ); +// MSD_ID_HD_RTC_CTL_REG1_STATUS_OVERRIDE +void handleHDRTCControlReg1StatusOverrideRequest( MESSAGE_T * message ); + +// MSD_ID_HD_RTC_CTL_REG3_STATUS_OVERRIDE +void handleHDRTCControlReg3StatusOverrideRequest( MESSAGE_T * message ); + /**@}*/ #endif