Commit 94e22ed7 authored by Pavel Vainerman's avatar Pavel Vainerman

[unet]: zero copy optimization

parent 9d736403
......@@ -35,7 +35,7 @@ static bool HostIsBigEndian = false;
#if __BYTE_ORDER == __BIG_ENDIAN
static bool HostIsBigEndian = true;
#define BE_TO_H(x) {}
header.#define BE_TO_H(x) {}
#elif INTPTR_MAX == INT64_MAX
#define BE_TO_H(x) x = be64toh(x)
#elif INTPTR_MAX == INT32_MAX
......@@ -141,7 +141,6 @@ namespace uniset
return os << (*p);
}
// -----------------------------------------------------------------------------
std::ostream& UniSetUDP::operator<<( std::ostream& os, UniSetUDP::UDPAData& p )
{
return os << "id=" << p.id << " val=" << p.val;
......@@ -153,29 +152,25 @@ namespace uniset
os << "DIGITAL:" << endl;
for( size_t i = 0; i < p.dcount; i++ )
for( size_t i = 0; i < p.header.dcount; i++ )
os << "[" << i << "]={" << p.dID(i) << "," << p.dValue(i) << "}" << endl;
os << "ANALOG:" << endl;
for( size_t i = 0; i < p.acount; i++ )
for( size_t i = 0; i < p.header.acount; i++ )
os << "[" << i << "]={" << p.a_dat[i].id << "," << p.a_dat[i].val << "}" << endl;
return os;
}
// -----------------------------------------------------------------------------
UDPMessage::UDPMessage() noexcept
{
}
// -----------------------------------------------------------------------------
size_t UDPMessage::addAData( const UniSetUDP::UDPAData& dat ) noexcept
{
if( acount >= MaxACount )
if( header.acount >= MaxACount )
return MaxACount;
a_dat[acount] = dat;
acount++;
return acount - 1;
a_dat[header.acount] = dat;
header.acount++;
return header.acount - 1;
}
// -----------------------------------------------------------------------------
size_t UDPMessage::addAData( long id, long val) noexcept
......@@ -197,18 +192,18 @@ namespace uniset
// -----------------------------------------------------------------------------
size_t UDPMessage::addDData( long id, bool val ) noexcept
{
if( dcount >= MaxDCount )
if( header.dcount >= MaxDCount )
return MaxDCount;
// сохраняем ID
d_id[dcount] = id;
d_id[header.dcount] = id;
bool res = setDData( dcount, val );
bool res = setDData( header.dcount, val );
if( res )
{
dcount++;
return dcount - 1;
header.dcount++;
return header.dcount - 1;
}
return MaxDCount;
......@@ -219,8 +214,8 @@ namespace uniset
if( index >= MaxDCount )
return false;
size_t nbyte = index / 8 * sizeof(unsigned char);
size_t nbit = index % 8 * sizeof(unsigned char);
size_t nbyte = index / 8 * sizeof(uint8_t);
size_t nbit = index % 8 * sizeof(uint8_t);
// выставляем бит
unsigned char d = d_dat[nbyte];
......@@ -247,177 +242,106 @@ namespace uniset
if( index >= MaxDCount )
return uniset::DefaultObjectId;
size_t nbyte = index / 8 * sizeof(unsigned char);
size_t nbit = index % 8 * sizeof(unsigned char);
size_t nbyte = index / 8 * sizeof(uint8_t);
size_t nbit = index % 8 * sizeof(uint8_t);
return ( d_dat[nbyte] & (1 << nbit) );
}
// -----------------------------------------------------------------------------
size_t UDPMessage::transport_msg( UDPPacket& p ) const noexcept
{
p = UDPPacket{}; // reset data
size_t i = 0;
memcpy(&(p.data[i]), this, sizeof(UDPHeader));
i += sizeof(UDPHeader);
// копируем аналоговые данные
size_t sz = acount * sizeof(UDPAData);
memcpy(&(p.data[i]), a_dat, sz);
i += sz;
// копируем булевые индексы
sz = dcount * sizeof(long);
memcpy(&(p.data[i]), d_id, sz);
i += sz;
// копируем булевые данные
size_t nbyte = dcount / 8 * sizeof(unsigned char);
size_t nbit = dcount % 8 * sizeof(unsigned char);
sz = nbit > 0 ? nbyte + 1 : nbyte;
memcpy(&(p.data[i]), d_dat, sz);
i += sz;
p.len = i;
return i;
}
// -----------------------------------------------------------------------------
long UDPMessage::getDataID() const noexcept
{
// в качестве идентификатора берётся ID первого датчика в данных
// приоритет имеет аналоговые датчики
if( acount > 0 )
if( header.acount > 0 )
return a_dat[0].id;
if( dcount > 0 )
if( header.dcount > 0 )
return d_id[0];
// если нет данных(?) просто возвращаем номер пакета
return num;
return header.num;
}
// -----------------------------------------------------------------------------
size_t UniSetUDP::UDPMessage::sizeOf() const noexcept
size_t UniSetUDP::UDPMessage::len() const noexcept
{
return UniSetUDP::MaxDataLen;
// биты которые не уместились в очередной байт, добавляют ещё один байт
size_t nbit = dcount % 8 * sizeof(unsigned char);
size_t add = nbit > 0 ? 1 : 0;
// size_t nbit = header.dcount % 8 * sizeof(uint8_t);
// size_t add = nbit > 0 ? 1 : 0;
return sizeof(UDPHeader) + acount * sizeof(UDPAData) + dcount * sizeof(long) + (dcount / 8 * sizeof(unsigned char) + add);
// return sizeof(header) + header.acount * sizeof(UDPAData) + header.dcount * sizeof(long) + (header.dcount / 8 * sizeof(uint8_t) + add);
}
// -----------------------------------------------------------------------------
UDPMessage::UDPMessage( UDPPacket& p ) noexcept
bool UDPMessage::isOk() noexcept
{
getMessage(*this, p);
return ( header.magic != UniSetUDP::UNETUDP_MAGICNUM );
}
// -----------------------------------------------------------------------------
size_t UDPMessage::getMessage( UDPMessage& m, UDPPacket& p ) noexcept
void UDPMessage::ntoh() noexcept
{
// reset data
m = UDPMessage{};
size_t i = 0;
memcpy(&m, &(p.data[i]), sizeof(UDPHeader));
i += sizeof(UDPHeader);
// byte order from packet
u_char be_order = m._be_order;
uint8_t be_order = header._be_order;
if( be_order && !HostIsBigEndian )
{
BE_TO_H(m.magic);
BE_TO_H(m.num);
BE_TO_H(m.procID);
BE_TO_H(m.nodeID);
BE_TO_H(m.dcount);
BE_TO_H(m.acount);
BE_TO_H(header.magic);
BE_TO_H(header.num);
BE_TO_H(header.procID);
BE_TO_H(header.nodeID);
BE_TO_H(header.dcount);
BE_TO_H(header.acount);
}
else if( !be_order && HostIsBigEndian )
{
LE_TO_H(m.magic);
LE_TO_H(m.num);
LE_TO_H(m.procID);
LE_TO_H(m.nodeID);
LE_TO_H(m.dcount);
LE_TO_H(m.acount);
LE_TO_H(header.magic);
LE_TO_H(header.num);
LE_TO_H(header.procID);
LE_TO_H(header.nodeID);
LE_TO_H(header.dcount);
LE_TO_H(header.acount);
}
// set host byte order
#if __BYTE_ORDER == __LITTLE_ENDIAN
m._be_order = 0;
header._be_order = 0;
#elif __BYTE_ORDER == __BIG_ENDIAN
m. be_order = 1;
header._be_order = 1;
#else
#error UNET(getMessage): Unknown byte order!
#endif
// проверяем наш ли пакет..
if( m.magic != UniSetUDP::UNETUDP_MAGICNUM )
{
m.magic = 0;
return 0;
}
// копируем аналоговые данные
size_t sz = m.acount * sizeof(UDPAData);
if( sz > sizeof(m.a_dat) )
sz = sizeof(m.a_dat);
memcpy(m.a_dat, &(p.data[i]), sz);
i += sz;
// копируем булевые индексы
sz = m.dcount * sizeof(long);
if( sz > sizeof(m.d_id) )
sz = sizeof(m.d_id);
memcpy(m.d_id, &(p.data[i]), sz);
i += sz;
// копируем булевые данные
size_t nbyte = m.dcount / 8 * sizeof(unsigned char);
size_t nbit = m.dcount % 8 * sizeof(unsigned char);
sz = nbit > 0 ? nbyte + 1 : nbyte;
if( sz > sizeof(m.d_dat) )
sz = sizeof(m.d_dat);
memcpy(m.d_dat, &(p.data[i]), sz);
// CONVERT DATA TO HOST BYTE ORDER
// -------------------------------
if( (be_order && !HostIsBigEndian) || (!be_order && HostIsBigEndian) )
{
for( size_t n = 0; n < m.acount; n++ )
for( size_t n = 0; n < header.acount; n++ )
{
if( be_order )
{
BE_TO_H(m.a_dat[n].id);
BE_TO_H(m.a_dat[n].val);
BE_TO_H(a_dat[n].id);
BE_TO_H(a_dat[n].val);
}
else
{
LE_TO_H(m.a_dat[n].id);
LE_TO_H(m.a_dat[n].val);
LE_TO_H(a_dat[n].id);
LE_TO_H(a_dat[n].val);
}
}
for( size_t n = 0; n < m.dcount; n++ )
for( size_t n = 0; n < header.dcount; n++ )
{
if( be_order )
{
BE_TO_H(m.d_id[n]);
BE_TO_H(d_id[n]);
}
else
{
LE_TO_H(m.d_id[n]);
LE_TO_H(d_id[n]);
}
}
}
return i + sz;
}
// -----------------------------------------------------------------------------
uint16_t UDPMessage::getDataCRC() const noexcept
......
......@@ -28,13 +28,13 @@ namespace uniset
namespace UniSetUDP
{
/*! Для оптимизации размера передаваемых данных, но с учётом того, что ID могут идти не подряд.
Сделан следующий формат:
Для аналоговых величин передаётся массив пар "id-value"(UDPAData).
Для булевых величин - отдельно массив ID и отдельно битовый массив со значениями,
(по количеству битов такого же размера).
Сделан следующий формат:
Для аналоговых величин передаётся массив пар "id-value"(UDPAData).
Для булевых величин - отдельно массив ID и отдельно битовый массив со значениями,
(по количеству битов такого же размера).
\todo Подумать на тему сделать два отдельных вида пакетов для булевых значений и для аналоговых,
чтобы уйти от преобразования UDPMessage --> UDPPacket --> UDPMessage.
\todo Подумать на тему сделать два отдельных вида пакетов для булевых значений и для аналоговых,
чтобы уйти от преобразования UDPMessage --> UDPPacket --> UDPMessage.
\warning ТЕКУЩАЯ ВЕРСИЯ ПРОТОКОЛА НЕ БУДЕТ РАБОТАТЬ МЕЖДУ 32-битными и 64-битными системами (из-за отличия в типе long).
т.к. это не сильно актуально, пока не переделываю.
......@@ -49,20 +49,18 @@ namespace uniset
Т.е. если все узлы будут иметь одинаковый порядок байт, фактического перекодирования не будет.
*/
const uint32_t UNETUDP_MAGICNUM = 0x133EF54; // идентификатор протокола
const uint32_t UNETUDP_MAGICNUM = 0x1343EFD; // идентификатор протокола
struct UDPHeader
{
UDPHeader() noexcept;
uint32_t magic;
u_char _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;
long nodeID;
long procID;
size_t dcount; /*!< количество булевых величин */
size_t acount; /*!< количество аналоговых величин */
} __attribute__((packed));
std::ostream& operator<<( std::ostream& os, UDPHeader& p );
......@@ -89,35 +87,15 @@ namespace uniset
// в сеть посылается фактическое количество данных, а не sizeof(UDPPacket).
// При текущих настройках sizeof(UDPPacket) = 72679 (!)
static const size_t MaxACount = 2000;
static const size_t MaxDCount = 5000;
static const size_t MaxACount = 1000;
static const size_t MaxDCount = 3000;
static const size_t MaxDDataCount = 1 + MaxDCount / 8 * sizeof(unsigned char);
struct UDPPacket
struct UDPMessage
{
UDPPacket() noexcept: len(0) {} // -V730
size_t len;
uint8_t data[ sizeof(UDPHeader) + MaxDCount * sizeof(long) + MaxDDataCount + MaxACount * sizeof(UDPAData) ];
} __attribute__((packed));
static const size_t MaxDataLen = sizeof(UDPPacket);
struct UDPMessage:
public UDPHeader
{
UDPMessage() noexcept;
UDPMessage(UDPMessage&& m) noexcept = default;
UDPMessage& operator=(UDPMessage&&) noexcept = default;
UDPMessage( const UDPMessage& m ) noexcept = default;
UDPMessage& operator=(const UDPMessage&) noexcept = default;
explicit UDPMessage( UDPPacket& p ) noexcept;
size_t transport_msg( UDPPacket& p ) const noexcept;
static size_t getMessage( UDPMessage& m, UDPPacket& p ) noexcept;
// net to host
void ntoh() noexcept;
bool isOk() noexcept;
// \warning в случае переполнения возвращается MaxDCount
size_t addDData( long id, bool val ) noexcept;
......@@ -143,47 +121,57 @@ namespace uniset
inline bool isAFull() const noexcept
{
return (acount >= MaxACount);
return (header.acount >= MaxACount);
}
inline bool isDFull() const noexcept
{
return (dcount >= MaxDCount);
return (header.dcount >= MaxDCount);
}
inline bool isFull() const noexcept
{
return !((dcount < MaxDCount) && (acount < MaxACount));
return !((header.dcount < MaxDCount) && (header.acount < MaxACount));
}
inline size_t dsize() const noexcept
{
return dcount;
return header.dcount;
}
inline size_t asize() const noexcept
{
return acount;
return header.acount;
}
// размер итогового пакета в байтах
size_t sizeOf() const noexcept;
size_t len() const noexcept;
uint16_t getDataCRC() const noexcept;
// количество байт в пакете с булевыми переменными...
size_t d_byte() const noexcept
{
return dcount * sizeof(long) + dcount;
return header.dcount * sizeof(long) + header.dcount;
}
UDPHeader header;
UDPAData a_dat[MaxACount]; /*!< аналоговые величины */
long d_id[MaxDCount]; /*!< список дискретных ID */
uint8_t d_dat[MaxDDataCount]; /*!< битовые значения */
};
} __attribute__((packed));
std::ostream& operator<<( std::ostream& os, UDPMessage& p );
uint16_t makeCRC( unsigned char* buf, size_t len ) noexcept;
static const size_t MaxDataLen = sizeof(UDPHeader) + MaxDCount * sizeof(long) + MaxDDataCount + MaxACount * sizeof(UDPAData);
union UDPPacket
{
UDPPacket():msg(){};
uint8_t raw[MaxDataLen];
UDPMessage msg;
};
}
// --------------------------------------------------------------------------
} // end of namespace uniset
......
......@@ -29,26 +29,16 @@ using namespace uniset;
using namespace uniset::extensions;
// -----------------------------------------------------------------------------
CommonEventLoop UNetReceiver::loop;
static UniSetUDP::UDPPacket defpack;
// -----------------------------------------------------------------------------
UNetReceiver::UNetReceiver(const std::string& s_host, int _port
, const std::shared_ptr<SMInterface>& smi
, bool nocheckConnection
, const std::string& prefix ):
shm(smi),
updatepause(100),
port(_port),
saddr(s_host, _port),
recvTimeout(5000),
prepareTime(2000),
lostTimeout(200), /* 2*updatepause */
lostPackets(0),
sidRespond(uniset::DefaultObjectId),
respondInvert(false),
sidLostPackets(uniset::DefaultObjectId),
activated(false),
cbuf(cbufSize),
maxDifferens(20),
lockUpdate(false)
cbuf(cbufSize)
{
{
ostringstream s;
......@@ -347,9 +337,9 @@ size_t UNetReceiver::rnext( size_t num )
while( i < wnum )
{
p = &cbuf[i % cbufSize];
p = &cbuf[i % cbufSize].msg;
if( p->num > num )
if( p->header.num > num )
return i;
i++;
......@@ -373,21 +363,23 @@ void UNetReceiver::update() noexcept
// либо обнаружится "дырка" в последовательности,
while( rnum < wnum )
{
p = &cbuf[rnum % cbufSize];
p = &(cbuf[rnum % cbufSize].msg);
// cout << "update: num=" << p->header.num << " rnum=" << rnum << " wnum=" << wnum << endl;
// если номер пакета не равен ожидаемому, ждём считая что это "дырка"
// т.к. разрывы и другие случаи обрабатываются при приёме пакетов
if( p->num != rnum )
if( p->header.num != rnum )
{
if( !ptLostTimeout.checkTime() )
return;
size_t sub = 1;
if( p->num > rnum )
sub = (p->num - rnum);
if( p->header.num > rnum )
sub = (p->header.num - rnum);
unetwarn << myname << "(update): lostTimeout(" << ptLostTimeout.getInterval() << ")! pnum=" << p->num << " lost " << sub << " packets " << endl;
unetwarn << myname << "(update): lostTimeout(" << ptLostTimeout.getInterval() << ")! pnum=" << p->header.num << " lost " << sub << " packets " << endl;
lostPackets += sub;
// ищем следующий пакет для обработки
......@@ -402,7 +394,7 @@ void UNetReceiver::update() noexcept
// Обработка дискретных
auto d_iv = getDCache(p);
for( size_t i = 0; i < p->dcount; i++ )
for( size_t i = 0; i < p->header.dcount; i++ )
{
try
{
......@@ -424,7 +416,7 @@ void UNetReceiver::update() noexcept
}
catch( const uniset::Exception& ex)
{
unetcrit << myname << "(update): "
unetcrit << myname << "(update): D:"
<< " id=" << s_id
<< " val=" << p->dValue(i)
<< " error: " << ex
......@@ -432,7 +424,7 @@ void UNetReceiver::update() noexcept
}
catch(...)
{
unetcrit << myname << "(update): "
unetcrit << myname << "(update): D:"
<< " id=" << s_id
<< " val=" << p->dValue(i)
<< " error: catch..."
......@@ -443,7 +435,7 @@ void UNetReceiver::update() noexcept
// Обработка аналоговых
auto a_iv = getACache(p);
for( size_t i = 0; i < p->acount; i++ )
for( size_t i = 0; i < p->header.acount; i++ )
{
try
{
......@@ -465,7 +457,7 @@ void UNetReceiver::update() noexcept
}
catch( const uniset::Exception& ex)
{
unetcrit << myname << "(update): "
unetcrit << myname << "(update): A:"
<< " id=" << dat->id
<< " val=" << dat->val
<< " error: " << ex
......@@ -473,7 +465,7 @@ void UNetReceiver::update() noexcept
}
catch(...)
{
unetcrit << myname << "(update): "
unetcrit << myname << "(update): A:"
<< " id=" << dat->id
<< " val=" << dat->val
<< " error: catch..."
......@@ -630,8 +622,9 @@ bool UNetReceiver::receive() noexcept
{
try
{
ssize_t ret = udp->receiveBytes(r_buf.data, sizeof(r_buf.data));
recvCount++;
// сперва пробуем сохранить пакет в том месте, где должен быть очередной пакет
pack = &(cbuf[wnum % cbufSize]);
ssize_t ret = udp->receiveBytes(pack->raw, sizeof(pack->raw) /* UniSetUDP::MaxDataLen */);
if( ret < 0 )
{
......@@ -641,27 +634,24 @@ bool UNetReceiver::receive() noexcept
if( ret == 0 )
{
unetwarn << myname << "(receive): disconnected?!... recv 0 byte.." << endl;
unetwarn << myname << "(receive): disconnected?!... recv 0 bytes.." << endl;
return false;
}
// сперва пробуем сохранить пакет в том месте, где должен быть очередной пакет
pack = &cbuf[wnum % cbufSize];
size_t sz = UniSetUDP::UDPMessage::getMessage(*pack, r_buf);
recvCount++;
if( sz == 0 )
{
unetcrit << myname << "(receive): FAILED RECEIVE DATA ret=" << ret << endl;
return false;
}
// конвертируем byte order
pack->msg.ntoh();
if( pack->magic != UniSetUDP::UNETUDP_MAGICNUM )
if( pack->msg.header.magic != UniSetUDP::UNETUDP_MAGICNUM )
return false;
if( size_t(abs(long(pack->num - wnum))) > maxDifferens || size_t(abs( long(wnum - rnum) )) >= (cbufSize - 2) )
// cout << "RECV[" << ret << "]: msg: " << pack->msg << endl;
if( size_t(abs(long(pack->msg.header.num - wnum))) > maxDifferens || size_t(abs( long(wnum - rnum) )) >= (cbufSize - 2) )
{
unetcrit << myname << "(receive): DISAGREE "
<< " packnum=" << pack->num
<< " packnum=" << pack->msg.header.num
<< " wnum=" << wnum
<< " rnum=" << rnum
<< " (maxDiff=" << maxDifferens
......@@ -669,40 +659,41 @@ bool UNetReceiver::receive() noexcept
<< ")"
<< endl;
lostPackets = pack->num > wnum ? (pack->num - wnum - 1) : lostPackets + 1;
lostPackets = pack->msg.header.num > wnum ? (pack->msg.header.num - wnum - 1) : lostPackets + 1;
// реинициализируем позицию для чтения
rnum = pack->num;
wnum = pack->num + 1;
rnum = pack->msg.header.num;
wnum = pack->msg.header.num + 1;
// перемещаем пакет в нужное место (если требуется)
if( wnum != pack->num )
if( wnum != pack->msg.header.num )
{
cbuf[pack->num % cbufSize] = (*pack);
pack->num = 0;
cbuf[pack->msg.header.num % cbufSize].msg = pack->msg;
pack->msg.header.num = 0;
}
return true;
}
if( pack->num != wnum )
if( pack->msg.header.num != wnum )
{
// перемещаем пакет в правильное место
// в соответствии с его номером
cbuf[pack->num % cbufSize] = (*pack);
cbuf[pack->msg.header.num % cbufSize].msg = pack->msg;
if( pack->num >= wnum )
wnum = pack->num + 1;
if( pack->msg.header.num >= wnum )
wnum = pack->msg.header.num + 1;
// обнуляем номер в том месте где записали, чтобы его не обрабатывал update
pack->num = 0;
pack->msg.header.num = 0;
}
else if( pack->num >= wnum )
wnum = pack->num + 1;
else if( pack->msg.header.num >= wnum )
wnum = pack->msg.header.num + 1;
// начальная инициализация для чтения
if( rnum == 0 )
rnum = pack->num;
rnum = pack->msg.header.num;
// cout << "FINAL: msg: " << cbuf[(wnum-1) % cbufSize].msg << endl;
return true;
}
catch( Poco::Net::NetException& ex )
......@@ -748,14 +739,14 @@ UNetReceiver::CacheVec* UNetReceiver::getDCache( UniSetUDP::UDPMessage* pack ) n
CacheVec* d_info = &dit->second;
if( pack->dcount == d_info->size() )
if( pack->header.dcount == d_info->size() )
return d_info;
unetinfo << myname << ": init dcache[" << pack->dcount << "] for " << pack->getDataID() << endl;
unetinfo << myname << ": init dcache[" << pack->header.dcount << "] for " << pack->getDataID() << endl;
d_info->resize(pack->dcount);
d_info->resize(pack->header.dcount);
for( size_t i = 0; i < pack->dcount; i++ )
for( size_t i = 0; i < pack->header.dcount; i++ )
{
CacheItem& d = (*d_info)[i];
......@@ -781,14 +772,14 @@ UNetReceiver::CacheVec* UNetReceiver::getACache( UniSetUDP::UDPMessage* pack ) n
CacheVec* a_info = &ait->second;
if( pack->acount == a_info->size() )
if( pack->header.acount == a_info->size() )
return a_info;
unetinfo << myname << ": init acache[" << pack->acount << "] for " << pack->getDataID() << endl;
unetinfo << myname << ": init acache[" << pack->header.acount << "] for " << pack->getDataID() << endl;
a_info->resize(pack->acount);
a_info->resize(pack->header.acount);
for( size_t i = 0; i < pack->acount; i++ )
for( size_t i = 0; i < pack->header.acount; i++ )
{
CacheItem& d = (*a_info)[i];
......
......@@ -234,18 +234,16 @@ namespace uniset
uniset::ObjectId sidRespond = { uniset::DefaultObjectId };
IOController::IOStateList::iterator itRespond;
bool respondInvert = { false };
uniset::ObjectId sidLostPackets;
uniset::ObjectId sidLostPackets = { uniset::DefaultObjectId };
IOController::IOStateList::iterator itLostPackets;
std::atomic_bool activated = { false };
size_t cbufSize = { 100 }; /*!< размер буфера для сообщений по умолчанию */
std::vector<UniSetUDP::UDPMessage> cbuf; // circular buffer
std::vector<UniSetUDP::UDPPacket> cbuf; // circular buffer
size_t wnum = { 1 }; /*!< номер следующего ожидаемого пакета */
size_t rnum = { 0 }; /*!< номер последнего обработанного пакета */
UniSetUDP::UDPMessage* pack;
UniSetUDP::UDPPacket r_buf; /*!< просто буфер для получения очередного сообщения */
UniSetUDP::UDPPacket* pack; // текущий обрабатываемый пакет
/*! максимальная разница между номерами пакетов, при которой считается, что счётчик пакетов
* прошёл через максимум или сбился...
......
......@@ -87,8 +87,8 @@ namespace uniset
// выставляем поля, которые не меняются
{
uniset_rwmutex_wrlock l(mypack.mut);
mypack.msg.nodeID = uniset_conf()->getLocalNode();
mypack.msg.procID = shm->ID();
mypack.p.msg.header.nodeID = uniset_conf()->getLocalNode();
mypack.p.msg.header.procID = shm->ID();
}
// -------------------------------
......@@ -200,9 +200,9 @@ namespace uniset
uniset::uniset_rwmutex_wrlock l(mypack.mut);
if( it.iotype == UniversalIO::DI || it.iotype == UniversalIO::DO )
mypack.msg.setDData(it.pack_ind, value);
mypack.p.msg.setDData(it.pack_ind, value);
else if( it.iotype == UniversalIO::AI || it.iotype == UniversalIO::AO )
mypack.msg.setAData(it.pack_ind, value);
mypack.p.msg.setAData(it.pack_ind, value);
}
// -----------------------------------------------------------------------------
void UNetSender::setCheckConnectionPause( int msec )
......@@ -313,11 +313,11 @@ namespace uniset
#ifdef UNETUDP_DISABLE_OPTIMIZATION_N1
mypack.msg.num = packetnum++;
#else
uint16_t crc = mypack.msg.getDataCRC();
uint16_t crc = mypack.p.msg.getDataCRC();
if( crc != lastcrc )
{
mypack.msg.num = packetnum++;
mypack.p.msg.header.num = packetnum++;
lastcrc = crc;
}
......@@ -331,12 +331,10 @@ namespace uniset
if( !udp || !udp->poll( UniSetTimer::millisecToPoco(writeTimeout), Poco::Net::Socket::SELECT_WRITE) )
return;
mypack.msg.transport_msg(s_msg);
size_t ret = udp->sendTo(mypack.p.raw, mypack.p.msg.len(), saddr);
size_t ret = udp->sendTo(&s_msg.data, s_msg.len, saddr);
if( ret < s_msg.len )
unetcrit << myname << "(real_send): FAILED ret=" << ret << " < sizeof=" << s_msg.len << endl;
if( ret < mypack.p.msg.len() )
unetcrit << myname << "(real_send): FAILED ret=" << ret << " < sizeof=" << mypack.p.msg.len() << endl;
}
catch( Poco::Net::NetException& ex )
{
......@@ -457,7 +455,7 @@ namespace uniset
{
uniset_rwmutex_wrlock l(mypack.mut);
p.pack_ind = mypack.msg.addDData(sid, defval);
p.pack_ind = mypack.p.msg.addDData(sid, defval);
} // unlock mutex....
if( p.pack_ind >= maxDData )
......@@ -469,9 +467,9 @@ namespace uniset
auto& mypack2 = pk[dnum];
uniset_rwmutex_wrlock l2(mypack2.mut);
p.pack_ind = mypack2.msg.addDData(sid, defval);
mypack2.msg.nodeID = uniset_conf()->getLocalNode();
mypack2.msg.procID = shm->ID();
p.pack_ind = mypack2.p.msg.addDData(sid, defval);
mypack2.p.msg.header.nodeID = uniset_conf()->getLocalNode();
mypack2.p.msg.header.procID = shm->ID();
}
p.pack_num = dnum;
......@@ -498,7 +496,7 @@ namespace uniset
{
uniset_rwmutex_wrlock l(mypack.mut);
p.pack_ind = mypack.msg.addAData(sid, defval);
p.pack_ind = mypack.p.msg.addAData(sid, defval);
}
if( p.pack_ind >= maxAData )
......@@ -510,9 +508,9 @@ namespace uniset
auto& mypack2 = pk[anum];
uniset_rwmutex_wrlock l2(mypack2.mut);
p.pack_ind = mypack2.msg.addAData(sid, defval);
mypack2.msg.nodeID = uniset_conf()->getLocalNode();
mypack2.msg.procID = shm->ID();
p.pack_ind = mypack2.p.msg.addAData(sid, defval);
mypack2.p.msg.header.nodeID = uniset_conf()->getLocalNode();
mypack2.p.msg.header.procID = shm->ID();
}
p.pack_num = anum;
......@@ -589,11 +587,11 @@ namespace uniset
s << " \t[" << i->first << "]=" << i->second.size() << endl;
size_t n = 0;
for( const auto& p : i->second )
for( const auto& pack : i->second )
{
//uniset_rwmutex_rlock l(p->mut);
s << " \t\t[" << (n++) << "]=" << p.msg.sizeOf() << " bytes"
<< " ( numA=" << setw(5) << p.msg.asize() << " numD=" << setw(5) << p.msg.dsize() << ")"
s << " \t\t[" << (n++) << "]=" << pack.p.msg.len() << " bytes"
<< " ( numA=" << setw(5) << pack.p.msg.asize() << " numD=" << setw(5) << pack.p.msg.dsize() << ")"
<< endl;
}
}
......
......@@ -114,12 +114,12 @@ namespace uniset
struct PackMessage
{
PackMessage( UniSetUDP::UDPMessage&& m ) noexcept: msg(std::move(m)) {}
PackMessage( const UniSetUDP::UDPMessage& m ) = delete;
PackMessage( uniset::UniSetUDP::UDPPacket&& p ) noexcept: p(std::move(p)) {}
PackMessage( const uniset::UniSetUDP::UDPPacket& p ) = delete;
PackMessage() noexcept {}
UniSetUDP::UDPMessage msg;
uniset::UniSetUDP::UDPPacket p;
uniset::uniset_rwmutex mut;
};
......@@ -223,7 +223,6 @@ namespace uniset
UItemMap items;
size_t packetnum = { 1 }; /*!< номер очередного посылаемого пакета */
uint16_t lastcrc = { 0 };
UniSetUDP::UDPPacket s_msg;
size_t maxAData = { UniSetUDP::MaxACount };
size_t maxDData = { UniSetUDP::MaxDCount };
......
......@@ -56,24 +56,22 @@ void InitTest()
}
// -----------------------------------------------------------------------------
// pnum - минималный номер ожидаемого пакета ( 0 - любой пришедщий )
// ncycle - сколько пакетов разрешено "пропустить" прежде чем дождёмся нужного.. (чтобы не ждать бесконечно)
static UniSetUDP::UDPMessage receive( unsigned int pnum = 0, timeout_t tout = 2000, int ncycle = 20 )
// ncycle - сколько пакетов разрешено "пропустить" прежде чем дождёмся нужного. (чтобы не ждать бесконечно)
static UniSetUDP::UDPPacket receive( unsigned int pnum = 0, timeout_t tout = 2000, int ncycle = 20 )
{
UniSetUDP::UDPMessage pack;
UniSetUDP::UDPPacket buf;
UniSetUDP::UDPPacket pack;
while( ncycle > 0 )
{
if( !udp_r->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_READ) )
break;
size_t ret = udp_r->receiveBytes(&(buf.data), sizeof(buf.data) );
size_t sz = UniSetUDP::UDPMessage::getMessage(pack, buf);
size_t ret = udp_r->receiveBytes(pack.raw, sizeof(pack.raw) );
if( sz == 0 || pnum == 0 || ( pnum > 0 && pack.num >= pnum ) ) // -V560
if( ret <= 0 || pnum == 0 || ( pnum > 0 && pack.msg.header.num >= pnum ) ) // -V560
break;
REQUIRE( pack.magic == UniSetUDP::UNETUDP_MAGICNUM );
REQUIRE( pack.msg.header.magic == UniSetUDP::UNETUDP_MAGICNUM );
ncycle--;
}
......@@ -83,19 +81,52 @@ static UniSetUDP::UDPMessage receive( unsigned int pnum = 0, timeout_t tout = 20
return pack;
}
// -----------------------------------------------------------------------------
void send( UniSetUDP::UDPMessage& pack, int tout = 2000 )
void send( UniSetUDP::UDPPacket& pack, int tout = 2000 )
{
CHECK( udp_s->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_WRITE) );
pack.nodeID = s_nodeID;
pack.procID = s_procID;
pack.num = s_numpack++;
pack.msg.header.nodeID = s_nodeID;
pack.msg.header.procID = s_procID;
pack.msg.header.num = s_numpack++;
UniSetUDP::UDPPacket s_buf;
pack.transport_msg(s_buf);
size_t ret = udp_s->sendTo(&s_buf.data, s_buf.len, s_addr);
REQUIRE( ret == s_buf.len );
size_t ret = udp_s->sendTo(pack.raw, pack.msg.len(), s_addr);
REQUIRE( ret == pack.msg.len() );
}
// -----------------------------------------------------------------------------
TEST_CASE("[UNetUDP]: repack", "[unetudp][repack]")
{
UniSetUDP::UDPPacket pack;
pack.msg.header.nodeID = 100;
pack.msg.header.procID = 100;
pack.msg.header.num = 1;
pack.msg.addDData(1,1);
pack.msg.addDData(2,0);
pack.msg.addAData(3,30);
pack.msg.addAData(4,40);
REQUIRE(pack.msg.header.magic == UniSetUDP::UNETUDP_MAGICNUM);
UniSetUDP::UDPPacket pack2;
memcpy(pack2.raw, pack.raw, sizeof(pack2.raw));
pack2.msg.ntoh();
REQUIRE(pack2.msg.header.nodeID == 100);
REQUIRE(pack2.msg.header.procID == 100);
REQUIRE(pack2.msg.header.num == 1);
REQUIRE(pack2.msg.header.magic == UniSetUDP::UNETUDP_MAGICNUM);
REQUIRE(pack2.msg.dID(0) == 1);
REQUIRE(pack2.msg.dValue(0) == true);
REQUIRE(pack2.msg.dID(1) == 2);
REQUIRE(pack2.msg.dValue(1) == false);
REQUIRE(pack2.msg.dID(1) == 2);
REQUIRE(pack2.msg.a_dat[0].id == 3);
REQUIRE(pack2.msg.a_dat[0].val == 30);
REQUIRE(pack2.msg.a_dat[1].id == 4);
REQUIRE(pack2.msg.a_dat[1].val == 40);
}
// -----------------------------------------------------------------------------
TEST_CASE("[UNetUDP]: UDPMessage", "[unetudp][udpmessage]")
{
SECTION("UDPMessage::isFull()")
......@@ -122,41 +153,17 @@ TEST_CASE("[UNetUDP]: UDPMessage", "[unetudp][udpmessage]")
CHECK( u.isFull() );
}
SECTION("UDPMessage transport..")
{
// создаём сообщение, преобразуем к Package.. потом обратно.. проверяём, что информация не исказилась
UniSetUDP::UDPMessage u;
size_t a = u.addAData(100, 100);
size_t d = u.addDData(110, true);
UniSetUDP::UDPPacket p;
size_t len = u.transport_msg(p);
CHECK( len != 0 );
REQUIRE( a < UniSetUDP::MaxACount );
REQUIRE( d < UniSetUDP::MaxDCount );
UniSetUDP::UDPMessage u2(p);
REQUIRE( u2.a_dat[a].id == 100 );
REQUIRE( u2.a_dat[a].val == 100 );
REQUIRE( u2.dID(d) == 110 );
REQUIRE( u2.dValue(d) == true );
}
}
// -----------------------------------------------------------------------------
TEST_CASE("[UNetUDP]: sizeOf", "[unetudp][sizeof]")
TEST_CASE("[UNetUDP]: len", "[unetudp][len]")
{
UniSetUDP::UDPMessage m;
REQUIRE( m.sizeOf() == sizeof(UniSetUDP::UDPHeader) );
UniSetUDP::UDPPacket p;
m.addAData(8, 70);
REQUIRE( p.msg.len() == sizeof(UniSetUDP::UDPHeader) );
REQUIRE( m.sizeOf() == sizeof(UniSetUDP::UDPHeader) + sizeof(UniSetUDP::UDPAData) );
p.msg.addAData(8, 70);
UniSetUDP::UDPPacket p;
size_t len = m.transport_msg(p);
REQUIRE( len == m.sizeOf() );
REQUIRE( p.msg.len() == sizeof(UniSetUDP::UDPHeader) + sizeof(UniSetUDP::UDPAData) );
}
// -----------------------------------------------------------------------------
#if 0
......@@ -178,70 +185,70 @@ TEST_CASE("[UNetUDP]: check sender", "[unetudp][sender]")
{
InitTest();
SECTION("Test: read default pack...")
SECTION("Test: read default pack..")
{
UniSetUDP::UDPMessage pack = receive();
REQUIRE( pack.num != 0 );
REQUIRE( pack.asize() == 4 );
REQUIRE( pack.dsize() == 2 );
UniSetUDP::UDPPacket p = receive();
REQUIRE( p.msg.header.num != 0 );
REQUIRE( p.msg.asize() == 4 );
REQUIRE( p.msg.dsize() == 2 );
for( size_t i = 0; i < pack.asize(); i++ )
for( size_t i = 0; i < p.msg.asize(); i++ )
{
REQUIRE( pack.a_dat[i].val == i + 1 );
REQUIRE( p.msg.a_dat[i].val == i + 1 );
}
REQUIRE( pack.dValue(0) == 1 );
REQUIRE( pack.dValue(1) == 0 );
REQUIRE( p.msg.dValue(0) == true );
REQUIRE( p.msg.dValue(1) == false );
// т.к. данные в SM не менялись, то должен придти пакет с тем же номером что и был..
UniSetUDP::UDPMessage pack2 = receive();
REQUIRE( pack2.num == pack.num );
// т.к. данные в SM не менялись, то должен придти пакет с тем же номером что и был.
UniSetUDP::UDPPacket p2 = receive();
REQUIRE( p2.msg.header.num == p.msg.header.num );
}
SECTION("Test: change AI data...")
SECTION("Test: change AI data..")
{
UniSetUDP::UDPMessage pack0 = receive();
UniSetUDP::UDPPacket pack0 = receive();
ui->setValue(2, 100);
REQUIRE( ui->getValue(2) == 100 );
msleep(120);
UniSetUDP::UDPMessage pack = receive( pack0.num + 1 );
REQUIRE( pack.num != 0 );
REQUIRE( pack.asize() == 4 );
REQUIRE( pack.dsize() == 2 );
REQUIRE( pack.a_dat[0].val == 100 );
UniSetUDP::UDPPacket pack = receive( pack0.msg.header.num + 1 );
REQUIRE( pack.msg.header.num != 0 );
REQUIRE( pack.msg.asize() == 4 );
REQUIRE( pack.msg.dsize() == 2 );
REQUIRE( pack.msg.a_dat[0].val == 100 );
ui->setValue(2, 250);
REQUIRE( ui->getValue(2) == 250 );
msleep(120);
UniSetUDP::UDPMessage pack2 = receive( pack.num + 1 );
REQUIRE( pack2.num != 0 );
REQUIRE( pack2.num > pack.num );
REQUIRE( pack2.asize() == 4 );
REQUIRE( pack2.dsize() == 2 );
REQUIRE( pack2.a_dat[0].val == 250 );
UniSetUDP::UDPPacket pack2 = receive( pack.msg.header.num + 1 );
REQUIRE( pack2.msg.header.num != 0 );
REQUIRE( pack2.msg.header.num > pack.msg.header.num );
REQUIRE( pack2.msg.asize() == 4 );
REQUIRE( pack2.msg.dsize() == 2 );
REQUIRE( pack2.msg.a_dat[0].val == 250 );
}
SECTION("Test: change DI data...")
SECTION("Test: change DI data..")
{
UniSetUDP::UDPMessage pack0 = receive();
UniSetUDP::UDPPacket pack0 = receive();
ui->setValue(6, 1);
REQUIRE( ui->getValue(6) == 1 );
msleep(120);
UniSetUDP::UDPMessage pack = receive( pack0.num + 1 );
REQUIRE( pack.num != 0 );
REQUIRE( pack.asize() == 4 );
REQUIRE( pack.dsize() == 2 );
REQUIRE( pack.dValue(0) == 1 );
UniSetUDP::UDPPacket pack = receive( pack0.msg.header.num + 1 );
REQUIRE( pack.msg.header.num != 0 );
REQUIRE( pack.msg.asize() == 4 );
REQUIRE( pack.msg.dsize() == 2 );
REQUIRE( pack.msg.dValue(0) == true );
ui->setValue(6, 0);
REQUIRE( ui->getValue(6) == 0 );
msleep(120);
UniSetUDP::UDPMessage pack2 = receive( pack.num + 1 );
REQUIRE( pack2.num != 0 );
REQUIRE( pack2.num > pack.num );
REQUIRE( pack2.asize() == 4 );
REQUIRE( pack2.dsize() == 2 );
REQUIRE( pack2.dValue(0) == 0 );
UniSetUDP::UDPPacket pack2 = receive( pack.msg.header.num + 1 );
REQUIRE( pack2.msg.header.num != 0 );
REQUIRE( pack2.msg.header.num > pack.msg.header.num );
REQUIRE( pack2.msg.asize() == 4 );
REQUIRE( pack2.msg.dsize() == 2 );
REQUIRE( pack2.msg.dValue(0) == false );
}
}
// -----------------------------------------------------------------------------
......@@ -249,15 +256,15 @@ TEST_CASE("[UNetUDP]: check receiver", "[unetudp][receiver]")
{
InitTest();
SECTION("Test: send data pack...")
SECTION("Test: send data pack..")
{
REQUIRE( ui->getValue(node2_respond_s) == 0 );
UniSetUDP::UDPMessage pack;
pack.addAData(8, 100);
pack.addAData(9, -100);
pack.addDData(10, true);
pack.addDData(11, false);
UniSetUDP::UDPPacket pack;
pack.msg.addAData(8, 100);
pack.msg.addAData(9, -100);
pack.msg.addDData(10, true);
pack.msg.addDData(11, false);
REQUIRE( ui->getValue(8) == 0 );
REQUIRE( ui->getValue(9) == 0 );
......@@ -275,13 +282,13 @@ TEST_CASE("[UNetUDP]: check receiver", "[unetudp][receiver]")
// msleep(1500);
// REQUIRE( ui->getValue(node2_respond_s) == 1 );
}
SECTION("Test: send data pack2..")
SECTION("Test: send data pack2.")
{
UniSetUDP::UDPMessage pack;
pack.addAData(8, 10);
pack.addAData(9, -10);
pack.addDData(10, false);
pack.addDData(11, true);
UniSetUDP::UDPPacket pack;
pack.msg.addAData(8, 10);
pack.msg.addAData(9, -10);
pack.msg.addDData(10, false);
pack.msg.addDData(11, true);
send(pack);
msleep(600);
REQUIRE( ui->getValue(8) == 10 );
......@@ -299,9 +306,9 @@ TEST_CASE("[UNetUDP]: check packets 'hole'", "[unetudp][udphole]")
{
InitTest();
// проверяем обработку "дырок" в пакетах..
UniSetUDP::UDPMessage pack;
pack.addAData(8, 15);
// проверяем обработку "дырок" в пакетах.
UniSetUDP::UDPPacket pack;
pack.msg.addAData(8, 15);
send(pack);
msleep(120);
REQUIRE( ui->getValue(8) == 15 );
......@@ -312,8 +319,8 @@ TEST_CASE("[UNetUDP]: check packets 'hole'", "[unetudp][udphole]")
// искусственно делаем дырку в два пакета
s_numpack = lastnum + 3;
UniSetUDP::UDPMessage pack_hole;
pack_hole.addAData(8, 30);
UniSetUDP::UDPPacket pack_hole;
pack_hole.msg.addAData(8, 30);
send(pack_hole); // пакет с дыркой
msleep(80);
......@@ -321,24 +328,24 @@ TEST_CASE("[UNetUDP]: check packets 'hole'", "[unetudp][udphole]")
REQUIRE( ui->getValue(node2_lostpackets_as) == nlost );
s_numpack = lastnum + 1;
UniSetUDP::UDPMessage pack1;
pack1.addAData(8, 21);
send(pack1); // заполняем первую дырку..// дырка закроется.. пакет тут же обработается
UniSetUDP::UDPPacket pack1;
pack1.msg.addAData(8, 21);
send(pack1); // заполняем первую дырку.// дырка закроется. пакет тут же обработается
msleep(100);
REQUIRE( ui->getValue(8) == 21 );
REQUIRE( ui->getValue(node2_lostpackets_as) == nlost );
s_numpack = lastnum + 2;
UniSetUDP::UDPMessage pack2;
pack2.addAData(8, 25);
UniSetUDP::UDPPacket pack2;
pack2.msg.addAData(8, 25);
send(pack2); // заполняем следующую дырку
msleep(120);
// тут обработка дойдёт уже до "первого" пакета..
// тут обработка дойдёт уже до "первого" пакета.
REQUIRE( ui->getValue(8) == 30 );
REQUIRE( ui->getValue(node2_lostpackets_as) == nlost );
// возвращаем к нормальному..чтобы следующие тесты не поломались..
// возвращаем к нормальному.чтобы следующие тесты не поломались.
for( int i = 0; i < 10; i++ )
{
send(pack2);
......@@ -350,9 +357,9 @@ TEST_CASE("[UNetUDP]: check packets 'MaxDifferens'", "[unetudp][maxdifferens]")
{
InitTest();
// проверяем обработку "дырок" в пакетах..
UniSetUDP::UDPMessage pack;
pack.addAData(8, 50);
// проверяем обработку "дырок" в пакетах.
UniSetUDP::UDPPacket pack;
pack.msg.addAData(8, 50);
send(pack);
msleep(1000);
......@@ -364,8 +371,8 @@ TEST_CASE("[UNetUDP]: check packets 'MaxDifferens'", "[unetudp][maxdifferens]")
// искуственно делаем дырку в два пакета
s_numpack += maxDifferense + 1;
UniSetUDP::UDPMessage pack_hole;
pack_hole.addAData(8, 150);
UniSetUDP::UDPPacket pack_hole;
pack_hole.msg.addAData(8, 150);
send(pack_hole); // пакет с дыркой > maxDifference (должен обработаться)
msleep(120);
......@@ -379,8 +386,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]")
InitTest();
// посылаем нормальный пакет
UniSetUDP::UDPMessage pack;
pack.addAData(8, 60);
UniSetUDP::UDPPacket pack;
pack.msg.addAData(8, 60);
send(pack);
msleep(150);
REQUIRE( ui->getValue(8) == 60 );
......@@ -389,8 +396,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]")
// посылаем пакет с тем же номером
s_numpack = lastpack;
UniSetUDP::UDPMessage pack1;
pack1.addAData(8, 150);
UniSetUDP::UDPPacket pack1;
pack1.msg.addAData(8, 150);
send(pack1); // должен быть "откинут"
msleep(120);
......@@ -398,8 +405,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]")
// посылаем пакет с меньшим номером
s_numpack = lastpack - 2;
UniSetUDP::UDPMessage pack2;
pack2.addAData(8, 155);
UniSetUDP::UDPPacket pack2;
pack2.msg.addAData(8, 155);
send(pack2); // должен быть "откинут"
msleep(120);
......@@ -407,8 +414,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]")
// посылаем нормальный
s_numpack = lastpack + 1;
UniSetUDP::UDPMessage pack3;
pack3.addAData(8, 160);
UniSetUDP::UDPPacket pack3;
pack3.msg.addAData(8, 160);
send(pack3); // должен быть "обработан"
msleep(120);
......@@ -418,8 +425,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]")
TEST_CASE("[UNetUDP]: switching channels", "[unetudp][chswitch]")
{
InitTest();
UniSetUDP::UDPMessage pack;
pack.addAData(8, 70);
UniSetUDP::UDPPacket pack;
pack.msg.addAData(8, 70);
send(pack);
msleep(120);
REQUIRE( ui->getValue(8) == 70 );
......@@ -443,38 +450,38 @@ TEST_CASE("[UNetUDP]: check undefined value", "[unetudp][sender]")
{
InitTest();
UniSetUDP::UDPMessage pack0 = receive();
UniSetUDP::UDPPacket pack0 = receive();
ui->setValue(2, 110);
REQUIRE( ui->getValue(2) == 110 );
msleep(600);
UniSetUDP::UDPMessage pack = receive( pack0.num + 1, 2000, 40 );
UniSetUDP::UDPPacket pack = receive( pack0.msg.header.num + 1, 2000, 40 );
REQUIRE( pack.num != 0 );
REQUIRE( pack.asize() == 4 );
REQUIRE( pack.dsize() == 2 );
REQUIRE( pack.a_dat[0].val == 110 );
REQUIRE( pack.msg.header.num != 0 );
REQUIRE( pack.msg.asize() == 4 );
REQUIRE( pack.msg.dsize() == 2 );
REQUIRE( pack.msg.a_dat[0].val == 110 );
IOController_i::SensorInfo si;
si.id = 2;
si.node = uniset_conf()->getLocalNode();
ui->setUndefinedState(si, true, 6000 /* TestProc */ );
msleep(600);
pack = receive(pack.num + 1);
pack = receive(pack.msg.header.num + 1);
REQUIRE( pack.num != 0 );
REQUIRE( pack.asize() == 4 );
REQUIRE( pack.dsize() == 2 );
REQUIRE( pack.a_dat[0].val == 65635 );
REQUIRE( pack.msg.header.num != 0 );
REQUIRE( pack.msg.asize() == 4 );
REQUIRE( pack.msg.dsize() == 2 );
REQUIRE( pack.msg.a_dat[0].val == 65635 );
ui->setUndefinedState(si, false, 6000 /* TestProc */ );
msleep(600);
pack = receive(pack.num + 1);
pack = receive(pack.msg.header.num + 1);
REQUIRE( pack.num != 0 );
REQUIRE( pack.asize() == 4 );
REQUIRE( pack.dsize() == 2 );
REQUIRE( pack.a_dat[0].val == 110 );
REQUIRE( pack.msg.header.num != 0 );
REQUIRE( pack.msg.asize() == 4 );
REQUIRE( pack.msg.dsize() == 2 );
REQUIRE( pack.msg.a_dat[0].val == 110 );
}
// -----------------------------------------------------------------------------
......@@ -59,18 +59,18 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5
}
}
UniSetUDP::UDPMessage mypack;
mypack.nodeID = 100;
mypack.procID = 100;
UniSetUDP::UDPPacket mypack;
mypack.msg.header.nodeID = 100;
mypack.msg.header.procID = 100;
for( size_t i = 0; i < count; i++ )
{
UniSetUDP::UDPAData d(i, i);
mypack.addAData(d);
mypack.msg.addAData(d);
}
for( size_t i = 0; i < count; i++ )
mypack.addDData(i, i);
mypack.msg.addDData(i, i);
for( size_t i = 0; i < max; i++ )
{
......@@ -92,13 +92,11 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5
}
size_t packetnum = 0;
UniSetUDP::UDPPacket s_buf;
size_t nc = 1;
while( nc ) // -V654
{
mypack.num = packetnum++;
mypack.msg.header.num = packetnum++;
// при переходе черех максимум (UniSetUDP::MaxPacketNum)
// пакет опять должен иметь номер "1"
......@@ -111,11 +109,10 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5
{
if( udp->poll(100000, Poco::Net::Socket::SELECT_WRITE) )
{
mypack.transport_msg(s_buf);
size_t ret = udp->sendBytes((char*)&s_buf.data, s_buf.len);
size_t ret = udp->sendBytes(mypack.raw, mypack.msg.len());
if( ret < s_buf.len )
cerr << "(send): FAILED ret=" << ret << " < sizeof=" << s_buf.len << endl;
if( ret < mypack.msg.len() )
cerr << "(send): FAILED ret=" << ret << " < sizeof=" << mypack.msg.len() << endl;
}
}
catch( Poco::Net::NetException& e )
......@@ -180,9 +177,9 @@ int main(int argc, char* argv[] )
auto conf = uniset_init(argc, argv);
if( argc > 1 && !strcmp(argv[1], "s") )
run_senders(1, host);
run_senders(10, host);
else
run_test(1, host);
run_test(10, host);
return 0;
}
......
......@@ -223,9 +223,7 @@ int main(int argc, char* argv[])
{
UDPReceiveU udp(s_host, port);
// char buf[UniSetUDP::MaxDataLen];
UniSetUDP::UDPMessage pack;
UniSetUDP::UDPPacket buf;
UniSetUDP::UDPPacket pack;
unsigned long prev_num = 1;
int nc = 1;
......@@ -257,27 +255,35 @@ int main(int argc, char* argv[])
continue;
}
size_t ret = udp.receiveBytes(&(buf.data), sizeof(buf.data) );
size_t sz = UniSetUDP::UDPMessage::getMessage(pack, buf);
size_t ret = udp.receiveBytes(pack.raw, sizeof(pack.raw) );
if( sz == 0 )
if( ret < 0 )
{
if( pack.magic != UniSetUDP::UNETUDP_MAGICNUM )
cerr << "(recv): BAD PROTOCOL VERSION! [ need version '" << UniSetUDP::UNETUDP_MAGICNUM << "']" << endl;
else
cerr << "(recv): FAILED header ret=" << ret
<< " sizeof=" << sz << endl;
cerr << "(recv): no data?!" << endl;
continue;
}
if( ret == 0 )
{
cerr << "(recv): connection closed?!" << endl;
continue;
}
pack.msg.ntoh();
if( pack.msg.header.magic != UniSetUDP::UNETUDP_MAGICNUM )
{
cerr << "(recv): BAD PROTOCOL VERSION! [ need version '" << UniSetUDP::UNETUDP_MAGICNUM << "']" << endl;
continue;
}
if( lost )
{
if( prev_num != (pack.num - 1) )
cerr << "WARNING! Incorrect sequence of packets! current=" << pack.num
if( prev_num != (pack.msg.header.num - 1) )
cerr << "WARNING! Incorrect sequence of packets! current=" << pack.msg.header.num
<< " prev=" << prev_num << endl;
prev_num = pack.num;
prev_num = pack.msg.header.num;
}
npack++;
......@@ -287,7 +293,7 @@ int main(int argc, char* argv[])
<< " bytes: " << ret << endl;
if( show )
cout << "receive data: " << pack << endl;
cout << "receive data: " << pack.msg << endl;
}
catch( Poco::Net::NetException& e )
{
......@@ -314,9 +320,10 @@ int main(int argc, char* argv[])
std::shared_ptr<UDPSocketU> udp = make_shared<UDPSocketU>(s_host, port);
udp->setBroadcast(broadcast);
UniSetUDP::UDPMessage mypack;
mypack.nodeID = nodeID;
mypack.procID = procID;
UniSetUDP::UDPPacket mypack;
UDPMessage* msg = &mypack.msg;
msg->header.nodeID = nodeID;
msg->header.procID = procID;
if( !a_data.empty() )
{
......@@ -325,7 +332,7 @@ int main(int argc, char* argv[])
for( const auto& v : vlist )
{
UDPAData d(v.si.id, v.val);
mypack.addAData(d);
msg->addAData(d);
}
}
else
......@@ -333,7 +340,7 @@ int main(int argc, char* argv[])
for( size_t i = 0; i < count; i++ )
{
UDPAData d(i, i);
mypack.addAData(d);
msg->addAData(d);
}
}
......@@ -342,19 +349,17 @@ int main(int argc, char* argv[])
auto vlist = uniset::getSInfoList(d_data, nullptr);
for( const auto& v : vlist )
mypack.addDData(v.si.id, v.val);
msg->addDData(v.si.id, v.val);
}
else
{
for( size_t i = 0; i < count; i++ )
mypack.addDData(i, i);
msg->addDData(i, i);
}
Poco::Net::SocketAddress sa(s_host, port);
udp->connect(sa);
UniSetUDP::UDPPacket s_buf;
size_t nc = 1;
if( ncycles > 0 )
......@@ -362,7 +367,7 @@ int main(int argc, char* argv[])
while( nc )
{
mypack.num = packetnum++;
msg->header.num = packetnum++;
// при переходе через максимум (UniSetUDP::MaxPacketNum)
// пакет опять должен иметь номер "1"
......@@ -373,16 +378,14 @@ int main(int argc, char* argv[])
{
if( udp->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_WRITE) )
{
mypack.transport_msg(s_buf);
if( verb )
cout << "(send): to addr=" << addr << " d_count=" << mypack.dcount
<< " a_count=" << mypack.acount << " bytes=" << s_buf.len << endl;
cout << "(send): to addr=" << addr << " d_count=" << msg->header.dcount
<< " a_count=" << msg->header.acount << " bytes=" << msg->len() << endl;
size_t ret = udp->sendBytes((char*)&s_buf.data, s_buf.len);
size_t ret = udp->sendBytes(mypack.raw, sizeof(mypack.raw) /* mypack.msg.len() */);
if( ret < s_buf.len )
cerr << "(send): FAILED ret=" << ret << " < sizeof=" << s_buf.len << endl;
if( ret < msg->len() )
cerr << "(send): FAILED ret=" << ret << " < sizeof=" << msg->len() << endl;
}
}
catch( Poco::Net::NetException& e )
......
conf/test.xml
docs/examples/uniset-configure-example.xml
docs/Makefile.am
extensions/DBServer-MySQL/DBServer_MySQL.cc
extensions/DBServer-MySQL/DBServer_MySQL.h
extensions/DBServer-MySQL/libUniSet2MySQL.pc.in
extensions/DBServer-MySQL/main.cc
extensions/DBServer-MySQL/Makefile.am
extensions/DBServer-MySQL/MySQLInterface.cc
extensions/DBServer-MySQL/MySQLInterface.h
extensions/DBServer-MySQL/test.cc
extensions/DBServer-PostgreSQL/test.xml
extensions/DBServer-SQLite/DBServer_SQLite.cc
extensions/DBServer-SQLite/DBServer_SQLite.h
extensions/DBServer-SQLite/libUniSet2SQLite.pc.in
extensions/DBServer-SQLite/main.cc
extensions/DBServer-SQLite/Makefile.am
extensions/DBServer-SQLite/SQLiteInterface.cc
extensions/DBServer-SQLite/SQLiteInterface.h
extensions/DBServer-SQLite/test.cc
extensions/DBServer-SQLite/test.xml
extensions/DBServer-PostgreSQL/DBServer_PostgreSQL.cc
extensions/DBServer-PostgreSQL/DBServer_PostgreSQL.h
extensions/DBServer-PostgreSQL/libUniSet2PostgreSQL.pc.in
extensions/DBServer-PostgreSQL/main.cc
extensions/DBServer-PostgreSQL/Makefile.am
extensions/DBServer-PostgreSQL/PostgreSQLInterface.cc
extensions/DBServer-PostgreSQL/PostgreSQLInterface.h
extensions/DBServer-PostgreSQL/test.cc
extensions/LogDB/LogDB.cc
extensions/LogDB/LogDB.h
extensions/LogDB/LogDBSugar.h
extensions/LogDB/main.cc
extensions/LogDB/logdb-conv.cc
extensions/LogDB/Makefile.am
extensions/include/Calibration.h
extensions/include/ComediInterface.h
extensions/include/DigitalFilter.h
extensions/include/Element.h
extensions/include/Extensions.h
extensions/include/IB.h
extensions/include/IOBase.h
extensions/include/IOControl.h
extensions/include/LProcessor.h
extensions/include/Makefile.am
extensions/include/MBExchange.h
extensions/include/MBSlave.h
extensions/include/MBTCPMaster.h
extensions/include/MBTCPMultiMaster.h
extensions/include/MBTCPPersistentSlave.h
extensions/include/MTR.h
extensions/include/PassiveLProcessor.h
extensions/include/PID.h
extensions/include/RRDServer.h
extensions/include/MQTTPublisher.h
extensions/include/RTUExchange.h
extensions/include/RTUStorage.h
extensions/include/Schema.h
extensions/include/SharedMemory.h
extensions/include/SingleProcess.h
extensions/include/SMInterface.h
extensions/include/TDelay.h
extensions/include/UDPPacket.h
extensions/include/UNetExchange.h
extensions/include/UNetReceiver.h
extensions/include/UNetSender.h
extensions/include/UniExchange.h
extensions/include/UObject_SK.h
extensions/include/VTypes.h
extensions/IOControl/ComediInterface.cc
extensions/IOControl/ComediInterface.h
extensions/IOControl/iocalibr.cc
extensions/IOControl/IOControl.cc
extensions/IOControl/iocontrol.cc
extensions/IOControl/IOControl.h
extensions/IOControl/iotest.cc
extensions/IOControl/libUniSet2IOControl.pc.in
extensions/IOControl/Makefile.am
extensions/IOControl/tests/Makefile.am
extensions/IOControl/tests/test_iocontrol.cc
extensions/IOControl/tests/run_test_iocontrol.cc
extensions/IOControl/tests/iocontrol-test-configure.xml
extensions/IOControl/tests/FakeIOControl.h
extensions/IOControl/tests/FakeIOControl.cc
extensions/lib/Calibration.cc
extensions/lib/DigitalFilter.cc
extensions/lib/Extensions.cc
extensions/lib/IOBase.cc
extensions/lib/Makefile.am
extensions/lib/MTR.cc
extensions/lib/PID.cc
extensions/lib/SingleProcess.cc
extensions/lib/SMInterface.cc
extensions/lib/UObject_SK.cc
extensions/lib/VTypes.cc
extensions/LogicProcessor/tests/lproc.cc
extensions/LogicProcessor/tests/Makefile.am
extensions/LogicProcessor/tests/schema.xml
extensions/LogicProcessor/tests/tests.cc
extensions/LogicProcessor/Element.cc
extensions/LogicProcessor/Element.h
extensions/LogicProcessor/libUniSet2LogicProcessor.pc.in
extensions/LogicProcessor/logicproc.cc
extensions/LogicProcessor/LProcessor.cc
extensions/LogicProcessor/LProcessor.h
extensions/LogicProcessor/Makefile.am
extensions/LogicProcessor/PassiveLProcessor.cc
extensions/LogicProcessor/PassiveLProcessor.h
extensions/LogicProcessor/plogicproc.cc
extensions/LogicProcessor/Schema.cc
extensions/LogicProcessor/Schema.h
extensions/LogicProcessor/schema.xml
extensions/LogicProcessor/SchemaXML.cc
extensions/LogicProcessor/TAND.cc
extensions/LogicProcessor/TDelay.cc
extensions/LogicProcessor/TDelay.h
extensions/LogicProcessor/TNOT.cc
extensions/LogicProcessor/TOR.cc
extensions/LogicProcessor/TA2D.h
extensions/LogicProcessor/TA2D.cc
extensions/ModbusMaster/tests/Makefile.am
extensions/ModbusMaster/tests/mbmaster-test-configure.xml
extensions/ModbusMaster/tests/MBTCPTestServer.cc
extensions/ModbusMaster/tests/MBTCPTestServer.h
extensions/ModbusMaster/tests/run_test_mbtcpmaster.cc
extensions/ModbusMaster/tests/run_test_mbtcpmultimaster.cc
extensions/ModbusMaster/tests/test_mbtcpmaster.cc
extensions/ModbusMaster/tests/test_mbtcpmultimaster.cc
extensions/ModbusMaster/libUniSet2MBTCPMaster.pc.in
extensions/ModbusMaster/libUniSet2RTU.pc.in
extensions/ModbusMaster/main.cc
extensions/ModbusMaster/Makefile.am
extensions/ModbusMaster/MBExchange.cc
extensions/ModbusMaster/MBExchange.h
extensions/ModbusMaster/MBTCPMaster.cc
extensions/ModbusMaster/MBTCPMaster.h
extensions/ModbusMaster/MBTCPMultiMaster.cc
extensions/ModbusMaster/MBTCPMultiMaster.h
extensions/ModbusMaster/mtr-conv.cc
extensions/ModbusMaster/mtr-read.cc
extensions/ModbusMaster/mtr-setup.cc
extensions/ModbusMaster/multi-main.cc
extensions/ModbusMaster/mb-perf-test.cc
extensions/ModbusMaster/RTUExchange.cc
extensions/ModbusMaster/rtuexchange.cc
extensions/ModbusMaster/RTUExchange.h
extensions/ModbusMaster/rtustate.cc
extensions/ModbusMaster/RTUStorage.cc
extensions/ModbusMaster/RTUStorage.h
extensions/ModbusMaster/test.xml
extensions/ModbusMaster/vtconv.cc
extensions/ModbusSlave/tests/Makefile.am
extensions/ModbusSlave/tests/mbslave-test-configure.xml
extensions/ModbusSlave/tests/t.cc
extensions/ModbusSlave/tests/test_mbslave.cc
extensions/ModbusSlave/tests/tests_individual_process.cc
extensions/ModbusSlave/tests/tests_with_sm.cc
extensions/ModbusSlave/tests/mbslave_perf_test.cc
extensions/ModbusSlave/epoll-test/mbslave-epoll.cc
extensions/ModbusSlave/libUniSet2MBSlave.pc.in
extensions/ModbusSlave/Makefile.am
extensions/ModbusSlave/MBSlave.cc
extensions/ModbusSlave/mbslave.cc
extensions/ModbusSlave/MBSlave.h
extensions/ModbusSlave/test.xml
extensions/RRDServer/libUniSet2RRDServer.pc.in
extensions/RRDServer/main.cc
extensions/RRDServer/Makefile.am
extensions/RRDServer/RRDServer.cc
extensions/RRDServer/RRDServer.h
extensions/MQTTPublisher/main.cc
extensions/MQTTPublisher/Makefile.am
extensions/MQTTPublisher/MQTTPublisher.cc
extensions/MQTTPublisher/MQTTPublisher.h
extensions/Backend-OpenTSDB/libUniSet2BackendOpenTSDB.pc.in
extensions/Backend-OpenTSDB/main.cc
extensions/Backend-OpenTSDB/Makefile.am
extensions/Backend-OpenTSDB/BackendOpenTSDB.cc
extensions/Backend-OpenTSDB/BackendOpenTSDB.h
extensions/SharedMemory/libUniSet2SharedMemory.pc.in
extensions/SharedMemory/Makefile.am
extensions/SharedMemory/SharedMemory.cc
extensions/SharedMemory/SharedMemory.h
extensions/SharedMemory/smemory.cc
extensions/SharedMemory/test.xml
extensions/SharedMemory/tests/Makefile.am
extensions/SharedMemory/tests/test_sm.cc
extensions/SharedMemory/tests/tests.cc
extensions/SharedMemory/tests/NullSM.cc
extensions/SharedMemory/tests/NullSM.h
extensions/SharedMemory/tests/TestObject.cc
extensions/SharedMemory/tests/TestObject.h
extensions/SharedMemory/tests/testobject.src.xml
extensions/SharedMemory/tests/sm-configure.xml
extensions/SMViewer/main.cc
extensions/SMViewer/Makefile.am
extensions/SMViewer/SMViewer.cc
extensions/SMViewer/SMViewer.h
extensions/tests/r/t.cc
extensions/tests/r/val.report.xml
extensions/tests/SMemoryTest/Makefile.am
extensions/tests/SMemoryTest/smemory-test.cc
extensions/tests/SMemoryTest/test.xml
extensions/tests/SMemoryTest/TestProc.cc
extensions/tests/SMemoryTest/TestProc.h
extensions/tests/SMemoryTest/testproc.src.xml
extensions/tests/SMemoryTest/LostTestProc.cc
extensions/tests/SMemoryTest/LostTestProc.h
extensions/tests/SMemoryTest/LostPassiveTestProc.cc
extensions/tests/SMemoryTest/LostPassiveTestProc.h
extensions/tests/SMemoryTest/losttestproc.src.xml
extensions/tests/SMemoryTest/sm-lostmessage-test.cc
extensions/tests/SMemoryTest/Makefile.am
extensions/tests/MBSlaveTest/mbslave-test.cc
extensions/tests/MBSlaveTest/test.xml
extensions/tests/MBSlaveTest/TestProc.cc
extensions/tests/MBSlaveTest/TestProc.h
extensions/tests/MBSlaveTest/testproc.src.xml
extensions/tests/Makefile.am
extensions/tests/test.xml
extensions/tests/test_calibration.cc
extensions/tests/test_digitalfilter.cc
extensions/tests/test_iobase.cc
extensions/tests/test_iobase_with_sm.cc
extensions/tests/test_ui.cc
extensions/tests/test_vtypes.cc
extensions/tests/test_restapi_uniset.cc
extensions/tests/tests.cc
extensions/tests/tests_with_conf.cc
extensions/tests/tests_with_conf.xml
extensions/tests/tests_with_sm.cc
extensions/tests/tests_with_sm.h
extensions/tests/tests_with_sm.xml
extensions/tests/u.xml
extensions/tests/sm_perf_test.cc
extensions/tests/develop.cc
extensions/tests/MQPerfTest/Makefile.am
extensions/tests/MQPerfTest/TestProc.h
extensions/tests/MQPerfTest/TestProc.cc
extensions/tests/MQPerfTest/mq-test.cc
extensions/UNetUDP/tests/Makefile.am
extensions/UNetUDP/tests/test_unetudp.cc
extensions/UNetUDP/tests/tests_individual_process.cc
extensions/UNetUDP/tests/tests_with_sm.cc
extensions/UNetUDP/tests/unetudp-test-configure.xml
extensions/UNetUDP/tests/urecv_perf_test.cc
extensions/UNetUDP/libUniSet2UNetUDP.pc.in
extensions/UNetUDP/Makefile.am
extensions/UNetUDP/test.xml
extensions/UNetUDP/UDPPacket.cc
extensions/UNetUDP/UDPPacket.h
extensions/UNetUDP/unet-udp-tester.cc
extensions/UNetUDP/UNetExchange.cc
extensions/UNetUDP/unetexchange.cc
extensions/UNetUDP/UNetExchange.h
extensions/UNetUDP/UNetReceiver.cc
extensions/UNetUDP/UNetReceiver.h
extensions/UNetUDP/UNetSender.cc
extensions/UNetUDP/UNetSender.h
extensions/UniNetwork/libUniSet2Network.pc.in
extensions/UniNetwork/Makefile.am
extensions/UniNetwork/UniExchange.cc
extensions/UniNetwork/UniExchange.h
extensions/UniNetwork/uninet.cc
extensions/libUniSet2Extensions.pc.in
extensions/Makefile.am
IDL/Processes/Makefile.am
IDL/Processes/IOController_i.idl
IDL/UniSetTypes/Makefile.am
IDL/UniSetTypes/UniSetBaseConstants.idl
IDL/UniSetTypes/UniSetTypes_i.idl
IDL/UniSetTypes/UniSetObject_i.idl
IDL/UniSetTypes/UniSetManager_i.idl
IDL/Makefile.am
include/modbus/Makefile.am
include/modbus/ModbusClient.h
include/modbus/ModbusHelpers.h
include/modbus/ModbusRTUErrors.h
include/modbus/ModbusRTUMaster.h
include/modbus/ModbusRTUSlave.h
include/modbus/ModbusRTUSlaveSlot.h
include/modbus/ModbusServer.h
include/modbus/ModbusServerSlot.h
include/modbus/ModbusTCPCore.h
include/modbus/ModbusTCPMaster.h
include/modbus/ModbusTCPServer.h
include/modbus/ModbusTCPServerSlot.h
include/modbus/ModbusTCPSession.h
include/modbus/ModbusTypes.h
include/ComPort.h
include/ComPort485F.h
include/Configuration.1.h
include/Configuration.h
include/DBServer.h
include/DBInterface.h
include/Debug.h
include/DebugStream.h
include/DelayTimer.h
include/Exceptions.h
include/HourGlass.h
include/IOController.h
include/IONotifyController.h
include/IORFile.h
include/CommonEventLoop.h
include/EventLoopServer.h
include/SingletonEventLoopServer.h
include/SingletonEventLoopServer.tcc
include/LogAgregator.h
include/LogReader.h
include/LogServer.h
include/LogServerTypes.h
include/LogSession.h
include/LT_Object.h
include/Makefile.am
include/MessageType.h
include/Mutex.h
include/IOConfig.h
include/IOConfig_XML.h
include/ObjectIndex.h
include/ObjectIndex_Array.h
include/ObjectIndex_idXML.h
include/ObjectIndex_XML.h
include/ObjectRepository.h
include/OmniThreadCreator.h
include/ORepHelpers.h
include/PassiveObject.h
include/PassiveTimer.h
include/ProxyManager.h
include/Pulse.h
include/SMonitor.h
include/VMonitor.h
include/SViewer.h
include/TCPCheck.h
include/ThreadCreator.h
include/Trigger.h
include/TriggerAND.h
include/TriggerOR.h
include/TriggerOUT.h
include/UInterface.h
include/UniSetActivator.h
include/UniSetManager.h
include/UniSetObject.h
include/MQMutex.h
include/MQAtomic.h
include/UniSetTypes.h
include/UniXML.h
include/UTCPCore.h
include/UTCPStream.h
include/UTCPSocket.h
include/USocket.h
include/UDPCore.h
include/WDTInterface.h
include/UHelpers.h
include/UHttpRequestHandler.h
include/UHttpServer.h
include/ujson.h
include/unisetstd.h
lib/Makefile.am
python/examples/test.xml
python/lib/pyUniSet/Makefile.am
python/lib/pyUniSet/PyUInterface.cc
python/lib/pyUniSet/PyUInterface.h
python/lib/pyUniSet/UProxyObject.cc
python/lib/pyUniSet/UProxyObject.h
python/lib/pyUniSet/UConnector.cc
python/lib/pyUniSet/UConnector.h
python/lib/pyUniSet/UConnector_wrap.cxx
python/lib/pyUniSet/UExceptions.h
python/lib/pyUniSet/UExceptions_wrap.cxx
python/lib/pyUniSet/UInterface_wrap.cxx
python/lib/pyUniSet/UModbus.cc
python/lib/pyUniSet/UModbus.h
python/lib/pyUniSet/UModbus_wrap.cxx
python/lib/pyUniSet/UTypes.h
python/lib/Makefile.am
python/tests/UConnector/test.xml
python/tests/UInterface/test.xml
python/Makefile.am
src/Communications/Modbus/Makefile.am
src/Communications/Modbus/ModbusClient.cc
src/Communications/Modbus/ModbusHelpers.cc
src/Communications/Modbus/ModbusRTUMaster.cc
src/Communications/Modbus/ModbusRTUSlave.cc
src/Communications/Modbus/ModbusRTUSlaveSlot.cc
src/Communications/Modbus/ModbusServer.cc
src/Communications/Modbus/ModbusServerSlot.cc
src/Communications/Modbus/ModbusTCPCore.cc
src/Communications/Modbus/ModbusTCPMaster.cc
src/Communications/Modbus/ModbusTCPServer.cc
src/Communications/Modbus/ModbusTCPServerSlot.cc
src/Communications/Modbus/ModbusTCPSession.cc
src/Communications/Modbus/ModbusTCPTypes.cc
src/Communications/Modbus/ModbusTypes.cc
src/Communications/TCP/Makefile.am
src/Communications/TCP/TCPCheck.cc
src/Communications/TCP/UTCPCore.cc
src/Communications/TCP/UTCPStream.cc
src/Communications/TCP/UTCPSocket.cc
src/Communications/TCP/USocket.cc
src/Communications/Http/UHttpRequestHandler.cc
src/Communications/Http/UHttpServer.cc
src/Communications/ComPort.cc
src/Communications/ComPort485F.cc
src/Communications/Makefile.am
src/Core/UInterface.cc
src/Core/UniSetActivator.cc
src/Core/UniSetManager.cc
src/Core/UniSetObject.cc
src/Core/UniSetTypes.cc
src/Core/Configuration.cc
src/Core/MessageType.cc
src/Log/Debug.cc
src/Log/DebugExtBuf.h
src/Log/DebugStream.cc
src/Log/LogAgregator.cc
src/Log/LogReader.cc
src/Log/LogServer.cc
src/Log/LogServerTypes.cc
src/Log/LogSession.cc
src/Log/Makefile.am
src/ObjectRepository/IORFile.cc
src/ObjectRepository/Makefile.am
src/ObjectRepository/ObjectIndex.cc
src/ObjectRepository/ObjectIndex_Array.cc
src/ObjectRepository/ObjectIndex_idXML.cc
src/ObjectRepository/ObjectIndex_XML.cc
src/ObjectRepository/ObjectRepository.cc
src/ObjectRepository/ORepHelpers.cc
src/Processes/IOController.cc
src/Processes/IONotifyController.cc
src/Processes/Makefile.am
src/Processes/CommonEventLoop.cc
src/Processes/EventLoopServer.cc
src/Processes/PassiveObject.cc
src/Processes/ProxyManager.cc
src/Processes/IOConfig_XML.cc
src/Services/DBServer.cc
src/Services/DBInterface.cc
src/Services/Makefile.am
src/Timers/Makefile.am
src/Timers/PassiveCondTimer.cc
src/Timers/PassiveSigTimer.cc
src/Timers/PassiveTimer.cc
src/Timers/WaitingPassiveTimer.cc
src/Timers/LT_Object.cc
src/Various/Makefile.am
src/Various/Mutex.cc
src/Various/SMonitor.cc
src/Various/VMonitor.cc
src/Various/SViewer.cc
src/Various/UniXML.cc
src/Various/WDTInterface.cc
src/Various/MQMutex.cc
src/Various/MQAtomic.cc
src/Various/ujson.cc
src/Makefile.am
tests/UniXmlTest/Makefile.am
tests/UniXmlTest/XmlTest.cc
tests/TCPSocketTest/sock-client.cc
tests/TCPSocketTest/sock-server.cc
tests/TCPSocketTest/Makefile.am
tests/int_unsigned.cc
tests/Makefile.am
tests/test.xml
tests/develop.cc
tests/test_callbacktimer.cc
tests/test_conftest.cc
tests/test_delaytimer.cc
tests/test_dlog.cc
tests/test_hourglass.cc
tests/test_iorfile.cc
tests/test_messagetype.cc
tests/test_modbustypes.cc
tests/test_mutex.cc
tests/test_passivecondtimer.cc
tests/test_passivetimer.cc
tests/test_pulse.cc
tests/test_sscanf_hex.cc
tests/test_trigger.cc
tests/test_triggerAND.cc
tests/test_triggerOR.cc
tests/test_triggerOUT.cc
tests/test_ui.cc
tests/test_unixml.cc
tests/test_utypes.cc
tests/test_logserver.cc
tests/test_tcpcheck.cc
tests/test_mqueue.cc
tests/test_uobject.cc
tests/test_utcpsocket.cc
tests/test_iocontroller_types.cc
tests/test_debugstream.cc
tests/test_uhttp.cc
tests/TestUObject.h
tests/tests-junit.xml
tests/tests.cc
tests/tests_bad_config.xml
tests/tests_no_objectsmap.xml
tests/tests_no_uniset_section.xml
tests/tests_unixml.xml
tests/tests_unixml_badfile.xml
tests/tests_with_conf.cc
tests/tests_with_conf.xml
tests/threadtst.cc
tests/umutex.cc
tests/perf_test.cc
tests/MQPerfTest/mq-test.cc
tests/PocoTest/poco-test.cc
tests/UHttpTest/uhttp-test.cc
testsuite/Makefile.am
Utilities/Admin/admin.cc
Utilities/Admin/Makefile.am
Utilities/Admin/test.xml
Utilities/codegen/tests/Makefile.am
Utilities/codegen/tests/test.xml
Utilities/codegen/tests/testgen-alone.src.xml
Utilities/codegen/tests/TestGen-main.cc
Utilities/codegen/tests/TestGen.cc
Utilities/codegen/tests/TestGen.h
Utilities/codegen/tests/testgen.src.xml
Utilities/codegen/tests/TestGen_SK.cc
Utilities/codegen/tests/TestGen_SK.h
Utilities/codegen/tests/TestGenAlone-main.cc
Utilities/codegen/tests/TestGenAlone.cc
Utilities/codegen/tests/TestGenAlone.h
Utilities/codegen/tests/TestGenAlone_SK.cc
Utilities/codegen/tests/TestGenAlone_SK.h
Utilities/codegen/tests/uobject.src.xml
Utilities/codegen/tests/UObject_SK.cc
Utilities/codegen/tests/UObject_SK.h
Utilities/codegen/Makefile.am
Utilities/codegen/skel-main.cc
Utilities/codegen/skel-Makefile.am
Utilities/codegen/skel.cc
Utilities/codegen/skel.h
Utilities/codegen/skel.src.xml
Utilities/MBTester/Makefile.am
Utilities/MBTester/mbrtuslave.cc
Utilities/MBTester/mbrtutester.cc
Utilities/MBTester/mbtcptester.cc
Utilities/MBTester/MBSlave.cc
Utilities/MBTester/mbslave.cc
Utilities/MBTester/MBSlave.h
Utilities/MBTester/mbtcpserver.cc
Utilities/MBTester/MBTCPServer.cc
Utilities/MBTester/MBTCPServer.h
Utilities/MBTester/mbtcptester.cc
Utilities/MBTester/mbtcpconnection.cc
Utilities/NullController/main.cc
Utilities/NullController/Makefile.am
Utilities/NullController/NullController.cc
Utilities/NullController/NullController.h
Utilities/NullController/test.xml
Utilities/scripts/Makefile.am
Utilities/SImitator/main.cc
Utilities/SImitator/Makefile.am
Utilities/SImitator/test.xml
Utilities/SMonit/Makefile.am
Utilities/SMonit/smonitor.cc
Utilities/SMonit/test.xml
Utilities/SViewer-text/main.cc
Utilities/SViewer-text/Makefile.am
Utilities/SViewer-text/test.xml
Utilities/ULog/log-stdin.cc
Utilities/ULog/log-wrap.cc
Utilities/ULog/log.cc
Utilities/ULog/log2val.cc
Utilities/ULog/logserver.cc
Utilities/ULog/Makefile.am
Utilities/Makefile.am
libUniSet2.pc.in
Makefile.am
uniset-config.h
configure.ac
./cov-int/emit/pvbook.localdomain/config/130ac2dc34760443befdd3f2a25f8d40/g++cc-config-0/coverity-compiler-compat.h
./cov-int/emit/pvbook.localdomain/config/130ac2dc34760443befdd3f2a25f8d40/gcc-config-0/coverity-compiler-compat.h
./cov-int/emit/pvbook.localdomain/config/130ac2dc34760443befdd3f2a25f8d40/g++cc-config-0/coverity-macro-compat.h
./cov-int/emit/pvbook.localdomain/config/130ac2dc34760443befdd3f2a25f8d40/gcc-config-0/coverity-macro-compat.h
./cov-int/emit/pvbook.localdomain/config/130ac2dc34760443befdd3f2a25f8d40/g++cc-config-1/coverity-compiler-compat.h
./cov-int/emit/pvbook.localdomain/config/130ac2dc34760443befdd3f2a25f8d40/g++cc-config-1/coverity-macro-compat.h
./cov-int/emit/pvbook.localdomain/config/130ac2dc34760443befdd3f2a25f8d40/g++-config-0/coverity-compiler-compat.h
./cov-int/emit/pvbook.localdomain/config/130ac2dc34760443befdd3f2a25f8d40/g++-config-0/coverity-macro-compat.h
./cov-int/emit/pvbook.localdomain/config/130ac2dc34760443befdd3f2a25f8d40/g++-config-1/coverity-compiler-compat.h
./cov-int/emit/pvbook.localdomain/config/130ac2dc34760443befdd3f2a25f8d40/g++-config-1/coverity-macro-compat.h
./cov-int/emit/pvbook.localdomain/config/30c6834cc1e9802742e33de4efa3917c/g++cc-config-0/coverity-compiler-compat.h
./cov-int/emit/pvbook.localdomain/config/30c6834cc1e9802742e33de4efa3917c/g++cc-config-0/coverity-macro-compat.h
./cov-int/emit/pvbook.localdomain/config/30c6834cc1e9802742e33de4efa3917c/g++-config-0/coverity-compiler-compat.h
./cov-int/emit/pvbook.localdomain/config/30c6834cc1e9802742e33de4efa3917c/g++-config-0/coverity-macro-compat.h
./cov-int/emit/pvbook.localdomain/config/4d02eb73c555e8f07e4124fe33c80de2/g++cc-config-0/coverity-compiler-compat.h
./cov-int/emit/pvbook.localdomain/config/4d02eb73c555e8f07e4124fe33c80de2/g++cc-config-0/coverity-macro-compat.h
./cov-int/emit/pvbook.localdomain/config/4d02eb73c555e8f07e4124fe33c80de2/g++-config-0/coverity-compiler-compat.h
./cov-int/emit/pvbook.localdomain/config/4d02eb73c555e8f07e4124fe33c80de2/g++-config-0/coverity-macro-compat.h
./cov-int/emit/pvbook.localdomain/config/4db70a7a9c958929fa315f4c9243d800/g++cc-config-0/coverity-compiler-compat.h
./cov-int/emit/pvbook.localdomain/config/4db70a7a9c958929fa315f4c9243d800/g++cc-config-0/coverity-macro-compat.h
./cov-int/emit/pvbook.localdomain/config/4db70a7a9c958929fa315f4c9243d800/g++-config-0/coverity-compiler-compat.h
./cov-int/emit/pvbook.localdomain/config/4db70a7a9c958929fa315f4c9243d800/g++-config-0/coverity-macro-compat.h
./docs/Makefile.am
./extensions/Backend-OpenTSDB/BackendOpenTSDB.cc
./extensions/Backend-OpenTSDB/BackendOpenTSDB.h
./extensions/Backend-OpenTSDB/main.cc
./extensions/Backend-OpenTSDB/Makefile.am
./extensions/DBServer-MySQL/DBServer_MySQL.cc
./extensions/DBServer-MySQL/DBServer_MySQL.h
./extensions/DBServer-MySQL/main.cc
./extensions/DBServer-MySQL/Makefile.am
./extensions/DBServer-MySQL/MySQLInterface.cc
./extensions/DBServer-MySQL/MySQLInterface.h
./extensions/DBServer-MySQL/test.cc
./extensions/DBServer-PostgreSQL/DBServer_PostgreSQL.cc
./extensions/DBServer-PostgreSQL/DBServer_PostgreSQL.h
./extensions/DBServer-PostgreSQL/main.cc
./extensions/DBServer-PostgreSQL/Makefile.am
./extensions/DBServer-PostgreSQL/PostgreSQLInterface.cc
./extensions/DBServer-PostgreSQL/PostgreSQLInterface.h
./extensions/DBServer-PostgreSQL/test.cc
./extensions/DBServer-SQLite/DBServer_SQLite.cc
./extensions/DBServer-SQLite/DBServer_SQLite.h
./extensions/DBServer-SQLite/main.cc
./extensions/DBServer-SQLite/Makefile.am
./extensions/DBServer-SQLite/SQLiteInterface.cc
./extensions/DBServer-SQLite/SQLiteInterface.h
./extensions/DBServer-SQLite/test.cc
./extensions/include/Calibration.h
./extensions/include/ComediInterface.h
./extensions/include/DigitalFilter.h
./extensions/include/Element.h
./extensions/include/Extensions.h
./extensions/include/IOBase.h
./extensions/include/IOControl.h
./extensions/include/LProcessor.h
./extensions/include/Makefile.am
./extensions/include/MBExchange.h
./extensions/include/MBSlave.h
./extensions/include/MBTCPMaster.h
./extensions/include/MBTCPMultiMaster.h
./extensions/include/MTR.h
./extensions/include/PassiveLProcessor.h
./extensions/include/PID.h
./extensions/include/RRDServer.h
./extensions/include/RTUExchange.h
./extensions/include/RTUStorage.h
./extensions/include/Schema.h
./extensions/include/SharedMemory.h
./extensions/include/SMInterface.h
./extensions/include/TDelay.h
./extensions/include/UDPPacket.h
./extensions/include/UNetExchange.h
./extensions/include/UNetReceiver.h
./extensions/include/UNetSender.h
./extensions/include/UniExchange.h
./extensions/include/VTypes.h
./extensions/IOControl/ComediInterface.cc
./extensions/IOControl/ComediInterface.h
./extensions/IOControl/iocalibr.cc
./extensions/IOControl/iocontrol.cc
./extensions/IOControl/IOControl.cc
./extensions/IOControl/IOControl.h
./extensions/IOControl/IOLogSugar.h
./extensions/IOControl/iotest.cc
./extensions/IOControl/Makefile.am
./extensions/IOControl/tests/FakeIOControl.cc
./extensions/IOControl/tests/FakeIOControl.h
./extensions/IOControl/tests/Makefile.am
./extensions/IOControl/tests/run_test_iocontrol.cc
./extensions/IOControl/tests/test_iocontrol.cc
./extensions/lib/Calibration.cc
./extensions/lib/DigitalFilter.cc
./extensions/lib/Extensions.cc
./extensions/lib/IOBase.cc
./extensions/lib/Makefile.am
./extensions/lib/MTR.cc
./extensions/lib/PID.cc
./extensions/lib/SMInterface.cc
./extensions/lib/VTypes.cc
./extensions/LogDB/LogDB.cc
./extensions/LogDB/logdb-conv.cc
./extensions/LogDB/LogDB.h
./extensions/LogDB/LogDBSugar.h
./extensions/LogDB/main.cc
./extensions/LogDB/Makefile.am
./extensions/LogDB/tests/Makefile.am
./extensions/LogicProcessor/Element.cc
./extensions/LogicProcessor/Element.h
./extensions/LogicProcessor/logicproc.cc
./extensions/LogicProcessor/LProcessor.cc
./extensions/LogicProcessor/LProcessor.h
./extensions/LogicProcessor/Makefile.am
./extensions/LogicProcessor/PassiveLProcessor.cc
./extensions/LogicProcessor/PassiveLProcessor.h
./extensions/LogicProcessor/plogicproc.cc
./extensions/LogicProcessor/Schema.cc
./extensions/LogicProcessor/Schema.h
./extensions/LogicProcessor/SchemaXML.cc
./extensions/LogicProcessor/TA2D.cc
./extensions/LogicProcessor/TA2D.h
./extensions/LogicProcessor/TAND.cc
./extensions/LogicProcessor/TDelay.cc
./extensions/LogicProcessor/TDelay.h
./extensions/LogicProcessor/tests/lproc.cc
./extensions/LogicProcessor/tests/Makefile.am
./extensions/LogicProcessor/tests/NullSM.cc
./extensions/LogicProcessor/tests/NullSM.h
./extensions/LogicProcessor/tests/tests.cc
./extensions/LogicProcessor/TNOT.cc
./extensions/LogicProcessor/TOR.cc
./extensions/Makefile.am
./extensions/ModbusMaster/main.cc
./extensions/ModbusMaster/Makefile.am
./extensions/ModbusMaster/MBExchange.cc
./extensions/ModbusMaster/MBExchange.h
./extensions/ModbusMaster/mb-perf-test.cc
./extensions/ModbusMaster/MBTCPMaster.cc
./extensions/ModbusMaster/MBTCPMaster.h
./extensions/ModbusMaster/MBTCPMultiMaster.cc
./extensions/ModbusMaster/MBTCPMultiMaster.h
./extensions/ModbusMaster/mtr-conv.cc
./extensions/ModbusMaster/mtr-read.cc
./extensions/ModbusMaster/mtr-setup.cc
./extensions/ModbusMaster/multi-main.cc
./extensions/ModbusMaster/rtuexchange.cc
./extensions/ModbusMaster/RTUExchange.cc
./extensions/ModbusMaster/RTUExchange.h
./extensions/ModbusMaster/rtustate.cc
./extensions/ModbusMaster/RTUStorage.cc
./extensions/ModbusMaster/RTUStorage.h
./extensions/ModbusMaster/tests/Makefile.am
./extensions/ModbusMaster/tests/MBTCPTestServer.cc
./extensions/ModbusMaster/tests/MBTCPTestServer.h
./extensions/ModbusMaster/tests/run_test_mbtcpmaster.cc
./extensions/ModbusMaster/tests/run_test_mbtcpmultimaster.cc
./extensions/ModbusMaster/tests/test_mbtcpmaster.cc
./extensions/ModbusMaster/tests/test_mbtcpmultimaster.cc
./extensions/ModbusMaster/vtconv.cc
./extensions/ModbusSlave/epoll-test/boost_client2.cc
./extensions/ModbusSlave/epoll-test/boost_client.cc
./extensions/ModbusSlave/epoll-test/boost_server2.cc
./extensions/ModbusSlave/epoll-test/boost_server.cc
./extensions/ModbusSlave/epoll-test/common.h
./extensions/ModbusSlave/epoll-test/epoll-example1.cc
./extensions/ModbusSlave/epoll-test/epoll-example2.cc
./extensions/ModbusSlave/epoll-test/epoll-example3.cc
./extensions/ModbusSlave/epoll-test/ev++example1.cc
./extensions/ModbusSlave/epoll-test/libevent-example1.cc
./extensions/ModbusSlave/epoll-test/Makefile.am
./extensions/ModbusSlave/epoll-test/M.am
./extensions/ModbusSlave/epoll-test/mbslave-epoll2.cc
./extensions/ModbusSlave/epoll-test/mbslave-epoll.cc
./extensions/ModbusSlave/Makefile.am
./extensions/ModbusSlave/mbslave.cc
./extensions/ModbusSlave/MBSlave.cc
./extensions/ModbusSlave/MBSlave.h
./extensions/ModbusSlave/mbtcp-persistentslave.cc
./extensions/ModbusSlave/tests/Makefile.am
./extensions/ModbusSlave/tests/mbslave_perf_test.cc
./extensions/ModbusSlave/tests/test_mbslave.cc
./extensions/ModbusSlave/tests/tests_with_sm.cc
./extensions/MQTTPublisher/main.cc
./extensions/MQTTPublisher/Makefile.am
./extensions/MQTTPublisher/MQTTPublisher.cc
./extensions/MQTTPublisher/MQTTPublisher.h
./extensions/RRDServer/main.cc
./extensions/RRDServer/Makefile.am
./extensions/RRDServer/RRDServer.cc
./extensions/RRDServer/RRDServer.h
./extensions/SharedMemory/Makefile.am
./extensions/SharedMemory/SharedMemory.cc
./extensions/SharedMemory/SharedMemory.h
./extensions/SharedMemory/smemory.cc
./extensions/SharedMemory/SMLogSugar.h
./extensions/SharedMemory/tests/Makefile.am
./extensions/SharedMemory/tests/NullSM.cc
./extensions/SharedMemory/tests/NullSM.h
./extensions/SharedMemory/tests/TestObject.cc
./extensions/SharedMemory/tests/TestObject.h
./extensions/SharedMemory/tests/testobject.src.xml
./extensions/SharedMemory/tests/tests.cc
./extensions/SharedMemory/tests/test_sm.cc
./extensions/SMViewer/main.cc
./extensions/SMViewer/Makefile.am
./extensions/SMViewer/SMViewer.cc
./extensions/SMViewer/SMViewer.h
./extensions/tests/Makefile.am
./extensions/tests/MBSlaveTest/Makefile.am
./extensions/tests/MBSlaveTest/mbslave-test.cc
./extensions/tests/MBSlaveTest/TestProc.cc
./extensions/tests/MBSlaveTest/TestProc.h
./extensions/tests/MBSlaveTest/testproc.src.xml
./extensions/tests/MQPerfTest/Makefile.am
./extensions/tests/MQPerfTest/mq-test.cc
./extensions/tests/MQPerfTest/TestProc.cc
./extensions/tests/MQPerfTest/TestProc.h
./extensions/tests/MQPerfTest/testproc.src.xml
./extensions/tests/r/t.cc
./extensions/tests/SMemoryTest/LostPassiveTestProc.cc
./extensions/tests/SMemoryTest/LostPassiveTestProc.h
./extensions/tests/SMemoryTest/LostTestProc.cc
./extensions/tests/SMemoryTest/LostTestProc.h
./extensions/tests/SMemoryTest/losttestproc.src.xml
./extensions/tests/SMemoryTest/Makefile.am
./extensions/tests/SMemoryTest/smemory-test.cc
./extensions/tests/SMemoryTest/sm-lostmessage-test.cc
./extensions/tests/SMemoryTest/TestProc.cc
./extensions/tests/SMemoryTest/TestProc.h
./extensions/tests/SMemoryTest/testproc.src.xml
./extensions/tests/sm_perf_test2.cc
./extensions/tests/sm_perf_test.cc
./extensions/tests/sz.cc
./extensions/tests/test_calibration.cc
./extensions/tests/test_digitalfilter.cc
./extensions/tests/test_iobase.cc
./extensions/tests/test_iobase_with_sm.cc
./extensions/tests/test_restapi_uniset.cc
./extensions/tests/tests.cc
./extensions/tests/tests_with_conf.cc
./extensions/tests/tests_with_sm.cc
./extensions/tests/tests_with_sm.h
./extensions/tests/test_ui.cc
./extensions/tests/test_vtypes.cc
./extensions/UNetUDP/Makefile.am
./extensions/UNetUDP/tests/a.cc
./extensions/UNetUDP/tests/Makefile.am
./extensions/UNetUDP/tests/tests_individual_process.cc
./extensions/UNetUDP/tests/tests_with_sm.cc
./extensions/UNetUDP/tests/test_unetudp1.cc
./extensions/UNetUDP/tests/test_unetudp.cc
./extensions/UNetUDP/tests/u.cc
./extensions/UNetUDP/tests/urecv_perf_test.cc
./extensions/UNetUDP/UDPPacket.cc
./extensions/UNetUDP/UDPPacketE.h
./extensions/UNetUDP/UDPPacket.h
./extensions/UNetUDP/unetexchange.cc
./extensions/UNetUDP/UNetExchange.cc
./extensions/UNetUDP/UNetExchange.h
./extensions/UNetUDP/UNetLogSugar.h
./extensions/UNetUDP/UNetReceiver.cc
./extensions/UNetUDP/UNetReceiver.h
./extensions/UNetUDP/UNetSender.cc
./extensions/UNetUDP/UNetSender.h
./extensions/UNetUDP/unet-udp-tester.cc
./extensions/UNetUDP/up/UNetReceiver.cc
./extensions/UNetUDP/up/UNetReceiver.h
./extensions/UniNetwork/Makefile.am
./extensions/UniNetwork/UniExchange.cc
./extensions/UniNetwork/UniExchange.h
./extensions/UniNetwork/uninet.cc
./IDL/Makefile.am
./IDL/Processes/Makefile.am
./IDL/UniSetTypes/Makefile.am
./include/CommonEventLoop.4.h
./include/CommonEventLoop.h
./include/ComPort485F.h
./include/ComPort.h
./include/Configuration.h
./include/DBInterface.h
./include/DBLogSugar.h
./include/DBServer.h
./include/Debug.h
./include/DebugStream.h
./include/DelayTimer.h
./include/EventLoopServer.h
./include/Exceptions.h
./include/HourGlass.h
./include/IOConfig.h
./include/IOConfig_XML.h
./include/IOController.h
./include/IONotifyController.h
./include/IORFile.h
./include/LogAgregator.h
./include/LogReader.h
./include/LogServer.h
./include/LogServerTypes.h
./include/LogSession.h
./include/LT_Object.h
./include/Makefile.am
./include/MessageType.h
./include/modbus/Makefile.am
./include/modbus/MBLogSugar.h
./include/modbus/ModbusClient.h
./include/modbus/ModbusHelpers.h
./include/modbus/ModbusRTUErrors.h
./include/modbus/ModbusRTUMaster.h
./include/modbus/ModbusRTUSlave.h
./include/modbus/ModbusRTUSlaveSlot.h
./include/modbus/ModbusServer.h
./include/modbus/ModbusServerSlot.h
./include/modbus/ModbusTCPCore.h
./include/modbus/ModbusTCPMaster.h
./include/modbus/ModbusTCPServer.h
./include/modbus/ModbusTCPServerSlot.h
./include/modbus/ModbusTCPSession.h
./include/modbus/ModbusTypes.h
./include/MQAtomic.h
./include/MQMutex.h
./include/Mutex.h
./include/ObjectIndex_Array.h
./include/ObjectIndex.h
./include/ObjectIndex_hashXML.h
./include/ObjectIndex_idXML.h
./include/ObjectIndex_XML.h
./include/ObjectRepository.h
./include/OmniThreadCreator.h
./include/ORepHelpers.h
./include/PassiveObject.h
./include/PassiveTimer.h
./include/ProxyManager.h
./include/Pulse.h
./include/SingletonEventLoopServer.h
./include/SMonitor.h
./include/SViewer.h
./include/TCPCheck.h
./include/ThreadCreator.h
./include/TriggerAND.h
./include/Trigger.h
./include/TriggerOR.h
./include/TriggerOUT.h
./include/UA.h
./include/UDPCore.h
./include/UHelpers.h
./include/UHttpRequestHandler.h
./include/UHttpServer.h
./include/UInterface.h
./include/ujson.h
./include/UniSetActivator.h
./include/UniSetManager.h
./include/UniSetObject.h
./include/unisetstd.h
./include/UniSetTypes.h
./include/UniXML.h
./include/USocket.h
./include/UTCPCore.h
./include/UTCPSocket.h
./include/UTCPStream.h
./include/VMonitor.h
./include/WDTInterface.h
./lib/dummy.cc
./lib/Makefile.am
./Makefile.am
./src/Communications/ComPort485F.cc
./src/Communications/ComPort.cc
./src/Communications/Http/Makefile.am
./src/Communications/Http/UHttpRequestHandler.cc
./src/Communications/Http/UHttpServer.cc
./src/Communications/Makefile.am
./src/Communications/Modbus/Makefile.am
./src/Communications/Modbus/ModbusClient.cc
./src/Communications/Modbus/ModbusHelpers.cc
./src/Communications/Modbus/ModbusRTUMaster.cc
./src/Communications/Modbus/ModbusRTUSlave.cc
./src/Communications/Modbus/ModbusRTUSlaveSlot.cc
./src/Communications/Modbus/ModbusServer.cc
./src/Communications/Modbus/ModbusServerSlot.cc
./src/Communications/Modbus/ModbusTCPCore.cc
./src/Communications/Modbus/ModbusTCPMaster.cc
./src/Communications/Modbus/ModbusTCPServer.cc
./src/Communications/Modbus/ModbusTCPServerSlot.cc
./src/Communications/Modbus/ModbusTCPSession.cc
./src/Communications/Modbus/ModbusTypes.cc
./src/Communications/TCP/Makefile.am
./src/Communications/TCP/TCPCheck.cc
./src/Communications/TCP/USocket.cc
./src/Communications/TCP/UTCPCore.cc
./src/Communications/TCP/UTCPSocket.cc
./src/Communications/TCP/UTCPStream.cc
./src/Core/Configuration.cc
./src/Core/Makefile.am
./src/Core/MessageType.cc
./src/Core/UA.cc
./src/Core/UInterface.cc
./src/Core/UniSetActivator.cc
./src/Core/UniSetBaseConstantsSK.cc
./src/Core/UniSetManager.cc
./src/Core/UniSetManager_iSK.cc
./src/Core/UniSetObject.cc
./src/Core/UniSetObject_iSK.cc
./src/Core/UniSetTypes.cc
./src/Core/UniSetTypes_iSK.cc
./src/Log/Debug.cc
./src/Log/DebugExtBuf.h
./src/Log/DebugStream.cc
./src/Log/LogAgregator.cc
./src/Log/LogReader.cc
./src/Log/LogServer.cc
./src/Log/LogServerTypes.cc
./src/Log/LogSession.cc
./src/Log/Makefile.am
./src/Makefile.am
./src/ObjectRepository/IORFile.cc
./src/ObjectRepository/Makefile.am
./src/ObjectRepository/ObjectIndex_Array.cc
./src/ObjectRepository/ObjectIndex.cc
./src/ObjectRepository/ObjectIndex_hashXML.cc
./src/ObjectRepository/ObjectIndex_idXML.cc
./src/ObjectRepository/ObjectIndex_XML.cc
./src/ObjectRepository/ObjectRepository.cc
./src/ObjectRepository/ORepHelpers.cc
./src/ObjectRepository/UniSetBaseConstantsSK.cc
./src/ObjectRepository/UniSetManager_iSK.cc
./src/ObjectRepository/UniSetObject_iSK.cc
./src/ObjectRepository/UniSetTypes_iSK.cc
./src/ObjectRepository/URepository_i.cc
./src/Processes/CommonEventLoop.4.cc
./src/Processes/CommonEventLoop.cc
./src/Processes/EventLoopServer.cc
./src/Processes/IOConfig_XML.cc
./src/Processes/IOController.cc
./src/Processes/IOController_i.cc
./src/Processes/IOController_iSK.cc
./src/Processes/IONotifyController.cc
./src/Processes/Makefile.am
./src/Processes/PassiveObject.cc
./src/Processes/ProxyManager.cc
./src/Processes/SingletonEventLoopServer.cc
./src/Services/DBInterface.cc
./src/Services/DBServer.cc
./src/Services/Makefile.am
./src/Timers/LT_Object.cc
./src/Timers/Makefile.am
./src/Timers/PassiveCondTimer.cc
./src/Timers/PassiveSigTimer.cc
./src/Timers/PassiveTimer.cc
./src/Timers/WaitingPassiveTimer.cc
./src/Various/Makefile.am
./src/Various/MQAtomic.cc
./src/Various/MQMutex.cc
./src/Various/Mutex.cc
./src/Various/SMonitor.cc
./src/Various/SViewer.cc
./src/Various/ujson.cc
./src/Various/UniXML.cc
./src/Various/VMonitor.cc
./src/Various/WDTInterface.cc
./tests/a1.cc
./tests/a-c1.cc
./tests/a-c.cc
./tests/a_except.cc
./tests/a_noexcept.cc
./tests/coredump-test.cc
./tests/develop1.cc
./tests/develop2.cc
./tests/develop3.cc
./tests/develop4.cc
./tests/develop5.cc
./tests/develop.cc
./tests/e/Makefile.am
./tests/e/sm_perf_test.cc
./tests/ice/UObject_i.cc
./tests/ice/UTypes_i.cc
./tests/int_unsigned.cc
./tests/Makefile.am
./tests/m.cc
./tests/MQPerfTest/Makefile.am
./tests/MQPerfTest/mq-test.cc
./tests/perf_test.cc
./tests/PocoTest/Makefile.am
./tests/PocoTest/poco-test.cc
./tests/so_5/a_test2.h
./tests/so_5/sm_environment.h
./tests/so_5/sm_msg_types.h
./tests/TCPSocketTest/Makefile.am
./tests/TCPSocketTest/sock-client.cc
./tests/TCPSocketTest/sock-server.cc
./tests/test_conftest.cc
./tests/test_debugstream.cc
./tests/test_delaytimer.cc
./tests/test_dlog.cc
./tests/test_hourglass.cc
./tests/test_iocontroller_types.cc
./tests/test_iorfile.cc
./tests/test_logserver.cc
./tests/test_messagetype.cc
./tests/test_modbustypes.cc
./tests/test_mqueue.cc
./tests/test_mutex.cc
./tests/test_passivecondtimer.cc
./tests/test_passivetimer.cc
./tests/test_pulse.cc
./tests/tests.cc
./tests/test_sscanf_hex.cc
./tests/tests_with_conf.cc
./tests/test_tcpcheck.cc
./tests/test_triggerAND.cc
./tests/test_trigger.cc
./tests/test_triggerOR.cc
./tests/test_triggerOUT.cc
./tests/test_uhttp.cc
./tests/test_ui.cc
./tests/test_unixml.cc
./tests/test_uobject.cc
./tests/TestUObject.h
./tests/test_utcpsocket.cc
./tests/test_utypes.cc
./tests/threadtst.cc
./tests/UHttpTest/Makefile.am
./tests/UHttpTest/uhttp-test.cc
./testsuite/Makefile.am
./tests/umutex.cc
./tests/UniXmlTest/Makefile.am
./tests/UniXmlTest/XmlTest.cc
./tt.cc
./uniset-config.h
./Utilities/Admin/admin.cc
./Utilities/Admin/c.cc
./Utilities/Admin/Makefile.am
./Utilities/Admin/t.cc
./Utilities/codegen/Makefile.am
./Utilities/codegen/skel.cc
./Utilities/codegen/skel.h
./Utilities/codegen/skel-main.cc
./Utilities/codegen/skel-Makefile.am
./Utilities/codegen/skel.src.xml
./Utilities/codegen/tests/Makefile.am
./Utilities/codegen/tests/t.cc
./Utilities/codegen/tests/TestGenAlone.cc
./Utilities/codegen/tests/TestGenAlone.h
./Utilities/codegen/tests/TestGenAlone-main.cc
./Utilities/codegen/tests/testgen-alone.src.xml
./Utilities/codegen/tests/TestGen.cc
./Utilities/codegen/tests/TestGen.h
./Utilities/codegen/tests/TestGen-main.cc
./Utilities/codegen/tests/testgen.src.xml
./Utilities/codegen/tests/uobject.src.xml
./Utilities/Makefile.am
./Utilities/MBTester/Makefile.am
./Utilities/MBTester/mbrtuslave.cc
./Utilities/MBTester/mbrtutester.cc
./Utilities/MBTester/mbslave.cc
./Utilities/MBTester/MBSlave.cc
./Utilities/MBTester/MBSlave.h
./Utilities/MBTester/mbtcpconnection.cc
./Utilities/MBTester/mbtcpserver.cc
./Utilities/MBTester/MBTCPServer.cc
./Utilities/MBTester/MBTCPServer.h
./Utilities/MBTester/mbtcptester.3.cc
./Utilities/MBTester/mbtcptester.cc
./Utilities/NullController/main.cc
./Utilities/NullController/Makefile.am
./Utilities/NullController/NullController.cc
./Utilities/NullController/NullController.h
./Utilities/scripts/Makefile.am
./Utilities/SImitator/main.cc
./Utilities/SImitator/Makefile.am
./Utilities/SMonit/Makefile.am
./Utilities/SMonit/smonitor.cc
./Utilities/SViewer-text/main.cc
./Utilities/SViewer-text/Makefile.am
./Utilities/t.cc
./Utilities/ULog/log2val.cc
./Utilities/ULog/log.cc
./Utilities/ULog/logserver.cc
./Utilities/ULog/log-stdin.cc
./Utilities/ULog/log-wrap.cc
./Utilities/ULog/Makefile.am
./wrappers/core/UConnector.cc
./wrappers/core/UConnector.h
./wrappers/core/UExceptions.h
./wrappers/core/UModbus.cc
./wrappers/core/UModbus.h
./wrappers/core/UProxyObject.cc
./wrappers/core/UProxyObject.h
./wrappers/core/UTypes.h
./wrappers/Makefile.am
./wrappers/python/lib/Makefile.am
./wrappers/python/lib/pyUniSet/Makefile.am
./wrappers/python/lib/pyUniSet/PyUInterface.cc
./wrappers/python/lib/pyUniSet/PyUInterface.h
./wrappers/python/Makefile.am
./wrappers/python/netdata-plugin/Makefile.am
./conf/configure.xml
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