Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -rf5f00981805e265ce63058f650d784f06db4d188 -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision f5f00981805e265ce63058f650d784f06db4d188) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -42,34 +42,39 @@ #define VENOUS_PRESSURE_OFFSET ( 1638 ) ///< Offset for 14-bit venous pressure sensor reading. #define VENOUS_PRESSURE_SCALE ( 14745 - VENOUS_PRESSURE_OFFSET ) ///< Scale for venous pressure sensor. -#define VENOUS_PRESSURE_MIN ( -30.0 ) ///< Minimum of scale for venous pressure sensor reading (in PSI). -#define VENOUS_PRESSURE_MAX ( 30.0 ) ///< Maximum of scale for venous pressure sensor reading (in PSI). +#define VENOUS_PRESSURE_MIN_PSI ( -30.0 ) ///< Minimum of scale for venous pressure sensor reading (in PSI). +#define VENOUS_PRESSURE_MAX_PSI ( 30.0 ) ///< Maximum of scale for venous pressure sensor reading (in PSI). #define ARTERIAL_PRESSURE_SELF_TEST_MIN ( -300.0 ) ///< Minimum self-test value for arterial pressure sensor reading (in mmHg). #define ARTERIAL_PRESSURE_SELF_TEST_MAX ( 100.0 ) ///< Maximum self-test value for arterial pressure sensor reading (in mmHg). +#define ARTERIAL_PRESSURE_MAX_MMHG ( 2000.0 ) ///< Maximum arterial pressure reading (in mmHg) for range check. +#define ARTERIAL_PRESSURE_MIN_MMHG ( -1500.0 ) ///< Minimum arterial pressure reading (in mmHg) for range check. #define VENOUS_PRESSURE_SELF_TEST_MIN ( -100.0 ) ///< Minimum self-test value for venous pressure sensor reading (in mmHg). #define VENOUS_PRESSURE_SELF_TEST_MAX ( 600.0 ) ///< Maximum self-test value for venous pressure sensor reading (in mmHg). +#define VENOUS_PRESSURE_MAX_MMHG ( 2000.0 ) ///< Maximum venous pressure reading (in mmHg) for range check. +#define VENOUS_PRESSURE_MIN_MMHG ( -1500.0 ) ///< Minimum venous pressure reading (in mmHg) for range check. -#define VENOUS_PRESSURE_MIN_TEMP ( 0.0 ) ///< Minimum venous pressure sensor temperature. TODO - get from Systems -#define VENOUS_PRESSURE_MAX_TEMP ( 50.0 ) ///< Maximum venous pressure sensor temperature. TODO - get from Systems +#define VENOUS_PRESSURE_MIN_TEMP ( 0.0 ) ///< Minimum venous pressure sensor temperature. +#define VENOUS_PRESSURE_MAX_TEMP ( 80.0 ) ///< Maximum venous pressure sensor temperature. +#define MIN_OCCLUSION_COUNTS ( 2000 ) ///< Minimum occlusion sensor reading for range check. + #define PSI_TO_MMHG ( 51.7149 ) ///< Conversion factor for converting PSI to mmHg. #define VENOUS_PRESSURE_NORMAL_OP 0 ///< Venous pressure status bits indicate normal operation. #define VENOUS_PRESSURE_CMD_MODE 1 ///< Venous pressure status bits indicate sensor in command mode. #define VENOUS_PRESSURE_STALE_DATA 2 ///< Venous pressure status bits indicate data is stale (no new data since last fpga read). #define VENOUS_PRESSURE_DIAG_CONDITION 3 ///< Venous pressure status bits diagnostic condition (alarm). -#define OCCLUSION_THRESHOLD 25000 ///< Threshold above which an occlusion is detected. +#define OCCLUSION_THRESHOLD_OFFSET 10000 ///< Threshold offset. Combined with initial reading after cartridge install, a threshold is derived above which an occlusion is detected. +#define OCCLUSION_CLEAR_THRESHOLD_OFFSET 6000 ///< Threshold offset. Combined with initial reading after cartridge install, a threshold is derived below which an occlusion is cleared. #define CARTRIDGE_LOADED_THRESHOLD 5000 ///< Threshold above which a cartridge is considered loaded. +/// Occlusion sensors maximum pressure reading limit when cartridge is considered loaded. +#define OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX 20000 #define EMPTY_SALINE_BAG_THRESHOLD_MMHG -300.0 ///< Threshold below which the saline bag is considered empty (in mmHg). TODO - get real threshold from Systems static const U32 EMPTY_SALINE_BAG_PERSISTENCE = ( 250 / TASK_GENERAL_INTERVAL ); ///< Time that saline bag looks empty before saying it is empty. -/// Occlusion sensors minimum pressure reading limit when no cartridge is loaded. -#define OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN 2000 -/// Occlusion sensors maximum pressure reading limit when cartridge is considered loaded. -#define OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX 20000 #define PRES_ALARM_PERSISTENCE ( 1 * MS_PER_SECOND ) ///< Alarm persistence period for pressure alarms. @@ -101,14 +106,19 @@ static OVERRIDE_F32_T venousPressure = {0.0, 0.0, 0.0, 0 }; ///< Measured venous pressure. static OVERRIDE_U32_T bloodPumpOcclusion = {0, 0, 0, 0 }; ///< Measured blood pump occlusion pressure. static OVERRIDE_U32_T dialInPumpOcclusion = {0, 0, 0, 0 }; ///< Measured dialysate inlet pump occlusion pressure. -static OVERRIDE_U32_T dialOutPumpOcclusion = {0, 0, 0, 0 }; ///< Measured dialysate outlet pump occlusion pressure. - +static OVERRIDE_U32_T dialOutPumpOcclusion = {0, 0, 0, 0 }; ///< Measured dialysate outlet pump occlusion pressure. + +static U32 bloodPumpOcclusionAfterCartridgeInstall; ///< Measured blood pump occlusion reading taken after cartridge install. +static U32 dialInPumpOcclusionAfterCartridgeInstall; ///< Measured dialysate inlet pump occlusion reading taken after cartridge install. +static U32 dialOutPumpOcclusionAfterCartridgeInstall; ///< Measured dialysate outlet pump occlusion reading taken after cartridge install. + static U32 emptySalineBagCtr = 0; ///< Timer counter for empty bag detection. -static U08 lastVenousPressureReadCtr; ///< Previous venous pressure read count. -static U08 lastBPOcclReadCtr; ///< Previous BP occlusion read count. -static U08 lastDPiOcclReadCtr; ///< Previous DPi occlusion read count. -static U08 lastDPoOcclReadCtr; ///< Previous DPo occlusion read count. +static U08 lastArterialPressureReadCtr; ///< Previous arterial pressure sensor read count. +static U08 lastVenousPressureReadCtr; ///< Previous venous pressure sensor read count. +static U08 lastBPOcclReadCtr; ///< Previous BP occlusion sensor read count. +static U08 lastDPiOcclReadCtr; ///< Previous DPi occlusion sensor read count. +static U08 lastDPoOcclReadCtr; ///< Previous DPo occlusion sensor read count. static U08 lastBPErrorCtr; ///< Previous BP error count. static U08 lastDPIErrorCtr; ///< Previous DPi error count. static U08 lastDPOErrorCtr; ///< Previous DPo error count. @@ -122,7 +132,6 @@ static void checkVenousPressureInRange( void ); static void checkOcclusions( void ); static void publishPresOcclData( void ); -static U32 getPublishPresOcclDataInterval( void ); /*********************************************************************//** * @brief @@ -138,6 +147,7 @@ initPersistentAlarm( ALARM_ID_ARTERIAL_PRESSURE_HIGH, PRES_ALARM_PERSISTENCE, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_VENOUS_PRESSURE_LOW, PRES_ALARM_PERSISTENCE, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_VENOUS_PRESSURE_HIGH, PRES_ALARM_PERSISTENCE, PRES_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_ARTERIAL_PRESSURE_READ_TIMEOUT_ERROR, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_VENOUS_PRESSURE_READ_TIMEOUT_ERROR, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_VENOUS_PRESSURE_SENSOR_TEMP_OUT_OF_RANGE, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_BP_OCCLUSION_READ_TIMEOUT_ERROR, 0, PRES_ALARM_PERSISTENCE ); @@ -146,14 +156,24 @@ initPersistentAlarm( ALARM_ID_HD_BP_OCCLUSION_SENSOR_ERROR, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_DPI_OCCLUSION_SENSOR_ERROR, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_DPO_OCCLUSION_SENSOR_ERROR, 0, PRES_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_ARTERIAL_PRESSURE_OUT_OF_RANGE, 0, PRES_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_VENOUS_PRESSURE_OUT_OF_RANGE, 0, PRES_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_BP_OCCLUSION_OUT_OF_RANGE, 0, PRES_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_DPI_OCCLUSION_OUT_OF_RANGE, 0, PRES_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_DPO_OCCLUSION_OUT_OF_RANGE, 0, PRES_ALARM_PERSISTENCE ); + lastArterialPressureReadCtr = 0; lastVenousPressureReadCtr = 0; lastBPOcclReadCtr = 0; lastDPiOcclReadCtr = 0; lastDPoOcclReadCtr = 0; lastBPErrorCtr = 0; lastDPIErrorCtr = 0; lastDPOErrorCtr = 0; + + bloodPumpOcclusionAfterCartridgeInstall = 0; + dialInPumpOcclusionAfterCartridgeInstall = 0; + dialOutPumpOcclusionAfterCartridgeInstall = 0; } /*********************************************************************//** @@ -226,6 +246,22 @@ return result; } +/*********************************************************************//** + * @brief + * The setOcclusionInstallLevels function sets the occlusion sensor levels + * for an installed cartridge. This function should be called after a new + * cartridge is installed. + * @details Inputs: bloodPumpOcclusion, dialInPumpOcclusion, dialOutPumpOcclusion + * @details Outputs: bloodPumpOcclusionAfterCartridgeInstall, dialInPumpOcclusionAfterCartridgeInstall, dialOutPumpOcclusionAfterCartridgeInstall + * @return none + *************************************************************************/ +void setOcclusionInstallLevels( void ) +{ + bloodPumpOcclusionAfterCartridgeInstall = getMeasuredBloodPumpOcclusion(); + dialInPumpOcclusionAfterCartridgeInstall = getMeasuredDialInPumpOcclusion(); + dialOutPumpOcclusionAfterCartridgeInstall = getMeasuredDialOutPumpOcclusion(); +} + /*********************************************************************//** * @brief * The execPresOccl function executes the pressure and occlusion monitor. @@ -308,7 +344,20 @@ // Convert arterial pressure to mmHg if no fault if ( 0 == artPresAlarm ) { - arterialPressure.data = ARTERIAL_PRESSURE_V_PER_BIT * ( (F32)(artPres) / ( ARTERIAL_PRESSURE_SENSITIVITY * ARTERIAL_PRESSURE_V_BIAS ) ); + U08 artReadCtr = getFPGAArterialPressureReadCounter(); + U08 artErrorCtr = getFPGAArterialPressureErrorCounter(); + + // Check for stale arterial pressure reading + if ( FALSE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_READ_TIMEOUT_ERROR, ( lastArterialPressureReadCtr == artReadCtr || artErrorCtr > 0 ) ) ) + { + arterialPressure.data = ARTERIAL_PRESSURE_V_PER_BIT * ( (F32)(artPres) / ( ARTERIAL_PRESSURE_SENSITIVITY * ARTERIAL_PRESSURE_V_BIAS ) ); + } + else + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_ARTERIAL_PRESSURE_READ_TIMEOUT_ERROR, (U32)artErrorCtr ); + } + // Record arterial pressure sensor read counter for next time around + lastArterialPressureReadCtr = artReadCtr; } else { @@ -322,10 +371,10 @@ { activateAlarmNoData( ALARM_ID_HD_VENOUS_PRESSURE_READ_TIMEOUT_ERROR ); } - // Record venous read counter for next time around + // Record venous pressure sensor read counter for next time around lastVenousPressureReadCtr = venReadCtr; // Convert venous pressure to PSI and then mmHg - venPresPSI = ( (F32)(venPres - VENOUS_PRESSURE_OFFSET) * (VENOUS_PRESSURE_MAX - VENOUS_PRESSURE_MIN) / (F32)VENOUS_PRESSURE_SCALE ) + VENOUS_PRESSURE_MIN; + venPresPSI = ( (F32)(venPres - VENOUS_PRESSURE_OFFSET) * (VENOUS_PRESSURE_MAX_PSI - VENOUS_PRESSURE_MIN_PSI) / (F32)VENOUS_PRESSURE_SCALE ) + VENOUS_PRESSURE_MIN_PSI; // Convert venous pressure from PSI to mmHg if sensor status is normal if ( VENOUS_PRESSURE_NORMAL_OP == venPresStatus ) { @@ -419,13 +468,23 @@ { F32 artPres = getMeasuredArterialPressure(); +#ifndef DISABLE_PRESSURE_CHECKS + // Check arterial pressure is in range + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_ARTERIAL_PRESSURE_OUT_OF_RANGE, + ( artPres > ARTERIAL_PRESSURE_MAX_MMHG || artPres < ARTERIAL_PRESSURE_MIN_MMHG ) ) ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_HD_ARTERIAL_PRESSURE_OUT_OF_RANGE, artPres ); + } +#endif + // Check arterial pressure during treatment mode if ( MODE_TREA == getCurrentOperationMode() ) { F32 artLowLimit = (F32)getTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT ); F32 artHighLimit = (F32)getTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT ); #ifndef DISABLE_PRESSURE_CHECKS + // Check arterial pressure is within user set alarm limits if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_ARTERIAL_PRESSURE_LOW, artPres < artLowLimit ) ) { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_ARTERIAL_PRESSURE_LOW, artPres, artLowLimit ); @@ -461,6 +520,15 @@ { F32 venPres = getMeasuredVenousPressure(); +#ifndef DISABLE_PRESSURE_CHECKS + // Check arterial pressure is in range + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_OUT_OF_RANGE, venPres > VENOUS_PRESSURE_MAX_MMHG ) || + TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_OUT_OF_RANGE, venPres < VENOUS_PRESSURE_MIN_MMHG ) ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_HD_VENOUS_PRESSURE_OUT_OF_RANGE, venPres ); + } +#endif + // Check arterial pressure during treatment mode if ( MODE_TREA == getCurrentOperationMode() ) { @@ -503,46 +571,53 @@ { U32 bpOccl = getMeasuredBloodPumpOcclusion(); U32 diOccl = getMeasuredDialInPumpOcclusion(); - U32 doOccl = getMeasuredDialOutPumpOcclusion(); + U32 doOccl = getMeasuredDialOutPumpOcclusion(); -#ifndef DISABLE_PRESSURE_CHECKS - if ( bpOccl > OCCLUSION_THRESHOLD ) - { +#ifndef DISABLE_PRESSURE_CHECKS + // Range check occlusion sensors + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BP_OCCLUSION_OUT_OF_RANGE, bpOccl < MIN_OCCLUSION_COUNTS ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BP_OCCLUSION_OUT_OF_RANGE, bpOccl ); + } + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_DPI_OCCLUSION_OUT_OF_RANGE, diOccl < MIN_OCCLUSION_COUNTS ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_DPI_OCCLUSION_OUT_OF_RANGE, diOccl ); + } + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_DPO_OCCLUSION_OUT_OF_RANGE, doOccl < MIN_OCCLUSION_COUNTS ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_DPO_OCCLUSION_OUT_OF_RANGE, doOccl ); + } + + // Check for occlusions + if ( bpOccl > ( OCCLUSION_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) ) + { + signalBloodPumpHardStop(); // Stop pump immediately SET_ALARM_WITH_1_U32_DATA( ALARM_ID_OCCLUSION_BLOOD_PUMP, bpOccl ) - // TODO - stop blood pump immediately, ... + } + else if ( bpOccl < ( OCCLUSION_CLEAR_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) ) + { + clearAlarmCondition( ALARM_ID_OCCLUSION_BLOOD_PUMP ); } - if ( diOccl > OCCLUSION_THRESHOLD ) + if ( diOccl > ( OCCLUSION_THRESHOLD_OFFSET + dialInPumpOcclusionAfterCartridgeInstall ) ) { + signalDialInPumpHardStop(); // Stop pump immediately SET_ALARM_WITH_1_U32_DATA( ALARM_ID_OCCLUSION_DIAL_IN_PUMP, diOccl ) - // TODO - stop dialysate inlet pump immediately, ... } - if ( doOccl > OCCLUSION_THRESHOLD ) + else if ( diOccl < ( OCCLUSION_CLEAR_THRESHOLD_OFFSET + dialInPumpOcclusionAfterCartridgeInstall ) ) + { + clearAlarmCondition( ALARM_ID_OCCLUSION_DIAL_IN_PUMP ); + } + if ( doOccl > ( OCCLUSION_THRESHOLD_OFFSET + dialOutPumpOcclusionAfterCartridgeInstall ) ) { + signalDialOutPumpHardStop(); // Stop pump immediately SET_ALARM_WITH_1_U32_DATA( ALARM_ID_OCCLUSION_DIAL_OUT_PUMP, doOccl ) - // TODO - stop dialysate outlet pump immediately, ... - } -#endif -} - -/*********************************************************************//** - * @brief - * The getPublishPresOcclDataInterval function gets the pressure/occlusion data - * publication interval. - * @details Inputs: presOcclDataPublishInterval - * @details Outputs: none - * @return the current pressure/occlusion data publication interval (in task intervals). - *************************************************************************/ -static U32 getPublishPresOcclDataInterval( void ) -{ - U32 result = presOcclDataPublishInterval.data; - - if ( OVERRIDE_KEY == presOcclDataPublishInterval.override ) + } + else if ( doOccl < ( OCCLUSION_CLEAR_THRESHOLD_OFFSET + dialOutPumpOcclusionAfterCartridgeInstall ) ) { - result = presOcclDataPublishInterval.ovData; + clearAlarmCondition( ALARM_ID_OCCLUSION_DIAL_OUT_PUMP ); } - - return result; -} +#endif +} /*********************************************************************//** * @brief @@ -653,7 +728,7 @@ static void publishPresOcclData( void ) { // Publish pressure/occlusion data on interval - if ( ++presOcclDataPublicationTimerCounter >= getPublishPresOcclDataInterval() ) + if ( ++presOcclDataPublicationTimerCounter >= getU32OverrideValue( &presOcclDataPublishInterval ) ) { PRESSURE_OCCLUSION_DATA_T data; @@ -684,17 +759,17 @@ F32 const arterialPressure = getMeasuredArterialPressure(); F32 const venousPressure = getMeasuredVenousPressure(); - if ( ( bpPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( bpPressure >= OCCLUSION_THRESHOLD ) ) + if ( bpPressure > CARTRIDGE_LOADED_THRESHOLD ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BP_OCCLUSION_SELF_TEST_FAILURE, bpPressure ); } - if ( ( dialysateInPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( dialysateInPressure >= OCCLUSION_THRESHOLD ) ) + if ( dialysateInPressure > CARTRIDGE_LOADED_THRESHOLD ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_DIP_OCCLUSION_SELF_TEST_FAILURE, dialysateInPressure ); } - if ( ( dialysateOutPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( dialysateOutPressure >= OCCLUSION_THRESHOLD ) ) + if ( dialysateOutPressure > CARTRIDGE_LOADED_THRESHOLD ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_DOP_OCCLUSION_SELF_TEST_FAILURE, dialysateOutPressure ); } Index: firmware/App/HDCommon.h =================================================================== diff -u -r8466e63f95f65a3ffb18c3af85ac99328e41167b -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -25,7 +25,7 @@ #define HD_VERSION_MAJOR 0 #define HD_VERSION_MINOR 6 #define HD_VERSION_MICRO 5 -#define HD_VERSION_BUILD 16 +#define HD_VERSION_BUILD 19 // ********** development build switches ********** Index: firmware/App/Modes/TreatmentEnd.c =================================================================== diff -u -rcaa09f40b3eea651e4d16c5b057bb336252ae083 -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision caa09f40b3eea651e4d16c5b057bb336252ae083) +++ firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -39,8 +39,10 @@ /// Max time to wait for user to initiate final rinseback. static const U32 TX_END_TIMEOUT_MS = ( ( 15 * 60 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ); // TODO - get time from Systems -/// Maximum time in this mode before blood sitting warning given (in general task intervals). +/// Maximum time in this mode before blood sitting alarm given (in general task intervals). static const U32 MAX_TIME_BLOOD_SITTING = ( ( 5 * SEC_PER_MIN * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ); +/// Maximum time in this mode before blood sitting warning given (in general task intervals). +static const U32 WARN_TIME_BLOOD_SITTING = ( ( 4 * SEC_PER_MIN * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ); // ********** private data ********** @@ -275,6 +277,10 @@ else { // Ensure we do not sit in stopped state for too long + if ( bloodSittingTimerCtr > WARN_TIME_BLOOD_SITTING ) + { + activateAlarmNoData( ALARM_ID_BLOOD_SITTING_WARNING ); + } if ( bloodSittingTimerCtr > MAX_TIME_BLOOD_SITTING ) { // Raise the alarm Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -rb66dabe73c8418e0e4ee358ce787b6d9bd9e128e -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision b66dabe73c8418e0e4ee358ce787b6d9bd9e128e) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -34,16 +34,20 @@ // ********** private definitions ********** -/// Maximum time in this mode before blood sitting warning given (in general task intervals). +/// Maximum time in this mode before blood sitting alarm given (in general task intervals). static const U32 MAX_TIME_BLOOD_SITTING = ( ( 5 * SEC_PER_MIN * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ); +/// Maximum time in this mode before blood sitting warning given (in general task intervals). +static const U32 WARN_TIME_BLOOD_SITTING = ( ( 4 * SEC_PER_MIN * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ); /// Treatment stop status broadcast interval. -static const U32 TREATMENT_STOP_DATA_PUBLISH_INTERVAL = ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); +#define TREATMENT_STOP_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) // ********** private data ********** static TREATMENT_STOP_STATE_T currentTxStopState; ///< Current treatment stop state. static U32 bloodSittingTimerCtr; ///< Timer counter tracks time in this mode while blood is sitting. static U32 stopPublishTimerCtr; ///< Timer counter (in GP task intervals) counts time to next status broadcast. +/// Interval (in task intervals) at which to publish treatment stop sub-mode data to CAN bus. +static OVERRIDE_U32_T treatmentStopPublishInterval = { TREATMENT_STOP_DATA_PUBLISH_INTERVAL, TREATMENT_STOP_DATA_PUBLISH_INTERVAL, TREATMENT_STOP_DATA_PUBLISH_INTERVAL, 0 }; // ********** private function prototypes ********** @@ -77,6 +81,8 @@ *************************************************************************/ void transitionToTreatmentStop( void ) { + initTreatmentStop(); + // Set user alarm recovery actions allowed in this sub-mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); if ( TRUE == getRinsebackCompleted() ) @@ -135,8 +141,12 @@ void execTreatmentStop( void ) { // Ensure we do not sit in stopped state for too long - if ( ++bloodSittingTimerCtr > MAX_TIME_BLOOD_SITTING ) + if ( ++bloodSittingTimerCtr > WARN_TIME_BLOOD_SITTING ) { + activateAlarmNoData( ALARM_ID_BLOOD_SITTING_WARNING ); + } + if ( bloodSittingTimerCtr > MAX_TIME_BLOOD_SITTING ) + { // Activate the alarm activateAlarmNoData( ALARM_ID_TREATMENT_STOPPED_NO_RINSEBACK ); } @@ -224,7 +234,7 @@ *************************************************************************/ static void publishTreatmentStopData( void ) { - if ( ++stopPublishTimerCtr >= TREATMENT_STOP_DATA_PUBLISH_INTERVAL ) + if ( ++stopPublishTimerCtr >= getU32OverrideValue( &treatmentStopPublishInterval ) ) { U32 timeout = MAX_TIME_BLOOD_SITTING / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); U32 countdown = ( bloodSittingTimerCtr >= MAX_TIME_BLOOD_SITTING ? 0 : ( MAX_TIME_BLOOD_SITTING - bloodSittingTimerCtr ) / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); @@ -234,4 +244,57 @@ } } + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetTreatmentStopPublishIntervalOverride function sets the override of the + * treatment stop sub-mode data publication interval. + * @details Inputs: none + * @details Outputs: treatmentStopPublishInterval + * @param ms milliseconds between treatment stop sub-mode broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetTreatmentStopPublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + treatmentStopPublishInterval.ovData = intvl; + treatmentStopPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetTreatmentStopPublishIntervalOverride function resets the override of the + * treatment stop sub-mode data publication interval. + * @details Inputs: none + * @details Outputs: treatmentStopPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetTreatmentStopPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + treatmentStopPublishInterval.override = OVERRIDE_RESET; + treatmentStopPublishInterval.ovData = treatmentStopPublishInterval.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r01470ee3c64ededcc77a4f7378e49013a7ee5602 -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 01470ee3c64ededcc77a4f7378e49013a7ee5602) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -160,6 +160,9 @@ SW_FAULT_ID_HD_FANS_INVALID_STATE, SW_FAULT_ID_HD_INVALID_FAN_SELECTED, // 130 SW_FAULT_ID_HD_INVALID_SWITCH_ID, + SW_FAULT_ID_SAFETY_SHUTDOWN_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_PHANTOM_INTERRUPT, + SW_FAULT_ID_UNEXPECTED_DMA_INTERRUPT, // 130 NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/FPGA.c =================================================================== diff -u -rf5f00981805e265ce63058f650d784f06db4d188 -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision f5f00981805e265ce63058f650d784f06db4d188) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -78,6 +78,9 @@ #define MAX_COMM_ERROR_RETRIES 5 ///< Maximum consecutive FPGA communication error retries. +#define FPGA_INPUT_VOLTAGE_SCALE 3.0 ///< FPGA source and aux voltage. +#define FPGA_PVN_VOLTAGE_SCALE 1.0 ///< FPGA pvn voltage. + #define FPGA_ADC1_AUTO_READ_ENABLE 0x01 ///< Auto-read enable bit for ADC1 control register. #define FPGA_AIRTRAP_LEVEL_LOW_MASK 0x0008 ///< Bit mask for air trap lower level sensor. @@ -100,6 +103,10 @@ #define FPGA_PBO_TEMP_OFFSET 50.0 ///< Used in conversion of PBo temperature reading to deg C. #define FPGA_ALARM_AUDIO_VOLUME_SHIFT 3 ///< Shift alarm audio volume 3 bits to left before writing to register. +#define FPGA_ALARM_AUDIO_DIVIDE_SHIFT 6 ///< Shift alarm audio volume divider 6 bits to left before writing to register. + +#define FPGA_BACKUP_ALARM_AUDIO_CONVERT 0.4 ///< Converts backup (piezo) alarm audio ADC volts to amps. + #define FRONT_DOOR_SWITCH_MASK 0x0010 ///< Front door switch bit mask. Bit 4 of the GPIO register. #define PUMP_TRACK_SWITCH_MASK 0x0020 ///< Pump track switch bit mask. Bit 5 of the GPIO register. @@ -180,13 +187,13 @@ S16 VBVPosition; ///< Reg 360. Encoder position from VBV pinch valve. 0 until PID interface is enabled. S16 VDiPosition; ///< Reg 362. Encoder position from VDi pinch valve. 0 until PID interface is enabled. S16 VDoPosition; ///< Reg 364. Encoder position from VDo pinch valve. 0 until PID interface is enabled. - S16 VSparePosition; ///< Reg 366. Encoder position from VSpare pinch valve. 0 until PID interface is enabled. + S16 fpgaIntVoltage; ///< Reg 366. Internal FPGA Vcc voltage. 3V range over 12 bits (0..4095). U16 valveStatus; ///< Reg 368. Valve status register. U16 VBAPWMTarget; ///< Reg 370. PWM target duty cycle for VBA pinch valve. U16 VBVPWMTarget; ///< Reg 372. PWM target duty cycle for VBV pinch valve. U16 VDiPWMTarget; ///< Reg 374. PWM target duty cycle for VDi pinch valve. U16 VDoPWMTarget; ///< Reg 376. PWM target duty cycle for VDo pinch valve. - U16 VSparePWMTarget; ///< Reg 378. PWM target duty cycle for Vspare pinch valve. + U16 fpgaAuxVoltage; ///< Reg 378. Internal FPGA Vcc Aux voltage. 3V range over 12 bits (0..4095). U08 syringePumpStatus; ///< Reg 380. Syringe pump status register. U08 syringePumpADCReadCounter; ///< Reg 381. Syringe pump ADC read counter. U08 syringePumpADCandDACStatus; ///< Reg 382. Syringe pump ADC and DAC status register. @@ -201,12 +208,13 @@ U16 VBVCurrent; ///< Reg 400. VBV pinch valve current (Register VAUX2) U16 VDoCurrent; ///< Reg 402. VDo pinch valve current (Register VAUX3) U16 VBACurrent; ///< Reg 404. VBA pinch valve current (Register VAUX8) - U16 VDiSpeed; ///< Reg 406. VDi pinch valve current (Register VAUX9) + U16 VDiSpeed; ///< Reg 406. VDi pinch valve current (Register VAUX5) U16 VDoSpeed; ///< Reg 408. VDo pinch valve speed (Register VAUX10) - U16 VDiCurrent; ///< Reg 410. VDi pinch valve current (Register VAUX11) - U16 fpgaBoardTemperature; ///< Reg 412. FPGA board temperature. - U16 VAUX13; ///< Reg 414. Register VAUX13. - U16 fpgaTimerCount_ms; ///< Reg 416. Internal FPGA timer count in ms. + U16 VDiCurrent; ///< Reg 410. VDi pinch valve current (Register VAUX13) + U16 fpgaTemperature; ///< Reg 412. FPGA die temperature (deg C = counts x (503.975/4096) - 273.15). + U16 fpgaVpvn; ///< Reg 414. FPGA pvn voltage. 1V range over 12 bits (0..4095). + U16 fpgaTimerCount_ms; ///< Reg 416. Free running 1ms timer counter. Rolls over at 65535.Internal FPGA timer count in ms. + U16 backupAlarmAudioPeakCurrent; ///< Reg 418. Piezo alarm peak ADC current in previous 10ms. 12 bit unsigned. } FPGA_SENSORS_T; /// Record structure for FPGA continuous priority writes. @@ -1111,29 +1119,89 @@ /*********************************************************************//** * @brief + * The getFPGATemperature function gets the fpga internal die temperature. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current internal FPGA die temperature (in counts) + *************************************************************************/ +U16 getFPGATemperature( void ) +{ + return fpgaSensorReadings.fpgaTemperature; +} + +/*********************************************************************//** + * @brief + * The getFPGAVcc function gets the fpga input voltage. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current FPGA input voltage (in volts) + *************************************************************************/ +F32 getFPGAVcc( void ) +{ + F32 result = (F32)fpgaSensorReadings.fpgaIntVoltage * FPGA_INPUT_VOLTAGE_SCALE / (F32)BITS_12_FULL_SCALE; + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGAVccAux function gets the fpga aux. voltage. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current FPGA aux. voltage (in volts) + *************************************************************************/ +F32 getFPGAVccAux( void ) +{ + F32 result = (F32)fpgaSensorReadings.fpgaAuxVoltage * FPGA_INPUT_VOLTAGE_SCALE / (F32)BITS_12_FULL_SCALE; + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGAVpvn function gets the fpga pvn voltage. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current FPGA pvn voltage (in volts) + *************************************************************************/ +F32 getFPGAVpvn( void ) +{ + F32 result = (F32)fpgaSensorReadings.fpgaVpvn * FPGA_PVN_VOLTAGE_SCALE / (F32)BITS_12_FULL_SCALE; + + return result; +} + +/*********************************************************************//** + * @brief * The setAlarmAudioState function sets the fpga audio control to the given * state and volume. * @details Inputs: none * @details Outputs: alarm audio state and attenuation set - * @param state the state of alarm audio to command: + * @param state the state of alarm audio to command (3..5): * 0 - No alarm tone * 1 - Low priority alarm tone (c e) * 2 - Medium priority alarm tone (c f# c) * 3 - High priority alarm tone (c f# c - c f#) * 4 - Continuous test tone (e) - * @param volumeLevel the level of attenuation to command (0..4) + * @param volumeLevel the level of attenuation to command (0..2): * 4 - 3 dB gain * 3 - 6 dB gain * 2 - 9 dB gain * 1 - 12 dB gain * 0 - 15 dB gain + * @param volumeDivider further attenuation via divider (6..7): + * 0 - Divide by 2 + * 1 - Divide by 4 + * 2 - Divide by 8 + * 3 - Divide by 16 * @return none *************************************************************************/ -void setAlarmAudioState( U32 state, U32 volumeLevel ) +void setAlarmAudioState( U32 state, U32 volumeLevel, U32 volumeDivider ) { U08 audioCmd = (U08)state; audioCmd |= ( (U08)volumeLevel << FPGA_ALARM_AUDIO_VOLUME_SHIFT ); + audioCmd |= ( (U08)volumeDivider << FPGA_ALARM_AUDIO_DIVIDE_SHIFT ); if ( ( state <= NUM_OF_ALARM_PRIORITIES ) && ( volumeLevel <= MAX_ALARM_VOLUME_ATTENUATION ) ) { @@ -1557,6 +1625,32 @@ /*********************************************************************//** * @brief + * The getFPGAArterialPressureReadCounter function gets the latest arterial + * pressure sensor read counter. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last arterial pressure sensor read counter + *************************************************************************/ +U08 getFPGAArterialPressureReadCounter( void ) +{ + return fpgaSensorReadings.adc1SequenceCount; +} + +/*********************************************************************//** + * @brief + * The getFPGAArterialPressureErrorCounter function gets the latest arterial + * pressure sensor error counter. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last arterial pressure sensor error counter + *************************************************************************/ +U08 getFPGAArterialPressureErrorCounter( void ) +{ + return fpgaSensorReadings.adc1ErrorCount; +} + +/*********************************************************************//** + * @brief * The getFPGAVenousPressure function gets the latest venous pressure reading. * The high 2 bits are status bits: 00=ok, 01=cmd mode, 10=stale data, 11=diag * The low 14 bits are data. Zero is at 1638. Values above are positive, @@ -1841,6 +1935,22 @@ /*********************************************************************//** * @brief + * The getFPGABackupAlarmAudioCurrent function gets the latest piezo alarm + * audio current reading. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return Latest piezo alarm audio current reading + *************************************************************************/ +F32 getFPGABackupAlarmAudioCurrent( void ) +{ + U16 adcCnts = fpgaSensorReadings.backupAlarmAudioPeakCurrent; + F32 result = ( ( (F32)adcCnts / (F32)BITS_12_FULL_SCALE ) * FPGA_BACKUP_ALARM_AUDIO_CONVERT ) * (F32)MA_PER_AMP; + + return result; +} + +/*********************************************************************//** + * @brief * The getFPGAAirTrapLevels function gets the latest air trap level sensor * readings. * @details Inputs: fpgaSensorReadings @@ -2318,7 +2428,7 @@ *************************************************************************/ U16 getFPGABoardTemperature( void ) { - return fpgaSensorReadings.fpgaBoardTemperature; + return fpgaSensorReadings.fpgaTemperature; } /*********************************************************************//** Index: firmware/App/Services/FPGA.h =================================================================== diff -u -rf5f00981805e265ce63058f650d784f06db4d188 -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision f5f00981805e265ce63058f650d784f06db4d188) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -51,8 +51,12 @@ void signalFPGATransmitCompleted( void ); void getFPGAVersions( U08 *Id, U08 *Maj, U08 *Min, U08 *Lab ); +U16 getFPGATemperature( void ); +F32 getFPGAVcc( void ); +F32 getFPGAVccAux( void ); +F32 getFPGAVpvn( void ); -void setAlarmAudioState( U32 state, U32 volumeLevel ); +void setAlarmAudioState( U32 state, U32 volumeLevel, U32 volumeDivider ); F32 getFPGABloodFlowSignalStrength( void ); F32 getFPGADialysateFlowSignalStrength( void ); @@ -79,6 +83,8 @@ U08 getFPGADialOutPumpHallSensorStatus( void ); U32 getFPGAArterialPressure( void ); +U08 getFPGAArterialPressureReadCounter( void ); +U08 getFPGAArterialPressureErrorCounter( void ); U16 getFPGAVenousPressure( void ); U16 getFPGAVenousPressureTemperature( void ); U08 getFPGAVenousPressureReadCounter( void ); @@ -112,6 +118,8 @@ void getFPGAAccelMaxes( S16 *xm, S16*ym, S16*zm ); void getFPGAAccelStatus( U16 *cnt, U16 *accelFPGAFaultReg ); +F32 getFPGABackupAlarmAudioCurrent( void ); + void getFPGAAirTrapLevels( BOOL *airAtLower, BOOL *airAtUpper ); void setFPGASensorTest( U08 sensorTest ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -recbd3443e0fbf2c84da7a66761765e74eb41407e -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision ecbd3443e0fbf2c84da7a66761765e74eb41407e) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -327,14 +327,6 @@ { canTransmit( canREG1, lastCANPacketSentChannel, lastCANPacketSent ); } -#ifdef DEBUG_ENABLED - { - char debugStr[100]; - sprintf( debugStr, "SystemComm-HD resend Last Frame. %2d\n", lastCANPacketSentChannel ); - sendDebugData( (U08*)debugStr, strlen(debugStr) ); - sendDebugDataToUI( (U08*)debugStr ); - } -#endif } // We must be only node on CAN bus - nobody is ACKing our transmitted frames else @@ -343,13 +335,6 @@ canXmitRetryCtr = MAX_XMIT_RETRIES; signalCANXmitsCompleted(); // Clear pending xmit flag clearCANXmitBuffers(); // Clear xmit buffers - nothing is going out right now -#ifdef DEBUG_ENABLED - { - char debugStr[100]; - sprintf( debugStr, "SystemComm-HD is only node.\n" ); - sendDebugData( (U08*)debugStr, strlen(debugStr) ); - } -#endif } } } @@ -968,13 +953,6 @@ SET_ALARM_WITH_1_U32_DATA( ALARM_ID_COMM_TOO_MANY_BAD_CRCS, (U32)ALARM_SOURCE_HD ); #endif } -#ifdef DEBUG_ENABLED - { - char debugStr[100]; - sprintf( debugStr, "SystemComm-HD-Bad Msg CRC.\n" ); - sendDebugDataToUI( (U08*)debugStr ); - } -#endif } /*********************************************************************//** @@ -1156,8 +1134,12 @@ break; case MSG_ID_REQUEST_FW_VERSIONS: - handleFWVersionRequest( message ); - handleHDSerialNumberRequest(); + handleFWVersionRequest( message ); + handleHDSerialNumberRequest(); + break; + + case MSG_ID_DG_VERSION: + handleDGVersionResponse( message ); break; case MSG_ID_DG_TEMPERATURE_DATA: @@ -1304,6 +1286,10 @@ handleUIPOSTFinalResult( message ); break; + case MSG_ID_HD_UI_VERSION_INFO_RESPONSE: + handleUIVersionResponse( message ); + break; + case MSG_ID_UI_ACTIVE_ALARMS_LIST_REQUEST: handleUIActiveAlarmsListRequest( message ); break; @@ -1557,6 +1543,14 @@ handleTestDialOutPumpHomeRequest( message ); break; + case MSG_ID_SUPER_CLEAR_ALARMS_CMD: + handleTestSuperClearAlarmsRequest( message ); + break; + + case MSG_ID_HD_SET_OP_MODE_REQUEST: + handleTestSetOpModeRequest( message ); + break; + case MSG_ID_HD_FLUID_LEAK_SEND_INTERVAL_OVERRIDE: handleSetFluidLeakBroadcastIntervalOverrideRequest( message ); break; @@ -1589,6 +1583,10 @@ handleBubbleSelfTestRequest( message ); break; + case MSG_ID_HD_BLOOD_PRIME_VOLUME_OVERRIDE: + handleBloodPrimeVolumeOverrideRequest( message ); + break; + case MSG_ID_HD_SWITCHES_STATUS_OVERRIDE: handleSetSwitchesStatusOverrideRequest( message ); break; @@ -1601,14 +1599,18 @@ handleBatteryRemainingPercentOverrideRequest( message ); break; - case MSG_ID_HD_SET_OP_MODE_REQUEST: - handleTestSetOpModeRequest( message ); + case MSG_ID_HD_BLOOD_PRIME_SAFETY_VOLUME_OVERRIDE: + handleBloodPrimeSafetyVolumeOverrideRequest( message ); break; - case MSG_ID_SUPER_CLEAR_ALARMS_CMD: - handleTestSuperClearAlarmsRequest( message ); + case MSG_ID_HD_RINSEBACK_VOLUME_OVERRIDE: + handleRinsebackVolumeOverrideRequest( message ); break; + case MSG_ID_HD_RINSEBACK_SAFETY_VOLUME_OVERRIDE: + handleRinsebackSafetyVolumeOverrideRequest( message ); + break; + case MSG_ID_HD_SYRINGE_PUMP_SEND_INTERVAL_OVERRIDE: handleTestSyringePumpDataBroadcastIntervalOverrideRequest( message ); break; @@ -1733,6 +1735,50 @@ handleSetHDServiceRecord( message ); break; + case MSG_ID_HD_ALARM_STATUS_PUBLISH_INTERVAL_OVERRIDE: + handleTestAlarmStatusSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_TREATMENT_TIME_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestTreatmentTimeDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_TREATMENT_RANGES_PUBLISH_INTERVAL_OVERRIDE: + handleTestTreatmentRangesSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_TREATMENT_STOP_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestTreatmentStopDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_BLOOD_PRIME_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestBloodPrimeDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_RINSEBACK_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestRinsebackDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_STANDBY_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestStandbyModeDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_OP_MODE_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestOpModeDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_PRE_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestPreTreatmentModeDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestTreatmentModeSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_POST_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestPostTreatmentModeSendIntervalOverrideRequest( message ); + break; + default: // Unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -recbd3443e0fbf2c84da7a66761765e74eb41407e -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision ecbd3443e0fbf2c84da7a66761765e74eb41407e) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -23,6 +23,7 @@ #include "AlarmLamp.h" #include "Battery.h" #include "Buttons.h" +#include "Compatible.h" #include "ConsumableSelfTest.h" #include "Fans.h" #include "FPGA.h" @@ -36,7 +37,8 @@ #include "SystemCommMessages.h" #include "Temperatures.h" #include "TreatmentEnd.h" -#include "TreatmentRecirc.h" +#include "TreatmentRecirc.h" +#include "TreatmentStop.h" #include "Utilities.h" #include "WatchdogMgmt.h" @@ -267,10 +269,58 @@ msg.payload[ 0 ] = cmd; // 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_NOT_REQUIRED ); + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_UI, ACK_REQUIRED ); return result; -} +} + +/*********************************************************************//** + * @brief + * The sendUIVersionRequest function constructs a UI version request msg + * to the UI and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: UI version request msg constructed and queued. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendUIVersionRequest( void ) +{ + BOOL result; + MESSAGE_T msg; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_UI_VERSION_INFO_REQUEST; + msg.hdr.payloadLen = 0; + + // 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 sendDGPOSTResultRequest function constructs a POST result request msg + * to the DG and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: DG POST result request msg constructed and queued. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendDGPOSTResultRequest( void ) +{ + BOOL result; + MESSAGE_T msg; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_DG_POST_RESULT_REQUEST; + msg.hdr.payloadLen = 0; + + // 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 @@ -3002,24 +3052,13 @@ *************************************************************************/ void handleUIAlarmSilenceRequest( MESSAGE_T *message ) { -#ifndef TEMP_UI_ALARM_SILENCE_FIX if ( message->hdr.payloadLen == sizeof( U32 ) ) -#else - if ( message->hdr.payloadLen == sizeof( U08 ) ) -#endif { U08 *payloadPtr = message->payload; -#ifndef TEMP_UI_ALARM_SILENCE_FIX U32 cmd; memcpy( &cmd, payloadPtr, sizeof( U32 ) ); signalAlarmSilence( (ALARM_SILENCE_CMD_T)cmd ); -#else - U08 cmd; - - memcpy( &cmd, payloadPtr, sizeof( U08 ) ); - signalAlarmSilence( (ALARM_SILENCE_CMD_T)cmd ); -#endif } else { @@ -3132,8 +3171,7 @@ BOOL passed; memcpy( &passed, payloadPtr, sizeof( BOOL ) ); - - // TODO - handle DG POST final result + signalDGPOSTFinalResult( passed ); } else { @@ -3999,11 +4037,15 @@ HD_VERSIONS_T payload; U08 *payloadPtr = msg.payload; - // Populate payload + // Get UI version data from this request msg and have it recorded + handleUIVersionResponse( message ); + + // Populate payload for response payload.major = (U08)HD_VERSION_MAJOR; payload.minor = (U08)HD_VERSION_MINOR; payload.micro = (U08)HD_VERSION_MICRO; payload.build = (U16)HD_VERSION_BUILD; + payload.compatibilityRev = (U32)SW_COMPATIBILITY_REV; getFPGAVersions( &payload.fpgaId, &payload.fpgaMajor, &payload.fpgaMinor, &payload.fpgaLab ); // Create a message record @@ -4020,6 +4062,27 @@ /*********************************************************************//** * @brief + * The handleUIVersionResponse function handles a response to request for + * UI version information. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle. + * @return none + *************************************************************************/ +void handleUIVersionResponse( MESSAGE_T *message ) +{ + // Get UI version data and have it recorded + if ( sizeof(UI_VERSIONS_T) == message->hdr.payloadLen ) + { + UI_VERSIONS_T uiVersion; + + memcpy( &uiVersion, &message->payload[0], sizeof(UI_VERSIONS_T) ); + signalUIVersion( uiVersion ); + } +} + +/*********************************************************************//** + * @brief * The handleHDSerialNumberRequest function handles a request for HD serial * number request. * @details Inputs: none @@ -4051,6 +4114,26 @@ /*********************************************************************//** * @brief + * The handleDGVersionResponse function handles a response for DG f/w version. + * @details Inputs: none + * @details Outputs: message handled, DG version info recorded. + * @param message a pointer to the message to handle. + * @return none + *************************************************************************/ +void handleDGVersionResponse( MESSAGE_T *message ) +{ + // Get DG version data from this response msg and have it recorded + if ( sizeof(DG_VERSIONS_T) == message->hdr.payloadLen ) + { + DG_VERSIONS_T dgVersion; + + memcpy( &dgVersion, &message->payload[0], sizeof(DG_VERSIONS_T) ); + signalDGVersion( dgVersion ); + } +} + +/*********************************************************************//** + * @brief * The handleHDServiceScheduleRequest function handles a request for HD * service information. * @details Inputs: none @@ -6162,6 +6245,134 @@ /*********************************************************************//** * @brief + * The handleBloodPrimeVolumeOverrideRequest function handles a request to + * override the calculated blood prime volume (in mL). + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleBloodPrimeVolumeOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetBloodPrimeVolumeOverride( payload.state.f32 ); + } + else + { + result = testResetBloodPrimeVolumeOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleBloodPrimeSafetyVolumeOverrideRequest function handles a request to + * override the calculated safety blood prime volume (in mL). + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleBloodPrimeSafetyVolumeOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetBloodPrimeSafetyVolumeOverride( payload.state.f32 ); + } + else + { + result = testResetBloodPrimeSafetyVolumeOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleRinsebackVolumeOverrideRequest function handles a request to + * override the calculated rinseback volume (in mL). + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleRinsebackVolumeOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetRinsebackVolumeOverride( payload.state.f32 ); + } + else + { + result = testResetRinsebackVolumeOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleRinsebackSafetyVolumeOverrideRequest function handles a request to + * override the calculated safety rinseback volume (in mL). + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleRinsebackSafetyVolumeOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetRinsebackSafetyVolumeOverride( payload.state.f32 ); + } + else + { + result = testResetRinsebackSafetyVolumeOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The handleHDSoftwareResetRequest function handles a request to reset the * HD firmware processor. * @details Inputs: none @@ -6895,6 +7106,358 @@ /*********************************************************************//** * @brief + * The handleTestAlarmStatusSendIntervalOverrideRequest function handles a + * request to override the HD alarm status broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestAlarmStatusSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetAlarmStatusPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetAlarmStatusPublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestTreatmentTimeDataSendIntervalOverrideRequest function handles a + * request to override the HD treatment time data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestTreatmentTimeDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetTreatmentTimePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetTreatmentTimePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestTreatmentRangesSendIntervalOverrideRequest function handles a + * request to override the HD treatment param ranges broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestTreatmentRangesSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetTreatmentParamRangesPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetTreatmentParamRangesPublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestTreatmentStopDataSendIntervalOverrideRequest function handles a + * request to override the HD treatment stop sub-mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestTreatmentStopDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetTreatmentStopPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetTreatmentStopPublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestBloodPrimeDataSendIntervalOverrideRequest function handles a + * request to override the HD blood prime sub-mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestBloodPrimeDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetBloodPrimePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetBloodPrimePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestRinsebackDataSendIntervalOverrideRequest function handles a + * request to override the HD rinseback sub-mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestRinsebackDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetRinsebackPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetRinsebackPublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestStandbyModeDataSendIntervalOverrideRequest function handles a + * request to override the HD standby mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestStandbyModeDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetStandbyModePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetStandbyModePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestOpModeDataSendIntervalOverrideRequest function handles a + * request to override the HD operation mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestOpModeDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetOpModePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetOpModePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestPreTreatmentModeDataSendIntervalOverrideRequest function handles a + * request to override the HD pre-treatment mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestPreTreatmentModeDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetPreTreatmentModePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetPreTreatmentModePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestTreatmentModeSendIntervalOverrideRequest function handles a + * request to override the HD treatment mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestTreatmentModeSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetTreatmentStatePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetTreatmentStatePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestPostTreatmentModeSendIntervalOverrideRequest function handles a + * request to override the HD post-treatment mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestPostTreatmentModeSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetPostTreatmentModePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetPostTreatmentModePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The handleTestAlarmAudioVolumeOverrideRequest function handles a * request to override the alarm audio volume level. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rb66dabe73c8418e0e4ee358ce787b6d9bd9e128e -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision b66dabe73c8418e0e4ee358ce787b6d9bd9e128e) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -30,7 +30,8 @@ #include "Fans.h" #include "FluidLeak.h" #include "HDCommon.h" -#include "Prime.h" +#include "Prime.h" +#include "ModeInitPOST.h" #include "ModePostTreat.h" #include "ModePreTreat.h" #include "ModeStandby.h" @@ -70,6 +71,12 @@ // MSG_ID_REQUEST_FW_VERSIONS void handleFWVersionRequest( MESSAGE_T *message ); +// 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 void handleHDSerialNumberRequest( void ); @@ -79,6 +86,12 @@ // MSG_ID_REQUEST_HD_USAGE_INFO void handleHDUsageInfoRequest( MESSAGE_T *message ); +// MSG_ID_DG_VERSION +void handleDGVersionResponse( MESSAGE_T *message ); + +// MSG_ID_HD_DG_POST_RESULT_REQUEST +BOOL sendDGPOSTResultRequest( void ); + // MSG_ID_OFF_BUTTON_PRESS BOOL sendOffButtonMsgToUI( U08 cmd ); void handleOffButtonConfirmMsgFromUI( MESSAGE_T *message ); @@ -180,8 +193,8 @@ BOOL sendTreatmentPeriodicDataToUI( TREATMENT_LOG_DATA_PERIODIC_T * periodDataPtr ); // MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_REQUEST -void handleChangeBloodDialysateRateChangeRequest( MESSAGE_T *message ); - +void handleChangeBloodDialysateRateChangeRequest( MESSAGE_T *message ); + // MSG_ID_USER_SALINE_BOLUS_REQUEST void handleSalineBolusRequest( MESSAGE_T *message ); @@ -690,6 +703,18 @@ // MSG_ID_HD_BUBBLE_SELF_TEST_REQUEST void handleBubbleSelfTestRequest( MESSAGE_T *message ); +// MSG_ID_HD_BLOOD_PRIME_VOLUME_OVERRIDE +void handleBloodPrimeVolumeOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_BLOOD_PRIME_SAFETY_VOLUME_OVERRIDE +void handleBloodPrimeSafetyVolumeOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_RINSEBACK_VOLUME_OVERRIDE +void handleRinsebackVolumeOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_RINSEBACK_SAFETY_VOLUME_OVERRIDE +void handleRinsebackSafetyVolumeOverrideRequest( MESSAGE_T *message ); + // MSG_ID_HD_SWITCHES_STATUS_OVERRIDE void handleSetSwitchesStatusOverrideRequest( MESSAGE_T *message ); @@ -789,6 +814,39 @@ // MSG_ID_HD_SYRINGE_PUMP_ADC_READ_COUNTER_OVERRIDE void handleTestSyringePumpADCReadCtrOverrideRequest( MESSAGE_T *message ); +// MSG_ID_HD_ALARM_STATUS_PUBLISH_INTERVAL_OVERRIDE +void handleTestAlarmStatusSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_TREATMENT_TIME_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestTreatmentTimeDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_TREATMENT_RANGES_PUBLISH_INTERVAL_OVERRIDE +void handleTestTreatmentRangesSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_TREATMENT_STOP_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestTreatmentStopDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_BLOOD_PRIME_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestBloodPrimeDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_RINSEBACK_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestRinsebackDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_STANDBY_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestStandbyModeDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_OP_MODE_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestOpModeDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_PRE_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestPreTreatmentModeDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestTreatmentModeSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_POST_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestPostTreatmentModeSendIntervalOverrideRequest( MESSAGE_T *message ); + // MSG_ID_HD_TEMPERATURES_VALUE_OVERRIDE void handleTestTemperaturesValueOverrideRequest( MESSAGE_T * message ); Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -rb66dabe73c8418e0e4ee358ce787b6d9bd9e128e -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision b66dabe73c8418e0e4ee358ce787b6d9bd9e128e) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -102,7 +102,7 @@ // Control dialysate inlet pump execDialInFlowController(); - // Control dialysate outlet pump + // Control dialysate outlet pump (keep after call to BP and DPi controllers) execDialOutFlowController(); // Monitor/Control fans