Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r6b870cd0699bb3ee22b93981d51373a6c2d56162 -rbb80dbac26147ab08413efa91007f7ffed43c38f --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 6b870cd0699bb3ee22b93981d51373a6c2d56162) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) @@ -251,6 +251,7 @@ if ( MODE_FAUL == getCurrentOperationMode() ) { airTrapControllerState = AIR_TRAP_MANUAL_CONTROL_STATE; + setValveAirTrap( STATE_CLOSED ); pendingStartAirTrapController = FALSE; } Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -rea24d974f95d6d304746120d61774c196d0fc589 -rbb80dbac26147ab08413efa91007f7ffed43c38f --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision ea24d974f95d6d304746120d61774c196d0fc589) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) @@ -156,6 +156,7 @@ 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 }; @@ -230,6 +231,7 @@ void initSyringePump( void ) { syringePumpState = SYRINGE_PUMP_INIT_STATE; + heparinDeliveryState = HEPARIN_STATE_OFF; syringePumpSelfTestState = SYRINGE_PUMP_SELF_TEST_STATE_START; syringePumpSetRate = 0.0; @@ -271,6 +273,96 @@ /*********************************************************************//** * @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 @@ -281,6 +373,10 @@ 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; + } } /*********************************************************************//** @@ -292,7 +388,7 @@ *************************************************************************/ BOOL retractSyringePump( void ) { - if ( ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && ( FALSE == isSyringeDetected() ) ) + if ( ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && ( FALSE == isSyringeDetected() ) && ( heparinDeliveryState != HEPARIN_STATE_OFF ) ) { syringePumpSetRate = SYRINGE_PUMP_RETRACT_RATE; syringePumpRetractRequested = TRUE; @@ -311,7 +407,7 @@ BOOL primeSyringePump( void ) { if ( ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && ( TRUE == isSyringeDetected() ) && - ( TRUE == isSyringePumpHome() ) ) + ( TRUE == isSyringePumpHome() ) && ( heparinDeliveryState != HEPARIN_STATE_OFF ) ) { syringePumpSetRate = SYRINGE_PUMP_SEEK_RATE; syringePumpPrimeRequested = TRUE; @@ -337,7 +433,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 ) ) + if ( ( TRUE == isSyringeDetected() ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && ( HEPARIN_STATE_STOPPED == heparinDeliveryState ) ) { syringePumpSetRate = tgtRate; syringePumpBolusRequested = TRUE; @@ -366,7 +462,8 @@ if ( ( flowRate >= MIN_HEPARIN_CONTINUOUS_RATE ) && ( flowRate <= MAX_HEPARIN_CONTINUOUS_RATE ) && ( FALSE == isSyringePumpHome() ) ) { - if ( ( TRUE == isSyringeDetected() ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) ) + if ( ( TRUE == isSyringeDetected() ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && + ( ( ( HEPARIN_STATE_STOPPED == heparinDeliveryState ) || ( HEPARIN_STATE_PAUSED == heparinDeliveryState ) ) ) ) { syringePumpSetRate = flowRate; syringePumpContinuousRequested = TRUE; @@ -778,10 +875,12 @@ } 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 ) @@ -1011,18 +1110,21 @@ // 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 for commanded vs. meas. rate - stopPump = checkMaxMeasRate( stopPump, SYRINGE_PUMP_RATE_CHECK_MARGIN ); + // Check if time to stop Heparin delivery + // TODO - implement pre-stop check // 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 ) { @@ -1079,6 +1181,7 @@ 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 @@ -1133,6 +1236,7 @@ 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 ) @@ -1306,9 +1410,11 @@ data.syringePumpPosition = getSyringePumpPosition(); data.syringePumpSetRate = syringePumpSetRate; data.syringePumpState = (U32)syringePumpState; + data.heparinDeliveryState = (U32)heparinDeliveryState; data.syringePumpVolumeDelivered = getSyringePumpVolumeDelivered(); - broadcastSyringePumpData( data ); + broadcastSyringePumpData( data ); + broadcastHeparinData( data.syringePumpVolumeDelivered ); syringePumpDataPublicationTimerCounter = 0; } } Index: firmware/App/Controllers/SyringePump.h =================================================================== diff -u -rdb22e9d530c5c9d62b02e6dcc72ed96fb67c165a -rbb80dbac26147ab08413efa91007f7ffed43c38f --- firmware/App/Controllers/SyringePump.h (.../SyringePump.h) (revision db22e9d530c5c9d62b02e6dcc72ed96fb67c165a) +++ firmware/App/Controllers/SyringePump.h (.../SyringePump.h) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) @@ -19,6 +19,7 @@ #define __SYRINGE_PUMP_H__ #include "HDCommon.h" +#include "HDDefs.h" /** * @defgroup SyringePump SyringePump @@ -54,6 +55,7 @@ typedef struct { U32 syringePumpState; + U32 heparinDeliveryState; F32 syringePumpSetRate; F32 syringePumpMeasRate; S32 syringePumpPosition; @@ -68,6 +70,9 @@ 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/Dialysis.c =================================================================== diff -u -r174c9ba02da6790f01ea9141ab1cc1d28388f2f8 -rbb80dbac26147ab08413efa91007f7ffed43c38f --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 174c9ba02da6790f01ea9141ab1cc1d28388f2f8) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) @@ -995,7 +995,7 @@ { SALINE_BOLUS_DATA_PAYLOAD_T data; - data.maxSalineVolumeMl = MAX_SALINE_VOLUME_DELIVERED; + data.tgtSalineVolumeMl = getTreatmentParameterU32( TREATMENT_PARAM_SALINE_BOLUS_VOLUME ); data.cumSalineVolumeMl = totalSalineVolumeDelivered; data.bolSalineVolumeMl = bolusSalineVolumeDelivered; broadcastSalineBolusData( data ); Index: firmware/App/Modes/Dialysis.h =================================================================== diff -u -r1afd5c87ef15399998a743c2ebcafe2cc03bd363 -rbb80dbac26147ab08413efa91007f7ffed43c38f --- firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 1afd5c87ef15399998a743c2ebcafe2cc03bd363) +++ firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) @@ -41,7 +41,7 @@ /// Payload record structure for a saline bolus data broadcast message. typedef struct { - U32 maxSalineVolumeMl; + U32 tgtSalineVolumeMl; F32 cumSalineVolumeMl; F32 bolSalineVolumeMl; } SALINE_BOLUS_DATA_PAYLOAD_T; Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -r9798f57bc288270fe058fe098a76088cbb34d50c -rbb80dbac26147ab08413efa91007f7ffed43c38f --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 9798f57bc288270fe058fe098a76088cbb34d50c) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) @@ -24,6 +24,7 @@ #include "DialOutFlow.h" #include "ModeTreatmentParams.h" #include "OperationModes.h" +#include "SyringePump.h" #include "SystemCommMessages.h" /** @@ -349,6 +350,16 @@ origTreatmentParams.venousPressureLowLimit_mmHg = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT ] ).sInt; origTreatmentParams.venousPressureHighLimit_mmHg = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT ] ).sInt; + // If using Heparin in this treatment, set state to stopped otherwise off + if ( ( stagedParams[ TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ] > 0.0 ) || ( stagedParams[ TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ] > 0.0 ) ) + { + setHeparinStopped(); + } + else + { + setHeparinOff(); + } + // Go to pre-treatment mode requestNewOperationMode( MODE_PRET ); @@ -596,11 +607,12 @@ *************************************************************************/ static void sendTreatmentParamsResponse( BOOL rejected, U32 *reasons ) { + BOOL accepted = ( TRUE == rejected ? FALSE : TRUE ); U32 respPayload[NUM_OF_TREATMENT_PARAMS]; memcpy( &respPayload[0], &reasons[0], sizeof(TREATMENT_PARAMS_DATA_PAYLOAD_T) ); - sendTreatmentParametersResponseMsg( rejected, (U08*)(&respPayload[0]), ( NUM_OF_TREATMENT_PARAMS - 1 ) * sizeof(U32) ); // UF vol. param not included in reject reasons + sendTreatmentParametersResponseMsg( accepted, (U08*)(&respPayload[0]), ( NUM_OF_TREATMENT_PARAMS - 1 ) * sizeof(U32) ); // UF vol. param not included in reject reasons } /*********************************************************************//** Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r27f3db92495948d4c1192421c1b0c20338c4a034 -rbb80dbac26147ab08413efa91007f7ffed43c38f --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 27f3db92495948d4c1192421c1b0c20338c4a034) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) @@ -118,8 +118,6 @@ static void handleDrySelfTestsStopRequest( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestBubbleDetectorsState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestAirTrapState( void ); 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 ); @@ -284,10 +282,10 @@ case NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE: // TODO: Implement self tests - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_DOOR_SWITCH_STATE; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_HOMING_STATE; break; - case NO_CART_SELF_TESTS_DOOR_SWITCH_STATE: + case NO_CART_SELF_TESTS_START_HOMING_STATE: // TODO: Implement self tests currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; break; @@ -386,14 +384,6 @@ currentDrySelfTestsState = handleDrySelfTestWaitForDoorCloseState(); break; - case DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE: - currentDrySelfTestsState = handleDrySelfTestBubbleDetectorsState(); - break; - - case DRY_SELF_TESTS_AIR_TRAP_STATE: - currentDrySelfTestsState = handleDrySelfTestAirTrapState(); - break; - case DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE: if ( SELF_TEST_STATUS_PASSED == execPresOcclDryTest() ) { @@ -740,60 +730,8 @@ if ( STATE_CLOSED == getFPGADoorState() ) { - state = DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE; - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handleDrySelfTestBubbleDetectorsState function verify no fluid is detected - * by bubble detectors. - * @details Inputs: none - * @details Outputs: none - * @return the next state of dry self-tests state machine - *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestBubbleDetectorsState( void ) -{ - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE; - - BOOL const isADADetectedAir = getFPGAArterialAirBubbleStatus(); - BOOL const isADVDetectedAir = getFPGAVenousAirBubbleStatus(); - - if ( ( TRUE == isADADetectedAir ) && ( TRUE == isADVDetectedAir ) ) - { - state = DRY_SELF_TESTS_AIR_TRAP_STATE; - } - else - { - activateAlarmNoData( ALARM_ID_INSTALL_NEW_CARTRIDGE ); - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handleDrySelfTestAirTrapState function verify no fluid is detected - * by air trap. - * @details Inputs: none - * @details Outputs: none - * @return the next state of dry self-tests state machine - *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestAirTrapState( void ) -{ - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_AIR_TRAP_STATE; - - if ( ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) && - ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) ) - { state = DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE; } - else - { - activateAlarmNoData( ALARM_ID_INSTALL_NEW_CARTRIDGE ); - } return state; } Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r5b3be58e0b2dc2ffce534363f85023d03ca561ba -rbb80dbac26147ab08413efa91007f7ffed43c38f --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 5b3be58e0b2dc2ffce534363f85023d03ca561ba) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) @@ -1191,6 +1191,10 @@ handleChangePressureLimitsRequest( message ); break; + case MSG_ID_UI_HEPARIN_PAUSE_RESUME_REQUEST: + handleHeparinCommandRequest( message ); + break; + case MSG_ID_UI_SET_UF_VOLUME_PARAMETER: handleUFVolumeSetRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r5b3be58e0b2dc2ffce534363f85023d03ca561ba -rbb80dbac26147ab08413efa91007f7ffed43c38f --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 5b3be58e0b2dc2ffce534363f85023d03ca561ba) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) @@ -433,6 +433,41 @@ return result; } +/*********************************************************************//** + * @brief + * The sendHeparinCommandResponse function constructs a Heparin command response + * to the UI and queues the msg for transmit on the + * appropriate CAN channel. + * @details Inputs: none + * @details Outputs: Heparin command response msg constructed and queued. + * @param accepted flag indicating whether request was accepted + * @param rejReason rejection reason code + * @param heparinDeliveryState current Heparin delivery state + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendHeparinCommandResponse( U32 accepted, U32 rejReason, U32 heparinDeliveryState ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_PRESSURE_LIMITS_CHANGE_RESPONSE; + msg.hdr.payloadLen = sizeof( U32 ) * 3; + + memcpy( payloadPtr, &accepted, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &rejReason, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &heparinDeliveryState, sizeof( U32 ) ); + + // 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 sendTreatmentParamsRangesToUI function constructs a treatment parameter @@ -1049,6 +1084,34 @@ result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_BROADCAST, ACK_NOT_REQUIRED ); return result; +} + +/*********************************************************************//** + * @brief + * The broadcastHeparinData function constructs a Heparin data message + * to be broadcast and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: Heparin data msg constructed and queued. + * @param data Heparin data record + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastHeparinData( F32 volume ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_HEPARIN_DATA_BROADCAST; + msg.hdr.payloadLen = sizeof( F32 ); + + memcpy( payloadPtr, &volume, sizeof( F32 ) ); + + // 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; } /*********************************************************************//** @@ -1965,12 +2028,12 @@ * response to the UI and queues the msg for transmit on the appropriate CAN channel. * @details Inputs: none * @details Outputs: Treatment parameters response msg constructed and queued. - * @param rejected T/F - are settings rejected? + * @param accepted T/F - are settings accepted? * @param rejectReasons reasons each parameter was rejected (if not accepted) * @param byteLength number of bytes that array of reject reasons takes * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL sendTreatmentParametersResponseMsg( BOOL rejected, U08 *rejectReasons, U32 byteLength ) +BOOL sendTreatmentParametersResponseMsg( BOOL accepted, U08 *rejectReasons, U32 byteLength ) { BOOL result; MESSAGE_T msg; @@ -1981,7 +2044,7 @@ msg.hdr.msgID = MSG_ID_HD_NEW_TREATMENT_PARAMS_RESPONSE; msg.hdr.payloadLen = sizeof( BOOL ) + byteLength; - memcpy( payloadPtr, &rejected, sizeof( BOOL ) ); + memcpy( payloadPtr, &accepted, sizeof( BOOL ) ); payloadPtr += sizeof( BOOL ); memcpy( payloadPtr, rejectReasons, byteLength ); @@ -2181,6 +2244,31 @@ /*********************************************************************//** * @brief + * The handleHeparinCommandRequest function handles a Heparin command + * request message from the UI. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleHeparinCommandRequest( MESSAGE_T *message ) +{ + if ( sizeof( U32 ) == message->hdr.payloadLen ) + { + U32 payload; + + memcpy( &payload, &message->payload[0], sizeof( U32 ) ); + + userHeparinRequest( (HEPARIN_CMD_T)payload ); + } + else + { + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); + } +} + +/*********************************************************************//** + * @brief * The handleSalineBolusRequest function handles a saline bolus request * message from the UI. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r5b3be58e0b2dc2ffce534363f85023d03ca561ba -rbb80dbac26147ab08413efa91007f7ffed43c38f --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 5b3be58e0b2dc2ffce534363f85023d03ca561ba) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) @@ -104,7 +104,7 @@ void handleTreatmentParametersFromUI( MESSAGE_T *message ); // MSG_ID_HD_NEW_TREATMENT_PARAMS_RESPONSE -BOOL sendTreatmentParametersResponseMsg( BOOL rejected, U08 *rejectReasons, U32 byteLength ); +BOOL sendTreatmentParametersResponseMsg( BOOL accepted, U08 *rejectReasons, U32 byteLength ); // MSG_ID_UI_SET_UF_VOLUME_PARAMETER void handleUFVolumeSetRequest( MESSAGE_T *message ); @@ -163,6 +163,12 @@ // MSG_ID_HD_PRESSURE_LIMITS_CHANGE_RESPONSE BOOL sendPressureLimitsChangeResponse( PRESSURE_LIMIT_CHANGE_RESPONSE_T *data ); +// MSG_ID_UI_HEPARIN_PAUSE_RESUME_REQUEST +void handleHeparinCommandRequest( MESSAGE_T *message ); + +// MSG_ID_HD_HEPARIN_PAUSE_RESUME_RESPONSE +BOOL sendHeparinCommandResponse( U32 accepted, U32 rejReason, U32 heparinDeliveryState ); + // MSG_ID_UI_RINSEBACK_CMD void handlRinsebackCmd( MESSAGE_T *message ); @@ -239,7 +245,10 @@ BOOL broadcastDialOutFlowData( DIAL_OUT_FLOW_DATA_T *dialOutFlowData ); // MSG_ID_HD_SYRINGE_PUMP_DATA -BOOL broadcastSyringePumpData( SYRINGE_PUMP_DATA_PAYLOAD_T data ); +BOOL broadcastSyringePumpData( SYRINGE_PUMP_DATA_PAYLOAD_T data ); + +// MSG_ID_HD_HEPARIN_DATA_BROADCAST +BOOL broadcastHeparinData( F32 volume ); // MSG_ID_PRESSURE_OCCLUSION_DATA BOOL broadcastPresOcclData( PRESSURE_OCCLUSION_DATA_T data );