Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r93550c96ccf2f443e0ed269cd3fe5e30667be922 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 93550c96ccf2f443e0ed269cd3fe5e30667be922) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -1208,9 +1208,9 @@ F32 measMotorSpeed = getMeasuredBloodPumpSpeed(); F32 measMCMotorSpeed = getMeasuredBloodPumpMCSpeed(); - // Check for pump running while commanded off + // Check for pump running while commanded off and not trigger alarm when AC power lost condition if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BLOOD_PUMP_OFF_CHECK, - ( 0 == targetBloodFlowRate ) && ( fabs( measMotorSpeed ) > BP_MAX_MOTOR_SPEED_WHILE_OFF_RPM ) ) ) ) + ( 0 == targetBloodFlowRate ) && ( fabs( measMotorSpeed ) > BP_MAX_MOTOR_SPEED_WHILE_OFF_RPM ) && ( TRUE != getCPLDACPowerLossDetected() ) ) ) ) { #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_SPEED_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r3c0614e16047ada1ea30c9e7f883f78d98b363e3 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 3c0614e16047ada1ea30c9e7f883f78d98b363e3) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -102,6 +102,7 @@ #define OCCLUSION_THRESHOLD_OFFSET 5500 ///< Threshold offset. Combined with initial reading after cartridge install, a threshold is derived above which an occlusion is detected. #define OCCLUSION_CLEAR_THRESHOLD_OFFSET 5000 ///< Threshold offset. Combined with initial reading after cartridge install, a threshold is derived below which an occlusion is cleared. +#define PARTIAL_OCCLUSION_THRESHOLD_OFFSET 1000 ///< Threshold offset. Combined with during treatment occlusion reading, a threshold is derived above which a partial occlusion is detected. #define CARTRIDGE_LOADED_THRESHOLD 5000 ///< Threshold above which a cartridge is considered loaded. #define MIN_OCCLUSION_COUNTS 2000 ///< Minimum occlusion sensor reading for range check. @@ -127,6 +128,11 @@ /// Measured venous pressure is filtered w/ 1 second moving average for inline pressure and unfiltered for occlusion detection. #define SIZE_OF_SHORT_VEN_ROLLING_AVG ( ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) * 1 ) +/// Measured blood pump occlusion is filtered w/ 10 second moving average for partial occlusions check. +#define SIZE_OF_BLOODPUMP_OCCL_ROLLING_AVG ( ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) * 10 ) +/// Interval (15 minutes in task time) at which the partial blood pump occlusion baseline update happens during dialysis state. +#define PERIODIC_PARTIAL_BLOODPUMP_OCCL_BASELINE_UPDATE ( ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) * SEC_PER_MIN * 15 ) + #define DATA_PUBLISH_COUNTER_START_COUNT 5 ///< Data publish counter start count. #define SHIFT_14_BITS 14 ///< Shift 14 bits. @@ -179,14 +185,23 @@ static OVERRIDE_F32_T shortFilteredArterialPressure = { 0.0, 0.0, 0.0, 0 }; ///< Measured arterial pressure after short (1 s) filter. static F32 longFilteredVenousPressure; ///< Measured venous pressure after long (10 s) filter. static OVERRIDE_F32_T shortFilteredVenousPressure = { 0.0, 0.0, 0.0, 0 }; ///< Measured venous pressure after short (1 s) filter. -static STABILIZATION_PERIODS_T pressureStabilizeTime; ///< Pressure stabilization time based on system events such as airpump, treatment param changes etc., +static OVERRIDE_F32_T filteredBloodPumpOccl = { 0.0, 0.0, 0.0, 0 }; ///< Measured blood pump occlusion after 10s filter. +static STABILIZATION_PERIODS_T pressureStabilizeTime; ///< Pressure stabilization time based on system events such as airpump, treatment param changes etc., static BOOL resetFillExemptPeriod; ///< Flag to reset the exempt period after defined time expire. static BOOL lowVenousPressureExemptCheck; ///< low venous pressure exempt check flag based on the air trap valve status static U32 bloodPumpOcclusionAfterCartridgeInstall; ///< Measured blood pump occlusion reading taken after cartridge install. +static OVERRIDE_F32_T bloodPumpPartialOcclusionBaseline = { 0.0, 0.0, 0.0, 0 }; ///< Measured filtered blood pump occlusion baseline taken during treatment. +static BOOL partialBloodPumpOcclBaselineUpdate; ///< Flag to update partial occlusion baseline in events such as start of treatment,resume from partial BP occlusion alarm occurrence. +static U32 partialBloodPumpOcclBaselineUpdateTimerCounter = 0; ///< Used to update partial occlusion base line periodically during dialysis. static U32 emptySalineBagCtr = 0; ///< Timer counter for empty bag detection. +static U32 bloodPumpOcclReadings[ SIZE_OF_BLOODPUMP_OCCL_ROLLING_AVG ]; ///< Holds blood pump occlusion rolling average. +static U32 bloodPumpOcclReadingsIdx = 0; ///< Index for next sample in rolling average array. +static U32 bloodPumpOcclReadingsTotal = 0; ///< Rolling total - used to calc average. +static U32 bloodPumpOcclReadingsCount = 0; ///< Number of samples in blood pump occl rolling average buffer. + static F32 artPressureReadingsLong[ SIZE_OF_LONG_ART_ROLLING_AVG ]; ///< Holds flow samples for long arterial pressure rolling average. static U32 artPressureReadingsLongIdx = 0; ///< Index for next sample in rolling average array. static F32 artPressureReadingsLongTotal = 0.0; ///< Rolling total - used to calc average. @@ -224,6 +239,8 @@ static void publishPresOcclData( void ); static void determineArtVenPressureLimits( void ); static void filterInlinePressureReadings( F32 artPres, F32 venPres ); +static void setOcclusionBaselineDuringTreatement( void ); +static void filterBloodPumpOcclReadings( U32 bloodPumpOccl ); /*********************************************************************//** * @brief @@ -266,10 +283,14 @@ shortFilteredArterialPressure.data = 0.0F; longFilteredVenousPressure = 0.0F; shortFilteredVenousPressure.data = 0.0F; + filteredBloodPumpOccl.data = 0.0F; + bloodPumpPartialOcclusionBaseline.data = 0.0F; + partialBloodPumpOcclBaselineUpdateTimerCounter = 0; presOcclDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; presOcclState = PRESSURE_WAIT_FOR_POST_STATE; presOcclPostState = PRESSURE_SELF_TEST_STATE_START; bloodPumpOcclusionAfterCartridgeInstall = 0; + partialBloodPumpOcclBaselineUpdate = FALSE; pressureStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; resetFillExemptPeriod = TRUE; lowVenousPressureExemptCheck = TRUE; @@ -394,6 +415,22 @@ /*********************************************************************//** * @brief + * The setOcclusionBaselineDuringTreatement function sets the partial occlusion sensor level + * during treatment. This function called at start of treatment, periodic interval during + * treatment. + * @details Inputs: filteredBloodPumpOccl + * @details Outputs: bloodPumpPartialOcclusionBaseline + * @return none + *************************************************************************/ +static void setOcclusionBaselineDuringTreatement( void ) +{ + bloodPumpPartialOcclusionBaseline.data = getFilteredBloodPumpOccl(); + partialBloodPumpOcclBaselineUpdateTimerCounter = 0; + SEND_EVENT_WITH_2_F32_DATA( HD_EVENT_PARTIAL_OCCLUSION_BASELINE, getBloodPumpPartialOcclBaseline(), PARTIAL_OCCLUSION_THRESHOLD_OFFSET ); +} + +/*********************************************************************//** + * @brief * The setPressureLimitsToOuterBounds function sets the min/max pressure * limits for arterial and venous pressure to their outer boundaries. * @details Inputs: none @@ -526,6 +563,18 @@ /*********************************************************************//** * @brief + * The signalBloodPumpPressureOcclBaseline function sets the flag. + * @details Inputs: partialBloodPumpOcclBaselineUpdate + * @details Outputs: partialBloodPumpOcclBaselineUpdate + * @return none + *************************************************************************/ +void signalBloodPumpPressureOcclBaseline( void ) +{ + partialBloodPumpOcclBaselineUpdate = TRUE; +} + +/*********************************************************************//** + * @brief * The execPresOccl function executes the pressure and occlusion monitor. * @details Inputs: presOcclState * @details Outputs: presOcclState @@ -627,6 +676,12 @@ currPresLimitsState = PRESSURE_LIMITS_STATE_OFF; } + // Increment the partial occlusion baseline update counter only in Dialysis state + if ( ( MODE_TREA == currMode ) && ( currTxState == TREATMENT_DIALYSIS_STATE ) ) + { + partialBloodPumpOcclBaselineUpdateTimerCounter++; + } + switch ( currPresLimitsState ) { case PRESSURE_LIMITS_STATE_OFF: @@ -686,6 +741,13 @@ stabilizationStartTimeMs = getMSTimerCount(); currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION_2; pressureStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + + //Update partial blood pump occlusion baseline only in dialysis state + if ( ( TRUE == partialBloodPumpOcclBaselineUpdate ) && ( TREATMENT_DIALYSIS_STATE == currTxState ) ) + { + partialBloodPumpOcclBaselineUpdate = FALSE; + setOcclusionBaselineDuringTreatement(); + } } break; @@ -718,6 +780,12 @@ // Reset to normal period as default. pressureStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; } + else if ( ( currTxState == TREATMENT_DIALYSIS_STATE ) && + ( partialBloodPumpOcclBaselineUpdateTimerCounter >= PERIODIC_PARTIAL_BLOODPUMP_OCCL_BASELINE_UPDATE ) ) + { + //Periodical Update of partial blood pump occlusion baseline + setOcclusionBaselineDuringTreatement(); + } break; case PRESSURE_LIMITS_STATE_STABLE: @@ -736,6 +804,12 @@ pressureStabilizeTime = STABILIZATION_PERIOD_OFF; currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION_2; } + else if ( ( currTxState == TREATMENT_DIALYSIS_STATE ) && + ( partialBloodPumpOcclBaselineUpdateTimerCounter >= PERIODIC_PARTIAL_BLOODPUMP_OCCL_BASELINE_UPDATE ) ) + { + //Periodical Update of partial blood pump occlusion baseline + setOcclusionBaselineDuringTreatement(); + } break; default: @@ -812,6 +886,9 @@ // Record occlusion sensor readings bloodPumpOcclusion.data = (U32)getFPGABloodPumpOcclusion(); + + // Filter blood pump occlusion readings + filterBloodPumpOcclReadings( getMeasuredBloodPumpOcclusion() ); } /*********************************************************************//** @@ -965,6 +1042,7 @@ static void checkOcclusions( void ) { U32 bpOccl = getMeasuredBloodPumpOcclusion(); + F32 filteredBpOccl = getFilteredBloodPumpOccl(); BOOL outOfRange = ( bpOccl < MIN_OCCLUSION_COUNTS ? TRUE : FALSE ); #ifndef _RELEASE_ @@ -983,6 +1061,7 @@ U32 hdSubMode = getCurrentSubMode(); BOOL ptxMode = ( MODE_PRET == hdMode && hdSubMode > HD_PRE_TREATMENT_CART_INSTALL_STATE ? TRUE : FALSE ); BOOL txModeRecirc = ( ( MODE_TREA == hdMode ) && ( TREATMENT_RECIRC_STATE == getTreatmentState() ) ? TRUE : FALSE ); + BOOL txModeDialysis = ( ( MODE_TREA == hdMode ) && ( TREATMENT_DIALYSIS_STATE == getTreatmentState() ) ? TRUE : FALSE ); // Range check occlusion sensor (OB) if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BP_OCCLUSION_OUT_OF_RANGE, outOfRange ) ) @@ -1026,6 +1105,21 @@ clearAlarmCondition( ALARM_ID_HD_OCCLUSION_BLOOD_PUMP ); } + // Partial Occlusion check during treatment dialysis state and pressure stable or stabilization_2 state + if ( ( TRUE == txModeDialysis ) && + ( ( PRESSURE_LIMITS_STATE_STABLE == currPresLimitsState ) || + ( PRESSURE_LIMITS_STATE_STABILIZATION_2 == currPresLimitsState ) ) ) + { + // Check for partial occlusion + if ( filteredBpOccl > ( PARTIAL_OCCLUSION_THRESHOLD_OFFSET + getBloodPumpPartialOcclBaseline() ) ) + { + signalBloodPumpHardStop(); // Stop pump immediately + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PARTIAL_OCCLUSION_BLOOD_PUMP, filteredBpOccl, PARTIAL_OCCLUSION_THRESHOLD_OFFSET + getBloodPumpPartialOcclBaseline() ) + // Update partial occlusion baseline + signalBloodPumpPressureOcclBaseline(); + } + } + // Check for venous occlusion #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_VENOUS_PRESSURE_CHECK ) != SW_CONFIG_ENABLE_VALUE ) @@ -1131,6 +1225,30 @@ /*********************************************************************//** * @brief + * The getFilteredBloodPumpOccl function gets the measured filtered blood pump occlusion. + * @details Inputs: filteredBloodPumpOccl + * @details Outputs: none + * @return the current filtered blood pump occlusion. + *************************************************************************/ +F32 getFilteredBloodPumpOccl( void ) +{ + return getF32OverrideValue( &filteredBloodPumpOccl ); +} + +/*********************************************************************//** + * @brief + * The getBloodPumpPartialOcclBaseline function gets the blood pump partial occlusion baseline. + * @details Inputs: bloodPumpPartialOcclusionBaseline + * @details Outputs: none + * @return the blood pump occlusion base line. + *************************************************************************/ +F32 getBloodPumpPartialOcclBaseline( void ) +{ + return getF32OverrideValue( &bloodPumpPartialOcclusionBaseline ); +} + +/*********************************************************************//** + * @brief * The getFilteredVenousPressure function gets the measured filtered venous pressure. * @details Inputs: shortFilteredVenousPressure * @details Outputs: none @@ -1236,6 +1354,29 @@ /*********************************************************************//** * @brief + * The filterBloodPumpOcclReadings function adds a new blood pump occlusion + * sample to the filters. + * @details Inputs: none + * @details Outputs: bloodPumpOcclReadings[], bloodPumpOcclReadingsIdx, bloodPumpOcclReadingsTotal, bloodPumpOcclReadingsCount, + * filteredBloodPumpOccl + * @param bloodPumpOccl newest blood pump occlusion sample to add to filters + * @return none + *************************************************************************/ +static void filterBloodPumpOcclReadings( U32 bloodPumpOccl ) +{ + if ( bloodPumpOcclReadingsCount >= SIZE_OF_BLOODPUMP_OCCL_ROLLING_AVG ) + { + bloodPumpOcclReadingsTotal -= bloodPumpOcclReadings[ bloodPumpOcclReadingsIdx ]; + } + bloodPumpOcclReadings[ bloodPumpOcclReadingsIdx ] = bloodPumpOccl; + bloodPumpOcclReadingsTotal += bloodPumpOccl; + bloodPumpOcclReadingsIdx = INC_WRAP( bloodPumpOcclReadingsIdx, 0, SIZE_OF_BLOODPUMP_OCCL_ROLLING_AVG - 1 ); + bloodPumpOcclReadingsCount = INC_CAP( bloodPumpOcclReadingsCount, SIZE_OF_BLOODPUMP_OCCL_ROLLING_AVG ); + filteredBloodPumpOccl.data = (F32)bloodPumpOcclReadingsTotal / (F32)bloodPumpOcclReadingsCount; +} + +/*********************************************************************//** + * @brief * The publishPresOcclData function publishes pressure/occlusion data at the * set interval. * @details Inputs: latest pressure and occlusion readings @@ -1249,16 +1390,18 @@ { PRESSURE_OCCLUSION_DATA_T data; - data.arterialPressure = getFilteredArterialPressure(); - data.venousPressure = getFilteredVenousPressure(); - data.bldPumpOcclusion = getMeasuredBloodPumpOcclusion(); - data.presLimitState = currPresLimitsState; - data.artMinLimit = currentArterialMinLimit; - data.artMaxLimit = currentArterialMaxLimit; - data.venMinLimit = currentVenousMinLimit; - data.venMaxLimit = currentVenousMaxLimit; - data.arterialLongFilterPres = longFilteredArterialPressure; - data.venousLongFilterPres = longFilteredVenousPressure; + data.arterialPressure = getFilteredArterialPressure(); + data.venousPressure = getFilteredVenousPressure(); + data.bldPumpOcclusion = getMeasuredBloodPumpOcclusion(); + data.presLimitState = currPresLimitsState; + data.artMinLimit = currentArterialMinLimit; + data.artMaxLimit = currentArterialMaxLimit; + data.venMinLimit = currentVenousMinLimit; + data.venMaxLimit = currentVenousMaxLimit; + data.arterialLongFilterPres = longFilteredArterialPressure; + data.venousLongFilterPres = longFilteredVenousPressure; + data.bldPumpOcclusionLongFilter = getFilteredBloodPumpOccl(); + data.partialOcclBaseline = getBloodPumpPartialOcclBaseline(); broadcastData( MSG_ID_PRESSURE_OCCLUSION_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( PRESSURE_OCCLUSION_DATA_T ) ); presOcclDataPublicationTimerCounter = 0; @@ -1581,4 +1724,94 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetFilteredBloodPumpOcclusionOverride function overrides the measured + * filtered blood pump occlusion pressure. + * @details Inputs: none + * @details Outputs: filteredBloodPumpOccl + * @param value override measured filtered blood pump occlusion pressure with + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetFilteredBloodPumpOcclusionOverride( F32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + filteredBloodPumpOccl.ovData = value; + filteredBloodPumpOccl.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetFilteredBloodPumpOcclusionOverride function resets the override of the + * measured filtered blood pump occlusion pressure. + * @details Inputs: none + * @details Outputs: filteredBloodPumpOccl + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetFilteredBloodPumpOcclusionOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + filteredBloodPumpOccl.override = OVERRIDE_RESET; + filteredBloodPumpOccl.ovData = filteredBloodPumpOccl.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetBloodPumpPartialOcclusionOverride function overrides the + * blood pump partial occlusion pressure baseline. + * @details Inputs: none + * @details Outputs: bloodPumpPartialOcclusionBaseline + * @param value override blood pump occlusion baseline + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBloodPumpPartialOcclusionBaselineOverride( F32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodPumpPartialOcclusionBaseline.ovData = value; + bloodPumpPartialOcclusionBaseline.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetBloodPumpPartialOcclusionBaselineOverride function resets the override of the + * blood pump partial occlusion baseline. + * @details Inputs: none + * @details Outputs: bloodPumpPartialOcclusionBaseline + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBloodPumpPartialOcclusionBaselineOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodPumpPartialOcclusionBaseline.override = OVERRIDE_RESET; + bloodPumpPartialOcclusionBaseline.ovData = bloodPumpPartialOcclusionBaseline.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Controllers/PresOccl.h =================================================================== diff -u -r3c0614e16047ada1ea30c9e7f883f78d98b363e3 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 3c0614e16047ada1ea30c9e7f883f78d98b363e3) +++ firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -74,6 +74,8 @@ S32 venMaxLimit; ///< Current venous maximum pressure limit (mmHg) F32 arterialLongFilterPres; ///< Latest long filtered arterial pressure (mmHg) F32 venousLongFilterPres; ///< Latest long filtered venous pressure (mmHg) + F32 bldPumpOcclusionLongFilter; ///< Latest long filtered BP occlusion (no units) + F32 partialOcclBaseline; ///< PartialBloodPump Occlusion baseline (no units) } PRESSURE_OCCLUSION_DATA_T; // ********** public function prototypes ********** @@ -99,7 +101,9 @@ F32 getFilteredVenousPressure( void ); F32 getLongFilteredVenousPressure( void ); U32 getMeasuredBloodPumpOcclusion( void ); - +F32 getFilteredBloodPumpOccl( void ); +void signalBloodPumpPressureOcclBaseline( void ); +F32 getBloodPumpPartialOcclBaseline( void ); BOOL isCartridgeLoaded( void ); BOOL isCartridgeUnloaded( void ); BOOL isSalineBagEmpty( void ); @@ -116,6 +120,10 @@ BOOL testResetVenousPressureOverride( BOOL filtered ); BOOL testSetBloodPumpOcclusionOverride( U32 value ); BOOL testResetBloodPumpOcclusionOverride( void ); +BOOL testSetFilteredBloodPumpOcclusionOverride( F32 value ); +BOOL testResetFilteredBloodPumpOcclusionOverride( void ); +BOOL testSetBloodPumpPartialOcclusionBaselineOverride( F32 value ); +BOOL testResetBloodPumpPartialOcclusionBaselineOverride( void ); /**@}*/ Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r3741b7bb1a2e35a0b3618a9212f277f1937ee75f -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 3741b7bb1a2e35a0b3618a9212f277f1937ee75f) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -92,7 +92,7 @@ static void clearCurrentCleaningModeStatus( void ); static void handleChemFlushSampleCollection( void ); static void handleROPermeateSampleCollection( void ); -static BOOL isDGDisinfectValid( void ); +static BOOL isDGDisinfectValid( REQUEST_REJECT_REASON_CODE_T* rejReason ); static BOOL haveHDDGServicesBeenExpired( REQUEST_REJECT_REASON_CODE_T* rejReason ); /*********************************************************************//** @@ -273,26 +273,17 @@ { rejReason = REQUEST_REJECT_REASON_BATTERY_IS_NOT_CHARGED; } -#ifndef _RELEASE_ - else if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SERVICE_AND_DISINFECT_CHECK ) != SW_CONFIG_ENABLE_VALUE ) -#endif + + if ( getTestConfigStatus( TEST_CONFIG_SKIP_DISINFECT_AND_SERVICE_TX_BLOCKERS ) != TRUE ) { - if ( getTestConfigStatus( TEST_CONFIG_SKIP_DISINFECT_AND_SERVICE_TX_BLOCKERS ) != TRUE ) + if ( getHeatDisinfectTemperatureSensorValue() > MAX_ALLOWED_RO_FILTER_TEMP_FOR_TX_C ) { - // Verify HD and DG are not over due for service - if ( haveHDDGServicesBeenExpired( &rejReason ) != TRUE ) - { - // 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; - } - } + rejReason = REQUEST_REJECT_REASON_DG_RO_FILTER_TEMPERATURE_OUT_OF_RANGE; } + + haveHDDGServicesBeenExpired( &rejReason ); + + isDGDisinfectValid( &rejReason ); } // If no reason to reject request to start treatment, set flag to initiate treatment workflow @@ -1184,9 +1175,10 @@ * acceptable to start another treatment. * @details Inputs: none * @details Outputs: none + * @param rejReason pointer to the provided reject reason buffer to be send to UI * @return TRUE if the disinfect is valid otherwise, FALSE ***********************************************************************/ -static BOOL isDGDisinfectValid( void ) +static BOOL isDGDisinfectValid( REQUEST_REJECT_REASON_CODE_T* rejReason ) { DG_SERVICE_AND_USAGE_DATA_T data; BOOL status = FALSE; @@ -1225,6 +1217,16 @@ BOOL isFlushValid = ( ( ( TRUE == isBasicFlushValid ) || ( TRUE == isChemFlushValid ) || ( TRUE == isHeatDisCoolFlushValid ) || ( TRUE == isHeatDisFlushValid ) ) ? TRUE : FALSE ); + if ( FALSE == isFlushValid ) + { + *rejReason = REQUEST_REJECT_REASON_DG_FILTER_FLUSH_HAS_BEEN_EXPIRED; + } + + if ( ( FALSE == isBasicFlushValid ) && ( FALSE == isChemFlushValid ) && ( FALSE == isHeatDisCoolFlushValid ) ) + { + *rejReason = REQUEST_REJECT_REASON_DG_DISINFECT_HAS_BEEN_EXPIRED; + } + // If all of the above conditions are true, it means we can start a treatment if ( ( TRUE == hasDisBeenDone ) && ( TRUE == isHeatDisValid ) && ( TRUE == isChemFlushComplete ) && ( TRUE == isFlushValid ) ) { Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r15297305e75a0660672e224fc2018b7836682c84 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 15297305e75a0660672e224fc2018b7836682c84) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -28,6 +28,7 @@ #include "NVDataMgmt.h" #include "OperationModes.h" #include "PersistentAlarm.h" +#include "PresOccl.h" #include "Reservoirs.h" #include "Rinseback.h" #include "RTC.h" @@ -212,6 +213,8 @@ *************************************************************************/ U32 transitionToTreatmentMode( void ) { + PRESSURE_LIMIT_CHANGE_RESPONSE_T respRecord; + if ( ( getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) != TRUE ) || ( getPreviousOperationMode() != DG_MODE_FAUL ) ) { // Initialize treatment mode each time we transition to it @@ -233,6 +236,13 @@ // Enable venous bubble detection in treatment mode setVenousBubbleDetectionEnabled( TRUE ); + // Read back limits for transmit to UI. + respRecord.artPresLimitWindowmmHg = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ); + respRecord.venPresLimitWindowmmHg = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ); + respRecord.venPresLimitAsymmetricmmHg = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ); + // Send response + sendPressureLimitsChangeResponse( &respRecord ); + return currentTreatmentState; } @@ -752,6 +762,8 @@ sendTreatmentLogEventData( UF_START_RESUME_EVENT, 0.0, presUFRate ); } transitionToDialysis(); + // To update partial blood pump occlusion baseline - start of treatment + signalBloodPumpPressureOcclBaseline(); result = TREATMENT_DIALYSIS_STATE; } } @@ -1306,6 +1318,8 @@ // Set to new rate result &= setTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW, bloodRate ); setDialysisBloodPumpFlowRate( getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ) ); + // Update partial occlusion baseline when blood flow rate changes + signalBloodPumpPressureOcclBaseline(); } // Handle dialysate flow rate changes @@ -1316,6 +1330,8 @@ // Set to new rate result &= setTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW, dialRate ); setDialysisDialInFlowAndUFRate( getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presMaxUFVolumeML, presUFRate ); + // Update partial occlusion baseline when dialysate flow rate changes + signalBloodPumpPressureOcclBaseline(); } } else Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r58a0582099dd69bd19e719f6b36e8d43099fff96 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 58a0582099dd69bd19e719f6b36e8d43099fff96) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -2235,6 +2235,7 @@ case WET_SELF_TESTS_BUBBLE_CHECK_SETUP_STATE: case WET_SELF_TESTS_BUBBLE_CHECK_STATE: case WET_SELF_TESTS_PRIME_CHECK_STATE: + case WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_DEBUBBLE_STATE: case WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE: state = WET_SELF_TESTS_START_STATE; break; Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -rfc923bac57545b5794893c47a97770d8d7cfcee4 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision fc923bac57545b5794893c47a97770d8d7cfcee4) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -408,7 +408,12 @@ // Send information for UI to log to treatment log if ( ( TRUE == ALARM_TABLE[ alarm ].alarmTreatmentLog ) && ( MODE_TREA == getCurrentOperationMode() ) ) { - sendTreatmentLogAlarmEventData( alarm, alarmData1, alarmData2 ); + F32 data1; + F32 data2; + + memcpy( &data1, &alarmData1.data, sizeof( F32 ) ); + memcpy( &data2, &alarmData2.data, sizeof( F32 ) ); + sendTreatmentLogAlarmEventData( alarm, data1, data2 ); } } activateAlarm( alarm ); Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r4d8cbadfe358560d85c9c9fcd7db8f94c3579229 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 4d8cbadfe358560d85c9c9fcd7db8f94c3579229) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -637,8 +637,8 @@ // Wait for the reservoir to settle and then send the commands to switch the active reservoir if ( ( TRUE == didTimeout( reservoirSwitchStartTimeMS, RESERVOIR_FRESH_SETTLE_TIME_MS ) ) && - ( ( dilutionLevelPct >= MAX_RESERVOIR_DILUTION ) || ( volSpentML >= (F32)getTargetFillVolumeBasedOnDialysateFlowML() ) || - ( TRUE == isDialysateTempAlarmActive() ) || ( TRUE == isAlarmActive( ALARM_ID_HD_ACTIVE_RESERVOIR_WEIGHT_OUT_OF_RANGE ) ) ) ) + ( ( dilutionLevelPct >= MAX_RESERVOIR_DILUTION ) || ( volSpentML >= (F32)getTargetFillVolumeBasedOnDialysateFlowML() ) || + ( TRUE == isDialysateTempAlarmActive() ) || ( TRUE == isAlarmActive( ALARM_ID_HD_ACTIVE_RESERVOIR_WEIGHT_OUT_OF_RANGE ) ) ) ) { DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r7509916ccc09e9a9060bcb03c72f4658d5ea3dd7 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 7509916ccc09e9a9060bcb03c72f4658d5ea3dd7) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -1213,6 +1213,10 @@ handleSendInstitutionalRecordToUI( message ); break; + case MSG_ID_UI_HD_RESET_IN_SERVICE_MODE_REQUEST: + handleUIHDResetInServiceModeRequest( message ); + break; + // NOTE: this always must be the last case case MSG_ID_TESTER_LOGIN_REQUEST: handleTesterLogInRequest( message ); @@ -1324,6 +1328,14 @@ handleTestBloodPumpOcclusionOverrideRequest( message ); break; + case MSG_ID_HD_PARTIAL_OCCLUSION_BLOOD_PUMP_OVERRIDE: + handleTestFilteredBloodPumpOcclusionOverrideRequest( message ); + break; + + case MSG_ID_HD_PARTIAL_OCCL_BLOOD_PUMP_BASELINE_OVERRIDE: + handleTestBloodPumpOcclusionBaselineOverrideRequest( message ); + break; + case MSG_ID_PRES_OCCL_SEND_INTERVAL_OVERRIDE: handleTestPresOcclBroadcastIntervalOverrideRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r7509916ccc09e9a9060bcb03c72f4658d5ea3dd7 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 7509916ccc09e9a9060bcb03c72f4658d5ea3dd7) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -1090,22 +1090,22 @@ * @param almData1 data associates with the alarm * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL sendTreatmentLogAlarmEventData( ALARM_ID_T alarmID, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ) +BOOL sendTreatmentLogAlarmEventData( ALARM_ID_T alarmID, F32 alarmData1, F32 alarmData2 ) { MESSAGE_T msg; U08 *payloadPtr = msg.payload; - U32 id = (U32)alarmID; + U32 id = (U32)alarmID; // Create a message record blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_HD_TREATMENT_LOG_ALARM_EVENT; + msg.hdr.msgID = MSG_ID_HD_TREATMENT_LOG_ALARM_EVENT; msg.hdr.payloadLen = sizeof( U32 ) + 2 * sizeof( F32 ); memcpy( payloadPtr, &id, sizeof( U32 ) ); payloadPtr += sizeof( U32 ); - memcpy( payloadPtr, &almData1.data, sizeof( F32 ) ); + memcpy( payloadPtr, &alarmData1, sizeof( F32 ) ); payloadPtr += sizeof( F32 ); - memcpy( payloadPtr, &almData2.data, sizeof( F32 ) ); + memcpy( payloadPtr, &alarmData2, sizeof( F32 ) ); // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer return serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_UI, ACK_REQUIRED ); @@ -3322,8 +3322,14 @@ *************************************************************************/ void handleHDSerialNumberRequest( void ) { + typedef struct + { + U08 topLevelSN[ MAX_TOP_LEVEL_SN_CHARS ]; + } LOCAL_TOP_SN_T; MESSAGE_T msg; HD_SYSTEM_RECORD_T system; + U08 i; + LOCAL_TOP_SN_T localTopLevelSN; // Get the system's record. There are no arrays of system to check and also, raise no alarm since the system record // has been already checked in POST @@ -3338,8 +3344,15 @@ // Add 1 byte for null terminator msg.hdr.payloadLen = MAX_TOP_LEVEL_SN_CHARS + 1; + for ( i = 0; i < MAX_TOP_LEVEL_SN_CHARS; i++ ) + { + // NOTE: A local variable was created to avoid system.topLevelSN in the messages list + // NOTE: For loop was used instead of memory copy to ensure it is not parsed in the messages list script + localTopLevelSN.topLevelSN[ i ] = system.topLevelSN[ i ]; + } + // Fill message payload - memcpy( payloadPtr, &system.topLevelSN, sizeof( U08 ) * MAX_TOP_LEVEL_SN_CHARS ); + memcpy( payloadPtr, &localTopLevelSN, sizeof( LOCAL_TOP_SN_T ) ); payloadPtr += MAX_TOP_LEVEL_SN_CHARS; *payloadPtr = 0; @@ -3678,7 +3691,30 @@ serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_UI, ACK_NOT_REQUIRED ); } +/*********************************************************************//** + * @brief + * The handleUIHDResetInServiceModeRequest function handles the UI request + * to reset HD in service mode + * @details Inputs: none + * @details Outputs: none + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleUIHDResetInServiceModeRequest( MESSAGE_T* message ) +{ + // Verify payload length + if ( ( 0 == message->hdr.payloadLen ) && ( MODE_SERV == getCurrentOperationMode() ) ) + { +#ifndef _VECTORCAST_ + systemREG1->SYSECR = (0x2) << 14; // Reset processor +#endif + } + // Respond to request + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -4580,6 +4616,70 @@ /*********************************************************************//** * @brief + * The handleTestFilteredBloodPumpOcclusionOverrideRequest function handles a request to + * override the filtered blood pump occlusion sensor readings. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestFilteredBloodPumpOcclusionOverrideRequest( 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 = testSetFilteredBloodPumpOcclusionOverride( payload.state.f32 ); + } + else + { + result = testResetFilteredBloodPumpOcclusionOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestBloodPumpOcclusionBaselineOverrideRequest function handles a request to + * override the blood pump occlusion baseline value. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestBloodPumpOcclusionBaselineOverrideRequest( 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 = testSetBloodPumpPartialOcclusionBaselineOverride( payload.state.f32 ); + } + else + { + result = testResetBloodPumpPartialOcclusionBaselineOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The handleTestPresOcclBroadcastIntervalOverrideRequest function handles a request to * override the broadcast interval for pressure/occlusion data. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r7509916ccc09e9a9060bcb03c72f4658d5ea3dd7 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 7509916ccc09e9a9060bcb03c72f4658d5ea3dd7) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -420,7 +420,7 @@ BOOL sendActiveAlarmsList( ACTIVE_ALARM_LIST_RESPONSE_PAYLOAD_T alarmListPayload ); // MSG_ID_HD_TREATMENT_LOG_ALARM_EVENT -BOOL sendTreatmentLogAlarmEventData( ALARM_ID_T alarmID, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ); +BOOL sendTreatmentLogAlarmEventData( ALARM_ID_T alarmID, F32 alarmData1, F32 alarmData2 ); // MSG_ID_HD_TREATMENT_LOG_EVENT BOOL sendTreatmentLogEventData( TX_EVENT_ID_T event, F32 oldValue, F32 newValue ); @@ -561,6 +561,9 @@ // MSG_ID_UI_INSTITUTIONAL_RECORD_REQUEST void handleSendInstitutionalRecordToUI( MESSAGE_T* message ); +// MSG_ID_UI_HD_RESET_IN_SERVICE_MODE_REQUEST +void handleUIHDResetInServiceModeRequest( MESSAGE_T* message ); + // *********** public test support message functions ********** // MSG_TESTER_LOG_IN @@ -646,6 +649,12 @@ // MSG_ID_OCCLUSION_BLOOD_PUMP_OVERRIDE void handleTestBloodPumpOcclusionOverrideRequest( MESSAGE_T *message ); +//MSG_ID_HD_PARTIAL_OCCLUSION_BLOOD_PUMP_OVERRIDE +void handleTestFilteredBloodPumpOcclusionOverrideRequest( MESSAGE_T *message ); + +//MSG_ID_HD_PARTIAL_OCCL_BLOOD_PUMP_BASELINE_OVERRIDE +void handleTestBloodPumpOcclusionBaselineOverrideRequest( MESSAGE_T *message ); + // MSG_ID_PRES_OCCL_SEND_INTERVAL_OVERRIDE void handleTestPresOcclBroadcastIntervalOverrideRequest( MESSAGE_T *message ); Index: firmware/HD.dil =================================================================== diff -u -r7e0d7c16341ea0ccd9b806a2db97553498d10365 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/HD.dil (.../HD.dil) (revision 7e0d7c16341ea0ccd9b806a2db97553498d10365) +++ firmware/HD.dil (.../HD.dil) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -1,4 +1,4 @@ -# RM46L852PGE 04/11/24 17:22:39 +# RM46L852PGE 05/02/24 13:54:03 # ARCH=RM46L852PGE # @@ -139,7 +139,7 @@ DRIVER.SYSTEM.VAR.ECAP6_ENABLE.VALUE=1 DRIVER.SYSTEM.VAR.SCI_ENABLE.VALUE=1 DRIVER.SYSTEM.VAR.FLASH_DATA_1_WAIT_STATE_FREQ.VALUE=110.0 -DRIVER.SYSTEM.VAR.RAM_STACK_IRQ_BASE.VALUE=0x08004000 +DRIVER.SYSTEM.VAR.RAM_STACK_IRQ_BASE.VALUE=0x08002800 DRIVER.SYSTEM.VAR.VIM_CHANNEL_125_MAPPING.VALUE=125 DRIVER.SYSTEM.VAR.VIM_CHANNEL_117_MAPPING.VALUE=117 DRIVER.SYSTEM.VAR.VIM_CHANNEL_109_MAPPING.VALUE=109 @@ -407,7 +407,7 @@ DRIVER.SYSTEM.VAR.CORE_HANDLER_TABLE_UNDEF_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.VIM_CHANNEL_8_INT_PRAGMA_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.SAFETY_INIT_PBIST_SP_SELECTED.VALUE=0 -DRIVER.SYSTEM.VAR.RAM_STACK_ABORT_BASE.VALUE=0x08005000 +DRIVER.SYSTEM.VAR.RAM_STACK_ABORT_BASE.VALUE=0x08002c00 DRIVER.SYSTEM.VAR.VIM_CHANNEL_92_NAME.VALUE=etpwm2Interrupt DRIVER.SYSTEM.VAR.VIM_CHANNEL_84_NAME.VALUE=phantomInterrupt DRIVER.SYSTEM.VAR.VIM_CHANNEL_76_NAME.VALUE=phantomInterrupt @@ -435,7 +435,7 @@ DRIVER.SYSTEM.VAR.CORE_PMU_COUNTER1_EVENT.VALUE=0x11 DRIVER.SYSTEM.VAR.EFUSE_SELFTEST_ENA.VALUE=0 DRIVER.SYSTEM.VAR.CLKT_AVCLK4_DOMAIN_DISABLE.VALUE=0 -DRIVER.SYSTEM.VAR.RAM_LINK_BASE_ADDRESS.VALUE=0x08005800 +DRIVER.SYSTEM.VAR.RAM_LINK_BASE_ADDRESS.VALUE=0x08003400 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_12_SUB_4_DISABLE.VALUE=0 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_2_SUB_7_DISABLE.VALUE=0 DRIVER.SYSTEM.VAR.VIM_CHANNEL_120_INT_ENABLE.VALUE=0 @@ -549,14 +549,14 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_85_NAME.VALUE=phantomInterrupt DRIVER.SYSTEM.VAR.VIM_CHANNEL_77_NAME.VALUE=EMACTxIntISR DRIVER.SYSTEM.VAR.VIM_CHANNEL_69_NAME.VALUE=phantomInterrupt -DRIVER.SYSTEM.VAR.RAM_STACK_IRQ_LENGTH.VALUE=0x00001000 +DRIVER.SYSTEM.VAR.RAM_STACK_IRQ_LENGTH.VALUE=0x00000400 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_11_SUB_6_DISABLE.VALUE=0 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_7_SUB_0_DISABLE.VALUE=0 DRIVER.SYSTEM.VAR.VIM_CHANNEL_2_INT_PRAGMA_ENABLE.VALUE=1 DRIVER.SYSTEM.VAR.CLKT_RTI2_POST_SOURCE.VALUE=VCLK DRIVER.SYSTEM.VAR.CORE_MPU_REGION_9_PERMISSION_VALUE.VALUE=0x1300 DRIVER.SYSTEM.VAR.VIM_CHANNEL_5_NAME.VALUE=rtiCompare3Interrupt -DRIVER.SYSTEM.VAR.RAM_STACK_LENGTH.VALUE=0x00005800 +DRIVER.SYSTEM.VAR.RAM_STACK_LENGTH.VALUE=0x00003400 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_2_PERMISSION.VALUE=PRIV_RO_USER_RO_EXEC DRIVER.SYSTEM.VAR.CLKT_LPO_BIAS.VALUE=true DRIVER.SYSTEM.VAR.CLKT_AVCLK3_DIVIDER1.VALUE=4 @@ -628,7 +628,7 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_103_NAME.VALUE=etpwm7TripZoneInterrupt DRIVER.SYSTEM.VAR.PBIST_ALGO_16.VALUE=0 DRIVER.SYSTEM.VAR.CLKT_VCLK2_DIVIDER.VALUE=1 -DRIVER.SYSTEM.VAR.RAM_LINK_LENGTH.VALUE=0x0002a800 +DRIVER.SYSTEM.VAR.RAM_LINK_LENGTH.VALUE=0x0002cc00 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_11_END_ADDRESS.VALUE=0x0802ffff DRIVER.SYSTEM.VAR.VIM_CHANNEL_30_INT_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.VIM_CHANNEL_22_INT_ENABLE.VALUE=0 @@ -793,7 +793,7 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_29_MAPPING.VALUE=29 DRIVER.SYSTEM.VAR.ECLK_PORT_BIT0_DIR.VALUE=1 DRIVER.SYSTEM.VAR.FLASH_LENGTH.VALUE=0x00140000 -DRIVER.SYSTEM.VAR.RAM_STACK_FIQ_LENGTH.VALUE=0x00001000 +DRIVER.SYSTEM.VAR.RAM_STACK_FIQ_LENGTH.VALUE=0x00000400 DRIVER.SYSTEM.VAR.CLKT_EXT1_ENABLE.VALUE=FALSE DRIVER.SYSTEM.VAR.CORE_MPU_REGION_12_SUB_2_DISABLE.VALUE=0 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_9_SUB_7_DISABLE.VALUE=0 @@ -925,7 +925,7 @@ DRIVER.SYSTEM.VAR.SAFETY_INIT_DMA_DP_PBISTCHECK_ENA.VALUE=0x00000800 DRIVER.SYSTEM.VAR.HET_ENABLE.VALUE=1 DRIVER.SYSTEM.VAR.PBIST_ALGO_13_14.VALUE=0 -DRIVER.SYSTEM.VAR.RAM_STACK_UNDEF_BASE.VALUE=0x08005400 +DRIVER.SYSTEM.VAR.RAM_STACK_UNDEF_BASE.VALUE=0x08003000 DRIVER.SYSTEM.VAR.RAM_STACK_SVC_BASE.VALUE=0x08002000 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_9_TYPE.VALUE=DEVICE_NONSHAREABLE DRIVER.SYSTEM.VAR.VIM_CHANNEL_99_INT_PRAGMA_ENABLE.VALUE=0 @@ -1134,7 +1134,7 @@ DRIVER.SYSTEM.VAR.RTI_ENABLE.VALUE=1 DRIVER.SYSTEM.VAR.STC_MAX_TIMEOUT.VALUE=0xFFFFFFFF DRIVER.SYSTEM.VAR.CLKT_LPO_LOW_TRIM.VALUE=100.00 -DRIVER.SYSTEM.VAR.RAM_STACK_FIQ_BASE.VALUE=0x08003000 +DRIVER.SYSTEM.VAR.RAM_STACK_FIQ_BASE.VALUE=0x08002400 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_4_PERMISSION_VALUE.VALUE=0x0300 DRIVER.SYSTEM.VAR.VIM_CHANNEL_0_NAME.VALUE=esmHighInterrupt DRIVER.SYSTEM.VAR.FLASH_BANK_LINK_LENGTH_7.VALUE=0x000010000 @@ -1184,7 +1184,7 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_15_NAME.VALUE=adc1Group1Interrupt DRIVER.SYSTEM.VAR.ERRATA_WORKAROUND_15.VALUE=1 DRIVER.SYSTEM.VAR.RAM_STACK_UNDEF_LENGTH.VALUE=0x00000400 -DRIVER.SYSTEM.VAR.RAM_STACK_SVC_LENGTH.VALUE=0x00001000 +DRIVER.SYSTEM.VAR.RAM_STACK_SVC_LENGTH.VALUE=0x00000400 DRIVER.SYSTEM.VAR.CLKT_LPO_TRIM_OTP_LOC.VALUE=0xF00801B4 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_6_SUB_6_DISABLE.VALUE=0 DRIVER.SYSTEM.VAR.CORE_HANDLER_TABLE_UNDEF_ENTRY.VALUE=_undef Index: firmware/include/sys_core.h =================================================================== diff -u -r7e0d7c16341ea0ccd9b806a2db97553498d10365 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/include/sys_core.h (.../sys_core.h) (revision 7e0d7c16341ea0ccd9b806a2db97553498d10365) +++ firmware/include/sys_core.h (.../sys_core.h) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -72,7 +72,7 @@ * * @note: Use this macro for SVC Mode Stack length (in bytes) */ -#define SVC_STACK_LENGTH 0x00001000U +#define SVC_STACK_LENGTH 0x00000400U /** @def FIQ_STACK_LENGTH * @brief FIQ Mode Stack length (in bytes) @@ -81,7 +81,7 @@ * * @note: Use this macro for FIQ Mode Stack length (in bytes) */ -#define FIQ_STACK_LENGTH 0x00001000U +#define FIQ_STACK_LENGTH 0x00000400U /** @def IRQ_STACK_LENGTH * @brief IRQ Mode Stack length (in bytes) @@ -90,7 +90,7 @@ * * @note: Use this macro for IRQ Mode Stack length (in bytes) */ -#define IRQ_STACK_LENGTH 0x00001000U +#define IRQ_STACK_LENGTH 0x00000400U /** @def ABORT_STACK_LENGTH * @brief ABORT Mode Stack length (in bytes) Index: firmware/source/sys_core.asm =================================================================== diff -u -r7e0d7c16341ea0ccd9b806a2db97553498d10365 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/source/sys_core.asm (.../sys_core.asm) (revision 7e0d7c16341ea0ccd9b806a2db97553498d10365) +++ firmware/source/sys_core.asm (.../sys_core.asm) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -161,11 +161,11 @@ bx lr userSp .word 0x08000000+0x00002000 -svcSp .word 0x08000000+0x00002000+0x00001000 -fiqSp .word 0x08000000+0x00002000+0x00001000+0x00001000 -irqSp .word 0x08000000+0x00002000+0x00001000+0x00001000+0x00001000 -abortSp .word 0x08000000+0x00002000+0x00001000+0x00001000+0x00001000+0x00000400 -undefSp .word 0x08000000+0x00002000+0x00001000+0x00001000+0x00001000+0x00000400+0x00000400 +svcSp .word 0x08000000+0x00002000+0x00000400 +fiqSp .word 0x08000000+0x00002000+0x00000400+0x00000400 +irqSp .word 0x08000000+0x00002000+0x00000400+0x00000400+0x00000400 +abortSp .word 0x08000000+0x00002000+0x00000400+0x00000400+0x00000400+0x00000400 +undefSp .word 0x08000000+0x00002000+0x00000400+0x00000400+0x00000400+0x00000400+0x00000400 .endasmfunc Index: firmware/source/sys_link.cmd =================================================================== diff -u -r7e0d7c16341ea0ccd9b806a2db97553498d10365 -r37dac720d0a04a6f28ae8f60bf1320ca13989354 --- firmware/source/sys_link.cmd (.../sys_link.cmd) (revision 7e0d7c16341ea0ccd9b806a2db97553498d10365) +++ firmware/source/sys_link.cmd (.../sys_link.cmd) (revision 37dac720d0a04a6f28ae8f60bf1320ca13989354) @@ -58,8 +58,8 @@ { VECTORS (X) : origin=0x00000000 length=0x00000020 FLASH0 (RX) : origin=0x00000020 length=0x0013FFE0 - STACKS (RW) : origin=0x08000000 length=0x00005800 - RAM (RW) : origin=0x08005800 length=0x0002a800 + STACKS (RW) : origin=0x08000000 length=0x00003400 + RAM (RW) : origin=0x08003400 length=0x0002cc00 /* USER CODE BEGIN (2) */ #endif @@ -70,8 +70,8 @@ VECTORS (X) : origin=0x00000000 length=0x00000020 CRCMEM (RX) : origin=0x00000020 length=0x000001E0 FLASH0 (RX) : origin=0x00000200 length=0x0013FE00 - STACKS (RW) : origin=0x08000000 length=0x00005800 - RAM (RW) : origin=0x08005800 length=0x0002a800 + STACKS (RW) : origin=0x08000000 length=0x00003400 + RAM (RW) : origin=0x08003400 length=0x0002cc00 #endif /* USER CODE END */