Index: firmware/App/Services/DDInterface.c =================================================================== diff -u -re9e339870c5ed01230963f00d400331ab879c91f -r6f876554db45a19590eaf2122ef47e33f7a7d69b --- firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision e9e339870c5ed01230963f00d400331ab879c91f) +++ firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision 6f876554db45a19590eaf2122ef47e33f7a7d69b) @@ -45,6 +45,7 @@ static BOOL ddOpModeDataFreshFlag; ///< Flag to signal the handleDDOpMode() to process fresh dd op mode data. static BOOL ddDialysatePressureFreshFlag; ///< Flag to signal +static BOOL dialysateGoodToDeliver; ///< Flag indicates dialysate readiness (from GEN_DIALYSATE_MODE_DATA_T broadcast). static DIALYSATE_DELIVERY_REQ_PAYLOAD_T dialysateDeliveryCmdSet; ///< Set of dialysate delivery parameters to send to the DD during treatment. @@ -73,6 +74,7 @@ ddOpModeDataFreshFlag = FALSE; ddDialysatePressureFreshFlag = FALSE; + dialysateGoodToDeliver = FALSE; resetDDInterface(); @@ -109,6 +111,7 @@ dialysateDeliveryCmdSet.bicarbConvFactor = 0.0F; dialysateDeliveryCmdSet.sodium = 0; dialysateDeliveryCmdSet.bicarbonate = 0; + dialysateDeliveryCmdSet.substitutionRate = 0.0F; } /**********************************************************************//** @@ -312,6 +315,7 @@ dialysateDeliveryCmdSet.bicarbConvFactor = bicarbConvFactor; dialysateDeliveryCmdSet.sodium = sodium; dialysateDeliveryCmdSet.bicarbonate = bicarbonate; + dialysateDeliveryCmdSet.substitutionRate = 0.0F; #ifndef TEST_UI_ONLY sendMessage( MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08*)(&dialysateDeliveryCmdSet), sizeof( DIALYSATE_DELIVERY_REQ_PAYLOAD_T ) ); @@ -509,7 +513,79 @@ // } } +/*********************************************************************//** + * @brief + * The cmdSubstitutionRate function sends a generate dialysate command to + * the DD with a given substitution (D92) pump rate for HDF / HD-online + * fluid bolus delivery. + * @details \b Message \b Sent: MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA + * @details \b Inputs: none + * @details \b Outputs: dialysateDeliveryCmdSet + * @param qs Target substitution flow rate (mL/min) + * @return none + *************************************************************************/ +void cmdSubstitutionRate( F32 qs ) +{ + if ( TRUE == dialysateDeliveryCmdSet.start ) + { + dialysateDeliveryCmdSet.substitutionRate = qs; +#ifndef TEST_UI_ONLY + sendMessage( MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08*)(&dialysateDeliveryCmdSet), sizeof( DIALYSATE_DELIVERY_REQ_PAYLOAD_T ) ); +#endif + } + else + { + // TODO - s/w fault? + } +} +/*********************************************************************//** + * @brief + * The isDialysateGoodToDeliver function returns the latest DD-reported + * dialysate readiness flag, cached from the DD gen-dialysate state + * broadcast. Used by the fluid bolus service to gate substitution bolus + * start and to monitor during delivery. + * @details \b Inputs: dialysateGoodToDeliver + * @details \b Outputs: none + * @return TRUE if dialysate is ready to deliver per DD, FALSE otherwise. +**************************************************************************/ +BOOL isDialysateGoodToDeliver( void ) +{ + return dialysateGoodToDeliver; +} + +/*********************************************************************//** + * @brief + * The setGenDialysateModeData function processes the DD generate-dialysate + * mode data broadcast and caches the dialysate readiness flag. + * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if message payload invalid. + * @details \b Inputs: none + * @details \b Outputs: dialysateGoodToDeliver + * @param message Pointer to DD generate-dialysate state broadcast message. + * @return TRUE if message handled successfully, FALSE if not. + *************************************************************************/ +BOOL setGenDialysateModeData( MESSAGE_T *message ) +{ + BOOL result = FALSE; + GEN_DIALYSATE_MODE_DATA_T payload; + + if ( sizeof( GEN_DIALYSATE_MODE_DATA_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, &message->payload[0], sizeof( GEN_DIALYSATE_MODE_DATA_T ) ); + dialysateGoodToDeliver = payload.isDialysateGoodtoDeliver; + result = TRUE; + } + else + { +#ifndef TEST_UI_ONLY + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_DD_GEN_DIALYSATE_DATA, (U32)message->hdr.payloadLen ); +#endif + } + + return result; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/