Index: trunk/FACT++/src/mcp.cc
===================================================================
--- trunk/FACT++/src/mcp.cc	(revision 13915)
+++ trunk/FACT++/src/mcp.cc	(revision 13916)
@@ -14,5 +14,6 @@
 #include "HeadersFTM.h"
 #include "HeadersFAD.h"
-
+#include "HeadersMCP.h"
+#include "HeadersRateControl.h"
 
 namespace ba    = boost::asio;
@@ -32,21 +33,4 @@
 {
 private:
-    enum states_t
-    {
-        kStateDimNetworkNA = 1,
-        kStateDisconnected,
-        kStateConnecting,
-        kStateConnected,
-        kStateIdle,
-        kStateDummy, // Doesn't exist, kept to keep the numbers
-        kStateConfiguring1,
-        kStateConfiguring2,
-        kStateConfiguring3,
-        kStateConfigured,
-        kStateTriggerOn,
-        kStateTakingData,
-//        kStateRunInProgress,
-    };
-
     DimVersion fDim;
     DimDescribedState fDimFTM;
@@ -59,9 +43,9 @@
     int Print() const
     {
-        Out() << fDim << endl;
+        Out() << fDim    << endl;
         Out() << fDimFTM << endl;
         Out() << fDimFAD << endl;
         Out() << fDimLog << endl;
-        Out() << fDimRC << endl;
+        Out() << fDimRC  << endl;
 
         return GetCurrentState();
@@ -75,16 +59,16 @@
     int StopRun(const EventImp &)
     {
-	if (fDimFTM.state()==FTM::kTriggerOn)
+	if (fDimFTM.state()==FTM::State::kTriggerOn)
 	{
             Message("Stopping FTM");
-	    Dim::SendCommand("FTM_CONTROL/STOP_TRIGGER");
+	    Dim::SendCommandNB("FTM_CONTROL/STOP_TRIGGER");
 	}
 
         // FIXME: Do step 2 only when FTM is stopped
-        if (fDimFAD.state()==FAD::kConnected)
+        if (fDimFAD.state()==FAD::State::kConnected)
         {
             //Dim::SendCommand("FAD_CONTROL/ENABLE_TRIGGER_LINE",      bool(false));
 	    Message("Stopping FAD");
-            Dim::SendCommand("FAD_CONTROL/ENABLE_CONTINOUS_TRIGGER", bool(false));
+            Dim::SendCommandNB("FAD_CONTROL/ENABLE_CONTINOUS_TRIGGER", bool(false));
         }
 
@@ -96,8 +80,8 @@
         fRunType = "";
 	Message("Reseting configuration states of FAD and FTM");
-	Dim::SendCommand("FTM_CONTROL/RESET_CONFIGURE");
-	Dim::SendCommand("FAD_CONTROL/RESET_CONFIGURE");
-        Update(kStateIdle);
-        return kStateIdle;
+	Dim::SendCommandNB("FTM_CONTROL/RESET_CONFIGURE");
+	Dim::SendCommandNB("FAD_CONTROL/RESET_CONFIGURE");
+        Update(MCP::State::kIdle);
+        return MCP::State::kIdle;
         /*
         // FIMXE: Handle error states!
@@ -108,5 +92,5 @@
             Dim::SendCommand("DATA_LOGGER/WAIT_FOR_RUN_NUMBER");
 
-        if (fDimFAD.state()==FAD::kConnected)
+        if (fDimFAD.state()==FAD::State::kConnected)
         {
             Dim::SendCommand("FAD_CONTROL/ENABLE_TRIGGER_LINE", bool(false));
@@ -114,5 +98,5 @@
         }
 
-        if (fDimFTM.state()==FTM::kTakingData)
+        if (fDimFTM.state()==FTM::State::kTakingData)
             Dim::SendCommand("FTM_CONTROL/STOP");
 
@@ -126,20 +110,20 @@
     int StartRun(const EventImp &evt)
     {
-        if (fDimFTM.state()==-2)
+        if (!fDimFTM.online())
         {
             Error("No connection to ftmcontrol (see PRINT).");
             return GetCurrentState();
         }
-        if (fDimFAD.state()==-2)
+        if (!fDimFAD.online())
         {
             Warn("No connection to fadcontrol (see PRINT).");
             return GetCurrentState();
         }
-        if (fDimLog.state()==-2)
+        if (!fDimLog.online())
         {
             Warn("No connection to datalogger (see PRINT).");
             return GetCurrentState();
         }
-        if (fDimRC.state()==-2)
+        if (!fDimRC.online())
         {
             Warn("No connection to ratecontrol (see PRINT).");
@@ -165,7 +149,7 @@
         Message(str);
 
-        Update(kStateConfiguring1);
-
-        return kStateConfiguring1;
+        Update(MCP::State::kConfiguring1);
+
+        return MCP::State::kConfiguring1;
     }
 
@@ -207,43 +191,36 @@
 
 	Message("Configuring FAD");
-        Dim::SendCommand("FAD_CONTROL/CONFIGURE", buf, sizeof(Value)+fRunType.length()+1);
+        Dim::SendCommandNB("FAD_CONTROL/CONFIGURE", buf, sizeof(Value)+fRunType.length()+1);
 
         delete buf;
     }
 
-    int Execute()
-    {
-        // Dispatch (execute) at most one handler from the queue. In contrary
-        // to run_one(), it doesn't wait until a handler is available
-        // which can be dispatched, so poll_one() might return with 0
-        // handlers dispatched. The handlers are always dispatched/executed
-        // synchronously, i.e. within the call to poll_one()
-        //poll_one();
-
+    int HandleStateChange()
+    {
         if (!fDim.online())
-            return kStateDimNetworkNA;
-
-        if (fDimFTM.state() >= FTM::kConnected &&
-            fDimFAD.state() >= FAD::kConnected &&
+            return MCP::State::kDimNetworkNA;
+
+        if (fDimFTM.state() >= FTM::State::kConnected &&
+            fDimFAD.state() >= FAD::State::kConnected &&
             fDimLog.state() >= kSM_Ready)
         {
-            if (GetCurrentState()==kStateConfiguring1)
+            if (GetCurrentState()==MCP::State::kConfiguring1)
             {
 		if (fDimLog.state()<30/*kSM_WaitForRun*/)
 		{
 		    Message("Starting datalogger");
-                    Dim::SendCommand("DATA_LOGGER/START_RUN_LOGGING");
+                    Dim::SendCommandNB("DATA_LOGGER/START_RUN_LOGGING");
 		}
 		Message("Configuring Trigger (FTM)");
-                Dim::SendCommand("FTM_CONTROL/CONFIGURE", fRunType);
-                Update(kStateConfiguring2);
-                return kStateConfiguring2;
-            }
-
-            if (GetCurrentState()==kStateConfiguring2)
+                Dim::SendCommandNB("FTM_CONTROL/CONFIGURE", fRunType);
+                Update(MCP::State::kConfiguring2);
+                return MCP::State::kConfiguring2;
+            }
+
+            if (GetCurrentState()==MCP::State::kConfiguring2)
             {
                 // FIMXE: Reset in case of error
-                if ((/*fDimFTM.state() != FTM::kConfiguring2 &&*/
-                     fDimFTM.state() != FTM::kConfigured) ||
+                if ((/*fDimFTM.state() != FTM::State::kConfiguring2 &&*/
+                     fDimFTM.state() != FTM::State::kConfigured) ||
                     fDimLog.state()<30 || fDimLog.state()>0xff)
                     return GetCurrentState();
@@ -254,61 +231,61 @@
 
                 Message("Starting Rate Control");
-                Dim::SendCommand("RATE_CONTROL/CALIBRATE");
+                Dim::SendCommandNB("RATE_CONTROL/CALIBRATE");
 
                 ConfigureFAD();
-                Update(kStateConfiguring3);
-                return kStateConfiguring3;
-            }
-
-            if (GetCurrentState()==kStateConfiguring3)
-            {
-                if (fDimFTM.state() != FTM::kConfigured ||
-                    fDimFAD.state() != FAD::kConfigured ||
-                    fDimRC.state()  < 6)
+                Update(MCP::State::kConfiguring3);
+                return MCP::State::kConfiguring3;
+            }
+
+            if (GetCurrentState()==MCP::State::kConfiguring3)
+            {
+                if (fDimFTM.state() != FTM::State::kConfigured ||
+                    fDimFAD.state() != FAD::State::kConfigured ||
+                    fDimRC.state()  <  RateControl::State::kSettingGlobalThreshold)
                     return GetCurrentState();
 
                 Message("Starting Trigger (FTM)");
-                Dim::SendCommand("FTM_CONTROL/START_TRIGGER");
-                Update(kStateConfigured);
-                return kStateConfigured;
-            }
-
-            if (GetCurrentState()==kStateConfigured)
-            {
-                if (fDimFTM.state() != FTM::kTriggerOn)
+                Dim::SendCommandNB("FTM_CONTROL/START_TRIGGER");
+                Update(MCP::State::kConfigured);
+                return MCP::State::kConfigured;
+            }
+
+            if (GetCurrentState()==MCP::State::kConfigured)
+            {
+                if (fDimFTM.state() != FTM::State::kTriggerOn)
                     return GetCurrentState();
 
-                Update(kStateTriggerOn);
-
-                return kStateTriggerOn;
-            }
-
-            if (GetCurrentState()==kStateTriggerOn)
-            {
-                if (fDimFAD.state() != FAD::kWritingData)
+                Update(MCP::State::kTriggerOn);
+
+                return MCP::State::kTriggerOn;
+            }
+
+            if (GetCurrentState()==MCP::State::kTriggerOn)
+            {
+                if (fDimFAD.state() != FAD::State::kWritingData)
                     return GetCurrentState();
 
-                Update(kStateTakingData);
-
-                return kStateTakingData;
-            }
-
-            if (GetCurrentState()==kStateTakingData)
-            {
-                if (fDimFTM.state()==FTM::kTriggerOn &&
-                    fDimFAD.state()==FAD::kWritingData)
-                    return kStateTakingData;
-
-                Update(kStateIdle);
-            }
-
-            return kStateIdle;
+                Update(MCP::State::kTakingData);
+
+                return MCP::State::kTakingData;
+            }
+
+            if (GetCurrentState()==MCP::State::kTakingData)
+            {
+                if (fDimFTM.state()==FTM::State::kTriggerOn &&
+                    fDimFAD.state()==FAD::State::kWritingData)
+                    return MCP::State::kTakingData;
+
+                Update(MCP::State::kIdle);
+            }
+
+            return MCP::State::kIdle;
         }
 
         /*
-        if (fDimFTM.state() >= FTM::kConnected &&
-            fDimFAD.state() >= FAD::kConnected &&
+        if (fDimFTM.state() >= FTM::State::kConnected &&
+            fDimFAD.state() >= FAD::State::kConnected &&
             fDimLog.state() >= kSM_Ready)
-            return kStateIdle;
+            return MCP::State::kIdle;
          */
         if (fDimFTM.state() >-2 &&
@@ -316,5 +293,5 @@
             fDimLog.state() >-2 &&
             fDimRC.state() >-2)
-            return kStateConnected;
+            return MCP::State::kConnected;
 
         if (fDimFTM.state() >-2 ||
@@ -322,7 +299,7 @@
             fDimLog.state() >-2 ||
             fDimRC.state() >-2)
-            return kStateConnecting;
-
-        return kStateDisconnected;
+            return MCP::State::kConnecting;
+
+        return MCP::State::kDisconnected;
     }
 
@@ -351,40 +328,46 @@
         fDimRC.Subscribe(*this);
 
+        fDim.SetCallback(bind(&StateMachineMCP::HandleStateChange, this));
+        fDimFTM.SetCallback(bind(&StateMachineMCP::HandleStateChange, this));
+        fDimFAD.SetCallback(bind(&StateMachineMCP::HandleStateChange, this));
+        fDimLog.SetCallback(bind(&StateMachineMCP::HandleStateChange, this));
+        fDimRC.SetCallback(bind(&StateMachineMCP::HandleStateChange, this));
+
         // State names
-        AddStateName(kStateDimNetworkNA, "DimNetworkNotAvailable",
+        AddStateName(MCP::State::kDimNetworkNA, "DimNetworkNotAvailable",
                      "DIM dns server not available.");
 
-        AddStateName(kStateDisconnected, "Disconnected",
+        AddStateName(MCP::State::kDisconnected, "Disconnected",
                      "Neither ftmctrl, fadctrl, datalogger nor rate control online.");
 
-        AddStateName(kStateConnecting, "Connecting",
+        AddStateName(MCP::State::kConnecting, "Connecting",
                      "Either ftmctrl, fadctrl, datalogger or rate control not online.");
 
-        AddStateName(kStateConnected, "Connected",
+        AddStateName(MCP::State::kConnected, "Connected",
                      "All needed subsystems online.");
 
-        AddStateName(kStateIdle, "Idle",
+        AddStateName(MCP::State::kIdle, "Idle",
                      "Waiting for next configuration command");
 
-        AddStateName(kStateConfiguring1, "Configuring1",
+        AddStateName(MCP::State::kConfiguring1, "Configuring1",
                      "Starting configuration procedure, checking Datalogger state");
 
-        AddStateName(kStateConfiguring2, "Configuring2",
+        AddStateName(MCP::State::kConfiguring2, "Configuring2",
                      "Waiting for FTM and Datalogger to get ready");
 
-        AddStateName(kStateConfiguring3, "Configuring3",
+        AddStateName(MCP::State::kConfiguring3, "Configuring3",
                      "Waiting for FADs and rate control to get ready");
 
-        AddStateName(kStateConfigured, "Configured",
+        AddStateName(MCP::State::kConfigured, "Configured",
                      "Everything is configured, trigger will be switched on now");
 
-        AddStateName(kStateTriggerOn, "TriggerOn",
+        AddStateName(MCP::State::kTriggerOn, "TriggerOn",
                      "The trigger is switched on, waiting for FAD to receive data");
 
-        AddStateName(kStateTakingData, "TakingData",
+        AddStateName(MCP::State::kTakingData, "TakingData",
                      "The trigger is switched on, FADs are sending data");
 
 
-        AddEvent("START", "X:2;C")//, kStateIdle)
+        AddEvent("START", "X:2;C")//, MCP::State::kIdle)
             (bind(&StateMachineMCP::StartRun, this, placeholders::_1))
             ("Start the configuration and data taking for a run-type of a pre-defined setup"
@@ -397,5 +380,5 @@
             ("Stops the trigger (either disables the FTM trigger or the internal DRS trigger)");
 
-        AddEvent("RESET", kStateConfiguring1, kStateConfiguring2, kStateConfiguring3, kStateConfigured)
+        AddEvent("RESET", MCP::State::kConfiguring1, MCP::State::kConfiguring2, MCP::State::kConfiguring3, MCP::State::kConfigured)
             (bind(&StateMachineMCP::Reset, this, placeholders::_1))
             ("If a configuration blockes because a system cannot configure itself properly, "
