Commit 2ef15461 authored by Pavel Vainerman's avatar Pavel Vainerman

(Unet2): добавил возможность задать датчики для связи количества потерянных…

(Unet2): добавил возможность задать датчики для связи количества потерянных пакетов не только для каждого канала отдельно, но и для узла в целом (обобщённые датчики).
parent b963e5f7
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
Name: libuniset Name: libuniset
Version: 1.3 Version: 1.3
Release: alt3 Release: alt4
Summary: UniSet - library for building distributed industrial control systems Summary: UniSet - library for building distributed industrial control systems
License: GPL License: GPL
Group: Development/C++ Group: Development/C++
...@@ -213,6 +213,9 @@ rm -f %buildroot%_libdir/*.la ...@@ -213,6 +213,9 @@ rm -f %buildroot%_libdir/*.la
%changelog %changelog
* Fri Feb 03 2012 Pavel Vainerman <pv@altlinux.ru> 1.3-alt4
- add commmon (respond and lostpackets) sensors for UNet2
* Tue Jan 31 2012 Pavel Vainerman <pv@altlinux.ru> 1.3-alt3 * Tue Jan 31 2012 Pavel Vainerman <pv@altlinux.ru> 1.3-alt3
- minor fixes in simitator - minor fixes in simitator
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -151,7 +151,7 @@ sender2(0) ...@@ -151,7 +151,7 @@ sender2(0)
continue; continue;
} }
string s_resp_id(n_it.getProp("unet_respond_id")); string s_resp_id(n_it.getProp("unet_respond1_id"));
UniSetTypes::ObjectId resp_id = UniSetTypes::DefaultObjectId; UniSetTypes::ObjectId resp_id = UniSetTypes::DefaultObjectId;
if( !s_resp_id.empty() ) if( !s_resp_id.empty() )
{ {
...@@ -179,7 +179,7 @@ sender2(0) ...@@ -179,7 +179,7 @@ sender2(0)
} }
} }
string s_lp_id(n_it.getProp("unet_lostpackets_id")); string s_lp_id(n_it.getProp("unet_lostpackets1_id"));
UniSetTypes::ObjectId lp_id = UniSetTypes::DefaultObjectId; UniSetTypes::ObjectId lp_id = UniSetTypes::DefaultObjectId;
if( !s_lp_id.empty() ) if( !s_lp_id.empty() )
{ {
...@@ -207,6 +207,35 @@ sender2(0) ...@@ -207,6 +207,35 @@ sender2(0)
} }
} }
string s_lp_comm_id(n_it.getProp("unet_lostpackets_id"));
UniSetTypes::ObjectId lp_comm_id = UniSetTypes::DefaultObjectId;
if( !s_lp_comm_id.empty() )
{
lp_comm_id = conf->getSensorID(s_lp_comm_id);
if( lp_comm_id == UniSetTypes::DefaultObjectId )
{
ostringstream err;
err << myname << ": Unknown LostPacketsID(comm).. Not found id for '" << s_lp_comm_id << "'" << endl;
dlog[Debug::CRIT] << myname << "(init): " << err.str() << endl;
throw SystemError(err.str());
}
}
string s_resp_comm_id(n_it.getProp("unet_respond2_id"));
UniSetTypes::ObjectId resp_comm_id = UniSetTypes::DefaultObjectId;
if( !s_resp_comm_id.empty() )
{
resp_comm_id = conf->getSensorID(s_resp_comm_id);
if( resp_comm_id == UniSetTypes::DefaultObjectId )
{
ostringstream err;
err << myname << ": Unknown RespondID(2).. Not found id for '" << s_resp_comm_id << "'" << endl;
dlog[Debug::CRIT] << myname << "(init): " << err.str() << endl;
throw SystemError(err.str());
}
}
dlog[Debug::INFO] << myname << "(init): (node='" << n << "') add receiver " dlog[Debug::INFO] << myname << "(init): (node='" << n << "') add receiver "
<< h2 << ":" << p2 << endl; << h2 << ":" << p2 << endl;
UNetReceiver* r = new UNetReceiver(h,p,shm); UNetReceiver* r = new UNetReceiver(h,p,shm);
...@@ -258,6 +287,8 @@ sender2(0) ...@@ -258,6 +287,8 @@ sender2(0)
} }
ReceiverInfo ri(r,r2); ReceiverInfo ri(r,r2);
ri.setRespondID(resp_comm_id);
ri.setLostPacketsID(lp_comm_id);
recvlist.push_back(ri); recvlist.push_back(ri);
} }
...@@ -383,9 +414,46 @@ void UNetExchange::step() ...@@ -383,9 +414,46 @@ void UNetExchange::step()
dlog[Debug::CRIT] << myname << "(step): (hb) " << ex << std::endl; dlog[Debug::CRIT] << myname << "(step): (hb) " << ex << std::endl;
} }
} }
for( ReceiverList::iterator it=recvlist.begin(); it!=recvlist.end(); ++it )
it->step(shm, myname);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetExchange::ReceiverInfo::step( SMInterface* shm, const std::string myname )
{
try
{
if( sidRespond != DefaultObjectId )
{
bool resp = ( (r1 && r1->isRecvOK()) || (r2 && r2->isRecvOK()) );
shm->localSaveState(ditRespond,sidRespond,resp,shm->ID());
}
}
catch( Exception& ex )
{
dlog[Debug::CRIT] << myname << "(ReceiverInfo::step): (respond): " << ex << std::endl;
}
try
{
if( sidLostPackets != DefaultObjectId )
{
long l = 0;
if( r1 )
l += r1->getLostPacketsNum();
if( r2 )
l += r2->getLostPacketsNum();
shm->localSaveValue(aitLostPackets,sidLostPackets,l,shm->ID());
}
}
catch( Exception& ex )
{
dlog[Debug::CRIT] << myname << "(ReceiverInfo::step): (lostpackets): " << ex << std::endl;
}
}
// -----------------------------------------------------------------------------
void UNetExchange::processingMessage( UniSetTypes::VoidMessage *msg ) void UNetExchange::processingMessage( UniSetTypes::VoidMessage *msg )
{ {
try try
...@@ -602,6 +670,9 @@ void UNetExchange::initIterators() ...@@ -602,6 +670,9 @@ void UNetExchange::initIterators()
sender->initIterators(); sender->initIterators();
if( sender2 ) if( sender2 )
sender2->initIterators(); sender2->initIterators();
for( ReceiverList::iterator it=recvlist.begin(); it!=recvlist.end(); it++ )
it->initIterators(shm);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetExchange::help_print( int argc, const char* argv[] ) void UNetExchange::help_print( int argc, const char* argv[] )
......
...@@ -140,11 +140,38 @@ class UNetExchange: ...@@ -140,11 +140,38 @@ class UNetExchange:
struct ReceiverInfo struct ReceiverInfo
{ {
ReceiverInfo():r1(0),r2(0){} ReceiverInfo():r1(0),r2(0),
ReceiverInfo(UNetReceiver* _r1, UNetReceiver* _r2 ):r1(_r1),r2(_r2){} sidRespond(UniSetTypes::DefaultObjectId),
sidLostPackets(UniSetTypes::DefaultObjectId)
{}
ReceiverInfo(UNetReceiver* _r1, UNetReceiver* _r2 ):
r1(_r1),r2(_r2),
sidRespond(UniSetTypes::DefaultObjectId),
sidLostPackets(UniSetTypes::DefaultObjectId)
{}
UNetReceiver* r1; /*!< приём по первому каналу */ UNetReceiver* r1; /*!< приём по первому каналу */
UNetReceiver* r2; /*!< приём по второму каналу */ UNetReceiver* r2; /*!< приём по второму каналу */
void step( SMInterface* shm, const std::string myname );
inline void setRespondID( UniSetTypes::ObjectId id ){ sidRespond = id; }
inline void setLostPacketsID( UniSetTypes::ObjectId id ){ sidLostPackets = id; }
inline void initIterators( SMInterface* shm )
{
shm->initAIterator(aitLostPackets);
shm->initDIterator(ditRespond);
}
// Сводная информация по двум каналам
// сумма потерянных пакетов и наличие связи
// хотя бы по одному каналу
// ( реализацию см. ReceiverInfo::step() )
UniSetTypes::ObjectId sidRespond;
IOController::DIOStateList::iterator ditRespond;
UniSetTypes::ObjectId sidLostPackets;
IOController::AIOStateList::iterator aitLostPackets;
}; };
typedef std::list<ReceiverInfo> ReceiverList; typedef std::list<ReceiverInfo> ReceiverList;
......
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