LCOV - code coverage report
Current view: top level - progs - tmfe_example_multithread.cxx (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 63 0
Test Date: 2025-11-11 10:26:08 Functions: 0.0 % 9 0

            Line data    Source code
       1              : //
       2              : // tmfe_example_multithread.cxx
       3              : //
       4              : // Example tmfe multithreaded c++ frontend
       5              : //
       6              : 
       7              : #include <stdio.h>
       8              : #include <signal.h> // SIGPIPE
       9              : #include <assert.h> // assert()
      10              : #include <stdlib.h> // malloc()
      11              : #include <unistd.h> // sleep()
      12              : #include <math.h> // M_PI
      13              : 
      14              : #include "midas.h"
      15              : #include "tmfe.h"
      16              : 
      17              : class Myfe :
      18              :    public TMFeEquipment
      19              : {
      20              : public:
      21            0 :    Myfe(const char* eqname, const char* eqfilename) // ctor
      22            0 :       : TMFeEquipment(eqname, eqfilename)
      23              :    {
      24            0 :    }
      25              : 
      26            0 :    ~Myfe() // dtor
      27            0 :    {
      28            0 :    }
      29              : 
      30            0 :    void SendData(double dvalue)
      31              :    {
      32              :       char buf[1024];
      33            0 :       ComposeEvent(buf, sizeof(buf));
      34            0 :       BkInit(buf, sizeof(buf));
      35              :          
      36            0 :       double* ptr = (double*)BkOpen(buf, "test", TID_DOUBLE);
      37            0 :       *ptr++ = dvalue;
      38            0 :       BkClose(buf, ptr);
      39              : 
      40            0 :       EqSendEvent(buf);
      41            0 :    }
      42              : 
      43            0 :    TMFeResult HandleRpc(const char* cmd, const char* args, std::string& response)
      44              :    {
      45            0 :       fMfe->Msg(MINFO, "HandleRpc", "Thread %s, RPC cmd [%s], args [%s]", TMFE::GetThreadId().c_str(), cmd, args);
      46            0 :       return TMFeOk();
      47              :    }
      48              : 
      49            0 :    TMFeResult HandleBeginRun(int run_number)
      50              :    {
      51            0 :       fMfe->Msg(MINFO, "HandleBeginRun", "Thread %s, Begin run %d!", TMFE::GetThreadId().c_str(), run_number);
      52            0 :       EqSetStatus("Running", "#00FF00");
      53            0 :       return TMFeOk();
      54              :    }
      55              : 
      56            0 :    TMFeResult HandleEndRun(int run_number)
      57              :    {
      58            0 :       fMfe->Msg(MINFO, "HandleEndRun", "Thread %s, End run %d!", TMFE::GetThreadId().c_str(), run_number);
      59            0 :       EqSetStatus("Stopped", "#00FF00");
      60            0 :       return TMFeOk();
      61              :    }
      62              : 
      63              :    //TMFeResult HandleStartAbortRun(int run_number)
      64              :    //{
      65              :    //   fMfe->Msg(MINFO, "HandleStartAbortRun", "Begin run %d aborted!", run_number);
      66              :    //   EqSetStatus("Stopped", "#00FF00");
      67              :    //   return TMFeOk();
      68              :    //}
      69              : 
      70            0 :    void HandlePeriodic()
      71              :    {
      72            0 :       printf("Thread %s, periodic!\n", TMFE::GetThreadId().c_str());
      73            0 :       double t = TMFE::GetTime();
      74            0 :       double data = 100.0*sin(M_PI/2.0+M_PI*t/60);
      75            0 :       SendData(data);
      76            0 :       fOdbEqVariables->WD("data", data);
      77              :       char status_buf[256];
      78            0 :       sprintf(status_buf, "value %.1f", data);
      79            0 :       EqSetStatus(status_buf, "#00FF00");
      80            0 :    }
      81              : };
      82              : 
      83            0 : static void usage()
      84              : {
      85            0 :    fprintf(stderr, "Usage: tmfe_example_mt ...\n");
      86            0 :    exit(1);
      87              : }
      88              : 
      89            0 : int main(int argc, char* argv[])
      90              : {
      91            0 :    setbuf(stdout, NULL);
      92            0 :    setbuf(stderr, NULL);
      93              : 
      94            0 :    signal(SIGPIPE, SIG_IGN);
      95              : 
      96            0 :    std::vector<std::string> eq_args;
      97              : 
      98              :    //std::string name = "";
      99              :    //
     100              :    //if (argc == 2) {
     101              :    //   name = argv[1];
     102              :    //} else {
     103              :    //   usage(); // DOES NOT RETURN
     104              :    //}
     105              : 
     106            0 :    TMFE* mfe = TMFE::Instance();
     107              : 
     108            0 :    TMFeResult result = mfe->Connect("tmfe_example_mt", __FILE__);
     109            0 :    if (result.error_flag) {
     110            0 :       fprintf(stderr, "Cannot connect to MIDAS, error \"%s\", bye.\n", result.error_message.c_str());
     111            0 :       return 1;
     112              :    }
     113              : 
     114              :    //mfe->SetWatchdogSec(0);
     115              : 
     116            0 :    TMFeEquipment* eq = new Myfe("tmfe_example_mt", __FILE__);
     117            0 :    eq->fEqConfEventID = 1;
     118            0 :    eq->fEqConfLogHistory = 1;
     119            0 :    eq->fEqConfPeriodMilliSec = 1000; // milliseconds
     120            0 :    eq->fEqConfBuffer = "SYSTEM";
     121              : 
     122            0 :    eq->EqInit(eq_args);
     123            0 :    eq->EqSetStatus("Starting...", "white");
     124              : 
     125            0 :    mfe->AddRpcHandler(eq);
     126              : 
     127              :    //mfe->SetTransitionSequenceStart(910);
     128              :    //mfe->SetTransitionSequenceStop(90);
     129              : 
     130              :    //mfe->DeregisterTransitionPause();
     131              :    //mfe->DeregisterTransitionResume();
     132              : 
     133              :    //mfe->RegisterTransitionStartAbort();
     134              : 
     135            0 :    printf("Main thread is %s\n", TMFE::GetThreadId().c_str());
     136              : 
     137            0 :    mfe->StartRpcThread();
     138              :    //mfe->StartPeriodicThread();
     139              : 
     140            0 :    eq->EqSetStatus("Started...", "white");
     141              : 
     142            0 :    while (!mfe->fShutdownRequested) {
     143            0 :       ::sleep(1);
     144              :    }
     145              : 
     146            0 :    mfe->Disconnect();
     147              : 
     148            0 :    return 0;
     149            0 : }
     150              : 
     151              : /* emacs
     152              :  * Local Variables:
     153              :  * tab-width: 8
     154              :  * c-basic-offset: 3
     155              :  * indent-tabs-mode: nil
     156              :  * End:
     157              :  */
        

Generated by: LCOV version 2.0-1