|
UniSet
2.0.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( const 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 operator int(){ return lroundf(raw.val); } 00070 00071 F2mem raw; 00072 }; 00073 // -------------------------------------------------------------------------- 00074 class F2r: 00075 public F2 00076 { 00077 public: 00078 00079 // ------------------------------------------ 00080 // конструкторы на разные случаи... 00081 F2r(){} 00082 00083 F2r( const float& f ):F2(f) 00084 { 00085 raw_backorder = raw; 00086 std::swap(raw_backorder.v[0],raw_backorder.v[1]); 00087 } 00088 F2r( const ModbusRTU::ModbusData* data, int size ):F2(data,size) 00089 { 00090 // принимаем в обратном порядке.. поэтому переворачиваем raw 00091 raw_backorder = raw; 00092 std::swap(raw.v[0],raw.v[1]); 00093 } 00094 00095 ~F2r(){} 00096 00097 F2mem raw_backorder; 00098 }; 00099 // -------------------------------------------------------------------------- 00100 class F4 00101 { 00102 public: 00103 // ------------------------------------------ 00104 static const int f4Size=4; 00106 typedef union 00107 { 00108 unsigned short v[f4Size]; 00109 float val; // 00110 } F4mem; 00111 // ------------------------------------------ 00112 // конструкторы на разные случаи... 00113 F4(){ memset(raw.v,0,sizeof(raw.v)); } 00114 00115 F4( const float& f ){ raw.val = f; } 00116 F4( const ModbusRTU::ModbusData* data, int size ) 00117 { 00118 for( int i=0; i<wsize() && i<size; i++ ) 00119 raw.v[i] = data[i]; 00120 } 00121 00122 ~F4(){} 00123 // ------------------------------------------ 00125 static int wsize(){ return f4Size; } 00127 static VType type(){ return vtF4; } 00128 // ------------------------------------------ 00129 operator float(){ return raw.val; } 00130 operator long(){ return lroundf(raw.val); } 00131 00132 F4mem raw; 00133 }; 00134 // -------------------------------------------------------------------------- 00135 class Byte 00136 { 00137 public: 00138 00139 static const int bsize = 2; 00140 00141 // ------------------------------------------ 00143 typedef union 00144 { 00145 unsigned short w; 00146 unsigned char b[bsize]; 00147 } Bytemem; 00148 // ------------------------------------------ 00149 // конструкторы на разные случаи... 00150 Byte(){ raw.w = 0; } 00151 00152 Byte( unsigned char b1, unsigned char b2 ){ raw.b[0]=b1; raw.b[1]=b2; } 00153 Byte( const long& val ) 00154 { 00155 raw.w = val; 00156 } 00157 00158 Byte( const ModbusRTU::ModbusData dat ) 00159 { 00160 raw.w = dat; 00161 } 00162 00163 ~Byte(){} 00164 // ------------------------------------------ 00166 static int wsize(){ return 1; } 00168 static VType type(){ return vtByte; } 00169 // ------------------------------------------ 00170 operator long(){ return lroundf(raw.w); } 00171 operator unsigned short(){ return raw.w; } 00172 00173 unsigned char operator[]( const int i ){ return raw.b[i]; } 00174 00175 Bytemem raw; 00176 }; 00177 // -------------------------------------------------------------------------- 00178 class Unsigned 00179 { 00180 public: 00181 00182 // ------------------------------------------ 00183 // конструкторы на разные случаи... 00184 Unsigned():raw(0){} 00185 00186 Unsigned( const long& val ) 00187 { 00188 raw = val; 00189 } 00190 00191 Unsigned( const ModbusRTU::ModbusData dat ) 00192 { 00193 raw = dat; 00194 } 00195 00196 ~Unsigned(){} 00197 // ------------------------------------------ 00199 static int wsize(){ return sizeof(unsigned short); } 00201 static VType type(){ return vtUnsigned; } 00202 // ------------------------------------------ 00203 operator long(){ return raw; } 00204 00205 unsigned short raw; 00206 }; 00207 // -------------------------------------------------------------------------- 00208 class Signed 00209 { 00210 public: 00211 00212 // ------------------------------------------ 00213 // конструкторы на разные случаи... 00214 Signed():raw(0){} 00215 00216 Signed( const long& val ) 00217 { 00218 raw = val; 00219 } 00220 00221 Signed( const ModbusRTU::ModbusData dat ) 00222 { 00223 raw = dat; 00224 } 00225 00226 ~Signed(){} 00227 // ------------------------------------------ 00229 static int wsize(){ return sizeof(signed short); } 00231 static VType type(){ return vtSigned; } 00232 // ------------------------------------------ 00233 operator long(){ return raw; } 00234 00235 signed short raw; 00236 }; 00237 // -------------------------------------------------------------------------- 00238 class I2 00239 { 00240 public: 00241 00242 // ------------------------------------------ 00243 static const int i2Size=2; 00245 typedef union 00246 { 00247 unsigned short v[i2Size]; 00248 int val; // 00249 } I2mem; 00250 // ------------------------------------------ 00251 // конструкторы на разные случаи... 00252 I2(){ memset(raw.v,0,sizeof(raw.v)); } 00253 00254 I2( int v ){ raw.val = v; } 00255 I2( const ModbusRTU::ModbusData* data, int size ) 00256 { 00257 for( int i=0; i<wsize() && i<size; i++ ) 00258 raw.v[i] = data[i]; 00259 } 00260 00261 ~I2(){} 00262 // ------------------------------------------ 00264 static int wsize(){ return i2Size; } 00266 static VType type(){ return vtI2; } 00267 // ------------------------------------------ 00268 operator int(){ return raw.val; } 00269 00270 I2mem raw; 00271 }; 00272 // -------------------------------------------------------------------------- 00273 class I2r: 00274 public I2 00275 { 00276 public: 00277 I2r(){} 00278 00279 I2r( const int v ):I2(v) 00280 { 00281 raw_backorder = raw; 00282 std::swap(raw_backorder.v[0],raw_backorder.v[1]); 00283 } 00284 I2r( const ModbusRTU::ModbusData* data, int size ):I2(data,size) 00285 { 00286 // принимаем в обратном порядке.. поэтому переворачиваем raw 00287 raw_backorder = raw; 00288 std::swap(raw.v[0],raw.v[1]); 00289 } 00290 00291 ~I2r(){} 00292 00293 I2mem raw_backorder; 00294 }; 00295 // -------------------------------------------------------------------------- 00296 class U2 00297 { 00298 public: 00299 00300 // ------------------------------------------ 00301 static const int u2Size=2; 00303 typedef union 00304 { 00305 unsigned short v[u2Size]; 00306 unsigned int val; // 00307 } U2mem; 00308 // ------------------------------------------ 00309 // конструкторы на разные случаи... 00310 U2(){ memset(raw.v,0,sizeof(raw.v)); } 00311 00312 U2( unsigned int v ){ raw.val = v; } 00313 U2( const ModbusRTU::ModbusData* data, int size ) 00314 { 00315 for( int i=0; i<wsize() && i<size; i++ ) 00316 raw.v[i] = data[i]; 00317 } 00318 00319 ~U2(){} 00320 // ------------------------------------------ 00322 static int wsize(){ return u2Size; } 00324 static VType type(){ return vtU2; } 00325 // ------------------------------------------ 00326 operator unsigned int(){ return raw.val; } 00327 00328 U2mem raw; 00329 }; 00330 // -------------------------------------------------------------------------- 00331 class U2r: 00332 public U2 00333 { 00334 public: 00335 U2r(){} 00336 00337 U2r( int v ):U2(v) 00338 { 00339 raw_backorder = raw; 00340 std::swap(raw_backorder.v[0],raw_backorder.v[1]); 00341 } 00342 U2r( const ModbusRTU::ModbusData* data, int size ):U2(data,size) 00343 { 00344 // принимаем в обратном порядке.. поэтому переворачиваем raw 00345 raw_backorder = raw; 00346 std::swap(raw.v[0],raw.v[1]); 00347 } 00348 00349 ~U2r(){} 00350 00351 U2mem raw_backorder; 00352 }; 00353 // -------------------------------------------------------------------------- 00354 00355 } // end of namespace VTypes 00356 // -------------------------------------------------------------------------- 00357 #endif // _RTUTypes_H_ 00358 // -----------------------------------------------------------------------------
1.7.6.1