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 }
00330
00331 #endif // _RTUTypes_H_
00332