Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r1ffe793b3a3557a408b0f5d30539e8f0f499e559 -r7b823539be3fde41aa676263188d1af679b2f411 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 1ffe793b3a3557a408b0f5d30539e8f0f499e559) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 7b823539be3fde41aa676263188d1af679b2f411) @@ -62,7 +62,7 @@ #define BP_HALL_EDGE_COUNTS_PER_REV 48 ///< number of hall sensor edge counts per motor revolution. #define BP_MAX_ROTOR_SPEED_RPM 100.0 ///< maximum rotor speed allowed for blood pump. -#define BP_MAX_FLOW_VS_SPEED_DIFF_ML_MIN 50.0 ///< maximum difference between measured flow and flow implied by measured motor speed. +#define BP_MAX_FLOW_VS_SPEED_DIFF_RPM 200.0 ///< maximum difference between measured speed and speed implied by measured flow. #define BP_MAX_MOTOR_SPEED_WHILE_OFF_RPM 100.0 ///< maximum motor speed (RPM) while motor is commanded off. #define BP_MAX_ROTOR_VS_MOTOR_DIFF_RPM 5.0 ///< maximum difference in speed between motor and rotor (in rotor RPM). #define BP_MAX_MOTOR_SPEED_ERROR_RPM 300.0 ///< maximum difference in speed between measured and commanded RPM. @@ -79,7 +79,7 @@ #define BP_SPEED_ADC_TO_RPM_FACTOR 1.280938 ///< conversion factor from ADC counts to RPM for blood pump motor #define BP_CURRENT_ADC_TO_MA_FACTOR 3.002 ///< conversion factor from ADC counts to mA for blood pump motor -#define BP_REV_PER_LITER 150.24 ///< rotor revolutions per liter +#define BP_REV_PER_LITER 150.0 ///< 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 ///< ~28 BP motor RPM = 1% PWM duty cycle @@ -199,7 +199,8 @@ static void checkBloodPumpDirection( void ); static void checkBloodPumpSpeeds( void ); static void checkBloodPumpFlowAgainstSpeed( void ); -static void checkBloodPumpMCCurrent( void ); +static void checkBloodPumpMCCurrent( void ); +static void checkBloodFlowSensorSignalStrength( void ); static DATA_GET_PROTOTYPE( U32, getPublishBloodFlowDataInterval ); /*********************************************************************//** @@ -443,20 +444,10 @@ checkBloodPumpSpeeds(); checkBloodPumpFlowAgainstSpeed(); // check for home position, zero/low speed - checkBloodPumpRotor(); + checkBloodPumpRotor(); + // check flow sensor signal strength + checkBloodFlowSensorSignalStrength(); } - -#ifndef DISABLE_PUMP_FLOW_CHECKS - // check flow sensor signal strength when appropriate TODO - in pre-treatment, must be far enough along for fluid to be in tubing - if ( MODE_TREA == opMode || - ( MODE_PRET == opMode && FALSE ) ) - { - F32 sigStrength = getMeasuredBloodFlowSignalStrength(); - BOOL outOfRange = ( sigStrength < MIN_FLOW_SIG_STRENGTH ? TRUE : FALSE ); - - checkPersistentAlarm( PERSISTENT_ALARM_BLOOD_FLOW_SIGNAL_STRENGTH, outOfRange, sigStrength ); - } -#endif // publish blood flow data on interval publishBloodFlowData(); @@ -1170,16 +1161,16 @@ if ( ( MODE_TREA == getCurrentOperationMode() ) && ( BLOOD_PUMP_CONTROL_TO_TARGET_STATE == bloodPumpState ) ) { F32 flow = getMeasuredBloodFlowRate(); - F32 speed = getMeasuredBloodPumpSpeed(); - F32 impliedFlow = ( ( speed / BP_GEAR_RATIO ) / BP_REV_PER_LITER ) * (F32)ML_PER_LITER; - F32 delta = fabs( flow - impliedFlow ); + F32 speed = getMeasuredBloodPumpSpeed(); + F32 impliedSpeed = ( flow / (F32)ML_PER_LITER ) * BP_REV_PER_LITER * BP_GEAR_RATIO; + F32 delta = fabs( speed - impliedSpeed ); - if ( delta > BP_MAX_FLOW_VS_SPEED_DIFF_ML_MIN ) + if ( delta > BP_MAX_FLOW_VS_SPEED_DIFF_RPM ) { if ( ++errorBloodFlowVsMotorSpeedPersistTimerCtr >= BP_FLOW_VS_SPEED_PERSIST ) { #ifndef DISABLE_PUMP_FLOW_CHECKS - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK, flow, impliedFlow ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK, flow, speed ); #endif } } @@ -1245,6 +1236,28 @@ bpCurrErrorDurationCtr = 0; } } +} + +/*********************************************************************//** + * @brief + * The checkBloodFlowSensorSignalStrength function checks the measured blood + * flow sensor signal strength is sufficient for accurate flow sensing. + * @details Inputs: + * @details Outputs: + * @return none + *************************************************************************/ +static void checkBloodFlowSensorSignalStrength( void ) +{ +#ifndef DISABLE_PUMP_FLOW_CHECKS + // check flow sensor signal strength when appropriate TODO - in pre-treatment, must be far enough along for fluid to be in tubing + if ( MODE_TREA == opMode || ( MODE_PRET == opMode && FALSE ) ) + { + F32 sigStrength = getMeasuredBloodFlowSignalStrength(); + BOOL outOfRange = ( sigStrength < MIN_FLOW_SIG_STRENGTH ? TRUE : FALSE ); + + checkPersistentAlarm( PERSISTENT_ALARM_BLOOD_FLOW_SIGNAL_STRENGTH, outOfRange, sigStrength ); + } +#endif } /*********************************************************************//** Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r1ffe793b3a3557a408b0f5d30539e8f0f499e559 -r7b823539be3fde41aa676263188d1af679b2f411 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 1ffe793b3a3557a408b0f5d30539e8f0f499e559) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 7b823539be3fde41aa676263188d1af679b2f411) @@ -57,7 +57,7 @@ #define DIP_SPEED_CALC_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< interval (ms/task time) at which the dialysate inlet pump speed is calculated. #define DIP_HALL_EDGE_COUNTS_PER_REV 48 ///< number of hall sensor edge counts per motor revolution. -#define DIP_MAX_FLOW_VS_SPEED_DIFF_ML_MIN 50.0 ///< maximum difference between measured flow and flow implied by measured motor speed. +#define DIP_MAX_FLOW_VS_SPEED_DIFF_RPM 200.0 ///< maximum difference between measured motor speed and speed implied by measured flow. #define DIP_MAX_MOTOR_SPEED_WHILE_OFF_RPM 100.0 ///< maximum motor speed (RPM) while motor is commanded off. #define DIP_MAX_ROTOR_VS_MOTOR_DIFF_RPM 5.0 ///< maximum difference in speed between motor and rotor (in rotor RPM). #define DIP_MAX_MOTOR_SPEED_ERROR_RPM 300.0 ///< maximum difference in speed between measured and commanded RPM. @@ -75,7 +75,7 @@ #define DIP_SPEED_ADC_TO_RPM_FACTOR 1.280938 ///< conversion factor from ADC counts to RPM for dialIn pump motor. #define DIP_CURRENT_ADC_TO_MA_FACTOR 3.002 ///< conversion factor from ADC counts to mA for dialIn pump motor. -#define DIP_REV_PER_LITER 150.24 ///< rotor revolutions per liter. +#define DIP_REV_PER_LITER 150.0 ///< rotor revolutions per liter. /// Macro converts flow rate to motor RPM. #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. @@ -195,6 +195,7 @@ static void checkDialInPumpSpeeds( void ); static void checkDialInPumpFlowAgainstSpeed( void ); static void checkDialInPumpMCCurrent( void ); +static void checkDialInFlowSensorSignalStrength( void ); static DATA_GET_PROTOTYPE( U32, getPublishDialInFlowDataInterval ); /*********************************************************************//** @@ -409,21 +410,11 @@ checkDialInPumpSpeeds(); checkDialInPumpFlowAgainstSpeed(); // check for home position, zero/low speed - checkDialInPumpRotor(); + checkDialInPumpRotor(); + // check flow sensor signal strength + checkDialInFlowSensorSignalStrength(); } -#ifndef DISABLE_PUMP_FLOW_CHECKS - // check flow sensor signal strength when appropriate TODO - in pre-treatment, must be far enough along for fluid to be in tubing - if ( MODE_TREA == opMode || - ( MODE_PRET == opMode && FALSE ) ) - { - F32 sigStrength = getMeasuredDialInFlowSignalStrength(); - BOOL outOfRange = ( sigStrength < MIN_FLOW_SIG_STRENGTH ? TRUE : FALSE ); - - checkPersistentAlarm( PERSISTENT_ALARM_DIALYSATE_FLOW_SIGNAL_STRENGTH, outOfRange, sigStrength ); - } -#endif - // publish dialIn flow data on interval publishDialInFlowData(); } @@ -1127,15 +1118,15 @@ { F32 flow = getMeasuredDialInFlowRate(); F32 speed = getMeasuredDialInPumpSpeed(); - F32 impliedFlow = ( ( speed / DIP_GEAR_RATIO ) / DIP_REV_PER_LITER ) * (F32)ML_PER_LITER; - F32 delta = fabs( flow - impliedFlow ); + F32 impliedSpeed = ( flow / (F32)ML_PER_LITER ) * DIP_REV_PER_LITER * DIP_GEAR_RATIO; + F32 delta = fabs( speed - impliedSpeed ); - if ( delta > DIP_MAX_FLOW_VS_SPEED_DIFF_ML_MIN ) + if ( delta > DIP_MAX_FLOW_VS_SPEED_DIFF_RPM ) { if ( ++errorDialInFlowVsMotorSpeedPersistTimerCtr >= DIP_FLOW_VS_SPEED_PERSIST ) { #ifndef DISABLE_PUMP_FLOW_CHECKS - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK, flow, impliedFlow ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK, flow, speed ); #endif } } @@ -1201,6 +1192,29 @@ dipCurrErrorDurationCtr = 0; } } +} + +/*********************************************************************//** + * @brief + * The checkDialInFlowSensorSignalStrength function checks the measured + * dialysate flow sensor signal strength is sufficient for accurate flow sensing. + * @details Inputs: + * @details Outputs: + * @return none + *************************************************************************/ +static void checkDialInFlowSensorSignalStrength( void ) +{ +#ifndef DISABLE_PUMP_FLOW_CHECKS + // check flow sensor signal strength when appropriate TODO - in pre-treatment, must be far enough along for fluid to be in tubing + if ( MODE_TREA == opMode || ( MODE_PRET == opMode && FALSE ) ) + { + F32 sigStrength = getMeasuredDialInFlowSignalStrength(); + BOOL outOfRange = ( sigStrength < MIN_FLOW_SIG_STRENGTH ? TRUE : FALSE ); + + checkPersistentAlarm( PERSISTENT_ALARM_DIALYSATE_FLOW_SIGNAL_STRENGTH, outOfRange, sigStrength ); + } +#endif + } /*********************************************************************//** Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r1ffe793b3a3557a408b0f5d30539e8f0f499e559 -r7b823539be3fde41aa676263188d1af679b2f411 --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 1ffe793b3a3557a408b0f5d30539e8f0f499e559) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 7b823539be3fde41aa676263188d1af679b2f411) @@ -38,7 +38,8 @@ // ********** private definitions ********** -#define DIAL_OUT_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the dialysate outlet pump data is published on the CAN bus. +/// Interval (ms/task time) at which the dialysate outlet pump data is published on the CAN bus. +#define DIAL_OUT_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) #define MAX_DIAL_OUT_FLOW_RATE 650 ///< Maximum dialysate outlet pump flow rate in mL/min. #define MIN_DIAL_OUT_FLOW_RATE 100 ///< Minimum dialysate outlet pump flow rate in mL/min. @@ -78,12 +79,13 @@ /*** setDialOutFlowRxTotalVolumeAndRxTime ***/ -#define DOP_REV_PER_LITER 150.24 ///< Rotor revolutions per liter. +#define DOP_REV_PER_LITER 150.0 ///< 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.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 %. +/// Macro converts a flow rate to an estimated PWM duty cycle %. +#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 ) /// Enumeration of dialysate outlet pump controller states. typedef enum DialOutPump_States Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r693f9ed31c3f92b6f71b22ce0ae3a6f29ae92394 -r7b823539be3fde41aa676263188d1af679b2f411 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 693f9ed31c3f92b6f71b22ce0ae3a6f29ae92394) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 7b823539be3fde41aa676263188d1af679b2f411) @@ -22,6 +22,7 @@ #include "Buttons.h" #include "OperationModes.h" #include "ModePreTreat.h" +#include "SystemCommMessages.h" #ifdef RM46_EVAL_BOARD_TARGET #include "Timers.h" static U32 start; Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -r693f9ed31c3f92b6f71b22ce0ae3a6f29ae92394 -r7b823539be3fde41aa676263188d1af679b2f411 --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 693f9ed31c3f92b6f71b22ce0ae3a6f29ae92394) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 7b823539be3fde41aa676263188d1af679b2f411) @@ -85,6 +85,7 @@ static BOOL validTreatParamsReceived = FALSE; ///< Flag indicates user has provided treatment parameters. static BOOL treatParamsConfirmed = FALSE; ///< Flag indicates user has confirmed the treatment parameters. +static BOOL treatParamsRejected = FALSE; ///< Flag indicates user has rejected the treatment parameters. static BOOL treatmentCancelled = FALSE; ///< Flag indicates user has cancelled the treatment. // ********** private function prototypes ********** @@ -130,6 +131,7 @@ validTreatParamsReceived = FALSE; treatParamsConfirmed = FALSE; + treatParamsRejected = FALSE; treatmentCancelled = FALSE; // temporary test code. TODO - remove later @@ -201,6 +203,28 @@ /*********************************************************************//** * @brief + * The signalUserRejectionOfTreatmentParameters function sets the user + * rejection flag signaling user has rejected treatment parameters. + * @details + * Inputs : none + * Outputs : treatParamsRejected + * @return TRUE if rejection accepted, FALSE if not + *************************************************************************/ +BOOL signalUserRejectionOfTreatmentParameters( void ) +{ + BOOL result = FALSE; + + if ( ( MODE_TPAR == getCurrentOperationMode() ) && ( HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_CONFIRM == currentTreatmentParamsState ) ) + { + treatParamsRejected = TRUE; + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief * The signalUserCancelTreatment function sets the cancelled treatment * flag signaling the user has cancelled the treatment. * @details @@ -336,12 +360,18 @@ treatParamsConfirmed = FALSE; } + else if ( TRUE == treatParamsRejected ) + { + treatParamsRejected = FALSE; + // user rejected last parameter set, so reset them and wait for new set + resetAllTreatmentParameters(); + result = HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND; + } else if ( TRUE == treatmentCancelled ) { + treatmentCancelled = FALSE; // go back to standby mode requestNewOperationMode( MODE_STAN ); - - treatmentCancelled = FALSE; } return result; Index: firmware/App/Modes/ModeTreatmentParams.h =================================================================== diff -u -rde533ac3aec99c9f4807570a87f1011036fa4e6e -r7b823539be3fde41aa676263188d1af679b2f411 --- firmware/App/Modes/ModeTreatmentParams.h (.../ModeTreatmentParams.h) (revision de533ac3aec99c9f4807570a87f1011036fa4e6e) +++ firmware/App/Modes/ModeTreatmentParams.h (.../ModeTreatmentParams.h) (revision 7b823539be3fde41aa676263188d1af679b2f411) @@ -75,6 +75,7 @@ BOOL validateAndSetTreatmentParameters( TREATMENT_PARAMS_DATA_PAYLOAD_T params ); // user provided treatment params to be set and validated BOOL signalUserConfirmationOfTreatmentParameters( void ); // User has confirmed treatment parameters +BOOL signalUserRejectionOfTreatmentParameters( void ); // User has rejected treatment parameters BOOL signalUserCancelTreatment( void ); // User has cancelled treatment BOOL setTreatmentParameterU32( TREATMENT_PARAM_T param, U32 value ); // Set a specified unsigned integer treatment parameter value Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r5a04a1445b684aedd199e0294311db468635c152 -r7b823539be3fde41aa676263188d1af679b2f411 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 5a04a1445b684aedd199e0294311db468635c152) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 7b823539be3fde41aa676263188d1af679b2f411) @@ -1647,9 +1647,19 @@ { BOOL result = FALSE; - if ( 0 == message->hdr.payloadLen ) + if ( message->hdr.payloadLen == sizeof( BOOL ) ) { - result = signalUserConfirmationOfTreatmentParameters(); + BOOL confirmed; + + memcpy( &confirmed, message->payload, sizeof( BOOL ) ); + if ( TRUE == confirmed ) + { + result = signalUserConfirmationOfTreatmentParameters(); + } + else + { + result = signalUserRejectionOfTreatmentParameters(); + } } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result );