Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -rbf9a2a05483a188c075023bc3f3cbb93e8d2ca5f -r52761961d73cdc8f5f9c0c83ef420bcd43a27551 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision bf9a2a05483a188c075023bc3f3cbb93e8d2ca5f) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 52761961d73cdc8f5f9c0c83ef420bcd43a27551) @@ -707,7 +707,7 @@ *************************************************************************/ BOOL startHeparinContinuous( void ) { - F32 flowRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); + F32 flowRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DELIVERY_RATE ); if ( ( flowRate >= MIN_HEPARIN_CONTINUOUS_RATE ) && ( flowRate <= MAX_HEPARIN_CONTINUOUS_RATE ) && ( FALSE == isSyringePumpHome() ) ) { @@ -1114,7 +1114,7 @@ #endif { F32 bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); - F32 hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); + F32 hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DELIVERY_RATE ); // Syringe detection not required if not using Heparin in treatment if ( ( bolusVol > NEARLY_ZERO ) || ( hepRate > NEARLY_ZERO ) ) @@ -1511,8 +1511,8 @@ BOOL stopPump = FALSE; S32 pos = getSyringePumpPosition(); F32 bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); - F32 contRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); - U32 preStop = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_STOP_TIME ); + F32 contRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DELIVERY_RATE ); + U32 preStop = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_DELIVERY_DURATION ); U32 setTxDur = getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); F32 hepDurHr = ( (F32)( setTxDur - preStop ) / (F32)MIN_PER_HOUR ); F32 txVolumeReq = SYRINGE_PUMP_PRIME_VOLUME_ML + bolusVol + ( hepDurHr * contRate ); @@ -1567,8 +1567,8 @@ BOOL stopPump = FALSE; S32 pos = getSyringePumpPosition(); F32 bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); - F32 contRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); - U32 preStop = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_STOP_TIME ); + F32 contRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DELIVERY_RATE ); + U32 preStop = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_DELIVERY_DURATION ); U32 setTxDur = getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); F32 hepDurHr = ( (F32)( setTxDur - preStop ) / (F32)MIN_PER_HOUR ); F32 txVolume = SYRINGE_PUMP_PRIME_VOLUME_ML + bolusVol + ( hepDurHr * contRate ); @@ -2311,7 +2311,7 @@ break; case SYRINGE_PUMP_OP_CONTINUOUS: - setTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE, opParams.rate ); + setTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DELIVERY_RATE, opParams.rate ); result = startHeparinContinuous(); break; Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -ra98f9ee6b2314f8d98764222a580a896840815f1 -r52761961d73cdc8f5f9c0c83ef420bcd43a27551 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision a98f9ee6b2314f8d98764222a580a896840815f1) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 52761961d73cdc8f5f9c0c83ef420bcd43a27551) @@ -7,8 +7,8 @@ * * @file ModeTreatment.c * -* @author (last) Varshini Nagabooshanam -* @date (last) 29-Jan-2026 +* @author (last) Raghu Kallala +* @date (last) 17-Apr-2026 * * @author (original) Sean Nash * @date (original) 21-Apr-2025 @@ -20,6 +20,7 @@ #include "Bubbles.h" #include "Buttons.h" #include "DDInterface.h" +#include "Messaging.h" #include "ModeService.h" #include "ModeTreatment.h" //#include "NVDataMgmt.h" @@ -177,7 +178,8 @@ *************************************************************************/ U32 transitionToTreatmentMode( void ) { -// PRESSURE_LIMIT_CHANGE_RESPONSE_T respRecord; + PRESSURE_LIMIT_CHANGE_RESPONSE_T respRecord; + F32 bicarbConvFactor; // don't re-initialize treatment if tester is jumping to Tx mode // if ( getPreviousOperationMode() != MODE_PRET ) @@ -208,18 +210,22 @@ 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 ); + bicarbConvFactor = BICARBONATE_CONVERSION_FACTOR; // Direct DD to generate dialysate and bypass while priming blood cmdStartGenerateDialysate( (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFRateLHr, getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ), TRUE, - (ACID_CONCENTRATE_TYPE_T)getTreatmentParameterU32( TREATMENT_PARAM_ACID_CONCENTRATE ), - (BICARB_CONCENTRATE_TYPE_T)getTreatmentParameterU32( TREATMENT_PARAM_BICARB_CONCENTRATE ) ); + getTreatmentParameterF32( TREATMENT_PARAM_ACID_CONCENTRATE_CONV_FACTOR ), + bicarbConvFactor, + getTreatmentParameterU32( TREATMENT_PARAM_SODIUM ), + getTreatmentParameterU32( TREATMENT_PARAM_BICARBONATE ) ); // Read back limits for transmit to UI. -// respRecord.artPresLimitWindowmmHg = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ); -// respRecord.venPresLimitWindowmmHg = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ); -// respRecord.venPresLimitAsymmetricmmHg = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ); + respRecord.artPresLimitWindowmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ); + respRecord.venPresLimitWindowmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ); + respRecord.venPresLimitAsymmetricmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ); + respRecord.tmpPresLimitWindowmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_TMP_PRES_LIMIT_WINDOW ); // Send response -// sendPressureLimitsChangeResponse( &respRecord ); + sendPressureLimitsChangeResponse( &respRecord ); return currentTreatmentState; } @@ -512,6 +518,35 @@ /*********************************************************************//** * @brief + * The sendPressureLimitsChangeResponse function constructs a change + * pressure limits response to the UI and queues the msg for transmit on the + * appropriate CAN channel. + * @details Inputs: none + * @details Outputs: Pressure limits change response msg constructed and queued. + * @param data response data record + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendPressureLimitsChangeResponse( PRESSURE_LIMIT_CHANGE_RESPONSE_T *data ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_TD_PRESSURE_LIMITS_CHANGE_RESPONSE; + msg.hdr.payloadLen = sizeof( PRESSURE_LIMIT_CHANGE_RESPONSE_T ); + + memcpy( payloadPtr, (U08*)data, sizeof( PRESSURE_LIMIT_CHANGE_RESPONSE_T ) ); + + // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_TD_2_UI, ACK_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief * The handleTreatmentStartState function handles the Start state of * the Treatment Mode state machine. Should only pass through this state * once at very beginning of treatment. @@ -1080,7 +1115,7 @@ { SALINE_BOLUS_DATA_PAYLOAD_T data; - data.tgtSalineVolumeMl = getTreatmentParameterU32( TREATMENT_PARAM_SALINE_BOLUS_VOLUME ); + data.tgtSalineVolumeMl = getTreatmentParameterU32( TREATMENT_PARAM_FLUID_BOLUS_VOLUME ); data.cumSalineVolumeMl = 0.0F; // TODO data.bolSalineVolumeMl = 0.0F; // TODO Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r22293ecac97c3f374f90bb20e3c4cc03fbd27f9d -r52761961d73cdc8f5f9c0c83ef420bcd43a27551 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 22293ecac97c3f374f90bb20e3c4cc03fbd27f9d) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 52761961d73cdc8f5f9c0c83ef420bcd43a27551) @@ -7,8 +7,8 @@ * * @file AlarmMgmtSWFaults.h * -* @author (last) Varshini Nagabooshanam -* @date (last) 26-Jan-2026 +* @author (last) Raghu Kallala +* @date (last) 29-Apr-2026 * * @author (original) Sean Nash * @date (original) 01-Aug-2024 @@ -182,11 +182,14 @@ SW_FAULT_ID_VALVES_INVALID_VALVE_FINDING_EDGE = 151, SW_FAULT_ID_TD_VALVES_INVALID_FIND_DEENERGIZED_EDGE = 152, SW_FAULT_ID_BLOOD_PRIME_INVALID_STATE = 153, - SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE = 148, - SW_FAULT_ID_TD_SYRINGE_INVALID_BOLUS_CMD = 149, - SW_FAULT_ID_TD_SYRINGE_INVALID_CONT_CMD = 150, - SW_FAULT_ID_TD_SYRINGE_INVALID_STATE = 151, - SW_FAULT_ID_TD_SYRINGE_INVALID_VREF = 152, + SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE = 154, + 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, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/FpgaTD.c =================================================================== diff -u -r9e43275cfdf3f60042d69d9cbbfc6d74142fa5e5 -r52761961d73cdc8f5f9c0c83ef420bcd43a27551 --- firmware/App/Services/FpgaTD.c (.../FpgaTD.c) (revision 9e43275cfdf3f60042d69d9cbbfc6d74142fa5e5) +++ firmware/App/Services/FpgaTD.c (.../FpgaTD.c) (revision 52761961d73cdc8f5f9c0c83ef420bcd43a27551) @@ -7,8 +7,8 @@ * * @file FpgaTD.c * -* @author (last) Dara Navaei -* @date (last) 19-Dec-2025 +* @author (last) Jashwant Gantyada +* @date (last) 13-Mar-2026 * * @author (original) Sean Nash * @date (original) 01-Aug-2024 @@ -152,7 +152,7 @@ U08 h6RotorStatus; ///< Reg 346. H6 rotor status. U08 reserved5; ///< Reg 347. Reserved register. U16 h12Speed; ///< Reg 348. H12 speed (air pump in RPM). - U16 rotorRevsCounter; ///< Reg 350. Rotor revs counter + U16 h4RotorRevsCounter; ///< Reg 350. H4 rotor revs counter U16 baroManufactInfo; ///< Reg 352. Baro sensor manufacturing information. U16 baroPresSensitivity; ///< Reg 354. Baro sensor prom coefficient 1. U16 baroPresOffset; ///< Reg 356. Baro sensor prom coefficient 2. @@ -604,6 +604,19 @@ /*********************************************************************//** * @brief + * The getH4RotorRevsCounter function gets the latest blood pump + * rotor revolutions count. + * @details \b Inputs: fpgaSensorReadings.h4RotorRevsCounter + * @details \b Outputs: none + * @return Latest blood pump revolutions count reading. + *************************************************************************/ +U16 getH4RotorRevsCounter( void ) +{ + return fpgaSensorReadings.h4RotorRevsCounter; +} + +/*********************************************************************//** + * @brief * The setH5ControlFlags function sets the control flags for the H5 ejector * stepper motor. * @note Bit 0 - MS1 (bit 1 of microstepping configuration setting) @@ -911,6 +924,18 @@ /*********************************************************************//** * @brief + * The getH12AirPumpMotorRPM function reads the air pump RPM from FPGA. + * @details \b Inputs: fpgaSensorReadings + * @details \b Outputs: none + * @return air pump RPM value + *************************************************************************/ +U16 getH12AirPumpMotorRPM( void ) +{ + return fpgaSensorReadings.h12Speed; +} + +/*********************************************************************//** + * @brief * The setH12AirPumpMotorPowerLevel function sets the air pump motor power level * to 0 to turn pump off or 1..255 for varying power levels. * @details \b Inputs: fpgaActuatorSetPoints.h12Control Index: firmware/App/Services/FpgaTD.h =================================================================== diff -u -r9e43275cfdf3f60042d69d9cbbfc6d74142fa5e5 -r52761961d73cdc8f5f9c0c83ef420bcd43a27551 --- firmware/App/Services/FpgaTD.h (.../FpgaTD.h) (revision 9e43275cfdf3f60042d69d9cbbfc6d74142fa5e5) +++ firmware/App/Services/FpgaTD.h (.../FpgaTD.h) (revision 52761961d73cdc8f5f9c0c83ef420bcd43a27551) @@ -7,8 +7,8 @@ * * @file FpgaTD.h * -* @author (last) Dara Navaei -* @date (last) 19-Dec-2025 +* @author (last) Jashwant Gantyada +* @date (last) 12-Mar-2026 * * @author (original) Sean Nash * @date (original) 01-Aug-2024 @@ -91,6 +91,7 @@ S16 getH4RotorCount( void ); S16 getH4TorqueCount( void ); +U16 getH4RotorRevsCounter( void ); U08 getH6Status( void ); U08 getH6RotorStatus( void ); @@ -125,6 +126,7 @@ void setH13ValveState( VALVE_3WAY_STATE_T state ); void setH20ValveState( VALVE_3WAY_STATE_T state ); +U16 getH12AirPumpMotorRPM( void ); void setH12AirPumpMotorPowerLevel( U08 power ); void setH12AirPumpMotorPWMCntTime( U16 tenNS );