Commit 102c7dfd authored by Pavel Vainerman's avatar Pavel Vainerman

[unet]: make style

parent 8d4ee7b4
...@@ -24,40 +24,40 @@ ...@@ -24,40 +24,40 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
namespace uniset namespace uniset
{ {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
namespace UniSetUDP namespace UniSetUDP
{ {
/*! С учётом того, что ID могут идти не подряд. Сделан следующий формат: /*! С учётом того, что ID могут идти не подряд. Сделан следующий формат:
Для аналоговых величин передаётся массив пар "id-value"(UDPAData). Для аналоговых величин передаётся массив пар "id-value"(UDPAData).
Для булевых величин - отдельно массив ID и отдельно битовый массив со значениями, Для булевых величин - отдельно массив ID и отдельно битовый массив со значениями,
(по количеству битов такого же размера). (по количеству битов такого же размера).
\warning Пакет UDPMessage передаётся всегда полностью, независимо от того, насколько он наполнен датчиками. \warning Пакет UDPMessage передаётся всегда полностью, независимо от того, насколько он наполнен датчиками.
\warning ТЕКУЩАЯ ВЕРСИЯ ПРОТОКОЛА НЕ БУДЕТ РАБОТАТЬ МЕЖДУ 32-битными и 64-битными системами (из-за отличия в типе long). \warning ТЕКУЩАЯ ВЕРСИЯ ПРОТОКОЛА НЕ БУДЕТ РАБОТАТЬ МЕЖДУ 32-битными и 64-битными системами (из-за отличия в типе long).
т.к. это не сильно актуально, пока не переделываю. т.к. это не сильно актуально, пока не переделываю.
"ByteOrder" "ByteOrder"
============ ============
В текущей версии протокола. В UDPHeader содержится информации о порядке байт. В текущей версии протокола. В UDPHeader содержится информации о порядке байт.
Поэтому логика следующая: Поэтому логика следующая:
- Узел который посылает, ничего не перекодирует и просто посылает данные так как хранит - Узел который посылает, ничего не перекодирует и просто посылает данные так как хранит
(информация о порядке байт, если специально не выставить, будет выставлена при компиляции, см. конструктор) (информация о порядке байт, если специально не выставить, будет выставлена при компиляции, см. конструктор)
- Узел который принимает данные, декодирует их, если на его узле порядок байт не совпадает. - Узел который принимает данные, декодирует их, если на его узле порядок байт не совпадает.
Т.е. если все узлы будут иметь одинаковый порядок байт, фактического перекодирования не будет. Т.е. если все узлы будут иметь одинаковый порядок байт, фактического перекодирования не будет.
*/ */
const uint32_t UNETUDP_MAGICNUM = 0x1343EFD; // идентификатор протокола const uint32_t UNETUDP_MAGICNUM = 0x1343EFD; // идентификатор протокола
struct UDPHeader struct UDPHeader
{ {
UDPHeader() noexcept; UDPHeader() noexcept;
uint32_t magic; uint32_t magic;
uint8_t _be_order; // 1 - BE byte order, 0 - LE byte order uint8_t _be_order; // 1 - BE byte order, 0 - LE byte order
size_t num; size_t num;
long nodeID; long nodeID;
long procID; long procID;
size_t dcount; /*!< количество булевых величин */ size_t dcount; /*!< количество булевых величин */
size_t acount; /*!< количество аналоговых величин */ size_t acount; /*!< количество аналоговых величин */
} __attribute__((packed)); } __attribute__((packed));
std::ostream& operator<<( std::ostream& os, UDPHeader& p ); std::ostream& operator<<( std::ostream& os, UDPHeader& p );
std::ostream& operator<<( std::ostream& os, UDPHeader* p ); std::ostream& operator<<( std::ostream& os, UDPHeader* p );
...@@ -74,21 +74,21 @@ namespace uniset ...@@ -74,21 +74,21 @@ namespace uniset
} __attribute__((packed)); } __attribute__((packed));
std::ostream& operator<<( std::ostream& os, UDPAData& p ); std::ostream& operator<<( std::ostream& os, UDPAData& p );
// Теоретический размер данных в UDP пакете (исключая заголовки) 65507 // Теоретический размер данных в UDP пакете (исключая заголовки) 65507
// Фактически желательно не вылезать за размер MTU (обычно 1500) - заголовки = 1432 байта // Фактически желательно не вылезать за размер MTU (обычно 1500) - заголовки = 1432 байта
// т.е. надо чтобы sizeof(UDPPacket) < 1432 // т.е. надо чтобы sizeof(UDPPacket) < 1432
// При текущих настройках sizeof(UDPPacket) = 56421 (!) // При текущих настройках sizeof(UDPPacket) = 56421 (!)
static const size_t MaxACount = 2000; static const size_t MaxACount = 2000;
static const size_t MaxDCount = 3000; static const size_t MaxDCount = 3000;
static const size_t MaxDDataCount = 1 + MaxDCount / 8 * sizeof(uint8_t); static const size_t MaxDDataCount = 1 + MaxDCount / 8 * sizeof(uint8_t);
struct UDPMessage struct UDPMessage
{ {
// net to host // net to host
void ntoh() noexcept; void ntoh() noexcept;
bool isOk() noexcept; bool isOk() noexcept;
// \warning в случае переполнения возвращается MaxDCount // \warning в случае переполнения возвращается MaxDCount
size_t addDData( long id, bool val ) noexcept; size_t addDData( long id, bool val ) noexcept;
...@@ -112,43 +112,43 @@ namespace uniset ...@@ -112,43 +112,43 @@ namespace uniset
long getDataID( ) const noexcept; /*!< получение "уникального" идентификатора данных этого пакета */ long getDataID( ) const noexcept; /*!< получение "уникального" идентификатора данных этого пакета */
inline bool isAFull() const noexcept inline bool isAFull() const noexcept
{ {
return (header.acount >= MaxACount); return (header.acount >= MaxACount);
} }
inline bool isDFull() const noexcept inline bool isDFull() const noexcept
{ {
return (header.dcount >= MaxDCount); return (header.dcount >= MaxDCount);
} }
inline bool isFull() const noexcept inline bool isFull() const noexcept
{ {
return !((header.dcount < MaxDCount) && (header.acount < MaxACount)); return !((header.dcount < MaxDCount) && (header.acount < MaxACount));
} }
inline size_t dsize() const noexcept inline size_t dsize() const noexcept
{ {
return header.dcount; return header.dcount;
} }
inline size_t asize() const noexcept inline size_t asize() const noexcept
{ {
return header.acount; return header.acount;
} }
uint16_t getDataCRC() const noexcept; uint16_t getDataCRC() const noexcept;
UDPHeader header; UDPHeader header;
UDPAData a_dat[MaxACount]; /*!< аналоговые величины */ UDPAData a_dat[MaxACount]; /*!< аналоговые величины */
long d_id[MaxDCount]; /*!< список дискретных ID */ long d_id[MaxDCount]; /*!< список дискретных ID */
uint8_t d_dat[MaxDDataCount]; /*!< битовые значения */ uint8_t d_dat[MaxDDataCount]; /*!< битовые значения */
} __attribute__((packed)); } __attribute__((packed));
std::ostream& operator<<( std::ostream& os, UDPMessage& p ); std::ostream& operator<<( std::ostream& os, UDPMessage& p );
uint16_t makeCRC( unsigned char* buf, size_t len ) noexcept; uint16_t makeCRC( unsigned char* buf, size_t len ) noexcept;
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
} // end of namespace uniset } // end of namespace uniset
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#endif // UDPPacket_H_ #endif // UDPPacket_H_
......
...@@ -32,173 +32,173 @@ shared_ptr<SMInterface> smiInstance() ...@@ -32,173 +32,173 @@ shared_ptr<SMInterface> smiInstance()
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
static void run_senders( size_t max, const std::string& s_host, size_t count = 50, timeout_t usecpause = 50 ) static void run_senders( size_t max, const std::string& s_host, size_t count = 50, timeout_t usecpause = 50 )
{ {
std::vector< std::shared_ptr<UDPSocketU> > vsend; std::vector< std::shared_ptr<UDPSocketU> > vsend;
vsend.reserve(max); vsend.reserve(max);
cout << "Run " << max << " senders (" << s_host << ")" << endl; cout << "Run " << max << " senders (" << s_host << ")" << endl;
// make sendesrs.. // make sendesrs..
for( size_t i = 0; i < max; i++ ) for( size_t i = 0; i < max; i++ )
{ {
try try
{ {
cout << "create sender: " << s_host << ":" << begPort + i << endl; cout << "create sender: " << s_host << ":" << begPort + i << endl;
auto s = make_shared<UDPSocketU>(s_host, begPort + i); auto s = make_shared<UDPSocketU>(s_host, begPort + i);
s->setBroadcast(true); s->setBroadcast(true);
vsend.emplace_back(s); vsend.emplace_back(s);
} }
catch( Poco::Net::NetException& e ) catch( Poco::Net::NetException& e )
{ {
cerr << "(run_senders): " << e.displayText() << " (" << s_host << ")" << endl; cerr << "(run_senders): " << e.displayText() << " (" << s_host << ")" << endl;
throw; throw;
} }
catch( std::exception& ex) catch( std::exception& ex)
{ {
cerr << "(run_senders): " << ex.what() << endl; cerr << "(run_senders): " << ex.what() << endl;
throw; throw;
} }
} }
UniSetUDP::UDPMessage mypack; UniSetUDP::UDPMessage mypack;
mypack.header.nodeID = 100; mypack.header.nodeID = 100;
mypack.header.procID = 100; mypack.header.procID = 100;
for( size_t i = 0; i < count; i++ ) for( size_t i = 0; i < count; i++ )
{ {
UniSetUDP::UDPAData d(i, i); UniSetUDP::UDPAData d(i, i);
mypack.addAData(d); mypack.addAData(d);
} }
for( size_t i = 0; i < count; i++ ) for( size_t i = 0; i < count; i++ )
mypack.addDData(i, i); mypack.addDData(i, i);
for( size_t i = 0; i < max; i++ ) for( size_t i = 0; i < max; i++ )
{ {
try try
{ {
if( vsend[i] ) if( vsend[i] )
vsend[i]->connect( Poco::Net::SocketAddress(s_host, begPort + i) ); vsend[i]->connect( Poco::Net::SocketAddress(s_host, begPort + i) );
} }
catch( Poco::Net::NetException& e ) catch( Poco::Net::NetException& e )
{ {
cerr << "(run_senders): " << e.message() << " (" << s_host << ")" << endl; cerr << "(run_senders): " << e.message() << " (" << s_host << ")" << endl;
throw; throw;
} }
catch( std::exception& ex) catch( std::exception& ex)
{ {
cerr << "(run_senders): " << ex.what() << endl; cerr << "(run_senders): " << ex.what() << endl;
throw; throw;
} }
} }
size_t packetnum = 0; size_t packetnum = 0;
size_t nc = 1; size_t nc = 1;
while( nc ) // -V654 while( nc ) // -V654
{ {
mypack.header.num = packetnum++; mypack.header.num = packetnum++;
// при переходе черех максимум (UniSetUDP::MaxPacketNum) // при переходе черех максимум (UniSetUDP::MaxPacketNum)
// пакет опять должен иметь номер "1" // пакет опять должен иметь номер "1"
if( packetnum == 0 ) if( packetnum == 0 )
packetnum = 1; packetnum = 1;
for( auto&& udp : vsend ) for( auto&& udp : vsend )
{ {
try try
{ {
if( udp->poll(100000, Poco::Net::Socket::SELECT_WRITE) ) if( udp->poll(100000, Poco::Net::Socket::SELECT_WRITE) )
{ {
size_t ret = udp->sendBytes(&mypack, sizeof(mypack)); size_t ret = udp->sendBytes(&mypack, sizeof(mypack));
if( ret < sizeof(mypack) ) if( ret < sizeof(mypack) )
cerr << "(send): FAILED ret=" << ret << " < sizeof=" << sizeof(mypack) << endl; cerr << "(send): FAILED ret=" << ret << " < sizeof=" << sizeof(mypack) << endl;
} }
} }
catch( Poco::Net::NetException& e ) catch( Poco::Net::NetException& e )
{ {
cerr << "(send): " << e.message() << " (" << s_host << ")" << endl; cerr << "(send): " << e.message() << " (" << s_host << ")" << endl;
} }
catch( ... ) catch( ... )
{ {
cerr << "(send): catch ..." << endl; cerr << "(send): catch ..." << endl;
} }
} }
std::this_thread::sleep_for(std::chrono::microseconds(usecpause)); std::this_thread::sleep_for(std::chrono::microseconds(usecpause));
} }
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
static void run_test( size_t max, const std::string& host ) static void run_test( size_t max, const std::string& host )
{ {
std::vector< std::shared_ptr<UNetReceiver> > vrecv; std::vector< std::shared_ptr<UNetReceiver> > vrecv;
vrecv.reserve(max); vrecv.reserve(max);
// make receivers.. // make receivers..
for( size_t i = 0; i < max; i++ ) for( size_t i = 0; i < max; i++ )
{ {
cout << "create receiver: " << host << ":" << begPort + i << endl; cout << "create receiver: " << host << ":" << begPort + i << endl;
auto r = make_shared<UNetReceiver>(host, begPort + i, smiInstance()); auto r = make_shared<UNetReceiver>(host, begPort + i, smiInstance());
r->setLockUpdate(true); r->setLockUpdate(true);
vrecv.emplace_back(r); vrecv.emplace_back(r);
} }
size_t count = 0; size_t count = 0;
// Run receivers.. // Run receivers..
for( auto&& r : vrecv ) for( auto&& r : vrecv )
{ {
if( r ) if( r )
{ {
count++; count++;
r->start(); r->start();
} }
} }
cerr << "RUN " << count << " receivers..." << endl; cerr << "RUN " << count << " receivers..." << endl;
// wait.. // wait..
pause(); pause();
for( auto&& r : vrecv ) for( auto&& r : vrecv )
{ {
if(r) if(r)
r->stop(); r->stop();
} }
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
int main(int argc, char* argv[] ) int main(int argc, char* argv[] )
{ {
std::string host = "127.255.255.255"; std::string host = "127.255.255.255";
try try
{ {
auto conf = uniset_init(argc, argv); auto conf = uniset_init(argc, argv);
if( argc > 1 && !strcmp(argv[1], "s") ) if( argc > 1 && !strcmp(argv[1], "s") )
run_senders(1, host); run_senders(1, host);
else else
run_test(1, host); run_test(1, host);
return 0; return 0;
} }
catch( const SystemError& err ) catch( const SystemError& err )
{ {
cerr << "(urecv-perf-test): " << err << endl; cerr << "(urecv-perf-test): " << err << endl;
} }
catch( const uniset::Exception& ex ) catch( const uniset::Exception& ex )
{ {
cerr << "(urecv-perf-test): " << ex << endl; cerr << "(urecv-perf-test): " << ex << endl;
} }
catch( const std::exception& e ) catch( const std::exception& e )
{ {
cerr << "(tests_with_sm): " << e.what() << endl; cerr << "(tests_with_sm): " << e.what() << endl;
} }
catch(...) catch(...)
{ {
cerr << "(urecv-perf-test): catch(...)" << endl; cerr << "(urecv-perf-test): catch(...)" << endl;
} }
return 1; return 1;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment