Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r07812169be90cf394e80f11b74f77b5596665e64 -r26d736280fef713e7639cd2b98eed975e2eb4353 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 07812169be90cf394e80f11b74f77b5596665e64) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 26d736280fef713e7639cd2b98eed975e2eb4353) @@ -62,6 +62,7 @@ #define MIN_HEPARIN_BOLUS_RATE 1.2 ///< Minimum Heparin bolus flow rate (in mL/hr). #define MAX_HEPARIN_BOLUS_RATE 24.0 ///< Maximum Heparin bolus flow rate (in mL/hr). #define HEPARIN_BOLUS_TIME_HR ( 5.0 / MIN_PER_HOUR ) ///< Duration (in hours) of Heparin bolus. +#define HEPARIN_BOLUS_TARGET_RATE_ML_PER_HR 40.0 ///< Heparin bolus target rate (in mL/hr). #define SYRINGE_PUMP_RETRACT_RATE 3600.0 ///< Retract rate is 5 mL/ 5 s = 1 mL/s = 3,600 mL/hr. #define SYRINGE_PUMP_SEEK_RATE 3600.0 ///< Seek plunger rate is 5 mL/ 5 s = 1 mL/s = 3,600 mL/hr. #define SYRINGE_PUMP_PRIME_RATE 635.0 ///< Prime rate is 0.5 mm ^ 2 x PI x 450 mm = 0.353 mL / 2s = 635 mL/hr. @@ -553,13 +554,10 @@ *************************************************************************/ BOOL startHeparinBolus( void ) { - F32 tgtRate = 0.0; + F32 tgtRate = HEPARIN_BOLUS_TARGET_RATE_ML_PER_HR; // fixed rate - // Get set Heparin bolus volume (mL) and convert to target rate (mL/hr) - tgtRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ) / HEPARIN_BOLUS_TIME_HR; - // If valid to start a bolus, kick it off - if ( ( tgtRate >= MIN_HEPARIN_BOLUS_RATE ) && ( tgtRate <= MAX_HEPARIN_BOLUS_RATE ) && ( FALSE == isSyringePumpHome() ) ) + if ( FALSE == isSyringePumpHome() ) { if ( ( TRUE == isSyringeDetected() ) && ( TRUE == syringePumpPrimeCompleted ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && ( HEPARIN_STATE_STOPPED == heparinDeliveryState ) ) Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r09e6cf9de34acf18f6e1138bf56ac0edb4821186 -r26d736280fef713e7639cd2b98eed975e2eb4353 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 09e6cf9de34acf18f6e1138bf56ac0edb4821186) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 26d736280fef713e7639cd2b98eed975e2eb4353) @@ -245,22 +245,13 @@ // Do not run syringe pump if no Heparin included in prescription or it was paused or if Heparin should be stopped at this stage of treatment if ( ( minRem > (F32)preStop ) && ( HEPARIN_STATE_STOPPED == currentHeparinState ) ) { - // If not done with bolus, start/resume bolus - if ( ( bolusVol > 0.0 ) && ( getSyringePumpVolumeDelivered() < bolusVol ) ) + if ( hepRate > 0.0 ) { - startHeparinBolus(); // TODO - check return status or have function trigger alarm if not successful + startHeparinContinuous(); // TODO - check return status } - // Otherwise, start/resume continuous delivery else { - if ( hepRate > 0.0 ) - { - startHeparinContinuous(); // TODO - check return status - } - else - { - setHeparinCompleted(); - } + setHeparinCompleted(); } } else Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r65280b3e6fda421cc2130e7e73f41e9fd23b51c9 -r26d736280fef713e7639cd2b98eed975e2eb4353 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 65280b3e6fda421cc2130e7e73f41e9fd23b51c9) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 26d736280fef713e7639cd2b98eed975e2eb4353) @@ -431,6 +431,8 @@ SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_STARTUP, SYS_EXCEPTION, (U32)0x000BAD01 ) // log ESR value and BAD01 to indicate the causes of resets (see Table 2-8 Technical Ref Manual) SYS_EXCEPTION = 0xFFFFU; // clear all exception flags by writing logic 1 to each bit + + //*(uint32_t *)(0xFFFFFA06) = (uint32_t)0xDEADBEEF; // Generate memory access violation. Remove when test is done // Send the startup event SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_STARTUP, 0, 0 ) // Send the first submode change event. It is the mode Init and it does not start from a previous Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r09e6cf9de34acf18f6e1138bf56ac0edb4821186 -r26d736280fef713e7639cd2b98eed975e2eb4353 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 09e6cf9de34acf18f6e1138bf56ac0edb4821186) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 26d736280fef713e7639cd2b98eed975e2eb4353) @@ -486,6 +486,7 @@ *************************************************************************/ void transitionToWetSelfTests() { + F32 bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); wetSelfTestsResult = FALSE; currentWetSelfTestsState = WET_SELF_TESTS_START_STATE; settleStartTime = 0; @@ -495,6 +496,11 @@ selfTestStartTime = getMSTimerCount(); selfTestPreviousPublishDataTime = getMSTimerCount(); + if ( ( bolusVol > 0.0 ) && ( getSyringePumpVolumeDelivered() < bolusVol ) ) + { + startHeparinBolus(); // moved here from startHeparinPump() in Dialysis.c + } + resetSelfTestsFlags(); } Index: firmware/source/sys_selftest.c =================================================================== diff -u -r8c9511a4eb046091fbfe6a3e481eb83c756b288f -r26d736280fef713e7639cd2b98eed975e2eb4353 --- firmware/source/sys_selftest.c (.../sys_selftest.c) (revision 8c9511a4eb046091fbfe6a3e481eb83c756b288f) +++ firmware/source/sys_selftest.c (.../sys_selftest.c) (revision 26d736280fef713e7639cd2b98eed975e2eb4353) @@ -1124,8 +1124,8 @@ */ /* USER CODE BEGIN (42) */ uint32_t marker = STACK_MARKER; - uint32_t contentOfLinkRegister = *(volatile uint32_t*)(&marker + LR_OFFSET_WORD_IN_STACK); - *(volatile uint32_t*)(&marker + LR_OFFSET_WORD_IN_STACK) = contentOfLinkRegister + LR_OFFSET_ADJUSTMENT; + uint32_t contentOfLinkRegister = *(volatile uint32_t*)( &marker + LR_OFFSET_WORD_IN_STACK ); + *(volatile uint32_t*)( &marker + LR_OFFSET_WORD_IN_STACK ) = contentOfLinkRegister + LR_OFFSET_ADJUSTMENT; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (U32)SW_FAULT_ID_ILLEGAL_MEM_ACCESS, contentOfLinkRegister ) // log LR to determine what caused violation /* USER CODE END */