rllib  1
Public Member Functions | Private Types | Private Attributes
rlDataProvider Class Reference

#include <rldataprovider.h>

Collaboration diagram for rlDataProvider:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 rlDataProvider (int numInteger, int numFloat=0, int numString=0)
virtual ~rlDataProvider ()
int getInt (int id)
float getFloat (int id)
int getIntArray (int id, int *i, int nmax)
int getFloatArray (int id, float *f, int nmax)
const char * getString (int id)
int setInt (int id, int i)
int setFloat (int id, float f)
int setIntArray (int id, int *i, int num)
int setFloatArray (int id, float *f, int num)
int setString (int id, const char *str)
int getIntAndReset (int id)
int setIntAndWaitForReset (int id, int i)
int setInt0Semaphore (int i)
int getInt0Semaphore ()
int run (rlSocket *socket)

Private Types

typedef char * CHARPTR

Private Attributes

int * ints
float * floats
char ** strings
int num_integer
int num_float
int num_string
rlMutex mutex
rlSemaphore int0semaphore

Detailed Description

This class is a container for data.
You can get/set the data identified by id.
The run method starts a separate thread that makes rlDataProvider available over TCP.

Definition at line 29 of file rldataprovider.h.


Member Typedef Documentation

typedef char* rlDataProvider::CHARPTR [private]

Definition at line 50 of file rldataprovider.h.


Constructor & Destructor Documentation

rlDataProvider::rlDataProvider ( int  numInteger,
int  numFloat = 0,
int  numString = 0 
)

Definition at line 20 of file rldataprovider.cpp.

{
  int i;

  num_integer = numInteger;
  num_float   = numFloat;
  num_string  = numString;
  if(num_integer < 0) num_integer = 0;
  if(num_float   < 0) num_float   = 0;
  if(num_string  < 0) num_string  = 0;
  ints    = NULL;
  floats  = NULL;
  strings = NULL;
  if(num_integer > 0)
  {
    ints = new int[num_integer];
    for(i=0; i<num_integer; i++) ints[i] = 0;
  }
  if(num_float > 0)
  {
    floats = new float[num_float];
    for(i=0; i<num_float; i++) floats[i] = 0.0f;
  }
  if(num_string > 0)
  {
    strings = new CHARPTR[num_string];
    for(i=0; i<num_string; i++)
    {
      strings[i] = new char [1];
      *strings[i] = '\0';
    }
  }
}
rlDataProvider::~rlDataProvider ( ) [virtual]

Definition at line 54 of file rldataprovider.cpp.

{
  int i;

  if(ints    != NULL) delete [] ints;
  if(floats  != NULL) delete [] floats;
  for(i=0; i<num_string; i++)
  {
    if(strings[i] != NULL) delete [] strings[i];
  }
  if(strings != NULL) delete [] strings;
}

Member Function Documentation

float rlDataProvider::getFloat ( int  id)

Definition at line 79 of file rldataprovider.cpp.

{
  float ret;

  if(id < 0)          return 0.0f;
  if(id >= num_float) return 0.0f;
  mutex.lock();
  ret = floats[id];
  mutex.unlock();
  return ret;
}
int rlDataProvider::getFloatArray ( int  id,
float *  f,
int  nmax 
)

Definition at line 116 of file rldataprovider.cpp.

{
  int ret;
  const char *cptr = getString(id);
  if(cptr == NULL) return -1;

  ret = 0;
  while(1)
  {
    if(cptr == NULL || *cptr == '\0') break;
    if(*cptr != ',' && *cptr != '\"')
    {
      sscanf(cptr,"%f",&array[ret++]);
      cptr = strchr(cptr,',');
      if(cptr != NULL) cptr++;
      if(ret >= nmax) break;
    }
    else
    {
      cptr++;
    }
  }
  return ret;
}
int rlDataProvider::getInt ( int  id)

Definition at line 67 of file rldataprovider.cpp.

{
  int ret;

  if(id < 0)            return -1;
  if(id >= num_integer) return -1;
  mutex.lock();
  ret = ints[id];
  mutex.unlock();
  return ret;
}
int rlDataProvider::getInt0Semaphore ( )

Definition at line 263 of file rldataprovider.cpp.

int rlDataProvider::getIntAndReset ( int  id)

Definition at line 223 of file rldataprovider.cpp.

{
  int ret;

  if(id < 0)            return -1;
  if(id >= num_integer) return -1;
  mutex.lock();
  ret = ints[id];
  ints[id] = -1;
  mutex.unlock();
  return ret;
}
int rlDataProvider::getIntArray ( int  id,
int *  i,
int  nmax 
)

Definition at line 91 of file rldataprovider.cpp.

{
  int ret;
  const char *cptr = getString(id);
  if(cptr == NULL) return -1;

  ret = 0;
  while(1)
  {
    if(cptr == NULL || *cptr == '\0') break;
    if(*cptr != ',' && *cptr != '\"')
    {
      sscanf(cptr,"%d",&array[ret++]);
      cptr = strchr(cptr,',');
      if(cptr != NULL) cptr++;
      if(ret >= nmax) break;
    }
    else
    {
      cptr++;
    }
  }
  return ret;
}
const char * rlDataProvider::getString ( int  id)

Definition at line 141 of file rldataprovider.cpp.

{
  const char *ret;

  if(id < 0)           return NULL;
  if(id >= num_string) return NULL;
  mutex.lock();
  ret = strings[id];
  mutex.unlock();
  return ret;
}
int rlDataProvider::run ( rlSocket socket)

Definition at line 269 of file rldataprovider.cpp.

{
  int   id,ival,ret;
  float fval;
  char  cval[rl_PRINTF_LENGTH];
  const char *cptr;
  rlInterpreter interpreter;

  while(socket->isConnected())
  {
    ret = socket->readStr(interpreter.line,rl_PRINTF_LENGTH-1);
    if(ret <= 0) break;
    if     (interpreter.isCommand("int("))
    {
      sscanf(interpreter.line,"int(%d,%d)",&id,&ival);
      setInt(id,ival);
    }
    else if(interpreter.isCommand("intAndReset("))
    {
      sscanf(interpreter.line,"intAndReset(%d,%d)",&id,&ival);
      setIntAndWaitForReset(id,ival);
    }
    else if(interpreter.isCommand("float("))
    {
      sscanf(interpreter.line,"float(%d,%f)",&id,&fval);
      setFloat(id,fval);
    }
    else if(interpreter.isCommand("string("))
    {
      sscanf(interpreter.line,"string(%d,",&id);
      interpreter.copyStringParam(cval,0);
      setString(id,cval);
    }
    else if(interpreter.isCommand("getInt("))
    {
      sscanf(interpreter.line,"getInt(%d)",&id);
      socket->printf("intResult(%d)\n",getInt(id));
    }
    else if(interpreter.isCommand("getIntAndReset("))
    {
      sscanf(interpreter.line,"getIntAndReset(%d)",&id);
      socket->printf("intResult(%d)\n",getIntAndReset(id));
    }
    else if(interpreter.isCommand("getInt0Semaphore("))
    {
      socket->printf("intResult(%d)\n",getInt0Semaphore());
    }
    else if(interpreter.isCommand("getFloat("))
    {
      sscanf(interpreter.line,"getFloat(%d)",&id);
      socket->printf("floatResult(%f)\n",getFloat(id));
    }
    else if(interpreter.isCommand("getString("))
    {
      sscanf(interpreter.line,"getString(%d)",&id);
      cptr = getString(id);
      if(cptr == NULL) socket->printf("stringResult(\"\")\n");
      else             socket->printf("stringResult(\"%s\")\n",cptr);
    }
  }
  return 0;
}
int rlDataProvider::setFloat ( int  id,
float  f 
)

Definition at line 163 of file rldataprovider.cpp.

{
  if(id < 0)          return -1;
  if(id >= num_float) return -1;
  mutex.lock();
  floats[id] = f;
  mutex.unlock();
  return 0;
}
int rlDataProvider::setFloatArray ( int  id,
float *  f,
int  num 
)

Definition at line 192 of file rldataprovider.cpp.

{
  char buf[rl_PRINTF_LENGTH],val[100];
  int nmax,ipos,ind;

  if(num <= 0) return -1;
  nmax = rl_PRINTF_LENGTH - 1;
  buf[0] = '\0';
  ipos = strlen(buf);
  for(ind=0; ind<num; ind++)
  {
    sprintf(val,"%f,",array[ind]);
    if(ipos+(int)strlen(val) >= nmax) return -1;
    strcat(buf,val);
    ipos = strlen(buf);
  }
  return setString(id,buf);
}
int rlDataProvider::setInt ( int  id,
int  i 
)

Definition at line 153 of file rldataprovider.cpp.

{
  if(id < 0)            return -1;
  if(id >= num_integer) return -1;
  mutex.lock();
  ints[id] = i;
  mutex.unlock();
  return 0;
}
int rlDataProvider::setInt0Semaphore ( int  i)

Definition at line 254 of file rldataprovider.cpp.

{
  int ret;

  ret = setInt(0,i);
  int0semaphore.incrementSemaphore();
  return ret;
}
int rlDataProvider::setIntAndWaitForReset ( int  id,
int  i 
)

Definition at line 236 of file rldataprovider.cpp.

{
  if(id < 0)            return -1;
  if(id >= num_integer) return -1;
  while(1)
  {
    mutex.lock();
    if(ints[id] == -1)
    {
      ints[id] = i;
      mutex.unlock();
      return 0;
    }
    mutex.unlock();
    rlsleep(10);
  }
}
int rlDataProvider::setIntArray ( int  id,
int *  i,
int  num 
)

Definition at line 173 of file rldataprovider.cpp.

{
  char buf[rl_PRINTF_LENGTH],val[100];
  int nmax,ipos,ind;

  if(num <= 0) return -1;
  nmax = rl_PRINTF_LENGTH - 1;
  buf[0] = '\0';
  ipos = strlen(buf);
  for(ind=0; ind<num; ind++)
  {
    sprintf(val,"%d,",array[ind]);
    if(ipos+(int)strlen(val) >= nmax) return -1;
    strcat(buf,val);
    ipos = strlen(buf);
  }
  return setString(id,buf);
}
int rlDataProvider::setString ( int  id,
const char *  str 
)

Definition at line 211 of file rldataprovider.cpp.

{
  if(id < 0)           return -1;
  if(id >= num_string) return -1;
  mutex.lock();
  if(strings[id] != NULL) delete [] strings[id];
  strings[id] = new char[strlen(str)+1];
  strcpy(strings[id],str);
  mutex.unlock();
  return 0;
}

Member Data Documentation

float* rlDataProvider::floats [private]

Definition at line 52 of file rldataprovider.h.

Definition at line 56 of file rldataprovider.h.

int* rlDataProvider::ints [private]

Definition at line 51 of file rldataprovider.h.

Definition at line 55 of file rldataprovider.h.

Definition at line 54 of file rldataprovider.h.

Definition at line 54 of file rldataprovider.h.

Definition at line 54 of file rldataprovider.h.

char** rlDataProvider::strings [private]

Definition at line 53 of file rldataprovider.h.


The documentation for this class was generated from the following files:
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines