|
UniSet
1.7.0
|
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 } // end of namespace VTypes 00330 // -------------------------------------------------------------------------- 00331 #endif // _RTUTypes_H_ 00332 // -----------------------------------------------------------------------------
1.7.6.1