Index: /trunk/FACT++/gui/FactGui.h
===================================================================
--- /trunk/FACT++/gui/FactGui.h	(revision 13477)
+++ /trunk/FACT++/gui/FactGui.h	(revision 13478)
@@ -27,5 +27,5 @@
 #include "src/FAD.h"
 #include "src/PixelMap.h"
-
+#include "src/DimData.h"
 
 #include "TROOT.h"
@@ -433,4 +433,5 @@
 
     DimStampedInfo fDimBiasNominal;
+    DimStampedInfo fDimBiasVolt;
     DimStampedInfo fDimBiasDac;
     DimStampedInfo fDimBiasCurrent;
@@ -743,57 +744,4 @@
             }
     }
-
-    // ======================================================================
-
-    struct DimData
-    {
-        const int          qos;
-        const string       name;
-        const string       format;
-        const vector<char> data;
-        const Time         time;
-
-        Time extract(DimInfo *inf) const
-        {
-            // Must be called in exactly this order!
-            const int tsec = inf->getTimestamp();
-            const int tms  = inf->getTimestampMillisecs();
-
-            return Time(tsec, tms*1000);
-        }
-
-//        DimInfo *info;  // this is ONLY for a fast check of the type of the DimData!!
-
-        DimData(DimInfo *inf) :
-            qos(inf->getQuality()),
-            name(inf->getName()),
-            format(inf->getFormat()),
-            data(inf->getString(), inf->getString()+inf->getSize()),
-            time(extract(inf))/*,
-            info(inf)*/
-        {
-        }
-
-        template<typename T>
-                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()); }
-//        string str(unsigned int b) const { return b>=data.size()?string():string(data.data()+b, data.size()-b); }
-        const char *c_str() const { return (char*)data.data(); }
-/*
-        vector<boost::any> any() const
-        {
-            const Converter conv(format);
-            conv.Print();
-            return conv.GetAny(data.data(), data.size());
-        }*/
-        size_t size() const { return data.size(); }
-    };
 
     // ======================= DNS ==========================================
@@ -2710,9 +2658,9 @@
     void handleFeedbackCalibration(const DimData &d)
     {
-        if (!CheckSize(d, 2*416*sizeof(float)))
+        if (!CheckSize(d, 3*416*sizeof(float)))
             return;
 
         const float *ptr = d.ptr<float>();
-        fBiasOffsets.assign(ptr, ptr+416);
+        fBiasOffsets.assign(ptr+2*416, ptr+3*416);
     }
 
@@ -2834,5 +2782,5 @@
         };
 
-        const uint16_t i = uint16_t(floor(fmod(ptr[6]+180+11.25, 360)/22));
+        const uint16_t i = uint16_t(floor(fmod(ptr[6]+11.25, 360)/22));
         fMagicWindDir->setText(dir[i]);
     }
@@ -2840,4 +2788,5 @@
     // ========================== FSC =======================================
 
+    vector<float>   fVecBiasVolt;
     vector<int16_t> fVecBiasDac;
     vector<int16_t> fVecBiasCurrent;
@@ -2857,4 +2806,13 @@
     }
 
+    void handleBiasVolt(const DimData &d)
+    {
+        if (!CheckSize(d, 416*sizeof(float)))
+            return;
+
+        const float *ptr = d.ptr<float>();
+        fVecBiasVolt.assign(ptr, ptr+416);
+    }
+
     void handleBiasDac(const DimData &d)
     {
@@ -2863,5 +2821,4 @@
 
         const int16_t *ptr = d.ptr<int16_t>();
-
         fVecBiasDac.assign(ptr, ptr+2*416);
 
@@ -2897,10 +2854,10 @@
             */
 
-            dat[i] = abs(ptr[entry.hv()]);
-            if (fBiasOffsets.size()>0)
-                dat[i] -= fBiasOffsets[entry.hv()];
-            dat[i] *= 5000./4096;
-
-            dat[i] /= entry.group()==0 ? 4 : 5;
+            dat[i] = abs(ptr[entry.hv()]) * 5000./4096;
+
+            if (fBiasOffsets.size()>0 && fVecBiasVolt.size()>0)
+                dat[i] -= fVecBiasVolt[entry.hv()]/fBiasOffsets[entry.hv()]*1e6;
+
+            //dat[i] /= entry.group()==0 ? 4 : 5;
 
             fBiasCamA->SetEnable(i, uint16_t(ptr[entry.hv()])!=0x8000);
@@ -3510,4 +3467,7 @@
             return PostInfoHandler(&FactGui::handleBiasNominal);
 
+        if (getInfo()==&fDimBiasVolt)
+            return PostInfoHandler(&FactGui::handleBiasVolt);
+
         if (getInfo()==&fDimBiasDac)
             return PostInfoHandler(&FactGui::handleBiasDac);
@@ -3838,8 +3798,7 @@
         if (fVecBiasCurrent.size()>0)
         {
-            double val = abs(fVecBiasCurrent[ihw]);
-            if (fBiasOffsets.size()>0)
-                val -= fBiasOffsets[ihw];
-            val *= 5000/4096;
+            double val = abs(fVecBiasCurrent[ihw]) * 5000./4096;
+            if (fBiasOffsets.size()>0 && fVecBiasVolt.size()>0)
+                val -= fVecBiasVolt[ihw]/fBiasOffsets[ihw]*1e6;
 
             fBiasCurrent->setValue(val);
@@ -3848,7 +3807,8 @@
         }
 
-        if (fBiasOffsets.size()>0)
-            fBiasOffset->setValue(fBiasOffsets[ihw]*5000./4096);
-        fBiasOffset->setEnabled(fBiasOffsets.size()>0);
+        if (fBiasOffsets.size()>0 && fVecBiasVolt.size()>0)
+            fBiasOffset->setValue(fVecBiasVolt[ihw]/fBiasOffsets[ihw]*1e6);
+
+        fBiasOffset->setEnabled(fBiasOffsets.size()>0 && fVecBiasVolt.size()>0);
     }
 
@@ -4098,5 +4058,5 @@
         fDimFadRoi             ("FAD_CONTROL/REGION_OF_INTEREST", (void*)NULL, 0, this),
         fDimFadDac             ("FAD_CONTROL/DAC",                (void*)NULL, 0, this),
-        fDimFadDrsCalibration  ("FAD_CONTROL/DRS_CALIBRATION",    (void*)NULL, 0, this),
+        fDimFadDrsCalibration  ("FAD_CONTROL/XDRS_CALIBRATION",    (void*)NULL, 0, this),
         fDimFadStatus          ("FAD_CONTROL/STATUS",             (void*)NULL, 0, this),
         fDimFadStatistics1     ("FAD_CONTROL/STATISTICS1",        (void*)NULL, 0, this),
@@ -4114,4 +4074,5 @@
         //-
         fDimBiasNominal        ("BIAS_CONTROL/NOMINAL",           (void*)NULL, 0, this),
+        fDimBiasVolt           ("BIAS_CONTROL/VOLTAGE",           (void*)NULL, 0, this),
         fDimBiasDac            ("BIAS_CONTROL/DAC",               (void*)NULL, 0, this),
         fDimBiasCurrent        ("BIAS_CONTROL/CURRENT",           (void*)NULL, 0, this),
