Index: firmware/App/Drivers/InternalADC.c =================================================================== diff -u -rf760ffc4b10556e5186e9ceb90294262063440ca -r08cb5828a2843c39298df7119c3a1c0789c91f99 --- firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision f760ffc4b10556e5186e9ceb90294262063440ca) +++ firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 08cb5828a2843c39298df7119c3a1c0789c91f99) @@ -74,7 +74,7 @@ 0.009420, // V - INT_ADC_24V_ACTUATORS_REG 0.000733, // V - INT_ADC_1_2V_PROCESSOR 0.001465, // V - INT_ADC_5V_SENSORS - 0.007324, // mA - INT_ADC_PRIMARY_ALARM_CURRENT_HG + 0.014650, // mA - INT_ADC_PRIMARY_ALARM_CURRENT_HG 0.001221, // V - INT_ADC_BOARD_THERMISTOR 0.000733, // V - INT_ADC_1_25_FPGA_ADC_REF 0.001465, // V - INT_ADC_3_3V Index: firmware/App/Modes/TreatmentRecirc.c =================================================================== diff -u -r1d07de4e970f54f2ae1786ef546cf5567df9ba8e -r08cb5828a2843c39298df7119c3a1c0789c91f99 --- firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision 1d07de4e970f54f2ae1786ef546cf5567df9ba8e) +++ firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision 08cb5828a2843c39298df7119c3a1c0789c91f99) @@ -46,6 +46,7 @@ static U32 recircTimerCtr; ///< Timer counter (in GP task intervals) counts time spent in re-circulation sub-mode. static U32 recircPublishTimerCtr; ///< Timer counter (in GP task intervals) counts time to next status broadcast. +static BOOL recircStartRecircRequested; ///< Flag indicates user requesting to start recirculating (confirming disconnected). static BOOL recircReconnectRequested; ///< Flag indicates user requesting re-circulate stop so they can re-connect. static BOOL recircBackToTreatmenRequested; ///< Flag indicates user requesting to go back to treatment (confirming re-connected). static BOOL recircResumeRequested; ///< Flag indicates user requesting resumption of re-circulating. @@ -58,13 +59,16 @@ static void setupForRecirculationState( void ); static void setupForRecirculationStopState( void ); +static TREATMENT_RECIRC_STATE_T handleRecircDisconnectPatientState( void ); static TREATMENT_RECIRC_STATE_T handleRecircRecircState( void ); static TREATMENT_RECIRC_STATE_T handleRecircStoppedState( void ); +static TREATMENT_RECIRC_STATE_T handleRecircReconnectPatientState( void ); static BOOL handleRecircReconnectUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ); static BOOL handleRecicConfirmReconnectUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ); static BOOL handleRecircResumeUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ); static BOOL handleRecircEndTreatmentUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ); +static BOOL handleRecircConfirmDisconnectUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ); static void publishTreatmentRecircData( void ); @@ -93,6 +97,7 @@ *************************************************************************/ static void resetTreatmentRecircFlags( void ) { + recircStartRecircRequested = FALSE; recircReconnectRequested = FALSE; recircBackToTreatmenRequested = FALSE; recircResumeRequested = FALSE; @@ -190,6 +195,10 @@ switch ( treatmentRecircState ) { + case TREATMENT_RECIRC_DISCONNECT_PATIENT_STATE: + treatmentRecircState = handleRecircDisconnectPatientState(); + break; + case TREATMENT_RECIRC_RECIRC_STATE: treatmentRecircState = handleRecircRecircState(); break; @@ -198,6 +207,10 @@ treatmentRecircState = handleRecircStoppedState(); break; + case TREATMENT_RECIRC_RECONNECT_PATIENT_STATE: + treatmentRecircState = handleRecircReconnectPatientState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_TREATMENT_RECIRC_INVALID_STATE, treatmentRecircState ); break; @@ -216,6 +229,26 @@ /*********************************************************************//** * @brief + * The handleRecircDisconnectPatientState function handles the re-circulation + * disconnect patient state operations. + * @details Inputs: flags + * @details Outputs: flags handled + * @return next Treatment re-circulation state + *************************************************************************/ +static TREATMENT_RECIRC_STATE_T handleRecircDisconnectPatientState( void ) +{ + TREATMENT_RECIRC_STATE_T result = TREATMENT_RECIRC_DISCONNECT_PATIENT_STATE; + + if ( TRUE == recircStartRecircRequested ) + { + result = TREATMENT_RECIRC_RECIRC_STATE; + } + + return result; +} + +/*********************************************************************//** + * @brief * The handleRecircRecircState function handles the re-circulating state * operations. * @details Inputs: flags @@ -226,12 +259,18 @@ { TREATMENT_RECIRC_STATE_T result = TREATMENT_RECIRC_RECIRC_STATE; - // Is alarm stop or user reconnect requested? - if ( ( TRUE == recircReconnectRequested ) || ( TRUE == doesAlarmStatusIndicateStop() ) ) + // Is alarm stop? + if ( TRUE == doesAlarmStatusIndicateStop() ) { setupForRecirculationStopState(); result = TREATMENT_RECIRC_STOPPED_STATE; } + // Is user reconnect requested? + else if ( TRUE == recircReconnectRequested ) + { + setupForRecirculationStopState(); + result = TREATMENT_RECIRC_RECONNECT_PATIENT_STATE; + } // Is end treatment requested? else if ( TRUE == recircEndTreatmentRequested ) { @@ -254,6 +293,33 @@ { TREATMENT_RECIRC_STATE_T result = TREATMENT_RECIRC_STOPPED_STATE; + // Is end treatment requested? + if ( TRUE == recircEndTreatmentRequested ) + { + signalEndTreatment(); + } + // Is re-circ resume requested? + else if ( TRUE == recircResumeRequested ) + { + setupForRecirculationState(); + result = TREATMENT_RECIRC_RECIRC_STATE; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The handleRecircReconnectPatientState function handles the re-circulation + * reconnect patient state operations. + * @details Inputs: flags + * @details Outputs: flags handled + * @return next Treatment re-circulation state + *************************************************************************/ +static TREATMENT_RECIRC_STATE_T handleRecircReconnectPatientState( void ) +{ + TREATMENT_RECIRC_STATE_T result = TREATMENT_RECIRC_RECONNECT_PATIENT_STATE; + // Is back to treatment requested? if ( TRUE == recircBackToTreatmenRequested ) { @@ -262,7 +328,8 @@ // Is end treatment requested? else if ( TRUE == recircEndTreatmentRequested ) { - signalEndTreatment(); + setupForRecirculationStopState(); + signalEndTreatment(); // signal end Tx sub-mode } // Is re-circ resume requested? else if ( TRUE == recircResumeRequested ) @@ -271,6 +338,7 @@ result = TREATMENT_RECIRC_RECIRC_STATE; } + return result; } @@ -309,6 +377,10 @@ accepted = handleRecircEndTreatmentUserAction( &rejReason ); break; + case REQUESTED_USER_ACTION_TX_RECIRC_CONFIRM_DISCONNECT: + accepted = handleRecircConfirmDisconnectUserAction( &rejReason ); + break; + default: rejReason = REQUEST_REJECT_REASON_INVALID_COMMAND; break; @@ -410,7 +482,7 @@ /*********************************************************************//** * @brief - * The handleRecircEndTreatmentUserAction function handles an e reatment + * The handleRecircEndTreatmentUserAction function handles an end treatment * user action request. It is assumed that the calling function will set * the reject reason parameter to None beforehand. * @details Inputs: treatmentRecircState @@ -437,6 +509,33 @@ /*********************************************************************//** * @brief + * The handleRecircConfirmDisconnectUserAction function handles a confirm + * patient disconnect user action request. It is assumed that the calling + * function will set the reject reason parameter to None beforehand. + * @details Inputs: treatmentRecircState + * @details Outputs: confirming patient disconnect action handled + * @param rejReason Code indicating reason for rejection + * @return TRUE if user action accepted, FALSE if not + *************************************************************************/ +static BOOL handleRecircConfirmDisconnectUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ) +{ + BOOL result = FALSE; + + if ( TREATMENT_RECIRC_DISCONNECT_PATIENT_STATE == treatmentRecircState ) + { + result = TRUE; + recircStartRecircRequested = TRUE; + } + else + { + *rejReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; + } + + return result; +} + +/*********************************************************************//** + * @brief * The getCurrentTreatmentRecircState function returns the current state of the * treatment re-circulate sub-mode. * @details Inputs: treatmentRecircState Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -rfad48c849d3bef75edacc23ff48a9a7190c5b3c3 -r08cb5828a2843c39298df7119c3a1c0789c91f99 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision fad48c849d3bef75edacc23ff48a9a7190c5b3c3) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 08cb5828a2843c39298df7119c3a1c0789c91f99) @@ -62,8 +62,8 @@ #define CLR_BACKUP_AUDIO_ENABLE() {mibspiREG3->PC3 &= ~BACKUP_AUDIO_ENABLE_SPI3_PORT_MASK;} ///< Macro to disable backup alarm audio. #define ALARM_AUDIO_TEST_TONE 4 ///< Alarm audio state for continuous test tone. -#define ALARM_AUDIO_CURRENT_HG_MIN_MA 20.0F ///< Minimum audio current (high gain) during test tone self-test (in mA). // TODO - Why is HG so low? S/B same as LG I think. -#define ALARM_AUDIO_CURRENT_LG_MIN_MA 60.0F ///< Minimum audio current (low gain) during test tone self-test (in mA). +#define ALARM_AUDIO_CURRENT_LG_MIN_MA 50.0F ///< Minimum audio current (low gain) during test tone self-test (in mA). +#define ALARM_AUDIO_CURRENT_LG_MAX_MA 20.0F ///< Maximum audio current (low gain) during no tone self-test (in mA). #define ALARM_AUDIO_MAX_TEST_TIME_MS 1000 ///< Maximum time for audio current to reach threshold in test. #define MAX_ALARM_AUDIO_VOLUME_INDEX 0 ///< Index for maximum alarm audio volume. #define MIN_ALARM_AUDIO_VOLUME_INDEX (MAX_ALARM_VOLUME_LEVEL - 1 ) ///< Index for minimum alarm audio volume. @@ -79,10 +79,11 @@ /// Enumeration of alarm audio self-test states. typedef enum Alarm_Lamp_Self_Test_States { - ALARM_AUDIO_SELF_TEST_STATE_START = 0, ///< Start state of alarm lamp self-test. - ALARM_AUDIO_SELF_TEST_STATE_PRIMARY, ///< Red state of alarm lamp self-test. - ALARM_AUDIO_SELF_TEST_STATE_COMPLETE, ///< Completed state of alarm lamp self-test. - NUM_OF_ALARM_AUDIO_SELF_TEST_STATES ///< Number of states in alarm lamp self-test. + ALARM_AUDIO_SELF_TEST_STATE_START = 0, ///< Start state of alarm audio self-test. + ALARM_AUDIO_SELF_TEST_STATE_PRIMARY, ///< Test tone state of alarm audio self-test. + ALARM_AUDIO_SELF_TEST_STATE_NO_TONE, ///< No tone state of alarm audio self-test. + ALARM_AUDIO_SELF_TEST_STATE_COMPLETE, ///< Completed state of alarm audio self-test. + NUM_OF_ALARM_AUDIO_SELF_TEST_STATES ///< Number of states in alarm audio self-test. } ALARM_AUDIO_SELF_TEST_STATE_T; /// Enumeration of alarm audio volume factors. @@ -109,6 +110,7 @@ static OVERRIDE_U32_T alarmStartedAt[ NUM_OF_ALARM_IDS ]; ///< Table - when alarm became active for each alarm (if active) or zero (if inactive) static U32 alarmStatusPublicationTimerCounter = 0; ///< Used to schedule alarm status publication to CAN bus. static U32 alarmInfoPublicationTimerCounter = 0; ///< Used to schedule alarm information publication to CAN bus. +static U32 audioTestStartTime; ///< Start time of audio alarm current self-test. /// Interval (in task intervals) at which to publish alarm status to CAN bus. static OVERRIDE_U32_T alarmStatusPublishInterval = { ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, 0 }; @@ -1374,39 +1376,56 @@ SELF_TEST_STATUS_T execAlarmAudioSelfTest( void ) { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; - static U32 testStartTime; + F32 almLGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_LG ); switch ( alarmAudioSelfTestState ) { case ALARM_AUDIO_SELF_TEST_STATE_START: - testStartTime = getMSTimerCount(); - // Start test tone - alarmAudioTestToneRequested = TRUE; - setAlarmAudio(); - alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_PRIMARY; + if ( almLGCurrent < ALARM_AUDIO_CURRENT_LG_MAX_MA ) + { + audioTestStartTime = getMSTimerCount(); + // Start test tone + alarmAudioTestToneRequested = TRUE; + setAlarmAudio(); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_PRIMARY; + } + else + { + result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ALARM_AUDIO_SELF_TEST_FAILURE, almLGCurrent, ALARM_AUDIO_CURRENT_LG_MAX_MA ); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; + } break; case ALARM_AUDIO_SELF_TEST_STATE_PRIMARY: + // Check if alarm audio current is sufficiently high indicating alarm tone is being output + if ( almLGCurrent > ALARM_AUDIO_CURRENT_LG_MIN_MA ) { - F32 almHGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_HG ); - F32 almLGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_LG ); + alarmAudioTestToneRequested = FALSE; + audioTestStartTime = getMSTimerCount(); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_NO_TONE; + } + else if ( TRUE == didTimeout( audioTestStartTime, ALARM_AUDIO_MAX_TEST_TIME_MS ) ) + { + alarmAudioTestToneRequested = FALSE; + result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ALARM_AUDIO_SELF_TEST_FAILURE, almLGCurrent, ALARM_AUDIO_CURRENT_LG_MIN_MA ); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; + } + break; - // Check if alarm audio current is sufficiently high indicating alarm tone is being output - if ( ( almHGCurrent > ALARM_AUDIO_CURRENT_HG_MIN_MA ) && - ( almLGCurrent > ALARM_AUDIO_CURRENT_LG_MIN_MA ) ) - { - alarmAudioTestToneRequested = FALSE; - result = SELF_TEST_STATUS_PASSED; - alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; - } - else if ( TRUE == didTimeout( testStartTime, ALARM_AUDIO_MAX_TEST_TIME_MS ) ) - { - alarmAudioTestToneRequested = FALSE; - result = SELF_TEST_STATUS_FAILED; - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ALARM_AUDIO_SELF_TEST_FAILURE, almHGCurrent, almLGCurrent ); - alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; - } + case ALARM_AUDIO_SELF_TEST_STATE_NO_TONE: + if ( almLGCurrent < ALARM_AUDIO_CURRENT_LG_MAX_MA ) + { + result = SELF_TEST_STATUS_PASSED; + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; } + else if ( TRUE == didTimeout( audioTestStartTime, ALARM_AUDIO_MAX_TEST_TIME_MS ) ) + { + result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ALARM_AUDIO_SELF_TEST_FAILURE, almLGCurrent, ALARM_AUDIO_CURRENT_LG_MAX_MA ); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; + } break; case ALARM_AUDIO_SELF_TEST_STATE_COMPLETE: