rllib  1
rldataacquisitionprovider.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002                   rldataacquisitionprovider.cpp  -  description
00003                              -------------------
00004     begin                : Mon Sep 03 2007
00005     copyright            : (C) 2007 by pvbrowser
00006     email                : lehrig@t-online.de
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This library is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE as        *
00013  *   published by the Free Software Foundation                             *
00014  *                                                                         *
00015  ***************************************************************************/
00016 #include "rldataacquisitionprovider.h"
00017 #include <stdio.h>
00018 #include <string.h>
00019 #include <ctype.h>
00020 
00021 rlDataAcquisitionProvider::rlDataAcquisitionProvider(int maxNameLength, const char *shared_memory, long shared_memory_size)
00022 {
00023   shm = new rlSharedMemory(shared_memory,shared_memory_size);
00024   shmheader = (SHM_HEADER *) shm->getUserAdr();
00025   shmvalues = ((char *)shmheader) + sizeof(SHM_HEADER);
00026   memset(shmheader,0,shared_memory_size);
00027   shmheader->maxItemNameLength = 0;
00028   shmheader->maxNameLength = maxNameLength;
00029   shmheader->numItems = 0;
00030   shmheader->readErrorCount = 0;
00031   shmheader->writeErrorCount = 0;
00032   sharedMemorySize = shared_memory_size;
00033   strcpy(shmheader->ident, "daq");
00034   allow_add_values = 0;
00035 }
00036 
00037 rlDataAcquisitionProvider::~rlDataAcquisitionProvider()
00038 {
00039   delete shm;
00040 }
00041 
00042 int rlDataAcquisitionProvider::readItemList(const char *filename)
00043 {
00044   if(filename == NULL) return DAQ_PROVIDER_ERROR;
00045 
00046   FILE *fin;
00047   char line[1024], *cptr, *cptr2;
00048   int  maxItemNameLength,numItems,len,i;
00049   int  value_offset, delta_index;
00050   int  ilong;
00051 
00052   // get maxItemNameLength and numItems
00053   fin = fopen(filename,"r");
00054   if(fin == NULL)
00055   {
00056     printf("could not open itemlist %s\n",filename);
00057     return DAQ_PROVIDER_ERROR;
00058   }
00059   maxItemNameLength = numItems = 0;
00060   while(fgets(line,sizeof(line)-1,fin) != NULL)
00061   {
00062     if(line[0] > ' ' && line[0] != '#')
00063     {
00064       len = strlen(line);
00065       if(len > maxItemNameLength) maxItemNameLength = len;
00066       numItems++;
00067     }
00068   }
00069   fclose(fin);
00070   shmheader->maxItemNameLength = maxItemNameLength;
00071   shmheader->numItems = numItems;
00072 
00073   // read items
00074   fin = fopen(filename,"r");
00075   if(fin == NULL)
00076   {
00077     printf("could not open itemlist %s\n",filename);
00078     return DAQ_PROVIDER_ERROR;
00079   }
00080   cptr = shmvalues;
00081   value_offset = shmheader->maxItemNameLength + 1;
00082   delta_index  = value_offset + shmheader->maxNameLength + 1;
00083   ilong = sharedMemorySize - sizeof(SHM_HEADER);
00084   if(ilong < numItems*delta_index)
00085   {
00086     printf("rlDataAcquisitionProvider::shared memmory is too small sharedMemorySize=%ld sizeNeeded=%ld\n", sharedMemorySize, numItems*delta_index + sizeof(SHM_HEADER));
00087     return DAQ_PROVIDER_ERROR;
00088   }
00089   i = 0;
00090   while(fgets(line,sizeof(line)-1,fin) != NULL)
00091   {
00092     if(line[0] > ' ' && line[0] != '#')
00093     {
00094       len = strlen(line);
00095       if(len > shmheader->maxNameLength) line[shmheader->maxNameLength] = '\0';
00096       cptr2 = strchr(line,'\n');
00097       if(cptr2 != NULL) *cptr2 = '\0';
00098       cptr2 = strchr(line,' ');
00099       if(cptr2 != NULL) *cptr2 = '\0';
00100       cptr2 = strchr(line,'\t');
00101       if(cptr2 != NULL) *cptr2 = '\0';
00102       strcpy(cptr + (i*delta_index), line);
00103       i++;
00104     }
00105   }
00106   fclose(fin);
00107   strcpy(shmheader->ident, "daq");
00108 
00109   return 0;
00110 }
00111 
00112 const char *rlDataAcquisitionProvider::firstItem()
00113 {
00114   int value_offset, delta_index;
00115   const char *cptr;
00116 
00117   current_item = 0;
00118   if(shmheader == NULL)                   return NULL;
00119   if(shmheader->numItems <= 0)            return NULL;
00120   if(strcmp(shmheader->ident,"daq") != 0) return NULL;
00121 
00122   value_offset = shmheader->maxItemNameLength + 1;
00123   delta_index  = value_offset + shmheader->maxNameLength + 1;
00124 
00125   cptr = shmvalues;
00126   return cptr + (current_item * delta_index);
00127 }
00128 
00129 const char *rlDataAcquisitionProvider::nextItem()
00130 {
00131   int value_offset, delta_index;
00132   const char *cptr;
00133 
00134   current_item++;
00135   if(shmheader == NULL)                   return NULL;
00136   if(shmheader->numItems <= 0)            return NULL;
00137   if(strcmp(shmheader->ident,"daq") != 0) return NULL;
00138   if(shmheader->numItems <= current_item) return NULL;
00139 
00140   value_offset = shmheader->maxItemNameLength + 1;
00141   delta_index  = value_offset + shmheader->maxNameLength + 1;
00142 
00143   cptr = shmvalues;
00144   return cptr + (current_item * delta_index);
00145 }
00146 
00147 const char *rlDataAcquisitionProvider::stringValue(const char *variable)
00148 {
00149   int value_offset, delta_index, nmax, i;
00150   const char *cptr;
00151 
00152   if(shmheader == NULL) return "DAQ_ERROR";
00153   if(strcmp(shmheader->ident,"daq") != 0) return "DAQ_ERROR";
00154   value_offset = shmheader->maxItemNameLength + 1;
00155   delta_index  = value_offset + shmheader->maxNameLength + 1;
00156   nmax         = shmheader->numItems;
00157 
00158   cptr = shmvalues;
00159   for(i=0; i<nmax; i++)
00160   {
00161     if(strcmp(cptr,variable) == 0)
00162     {
00163       return cptr + value_offset;
00164     }
00165     cptr += delta_index;
00166   }
00167 
00168   return "DAQ_ERROR";
00169 }
00170 
00171 int rlDataAcquisitionProvider::intValue(const char *variable)
00172 {
00173   const char *cptr;
00174   int ret;
00175 
00176   cptr = stringValue(variable);
00177   if(isdigit(*cptr))
00178   {
00179     ret = DAQ_PROVIDER_ERROR;
00180     sscanf(cptr,"%d",&ret);
00181     return ret;
00182   }
00183   return DAQ_PROVIDER_ERROR;
00184 }
00185 
00186 float rlDataAcquisitionProvider::floatValue(const char *variable)
00187 {
00188   const char *cptr;
00189   float ret;
00190 
00191   cptr = stringValue(variable);
00192   if(isdigit(*cptr) || *cptr == '-')
00193   {
00194     ret = DAQ_PROVIDER_ERROR;
00195     sscanf(cptr,"%f",&ret);
00196     return ret;
00197   }
00198   return DAQ_PROVIDER_ERROR;
00199 }
00200 
00201 int rlDataAcquisitionProvider::setStringValue(const char *variable, const char *value)
00202 {
00203   if(variable == NULL || value == NULL || shmheader == NULL) return DAQ_PROVIDER_ERROR;
00204   if(strcmp(shmheader->ident,"daq") != 0)                    return DAQ_PROVIDER_ERROR;
00205 
00206   int value_offset, delta_index, nmax, i;
00207   char *cptr;
00208 
00209   if((int) strlen(variable) > shmheader->maxItemNameLength)  return DAQ_PROVIDER_ERROR;
00210 
00211   int len = strlen(value);
00212   char *val = new char[len+1];
00213   strcpy(val,value);
00214   if(len > shmheader->maxNameLength) val[shmheader->maxNameLength] = '\0';
00215  
00216   value_offset = shmheader->maxItemNameLength + 1;
00217   delta_index  = value_offset + shmheader->maxNameLength + 1;
00218   nmax         = shmheader->numItems;
00219 
00220   cptr = shmvalues;
00221   for(i=0; i<nmax; i++)
00222   {
00223     if(strcmp(cptr,variable) == 0)
00224     {
00225       strcpy(cptr + value_offset, val); // update existing value
00226       delete [] val;
00227       return 0;
00228     }
00229     cptr += delta_index;
00230   }
00231 
00232   if(allow_add_values == 1) // insert a new value
00233   {
00234     if(sharedMemorySize > ( (long) sizeof(SHM_HEADER) + (i*delta_index) + delta_index ) )
00235     {
00236       strcpy(cptr, variable);           // insert the value
00237       strcpy(cptr + value_offset, val); // insert the value
00238       delete [] val;
00239       shmheader->numItems += 1;
00240       return 0;
00241     }
00242     else
00243     {
00244       ::printf("rlDataAcquisitionProvider: ERROR shared memory too small to add variable=%s val=%s please increase shared memory size", variable, val);
00245     }
00246   }
00247 
00248   delete [] val;
00249   return DAQ_PROVIDER_ERROR;
00250 }
00251 
00252 int rlDataAcquisitionProvider::setIntValue(const char *variable, int value)
00253 {
00254   char cval[128];
00255 
00256   sprintf(cval,"%d",value);
00257   return setStringValue(variable,cval);
00258 }
00259 
00260 int rlDataAcquisitionProvider::setFloatValue(const char *variable, float value)
00261 {
00262   char cval[128];
00263 
00264   sprintf(cval,"%f",value);
00265   return setStringValue(variable,cval);
00266 }
00267 
00268 int rlDataAcquisitionProvider::readErrorCount()
00269 {
00270   if(shmheader == NULL) return DAQ_PROVIDER_ERROR;
00271   return shmheader->readErrorCount;
00272 }
00273 
00274 int rlDataAcquisitionProvider::writeErrorCount()
00275 {
00276   if(shmheader == NULL) return DAQ_PROVIDER_ERROR;
00277   return shmheader->writeErrorCount;
00278 }
00279 
00280 int rlDataAcquisitionProvider::lifeCounter()
00281 {
00282   if(shmheader == NULL) return DAQ_PROVIDER_ERROR;
00283   return shmheader->lifeCounter;
00284 }
00285 
00286 int rlDataAcquisitionProvider::setReadErrorCount(int count)
00287 {
00288   if(shmheader == NULL) return DAQ_PROVIDER_ERROR;
00289   shmheader->readErrorCount = count;
00290   return 0;
00291 }
00292 
00293 int rlDataAcquisitionProvider::setWriteErrorCount(int count)
00294 {
00295   if(shmheader == NULL) return DAQ_PROVIDER_ERROR;
00296   shmheader->writeErrorCount = count;
00297   return 0;
00298 }
00299 
00300 int rlDataAcquisitionProvider::setLifeCounter(int count)
00301 {
00302   if(shmheader == NULL) return DAQ_PROVIDER_ERROR;
00303   shmheader->lifeCounter = count;
00304   return 0;
00305 }
00306 
00307 int rlDataAcquisitionProvider::shmStatus()
00308 {
00309   if(shmheader == NULL) return DAQ_PROVIDER_ERROR;
00310   if(shm->status == rlSharedMemory::OK) return 0;
00311   return DAQ_PROVIDER_ERROR;
00312 }
00313 
00314 int rlDataAcquisitionProvider::setAllowAddValues(int allow, int maxItemNameLength)
00315 {
00316   if(allow == 0) allow_add_values = 0;
00317   else           allow_add_values = 1;
00318   if(maxItemNameLength > 0) shmheader->maxItemNameLength = maxItemNameLength;
00319   return 0;
00320 }
00321 
00322