Index: firmware/App/Controllers/BalancingChamber.c =================================================================== diff -u -r50144ec3e96785cf76d5bfd22ee65029c82e732b -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 50144ec3e96785cf76d5bfd22ee65029c82e732b) +++ firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -19,6 +19,7 @@ #include "Conductivity.h" #include "ConcentratePumps.h" #include "DialysatePumps.h" +#include "DryBiCart.h" #include "FpgaDD.h" #include "Heaters.h" #include "ModeStandby.h" @@ -38,15 +39,16 @@ // ********** private definitions ********** -#define BAL_CHAMBER_DATA_PUBLISH_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the balancing chamber data published. -#define BAL_CHAMBER_FILL_PRES_DROP_MS ( 200 / TASK_GENERAL_INTERVAL ) ///< Time (ms/tasktime) to confirm the balancing chamber filling started and corrosponding valves opened. -#define BAL_CHAMBER_FILL_COMPLETE_MS ( 300 / TASK_GENERAL_INTERVAL ) ///< Time (ms/tasktime) to confirm the balancing chamber fill completed and pressure is within range +#define BAL_CHAMBER_DATA_PUBLISH_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the balancing chamber data published. +#define BAL_CHAMBER_FILL_PRES_DROP_MS ( 200 / TASK_GENERAL_INTERVAL ) ///< Time (ms/tasktime) to confirm the balancing chamber filling started and corresponding valves opened. +#define BAL_CHAMBER_FILL_COMPLETE_MS ( 300 / TASK_GENERAL_INTERVAL ) ///< Time (ms/tasktime) to confirm the balancing chamber fill completed and pressure is within range +#define BICARB_CHAMBER_PERIODIC_FILL_TIME ( 1 * SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ) ///< Periodic bicarb chamber fill request 60 sec x 20 = 1200 /// Payload record structure for balancing chamber switch only request typedef struct { - U32 startStop; ///< balancing chamber switching only start:1 and stop: 0 - F32 flowrate; ///< dialysate flowrate in ml/min + U32 startStop; ///< Balancing chamber switching only start:1 and stop: 0 + F32 flowrate; ///< Dialysate flowrate in ml/min } BC_SWITCHING_ONLY_START_CMD_PAYLOAD_T; // ********** private data ********** @@ -72,6 +74,10 @@ static F32 freshDialPressure; ///< Fresh side dialysate pressure static F32 spentDialPressure; ///< Spent side dialysate pressure +#ifdef __DRY_BICARB__ +static U32 bicarbChamberPeriodicFillCounter; ///< Counter for checking the timeout for drybicart chamber fill request. +#endif + // ********** private function prototypes ********** static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState1FillStart( void ); @@ -125,6 +131,9 @@ isPressureDroppedDuringFill = FALSE; freshDialPressure = 0.0F; spentDialPressure = 0.0F; +#ifdef __DRY_BICARB__ + bicarbChamberPeriodicFillCounter = 0; +#endif } /*********************************************************************//** @@ -192,7 +201,22 @@ // Increment counter indicating fill is in progress. currentBalChamberSwitchingCounter += 1; - // execute current balancing chamber exec state +#ifdef __DRY_BICARB__ + //Increment counter for dry bicarb chamber fill + bicarbChamberPeriodicFillCounter += 1; + // Fill bicarb chamber once every 60secs. + if ( bicarbChamberPeriodicFillCounter >= BICARB_CHAMBER_PERIODIC_FILL_TIME ) + { + if ( FALSE == setBicarbChamberFillRequested() ) + { + // TODO + //drybicart state machines are combined and so this is not an issue in future + //set alarm ? + } + bicarbChamberPeriodicFillCounter = 0; + } +#endif + switch ( balChamberExecState ) { case BAL_CHAMBER_STATE_START: @@ -245,20 +269,43 @@ /*********************************************************************//** * @brief - * The valveControlForBCState1FillStart function actuates the valve combination - * for state 1 fill/drain process. + * The valveControlForBCClosedState function closes the all balancing + * chamber valves. * @details \b Inputs: none * @details \b Outputs: valve states * @return none. *************************************************************************/ -static void valveControlForBCState1FillStart( void ) +void valveControlForBCClosedState( void ) { // Close balancing chamber valve combinations D23,D20 and D21,D26 setValveState( D23_VALV, VALVE_STATE_CLOSED ); setValveState( D20_VALV, VALVE_STATE_CLOSED ); setValveState( D21_VALV, VALVE_STATE_CLOSED ); setValveState( D26_VALV, VALVE_STATE_CLOSED ); + //Close balancing chamber valve combinations D19,D24 and D25,D22 + setValveState( D19_VALV, VALVE_STATE_CLOSED ); + setValveState( D24_VALV, VALVE_STATE_CLOSED ); + setValveState( D25_VALV, VALVE_STATE_CLOSED ); + setValveState( D22_VALV, VALVE_STATE_CLOSED ); +} + +/*********************************************************************//** + * @brief + * The valveControlForBCOpenState function opens all of the balancing + * chamber valves. + * @details \b Inputs: none + * @details \b Outputs: valve states + * @return none. + *************************************************************************/ +void valveControlForBCOpenState( void ) +{ + // Open balancing chamber valve combinations D23,D20 and D21,D26 + setValveState( D23_VALV, VALVE_STATE_OPEN ); + setValveState( D20_VALV, VALVE_STATE_OPEN ); + setValveState( D21_VALV, VALVE_STATE_OPEN ); + setValveState( D26_VALV, VALVE_STATE_OPEN ); + //Open balancing chamber valve combinations D19,D24 and D25,D22 setValveState( D19_VALV, VALVE_STATE_OPEN ); setValveState( D24_VALV, VALVE_STATE_OPEN ); @@ -268,46 +315,115 @@ /*********************************************************************//** * @brief - * The valveControlForBCState1FillEnd function closes the valve opened - * for state 1 fill/drain process. + * The valveControlForBCFreshSideOnlyOpenState function opens the fresh side + * balancing chamber valves and closes the spent side valves. * @details \b Inputs: none * @details \b Outputs: valve states * @return none. *************************************************************************/ -static void valveControlForBCState1FillEnd( void ) +void valveControlForBCFreshSideOnlyOpenState( void ) { - //Close balancing chamber valve combinations D19,D24 and D25,D22 - setValveState( D19_VALV, VALVE_STATE_CLOSED ); - setValveState( D24_VALV, VALVE_STATE_CLOSED ); + // Open fresh balancing chamber valves D19,D20,D21,D22 + setValveState( D19_VALV, VALVE_STATE_OPEN ); + setValveState( D20_VALV, VALVE_STATE_OPEN ); + setValveState( D21_VALV, VALVE_STATE_OPEN ); + setValveState( D22_VALV, VALVE_STATE_OPEN ); + + // Close spent side valves D23,D24,D25,D26 + setValveState( D23_VALV, VALVE_STATE_CLOSED ); setValveState( D25_VALV, VALVE_STATE_CLOSED ); - setValveState( D22_VALV, VALVE_STATE_CLOSED ); + setValveState( D24_VALV, VALVE_STATE_CLOSED ); + setValveState( D26_VALV, VALVE_STATE_CLOSED ); } /*********************************************************************//** * @brief - * The valveControlForBCState2FillStart function actuates the valve combination - * for state 2 fill/drain process. - * @details \b Inputs: none - * @details \b Outputs: valve states - * @return none. + * The getCurrentBalancingChamberExecState function returns the current state + * of the balancing chamber. + * @details \b Inputs: balChamberExecState + * @details \b Outputs: none + * @return the current state of balancing chamber states. *************************************************************************/ -static void valveControlForBCState2FillStart( void ) +BAL_CHAMBER_EXEC_STATE_T getCurrentBalancingChamberExecState( void ) { - //Close balancing chamber valve combinations D19,D24 and D25,D22 - setValveState( D19_VALV, VALVE_STATE_CLOSED ); - setValveState( D24_VALV, VALVE_STATE_CLOSED ); - setValveState( D25_VALV, VALVE_STATE_CLOSED ); - setValveState( D22_VALV, VALVE_STATE_CLOSED ); + return balChamberExecState; +} - // Open balancing chamber valve combinations D23,D20 and D21,D26 - setValveState( D23_VALV, VALVE_STATE_OPEN ); - setValveState( D20_VALV, VALVE_STATE_OPEN ); - setValveState( D21_VALV, VALVE_STATE_OPEN ); - setValveState( D26_VALV, VALVE_STATE_OPEN ); +/*********************************************************************//** + * @brief + * The getBalancingChamberFillinProgressStatus function returns the current + * balancing chamber fill in progress status. + * @details \b Inputs: isBalChamberFillInProgress + * @details \b Outputs: none + * @return the current balancing chamber fill in progress. + *************************************************************************/ +BOOL getBalancingChamberFillinProgressStatus( void ) +{ + return isBalChamberFillInProgress; } /*********************************************************************//** * @brief + * The getBalChamberSwitchingFreq function gets the balancing chamber switching + * frequency value. + * @details \b Inputs: balChamberSwitchingFreq + * @details \b Outputs: none + * @return balancing chamber switching frequency + *************************************************************************/ +F32 getBalChamberSwitchingFreq( void ) +{ + F32 result = balChamberSwitchingFreq.data; + + if ( OVERRIDE_KEY == balChamberSwitchingFreq.override ) + { + result = balChamberSwitchingFreq.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The setBalChamberSwitchingOnlyStatus function sets the balancing chamber + * switching only On/Off status. + * @details \b Inputs: balanceChamberSwitchingOnly + * @details \b Outputs: none + * @return none + *************************************************************************/ +void setBalChamberSwitchingOnlyStatus( BOOL OnOff ) +{ + balanceChamberSwitchingOnly = OnOff; +} + +/*********************************************************************//** + * @brief + * The getBalChamberSwitchingOnlyStatus function gets the balancing chamber + * switching only status. + * @details \b Inputs: balanceChamberSwitchingOnly + * @details \b Outputs: none + * @return balancing chamber switching only without any pressure validation + * and dosing delivery + *************************************************************************/ +BOOL getBalChamberSwitchingOnlyStatus( void ) +{ + return balanceChamberSwitchingOnly; +} + +/*********************************************************************//** + * @brief + * The getBalChamberSwitchingPeriod function gets the balancing chamber + * switching period. + * @details \b Inputs: balChamberSwitchingPeriod + * @details \b Outputs: none + * @return balancing chamber switching period + *************************************************************************/ +U32 getBalChamberSwitchingPeriod( void ) +{ + return balChamberSwitchingPeriod; +} + +/*********************************************************************//** + * @brief * The valveControlForBCState2FillEnd function closes the valve opened * for state 2 fill/drain process. * @details \b Inputs: none @@ -325,71 +441,65 @@ /*********************************************************************//** * @brief - * The valveControlForBCClosedState function closes the all balancing - * chamber valves. + * The valveControlForBCState1FillStart function actuates the valve combination + * for state 1 fill/drain process. * @details \b Inputs: none * @details \b Outputs: valve states * @return none. *************************************************************************/ -void valveControlForBCClosedState( void ) +static void valveControlForBCState1FillStart( void ) { // Close balancing chamber valve combinations D23,D20 and D21,D26 setValveState( D23_VALV, VALVE_STATE_CLOSED ); setValveState( D20_VALV, VALVE_STATE_CLOSED ); setValveState( D21_VALV, VALVE_STATE_CLOSED ); setValveState( D26_VALV, VALVE_STATE_CLOSED ); - //Close balancing chamber valve combinations D19,D24 and D25,D22 - setValveState( D19_VALV, VALVE_STATE_CLOSED ); - setValveState( D24_VALV, VALVE_STATE_CLOSED ); - setValveState( D25_VALV, VALVE_STATE_CLOSED ); - setValveState( D22_VALV, VALVE_STATE_CLOSED ); + //Open balancing chamber valve combinations D19,D24 and D25,D22 + setValveState( D19_VALV, VALVE_STATE_OPEN ); + setValveState( D24_VALV, VALVE_STATE_OPEN ); + setValveState( D25_VALV, VALVE_STATE_OPEN ); + setValveState( D22_VALV, VALVE_STATE_OPEN ); } /*********************************************************************//** * @brief - * The valveControlForBCOpenState function open the all balancing - * chamber valves. + * The valveControlForBCState1FillEnd function closes the valve opened + * for state 1 fill/drain process. * @details \b Inputs: none * @details \b Outputs: valve states * @return none. *************************************************************************/ -void valveControlForBCOpenState( void ) +static void valveControlForBCState1FillEnd( void ) { - // Open balancing chamber valve combinations D23,D20 and D21,D26 - setValveState( D23_VALV, VALVE_STATE_OPEN ); - setValveState( D20_VALV, VALVE_STATE_OPEN ); - setValveState( D21_VALV, VALVE_STATE_OPEN ); - setValveState( D26_VALV, VALVE_STATE_OPEN ); - - //Open balancing chamber valve combinations D19,D24 and D25,D22 - setValveState( D19_VALV, VALVE_STATE_OPEN ); - setValveState( D24_VALV, VALVE_STATE_OPEN ); - setValveState( D25_VALV, VALVE_STATE_OPEN ); - setValveState( D22_VALV, VALVE_STATE_OPEN ); + //Close balancing chamber valve combinations D19,D24 and D25,D22 + setValveState( D19_VALV, VALVE_STATE_CLOSED ); + setValveState( D24_VALV, VALVE_STATE_CLOSED ); + setValveState( D25_VALV, VALVE_STATE_CLOSED ); + setValveState( D22_VALV, VALVE_STATE_CLOSED ); } /*********************************************************************//** * @brief - * The valveControlForBCFreshSideOnlyOpenState function opens the fresh side - * balancing chamber valves and closes the spent side valves. + * The valveControlForBCState2FillStart function actuates the valve combination + * for state 2 fill/drain process. * @details \b Inputs: none * @details \b Outputs: valve states * @return none. *************************************************************************/ -void valveControlForBCFreshSideOnlyOpenState( void ) +static void valveControlForBCState2FillStart( void ) { - // Open fresh balancing chamber valves D19,D20,D21,D22 - setValveState( D19_VALV, VALVE_STATE_OPEN ); + //Close balancing chamber valve combinations D19,D24 and D25,D22 + setValveState( D19_VALV, VALVE_STATE_CLOSED ); + setValveState( D24_VALV, VALVE_STATE_CLOSED ); + setValveState( D25_VALV, VALVE_STATE_CLOSED ); + setValveState( D22_VALV, VALVE_STATE_CLOSED ); + + // Open balancing chamber valve combinations D23,D20 and D21,D26 + setValveState( D23_VALV, VALVE_STATE_OPEN ); setValveState( D20_VALV, VALVE_STATE_OPEN ); setValveState( D21_VALV, VALVE_STATE_OPEN ); - setValveState( D22_VALV, VALVE_STATE_OPEN ); - - // Close spent side valves D23,D24,D25,D26 - setValveState( D23_VALV, VALVE_STATE_CLOSED ); - setValveState( D25_VALV, VALVE_STATE_CLOSED ); - setValveState( D24_VALV, VALVE_STATE_CLOSED ); - setValveState( D26_VALV, VALVE_STATE_CLOSED ); + setValveState( D26_VALV, VALVE_STATE_OPEN ); } /*********************************************************************//** @@ -430,9 +540,9 @@ // Deliver dosing during generate dialysate mode if ( TRUE != getBalChamberSwitchingOnlyStatus() ) { - // start acid and bicarb pump with the expected quantity - setConcentratePumpTargetSpeed( D11_PUMP, CONCENTRATE_PUMP_MAX_SPEED, acidVolume ); - setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, bicarbVolume ); + // start acid and bicarb pump with the expected rate, speed in mL/min + setConcentratePumpTargetSpeed( D11_PUMP, DOSING_CONCENTRATE_PUMP_SPEED, acidVolume ); + setConcentratePumpTargetSpeed( D10_PUMP, DOSING_CONCENTRATE_PUMP_SPEED, bicarbVolume ); requestConcentratePumpOn( D11_PUMP ); requestConcentratePumpOn( D10_PUMP ); } @@ -644,9 +754,9 @@ // Deliver dosing during generate dialysate mode if ( TRUE != getBalChamberSwitchingOnlyStatus() ) { - // start acid and bicarb pump with the expected quantity - setConcentratePumpTargetSpeed( D11_PUMP, CONCENTRATE_PUMP_MAX_SPEED, acidVolume ); - setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, bicarbVolume ); + // start acid and bicarb pump with the expected rate, speed in mL/min + setConcentratePumpTargetSpeed( D11_PUMP, DOSING_CONCENTRATE_PUMP_SPEED, acidVolume ); + setConcentratePumpTargetSpeed( D10_PUMP, DOSING_CONCENTRATE_PUMP_SPEED, bicarbVolume ); requestConcentratePumpOn( D11_PUMP ); requestConcentratePumpOn( D10_PUMP ); } @@ -778,92 +888,6 @@ /*********************************************************************//** * @brief - * The getCurrentBalancingChamberExecState function returns the current state - * of the balancing chamber. - * @details \b Inputs: balChamberExecState - * @details \b Outputs: none - * @return the current state of balancing chamber states. - *************************************************************************/ -BAL_CHAMBER_EXEC_STATE_T getCurrentBalancingChamberExecState( void ) -{ - return balChamberExecState; -} - -/*********************************************************************//** - * @brief - * The getBalancingChamberFillinProgressStatus function returns the current - * balancing chamber fill in progress status. - * @details \b Inputs: isBalChamberFillInProgress - * @details \b Outputs: none - * @return the current balancing chamber fill in progress. - *************************************************************************/ -BOOL getBalancingChamberFillinProgressStatus( void ) -{ - return isBalChamberFillInProgress; -} - -/*********************************************************************//** - * @brief - * The getBalChamberSwitchingFreq function gets the balancing chamber switching - * frequency value. - * @details \b Inputs: balChamberSwitchingFreq - * @details \b Outputs: none - * @return balancing chamber switching frequency - *************************************************************************/ -F32 getBalChamberSwitchingFreq( void ) -{ - F32 result = balChamberSwitchingFreq.data; - - if ( OVERRIDE_KEY == balChamberSwitchingFreq.override ) - { - result = balChamberSwitchingFreq.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The setBalChamberSwitchingOnlyStatus function sets the balancing chamber - * switching only On/Off status. - * @details \b Inputs: balanceChamberSwitchingOnly - * @details \b Outputs: none - * @return none - *************************************************************************/ -void setBalChamberSwitchingOnlyStatus( BOOL OnOff ) -{ - balanceChamberSwitchingOnly = OnOff; -} - -/*********************************************************************//** - * @brief - * The getBalChamberSwitchingOnlyStatus function gets the balancing chamber - * switching only status. - * @details \b Inputs: balanceChamberSwitchingOnly - * @details \b Outputs: none - * @return balancing chamber switching only without any pressure validation - * and dosing delivery - *************************************************************************/ -BOOL getBalChamberSwitchingOnlyStatus( void ) -{ - return balanceChamberSwitchingOnly; -} - -/*********************************************************************//** - * @brief - * The getBalChamberSwitchingPeriod function gets the balancing chamber - * switching period. - * @details \b Inputs: balChamberSwitchingPeriod - * @details \b Outputs: none - * @return balancing chamber switching period - *************************************************************************/ -U32 getBalChamberSwitchingPeriod( void ) -{ - return balChamberSwitchingPeriod; -} - -/*********************************************************************//** - * @brief * The getBalChamberDataPublishInterval function gets the balancing chamber * data publish interval. * @details \b Inputs: balChamberDataPublishInterval @@ -1002,7 +1026,7 @@ { BOOL result = FALSE; - // Verify tester has logged in with TD + // Verify tester has logged in with DD if ( TRUE == isTestingActivated() ) { // Verify payload length is valid Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -590,7 +590,7 @@ } else { - pumpTargetSpeed[ pumpId ].data = CONCENTRATE_PUMP_MAX_SPEED; + pumpTargetSpeed[ pumpId ].data = DOSING_CONCENTRATE_PUMP_SPEED; } } else @@ -1427,7 +1427,7 @@ { // Handle start command if ( ( TRUE == payload.startStop ) && - ( ( payload.speed >= CONCENTRATE_PUMP_MIN_SPEED ) && ( payload.speed <= CONCENTRATE_PUMP_MAX_SPEED ) ) && + ( ( payload.speed >= CONCENTRATE_PUMP_MIN_SPEED ) && ( payload.speed <= DOSING_CONCENTRATE_PUMP_SPEED ) ) && ( payload.volume > 0.0 ) ) { setConcentratePumpTargetSpeed( (CONCENTRATE_PUMPS_T)payload.pumpID, payload.speed, payload.volume ); Index: firmware/App/Controllers/ConcentratePumps.h =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -31,12 +31,14 @@ // ********** public definitions ********** // For 150 RPM, Diener pump delivers 60ml/min -#define CONCENTRATE_PUMP_MAX_SPEED 60.0F ///< Maximum Diener pump speed for concentrate pump in mL/min +#define CONCENTRATE_PUMP_MAX_SPEED 200.0F ///< Maximum Diener pump speed for concentrate pump in mL/min +#define DOSING_CONCENTRATE_PUMP_SPEED 60.0F ///< Diener pump speed for acid and bicarb dosing pump speed in mL/min +#define DRAIN_BICART_PUMP_SPEED 200.0F ///< Diener pump speed for cartridge drains at maximum speed in mL/min #define DEFAULT_ACID_VOLUME_ML 0.67F ///< Acid concentrate volume in ml. #define DEFAULT_BICARB_VOLUME_ML 1.15F ///< Bicarb concentrate volume in ml. -#define DOSING_CONT_VOLUME 0xFFFF ///< Volume set to 0xFFFF enables contineous delivery based on the speed set. +#define DOSING_CONT_VOLUME 0xFFFF ///< Volume set to 0xFFFF enables continuous delivery based on the speed set. #define PARK_CONC_PUMPS TRUE ///< For park parameter to requestConcentratePumpOff(). #define NO_PARK_CONC_PUMPS FALSE ///< For park parameter to requestConcentratePumpOff(). @@ -47,7 +49,7 @@ D11_PUMP = 0, ///< Acid concentrate pump CONCENTRATEPUMPS_FIRST = D11_PUMP, ///< First concentrate pump in list D10_PUMP, ///< Bicarbonate concentrate pump - D76_PUMP, ///< Ultrafilteration pump + D76_PUMP, ///< ultrafiltration pump NUM_OF_CONCENTRATE_PUMPS ///< Number of concentrate pumps } CONCENTRATE_PUMPS_T; Index: firmware/App/Controllers/DialysatePumps.h =================================================================== diff -u -r27e8758fa6199e72b914e1199786a4396ce74d06 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Controllers/DialysatePumps.h (.../DialysatePumps.h) (revision 27e8758fa6199e72b914e1199786a4396ce74d06) +++ firmware/App/Controllers/DialysatePumps.h (.../DialysatePumps.h) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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. Index: firmware/App/Controllers/DryBiCart.c =================================================================== diff -u -rbdee7caad13de484d50de4089497725c44a43c74 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision bdee7caad13de484d50de4089497725c44a43c74) +++ firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -634,7 +634,15 @@ // Go idle dryBiCartFillRequested.data = FALSE; - state = DRY_BICART_START_STATE; + // Stop drycart fill if fill request flag is set to false. + if ( FALSE == getU32OverrideValue( &dryBiCartFillRequested ) ) + { + // Go idle + dryBiCartFillRequested.data = FALSE; + state = DRY_BICART_START_STATE; + } + //state = DRY_BICART_START_STATE; + //state = DRY_BICART_START_STATE; return state; } Index: firmware/App/Controllers/SpentChamberFill.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Controllers/SpentChamberFill.c (.../SpentChamberFill.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Controllers/SpentChamberFill.c (.../SpentChamberFill.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -228,8 +228,8 @@ //Valve control for state 1 spent chamber fill valveControlForSCFillState1FillStart(); // start acid and bicarb pump with the expected quantity - setConcentratePumpTargetSpeed( D11_PUMP, CONCENTRATE_PUMP_MAX_SPEED, acidDoseVolume ); - setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, bicarbDoseVolume ); + setConcentratePumpTargetSpeed( D11_PUMP, DOSING_CONCENTRATE_PUMP_SPEED, acidDoseVolume ); + setConcentratePumpTargetSpeed( D10_PUMP, DOSING_CONCENTRATE_PUMP_SPEED, bicarbDoseVolume ); requestConcentratePumpOn( D11_PUMP ); requestConcentratePumpOn( D10_PUMP ); @@ -317,8 +317,8 @@ // Valve control for state 2 fill valveControlForSCFillState2FillStart(); // start acid and bicarb pump with the expected quantity - setConcentratePumpTargetSpeed( D11_PUMP, CONCENTRATE_PUMP_MAX_SPEED, acidDoseVolume ); - setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, bicarbDoseVolume ); + setConcentratePumpTargetSpeed( D11_PUMP, DOSING_CONCENTRATE_PUMP_SPEED, acidDoseVolume ); + setConcentratePumpTargetSpeed( D10_PUMP, DOSING_CONCENTRATE_PUMP_SPEED, bicarbDoseVolume ); requestConcentratePumpOn( D11_PUMP ); requestConcentratePumpOn( D10_PUMP ); Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -rb50acaa8dda74292fb41110440eaaa40f2959fb7 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision b50acaa8dda74292fb41110440eaaa40f2959fb7) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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 Valves.c * -* @author (last) “Raghu -* @date (last) 16-Oct-2025 +* @author (last) “rkallala” +* @date (last) 28-Jan-2026 * * @author (original) Vinayakam Mani * @date (original) 26-Aug-2024 @@ -35,6 +35,10 @@ #define ENERGIZED 1 ///< 1 for energized valve. #define ALL_VALVES_DEENERGIZED 0x0000 ///< 0 in U16 bit field for all valves. +#define VALVE_PWM_PERIOD 50 ///< Valve PWM Period in 0.1 us res ( 20kHz ) +#define VALVE_PWM_LOW ( VALVE_PWM_PERIOD * 0.2 ) ///< Valve low PWM percentage +#define VALVE_PWM_PULL_IN 100 ///< Valve 'strike' period at 100% PWM in ms + #define MAX_VALVE_STATE_MISMATCH_TIMER_COUNT (100 / TASK_PRIORITY_INTERVAL ) ///< Maximum time commanded valves state can fail to match read back valve states in a row. #define VALVES_STATE_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval ( ms / task time) at which valves states are published on CAN bus. #define DATA_PUBLISH_COUNTER_START_COUNT 50 ///< Data publish counter start count. @@ -71,6 +75,7 @@ static BOOL checkValveStateName( DD_VALVES_T valveID, VALVE_STATE_NAMES_T valveStateName ); static U32 convertValveStateNameToValveState( VALVE_STATE_NAMES_T valveStateName ); static U32 getValveState( U32 valveID ); +static void setFPGAPWMConfigurations( void ); /*********************************************************************//** * @brief @@ -118,16 +123,77 @@ valvesStatesPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; // reset valves states publication timer fpValveStatesPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; // reset valves states publication timer readCommandedValveStates(); + + // TODO set FPGA PWM after finalizing the decision on valve strike and hold behavior + // initially set valve PWM configuration and enable +// setFPGAPWMConfigurations(); + // initially set all valves to de-energized state via FPGA setFPGADDValveStates( commandedValvesStates ); setFPGABCValveStates( commandedBCValveStates ); setFPGASpareValveStates( commandedSpareValveStates ); - setFPGAIOValveStates( commandedIOValveStates ); setFPGAFPValveStates( commandedFPValveStates ); + setFPGAIOValveStates( commandedIOValveStates ); } /*********************************************************************//** * @brief + * The setFPGAPWMConfigurations function sets the FPGA for Valve PWM control. + * @details \b Inputs: none + * @details \b Outputs: Valves PWM timing set and enabled. + * @return none + *************************************************************************/ +static void setFPGAPWMConfigurations( void ) +{ + // Balancing Chamber valves are not PWM configured. + U32 i; + U16 valveDDBits = 0; + U08 valveSPBits = 0; + U08 valveIOBits = 0; + U08 valveFPBits = 0; + + // set timing values + setFPGAValveDDPWMPullIn( VALVE_PWM_PULL_IN ); + setFPGAValveDDPWMLow( VALVE_PWM_LOW ); + setFPGAValveDDPWMPeriod( VALVE_PWM_PERIOD ); + + setFPGAValveSPPWMPullIn( VALVE_PWM_PULL_IN ); + setFPGAValveSPPWMLow( VALVE_PWM_LOW ); + setFPGAValveSPPWMPeriod( VALVE_PWM_PERIOD ); + + setFPGAValveIOFPPWMPullIn( VALVE_PWM_PULL_IN ); + setFPGAValveIOFPPWMLow( VALVE_PWM_LOW ); + setFPGAValveIOFPPWMPeriod( VALVE_PWM_PERIOD ); + + for ( i = FIRST_HYD_VALVE; i <= LAST_HYD_VALVE; i++ ) + { + valveDDBits |= 0x01 << i; + } + + for ( i = FIRST_SP_VALVE; i <= LAST_SP_VALVE; i++ ) + { + valveSPBits |= 0x01 << ( i - FIRST_SP_VALVE ); + } + + for ( i = FIRST_IO_VALVE; i <= LAST_IO_VALVE; i++ ) + { + valveIOBits |= 0x01 << ( i - FIRST_IO_VALVE ); + } + + for ( i = FIRST_FP_VALVE; i <= LAST_FP_VALVE; i++ ) + { + valveFPBits |= 0x01 << ( i - FIRST_FP_VALVE ); + } + + // set enable + setFPGAValveDDPWMEnable( valveDDBits ); + setFPGAValveSPPWMEnable( valveSPBits ); + setFPGAValveIOPWMEnable( valveIOBits ); + setFPGAValveFPPWMEnable( valveFPBits ); +} + +/*********************************************************************//** + * @brief * The execValves function executes the valves driver. * @details \b Inputs: valvesStates, valveStateMismatchCounter * pendingValveStateChangeCountDowns, commandedValvesStates, @@ -141,11 +207,11 @@ void execValves( void ) { U32 i; - U16 readValvesStates = getFPGADDValveStates(); - U08 readValveBCStates = getFPGAValveBCStates(); - U08 readValveSpStates = getFPGAValveSpStates(); - U08 readValveIOStates = getFPGAIOValveStates(); - U08 readValveFPStates = getFPGAFPValveStates(); + U16 readValvesStates = getFPGADDValveStates(); + U08 readValveBCStates = getFPGAValveBCStates(); + U08 readValveSpStates = getFPGAValveSpStates(); + U08 readValveIOStates = getFPGAIOValveStates(); + U08 readValveFPStates = getFPGAFPValveStates(); // Verify read back FPGA valve states match last commanded valve states if ( ( readValvesStates != commandedValvesStates ) || @@ -184,8 +250,8 @@ setFPGADDValveStates( commandedValvesStates ); setFPGABCValveStates( commandedBCValveStates ); setFPGASpareValveStates( commandedSpareValveStates ); - setFPGAIOValveStates( commandedIOValveStates ); setFPGAFPValveStates( commandedFPValveStates ); + setFPGAIOValveStates( commandedIOValveStates ); // Publish valve states on interval publishValvesStates(); @@ -385,8 +451,8 @@ ( D40_VALV == valveID ) || ( D47_VALV == valveID ) || ( D3_VALV == valveID ) || ( M4_VALV == valveID ) || ( D23_VALV == valveID ) || ( D19_VALV == valveID ) || ( D25_VALV == valveID ) || ( D21_VALV == valveID ) || ( D24_VALV == valveID ) || ( D20_VALV == valveID ) || ( D26_VALV == valveID ) || ( D22_VALV == valveID ) || ( D80_VALV == valveID ) || ( D81_VALV == valveID ) || ( D79_PMP_VALV == valveID ) || - ( D85_VALV == valveID ) || ( P11_VALV == valveID ) || ( P33_VALV == valveID ) || ( P34_VALV == valveID ) || ( P37_VALV == valveID ) || - ( P6_VALV == valveID ) || ( M12_VALV == valveID ) || ( P39_VALV == valveID ) ) + ( P11_VALV == valveID ) || ( P33_VALV == valveID ) || ( P34_VALV == valveID ) || ( P37_VALV == valveID ) || ( P6_VALV == valveID ) || + ( M12_VALV == valveID ) || ( P39_VALV == valveID ) || ( D83_VALV == valveID ) || ( D91_VALV == valveID ) || ( D100_VALV == valveID ) || ( D85_VALV == valveID ) ) { result = TRUE; } Index: firmware/App/DDCommon.h =================================================================== diff -u -r27e8758fa6199e72b914e1199786a4396ce74d06 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/DDCommon.h (.../DDCommon.h) (revision 27e8758fa6199e72b914e1199786a4396ce74d06) +++ firmware/App/DDCommon.h (.../DDCommon.h) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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 DDCommon.h * -* @author (last) Vinayakam Mani -* @date (last) 14-Nov-2025 +* @author (last) Michael Garthwaite +* @date (last) 02-Feb-2026 * * @author (original) Vinayakam Mani * @date (original) 07-Aug-2024 @@ -25,7 +25,7 @@ #define DD_VERSION_MAJOR 0 #define DD_VERSION_MINOR 0 #define DD_VERSION_MICRO 0 -#define DD_VERSION_BUILD 24 +#define DD_VERSION_BUILD 40 // ********** development build switches ********** @@ -45,9 +45,6 @@ //Uncomment below once characterization/study completed //#define ENABLE_ALARM_2 -//Uncomment below for spent chamber filling -//#define __SPENT_CHAMBER_FILL__ 1 - //Uncomment below for bicarb chamber filling //#define __BICARB_CHAMBER_FILL__ 1 @@ -60,6 +57,8 @@ //Uncomment below to disable heaters debug message #define __HEATERS_DEBUG__ 1 +//Uncomment below to disable Teensy conductivity driver +#define __TEENSY_CONDUCTIVITY_DRIVER__ 1 #include #include Index: firmware/App/Modes/FPModes/FPOperationModes.c =================================================================== diff -u -r2fb473f4574f9c150849bb39991a31bcadaae693 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Modes/FPModes/FPOperationModes.c (.../FPOperationModes.c) (revision 2fb473f4574f9c150849bb39991a31bcadaae693) +++ firmware/App/Modes/FPModes/FPOperationModes.c (.../FPOperationModes.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2025-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2026 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 FPOperationModes.c * * @author (last) “rkallala” -* @date (last) 09-Dec-2025 +* @date (last) 15-Jan-2026 * * @author (original) Michael Garthwaite * @date (original) 08-Sep-2025 @@ -552,7 +552,7 @@ * @details \b Outputs: none * @param message message from Dialin which includes the signal to start or stop * generate permeate modes. - * @return TRUE if set successful, FALSE if not + * @return TRUE if override is successful, FALSE if not *************************************************************************/ BOOL testSetGeneratePermeateSignal( MESSAGE_T *message ) { @@ -577,4 +577,24 @@ return result; } +/*********************************************************************//** + * @brief + * The testGetFPDefeaturedStatus function return whether FP is defeatured or not. + * @details \b Inputs: none + * @details \b Outputs: none + * @details \b Message: \b Sent: MSG_ID_FP_DEF_STATUS_RESPONSE + * @param message request message from Dialin for FP defeatured status. + * @return TRUE if request is successful, FALSE if not + *************************************************************************/ +BOOL testGetFPDefeaturedStatus( MESSAGE_T *message ) +{ + BOOL result = FALSE; + FP_DEF_STATUS_PAYLOAD_T data; + + data.isFPDefeatured = isFPDefeatured(); + result = sendMessage( MSG_ID_FP_DEF_STATUS_RESPONSE, COMM_BUFFER_OUT_DD_CAN_PC, (U08*)&data, sizeof(FP_DEF_STATUS_PAYLOAD_T) ); + + return result; +} + /**@}*/ Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -rb50acaa8dda74292fb41110440eaaa40f2959fb7 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision b50acaa8dda74292fb41110440eaaa40f2959fb7) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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 ModeGenDialysate.c * -* @author (last) Vinayakam Mani -* @date (last) 14-Nov-2025 +* @author (last) Michael Garthwaite +* @date (last) 29-Jan-2026 * * @author (original) Vinayakam Mani * @date (original) 06-Nov-2024 @@ -623,15 +623,16 @@ execBalancingChamberControl(); } -#ifdef __SPENT_CHAMBER_FILL__ - if ( ( TRUE == pendingSpentChamberFill ) && ( FALSE == balancingChambFillInProgress ) ) + if ( getTestConfigStatus( TEST_CONFIG_DD_ENABLE_SPENT_CHAMBER_H_FILL ) == TRUE ) { - setModeGenDStateTransition( DD_GEND_SPENT_CHAMBER_FILL_STATE ); - pendingSpentChamberFill = FALSE; - isDialDeliveryInProgress.data = FALSE; - state = DD_GEND_SPENT_CHAMBER_FILL_STATE; + if ( ( TRUE == pendingSpentChamberFill ) && ( FALSE == balancingChambFillInProgress ) ) + { + setModeGenDStateTransition( DD_GEND_SPENT_CHAMBER_FILL_STATE ); + pendingSpentChamberFill = FALSE; + isDialDeliveryInProgress.data = FALSE; + state = DD_GEND_SPENT_CHAMBER_FILL_STATE; + } } -#endif #ifdef __BICARB_CHAMBER_FILL__ if ( ( TRUE == pendingBicarbChamberFill ) && ( FALSE == balancingChambFillInProgress ) ) { @@ -676,15 +677,16 @@ isDialDeliveryInProgress.data = FALSE; state = DD_GEND_DIALYSATE_BYPASS_STATE; } -#ifdef __SPENT_CHAMBER_FILL__ - else if ( ( TRUE == pendingSpentChamberFill ) && ( FALSE == balancingChambFillInProgress ) ) + else if ( getTestConfigStatus( TEST_CONFIG_DD_ENABLE_SPENT_CHAMBER_H_FILL ) == TRUE ) { - setModeGenDStateTransition( DD_GEND_SPENT_CHAMBER_FILL_STATE ); - pendingSpentChamberFill = FALSE; - isDialDeliveryInProgress.data = FALSE; - state = DD_GEND_SPENT_CHAMBER_FILL_STATE; + if ( ( TRUE == pendingSpentChamberFill ) && ( FALSE == balancingChambFillInProgress ) ) + { + setModeGenDStateTransition( DD_GEND_SPENT_CHAMBER_FILL_STATE ); + pendingSpentChamberFill = FALSE; + isDialDeliveryInProgress.data = FALSE; + state = DD_GEND_SPENT_CHAMBER_FILL_STATE; + } } -#endif #ifdef __BICARB_CHAMBER_FILL__ else if ( ( TRUE == pendingBicarbChamberFill ) && ( FALSE == balancingChambFillInProgress ) ) { @@ -985,7 +987,7 @@ *************************************************************************/ static void checkDialysateTemperature( void ) { - F32 dialysateTemp = getConductivityTemperatureValue( D29_COND ); // Assuming the closest temp sensor to dialyzer + F32 dialysateTemp = getFilteredConductivitySensorTemperature( D29_COND ); // Assuming the closest temp sensor to dialyzer F32 targetTemp = getTDTargetDialysateTemperature(); BOOL isDialTempAboveHighSafety = ( dialysateTemp >= DIALYSATE_TEMP_UPPER_MAX_SAFETY_LIMIT_C ? TRUE : FALSE ); BOOL isDialTempAboveLowSafety = ( dialysateTemp > DIALYSATE_TEMP_UPPER_SAFETY_LIMIT_C ? TRUE : FALSE ); @@ -1044,12 +1046,6 @@ data.genDialysateExecState = (U32)getCurrentGenDialysateState(); data.isDialDelInProgress = (BOOL)getDialDeliveryProgressStatus(); - data.d6Level = (U32)getLevelStatus( D6_LEVL ); - data.d63Level = (U32)getLevelStatus( D63_LEVL ); - data.d46Level = (U32)getLevelStatus( D46_LEVL ); - data.d9Pressure = getFilteredPressure( D9_PRES ); - data.d18Pressure = getFilteredPressure( D18_PRES ); - data.d51Pressure = getFilteredPressure( D51_PRES ); data.isDialysateGoodtoDeliver = (BOOL)getDialGoodToDeliverStatus(); data.currentQd = dialysateToDialyzerFlowRate; Index: firmware/App/Modes/ModeGenDialysate.h =================================================================== diff -u -r50144ec3e96785cf76d5bfd22ee65029c82e732b -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Modes/ModeGenDialysate.h (.../ModeGenDialysate.h) (revision 50144ec3e96785cf76d5bfd22ee65029c82e732b) +++ firmware/App/Modes/ModeGenDialysate.h (.../ModeGenDialysate.h) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -33,6 +33,7 @@ #define FRESH_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for fresh dialysate pump to maintain required pressure. #define SPENT_DIAL_PUMP_INITIAL_RPM 2300 ///< Nominal RPM target for spent dialysate pump to maintain required pressure. +#define DIAL_PUMP_DRAIN_RPM 1000 ///< Nominal RPM target for dialysate pump to drain the dry bicart. #define SPENT_DIAL_PUMP_FILL_RPM 200 ///< Nominal RPM target for spent chamber fill operations. /// Generate dialysate mode data structure Index: firmware/App/Modes/ModePreGenDialysate.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -17,6 +17,7 @@ #include "ConcentratePumps.h" #include "DialysatePumps.h" +#include "DryBiCart.h" #include "Heaters.h" #include "ModePreGenDialysate.h" #include "ModeGenDialysate.h" @@ -57,6 +58,7 @@ static void publishPreGenDialysateState( void ); static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenDialysateFillCompleteCheckState( void ); static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenWetSelfTestState( void ); +static DD_PRE_GEN_DIALYSATE_STATE_T handleDryBicartFillCheckState( void ); //Wet Self test static void setModePreGenWetSelfStateTransition( DD_WET_SELF_TEST_STATE_T state ); @@ -144,6 +146,10 @@ preGenDialysateState = handlePreGenWetSelfTestState(); break; + case DD_PRE_GEN_DRY_BICART_FILL_CHECK: + preGenDialysateState = handleDryBicartFillCheckState(); + break; + case DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND: // TODO : handle wait for Gen dialysate break; @@ -241,7 +247,7 @@ static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenWetSelfTestState( void ) { //TODO: Change to wet self test state later - DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND; + DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_DRY_BICART_FILL_CHECK; //execWetSelfTest(); @@ -250,6 +256,37 @@ /*********************************************************************//** * @brief + * The handleDryBicartFillCheckState function executes intial dry bicart fill request + * @details \b Inputs: none + * @details \b Outputs: none + * @return current state of PreGenDialysate mode + *************************************************************************/ +static DD_PRE_GEN_DIALYSATE_STATE_T handleDryBicartFillCheckState( void ) +{ + //TODO: Change to wet self test state later + DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_DRY_BICART_FILL_CHECK; + + if ( getTestConfigStatus( TEST_CONFIG_DD_ENABLE_DRY_BICART_FILL ) == TRUE ) + { + setBicartFillRequested(); + + // stay in this state till bicart fill complete. + if ( getCurrentDryBiCartFillExecState() == DRY_BICART_FILL_COMPLETE_STATE ) + { + state = DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND; + } + } + else + { + // not bicart fill, move to next state + state = DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND; + } + + return state; +} + +/*********************************************************************//** + * @brief * The setModePreGenWetSelfStateTransition function sets the actuators and variables * for the state transition in pre-gen WetSlef test mode. * @details Inputs: Valve states, Pump speed Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rb50acaa8dda74292fb41110440eaaa40f2959fb7 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision b50acaa8dda74292fb41110440eaaa40f2959fb7) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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. Index: firmware/App/Monitors/Level.c =================================================================== diff -u -r27e8758fa6199e72b914e1199786a4396ce74d06 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Monitors/Level.c (.../Level.c) (revision 27e8758fa6199e72b914e1199786a4396ce74d06) +++ firmware/App/Monitors/Level.c (.../Level.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -1,20 +1,21 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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 Level.c * -* @author (last) Vinayakam Mani -* @date (last) 21-Oct-2025 +* @author (last) Varshini Nagabooshanam +* @date (last) 26-Jan-2026 * * @author (original) Vinayakam Mani * @date (original) 14-Oct-2024 * ***************************************************************************/ + #include "FpgaDD.h" #include "Level.h" #include "MessageSupport.h" @@ -28,9 +29,13 @@ */ // ********** private definitions ********** -#define FPGA_LEVEL_LOW 5 ///< Floater low level status -#define FPGA_LEVEL_MEDIUM 4 ///< Floater medium level status -#define FPGA_LEVEL_HIGH 6 ///< Floater high level status +#define FPGA_B1_HW_LEVEL_LOW 5 ///< Floater low level status for Beta 1.0 +#define FPGA_B1_HW_LEVEL_MEDIUM 4 ///< Floater medium level status for Beta 1.0 +#define FPGA_B1_HW_LEVEL_HIGH 6 ///< Floater high level status for Beta 1.0 +#define FPGA_LEVEL_EMPTY 3 ///< Floater empty level status +#define FPGA_LEVEL_LOW 2 ///< Floater low level status +#define FPGA_LEVEL_MEDIUM 0 ///< Floater medium level status +#define FPGA_LEVEL_HIGH 4 ///< Floater high level status #define LEVEL_COUNT_LOW 0xFFFF ///< Level sensor count when fluid level is low or non submerged #define LEVEL_COUNT_HIGH_START 0x0000 ///< Start range of level sensor count when fluid level is high or submerged #define LEVEL_COUNT_HIGH_END 0x1FFF ///< End range of level sensor count when fluid level is high or submerged @@ -125,6 +130,10 @@ currentLevelStatus = ( processLevelCount( getFPGAD63LevelSensor() ) == 0 ? LEVEL_STATE_LOW : LEVEL_STATE_HIGH ); break; + case D98_LEVL: + currentLevelStatus = ( processLevelCount( getFPGAD98LevelSensor() ) == 0 ? LEVEL_STATE_LOW : LEVEL_STATE_HIGH ); + break; + case D46_LEVL: currentLevelStatus = ( processLevelCount( getFPGAD46LevelSensor() ) == 0 ? LEVEL_STATE_LOW : LEVEL_STATE_HIGH ); break; @@ -161,6 +170,10 @@ SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D63_LEVL_CHANGE, (U32)status[ i ].data, (U32)currentLevelStatus ); break; + case D98_LEVL: + SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D98_LEVL_CHANGE, (U32)status[ i ].data, (U32)currentLevelStatus ); + break; + case D46_LEVL: SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D46_LEVL_CHANGE, (U32)status[ i ].data, (U32)currentLevelStatus ); break; @@ -244,6 +257,7 @@ /*********************************************************************//** * @brief * The getFloaterLevelstatus function gets the floater level reported by FPGA + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if the current state is invalid. * @details \b Inputs: FPGA level sensor data * @details \b Outputs: level * @return level status @@ -255,58 +269,151 @@ if ( D6_LEVL == levelId ) { - levelStatus = getFPGAD6LevelStatus(); - - if ( FPGA_LEVEL_LOW == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_LOW ; - } - else if ( FPGA_LEVEL_MEDIUM == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_MEDIUM ; - } - else if ( FPGA_LEVEL_HIGH == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_HIGH ; - } - else - { - // TODO - Handle invalid level alarm - currentLevelStatus = LEVEL_STATE_ILLEGAL ; - } + levelStatus = getFPGAD6LevelStatus(); + if ( getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) != TRUE ) + { + // Beta 1.9 behavior + if ( FPGA_LEVEL_EMPTY == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_EMPTY; + } + else if ( FPGA_LEVEL_LOW == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_LOW; + } + else if ( FPGA_LEVEL_MEDIUM == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_MEDIUM; + } + else if ( FPGA_LEVEL_HIGH == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_HIGH; + } + else + { + // TODO - Handle invalid level alarm + currentLevelStatus = LEVEL_STATE_ILLEGAL; + } + } + else + { + // Beta 1.0 behavior + if ( FPGA_B1_HW_LEVEL_LOW == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_LOW; + } + else if ( FPGA_B1_HW_LEVEL_MEDIUM == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_MEDIUM; + } + else if ( FPGA_B1_HW_LEVEL_HIGH == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_HIGH; + } + else + { + // TODO - Handle invalid level alarm + currentLevelStatus = LEVEL_STATE_ILLEGAL; + } + } } + else if ( P25_LEVL == levelId ) { - levelStatus = getFPGAP25FloaterState(); + levelStatus = getFPGAP25FloaterState(); - if ( FPGA_LEVEL_LOW == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_LOW ; - } - else if ( FPGA_LEVEL_MEDIUM == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_MEDIUM ; - } - else if ( FPGA_LEVEL_HIGH == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_HIGH ; - } - else - { - // TODO - Handle invalid level alarm - currentLevelStatus = LEVEL_STATE_ILLEGAL ; - } + if ( getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) != TRUE ) + { + // Beta 1.9 behavior + if ( FPGA_LEVEL_EMPTY == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_EMPTY; + } + else if ( FPGA_LEVEL_LOW == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_LOW; + } + else if ( FPGA_LEVEL_MEDIUM == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_MEDIUM; + } + else if ( FPGA_LEVEL_HIGH == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_HIGH; + } + else + { + // TODO - Handle invalid level alarm + currentLevelStatus = LEVEL_STATE_ILLEGAL; + } + } + else + { + // Beta 1.0 behavior + if ( FPGA_B1_HW_LEVEL_LOW == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_LOW; + } + else if ( FPGA_B1_HW_LEVEL_MEDIUM == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_MEDIUM; + } + else if ( FPGA_B1_HW_LEVEL_HIGH == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_HIGH; + } + else + { + // TODO - Handle invalid level alarm + currentLevelStatus = LEVEL_STATE_ILLEGAL; + } + } } + else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_DD_INVALID_LEVEL_ID, (U32)levelId ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_DD_INVALID_LEVEL_ID, (U32)levelId ); } return currentLevelStatus; } /*********************************************************************//** * @brief + * The getBicarbChamberLevelStatus function returns the status of Bicarb chamber + * F level from the upper level and lower level sensors. + * @details \b Inputs: FPGA level sensor data + * @details \b Outputs: level + * @return level status + *************************************************************************/ +LEVEL_STATE_T getBicarbChamberLevelStatus( void ) +{ + LEVEL_STATE_T status = LEVEL_STATE_ILLEGAL; + LEVEL_STATE_T upperlevel = getLevelStatus( D63_LEVL ); + LEVEL_STATE_T lowerlevel = getLevelStatus( D98_LEVL ); + + if ( ( lowerlevel == LEVEL_STATE_LOW ) && ( upperlevel == LEVEL_STATE_LOW ) ) + { + status = LEVEL_STATE_LOW; + } + else if ( ( lowerlevel == LEVEL_STATE_HIGH ) && ( upperlevel == LEVEL_STATE_LOW ) ) + { + status = LEVEL_STATE_MEDIUM; + } + else if ( ( lowerlevel == LEVEL_STATE_HIGH ) && ( upperlevel == LEVEL_STATE_HIGH ) ) + { + status = LEVEL_STATE_HIGH; + } + else + { + // upperlevel == TRUE while lowerlevel == FALSE - illegal + status = LEVEL_STATE_ILLEGAL; + } + return status; +} + +/*********************************************************************//** + * @brief * The publishLevelsData function broadcasts the level data at the * publication interval. * @details \b Inputs: levelsDataPublicationCounter @@ -321,9 +428,11 @@ { DD_LEVEL_DATA_T data; - data.d6Level = (U32)getLevelStatus( D6_LEVL ); - data.d63Level = (U32)getLevelStatus( D63_LEVL ); - data.d46Level = (U32)getLevelStatus( D46_LEVL ); + data.d6Level = (U32)getLevelStatus( D6_LEVL ); + data.d63Level = (U32)getLevelStatus( D63_LEVL ); + data.d98Level = (U32)getLevelStatus( D98_LEVL ); + data.bicarbLevel = (U32)getBicarbChamberLevelStatus(); + data.d46Level = (U32)getLevelStatus( D46_LEVL ); levelsDataPublicationCounter = 0; Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r2fb473f4574f9c150849bb39991a31bcadaae693 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 2fb473f4574f9c150849bb39991a31bcadaae693) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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 AlarmMgmtSWFaults.h * -* @author (last) Vinayakam Mani -* @date (last) 02-Oct-2025 +* @author (last) Michael Garthwaite +* @date (last) 27-Jan-2026 * * @author (original) Vinayakam Mani * @date (original) 07-Aug-2024 @@ -148,9 +148,10 @@ SW_FAULT_ID_VOLTAGES_INVALID_SIGNAL = 117, SW_FAULT_ID_RINSE_PUMP_INVALID_EXEC_STATE = 118, SW_FAULT_ID_RINSE_PUMP_INVALID_STATE1 = 119, - SW_FAULT_ID_DRY_BICART_FILL_INVALID_EXEC_STATE = 120, - SW_FAULT_ID_BICARB_CHAMBER_FILL_INVALID_EXEC_STATE = 121, - SW_FAULT_ID_DRY_BICART_DRAIN_INVALID_EXEC_STATE = 122, + SW_FAULT_ID_CONDUCTIVITY_SENOR_INVALID_STATE = 120, + SW_FAULT_ID_DRY_BICART_FILL_INVALID_EXEC_STATE = 121, + SW_FAULT_ID_BICARB_CHAMBER_FILL_INVALID_EXEC_STATE = 122, + SW_FAULT_ID_DRY_BICART_DRAIN_INVALID_EXEC_STATE = 123, NUM_OF_SW_FAULT_IDS } DD_SW_FAULT_ID_T; @@ -192,7 +193,7 @@ FP_FAULT_ID_INVALID_ALARM_ID_REFERENCED1 = 32, FP_FAULT_ID_INVALID_ALARM_ID_REFERENCED2 = 33, FP_FAULT_ID_FPGA_INVALID_STATE = 34, - FP_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_GET_PROPS = 35, + FP_FAULT_ID_ALARM_MGMFP_FAULT_ID_FP_INVALID_PUMP_DUTY_CYCLE_SELECTEDT_INVALID_ALARM_TO_GET_PROPS = 35, FP_FAULT_ID_FPGA_WRITE_CMD_TOO_MUCH_DATA = 36, FP_FAULT_ID_FPGA_WRITE_RSP_TOO_MUCH_DATA = 37, FP_FAULT_ID_FPGA_READ_CMD_TOO_MUCH_DATA = 38, Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r8752be6dad093564d924e5572ee8756699de0071 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 8752be6dad093564d924e5572ee8756699de0071) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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 Messaging.c * -* @author (last) “rkallala” -* @date (last) 09-Dec-2025 +* @author (last) Michael Garthwaite +* @date (last) 29-Jan-2026 * * @author (original) Vinayakam Mani * @date (original) 07-Aug-2024 @@ -29,23 +29,21 @@ #include "Flow.h" #include "FlowSensor.h" #include "FluidPump.h" -#include "FlushConcentrate.h" -#include "FlushFilter.h" -#include "FlushPermeate.h" #include "FpgaDD.h" #include "FPModeFault.h" #include "FPModeInitPOST.h" #include "FPModeStandby.h" #include "FPOperationModes.h" #include "Heaters.h" -#include "InletPressureCheck.h" #include "Level.h" #include "Messaging.h" #include "MessagePayloads.h" #include "ModeGenDialysate.h" #include "ModeGenPermeate.h" +#include "ModeGenPermeateDefeatured.h" #include "ModePreGenDialysate.h" #include "ModePreGenPermeate.h" +#include "ModePreGenPermeateDefeatured.h" #include "ModePostGenDialysate.h" #include "ModeStandby.h" #include "OperationModes.h" @@ -56,6 +54,11 @@ #include "ROPump.h" #include "SafetyShutdown.h" #include "SpentChamberFill.h" +#include "StateFlushConcentrate.h" +#include "StateFlushFilter.h" +#include "StateFlushFilterDefeatured.h" +#include "StateFlushPermeate.h" +#include "StateInletPressureCheck.h" #include "SystemCommDD.h" #include "Temperature.h" #include "TestSupport.h" @@ -64,6 +67,7 @@ #include "Ultrafiltration.h" #include "Valves.h" #include "Voltages.h" +#include "WaterQualityMonitor.h" /** * @addtogroup Messaging @@ -125,11 +129,18 @@ { MSG_ID_DD_PRESSURE_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testDDPressureSensorDataPublishIntervalOverride }, { MSG_ID_DD_PRESSURE_SENSOR_FILTER_READINGS_OVERRIDE_REQUEST, &testDDPressureSensorFilteredReadingsOverride }, { MSG_ID_DD_PRESSURE_SENSOR_FILTER_TEMPERATURE_OVERRIDE_REQUEST, &testDDPressureSensorFilteredTemperatureReadingsOverride }, +#ifndef __TEENSY_CONDUCTIVITY_DRIVER__ { MSG_ID_DD_CONDUCTIVITY_SENSOR_READINGS_OVERRIDE_REQUEST, &testDDConductivitySensorReadingsOverride }, { MSG_ID_DD_CONDUCTIVITY_SENSOR_TEMPERATURE_OVERRIDE_REQUEST, &testDDConductivitySensorTemperatureReadingsOverride }, { MSG_ID_DD_CONDUCTIVITY_SENSOR_READ_COUNTER_OVERRIDE_REQUEST, &testDDConductivitySensorReadCounterOverride }, { MSG_ID_DD_CONDUCTIVITY_SENSOR_ERROR_COUNTER_OVERRIDE_REQUEST, &testDDConductivitySensorErrorCounterOverride }, { MSG_ID_DD_CONDUCTIVITY_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testDDConductivitySensorDataPublishIntervalOverride }, + { MSG_ID_FP_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testFPConductivitySensorDataPublishIntervalOverride }, + { MSG_ID_FP_CONDUCTIVITY_OVERRIDE_REQUEST, &testFPConductivitySensorReadingsOverride }, + { MSG_ID_FP_CONDUCTIVITY_TEMP_OVERRIDE_REQUEST, &testFPConductivitySensorTemperatureReadingsOverride }, + { MSG_ID_FP_CONDUCTIVITY_READ_COUNT_OVERRIDE_REQUEST, &testFPConductivitySensorReadCounterOverride }, + { MSG_ID_FP_CONDUCTIVITY_ERROR_COUNT_OVERRIDE_REQUEST, &testFPConductivitySensorErrorCounterOverride }, +#endif { MSG_ID_DD_CONCENTRATE_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testConcentratePumpDataPublishIntervalOverride }, { MSG_ID_DD_CONCENTRATE_PUMP_TARGET_SPEED_OVERRIDE_REQUEST, &testConcentratePumpTargetSpeedOverride }, { MSG_ID_DD_CONCENTRATE_PUMP_MEASURED_SPEED_OVERRIDE_REQUEST, &testConcentratePumpMeasuredSpeedOverride }, @@ -192,6 +203,7 @@ { MSG_ID_DD_FILTERED_COND_SENSOR_READINGS_OVERRIDE_REQUEST, &testDDConductivitySensorFilteredReadingsOverride }, { MSG_ID_DD_FILTERED_COND_SENSOR_TEMPERATURE_OVERRIDE_REQUEST, &testDDConductivitySensorFilteredTemperatureReadingsOverride }, { MSG_ID_FP_TESTER_LOGIN_REQUEST, &handleTesterFPLogInRequest }, + { MSG_ID_FP_SOFTWARE_RESET_REQUEST, &handleDDSoftwareResetRequest }, { MSG_ID_FP_SET_OPERATION_MODE_REQUEST, &testSetFPOperationMode }, { MSG_ID_FP_OPERATION_MODE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testSetFPOpModePublishIntervalOverride }, { MSG_ID_FP_PRE_GEN_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testPreGenDataPublishIntervalOverride }, @@ -225,11 +237,6 @@ { MSG_ID_FP_FILTERED_FLOW_TEMP_OVERRIDE_REQUEST, &testFlowSensorFilteredTemperatureReadingsOverride }, { MSG_ID_FP_ALARM_STATE_OVERRIDE_REQUEST, &testAlarmStateOverride }, { MSG_ID_FP_ALARM_CLEAR_ALL_ALARMS_REQUEST, &testFPClearAllAlarms }, - { MSG_ID_FP_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testFPConductivitySensorDataPublishIntervalOverride }, - { MSG_ID_FP_CONDUCTIVITY_OVERRIDE_REQUEST, &testFPConductivitySensorReadingsOverride }, - { MSG_ID_FP_CONDUCTIVITY_TEMP_OVERRIDE_REQUEST, &testFPConductivitySensorTemperatureReadingsOverride }, - { MSG_ID_FP_CONDUCTIVITY_READ_COUNT_OVERRIDE_REQUEST, &testFPConductivitySensorReadCounterOverride }, - { MSG_ID_FP_CONDUCTIVITY_ERROR_COUNT_OVERRIDE_REQUEST, &testFPConductivitySensorErrorCounterOverride }, { MSG_ID_FP_FILTERED_COND_SENSOR_READINGS_OVERRIDE_REQUEST, &testFPConductivitySensorFilteredReadingsOverride }, { MSG_ID_FP_FILTERED_COND_SENSOR_TEMPERATURE_OVERRIDE_REQUEST, &testFPConductivitySensorFilteredTemperatureReadingsOverride }, { MSG_ID_DD_VOLTAGE_DATA_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testVoltageDataPublishIntervalOverride }, @@ -240,15 +247,36 @@ { MSG_ID_FP_PERMEATE_TANK_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testPermeateTankDataPublishIntervalOverride }, { MSG_ID_FP_RO_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testROPumpDataPublishIntervalOverride }, { MSG_ID_DD_RINSE_PUMP_DATA_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testRinsePumpDataPublishIntervalOverride }, + { MSG_ID_DD_RINSE_PUMP_PWM_PERCENT_OVERRIDE_REQUEST, &testRinsePumpPWMPercentOverride }, + { MSG_ID_DD_RINSE_PUMP_TURN_ON_OFF_REQUEST, &testRinsePumpTurnOnOffRequest }, { MSG_ID_FP_SET_START_STOP_OVERRIDE_REQUEST, &testSetGeneratePermeateSignal }, + { MSG_ID_FP_RO_REJECTION_RATIO_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testRORejectionRatioDataPublishIntervalOverride }, + { MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST, &testRORejectionRatioFilteredOverride }, + { MSG_ID_FP_SET_TEST_CONFIGURATION, &testSetTestConfiguration }, + { MSG_ID_FP_GET_TEST_CONFIGURATION, &testGetTestConfiguration }, + { MSG_ID_FP_RESET_ALL_TEST_CONFIGURATIONS, &testResetAllTestConfigurations }, + { MSG_ID_FP_RO_GET_CALCULATED_DUTY_CYCLE_REQUEST, &testROGetCurrentCalculatedDutyCycle }, + { MSG_ID_FP_FLUSH_FILTER_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testFilterFlushDataPublishIntervalOverride }, + { MSG_ID_FP_FLUSH_FILTER_TIMER_OVERRIDE_REQUEST, &testFilterFlushTimerOverride }, + { MSG_ID_FP_FLUSH_PERMEATE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testPermeateFlushDataPublishIntervalOverride }, + { MSG_ID_FP_FLUSH_PERMEATE_TIMER_OVERRIDE_REQUEST, &testPermeateFlushTimerOverride }, + { MSG_ID_FP_FLUSH_PERMEATE_ALARM_TIMER_OVERRIDE_REQUEST, &testPermeateFlushAlarmTimerOverride }, + { MSG_ID_FP_FLUSH_CONCENTRATE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testConcentrateFlushDataPublishIntervalOverride }, + { MSG_ID_FP_FLUSH_CONCENTRATE_TIMER_OVERRIDE_REQUEST, &testConcentrateFlushTimerOverride }, + { MSG_ID_FP_DEF_FLUSH_FILTER_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testFilterFlushDefDataPublishIntervalOverride }, + { MSG_ID_FP_DEF_FLUSH_FILTER_TIMER_OVERRIDE_REQUEST, &testFilterFlushDefTimerOverride }, + { MSG_ID_FP_DEF_PRE_GEN_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testPreGenPermeateDefDataPublishIntervalOverride}, + { MSG_ID_FP_DEF_GEN_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testGenPermeateDefDataPublishIntervalOverride}, + { MSG_ID_FP_DEF_STATUS_REQUEST, &testGetFPDefeaturedStatus }, { MSG_ID_DD_DRY_BICART_DATA_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testDryBiCartDataPublishIntervalOverride }, { MSG_ID_DD_DRY_BICART_FILL_CYCLE_MAX_OVERRIDE_REQUEST, &testDryBiCartFillCycleMaxCountOverride }, { MSG_ID_DD_DRY_BICART_FILL_REQUEST_OVERRIDE_REQUEST, &testDryBiCartFillRequestOverride }, - { MSG_ID_DD_BICARB_CHAMBER_FILL_REQUEST_OVERRIDE_REQUEST, &testBiCarbChamberFillRequestOverride }, - { MSG_ID_FP_RO_REJECTION_RATIO_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testRORejectionRatioDataPublishIntervalOverride }, { MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST, &testRORejectionRatioFilteredOverride }, { MSG_ID_DD_BICART_DRAIN_REQUEST_OVERRIDE_REQUEST, &testDryBiCartDrainRequestOverride }, { MSG_ID_DD_BICART_CARTRIDGE_SELECT_OVERRIDE_REQUEST, &testDryBiCartTypeOverride }, +#ifdef __TEENSY_CONDUCTIVITY_DRIVER__ + { MSG_ID_DD_SET_CONDUCTIVITY_MODEL_REQUEST, &testSetTeenyConductivityModel }, +#endif }; /// Calculation for number of entries in the incoming message function handler look-up table. Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r27e8758fa6199e72b914e1199786a4396ce74d06 -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 27e8758fa6199e72b914e1199786a4396ce74d06) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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. Index: firmware/source/sys_main.c =================================================================== diff -u -ra521fb80a785babd99f0413dc6223d47375a43bc -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/source/sys_main.c (.../sys_main.c) (revision a521fb80a785babd99f0413dc6223d47375a43bc) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -73,9 +73,6 @@ #include "Flow.h" #include "FlowSensor.h" #include "FluidPump.h" -#include "FlushConcentrate.h" -#include "FlushFilter.h" -#include "FlushPermeate.h" #include "FPModeFault.h" #include "FPModeInitPOST.h" #include "FPModeStandby.h" @@ -96,6 +93,11 @@ #include "RinsePump.h" #include "ROPump.h" #include "SafetyShutdown.h" +#include "StateFlushConcentrate.h" +#include "StateFlushFilter.h" +#include "StateFlushFilterDefeatured.h" +#include "StateFlushPermeate.h" +#include "StateInletPressureCheck.h" #include "SystemCommDD.h" #include "TaskBG.h" #include "TDInterface.h" @@ -231,6 +233,8 @@ initPreGenPMode(); initGenPermeateMode(); initGenPermeateDefeaturedMode(); + initInletPressureCheck(); + initFilterFlushDefeatured(); initFilterFlush(); initConcentrateFlush(); initPermeateFlush();