Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -rdd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37 -r9abed0946b73f7255b51553d5bbb1008d0e4fde5 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision dd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 9abed0946b73f7255b51553d5bbb1008d0e4fde5) @@ -25,7 +25,7 @@ #include "ModeInitPOST.h" #include "ModeTreatment.h" #include "ModeTreatmentParams.h" -#include "OperationModes.h" +#include "OperationModes.h" #include "PersistentAlarm.h" #include "SystemComm.h" #include "SystemCommMessages.h" @@ -58,12 +58,12 @@ // ********** private data ********** -// DG status -static DG_OP_MODE_T dgCurrentOpMode; ///< Current DG operation mode. +// DG status +static DG_OP_MODE_T dgCurrentOpMode; ///< Current DG operation mode. static U32 dgSubMode; ///< Current state (sub-mode) of current DG operation mode. -static BOOL dgStartCommandSent; ///< Flag indicates command to start DG has been sent. -static BOOL dgStarted; ///< Flag indicates whether we have commanded the DG to start or stop. -static BOOL dgTrimmerHeaterOn; ///< Flag indicates whether we have commanded the DG to start or stop the trimmer heater. +static BOOL dgStartCommandSent; ///< Flag indicates command to start DG has been sent. +static BOOL dgStarted; ///< Flag indicates whether we have commanded the DG to start or stop. +static BOOL dgTrimmerHeaterOn; ///< Flag indicates whether we have commanded the DG to start or stop the trimmer heater. // DG sensor data static F32 dgDialysateTemp; ///< Dialysate temperature reported by the DG. @@ -125,12 +125,12 @@ U32 i, j; // NOTE: the active reservoir is set to reservoir 1 since DG will send active reservoir 1 as active on power up - dgStarted = FALSE; - dgTrimmerHeaterOn = FALSE; + dgStarted = FALSE; + dgTrimmerHeaterOn = FALSE; dgTrimmerTempSet = 0.0F; - dgTrimmerTempCheckTimerCtr = 0; - dgActiveReservoirSet = DG_RESERVOIR_2; - dgActiveReservoir = DG_RESERVOIR_2; + dgTrimmerTempCheckTimerCtr = 0; + dgActiveReservoirSet = DG_RESERVOIR_1; + dgActiveReservoir = DG_RESERVOIR_1; dgDialysateTemp = 0.0F; dgCurrentOpMode = DG_MODE_INIT; dgSubMode = 0; @@ -459,14 +459,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 latest dialysate temperature + * @return the current DG disinfects readings *************************************************************************/ -F32 getDialysateTemperature( void ) +DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ) { - return dgDialysateTemp; + return disinfectsStatus; } /*********************************************************************//** @@ -510,14 +510,14 @@ /*********************************************************************//** * @brief - * The getDGDisinfectsStates function returns the DG disinfects readings. - * @details Inputs: disinfectsStatus + * The getDialysateTemperature function returns the DG dialysate temperature. + * @details Inputs: dgDialysateTemp * @details Outputs: none - * @return the current DG disinfects readings + * @return the latest dialysate temperature *************************************************************************/ -DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ) +F32 getDialysateTemperature( void ) { - return disinfectsStatus; + return dgDialysateTemp; } /*********************************************************************//** @@ -967,6 +967,21 @@ /*********************************************************************//** * @brief + * The cmdDGParkConcentratePumps function sends a park concentrate pumps command + * message to the DG. + * @details Inputs: none + * @details Outputs: park concentrate pumps command sent to DG. + * @return none + *************************************************************************/ +void cmdDGParkConcentratePumps( void ) +{ + dgCmdResp[ DG_CMD_PARK_CONCENTRATE_PUMPS ].commandID = DG_CMD_NONE; + + sendDGParkConcentratePumpsCommand( ); +} + +/*********************************************************************//** + * @brief * The cmdStartDGFlush function sends a start flush command message to * the DG. * @details Inputs: none Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -rdd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37 -r9abed0946b73f7255b51553d5bbb1008d0e4fde5 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision dd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 9abed0946b73f7255b51553d5bbb1008d0e4fde5) @@ -122,6 +122,7 @@ F32 getHeatDisinfectTemperatureSensorValue( void ); BOOL getTrimmerHeaterCommandedOn( 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 ); @@ -148,6 +149,7 @@ void cmdStopDGTrimmerHeater( void ); void cmdDGSampleWater( SAMPLE_WATER_CMD_T cmd ); void cmdStartDGFlush( void ); +void cmdDGParkConcentratePumps( void ); void cmdStopDGFlush( void ); void cmdStartDGHeatDisinfect( void ); void cmdStopDGHeatDisinfect( void ); Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -rdd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37 -r9abed0946b73f7255b51553d5bbb1008d0e4fde5 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision dd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 9abed0946b73f7255b51553d5bbb1008d0e4fde5) @@ -164,10 +164,12 @@ #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. #define SYRINGE_PUMP_OCCLUSION_PERSISTENCE 50 ///< Syringe pump occlusion persistence timer in milliseconds. #define SYRINGE_PUMP_EMPTY_FORCE_COUNT 5 ///< Syringe pump empty force voltage count persistence. + /// Defined states for the syringe pump control state machine. typedef enum SyringePump_States { @@ -343,6 +345,7 @@ initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR, 0, SYRINGE_PUMP_DIR_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_RUNNING_WHILE_BP_OFF_ERROR, 0, SYRINGE_PUMP_OFF_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR, 0, SYRINGE_PUMP_RATE_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION, 0, SYRINGE_PUMP_OCCLUSION_PERSISTENCE); initTimeWindowedCount( TIME_WINDOWED_COUNT_SYRINGE_PUMP_OFF_ERROR, SYRINGE_PUMP_OFF_ERROR_MAX_CNT, SYRINGE_PUMP_OFF_ERROR_TIME_WIN_MS ); initFPGAPersistentAlarm( FPGA_PERS_ERROR_SYRINGE_PUMP_ADC, ALARM_ID_HD_SYRINGE_PUMP_FPGA_ADC_FAULT, Index: firmware/App/Controllers/Temperatures.c =================================================================== diff -u -rdd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37 -r9abed0946b73f7255b51553d5bbb1008d0e4fde5 --- firmware/App/Controllers/Temperatures.c (.../Temperatures.c) (revision dd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37) +++ firmware/App/Controllers/Temperatures.c (.../Temperatures.c) (revision 9abed0946b73f7255b51553d5bbb1008d0e4fde5) @@ -289,9 +289,10 @@ if ( ( temperature > MAX_ALLOWED_TEMPERATURE ) || ( temperature < MIN_ALLOWED_TEMPERATURE ) ) { - isTempOutOfRange |= TRUE; - lastFaultSensor = sensor; + isTempOutOfRange = TRUE; + lastFaultSensor = sensor; } + } checkPersistentAlarm( ALARM_ID_HD_TEMPERATURES_OUT_OF_RANGE, isTempOutOfRange, lastFaultSensor, MAX_ALLOWED_TEMPERATURE ); Index: firmware/App/Drivers/Battery.c =================================================================== diff -u -rd07e8c7c8e60603a55aed12fa4984ce15196c82f -r9abed0946b73f7255b51553d5bbb1008d0e4fde5 --- firmware/App/Drivers/Battery.c (.../Battery.c) (revision d07e8c7c8e60603a55aed12fa4984ce15196c82f) +++ firmware/App/Drivers/Battery.c (.../Battery.c) (revision 9abed0946b73f7255b51553d5bbb1008d0e4fde5) @@ -203,6 +203,7 @@ if ( TRUE == didTimeout( lastBatteryMonitorTime, BATTERY_MONITOR_INTERVAL_MS ) ) { lastBatteryMonitorTime = getMSTimerCount(); + getBatteryManagementData(); } } Index: firmware/App/HDCommon.h =================================================================== diff -u -r4eaa89095031f1a3fb27f6163e224ca663754527 -r9abed0946b73f7255b51553d5bbb1008d0e4fde5 --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 4eaa89095031f1a3fb27f6163e224ca663754527) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 9abed0946b73f7255b51553d5bbb1008d0e4fde5) @@ -10,8 +10,8 @@ * @author (last) Sean Nash * @date (last) 24-Aug-2023 * -* @author (original) Sean -* @date (original) 27-Feb-2020 +* @author (original) Sean +* @date (original) 27-Feb-2020 * ***************************************************************************/ @@ -25,7 +25,7 @@ #define HD_VERSION_MAJOR 0 #define HD_VERSION_MINOR 6 #define HD_VERSION_MICRO 0 -#define HD_VERSION_BUILD 229 +#define HD_VERSION_BUILD 717 // ********** development build switches ********** Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -rdd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37 -r9abed0946b73f7255b51553d5bbb1008d0e4fde5 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision dd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 9abed0946b73f7255b51553d5bbb1008d0e4fde5) @@ -254,6 +254,33 @@ /*********************************************************************//** * @brief + * The isACPowerLost function determines whether A/C power loss has + * been detected. This function sets the alarms blocked condition to + * allow smooth alarm recovery. + * + * @details Inputs: alarmStatus + * @details Outputs: alarmsBlockedTimer + * @return TRUE if A/C power loss alarm is in effect, FALSE if not + *************************************************************************/ +BOOL isACPowerLost( void ) +{ + BOOL result = TRUE; + + // Continue to block new alarms until the alarms are cleared. + if ( ( FALSE == isAlarmConditionDetected( ALARM_ID_HD_AC_POWER_LOST ) ) && + ( FALSE == isAlarmConditionDetected( ALARM_ID_HD_AC_POWER_LOST_IN_TREATMENT ) ) ) + { + result = FALSE; + } + else + { + alarmsBlockedTimer = ALARM_BLOCKED_COUNT_AFTER_AC_RETURN; + } + return result; +} + +/*********************************************************************//** + * @brief * The activateAlarm function activates a given alarm. * @details Inputs: none * @details Outputs: alarmIsActive[], alarmStartedAt[], alarmStatus is updated @@ -262,6 +289,11 @@ *************************************************************************/ static void activateAlarm( ALARM_ID_T alarm ) { + // Block new alarms, occuring during loss of AC power + if ( ( TRUE == getCPLDACPowerLossDetected() ) ) + { + alarmsBlockedTimer = ALARM_BLOCKED_COUNT_AFTER_AC_RETURN; + } // Verify valid alarm index if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -rdd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37 -r9abed0946b73f7255b51553d5bbb1008d0e4fde5 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision dd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 9abed0946b73f7255b51553d5bbb1008d0e4fde5) @@ -204,6 +204,7 @@ void setAlarmUserActionEnabled( ALARM_USER_ACTION_T action, BOOL enabled ); void signalAlarmSilence( ALARM_SILENCE_CMD_T cmd ); void signalAlarmUserActionInitiated( ALARM_USER_ACTION_T action ); +BOOL isACPowerLost( void ); BOOL isAlarmActive( ALARM_ID_T alarm ); BOOL isAlarmConditionDetected( ALARM_ID_T alarm ); BOOL isAnyAlarmActive( void ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rdd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37 -r9abed0946b73f7255b51553d5bbb1008d0e4fde5 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision dd8d00b02a7565f3c5ce70040ae3b1bc40b4fe37) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 9abed0946b73f7255b51553d5bbb1008d0e4fde5) @@ -1719,6 +1719,30 @@ /*********************************************************************//** * @brief + * The sendDGParkConcentratePumpsCommand function constructs a DG concetentrate + * pumps park request msg to the DG and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: DG park concentrate pumps command msg constructed and queued.. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendDGParkConcentratePumpsCommand( void ) +{ + BOOL result; + MESSAGE_T msg; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_PARK_CONCENTRATE_PUMPS_CMD_REQUEST; + msg.hdr.payloadLen = 0; + + // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_DG, ACK_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief * The sendDGStartFlushModeCommand function constructs a DG start/stop * flush mode command message and queues the msg for transmit on the * appropriate CAN channel. @@ -5502,6 +5526,7 @@ if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) { result = testSetBatteryRemainingCapacityOverride( payload.state.f32 );