Index: firmware/App/Controllers/DryBiCart.c =================================================================== diff -u -r96468474a209ba55660ba0f1c7441bb381d24ff8 -r119b0ed8343d2d739ead1647360aa2f423283ddc --- firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision 96468474a209ba55660ba0f1c7441bb381d24ff8) +++ firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision 119b0ed8343d2d739ead1647360aa2f423283ddc) @@ -51,12 +51,12 @@ #define DRY_BICART_FILL_COMPLETE_TIME_MS ( 1 * MS_PER_SECOND ) ///< Wait time to reset the request flag after fill complete #define DRY_BICART_FILL_DURATION_DIFF_MS 750 ///< Fill duration difference between last and current fill cycle. -#define PRESSURE_OFFSET_PSI 2 ///< Dry bicart pressure offset. +#define PRESSURE_OFFSET_PSI 1.0F ///< Dry bicart pressure offset. #define DRY_BICART_FILL_COMPLETE_PRESSURE ( 10.0F + PRESSURE_OFFSET_PSI ) ///< Maximum pressure reached to indicate the dry bicart fill being completed. #define DRY_BICART_FILL_INITIATE_PRESSURE 1.5F ///< Minimum pressure required to initiate the dry bicart fill process. #define DRY_BICART_FILL_COMPLETE_SUPPLY_PRESSURE 8.0F ///< Maximum pressure allowed at bicart fill during supply process/state #define DRY_BICART_FILL_INITIATE_SUPPLY_PRESSURE 3.0F ///< Minimum pressure required to initiate the dry bicart fill during supply process/state -#define MAX_DRY_BICART_FILL_COMPLETE_PRESSURE 15 ///< Very Max dry bicart fill complete pressure for persistence on d66 +#define MAX_DRY_BICART_FILL_COMPLETE_PRESSURE 15.0F ///< Very max dry bicart fill complete pressure for persistence on d66 #define DRY_BICART_DEFAULT_MAX_FILL_CYCLE_CNT 10 ///< Default max fill cycle allowed for dry bicart fill/mix with water. #define DRY_BICART_MAX_FILL_CYCLE_CNT 30 ///< Max fill cycle allowed (by override) for dry bicart fill/mix with water. @@ -86,12 +86,12 @@ // drybicarb mixing #define BICARB_VOL_CONTROL_P_COEFFICIENT ( 0.00008484 * 2 ) ///< Bicarb proportional gain (kp) -#define BICARB_VOL_CONTROL_I_COEFFICIENT ( 0.00033936 / 5) ///< Bicarb integral gain. (ki) +#define BICARB_VOL_CONTROL_I_COEFFICIENT ( 0.00033936 / 5 ) ///< Bicarb integral gain. (ki) #define MIN_BICARB_VOLUME_ML 0.868686869 ///< Minimum bicarb volume in mL #define MAX_BICARB_VOLUME_ML 1.8 ///< Maximum bicarb volume in mL -#define ACID_VOL_CONTROL_P_COEFFICIENT (0.00000997/2) ///< Acid proportional gain (kp) -#define ACID_VOL_CONTROL_I_COEFFICIENT (0.00003988/2) ///< Acid integral gain. (ki) +#define ACID_VOL_CONTROL_P_COEFFICIENT ( 0.00000997 / 2 ) ///< Acid proportional gain (kp) +#define ACID_VOL_CONTROL_I_COEFFICIENT ( 0.00003988 / 2 ) ///< Acid integral gain. (ki) #define MIN_ACID_VOLUME_ML 0.3 ///< Minimum acid volume in mL #define MAX_ACID_VOLUME_ML 1.0 ///< Maximum acid volume in mL/min. @@ -110,10 +110,10 @@ #define MIX_NO_FEED_FORWARD 0.0F ///< Feedforward term for dialysate closed loop control -#define MIX_CONTROL_INTERVAL_MS ( 15 * MS_PER_SECOND ) ///< Dialysate dosing control interval in ms -#define BICARB_MIX_CONTROL_INTERVAL ( 3 * MS_PER_SECOND /\ +#define MIX_CONTROL_INTERVAL_MS ( 15 * MS_PER_SECOND ) ///< Dialysate mixing control interval in ms +#define BICARB_MIX_CONTROL_INTERVAL ( 3 * MS_PER_SECOND /\ TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate mix is controlled. -#define ACID_MIX_CONTROL_INTERVAL ( MIX_CONTROL_INTERVAL_MS /\ +#define ACID_MIX_CONTROL_INTERVAL ( MIX_CONTROL_INTERVAL_MS /\ TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate mix is controlled. #define BICARB_DEADBAND_CONTROL 50.0F ///< Dry Bicarb dead band control #define ACID_DEADBAND_CONTROL 100.0F ///< Acid dead band control @@ -155,8 +155,8 @@ /// Dialysate Mixing state machine data structure typedef struct { - U32 controlTimerCounter; ///< Timer counter to perform control on dialysate mixing. - DIALYSATE_MIXING_STATE_T dialysateMixingState; ///< Current state of dialysate mixing controller state machine. + U32 controlTimerCounter; ///< Timer counter to perform control on dialysate mixing. + DIALYSATE_MIXING_STATE_T dialysateMixingState; ///< Current state of dialysate mixing controller state machine. } DIALYSATE_MIXING_DATA_T; // ********** private data ********** @@ -244,7 +244,7 @@ static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainDurationCheckState( void ); static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainEndState( void ); -// dosing control loop +// Mixing control loop static DIALYSATE_MIXING_STATE_T handleDialysateMixOpenLoopState( DIALYSATE_MIXING_ID_T mixId ); static DIALYSATE_MIXING_STATE_T handleDialysateMixRampToTargetState( DIALYSATE_MIXING_ID_T mixId ); static DIALYSATE_MIXING_STATE_T handleDialysateMixControlToTargetState( DIALYSATE_MIXING_ID_T mixId ); @@ -423,9 +423,9 @@ /*********************************************************************//** * @brief * The execDialysateCompositionMixingController function executes the dialysate mixing controller. - * @details \b Inputs: dialysateDosingState - * @details \b Outputs: dialysateDosingState - * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT if invalid dialysate dosing + * @details \b Inputs: dialysateMix[ mixId ].dialysateMixingState + * @details \b Outputs:dialysateMix[ mixId ].dialysateMixingState + * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT if invalid dialysate mixing * state machine found. * @return none *************************************************************************/ @@ -478,7 +478,7 @@ if( getCurrentBalancingChamberExecState() > BAL_CHAMBER_STATE_IDLE ) { - // closed loop bicarb and acid dosing controller + // closed loop bicarb and acid mixing controller execDialysateCompositionMixingController(); } @@ -1256,15 +1256,15 @@ DRY_BICART_FILL_EXEC_STATE_T state = DRY_BICART_FILL_WATER_END_STATE; F32 d66Pressure = getFilteredPressure( D66_PRES ); - // Close dry bicart inlet water if bicart is filled with water + // Close dry bicart inlet water if D66 pressure is 11 PSIr if ( d66Pressure >= DRY_BICART_FILL_COMPLETE_PRESSURE ) { // start the persistance timer once d66 reaches 11 PSI if ( 0 == dryBiCartPersistanceStartTime ) { dryBiCartPersistanceStartTime = getMSTimerCount(); } - // to check the the maximum cart pressure during persistence on D66 + //check the the maximum cart pressure during persistence on D66 if ( d66Pressure >= MAX_DRY_BICART_FILL_COMPLETE_PRESSURE ) { setValveState( D65_VALV, VALVE_STATE_CLOSED ); @@ -1341,7 +1341,7 @@ setValveState( D64_VALV, VALVE_STATE_OPEN ); } - // D66 pressure drops or time out + // D66 pressure drops to below 1.5 PSI or time out if ( ( d66Pressure <= DRY_BICART_FILL_VENT_COMPLETE_PRESSURE ) || ( TRUE == didTimeout( dryBiCartFillStartTime, DRY_BICART_FILL_VENT_MAX_TIME_MS ) ) ) { @@ -1425,8 +1425,8 @@ if ( TRUE == didTimeout( dryBiCartFillStartTime, DRY_BICART_FILL_COMPLETE_TIME_MS ) ) { currentFillDurationInMS = 0; - lastFillDurationInMS = 0; - biCartFillCycleCounter = 0; + lastFillDurationInMS = 0; + biCartFillCycleCounter = 0; // Go idle dryBiCartFillRequested.data = FALSE; // for this request override also cleared @@ -1482,14 +1482,14 @@ BICARB_CHAMBER_FILL_EXEC_STATE_T state = BICARB_CARTRIDGE_FILL_WATER_END_STATE; // Close vent valves and descaling valve - setValveState( D64_VALV, VALVE_STATE_OPEN ); //open setValveState( D80_VALV, VALVE_STATE_CLOSED ); setValveState( D81_VALV, VALVE_STATE_CLOSED ); setValveState( D85_VALV, VALVE_STATE_CLOSED ); // open inlet water to bicart setValveState( D65_VALV, VALVE_STATE_OPEN ); - //setValveState( D3_VALV, VALVE_STATE_OPEN ); + setValveState( D64_VALV, VALVE_STATE_OPEN ); + dryBiCarbSupplyStartTime = getMSTimerCount(); dryBiCartPersistanceStartTime = 0; @@ -1508,24 +1508,28 @@ BICARB_CHAMBER_FILL_EXEC_STATE_T state = BICARB_CARTRIDGE_FILL_WATER_END_STATE; F32 d66Pressure = getFilteredPressure( D66_PRES ); - if ( d66Pressure >= DRY_BICART_FILL_COMPLETE_PRESSURE )// DRY_BICART_FILL_COMPLETE_SUPPLY_PRESSURE + // check D66 is 11 PSI + if ( d66Pressure >= DRY_BICART_FILL_COMPLETE_PRESSURE ) { // persistence - // to check the the maximum cart pressure during persistence on D66 + // check the the maximum cart pressure during persistence on D66 if ( d66Pressure >= MAX_DRY_BICART_FILL_COMPLETE_PRESSURE ) { + // Close water inlet valve as D66 pressure reaches max PSI(14-15) after persistence setValveState( D65_VALV, VALVE_STATE_CLOSED ); dryBiCartPersistanceStartTime = 0; + state = BICARB_CHAMBER_CHECK_LEVEL_STATE; } // 200 ms persistence on D66 pressure since pressure overshoot just after D65 opening if ( TRUE == didTimeout( dryBiCartPersistanceStartTime, DRY_BICART_FILL_PERSISTANCE_DURATION_MS ) ) { + // Close water inlet valve as D66 pressure reaches 11 PSI after persistence setValveState( D65_VALV, VALVE_STATE_CLOSED ); dryBiCartPersistanceStartTime = 0; + state = BICARB_CHAMBER_CHECK_LEVEL_STATE; } - // Close water inlet valve as D66 pressure reaches 11 PSI. } return state; @@ -1544,18 +1548,16 @@ BICARB_CHAMBER_FILL_EXEC_STATE_T state = BICARB_CHAMBER_CHECK_LEVEL_STATE; LVL_STATE_T bicarbChamberLevel = getBicarbChamberLevelStatus(); - // TODO: Confirm D80 open on chamber low or end of balancing chamber switching? - // if ( getBalancingChamberFillinProgressStatus() == FALSE ) - { - setValveState( D64_VALV, VALVE_STATE_CLOSED ); - // Open the Bicarb chamber inlet valve - setValveState( D80_VALV, VALVE_STATE_OPEN ); + // TODO: set supply in progress to inform BC control to disable alarm + setValveState( D64_VALV, VALVE_STATE_CLOSED ); + // Open the Bicarb chamber inlet valve + setValveState( D80_VALV, VALVE_STATE_OPEN ); - // Start a timer when bicarb supply started to chamber F - dryBiCarbSupplyStartTime = getMSTimerCount(); + // Start a timer when bicarb supply started to chamber F + dryBiCarbSupplyStartTime = getMSTimerCount(); - state = BICARB_CHAMBER_FILL_STATE; - } + state = BICARB_CHAMBER_FILL_STATE; + // TODO: alarm return state; @@ -1623,6 +1625,7 @@ setValveState( D80_VALV, VALVE_STATE_CLOSED ); setValveState( D85_VALV, VALVE_STATE_OPEN ); dryBiCarbSypplyVentStartTime = getMSTimerCount(); + state = BICARB_SUPPLY_VENT_START_STATE; } } @@ -1634,11 +1637,12 @@ // Close water inlet valve as fill is complete. else if ( d66Pressure >= getDryBicartUpperCartPressure() ) { + // start persistance timer if ( 0 == dryBiCartPersistanceStartTime ) { dryBiCartPersistanceStartTime = getMSTimerCount(); } - // to check the the maximum cart pressure during persistence on D66 + //check the the maximum cart pressure during persistence on D66 if ( d66Pressure >= MAX_DRY_BICART_FILL_COMPLETE_PRESSURE ) { setValveState( D65_VALV, VALVE_STATE_CLOSED ); @@ -1668,12 +1672,13 @@ BICARB_CHAMBER_FILL_EXEC_STATE_T state = BICARB_SUPPLY_VENT_START_STATE; F32 d66Pressure = getFilteredPressure( D66_PRES ); + // open D64 after 1 sec if ( TRUE == didTimeout( dryBiCarbSypplyVentStartTime, DRY_BICART_SUPPLY_VENT_MAX_TIME_MS ) ) { setValveState( D64_VALV, VALVE_STATE_OPEN ); } - // D66 pressure drops or time out + // D66 pressure drops to 1.5 or time out if ( ( d66Pressure <= DRY_BICART_FILL_VENT_COMPLETE_PRESSURE ) || ( TRUE == didTimeout( dryBiCarbSypplyVentStartTime, DRY_BICART_FILL_VENT_MAX_TIME_MS ) ) ) { @@ -1910,20 +1915,20 @@ data.dryBiCartDrainTimePeriod = dryBiCartDrainTimePeriod; // TODO: remove after feature testing - memcpy( &data.dryBiCartBicarbDosingControl, &bicarbControlSignals, sizeof( PI_CONTROLLER_SIGNALS_DATA ) ); + memcpy( &data.dryBiCartBicarbMixingControl, &bicarbControlSignals, sizeof( PI_CONTROLLER_SIGNALS_DATA ) ); // TODO: remove after feature testing - memcpy( &data.dryBiCartAcidDosingControl , &acidControlSignals , sizeof( PI_CONTROLLER_SIGNALS_DATA ) ); + memcpy( &data.dryBiCartAcidMixingControl , &acidControlSignals , sizeof( PI_CONTROLLER_SIGNALS_DATA ) ); data.dryBiCartAcidMixVolume = getAcidMixVol(); data.dryBiCartBicarbMixVolume = getBicarbMixVol(); // TODO: remove after feature testing - data.dryBiCartBicarbDosingKPgain = getBicarbKpGainCoefficient(); + data.dryBiCartBicarbMixingKPgain = getBicarbKpGainCoefficient(); // TODO: remove after feature testing - data.dryBiCartBicarbDosingKIgain = getBicarbKiGainCoefficient(); + data.dryBiCartBicarbMixingKIgain = getBicarbKiGainCoefficient(); - data.dryBiCartAcidDosingKPgain = getAcidKpGainCoefficient(); - data.dryBiCartAcidDosingKIgain = getAcidKiGainCoefficient(); + data.dryBiCartAcidMixingKPgain = getAcidKpGainCoefficient(); + data.dryBiCartAcidMixingKIgain = getAcidKiGainCoefficient(); broadcastData( MSG_ID_DD_DRY_BICART_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( DRY_BICART_DATA_T ) ); @@ -2040,11 +2045,11 @@ /*********************************************************************//** * @brief * The testDryBiCartAcidMixVolumeOverride function sets the override value - * of the acid concentrate dosing volume. + * of the acid concentrate mixing volume. * @details Inputs: dryBiCartAcidMixVolume * @details Outputs: dryBiCartAcidMixVolume * @param message Override message from Dialin which includes the override - * value to override the acid concentrate dosing volume. + * value to override the acid concentrate mixing volume. * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testDryBiCartAcidMixVolumeOverride( MESSAGE_T *message ) @@ -2057,11 +2062,11 @@ /*********************************************************************//** * @brief * The testDryBiCartBicarbMixVolumeOverride function sets the override value - * of the bicarb concentrate dosing volume. + * of the bicarb concentrate mixing volume. * @details Inputs: dryBiCartBicarbMixVolume * @details Outputs: dryBiCartBicarbMixVolume * @param message Override message from Dialin which includes the override - * value to override the bicarb concentrate dosing volume. + * value to override the bicarb concentrate mixing volume. * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testDryBiCartBicarbMixVolumeOverride( MESSAGE_T *message ) @@ -2074,11 +2079,11 @@ /*********************************************************************//** * @brief * The testDryBiCartBicarbMixVolControlKpGainOverride function sets the override value - * of the Kp gain coefficient for closed loop bicarb dosing volume control + * of the Kp gain coefficient for closed loop bicarb mixing volume control * @details Inputs: dryBiCartBicarbMixVolumeKpGain * @details Outputs: dryBiCartBicarbMixVolumeKpGain * @param message Override message from Dialin which includes the override - * value to override the bicarb concentrate dosing volume kp gain. + * value to override the bicarb concentrate mixing volume kp gain. * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testDryBiCartBicarbMixVolControlKpGainOverride( MESSAGE_T *message ) @@ -2095,11 +2100,11 @@ /*********************************************************************//** * @brief * The testDryBiCartBicarbMixVolControlKiGainOverride function sets the override value - * of the Ki gain coefficient for closed loop bicarb concentrate dosing volume control + * of the Ki gain coefficient for closed loop bicarb concentrate mixing volume control * @details Inputs: dryBiCartBicarbMixVolumeKiGain * @details Outputs: dryBiCartBicarbMixVolumeKiGain * @param message Override message from Dialin which includes the override - * value to override the bicarb concentrate dosing volume ki gain. + * value to override the bicarb concentrate mixing volume ki gain. * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testDryBiCartBicarbMixVolControlKiGainOverride( MESSAGE_T *message ) @@ -2116,11 +2121,11 @@ /*********************************************************************//** * @brief * The testDryBiCartAcidMoxVolControlKpGainOverride function sets the override value - * of the Kp gain coefficient for closed loop acid concentrate dosing volume control + * of the Kp gain coefficient for closed loop acid concentrate mixing volume control * @details Inputs: dryBiCartAcidMixVolumeKpGain * @details Outputs: dryBiCartAcidMixVolumeKpGain * @param message Override message from Dialin which includes the override - * value to override the acid concentrate dosing volume kp gain. + * value to override the acid concentrate mixing volume kp gain. * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testDryBiCartAcidMixVolControlKpGainOverride( MESSAGE_T *message ) @@ -2137,11 +2142,11 @@ /*********************************************************************//** * @brief * The testDryBiCartAcidMixVolControlKiGainOverride function sets the override value - * of the Ki gain coefficient for closed loop acid concentrate dosing volume control + * of the Ki gain coefficient for closed loop acid concentrate mixing volume control * @details Inputs: dryBiCartAcidMixVolumeKiGain * @details Outputs: dryBiCartAcidMixVolumeKiGain * @param message Override message from Dialin which includes the override - * value to override the bicarb concentrate dosing volume ki gain. + * value to override the bicarb concentrate mixing volume ki gain. * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testDryBiCartAcidMixVolControlKiGainOverride( MESSAGE_T *message ) Index: firmware/App/Controllers/DryBiCart.h =================================================================== diff -u -r96468474a209ba55660ba0f1c7441bb381d24ff8 -r119b0ed8343d2d739ead1647360aa2f423283ddc --- firmware/App/Controllers/DryBiCart.h (.../DryBiCart.h) (revision 96468474a209ba55660ba0f1c7441bb381d24ff8) +++ firmware/App/Controllers/DryBiCart.h (.../DryBiCart.h) (revision 119b0ed8343d2d739ead1647360aa2f423283ddc) @@ -51,17 +51,17 @@ U32 dryBiCartDrainTimePeriod; ///< Dry bicart drain time based on catridge type (small/large) // TODO: remove after closed loops stabilized - PI_CONTROLLER_SIGNALS_DATA dryBiCartBicarbDosingControl; ///< Dry bicart bicarb dosing closed loop control signals data - PI_CONTROLLER_SIGNALS_DATA dryBiCartAcidDosingControl; ///< Dry bicart acid dosing closed loop control signals data + PI_CONTROLLER_SIGNALS_DATA dryBiCartBicarbMixingControl; ///< Dry bicart bicarb mixing closed loop control signals data + PI_CONTROLLER_SIGNALS_DATA dryBiCartAcidMixingControl; ///< Dry bicart acid mixing closed loop control signals data - F32 dryBiCartAcidMixVolume; ///< Dry bicart acid dose volume - F32 dryBiCartBicarbMixVolume; ///< Dry bicart bicarb dose volume + F32 dryBiCartAcidMixVolume; ///< Dry bicart acid dose volume + F32 dryBiCartBicarbMixVolume; ///< Dry bicart bicarb dose volume - F32 dryBiCartBicarbDosingKPgain; ///< Dry bicart bicarb dosing control kp gain - F32 dryBiCartBicarbDosingKIgain; ///< Dry bicart bicarb dosing control ki gain + F32 dryBiCartBicarbMixingKPgain; ///< Dry bicart bicarb mixing control kp gain + F32 dryBiCartBicarbMixingKIgain; ///< Dry bicart bicarb mixing control ki gain - F32 dryBiCartAcidDosingKPgain; ///< Dry bicart acid dosing control kp gain - F32 dryBiCartAcidDosingKIgain; ///< Dry bicart acid dosing control ki gain + F32 dryBiCartAcidMixingKPgain; ///< Dry bicart acid mixing control kp gain + F32 dryBiCartAcidMixingKIgain; ///< Dry bicart acid mixing control ki gain } DRY_BICART_DATA_T;