UniSet  2.0.0
VTypes.h
00001 // --------------------------------------------------------------------------
00002 // --------------------------------------------------------------------------
00003 #ifndef _RTUTypes_H_
00004 #define _RTUTypes_H_
00005 // -----------------------------------------------------------------------------
00006 #include <string>
00007 #include <cmath>
00008 #include <cstring>
00009 #include <ostream>
00010 #include "modbus/ModbusTypes.h"
00011 // -----------------------------------------------------------------------------
00012 namespace VTypes
00013 {
00015         enum VType
00016         {
00017             vtUnknown,
00018             vtF2,        
00019             vtF2r,       
00020             vtF4,        
00021             vtByte,      
00022             vtUnsigned,  
00023             vtSigned,    
00024             vtI2,        
00025             vtI2r,       
00026             vtU2,        
00027             vtU2r        
00028         };
00029 
00030         std::ostream& operator<<( std::ostream& os, const VType& vt );
00031 
00032         // -------------------------------------------------------------------------
00033         std::string type2str( VType t );           
00034         VType str2type( const std::string& s );    
00035         int wsize( VType t );                      
00036     // -------------------------------------------------------------------------
00037     class F2
00038     {
00039         public:
00040 
00041             // ------------------------------------------
00042             static const int f2Size=2;
00044             typedef union
00045             {
00046                 unsigned short v[f2Size];
00047                 float val; //
00048             } F2mem;
00049             // ------------------------------------------
00050             // конструкторы на разные случаи...
00051             F2(){ memset(raw.v,0,sizeof(raw.v)); }
00052 
00053             F2( const float& f ){ raw.val = f; }
00054             F2( const ModbusRTU::ModbusData* data, int size )
00055             {
00056                 for( int i=0; i<wsize() && i<size; i++ )
00057                     raw.v[i] = data[i];
00058             }
00059 
00060             ~F2(){}
00061             // ------------------------------------------
00063             static int wsize(){ return f2Size; }
00065             static VType type(){ return vtF2; }
00066             // ------------------------------------------
00067             operator float(){ return raw.val; }
00068             operator long(){ return lroundf(raw.val); }
00069             operator int(){ return lroundf(raw.val); }
00070 
00071             F2mem raw;
00072     };
00073     // --------------------------------------------------------------------------
00074     class F2r:
00075         public F2
00076     {
00077         public:
00078 
00079             // ------------------------------------------
00080             // конструкторы на разные случаи...
00081             F2r(){}
00082 
00083             F2r( const float& f ):F2(f)
00084             {
00085                 raw_backorder = raw;
00086                 std::swap(raw_backorder.v[0],raw_backorder.v[1]);
00087             }
00088             F2r( const ModbusRTU::ModbusData* data, int size ):F2(data,size)
00089             {
00090                 // принимаем в обратном порядке.. поэтому переворачиваем raw
00091                 raw_backorder = raw;
00092                 std::swap(raw.v[0],raw.v[1]);
00093             }
00094 
00095             ~F2r(){}
00096 
00097            F2mem raw_backorder;
00098     };
00099     // --------------------------------------------------------------------------
00100     class F4
00101     {
00102         public:
00103             // ------------------------------------------
00104             static const int f4Size=4;
00106             typedef union
00107             {
00108                 unsigned short v[f4Size];
00109                 float val; //
00110             } F4mem;
00111             // ------------------------------------------
00112             // конструкторы на разные случаи...
00113             F4(){ memset(raw.v,0,sizeof(raw.v)); }
00114 
00115             F4( const float& f ){ raw.val = f; }
00116             F4( const ModbusRTU::ModbusData* data, int size )
00117             {
00118                 for( int i=0; i<wsize() && i<size; i++ )
00119                     raw.v[i] = data[i];
00120             }
00121 
00122             ~F4(){}
00123             // ------------------------------------------
00125             static int wsize(){ return f4Size; }
00127             static VType type(){ return vtF4; }
00128             // ------------------------------------------
00129             operator float(){ return raw.val; }
00130             operator long(){ return lroundf(raw.val); }
00131 
00132             F4mem raw;
00133     };
00134     // --------------------------------------------------------------------------
00135     class Byte
00136     {
00137         public:
00138 
00139             static const int bsize = 2;
00140 
00141             // ------------------------------------------
00143             typedef union
00144             {
00145                 unsigned short w;
00146                 unsigned char b[bsize];
00147             } Bytemem;
00148             // ------------------------------------------
00149             // конструкторы на разные случаи...
00150             Byte(){ raw.w = 0; }
00151 
00152             Byte( unsigned char b1, unsigned char b2 ){ raw.b[0]=b1; raw.b[1]=b2; }
00153             Byte( const long& val )
00154             {
00155                 raw.w = val;
00156             }
00157 
00158             Byte( const ModbusRTU::ModbusData dat )
00159             {
00160                     raw.w = dat;
00161             }
00162 
00163             ~Byte(){}
00164             // ------------------------------------------
00166             static int wsize(){ return 1; }
00168             static VType type(){ return vtByte; }
00169             // ------------------------------------------
00170             operator long(){ return lroundf(raw.w); }
00171             operator unsigned short(){ return raw.w; }
00172 
00173             unsigned char operator[]( const int i ){ return raw.b[i]; }
00174 
00175             Bytemem raw;
00176     };
00177     // --------------------------------------------------------------------------
00178     class Unsigned
00179     {
00180         public:
00181 
00182             // ------------------------------------------
00183             // конструкторы на разные случаи...
00184             Unsigned():raw(0){}
00185 
00186             Unsigned( const long& val )
00187             {
00188                 raw = val;
00189             }
00190 
00191             Unsigned( const ModbusRTU::ModbusData dat )
00192             {
00193                 raw = dat;
00194             }
00195 
00196             ~Unsigned(){}
00197             // ------------------------------------------
00199             static int wsize(){ return sizeof(unsigned short); }
00201             static VType type(){ return vtUnsigned; }
00202             // ------------------------------------------
00203             operator long(){ return raw; }
00204 
00205             unsigned short raw;
00206     };
00207     // --------------------------------------------------------------------------
00208     class Signed
00209     {
00210         public:
00211 
00212             // ------------------------------------------
00213             // конструкторы на разные случаи...
00214             Signed():raw(0){}
00215 
00216             Signed( const long& val )
00217             {
00218                 raw = val;
00219             }
00220 
00221             Signed( const ModbusRTU::ModbusData dat )
00222             {
00223                 raw = dat;
00224             }
00225 
00226             ~Signed(){}
00227             // ------------------------------------------
00229             static int wsize(){ return sizeof(signed short); }
00231             static VType type(){ return vtSigned; }
00232             // ------------------------------------------
00233             operator long(){ return raw; }
00234 
00235             signed short raw;
00236     };
00237     // --------------------------------------------------------------------------
00238     class I2
00239     {
00240         public:
00241 
00242             // ------------------------------------------
00243             static const int i2Size=2;
00245             typedef union
00246             {
00247                 unsigned short v[i2Size];
00248                 int val; //
00249             } I2mem;
00250             // ------------------------------------------
00251             // конструкторы на разные случаи...
00252             I2(){ memset(raw.v,0,sizeof(raw.v)); }
00253 
00254             I2( int v ){ raw.val = v; }
00255             I2( const ModbusRTU::ModbusData* data, int size )
00256             {
00257                 for( int i=0; i<wsize() && i<size; i++ )
00258                     raw.v[i] = data[i];
00259             }
00260 
00261             ~I2(){}
00262             // ------------------------------------------
00264             static int wsize(){ return i2Size; }
00266             static VType type(){ return vtI2; }
00267             // ------------------------------------------
00268             operator int(){ return raw.val; }
00269 
00270             I2mem raw;
00271     };
00272     // --------------------------------------------------------------------------
00273     class I2r:
00274         public I2
00275     {
00276         public:
00277             I2r(){}
00278 
00279             I2r( const int v ):I2(v)
00280             {
00281                 raw_backorder = raw;
00282                 std::swap(raw_backorder.v[0],raw_backorder.v[1]);
00283             }
00284             I2r( const ModbusRTU::ModbusData* data, int size ):I2(data,size)
00285             {
00286                 // принимаем в обратном порядке.. поэтому переворачиваем raw
00287                 raw_backorder = raw;
00288                 std::swap(raw.v[0],raw.v[1]);
00289             }
00290 
00291             ~I2r(){}
00292 
00293             I2mem raw_backorder;
00294     };
00295     // --------------------------------------------------------------------------
00296     class U2
00297     {
00298         public:
00299 
00300             // ------------------------------------------
00301             static const int u2Size=2;
00303             typedef union
00304             {
00305                 unsigned short v[u2Size];
00306                 unsigned int val; //
00307             } U2mem;
00308             // ------------------------------------------
00309             // конструкторы на разные случаи...
00310             U2(){ memset(raw.v,0,sizeof(raw.v)); }
00311 
00312             U2( unsigned int v ){ raw.val = v; }
00313             U2( const ModbusRTU::ModbusData* data, int size )
00314             {
00315                 for( int i=0; i<wsize() && i<size; i++ )
00316                     raw.v[i] = data[i];
00317             }
00318 
00319             ~U2(){}
00320             // ------------------------------------------
00322             static int wsize(){ return u2Size; }
00324             static VType type(){ return vtU2; }
00325             // ------------------------------------------
00326             operator unsigned int(){ return raw.val; }
00327 
00328             U2mem raw;
00329     };
00330     // --------------------------------------------------------------------------
00331     class U2r:
00332         public U2
00333     {
00334         public:
00335             U2r(){}
00336 
00337             U2r( int v ):U2(v)
00338             {
00339                 raw_backorder = raw;
00340                 std::swap(raw_backorder.v[0],raw_backorder.v[1]);
00341             }
00342             U2r( const ModbusRTU::ModbusData* data, int size ):U2(data,size)
00343             {
00344                 // принимаем в обратном порядке.. поэтому переворачиваем raw
00345                 raw_backorder = raw;
00346                 std::swap(raw.v[0],raw.v[1]);
00347             }
00348 
00349             ~U2r(){}
00350 
00351             U2mem raw_backorder;
00352     };
00353     // --------------------------------------------------------------------------
00354 
00355 } // end of namespace VTypes
00356 // --------------------------------------------------------------------------
00357 #endif // _RTUTypes_H_
00358 // -----------------------------------------------------------------------------