Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -rf4545d449a2a2f9353307a55d2bce9e150591c3d -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision f4545d449a2a2f9353307a55d2bce9e150591c3d) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -81,7 +81,7 @@ #define BP_REV_PER_LITER 150.24 ///< rotor revolutions per liter #define BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( BP_REV_PER_LITER / ML_PER_LITER ) ///< conversion factor from mL/min to motor RPM. #define BP_GEAR_RATIO 32.0 ///< blood pump motor to blood pump gear ratio -#define BP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00028 //308 ///< ~28 BP motor RPM = 1% PWM duty cycle +#define BP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00028 ///< ~28 BP motor RPM = 1% PWM duty cycle #define BP_PWM_ZERO_OFFSET 0.1 ///< 10% PWM duty cycle = zero speed #define BP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * BP_GEAR_RATIO * BP_MOTOR_RPM_TO_PWM_DC_FACTOR + BP_PWM_ZERO_OFFSET ) ///< conversion factor from mL/min to estimated PWM duty cycle %. @@ -1317,10 +1317,11 @@ * @details * Inputs : none * Outputs : targetBloodFlowRate - * @param value : override target blood flow rate (in mL/min) + * @param value : override target blood flow rate (in mL/min) + * @param ctrlMode : override pump control mode to this mode (0 = closed loop, 1 = open loop) * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetTargetBloodFlowRateOverride( S32 value ) +BOOL testSetTargetBloodFlowRateOverride( S32 value, U32 ctrlMode ) { BOOL result = FALSE; @@ -1335,11 +1336,14 @@ else { dir = MOTOR_DIR_FORWARD; + } + if ( ctrlMode < NUM_OF_PUMP_CONTROL_MODES ) + { + targetBloodFlowRate.ovInitData = targetBloodFlowRate.data; // backup current target flow rate + targetBloodFlowRate.ovData = value; + targetBloodFlowRate.override = OVERRIDE_KEY; + result = setBloodPumpTargetFlowRate( ABS(value), dir, (PUMP_CONTROL_MODE_T)ctrlMode ); } - targetBloodFlowRate.ovInitData = targetBloodFlowRate.data; // backup current target flow rate - targetBloodFlowRate.ovData = value; - targetBloodFlowRate.override = OVERRIDE_KEY; - result = setBloodPumpTargetFlowRate( ABS(value), dir, bloodPumpControlMode ); } return result; Index: firmware/App/Controllers/BloodFlow.h =================================================================== diff -u -r3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9 -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9) +++ firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -58,7 +58,7 @@ void getBloodFlowCalibration( F32 *gain, F32 *offset ); BOOL testSetBloodFlowDataPublishIntervalOverride( U32 value ); BOOL testResetBloodFlowDataPublishIntervalOverride( void ); -BOOL testSetTargetBloodFlowRateOverride( S32 value ); +BOOL testSetTargetBloodFlowRateOverride( S32 value, U32 bloodPumpControlMode ); BOOL testResetTargetBloodFlowRateOverride( void ); BOOL testSetMeasuredBloodFlowRateOverride( F32 value ); BOOL testResetMeasuredBloodFlowRateOverride( void ); Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -rf4545d449a2a2f9353307a55d2bce9e150591c3d -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision f4545d449a2a2f9353307a55d2bce9e150591c3d) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -78,7 +78,7 @@ #define DIP_REV_PER_LITER 150.24 ///< rotor revolutions per liter #define DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( DIP_REV_PER_LITER / ML_PER_LITER ) ///< #define DIP_GEAR_RATIO 32.0 ///< dialIn pump motor to dialIn pump gear ratio -#define DIP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00028 //308 ///< ~28 BP motor RPM = 1% PWM duty cycle +#define DIP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00028 ///< ~28 BP motor RPM = 1% PWM duty cycle #define DIP_PWM_ZERO_OFFSET 0.1 ///< 10% PWM duty cycle = zero speed #define DIP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DIP_GEAR_RATIO * DIP_MOTOR_RPM_TO_PWM_DC_FACTOR + DIP_PWM_ZERO_OFFSET ) ///< @@ -1284,14 +1284,15 @@ /*********************************************************************//** * @brief * The testSetTargetDialInFlowRateOverride function overrides the target \n - * dialysate inlet flow rate. \n + * dialysate inlet flow rate.n * @details * Inputs : none * Outputs : targetDialInFlowRate * @param value : override target dialysate inlet flow rate (in mL/min) + * @param ctrlMode : override pump control mode to this mode (0 = closed loop, 1 = open loop) * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetTargetDialInFlowRateOverride( S32 value ) +BOOL testSetTargetDialInFlowRateOverride( S32 value, U32 ctrlMode ) { BOOL result = FALSE; @@ -1307,10 +1308,13 @@ { dir = MOTOR_DIR_FORWARD; } - targetDialInFlowRate.ovInitData = targetDialInFlowRate.data; // backup current target flow rate - targetDialInFlowRate.ovData = value; - targetDialInFlowRate.override = OVERRIDE_KEY; - result = setDialInPumpTargetFlowRate( ABS(value), dir, dialInPumpControlMode ); + if ( ctrlMode < NUM_OF_PUMP_CONTROL_MODES ) + { + targetDialInFlowRate.ovInitData = targetDialInFlowRate.data; // backup current target flow rate + targetDialInFlowRate.ovData = value; + targetDialInFlowRate.override = OVERRIDE_KEY; + result = setDialInPumpTargetFlowRate( ABS(value), dir, (PUMP_CONTROL_MODE_T)ctrlMode ); + } } return result; Index: firmware/App/Controllers/DialInFlow.h =================================================================== diff -u -r3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9 -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision 3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9) +++ firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -58,7 +58,7 @@ void getDialInFlowCalibration( F32 *gain, F32 *offset ); BOOL testSetDialInFlowDataPublishIntervalOverride( U32 value ); BOOL testResetDialInFlowDataPublishIntervalOverride( void ); -BOOL testSetTargetDialInFlowRateOverride( S32 value ); +BOOL testSetTargetDialInFlowRateOverride( S32 value, U32 ctrlMode ); BOOL testResetTargetDialInFlowRateOverride( void ); BOOL testSetMeasuredDialInFlowRateOverride( F32 value ); BOOL testResetMeasuredDialInFlowRateOverride( void ); Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -rc0273c73da6b6dee4ad6f1d54cb6c6f27a262b5b -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision c0273c73da6b6dee4ad6f1d54cb6c6f27a262b5b) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -83,7 +83,7 @@ #define DOP_REV_PER_LITER 150.24 ///< Rotor revolutions per liter. #define DOP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( DOP_REV_PER_LITER / ML_PER_LITER ) ///< Conversion factor from mL/min to pump motor RPM. #define DOP_GEAR_RATIO 32.0 ///< Pump motor to pump gear ratio. -#define DOP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00035 ///< ~28 DPo motor RPM = 1% PWM duty cycle. +#define DOP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00028 ///< ~28 DPo motor RPM = 1% PWM duty cycle. #define DOP_PWM_ZERO_OFFSET 0.1 ///< 10% PWM duty cycle = zero speed. #define DOP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * DOP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DOP_GEAR_RATIO * DOP_MOTOR_RPM_TO_PWM_DC_FACTOR + DOP_PWM_ZERO_OFFSET ) ///< Macro converts a flow rate to an estimated PWM duty cycle %. @@ -1204,6 +1204,63 @@ /*********************************************************************//** * @brief + * The testSetTargetDialOutFlowRateOverride function overrides the target \n + * dialysate outlet flow rate. + * @details + * Inputs : none + * Outputs : pump started w/ set target rate and control mode + * @param value : override target dialysate outlet flow rate (in mL/min) + * @param ctrlMode : override pump control mode to this mode (0 = closed loop, 1 = open loop) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetTargetDialOutFlowRateOverride( S32 value, U32 ctrlMode ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + MOTOR_DIR_T dir; + + if ( value < 0 ) + { + dir = MOTOR_DIR_REVERSE; + } + else + { + dir = MOTOR_DIR_FORWARD; + } + if ( ctrlMode < NUM_OF_PUMP_CONTROL_MODES ) + { + result = setDialOutPumpTargetRate( ABS(value), dir, (PUMP_CONTROL_MODE_T)ctrlMode ); + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetTargetDialOutFlowRateOverride function resets the override of the \n + * target dialysate outlet flow rate. + * @details + * Inputs : none + * Outputs : pump stopped + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetTargetDialOutFlowRateOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = setDialOutPumpTargetRate( 0, dialOutPumpDirection, dialOutPumpControlMode ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The testSetDialOutUFRefVolumeOverride function overrides the target \n * dialout vol rate. * @details Index: firmware/App/Controllers/DialOutFlow.h =================================================================== diff -u -rde5a0d43bdef611d963d11855bc958a8d8899a09 -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Controllers/DialOutFlow.h (.../DialOutFlow.h) (revision de5a0d43bdef611d963d11855bc958a8d8899a09) +++ firmware/App/Controllers/DialOutFlow.h (.../DialOutFlow.h) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -83,6 +83,8 @@ BOOL testSetDialOutPumpAndLoadCellDataPublishIntervalOverride( U32 value ); BOOL testResetDialOutPumpAndLoadCellDataPublishIntervalOverride( void ); +BOOL testSetTargetDialOutFlowRateOverride( S32 value, U32 ctrlMode ); +BOOL testResetTargetDialOutFlowRateOverride( void ); BOOL testSetDialOutUFRefVolumeOverride( F32 value ); BOOL testResetDialOutUFRefVolumeOverride( void ); BOOL testSetDialOutUFTotVolumeOverride( F32 value ); Index: firmware/App/HDCommon.h =================================================================== diff -u -r3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9 -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -31,7 +31,7 @@ #ifndef _RELEASE_ #define UF_TEST_ENABLED 1 // ultrafiltration test build (hard codes treatment params, re-purposes off/stop buttons) -#define UF_TEST_WITH_DG 1 // ultrafiltration test build (sets up DG in standby mode) +//#define UF_TEST_WITH_DG 1 // ultrafiltration test build (sets up DG in standby mode) #ifndef _VECTORCAST_ // #define RM46_EVAL_BOARD_TARGET 1 // limited build runs on RM46 eval board // #define BREADBOARD_TARGET 1 // old breadboard system build - no longer used? @@ -51,7 +51,7 @@ // #define RAW_FLOW_SENSOR_DATA 1 // test build will not filter flow sensor data // #define READ_FPGA_ASYNC_DATA 1 // test build reads non-priority register page every other time // #define FLOW_DEBUG 1 // test build sends flow, signal strength, and occlusion readings to debug UART -// #define EMC_TEST_BUILD 1 // EMC test build - HD/DG run separately but connected, HD pumps toggle on/off w/ stop button + #define EMC_TEST_BUILD 1 // EMC test build - HD/DG run separately but connected, HD pumps toggle on/off w/ stop button #define ALARMS_DEBUG 1 // triggered alarms sent to debug UART #include Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rf4545d449a2a2f9353307a55d2bce9e150591c3d -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision f4545d449a2a2f9353307a55d2bce9e150591c3d) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -34,8 +34,8 @@ // ********** private definitions ********** #define MAX_UF_RATE_ML_PER_MIN 45.83 ///< Maximum ultrafiltration rate in mL/min (2750 mL/hr). -#define MAX_UF_ACCURACY_ERROR_ML 25.0 ///< Maximum ultrafiltration accuracy error in mL over the entire treatment. -#define UF_ACCURACY_CHECK_INTERVAL ((1 * SEC_PER_MIN * MS_PER_SECOND) / TASK_GENERAL_INTERVAL) ///< Ultrafiltration rate accuracy check interval count +#define MAX_UF_ACCURACY_ERROR_ML 250.0 ///< Maximum ultrafiltration accuracy error in mL over the entire treatment. +#define UF_ACCURACY_CHECK_INTERVAL ((1 * SEC_PER_MIN * MS_PER_SECOND) / TASK_GENERAL_INTERVAL) ///< Ultrafiltration rate accuracy check interval count // ********** private data ********** Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -rde5a0d43bdef611d963d11855bc958a8d8899a09 -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision de5a0d43bdef611d963d11855bc958a8d8899a09) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -17,10 +17,12 @@ #include "AlarmLamp.h" #include "BloodFlow.h" +#include "Buttons.h" #include "DialInFlow.h" #include "DialOutFlow.h" -#include "Buttons.h" +#include "ModeTreatmentParams.h" #include "OperationModes.h" +#include "Utilities.h" #ifdef RM46_EVAL_BOARD_TARGET #include "Timers.h" static U32 start; @@ -31,10 +33,31 @@ * @{ */ +// ********** private definitions ********** + // ********** private data ********** +static HD_TREATMENT_PARAMS_MODE_STATE_T treatParamsState; ///< Current state of treatment parameters mode state machine. + +// current treatment parameter values +static CRITICAL_DATA_T treatmentParameters[ NUM_OF_TREATMENT_PARAMS ]; ///< Treatment parameters. + +// original treatment parameter values (for those that can be changed during treatment) +static U32 origBloodFlowRate_mL_min; ///< Originally set (before treatment) blood flow rate (in mL/min). +static U32 origDialysateFlowRate_mL_min; ///< Originally set (before treatment) dialysate flow rate (in mL/min). +static U32 origTreatmentDuration_min; ///< Originally set (before treatment) treatment duration (in min). +static U32 origArterialPressureLowLimit_mmHg; ///< Originally set (before treatment) arterial pressure lower alarm limit (in mmHg). +static U32 origArterialPressureHighLimit_mmHg; ///< Originally set (before treatment) arterial pressure upper alarm limit (in mmHg). +static U32 origVenousPressureLowLimit_mmHg; ///< Originally set (before treatment) venous pressure lower alarm limit (in mmHg). +static U32 origVenousPressureHighLimit_mmHg; ///< Originally set (before treatment) venous pressure upper alarm limit (in mmHg). +static F32 origUFVolume_L; ///< Originally set (before treatment) ultrafiltration volume (in liters). + // ********** private function prototypes ********** +static void resetAllTreatmentParameters( void ); +static HD_TREATMENT_PARAMS_MODE_STATE_T handleWaitForUI2SendState( void ); +static HD_TREATMENT_PARAMS_MODE_STATE_T handleWaitForUI2ConfirmState( void ); + /************************************************************************* * @brief initOpParamsMode * The initOpParamsMode function initializes the Operating Parameters Mode module. @@ -46,6 +69,7 @@ *************************************************************************/ void initTreatParamsMode( void ) { + treatParamsState = HD_TREATMENT_PARAMS_MODE_STATE_START; } /************************************************************************* @@ -60,18 +84,39 @@ *************************************************************************/ void transitionToTreatParamsMode( void ) { + // reset all treatment parameters when transitioning to this mode + resetAllTreatmentParameters(); + // temporary test code. TODO - remove later #ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 300, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialInPumpTargetFlowRate( 300, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialOutPumpTargetRate( 325, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); -#else #endif #ifdef RM46_EVAL_BOARD_TARGET start = getMSTimerCount(); #endif } +static void resetAllTreatmentParameters( void ) +{ + U32 i; + + for ( i = 0; i < NUM_OF_TREATMENT_PARAMS; i++ ) + { + resetCriticalData( &treatmentParameters[ i ] ); + } + + origBloodFlowRate_mL_min = 0; + origDialysateFlowRate_mL_min = 0; + origTreatmentDuration_min = 0; + origArterialPressureLowLimit_mmHg = 0; + origArterialPressureHighLimit_mmHg = 0; + origVenousPressureLowLimit_mmHg = 0; + origVenousPressureHighLimit_mmHg = 0; + origUFVolume_L = 0.0; +} + /************************************************************************* * @brief execOpParamsMode * The execFaultMode function executes the Operating Parameters Mode state machine. @@ -85,20 +130,162 @@ { BOOL stop = isStopButtonPressed(); -#ifndef UF_TEST_ENABLED - if ( TRUE == stop ) +#ifdef UF_TEST_ENABLED + requestNewOperationMode( MODE_PRET ); #endif - { - requestNewOperationMode( MODE_PRET ); - } #ifdef RM46_EVAL_BOARD_TARGET if ( TRUE == didTimeout( start, 5000U ) ) { requestNewOperationMode( MODE_PRET ); } #endif - return 0; // TODO - return current state +#ifndef UF_TEST_ENABLED + // execute mode state machine + switch ( treatParamsState ) + { + case HD_TREATMENT_PARAMS_MODE_STATE_START: + treatParamsState = HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND; + break; + + case HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND: + break; + + case HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_CONFIRM: + break; + + default: + // TODO - s/w fault + break; + + } +#endif + + return (U32)treatParamsState; } +static HD_TREATMENT_PARAMS_MODE_STATE_T handleWaitForUI2SendState( void ) +{ + HD_TREATMENT_PARAMS_MODE_STATE_T result = HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND; + + return result; +} + +static HD_TREATMENT_PARAMS_MODE_STATE_T handleWaitForUI2ConfirmState( void ) +{ + HD_TREATMENT_PARAMS_MODE_STATE_T result = HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_CONFIRM; + + return result; +} + +void setTreatmentParameterU32( TREATMENT_PARAM_T param, U32 value ) +{ + // validate parameter + if ( param <= TREATMENT_PARAM_LAST_U32 ) + { + CRITICAL_DATAS_T data = treatmentParameters[ param ].data; + + data.uInt = value; + setCriticalData( &treatmentParameters[ param ], data ); + } + else + { + // TODO - s/w fault + } +} + +void setTreatmentParameterF32( TREATMENT_PARAM_T param, F32 value ) +{ + // validate parameter + if ( param >= TREATMENT_PARAM_FIRST_F32 && param < NUM_OF_TREATMENT_PARAMS ) + { + CRITICAL_DATAS_T data = treatmentParameters[ param ].data; + + data.flt = value; + setCriticalData( &treatmentParameters[ param ], data ); + } + else + { + // TODO - s/w fault + } +} + +U32 getTreatmentParameterU32( TREATMENT_PARAM_T param ) +{ + U32 result = 0; + + // validate parameter + if ( param <= TREATMENT_PARAM_LAST_U32 ) + { + CRITICAL_DATAS_T data = getCriticalData( &treatmentParameters[ param ] ); + + result = data.uInt; + } + else + { + // TODO - s/w fault + } + + return result; +} + +F32 getTreatmentParameterF32( TREATMENT_PARAM_T param ) +{ + F32 result = 0.0; + + // validate parameter + if ( param >= TREATMENT_PARAM_FIRST_F32 && param < NUM_OF_TREATMENT_PARAMS ) + { + CRITICAL_DATAS_T data = getCriticalData( &treatmentParameters[ param ] ); + + result = data.flt; + } + else + { + // TODO - s/w fault + } + + return result; +} + +U32 getOrigBloodFlowRate_mL_min( void ) +{ + return origBloodFlowRate_mL_min; +} + +U32 getOrigDialysateFlowRate_mL_min( void ) +{ + return origDialysateFlowRate_mL_min; +} + +U32 getOrigTreatmentDuration_min( void ) +{ + return origTreatmentDuration_min; +} + +U32 getOrigArterialPressureLowLimit_mmHg( void ) +{ + return origArterialPressureLowLimit_mmHg; +} + +U32 getOrigArterialPressureHighLimit_mmHg( void ) +{ + return origArterialPressureHighLimit_mmHg; +} + +U32 getOrigVenousPressureLowLimit_mmHg( void ) +{ + return origVenousPressureLowLimit_mmHg; +} + +U32 getOrigVenousPressureHighLimit_mmHg( void ) +{ + return origVenousPressureHighLimit_mmHg; +} + +F32 getOrigUFVolume_L( void ) +{ + return origUFVolume_L; +} + /**@}*/ Index: firmware/App/Modes/ModeTreatmentParams.h =================================================================== diff -u -rde5a0d43bdef611d963d11855bc958a8d8899a09 -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Modes/ModeTreatmentParams.h (.../ModeTreatmentParams.h) (revision de5a0d43bdef611d963d11855bc958a8d8899a09) +++ firmware/App/Modes/ModeTreatmentParams.h (.../ModeTreatmentParams.h) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -29,12 +29,55 @@ * @{ */ +// ********** private definitions ********** + +/// Enumeration of treatment parameters. +typedef enum Treatment_Params +{ + TREATMENT_PARAM_BLOOD_FLOW = 0, ///< Blood flow rate (in mL/min) + TREATMENT_PARAM_FIRST_U32 = TREATMENT_PARAM_BLOOD_FLOW, ///< First integer treatment parameter + TREATMENT_PARAM_DIALYSATE_FLOW, ///< Dialysate flow rate (in mL/min) + TREATMENT_PARAM_TREATMENT_DURATION, ///< Treatment duration (in minutes) + TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME, ///< Heparin pre-stop time (in minutes) + TREATMENT_PARAM_SALINE_BOLUS_VOLUME, ///< Saline bolus volume (in mL) + TREATMENT_PARAM_ACID_CONCENTRATE, ///< Acid concentrate type (enum) + TREATMENT_PARAM_BICARB_CONCENTRATE, ///< Bicarbonate concentrate type (enum) + TREATMENT_PARAM_DIALYZER_TYPE, ///< Dialysate type (enum) + TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT, ///< Arterial pressure low alarm limit (in mmHg) + TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT, ///< Arterial pressure high alarm limit (in mmHg) + TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT, ///< Venous pressure low alarm limit (in mmHg) + TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT, ///< Venous pressure high alarm limit (in mmHg) + TREATMENT_PARAM_BP_MEAS_INTERVAL, ///< Blood pressure measurement interval (in minutes) + TREATMENT_PARAM_RINSEBACK_FLOW_RATE, ///< Rinseback flow rate (in mL/min) + TREATMENT_PARAM_LAST_U32 = TREATMENT_PARAM_RINSEBACK_FLOW_RATE, ///< Last integer treatment parameter + TREATMENT_PARAM_HEPARIN_DISPENSE_RATE, ///< Heparin dispense rate (in mL/hr) + TREATMENT_PARAM_FIRST_F32 = TREATMENT_PARAM_HEPARIN_DISPENSE_RATE, ///< First floating point treatment parameter + TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME, ///< Heparin bolus volume (in mL) + TREATMENT_PARAM_DIALYSATE_TEMPERATURE, ///< Dialysate temperature (in degC) + TREATMENT_PARAM_UF_VOLUME, ///< Ultrafiltration volume (in liters) + NUM_OF_TREATMENT_PARAMS ///< Total number of treatment parameters +} TREATMENT_PARAM_T; + // ********** private function prototypes ********** -void initTreatParamsMode( void ); // initialize this module -void transitionToTreatParamsMode( void ); // prepares for transition to treatment parameters mode -U32 execTreatParamsMode( void ); // execute the treatment parameters mode state machine (call from OperationModes) +void initTreatParamsMode( void ); // initialize this module +void transitionToTreatParamsMode( void ); // prepares for transition to treatment parameters mode +U32 execTreatParamsMode( void ); // execute the treatment parameters mode state machine (call from OperationModes) +void setTreatmentParameterU32( TREATMENT_PARAM_T param, U32 value ); // Set a specified integer treatment parameter value +void setTreatmentParameterF32( TREATMENT_PARAM_T param, F32 value ); // Set a specified floating point treatment parameter value +U32 getTreatmentParameterU32( TREATMENT_PARAM_T param ); // Get a specified integer treatment parameter +F32 getTreatmentParameterF32( TREATMENT_PARAM_T param ); // Get a specified floating point treatment parameter + +U32 getOrigBloodFlowRate_mL_min( void ); // Get originally set (before treatment) blood flow rate (in mL/min). +U32 getOrigDialysateFlowRate_mL_min( void ); // Get originally set (before treatment) dialysate flow rate (in mL/min). +U32 getOrigTreatmentDuration_min( void ); // Get originally set (before treatment) treatment duration (in min). +U32 getOrigArterialPressureLowLimit_mmHg( void ); // Get originally set (before treatment) arterial pressure lower alarm limit (in mmHg). +U32 getOrigArterialPressureHighLimit_mmHg( void ); // Get originally set (before treatment) arterial pressure upper alarm limit (in mmHg). +U32 getOrigVenousPressureLowLimit_mmHg( void ); // Get originally set (before treatment) venous pressure lower alarm limit (in mmHg). +U32 getOrigVenousPressureHighLimit_mmHg( void ); // Get originally set (before treatment) venous pressure upper alarm limit (in mmHg). +F32 getOrigUFVolume_L( void ); // Get originally set (before treatment) ultrafiltration volume (in liters). + /**@}*/ #endif Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -rcd2ba56ddf9443fc624c21764e6478766b7fd6ed -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision cd2ba56ddf9443fc624c21764e6478766b7fd6ed) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -124,6 +124,7 @@ { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_DG_SOFTWARE_FAULT { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_CONDUCTIVITY_SENSOR_FAULT + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_CRITICAL_DATA_ERROR }; /// A blank alarm data record for alarms that do not include alarm data when triggered. Index: firmware/App/Services/MessagePayloads.h =================================================================== diff -u -r3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9 -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Services/MessagePayloads.h (.../MessagePayloads.h) (revision 3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9) +++ firmware/App/Services/MessagePayloads.h (.../MessagePayloads.h) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -166,6 +166,13 @@ F32 HtrTrimInternal; } DG_TEMPERATURES_T; +typedef struct +{ + BOOL reset; + S32 setPt; + U32 ctrlMode; +} OVERRIDE_PUMP_SET_PT_PAYLOAD_T; + #pragma pack(pop) #endif Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9 -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -1214,10 +1214,6 @@ { switch ( msgID ) { - case MSG_ID_HD_MESSAGE: - handleTestHDMessageRequest( message ); - break; - case MSG_ID_OFF_BUTTON_STATE_OVERRIDE: handleTestOffButtonStateOverrideRequest( message ); break; @@ -1390,6 +1386,10 @@ handleSetDialysateFlowCalibration( message ); break; + case MSG_ID_DIAL_OUT_FLOW_SET_PT_OVERRIDE: + handleTestDialOutFlowSetPointOverrideRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rf4545d449a2a2f9353307a55d2bce9e150591c3d -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision f4545d449a2a2f9353307a55d2bce9e150591c3d) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -1713,32 +1713,6 @@ } /************************************************************************* - * @brief handleTestHDMessageRequest - * The handleTestHDMessageRequest function handles a request to add an \n - * HD message to the received message queue. - * @details - * Inputs : none - * Outputs : message handled - * @param message : a pointer to the message to handle - * @return none - *************************************************************************/ -void handleTestHDMessageRequest( MESSAGE_T *message ) -{ - MESSAGE_WRAPPER_T hdMessage; - U32 msgLen = (U32)(message->hdr.payloadLen); - U08 *msgBytes = (U08*)(&(hdMessage)); - BOOL result; - - memcpy( msgBytes, message->payload, msgLen ); - - // add HD message to received message queue - result = addToMsgQueue( MSG_Q_IN, &hdMessage ); - - // respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/************************************************************************* * @brief handleTestOffButtonStateOverrideRequest * The handleTestOffButtonStateOverrideRequest function handles a request to \n * override the state of the off button. @@ -1832,7 +1806,27 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestBloodFlowSetPointOverrideRequest, testSetTargetBloodFlowRateOverride, testResetTargetBloodFlowRateOverride ) +void handleTestBloodFlowSetPointOverrideRequest( MESSAGE_T *message ) +{ + OVERRIDE_PUMP_SET_PT_PAYLOAD_T payload; + BOOL result = 0; + + /* verify payload length */ + if ( sizeof(OVERRIDE_PUMP_SET_PT_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(OVERRIDE_PUMP_SET_PT_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetTargetBloodFlowRateOverride( payload.setPt, payload.ctrlMode ); + } + else + { + result = testResetTargetBloodFlowRateOverride(); + } + } + /* respond to request */ + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} /************************************************************************* * @brief handleTestBloodFlowMeasuredOverrideRequest @@ -1916,8 +1910,60 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDialInFlowSetPointOverrideRequest, testSetTargetDialInFlowRateOverride, testResetTargetDialInFlowRateOverride ) +void handleTestDialInFlowSetPointOverrideRequest( MESSAGE_T *message ) +{ + OVERRIDE_PUMP_SET_PT_PAYLOAD_T payload; + BOOL result = 0; + + /* verify payload length */ + if ( sizeof(OVERRIDE_PUMP_SET_PT_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(OVERRIDE_PUMP_SET_PT_PAYLOAD_T) ); + if ( 0 == payload.reset ) + { + result = testSetTargetDialInFlowRateOverride( payload.setPt, payload.ctrlMode ); + } + else + { + result = testResetTargetDialInFlowRateOverride(); + } + } + /* respond to request */ + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} +/************************************************************************* + * @brief + * The handleTestDialOutFlowSetPointOverrideRequest function handles a request to \n + * override the set point for the dialysate outlet flow rate (mL/min). + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestDialOutFlowSetPointOverrideRequest( MESSAGE_T *message ) +{ + OVERRIDE_PUMP_SET_PT_PAYLOAD_T payload; + BOOL result = 0; + + /* verify payload length */ + if ( sizeof(OVERRIDE_PUMP_SET_PT_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(OVERRIDE_PUMP_SET_PT_PAYLOAD_T) ); + if ( 0 == payload.reset ) + { + result = testSetTargetDialOutFlowRateOverride( payload.setPt, payload.ctrlMode ); + } + else + { + result = testResetTargetDialOutFlowRateOverride(); + } + } + /* respond to request */ + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + /************************************************************************* * @brief handleTestDialInFlowMeasuredOverrideRequest * The handleTestDialInFlowMeasuredOverrideRequest function handles a request to \n Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9 -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -179,9 +179,6 @@ void handleTesterLogInRequest( MESSAGE_T *message ); BOOL isTestingActivated( void ); -// MSG_ID_HD_MESSAGE -void handleTestHDMessageRequest( MESSAGE_T *message ); - // MSG_ID_OFF_BUTTON_STATE_OVERRIDE void handleTestOffButtonStateOverrideRequest( MESSAGE_T *message ); @@ -225,7 +222,10 @@ void handleTestBloodPumpRotorMeasuredSpeedOverrideRequest( MESSAGE_T *message ); // MSG_ID_DIAL_IN_FLOW_SET_PT_OVERRIDE -void handleTestDialInFlowSetPointOverrideRequest( MESSAGE_T *message ); +void handleTestDialInFlowSetPointOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DIAL_OUT_FLOW_SET_PT_OVERRIDE +void handleTestDialOutFlowSetPointOverrideRequest( MESSAGE_T *message ); // MSG_ID_DIAL_IN_FLOW_MEAS_OVERRIDE void handleTestDialInFlowMeasuredOverrideRequest( MESSAGE_T *message ); Index: firmware/source/sys_main.c =================================================================== diff -u -r3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9 -rc84daa1f07003427fc5cdde8f5651434478f7313 --- firmware/source/sys_main.c (.../sys_main.c) (revision 3ded5ffcbcade3f1da5d40c52936ab5f97fc6ec9) +++ firmware/source/sys_main.c (.../sys_main.c) (revision c84daa1f07003427fc5cdde8f5651434478f7313) @@ -211,7 +211,7 @@ rtiInit(); rtiEnableNotification( rtiNOTIFICATION_COMPARE0 | rtiNOTIFICATION_COMPARE1 | rtiNOTIFICATION_COMPARE3 ); rtiStartCounter( rtiCOUNTER_BLOCK0 ); - // the timer task (and other comm related interrupts) require FIQ enabled + // the timer task requires FIQ enabled _enable_FIQ(); // the general and priority tasks require IRQ enabled _enable_IRQ();