Changeset 10923


Ignore:
Timestamp:
06/07/11 22:18:46 (13 years ago)
Author:
tbretz
Message:
Adapted to latest version of code; first implementration of an interface to write files.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/EventBuilderWrapper.h

    r10861 r10923  
    1616
    1717#include "EventBuilder.h"
     18
     19extern "C" {
     20    extern void StartEvtBuild();
     21    extern int CloseRunFile(uint32_t runId, uint32_t closeTime);
     22}
    1823
    1924class EventBuilderWrapper
     
    4146    MessageImp &fMsg;
    4247
     48    DimDescribedService fDimFiles;
     49
    4350public:
    44     EventBuilderWrapper(MessageImp &msg) : fMsg(msg)
     51    EventBuilderWrapper(MessageImp &msg) : fMsg(msg),
     52        fDimFiles("FAD_CONTROL/FILES", "X:1", "")
    4553    {
    4654        if (This)
     
    4856
    4957        This = this;
     58
     59        fFitsFormat = false;
    5060    }
    5161    ~EventBuilderWrapper()
     
    5666        fThread.join();
    5767        //fMsg.Info("EventBuilder stopped.");
    58     }
    59 
    60     void Update(const char *msg, int severity)
     68
     69        for (vector<DataFileImp*>::iterator it=fFiles.begin(); it!=fFiles.end(); it++)
     70            delete *it;
     71    }
     72
     73    void Update(ostringstream &msg, int severity)
    6174    {
    6275        fMsg.Update(msg, severity);
     
    7992    }
    8093
    81     void Start(const vector<string> &addr)
     94    void Start(const vector<tcp::endpoint> &addr)
    8295    {
    8396        if (IsThreadRunning())
     
    87100        }
    88101
     102        int cnt = 0;
     103        for (size_t i=0; i<40; i++)
     104        {
     105            if (addr[i]==tcp::endpoint())
     106            {
     107                g_port[i].sockDef = -1;
     108                continue;
     109            }
     110
     111            // -1:  if entry shell not be used
     112            //  0:  event builder will connect but ignore the events
     113            //  1:  event builder will connect and build events
     114            g_port[i].sockDef                  = 1;
     115
     116            g_port[i].sockAddr.sin_family      = AF_INET;
     117            g_port[i].sockAddr.sin_addr.s_addr = htonl(addr[i].address().to_v4().to_ulong());
     118            g_port[i].sockAddr.sin_port        = htons(addr[i].port());
     119
     120            cnt++;
     121        }
     122
     123//        g_maxBoards = cnt;
     124        g_actBoards = cnt;
     125
     126        g_runStat   = kModeRun;
     127
    89128        fMsg.Message("Starting EventBuilder thread");
    90 
    91         for (size_t i=0; i<addr.size(); i++)
    92         {
    93             memset(g_ip[i].addr, 0, sizeof(g_ip[i].addr));
    94 
    95             const size_t pos = addr[i].find_first_of(':');
    96 
    97             const string a = addr[i].substr(0, pos);
    98             const string p = addr[i].substr(pos+1);
    99 
    100             strcpy(g_ip[i].addr, "127.0.0.1");
    101             g_ip[i].port = atoi(p.c_str());
    102         }
    103 
    104         g_maxBoards = addr.size();
    105         g_actBoards = addr.size();
    106 
    107         g_runStat   = kModeRun;
    108129
    109130        fThread = boost::thread(StartEvtBuild);
     
    144165    size_t GetUsedMemory() const { return gi_usedMem; }
    145166
     167    /*
     168     struct OpenFileToDim
     169     {
     170        int code;
     171        char fileName[FILENAME_MAX];
     172     };
     173
     174     SignalRunOpened(runid, filename);
     175     // Send num open files
     176     // Send runid, (more info about the run?), filename via dim
     177
     178     SignalEvtWritten(runid);
     179     // Send num events written of newest file
     180
     181     SignalRunClose(runid);
     182     // Send new num open files
     183     // Send empty file-name if no file is open
     184
     185     */
    146186
    147187    // -------------- Mapped event builder callbacks ------------------
    148188
    149     int runOpen(uint32_t runid, RUN_HEAD *h, size_t)
    150     {
     189    class DataFileImp
     190    {
     191        uint32_t fRunId;
     192
     193    public:
     194        DataFileImp(uint32_t id) : fRunId(id) { }
     195
     196        virtual bool Write() = 0;
     197        virtual bool Close() = 0;
     198
     199        uint32_t GetRunId() const { return fRunId; }
     200    };
     201
     202
     203    class DataFileRaw : public DataFileImp
     204    {
     205    public:
     206        DataFileRaw(uint32_t id) : DataFileImp(id)  { }
     207        ~DataFileRaw() { Close(); }
     208
     209        virtual bool Write() { return true; }
     210        virtual bool Close() { return true; }
     211    };
     212
     213    class DataFileFits : public DataFileImp
     214    {
     215    public:
     216        DataFileFits(uint32_t id) :DataFileImp(id) { }
     217        ~DataFileFits() { Close(); }
     218
     219        virtual bool Write() { return true; }
     220        virtual bool Close() { return true; }
     221    };
     222
     223    vector<DataFileImp*> fFiles;
     224
     225    bool fFitsFormat;
     226
     227    template<class T>
     228        void Update(DimDescribedService &svc, const T &data) const
     229    {
     230        cout << "Update: " << svc.getName() << " (" << sizeof(T) << ")" << endl;
     231        svc.setData(const_cast<T*>(&data), sizeof(T));
     232        svc.updateService();
     233    }
     234
     235    FileHandle_t runOpen(uint32_t runid, RUN_HEAD *h, size_t)
     236    {
     237        // Check if file already exists...
    151238        cout << "OPEN_FILE #" << runid << endl;
    152239        cout << " Ver= " << h->Version << endl;
     
    157244        cout << " roi= " << h->Nroi << endl;
    158245
    159         return 0;
    160     }
    161 
    162     int runWrite(int, EVENT *e, size_t)
    163     {
    164         cout << "WRITE_EVENT" << endl;
     246        DataFileImp *file = NULL;
     247        try
     248        {
     249            file = fFitsFormat ?
     250                static_cast<DataFileImp*>(new DataFileFits(runid)) :
     251                static_cast<DataFileImp*>(new DataFileRaw(runid));
     252        }
     253        catch (const exception &e)
     254        {
     255            return 0;
     256        }
     257
     258        fFiles.push_back(file);
     259
     260        Update(fDimFiles, fFiles.size());
     261
     262//        fDimFiles.setData(fFiles.size());
     263//        fDimFiles.update();
     264
     265        return reinterpret_cast<FileHandle_t>(file);
     266    }
     267
     268    int runWrite(FileHandle_t handler, EVENT *e, size_t)
     269    {
     270        DataFileImp *file = reinterpret_cast<DataFileImp*>(handler);
     271
     272        cout << "WRITE_EVENT " << file->GetRunId() << endl;
    165273
    166274        cout << " Evt=" << e->EventNum << endl;
     
    170278        cout << " tim=" << e->PCTime << endl;
    171279
     280        if (!file->Write())
     281            return -1;
     282
     283        // ===> SignalEvtWritten(runid);
     284        // Send num events written of newest file
     285
     286        /* close run runId (all all runs if runId=0) */
     287        /* return: 0=close scheduled / >0 already closed / <0 does not exist */
     288        //CloseRunFile(file->GetRunId(), time(NULL)+2) ;
     289
    172290        return 0;
    173291    }
    174292
    175     int runClose(int, RUN_TAIL *, size_t)
    176     {
    177         cout << "CLOSE_RUN" << endl;
    178         return 0;
     293    int runClose(FileHandle_t handler, RUN_TAIL *, size_t)
     294    {
     295        DataFileImp *file = reinterpret_cast<DataFileImp*>(handler);
     296
     297        cout << "CLOSE_RUN " << file->GetRunId() << endl;
     298
     299        fFiles.erase(find(fFiles.begin(), fFiles.end(), file));
     300
     301        Update(fDimFiles, fFiles.size());
     302
     303        //fDimFiles.setData(fFiles.size());
     304        //fDimFiles.update();
     305
     306        const bool rc = file->Close();
     307        if (!rc)
     308        {
     309            // Error message
     310        }
     311
     312        delete file;
     313
     314        // ==> SignalRunClose(runid);
     315        // Send new num open files
     316        // Send empty file-name if no file is open
     317
     318        return rc ? 0 : -1;
    179319    }
    180320};
     
    185325extern "C"
    186326{
    187     int runOpen(uint32_t irun, RUN_HEAD *runhd, size_t len)
     327    FileHandle_t runOpen(uint32_t irun, RUN_HEAD *runhd, size_t len)
    188328    {
    189329        return EventBuilderWrapper::This->runOpen(irun, runhd, len);
    190330    }
    191331
    192     int runWrite(int fileId, EVENT *event, size_t len)
     332    int runWrite(FileHandle_t fileId, EVENT *event, size_t len)
    193333    {
    194334        return EventBuilderWrapper::This->runWrite(fileId, event, len);
    195335    }
    196336
    197     int runClose(int fileId, RUN_TAIL *runth, size_t len)
     337    int runClose(FileHandle_t fileId, RUN_TAIL *runth, size_t len)
    198338    {
    199339        return EventBuilderWrapper::This->runClose(fileId, runth, len);
    200340    }
    201341
     342    void factOut(int severity, int err, char *message)
     343    {
     344        //replace(message, message+strlen(message), '\n', ' ');
     345
     346        // FIXME: Make the output to the console stream thread-safe
     347        ostringstream str;
     348        str << "EventBuilder(";
     349        if (err<0)
     350            str << "---";
     351        else
     352            str << err;
     353        str << "): " << message;
     354        EventBuilderWrapper::This->Update(str, severity);
     355    }
     356
     357    void factStat(int severity, int err, char* message )
     358    {
     359        static string last;
     360        if (message==last)
     361            return;
     362
     363        if (err!=-1)
     364            factOut(severity, err, message);
     365        else
     366        {
     367            ostringstream str("Status: ");
     368            str << message;
     369            EventBuilderWrapper::This->Update(str, severity);
     370        }
     371
     372        last = message;
     373    }
     374
     375    /*
    202376    void message(int severity, const char *msg)
    203377    {
    204378        EventBuilderWrapper::This->Update(msg, severity);
    205     }
     379    }*/
    206380}
    207381
Note: See TracChangeset for help on using the changeset viewer.