Index: firmware/App/Modes/ConsumableSelfTest.c =================================================================== diff -u -rf760ffc4b10556e5186e9ceb90294262063440ca -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/ConsumableSelfTest.c (.../ConsumableSelfTest.c) (revision f760ffc4b10556e5186e9ceb90294262063440ca) +++ firmware/App/Modes/ConsumableSelfTest.c (.../ConsumableSelfTest.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -158,7 +158,7 @@ if ( priorSubState != currentConsumableSelfTestState ) { - SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentConsumableSelfTestState ); + setCurrentSubState( (U32)currentConsumableSelfTestState ); } // Handle triggered alarm with stop property handleConsumableSelfTestStopRequest(); Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r2cc90affe213bf8485ddacf8da8a4565cb2b8e9a -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 2cc90affe213bf8485ddacf8da8a4565cb2b8e9a) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -719,6 +719,7 @@ if ( priorSubState != currentDialysisState ) { + setCurrentSubState( (U32)currentDialysisState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentDialysisState ); } // Publish saline bolus data at set interval (whether we are delivering one or not) @@ -791,6 +792,7 @@ if ( priorSubState != currentUFState ) { + setCurrentSubState( (U32)currentUFState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentUFState ); } @@ -837,6 +839,7 @@ if ( priorSubState != currentSalineBolusState ) { + setCurrentSubState( (U32)currentSalineBolusState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentSalineBolusState ); } Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -r1bff8e530735be63ba557b77557a0bc2ac4b37b2 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 1bff8e530735be63ba557b77557a0bc2ac4b37b2) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -74,6 +74,7 @@ doorClosedRequired( FALSE, FALSE ); syringeDetectionRequired( FALSE ); setVenousBubbleDetectionEnabled( FALSE ); + setCurrentSubState( NO_SUB_STATE ); // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -rf1d684e536e7911b356a5d35320c909a1016d3d0 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision f1d684e536e7911b356a5d35320c909a1016d3d0) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -153,7 +153,7 @@ signalBloodPumpHardStop(); signalDialOutPumpHardStop(); signalDialInPumpHardStop(); - + setCurrentSubState( NO_SUB_STATE ); collectTreatmentLogData(); exitBloodLeakNormalState(); @@ -550,6 +550,7 @@ if ( priorSubState != currentDrainReservoirState ) { + setCurrentSubState( (U32)currentDrainReservoirState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentDrainReservoirState ); } } Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r1bff8e530735be63ba557b77557a0bc2ac4b37b2 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 1bff8e530735be63ba557b77557a0bc2ac4b37b2) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -221,6 +221,7 @@ signalDialInPumpHardStop(); signalDialOutPumpHardStop(); stopSyringePump(); + setCurrentSubState( NO_SUB_STATE ); // Set valves to default positions setValveAirTrap( STATE_CLOSED ); @@ -938,6 +939,8 @@ *************************************************************************/ static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) { + HD_PRE_TREATMENT_PAT_CONN_STATE_T priorSubState = currentPreTxPatConnState; + switch ( currentPreTxPatConnState ) { case PRE_TREATMENT_PAT_CONN_WAIT_FOR_UF_VOL_STATE: @@ -961,6 +964,12 @@ break; } + if ( priorSubState != currentPreTxPatConnState ) + { + setCurrentSubState( (U32)currentPreTxPatConnState ); + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentPreTxPatConnState ); + } + // handle alarms w/ stop property if ( TRUE == doesAlarmStatusIndicateStop() ) { Index: firmware/App/Modes/ModeService.c =================================================================== diff -u -r1bff8e530735be63ba557b77557a0bc2ac4b37b2 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/ModeService.c (.../ModeService.c) (revision 1bff8e530735be63ba557b77557a0bc2ac4b37b2) +++ firmware/App/Modes/ModeService.c (.../ModeService.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -59,6 +59,7 @@ { doorClosedRequired( FALSE, FALSE ); syringeDetectionRequired( FALSE ); + setCurrentSubState( NO_SUB_STATE ); // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rf1d684e536e7911b356a5d35320c909a1016d3d0 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision f1d684e536e7911b356a5d35320c909a1016d3d0) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -147,6 +147,7 @@ resetDialInPumpRotorCount(); resetPreLoadStatus(); setVenousBubbleDetectionEnabled( FALSE ); + setCurrentSubState( NO_SUB_STATE ); // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); @@ -198,6 +199,7 @@ handleDisinfectCancel( stop ); + // State machine to get DG to prep a reservoir so we can start a treatment switch ( currentStandbyState ) { Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rf1d684e536e7911b356a5d35320c909a1016d3d0 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision f1d684e536e7911b356a5d35320c909a1016d3d0) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -217,6 +217,7 @@ initRinseback(); initTreatmentRecirc(); initTreatmentEnd(); + setCurrentSubState( NO_SUB_STATE ); // Enable venous bubble detection in treatment mode setVenousBubbleDetectionEnabled( TRUE ); Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -r730d2eb07acfdf049f6beab646a327d67efbe2ba -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 730d2eb07acfdf049f6beab646a327d67efbe2ba) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -282,6 +282,8 @@ HD_TREATMENT_PARAMS_MODE_STATE_T priorSubState = currentTreatmentParamsState; BOOL stop = isStopButtonPressed(); + setCurrentSubState( NO_SUB_STATE ); + if ( TRUE == stop ) { // Ignore stop button in this mode. @@ -304,11 +306,6 @@ } - if ( priorSubState != currentTreatmentParamsState ) - { - SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentTreatmentParamsState ); - } - return (U32)currentTreatmentParamsState; } Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r19f13e67288117e7f81c1245a75cc6b5f8aaf899 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 19f13e67288117e7f81c1245a75cc6b5f8aaf899) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -61,6 +61,7 @@ static HD_OP_MODE_T currentMode; ///< Current operation mode. static U32 currentSubMode; ///< The currently active state of the active mode. static U32 broadcastModeIntervalCtr; ///< Interval counter used to determine when to broadcast operation mode. Initialize to 11 to stagger broadcast. +static U32 currentSubState; /// Interval (in task intervals) at which to publish operation mode data to CAN bus. static OVERRIDE_U32_T opModePublishInterval = { BROADCAST_HD_OP_MODE_INTERVAL, BROADCAST_HD_OP_MODE_INTERVAL, BROADCAST_HD_OP_MODE_INTERVAL, 0 }; /// Local structure init for saving confirmation requests @@ -110,6 +111,7 @@ lastMode = MODE_INIT; currentMode = MODE_INIT; currentSubMode = 0; + currentSubState = 0xFF; broadcastModeIntervalCtr = DATA_PUBLISH_COUNTER_START_COUNT; transitionToNewOperationMode( MODE_INIT ); @@ -136,6 +138,7 @@ { HD_OP_MODE_T newMode; U32 priorSubMode = currentSubMode; + U32 priorSubState = currentSubState; // Any new mode requests? newMode = arbitrateModeRequest(); // Will return current mode if no pending requests @@ -209,9 +212,10 @@ break; } // End switch - // Send sub-mode change event when appropriate - if ( priorSubMode != currentSubMode ) + // Send operation status event when appropriate + if ( lastMode != currentMode || priorSubMode != currentSubMode || priorSubState != currentSubState ) { + sendOperationStatusEvent(); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_MODE_CHANGE, priorSubMode, currentSubMode ) } @@ -372,8 +376,6 @@ *************************************************************************/ static void transitionToNewOperationMode( HD_OP_MODE_T newMode ) { - SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_OP_MODE_CHANGE, lastMode, newMode ) - // Setup for new operating mode switch ( newMode ) { @@ -574,7 +576,30 @@ return new_id; } +void setCurrentSubState( U32 subState ) +{ + currentSubState = subState; +} +void sendOperationStatusEvent() +{ + + U32 opData = 0; + EVENT_DATA_T dat1; + EVENT_DATA_T dat2; + dat2.dataType = EVENT_DATA_TYPE_U32; + dat2.data.uInt.data = (U32)(d2); + + opData = ( currentMode + ( currentSubMode << SHIFT_8_BITS_FOR_BYTE_SHIFT ) + + ( currentSubState << SHIFT_16_BITS_FOR_WORD_SHIFT ) ) & MASK_OFF_U32_MSB; + + dat1.dataType = EVENT_DATA_TYPE_U32; + dat1.data.uInt.data = (U32)(opData); + + sendEvent( HD_EVENT_OPERATION_STATUS, dat1, dat2 ); +} +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Modes/OperationModes.h =================================================================== diff -u -r0a4dcd288d4347b85baaa0b07da568b6add5eac7 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/OperationModes.h (.../OperationModes.h) (revision 0a4dcd288d4347b85baaa0b07da568b6add5eac7) +++ firmware/App/Modes/OperationModes.h (.../OperationModes.h) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -31,6 +31,8 @@ // ********** public definitions ********** +#define NO_SUB_STATE 0xFF ///< value for when submode does not have specific substates and is not applicable. + /// Payload record structure for op mode broadcast message typedef struct { @@ -50,6 +52,7 @@ CONFIRMATION_REQUEST_STATUS_T getConfirmationRequestStatus( GENERIC_CONFIRM_ID_T request_id ); // Get the current confirmation request status void setConfirmationRequestStatus( GENERIC_CONFIRM_ID_T request_id, CONFIRMATION_REQUEST_STATUS_T status ); // Set the confirmation request status GENERIC_CONFIRM_ID_T addConfirmationRequest( GENERIC_CONFIRM_ID_T request_id, GENERIC_CONFIRM_COMMAND_T request_type, U32 reject_reason ); // Add a new confirmation request +void setCurrentSubState( U32 subState ); // Set the current substate. BOOL testSetOperationMode( HD_OP_MODE_T newMode ); // Force transition to a given mode (if allowed) BOOL testSetOpModePublishIntervalOverride( U32 ms ); Index: firmware/App/Modes/PreTreatmentRecirc.c =================================================================== diff -u -r2a03f6c87706478406a4962d70f5bae2ccb57728 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/PreTreatmentRecirc.c (.../PreTreatmentRecirc.c) (revision 2a03f6c87706478406a4962d70f5bae2ccb57728) +++ firmware/App/Modes/PreTreatmentRecirc.c (.../PreTreatmentRecirc.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -123,6 +123,7 @@ if ( priorSubState != currentPreTreatmentRecircState ) { + setCurrentSubState( (U32)currentPreTreatmentRecircState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentPreTreatmentRecircState ); } // All flags should be handled by now, reset in case flags not handle in current state Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r1a1f165e033e39d322308cfeac65126c2a006d78 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 1a1f165e033e39d322308cfeac65126c2a006d78) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -288,6 +288,7 @@ if ( priorSubState != currentPrimeState ) { + setCurrentSubState( (U32)currentPrimeState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentPrimeState ); } Index: firmware/App/Modes/Rinseback.c =================================================================== diff -u -r12708a04ae3365e11180182fc52d005c229a7bc6 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 12708a04ae3365e11180182fc52d005c229a7bc6) +++ firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -318,6 +318,7 @@ if ( priorSubState != rinsebackState ) { + setCurrentSubState( (U32)rinsebackState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, rinsebackState ); } // Rinseback flags should be handled by now - reset in case not handled by current state Index: firmware/App/Modes/SampleWater.c =================================================================== diff -u -r25ede6f944eb53b68c8073404663c99d3ce158b0 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision 25ede6f944eb53b68c8073404663c99d3ce158b0) +++ firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -117,6 +117,7 @@ if ( priorSubState != currentSampleWaterState ) { + setCurrentSubState( (U32)currentSampleWaterState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentSampleWaterState ); } } Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r1bff8e530735be63ba557b77557a0bc2ac4b37b2 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 1bff8e530735be63ba557b77557a0bc2ac4b37b2) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -371,6 +371,7 @@ if ( priorSubState != currentNoCartSelfTestsState ) { + setCurrentSubState( (U32)currentNoCartSelfTestsState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentNoCartSelfTestsState ); } // Publish current self-test time data @@ -532,6 +533,7 @@ if ( priorSubState != currentDrySelfTestsState ) { + setCurrentSubState( (U32)currentDrySelfTestsState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentDrySelfTestsState ); } // Publish current self-test time data @@ -679,6 +681,7 @@ if ( priorSubState != currentWetSelfTestsState ) { + setCurrentSubState( (U32)currentWetSelfTestsState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentWetSelfTestsState ); } } Index: firmware/App/Modes/TreatmentEnd.c =================================================================== diff -u -rf1d684e536e7911b356a5d35320c909a1016d3d0 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision f1d684e536e7911b356a5d35320c909a1016d3d0) +++ firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -211,6 +211,7 @@ if ( priorSubState != treatmentEndState ) { + setCurrentSubState( (U32)treatmentEndState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, treatmentEndState ); } // Re-circulate flags should be handled by now - reset in case not handled by current state Index: firmware/App/Modes/TreatmentRecirc.c =================================================================== diff -u -rf1d684e536e7911b356a5d35320c909a1016d3d0 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision f1d684e536e7911b356a5d35320c909a1016d3d0) +++ firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -221,6 +221,7 @@ if ( priorSubState != treatmentRecircState ) { + setCurrentSubState( (U32)treatmentRecircState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, treatmentRecircState ); } // Re-circulate flags should be handled by now - reset in case not handled by current state Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -rf1d684e536e7911b356a5d35320c909a1016d3d0 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision f1d684e536e7911b356a5d35320c909a1016d3d0) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -257,6 +257,7 @@ if ( priorSubState != currentTxStopState ) { + setCurrentSubState( (U32)currentTxStopState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentTxStopState ); } // Broadcast treatment stop status