UniSet  2.2.1
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()
00052             {
00053                 memset(raw.v, 0, sizeof(raw.v));
00054             }
00055 
00056             F2( const float& f )
00057             {
00058                 raw.val = f;
00059             }
00060             F2( const ModbusRTU::ModbusData* data, int size )
00061             {
00062                 for( int i = 0; i < wsize() && i < size; i++ )
00063                     raw.v[i] = data[i];
00064             }
00065 
00066             ~F2() {}
00067             // ------------------------------------------
00069             static int wsize()
00070             {
00071                 return f2Size;
00072             }
00074             static VType type()
00075             {
00076                 return vtF2;
00077             }
00078             // ------------------------------------------
00079             operator float()
00080             {
00081                 return raw.val;
00082             }
00083             operator long()
00084             {
00085                 return lroundf(raw.val);
00086             }
00087             operator int()
00088             {
00089                 return lroundf(raw.val);
00090             }
00091 
00092             F2mem raw;
00093     };
00094     // --------------------------------------------------------------------------
00095     class F2r:
00096         public F2
00097     {
00098         public:
00099 
00100             // ------------------------------------------
00101             // конструкторы на разные случаи...
00102             F2r() {}
00103 
00104             F2r( const float& f ): F2(f)
00105             {
00106                 raw_backorder = raw;
00107                 std::swap(raw_backorder.v[0], raw_backorder.v[1]);
00108             }
00109             F2r( const ModbusRTU::ModbusData* data, int size ): F2(data, size)
00110             {
00111                 // принимаем в обратном порядке.. поэтому переворачиваем raw
00112                 raw_backorder = raw;
00113                 std::swap(raw.v[0], raw.v[1]);
00114             }
00115 
00116             ~F2r() {}
00117 
00118             F2mem raw_backorder;
00119     };
00120     // --------------------------------------------------------------------------
00121     class F4
00122     {
00123         public:
00124             // ------------------------------------------
00125             static const int f4Size = 4;
00127             typedef union
00128             {
00129                 unsigned short v[f4Size];
00130                 float val; //
00131             } F4mem;
00132             // ------------------------------------------
00133             // конструкторы на разные случаи...
00134             F4()
00135             {
00136                 memset(raw.v, 0, sizeof(raw.v));
00137             }
00138 
00139             F4( const float& f )
00140             {
00141                 raw.val = f;
00142             }
00143             F4( const ModbusRTU::ModbusData* data, int size )
00144             {
00145                 for( int i = 0; i < wsize() && i < size; i++ )
00146                     raw.v[i] = data[i];
00147             }
00148 
00149             ~F4() {}
00150             // ------------------------------------------
00152             static int wsize()
00153             {
00154                 return f4Size;
00155             }
00157             static VType type()
00158             {
00159                 return vtF4;
00160             }
00161             // ------------------------------------------
00162             operator float()
00163             {
00164                 return raw.val;
00165             }
00166             operator long()
00167             {
00168                 return lroundf(raw.val);
00169             }
00170 
00171             F4mem raw;
00172     };
00173     // --------------------------------------------------------------------------
00174     class Byte
00175     {
00176         public:
00177 
00178             static const int bsize = 2;
00179 
00180             // ------------------------------------------
00182             typedef union
00183             {
00184                 unsigned short w;
00185                 unsigned char b[bsize];
00186             } Bytemem;
00187             // ------------------------------------------
00188             // конструкторы на разные случаи...
00189             Byte()
00190             {
00191                 raw.w = 0;
00192             }
00193 
00194             Byte( unsigned char b1, unsigned char b2 )
00195             {
00196                 raw.b[0] = b1;
00197                 raw.b[1] = b2;
00198             }
00199             Byte( const long& val )
00200             {
00201                 raw.w = val;
00202             }
00203 
00204             Byte( const ModbusRTU::ModbusData dat )
00205             {
00206                 raw.w = dat;
00207             }
00208 
00209             ~Byte() {}
00210             // ------------------------------------------
00212             static int wsize()
00213             {
00214                 return 1;
00215             }
00217             static VType type()
00218             {
00219                 return vtByte;
00220             }
00221             // ------------------------------------------
00222             operator long()
00223             {
00224                 return lroundf(raw.w);
00225             }
00226             operator unsigned short()
00227             {
00228                 return raw.w;
00229             }
00230 
00231             unsigned char operator[]( const int i )
00232             {
00233                 return raw.b[i];
00234             }
00235 
00236             Bytemem raw;
00237     };
00238     // --------------------------------------------------------------------------
00239     class Unsigned
00240     {
00241         public:
00242 
00243             // ------------------------------------------
00244             // конструкторы на разные случаи...
00245             Unsigned(): raw(0) {}
00246 
00247             Unsigned( const long& val )
00248             {
00249                 raw = val;
00250             }
00251 
00252             Unsigned( const ModbusRTU::ModbusData dat )
00253             {
00254                 raw = dat;
00255             }
00256 
00257             ~Unsigned() {}
00258             // ------------------------------------------
00260             static int wsize()
00261             {
00262                 return 1;
00263             }
00265             static VType type()
00266             {
00267                 return vtUnsigned;
00268             }
00269             // ------------------------------------------
00270             operator long()
00271             {
00272                 return raw;
00273             }
00274 
00275             unsigned short raw;
00276     };
00277     // --------------------------------------------------------------------------
00278     class Signed
00279     {
00280         public:
00281 
00282             // ------------------------------------------
00283             // конструкторы на разные случаи...
00284             Signed(): raw(0) {}
00285 
00286             Signed( const long& val )
00287             {
00288                 raw = val;
00289             }
00290 
00291             Signed( const ModbusRTU::ModbusData dat )
00292             {
00293                 raw = dat;
00294             }
00295 
00296             ~Signed() {}
00297             // ------------------------------------------
00299             static int wsize()
00300             {
00301                 return 1;
00302             }
00304             static VType type()
00305             {
00306                 return vtSigned;
00307             }
00308             // ------------------------------------------
00309             operator long()
00310             {
00311                 return raw;
00312             }
00313 
00314             signed short raw;
00315     };
00316     // --------------------------------------------------------------------------
00317     class I2
00318     {
00319         public:
00320 
00321             // ------------------------------------------
00322             static const int i2Size = 2;
00324             typedef union
00325             {
00326                 unsigned short v[i2Size];
00327                 int val; //
00328             } I2mem;
00329             // ------------------------------------------
00330             // конструкторы на разные случаи...
00331             I2()
00332             {
00333                 memset(raw.v, 0, sizeof(raw.v));
00334             }
00335 
00336             I2( int v )
00337             {
00338                 raw.val = v;
00339             }
00340             I2( const ModbusRTU::ModbusData* data, int size )
00341             {
00342                 for( int i = 0; i < wsize() && i < size; i++ )
00343                     raw.v[i] = data[i];
00344             }
00345 
00346             ~I2() {}
00347             // ------------------------------------------
00349             static int wsize()
00350             {
00351                 return i2Size;
00352             }
00354             static VType type()
00355             {
00356                 return vtI2;
00357             }
00358             // ------------------------------------------
00359             operator int()
00360             {
00361                 return raw.val;
00362             }
00363 
00364             I2mem raw;
00365     };
00366     // --------------------------------------------------------------------------
00367     class I2r:
00368         public I2
00369     {
00370         public:
00371             I2r() {}
00372 
00373             I2r( const int v ): I2(v)
00374             {
00375                 raw_backorder = raw;
00376                 std::swap(raw_backorder.v[0], raw_backorder.v[1]);
00377             }
00378             I2r( const ModbusRTU::ModbusData* data, int size ): I2(data, size)
00379             {
00380                 // принимаем в обратном порядке.. поэтому переворачиваем raw
00381                 raw_backorder = raw;
00382                 std::swap(raw.v[0], raw.v[1]);
00383             }
00384 
00385             ~I2r() {}
00386 
00387             I2mem raw_backorder;
00388     };
00389     // --------------------------------------------------------------------------
00390     class U2
00391     {
00392         public:
00393 
00394             // ------------------------------------------
00395             static const int u2Size = 2;
00397             typedef union
00398             {
00399                 unsigned short v[u2Size];
00400                 unsigned int val; //
00401             } U2mem;
00402             // ------------------------------------------
00403             // конструкторы на разные случаи...
00404             U2()
00405             {
00406                 memset(raw.v, 0, sizeof(raw.v));
00407             }
00408 
00409             U2( unsigned int v )
00410             {
00411                 raw.val = v;
00412             }
00413             U2( const ModbusRTU::ModbusData* data, int size )
00414             {
00415                 for( int i = 0; i < wsize() && i < size; i++ )
00416                     raw.v[i] = data[i];
00417             }
00418 
00419             ~U2() {}
00420             // ------------------------------------------
00422             static int wsize()
00423             {
00424                 return u2Size;
00425             }
00427             static VType type()
00428             {
00429                 return vtU2;
00430             }
00431             // ------------------------------------------
00432             operator unsigned int()
00433             {
00434                 return raw.val;
00435             }
00436 
00437             U2mem raw;
00438     };
00439     // --------------------------------------------------------------------------
00440     class U2r:
00441         public U2
00442     {
00443         public:
00444             U2r() {}
00445 
00446             U2r( int v ): U2(v)
00447             {
00448                 raw_backorder = raw;
00449                 std::swap(raw_backorder.v[0], raw_backorder.v[1]);
00450             }
00451             U2r( const ModbusRTU::ModbusData* data, int size ): U2(data, size)
00452             {
00453                 // принимаем в обратном порядке.. поэтому переворачиваем raw
00454                 raw_backorder = raw;
00455                 std::swap(raw.v[0], raw.v[1]);
00456             }
00457 
00458             ~U2r() {}
00459 
00460             U2mem raw_backorder;
00461     };
00462     // --------------------------------------------------------------------------
00463 
00464 } // end of namespace VTypes
00465 // --------------------------------------------------------------------------
00466 #endif // _RTUTypes_H_
00467 // -----------------------------------------------------------------------------