Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-02 08:21:07

0001 
0002 
0003 #include <iostream>
0004 #include <iomanip>
0005 #include <getopt.h>
0006 
0007 #include <sstream>
0008 #include "parseargument.h"
0009 #include "rcdaq_rpc.h"
0010 #include "rcdaq_actions.h"
0011 
0012 using namespace std;
0013 
0014 CLIENT *clnt;
0015 
0016 //result *ra;
0017 int  verbose_flag = 0;
0018 
0019 void
0020 rcdaq_client_Init(const char *host, const int servernumber)
0021 {
0022 
0023 
0024   clnt = clnt_create (host, RCDAQ+servernumber, RCDAQ_VERS, "tcp");
0025   if (clnt == NULL) {
0026     clnt_pcreateerror (host);
0027     exit (1);
0028   }
0029   
0030   struct timeval tv;
0031   tv.tv_sec = 1000;
0032   tv.tv_usec = 0;
0033   
0034   clnt_control(clnt,CLSET_TIMEOUT , (char *) &tv );
0035   
0036   
0037   
0038 }
0039 
0040 void showHelp()
0041 {
0042   std::cout << "   help                                 show this help text"  << std::endl; 
0043   std::cout << "   daq_status [-s] [-l]                 display status [short] [long]" << std::endl;
0044   std::cout << "   daq_open                             enable logging" << std::endl;
0045   std::cout << "   daq_set_server hostname [port]       choose logging to a SFS server, or \"None\" to choose local file" << std::endl;
0046   std::cout << "   daq_begin [run-number]               start taking data for run-number, or auto-increment" << std::endl;
0047   std::cout << "   daq_end                              end the run " << std::endl;
0048   std::cout << "   daq_close                            disable logging" << std::endl;
0049   std::cout << "   daq_setfilerule file-rule            set the file rule default rcdaq-%08d-%04d.evt" << std::endl;
0050   std::cout << std::endl; 
0051   std::cout << "   daq_list_readlist                    display the current readout list" << std::endl;
0052   std::cout << "   daq_clear_readlist                   clear the current readout list " << std::endl;
0053   std::cout << std::endl; 
0054   std::cout << "   daq_define_runtype type file-rule    define a run type, such as \"calibration\"" << std::endl;
0055   std::cout << "   daq_set_runtype type                 activate a predefined run type" << std::endl;
0056   std::cout << "   daq_get_runtype [-l]                 list the active runtype (if any)" << std::endl;
0057   std::cout << "   daq_list_runtypes [-s]               list defined run types" << std::endl;
0058   std::cout << "   daq_get_lastfilename                 return the last file name written, if any" << std::endl;
0059   std::cout << "   daq_get_last_event_number            return the last event number from the previous run" << std::endl;
0060   std::cout << std::endl; 
0061 
0062   std::cout << "   daq_set_maxevents nevt               set automatic end at so many events" << std::endl;
0063   std::cout << "   daq_set_maxvolume n_MB               set automatic end at n_MB MegaByte" << std::endl;
0064   std::cout << "   daq_set_rolloverlimit n_GB           set file rollover limit at n_BG GigaByte" << std::endl;
0065   std::cout << "   daq_set_eventformat n                dynamically switch from standard (0) to legacy header format (1)" << std::endl;
0066   std::cout << "   daq_set_compression n                enable (1) or disable(0) the file compression" << std::endl;
0067   std::cout << "   daq_set_md5enable n                  enable (1) or disable(0) the md5 calculation (default on)" << std::endl;
0068   std::cout << "   daq_allow_md5turnoff n               opt in to allow (1) the md5 calculation to be turned off (default no)" << std::endl;
0069   std::cout << "   daq_set_nr_threads n                 adjust the number of compression threads" << std::endl;
0070   // maybe later std::cout << "   daq_get_nr_threads                   get the number of compression threads" << std::endl;
0071 
0072   std::cout << std::endl; 
0073 
0074   std::cout << "   load  shared_library_name            load a \"plugin\" shared library" << std::endl;
0075   std::cout << "   create_device [device-specific parameters] " << std::endl;
0076   std::cout << std::endl; 
0077 
0078   std::cout << "   daq_setname <string>                 define an identifying string for this RCDAQ instance" << std::endl;
0079   std::cout << "   daq_setrunnumberfile file            define a file to maintain the current run number, \"None\" to reset" << std::endl;
0080   std::cout << "   daq_setrunnumberApp file             define an App that dispenses run numbers, \"None\" to reset" << std::endl;
0081   std::cout << "   daq_set_maxbuffersize n_KB           adjust the size of buffers written to n KB" << std::endl;
0082   std::cout << "   daq_set_adaptivebuffering seconds    enable adaptive buffering at n seconds (0 = off)" << std::endl;
0083   std::cout << std::endl;
0084 
0085   std::cout << "   daq_webcontrol <port number>         restart web controls on a new port (default 8080)" << std::endl;
0086   std::cout << std::endl; 
0087 #ifdef HAVE_MOSQUITTO_H
0088   std::cout << "   daq_set_mqtt_host <host> [port]      set up the MQTT host/port for the DB interaction, or \"none\" to remove" << std::endl;
0089   std::cout << "   daq_get_mqtt_host <host> [port]      retrieve the MQTT host/port for the DB interaction" << std::endl;
0090 #endif
0091   //  std::cout << "   daq_open_sqlstream <string>          open a stream to issue SQL commands" << std::endl;
0092   //  std::cout << "   daq_close_sqlstream                  close a SQL stream" << std::endl;
0093   std::cout << std::endl; 
0094 
0095   std::cout << "   daq_set_runcontrolmode n             switch to Run Control Mode (1=on, 0=off)" << std::endl;
0096   std::cout << "   daq_get_runcontrolmode               get the current Run Control Mode setting" << std::endl;
0097   std::cout << std::endl; 
0098   std::cout << "   daq_set_uservalue n val              set the user value n (0..7) to val" << std::endl;
0099   std::cout << "   daq_get_uservalue n                  get the user value n (0..7)" << std::endl;
0100   std::cout << std::endl; 
0101 
0102   std::cout << "   elog elog-server port                specify coordinates for an Elog server" << std::endl;
0103   std::cout << std::endl; 
0104   std::cout << "   daq_shutdown                         terminate the rcdaq backend" << std::endl;
0105   exit(0);
0106 }
0107 
0108 
0109 
0110 int handle_device( int argc, char **argv, const int optind)
0111 {
0112 
0113 
0114   struct shortResult  *r;
0115   struct deviceblock db;
0116 
0117 
0118   // this construct is here because RPC doesn't support
0119   // 2-dim arrays (at least AFAIK). It saves a lot of if's 
0120   // and else's:
0121   char **arglist[NSTRINGPAR];
0122 
0123 
0124   arglist[0] = &db.argv0;
0125   arglist[1] = &db.argv1;
0126   arglist[2] = &db.argv2;
0127   arglist[3] = &db.argv3;
0128   arglist[4] = &db.argv4;
0129   arglist[5] = &db.argv5;
0130   arglist[6] = &db.argv6;
0131   arglist[7] = &db.argv7;
0132   arglist[8] = &db.argv8;
0133   arglist[9] = &db.argv9;
0134   arglist[10] = &db.argv10;
0135   arglist[11] = &db.argv11;
0136   arglist[12] = &db.argv12;
0137   arglist[13] = &db.argv13;
0138 
0139   char empty[2] = {' ',0};
0140 
0141   int i;
0142   for ( i = 0; i < NSTRINGPAR; i++)
0143     {
0144       *arglist[i] = empty;
0145     }
0146   
0147   db.npar=0;
0148 
0149   for ( i = optind+1; i < argc; i++)
0150     {
0151 
0152       // this is only the case here - the event type
0153       // if it's "B, D, S, or E", we replace with the begin- data- scaler- endrun event
0154       if ( i == optind + 2)  
0155     {
0156       if ( *argv[i] == 'B' || *argv[i] == 'b')
0157         {
0158         argv[i] = (char * ) "9"; // begin-run; 
0159         }
0160       else if ( *argv[i] == 'D' ||  *argv[i] == 'd')
0161         {
0162           argv[i] = (char *) "1"; // data event
0163         }   
0164       else if ( *argv[i] == 'E' || *argv[i] == 'e')
0165         {
0166           argv[i] = (char *) "12";   // end-run
0167         }
0168       else if ( *argv[i] == 'S' || *argv[i] == 's')
0169         {
0170           argv[i] = (char *) "14";  // scaler event 
0171         }
0172     }
0173       
0174       *arglist[db.npar++] = argv[i];
0175       
0176       if ( db.npar >= NSTRINGPAR) 
0177     {
0178       cout << "Too many parameters to handle for me" << endl;
0179       break;
0180     }
0181     }
0182       
0183   r = r_create_device_1(&db, clnt);
0184   if (r == (shortResult *) NULL) 
0185     {
0186       clnt_perror (clnt, "call failed");
0187     }
0188   if ( r->content) std::cout <<  r->str << std::flush;
0189   
0190   return r->status;
0191 }
0192 
0193 
0194 int command_execute( int argc, char **argv)
0195 {
0196   struct shortResult  *r;
0197   struct actionblock  ab;
0198 
0199   if ( argc <= 1 ) showHelp();
0200   
0201   char tempSelection[1024];
0202   
0203   char command[512];
0204   
0205   // the log and short flags are for qualifying the 
0206   // status output
0207   int long_flag = 1;
0208   int immediate_flag = 0;  // only used for daq_end so far
0209 
0210   int c;
0211   
0212   optind = 0; // tell getopt to start over
0213   int servernumber=0;
0214 
0215   while ((c = getopt(argc, argv, "vlsij")) != EOF)
0216     {
0217       switch (c) 
0218     {
0219 
0220     case 'v': // set the verbose flag
0221       verbose_flag++;
0222       break;
0223 
0224     case 'l': // set the long flag; we can step up the verbosity with multiple -l's 
0225       long_flag++;
0226       break;
0227 
0228     case 's': // set the short flag (0) (note that long_flag is pre-set to 1 for "normal") 
0229       long_flag=0;
0230       break;
0231 
0232     case 'i': // set the "immediate" flag; onoy used in daq_end to request an asynchronous end
0233       immediate_flag=1;
0234       break;
0235 
0236     case 'j': // special case for daq_status to give json output
0237       long_flag=100;
0238       break;
0239 
0240     }
0241     }
0242 
0243   
0244   std::string rcdaqhost;
0245   std::string host = "localhost";
0246     
0247   if ( getenv("RCDAQHOST")  )
0248     {
0249       rcdaqhost = getenv("RCDAQHOST");
0250       istringstream ss(rcdaqhost);
0251       string token;
0252       if ( std::getline(ss, token, ':'))
0253     {
0254       if ( token.size())
0255         {
0256           host = token;
0257         }
0258     }
0259       if ( std::getline(ss, token, ':') )
0260     {
0261       if ( token.size())
0262         {
0263           servernumber=std::stoi(token);
0264         }
0265     }
0266     }
0267 
0268   
0269   rcdaq_client_Init (host.c_str(),servernumber);
0270   
0271   ab.action = 0;
0272   ab.value  = 0;
0273   ab.spare = 0;
0274   
0275   int i;
0276   for ( i = 0; i< NIPAR; i++)
0277     {
0278       ab.ipar[i] = 0;
0279     }
0280 
0281   char space[] = " ";
0282   ab.spar = space;
0283   ab.spar2 = space;
0284 
0285   int convertstatus;
0286 
0287   strcpy(command, argv[optind]);
0288 
0289   if ( strcasecmp(command,"help") == 0 ) 
0290     {
0291       showHelp();
0292     }
0293 
0294   else if ( strcasecmp(command,"daq_sync") == 0)
0295     {
0296 
0297       ab.action = DAQ_SYNC;
0298 
0299       r = r_action_1(&ab, clnt);
0300       if (r == (shortResult *) NULL) 
0301     {
0302       clnt_perror (clnt, "call failed");
0303     }
0304       if (r->content) std::cout <<  r->str << std::flush;
0305  
0306     }
0307 
0308   else if ( strcasecmp(command,"daq_begin") == 0)
0309     {
0310 
0311       if (immediate_flag)
0312     {
0313       ab.action = DAQ_BEGIN_IMMEDIATE;
0314     }
0315       else
0316     {
0317       ab.action = DAQ_BEGIN;
0318 
0319     }
0320 
0321       if ( argc == optind + 2)
0322     {
0323       ab.ipar[0] = get_value(argv[optind + 1]);
0324     }
0325       else
0326     {
0327       ab.ipar[0] = 0;
0328     }
0329       r = r_action_1 (&ab, clnt);
0330       if (r == (shortResult *) NULL) 
0331     {
0332       clnt_perror (clnt, "call failed");
0333     }
0334       if (r->content) std::cout <<  r->str << std::flush;
0335  
0336     }
0337   
0338 
0339   else if ( strcasecmp(command,"daq_end") == 0)
0340     {
0341 
0342       if (immediate_flag)
0343     {
0344       ab.action = DAQ_END_IMMEDIATE;
0345     }
0346       else
0347     {
0348       ab.action = DAQ_END;
0349     }
0350       
0351       r = r_action_1(&ab, clnt);
0352       if (r == (shortResult *) NULL) 
0353     {
0354       clnt_perror (clnt, "call failed");
0355     }
0356       if (r->content) std::cout <<  r->str << std::flush;
0357  
0358     }
0359   
0360   else if ( strcasecmp(command,"daq_setfilerule") == 0)
0361     {
0362       if ( argc != optind + 2) return -1;
0363 
0364       ab.action = DAQ_SETFILERULE;
0365       ab.spar = argv[optind + 1];
0366       r = r_action_1(&ab, clnt);
0367       if (r == (shortResult *) NULL) 
0368     {
0369       clnt_perror (clnt, "call failed");
0370     }
0371       if (r->content) std::cout <<  r->str << std::flush;
0372  
0373     }
0374   
0375   else if ( strcasecmp(command,"daq_setrunnumberfile") == 0)
0376     {
0377       if ( argc != optind + 2) return -1;
0378 
0379       ab.action = DAQ_RUNNUMBERFILE;
0380       ab.spar = argv[optind + 1];
0381       
0382       // if we set "none", unset the app
0383       if ( strcasecmp(argv[optind + 1],"None") == 0) ab.ipar[0] = 1;
0384 
0385       r = r_action_1(&ab, clnt);
0386       if (r == (shortResult *) NULL) 
0387     {
0388       clnt_perror (clnt, "call failed");
0389     }
0390       if (r->content) std::cout <<  r->str << std::flush;
0391  
0392     }
0393   
0394   else if ( strcasecmp(command,"daq_setrunnumberApp") == 0)
0395     {
0396       if ( argc != optind + 2) return -1;
0397 
0398       ab.action = DAQ_SETRUNNUMBERAPP;
0399       ab.spar = argv[optind + 1];
0400 
0401       // if we set "none", unset the app
0402       if ( strcasecmp(argv[optind + 1],"None") == 0) ab.ipar[0] = 1;
0403 
0404       r = r_action_1(&ab, clnt);
0405       if (r == (shortResult *) NULL) 
0406     {
0407       clnt_perror (clnt, "call failed");
0408     }
0409       if (r->content) std::cout <<  r->str << std::flush;
0410  
0411     }
0412   
0413   // the 2nd half is not to break scripts that may use the older name 
0414   else if ( strcasecmp(command,"daq_set_runtype") == 0 || strcasecmp(command,"daq_setruntype") == 0)
0415     {
0416       if ( argc != optind + 2) return -1;
0417 
0418       ab.action = DAQ_SETRUNTYPE;
0419       ab.spar = argv[optind + 1];
0420       r = r_action_1(&ab, clnt);
0421       if (r == (shortResult *) NULL) 
0422     {
0423       clnt_perror (clnt, "call failed");
0424     }
0425       if (r->content) std::cout <<  r->str << std::flush;
0426  
0427     }
0428 
0429   else if ( strcasecmp(command,"daq_get_runtype") == 0)
0430     {
0431       
0432       ab.action = DAQ_GETRUNTYPE;
0433       ab.ipar[0] = long_flag; 
0434 
0435       r = r_action_1(&ab, clnt);
0436       if (r == (shortResult *) NULL) 
0437     {
0438       clnt_perror (clnt, "call failed");
0439     }
0440       if (r->content) std::cout <<  r->str << std::flush;
0441       
0442     }
0443   
0444   else if ( strcasecmp(command,"daq_define_runtype") == 0)
0445     {
0446       if ( argc != optind + 3) return -1;
0447 
0448       ab.action = DAQ_DEFINERUNTYPE;
0449       ab.spar = argv[optind + 1];
0450       ab.spar2 = argv[optind + 2];
0451       r = r_action_1(&ab, clnt);
0452       if (r == (shortResult *) NULL) 
0453     {
0454       clnt_perror (clnt, "call failed");
0455     }
0456       if (r->content) std::cout <<  r->str << std::flush;
0457  
0458     }
0459 
0460   else if ( strcasecmp(command,"daq_list_runtypes") == 0)
0461     {
0462       
0463       ab.action = DAQ_LISTRUNTYPES;
0464       ab.ipar[0] = long_flag; 
0465       
0466       r = r_action_1(&ab, clnt);
0467       if (r == (shortResult *) NULL) 
0468     {
0469       clnt_perror (clnt, "call failed");
0470     }
0471       if (r->content) std::cout <<  r->str << std::flush;
0472       
0473     }
0474   
0475   else if ( strcasecmp(command,"daq_setname") == 0)
0476     {
0477       if ( argc != optind + 2) return -1;
0478 
0479       ab.action = DAQ_SETNAME;
0480       ab.spar = argv[optind + 1];
0481       r = r_action_1(&ab, clnt);
0482       if (r == (shortResult *) NULL) 
0483     {
0484       clnt_perror (clnt, "call failed");
0485     }
0486       if (r->content) std::cout <<  r->str << std::flush;
0487  
0488     }
0489 
0490   else if ( strcasecmp(command,"daq_getname") == 0)
0491     {
0492       ab.action = DAQ_GETNAME;
0493       r = r_action_1(&ab, clnt);
0494       if (r == (shortResult *) NULL) 
0495     {
0496       clnt_perror (clnt, "call failed");
0497     }
0498       if (r->content) std::cout <<  r->str << std::flush;
0499  
0500     }
0501 
0502   
0503   else if ( strcasecmp(command,"daq_open") == 0)
0504     {
0505 
0506       ab.action = DAQ_OPEN;
0507       r = r_action_1(&ab, clnt);
0508       if (r == (shortResult *) NULL) 
0509     {
0510       clnt_perror (clnt, "call failed");
0511     }
0512       if (r->content) std::cout <<  r->str << std::flush;
0513  
0514     }
0515 
0516   else if ( strcasecmp(command,"daq_set_server") == 0)
0517     {
0518       
0519       if ( argc <  optind + 2) return -1;
0520 
0521       ab.action = DAQ_SET_SERVER;
0522       ab.spar = argv[optind + 1];
0523       if ( argc == optind + 3)
0524     {
0525       ab.ipar[0] = get_value(argv[optind + 2]);
0526     }
0527       else
0528     {
0529       ab.ipar[0] = 0;
0530     }
0531       r = r_action_1(&ab, clnt);
0532       if (r == (shortResult *) NULL) 
0533     {
0534       clnt_perror (clnt, "call failed");
0535     }
0536       if (r->content) std::cout <<  r->str << std::flush;
0537     }
0538   
0539   else if ( strcasecmp(command,"daq_close") == 0)
0540     {
0541 
0542       ab.action = DAQ_CLOSE;
0543 
0544       r = r_action_1(&ab, clnt);
0545       if (r == (shortResult *) NULL) 
0546     {
0547       clnt_perror (clnt, "call failed");
0548     }
0549       if (r->content) std::cout <<  r->str << std::flush;
0550  
0551     }
0552 
0553 
0554   else if ( strcasecmp(command,"daq_set_compression") == 0)
0555     {
0556       if ( argc < optind + 2) return -1;
0557 
0558       ab.action = DAQ_SET_COMPRESSION;
0559       ab.ipar[0] = get_value(argv[optind + 1]);
0560 
0561       r = r_action_1(&ab, clnt);
0562       if (r == (shortResult *) NULL) 
0563     {
0564       clnt_perror (clnt, "call failed");
0565     }
0566       if (r->content) std::cout <<  r->str << std::flush;
0567  
0568     }
0569 
0570   else if ( strcasecmp(command,"daq_set_nr_threads") == 0)
0571     {
0572       if ( argc < optind + 2) return -1;
0573 
0574       ab.action = DAQ_SET_NR_THREADS;
0575       ab.ipar[0] = get_value(argv[optind + 1]);
0576 
0577       r = r_action_1(&ab, clnt);
0578       if (r == (shortResult *) NULL) 
0579     {
0580       clnt_perror (clnt, "call failed");
0581     }
0582       if (r->content) std::cout <<  r->str << std::flush;
0583  
0584     }
0585 
0586   else if ( strcasecmp(command,"daq_set_md5enable") == 0)
0587     {
0588       if ( argc < optind + 2) return -1;
0589 
0590       ab.action = DAQ_SET_MD5ENABLE;
0591       ab.ipar[0] = get_value(argv[optind + 1]);
0592 
0593       r = r_action_1(&ab, clnt);
0594       if (r == (shortResult *) NULL) 
0595     {
0596       clnt_perror (clnt, "call failed");
0597     }
0598       if (r->content) std::cout <<  r->str << std::flush;
0599  
0600     }
0601   
0602   else if ( strcasecmp(command,"daq_allow_md5turnoff") == 0)
0603     {
0604       if ( argc < optind + 2) return -1;
0605 
0606       ab.action = DAQ_SET_MD5ALLOWTURNOFF;
0607       ab.ipar[0] = get_value(argv[optind + 1]);
0608 
0609       r = r_action_1(&ab, clnt);
0610       if (r == (shortResult *) NULL) 
0611     {
0612       clnt_perror (clnt, "call failed");
0613     }
0614       if (r->content) std::cout <<  r->str << std::flush;
0615  
0616     }
0617 
0618   else if ( strcasecmp(command,"daq_fake_trigger") == 0)
0619     {
0620       if ( argc < optind + 2) return -1;
0621 
0622       ab.action = DAQ_FAKETRIGGER;
0623       ab.ipar[0] = get_value(argv[optind + 1]);
0624       // see if we have a 2nd parameter
0625       if ( argc > optind + 2)
0626     {
0627       ab.ipar[1] =  get_value(argv[optind + 1]);
0628     }
0629 
0630       r = r_action_1(&ab, clnt);
0631       if (r == (shortResult *) NULL) 
0632     {
0633       clnt_perror (clnt, "call failed");
0634     }
0635       if (r->content) std::cout <<  r->str << std::flush;
0636  
0637     }
0638 
0639   else if ( strcasecmp(command,"daq_list_readlist") == 0)
0640     {
0641 
0642       ab.action = DAQ_LISTREADLIST;
0643 
0644       r = r_action_1(&ab, clnt);
0645       if (r == (shortResult *) NULL) 
0646     {
0647       clnt_perror (clnt, "call failed");
0648     }
0649       if (r->content) std::cout <<  r->str << std::flush;
0650  
0651     }
0652   
0653  else if ( strcasecmp(command,"daq_clear_readlist") == 0)
0654     {
0655 
0656       ab.action = DAQ_CLEARREADLIST;
0657 
0658       r = r_action_1(&ab, clnt);
0659       if (r == (shortResult *) NULL) 
0660     {
0661       clnt_perror (clnt, "call failed");
0662     }
0663       if (r->content) std::cout <<  r->str << std::flush;
0664  
0665     }
0666   
0667 
0668   else if ( strcasecmp(command,"daq_status") == 0)
0669     {
0670 
0671       ab.action = DAQ_STATUS;
0672 
0673       ab.ipar[0] = long_flag; 
0674 
0675       r = r_action_1(&ab, clnt);
0676       if (r == (shortResult *) NULL) 
0677     {
0678       clnt_perror (clnt, "call failed");
0679     }
0680       if (r->content) std::cout <<  r->str << std::flush;
0681  
0682     }
0683   
0684   else if ( strcasecmp(command,"daq_set_maxevents") == 0)
0685     {
0686       if ( argc < optind + 2) return -1;
0687 
0688       ab.action = DAQ_SETMAXEVENTS;
0689       ab.ipar[0] = get_value(argv[optind + 1]);
0690 
0691       r = r_action_1(&ab, clnt);
0692       if (r == (shortResult *) NULL) 
0693     {
0694       clnt_perror (clnt, "call failed");
0695     }
0696       if (r->content) std::cout <<  r->str << std::flush;
0697  
0698     }
0699 
0700   else if ( strcasecmp(command,"daq_set_maxvolume") == 0)
0701     {
0702       if ( argc < optind + 2) return -1;
0703 
0704       ab.action = DAQ_SETMAXVOLUME;
0705       ab.ipar[0] = get_value(argv[optind + 1]);
0706 
0707       r = r_action_1(&ab, clnt);
0708       if (r == (shortResult *) NULL) 
0709     {
0710       clnt_perror (clnt, "call failed");
0711     }
0712       if (r->content) std::cout <<  r->str << std::flush;
0713  
0714     }
0715 
0716   else if ( strcasecmp(command,"daq_set_rolloverlimit") == 0)
0717     {
0718       if ( argc < optind + 2) return -1;
0719 
0720       ab.action = DAQ_ROLLOVERLIMIT;
0721       ab.ipar[0] = get_value(argv[optind + 1]);
0722 
0723       r = r_action_1(&ab, clnt);
0724       if (r == (shortResult *) NULL) 
0725     {
0726       clnt_perror (clnt, "call failed");
0727     }
0728       if (r->content) std::cout <<  r->str << std::flush;
0729  
0730     }
0731 
0732   else if ( strcasecmp(command,"daq_set_maxbuffersize") == 0)
0733     {
0734       if ( argc < optind + 2) return -1;
0735 
0736       ab.action = DAQ_SETMAXBUFFERSIZE;
0737       ab.ipar[0] = get_value(argv[optind + 1]);
0738 
0739       r = r_action_1(&ab, clnt);
0740       if (r == (shortResult *) NULL) 
0741     {
0742       clnt_perror (clnt, "call failed");
0743     }
0744       if (r->content) std::cout <<  r->str << std::flush;
0745  
0746     }
0747 
0748 
0749   else if ( strcasecmp(command,"daq_set_adaptivebuffering") == 0)
0750     {
0751       if ( argc < optind + 2) return -1;
0752 
0753       ab.action = DAQ_SETADAPTIVEBUFFER;
0754       ab.ipar[0] = get_value(argv[optind + 1]);
0755 
0756       r = r_action_1(&ab, clnt);
0757       if (r == (shortResult *) NULL) 
0758     {
0759       clnt_perror (clnt, "call failed");
0760     }
0761       if (r->content) std::cout <<  r->str << std::flush;
0762  
0763     }
0764 
0765   else if ( strcasecmp(command,"daq_webcontrol") == 0)
0766     {
0767 
0768       ab.action = DAQ_WEBCONTROL;
0769       if ( argc == optind + 2)
0770     {
0771       ab.ipar[0] = get_value(argv[optind + 1]);
0772     }
0773       else
0774     {
0775       ab.ipar[0] = 0;
0776     }
0777       r = r_action_1 (&ab, clnt);
0778       if (r == (shortResult *) NULL) 
0779     {
0780       clnt_perror (clnt, "call failed");
0781     }
0782       if (r->content) std::cout <<  r->str << std::flush;
0783  
0784     }
0785 
0786   else if ( strcasecmp(command,"daq_get_lastfilename") == 0)
0787     {
0788 
0789       ab.action = DAQ_GETLASTFILENAME;
0790 
0791       ab.ipar[0] = 0;
0792 
0793       r = r_action_1 (&ab, clnt);
0794       if (r == (shortResult *) NULL) 
0795     {
0796       clnt_perror (clnt, "call failed");
0797     }
0798       if (r->content) std::cout <<  r->str << std::flush;
0799  
0800     }
0801 
0802   else if ( strcasecmp(command,"daq_get_last_event_number") == 0)
0803     {
0804 
0805       ab.action = DAQ_GETLASTEVENTNUMBER;
0806 
0807       ab.ipar[0] = 0;
0808 
0809       r = r_action_1 (&ab, clnt);
0810       if (r == (shortResult *) NULL) 
0811     {
0812       clnt_perror (clnt, "call failed");
0813     }
0814       if (r->content) std::cout <<  r->str << std::flush;
0815  
0816     }
0817 
0818   else if ( strcasecmp(command,"daq_set_eventformat") == 0)
0819     {
0820       if ( argc < optind + 2) return -1;
0821 
0822       ab.action = DAQ_SETEVENTFORMAT;
0823       ab.ipar[0] = get_value(argv[optind + 1]);
0824 
0825       r = r_action_1(&ab, clnt);
0826       if (r == (shortResult *) NULL) 
0827     {
0828       clnt_perror (clnt, "call failed");
0829     }
0830       if (r->content) std::cout <<  r->str << std::flush;
0831  
0832     }
0833 
0834   else if ( strcasecmp(command,"daq_set_runcontrolmode") == 0)
0835     {
0836       if ( argc < optind + 2) return -1;
0837 
0838       ab.action = DAQ_SET_RUNCONTROLMODE;
0839       ab.ipar[0] = get_value(argv[optind + 1]);
0840 
0841       r = r_action_1(&ab, clnt);
0842       if (r == (shortResult *) NULL) 
0843     {
0844       clnt_perror (clnt, "call failed");
0845     }
0846       if (r->content) std::cout <<  r->str << std::flush;
0847  
0848     }
0849 
0850   else if ( strcasecmp(command,"daq_get_runcontrolmode") == 0)
0851     {
0852 
0853       ab.action = DAQ_GET_RUNCONTROLMODE;
0854 
0855       r = r_action_1(&ab, clnt);
0856       if (r == (shortResult *) NULL) 
0857     {
0858       clnt_perror (clnt, "call failed");
0859     }
0860       if (r->content) std::cout <<  r->str << std::flush;
0861  
0862     }
0863 
0864 #ifdef HAVE_MOSQUITTO_H
0865   else if ( strcasecmp(command, "daq_set_mqtt_host") == 0)
0866     {
0867       if ( argc < optind + 2) return -1;
0868 
0869       ab.action = DAQ_SET_MQTT_HOST;
0870       ab.spar = argv[optind + 1];
0871       if ( argc == optind + 3)
0872         {
0873           ab.ipar[0] = get_value(argv[optind + 2]);
0874         }
0875       else
0876         {
0877           ab.ipar[0] = 1883;
0878         }
0879       r = r_action_1(&ab, clnt);
0880       if (r == (shortResult *) NULL)
0881         {
0882           clnt_perror (clnt, "call failed");
0883         }
0884       if (r->content) std::cout <<  r->str << std::flush;
0885 
0886     }
0887 
0888   else if ( strcasecmp(command, "daq_get_mqtt_host") == 0)
0889     {
0890       ab.action = DAQ_GET_MQTT_HOST;
0891 
0892       r = r_action_1(&ab, clnt);
0893       if (r == (shortResult *) NULL)
0894         {
0895           clnt_perror (clnt, "call failed");
0896         }
0897       if (r->content) std::cout <<  r->str << std::flush;
0898 
0899     }
0900 #endif
0901 
0902   
0903   else if ( strcasecmp(command,"elog") == 0)
0904     {
0905 
0906       if ( argc != optind + 4) return -1;
0907 
0908       ab.action = DAQ_ELOG;
0909       ab.spar = argv[optind + 1];
0910       ab.ipar[0] = get_value(argv[optind + 2]);
0911       ab.spar2 = argv[optind +3];
0912 
0913       r = r_action_1(&ab, clnt);
0914       if (r == (shortResult *) NULL) 
0915     {
0916       clnt_perror (clnt, "call failed");
0917     }
0918       if (r->content) std::cout <<  r->str << std::flush;
0919  
0920     }
0921   
0922 
0923   else if ( strcasecmp(command,"load") == 0)
0924     {
0925 
0926       if ( argc != optind + 2) return -1;
0927 
0928       ab.action = DAQ_LOAD;
0929       ab.spar = argv[optind + 1];
0930 
0931       r = r_action_1(&ab, clnt);
0932       if (r == (shortResult *) NULL) 
0933     {
0934       clnt_perror (clnt, "call failed");
0935     }
0936       if (r->content) std::cout <<  r->str << std::flush;
0937  
0938     }
0939   
0940 
0941 
0942   else if ( strcasecmp(command,"create_device") == 0)
0943     {
0944       return handle_device ( argc, argv, optind); 
0945     }
0946 
0947   else if ( strcasecmp(command,"daq_shutdown") == 0)
0948     {
0949 
0950       r = r_shutdown_1(0,clnt);
0951       if (r == (shortResult *) NULL) 
0952     {
0953       clnt_perror (clnt, "call failed");
0954       return 0;
0955     }
0956       else
0957     {
0958       if (r->content) std::cout <<  r->str << std::flush;
0959     }
0960     }
0961 
0962   else if ( strcasecmp(command,"daq_set_uservalue") == 0)
0963     {
0964       if ( argc < optind + 3) return -1;
0965 
0966       ab.action = DAQ_SET_USERVALUE;
0967       ab.ipar[0] = get_value(argv[optind + 1]);
0968       ab.ipar[1] = get_value(argv[optind + 2]);
0969 
0970       r = r_action_1(&ab, clnt);
0971       if (r == (shortResult *) NULL) 
0972     {
0973       clnt_perror (clnt, "call failed");
0974     }
0975       if (r->content) std::cout <<  r->str << std::flush;
0976  
0977     }
0978 
0979   else if ( strcasecmp(command,"daq_get_uservalue") == 0)
0980     {
0981       if ( argc < optind + 2) return -1;
0982 
0983       ab.action = DAQ_GET_USERVALUE;
0984       ab.ipar[0] = get_value(argv[optind + 1]);
0985 
0986       r = r_action_1(&ab, clnt);
0987       if (r == (shortResult *) NULL) 
0988     {
0989       clnt_perror (clnt, "call failed");
0990     }
0991       if (r->content) std::cout <<  r->str << std::flush;
0992  
0993     }
0994 
0995 
0996 
0997   
0998   else
0999     {
1000       std::cout << "Unknown Command " << command << std::endl;
1001       return 0;
1002     }
1003 
1004   return r->status;
1005 }
1006 
1007 
1008 int
1009 main (int argc, char *argv[])
1010 {
1011 
1012 
1013   int status = command_execute( argc, argv);
1014   clnt_destroy (clnt);
1015 
1016   if ( status)
1017     {
1018       return 1;
1019     }
1020 
1021 
1022   return 0;
1023 }