Index: firmware/App/Drivers/GLXferPump.c =================================================================== diff -u -rceddc04641038a62bbbd9714a045d0cbfc473c8f -rd595ea4a23b0b2371e31838c24990059653c1871 --- firmware/App/Drivers/GLXferPump.c (.../GLXferPump.c) (revision ceddc04641038a62bbbd9714a045d0cbfc473c8f) +++ firmware/App/Drivers/GLXferPump.c (.../GLXferPump.c) (revision d595ea4a23b0b2371e31838c24990059653c1871) @@ -28,6 +28,8 @@ // ********** private definitions ********** +#define AIR_PUMP_PWM_TIME 800 ///< Time (in 10ns increments) per PWM register count for the air pump. + // ********** private data ********** static U08 currentAirPumpMotorPowerLevel; ///< Current air pump motor state: 0=off, 1..255=power level. @@ -46,7 +48,7 @@ { currentAirPumpMotorPowerLevel = AIR_PUMP_MOTOR_OFF; setAirPumpMotorPowerLevel( currentAirPumpMotorPowerLevel ); - setAirPumpMotorPWMCntTime( 800 ); + setAirPumpMotorPWMCntTime( AIR_PUMP_PWM_TIME ); } /*********************************************************************//** Index: firmware/App/Monitors/Pressures.c =================================================================== diff -u -r285b5d82539c96524c93703d52a66fff76fb64fc -rd595ea4a23b0b2371e31838c24990059653c1871 --- firmware/App/Monitors/Pressures.c (.../Pressures.c) (revision 285b5d82539c96524c93703d52a66fff76fb64fc) +++ firmware/App/Monitors/Pressures.c (.../Pressures.c) (revision d595ea4a23b0b2371e31838c24990059653c1871) @@ -967,14 +967,17 @@ PRESSURE_DATA_T data; data.h2Pressure = getFilteredArterialPressure(); - data.h14Pressure = getFilteredVenousPressure(); - data.presLimitState = currPresLimitsState; - data.h2MinLimit = currentArterialMinLimit; - data.h2MaxLimit = currentArterialMaxLimit; - data.h14MinLimit = currentVenousMinLimit; - data.h14MaxLimit = currentVenousMaxLimit; + data.h14Pressure = getFilteredVenousPressure(); + data.presLimitState = currPresLimitsState; + data.h2MinLimit = currentArterialMinLimit; + data.h2MaxLimit = currentArterialMaxLimit; + data.h14MinLimit = currentVenousMinLimit; + data.h14MaxLimit = currentVenousMaxLimit; data.h2LongFilterPres = longFilteredArterialPressure; - data.h14LongFilterPres = longFilteredVenousPressure; + data.h14LongFilterPres = longFilteredVenousPressure; + data.tmpPressure = 0.0F; + data.tmpMinLimit = 0.0F; + data.tmpMaxLimit = 0.0F; broadcastData( MSG_ID_TD_PRESSURE_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( PRESSURE_DATA_T ) ); pressureDataPublicationTimerCounter = 0; Index: firmware/App/Monitors/Pressures.h =================================================================== diff -u -rf3a26c402a2ec88f5ee7dbb8eb7127ab5b4692aa -rd595ea4a23b0b2371e31838c24990059653c1871 --- firmware/App/Monitors/Pressures.h (.../Pressures.h) (revision f3a26c402a2ec88f5ee7dbb8eb7127ab5b4692aa) +++ firmware/App/Monitors/Pressures.h (.../Pressures.h) (revision d595ea4a23b0b2371e31838c24990059653c1871) @@ -65,6 +65,9 @@ S32 h14MaxLimit; ///< Current venous maximum pressure limit (mmHg) F32 h2LongFilterPres; ///< Latest long filtered arterial pressure (mmHg) F32 h14LongFilterPres; ///< Latest long filtered venous pressure (mmHg) + F32 tmpPressure; ///< Latest trans-membrane pressure (mmHg) + F32 tmpMinLimit; ///< Current TMP minimum pressure limit (mmHg) + F32 tmpMaxLimit; ///< Current TMP maximum pressure limit (mmHg) } PRESSURE_DATA_T; // ********** public function prototypes ********** Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r552a7de419344b43a3307c61141c99bfbbee7345 -rd595ea4a23b0b2371e31838c24990059653c1871 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 552a7de419344b43a3307c61141c99bfbbee7345) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision d595ea4a23b0b2371e31838c24990059653c1871) @@ -143,6 +143,7 @@ SW_FAULT_ID_TD_VALVES_INVALID_STATE = 112, SW_FAULT_ID_BLOOD_FLOW_SET_TOO_HIGH = 113, SW_FAULT_ID_BLOOD_FLOW_INVALID_BLOOD_PUMP_STATE = 114, + SW_FAULT_ID_INVALID_DD_PRESSURE_DATA = 115, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/DDInterface.c =================================================================== diff -u -r8cbddbe34a4ffed5a4d9fac07a065799c5862611 -rd595ea4a23b0b2371e31838c24990059653c1871 --- firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision 8cbddbe34a4ffed5a4d9fac07a065799c5862611) +++ firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision d595ea4a23b0b2371e31838c24990059653c1871) @@ -16,6 +16,7 @@ ***************************************************************************/ #include "DDInterface.h" +#include "MessagePayloads.h" #include "Messaging.h" #include "ModeInitPOST.h" #include "OperationModes.h" @@ -38,10 +39,12 @@ // DG status static DD_OP_MODE_T ddCurrentOpMode; ///< Current DD operation mode. static U32 ddSubMode; ///< Current state (sub-mode) of current DD operation mode. +static F32 dialysatePressure; ///< Current dialysate pressure reported by DD. static BOOL ddStartCommandSent; ///< Flag indicates command to start DD has been sent. static BOOL ddStarted; ///< Flag indicates whether we have commanded the DD to start or stop. -static BOOL ddOpModeDataFreshFlag = FALSE; ///< Flag to signal the handleDDOpMode() to process fresh dd op mode data +static BOOL ddOpModeDataFreshFlag; ///< Flag to signal the handleDDOpMode() to process fresh dd op mode data +static BOOL ddDialysatePressureFreshFlag; ///< Flag to signal // DG command response static DD_CMD_RESPONSE_T ddCmdResp[ NUM_OF_DD_COMMANDS ]; ///< Keep the latest DD command response for each command. @@ -66,8 +69,12 @@ ddStarted = FALSE; ddCurrentOpMode = DD_MODE_INIT; ddSubMode = 0; + dialysatePressure = 0.0F; ddStartCommandSent = FALSE; + ddOpModeDataFreshFlag = FALSE; + ddDialysatePressureFreshFlag = FALSE; + // initialize DD command response for ( i = 0; i < NUM_OF_DD_COMMANDS; i++ ) { @@ -123,7 +130,7 @@ void execDDInterfaceMonitor( void ) { // if ( getCPLDACPowerLossDetected() != TRUE ) - { +// { // Trigger alarm if not receiving new DD op mode message in timely manner // checkDDDataFreshness( ALARM_ID_TD_DD_NEW_OPERATION_MODE_MESSAGE_NOT_RECEIVE, &ddOpModeDataFreshFlag ); // if ( TRUE == isAlarmActive( ALARM_ID_TD_DD_NEW_OPERATION_MODE_MESSAGE_NOT_RECEIVE ) ) @@ -133,8 +140,8 @@ // } // Check to see if DD has restarted - checkDDRestart(); - } +// checkDDRestart(); +// } } /*********************************************************************//** @@ -168,33 +175,171 @@ * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if reported DD mode is invalid. * @details \b Inputs: none * @details \b Outputs: ddCurrentOpMode, ddSubMode, ddOpModeDataFreshFlag - * @param opMode The operating mode reported by DD - * @param subMode The sub-mode of operating mode reported by DD - * @return none + * @param message Pointer to the DD operation mode broadcast message + * @return TRUE if message handled successfully, FALSE if not *************************************************************************/ -void setDDOpMode( U32 opMode, U32 subMode ) +BOOL setDDOpMode( MESSAGE_T *message ) { - if ( opMode < NUM_OF_DD_MODES ) + BOOL result = FALSE; + U32 opMode, subMode; + + // parse message payload + memcpy( &opMode, &message->payload[ 0 ], sizeof( U32 ) ); + memcpy( &subMode, &message->payload[ sizeof( U32 ) ], sizeof( U32 ) ); + + if ( ( message->hdr.payloadLen == sizeof( OP_MODE_PAYLOAD_T ) ) && ( opMode < NUM_OF_DD_MODES ) ) { - // reset POST passed flag if DG restarted or faulted or went to service mode + // reset POST passed flag if DD restarted or faulted or went to service mode if ( ( opMode < DD_MODE_STAN ) && ( ddCurrentOpMode >= DD_MODE_STAN ) ) { signalDDPOSTFinalResult( FALSE ); } - // update DG op mode and sub-mode + // update DD op mode and sub-mode ddCurrentOpMode = (DD_OP_MODE_T)opMode; ddSubMode = subMode; + result = TRUE; } else { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_DD_OPERATING_MODE, opMode ); } ddOpModeDataFreshFlag = TRUE; + + return result; } /*********************************************************************//** * @brief + * The getDialysatePressure function gets the latest reported dialysate + * pressure. + * @details \b Inputs: dialysatePressure + * @details \b Outputs: none + * @return Latest reported dialysate pressure. + *************************************************************************/ +F32 getDialysatePressure( void ) +{ + return dialysatePressure; +} + +/*********************************************************************//** + * @brief + * The setDialysatePressure function sets the latest dialysate pressure + * reported by the DD sub-system. + * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if message invalid. + * @details \b Inputs: none + * @details \b Outputs: dialysatePressure, ddDialysatePressureFreshFlag + * @param message Pointer to the DD pressure data broadcast message + * @return TRUE if message handled successfully, FALSE if not + *************************************************************************/ +BOOL setDialysatePressure( MESSAGE_T *message ) +{ + BOOL result = FALSE; + DD_PRESSURE_TEMP_DATA_T payload; + + // parse message payload + memcpy( &payload, &message->payload[ 0 ], sizeof( DD_PRESSURE_TEMP_DATA_T ) ); + + if ( message->hdr.payloadLen == sizeof( DD_PRESSURE_TEMP_DATA_T ) ) + { + // update dialysate pressure + dialysatePressure = payload.d41Pressure; + result = TRUE; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_DD_PRESSURE_DATA, (U32)message->hdr.payloadLen ); + } + + ddDialysatePressureFreshFlag = TRUE; + + return result; +} + +/*********************************************************************//** + * @brief + * The cmdStartGenerateDialysate function sends a generate dialysate command + * to the DD with a given set of details. DG will transition to generate + * dialysate mode if it hasn't already. + * @details \b Inputs: none + * @details \b Outputs: none + * @details \b Message \b Sent: Start/continue generate dialysate command. + * @param qd Target dialysate flow rate (Qd). + * @param quf Target ultrafiltration rate (Quf). + * @param dialTemp Target dialysate temperature in deg C. + * @param bypass Flag indicating whether dialyzer should be bypassed. + * @param acid Type of acid concentrate used. + * @param bicarb Type of bicarbonate concentrate used. + * @return none + *************************************************************************/ +void cmdStartGenerateDialysate( F32 qd, F32 quf, F32 dialTemp, BOOL bypass, ACID_CONCENTRATE_TYPE_T acid, BICARB_CONCENTRATE_TYPE_T bicarb ) +{ + DIALYSATE_DELIVERY_REQ_PAYLOAD_T payload; + + payload.start = TRUE; + payload.dialRate = qd; + payload.ufRate = quf; + payload.dialTemp = dialTemp; + payload.bypassDialyzer = bypass; + payload.acidType = (U32)acid; + payload.bicarbType = (U32)bicarb; + + sendMessage( MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08*)(&payload), sizeof( DIALYSATE_DELIVERY_REQ_PAYLOAD_T ) ); +} + +/*********************************************************************//** + * @brief + * The cmdStopGenerateDialysate function sends a stop generate dialysate command + * to the DD. DD will transition back to standby mode. + * @details \b Inputs: none + * @details \b Outputs: none + * @details \b Message \b Sent: Stop generate dialysate command. + * @return none + *************************************************************************/ +void cmdStopGenerateDialysate( void ) +{ + DIALYSATE_DELIVERY_REQ_PAYLOAD_T payload; + + memset( &payload, 0, sizeof( DIALYSATE_DELIVERY_REQ_PAYLOAD_T ) ); + payload.start = FALSE; + + sendMessage( MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08*)(&payload), sizeof( DIALYSATE_DELIVERY_REQ_PAYLOAD_T ) ); +} + +/**********************************************************************//** + * @brief + * The checkDDDataFreshness function checks to verify that needed data from + * the DD sub-system is coming regularly to keep the data fresh. + * @details Alarm: Data freshness alarm triggered if fresh data not received + * within 2 seconds of last data broadcast. + * @details Inputs: none + * @details Outputs: ddFreshDataFlag set to FALSE + * @param alarm ID of alarm to check + * @param ddFreshDataFlag flag indicating whether data is fresh + * @return None + *************************************************************************/ +static void checkDDDataFreshness( ALARM_ID_T alarmID, BOOL *ddFreshDataFlag ) +{ + if ( TRUE == *ddFreshDataFlag ) + { + *ddFreshDataFlag = FALSE; + checkPersistentAlarm( alarmID, FALSE, 0.0, 0.0 ); + } + else + { // Alarm if not receiving DG fresh data message in timely manner + if ( TRUE == isDDCommunicating() ) + { + checkPersistentAlarm( alarmID, TRUE, 0.0, 0.0 ); + } + else + { + checkPersistentAlarm( alarmID, FALSE, 0.0, 0.0 ); + } + } +} + +/*********************************************************************//** + * @brief * The handleDDCommandResponse function processes the latest DD command response. * @details \b Alarm: ALARM_ID_TD_DD_COMMAND_INVALID_PARAMETER_FAULT if reported * response indicates DD rejected command due to invalid parameter. Index: firmware/App/Services/DDInterface.h =================================================================== diff -u -r380b0afc95467d0861ff3aa2cdcde5d5d7ac85e7 -rd595ea4a23b0b2371e31838c24990059653c1871 --- firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision 380b0afc95467d0861ff3aa2cdcde5d5d7ac85e7) +++ firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision d595ea4a23b0b2371e31838c24990059653c1871) @@ -19,6 +19,7 @@ #define __DD_INTERFACE_H__ #include "TDCommon.h" +#include "TDDefs.h" #include "DDDefs.h" /** @@ -31,7 +32,7 @@ */ // ********** public definitions ********** - + /// DD command response data record structure. typedef struct { @@ -48,8 +49,14 @@ DD_OP_MODE_T getDDOpMode( void ); U32 getDDSubMode( void ); -void setDDOpMode( U32 opMode, U32 subMode ); +F32 getDialysatePressure( void ); +BOOL setDDOpMode( MESSAGE_T *message ); +BOOL setDialysatePressure( MESSAGE_T *message ); + +void cmdStartGenerateDialysate( F32 qd, F32 quf, F32 dialTemp, BOOL bypass, ACID_CONCENTRATE_TYPE_T acid, BICARB_CONCENTRATE_TYPE_T bicarb ); +void cmdStopGenerateDialysate( void ); + void handleDDCommandResponse( DD_CMD_RESPONSE_T *ddCmdRespPtr ); BOOL getDDCommandResponse( U32 commandID, DD_CMD_RESPONSE_T *cmdRespPtr ); Index: firmware/App/Services/Messaging.c =================================================================== diff -u -rf1d812de6fbaf4943d05bbee2271bcb61138325a -rd595ea4a23b0b2371e31838c24990059653c1871 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision f1d812de6fbaf4943d05bbee2271bcb61138325a) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision d595ea4a23b0b2371e31838c24990059653c1871) @@ -25,6 +25,7 @@ #include "Buttons.h" #include "Compatible.h" #include "CpldInterface.h" +#include "DDInterface.h" #include "LevelSensors.h" #include "Messaging.h" #include "OperationModes.h" @@ -82,6 +83,8 @@ /// Message handling function lookup table static const U16 MSG_FUNCTION_HANDLER_LOOKUP[] = { + MSG_ID_DD_OP_MODE_DATA, + MSG_ID_DD_PRESSURES_DATA, MSG_ID_TESTER_LOGIN_REQUEST, MSG_ID_TD_SOFTWARE_RESET_REQUEST, MSG_ID_TD_BUBBLE_OVERRIDE_REQUEST, @@ -129,6 +132,8 @@ /// Message handling function table static const MsgFuncPtr MSG_FUNCTION_HANDLERS[] = { + &setDDOpMode, + &setDialysatePressure, &handleTesterLogInRequest, &testTDSoftwareResetRequest, &testBubbleDetectOverride, Index: firmware/App/TDCommon.h =================================================================== diff -u -rceddc04641038a62bbbd9714a045d0cbfc473c8f -rd595ea4a23b0b2371e31838c24990059653c1871 --- firmware/App/TDCommon.h (.../TDCommon.h) (revision ceddc04641038a62bbbd9714a045d0cbfc473c8f) +++ firmware/App/TDCommon.h (.../TDCommon.h) (revision d595ea4a23b0b2371e31838c24990059653c1871) @@ -32,7 +32,7 @@ #ifndef _RELEASE_ #ifndef _VECTORCAST_ // #define TASK_TIMING_OUTPUT_ENABLED 1 // Re-purposes alarm lamp pins for task timing - #define TEST_AIR_TRAP_ALPHA_TESTING 1 // Alpha unit air trap testing +// #define TEST_AIR_TRAP_ALPHA_TESTING 1 // Alpha unit air trap testing #include #include