Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -r6419179374edcd65da462de84e8aeaefb7e20320 -r049175cd6c514657ede645412cab05ce707d002f --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 6419179374edcd65da462de84e8aeaefb7e20320) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 049175cd6c514657ede645412cab05ce707d002f) @@ -100,6 +100,7 @@ static U32 dgReservoirDrainVolumeTargetSet = 0; ///< Drain-to volume commanded. static U32 resUseTimer = 0; ///< Used to track time pumping from active reservoir (for volume used calculation). static F32 resUseVolumeMl = 0.0; ///< Accumulated volume used from active reservoir. +static DG_DISINFECT_UI_STATES_T disinfectsStatus; ///< DG disinfects status. // DG command response static DG_CMD_RESPONSE_T dgCmdResp[ NUM_OF_DG_COMMANDS ]; ///< Keep the latest DG command response for each command. @@ -518,6 +519,18 @@ return result; } +/*********************************************************************//** + * @brief + * The getDGDisinfectsStates function returns the DG disinfects readings. + * @details Inputs: none + * @details Outputs: disinfectsStatus + * @return the current DG disinfects readings + *************************************************************************/ +DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ) +{ + return disinfectsStatus; +} + /*********************************************************************//** * @brief * The setDGOpMode function sets the latest DG operating mode reported by @@ -682,6 +695,20 @@ lgLoadCellReadingsIdx = INC_WRAP( lgLoadCellReadingsIdx, 0, SIZE_OF_LARGE_LOAD_CELL_AVG - 1 ); } +/*********************************************************************//** + * @brief + * The setDGDisinfectsStates function sets the latest disinfects states + * from DG. + * @details Inputs: none + * @details Outputs: disinfectsStatus + * @param states latest DG disinfects state readings + * @return none + *************************************************************************/ +void setDGDisinfectsStates( DG_DISINFECT_UI_STATES_T states ) +{ + memcpy( &disinfectsStatus, &states, sizeof(DG_DISINFECT_UI_STATES_T) ); +} + /*********************************************************************//** * @brief * The cmdSetDGDialysateTargetTemps function sends a target dialysate @@ -861,10 +888,100 @@ void cmdDGSampleWater( SAMPLE_WATER_CMD_T cmd ) { sendDGSampleWaterCommand( cmd ); +} + +/*********************************************************************//** + * @brief + * The cmdStartDGFlush function sends a start flush command message to + * the DG. + * @details Inputs: none + * @details Outputs: start flush mode command sent to DG. + * @return none + *************************************************************************/ +void cmdStartDGFlush( void ) +{ + BOOL start = TRUE; + dgCmdResp[ DG_CMD_START_FLUSH ].commandID = DG_CMD_NONE; + sendDGStartFlushModeCommand( start ); +} + +/*********************************************************************//** + * @brief + * The cmdStopDGFlush function sends a stop flush command message to + * the DG. + * @details Inputs: none + * @details Outputs: stop flush mode command sent to DG. + * @return none + *************************************************************************/ +void cmdStopDGFlush( void ) +{ + BOOL start = FALSE; + dgCmdResp[ DG_CMD_STOP_FLUSH ].commandID = DG_CMD_NONE; + sendDGStartFlushModeCommand( start ); +} + +/*********************************************************************//** + * @brief + * The cmdStartDGHeatDisinfect function sends a start heat disinfect + * command message to the DG. + * @details Inputs: none + * @details Outputs: start heat disinfect mode command sent to DG. + * @return none + *************************************************************************/ +void cmdStartDGHeatDisinfect( void ) +{ + BOOL start = TRUE; + dgCmdResp[ DG_CMD_START_HEAT_DISINFECT ].commandID = DG_CMD_NONE; + sendDGStartHeatDisinfectModeCommand( start ); +} + +/*********************************************************************//** + * @brief + * The cmdStopDGHeatDisinfect function sends a stop heat disinfect + * command message to the DG. + * @details Inputs: none + * @details Outputs: stop heat disinfect mode command sent to DG. + * @return none + *************************************************************************/ +void cmdStopDGHeatDisinfect( void ) +{ + BOOL start = FALSE; + dgCmdResp[ DG_CMD_STOP_HEAT_DISINFECT ].commandID = DG_CMD_NONE; + sendDGStartHeatDisinfectModeCommand( start ); +} + +/*********************************************************************//** + * @brief + * The cmdStartDGChemicalDisinfect function sends a start chemical disinfect + * command message to the DG. + * @details Inputs: none + * @details Outputs: start chemical disinfect mode command sent to DG. + * @return none + *************************************************************************/ +void cmdStartDGChemicalDisinfect( void ) +{ + BOOL start = TRUE; + dgCmdResp[ DG_CMD_START_CHEM_DISINFECT ].commandID = DG_CMD_NONE; + sendDGStartChemicalDisinfectModeCommand( start ); } /*********************************************************************//** * @brief + * The cmdStopDGChemicalDisinfect function sends a stop chemical disinfect + * command message to the DG. + * @details Inputs: none + * @details Outputs: stop chemical disinfect mode command sent to DG. + * @return none + *************************************************************************/ +void cmdStopDGChemicalDisinfect( void ) +{ + BOOL start = FALSE; + dgCmdResp[ DG_CMD_STOP_CHEM_DISINFECT ].commandID = DG_CMD_NONE; + sendDGStartChemicalDisinfectModeCommand( start ); +} + +/*********************************************************************//** + * @brief * The handleDGCommandResponse function processes the latest DG command response. * @details Inputs: none * @details Outputs: process command response from DG Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -rb4bc2e0337b358ee180650101d98e18346bf7c22 -r049175cd6c514657ede645412cab05ce707d002f --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision b4bc2e0337b358ee180650101d98e18346bf7c22) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 049175cd6c514657ede645412cab05ce707d002f) @@ -113,6 +113,14 @@ U32 rejectCode; ///< Reason code for rejecting the command } DG_CMD_RESPONSE_T; +/// DG heat/chemical disinfects and flush state for UI structure. +typedef struct DG_Disinfects +{ + U32 chemDisinfectUIState; ///< DG chemical disinfect UI state + U32 heatDisinfectUIState; ///< DG heat disinfect UI state + U32 flushUIState; ///< DG flush UI state +} DG_DISINFECT_UI_STATES_T; + // ********** public function prototypes ********** void initDGInterface( void ); @@ -134,6 +142,7 @@ U32 getDGDrainPumpRPMSetPt( void ); F32 getLoadCellWeight( LOAD_CELL_ID_T loadCellID ); F32 getReservoirWeightLargeFilter( DG_RESERVOIR_ID_T resID ); +DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ); void setDGOpMode( U32 opMode, U32 subMode ); void setDialysateTemperatureReadings( F32 temp1, F32 temp2 ); @@ -143,6 +152,7 @@ void setDGROPumpData( U32 presSetPt, F32 flowRate ); void setDGDrainPumpData( U32 rpmSetPt ); void setNewLoadCellReadings( F32 res1Primary, F32 res1Backup, F32 res2Primary, F32 res2Backup ); +void setDGDisinfectsStates( DG_DISINFECT_UI_STATES_T states ); void cmdSetDGDialysateTargetTemps( F32 primaryHtrTemp, F32 trimmerHtrTemp ); void cmdStartDG( void ); @@ -155,6 +165,12 @@ void cmdStartDGTrimmerHeater( void ); void cmdStopDGTrimmerHeater( void ); void cmdDGSampleWater( SAMPLE_WATER_CMD_T cmd ); +void cmdStartDGFlush( void ); +void cmdStopDGFlush( void ); +void cmdStartDGHeatDisinfect( void ); +void cmdStopDGHeatDisinfect( void ); +void cmdStartDGChemicalDisinfect( void ); +void cmdStopDGChemicalDisinfect( void ); void handleDGCommandResponse( DG_CMD_RESPONSE_T *dgCmdRespPtr ); BOOL getDGCommandResponse( U32 commandID, DG_CMD_RESPONSE_T *cmdRespPtr ); Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -ra97fcffbe7b7b2d9543358ac06868829d41cf173 -r049175cd6c514657ede645412cab05ce707d002f --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision a97fcffbe7b7b2d9543358ac06868829d41cf173) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 049175cd6c514657ede645412cab05ce707d002f) @@ -1244,7 +1244,7 @@ HD_VALVE_DATA_T valveData; valveData.valveID = (U32)valve; valveData.state = (U32)valvesStatus[ valve ].execState; - valveData.currentPosID = (U32)valvesStatus[ valve ].currentPosition; + valveData.currentPosID = (U32)getValvePosition( valve ); valveData.currentPos = getValvePositionCounts( valve ); valveData.nextPos = valvesStatus[ valve ].targetPositionInCounts; valveData.current = getValveCurrent( valve ); Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r6419179374edcd65da462de84e8aeaefb7e20320 -r049175cd6c514657ede645412cab05ce707d002f --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 6419179374edcd65da462de84e8aeaefb7e20320) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 049175cd6c514657ede645412cab05ce707d002f) @@ -31,6 +31,7 @@ #include "OperationModes.h" #include "SystemComm.h" #include "SystemCommMessages.h" +#include "TaskGeneral.h" #ifdef EMC_TEST_BUILD // TODO - test code #include "FPGA.h" #endif @@ -42,14 +43,22 @@ // ********** private definitions ********** +#define DG_DISINFECTS_DATA_PUB_INTERVAL ( 4 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Mode chem disinfect data publish interval in counts. + // ********** private data ********** -static HD_STANDBY_STATE_T currentStandbyState; ///< Current state (sub-mode) of standby mode. +static HD_STANDBY_STATE_T currentStandbyState; ///< Current state (sub-mode) of standby mode. -static BOOL treatStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of a treatment +static BOOL treatStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of a treatment. +static BOOL flushStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of flush mode. +static BOOL heatDisinfectStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of heat disinfect mode. +static BOOL chemDisinfectStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of chemical disinfect mode. +static U32 dataPublishCounter = 0; ///< Disinfects data publish counter. // ********** private function prototypes ********** +static void publishDisinfectData( U32 disinfectSubModeState ); + /*********************************************************************//** * @brief * The initStandbyMode function initializes the Standby Mode module. @@ -59,8 +68,10 @@ *************************************************************************/ void initStandbyMode( void ) { - currentStandbyState = STANDBY_START_STATE; + currentStandbyState = STANDBY_START_STATE; treatStartReqReceived = FALSE; + flushStartReqReceived = FALSE; + dataPublishCounter = 0; } /*********************************************************************//** @@ -131,6 +142,66 @@ } break; + case STANDBY_WAIT_FOR_DISINFECT_STATE: + if ( TRUE == flushStartReqReceived ) + { + cmdStartDGFlush(); + currentStandbyState = STANDBY_DG_FLUSH_IN_PROGRESS_STATE; + } + else if ( TRUE == heatDisinfectStartReqReceived ) + { + cmdStartDGHeatDisinfect(); + currentStandbyState = STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE; + } + else if ( TRUE == chemDisinfectStartReqReceived ) + { + cmdStartDGChemicalDisinfect(); + currentStandbyState = STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE; + } + break; + + case STANDBY_DG_FLUSH_IN_PROGRESS_STATE: + { + DG_DISINFECT_UI_STATES_T state = getDGDisinfectsStates(); + U32 subModeState = state.flushUIState; + + publishDisinfectData( subModeState ); + + if( DG_MODE_STAN == getDGOpMode() ) + { + currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; + } + } + break; + + case STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE: + { + DG_DISINFECT_UI_STATES_T state = getDGDisinfectsStates(); + U32 subModeState = state.heatDisinfectUIState; + + publishDisinfectData( subModeState ); + + if( DG_MODE_STAN == getDGOpMode() ) + { + currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; + } + } + break; + + case STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE: + { + DG_DISINFECT_UI_STATES_T state = getDGDisinfectsStates(); + U32 subModeState = state.chemDisinfectUIState; + + publishDisinfectData( subModeState ); + + if( DG_MODE_STAN == getDGOpMode() ) + { + currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; + } + } + break; + default: // TODO - s/w fault currentStandbyState = STANDBY_START_STATE; @@ -273,4 +344,158 @@ // Alarm actions not handled in Standby mode } +/*********************************************************************//** + * @brief + * The signalUserInitiateFlushMode function handles user initiation of flush + * mode. + * @details Inputs: currentStandbyState + * @details Outputs: flushStartReqReceived + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalUserInitiateFlushMode( void ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( ( MODE_STAN == getCurrentOperationMode() ) && ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) ) + { + if ( TRUE == isDGCommunicating() ) + { + flushStartReqReceived = TRUE; + result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + } + } + + sendDisinfectConfirmResponse( result, rejReason ); + + return result; +} + +/*********************************************************************//** + * @brief + * The signalUserInitiateFlushMode function handles user initiation of flush + * mode. + * @details Inputs: currentStandbyState + * @details Outputs: heatDisinfectStartReqReceived + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalUserInitiateHeatDisinfectMode( void ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( ( MODE_STAN == getCurrentOperationMode() ) && ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) ) + { + if ( TRUE == isDGCommunicating() ) + { + heatDisinfectStartReqReceived = TRUE; + result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + } + } + + sendDisinfectConfirmResponse( result, rejReason ); + + return result; +} + +/*********************************************************************//** + * @brief + * The signalUserInitiateChemicalDisinfectMode function handles user + * initiation of flush mode. + * @details Inputs: currentStandbyState + * @details Outputs: chemDisinfectStartReqReceived + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalUserInitiateChemicalDisinfectMode( void ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( ( MODE_STAN == getCurrentOperationMode() ) && ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) ) + { + if ( TRUE == isDGCommunicating() ) + { + chemDisinfectStartReqReceived = TRUE; + result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + } + } + + sendDisinfectConfirmResponse( result, rejReason ); + + return result; +} + +/*********************************************************************//** + * @brief + * The signalInitiateStandbyDisinfectSubmode function handles user + * initiation of setting the disinfects submode. + * @details Inputs: currentStandbyState + * @details Outputs: currentStandbyState + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalInitiateStandbyDisinfectSubmode( void ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( ( MODE_STAN == getCurrentOperationMode() ) && ( STANDBY_WAIT_FOR_TREATMENT_STATE == currentStandbyState ) ) + { + if ( TRUE == isDGCommunicating() ) + { + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + } + } + + sendDisinfectConfirmResponse( result, rejReason ); + + return result; +} + +// ********** private functions ********** + +/*********************************************************************//** + * @brief + * The publishDisinfectData function publishes disinfects data at + * the set interval. + * @details Inputs: dataPublishCounter + * @details Outputs: dataPublishCounter + * @return: none + *************************************************************************/ +static void publishDisinfectData( U32 disinfectSubModeState ) +{ + if ( ++dataPublishCounter > DG_DISINFECTS_DATA_PUB_INTERVAL ) + { + DISINFECTS_DATA_T data; + + data.disinfectState = (U32)currentStandbyState; + data.disinfectSubModeState = disinfectSubModeState; + + broadcastDisinfectsData( &data ); + + dataPublishCounter = 0; + } +} + + /**@}*/ Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -rbb114842e73659f097bb8b8ec0d670bfa4f8cb73 -r049175cd6c514657ede645412cab05ce707d002f --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision bb114842e73659f097bb8b8ec0d670bfa4f8cb73) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 049175cd6c514657ede645412cab05ce707d002f) @@ -29,6 +29,15 @@ * @{ */ +// ********** public definitions ********** + +/// DG disinfects data publish +typedef struct +{ + U32 disinfectState; ///< DG disinfect state + U32 disinfectSubModeState; ///< DG disinfect sub mode state +} DISINFECTS_DATA_T; + // ********** public function prototypes ********** void initStandbyMode( void ); // Initialize this module @@ -38,6 +47,14 @@ BOOL signalUserInitiateTreatment( void ); // User has initiated a treatment - go to treatment parameters mode void signalAlarmActionToStandbyMode( ALARM_ACTION_T action ); // Execute alarm action as appropriate for Standby mode +BOOL signalUserInitiateFlushMode( void ); + +BOOL signalUserInitiateHeatDisinfectMode( void ); + +BOOL signalUserInitiateChemicalDisinfectMode( void ); + +BOOL signalInitiateStandbyDisinfectSubmode( void ); + /**@}*/ #endif Index: firmware/App/Modes/TreatmentEnd.c =================================================================== diff -u -rac6532c81f2a6d4ad1c67420c22d59f6aeeaae13 -r049175cd6c514657ede645412cab05ce707d002f --- firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision ac6532c81f2a6d4ad1c67420c22d59f6aeeaae13) +++ firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision 049175cd6c514657ede645412cab05ce707d002f) @@ -271,7 +271,7 @@ // Ensure we do not sit in stopped state for too long if ( bloodSittingTimerCtr > MAX_TIME_BLOOD_SITTING ) { - activateAlarmNoData( ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK ); + //activateAlarmNoData( ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK ); TODO what happened to this alarm? should I remove this else? } } Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -rac6532c81f2a6d4ad1c67420c22d59f6aeeaae13 -r049175cd6c514657ede645412cab05ce707d002f --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision ac6532c81f2a6d4ad1c67420c22d59f6aeeaae13) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 049175cd6c514657ede645412cab05ce707d002f) @@ -142,7 +142,7 @@ // Ensure we do not sit in stopped state for too long if ( ++bloodSittingTimerCtr > MAX_TIME_BLOOD_SITTING ) { - activateAlarmNoData( ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK ); + //activateAlarmNoData( ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK ); TODO what happened to this alarm? should I remove this else? } // Execute treatment stop sub-mode state machine Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -ra97fcffbe7b7b2d9543358ac06868829d41cf173 -r049175cd6c514657ede645412cab05ce707d002f --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision a97fcffbe7b7b2d9543358ac06868829d41cf173) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 049175cd6c514657ede645412cab05ce707d002f) @@ -1267,6 +1267,10 @@ handleUITreatmentLogDataRequest( message ); break; + case MSG_ID_UI_DISINFECT_REQUEST: + handleUIDisinfectRequest( message ); + break; + case MSG_ID_DG_COMMAND_RESPONSE: handleDGCmdResp( message ); break; @@ -1299,6 +1303,14 @@ handleSetHDServiceRecord( message ); break; + case MSG_ID_HD_SET_STANDBY_DISINFECT_SUB_MODE_REQUEST: + handleSetHDStandbyDisinfectSubmodeRequest( message ); + break; + + case MSG_ID_HD_DISINFECTS_UI_STATE_READINGS: + handleDisinfectUIStatesReadingFromDG( message ); + break; + default: // Unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r337f04e3e9bbfb126e7e474dc0c654b84c281d74 -r049175cd6c514657ede645412cab05ce707d002f --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 337f04e3e9bbfb126e7e474dc0c654b84c281d74) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 049175cd6c514657ede645412cab05ce707d002f) @@ -640,6 +640,117 @@ // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer return serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_UI, ACK_REQUIRED ); } + +/*********************************************************************//** + * @brief + * The handleUIDisinfectRequest function handles a disinfect/flush 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 handleUIDisinfectRequest( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(U32) ) + { + U32 cmd; + + memcpy( &cmd, message->payload, sizeof(U32) ); + + if ( 0 == cmd ) // Command 0 = Flush + { + result = signalUserInitiateFlushMode(); + } + else if ( 1 == cmd ) // Command 1 = Heat disinfect + { + result = signalUserInitiateHeatDisinfectMode(); + } + else if ( 2 == cmd ) // Command 2 = chemical disinfect + { + result = signalUserInitiateChemicalDisinfectMode(); + } + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); +} + +/*********************************************************************//** + * @brief + * The sendDisinfectConfirmResponse function constructs a disinfect or flush + * confirm user action response to the UI and queues the msg for + * transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: Disposable removal confirm response msg constructed + * and queued. + * @param accepted T/F - was disinfect or flush confirm request accepted? + * @param reason reason why request was rejected (or zero if accepted) + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendDisinfectConfirmResponse( BOOL accepted, U32 reason ) +{ + return sendUIResponseMsg( MSG_ID_HD_DISINFECT_RESPONSE, accepted, reason ); +} + +/*********************************************************************//** + * @brief + * The handleSetHDStandbyDisinfectSubmode function handles setting the + * standby submode to wait for disisnfect state. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleSetHDStandbyDisinfectSubmodeRequest( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + // The payload should be 0 in this case because there is mode in this command + if ( 0 == message->hdr.payloadLen ) + { + signalInitiateStandbyDisinfectSubmode(); + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); +} + +/*********************************************************************//** + * @brief + * The handleSetHDStandbyDisinfectSubmodeResponse function constructs a + * standby submode change to wait for disinfect confirm user action response + * to the UI and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: Disposable removal confirm response msg constructed + * and queued. + * @param accepted T/F - was set standby submode confirm request accepted? + * @param reason reason why request was rejected (or zero if accepted) + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL handleSetHDStandbyDisinfectSubmodeResponse( BOOL accepted, U32 reason ) +{ + return sendUIResponseMsg( MSG_ID_HD_SET_STANDBY_DISINFECT_SUB_MODE_RESPONSE, accepted, reason ); +} + +/*********************************************************************//** + * @brief + * The handleDisinfectUIStatesReadingFromDG function handles the readings + * of the UI states of heat/chemical disinfect and flush modes. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleDisinfectUIStatesReadingFromDG( MESSAGE_T *message ) +{ + if ( message->hdr.payloadLen == sizeof(DG_DISINFECT_UI_STATES_T) ) + { + DG_DISINFECT_UI_STATES_T payload; + + memcpy( &payload, message->payload, sizeof(DG_DISINFECT_UI_STATES_T) ); + } +} /*********************************************************************//** * @brief @@ -1155,6 +1266,92 @@ /*********************************************************************//** * @brief + * The sendDGStartFlushModeCommand function constructs a DG start/stop + * flush mode command message and queues the msg for transmit on the + * appropriate CAN channel. + * @details Inputs: none + * @details Outputs: DG start flush mode command msg constructed and queued. + * @param start TRUE indicates start flush mode + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendDGStartFlushModeCommand( BOOL start ) +{ + BOOL result; + MESSAGE_T msg; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_START_STOP_FLUSH; + msg.hdr.payloadLen = sizeof( BOOL ); + + memcpy( msg.payload, &start, sizeof( BOOL ) ); + + // 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_DG, ACK_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief + * The sendDGStartHeatDisinfectModeCommand function constructs a DG start/stop + * heat disinfect mode command message and queues the msg for transmit on + * the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: DG start heat disinfect mode command msg constructed + * and queued. + * @param start TRUE indicates start heat disinfect mode + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendDGStartHeatDisinfectModeCommand( BOOL start ) +{ + BOOL result; + MESSAGE_T msg; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_START_STOP_HEAT_DISINFECT; + msg.hdr.payloadLen = sizeof( BOOL ); + + memcpy( msg.payload, &start, sizeof( BOOL ) ); + + // 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_DG, ACK_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief + * The sendDGStartChemicalDisinfectModeCommand function constructs a DG + * start/stop chemical disinfect mode command message and queues the msg + * for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: DG start chemical disinfect mode command msg + * constructed and queued. + * @param start TRUE indicates start chemical disinfect mode + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendDGStartChemicalDisinfectModeCommand( BOOL start ) +{ + BOOL result; + MESSAGE_T msg; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_START_STOP_CHEM_DISINFECT; + msg.hdr.payloadLen = sizeof( BOOL ); + + memcpy( msg.payload, &start, sizeof( BOOL ) ); + + // 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_DG, ACK_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief * The broadcastAccelData function constructs an accelerometer data msg to * be broadcast and queues the msg for transmit on the appropriate CAN channel. * @details Inputs: none @@ -2181,6 +2378,33 @@ return result; } +/*********************************************************************//** + * @brief + * The broadcastDisinfectsData function sends out the disinfects data. + * @details Inputs: none + * @details Outputs: disinfects data msg constructed and queued + * @param disinfectsData which is disinfects msg constructed and queued + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastDisinfectsData( DISINFECTS_DATA_T *disinfectsData ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_DISINFECTS_UI_STATES_DATA; + msg.hdr.payloadLen = sizeof( DISINFECTS_DATA_T ); + + memcpy( payloadPtr, disinfectsData, sizeof( DISINFECTS_DATA_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; +} + #ifdef EMC_TEST_BUILD BOOL broadcastCANErrorCount( U32 count ) { Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -ra97fcffbe7b7b2d9543358ac06868829d41cf173 -r049175cd6c514657ede645412cab05ce707d002f --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision a97fcffbe7b7b2d9543358ac06868829d41cf173) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 049175cd6c514657ede645412cab05ce707d002f) @@ -36,6 +36,7 @@ #include "NVDataMgmt.h" #include "PresOccl.h" #include "Rinseback.h" +#include "ModeStandby.h" #include "SyringePump.h" #include "Valves.h" @@ -245,6 +246,21 @@ // MSG_ID_HD_TREATMENT_LOG_DATA_RESPONSE BOOL sendTreatmentLogData( BOOL accepted, U32 reason, TREATMENT_LOG_DATA_PAYLOAD_T *logDataPtr ); +// MSG_ID_UI_DISINFECT_REQUEST +void handleUIDisinfectRequest( MESSAGE_T *message ); + +// MSG_ID_HD_DISINFECT_RESPONSE +BOOL sendDisinfectConfirmResponse( BOOL accepted, U32 reason ); + +// MSG_ID_HD_SET_STANDBY_DISINFECT_SUB_MODE_REQUEST +void handleSetHDStandbyDisinfectSubmodeRequest( MESSAGE_T *message ); + +// MSG_ID_HD_SET_STANDBY_DISINFECT_SUB_MODE_RESPONSE +BOOL handleSetHDStandbyDisinfectSubmodeResponse( BOOL accepted, U32 reason ); + +// MSG_ID_HD_DISINFECTS_UI_STATE_READINGS +void handleDisinfectUIStatesReadingFromDG( MESSAGE_T *message ); + // *********** public DG command functions ********** // MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS @@ -277,6 +293,15 @@ // MSG_ID_DG_OP_MODE void handleDGOpMode( MESSAGE_T *message ); +// MSG_ID_DG_START_STOP_FLUSH +BOOL sendDGStartFlushModeCommand( BOOL start ); + +// MSG_ID_DG_START_STOP_HEAT_DISINFECT +BOOL sendDGStartHeatDisinfectModeCommand( BOOL start ); + +// MSG_ID_DG_START_STOP_CHEM_DISINFECT +BOOL sendDGStartChemicalDisinfectModeCommand( BOOL start ); + // *********** public data broad cast functions ********** // MSG_ID_HD_ACCELEROMETER_DATA @@ -381,6 +406,9 @@ // MSG_ID_Hd_SEND_SERVICE_RECORD BOOL sendHDServiceRecord( U32 payloadCurrNum, U32 payloadTotalNum, U32 length, U08* srvcRcrdAddress ); +// MSG_ID_HD_DISINFECTS_UI_STATES_DATA +BOOL broadcastDisinfectsData( DISINFECTS_DATA_T *disinfectsData ); + #ifdef EMC_TEST_BUILD // MSG_ID_CAN_ERROR_COUNT BOOL broadcastCANErrorCount( U32 count );