Index: firmware/App/Modes/SampleWater.c =================================================================== diff -u -rb6b733b8d1f25bc2dbe2a94c620cd80aa3ae06f7 -r401c4027b0e59182771f0c620465b34579f203f5 --- firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision b6b733b8d1f25bc2dbe2a94c620cd80aa3ae06f7) +++ firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision 401c4027b0e59182771f0c620465b34579f203f5) @@ -15,6 +15,7 @@ * ***************************************************************************/ +#include "AlarmMgmt.h" #include "DGInterface.h" #include "HDDefs.h" #include "SampleWater.h" @@ -134,6 +135,62 @@ /*********************************************************************//** * @brief + * The signalSampleWaterUserAction function signals a sample water user action + * has been requested. The request is handled and responded to. + * @details Inputs: none + * @details Outputs: action handled, request reponsed to + * @param action User action requested + * @return none + *************************************************************************/ +void signalSampleWaterUserAction( REQUESTED_SAMPLE_WATER_USER_ACTIONS_T action ) +{ + BOOL accepted = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; + + // Reject user action requests if any alarm is currently active. User must clear alarm first. + if ( FALSE == isAnyAlarmActive() ) + { + switch ( action ) + { + case REQUESTED_USER_ACTION_SAMPLE_WATER_STOP: + if ( SAMPLE_WATER_STATE == currentSampleWaterState ) + { + sampleWaterStopRequested = TRUE; + accepted = TRUE; + } + else + { + rejReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; + } + break; + + case REQUESTED_USER_ACTION_SAMPLE_WATER_START: + if ( SAMPLE_WATER_STATE == currentSampleWaterState ) + { + sampleWaterStartRequested = TRUE; + accepted = TRUE; + } + else + { + rejReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; + } + break; + + default: + rejReason = REQUEST_REJECT_REASON_INVALID_COMMAND; + break; + } + } + else + { + rejReason = REQUEST_REJECT_REASON_ALARM_IS_ACTIVE; + } + + sendSampleWaterCmdResponse( accepted, (U32)rejReason ); +} + +/*********************************************************************//** + * @brief * The handleWaterSampleSetupState function waits for filter flush period elapsed. * @details Inputs: flushTimerCounter * @details Outputs: none Index: firmware/App/Modes/SampleWater.h =================================================================== diff -u -rb6b733b8d1f25bc2dbe2a94c620cd80aa3ae06f7 -r401c4027b0e59182771f0c620465b34579f203f5 --- firmware/App/Modes/SampleWater.h (.../SampleWater.h) (revision b6b733b8d1f25bc2dbe2a94c620cd80aa3ae06f7) +++ firmware/App/Modes/SampleWater.h (.../SampleWater.h) (revision 401c4027b0e59182771f0c620465b34579f203f5) @@ -19,6 +19,7 @@ #define __SAMPLE_WATER_H__ #include "HDCommon.h" +#include "HDDefs.h" /** * @defgroup SampleWater SampleWater @@ -39,6 +40,8 @@ U32 getSampleWaterState( void ); BOOL isSampleWaterPassed( void ); +void signalSampleWaterUserAction( REQUESTED_SAMPLE_WATER_USER_ACTIONS_T action ); // from user + /**@}*/ #endif Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r766708fceb0bdf1af8c7897df29d4f5036bfd3db -r401c4027b0e59182771f0c620465b34579f203f5 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 766708fceb0bdf1af8c7897df29d4f5036bfd3db) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 401c4027b0e59182771f0c620465b34579f203f5) @@ -528,6 +528,21 @@ /*********************************************************************//** * @brief + * The isAnyAlarmActive function determines whether any alarm is currently + * active. + * @details Inputs: alarmStatus + * @details Outputs: none + * @return TRUE if given alarm is active, FALSE if not + *************************************************************************/ +BOOL isAnyAlarmActive( void ) +{ + BOOL result = ( alarmStatus.alarmTop != ALARM_ID_NO_ALARM ? TRUE : FALSE ); + + return result; +} + +/*********************************************************************//** + * @brief * The getCurrentAlarmStatePriority function determines the current alarm * state priority (NONE, LOW, MEDIUM, or HIGH). * @details Inputs: alarmStatus Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -rbc8403b288e167f51c9e991c2a07bb455c77c19a -r401c4027b0e59182771f0c620465b34579f203f5 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision bc8403b288e167f51c9e991c2a07bb455c77c19a) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 401c4027b0e59182771f0c620465b34579f203f5) @@ -262,6 +262,7 @@ void signalAlarmSilence( U32 cmd ); void signalAlarmUserActionInitiated( ALARM_USER_ACTION_T action ); BOOL isAlarmActive( ALARM_ID_T alarm ); +BOOL isAnyAlarmActive( void ); ALARM_PRIORITY_T getCurrentAlarmStatePriority( void ); BOOL isAlarmRecoverable( ALARM_ID_T alarm ); void setAlarmAudioVolume( U32 volumeLevel ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r24a98ea92563dad552889c30604d539d266b339e -r401c4027b0e59182771f0c620465b34579f203f5 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 24a98ea92563dad552889c30604d539d266b339e) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 401c4027b0e59182771f0c620465b34579f203f5) @@ -1195,6 +1195,10 @@ handleUFVolumeSetRequest( message ); break; + case MSG_ID_UI_SAMPLE_WATER_CMD: + handleSampleWaterCmd( message ); + break; + case MSG_ID_DG_COMMAND_RESPONSE: handleDGCmdResp( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rb6b733b8d1f25bc2dbe2a94c620cd80aa3ae06f7 -r401c4027b0e59182771f0c620465b34579f203f5 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision b6b733b8d1f25bc2dbe2a94c620cd80aa3ae06f7) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 401c4027b0e59182771f0c620465b34579f203f5) @@ -30,6 +30,7 @@ #include "ModeTreatmentParams.h" #include "PresOccl.h" #include "RTC.h" +#include "SampleWater.h" #include "SafetyShutdown.h" #include "SystemComm.h" #include "SystemCommMessages.h" @@ -471,8 +472,64 @@ result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_UI, ACK_REQUIRED ); return result; -} +} +/*********************************************************************//** + * @brief + * The handleSampleWaterCmd function handles a sample water user action command + * message from the UI. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none. + *************************************************************************/ +void handleSampleWaterCmd( MESSAGE_T *message ) +{ + if ( sizeof( U32 ) == message->hdr.payloadLen ) + { + U32 cmd; + + memcpy( &cmd, &message->payload[0], sizeof( U32 ) ); + + signalSampleWaterUserAction( (REQUESTED_SAMPLE_WATER_USER_ACTIONS_T)cmd ); + } + else + { + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); + } +} + +/*********************************************************************//** + * @brief + * The sendSampleWaterCmdResponse function constructs a sample water user action + * response to the UI and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: Sample water command response msg constructed and queued. + * @param accepted T/F - was sample water request accepted? + * @param rejReason reason why request was rejected (or zero if accepted) + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendSampleWaterCmdResponse( BOOL accepted, U32 rejReason ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_SAMPLE_WATER_CMD_RESPONSE; + msg.hdr.payloadLen = sizeof( BOOL ) + sizeof( U32 ); + + memcpy( payloadPtr, &accepted, sizeof( BOOL ) ); + payloadPtr += sizeof( BOOL ); + memcpy( payloadPtr, &rejReason, 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 sendDialysateTempTargetsToDG function constructs a dialysate temperature Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rb6b733b8d1f25bc2dbe2a94c620cd80aa3ae06f7 -r401c4027b0e59182771f0c620465b34579f203f5 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision b6b733b8d1f25bc2dbe2a94c620cd80aa3ae06f7) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 401c4027b0e59182771f0c620465b34579f203f5) @@ -158,6 +158,14 @@ // MSG_ID_HD_PRESSURE_LIMITS_CHANGE_RESPONSE BOOL sendPressureLimitsChangeResponse( PRESSURE_LIMIT_CHANGE_RESPONSE_T *data ); +// MSG_ID_UI_SAMPLE_WATER_CMD +void handleSampleWaterCmd( MESSAGE_T *message ); + +// MSG_ID_HD_SAMPLE_WATER_CMD_RESPONSE +BOOL sendSampleWaterCmdResponse( BOOL accepted, U32 rejReason ); + +// *********** public DG command functions ********** + // MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS BOOL sendDialysateTempTargetsToDG( F32 primary, F32 trimmer ); @@ -188,6 +196,8 @@ // MSG_ID_DG_OP_MODE void handleDGOpMode( MESSAGE_T *message ); +// *********** public data broad cast functions ********** + // MSG_ID_HD_ACCELEROMETER_DATA BOOL broadcastAccelData( F32 x, F32 y, F32 z, F32 xm, F32 ym, F32 zm, F32 xt, F32 yt, F32 zt );