An application linked with Online

The following example can be linked on any PC which has Online and Tango installed. It consists of Makefile, onlineDemo.c, onlineDemo.h and onlineCPP.cpp.

This is the Makefile:

 
SRC_DIR=/usr/local/experiment/Spectra/src
TANGO_LIB = -L/usr/lib/x86_64-linux-gnu -ltango -llog4tango -lomniORB4 -lomniDynamic4 -lomnithread
SIS3100_LIB=-L/usr/lib -l_sis3100
PYTHON_LIB=-L/usr/lib/python2.7/config-x86_64-linux-gnu -lpython2.7
GPIB_LIB=-L/usr/lib -lgpib
TINE_LIB=-L/usr/lib -ltinemt -ltbufsrv
PERL_LIB=-Wl,-E  -fstack-protector -L/usr/local/lib  -L/usr/lib/x86_64-linux-gnu -lperl -ldl -lm -lpthread -lc -lcrypt

LIB_DIR=/usr/local/experiment/Spectra/lib

LIBS=$(SRC_DIR)/cmc_dummy.o \
    $(SRC_DIR)/can_dummy.o \
    -L$(LIB_DIR) -lgra -ltng_ifc -ladslib \
    $(PERL_LIB) \
    $(SIS3100_LIB) $(PYTHON_LIB) $(GPIB_LIB) $(TINE_LIB) \
    -lnsl -ldl -lm -lc -lpthread -lstdc++ \
    $(TANGO_LIB) -ljsoncpp \
    -L/usr/X11R6/lib -lX11 

all: onlineDemo

onlineDemo.o: onlineDemo.c onlineDemo.h
	gcc -c -o onlineDemo.o -I/usr/local/experiment/Spectra/src onlineDemo.c

onlineCPP.o: onlineCPP.cpp onlineDemo.h
	g++ -c -Wall -std=c++0x -I/usr/include/tango -o onlineCPP.o onlineCPP.cpp

onlineDemo: onlineCPP.o onlineDemo.o
	g++ onlineDemo.o onlineCPP.o $(LIBS) -o onlineDemo

The main function:

/*
  file: onlineDemo.c

  ./onlineDemo -online -novme -nographic
*/
#include "onlineDemo.h"
#include "gra_common.h"
 
int main( int argc, char **arg, char **env)
{
  void *p;
  char command[320];
  char buffer[320];
  double temp;
  int i;
  //
  // demonstrate some cpp code
  //
  getProxy( &p);

  exp_init( argc, arg); 
  //
  // execute /online_dir/TkIrc.pl which loads online.xml
  //
  gra_perl( "init_tki", 0, 0);
  //
  // suppress logging output to stdout
  //
  gra_command( "set log off");

  fprintf( stderr, "Say:\n  'bye' to finish \n");
  fprintf( stderr, "  'exp' to call exp_input() \n");
  fprintf( stderr, "  '<command>', passed to gra_command() \n");
  //
  // example for gra_decode_text()
  //
  gra_decode_text( "date()", buffer);
  fprintf( stdout, "date(): %s \n", buffer); 
  //
  // example for gra_decode_int()
  //
  gra_decode_int( "2*3", &i);
  fprintf( stdout, "2*3: %d\n", i); 
  //
  // example for gra_decode_double()
  //
  gra_decode_double( "gmup(d1_mot01)", &temp);
  fprintf( stdout, "gmup(d1_mot01): %g\n", temp); 
  while(1)
    {
      command[0] = 0;
      read_line( "Enter> ", command, 0);
      fprintf( stdout, "\n"); 
      //fprintf( stdout, "\nreceived <%s>\n", gra_ascii_format( command));
      if( !strcmp( command, "bye"))
        {
          goto finish;
        }
      //
      // to start an interactive session
      //
      if( !strcmp( command, "exp"))
        {
          exp_input();
          continue;
        }
      //
      // execute any command
      //
      gra_command( command); 
    }

finish:
  return 1;
}

The header file:

//
// file onlineDemo.h
//
#ifdef __cplusplus
extern "C" int getProxy( void **p);
#else
int getProxy( void **p);
#endif

The file onlineDemo.cpp:

//
// file: onlineDemo.cpp
//
#include <iostream>
#include <tango.h>
#include "onlineDemo.h"
using namespace std; 

int getProxy( void **p)
{
  Tango::DeviceProxy *device = 0;
  Tango::DeviceAttribute da;
  Tango::DevDouble gain;
  
  try 
    {
      device = new Tango::DeviceProxy( "p09/vfc/d1.01");
    }
  catch( Tango::DevFailed &e)
    {
      cout << "error devFailed" << endl;
      fprintf( stderr, "error \n reason:  %s \n desc:    %s \n origin:  %s \n", 
               e.errors[0].reason.in(), 
               e.errors[0].desc.in(), 
               e.errors[0].origin.in());  
      return 0;
    }
  da = device->read_attribute( "gain");
  da >> gain;
  cout << "vfc gain: " << gain << endl;
  *p = device;
  return 1;
}