Index: drydemo.pro.user =================================================================== diff -u -r260229a756a3ee29c681132bdc4d32204c215ceb -r38e3ae29c904d9ba0076930d429822260133d7e9 --- drydemo.pro.user (.../drydemo.pro.user) (revision 260229a756a3ee29c681132bdc4d32204c215ceb) +++ drydemo.pro.user (.../drydemo.pro.user) (revision 38e3ae29c904d9ba0076930d429822260133d7e9) @@ -1,6 +1,6 @@ - + EnvironmentId Index: drydemoxmlstates.scxml =================================================================== diff -u -r260229a756a3ee29c681132bdc4d32204c215ceb -r38e3ae29c904d9ba0076930d429822260133d7e9 --- drydemoxmlstates.scxml (.../drydemoxmlstates.scxml) (revision 260229a756a3ee29c681132bdc4d32204c215ceb) +++ drydemoxmlstates.scxml (.../drydemoxmlstates.scxml) (revision 38e3ae29c904d9ba0076930d429822260133d7e9) @@ -1,25 +1,49 @@ - + - + - + - + - + + + + + + + + + + + + + - - - - + - + + + + + + + + + + + + + + + + Index: sources/MessageGlobals.h =================================================================== diff -u -r260229a756a3ee29c681132bdc4d32204c215ceb -r38e3ae29c904d9ba0076930d429822260133d7e9 --- sources/MessageGlobals.h (.../MessageGlobals.h) (revision 260229a756a3ee29c681132bdc4d32204c215ceb) +++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision 38e3ae29c904d9ba0076930d429822260133d7e9) @@ -122,8 +122,17 @@ enum Message_ID_Enum { ID_NONE = 0x0000, ID_HD_OP_MODE = 0x2500, + ID_UI_TX_PARAMS_RQST = 0x3500, ID_HD_NEW_PARAMS_RESP = 0x3600, ID_UI_RQST_TX = 0x3800, + ID_UI_CONFIRM_TX_PARAMS = 0x3B00, + ID_PRE_TX_STATES_BC = 0x5C00, + ID_SAMPLE_WATER_RESULT = 0x5f00, + ID_FILTER_FLUSH_TIME_BC = 0x6000, + ID_HD_SYS_SELF_TEST_TIME_BC = 0x6100, + ID_UI_CONSUMABLES_INSTALL = 0x6800, + ID_HD_UI_CONFIRM_RQST = 0xBA00, + ID_UI_CONFIRM_RESP = 0xBB00, }; enum HD_OP_MODE { Index: sources/StateController.cpp =================================================================== diff -u -rb64e08ef7b81022e2fd4775e352e258a0680f013 -r38e3ae29c904d9ba0076930d429822260133d7e9 --- sources/StateController.cpp (.../StateController.cpp) (revision b64e08ef7b81022e2fd4775e352e258a0680f013) +++ sources/StateController.cpp (.../StateController.cpp) (revision 38e3ae29c904d9ba0076930d429822260133d7e9) @@ -1,6 +1,7 @@ #include "StateController.h" #include "ApplicationController.h" +#include "types.h" StateController::StateController(QObject *parent) : QObject(parent) {} @@ -12,11 +13,19 @@ _dryDemo.connectToState("Idle" , this, &StateController::onIdleStateChange ); _dryDemo.connectToState("Tx_Params" , this, &StateController::onTreatmentParamsStateChange ); + _dryDemo.connectToState("Water_Sample" , this, &StateController::onWaterSampleStateChange ); + _dryDemo.connectToState("Consumables" , this, &StateController::onConsumablesStateChange ); + _dryDemo.connectToState("Disposables" , this, &StateController::onDisposablesStateChange ); + _dryDemo.connectToState("System_Prime" , this, &StateController::onSystemPrimeStateChange ); + + _dryDemo.connectToState("Disinfect" , this, &StateController::onDisinfectStateChange ); + _index = 0; + _broadcastMsgCount = 0; + _dryDemoCurrentCmd = CMD_NONE; - initReceivedMessagesHash(); // Todo move this? - initBroadcastMessagesHash(); + initMessagesHashTable(); // Todo move this? } void StateController::quit() @@ -32,68 +41,375 @@ } MessageID receivedMsgID = static_cast(msg[0].toUInt()); + bool isCmdValid = false; + QVariantList msgBack; + switch(receivedMsgID) + { + case ID_UI_RQST_TX: + isCmdValid = true; + _dryDemoCurrentCmd = CMD_TX_PARAMS; + break; - if (_dryDemoMsgTable.contains(receivedMsgID)) { - _activeMessageID = receivedMsgID; + case ID_UI_TX_PARAMS_RQST: + msgBack.append(static_cast(ID_HD_NEW_PARAMS_RESP)); + msgBack.append(Can_Id::eChlid_HD_UI); + msgBack.append(1); + msgBack.append(0); + msgBack.append(275); + msgBack.append(250); + msgBack.append(60); + msgBack.append(0); + msgBack.append(100); + msgBack.append(0); + msgBack.append(0); + msgBack.append(0); + msgBack.append(0); + msgBack.append(0); + msgBack.append(250); + msgBack.append(120); + msgBack.append(100); + msgBack.append(20); + msgBack.append(0.000); + msgBack.append(0.000); + msgBack.append(36.00); + emit _ApplicationController.didActionTransmit(msgBack); - _dryDemo.submitEvent("Transition_back_2_idle"); + break; + + case ID_UI_CONFIRM_RESP: { + int IDIndex = 0; + Types::U32 IDParam; + GetValue(msg[1].toByteArray(), IDIndex, IDParam); + //qDebug() << "Msg Case" << receivedMsgID << msg[1].toByteArray() << IDParam.value; + if (IDParam.value == 0x63) { + int cmdIndex = 4; + Types::U32 cmdParam; + GetValue(msg[1].toByteArray(), cmdIndex, cmdParam); + _dryDemoCurrentCmd = static_cast(cmdParam.value); + isCmdValid = true; + qDebug() << "Msg Case 2" << receivedMsgID << cmdParam.value << _dryDemoCurrentCmd <(ID_HD_UI_CONFIRM_RQST)); + closeMsg.append(Can_Id::eChlid_HD_UI); + closeMsg.append(0x63); + closeMsg.append(1); + closeMsg.append(0); + emit _ApplicationController.didActionTransmit(closeMsg); + } + } + break; + + case ID_UI_CONFIRM_TX_PARAMS: + isCmdValid = true; + _dryDemoCurrentCmd = CMD_WATER_SAMPLE; + break; + + case ID_SAMPLE_WATER_RESULT: { + isCmdValid = true; + int resultIndex = 0; + Types::U32 resultParam; + GetValue(msg[1].toByteArray(), resultIndex, resultParam); + qDebug() << "Sample reulsts" << resultParam.value; + if ( resultParam.value == 1 ) { + _dryDemoCurrentCmd = CMD_CONSUMABLES; + } + else + { + transitionApplicationToStandBy(); + } + } + break; + + case ID_UI_CONSUMABLES_INSTALL: + _dryDemoCmds[_dryDemoCurrentCmd][_index][IS_WAIT_NEEDED_INDEX] = false; + break; + + case ID_NONE: + case ID_HD_OP_MODE: + case ID_FILTER_FLUSH_TIME_BC: + case ID_HD_UI_CONFIRM_RQST: + case ID_PRE_TX_STATES_BC: + case ID_HD_NEW_PARAMS_RESP: + case ID_HD_SYS_SELF_TEST_TIME_BC: + // Do nothing + break; } + + if ((isCmdValid) && (_dryDemo.isRunning())) { + isCmdValid = false; + _dryDemo.submitEvent("Transition_back_2_idle"); + } } void StateController::timerEvent(QTimerEvent *) { - if (_dryDemo.activeStateNames().size() > 0) { - QString currentState = _dryDemo.activeStateNames()[0]; + int listSize = _dryDemoCmds[_dryDemoCurrentCmd].size(); - if (_dryDemoBroadcast.contains(currentState)) { - //_dryDemoBroadcast[currentState][0].toUInt() += 1; - qDebug() << "In timer event" << currentState << _dryDemoBroadcast[currentState][0]; - QVariantList msg = _dryDemoBroadcast[currentState].mid(RESP_MSG_START_INDEX); - emit _ApplicationController.didActionTransmit(msg); + //qDebug() << "Index" << _index << listSize; + + if ((listSize > 1) && (_index < listSize )) { + bool isTimer = _dryDemoCmds[_dryDemoCurrentCmd][_index][IS_TIMER_INDEX].toBool(); + //qDebug() << "Index 222" << _dryDemoCmds[_dryDemoCurrentCmd][_index]; + if(isTimer && (_dryDemoCmds[_dryDemoCurrentCmd][_index][COUNT_DOWN_TIMER_INDEX].toUInt() != 0)) { + _dryDemoCmds[_dryDemoCurrentCmd][_index][COUNT_DOWN_TIMER_INDEX] = + _dryDemoCmds[_dryDemoCurrentCmd][_index][COUNT_DOWN_TIMER_INDEX].toUInt() - 1; + qDebug() << "COUnters" << _dryDemoCmds[_dryDemoCurrentCmd][_index][COUNT_DOWN_TIMER_INDEX].toUInt(); + emit _ApplicationController.didActionTransmit(_dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX)); + if (_dryDemoCmds[_dryDemoCurrentCmd][_index][COUNT_DOWN_TIMER_INDEX].toUInt() == 0) { + _dryDemoCmds[_dryDemoCurrentCmd][_index][0] = false; + _index++; + } } + else { + if (!_dryDemoCmds[_dryDemoCurrentCmd][_index][IS_WAIT_NEEDED_INDEX].toBool()) { + //qDebug() << "Nex Inedx" << _dryDemoCmds[_dryDemoCurrentCmd][_index]; + emit _ApplicationController.didActionTransmit(_dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX)); + _broadcastMsgCount++; + + if (_broadcastMsgCount > 4 ) { + int nextCmd = _dryDemoCmds[_dryDemoCurrentCmd][_index][NEXT_AUTO_TRANSITION_INDEX].toInt(); + User_Command_ID nextCmdEnum = static_cast(nextCmd); + qDebug() << "NONE" << nextCmd << nextCmdEnum; + if (nextCmdEnum != CMD_NONE) { + qDebug() << "Current Enum" << _dryDemoCurrentCmd; + _dryDemoCurrentCmd = nextCmdEnum; + qDebug() << "New transiion" << nextCmdEnum << _dryDemoCurrentCmd << _index; + _dryDemo.submitEvent("Transition_back_2_idle"); + } + + _index++; + _broadcastMsgCount = 0; + } + } + } } } // ---------------------- Private methods ------------------ // -void StateController::initReceivedMessagesHash() +void StateController::initMessagesHashTable() { - // TODO these should be config - _dryDemoMsgTable[ID_UI_RQST_TX].append("Transition_2_Tx_Parms"); - _dryDemoMsgTable[ID_UI_RQST_TX].append(static_cast(ID_HD_OP_MODE)); - _dryDemoMsgTable[ID_UI_RQST_TX].append(Can_Id::eChlid_HD_UI); - _dryDemoMsgTable[ID_UI_RQST_TX].append(MODE_TPAR); - _dryDemoMsgTable[ID_UI_RQST_TX].append(0); -} + QVariantList temp; + temp.append("Transition_2_Tx_Parms"); + temp.append(false); // wait for a trigger + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_HD_OP_MODE)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(MODE_TPAR); + temp.append(0); + _dryDemoCmds[CMD_TX_PARAMS].append(temp); + temp.clear(); -void StateController::initBroadcastMessagesHash() -{ - _dryDemoBroadcast["Tx_Params"].append(0); - _dryDemoBroadcast["Tx_Params"].append(ID_HD_NEW_PARAMS_RESP); - _dryDemoBroadcast["Tx_Params"].append(Can_Id::eChlid_HD_UI); - _dryDemoBroadcast["Tx_Params"].append(1); - _dryDemoBroadcast["Tx_Params"].append(0); - _dryDemoBroadcast["Tx_Params"].append(275); - _dryDemoBroadcast["Tx_Params"].append(250); - _dryDemoBroadcast["Tx_Params"].append(60); - _dryDemoBroadcast["Tx_Params"].append(0); - _dryDemoBroadcast["Tx_Params"].append(100); - _dryDemoBroadcast["Tx_Params"].append(0); - _dryDemoBroadcast["Tx_Params"].append(0); - _dryDemoBroadcast["Tx_Params"].append(0); - _dryDemoBroadcast["Tx_Params"].append(0); - _dryDemoBroadcast["Tx_Params"].append(0); - _dryDemoBroadcast["Tx_Params"].append(250); - _dryDemoBroadcast["Tx_Params"].append(120); - _dryDemoBroadcast["Tx_Params"].append(100); - _dryDemoBroadcast["Tx_Params"].append(20); - _dryDemoBroadcast["Tx_Params"].append(0.000); - _dryDemoBroadcast["Tx_Params"].append(0.000); - _dryDemoBroadcast["Tx_Params"].append(36.00); + temp.append("Transition_2_Water_Sample"); + temp.append(false); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_HD_OP_MODE)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(MODE_PRET); + temp.append(0); + _dryDemoCmds[CMD_WATER_SAMPLE].append(temp); + temp.clear(); + temp.append(false); // this is the timer + temp.append(false); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_PRE_TX_STATES_BC)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + _dryDemoCmds[CMD_WATER_SAMPLE].append(temp); + temp.clear(); + temp.append(true); // this is the timer + temp.append(false); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_FILTER_FLUSH_TIME_BC)); + temp.append(Can_Id::eChlid_DG_Sync); + temp.append(DEFAULT_TIMEOUT_S); + temp.append(DEFAULT_TIMEOUT_S); + _dryDemoCmds[CMD_WATER_SAMPLE].append(temp); + temp.clear(); + temp.append(false); // this is the timer + temp.append(false); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_PRE_TX_STATES_BC)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(0); + temp.append(1); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + _dryDemoCmds[CMD_WATER_SAMPLE].append(temp); + temp.clear(); + + temp.append("Transition_2_Consumables"); + temp.append(false); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_HD_OP_MODE)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(MODE_PRET); + temp.append(0); + _dryDemoCmds[CMD_CONSUMABLES].append(temp); + temp.clear(); + temp.append(false); // this is the timer + temp.append(true); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_PRE_TX_STATES_BC)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(1); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + _dryDemoCmds[CMD_CONSUMABLES].append(temp); + temp.clear(); + temp.append(false); // this is the timer + temp.append(false); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_PRE_TX_STATES_BC)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(1); + temp.append(0); + temp.append(1); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + _dryDemoCmds[CMD_CONSUMABLES].append(temp); + temp.clear(); + temp.append(false); // this is the timer + temp.append(false); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_PRE_TX_STATES_BC)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(1); + temp.append(0); + temp.append(2); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + _dryDemoCmds[CMD_CONSUMABLES].append(temp); + temp.clear(); + temp.append(false); // this is the timer + temp.append(false); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_PRE_TX_STATES_BC)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(1); + temp.append(0); + temp.append(3); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + _dryDemoCmds[CMD_CONSUMABLES].append(temp); + temp.clear(); + temp.append(false); // this is the timer + temp.append(false); + temp.append(static_cast(CMD_DISPOSABLES)); // auto transition + temp.append(static_cast(ID_PRE_TX_STATES_BC)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(1); + temp.append(0); + temp.append(4); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + _dryDemoCmds[CMD_CONSUMABLES].append(temp); + temp.clear(); + + temp.append("Transition_2_Disposables"); + temp.append(false); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_HD_OP_MODE)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(MODE_PRET); + temp.append(0); + _dryDemoCmds[CMD_DISPOSABLES].append(temp); + temp.clear(); + temp.append(false); // this is the timer + temp.append(false); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_PRE_TX_STATES_BC)); + temp.append(Can_Id::eChlid_HD_UI); + temp.append(2); + temp.append(0); + temp.append(0); + temp.append(1); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + temp.append(0); + _dryDemoCmds[CMD_DISPOSABLES].append(temp); + temp.clear(); + temp.append(true); // this is the timer + temp.append(false); + temp.append(static_cast(CMD_NONE)); // auto transition + temp.append(static_cast(ID_HD_SYS_SELF_TEST_TIME_BC)); + temp.append(Can_Id::eChlid_HD_Sync); + temp.append(DEFAULT_TIMEOUT_S); + temp.append(DEFAULT_TIMEOUT_S); + _dryDemoCmds[CMD_DISPOSABLES].append(temp); + temp.clear(); + + } -void StateController::transitionToStandBy() +void StateController::transitionApplicationToStandBy() { + _index = 0; + _broadcastMsgCount = 0; + initMessagesHashTable(); + QVariantList list; list.append(static_cast(ID_HD_OP_MODE)); list.append(Can_Id::eChlid_HD_UI); @@ -106,29 +422,73 @@ { if (active) { qDebug() << "Idle on entry"; - transitionToStandBy(); - if (_activeMessageID != ID_NONE) { - QString transitionEvent = _dryDemoMsgTable[_activeMessageID][TRANSITION_EVENT_INDEX].toString(); - _dryDemo.submitEvent(transitionEvent); + if ((_dryDemoCmds.contains(_dryDemoCurrentCmd)) && (_dryDemoCurrentCmd != CMD_NONE)) { + transitionApplicationToStandBy(); + QString transitionEvent = _dryDemoCmds[_dryDemoCurrentCmd][_index][TRANSITION_EVENT_INDEX].toString(); + qDebug() << "Event" << transitionEvent <<_dryDemoCurrentCmd << _index; + _dryDemo.submitEvent(transitionEvent); } } else { - QVariantList msg = _dryDemoMsgTable[_activeMessageID].mid(RESP_MSG_START_INDEX); + qDebug() << "Exit"; + QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); emit _ApplicationController.didActionTransmit(msg); + _index++; } } void StateController::onTreatmentParamsStateChange(bool active) { if (active) { qDebug() << "In treatment params on entry"; + //QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); + //emit _ApplicationController.didActionTransmit(msg); } else { - qDebug() << "Treatment inactive"; + qDebug() << "In treatment params inactive"; } } +void StateController::onWaterSampleStateChange(bool active) +{ + if(active) { + qDebug() << "Sample" << _index; + QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); + emit _ApplicationController.didActionTransmit(msg); + _index++; + } + else { + + } +} + +void StateController::onConsumablesStateChange(bool active) +{ + if(active) { + qDebug() << "Consumables" << _index; + QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); + emit _ApplicationController.didActionTransmit(msg); + } +} + +void StateController::onDisposablesStateChange(bool active) +{ + if(active) { + qDebug() << "disposables" << _index; + QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); + emit _ApplicationController.didActionTransmit(msg); + _index++; + } +} + +void StateController::onSystemPrimeStateChange(bool active) +{ + Q_UNUSED(active) +} + + + void StateController::onDisinfectStateChange(bool active) { if (active) { Index: sources/StateController.h =================================================================== diff -u -r260229a756a3ee29c681132bdc4d32204c215ceb -r38e3ae29c904d9ba0076930d429822260133d7e9 --- sources/StateController.h (.../StateController.h) (revision 260229a756a3ee29c681132bdc4d32204c215ceb) +++ sources/StateController.h (.../StateController.h) (revision 38e3ae29c904d9ba0076930d429822260133d7e9) @@ -28,19 +28,43 @@ void timerEvent(QTimerEvent *) override; private: + #define DEFAULT_TIMEOUT_S 10 #define TRANSITION_EVENT_INDEX 0 - #define RESP_MSG_START_INDEX 1 + #define RESP_MSG_START_INDEX 3 + #define IS_TIMER_INDEX 0 + #define IS_WAIT_NEEDED_INDEX 1 + #define NEXT_AUTO_TRANSITION_INDEX 2 + #define COUNT_DOWN_TIMER_INDEX 6 - QHash _dryDemoMsgTable; - QHash _dryDemoBroadcast; - drydemoXMLstates _dryDemo; - Can::MessageID _activeMessageID = Can::ID_NONE; + enum User_Command_ID { + CMD_NONE = -1, + CMD_TX_PARAMS = 0 , + CMD_WATER_SAMPLE, + CMD_CONSUMABLES, + CMD_DISPOSABLES, + }; - void initReceivedMessagesHash(); - void initBroadcastMessagesHash(); - void transitionToStandBy(); + QHash > _dryDemoCmds; + quint16 _index; + quint16 _broadcastMsgCount; + User_Command_ID _dryDemoCurrentCmd; + + QHash _dryDemoMsgTable; // TODO remove + QHash _dryDemoBroadcast; // TODo remove + drydemoXMLstates _dryDemo; // todo REMOVE + Can::MessageID _activeMessageID = Can::ID_NONE; // TODO remove + + void initMessagesHashTable(); + void transitionApplicationToStandBy(); + void onIdleStateChange(bool active); void onTreatmentParamsStateChange(bool active); + void onWaterSampleStateChange(bool active); + void onConsumablesStateChange(bool active); + void onDisposablesStateChange(bool active); + void onSystemPrimeStateChange(bool active); + + void onDisinfectStateChange(bool active); };