Index: trunk/FACT++/src/EventBuilderWrapper.h
===================================================================
--- trunk/FACT++/src/EventBuilderWrapper.h	(revision 11967)
+++ trunk/FACT++/src/EventBuilderWrapper.h	(revision 11968)
@@ -97,4 +97,5 @@
     DimDescribedService fDimRawData;
     DimDescribedService fDimEventData;
+    DimDescribedService fDimFeedbackData;
     DimDescribedService fDimFwVersion;
     DimDescribedService fDimRunNumber;
@@ -177,4 +178,5 @@
         fDimRawData     ("FAD_CONTROL/RAW_DATA",           "S:1;I:1;S:1;I:1;I:2;I:40;S:1440;S:160;F", ""),
         fDimEventData   ("FAD_CONTROL/EVENT_DATA",         "F:1440;F:1440;F:1440;F:1440", ""),
+        fDimFeedbackData("FAD_CONTROL/FEEDBACK_DATA",      "F:1440", ""),
         fDimFwVersion   ("FAD_CONTROL/FIRMWARE_VERSION",   "F:42", ""),
         fDimRunNumber   ("FAD_CONTROL/RUN_NUMBER",         "I:42", ""),
@@ -821,4 +823,53 @@
         // need gotNewRun/closedRun to know it is finished
 
+        return 0;
+    }
+
+    void SendRawData(PEVNT_HEADER *fadhd, EVENT *event)
+    {
+        // Currently we send any event no matter what its trigger id is...
+        // To be changed.
+        static Time oldt(boost::date_time::neg_infin);
+        Time newt;
+
+        // FIXME: Only send events if the have newer run-numbers
+        if (newt<oldt+boost::posix_time::seconds(1))
+            return;
+
+        oldt = newt;
+
+	const size_t sz = sizeof(EVENT)+event->Roi*2*1440;
+
+        vector<char> data(sz+event->Roi*2*1440);
+        memcpy(data.data(), event, sizeof(EVENT));
+
+        float *vec = reinterpret_cast<float*>(data.data()+sizeof(EVENT));
+
+        DataCalib::Apply(vec, event->Adc_Data, event->StartPix, event->Roi);
+        fDimRawData.Update(data);
+
+        vector<float> data2(1440*4); // Mean, RMS, Max, Pos
+        CalibData::GetPixelStats(data2.data(), vec, event->Roi);
+
+        fDimEventData.Update(data2);
+    }
+
+    void SendFeedbackData(PEVNT_HEADER *fadhd, EVENT *event)
+    {
+        if (!DataCalib::IsValid())
+            return;
+
+        // Workaround to find a valid header.....
+        const FAD::EventHeader *beg = reinterpret_cast<FAD::EventHeader*>(fadhd);
+        const FAD::EventHeader *end = reinterpret_cast<FAD::EventHeader*>(fadhd)+40;
+
+        // FIMXE: Compare with target configuration
+
+        for (const FAD::EventHeader *ptr=beg; ptr!=end; ptr++, beg++)
+            if (ptr->fStartDelimiter!=0)
+                break;
+
+        // FIXME: Time limit?!
+        /*
         static Time oldt(boost::date_time::neg_infin);
         Time newt;
@@ -829,4 +880,8 @@
 
         oldt = newt;
+        */
+
+        // FIXME: Check event type here
+        return;
 
 	const size_t sz = sizeof(EVENT)+event->Roi*2*1440;
@@ -838,16 +893,25 @@
 
         DataCalib::Apply(vec, event->Adc_Data, event->StartPix, event->Roi);
-        fDimRawData.Update(data);
-
-        vector<float> data2(1440*4); // Mean, RMS, Max, Pos
-        CalibData::GetPixelStats(data2.data(), vec, event->Roi);
-
-        fDimEventData.Update(data2);
-
-
-
-
-	return 0;
-    }
+
+        vector<float> data2(1440); // Mean, RMS, Max, Pos
+        CalibData::GetPixelMax(data2.data(), vec, event->Roi, 0, event->Roi);
+
+        fDimFeedbackData.Update(data2);
+    }
+
+    int subProcEvt(int threadID, PEVNT_HEADER *fadhd, EVENT *event, int8_t */*buffer*/)
+    {
+        switch (threadID)
+        {
+        case 0:
+            SendRawData(fadhd, event);
+            return 1;
+        case 1:
+            SendFeedbackData(fadhd, event);
+            return 2;
+        }
+        return 100;
+    }
+
 
     bool IsRunStarted() const
@@ -1264,5 +1328,5 @@
     int subProcEvt(int threadID, PEVNT_HEADER *fadhd, EVENT *event, int8_t *buffer)
     {
-        return 100;
+        return EventBuilderWrapper::This->subProcEvt(threadID, fadhd, event, buffer);
     }
 
