|
UniSet
2.6.0
|
00001 /* 00002 * Copyright (c) 2015 Pavel Vainerman. 00003 * 00004 * This program is free software: you can redistribute it and/or modify 00005 * it under the terms of the GNU Lesser General Public License as 00006 * published by the Free Software Foundation, version 2.1. 00007 * 00008 * This program is distributed in the hope that it will be useful, but 00009 * WITHOUT ANY WARRANTY; without even the implied warranty of 00010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00011 * Lesser General Lesser Public License for more details. 00012 * 00013 * You should have received a copy of the GNU Lesser General Public License 00014 * along with this program. If not, see <http://www.gnu.org/licenses/>. 00015 */ 00016 // -------------------------------------------------------------------------- 00017 // -------------------------------------------------------------------------- 00018 #ifndef _RTUTypes_H_ 00019 #define _RTUTypes_H_ 00020 // ----------------------------------------------------------------------------- 00021 #include <string> 00022 #include <cmath> 00023 #include <cstring> 00024 #include <ostream> 00025 #include "modbus/ModbusTypes.h" 00026 // ----------------------------------------------------------------------------- 00027 namespace uniset 00028 { 00029 // ----------------------------------------------------------------------------- 00030 namespace VTypes 00031 { 00033 enum VType 00034 { 00035 vtUnknown, 00036 vtF2, 00037 vtF2r, 00038 vtF4, 00039 vtByte, 00040 vtUnsigned, 00041 vtSigned, 00042 vtI2, 00043 vtI2r, 00044 vtU2, 00045 vtU2r 00046 }; 00047 00048 std::ostream& operator<<( std::ostream& os, const VType& vt ); 00049 00050 // ------------------------------------------------------------------------- 00051 std::string type2str( VType t ) noexcept; 00052 VType str2type( const std::string& s ) noexcept; 00053 int wsize( VType t ) noexcept; 00054 // ------------------------------------------------------------------------- 00055 class F2 00056 { 00057 public: 00058 00059 // ------------------------------------------ 00060 static const size_t f2Size = 2; 00062 typedef union 00063 { 00064 unsigned short v[f2Size]; 00065 float val; // 00066 } F2mem; 00067 // ------------------------------------------ 00068 // конструкторы на разные случаи... 00069 F2() noexcept 00070 { 00071 memset(raw.v, 0, sizeof(raw.v)); 00072 } 00073 00074 F2( const float& f ) noexcept 00075 { 00076 raw.val = f; 00077 } 00078 F2( const ModbusRTU::ModbusData* data, size_t size ) noexcept 00079 { 00080 for( size_t i = 0; i < wsize() && i < size; i++ ) 00081 raw.v[i] = data[i]; 00082 } 00083 00084 ~F2() noexcept {} 00085 // ------------------------------------------ 00087 static size_t wsize() 00088 { 00089 return f2Size; 00090 } 00092 static VType type() 00093 { 00094 return vtF2; 00095 } 00096 // ------------------------------------------ 00097 operator float() 00098 { 00099 return raw.val; 00100 } 00101 operator long() 00102 { 00103 return lroundf(raw.val); 00104 } 00105 operator int() 00106 { 00107 return lroundf(raw.val); 00108 } 00109 00110 F2mem raw; 00111 }; 00112 // -------------------------------------------------------------------------- 00113 class F2r: 00114 public F2 00115 { 00116 public: 00117 00118 // ------------------------------------------ 00119 // конструкторы на разные случаи... 00120 F2r() noexcept 00121 { 00122 raw_backorder.val = 0; 00123 } 00124 00125 F2r( const float& f ) noexcept: F2(f) 00126 { 00127 raw_backorder = raw; 00128 std::swap(raw_backorder.v[0], raw_backorder.v[1]); 00129 } 00130 F2r( const ModbusRTU::ModbusData* data, size_t size ) noexcept: F2(data, size) 00131 { 00132 // принимаем в обратном порядке.. поэтому переворачиваем raw 00133 raw_backorder = raw; 00134 std::swap(raw.v[0], raw.v[1]); 00135 } 00136 00137 ~F2r() noexcept {} 00138 00139 F2mem raw_backorder; 00140 }; 00141 // -------------------------------------------------------------------------- 00142 class F4 00143 { 00144 public: 00145 // ------------------------------------------ 00146 static const size_t f4Size = 4; 00148 typedef union 00149 { 00150 unsigned short v[f4Size]; 00151 float val; // 00152 } F4mem; 00153 // ------------------------------------------ 00154 // конструкторы на разные случаи... 00155 F4() noexcept 00156 { 00157 memset(raw.v, 0, sizeof(raw.v)); 00158 } 00159 00160 F4( const float& f ) noexcept 00161 { 00162 raw.val = f; 00163 } 00164 F4( const ModbusRTU::ModbusData* data, size_t size ) noexcept 00165 { 00166 for( size_t i = 0; i < wsize() && i < size; i++ ) 00167 raw.v[i] = data[i]; 00168 } 00169 00170 ~F4() noexcept {} 00171 // ------------------------------------------ 00173 static size_t wsize() 00174 { 00175 return f4Size; 00176 } 00178 static VType type() 00179 { 00180 return vtF4; 00181 } 00182 // ------------------------------------------ 00183 operator float() 00184 { 00185 return raw.val; 00186 } 00187 operator long() 00188 { 00189 return lroundf(raw.val); 00190 } 00191 00192 F4mem raw; 00193 }; 00194 // -------------------------------------------------------------------------- 00195 class Byte 00196 { 00197 public: 00198 00199 static const size_t bsize = 2; 00200 00201 // ------------------------------------------ 00203 typedef union 00204 { 00205 unsigned short w; 00206 unsigned char b[bsize]; 00207 } Bytemem; 00208 // ------------------------------------------ 00209 // конструкторы на разные случаи... 00210 Byte() noexcept 00211 { 00212 raw.w = 0; 00213 } 00214 00215 Byte( unsigned char b1, unsigned char b2 ) noexcept 00216 { 00217 raw.b[0] = b1; 00218 raw.b[1] = b2; 00219 } 00220 Byte( const long& val ) noexcept 00221 { 00222 raw.w = val; 00223 } 00224 00225 Byte( const ModbusRTU::ModbusData dat ) noexcept 00226 { 00227 raw.w = dat; 00228 } 00229 00230 ~Byte() noexcept {} 00231 // ------------------------------------------ 00233 static size_t wsize() 00234 { 00235 return 1; 00236 } 00238 static VType type() 00239 { 00240 return vtByte; 00241 } 00242 // ------------------------------------------ 00243 operator long() 00244 { 00245 return lroundf(raw.w); 00246 } 00247 operator unsigned short() 00248 { 00249 return raw.w; 00250 } 00251 00252 unsigned char operator[]( const int i ) 00253 { 00254 return raw.b[i]; 00255 } 00256 00257 Bytemem raw; 00258 }; 00259 // -------------------------------------------------------------------------- 00260 class Unsigned 00261 { 00262 public: 00263 00264 // ------------------------------------------ 00265 // конструкторы на разные случаи... 00266 Unsigned() noexcept: raw(0) {} 00267 00268 Unsigned( const long& val ) noexcept 00269 { 00270 raw = val; 00271 } 00272 00273 Unsigned( const ModbusRTU::ModbusData dat ) noexcept 00274 { 00275 raw = dat; 00276 } 00277 00278 ~Unsigned() noexcept {} 00279 // ------------------------------------------ 00281 static size_t wsize() 00282 { 00283 return 1; 00284 } 00286 static VType type() 00287 { 00288 return vtUnsigned; 00289 } 00290 // ------------------------------------------ 00291 operator long() 00292 { 00293 return raw; 00294 } 00295 00296 unsigned short raw; 00297 }; 00298 // -------------------------------------------------------------------------- 00299 class Signed 00300 { 00301 public: 00302 00303 // ------------------------------------------ 00304 // конструкторы на разные случаи... 00305 Signed() noexcept: raw(0) {} 00306 00307 Signed( const long& val ) noexcept 00308 { 00309 raw = val; 00310 } 00311 00312 Signed( const ModbusRTU::ModbusData dat ) noexcept 00313 { 00314 raw = dat; 00315 } 00316 00317 ~Signed() noexcept {} 00318 // ------------------------------------------ 00320 static size_t wsize() 00321 { 00322 return 1; 00323 } 00325 static VType type() 00326 { 00327 return vtSigned; 00328 } 00329 // ------------------------------------------ 00330 operator long() 00331 { 00332 return raw; 00333 } 00334 00335 signed short raw; 00336 }; 00337 // -------------------------------------------------------------------------- 00338 class I2 00339 { 00340 public: 00341 00342 // ------------------------------------------ 00343 static const size_t i2Size = 2; 00345 typedef union 00346 { 00347 unsigned short v[i2Size]; 00348 int val; // 00349 } I2mem; 00350 // ------------------------------------------ 00351 // конструкторы на разные случаи... 00352 I2() noexcept 00353 { 00354 memset(raw.v, 0, sizeof(raw.v)); 00355 } 00356 00357 I2( int v ) noexcept 00358 { 00359 raw.val = v; 00360 } 00361 I2( const ModbusRTU::ModbusData* data, size_t size ) noexcept 00362 { 00363 for( size_t i = 0; i < wsize() && i < size; i++ ) 00364 raw.v[i] = data[i]; 00365 } 00366 00367 ~I2() noexcept {} 00368 // ------------------------------------------ 00370 static size_t wsize() 00371 { 00372 return i2Size; 00373 } 00375 static VType type() 00376 { 00377 return vtI2; 00378 } 00379 // ------------------------------------------ 00380 operator int() 00381 { 00382 return raw.val; 00383 } 00384 00385 I2mem raw; 00386 }; 00387 // -------------------------------------------------------------------------- 00388 class I2r: 00389 public I2 00390 { 00391 public: 00392 I2r() noexcept 00393 { 00394 raw_backorder.val = 0; 00395 } 00396 00397 I2r( const int v ) noexcept: I2(v) 00398 { 00399 raw_backorder = raw; 00400 std::swap(raw_backorder.v[0], raw_backorder.v[1]); 00401 } 00402 00403 I2r( const ModbusRTU::ModbusData* data, size_t size ) noexcept: I2(data, size) 00404 { 00405 // принимаем в обратном порядке.. поэтому переворачиваем raw 00406 raw_backorder = raw; 00407 std::swap(raw.v[0], raw.v[1]); 00408 } 00409 00410 ~I2r() noexcept {} 00411 00412 I2mem raw_backorder; 00413 }; 00414 // -------------------------------------------------------------------------- 00415 class U2 00416 { 00417 public: 00418 00419 // ------------------------------------------ 00420 static const size_t u2Size = 2; 00422 typedef union 00423 { 00424 unsigned short v[u2Size]; 00425 unsigned int val; // 00426 } U2mem; 00427 // ------------------------------------------ 00428 // конструкторы на разные случаи... 00429 U2() noexcept 00430 { 00431 memset(raw.v, 0, sizeof(raw.v)); 00432 } 00433 00434 U2( unsigned int v ) noexcept 00435 { 00436 raw.val = v; 00437 } 00438 U2( const ModbusRTU::ModbusData* data, size_t size ) noexcept 00439 { 00440 for( size_t i = 0; i < wsize() && i < size; i++ ) 00441 raw.v[i] = data[i]; 00442 } 00443 00444 ~U2() noexcept {} 00445 // ------------------------------------------ 00447 static size_t wsize() 00448 { 00449 return u2Size; 00450 } 00452 static VType type() 00453 { 00454 return vtU2; 00455 } 00456 // ------------------------------------------ 00457 operator unsigned int() 00458 { 00459 return raw.val; 00460 } 00461 00462 U2mem raw; 00463 }; 00464 // -------------------------------------------------------------------------- 00465 class U2r: 00466 public U2 00467 { 00468 public: 00469 U2r() noexcept 00470 { 00471 raw_backorder.val = 0; 00472 } 00473 00474 U2r( int v ) noexcept: U2(v) 00475 { 00476 raw_backorder = raw; 00477 std::swap(raw_backorder.v[0], raw_backorder.v[1]); 00478 } 00479 00480 U2r( const ModbusRTU::ModbusData* data, size_t size ) noexcept: U2(data, size) 00481 { 00482 // принимаем в обратном порядке.. поэтому переворачиваем raw 00483 raw_backorder = raw; 00484 std::swap(raw.v[0], raw.v[1]); 00485 } 00486 00487 ~U2r() {} 00488 00489 U2mem raw_backorder; 00490 }; 00491 // -------------------------------------------------------------------------- 00492 00493 } // end of namespace VTypes 00494 // -------------------------------------------------------------------------- 00495 } // end of namespace uniset 00496 // -------------------------------------------------------------------------- 00497 #endif // _RTUTypes_H_ 00498 // -----------------------------------------------------------------------------
1.7.6.1