This is Unofficial EPICS BASE Doxygen Site
pvget.cpp File Reference
#include <iostream>
#include <vector>
#include <set>
#include <deque>
#include <string>
#include <istream>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <epicsStdlib.h>
#include <epicsGetopt.h>
#include <epicsExit.h>
#include <epicsGuard.h>
#include <pv/pvData.h>
#include <pv/logger.h>
#include <pv/lock.h>
#include <pv/event.h>
#include <pv/thread.h>
#include <pv/reftrack.h>
#include <pv/caProvider.h>
#include <pva/client.h>
#include "pvutils.h"
+ Include dependency graph for pvget.cpp:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define EXECNAME   "pvget"
 
#define MAIN   main
 

Functions

int MAIN (int argc, char *argv[])
 

Macro Definition Documentation

#define EXECNAME   "pvget"

Definition at line 35 of file pvget.cpp.

#define MAIN   main

Definition at line 262 of file pvget.cpp.

Function Documentation

int MAIN ( int  argc,
char *  argv[] 
)

Definition at line 265 of file pvget.cpp.

266 {
267  try {
268  int opt; /* getopt() current option */
269 #ifdef PVMONITOR
270  bool monitor = true;
271 #else
272  bool monitor = false;
273 #endif
274 
275  epics::RefMonitor refmon;
276 
277  // ================ Parse Arguments
278 
279  while ((opt = getopt(argc, argv, ":hvVRM:r:w:tmp:qdcF:f:ni")) != -1) {
280  switch (opt) {
281  case 'h': /* Print usage */
282  usage();
283  return 0;
284  case 'v':
285  verbosity++;
286  break;
287  case 'V': /* Print version */
288  {
289  fprintf(stdout, "pvAccess %u.%u.%u%s\n",
290  EPICS_PVA_MAJOR_VERSION,
291  EPICS_PVA_MINOR_VERSION,
292  EPICS_PVA_MAINTENANCE_VERSION,
293  (EPICS_PVA_DEVELOPMENT_FLAG)?"-SNAPSHOT":"");
294  fprintf(stdout, "pvData %u.%u.%u%s\n",
295  EPICS_PVD_MAJOR_VERSION,
296  EPICS_PVD_MINOR_VERSION,
297  EPICS_PVD_MAINTENANCE_VERSION,
298  (EPICS_PVD_DEVELOPMENT_FLAG)?"-SNAPSHOT":"");
299  fprintf(stdout, "Base %s\n", EPICS_VERSION_FULL);
300  return 0;
301  }
302  case 'R':
303  refmon.start(5.0);
304  break;
305  case 'M':
306  if(strcmp(optarg, "raw")==0) {
307  outmode = pvd::PVStructure::Formatter::Raw;
308  } else if(strcmp(optarg, "nt")==0) {
309  outmode = pvd::PVStructure::Formatter::NT;
310  } else if(strcmp(optarg, "json")==0) {
311  outmode = pvd::PVStructure::Formatter::JSON;
312  } else {
313  fprintf(stderr, "Unknown output mode '%s'\n", optarg);
314  outmode = pvd::PVStructure::Formatter::Raw;
315  }
316  break;
317  case 'w': /* Set PVA timeout value */
318  {
319  double temp;
320  if((epicsScanDouble(optarg, &temp)) != 1)
321  {
322  fprintf(stderr, "'%s' is not a valid timeout value "
323  "- ignored. ('" EXECNAME " -h' for help.)\n", optarg);
324  } else {
325  timeout = temp;
326  }
327  }
328  break;
329  case 'r': /* Set PVA timeout value */
330  request = optarg;
331  break;
332  case 't': /* Terse mode */
333  case 'i': /* T-types format mode */
334  case 'F': /* Store this for output formatting */
335  case 'n':
336  case 'q': /* Quiet mode */
337  // deprecate
338  break;
339  case 'f': /* Use input stream as input */
340  fprintf(stderr, "Unsupported option -f\n");
341  return 1;
342  case 'm': /* Monitor mode */
343  monitor = true;
344  break;
345  case 'p': /* Set default provider */
347  break;
348  case 'd': /* Debug log level */
349  debugFlag = true;
350  break;
351  case 'c': /* Clean-up and report used instance count */
352  break;
353  case '?':
354  fprintf(stderr,
355  "Unrecognized option: '-%c'. ('" EXECNAME " -h' for help.)\n",
356  optopt);
357  return 1;
358  case ':':
359  fprintf(stderr,
360  "Option '-%c' requires an argument. ('" EXECNAME " -h' for help.)\n",
361  optopt);
362  return 1;
363  default :
364  usage();
365  return 1;
366  }
367  }
368 
369  if(monitor)
370  timeout = -1;
371 
372  if(verbosity>0 && outmode==pvd::PVStructure::Formatter::NT)
373  outmode = pvd::PVStructure::Formatter::Raw;
374 
375  pvd::PVStructure::shared_pointer pvRequest;
376  try {
377  pvRequest = pvd::createRequest(request);
378  } catch(std::exception& e){
379  fprintf(stderr, "failed to parse request string: %s\n", e.what());
380  return 1;
381  }
382 
383  for(int i = optind; i < argc; i++) {
384  pvnamewidth = std::max(pvnamewidth, strlen(argv[i]));
385  }
386 
388 
390 
391  {
393 
394  std::vector<std::tr1::shared_ptr<Tracker> > tracked;
395 
396  epics::auto_ptr<WorkQueue> Q;
397  if(monitor)
398  Q.reset(new WorkQueue);
399 
400  for(int i = optind; i < argc; i++) {
401  pvac::ClientChannel chan(provider.connect(argv[i]));
402 
403  if(monitor) {
404  std::tr1::shared_ptr<MonTracker> mon(new MonTracker(*Q, chan, pvRequest));
405 
406  tracked.push_back(mon);
407 
408  } else { // Get
409  std::tr1::shared_ptr<Getter> get(new Getter(chan, pvRequest));
410 
411  tracked.push_back(get);
412  }
413  }
414 
415  // ========================== Wait for operations to complete, or timeout
416 
417  Tracker::prepare(); // install signal handler
418 
419  if(debugFlag)
420  std::cerr<<"Waiting...\n";
421 
422  {
424  while(Tracker::inprog.size() && !Tracker::abort) {
425  UnGuard U(G);
426  if(timeout<=0)
427  Tracker::doneEvt.wait();
428  else if(!Tracker::doneEvt.wait(timeout)) {
429  haderror = 1;
430  std::cerr<<"Timeout\n";
431  break;
432  }
433  }
434  }
435  }
436 
437  if(refmon.running()) {
438  refmon.stop();
439  // show final counts
440  refmon.current();
441  }
442 
443  // ========================== All done now
444 
445  if(debugFlag)
446  std::cerr<<"Done\n";
447 
448  return haderror ? 1 : 0;
449  } catch(std::exception& e) {
450  std::cerr<<"Error: "<<e.what()<<"\n";
451  return 1;
452  }
453 }
double timeout
Definition: pvutils.cpp:25
int getopt(int nargc, char *const *nargv, const char *ostr)
Definition: epicsGetopt.c:65
#define max(x, y)
Definition: flexdef.h:81
std::string request
static epicsMutex doneLock
Definition: pvutils.h:47
#define EXECNAME
Definition: pvget.cpp:35
int i
Definition: scan.c:967
int optind
Definition: epicsGetopt.c:50
static void prepare()
Definition: pvutils.cpp:49
#define SET_LOG_LEVEL(level)
Definition: logger.h:50
static epicsEvent doneEvt
Definition: pvutils.h:48
#define epicsScanDouble(str, to)
Definition: epicsStdlib.h:78
PVStructure::shared_pointer createRequest(std::string const &request)
int optopt
Definition: epicsGetopt.c:50
static inprog_t inprog
Definition: pvutils.h:50
int verbosity
Definition: pvutils.cpp:29
#define stdout
Definition: epicsStdio.h:30
Central client context.
Definition: client.h:517
#define stderr
Definition: epicsStdio.h:32
bool debugFlag
Definition: pvutils.cpp:26
static void start()
start provider ca
Definition: caProvider.cpp:201
std::string defaultProvider
char * optarg
Definition: epicsGetopt.c:55
static bool abort
Definition: pvutils.h:51
void usage(void)
Definition: cainfo.c:36
pvd::PVStructure::Formatter::format_t outmode
Definition: pvutils.cpp:28