Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r16d6398acc1c6cf604d9dc993b27c94d895132e9 -ra6b123cfdbca851389cfd5cc1b753386e156e960 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 16d6398acc1c6cf604d9dc993b27c94d895132e9) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision a6b123cfdbca851389cfd5cc1b753386e156e960) @@ -1234,6 +1234,7 @@ } // Calculate target FPGA rate from set rate in mL/hr converted to microstep toggle interval in uSec calcStepperToggleTimeForTargetRate( syringePumpSetRate ); + // Update the FPGA rate to intial ramp up speed setFPGASyringePumpStepToggleTime( syringePumpRampUpToggleTime ); // Reset stall detect variables syringePumpStallRetryCount = 0; @@ -1986,6 +1987,10 @@ /*********************************************************************//** * @brief * The rampSyringePump function handles the ramp-up for the syringe pump. + * This function calculates the new toggle time every 10 ms and updates FPGA + * with the new toggle. + * Motor speed is inversely proportional to the toggle time. + * Smaller the toggle time, faster the speed of the motor. * @details \b Inputs: syringePumpRampTimerCtr, syringePumpSetToggleTime * @details \b Outputs: syringePumpRampUpToggleTime * @return none @@ -1994,11 +1999,15 @@ { // Ramp up syringe pump toward target speed syringePumpRampTimerCtr++; + + // Check if current toggle time is larger than the target toggle time. if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) { + // Calculate the new toggle time and update the FPGA with the new speed. syringePumpRampUpToggleTime = (U32)( (F32)SYRINGE_PUMP_START_RAMP_SPEED / ( (F32)( syringePumpRampTimerCtr * syringePumpRampTimerCtr * syringePumpRampTimerCtr ) / (F32)SYRINGE_PUMP_RAMP_DIVISOR ) ); syringePumpRampUpPct = (F32)syringePumpSetToggleTime / (F32)syringePumpRampUpToggleTime; + if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) { setFPGASyringePumpStepToggleTime( syringePumpRampUpToggleTime ); Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r52761961d73cdc8f5f9c0c83ef420bcd43a27551 -ra6b123cfdbca851389cfd5cc1b753386e156e960 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 52761961d73cdc8f5f9c0c83ef420bcd43a27551) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision a6b123cfdbca851389cfd5cc1b753386e156e960) @@ -8,7 +8,7 @@ * @file ModeTreatment.c * * @author (last) Raghu Kallala -* @date (last) 17-Apr-2026 +* @date (last) 04-May-2026 * * @author (original) Sean Nash * @date (original) 21-Apr-2025 @@ -72,8 +72,8 @@ static BOOL treatmentCompleted; ///< Flag indicates whether the treatment has completed. static U32 presTreatmentTimeSecs; ///< Prescribed treatment time (in seconds). -static F32 presUFVolumeL; ///< Prescribed ultrafiltration volume (in L). -static F32 presUFRateLHr; ///< Prescribed ultrafiltration rate (in L/hr). +static F32 presUFVolumeMl; ///< Prescribed ultrafiltration volume (in L). +static F32 presUFRateMlMin; ///< Prescribed ultrafiltration rate (in mL/Min). static U32 treatmentTimeMS; ///< Elapsed treatment time (in ms). static U32 lastTreatmentTimeStamp; ///< Last time elapsed treatment time was recorded (a timestamp in ms). @@ -158,8 +158,8 @@ salineBolusBroadcastTimerCtr = SALINE_BOLUS_DATA_PUB_INTERVAL; // So we send saline bolus data immediately when we begin treatment mode presTreatmentTimeSecs = 0; - presUFVolumeL = 0.0F; - presUFRateLHr = 0.0F; + presUFVolumeMl = 0.0F; + presUFRateMlMin = 0.0F; resetSignalFlags(); resetAlarmSignalFlags(); @@ -207,13 +207,13 @@ // Set treatment parameters presTreatmentTimeSecs = getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ) * SEC_PER_MIN; - presUFVolumeL = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ); - presUFRateLHr = presUFVolumeL / ( (F32)getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ) / (F32)MIN_PER_HOUR ); - setDialysisDDParams( getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFVolumeL, presUFRateLHr ); + presUFVolumeMl = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ) * (F32)ML_PER_LITER; + presUFRateMlMin = presUFVolumeMl / (F32)getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); + setDialysisDDParams( getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFVolumeMl, presUFRateMlMin ); bicarbConvFactor = BICARBONATE_CONVERSION_FACTOR; // Direct DD to generate dialysate and bypass while priming blood - cmdStartGenerateDialysate( (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFRateLHr, + cmdStartGenerateDialysate( (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFRateMlMin, getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ), TRUE, getTreatmentParameterF32( TREATMENT_PARAM_ACID_CONCENTRATE_CONV_FACTOR ), bicarbConvFactor, @@ -949,7 +949,7 @@ F32 minUFVol = 0.0F; // TODO getUltrafiltrationReferenceVolume() + presUFRate; // current UF volume + 1 min at current rate // Compute maximum UF volume (considering from adjustment of UF rate and time perspectives) F32 maxUFVol1 = minUFVol + ( (F32)( presTime - elapseTime ) * MAX_UF_RATE_ML_MIN ); - F32 maxUFVol2 = ( presUFRateLHr > 0.0F ? minUFVol + ( (F32)( MAX_TREATMENT_TIME_MINUTES - elapseTime - 1 ) * presUFRateLHr ) : minUFVol ); + F32 maxUFVol2 = ( presUFRateMlMin > 0.0F ? minUFVol + ( (F32)( MAX_TREATMENT_TIME_MINUTES - elapseTime - 1 ) * presUFRateMlMin ) : minUFVol ); F32 maxUFVol = MAX( maxUFVol1, maxUFVol2 ); // Set minimum dialysate flow rate U32 minDialRate = MIN_DIALYSATE_FLOW_RATE; @@ -1128,7 +1128,7 @@ * @brief * The publishUltrafiltrationData function publishes the ultrafiltration data * at the set time interval. - * @details \b Inputs: presUFVolumeL, presUFRate + * @details \b Inputs: none * @details \b Outputs: none * @return none *************************************************************************/ @@ -1137,7 +1137,10 @@ if ( ++ultrafiltrationBroadcastTimerCtr >= ULTRAFILTRATION_DATA_PUB_INTERVAL ) { UF_DATA_PAYLOAD_T data; + F32 presUFRateLHr = 0.0F; + F32 presUFVolumeL = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ); + presUFRateLHr = presUFVolumeL / ( (F32)getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ) / (F32)MIN_PER_HOUR ); data.setUFVolumeL = presUFVolumeL; data.tgtUFRateLHr = presUFRateLHr; data.ufVolumeDeliveredL = getUltrafiltrationVolumeDrawn(); Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r52761961d73cdc8f5f9c0c83ef420bcd43a27551 -ra6b123cfdbca851389cfd5cc1b753386e156e960 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 52761961d73cdc8f5f9c0c83ef420bcd43a27551) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision a6b123cfdbca851389cfd5cc1b753386e156e960) @@ -8,7 +8,7 @@ * @file AlarmMgmtSWFaults.h * * @author (last) Raghu Kallala -* @date (last) 29-Apr-2026 +* @date (last) 30-Apr-2026 * * @author (original) Sean Nash * @date (original) 01-Aug-2024 @@ -186,10 +186,11 @@ SW_FAULT_ID_TD_AIR_PUMP_DUTY_CYCLE_OUT_OF_RANGE = 155, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER = 156, SW_FAULT_ID_INVALID_TREATMENT_MODALITY = 157, - SW_FAULT_ID_TD_SYRINGE_INVALID_BOLUS_CMD = 158, - SW_FAULT_ID_TD_SYRINGE_INVALID_CONT_CMD = 159, - SW_FAULT_ID_TD_SYRINGE_INVALID_STATE = 160, - SW_FAULT_ID_TD_SYRINGE_INVALID_VREF = 161, + SW_FAULT_ID_INVALID_DD_DIALYSATE_DATA = 158, + SW_FAULT_ID_TD_SYRINGE_INVALID_BOLUS_CMD = 159, + SW_FAULT_ID_TD_SYRINGE_INVALID_CONT_CMD = 160, + SW_FAULT_ID_TD_SYRINGE_INVALID_STATE = 161, + SW_FAULT_ID_TD_SYRINGE_INVALID_VREF = 162, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r16d6398acc1c6cf604d9dc993b27c94d895132e9 -ra6b123cfdbca851389cfd5cc1b753386e156e960 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 16d6398acc1c6cf604d9dc993b27c94d895132e9) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision a6b123cfdbca851389cfd5cc1b753386e156e960) @@ -8,7 +8,7 @@ * @file Messaging.c * * @author (last) Raghu Kallala -* @date (last) 06-Apr-2026 +* @date (last) 30-Apr-2026 * * @author (original) Sean Nash * @date (original) 01-Aug-2024 @@ -107,6 +107,7 @@ { MSG_ID_FW_VERSIONS_REQUEST, &handleVersionRequestMessage }, { MSG_ID_UI_CHECK_IN, &handleUICheckIn }, { MSG_ID_DD_OP_MODE_DATA, &setDDOpMode }, + { MSG_ID_DD_GEN_DIALYSATE_MODE_DATA, &setDialysateData }, { MSG_ID_DD_PRESSURES_DATA, &setDialysatePressure }, { MSG_ID_UI_TREATMENT_PARAMS_TO_VALIDATE, &validateAndSetTreatmentParameters }, { MSG_ID_UI_INITIATE_TREATMENT_WORKFLOW, &signalUserInitiateTreatment },