Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -r0a4dcd288d4347b85baaa0b07da568b6add5eac7 -rfacca88de0d4c72d943b59bad9264a9b0a031ae5 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 0a4dcd288d4347b85baaa0b07da568b6add5eac7) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision facca88de0d4c72d943b59bad9264a9b0a031ae5) @@ -727,7 +727,7 @@ *************************************************************************/ void setHDVersionDGUsageInfo( DG_USAGE_INFO_RECORD_T* data ) { - dgServiceAndUsageData.isDGUsageInfoAviable = TRUE; + dgServiceAndUsageData.isDGUsageInfoAvailable = TRUE; memcpy( &dgServiceAndUsageData.dgUsageInfo, data, sizeof( DG_USAGE_INFO_RECORD_T ) ); } Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -r0a4dcd288d4347b85baaa0b07da568b6add5eac7 -rfacca88de0d4c72d943b59bad9264a9b0a031ae5 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 0a4dcd288d4347b85baaa0b07da568b6add5eac7) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision facca88de0d4c72d943b59bad9264a9b0a031ae5) @@ -106,7 +106,7 @@ DG_SERVICE_RECORD_T dgServiceRecord; ///< HD version of the DG service record. DG_USAGE_INFO_RECORD_T dgUsageInfo; ///< HD version of the DG usage info. BOOL isDGServiceRecordAvailable; ///< Flag to indicate DG service record is available. - BOOL isDGUsageInfoAviable; ///< Flag to indicate DG usage info is available. + BOOL isDGUsageInfoAvailable; ///< Flag to indicate DG usage info is available. } DG_SERVICE_AND_USAGE_DATA_T; // ********** public function prototypes ********** Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r0a4dcd288d4347b85baaa0b07da568b6add5eac7 -rfacca88de0d4c72d943b59bad9264a9b0a031ae5 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 0a4dcd288d4347b85baaa0b07da568b6add5eac7) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision facca88de0d4c72d943b59bad9264a9b0a031ae5) @@ -392,6 +392,18 @@ /*********************************************************************//** * @brief + * The getDGVersion function returns the DG version information. + * @details Inputs: dgVersion + * @details Outputs: none + * @return dgVersion + *************************************************************************/ +DG_VERSIONS_T getDGVersion( void ) +{ + return dgVersion; +} + +/*********************************************************************//** + * @brief * The isPOSTCompleted function determines whether all HD POST have * been run and completed. If true, call the isPOSTPassed() to see final * result (pass/fail). Index: firmware/App/Modes/ModeInitPOST.h =================================================================== diff -u -r0a4dcd288d4347b85baaa0b07da568b6add5eac7 -rfacca88de0d4c72d943b59bad9264a9b0a031ae5 --- firmware/App/Modes/ModeInitPOST.h (.../ModeInitPOST.h) (revision 0a4dcd288d4347b85baaa0b07da568b6add5eac7) +++ firmware/App/Modes/ModeInitPOST.h (.../ModeInitPOST.h) (revision facca88de0d4c72d943b59bad9264a9b0a031ae5) @@ -42,6 +42,7 @@ void signalDGPOSTFinalResult( BOOL passed ); // Record DG POST result void signalUIVersion( UI_VERSIONS_T version ); // Record UI version info void signalDGVersion( DG_VERSIONS_T version ); // Record DG version info +DG_VERSIONS_T getDGVersion( void ); // Get DG version info /**@}*/ Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r4df8828df03ee996540084c57f9b46c0febc1e03 -rfacca88de0d4c72d943b59bad9264a9b0a031ae5 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 4df8828df03ee996540084c57f9b46c0febc1e03) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision facca88de0d4c72d943b59bad9264a9b0a031ae5) @@ -20,6 +20,7 @@ #include "Battery.h" #include "BloodFlow.h" #include "Buttons.h" +#include "Compatible.h" #include "DGInterface.h" #include "DialInFlow.h" #include "DialOutFlow.h" @@ -278,52 +279,63 @@ BOOL signalUserInitiateTreatment( void ) { BOOL result = FALSE; + DG_VERSIONS_T dgVersion = getDGVersion(); REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; + // Verify HD is in standby mode waiting for treatment start request if ( ( MODE_STAN != getCurrentOperationMode() ) || ( STANDBY_WAIT_FOR_TREATMENT_STATE != currentStandbyState ) ) { rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; } - - if ( TRUE != isDGCommunicating() ) + // Verify DG is communicating with HD + else if ( TRUE != isDGCommunicating() ) { rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; } - - if ( ( DG_MODE_STAN != getDGOpMode() ) || ( DG_STANDBY_MODE_STATE_IDLE != getDGSubMode() ) ) + // Verify DG software is compatible with HD software + else if ( dgVersion.compatibilityRev != SW_COMPATIBILITY_REV ) { + rejReason = REQUEST_REJECT_REASON_DG_INCOMPATIBLE; + } + // Verify DG is not busy + else if ( ( DG_MODE_STAN != getDGOpMode() ) || ( DG_STANDBY_MODE_STATE_IDLE != getDGSubMode() ) ) + { rejReason = REQUEST_REJECT_REASON_DG_NOT_IN_STANDBY_IDLE_STATE; } - - if ( FALSE == isBatteryCharged() ) + // Verify HD battery has sufficient charge to hold up logic/sensors for at least 10 minutes + else if ( FALSE == isBatteryCharged() ) { rejReason = REQUEST_REJECT_REASON_BATTERY_IS_NOT_CHARGED; } - -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SERVICE_AND_DISINFECT_CHECK ) != SW_CONFIG_ENABLE_VALUE ) +#ifdef _RELEASE_ + else +#else + else if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SERVICE_AND_DISINFECT_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif { - // This function checks both HD and DG service records and if any of them has failed, it fills the provided reject reason buffer - haveHDDGServicesBeenExpired( &rejReason ); - - if ( FALSE == isDGDisinfectValid() ) + // Verify HD and DG are not over due for service + if ( haveHDDGServicesBeenExpired( &rejReason ) != TRUE ) { - rejReason = REQUEST_REJECT_REASON_DG_DISINFECT_HAS_BEEN_EXPIRED; + // Verify DG is disinfected + if ( FALSE == isDGDisinfectValid() ) + { + rejReason = REQUEST_REJECT_REASON_DG_DISINFECT_HAS_BEEN_EXPIRED; + } + else if ( getHeatDisinfectTemperatureSensorValue() > MAX_ALLOWED_RO_FILTER_TEMP_FOR_TX_C ) + { + rejReason = REQUEST_REJECT_REASON_DG_RO_FILTER_TEMPERATURE_OUT_OF_RANGE; + } } - - if ( getHeatDisinfectTemperatureSensorValue() > MAX_ALLOWED_RO_FILTER_TEMP_FOR_TX_C ) - { - rejReason = REQUEST_REJECT_REASON_DG_RO_FILTER_TEMPERATURE_OUT_OF_RANGE; - } } + // If no reason to reject request to start treatment, set flag to initiate treatment workflow if ( REQUEST_REJECT_REASON_NONE == rejReason ) { result = TRUE; treatStartReqReceived = TRUE; } + // Respond to request to start treatment sendInitiateTreatmentResponseMsg( result, rejReason ); return result; @@ -674,24 +686,30 @@ cmdStopDG(); } - // If treatment start is requested by user, initiate treatment workflow (transition to treatment params mode). - if ( TRUE == treatStartReqReceived ) + // If DG is communicating and we don't yet have DG version info, request it + if ( TRUE == isDGCommunicating() ) { - BOOL startTreatment = TRUE; + DG_VERSIONS_T dgVersion = getDGVersion(); - if ( TRUE == startTreatment ) + if ( 0 == dgVersion.compatibilityRev ) { - // Initialize treatment modes before starting a new treatment - initTreatParamsMode(); - initPreTreatmentMode(); - initTreatmentMode(); - initPostTreatmentMode(); - // Start treatment workflow with treatment parameters mode - requestNewOperationMode( MODE_TPAR ); - treatStartReqReceived = FALSE; + sendFWVersionRequest(); } } + // If treatment start is requested by user, initiate treatment workflow (transition to treatment params mode). + if ( TRUE == treatStartReqReceived ) + { + // Initialize treatment modes before starting a new treatment + initTreatParamsMode(); + initPreTreatmentMode(); + initTreatmentMode(); + initPostTreatmentMode(); + // Start treatment workflow with treatment parameters mode + requestNewOperationMode( MODE_TPAR ); + treatStartReqReceived = FALSE; + } + return state; } @@ -980,7 +998,7 @@ getHDVersionDGServiceAndUsageData( &data ); - if ( TRUE == data.isDGUsageInfoAviable ) + if ( TRUE == data.isDGUsageInfoAvailable ) { HD_USAGE_INFO_RECORD_T usageRecord; getNVRecord2Driver( GET_USAGE_RECORD, (U08*)&usageRecord, sizeof( HD_USAGE_INFO_RECORD_T ), 0, ALARM_ID_NO_ALARM ); @@ -1027,11 +1045,11 @@ * @details Inputs: none * @details Outputs: none * @param rejReason pointer to the provided reject reason buffer to be send to UI - * @return TRUE if the service time is still valid otherwise, FALSE + * @return TRUE if the service for HD or DG has expired otherwise FALSE ***********************************************************************/ static BOOL haveHDDGServicesBeenExpired( REQUEST_REJECT_REASON_CODE_T* rejReason ) { - BOOL status = TRUE; + BOOL status = FALSE; DG_SERVICE_AND_USAGE_DATA_T dgData; HD_SERVICE_RECORD_T hdServiceRecord; @@ -1041,19 +1059,19 @@ if ( TRUE == dgData.isDGServiceRecordAvailable ) { U32 dgSrvcElapsedTimeS = getRTCTimestamp() - dgData.dgServiceRecord.lastServiceEpochDate; - BOOL hasDGSrvcBeenExpired = ( dgSrvcElapsedTimeS > SERVICE_TIME_INTERVAL_S ? TRUE : FALSE ); U32 hdSrvcElapsedTimeS = getRTCTimestamp() - hdServiceRecord.lastServiceEpochDate; + BOOL hasDGSrvcBeenExpired = ( dgSrvcElapsedTimeS > SERVICE_TIME_INTERVAL_S ? TRUE : FALSE ); BOOL hasHDSrvcBeenExpied = ( hdSrvcElapsedTimeS > SERVICE_TIME_INTERVAL_S ? TRUE : FALSE ); if ( TRUE == hasDGSrvcBeenExpired ) { - status = FALSE; + status = TRUE; *rejReason = REQUEST_REJECT_REASON_DG_SERVICE_IS_DUE; } if ( TRUE == hasHDSrvcBeenExpied ) { - status = FALSE; + status = TRUE; *rejReason = REQUEST_REJECT_REASON_HD_SERVICE_IS_DUE; } } Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r0a4dcd288d4347b85baaa0b07da568b6add5eac7 -rfacca88de0d4c72d943b59bad9264a9b0a031ae5 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 0a4dcd288d4347b85baaa0b07da568b6add5eac7) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision facca88de0d4c72d943b59bad9264a9b0a031ae5) @@ -66,8 +66,8 @@ #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_MAX_TEST_TIME_MS 1000 ///< Maximum time for audio current to reach threshold in test. -#define MAX_ALARM_AUDIO_VOLUME_INDEX (MAX_ALARM_VOLUME_LEVEL - 1 ) ///< Index for maximum alarm audio volume. -#define MIN_ALARM_AUDIO_VOLUME_INDEX 0 ///< Index for minimum alarm audio volume. +#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. /// Alarm priority ranking record. typedef struct @@ -115,6 +115,7 @@ static OVERRIDE_U32_T alarmStatusPublishInterval = { ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, 0 }; /// Interval (in task intervals) at which to publish alarm information to CAN bus. static OVERRIDE_U32_T alarmInfoPublishInterval = { ALARM_INFO_PUB_INTERVAL, ALARM_INFO_PUB_INTERVAL, ALARM_INFO_PUB_INTERVAL, 0 }; +/// Alarm audio attenuation level (0..4 where 0 = max volume and 4 = min volume). static OVERRIDE_U32_T alarmAudioVolumeLevel = { MAX_ALARM_VOLUME_ATTENUATION, MAX_ALARM_VOLUME_ATTENUATION, MAX_ALARM_VOLUME_ATTENUATION, 0 }; static OVERRIDE_F32_T alarmPrimaryAudioCurrentHG = { 0.0, 0.0, 0.0, 0 }; /// Alarm audio current (high gain) measured at ADC. @@ -939,8 +940,8 @@ if ( TRUE == alarmAudioTestToneRequested ) { // Play test tone at min volume setAlarmAudioState( ALARM_AUDIO_TEST_TONE, - ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[MIN_ALARM_AUDIO_VOLUME_INDEX][ALARM_AUDIO_VOLUME_GAIN], - ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[MIN_ALARM_AUDIO_VOLUME_INDEX][ALARM_AUDIO_VOLUME_DIVIDER] ); + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[MAX_ALARM_AUDIO_VOLUME_INDEX][ALARM_AUDIO_VOLUME_GAIN], + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[MAX_ALARM_AUDIO_VOLUME_INDEX][ALARM_AUDIO_VOLUME_DIVIDER] ); // If we're in Fault mode, ensure audio test tone request is cancelled. if ( MODE_FAUL == getCurrentOperationMode() ) { Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rda7e8c1b71db9273f83e9d0ba7d20e74e758a8ad -rfacca88de0d4c72d943b59bad9264a9b0a031ae5 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision da7e8c1b71db9273f83e9d0ba7d20e74e758a8ad) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision facca88de0d4c72d943b59bad9264a9b0a031ae5) @@ -3117,6 +3117,30 @@ /*********************************************************************//** * @brief + * The sendFWVersionRequest function constructs a firmware version request + * message and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: Firmware version request msg constructed and queued. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendFWVersionRequest( void ) +{ + BOOL result; + MESSAGE_T msg; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_REQUEST_FW_VERSIONS; + msg.hdr.payloadLen = sizeof( UI_VERSIONS_T ); // usually UI sends this request w/ UI version info - we will leave that blank + + // 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_DG, ACK_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief * The handleUIVersionResponse function handles a response to request for * UI version information. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rda7e8c1b71db9273f83e9d0ba7d20e74e758a8ad -rfacca88de0d4c72d943b59bad9264a9b0a031ae5 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision da7e8c1b71db9273f83e9d0ba7d20e74e758a8ad) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision facca88de0d4c72d943b59bad9264a9b0a031ae5) @@ -81,13 +81,16 @@ // MSG_ID_REQUEST_FW_VERSIONS void handleFWVersionRequest( MESSAGE_T *message ); +// MSG_ID_REQUEST_FW_VERSIONS +BOOL sendFWVersionRequest( void ); + // MSG_ID_HD_UI_VERSION_INFO_RESPONSE void handleUIVersionResponse( MESSAGE_T *message ); // MSG_ID_HD_UI_VERSION_INFO_REQUEST BOOL sendUIVersionRequest( void ); -// MSG_ID_REQUEST_FW_VERSIONS +// MSG_ID_HD_SERIAL_NUMBER void handleHDSerialNumberRequest( void ); // MSG_ID_UI_REQUEST_SERVICE_INFO