Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r5413ebeb2cb61163574550c7b2ca212ae3e307a3 -r88696f3c6a5d82503064a73433d39fa000728d93 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 5413ebeb2cb61163574550c7b2ca212ae3e307a3) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 88696f3c6a5d82503064a73433d39fa000728d93) @@ -19,6 +19,7 @@ #include "ModePreTreat.h" #include "OperationModes.h" #include "Prime.h" +#include "SelfTests.h" #include "SystemCommMessages.h" /** @@ -46,14 +47,18 @@ static void handleAlarmActionStop( void ); static void handleAlarmActionResume( void ); +static HD_PRE_TREATMENT_MODE_STATE_T handleHomeSetupState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ); +static HD_PRE_TREATMENT_MODE_STATE_T handleInstallState( 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 handleRecirculateStartState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleRecirculateState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handlePretreatmentPauseState( void ); +static BOOL getDoorState( void ); + /*********************************************************************//** * @brief * The initPreTreatmentMode function initializes the Pre-Treatment Mode module. @@ -108,15 +113,19 @@ break; case HD_PRE_TREATMENT_WATER_SAMPLE_STATE: - currentPreTreatmentState = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; + currentPreTreatmentState = HD_PRE_TREATMENT_HOME_SETUP_STATE; break; + case HD_PRE_TREATMENT_HOME_SETUP_STATE: + currentPreTreatmentState = handleHomeSetupState(); + break; + case HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE: currentPreTreatmentState = handleSelfTestNoCartState(); break; case HD_PRE_TREATMENT_CART_INSTALL_STATE: - currentPreTreatmentState = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + currentPreTreatmentState = handleInstallState(); break; case HD_PRE_TREATMENT_SELF_TEST_DRY_STATE: @@ -282,31 +291,97 @@ } } + /*********************************************************************//** * @brief + * The handleHomeSetupState function waits for user to close door before + * transition to self-test no cartridge state. + * @details Inputs: none + * @details Outputs: transition to self-tests after door is closed + * @return current state (sub-mode) + *************************************************************************/ +static HD_PRE_TREATMENT_MODE_STATE_T handleHomeSetupState( void ) +{ + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_HOME_SETUP_STATE; + VALVE_T valve; + + if ( TRUE == isBloodPumpRunning() ) + { + signalBloodPumpHardStop(); + } + + if ( TRUE == isDialInPumpRunning() ) + { + signalDialInPumpHardStop(); + } + + if ( TRUE == isDialOutPumpRunning() ) + { + signalDialOutPumpHardStop(); + } + + if ( TRUE == getDoorState() ) + { + for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) + { + homeValve( valve ); + } + + homeBloodPump(); + homeDialInPump(); + homeDialOutPump(); + + state = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; + } + else + { + activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleSelfTestNoCartState function handles self-test with no cartridge. * @details Inputs: none * @details Outputs: home blood pump and dialysate pumps * @return current state (sub-mode) *************************************************************************/ static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ) { - // TODO: Prompt user to close door + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; - VALVE_T valve; + execNoCartSelfTests(); - for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) + if ( FALSE == getDoorState() ) { - homeValve( valve ); + state = HD_PRE_TREATMENT_HOME_SETUP_STATE; } - homeBloodPump(); - homeDialInPump(); - homeDialOutPump(); + if ( TRUE == isNoCartSelfTestsPassed() ) + { + state = HD_PRE_TREATMENT_CART_INSTALL_STATE; + } - // TODO: Prompt user to open door + return state; +} - return HD_PRE_TREATMENT_CART_INSTALL_STATE; +/*********************************************************************//** + * @brief + * The handleInstallState function handles disposable installation. + * @details Inputs: none + * @details Outputs: transition to prime sub-mode when blood pump finished homing + * @return current state (sub-mode) + *************************************************************************/ +static HD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ) +{ + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_CART_INSTALL_STATE; + + // TODO: handle install verification and transition + state = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + + return state; } /*********************************************************************//** @@ -318,7 +393,7 @@ *************************************************************************/ static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ) { - HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_CART_INSTALL_STATE; + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; if ( FALSE == isBloodPumpRunning() ) { @@ -448,4 +523,17 @@ return state; } +/*********************************************************************//** + * @brief + * The getDoorState function gets the current state of door switch. + * @details Inputs: none + * @details Outputs: none + * @return TRUE if door is closed, otherwise FALSE + *************************************************************************/ +BOOL getDoorState( void ) +{ + // TODO: Get actual door state from FPGA or GPIO + return TRUE; +} + /**@}*/ Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r9f5e68247ff2f5214e8828a1b8152ea16941fe39 -r88696f3c6a5d82503064a73433d39fa000728d93 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 9f5e68247ff2f5214e8828a1b8152ea16941fe39) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 88696f3c6a5d82503064a73433d39fa000728d93) @@ -162,20 +162,20 @@ * @details Outputs: response to user request sent * @return TRUE if request accepted, FALSE if not *************************************************************************/ -BOOL userRequestEndTreatment( void ) -{ - BOOL result = FALSE; +//BOOL userRequestEndTreatment( void ) +//{ +// BOOL result = FALSE; +// +// if ( TREATMENT_STOP_STATE == currentTreatmentState ) +// { +// pendingUserEndTreatmentRequest = TRUE; +// result = TRUE; +// } +// sendTreatmentEndResponseMsg( result ); +// +// return result; +//} - if ( TREATMENT_STOP_STATE == currentTreatmentState ) - { - pendingUserEndTreatmentRequest = TRUE; - result = TRUE; - } - sendTreatmentEndResponseMsg( result ); - - return result; -} - /*********************************************************************//** * @brief * The signalAlarmActionToTreatmentMode function executes the given alarm action Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r8e2cfecc47bb3912078b29513f1717c1567f0071 -r88696f3c6a5d82503064a73433d39fa000728d93 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 8e2cfecc47bb3912078b29513f1717c1567f0071) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 88696f3c6a5d82503064a73433d39fa000728d93) @@ -5,7 +5,7 @@ * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * -* @file Prime.h +* @file Prime.c * * @author (last) Quang Nguyen * @date (last) 08-Dec-2020 Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u --- firmware/App/Modes/SelfTests.c (revision 0) +++ firmware/App/Modes/SelfTests.c (revision 88696f3c6a5d82503064a73433d39fa000728d93) @@ -0,0 +1,153 @@ +/************************************************************************** +* +* Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +* +* THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +* WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +* +* @file SelfTests.c +* +* @author (last) Quang Nguyen +* @date (last) 28-Jan-2021 +* +* @author (original) Quang Nguyen +* @date (original) 28-Jan-2021s +* +***************************************************************************/ + +#include "BloodFlow.h" +#include "DialInFlow.h" +#include "PresOccl.h" +#include "SelfTests.h" + +/** + * @addtogroup SelfTests + * @{ + */ + +// ********** private definitions ********** + +/// No cartridge self-tests state machine. +typedef enum No_Cart_Self_Tests_State +{ + NO_CART_SELF_TESTS_START_STATE = 0, ///< No cartridge self-tests starting state. + NO_CART_SELF_TESTS_OCCLUSION_SENSORS, ///< No cartridge self-test for occlusion sensors. + NO_CART_SELF_TESTS_BLOOD_FLOW_METERS, ///< No cartridge self-test for blood flow meter. + NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS, ///< No cartridge self-test for dialysate flow meter. + NO_CART_SELF_TESTS_VALVE_BLOOD_TRAP, ///< No cartridge self-test for valve blood trap. + NO_CART_SELF_TESTS_PUMPS, ///< No cartridge self-test for blood pump, dialysate in pump, dialysate out pump. + NO_CART_SELF_TESTS_LEAK_DETECTORS, ///< No cartridge self-test for leak detectors. + NO_CART_SELF_TESTS_BOARD_TEMPERATURE, ///< No cartridge self-test for board temperature. + NO_CART_SELF_TESTS_DOOR_SWITCH, ///< No cartridge self-test for door switch. + NO_CART_SELF_TESTS_COMPLETE, ///< No cartridge self-test complete state. + NUM_OF_NO_CART_SELF_TESTS_STATES ///< Number of no cartridge self-tests states. +} NO_CART_SELF_TESTS_STATE_T; + +// ********** private data ********** + +static BOOL isNoCartSelfTestsResult; +static NO_CART_SELF_TESTS_STATE_T currentNoCartSelfTestsState; + +// ********** private function prototypes ********** + +/*********************************************************************//** + * @brief + * The initPrime function initializes the prime sub-mode module. + * This function will reset anything required before the start of priming sequence. + * @details Inputs: none + * @details Outputs: Prime sub-mode module initialized. + * @return none + *************************************************************************/ +void initSelfTests( void ) +{ + isNoCartSelfTestsResult = FALSE; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_STATE; +} + +/*********************************************************************//** + * @brief + * The execSelfTests function executes the prime sub-mode state machine. + * @details Inputs: currentPrimeState + * @details Outputs: currentPrimeState + * @return none + *************************************************************************/ +void execNoCartSelfTests( void ) +{ + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; + + // execute no cartridge self-tests state machine + switch ( currentNoCartSelfTestsState ) + { + case NO_CART_SELF_TESTS_START_STATE: + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_OCCLUSION_SENSORS; + break; + + case NO_CART_SELF_TESTS_OCCLUSION_SENSORS: + result = execPresOcclTest(); + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BLOOD_FLOW_METERS; + break; + + case NO_CART_SELF_TESTS_BLOOD_FLOW_METERS: + result = execBloodFlowTest(); + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS; + break; + + case NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS: + result = execDialInFlowTest(); + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_VALVE_BLOOD_TRAP; + break; + + case NO_CART_SELF_TESTS_VALVE_BLOOD_TRAP: + // TODO: Implement self tests + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_PUMPS; + break; + + case NO_CART_SELF_TESTS_PUMPS: + // TODO: Implement self tests + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_LEAK_DETECTORS; + break; + + case NO_CART_SELF_TESTS_LEAK_DETECTORS: + // TODO: Implement self tests + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BOARD_TEMPERATURE; + break; + + case NO_CART_SELF_TESTS_BOARD_TEMPERATURE: + // TODO: Implement self tests + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_DOOR_SWITCH; + break; + + case NO_CART_SELF_TESTS_DOOR_SWITCH: + // TODO: Implement self tests + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_COMPLETE; + break; + + case NO_CART_SELF_TESTS_COMPLETE: + isNoCartSelfTestsResult = TRUE; + break; + + default: + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_STATE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_NO_CARTRIDGE_SELF_TEST_STATE, (U32)currentNoCartSelfTestsState ); + break; + } + + if ( SELF_TEST_STATUS_FAILED == result ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRETREATMENT_SELF_TEST_FAILURE, currentNoCartSelfTestsState ); + } +} + +/*********************************************************************//** + * @brief + * The isNoCartSelfTestsPassed function returns the status of no cartridge self-tests. + * @details Inputs: none + * @details Outputs: none + * @return TRUE if no cartridge self-tests passed, otherwise FALSE + *************************************************************************/ +BOOL isNoCartSelfTestsPassed( void ) +{ + return isNoCartSelfTestsResult; +} + +/**@}*/ Index: firmware/App/Modes/SelfTests.h =================================================================== diff -u --- firmware/App/Modes/SelfTests.h (revision 0) +++ firmware/App/Modes/SelfTests.h (revision 88696f3c6a5d82503064a73433d39fa000728d93) @@ -0,0 +1,44 @@ +/************************************************************************** +* +* Copyright (c) 2019-2021 Diality Inc. - All Rights Reserved. +* +* THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +* WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +* +* @file SelfTests.h +* +* @author (last) Quang Nguyen +* @date (last) 28-Jan-2021 +* +* @author (original) Quang Nguyen +* @date (original) 28-Jan-2021 +* +***************************************************************************/ + +#ifndef __SELF_TESTS_H__ +#define __SELF_TESTS_H__ + +#include "HDCommon.h" +#include "HDDefs.h" + +/** + * @defgroup SelfTests SelfTests + * @brief SelfTests module. This module handles self-tests execution for pre-treatment mode. + * + * @addtogroup SelfTests + * @{ + */ + +// ********** public definitions ********** + +// ********** public function prototypes ********** + +void initSelfTests( void ); + +void execNoCartSelfTests( void ); + +BOOL isNoCartSelfTestsPassed( void ); + +/**@}*/ + +#endif Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r8e2cfecc47bb3912078b29513f1717c1567f0071 -r88696f3c6a5d82503064a73433d39fa000728d93 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 8e2cfecc47bb3912078b29513f1717c1567f0071) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 88696f3c6a5d82503064a73433d39fa000728d93) @@ -239,6 +239,7 @@ SW_FAULT_ID_SYSTEM_COMM_INVALID_FRAME_SIZE, SW_FAULT_ID_SYSTEM_CMMM_CAN_TRANSMIT_REJECTED, // 95 SW_FAULT_ID_MODE_PRIME_INVALID_ALARM_ACTION, + SW_FAULT_ID_HD_INVALID_NO_CARTRIDGE_SELF_TEST_STATE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r98f34c2ab63d51a1bf248db454ebc04e184d4748 -r88696f3c6a5d82503064a73433d39fa000728d93 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 98f34c2ab63d51a1bf248db454ebc04e184d4748) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 88696f3c6a5d82503064a73433d39fa000728d93) @@ -1187,9 +1187,9 @@ handleUIUserConfirmTreatmentParameters( message ); break; - case MSG_ID_UI_TREATMENT_END_REQUEST: - handleUIUserEndTreatmentRequest( message ); - break; +// case MSG_ID_UI_TREATMENT_END_REQUEST: +// handleUIUserEndTreatmentRequest( message ); +// break; case MSG_ID_UI_PRESSURE_LIMITS_CHANGE_REQUEST: handleChangePressureLimitsRequest( message ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r1a5aa1dff6978966ecda860b09c07a84e80399fe -r88696f3c6a5d82503064a73433d39fa000728d93 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 1a5aa1dff6978966ecda860b09c07a84e80399fe) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 88696f3c6a5d82503064a73433d39fa000728d93) @@ -1741,18 +1741,18 @@ * @param message a pointer to the message to handle * @return none *************************************************************************/ -void handleUIUserEndTreatmentRequest( MESSAGE_T *message ) -{ - BOOL result = FALSE; +//void handleUIUserEndTreatmentRequest( MESSAGE_T *message ) +//{ +// BOOL result = FALSE; +// +// if ( message->hdr.payloadLen == 0 ) +// { +// result = userRequestEndTreatment(); +// } +// +// sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); +//} - if ( message->hdr.payloadLen == 0 ) - { - result = userRequestEndTreatment(); - } - - sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); -} - /*********************************************************************//** * @brief * The sendTreatmentEndResponseMsg function constructs a treatment end @@ -1763,25 +1763,25 @@ * @param accepted T/F - request accepted? * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL sendTreatmentEndResponseMsg( BOOL accepted ) -{ - BOOL result; - MESSAGE_T msg; - U08 *payloadPtr = msg.payload; +//BOOL sendTreatmentEndResponseMsg( BOOL accepted ) +//{ +// BOOL result; +// MESSAGE_T msg; +// U08 *payloadPtr = msg.payload; +// +// // Create a message record +// blankMessage( &msg ); +// msg.hdr.msgID = MSG_ID_HD_TREATMENT_END_RESPONSE; +// msg.hdr.payloadLen = sizeof( BOOL ); +// +// memcpy( payloadPtr, &accepted, sizeof( BOOL ) ); +// +// // 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_HD_2_UI, ACK_REQUIRED ); +// +// return result; +//} - // Create a message record - blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_HD_TREATMENT_END_RESPONSE; - msg.hdr.payloadLen = sizeof( BOOL ); - - memcpy( payloadPtr, &accepted, sizeof( BOOL ) ); - - // 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_HD_2_UI, ACK_REQUIRED ); - - return result; -} - /*********************************************************************//** * @brief * The handleTreatmentParametersFromUI function handles a treatment parameters Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r1a5aa1dff6978966ecda860b09c07a84e80399fe -r88696f3c6a5d82503064a73433d39fa000728d93 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 1a5aa1dff6978966ecda860b09c07a84e80399fe) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 88696f3c6a5d82503064a73433d39fa000728d93) @@ -101,7 +101,7 @@ void handleUIUserEndTreatmentRequest( MESSAGE_T *message ); // MSG_ID_HD_TREATMENT_END_RESPONSE -BOOL sendTreatmentEndResponseMsg( BOOL accepted ); +//BOOL sendTreatmentEndResponseMsg( BOOL accepted ); // MSG_ID_UI_NEW_TREATMENT_PARAMS void handleTreatmentParametersFromUI( MESSAGE_T *message );