Index: firmware/App/Controllers/RinsePump.c =================================================================== diff -u --- firmware/App/Controllers/RinsePump.c (revision 0) +++ firmware/App/Controllers/RinsePump.c (revision f32ce45ed787bb8cc691bf0bf8b41d646d681e47) @@ -0,0 +1,228 @@ +/************************************************************************** +* +* Copyright (c) 2024-2025 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 RinsePump.c +* +* @author (last) Vinayakam Mani +* @date (last) 22-Oct-2025 +* +* @author (original) Vinayakam Mani +* @date (original) 22-Oct-2025 +* +***************************************************************************/ + +#include "RinsePump.h" +#include "Messaging.h" +#include "OperationModes.h" +#include "PersistentAlarm.h" +#include "TaskGeneral.h" +#include "Timers.h" +#include "Valves.h" + +/** + * @addtogroup RinsePump + * @{ + */ + +// ********** private definitions ********** + +#define RINSE_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Rinse pump data publish interval. +#define DATA_PUBLISH_COUNTER_START_COUNT 13 ///< Rinse pump data publish start counter. + +// ********** private data ********** + +static RINSE_PUMP_STATE_T currentRinsePumpState; ///< Current rinse pump control state. +static U32 rinsePumpDataPublicationTimerCounter; ///< Rinse pump data broadcast timer counter. +static OVERRIDE_U32_T rinsePumpDataPublishInterval; ///< Rinse pump data broadcast interval (in ms). + +// ********** private function prototypes ********** + +static RINSE_PUMP_STATE_T handleRinsePumpStartState( void ); +static RINSE_PUMP_STATE_T handleRinsePumpOffState( void ); +static RINSE_PUMP_STATE_T handleRinsePumpOnState ( void ); +static void publishRinsePumpData( void ); + +/*********************************************************************//** + * @brief + * The initRinsePump function initializes the rinse pump driver. + * @details \b Inputs: none + * @details \b Outputs: Rinse pump driver unit initialized + * @return none + *************************************************************************/ +void initRinsePump(void) +{ + // Initialize controller variables + rinsePumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + currentRinsePumpState = RINSE_PUMP_STATE_INIT; + rinsePumpDataPublishInterval.data = RINSE_PUMP_DATA_PUB_INTERVAL; + rinsePumpDataPublishInterval.ovData = RINSE_PUMP_DATA_PUB_INTERVAL; + rinsePumpDataPublishInterval.ovInitData = RINSE_PUMP_DATA_PUB_INTERVAL; + rinsePumpDataPublishInterval.override = OVERRIDE_RESET; +} + +/*********************************************************************//** + * @brief + * The setRinsePumpState function sets the current rinse pump state machine state. + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if invalid state given. + * @details \b Inputs: currentRinsePumpState + * @details \b Outputs: currentRinsePumpState + * @param state Rinse pump state to set + * @return none + *************************************************************************/ +void setRinsePumpState( RINSE_PUMP_STATE_T state ) +{ + if ( state < NUM_OF_RINSE_PUMP_STATES ) + { + currentRinsePumpState = state; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_RINSE_PUMP_INVALID_STATE1, (U32)state ) + } +} + +/*********************************************************************//** + * @brief + * The getRinsePumpState function returns the current rinse pump state machine. + * @details \b Inputs: currentRinsePumpState + * @details \b Outputs: none + * @return current state of the rinse pump state machine. + *************************************************************************/ +RINSE_PUMP_STATE_T getRinsePumpState( void ) +{ + return currentRinsePumpState; +} + +/*********************************************************************//** + * @brief + * The execRinsePumpController function executes the rinse pump state machine. + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if the current state is invalid. + * @details \b Inputs: currentRinsePumpState + * @details \b Outputs: currentRinsePumpState + * @return none + *************************************************************************/ +void execRinsePumpController( void ) +{ + switch( currentRinsePumpState ) + { + case RINSE_PUMP_STATE_INIT: + currentRinsePumpState = handleRinsePumpStartState(); + break; + + case RINSE_PUMP_STATE_OFF: + currentRinsePumpState = handleRinsePumpOffState(); + break; + + case RINSE_PUMP_STATE_ON: + currentRinsePumpState = handleRinsePumpOnState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_RINSE_PUMP_INVALID_EXEC_STATE, (U32)currentRinsePumpState ) + break; + } + + publishRinsePumpData(); +} + +/*********************************************************************//** + * @brief + * The handleRinsePumpStartState function starts the rinse pump state machine. + * @details \b Inputs: none + * @details \b Outputs: none + * @return next state of the rinse pump state machine + *************************************************************************/ +static RINSE_PUMP_STATE_T handleRinsePumpStartState( void ) +{ + RINSE_PUMP_STATE_T state = RINSE_PUMP_STATE_OFF; + + return state; +} + +/*********************************************************************//** + * @brief + * The handleRinsePumpOffState function stops the rinse pump + * @details \b Inputs: none + * @details \b Outputs: Rinse pump motor turned off + * @return next state of the rinse pump state machine + *************************************************************************/ +static RINSE_PUMP_STATE_T handleRinsePumpOffState( void ) +{ + RINSE_PUMP_STATE_T state = RINSE_PUMP_STATE_OFF; + + // Current alpha system uses valve D65 to turn on the rinse pump + // and its just On/off control for now. + setValveState( D65_VALV, VALVE_STATE_CLOSED ); + + return state; +} + +/*********************************************************************//** + * @brief + * The handleRinsePumpOnState function starts the rinse pump + * @details \b Inputs: none + * @details \b Outputs: Rinse pump motor turned on. + * @return next state of the rinse pump state machine + *************************************************************************/ +static RINSE_PUMP_STATE_T handleRinsePumpOnState( void ) +{ + RINSE_PUMP_STATE_T state = RINSE_PUMP_STATE_ON; + + // Current alpha system uses valve D65 to turn on the rinse pump + // and its just On/off control for now. + setValveState( D65_VALV, VALVE_STATE_OPEN ); + + return state; +} + +/*********************************************************************//** + * @brief + * The publishRinsePumpData function constructs and sends the rinse pump data + * broadcast message. + * @details \b Message \b Sent: MSG_ID_DD_RINSE_PUMP_DATA + * @details \b Inputs: rinsePumpDataPublicationTimerCounter, currentRinsePumpState + * @details \b Outputs: rinsePumpDataPublicationTimerCounter + * @return none + *************************************************************************/ +static void publishRinsePumpData( void ) +{ + if ( ++rinsePumpDataPublicationTimerCounter >= getU32OverrideValue( &rinsePumpDataPublishInterval ) ) + { + RINSE_PUMP_PAYLOAD_T data; + + data.d79State = getRinsePumpState(); + + broadcastData( MSG_ID_DD_RINSE_PUMP_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( RINSE_PUMP_PAYLOAD_T ) ); + rinsePumpDataPublicationTimerCounter = 0; + } +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testRinsePumpDataPublishIntervalOverride function overrides the interval + * at which the DD rinse pump data is published. + * @details \b Inputs: none + * @details \b Outputs: rinsePumpDataPublishInterval + * @param message Override message from Dialin which includes the interval + * (in ms) to override the rinse pump broadcast interval to. + * @return TRUE if override request is successful, FALSE if not + *************************************************************************/ +BOOL testRinsePumpDataPublishIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32BroadcastIntervalOverride( message, &rinsePumpDataPublishInterval, TASK_GENERAL_INTERVAL ); + + return result; +} + +/**@}*/ + Index: firmware/App/Controllers/RinsePump.h =================================================================== diff -u --- firmware/App/Controllers/RinsePump.h (revision 0) +++ firmware/App/Controllers/RinsePump.h (revision f32ce45ed787bb8cc691bf0bf8b41d646d681e47) @@ -0,0 +1,64 @@ +/************************************************************************** +* +* Copyright (c) 2024-2025 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 RinsePump.h +* +* @author (last) Vinayakam Mani +* @date (last) 22-Oct-2025 +* +* @author (original) Vinayakam Mani +* @date (original) 22-Oct-2025 +* +***************************************************************************/ + +#ifndef __RINSE_PUMP_H__ +#define __RINSE_PUMP_H__ + +// ********** public definitions ********** + +#include "DDCommon.h" + +/** + * @defgroup RinsePump RinsePump + * @brief Rinse Pump controller unit. Provides higher level control of the rinse pump. + * + * @addtogroup RinsePump + * @{ + */ + +// ********** public definitions ********** + +#pragma pack(push, 1) +/// Payload record structure for air pump data broadcast message +typedef struct +{ + U32 d79State; ///< Rinse pump state status +} RINSE_PUMP_PAYLOAD_T; +#pragma pack(pop) + +/// Enumeration of air pump states. +typedef enum RinsePumpControllerStates +{ + RINSE_PUMP_STATE_INIT = 0, ///< Rinse Pump Initialize state + RINSE_PUMP_STATE_OFF, ///< Rinse Pump Off state + RINSE_PUMP_STATE_ON, ///< Rinse Pump On state + NUM_OF_RINSE_PUMP_STATES, ///< Number of rinse pump states +} RINSE_PUMP_STATE_T; + +// ********** public function prototypes ********** + +void initRinsePump(void); +void execRinsePumpController(void); +void setRinsePumpState( RINSE_PUMP_STATE_T state ); +RINSE_PUMP_STATE_T getRinsePumpState( void ); + +BOOL testRinsePumpDataPublishIntervalOverride( MESSAGE_T *message ); + +/**@}*/ + +#endif + Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -ra711f7995e555b503ed8c295f98fbe7bb9e5abf5 -rf32ce45ed787bb8cc691bf0bf8b41d646d681e47 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision a711f7995e555b503ed8c295f98fbe7bb9e5abf5) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision f32ce45ed787bb8cc691bf0bf8b41d646d681e47) @@ -28,6 +28,7 @@ #include "OperationModes.h" #include "PersistentAlarm.h" #include "Pressure.h" +#include "RinsePump.h" #include "SpentChamberFill.h" #include "TaskGeneral.h" #include "TDInterface.h" @@ -208,7 +209,8 @@ case DD_GEND_DIALYSATE_BYPASS_STATE: setValveState( DD_M4_VALV, VALVE_STATE_OPEN ); setValveState( D14_VALV, VALVE_STATE_OPEN ); - setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve + setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve + setValveState( D54_VALV, VALVE_STATE_OPEN ); // Mapped to D80 valve, for bicarb access setValveState( D35_VALV, VALVE_STATE_CLOSED ); // VDI setValveState( D40_VALV, VALVE_STATE_CLOSED ); // VDO setValveState( D47_VALV, VALVE_STATE_CLOSED ); // spent chamber purge valve @@ -227,6 +229,9 @@ //setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, FALSE ); setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); + //Rinse pump On + setRinsePumpState( RINSE_PUMP_STATE_ON ); + transitionToBalChamberFill(); //Testing @@ -238,6 +243,7 @@ //Previous state setValveState( D47_VALV, VALVE_STATE_CLOSED ); // spent chamber purge valve setValveState( D64_VALV, VALVE_STATE_CLOSED ); + setValveState( D54_VALV, VALVE_STATE_OPEN ); // Mapped to D80 valve, for bicarb access setValveState( DD_M4_VALV, VALVE_STATE_OPEN ); setValveState( D14_VALV, VALVE_STATE_OPEN ); setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve @@ -253,6 +259,9 @@ //setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, FALSE ); setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); + //Rinse pump On + setRinsePumpState( RINSE_PUMP_STATE_ON ); + // Disable bypass valve setValveState( D34_VALV, VALVE_STATE_CLOSED ); // Bypass valve setValveState( D35_VALV, VALVE_STATE_OPEN ); // VDI @@ -283,6 +292,9 @@ setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_FILL_RPM, TRUE ); + //Rinse pump On + setRinsePumpState( RINSE_PUMP_STATE_ON ); + //Transition to spent chamber fill transitionToSpentChamberFill(); break; @@ -301,6 +313,7 @@ setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve setValveState( D34_VALV, VALVE_STATE_OPEN ); // Bypass valve setValveState( DD_M4_VALV, VALVE_STATE_OPEN ); + setValveState( D54_VALV, VALVE_STATE_OPEN ); // Mapped to D80 valve, for bicarb access setValveState( D64_VALV, VALVE_STATE_OPEN ); // Bicarb chamber purge valve bicarbFillStartTimeMS = getMSTimerCount(); @@ -313,6 +326,9 @@ setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); + + //Rinse pump On + setRinsePumpState( RINSE_PUMP_STATE_ON ); break; case DD_GEND_DIALYSATE_DELIVERY_PAUSE: @@ -322,6 +338,8 @@ requestConcentratePumpOff( D11_PUMP, FALSE ); requestConcentratePumpOff( D10_PUMP, FALSE ); requestConcentratePumpOff( D76_PUMP, FALSE ); + //Rinse pump Off + setRinsePumpState( RINSE_PUMP_STATE_OFF ); stopHeater( D5_HEAT ); stopHeater( D45_HEAT ); Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r7d24ef2e6a4130b3a049e6106a0371fc6503271f -rf32ce45ed787bb8cc691bf0bf8b41d646d681e47 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 7d24ef2e6a4130b3a049e6106a0371fc6503271f) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision f32ce45ed787bb8cc691bf0bf8b41d646d681e47) @@ -143,6 +143,8 @@ SW_FAULT_ID_BLOOD_LEAK_EMBEDDED_MODE_INVALID_STATE = 112, SW_FAULT_ID_BLOOD_LEAK_ENQUEUE_FAILURE = 113, SW_FAULT_ID_BLOOD_LEAK_INVALID_EMB_MODE_CMD_SELECTED = 114, + SW_FAULT_ID_RINSE_PUMP_INVALID_EXEC_STATE = 115, + SW_FAULT_ID_RINSE_PUMP_INVALID_STATE1 = 116, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r7d24ef2e6a4130b3a049e6106a0371fc6503271f -rf32ce45ed787bb8cc691bf0bf8b41d646d681e47 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 7d24ef2e6a4130b3a049e6106a0371fc6503271f) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision f32ce45ed787bb8cc691bf0bf8b41d646d681e47) @@ -36,6 +36,7 @@ #include "OperationModes.h" #include "PAL.h" #include "Pressure.h" +#include "RinsePump.h" #include "SafetyShutdown.h" #include "SpentChamberFill.h" #include "SystemCommDD.h" @@ -174,7 +175,8 @@ { MSG_ID_DD_BLOOD_LEAK_EMBEDDED_MODE_INFO_OVERRIDE_REQUEST, &testBloodLeakEmbeddedModeInfoOverride }, { MSG_ID_DD_BLOOD_LEAK_INTENSITY_MOVING_AVERAGE_OVERRIDE_REQUEST, &testBloodLeakIntensityMovingAverageOverride }, { MSG_ID_DD_BLOOD_LEAK_ZEROING_INTERVAL_IN_MS_OVERRIDE_REQUEST, &testBloodLeakZeroingIntervalInMillisecondsOverride }, - { MSG_ID_DD_BLOOD_LEAK_ZERO_REQUEST, &testBloodLeakZeroSequenceRequest } + { MSG_ID_DD_BLOOD_LEAK_ZERO_REQUEST, &testBloodLeakZeroSequenceRequest }, + { MSG_ID_DD_RINSE_PUMP_DATA_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testRinsePumpDataPublishIntervalOverride }, }; #define NUM_OF_FUNCTION_HANDLERS (sizeof(MSG_FUNCTION_HANDLER_LOOKUP) / sizeof(MSG_HANDLER_LOOKUP_T)) Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r229341f9eb23fec730cdf9b1f8f3960de2daf384 -rf32ce45ed787bb8cc691bf0bf8b41d646d681e47 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 229341f9eb23fec730cdf9b1f8f3960de2daf384) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision f32ce45ed787bb8cc691bf0bf8b41d646d681e47) @@ -23,6 +23,7 @@ #include "Heaters.h" #include "Messaging.h" #include "OperationModes.h" +#include "RinsePump.h" #include "SystemCommDD.h" #include "TaskGeneral.h" #include "WatchdogMgmt.h" @@ -85,6 +86,9 @@ // manage concentrate pumps execConcentratePumpController(); + // manage rinse pump + execRinsePumpController(); + // Manage switches monitor //execSwitches(); Index: firmware/source/sys_main.c =================================================================== diff -u -r7d24ef2e6a4130b3a049e6106a0371fc6503271f -rf32ce45ed787bb8cc691bf0bf8b41d646d681e47 --- firmware/source/sys_main.c (.../sys_main.c) (revision 7d24ef2e6a4130b3a049e6106a0371fc6503271f) +++ firmware/source/sys_main.c (.../sys_main.c) (revision f32ce45ed787bb8cc691bf0bf8b41d646d681e47) @@ -75,6 +75,7 @@ #include "MsgQueues.h" #include "OperationModes.h" #include "Pressure.h" +#include "RinsePump.h" #include "SafetyShutdown.h" #include "SystemCommDD.h" #include "TaskBG.h" @@ -183,6 +184,7 @@ initTDInterface(); initFPInterface(); initUltrafiltration(); + initRinsePump(); } /*************************************************************************