Index: /trunk/FACT++/gui/FactGui.h
===================================================================
--- /trunk/FACT++/gui/FactGui.h	(revision 10749)
+++ /trunk/FACT++/gui/FactGui.h	(revision 10750)
@@ -14,6 +14,8 @@
 #include "CheckBoxDelegate.h"
 
+#include "src/Dim.h"
 #include "src/Converter.h"
 #include "src/HeadersFTM.h"
+#include "src/HeadersFAD.h"
 #include "src/DimNetwork.h"
 #include "src/tools.h"
@@ -143,4 +145,5 @@
     void SetEnable(int idx, bool b) { fEnable[idx]=b; }
     void Toggle(int idx) { fEnable[idx]=!fEnable[idx]; }
+    double GetData(int idx) const { return fData[idx]; }
 
     const char *GetName() const { return "Camera"; }
@@ -341,4 +344,8 @@
     DimStampedInfo fDimFtmDynamicData;
     DimStampedInfo fDimFtmCounter;
+
+    DimStampedInfo fDimFadPassport;
+    DimStampedInfo fDimFadTemperatures;
+    DimStampedInfo fDimFadSetup;
 
     map<string, DimInfo*> fServices;
@@ -849,4 +856,60 @@
     }
 
+    // ===================== FAD ============================================
+
+    void handleFadPassport(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()==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()==0)
+            return;
+
+        if (d.size()!=sizeof(FAD::DimSetup))
+        {
+            cout << "Size mismatch: " << d.size() << " " << sizeof(FAD::DimSetup) << endl;
+            return;
+        }
+
+
+    }
+
     // ===================== FTM ============================================
 
@@ -904,7 +967,7 @@
         const double t0 = h->GetXaxis()->GetXmin();
 
-        h->SetBins(h->GetNbinsX()+1, t0, t0+sdata.fTriggerCounter+1);
+        h->SetBins(h->GetNbinsX()+1, t0, t0+sdata.fTimeStamp+1);
         fGraphFtmRate.SetPoint(fGraphFtmRate.GetN(),
-                               t0+sdata.fTriggerCounter, rate);
+                               t0+sdata.fTimeStamp, rate);
 
         if (t1-t0>60)
@@ -945,4 +1008,5 @@
 
     int64_t fTriggerCounter0;
+    int64_t fTimeStamp0;
 
     void handleFtmDynamicData(const DimData &d)
@@ -992,4 +1056,45 @@
         // ----------------------------------------------
 
+        if (fTimeStamp0<0)
+        {
+            fTimeStamp0 = sdata.fTimeStamp;
+            return;
+        }
+
+        TCanvas *c = fFtmRateCanv->GetCanvas();
+
+        TH1 *h = (TH1*)c->FindObject("TimeFrame");
+
+        const double tdiff = sdata.fTimeStamp-fTimeStamp0;
+        fTimeStamp0 = sdata.fTimeStamp;
+
+        if (tdiff<0)
+        {
+            for (int i=0; i<160; i++)
+                fGraphPatchRate[i].Set(0);
+            for (int i=0; i<40; i++)
+                fGraphBoardRate[i].Set(0);
+
+            return;
+        }
+
+        const double t1 = h->GetXaxis()->GetXmax();
+        const double t0 = h->GetXaxis()->GetXmin();
+
+        for (int i=0; i<160; i++)
+            fGraphPatchRate[i].SetPoint(fGraphPatchRate[i].GetN(),
+                                       t0+sdata.fTimeStamp, float(sdata.fRatePatch[i])/fFtmStaticData.fPrescaling[i]/1000);
+        for (int i=0; i<40; i++)
+            fGraphBoardRate[i].SetPoint(fGraphBoardRate[i].GetN(),
+                                       t0+sdata.fTimeStamp, float(sdata.fRateBoard[i])/fFtmStaticData.fPrescaling[i]/1000);
+
+        c->Modified();
+        c->Update();
+
+        // ----------------------------------------------
+
+        if (fThresholdIdx->value()>=0)
+            fPatchRate->setValue(sdata.fRatePatch[fThresholdIdx->value()]);
+
         valarray<double> dat(0., 1440);
 
@@ -997,5 +1102,5 @@
             dat[i] = sdata.fRatePatch[fPatch[i]];
 
-        TCanvas *c = fRatesCanv->GetCanvas();
+        c = fRatesCanv->GetCanvas();
         Camera *cam = (Camera*)c->FindObject("Camera");
 
@@ -1005,4 +1110,46 @@
         c->Update();
 #endif
+    }
+
+    void DisplayRates()
+    {
+#ifdef HAVE_ROOT
+        TCanvas *c = fFtmRateCanv->GetCanvas();
+
+        while (c->FindObject("PatchRate"))
+            c->GetListOfPrimitives()->Remove(c->FindObject("PatchRate"));
+
+        while (c->FindObject("BoardRate"))
+            c->GetListOfPrimitives()->Remove(c->FindObject("BoardRate"));
+
+        if (fRatePatch1->value()>=0)
+            fGraphPatchRate[fRatePatch1->value()].Draw("PL");
+        if (fRatePatch2->value()>=0)
+            fGraphPatchRate[fRatePatch2->value()].Draw("PL");
+        if (fRateBoard1->value()>=0)
+            fGraphBoardRate[fRateBoard1->value()].Draw("PL");
+        if (fRateBoard2->value()>=0)
+            fGraphBoardRate[fRateBoard2->value()].Draw("PL");
+#endif
+    }
+
+    void on_fRatePatch1_valueChanged(int idx)
+    {
+        DisplayRates();
+    }
+
+    void on_fRatePatch2_valueChanged(int idx)
+    {
+        DisplayRates();
+    }
+
+    void on_fRateBoard1_valueChanged(int idx)
+    {
+        DisplayRates();
+    }
+
+    void on_fRateBoard2_valueChanged(int idx)
+    {
+        DisplayRates();
     }
 
@@ -1096,5 +1243,5 @@
         fEnableExt1->setChecked(sdata.HasExt1());
         fEnableExt2->setChecked(sdata.HasExt2());
-        fEnableTimeMarker->setChecked(sdata.HasTimeMarker());
+        fEnableClockCond->setChecked(sdata.HasClockConditioner());
 
         for (int i=0; i<40; i++)
@@ -1120,5 +1267,6 @@
 
         const int patch1 = fThresholdIdx->value();
-        fThresholdVal->setValue(sdata.fThreshold[patch1<0?0:patch1]);
+        if (patch1>=0)
+            fThresholdVal->setValue(sdata.fThreshold[patch1]);
 
         fPrescalingVal->setValue(sdata.fPrescaling[0]);
@@ -1249,10 +1397,17 @@
             fStatusFADLabel->setToolTip(s.comment.c_str());
 
-            if (s.index<FTM::kDisconnected) // No Dim connection
+            bool enable = false;
+
+            if (s.index<FAD::kDisconnected) // No Dim connection
                 SetLedColor(fStatusFADLed, kLedGray, time);
-            if (s.index==FTM::kDisconnected) // Dim connection / FTM disconnected
+            if (s.index==FAD::kDisconnected) // Dim connection / FTM disconnected
                 SetLedColor(fStatusFADLed, kLedYellow, time);
-            if (s.index==FTM::kConnected) // Dim connection / FTM connected
+            if (s.index==FAD::kConnected) // Dim connection / FTM connected
+            {
                 SetLedColor(fStatusFADLed, kLedGreen, time);
+                enable = true;
+            }
+
+            fFadWidget->setEnabled(enable);
         }
 
@@ -1476,4 +1631,10 @@
             return PostInfoHandler(&FactGui::handleLoggerStats);
 
+        if (getInfo()==&fDimFadTemperatures)
+            return PostInfoHandler(&FactGui::handleFadTemperatures);
+
+        if (getInfo()==&fDimFadSetup)
+            return PostInfoHandler(&FactGui::handleFadSetup);
+
         if (getInfo()==&fDimLoggerFilenameNight)
             return PostInfoHandler(&FactGui::handleLoggerFilenameNight);
@@ -1574,8 +1735,13 @@
 
         fThresholdIdx->setValue(idx);
-        fThresholdVal->setValue(fFtmStaticData.fThreshold[idx<0?0:idx]);
-
+
+        //fThresholdVal->setEnabled(idx>=0);
+        //fThresholdVolt->setEnabled(idx>=0);
+        fPatchRate->setEnabled(idx>=0);
         if (idx<0)
             return;
+
+        fThresholdVal->setValue(fFtmStaticData.fThreshold[idx]);
+        fPatchRate->setValue(cam.GetData(idx));
 
         for (unsigned int i=0; i<fPatch.size(); i++)
@@ -1634,5 +1800,7 @@
                 const int idx = cam->GetIdx(xx, yy);
 
-                cam->Toggle(idx);
+                //cam->Toggle(idx);
+
+                Dim::SendCommand("FTM_CONTROL/TOGGLE_PIXEL", uint16_t(idx));
             }
             return;
@@ -1699,4 +1867,6 @@
     TGraph fGraphFtmTemp[4];
     TGraph fGraphFtmRate;
+    TGraph fGraphPatchRate[160];
+    TGraph fGraphBoardRate[40];
 
     map<int, int> fPatch;
@@ -1723,5 +1893,5 @@
         h.GetYaxis()->SetTitleOffset(1.2);
 //        h.GetYaxis()->SetTitleSize(1.2);
-        h.DrawCopy();
+        h.DrawCopy()->SetDirectory(0);
     }
 #endif
@@ -1743,9 +1913,13 @@
         fDimFtmStaticData    ("FTM_CONTROL/STATIC_DATA",     (void*)NULL, 0, this),
         fDimFtmDynamicData   ("FTM_CONTROL/DYNAMIC_DATA",    (void*)NULL, 0, this),
-        fDimFtmCounter       ("FTM_CONTROL/COUNTER",         (void*)NULL, 0, this)
+        fDimFtmCounter       ("FTM_CONTROL/COUNTER",         (void*)NULL, 0, this),
+        fDimFadPassport      ("FAD_CONTROL/PASSPORT",        (void*)NULL, 0, this),
+        fDimFadTemperatures  ("FAD_CONTROL/TEMPERATURES",    (void*)NULL, 0, this),
+        fDimFadSetup         ("FAD_CONTROL/SETUP",           (void*)NULL, 0, this)
     {
         fTriggerWidget->setEnabled(false);
         fFtuWidget->setEnabled(false);
         fRatesWidget->setEnabled(false);
+        fFadWidget->setEnabled(false);
         fLoggerWidget->setEnabled(false);
 
@@ -1782,4 +1956,9 @@
         // --------------------------------------------------------------------------
 #ifdef HAVE_ROOT
+
+        for (int i=0; i<160; i++)
+            fGraphPatchRate[i].SetName("PatchRate");
+        for (int i=0; i<40; i++)
+            fGraphBoardRate[i].SetName("BoardRate");
         /*
         TCanvas *c = fFtmTempCanv->GetCanvas();
