Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r8128289dea98878d92bf170fde1c7145f858baa5 -r351ae8d56096982a68f7df1b69a3bf4dd5785094 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 8128289dea98878d92bf170fde1c7145f858baa5) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 351ae8d56096982a68f7df1b69a3bf4dd5785094) @@ -29,14 +29,14 @@ static BOOL treatStartReqReceived = FALSE; ///< Flag indicates user requests treatment begin. -static PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current state of pre-treatment mode state machine. +static HD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current state of pre-treatment mode state machine. // ********** private function prototypes ********** -static PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ); -static PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ); -static PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ); -static PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); +static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ); +static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ); +static HD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ); +static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); /*********************************************************************//** * @brief @@ -47,7 +47,7 @@ *************************************************************************/ void initPreTreatmentMode( void ) { - currentPreTreatmentState = PRE_TREATMENT_START_STATE; + currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; } /*********************************************************************//** @@ -61,7 +61,7 @@ void transitionToPreTreatmentMode( void ) { treatStartReqReceived = FALSE; - currentPreTreatmentState = PRE_TREATMENT_START_STATE; + currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; } /*********************************************************************//** @@ -76,46 +76,42 @@ // execute mode state machine switch ( currentPreTreatmentState ) { - case PRE_TREATMENT_START_STATE: + case HD_PRE_TREATMENT_START_STATE: cmdStartDG(); cmdSetDGDialysateTargetTemps( 39.0, 37.0 ); - currentPreTreatmentState = PRE_TREATMENT_WATER_SAMPLE_STATE; + currentPreTreatmentState = HD_PRE_TREATMENT_WATER_SAMPLE_STATE; break; - case PRE_TREATMENT_WATER_SAMPLE_STATE: - currentPreTreatmentState = PRE_TREATMENT_SELF_TEST_NO_CART_STATE; + case HD_PRE_TREATMENT_WATER_SAMPLE_STATE: + currentPreTreatmentState = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; break; - case PRE_TREATMENT_SELF_TEST_NO_CART_STATE: + case HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE: currentPreTreatmentState = handleSelfTestNoCartState(); break; - case PRE_TREATMENT_CART_INSTALL_STATE: - currentPreTreatmentState = PRE_TREATMENT_SELF_TEST_DRY_STATE; + case HD_PRE_TREATMENT_CART_INSTALL_STATE: + currentPreTreatmentState = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; break; - case PRE_TREATMENT_SELF_TEST_DRY_STATE: + case HD_PRE_TREATMENT_SELF_TEST_DRY_STATE: currentPreTreatmentState = handleSelfTestDryState(); break; - case PRE_TREATMENT_PRIME_STATE: + case HD_PRE_TREATMENT_PRIME_STATE: currentPreTreatmentState = handlePrimeState(); break; - case PRE_TREATMENT_SELF_TEST_WET_STATE: - currentPreTreatmentState = PRE_TREATMENT_RECIRC_STATE; + case HD_PRE_TREATMENT_RECIRCULATE_STATE: + currentPreTreatmentState = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; break; - case PRE_TREATMENT_RECIRC_STATE: - currentPreTreatmentState = PRE_TREATMENT_PATIENT_CONNECTION_STATE; - break; - - case PRE_TREATMENT_PATIENT_CONNECTION_STATE: + case HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE: currentPreTreatmentState = handlePatientConnectionState(); break; default: - currentPreTreatmentState = PRE_TREATMENT_START_STATE; + currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); break; } @@ -152,7 +148,7 @@ * @details Outputs: home blood pump and dialysate pumps * @return current state (sub-mode) *************************************************************************/ -static PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ) { // TODO: Prompt user to close door @@ -162,27 +158,20 @@ // TODO: Prompt user to open door - return PRE_TREATMENT_CART_INSTALL_STATE; + return HD_PRE_TREATMENT_CART_INSTALL_STATE; } /*********************************************************************//** * @brief - * The handleSelfTestDryState function handles dry self-test. + * The handleSelfTestDryState function handles dry self-tests after cartridge + * is loaded. * @details Inputs: none - * @details Outputs: transition to prime sub-mode when blood pump finished homing + * @details Outputs: transition to prime state on user request * @return current state (sub-mode) *************************************************************************/ -static PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ) { - PRE_TREATMENT_MODE_STATE_T state = PRE_TREATMENT_CART_INSTALL_STATE; - - if ( FALSE == isBloodPumpRunning() ) - { - transitionToPrime(); - state = PRE_TREATMENT_PRIME_STATE; - } - - return state; + return HD_PRE_TREATMENT_PRIME_STATE; } /*********************************************************************//** @@ -192,15 +181,15 @@ * @details Outputs: transition to self test wet state after priming passed * @return current state (sub-mode) *************************************************************************/ -static PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ) { - PRE_TREATMENT_MODE_STATE_T state = PRE_TREATMENT_PRIME_STATE; + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_PRIME_STATE; execPrime(); if ( TRUE == isPrimingPassed() ) { - state = PRE_TREATMENT_SELF_TEST_WET_STATE; + state = HD_PRE_TREATMENT_RECIRCULATE_STATE; } return state; @@ -214,14 +203,14 @@ * @details Outputs: requested mode transition to treatment mode * @return current state (sub-mode) *************************************************************************/ -static PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) { if ( TRUE == treatStartReqReceived ) { requestNewOperationMode( MODE_TREA ); } - return PRE_TREATMENT_PATIENT_CONNECTION_STATE; + return HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; } /**@}*/ Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rd2f3df2002ecc87795b8bdeefda63c4805d78146 -r351ae8d56096982a68f7df1b69a3bf4dd5785094 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision d2f3df2002ecc87795b8bdeefda63c4805d78146) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 351ae8d56096982a68f7df1b69a3bf4dd5785094) @@ -215,26 +215,10 @@ // TODO - implement break; - case TREATMENT_RINSEBACK_PAUSE_STATE: - // TODO - implement - break; - - case TREATMENT_RECIRC_SETUP_STATE: - // TODO - implement - break; - case TREATMENT_RECIRC_STATE: // TODO - implement break; - case TREATMENT_RECIRC_PAUSE_STATE: - // TODO - implement - break; - - case TREATMENT_RECIRC_STOP_STATE: - // TODO - implement - break; - case TREATMENT_DIALYSIS_END_STATE: // TODO - implement break; Index: firmware/App/Modes/Prime.c =================================================================== diff -u -rc7ffa13e306681a647ad25513a89250c6918e6a4 -r351ae8d56096982a68f7df1b69a3bf4dd5785094 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision c7ffa13e306681a647ad25513a89250c6918e6a4) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 351ae8d56096982a68f7df1b69a3bf4dd5785094) @@ -52,7 +52,7 @@ // ********** private data ********** -static PRE_TREATMENT_PRIME_STATE_T currentPrimeState; ///< Current state of the prime sub-mode state machine. +static HD_PRE_TREATMENT_PRIME_STATE_T currentPrimeState; ///< Current state of the prime sub-mode state machine. static PRIME_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current reservoir management state. static BOOL isPrimeCompleted; ///< Status if prime sequence has been completed. @@ -66,11 +66,11 @@ static void execPreTreatmentReservoirMgmt( void ); static void purgeAirValvesBloodPumpControl( void ); -static PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineSetupState( void ); -static PRE_TREATMENT_PRIME_STATE_T handlePrimePurgeAirState( void ); -static PRE_TREATMENT_PRIME_STATE_T handlePrimeCircBloodCircuitState( void ); -static PRE_TREATMENT_PRIME_STATE_T handlePrimeReservoirOneFillCompleteState( void ); -static PRE_TREATMENT_PRIME_STATE_T handlePrimeDialysateDialyzerState( void ); +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineSetupState( void ); +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimePurgeAirState( void ); +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeCircBloodCircuitState( void ); +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeReservoirOneFillCompleteState( void ); +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeDialysateDialyzerState( void ); /*********************************************************************//** * @brief @@ -95,7 +95,7 @@ *************************************************************************/ void transitionToPrime( void ) { - currentPrimeState = PRIME_START_STATE; + currentPrimeState = HD_PRIME_START_STATE; currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_START_STATE; isPrimeCompleted = FALSE; // TODO: set to false after integration with UI @@ -118,33 +118,33 @@ // execute prime sub-mode state machine switch ( currentPrimeState ) { - case PRIME_START_STATE: + case HD_PRIME_START_STATE: cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); - currentPrimeState = PRIME_SALINE_SETUP_STATE; + currentPrimeState = HD_PRIME_SALINE_SETUP_STATE; break; - case PRIME_SALINE_SETUP_STATE: + case HD_PRIME_SALINE_SETUP_STATE: currentPrimeState = handlePrimeSalineSetupState(); break; - case PRIME_SALINE_PURGE_AIR_STATE: + case HD_PRIME_SALINE_PURGE_AIR_STATE: currentPrimeState = handlePrimePurgeAirState(); break; - case PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE: + case HD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE: currentPrimeState = handlePrimeCircBloodCircuitState(); break; - case PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE: + case HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE: currentPrimeState = handlePrimeReservoirOneFillCompleteState(); break; - case PRIME_DIALYSATE_DIALYZER_STATE: + case HD_PRIME_DIALYSATE_DIALYZER_STATE: currentPrimeState = handlePrimeDialysateDialyzerState(); break; default: - currentPrimeState = PRIME_START_STATE; + currentPrimeState = HD_PRIME_START_STATE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_PRIME_INVALID_STATE, (U32)currentReservoirMgmtState ); break; } @@ -277,15 +277,15 @@ * @details Outputs: control valves to purge air * @return current state *************************************************************************/ -static PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineSetupState( void ) +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineSetupState( void ) { - PRE_TREATMENT_PRIME_STATE_T state = PRIME_SALINE_SETUP_STATE; + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_SALINE_SETUP_STATE; if ( TRUE == primeStartReqReceived ) { purgeAirValvesBloodPumpControl(); purgeAirTimeOutTimerCount = 0; - state = PRIME_SALINE_PURGE_AIR_STATE; + state = HD_PRIME_SALINE_PURGE_AIR_STATE; } return state; @@ -299,9 +299,9 @@ * @details Outputs: runs blood pump, control valves to trap air * @return current state *************************************************************************/ -static PRE_TREATMENT_PRIME_STATE_T handlePrimePurgeAirState( void ) +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimePurgeAirState( void ) { - PRE_TREATMENT_PRIME_STATE_T state = PRIME_SALINE_PURGE_AIR_STATE; + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_SALINE_PURGE_AIR_STATE; if ( ++purgeAirTimeOutTimerCount > PURGE_AIR_TIME_OUT_COUNT ) { @@ -318,7 +318,7 @@ setBloodPumpTargetFlowRate( BLOOD_PUMP_FLOW_RATE_CIRC_BLOOD_CIRCUIT, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); noAirDetectedTimerCounter = 0; - state = PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE; + state = HD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE; } return state; @@ -333,21 +333,21 @@ * @details Outputs: stop blood pump, control valves to purge air * @return current state *************************************************************************/ -static PRE_TREATMENT_PRIME_STATE_T handlePrimeCircBloodCircuitState( void ) +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeCircBloodCircuitState( void ) { - PRE_TREATMENT_PRIME_STATE_T state = PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE; + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE; if ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) { purgeAirValvesBloodPumpControl(); purgeAirTimeOutTimerCount = 0; - state = PRIME_SALINE_PURGE_AIR_STATE; + state = HD_PRIME_SALINE_PURGE_AIR_STATE; } if ( ++noAirDetectedTimerCounter > NO_AIR_DETECTED_COUNT ) { signalBloodPumpHardStop(); - state = PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; + state = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; } return state; @@ -361,13 +361,13 @@ * @details Outputs: none * @return current state *************************************************************************/ -static PRE_TREATMENT_PRIME_STATE_T handlePrimeReservoirOneFillCompleteState( void ) +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeReservoirOneFillCompleteState( void ) { - PRE_TREATMENT_PRIME_STATE_T state = PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; if ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) { - state = PRIME_DIALYSATE_DIALYZER_STATE; + state = HD_PRIME_DIALYSATE_DIALYZER_STATE; } return state; @@ -381,11 +381,11 @@ * @details Outputs: isPrimeCompleted * @return current state *************************************************************************/ -static PRE_TREATMENT_PRIME_STATE_T handlePrimeDialysateDialyzerState( void ) +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeDialysateDialyzerState( void ) { // TODO: Add priming for dialysate circuit isPrimeCompleted = TRUE; - return PRIME_DIALYSATE_DIALYZER_STATE; + return HD_PRIME_DIALYSATE_DIALYZER_STATE; } /**@}*/ Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -rdaaf76c5b69282cb044896b7722c73ac7c89f1a1 -r351ae8d56096982a68f7df1b69a3bf4dd5785094 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision daaf76c5b69282cb044896b7722c73ac7c89f1a1) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 351ae8d56096982a68f7df1b69a3bf4dd5785094) @@ -195,18 +195,22 @@ controller->errorSum += controller->errorSignal; } - // calculate control signal + // calculate control signal from i term controller->errorSumBeforeWindUp = controller->errorSum; - controlSignalBeforeWindup = ( controller->Kp * controller->errorSignal ) + ( controller->Ki * controller->errorSum ); + controlSignalBeforeWindup = ( controller->Ki * controller->errorSum ); controller->controlSignal = RANGE( controlSignalBeforeWindup, controller->uMin, controller->uMax ); // handle anti-windup for i term windupError = controlSignalBeforeWindup - controller->controlSignal; if ( fabs( windupError ) > NEARLY_ZERO ) { controller->errorSum -= ( windupError / controller->Ki ); - } - + } + + // Add p term adjustment to control signal and re-apply range limits + controller->controlSignal += ( controller->Kp * controller->errorSignal ); + controller->controlSignal = RANGE( controller->controlSignal, controller->uMin, controller->uMax ); + result = controller->controlSignal; } else