Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rd954cab1e721ac955f98feb260d7b978ec14ccab -r1017bbc5760a50e20357da1e4f705b3e6157375e --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision d954cab1e721ac955f98feb260d7b978ec14ccab) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 1017bbc5760a50e20357da1e4f705b3e6157375e) @@ -16,6 +16,7 @@ #include "BloodFlow.h" #include "Buttons.h" +#include "DGInterface.h" #include "Dialysis.h" #include "DialInFlow.h" #include "DialOutFlow.h" @@ -42,7 +43,8 @@ static F32 refUFVolume; ///< Current reference volume for ultrafiltration (Where should we be w/r/t ultrafiltration). static F32 measUFVolume; ///< Current total measured volume for ultrafiltration (Where are we w/r/t ultrafiltration). -static F32 resStartVolume; ///< Reservoir start volume for ultrafiltration (i.e. where did we start with current reservoir). +static F32 resStartVolume[ NUM_OF_DG_RESERVOIRS ]; ///< Reservoir start volume for ultrafiltration (i.e. where did we start with each reservoir). +static F32 resFinalVolume[ NUM_OF_DG_RESERVOIRS ]; ///< Reservoir final volume for ultrafiltration (i.e. where did we end after switch with each reservoir). static F32 measUFVolumeFromPriorReservoirs; ///< Current total ultrafiltration volume from previous reservoirs in current treatment. static U32 uFTimeMS; ///< Current elapsed ultrafiltration time (in ms). Used for calculating UF reference volume. @@ -87,7 +89,10 @@ refUFVolume = 0.0; measUFVolume = 0.0; - resStartVolume = 0.0; + resStartVolume[ DG_RESERVOIR_1 ] = 0.0; + resStartVolume[ DG_RESERVOIR_2 ] = 0.0; + resFinalVolume[ DG_RESERVOIR_1 ] = 0.0; + resFinalVolume[ DG_RESERVOIR_2 ] = 0.0; measUFVolumeFromPriorReservoirs = 0.0; uFTimeMS = 0; @@ -307,7 +312,7 @@ switch ( currentDialysisState ) { case DIALYSIS_START_STATE: - resStartVolume = getLoadCellWeightInGrams( LOAD_CELL_RESERVOIR_1_PRIMARY ); // always start dialysis w/ reservoir 1 +// resStartVolume = getLoadCellWeightInGrams( LOAD_CELL_RESERVOIR_1_PRIMARY ); // should be set by reservoir mgmg state machine now currentDialysisState = DIALYSIS_UF_STATE; break; @@ -563,14 +568,120 @@ *************************************************************************/ static void updateUFVolumes( void ) { - F32 latestResVolume = getLoadCellWeightInGrams( LOAD_CELL_RESERVOIR_1_PRIMARY ); // TODO - just res 1 for now - add reservoir switching, mgmt later. + DG_RESERVOIR_ID_T activeRes = getDGActiveReservoir(); + F32 latestResVolume; + // get volume of active reservoir + if ( DG_RESERVOIR_1 == activeRes ) + { + latestResVolume = getLoadCellWeightInGrams( LOAD_CELL_RESERVOIR_1_PRIMARY ); + } + else + { + latestResVolume = getLoadCellWeightInGrams( LOAD_CELL_RESERVOIR_2_PRIMARY ); + } + // calculate UF volumes and provide to dialysate outlet pump controller refUFVolume = ( ( (F32)uFTimeMS / MS_PER_SECOND ) / SEC_PER_MIN ) * setUFRate; - measUFVolume = measUFVolumeFromPriorReservoirs + ( latestResVolume - resStartVolume ); + measUFVolume = measUFVolumeFromPriorReservoirs + ( latestResVolume - resStartVolume[ activeRes ] ); + resFinalVolume[ activeRes ] = latestResVolume; setDialOutUFVolumes( refUFVolume, measUFVolume ); } +/*********************************************************************//** + * @brief + * The setStartReservoirVolume function updates the baseline volume of the \n + * next reservoir to be drawn from before it is switched to (i.e. while it \n + * is the inactive reservoir) in order to get a more stable volume. + * @details + * Inputs : active reservoir, load cell reading from inactive reservoir + * Outputs : resStartVolume[] + * @return none + *************************************************************************/ +void setStartReservoirVolume( void ) +{ + DG_RESERVOIR_ID_T activeRes = getDGActiveReservoir(); + DG_RESERVOIR_ID_T inactiveRes; + F32 resVolume; + + // get volume of inactive reservoir + if ( DG_RESERVOIR_2 == activeRes ) + { + inactiveRes = DG_RESERVOIR_1; + resVolume = getLoadCellWeightInGrams( LOAD_CELL_RESERVOIR_1_PRIMARY ); + } + else + { + inactiveRes = DG_RESERVOIR_2; + resVolume = getLoadCellWeightInGrams( LOAD_CELL_RESERVOIR_2_PRIMARY ); + } + + // set starting baseline volume for next reservoir before we switch to it + resStartVolume[ inactiveRes ] = resVolume; +} + +/*********************************************************************//** + * @brief + * The signalReservoirsSwitched function informs this module that the \n + * reservoirs have been switched. The UF volume from prior reservoirs is \n + * tentatively added to with a load cell reading of the inactive reservoir. + * @details + * Inputs : resFinalVolume[], resStartVolume[] + * Outputs : measUFVolumeFromPriorReservoirs + * @return none + *************************************************************************/ +void signalReservoirsSwitched( void ) +{ + DG_RESERVOIR_ID_T activeRes = getDGActiveReservoir(); + DG_RESERVOIR_ID_T inactiveRes; + + // get volume of inactive reservoir + if ( DG_RESERVOIR_2 == activeRes ) + { + inactiveRes = DG_RESERVOIR_1; + } + else + { + inactiveRes = DG_RESERVOIR_2; + } + // update UF volume from prior reservoirs per tentative res volume for last reservoir + measUFVolumeFromPriorReservoirs += ( resFinalVolume[ inactiveRes ] - resStartVolume[ inactiveRes ] ); +} + +/*********************************************************************//** + * @brief + * The setFinalReservoirVolume function updates the UF volume from prior reservoirs \n + * with a more stable final reservoir volume of the prior reservoir after it's \n + * had a moment to settle. + * @details + * Inputs : active reservoir, load cell reading from inactive reservoir + * Outputs : measUFVolumeFromPriorReservoirs, resFinalVolume[], resStartVolume[] + * @return none + *************************************************************************/ +void setFinalReservoirVolume( void ) +{ + DG_RESERVOIR_ID_T activeRes = getDGActiveReservoir(); + DG_RESERVOIR_ID_T inactiveRes; + F32 resVolume; + + // get volume of inactive reservoir + if ( DG_RESERVOIR_2 == activeRes ) + { + inactiveRes = DG_RESERVOIR_1; + resVolume = getLoadCellWeightInGrams( LOAD_CELL_RESERVOIR_1_PRIMARY ); + } + else + { + inactiveRes = DG_RESERVOIR_2; + resVolume = getLoadCellWeightInGrams( LOAD_CELL_RESERVOIR_2_PRIMARY ); + } + + // update UF volume from prior reservoirs per final res volume for last reservoir a bit after we've switched + measUFVolumeFromPriorReservoirs -= ( resFinalVolume[ inactiveRes ] - resStartVolume[ inactiveRes ] ); + resFinalVolume[ inactiveRes ] = resVolume; + measUFVolumeFromPriorReservoirs += ( resFinalVolume[ inactiveRes ] - resStartVolume[ inactiveRes ] ); +} + /**@}*/