|
rllib
1
|
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
1.7.5.1