Index: firmware/App/Controllers/Ejector.c =================================================================== diff -u -r82bb2222f791a434d22921e2fe4f5edd7e74776d -rfdb7ee915da2741dc200fef1b624b7f383f4db85 --- firmware/App/Controllers/Ejector.c (.../Ejector.c) (revision 82bb2222f791a434d22921e2fe4f5edd7e74776d) +++ firmware/App/Controllers/Ejector.c (.../Ejector.c) (revision fdb7ee915da2741dc200fef1b624b7f383f4db85) @@ -31,7 +31,8 @@ // ********** private definitions ********** #define EJECTOR_RETRACT_OP_TIME ( ( MS_PER_SECOND * 5 ) / TASK_GENERAL_INTERVAL ) ///< Ejector retract operation interval. -#define EJECTOR_EXTEND_OP_TIME ( ( MS_PER_SECOND * 5 ) / TASK_GENERAL_INTERVAL ) ///< Ejector extend operation interval. +#define EJECTOR_EXTEND_OP_TIME ( ( MS_PER_SECOND * 4 ) / TASK_GENERAL_INTERVAL ) ///< Ejector extend operation interval. +#define EJECTOR_BACKOFF_OP_TIME ( 50 / TASK_GENERAL_INTERVAL ) ///< Ejector back-off operation interval. #define EJECTOR_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Ejector data publish interval. #define DATA_PUBLISH_COUNTER_START_COUNT 13 ///< Ejector data publish start counter. @@ -68,6 +69,8 @@ static EJECTOR_STATE_T handleEjectorExtendedState ( void ); static EJECTOR_STATE_T handleEjectorRetractingState ( void ); static EJECTOR_STATE_T handleEjectorExtendingState ( void ); +static EJECTOR_STATE_T handleEjectorRetractBackoffState( void ); +static EJECTOR_STATE_T handleEjectorDirChangeStopState( void ); static void resetEjectorFlags( void ); static void publishEjectorData( void ); @@ -218,6 +221,14 @@ currentEjectorState = handleEjectorExtendingState(); break; + case EJECTOR_STATE_RETRACT_BACKOFF: + currentEjectorState = handleEjectorRetractBackoffState(); + break; + + case EJECTOR_STATE_DIR_CHANGE_STOP: + currentEjectorState = handleEjectorDirChangeStopState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TD_EJECTOR_INVALID_STATE, (U32)currentEjectorState ) break; @@ -267,7 +278,7 @@ { ejectorOperationTimerCounter = 0; setEjectorMotorSpeed( EJECTOR_OFF_MOTOR_SPEED_RPM ); - state = EJECTOR_STATE_RETRACTED; + state = EJECTOR_STATE_DIR_CHANGE_STOP; } return state; @@ -333,6 +344,50 @@ { ejectorOperationTimerCounter = 0; setEjectorMotorSpeed( EJECTOR_OFF_MOTOR_SPEED_RPM ); + state = EJECTOR_STATE_DIR_CHANGE_STOP; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleEjectorDirChangeStopState function handles the direction change + * stop state of the ejector control state machine. + * @details \b Inputs: ejectorOperationTimerCounter + * @details \b Outputs: ejectorOperationTimerCounter + * @return next state of the ejector control state machine + *************************************************************************/ +static EJECTOR_STATE_T handleEjectorDirChangeStopState( void ) +{ + EJECTOR_STATE_T state = EJECTOR_STATE_DIR_CHANGE_STOP; + + if ( ++ejectorOperationTimerCounter >= EJECTOR_BACKOFF_OP_TIME ) + { + ejectorOperationTimerCounter = 0; + setEjectorMotorSpeed( EJECTOR_EXTEND_MOTOR_SPEED_RPM ); + state = EJECTOR_STATE_RETRACT_BACKOFF; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleEjectorRetractBackoffState function handles the retract back-off + * state of the ejector control state machine. + * @details \b Inputs: ejectorOperationTimerCounter + * @details \b Outputs: ejectorOperationTimerCounter + * @return next state of the ejector control state machine + *************************************************************************/ +static EJECTOR_STATE_T handleEjectorRetractBackoffState( void ) +{ + EJECTOR_STATE_T state = EJECTOR_STATE_RETRACT_BACKOFF; + + if ( ++ejectorOperationTimerCounter >= EJECTOR_BACKOFF_OP_TIME ) + { + ejectorOperationTimerCounter = 0; + setEjectorMotorSpeed( EJECTOR_OFF_MOTOR_SPEED_RPM ); state = EJECTOR_STATE_RETRACTED; } Index: firmware/App/Controllers/Ejector.h =================================================================== diff -u -r959f16a2530e68b517cbb5c12c430d5aef4c5f9d -rfdb7ee915da2741dc200fef1b624b7f383f4db85 --- firmware/App/Controllers/Ejector.h (.../Ejector.h) (revision 959f16a2530e68b517cbb5c12c430d5aef4c5f9d) +++ firmware/App/Controllers/Ejector.h (.../Ejector.h) (revision fdb7ee915da2741dc200fef1b624b7f383f4db85) @@ -51,6 +51,8 @@ EJECTOR_STATE_EXTENDED, ///< Ejector Extended state EJECTOR_STATE_RETRACTING, ///< Ejector Retracting state EJECTOR_STATE_EXTENDING, ///< Ejector Extending state + EJECTOR_STATE_DIR_CHANGE_STOP, ///< Ejector Direction Change Stop state + EJECTOR_STATE_RETRACT_BACKOFF, ///< Ejector Backing Off Retracted state NUM_OF_EJECTOR_STATES, ///< Number of ejector states } EJECTOR_STATE_T; Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r79c2105d7ec35f3caeb977f6e2cc1b494853d211 -rfdb7ee915da2741dc200fef1b624b7f383f4db85 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 79c2105d7ec35f3caeb977f6e2cc1b494853d211) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision fdb7ee915da2741dc200fef1b624b7f383f4db85) @@ -784,13 +784,15 @@ // Update treatment time stats and broadcast - end treatment if time elapsedTreatmentTimeInSecs = CALC_ELAPSED_TREAT_TIME_IN_SECS(); - // Broadcast treatment time data at interval + // Broadcast treatment time and set point data at interval if ( ++treatmentTimeBroadcastTimerCtr >= getU32OverrideValue( &treatmentTimePublishInterval ) ) { TREATMENT_TIME_DATA_T payload = { 0, 0, 0 }; + TREATMENT_SET_POINTS_T spPayload = { 0, 0, 0.0F }; treatmentTimeBroadcastTimerCtr = 0; + // Build and send treatment time data if treatment not yet completed. if ( isTreatmentCompleted() != TRUE ) { payload.treatmentTimeElapsedinSec = elapsedTreatmentTimeInSecs; @@ -807,6 +809,12 @@ } } sendMessage( MSG_ID_TD_TREATMENT_TIME_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)(&payload), sizeof( TREATMENT_TIME_DATA_T ) ); + + // Build and send treatment set points message. + spPayload.bloodFlow = getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ); + spPayload.dialFlow = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + spPayload.dialTemp = getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ); + sendMessage( MSG_ID_TD_TREATMENT_SET_POINTS, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)(&payload), sizeof( TREATMENT_SET_POINTS_T ) ); } // Broadcast treatment state data at interval Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -rcd19fd5095128315982b9ef810bd45e68eff8deb -rfdb7ee915da2741dc200fef1b624b7f383f4db85 --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision cd19fd5095128315982b9ef810bd45e68eff8deb) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision fdb7ee915da2741dc200fef1b624b7f383f4db85) @@ -57,6 +57,14 @@ U32 txEndState; ///< Treatment end state. } TREATMENT_STATE_DATA_T; +/// Payload record structure for a treatment set points message. +typedef struct +{ + U32 bloodFlow; ///< Set blood flow rate (mL/min). + U32 dialFlow; ///< Set dialysate flow rate (mL/min). + F32 dialTemp; ///< Set dialysate temperature (deg C). +} TREATMENT_SET_POINTS_T; + /// Payload record structure for a saline bolus data broadcast message. typedef struct { Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r50f4b79164155c1bc375dd3ff0e8588f934dc729 -rfdb7ee915da2741dc200fef1b624b7f383f4db85 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 50f4b79164155c1bc375dd3ff0e8588f934dc729) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision fdb7ee915da2741dc200fef1b624b7f383f4db85) @@ -209,8 +209,9 @@ if ( FALSE == bpStart ) { setBloodPumpTargetRPM( 1200, MOTOR_DIR_FORWARD ); - homeEjector(); - retractEjector(); +// homeEjector(); +// retractEjector(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); bpStart = TRUE; } if ( TRUE == bpStop )