|
UniSet
2.2.1
|
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 // -----------------------------------------------------------------------------
1.7.6.1