UniSet  2.6.0
VTypes.h
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 // -----------------------------------------------------------------------------