Index: firmware/App/Controllers/AirPump.c =================================================================== diff -u -rdb291cc22fd8f10e6e47cad468e14ed5590a94f2 -rda8c4c5b6bb51f929119d5efac9739e036339bd6 --- firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision db291cc22fd8f10e6e47cad468e14ed5590a94f2) +++ firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision da8c4c5b6bb51f929119d5efac9739e036339bd6) @@ -34,16 +34,15 @@ // ********** private definitions ********** -#define AIR_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) -#define DATA_PUBLISH_COUNTER_START_COUNT 13 -#define AIR_PUMP_GPIO_PIN 0x04 -#define AIR_PUMP_OPERATION_TIMEOUT ( 10 * MS_PER_SECOND ) +#define AIR_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Air pump data publish interval. +#define DATA_PUBLISH_COUNTER_START_COUNT 13 ///< Air pump data publish start counter. +#define AIR_PUMP_GPIO_PIN 0x04 ///< Air pump GPIO pin number. typedef enum AirPumpMotorStates { - AIR_PUMP_MOTOR_OFF = 0, ///< Air Pump Off - AIR_PUMP_MOTOR_ON, ///< Air Pump On - NUM_OF_AIR_PUMP_MOTOR_STATES, + AIR_PUMP_MOTOR_OFF = 0, ///< Air Pump Off. + AIR_PUMP_MOTOR_ON, ///< Air Pump On. + NUM_OF_AIR_PUMP_MOTOR_STATES, ///< Number of air pump motor states. } AIR_PUMP_MOTOR_STATE_T; @@ -60,9 +59,7 @@ static AIR_PUMP_STATE_T handleAirPumpOffState( void ); static AIR_PUMP_STATE_T handleAirPumpOnState ( void ); static void publishAirPumpData( void ); -static void execAirPumpMonitor( void ); static void setAirPumpMotor( AIR_PUMP_MOTOR_STATE_T state ); -static AIR_PUMP_MOTOR_STATE_T getAirPumpMotorState( void ); /*********************************************************************//** * @brief @@ -76,7 +73,6 @@ airPumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; currentAirPumpState = AIR_PUMP_STATE_INIT; currentAirPumpMotorState = AIR_PUMP_MOTOR_OFF; - initPersistentAlarm( ALARM_ID_HD_AIR_PUMP_TIMEOUT, 0, AIR_PUMP_OPERATION_TIMEOUT ); } /*********************************************************************//** @@ -106,18 +102,6 @@ /*********************************************************************//** * @brief - * The getAirPumpMotorState function returns the current air pump motor state. - * @details Inputs: currentAirPumpMotorState - * @details Outputs: currentAirPumpMotorState - * @return current state of the air pump state machine. - *************************************************************************/ -static AIR_PUMP_MOTOR_STATE_T getAirPumpMotorState( void ) -{ - return currentAirPumpMotorState; -} - -/*********************************************************************//** - * @brief * The setAirPumpState function sets the current air pump state machine state. * @details Inputs: currentAirPumpState * @details Outputs: currentAirPumpState @@ -175,33 +159,11 @@ break; } - execAirPumpMonitor(); publishAirPumpData(); } /*********************************************************************//** * @brief - * The execAirPumpMonitor function executes the air pump monitor. - * @details Inputs: HD operation mode - * @details Outputs: none - * @return none - *************************************************************************/ -void execAirPumpMonitor( void ) -{ - if ( MODE_TREA == getCurrentOperationMode() ) - { - BOOL isAirPumpOn = ( AIR_PUMP_MOTOR_OFF == getAirPumpMotorState() ? FALSE : TRUE ); - - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_AIR_PUMP_TIMEOUT, isAirPumpOn ) ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AIR_PUMP_TIMEOUT, isAirPumpOn ); - setAirPumpState( AIR_PUMP_STATE_OFF ); - } - } -} - -/*********************************************************************//** - * @brief * The handleAirPumpStartState function starts the air pump state machine. * @details Inputs: none * @details Outputs: none Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r3c0614e16047ada1ea30c9e7f883f78d98b363e3 -rda8c4c5b6bb51f929119d5efac9739e036339bd6 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 3c0614e16047ada1ea30c9e7f883f78d98b363e3) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision da8c4c5b6bb51f929119d5efac9739e036339bd6) @@ -30,6 +30,7 @@ #include "ModeStandby.h" #include "ModeTreatment.h" #include "ModeTreatmentParams.h" +#include "NVDataMgmt.h" #include "OperationModes.h" #include "RTC.h" #include "Switches.h" @@ -453,10 +454,17 @@ { if ( TRUE == isDGCommunicating() ) { - setRequestedCleaningMode( DG_MODE_CHEM ); - result = TRUE; - currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; - rejReason = REQUEST_REJECT_REASON_NONE; + if ( TRUE == isChemDisinfectEnabledInInstitRecord() ) + { + setRequestedCleaningMode( DG_MODE_CHEM ); + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_CHEM_DISINFECT_NOT_ENABLED_INST_CONFIG; + } } else { @@ -472,13 +480,13 @@ /*********************************************************************//** * @brief - * The signalUserInitiateChemcialDisinfectFlushMode function handles user + * The signalUserInitiateChemicalDisinfectFlushMode function handles user * initiation of chemical disinfect flush mode. * @details Inputs: currentStandbyState * @details Outputs: chemDisinfectFlushStartReqReceived, currentStandbyState * @return TRUE if signal accepted, FALSE if not *************************************************************************/ -BOOL signalUserInitiateChemcialDisinfectFlushMode( void ) +BOOL signalUserInitiateChemicalDisinfectFlushMode( void ) { BOOL result = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; @@ -489,10 +497,17 @@ { if ( TRUE == isDGCommunicating() ) { - setRequestedCleaningMode( DG_MODE_CHFL ); - result = TRUE; - currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; - rejReason = REQUEST_REJECT_REASON_NONE; + if ( TRUE == isChemDisinfectEnabledInInstitRecord() ) + { + setRequestedCleaningMode( DG_MODE_CHFL ); + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_CHEM_DISINFECT_NOT_ENABLED_INST_CONFIG; + } } else { Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -rdb291cc22fd8f10e6e47cad468e14ed5590a94f2 -rda8c4c5b6bb51f929119d5efac9739e036339bd6 --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision db291cc22fd8f10e6e47cad468e14ed5590a94f2) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision da8c4c5b6bb51f929119d5efac9739e036339bd6) @@ -43,7 +43,7 @@ BOOL signalUserInitiateFlushMode( void ); BOOL signalUserInitiateHeatDisinfectMode( void ); BOOL signalUserInitiateChemicalDisinfectMode( void ); -BOOL signalUserInitiateChemcialDisinfectFlushMode( void ); +BOOL signalUserInitiateChemicalDisinfectFlushMode( void ); BOOL signalUserInitiateROPermeateSampleMode( void ); BOOL signalInitiateStandbyDisinfectSubmode( U32 cmd ); void signalROPermeateSampleDGReadyToDispense( void ); Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -r3c0614e16047ada1ea30c9e7f883f78d98b363e3 -rda8c4c5b6bb51f929119d5efac9739e036339bd6 --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 3c0614e16047ada1ea30c9e7f883f78d98b363e3) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision da8c4c5b6bb51f929119d5efac9739e036339bd6) @@ -42,6 +42,7 @@ #define NO_HEPARIN_PRE_STOP_TIME_SET 0 ///< Zero value indicates no Heparin pre-stop time was set by user #define NO_HEPARIN_TYPE_SET 0xFFFFFFFF ///< UI will send this value for Heparin type if Heparin not used +#define INSTIT_CHEM_DISINFECT_ENABLE_RANGE 1 ///< Institutional record chemical disinfect enable/disable allowable range /// Record for range and default of treatment parameters. typedef struct @@ -964,54 +965,67 @@ ( nvInstRcrd->minBloodFlowMLPM <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_BLOOD_FLOW ].max.uInt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxBloodFlowMLPM >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_BLOOD_FLOW ].min.uInt ) && ( nvInstRcrd->maxBloodFlowMLPM <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_BLOOD_FLOW ].max.uInt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minBloodFlowMLPM <= nvInstRcrd->maxBloodFlowMLPM ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->minDialysateFlowMLPM >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_DIALYSATE_FLOW ].min.uInt ) && ( nvInstRcrd->minDialysateFlowMLPM <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_DIALYSATE_FLOW ].max.uInt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxDialysateFlowMLPM >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_DIALYSATE_FLOW ].min.uInt ) && ( nvInstRcrd->maxDialysateFlowMLPM <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_DIALYSATE_FLOW ].max.uInt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minDialysateFlowMLPM <= nvInstRcrd->maxDialysateFlowMLPM ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->minTxDurationMIN >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_TREATMENT_DURATION ].min.uInt ) && ( nvInstRcrd->minTxDurationMIN <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_TREATMENT_DURATION ].max.uInt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxTxDurationMIN >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_TREATMENT_DURATION ].min.uInt ) && ( nvInstRcrd->maxTxDurationMIN <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_TREATMENT_DURATION ].max.uInt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minTxDurationMIN <= nvInstRcrd->maxTxDurationMIN ) ? TRUE : FALSE ); #ifndef _VECTORCAST_ // The heparin stop time has been masked out from VectorCAST because the minimum time is 0 minutes while the variable is a U32 so it cannot be // tested in VectorCAST by setting the minimum to less than 0. result &= ( ( nvInstRcrd->minStopHeparinDispBeforeTxEndMIN >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ].min.uInt ) && ( nvInstRcrd->minStopHeparinDispBeforeTxEndMIN <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ].max.uInt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxStopHeparinDispBeforeTxEndMIN >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ].min.uInt ) && ( nvInstRcrd->maxStopHeparinDispBeforeTxEndMIN <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ].max.uInt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minStopHeparinDispBeforeTxEndMIN <= nvInstRcrd->maxStopHeparinDispBeforeTxEndMIN ) ? TRUE : FALSE ); #endif result &= ( ( nvInstRcrd->minSalineBolusVolumeML >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_SALINE_BOLUS_VOLUME ].min.uInt ) && ( nvInstRcrd->minSalineBolusVolumeML <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_SALINE_BOLUS_VOLUME ].max.uInt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxSalineBolusVolumeML >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_SALINE_BOLUS_VOLUME ].min.uInt ) && ( nvInstRcrd->maxSalineBolusVolumeML <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_SALINE_BOLUS_VOLUME ].max.uInt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minSalineBolusVolumeML <= nvInstRcrd->maxSalineBolusVolumeML ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->minDialysateTempC >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_DIALYSATE_TEMPERATURE ].min.sFlt ) && ( nvInstRcrd->minDialysateTempC <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_DIALYSATE_TEMPERATURE ].max.sFlt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxDialysateTempC >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_DIALYSATE_TEMPERATURE ].min.sFlt ) && ( nvInstRcrd->maxDialysateTempC <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_DIALYSATE_TEMPERATURE ].max.sFlt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minDialysateTempC <= nvInstRcrd->maxDialysateTempC ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->minArtPressLimitWindowMMHG >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ].min.sInt ) && ( nvInstRcrd->minArtPressLimitWindowMMHG <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ].max.sInt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxArtPressLimitWindowMMHG >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ].min.sInt ) && ( nvInstRcrd->maxArtPressLimitWindowMMHG <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ].max.sInt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minArtPressLimitWindowMMHG <= nvInstRcrd->maxArtPressLimitWindowMMHG ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->minVenPressLimitWindowMMHG >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ].min.sInt ) && ( nvInstRcrd->minVenPressLimitWindowMMHG <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ].max.sInt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxVenPressLimitWindowMMHG >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ].min.sInt ) && ( nvInstRcrd->maxVenPressLimitWindowMMHG <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ].max.sInt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minVenPressLimitWindowMMHG <= nvInstRcrd->maxVenPressLimitWindowMMHG ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->minVenAsymPressLimitMMHG >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ].min.sInt ) && ( nvInstRcrd->minVenAsymPressLimitMMHG <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ].max.sInt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxVenAsymPressLimitMMHG >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ].min.sInt ) && ( nvInstRcrd->maxVenAsymPressLimitMMHG <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ].max.sInt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minVenAsymPressLimitMMHG <= nvInstRcrd->maxVenAsymPressLimitMMHG ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->minUFVolumeL >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_UF_VOLUME ].min.sFlt ) && ( nvInstRcrd->minUFVolumeL <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_UF_VOLUME ].max.sFlt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxUFVolumeL >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_UF_VOLUME ].min.sFlt ) && ( nvInstRcrd->maxUFVolumeL <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_UF_VOLUME ].max.sFlt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minUFVolumeL <= nvInstRcrd->maxUFVolumeL ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->minHeparinDispRateMLPHR >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ].min.sFlt ) && ( nvInstRcrd->minHeparinDispRateMLPHR <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ].max.sFlt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxHeparinDispRateMLPHR >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ].min.sFlt ) && ( nvInstRcrd->maxHeparinDispRateMLPHR <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ].max.sFlt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minHeparinDispRateMLPHR <= nvInstRcrd->maxHeparinDispRateMLPHR ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->minHeparinBolusVolumeML >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ].min.sFlt ) && ( nvInstRcrd->minHeparinBolusVolumeML <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ].max.sFlt ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->maxHeparinBolusVolumeML >= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ].min.sFlt ) && ( nvInstRcrd->maxHeparinBolusVolumeML <= TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ].max.sFlt ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minHeparinBolusVolumeML <= nvInstRcrd->maxHeparinBolusVolumeML ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->enableChemicalDisinfect <= INSTIT_CHEM_DISINFECT_ENABLE_RANGE ) ? TRUE : FALSE ); return result; } Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r3c0614e16047ada1ea30c9e7f883f78d98b363e3 -rda8c4c5b6bb51f929119d5efac9739e036339bd6 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 3c0614e16047ada1ea30c9e7f883f78d98b363e3) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision da8c4c5b6bb51f929119d5efac9739e036339bd6) @@ -855,7 +855,7 @@ } else if ( DG_DISINFECT_CHEM_FLUSH_STATE == cmd ) // Command 3 = chemical disinfect flush { - result = signalUserInitiateChemcialDisinfectFlushMode(); + result = signalUserInitiateChemicalDisinfectFlushMode(); } else if ( DG_DISINFECT_RO_PERMEATE_SAMPLE_STATE == cmd ) // Command 4 = RO permeate sample {