UniSet  1.7.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( 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             
00070             F2mem raw;
00071     };
00072     // --------------------------------------------------------------------------
00073     class F2r:
00074         public F2
00075     {
00076         public:
00077         
00078             // ------------------------------------------
00079             // конструкторы на разные случаи...
00080             F2r(){}
00081             
00082             F2r( float f ):F2(f){}
00083             F2r( const ModbusRTU::ModbusData* data, int size ):F2(data,size)
00084             {
00085                 std::swap(raw.v[0],raw.v[1]);
00086             }
00087 
00088             ~F2r(){}
00089     };
00090     // --------------------------------------------------------------------------
00091     class F4
00092     {
00093         public:
00094             // ------------------------------------------
00095             static const int f4Size=4;
00097             typedef union
00098             {
00099                 unsigned short v[f4Size];
00100                 float val; // 
00101             } F4mem;
00102             // ------------------------------------------
00103             // конструкторы на разные случаи...
00104             F4(){ memset(raw.v,0,sizeof(raw.v)); }
00105             
00106             F4( float f ){ raw.val = f; }
00107             F4( const ModbusRTU::ModbusData* data, int size )
00108             {
00109                 for( int i=0; i<wsize() && i<size; i++ )
00110                     raw.v[i] = data[i];
00111             }
00112 
00113             ~F4(){}
00114             // ------------------------------------------
00116             static int wsize(){ return f4Size; }
00118             static VType type(){ return vtF4; }
00119             // ------------------------------------------
00120             operator float(){ return raw.val; }
00121             operator long(){ return lroundf(raw.val); }
00122             
00123             F4mem raw;
00124     };
00125     // --------------------------------------------------------------------------
00126     class Byte
00127     {
00128         public:
00129         
00130             static const int bsize = 2;
00131         
00132             // ------------------------------------------
00134             typedef union
00135             {
00136                 unsigned short w;
00137                 unsigned char b[bsize];
00138             } Bytemem;
00139             // ------------------------------------------
00140             // конструкторы на разные случаи...
00141             Byte(){ raw.w = 0; }
00142             
00143             Byte( unsigned char b1, unsigned char b2 ){ raw.b[0]=b1; raw.b[1]=b2; }
00144             Byte( const long val )
00145             {
00146                 raw.w = val;
00147             }
00148             
00149             Byte( const ModbusRTU::ModbusData dat )
00150             {
00151                     raw.w = dat;
00152             }
00153 
00154             ~Byte(){}
00155             // ------------------------------------------
00157             static int wsize(){ return 1; }
00159             static VType type(){ return vtByte; }
00160             // ------------------------------------------
00161             operator long(){ return lroundf(raw.w); }
00162 
00163             unsigned char operator[]( const int i ){ return raw.b[i]; }
00164 
00165             Bytemem raw;
00166     };
00167     // --------------------------------------------------------------------------
00168     class Unsigned
00169     {
00170         public:
00171 
00172             // ------------------------------------------
00173             // конструкторы на разные случаи...
00174             Unsigned():raw(0){}
00175             
00176             Unsigned( const long val )
00177             {
00178                 raw = val;
00179             }
00180             
00181             Unsigned( const ModbusRTU::ModbusData dat )
00182             {
00183                 raw = dat;
00184             }
00185 
00186             ~Unsigned(){}
00187             // ------------------------------------------
00189             static int wsize(){ return sizeof(unsigned short); }
00191             static VType type(){ return vtUnsigned; }
00192             // ------------------------------------------
00193             operator long(){ return raw; }
00194 
00195             unsigned short raw;
00196     };
00197     // --------------------------------------------------------------------------
00198     class Signed
00199     {
00200         public:
00201 
00202             // ------------------------------------------
00203             // конструкторы на разные случаи...
00204             Signed():raw(0){}
00205             
00206             Signed( const long val )
00207             {
00208                 raw = val;
00209             }
00210             
00211             Signed( const ModbusRTU::ModbusData dat )
00212             {
00213                 raw = dat;
00214             }
00215 
00216             ~Signed(){}
00217             // ------------------------------------------
00219             static int wsize(){ return sizeof(signed short); }
00221             static VType type(){ return vtSigned; }
00222             // ------------------------------------------
00223             operator long(){ return raw; }
00224 
00225             signed short raw;
00226     };
00227     // --------------------------------------------------------------------------
00228     class I2
00229     {
00230         public:
00231         
00232             // ------------------------------------------
00233             static const int i2Size=2;
00235             typedef union
00236             {
00237                 unsigned short v[i2Size];
00238                 int val; // 
00239             } I2mem;
00240             // ------------------------------------------
00241             // конструкторы на разные случаи...
00242             I2(){ memset(raw.v,0,sizeof(raw.v)); }
00243             
00244             I2( int v ){ raw.val = v; }
00245             I2( const ModbusRTU::ModbusData* data, int size )
00246             {
00247                 for( int i=0; i<wsize() && i<size; i++ )
00248                     raw.v[i] = data[i];
00249             }
00250 
00251             ~I2(){}
00252             // ------------------------------------------
00254             static int wsize(){ return i2Size; }
00256             static VType type(){ return vtI2; }
00257             // ------------------------------------------
00258             operator int(){ return raw.val; }
00259             
00260             I2mem raw;
00261     };
00262     // --------------------------------------------------------------------------
00263     class I2r:
00264         public I2
00265     {
00266         public:
00267             I2r(){}
00268             
00269             I2r( int v ):I2(v){}
00270             I2r( const ModbusRTU::ModbusData* data, int size ):I2(data,size)
00271             {
00272                 std::swap(raw.v[0],raw.v[1]);
00273             }
00274 
00275             ~I2r(){}
00276     };
00277     // --------------------------------------------------------------------------
00278     class U2
00279     {
00280         public:
00281         
00282             // ------------------------------------------
00283             static const int u2Size=2;
00285             typedef union
00286             {
00287                 unsigned short v[u2Size];
00288                 unsigned int val; // 
00289             } U2mem;
00290             // ------------------------------------------
00291             // конструкторы на разные случаи...
00292             U2(){ memset(raw.v,0,sizeof(raw.v)); }
00293             
00294             U2( unsigned int v ){ raw.val = v; }
00295             U2( const ModbusRTU::ModbusData* data, int size )
00296             {
00297                 for( int i=0; i<wsize() && i<size; i++ )
00298                     raw.v[i] = data[i];
00299             }
00300 
00301             ~U2(){}
00302             // ------------------------------------------
00304             static int wsize(){ return u2Size; }
00306             static VType type(){ return vtU2; }
00307             // ------------------------------------------
00308             operator unsigned int(){ return raw.val; }
00309             
00310             U2mem raw;
00311     };
00312     // --------------------------------------------------------------------------
00313     class U2r:
00314         public U2
00315     {
00316         public:
00317             U2r(){}
00318             
00319             U2r( int v ):U2(v){}
00320             U2r( const ModbusRTU::ModbusData* data, int size ):U2(data,size)
00321             {
00322                 std::swap(raw.v[0],raw.v[1]);
00323             }
00324 
00325             ~U2r(){}
00326     };
00327     // --------------------------------------------------------------------------
00328 
00329 } // end of namespace VTypes
00330 // --------------------------------------------------------------------------
00331 #endif // _RTUTypes_H_
00332 // -----------------------------------------------------------------------------