Index: /trunk/FACT++/src/EventBuilderWrapper.h
===================================================================
--- /trunk/FACT++/src/EventBuilderWrapper.h	(revision 11444)
+++ /trunk/FACT++/src/EventBuilderWrapper.h	(revision 11445)
@@ -18,5 +18,5 @@
 extern "C" {
     extern void StartEvtBuild();
-    extern int CloseRunFile(uint32_t runId, uint32_t closeTime);
+    extern int CloseRunFile(uint32_t runId, uint32_t closeTime, uint32_t maxEvt);
 }
 
@@ -399,5 +399,8 @@
         str << name << idx;
 
-        WriteKey(str.str(), value, comment);
+        ostringstream com;
+        com << "Board " << setw(2) << idx << ": " << comment;
+
+        WriteKey(str.str(), value, com.str());
     }
 
@@ -451,5 +454,5 @@
         AddColumnEntry(colNames, dataTypes, 1,            'I', "TriggerType");
         AddColumnEntry(colNames, dataTypes, 1,            'J', "SoftTrig");
-        AddColumnEntry(colNames, dataTypes, 1,            'J', "PCTime");
+        AddColumnEntry(colNames, dataTypes, 2,            'J', "PCTime");
         AddColumnEntry(colNames, dataTypes, NBOARDS,      'J', "BoardTime");
         AddColumnEntry(colNames, dataTypes, NPIX,         'I', "StartPix");
@@ -458,5 +461,5 @@
 
         ostringstream fmt;
-        fmt << "I:1;S:1;I:1;I:1";
+        fmt << "I:1;S:1;I:1;I:2";
         fmt << ";I:" << NBOARDS;
         fmt << ";S:" << NPIX;
@@ -488,27 +491,61 @@
         //first the "standard" keys
         WriteKey("EXTREL",   1.0f,   "Release Number");
-        WriteKey("TELESCOP", "FACT", "Telescope that acquired this data");
-        WriteKey("ORIGIN",   "ISDC", "Institution that wrote the file");
-        WriteKey("CREATOR",  "FACT++ Event Builder", "Program that wrote this file");
-
-        string stringValue;
-        stringValue = Time().GetAsStr();
-        stringValue[10]= 'T';
-        WriteKey("DATE",     stringValue, "File creation data");
-        WriteKey("TIMESYS",  "TT",        "Time frame system");
-        WriteKey("TIMEUNIT", "d",         "Time unit");
-        WriteKey("TIMEREF",  "UTC",       "Time reference frame");
-        //FIXME should we also put the start and stop time of the received data ?
-        //now the events header related variables
-        WriteKey("VERSION",  h->Version,  "Builder version");
-        WriteKey("NIGHT",    Time().NightAsInt(), "Night as int");
+        WriteKey("TELESCOP", "FACT",    "Telescope that acquired this data");
+        WriteKey("ORIGIN",   "ISDC",    "Institution that wrote the file");
+        WriteKey("CREATOR",  "fadctrl", "Program that wrote this file (FACT++ Event Builder)");
+
+        WriteKey("PACKAGE",   PACKAGE_NAME, "Package name");
+        WriteKey("VERSION",   PACKAGE_VERSION, "Package description");
+        WriteKey("COMPILED",  __DATE__" "__TIME__, "Compile time");
+        WriteKey("REVISION",  REVISION, "SVN revision");
+        //WriteKey("CONTACT",   PACKAGE_BUGREPORT, "Current package maintainer");
+        //WriteKey("URL",       PACKAGE_URL, "Current repositiory location");
+
+        WriteKey("BLDVER",   h->Version,  "Builder version");
         WriteKey("RUNID",    GetRunId(),  "Run number");
         WriteKey("RUNTYPE",  h->RunType,  "Type of run");
         WriteKey("NBOARD",   h->NBoard,   "Number of acquisition boards");
         WriteKey("NPIX",     h->NPix,     "Number of pixels");
-        WriteKey("NTM",      h->NTm,      "Number of Time marks");
+        WriteKey("NTMARK",   h->NTm,      "Number of Time marks");
         WriteKey("NROI",     h->Nroi,     "Number of slices per pixels");
-        WriteKey("CAMERA",   "MGeomCamFact", "");
-/*
+
+        const Time now;
+        WriteKey("TIMESYS",  "UTC",       "Time system");
+        WriteKey("DATE",     now.Iso(),   "File creation date");
+        WriteKey("NIGHT",    now.NightAsInt(), "Night as int");
+        // WriteKey("TSTART", "", "Time when first event was received")
+        // WriteKey("TSTOP",  "", "Time when last event was received")
+
+        //FIXME should we also put the start and stop time of the received data ?
+        //now the events header related variables
+        WriteKey("CAMERA",   "MGeomCamFACT", "");
+        WriteKey("DAQ",      "DRS4", "");
+
+        Fatal("Write sampling frequency...");
+
+        // Write a single key for:
+        // -----------------------
+        // Start package flag
+        // package length
+        // version number
+        // status
+        // Prescaler
+
+        // Write 40 kays for (?)
+        // Phaseshift
+        // DAC
+
+        for (int i=0; i<h->NBoard; i++)
+        {
+            const PEVNT_HEADER &hh = h->FADhead[i];
+
+            // Header values whihc won't change during the run
+            WriteKey("BOARDID", i, hh.board_id,   "ID");
+            WriteKey("DNA",     i, hh.DNA,        "DNA");
+            WriteKey("FWVER",   i, hh.version_no, "Firmware Version");
+        }
+
+
+        /*
         //now the boards related keywords
         for (int i=0; i<h->NBoard; i++)
@@ -516,46 +553,20 @@
             const PEVNT_HEADER &hh = h->FADhead[i];
 
-            WriteKey("STPKGFG", i, hh.start_package_flag,
-                     "Start package flag");
-
-            WriteKey("PKGLEN",  i, hh.package_length,
-                     "Package length");
-
-            WriteKey("VERNO",   i, hh.version_no,
-                     "Version number");
-
-            WriteKey("STATUS",  i, hh.PLLLCK,
-                     "");
-
-//            WriteKey("TRIGCRC", i, hh.trigger_crc,
-//                     "Trigger CRC");
-
-//            WriteKey("TRIGTYP", i, hh.trigger_type,
-//                     "Trigger type");
-
-//            WriteKey("TRIGID",  i, hh.trigger_id,
-//                     "Trigger ID");
-
-//            WriteKey("EVTCNTR", i, hh.fad_evt_counter,
-//                     "FAD Event Counter");
-
-//            WriteKey("REFCLK",  i, hh.REFCLK_frequency,
-//                     "Reference Clock Frequency");
-
-            WriteKey("BOARDID", i, hh.board_id,
-                     "Board ID");
-
-            WriteKey("PHASESH", i, hh.adc_clock_phase_shift,
-                     "ADC clock phase shift");
-
-            WriteKey("TRGGEN",  i, hh.number_of_triggers_to_generate,
-                     "Number of triggers to generate");
-
-            WriteKey("PRESC",   i, hh.trigger_generator_prescaler,
-                    "Trigger generator prescaler");
-
-            WriteKey("DNA",     i, hh.DNA,       "DNA");
+            WriteKey("STPKGFG", i, hh.start_package_flag, "Start package flag");
+            WriteKey("PKGLEN",  i, hh.package_length, "Package length");
+            WriteKey("STATUS",  i, hh.PLLLCK, "");
+
+//            WriteKey("TRIGCRC", i, hh.trigger_crc,      "Trigger CRC");
+//            WriteKey("TRIGTYP", i, hh.trigger_type,     "Trigger type");
+//            WriteKey("TRIGID",  i, hh.trigger_id,       "Trigger ID");
+//            WriteKey("EVTCNTR", i, hh.fad_evt_counter,  "FAD Event Counter");
+//            WriteKey("REFCLK",  i, hh.REFCLK_frequency, "Reference Clock Frequency");
+
+            WriteKey("PHASESH", i, hh.adc_clock_phase_shift,          "ADC clock phase shift");
+            WriteKey("TRGGEN",  i, hh.number_of_triggers_to_generate, "Number of triggers to generate");
+            WriteKey("PRESC",   i, hh.trigger_generator_prescaler,    "Trigger generator prescaler");
+            WriteKey("RUNNB",   i, hh.runnumber,                      "Run number");
+
             WriteKey("TIME",    i, hh.time,      "Time");
-            WriteKey("RUNNB",   i, hh.runnumber, "Run number");
 
 //            for (int j=0;j<NTemp;j++)
@@ -572,5 +583,5 @@
 
         //Last but not least, add header keys that will be updated when closing the file
-        //WriteFooter(NULL);
+        WriteFooter(NULL);
 
         return true;
@@ -701,5 +712,5 @@
             return false;
 
-        //WriteFooter(rt);
+        WriteFooter(rt);
 
         delete fFile;
@@ -817,5 +828,5 @@
         fDimRuns        ("FAD_CONTROL/RUNS",             "I:5;C", ""),
         fDimEvents      ("FAD_CONTROL/EVENTS",           "I:4", ""),
-	fDimEventData   ("FAD_CONTROL/EVENT_DATA",       "S:1;I:1;S:1;I:2;S:1;S", ""),
+        fDimEventData   ("FAD_CONTROL/EVENT_DATA",       "S:1;I:1;S:1;I:1;I:2;I:40;S:1440;S:160;S", ""),
         fDimFwVersion   ("FAD_CONTROL/FIRMWARE_VERSION", "F:42", ""),
         fDimRunNumber   ("FAD_CONTROL/RUN_NUMBER",       "I:42", ""),
@@ -856,10 +867,22 @@
     }
 
-    uint32_t IncreaseRunNumber()
-    {
+    map<uint32_t, pair<uint32_t, uint32_t>> fExpectedRuns;
+
+    uint32_t StartNewRun()
+    {
+        uint32_t maxtime = 0;
+        uint32_t maxevt  = 0;
+
+        if (maxtime==0)
+            maxtime = 24*60*60;
+        if (maxevt==0)
+            maxevt  = 2147483646;
+
+        maxtime = 60;
+        maxevt  = 10;
+
+        fExpectedRuns[fRunNumber] = make_pair(maxtime, maxevt);
         return fRunNumber++;
     }
-
-    uint32_t GetRunNumber() const { return fRunNumber; }
 
     bool IsThreadRunning()
@@ -1046,5 +1069,5 @@
 //    size_t GetUsedMemory() const { return gi_usedMem; }
 
-    virtual int CloseOpenFiles() { CloseRunFile(0, 0); return 0; }
+    virtual int CloseOpenFiles() { CloseRunFile(0, 0, 0); return 0; }
 
 
@@ -1301,20 +1324,4 @@
     }
 
-    	struct DimEventData
-	{
-	    uint16_t Roi ;            // #slices per pixel (same for all pixels and tmarks)
-	    uint32_t EventNum ;       // EventNumber as from FTM
-	    uint16_t TriggerType ;    // Trigger Type from FTM
-
-	    uint32_t PCTime ;         // when did event start to arrive at PC
-	    uint32_t BoardTime;       //
-
-	    int16_t StartPix;         // First Channel per Pixel (Pixels sorted according Software ID)  ; -1 if not filled
-	    int16_t StartTM;          // First Channel for TimeMark (sorted Hardware ID) ; -1 if not filled
-
-	    uint16_t Adc_Data[];     // final length defined by malloc ....
-
-	} __attribute__((__packed__));;
-
     int eventCheck(PEVNT_HEADER *fadhd, EVENT *event)
     {
@@ -1331,4 +1338,51 @@
          */
 
+        // Check consistency of:
+        // =====================
+
+        // Write a single key for:
+        // -----------------------
+        // Start package flag
+        // package length
+        // version number
+        // status
+        // Prescaler
+
+        // Write 40 kays for (?)
+        // Phaseshift
+        // DNA
+        // DAC
+
+
+        /*
+         uint16_t start_package_flag;
+         uint16_t package_length;
+         uint16_t version_no;
+         uint16_t PLLLCK;
+
+         uint16_t trigger_crc;
+         uint16_t trigger_type;
+         uint32_t trigger_id;
+
+         uint32_t fad_evt_counter;
+         uint32_t REFCLK_frequency;
+
+         uint16_t board_id;
+         uint8_t  zeroes;
+         int8_t   adc_clock_phase_shift;
+         uint16_t number_of_triggers_to_generate;
+         uint16_t trigger_generator_prescaler;
+
+         uint64_t DNA;
+
+         uint32_t time;
+         uint32_t runnumber;
+
+         int16_t  drs_temperature[NTemp];
+
+         int16_t  dac[NDAC];
+         */
+
+
         static Time oldt(boost::date_time::neg_infin);
         Time newt;
@@ -1339,30 +1393,7 @@
         oldt = newt;
 
-	static DimEventData *data = 0;
-
-	const size_t sz = sizeof(DimEventData)+event->Roi*2*1440;
-
-	if (data && data->Roi != event->Roi)
-	{
-	    delete data;
-	    data = 0;
-	}
-
-        if (!data)
-	    data = reinterpret_cast<DimEventData*>(new char[sz]);
-
-//        cout << sizeof(DimEventData) << " " << event->Roi << " " << sz << " " << sizeof(*data) << endl;
-
-	data->Roi         = event->Roi;
-	data->EventNum    = event->EventNum;
-	data->TriggerType = event->TriggerType;
-	data->PCTime      = event->PCTime;
-	data->BoardTime   = event->BoardTime[0];
-	data->StartPix    = event->StartPix[0];
-	data->StartTM     = event->StartTM[0];
-
-        memcpy(data->Adc_Data, event->Adc_Data, event->Roi*2*1440);
-
-        fDimEventData.setData(data, sz);
+	const size_t sz = sizeof(EVENT)+event->Roi*2*1440;
+
+        fDimEventData.setData(event, sz);
 	fDimEventData.updateService();
 
@@ -1372,14 +1403,24 @@
     }
 
-    set<uint32_t> fStartedRuns;
-
-    bool IsRunStarted(uint32_t runno) const
-    {
-        return fStartedRuns.find(runno)!=fStartedRuns.end();
+    bool IsRunStarted() const
+    {
+        return fExpectedRuns.find(fRunNumber-1)==fExpectedRuns.end();
     }
 
     void gotNewRun(int runnr, PEVNT_HEADER *headers)
     {
-        fStartedRuns.insert(runnr);
+        // This function is called even when writing is switched off
+        const map<uint32_t,pair<uint32_t,uint32_t>>::iterator it = fExpectedRuns.find(runnr);
+        if (it==fExpectedRuns.end())
+        {
+            ostringstream str;
+            str << "gotNewRun - Run " << runnr << " wasn't expected." << endl;
+            return;
+        }
+
+        CloseRunFile(runnr, time(NULL)+it->second.first, it->second.second);
+        // return: 0=close scheduled / >0 already closed / <0 does not exist
+
+        fExpectedRuns.erase(it);
     }
 
