|
UniSet
2.2.1
|
00001 // -------------------------------------------------------------------------- 00002 #ifndef _MTR_H_ 00003 #define _MTR_H_ 00004 // ----------------------------------------------------------------------------- 00005 #include <string> 00006 #include <map> 00007 #include <unordered_map> 00008 #include <list> 00009 #include <ostream> 00010 #include <cstring> 00011 #include <cmath> 00012 #include "modbus/ModbusTypes.h" 00013 #include "ComPort.h" 00014 // ----------------------------------------------------------------------------- 00015 class ModbusRTUMaster; 00016 // ----------------------------------------------------------------------------- 00017 namespace MTR 00018 { 00019 // реализованные в данном интерфейсе типы данных 00020 enum MTRType 00021 { 00022 mtUnknown, 00023 mtT1, 00024 mtT2, 00025 mtT3, 00026 mtT4, 00027 mtT5, 00028 mtT6, 00029 mtT7, 00030 mtT8, 00031 mtT9, 00032 mtT10, 00033 mtT16, 00034 mtT17, 00035 mtF1, 00036 mtT_Str16, 00037 mtT_Str8 00038 }; 00039 // ------------------------------------------------------------------------- 00040 std::string type2str( MTRType t ); 00041 MTRType str2type( const std::string& s ); 00042 int wsize( MTRType t ); 00043 // ------------------------------------------------------------------------- 00044 // Информация 00045 const ModbusRTU::ModbusData regModelNumber = 0x01; 00046 const ModbusRTU::ModbusData regSerialNumber = 0x09; 00047 00048 std::string getModelNumber( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr ); 00049 std::string getSerialNumber( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr ); 00050 // ------------------------------------------------------------------------- 00051 // Настройки связи (чтение - read03, запись - write06) 00052 const ModbusRTU::ModbusData regUpdateConfiguration = 53; 00053 const ModbusRTU::ModbusData regAddress = 55; 00054 const ModbusRTU::ModbusData regBaudRate = 56; 00055 const ModbusRTU::ModbusData regStopBit = 57; /* 0 - Stop bit, 1 - Stop bits */ 00056 const ModbusRTU::ModbusData regParity = 58; 00057 const ModbusRTU::ModbusData regDataBits = 59; 00058 00059 enum mtrBaudRate 00060 { 00061 br1200 = 0, 00062 br2400 = 1, 00063 br4800 = 2, 00064 br9600 = 3, 00065 br19200 = 4, 00066 br38400 = 5, 00067 br57600 = 6, 00068 br115200 = 7 00069 }; 00070 00071 enum mtrParity 00072 { 00073 mpNoParity = 0, 00074 mpOddParity = 1, 00075 mpEvenParity = 2 00076 }; 00077 00078 enum mtrDataBits 00079 { 00080 db8Bits = 0, 00081 db7Bits = 1 00082 }; 00083 00084 bool setAddress( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, ModbusRTU::ModbusAddr newAddr ); 00085 bool setBaudRate( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrBaudRate br ); 00086 bool setStopBit( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, bool state ); 00087 bool setParity( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrParity p ); 00088 bool setDataBits( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrDataBits d ); 00089 ComPort::Parity get_parity( ModbusRTU::ModbusData data ); 00090 ComPort::Speed get_speed( ModbusRTU::ModbusData data ); 00091 // ------------------------------------------------------------------------- 00092 enum MTRError 00093 { 00094 mtrNoError, 00095 mtrBadDeviceType, 00096 mtrDontReadConfile, 00097 mtrSendParamFailed, 00098 mtrUnknownError 00099 }; 00100 std::ostream& operator<<(std::ostream& os, MTRError& e ); 00101 // Настройка из конф. файла 00102 MTRError update_configuration( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, 00103 const std::string& mtrconfile, int verbose = 0 ); 00104 // --------------------------- 00105 // вспомогательные функции и типы данных 00106 typedef std::list<ModbusRTU::ModbusData> DataList; 00107 typedef std::unordered_map<ModbusRTU::ModbusData, DataList> DataMap; 00108 const int attempts = 3; // 00109 static const ModbusRTU::ModbusData skip[] = {48, 49, 59}; // registers which should not write 00110 00111 bool send_param( ModbusRTUMaster* mb, DataMap& dmap, ModbusRTU::ModbusAddr addr, int verb ); 00112 bool read_param( const std::string& str, std::string& str1, std::string& str2 ); 00113 DataMap read_confile( const std::string& f ); 00114 void update_communication_params( ModbusRTU::ModbusAddr reg, ModbusRTU::ModbusData data, 00115 ModbusRTUMaster* mb, ModbusRTU::ModbusAddr& addr, int verb ); 00116 // ------------------------------------------------------------------------- 00117 static const int u2size = 2; 00118 // ------------------------------------------------------------------------- 00119 class T1 00120 { 00121 public: 00122 T1(): val(0) {} 00123 T1( unsigned short v ): val(v) {} 00124 T1( const ModbusRTU::ModbusData* data ): val(data[0]) {} 00125 ~T1() {} 00126 // ------------------------------------------ 00128 static unsigned int wsize() 00129 { 00130 return 1; 00131 } 00133 static MTRType type() 00134 { 00135 return mtT1; 00136 } 00137 // ------------------------------------------ 00138 unsigned short val; 00139 }; 00140 std::ostream& operator<<(std::ostream& os, T1& t ); 00141 // ------------------------------------------------------------------------- 00142 class T2 00143 { 00144 public: 00145 T2(): val(0) {} 00146 T2( signed short v ): val(v) {} 00147 T2( const ModbusRTU::ModbusData* data ): val(data[0]) {} 00148 ~T2() {} 00149 // ------------------------------------------ 00151 static unsigned int wsize() 00152 { 00153 return 1; 00154 } 00156 static MTRType type() 00157 { 00158 return mtT2; 00159 } 00160 // ------------------------------------------ 00161 signed short val; 00162 }; 00163 std::ostream& operator<<(std::ostream& os, T2& t ); 00164 // ------------------------------------------------------------------------- 00165 class T3 00166 { 00167 public: 00168 // ------------------------------------------ 00170 typedef union 00171 { 00172 unsigned short v[u2size]; 00173 signed int val; // :32 00174 } T3mem; 00175 // ------------------------------------------ 00176 // конструкторы на разные случаи... 00177 T3() 00178 { 00179 memset(raw.v, 0, sizeof(raw.v)); 00180 } 00181 00182 T3( signed int i ) 00183 { 00184 raw.val = i; 00185 } 00186 00187 T3( unsigned short v1, unsigned short v2 ) 00188 { 00189 raw.v[0] = v1; 00190 raw.v[1] = v2; 00191 } 00192 00193 T3( const ModbusRTU::ModbusData* data, int size ) 00194 { 00195 if( size >= u2size ) 00196 { 00197 // У MTR обратный порядок слов в ответе 00198 raw.v[0] = data[1]; 00199 raw.v[1] = data[0]; 00200 } 00201 } 00202 00203 ~T3() {} 00204 // ------------------------------------------ 00206 static unsigned int wsize() 00207 { 00208 return u2size; 00209 } 00211 static MTRType type() 00212 { 00213 return mtT3; 00214 } 00215 // ------------------------------------------ 00216 // функции преобразования к разным типам 00217 operator long() 00218 { 00219 return raw.val; 00220 } 00221 00222 T3mem raw; 00223 }; 00224 std::ostream& operator<<(std::ostream& os, T3& t ); 00225 // -------------------------------------------------------------------------- 00226 class T4 00227 { 00228 public: 00229 // ------------------------------------------ 00230 // конструкторы на разные случаи... 00231 T4(): sval(""), raw(0) {} 00232 T4( unsigned short v1 ): raw(v1) 00233 { 00234 char c[3]; 00235 memcpy(c, &v1, sizeof(c)); 00236 sval = std::string(c); 00237 } 00238 00239 T4( const ModbusRTU::ModbusData* data ): 00240 raw(data[0]) 00241 { 00242 char c[3]; 00243 memcpy(c, &(data[0]), sizeof(c)); 00244 sval = std::string(c); 00245 } 00246 00247 ~T4() {} 00248 // ------------------------------------------ 00250 static unsigned int wsize() 00251 { 00252 return 1; 00253 } 00255 static MTRType type() 00256 { 00257 return mtT4; 00258 } 00259 // ------------------------------------------ 00260 std::string sval; 00261 unsigned short raw; 00262 }; 00263 std::ostream& operator<<(std::ostream& os, T4& t ); 00264 // -------------------------------------------------------------------------- 00265 class T5 00266 { 00267 public: 00268 // ------------------------------------------ 00270 typedef union 00271 { 00272 unsigned short v[u2size]; 00273 struct u_T5 00274 { 00275 unsigned int val: 24; 00276 signed char exp; // :8 00277 } __attribute__( ( packed ) ) u2; 00278 long lval; 00279 } T5mem; 00280 // ------------------------------------------ 00281 // конструкторы на разные случаи... 00282 T5(): val(0) 00283 { 00284 memset(raw.v, 0, sizeof(raw.v)); 00285 } 00286 T5( unsigned short v1, unsigned short v2 ) 00287 { 00288 raw.v[0] = v1; 00289 raw.v[1] = v2; 00290 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00291 } 00292 00293 T5( long v ) 00294 { 00295 raw.lval = v; 00296 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00297 } 00298 00299 T5( const ModbusRTU::ModbusData* data, int size ): val(0) 00300 { 00301 if( size >= u2size ) 00302 { 00303 // При получении данных от MTR слова необходимо перевернуть 00304 raw.v[0] = data[1]; 00305 raw.v[1] = data[0]; 00306 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00307 } 00308 } 00309 00310 ~T5() {} 00311 // ------------------------------------------ 00313 static unsigned int wsize() 00314 { 00315 return u2size; 00316 } 00318 static MTRType type() 00319 { 00320 return mtT5; 00321 } 00322 // ------------------------------------------ 00323 double val; 00324 T5mem raw; 00325 }; 00326 std::ostream& operator<<(std::ostream& os, T5& t ); 00327 // -------------------------------------------------------------------------- 00328 class T6 00329 { 00330 public: 00331 // ------------------------------------------ 00333 typedef union 00334 { 00335 unsigned short v[u2size]; 00336 struct u_T6 00337 { 00338 signed int val: 24; 00339 signed char exp; // :8 00340 } u2; 00341 long lval; 00342 } T6mem; 00343 // ------------------------------------------ 00344 // конструкторы на разные случаи... 00345 T6(): val(0) 00346 { 00347 memset(raw.v, 0, sizeof(raw.v)); 00348 } 00349 T6( unsigned short v1, unsigned short v2 ) 00350 { 00351 raw.v[0] = v1; 00352 raw.v[1] = v2; 00353 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00354 } 00355 00356 T6( long v ) 00357 { 00358 raw.lval = v; 00359 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00360 } 00361 00362 T6( const ModbusRTU::ModbusData* data, int size ) 00363 { 00364 if( size >= u2size ) 00365 { 00366 // При получении данных от MTR слова необходимо перевернуть 00367 raw.v[0] = data[1]; 00368 raw.v[1] = data[0]; 00369 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00370 } 00371 } 00372 00373 ~T6() {} 00374 // ------------------------------------------ 00376 static unsigned int wsize() 00377 { 00378 return u2size; 00379 } 00381 static MTRType type() 00382 { 00383 return mtT6; 00384 } 00385 // ------------------------------------------ 00386 double val = { 0.0 }; 00387 T6mem raw; 00388 }; 00389 std::ostream& operator<<(std::ostream& os, T6& t ); 00390 // -------------------------------------------------------------------------- 00391 class T7 00392 { 00393 public: 00394 // ------------------------------------------ 00396 typedef union 00397 { 00398 unsigned short v[u2size]; 00399 struct u_T7 00400 { 00401 unsigned int val: 16; 00402 unsigned char ic; // :8 - Inductive/capacitive 00403 unsigned char ie; // :8 - Import/export 00404 } __attribute__( ( packed ) ) u2; 00405 long lval; 00406 } T7mem; 00407 // ------------------------------------------ 00408 // конструкторы на разные случаи... 00409 T7(): val(0) 00410 { 00411 memset(raw.v, 0, sizeof(raw.v)); 00412 } 00413 T7( unsigned short v1, unsigned short v2 ) 00414 { 00415 raw.v[0] = v1; 00416 raw.v[1] = v2; 00417 val = raw.u2.val * pow( (long)10, (long) - 4 ); 00418 } 00419 T7( const long v ) 00420 { 00421 raw.lval = v; 00422 val = raw.u2.val * pow( (long)10, (long) - 4 ); 00423 } 00424 00425 T7( const ModbusRTU::ModbusData* data, int size ) 00426 { 00427 if( size >= u2size ) 00428 { 00429 // При получении данных от MTR слова необходимо перевернуть 00430 raw.v[0] = data[1]; 00431 raw.v[1] = data[0]; 00432 val = raw.u2.val * pow( (long)10, (long) - 4 ); 00433 } 00434 } 00435 00436 ~T7() {} 00437 // ------------------------------------------ 00439 static unsigned int wsize() 00440 { 00441 return u2size; 00442 } 00444 static MTRType type() 00445 { 00446 return mtT7; 00447 } 00448 // ------------------------------------------ 00449 double val = { 0.0 }; 00450 T7mem raw; 00451 }; 00452 std::ostream& operator<<(std::ostream& os, T7& t ); 00453 // -------------------------------------------------------------------------- 00454 class T8 00455 { 00456 public: 00457 // ------------------------------------------ 00459 typedef union 00460 { 00461 unsigned short v[u2size]; 00462 struct u_T8 00463 { 00464 unsigned short mon: 8; 00465 unsigned short day: 8; 00466 unsigned short hour: 8; 00467 unsigned short min: 8; 00468 } __attribute__( ( packed ) ) u2; 00469 } T8mem; 00470 // ------------------------------------------ 00471 // конструкторы на разные случаи... 00472 T8() 00473 { 00474 memset(raw.v, 0, sizeof(raw.v)); 00475 } 00476 T8( unsigned short v1, unsigned short v2 ) 00477 { 00478 raw.v[0] = v1; 00479 raw.v[1] = v2; 00480 } 00481 00482 T8( const ModbusRTU::ModbusData* data, int size ) 00483 { 00484 if( size >= u2size ) 00485 { 00486 // При получении данных от MTR слова необходимо перевернуть 00487 raw.v[1] = data[0]; 00488 raw.v[0] = data[1]; 00489 } 00490 } 00491 00492 inline unsigned short day() 00493 { 00494 return raw.u2.day; 00495 } 00496 inline unsigned short mon() 00497 { 00498 return raw.u2.mon; 00499 } 00500 inline unsigned short hour() 00501 { 00502 return raw.u2.hour; 00503 } 00504 inline unsigned short min() 00505 { 00506 return raw.u2.min; 00507 } 00508 00509 ~T8() {} 00510 // ------------------------------------------ 00512 static unsigned int wsize() 00513 { 00514 return u2size; 00515 } 00517 static MTRType type() 00518 { 00519 return mtT8; 00520 } 00521 // ------------------------------------------ 00522 T8mem raw; 00523 }; 00524 std::ostream& operator<<(std::ostream& os, T8& t ); 00525 // -------------------------------------------------------------------------- 00526 class T9 00527 { 00528 public: 00529 // ------------------------------------------ 00531 typedef union 00532 { 00533 unsigned short v[u2size]; 00534 struct u_T9 00535 { 00536 unsigned short hour: 8; 00537 unsigned short min: 8; 00538 unsigned short sec: 8; 00539 unsigned short ssec: 8; 00540 } __attribute__( ( packed ) ) u2; 00541 } T9mem; 00542 // ------------------------------------------ 00543 // конструкторы на разные случаи... 00544 T9() 00545 { 00546 memset(raw.v, 0, sizeof(raw.v)); 00547 } 00548 T9( unsigned short v1, unsigned short v2 ) 00549 { 00550 raw.v[0] = v1; 00551 raw.v[1] = v2; 00552 } 00553 00554 T9( const ModbusRTU::ModbusData* data, int size ) 00555 { 00556 if( size >= u2size ) 00557 { 00558 // При получении данных от MTR слова необходимо перевернуть 00559 raw.v[0] = data[1]; 00560 raw.v[1] = data[0]; 00561 } 00562 } 00563 00564 inline unsigned short hour() 00565 { 00566 return raw.u2.hour; 00567 } 00568 inline unsigned short min() 00569 { 00570 return raw.u2.min; 00571 } 00572 inline unsigned short sec() 00573 { 00574 return raw.u2.sec; 00575 } 00576 inline unsigned short ssec() 00577 { 00578 return raw.u2.ssec; 00579 } 00580 00581 ~T9() {} 00582 // ------------------------------------------ 00584 static unsigned int wsize() 00585 { 00586 return u2size; 00587 } 00589 static MTRType type() 00590 { 00591 return mtT9; 00592 } 00593 // ------------------------------------------ 00594 T9mem raw; 00595 }; 00596 std::ostream& operator<<(std::ostream& os, T9& t ); 00597 // ------------------------------------------------------------------------- 00598 class T10 00599 { 00600 public: 00601 // ------------------------------------------ 00603 typedef union 00604 { 00605 unsigned short v[u2size]; 00606 struct u_T10 00607 { 00608 unsigned short year: 16; 00609 unsigned short mon: 8; 00610 unsigned short day: 8; 00611 } __attribute__( ( packed ) ) u2; 00612 } T10mem; 00613 // ------------------------------------------ 00614 // конструкторы на разные случаи... 00615 T10() 00616 { 00617 memset(raw.v, 0, sizeof(raw.v)); 00618 } 00619 T10( unsigned short v1, unsigned short v2 ) 00620 { 00621 raw.v[0] = v1; 00622 raw.v[1] = v2; 00623 } 00624 00625 T10( const ModbusRTU::ModbusData* data, int size ) 00626 { 00627 if( size >= u2size ) 00628 { 00629 // При получении данных от MTR слова необходимо перевернуть 00630 raw.v[0] = data[1]; 00631 raw.v[1] = data[0]; 00632 } 00633 } 00634 00635 inline unsigned short year() 00636 { 00637 return raw.u2.year; 00638 } 00639 inline unsigned short mon() 00640 { 00641 return raw.u2.mon; 00642 } 00643 inline unsigned short day() 00644 { 00645 return raw.u2.day; 00646 } 00647 00648 ~T10() {} 00649 // ------------------------------------------ 00651 static unsigned int wsize() 00652 { 00653 return u2size; 00654 } 00656 static MTRType type() 00657 { 00658 return mtT10; 00659 } 00660 // ------------------------------------------ 00661 T10mem raw; 00662 }; 00663 std::ostream& operator<<(std::ostream& os, T10& t ); 00664 // -------------------------------------------------------------------------- 00665 00666 class T16 00667 { 00668 public: 00669 T16(): val(0) {} 00670 T16( unsigned short v ): val(v) 00671 { 00672 fval = (float)(val) / 100.0; 00673 } 00674 T16( const ModbusRTU::ModbusData* data ): val(data[0]) 00675 { 00676 fval = (float)(val) / 100.0; 00677 } 00678 T16( float f ): fval(f) 00679 { 00680 val = lroundf(fval * 100); 00681 } 00682 00683 ~T16() {} 00684 // ------------------------------------------ 00686 static unsigned int wsize() 00687 { 00688 return 1; 00689 } 00691 static MTRType type() 00692 { 00693 return mtT16; 00694 } 00695 // ------------------------------------------ 00696 operator float() 00697 { 00698 return fval; 00699 } 00700 operator unsigned short() 00701 { 00702 return val; 00703 } 00704 00705 unsigned short val; 00706 float fval; 00707 }; 00708 std::ostream& operator<<(std::ostream& os, T16& t ); 00709 // -------------------------------------------------------------------------- 00710 class T17 00711 { 00712 public: 00713 T17(): val(0) {} 00714 T17( signed short v ): val(v) 00715 { 00716 fval = (float)(v) / 100.0; 00717 } 00718 T17( unsigned short v ): val(v) 00719 { 00720 fval = (float)( (signed short)(v) ) / 100.0; 00721 } 00722 00723 T17( const ModbusRTU::ModbusData* data ): val(data[0]) 00724 { 00725 fval = (float)(val) / 100.0; 00726 } 00727 T17( float f ): fval(f) 00728 { 00729 val = lroundf(fval * 100); 00730 } 00731 ~T17() {} 00732 // ------------------------------------------ 00734 static unsigned int wsize() 00735 { 00736 return 1; 00737 } 00739 static MTRType type() 00740 { 00741 return mtT17; 00742 } 00743 // ------------------------------------------ 00744 operator float() 00745 { 00746 return fval; 00747 } 00748 operator signed short() 00749 { 00750 return val; 00751 } 00752 00753 signed short val; 00754 float fval; 00755 }; 00756 std::ostream& operator<<(std::ostream& os, T17& t ); 00757 // -------------------------------------------------------------------------- 00758 class F1 00759 { 00760 public: 00761 // ------------------------------------------ 00763 typedef union 00764 { 00765 unsigned short v[2]; 00766 float val; // 00767 } F1mem; 00768 // ------------------------------------------ 00769 // конструкторы на разные случаи... 00770 F1() 00771 { 00772 memset(raw.v, 0, sizeof(raw.v)); 00773 } 00774 F1( unsigned short v1, unsigned short v2 ) 00775 { 00776 raw.v[0] = v1; 00777 raw.v[1] = v2; 00778 } 00779 00780 F1( float f ) 00781 { 00782 raw.val = f; 00783 } 00784 00785 F1( const ModbusRTU::ModbusData* data, int size ) 00786 { 00787 if( size >= u2size ) 00788 { 00789 // При получении данных от MTR слова необходимо перевернуть 00790 raw.v[0] = data[1]; 00791 raw.v[1] = data[0]; 00792 } 00793 } 00794 00795 ~F1() {} 00796 // ------------------------------------------ 00798 static unsigned int wsize() 00799 { 00800 return u2size; 00801 } 00803 static MTRType type() 00804 { 00805 return mtF1; 00806 } 00807 // ------------------------------------------ 00808 operator float() 00809 { 00810 return raw.val; 00811 } 00812 operator long() 00813 { 00814 return lroundf(raw.val); 00815 } 00816 00817 F1mem raw; 00818 }; 00819 std::ostream& operator<<(std::ostream& os, F1& t ); 00820 // -------------------------------------------------------------------------- 00821 class T_Str16 00822 { 00823 public: 00824 // ------------------------------------------ 00825 // конструкторы на разные случаи... 00826 T_Str16(): sval("") {} 00827 T_Str16( const ModbusRTU::ReadInputRetMessage& ret ) 00828 { 00829 char c[17]; 00830 ModbusRTU::ModbusData data[8]; 00831 00832 for( int i = 0; i < 8; i++ ) 00833 data[i] = ModbusRTU::SWAPSHORT(ret.data[i]); 00834 00835 memcpy(c, &data, 16); 00836 c[16] = '\0'; 00837 sval = std::string(c); 00838 } 00839 00840 ~T_Str16() {} 00841 // ------------------------------------------ 00843 static unsigned int wsize() 00844 { 00845 return 8; 00846 } 00848 static MTRType type() 00849 { 00850 return mtT_Str16; 00851 } 00852 // ------------------------------------------ 00853 std::string sval; 00854 }; 00855 std::ostream& operator<<(std::ostream& os, T_Str16& t ); 00856 // -------------------------------------------------------------------------- 00857 00858 class T_Str8 00859 { 00860 public: 00861 // ------------------------------------------ 00862 // конструкторы на разные случаи... 00863 T_Str8(): sval("") {} 00864 T_Str8( const ModbusRTU::ReadInputRetMessage& ret ) 00865 { 00866 char c[9]; 00867 ModbusRTU::ModbusData data[4]; 00868 00869 for( int i = 0; i < 4; i++ ) 00870 data[i] = ModbusRTU::SWAPSHORT(ret.data[i]); 00871 00872 memcpy(c, &data, 8); 00873 c[8] = '\0'; 00874 sval = std::string(c); 00875 } 00876 00877 ~T_Str8() {} 00878 // ------------------------------------------ 00880 static unsigned int wsize() 00881 { 00882 return 4; 00883 } 00885 static MTRType type() 00886 { 00887 return mtT_Str8; 00888 } 00889 // ------------------------------------------ 00890 std::string sval; 00891 }; 00892 std::ostream& operator<<(std::ostream& os, T_Str8& t ); 00893 // -------------------------------------------------------------------------- 00894 } // end of namespace MTR 00895 // -------------------------------------------------------------------------- 00896 #endif // _MTR_H_ 00897 // -----------------------------------------------------------------------------
1.7.6.1