Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -rbb80dbac26147ab08413efa91007f7ffed43c38f -rc3cf7af051c1ee070df90a9c072df16be48f478f --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision c3cf7af051c1ee070df90a9c072df16be48f478f) @@ -156,7 +156,6 @@ static U32 syringePumpDataPublicationTimerCounter; ///< Used to schedule syringe pump data publication to CAN bus. static U32 syringePumpSpeedCalcTimerCounter; ///< Used to calculate measured rate from change in position over time. static U32 syringePumpRampTimerCtr; ///< Used to track ramp up time. -static HEPARIN_STATE_T heparinDeliveryState; ///< Current state of Heparin delivery. /// Interval (in ms) at which to publish syringe pump data to CAN bus. static OVERRIDE_U32_T syringePumpDataPublishInterval = { SYRINGE_PUMP_DATA_PUB_INTERVAL, SYRINGE_PUMP_DATA_PUB_INTERVAL, 0, 0 }; @@ -231,7 +230,6 @@ void initSyringePump( void ) { syringePumpState = SYRINGE_PUMP_INIT_STATE; - heparinDeliveryState = HEPARIN_STATE_OFF; syringePumpSelfTestState = SYRINGE_PUMP_SELF_TEST_STATE_START; syringePumpSetRate = 0.0; @@ -273,96 +271,6 @@ /*********************************************************************//** * @brief - * The userHeparinRequest function handles a command request from the user - * to pause or resume Heparin delivery. - * @details Inputs: none - * @details Outputs: - * @param cmd command from user - * @return TRUE if request accepted, FALSE if not - *************************************************************************/ -BOOL userHeparinRequest( HEPARIN_CMD_T cmd ) -{ - BOOL accepted = FALSE; - REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; - - if ( MODE_TREA == getCurrentOperationMode() ) - { - if ( TREATMENT_DIALYSIS_STATE == getTreatmentState() ) - { - if ( HEPARIN_CMD_PAUSE == cmd ) - { - if ( HEPARIN_STATE_DISPENSING == heparinDeliveryState ) - { - accepted = TRUE; - heparinDeliveryState = HEPARIN_STATE_PAUSED; - stopSyringePump(); - } - else - { - rejReason = REQUEST_REJECT_REASON_HEPARIN_PAUSE_INVALID_IN_THIS_STATE; - } - } - else if ( HEPARIN_CMD_RESUME == cmd ) - { - if ( HEPARIN_STATE_PAUSED == heparinDeliveryState ) - { - accepted = TRUE; - heparinDeliveryState = HEPARIN_STATE_DISPENSING; - startHeparinContinuous(); - } - else - { - rejReason = REQUEST_REJECT_REASON_HEPARIN_NOT_PAUSED; - } - } - else - { - rejReason = REQUEST_REJECT_REASON_INVALID_COMMAND; - } - } - else - { - rejReason = REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE; - } - } - else - { - rejReason = REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE; - } - - sendHeparinCommandResponse( (U32)accepted, (U32)rejReason, (U32)heparinDeliveryState ); - - return accepted; -} - -/*********************************************************************//** - * @brief - * The setHeparinOff function requests Heparin state be set to off - - * indicates syringe pump will not be needed in this treatment. - * @details Inputs: none - * @details Outputs: heparinDeliveryState - * @return none - *************************************************************************/ -void setHeparinOff( void ) -{ - heparinDeliveryState = HEPARIN_STATE_OFF; -} - -/*********************************************************************//** - * @brief - * The setHeparinStopped function requests Heparin state be set to stopped - - * indicates syringe pump will be needed in this treatment. - * @details Inputs: none - * @details Outputs: heparinDeliveryState - * @return none - *************************************************************************/ -void setHeparinStopped( void ) -{ - heparinDeliveryState = HEPARIN_STATE_STOPPED; -} - -/*********************************************************************//** - * @brief * The stopSyringePump function requests syringe pump be stopped. * @details Inputs: none * @details Outputs: syringePumpSetRate, syringePumpRetractRequested, syringePumpState @@ -373,10 +281,6 @@ syringePumpSetRate = 0.0; setFPGASyringePumpStepToggleTime( SYRINGE_PUMP_MICROSTEP_TOGGLE_TIME_FOR_STOP ); syringePumpState = SYRINGE_PUMP_OFF_STATE; - if ( ( HEPARIN_STATE_INITIAL_BOLUS == heparinDeliveryState ) || ( HEPARIN_STATE_DISPENSING == heparinDeliveryState ) ) - { - heparinDeliveryState = HEPARIN_STATE_STOPPED; - } } /*********************************************************************//** @@ -388,7 +292,7 @@ *************************************************************************/ BOOL retractSyringePump( void ) { - if ( ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && ( FALSE == isSyringeDetected() ) && ( heparinDeliveryState != HEPARIN_STATE_OFF ) ) + if ( ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && ( FALSE == isSyringeDetected() ) ) { syringePumpSetRate = SYRINGE_PUMP_RETRACT_RATE; syringePumpRetractRequested = TRUE; @@ -407,7 +311,7 @@ BOOL primeSyringePump( void ) { if ( ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && ( TRUE == isSyringeDetected() ) && - ( TRUE == isSyringePumpHome() ) && ( heparinDeliveryState != HEPARIN_STATE_OFF ) ) + ( TRUE == isSyringePumpHome() ) ) { syringePumpSetRate = SYRINGE_PUMP_SEEK_RATE; syringePumpPrimeRequested = TRUE; @@ -433,7 +337,7 @@ // If valid to start a bolus, kick it off if ( ( tgtRate >= MIN_HEPARIN_BOLUS_RATE ) && ( tgtRate <= MAX_HEPARIN_BOLUS_RATE ) && ( FALSE == isSyringePumpHome() ) ) { - if ( ( TRUE == isSyringeDetected() ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && ( HEPARIN_STATE_STOPPED == heparinDeliveryState ) ) + if ( ( TRUE == isSyringeDetected() ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) ) { syringePumpSetRate = tgtRate; syringePumpBolusRequested = TRUE; @@ -462,8 +366,7 @@ if ( ( flowRate >= MIN_HEPARIN_CONTINUOUS_RATE ) && ( flowRate <= MAX_HEPARIN_CONTINUOUS_RATE ) && ( FALSE == isSyringePumpHome() ) ) { - if ( ( TRUE == isSyringeDetected() ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && - ( ( ( HEPARIN_STATE_STOPPED == heparinDeliveryState ) || ( HEPARIN_STATE_PAUSED == heparinDeliveryState ) ) ) ) + if ( ( TRUE == isSyringeDetected() ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) ) { syringePumpSetRate = flowRate; syringePumpContinuousRequested = TRUE; @@ -727,7 +630,7 @@ *************************************************************************/ BOOL isSyringePumpPrimed( void ) { - return syringePumpPrimeCompleted;; + return syringePumpPrimeCompleted; } /*********************************************************************//** @@ -875,12 +778,10 @@ } else if ( TRUE == syringePumpBolusRequested ) { - heparinDeliveryState = HEPARIN_STATE_INITIAL_BOLUS; result = SYRINGE_PUMP_HEP_BOLUS_STATE; } else if ( TRUE == syringePumpContinuousRequested ) { - heparinDeliveryState = HEPARIN_STATE_DISPENSING; result = SYRINGE_PUMP_HEP_CONTINUOUS_STATE; } else if ( TRUE == syringePumpDACVrefSetRequested ) @@ -1110,21 +1011,18 @@ // Has syringe been removed? stopPump = checkSyringeRemoved( stopPump ); + // Check volume vs. safety volume + stopPump = checkVolumeVsSafetyVolume( stopPump, SYRINGE_PUMP_VOLUME_CHECK_MARGIN ); + // Check for occlusion stopPump = checkOcclusionOrEmpty( stopPump ); - // Check if time to stop Heparin delivery - // TODO - implement pre-stop check + // Check for commanded vs. meas. rate + stopPump = checkMaxMeasRate( stopPump, SYRINGE_PUMP_RATE_CHECK_MARGIN ); // Check position > max travel stopPump = checkMaxTravel( stopPump, SYRINGE_PUMP_EMPTY_POS + SYRINGE_PUMP_EMPTY_POS_MARGIN ); - // Check for commanded vs. meas. rate - stopPump = checkMaxMeasRate( stopPump, SYRINGE_PUMP_RATE_CHECK_MARGIN ); - - // Check volume vs. safety volume - stopPump = checkVolumeVsSafetyVolume( stopPump, SYRINGE_PUMP_VOLUME_CHECK_MARGIN ); - // If anything found that would require stopping the pump, stop pump and go to off state if ( TRUE == stopPump ) { @@ -1181,7 +1079,6 @@ if ( fabs( pos - SYRINGE_PUMP_EMPTY_POS ) < SYRINGE_PUMP_EMPTY_POS_MARGIN ) { - heparinDeliveryState = HEPARIN_STATE_EMPTY; SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY, (F32)pos, force ) } else @@ -1236,7 +1133,6 @@ if ( pos > ( SYRINGE_PUMP_EMPTY_POS + SYRINGE_PUMP_EMPTY_POS_MARGIN ) ) { result = TRUE; - heparinDeliveryState = HEPARIN_STATE_EMPTY; SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY, (F32)pos, getSyringePumpForceV() ) } else if ( pos > maxPos ) @@ -1410,11 +1306,9 @@ data.syringePumpPosition = getSyringePumpPosition(); data.syringePumpSetRate = syringePumpSetRate; data.syringePumpState = (U32)syringePumpState; - data.heparinDeliveryState = (U32)heparinDeliveryState; data.syringePumpVolumeDelivered = getSyringePumpVolumeDelivered(); - broadcastSyringePumpData( data ); - broadcastHeparinData( data.syringePumpVolumeDelivered ); + broadcastSyringePumpData( data ); syringePumpDataPublicationTimerCounter = 0; } } Index: firmware/App/Controllers/SyringePump.h =================================================================== diff -u -rbb80dbac26147ab08413efa91007f7ffed43c38f -rc3cf7af051c1ee070df90a9c072df16be48f478f --- firmware/App/Controllers/SyringePump.h (.../SyringePump.h) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) +++ firmware/App/Controllers/SyringePump.h (.../SyringePump.h) (revision c3cf7af051c1ee070df90a9c072df16be48f478f) @@ -19,7 +19,6 @@ #define __SYRINGE_PUMP_H__ #include "HDCommon.h" -#include "HDDefs.h" /** * @defgroup SyringePump SyringePump @@ -55,7 +54,6 @@ typedef struct { U32 syringePumpState; - U32 heparinDeliveryState; F32 syringePumpSetRate; F32 syringePumpMeasRate; S32 syringePumpPosition; @@ -70,9 +68,6 @@ void initSyringePump( void ); void execSyringePump( void ); -BOOL userHeparinRequest( HEPARIN_CMD_T cmd ); -void setHeparinOff( void ); -void setHeparinStopped( void ); void stopSyringePump( void ); BOOL retractSyringePump( void ); BOOL primeSyringePump( void ); Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r53281f1ea1e79cbd6eb8720851af78f2cb543624 -rc3cf7af051c1ee070df90a9c072df16be48f478f --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 53281f1ea1e79cbd6eb8720851af78f2cb543624) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision c3cf7af051c1ee070df90a9c072df16be48f478f) @@ -21,8 +21,10 @@ #include "DialInFlow.h" #include "DialOutFlow.h" #include "FPGA.h" +#include "ModeTreatmentParams.h" #include "PresOccl.h" #include "SelfTests.h" +#include "SyringePump.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Timers.h" @@ -62,7 +64,7 @@ #define RESERVOIR_SETTLE_TIME_MS ( 4 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time allotted for reservoir to settle in ms. #define MAX_NO_CARTRIDGE_SELF_TEST_TIME SEC_PER_MIN ///< Maximum no cartridge self-test time (in seconds). -#define MAX_DRY_SELF_TEST_TIME SEC_PER_MIN ///< Maximum dry self-test time (in seconds). +#define MAX_DRY_SELF_TEST_TIME ( 3 * SEC_PER_MIN ) ///< Maximum dry self-test time (in seconds). #define SELF_TEST_TIME_DATA_PUB_INTERVAL ( MS_PER_SECOND ) ///< Interval (ms/task time) at which self-test time data is published on the CAN bus. @@ -110,6 +112,8 @@ static U32 selfTestStartTime; ///< Starting time of self-test (in ms). static U32 selfTestPreviousPublishDataTime; ///< Last time self-test time data is being published (in ms). +static BOOL useHeparin; ///< Flag indicates the user of heparin. + static BOOL selfTestsResumeRequested; ///< Flag indicates user requesting self-tests resume. // ********** private function prototypes ********** @@ -131,6 +135,7 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsSetupState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( SELF_TEST_STATUS_T *result ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( SELF_TEST_STATUS_T *result ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestSyringePumpPrimeState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestStoppedState( void ); static void handleWetSelfTestsStopRequest( void ); @@ -208,6 +213,10 @@ *************************************************************************/ void transitionToNoCartSelfTests( void ) { + F32 const bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); + F32 const hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); + + useHeparin = ( ( bolusVol > 0.0 ) || ( hepRate > 0.0 ) ); currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_STATE; runPumpStartTime = 0; havePumpsStarted = FALSE; @@ -326,6 +335,10 @@ *************************************************************************/ void transitionToDrySelfTests() { + F32 const bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); + F32 const hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); + + useHeparin = ( ( bolusVol > 0.0 ) || ( hepRate > 0.0 ) ); currentDrySelfTestsState = DRY_SELF_TESTS_START_STATE; pressureSelfTestBloodPumpRunStartTime = 0; pressureSelfTestNormalizedStartTime = 0; @@ -353,7 +366,12 @@ { case DRY_SELF_TESTS_START_STATE: #ifdef SKIP_DRY_SELF_TESTS - currentDrySelfTestsState = DRY_SELF_TESTS_COMPLETE_STATE; + // TODO: Remove once dry self-test is ready to use + if ( TRUE == useHeparin ) + { + primeSyringePump(); + } + currentDrySelfTestsState = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; #else currentDrySelfTestsState = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; #endif @@ -391,6 +409,10 @@ currentDrySelfTestsState = handleDrySelfTestPressureSensorsNormalState( &result ); break; + case DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE: + currentDrySelfTestsState = handleDrySelfTestSyringePumpPrimeState(); + break; + case DRY_SELF_TESTS_STOPPED_STATE: currentDrySelfTestsState = handleDrySelfTestStoppedState(); break; @@ -675,6 +697,11 @@ homeDialInPump(); homeDialOutPump(); + if ( TRUE == useHeparin ) + { + retractSyringePump(); + } + return NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; } @@ -870,7 +897,11 @@ { if ( ( arterialPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) && ( venousPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) ) { - state = DRY_SELF_TESTS_COMPLETE_STATE; + if ( TRUE == useHeparin ) + { + primeSyringePump(); + } + state = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; } else { @@ -883,6 +914,33 @@ /*********************************************************************//** * @brief + * The handleDrySelfTestSyringePumpPrimeState function handles the prime + * operation for syringe pump. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestSyringePumpPrimeState( void ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; + + if ( TRUE == useHeparin ) + { + if ( TRUE == isSyringePumpPrimed() ) + { + state = DRY_SELF_TESTS_COMPLETE_STATE; + } + } + else + { + state = DRY_SELF_TESTS_COMPLETE_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleDrySelfTestStoppedState function handles the stopped dry self-tests * operation. * @details Inputs: none Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r08aa1ee4a1cc79526979153fa4759e1df3892203 -rc3cf7af051c1ee070df90a9c072df16be48f478f --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 08aa1ee4a1cc79526979153fa4759e1df3892203) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision c3cf7af051c1ee070df90a9c072df16be48f478f) @@ -245,6 +245,10 @@ SW_FAULT_ID_HD_INVALID_COMMAND_RESPONSE_ID, // 100 SW_FAULT_ID_HD_INVALID_RESERVOIR_ID, SW_FAULT_ID_HD_INVALID_VALVE_SETTING_ID, + SW_FAULT_ID_HD_SYRINGE_INVALID_BOLUS_CMD, + SW_FAULT_ID_HD_SYRINGE_INVALID_CONT_CMD, + SW_FAULT_ID_HD_SYRINGE_INVALID_VREF, // 105 + SW_FAULT_ID_HD_SYRINGE_INVALID_STATE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/FPGA.c =================================================================== diff -u -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 -rc3cf7af051c1ee070df90a9c072df16be48f478f --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision c3cf7af051c1ee070df90a9c072df16be48f478f) @@ -169,13 +169,15 @@ 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 SyringePumpStatus; ///< Reg 380. Syringe pump status register - U16 SyringePumpEncStatus; ///< Reg 382. Syringe pump encoder status - U32 SyringePumpEncPosition; ///< Reg 384. Syringe pump encoder position - U16 sPumpAdcDataReadChannel0; ///< Reg 388. - U16 sPumpAdcDataReadCh1; ///< Reg 390. - U16 sPumpAdcDataReadCh2; ///< Reg 392. - U16 sPumpAdcDataReadCh3; ///< Reg 394. + 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. + U08 syringePumpEncoderStatus; ///< Reg 383. Syringe pump encoder status register. + U32 syringePumpEncPosition; ///< Reg 384. Syringe pump encoder position + U16 syringePumpAdcDataReadCh0; ///< Reg 388. Syringe pump ADC channel 0 register (10 bit). + U16 syringePumpAdcDataReadCh1; ///< Reg 390. Syringe pump ADC channel 1 register (10 bit). + U16 syringePumpAdcDataReadCh2; ///< Reg 392. Syringe pump ADC channel 2 register (10 bit). + U16 syringePumpAdcDataReadCh3; ///< Reg 394. Syringe pump ADC channel 3 register (10 bit). U16 VBASpeed; ///< Reg 396. VBA pinch valve speed (Register VAUX0) U16 VBVSpeed; ///< Reg 398. VBV pinch valve speed (Register VAUX1) U16 VBVCurrent; ///< Reg 400. VBV pinch valve current (Register VAUX2) @@ -203,7 +205,11 @@ U16 VDiPWMFixed; ///< Reg 28. VDi PWM set to fixed current by setting fixed PWM duty cycle. Range 750 to 4250. < 2500 is reverse direction. U16 VDoPWMFixed; ///< Reg 30. VDo PWM set to fixed current by setting fixed PWM duty cycle. Range 750 to 4250. < 2500 is reverse direction. U16 VSparePWMFixed; ///< Reg 32. Vspare PWM set to fixed current by setting fixed PWM duty cycle. Range 750 to 4250. < 2500 is reverse direction. - U08 AlarmControl; ///< Reg 34. Alarm (audio) control register. + U08 alarmControl; ///< Reg 34. Alarm (audio) control register. + U08 syringePumpControl; ///< Reg 35. Syringe pump control register. + U32 syringePumpStepToggleTime; ///< Reg 36. Syringe pump step time toggle register. Sets time between step toggle which dictates stepper motor speed. + U16 syringePumpDACOut; ///< Reg 40. Syringe pump DAC output level (12-bit). + U08 syringePumpADCandDACControl; ///< Reg 42. Syringe pump ADC and DAC control register. } FPGA_ACTUATORS_T; // TODO clean up the struct @@ -302,7 +308,7 @@ memset( &fpgaHeader, 0, sizeof(FPGA_HEADER_T) ); memset( &fpgaSensorReadings, 0, sizeof(FPGA_SENSORS_T) ); memset( &fpgaActuatorSetPoints, 0, sizeof(FPGA_ACTUATORS_T) ); - fpgaActuatorSetPoints.AlarmControl = (U08)MIN_ALARM_VOLUME_ATTENUATION << 2; // Start alarm audio volume at maximum + fpgaActuatorSetPoints.alarmControl = (U08)MIN_ALARM_VOLUME_ATTENUATION << 2; // Start alarm audio volume at maximum // Initialize fpga comm buffers memset( &fpgaWriteCmdBuffer, 0, FPGA_WRITE_CMD_BUFFER_LEN ); @@ -1077,15 +1083,15 @@ U08 audioCmd = (U08)state; audioCmd |= ( (U08)volumeLevel << 2 ); - fpgaActuatorSetPoints.AlarmControl = audioCmd; + fpgaActuatorSetPoints.alarmControl = audioCmd; } else { U08 audioCmd = (U08)ALARM_PRIORITY_HIGH; // Set alarm audio to high priority, max volume for safety since s/w seems to be having trouble setting audio correctly audioCmd |= ( (U08)MIN_ALARM_VOLUME_ATTENUATION << 2 ); - fpgaActuatorSetPoints.AlarmControl = audioCmd; + fpgaActuatorSetPoints.alarmControl = audioCmd; // S/w fault to indicate issue w/ s/w SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_INVALID_ALARM_AUDIO_PARAM, volumeLevel ) @@ -1332,6 +1338,179 @@ /*********************************************************************//** * @brief + * The setFPGASyringePumpControlFlags function sets the syringe pump control + * register per given bit flags. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints + * @param bitFlags control bit settings for syringe pump + * @return none + *************************************************************************/ +void setFPGASyringePumpControlFlags( U08 bitFlags ) +{ + fpgaActuatorSetPoints.syringePumpControl = bitFlags; +} + +/*********************************************************************//** + * @brief + * The setFPGASyringePumpADCandDACControlFlags function sets the syringe pump + * ADC/DAC control register per given bit flags. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints + * @param bitFlags ADC/DAC control bit settings for syringe pump + * @return none + *************************************************************************/ +void setFPGASyringePumpADCandDACControlFlags( U08 bitFlags ) +{ + fpgaActuatorSetPoints.syringePumpADCandDACControl = bitFlags; +} + +/*********************************************************************//** + * @brief + * The setFPGASyringePumpDACOutputLevel function sets the syringe pump force + * sensor DAC output level register to a given value. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints + * @param counts level to set syringe pump force sensor DAC to + * @return none + *************************************************************************/ +void setFPGASyringePumpDACOutputLevel( U16 counts ) +{ + fpgaActuatorSetPoints.syringePumpDACOut = counts; +} + +/*********************************************************************//** + * @brief + * The setFPGASyringePumpStepToggleTime function sets the syringe pump stepper + * toggle time register to a given period (in uSec). + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints + * @param microSeconds toggle the stepper motor at this time interval to set pump speed + * @return none + *************************************************************************/ +void setFPGASyringePumpStepToggleTime( U32 microSeconds ) +{ + fpgaActuatorSetPoints.syringePumpStepToggleTime = microSeconds; +} + +/*********************************************************************//** + * @brief + * The getFPGASyringePumpStatus function gets the latest syringe pump status + * register reading. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last syringe pump status reading + *************************************************************************/ +U08 getFPGASyringePumpStatus( void ) +{ + return fpgaSensorReadings.syringePumpStatus; +} + +/*********************************************************************//** + * @brief + * The getFPGASyringePumpADCReadCounter function gets the latest syringe pump + * ADC read counter. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last syringe pump ADC read counter + *************************************************************************/ +U08 getFPGASyringePumpADCReadCounter( void ) +{ + return fpgaSensorReadings.syringePumpADCReadCounter; +} + +/*********************************************************************//** + * @brief + * The getFPGASyringePumpADCandDACStatus function gets the latest syringe pump + * ADC/DAC status register reading. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last syringe pump ADC/DAC status reading + *************************************************************************/ +U08 getFPGASyringePumpADCandDACStatus( void ) +{ + return fpgaSensorReadings.syringePumpADCandDACStatus; +} + +/*********************************************************************//** + * @brief + * The getFPGASyringePumpEncoderStatus function gets the latest syringe pump + * encoder status register reading. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last syringe pump encoder status reading + *************************************************************************/ +U08 getFPGASyringePumpEncoderStatus( void ) +{ + return fpgaSensorReadings.syringePumpEncoderStatus; +} + +/*********************************************************************//** + * @brief + * The getFPGASyringePumpEncoderPosition function gets the latest syringe pump + * encoder position reading. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last syringe pump encoder position reading + *************************************************************************/ +U32 getFPGASyringePumpEncoderPosition( void ) +{ + return fpgaSensorReadings.syringePumpEncPosition; +} + +/*********************************************************************//** + * @brief + * The getFPGASyringePumpADCChannel0 function gets the latest syringe pump ADC + * channel 0 register reading. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last syringe pump ADC channel 0 reading + *************************************************************************/ +U16 getFPGASyringePumpADCChannel0( void ) +{ + return fpgaSensorReadings.syringePumpAdcDataReadCh0; +} + +/*********************************************************************//** + * @brief + * The getFPGASyringePumpADCChannel1 function gets the latest syringe pump ADC + * channel 1 register reading. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last syringe pump ADC channel 1 reading + *************************************************************************/ +U16 getFPGASyringePumpADCChannel1( void ) +{ + return fpgaSensorReadings.syringePumpAdcDataReadCh1; +} + +/*********************************************************************//** + * @brief + * The getFPGASyringePumpADCChannel2 function gets the latest syringe pump ADC + * channel 2 register reading. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last syringe pump ADC channel 2 reading + *************************************************************************/ +U16 getFPGASyringePumpADCChannel2( void ) +{ + return fpgaSensorReadings.syringePumpAdcDataReadCh2; +} + +/*********************************************************************//** + * @brief + * The getFPGASyringePumpADCChannel3 function gets the latest syringe pump ADC + * channel 3 register reading. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last syringe pump ADC channel 3 reading + *************************************************************************/ +U16 getFPGASyringePumpADCChannel3( void ) +{ + return fpgaSensorReadings.syringePumpAdcDataReadCh3; +} + +/*********************************************************************//** + * @brief * The getFPGAAccelAxes function gets the accelerometer axis readings. * Axis readings are in ADC counts. 0.004 g per LSB. * @details Inputs: fpgaSensorReadings Index: firmware/App/Services/FPGA.h =================================================================== diff -u -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 -rc3cf7af051c1ee070df90a9c072df16be48f478f --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision c3cf7af051c1ee070df90a9c072df16be48f478f) @@ -69,6 +69,20 @@ U16 getFPGADialInPumpOcclusion( void ); U16 getFPGADialOutPumpOcclusion( void ); +void setFPGASyringePumpControlFlags( U08 bitFlags ); +void setFPGASyringePumpADCandDACControlFlags( U08 bitFlags ); +void setFPGASyringePumpDACOutputLevel( U16 counts ); +void setFPGASyringePumpStepToggleTime( U32 microSeconds ); +U08 getFPGASyringePumpStatus( void ); +U08 getFPGASyringePumpADCReadCounter( void ); +U08 getFPGASyringePumpADCandDACStatus( void ); +U08 getFPGASyringePumpEncoderStatus( void ); +U32 getFPGASyringePumpEncoderPosition( void ); +U16 getFPGASyringePumpADCChannel0( void ); +U16 getFPGASyringePumpADCChannel1( void ); +U16 getFPGASyringePumpADCChannel2( void ); +U16 getFPGASyringePumpADCChannel3( void ); + void getFPGAAccelAxes( S16 *x, S16 *y, S16 *z ); void getFPGAAccelMaxes( S16 *xm, S16*ym, S16*zm ); void getFPGAAccelStatus( U16 *cnt, U16 *accelFPGAFaultReg ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r53281f1ea1e79cbd6eb8720851af78f2cb543624 -rc3cf7af051c1ee070df90a9c072df16be48f478f --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 53281f1ea1e79cbd6eb8720851af78f2cb543624) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision c3cf7af051c1ee070df90a9c072df16be48f478f) @@ -1293,6 +1293,34 @@ return result; } + +/*********************************************************************//** + * @brief + * The broadcastSyringePumpData function constructs a syringe pump data + * msg to be broadcast and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: syringe pump data msg constructed and queued. + * @param data syringe pump data record + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastSyringePumpData( SYRINGE_PUMP_DATA_PAYLOAD_T data ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_SYRINGE_PUMP_DATA; + msg.hdr.payloadLen = sizeof( SYRINGE_PUMP_DATA_PAYLOAD_T ); + + memcpy( payloadPtr, &data, sizeof( SYRINGE_PUMP_DATA_PAYLOAD_T ) ); + + // 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_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} /*********************************************************************//** * @brief Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r53281f1ea1e79cbd6eb8720851af78f2cb543624 -rc3cf7af051c1ee070df90a9c072df16be48f478f --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 53281f1ea1e79cbd6eb8720851af78f2cb543624) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision c3cf7af051c1ee070df90a9c072df16be48f478f) @@ -31,6 +31,7 @@ #include "MsgQueues.h" #include "NVDataMgmt.h" #include "PresOccl.h" +#include "SyringePump.h" #include "Valves.h" /** @@ -257,6 +258,9 @@ // MSG_ID_DIALYSATE_OUT_FLOW_DATA BOOL broadcastDialOutFlowData( DIAL_OUT_FLOW_DATA_T *dialOutFlowData ); + +// MSG_ID_HD_SYRINGE_PUMP_DATA +BOOL broadcastSyringePumpData( SYRINGE_PUMP_DATA_PAYLOAD_T data ); // MSG_ID_PRESSURE_OCCLUSION_DATA BOOL broadcastPresOcclData( PRESSURE_OCCLUSION_DATA_T data );