Index: /trunk/FACT++/gui/FactGui.h
===================================================================
--- /trunk/FACT++/gui/FactGui.h	(revision 10936)
+++ /trunk/FACT++/gui/FactGui.h	(revision 10937)
@@ -349,4 +349,8 @@
 
     DimStampedInfo fDimFadFiles;
+    DimStampedInfo fDimFadRuns;
+    DimStampedInfo fDimFadEvents;
+    DimStampedInfo fDimFadCurrentEvent;
+    DimStampedInfo fDimFadConnections;
 
     map<string, DimInfo*> fServices;
@@ -688,5 +692,11 @@
 
         template<typename T>
-                T get() const { return *reinterpret_cast<const T*>(data.data()); }
+                T get(uint32_t offset=0) const { return *reinterpret_cast<const T*>(data.data()+offset); }
+
+        template<typename T>
+                const T *ptr(uint32_t offset=0) const { return reinterpret_cast<const T*>(data.data()+offset); }
+
+        template<typename T>
+                const T &ref(uint32_t offset=0) const { return *reinterpret_cast<const T*>(data.data()+offset); }
 
             vector<char> vec(int b) const { return vector<char>(data.begin()+b, data.end()); }
@@ -701,5 +711,4 @@
             }
             int size() const { return data.size(); }
-            const void *ptr() const { return data.data(); }
     };
 
@@ -735,5 +744,5 @@
             return;
 
-        const uint64_t *vals = reinterpret_cast<const uint64_t*>(d.ptr());
+        const uint64_t *vals = d.ptr<uint64_t>();
 
         const size_t written = vals[0];
@@ -851,5 +860,5 @@
             return;
 
-        const uint32_t *vals = reinterpret_cast<const uint32_t*>(d.ptr());
+        const uint32_t *vals = d.ptr<uint32_t>();
 
         fLoggerSubscriptions->setValue(vals[0]);
@@ -873,59 +882,73 @@
     }
 
-/*
-    void handleFadPassport(const DimData &d)
+    void handleFadRuns(const DimData &d)
     {
         if (d.size()==0)
             return;
 
-        if (d.size()!=sizeof(FAD::DimPassport))
-        {
-            cout << "Size mismatch: " << d.size() << " " << sizeof(FAD::DimPassport) << endl;
-            return;
-        }
-
-        const FAD::DimPassport &sdata = *reinterpret_cast<const FAD::DimPassport*>(d.ptr());
-
-        stringstream str1;
-        str1 << hex << "0x" << setfill('0') << setw(16) << sdata.fDNA;
-
-        fFadVersion->setValue(sdata.fVersion);
-        fFadBoardId->setValue(sdata.fBoardId);
-        fFadDNA->setText(str1.str().c_str());
-    }
-
-    void handleFadTemperatures(const DimData &d)
+        if (d.size()!=4)
+        {
+            cout << "Size mismatch: " << d.size() << " " << 8 << endl;
+            return;
+        }
+
+        fEvtsRunMax->setValue(d.get<uint32_t>());
+    }
+
+    void handleFadEvents(const DimData &d)
     {
         if (d.size()==0)
             return;
 
-        if (d.size()!=sizeof(FAD::DimTemperatures))
-        {
-            cout << "Size mismatch: " << d.size() << " " << sizeof(FAD::DimTemperatures) << endl;
-            return;
-        }
-
-        const FAD::DimTemperatures &sdata = *reinterpret_cast<const FAD::DimTemperatures*>(d.ptr());
-
-        fFadTemp0->setValue(sdata.fTempDrs[0]);
-        fFadTemp1->setValue(sdata.fTempDrs[1]);
-        fFadTemp2->setValue(sdata.fTempDrs[2]);
-        fFadTemp3->setValue(sdata.fTempDrs[3]);
-    }
-
-    void handleFadSetup(const DimData &d)
+        if (d.size()!=8)
+        {
+            cout << "Size mismatch: " << d.size() << " " << 8 << endl;
+            return;
+        }
+
+        const uint32_t *ptr = d.ptr<uint32_t>();
+
+        fEvtsSuccessCurRun->setValue(ptr[0]);
+        fEvtsSuccessTotal->setValue(ptr[1]);
+    }
+
+    void handleFadCurrentEvent(const DimData &d)
     {
         if (d.size()==0)
             return;
 
-        if (d.size()!=sizeof(FAD::DimSetup))
-        {
-            cout << "Size mismatch: " << d.size() << " " << sizeof(FAD::DimSetup) << endl;
-            return;
-        }
-
-
-    }
-*/
+        if (d.size()!=4)
+        {
+            cout << "Size mismatch: " << d.size() << " " << 4 << endl;
+            return;
+        }
+
+        fEvtsTriggerId->setValue(d.get<uint32_t>());
+    }
+
+    void handleFadConnections(const DimData &d)
+    {
+        if (d.size()==0)
+            return;
+
+        if (d.size()!=40)
+        {
+            cout << "Size mismatch: " << d.size() << " " << 40 << endl;
+            return;
+        }
+
+        const uint8_t *ptr = d.ptr<uint8_t>();
+
+        for (int i=0; i<40; i++)
+        {
+            switch (ptr[i])
+            {
+            case 0:  SetLedColor(fFadLED[i], kLedGray,   d.time); break;
+            case 9:  SetLedColor(fFadLED[i], kLedGreen,  d.time); break;
+            default: SetLedColor(fFadLED[i], kLedOrange, d.time);
+            }
+        }
+    }
+
     // ===================== FTM ============================================
 
@@ -943,5 +966,5 @@
         }
 
-        const FTM::DimTriggerCounter &sdata = *reinterpret_cast<const FTM::DimTriggerCounter*>(d.ptr());
+        const FTM::DimTriggerCounter &sdata = d.ref<FTM::DimTriggerCounter>();
 
         fFtmTime->setText(QString::number(sdata.fTimeStamp/1000000., 'f', 6)+ " s");
@@ -1027,5 +1050,5 @@
         }
 
-        const uint32_t *sdata = reinterpret_cast<const uint32_t*>(d.ptr());
+        const uint32_t *sdata = d.ptr<uint32_t>();
 
         fFtmCounterH->setValue(sdata[0]);
@@ -1051,5 +1074,5 @@
         }
 
-        const FTM::DimDynamicData &sdata = *reinterpret_cast<const FTM::DimDynamicData*>(d.ptr());
+        const FTM::DimDynamicData &sdata = d.ref<FTM::DimDynamicData>();
 
         fOnTime->setText(QString::number(sdata.fOnTimeCounter/1000000., 'f', 6)+" s");
@@ -1252,5 +1275,5 @@
         }
 
-        const FTM::DimStaticData &sdata = *reinterpret_cast<const FTM::DimStaticData*>(d.ptr());
+        const FTM::DimStaticData &sdata = d.ref<FTM::DimStaticData>();
 
         fTriggerInterval->setValue(sdata.fTriggerInterval);
@@ -1324,5 +1347,5 @@
         }
 
-        const FTM::DimPassport &sdata = *reinterpret_cast<const FTM::DimPassport*>(d.ptr());
+        const FTM::DimPassport &sdata = d.ref<FTM::DimPassport>();
 
         stringstream str1, str2;
@@ -1347,5 +1370,5 @@
         fFtuPing->setChecked(false);
 
-        const FTM::DimFtuList &sdata = *reinterpret_cast<const FTM::DimFtuList*>(d.ptr());
+        const FTM::DimFtuList &sdata = d.ref<FTM::DimFtuList>();
 
         stringstream str;
@@ -1383,5 +1406,5 @@
             return;
 
-        const FTM::DimError &sdata = *reinterpret_cast<const FTM::DimError*>(d.ptr());
+        const FTM::DimError &sdata = d.ref<FTM::DimError>();
 
         SetFtuLed(sdata.fError.fDestAddress , sdata.fError.fNumCalls, d.time);
@@ -1439,7 +1462,11 @@
             if (s.index<FAD::kDisconnected) // No Dim connection
                 SetLedColor(fStatusFADLed, kLedGray, time);
+            if (s.index==FAD::kOffline) // Dim connection / FTM disconnected
+                SetLedColor(fStatusFADLed, kLedRed, time);
             if (s.index==FAD::kDisconnected) // Dim connection / FTM disconnected
+                SetLedColor(fStatusFADLed, kLedOrange, time);
+            if (s.index==FAD::kConnecting) // Dim connection / FTM disconnected
                 SetLedColor(fStatusFADLed, kLedYellow, time);
-            if (s.index==FAD::kConnected) // Dim connection / FTM connected
+            if (s.index>=FAD::kConnected) // Dim connection / FTM connected
             {
                 SetLedColor(fStatusFADLed, kLedGreen, time);
@@ -1663,7 +1690,7 @@
         if (getInfo()==&fDimDNS)
             return PostInfoHandler(&FactGui::handleDimDNS);
-
+#ifdef DEBUG_DIM
         cout << "HandleDimInfo " << getInfo()->getName() << endl;
-
+#endif
         if (getInfo()==&fDimLoggerStats)
             return PostInfoHandler(&FactGui::handleLoggerStats);
@@ -1671,4 +1698,16 @@
         if (getInfo()==&fDimFadFiles)
             return PostInfoHandler(&FactGui::handleFadFiles);
+
+        if (getInfo()==&fDimFadConnections)
+            return PostInfoHandler(&FactGui::handleFadConnections);
+
+        if (getInfo()==&fDimFadEvents)
+            return PostInfoHandler(&FactGui::handleFadEvents);
+
+        if (getInfo()==&fDimFadRuns)
+            return PostInfoHandler(&FactGui::handleFadRuns);
+
+        if (getInfo()==&fDimFadCurrentEvent)
+            return PostInfoHandler(&FactGui::handleFadCurrentEvent);
 
 /*
@@ -1957,5 +1996,9 @@
         fDimFtmDynamicData   ("FTM_CONTROL/DYNAMIC_DATA",    (void*)NULL, 0, this),
         fDimFtmCounter       ("FTM_CONTROL/COUNTER",         (void*)NULL, 0, this),
-        fDimFadFiles         ("FAD_CONTROL/FILES",           (void*)NULL, 0, this)
+        fDimFadFiles         ("FAD_CONTROL/FILES",           (void*)NULL, 0, this),
+        fDimFadRuns          ("FAD_CONTROL/RUNS",            (void*)NULL, 0, this),
+        fDimFadEvents        ("FAD_CONTROL/EVENTS",          (void*)NULL, 0, this),
+        fDimFadCurrentEvent  ("FAD_CONTROL/CURRENT_EVENT",   (void*)NULL, 0, this),
+        fDimFadConnections   ("FAD_CONTROL/CONNECTIONS",     (void*)NULL, 0, this)
     {
         fTriggerWidget->setEnabled(false);
