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

            Line data    Source code
       1              : /*******************************************************************\
       2              : 
       3              :   Name:         tmfe_example_everything.cxx
       4              :   Created by:   K.Olchanski
       5              : 
       6              :   Contents:     Example Front end to demonstrate all functions of TMFE class
       7              : 
       8              : \********************************************************************/
       9              : 
      10              : #undef NDEBUG // midas required assert() to be always enabled
      11              : 
      12              : #include <stdio.h>
      13              : #include <math.h> // M_PI
      14              : 
      15              : #include "tmfe.h"
      16              : 
      17              : class EqEverything :
      18              :    public TMFeEquipment
      19              : {
      20              : public:
      21            0 :    EqEverything(const char* eqname, const char* eqfilename) // ctor
      22            0 :       : TMFeEquipment(eqname, eqfilename)
      23              :    {
      24            0 :       printf("EqEverything::ctor!\n");
      25              : 
      26              :       // configure the equipment here:
      27              :       
      28              :       //fEqConfReadConfigFromOdb = false;
      29            0 :       fEqConfEventID = 1;
      30            0 :       fEqConfPeriodMilliSec = 1000;
      31            0 :       fEqConfLogHistory = 1;
      32            0 :       fEqConfWriteEventsToOdb = true;
      33            0 :       fEqConfEnablePoll = true; // enable polled equipment
      34              :       //fEqConfPollSleepSec = 0; // to create a "100% CPU busy" polling loop, set poll sleep time to zero 
      35            0 :    }
      36              : 
      37            0 :    ~EqEverything() // dtor
      38            0 :    {
      39            0 :       printf("EqEverything::dtor!\n");
      40            0 :    }
      41              : 
      42            0 :    void HandleUsage()
      43              :    {
      44            0 :       printf("EqEverything::HandleUsage!\n");
      45            0 :    }
      46              : 
      47            0 :    TMFeResult HandleInit(const std::vector<std::string>& args)
      48              :    {
      49            0 :       printf("EqEverything::HandleInit!\n");
      50            0 :       fMfe->RegisterTransitionStartAbort();
      51            0 :       fEqConfReadOnlyWhenRunning = false; // overwrite ODB Common RO_RUNNING to false
      52            0 :       fEqConfWriteEventsToOdb = true; // overwrite ODB Common RO_ODB to true
      53            0 :       EqSetStatus("Started...", "white");
      54              :       //EqStartPollThread();
      55            0 :       return TMFeOk();
      56              :    }
      57              : 
      58            0 :    TMFeResult HandleRpc(const char* cmd, const char* args, std::string& response)
      59              :    {
      60            0 :       fMfe->Msg(MINFO, "HandleRpc", "RPC cmd [%s], args [%s]", cmd, args);
      61              : 
      62              :       // RPC handler
      63              :       
      64              :       char tmp[256];
      65            0 :       time_t now = time(NULL);
      66            0 :       snprintf(tmp, sizeof(tmp), "{ \"current_time\" : [ %d, \"%s\"] }", (int)now, ctime(&now));
      67              :       
      68            0 :       response = tmp;
      69              : 
      70            0 :       return TMFeOk();
      71              :    }
      72              : 
      73            0 :    TMFeResult HandleBeginRun(int run_number)
      74              :    {
      75            0 :       fMfe->Msg(MINFO, "HandleBeginRun", "Begin run %d!", run_number);
      76            0 :       EqSetStatus("Running", "#00FF00");
      77            0 :       return TMFeOk();
      78              :    }
      79              : 
      80            0 :    TMFeResult HandleEndRun(int run_number)
      81              :    {
      82            0 :       fMfe->Msg(MINFO, "HandleEndRun", "End run %d!", run_number);
      83            0 :       EqSetStatus("Stopped", "#FFFFFF");
      84            0 :       return TMFeOk();
      85              :    }
      86              : 
      87            0 :    TMFeResult HandlePauseRun(int run_number)
      88              :    {
      89            0 :       fMfe->Msg(MINFO, "HandlePauseRun", "Pause run %d!", run_number);
      90            0 :       EqSetStatus("Paused", "#FFFF00");
      91            0 :       return TMFeOk();
      92              :    }
      93              : 
      94            0 :    TMFeResult HandleResumeRun(int run_number)
      95              :    {
      96            0 :       fMfe->Msg(MINFO, "HandleResumeRun", "Resume run %d!", run_number);
      97            0 :       EqSetStatus("Running", "#00FF00");
      98            0 :       return TMFeOk();
      99              :    }
     100              : 
     101            0 :    TMFeResult HandleStartAbortRun(int run_number)
     102              :    {
     103            0 :       fMfe->Msg(MINFO, "HandleStartAbortRun", "Begin run %d aborted!", run_number);
     104            0 :       EqSetStatus("Stopped", "#FFFFFF");
     105            0 :       return TMFeOk();
     106              :    }
     107              : 
     108            0 :    void SendData(double dvalue)
     109              :    {
     110              :       char buf[1024];
     111            0 :       ComposeEvent(buf, sizeof(buf));
     112            0 :       BkInit(buf, sizeof(buf));
     113              :          
     114            0 :       double* ptr = (double*)BkOpen(buf, "data", TID_DOUBLE);
     115            0 :       *ptr++ = dvalue;
     116            0 :       BkClose(buf, ptr);
     117              : 
     118            0 :       EqSendEvent(buf);
     119            0 :    }
     120              : 
     121            0 :    void HandlePeriodic()
     122              :    {
     123            0 :       printf("EqEverything::HandlePeriodic!\n");
     124            0 :       double t = TMFE::GetTime();
     125            0 :       double data = 100.0*sin(0*M_PI/2.0+M_PI*t/40);
     126            0 :       SendData(data);
     127              :       char status_buf[256];
     128            0 :       snprintf(status_buf, sizeof(status_buf), "value %.1f", data);
     129            0 :       EqSetStatus(status_buf, "#00FF00");
     130            0 :    }
     131              : 
     132            0 :    bool HandlePoll()
     133              :    {
     134              :       //printf("EqEverything::HandlePoll!\n");
     135              : 
     136            0 :       if (!fMfe->fStateRunning) // only poll when running
     137            0 :          return false;
     138              : 
     139            0 :       double r = drand48();
     140            0 :       if (r > 0.999) {
     141              :          // return successful poll rarely
     142            0 :          printf("EqEverything::HandlePoll!\n");
     143            0 :          return true;
     144              :       }
     145              : 
     146            0 :       return false;
     147              :    }
     148              : 
     149            0 :    void HandlePollRead()
     150              :    {
     151            0 :       printf("EqEverything::HandlePollRead!\n");
     152              : 
     153              :          char buf[1024];
     154              : 
     155            0 :          ComposeEvent(buf, sizeof(buf));
     156            0 :          BkInit(buf, sizeof(buf));
     157              :          
     158            0 :          uint32_t* ptr = (uint32_t*)BkOpen(buf, "poll", TID_UINT32);
     159            0 :          for (int i=0; i<16; i++) {
     160            0 :             *ptr++ = lrand48();
     161              :          }
     162            0 :          BkClose(buf, ptr);
     163              :          
     164            0 :          EqSendEvent(buf, false); // do not write polled data to ODB and history
     165            0 :    }
     166              : };
     167              : 
     168              : // example frontend
     169              : 
     170              : class FeEverything: public TMFrontend
     171              : {
     172              : public:
     173            0 :    FeEverything() // ctor
     174            0 :    {
     175            0 :       printf("FeEverything::ctor!\n");
     176            0 :       FeSetName("tmfe_example_everything");
     177            0 :       FeAddEquipment(new EqEverything("tmfe_example_everything", __FILE__));
     178            0 :    }
     179              : 
     180            0 :    void HandleUsage()
     181              :    {
     182            0 :       printf("FeEverything::HandleUsage!\n");
     183            0 :    };
     184              :    
     185            0 :    TMFeResult HandleArguments(const std::vector<std::string>& args)
     186              :    {
     187            0 :       printf("FeEverything::HandleArguments!\n");
     188            0 :       return TMFeOk();
     189              :    };
     190              :    
     191            0 :    TMFeResult HandleFrontendInit(const std::vector<std::string>& args)
     192              :    {
     193            0 :       printf("FeEverything::HandleFrontendInit!\n");
     194            0 :       return TMFeOk();
     195              :    };
     196              :    
     197            0 :    TMFeResult HandleFrontendReady(const std::vector<std::string>& args)
     198              :    {
     199            0 :       printf("FeEverything::HandleFrontendReady!\n");
     200              :       //FeStartPeriodicThread();
     201              :       //fMfe->StartRpcThread();
     202            0 :       return TMFeOk();
     203              :    };
     204              :    
     205            0 :    void HandleFrontendExit()
     206              :    {
     207            0 :       printf("FeEverything::HandleFrontendExit!\n");
     208            0 :    };
     209              : };
     210              : 
     211              : // boilerplate main function
     212              : 
     213            0 : int main(int argc, char* argv[])
     214              : {
     215            0 :    FeEverything fe_everything;
     216            0 :    return fe_everything.FeMain(argc, argv);
     217            0 : }
     218              : 
     219              : /* emacs
     220              :  * Local Variables:
     221              :  * tab-width: 8
     222              :  * c-basic-offset: 3
     223              :  * indent-tabs-mode: nil
     224              :  * End:
     225              :  */
        

Generated by: LCOV version 2.0-1