Index: /trunk/FACT++/src/smartfact.cc
===================================================================
--- /trunk/FACT++/src/smartfact.cc	(revision 17171)
+++ /trunk/FACT++/src/smartfact.cc	(revision 17172)
@@ -1700,4 +1700,19 @@
         rms = rms<0 ? 0 : sqrt(rms);
 
+        // Clean broken reports
+        static double pre_rms1 = 1.5;
+        static double pre_rms2 = 0;
+
+        const double cut = pre_rms1 + 0.1;
+
+        const bool reject = rms>cut && pre_rms2<cut;
+
+        pre_rms2 = pre_rms1;
+        pre_rms1 = rms;
+
+        if (reject)
+            return GetCurrentState();
+
+
         if (!fMagicWeatherHist[kTemp].empty())
         {
@@ -1731,62 +1746,13 @@
         ofstream(fPath+"/camtemp.data") << out.str();
 
-        // =======================================================
-
-        static vector<pair<double,double>> fPositionsSensors;
-        static vector<pair<double,double>> fPositionsBias;
-
-        if (fPositionsSensors.empty())
-        {
-            ifstream fin1("sensor-pos.txt");
-            while (1)
-            {
-                double x, y;
-                fin1 >> x;
-                fin1 >> y;
-                if (!fin1)
-                    break;
-
-                fPositionsSensors.emplace_back(x, y);
-            }
-
-            if (fPositionsSensors.size() != 31)
-                Fatal("Reading sensor positions failed ("+to_string(fPositionsSensors.size())+")");
-        }
-
-        if (fPositionsBias.empty())
-        {
-            ifstream fin1("bias-positions.txt");
-            while (1)
-            {
-                double x, y;
-                fin1 >> x;
-                fin1 >> y;
-                if (!fin1)
-                    break;
-
-                fPositionsBias.emplace_back(x, y);
-            }
-
-            if (fPositionsBias.size() != 320)
-                Fatal("Reading bias positions failed ("+to_string(fPositionsBias.size())+")");
-        }
-
-        if (!fPositionsBias.size()==320 || !fPositionsSensors.size()==31)
+        return GetCurrentState();
+    }
+
+    int HandleFscBiasTemp(const EventImp &d)
+    {
+        if (!CheckDataSize(d, "FscControl:BiasTemp", 321*4))
             return GetCurrentState();
 
-        vector<double> temp;
-        vector<Interpolator2D::vec> xy;
-        for (int i=0; i<31; i++)
-            if (ptr[i]!=0)
-            {
-                temp.emplace_back(ptr[i]);
-                xy.emplace_back(fPositionsSensors[i].first, fPositionsSensors[i].second);
-            }
-
-        Interpolator2D inter(xy);
-        if (!inter.SetOutputGrid(fPositionsBias))
-            return GetCurrentState();
-
-        const vector<double> T = inter.Interpolate(temp);
+        const float *ptr = d.Ptr<float>(4);
 
         vector<double> tout(320);
@@ -1795,9 +1761,9 @@
         {
             const int idx = (fPixelMap.hv(i).hw()/9)*2+fPixelMap.hv(i).group();
-            tout[idx] = T[i];
-            pavg += T[i];
-        }
-
-        WriteCam(d, "cam-fsccontrol-temperature", tout, 3, pavg/320-1.5);
+            tout[idx] = ptr[i];
+            pavg += ptr[i];
+        }
+
+        WriteCam(d, "cam-fsccontrol-temperature", tout, 3, pavg/320-1.75);
 
         return GetCurrentState();
@@ -2997,4 +2963,6 @@
         Subscribe("FSC_CONTROL/HUMIDITY")
             (bind(&StateMachineSmartFACT::HandleFscHumidity,         this, placeholders::_1));
+        Subscribe("FSC_CONTROL/BIAS_TEMP")
+            (bind(&StateMachineSmartFACT::HandleFscBiasTemp,         this, placeholders::_1));
 
         Subscribe("MAGIC_WEATHER/DATA")
