|
rllib
1
|
00001 /*************************************************************************** 00002 rlppiclient.cpp - description 00003 ------------------- 00004 begin : Mon Jul 12 2004 00005 copyright : (C) 2004 by Rainer Lehrig 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 "rlppiclient.h" 00017 #include <stdio.h> 00018 #include <string.h> 00019 #define BUFSIZE 2048 00020 00021 typedef union 00022 { 00023 unsigned char b[4]; 00024 unsigned short us[2]; 00025 short s[2]; 00026 unsigned int ui; 00027 int i; 00028 float f; 00029 }SWAP; 00030 00031 rlPPIClient::rlPPIClient(const char *mbxname, const char *shmname, int shmsize, int _have_to_swap) 00032 :rlMailbox(mbxname), rlSharedMemory(shmname, shmsize) 00033 { 00034 have_to_swap = _have_to_swap; 00035 } 00036 00037 rlPPIClient::~rlPPIClient() 00038 { 00039 } 00040 00041 int rlPPIClient::write(int slave, int area, int dbnum, int start, int len, const unsigned char *data) 00042 { 00043 unsigned char buf[BUFSIZE+8]; 00044 00045 if(len < 0) return -1; 00046 if(len > BUFSIZE) return -1; 00047 if(slave < 0) return -1; 00048 if(slave > 31) return -1; 00049 00050 buf[0] = slave; 00051 buf[1] = area; 00052 buf[2] = dbnum / 256; 00053 buf[3] = dbnum & 0x0ff; 00054 buf[4] = start / 256; 00055 buf[5] = start & 0x0ff; 00056 buf[6] = len / 256; 00057 buf[7] = len & 0x0ff; 00058 memcpy(&buf[8],data,len); 00059 rlMailbox::write((void *) buf,len+8); 00060 return 0; 00061 } 00062 00063 int rlPPIClient::writeFloat(int slave, int area, int dbnum, int start, int len, const float *val) 00064 { 00065 SWAP swap; 00066 int i; 00067 unsigned char buf[BUFSIZE]; 00068 00069 if(len < 0) return -1; 00070 if(len > BUFSIZE) return -1; 00071 if(slave < 0) return -1; 00072 if(slave > 31) return -1; 00073 if(have_to_swap == 1) 00074 { 00075 for(i=0; i<len; i+=4) 00076 { 00077 swap.f = val[i/4]; 00078 buf[i+3] = swap.b[0]; 00079 buf[i+2] = swap.b[1]; 00080 buf[i+1] = swap.b[2]; 00081 buf[i] = swap.b[3]; 00082 } 00083 } 00084 else 00085 { 00086 for(i=0; i<len; i+=4) 00087 { 00088 swap.f = val[i/4]; 00089 buf[i] = swap.b[0]; 00090 buf[i+1] = swap.b[1]; 00091 buf[i+2] = swap.b[2]; 00092 buf[i+3] = swap.b[3]; 00093 } 00094 } 00095 return write(slave,area,dbnum,start,len,buf); 00096 } 00097 00098 int rlPPIClient::writeDword(int slave, int area, int dbnum, int start, int len, const int *val) 00099 { 00100 SWAP swap; 00101 int i; 00102 unsigned char buf[BUFSIZE]; 00103 00104 if(len < 0) return -1; 00105 if(len > BUFSIZE) return -1; 00106 if(slave < 0) return -1; 00107 if(slave > 31) return -1; 00108 if(have_to_swap == 1) 00109 { 00110 for(i=0; i<len; i+=4) 00111 { 00112 swap.i = val[i/4]; 00113 buf[i+3] = swap.b[0]; 00114 buf[i+2] = swap.b[1]; 00115 buf[i+1] = swap.b[2]; 00116 buf[i] = swap.b[3]; 00117 } 00118 } 00119 else 00120 { 00121 for(i=0; i<len; i+=4) 00122 { 00123 swap.i = val[i/4]; 00124 buf[i] = swap.b[0]; 00125 buf[i+1] = swap.b[1]; 00126 buf[i+2] = swap.b[2]; 00127 buf[i+3] = swap.b[3]; 00128 } 00129 } 00130 return write(slave,area,dbnum,start,len,buf); 00131 } 00132 00133 int rlPPIClient::writeShort(int slave, int area, int dbnum, int start, int len, const short *val) 00134 { 00135 SWAP swap; 00136 int i; 00137 unsigned char buf[BUFSIZE]; 00138 00139 if(len < 0) return -1; 00140 if(len > BUFSIZE) return -1; 00141 if(slave < 0) return -1; 00142 if(slave > 31) return -1; 00143 if(have_to_swap == 1) 00144 { 00145 for(i=0; i<len; i+=2) 00146 { 00147 swap.s[0] = val[i/2]; 00148 buf[i+1] = swap.b[0]; 00149 buf[i] = swap.b[1]; 00150 } 00151 } 00152 else 00153 { 00154 for(i=0; i<len; i+=2) 00155 { 00156 swap.s[0] = val[i/2]; 00157 buf[i] = swap.b[0]; 00158 buf[i+1] = swap.b[1]; 00159 } 00160 } 00161 return write(slave,area,dbnum,start,len,buf); 00162 } 00163 00164 int rlPPIClient::writeUDword(int slave, int area, int dbnum, int start, int len, const unsigned int *val) 00165 { 00166 SWAP swap; 00167 int i; 00168 unsigned char buf[BUFSIZE]; 00169 00170 if(len < 0) return -1; 00171 if(len > BUFSIZE) return -1; 00172 if(slave < 0) return -1; 00173 if(slave > 31) return -1; 00174 if(have_to_swap == 1) 00175 { 00176 for(i=0; i<len; i+=4) 00177 { 00178 swap.ui = val[i/4]; 00179 buf[i+3] = swap.b[0]; 00180 buf[i+2] = swap.b[1]; 00181 buf[i+1] = swap.b[2]; 00182 buf[i] = swap.b[3]; 00183 } 00184 } 00185 else 00186 { 00187 for(i=0; i<len; i+=4) 00188 { 00189 swap.ui = val[i/4]; 00190 buf[i] = swap.b[0]; 00191 buf[i+1] = swap.b[1]; 00192 buf[i+2] = swap.b[2]; 00193 buf[i+3] = swap.b[3]; 00194 } 00195 } 00196 return write(slave,area,dbnum,start,len,buf); 00197 } 00198 00199 int rlPPIClient::writeUShort(int slave, int area, int dbnum, int start, int len, const unsigned short *val) 00200 { 00201 SWAP swap; 00202 int i; 00203 unsigned char buf[BUFSIZE]; 00204 00205 if(len < 0) return -1; 00206 if(len > BUFSIZE) return -1; 00207 if(slave < 0) return -1; 00208 if(slave > 31) return -1; 00209 if(have_to_swap == 1) 00210 { 00211 for(i=0; i<len; i+=2) 00212 { 00213 swap.us[0] = val[i/2]; 00214 buf[i+1] = swap.b[0]; 00215 buf[i] = swap.b[1]; 00216 } 00217 } 00218 else 00219 { 00220 for(i=0; i<len; i+=2) 00221 { 00222 swap.us[0] = val[i/2]; 00223 buf[i] = swap.b[0]; 00224 buf[i+1] = swap.b[1]; 00225 } 00226 } 00227 return write(slave,area,dbnum,start,len,buf); 00228 } 00229 00230 int rlPPIClient::read(int offset, int len) 00231 { 00232 return rlSharedMemory::read(offset,buf,len); 00233 } 00234 00235 float rlPPIClient::Float(int index) 00236 { 00237 SWAP swap; 00238 if(index*4+4 > (int) BUFSIZE) return 0.0f; 00239 if(have_to_swap == 1) 00240 { 00241 swap.b[0] = buf[4*index+3]; 00242 swap.b[1] = buf[4*index+2]; 00243 swap.b[2] = buf[4*index+1]; 00244 swap.b[3] = buf[4*index]; 00245 } 00246 else 00247 { 00248 swap.b[0] = buf[4*index]; 00249 swap.b[1] = buf[4*index+1]; 00250 swap.b[2] = buf[4*index+2]; 00251 swap.b[3] = buf[4*index+3]; 00252 } 00253 return swap.f; 00254 } 00255 00256 int rlPPIClient::Dword(int index) 00257 { 00258 SWAP swap; 00259 if(index*4+4 > (int) BUFSIZE) return 0; 00260 if(have_to_swap == 1) 00261 { 00262 swap.b[0] = buf[4*index+3]; 00263 swap.b[1] = buf[4*index+2]; 00264 swap.b[2] = buf[4*index+1]; 00265 swap.b[3] = buf[4*index]; 00266 } 00267 else 00268 { 00269 swap.b[0] = buf[4*index]; 00270 swap.b[1] = buf[4*index+1]; 00271 swap.b[2] = buf[4*index+2]; 00272 swap.b[3] = buf[4*index+3]; 00273 } 00274 return swap.i; 00275 } 00276 00277 int rlPPIClient::Short(int index) 00278 { 00279 SWAP swap; 00280 if(index*2+2 > (int) BUFSIZE) return 0; 00281 if(have_to_swap == 1) 00282 { 00283 swap.b[0] = buf[2*index+1]; 00284 swap.b[1] = buf[2*index]; 00285 } 00286 else 00287 { 00288 swap.b[0] = buf[4*index]; 00289 swap.b[1] = buf[4*index+1]; 00290 } 00291 return swap.s[0]; 00292 } 00293 00294 unsigned int rlPPIClient::UDword(int index) 00295 { 00296 SWAP swap; 00297 if(index*4+4 > (int) BUFSIZE) return 0; 00298 if(have_to_swap == 1) 00299 { 00300 swap.b[0] = buf[4*index+3]; 00301 swap.b[1] = buf[4*index+2]; 00302 swap.b[2] = buf[4*index+1]; 00303 swap.b[3] = buf[4*index]; 00304 } 00305 else 00306 { 00307 swap.b[0] = buf[4*index]; 00308 swap.b[1] = buf[4*index+1]; 00309 swap.b[2] = buf[4*index+2]; 00310 swap.b[3] = buf[4*index+3]; 00311 } 00312 return swap.ui; 00313 } 00314 00315 unsigned int rlPPIClient::UShort(int index) 00316 { 00317 SWAP swap; 00318 if(index*2+4 > (int) BUFSIZE) return 0; 00319 if(have_to_swap == 1) 00320 { 00321 swap.b[0] = buf[2*index+1]; 00322 swap.b[1] = buf[2*index]; 00323 } 00324 else 00325 { 00326 swap.b[0] = buf[4*index]; 00327 swap.b[1] = buf[4*index+1]; 00328 } 00329 return swap.us[0]; 00330 }
1.7.5.1