rllib  1
rlppiclient.cpp
Go to the documentation of this file.
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 }
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines