Commit 4e758c6c authored by Pavel Vainerman's avatar Pavel Vainerman

(IONotifyController): Добавил вывод информации о заказчиках по датчикам

и вывод статистики по потерянным сообщениям, исправил ошибку с инициализацией списка заказчиков из xml-файла
parent 80af5c8f
...@@ -4,8 +4,11 @@ export LD_LIBRARY_PATH="../../lib/.libs;../lib/.libs" ...@@ -4,8 +4,11 @@ export LD_LIBRARY_PATH="../../lib/.libs;../lib/.libs"
ulimit -Sc 10000000000 ulimit -Sc 10000000000
./uniset2-start.sh -f ./uniset2-smemory --smemory-id SharedMemory --pulsar-id DO_C --pulsar-iotype DO --pulsar-msec 100 \ ./uniset2-start.sh -f ./uniset2-smemory --smemory-id SharedMemory \
--confile test.xml --datfile test.xml --db-logging 1 --ulog-add-levels system \ --confile test.xml --datfile test.xml --db-logging 1 --ulog-add-levels system \
--sm-log-add-levels any $* --sm-run-logserver \ --sm-log-add-levels any $* --sm-run-logserver \
#--pulsar-id DO_C --pulsar-iotype DO --pulsar-msec 100
#--ulog-add-levels info,crit,warn,level9,system \ #--ulog-add-levels info,crit,warn,level9,system \
#--dlog-add-levels info,crit,warn \ #--dlog-add-levels info,crit,warn \
...@@ -142,6 +142,7 @@ class IONotifyController: ...@@ -142,6 +142,7 @@ class IONotifyController:
return UniSetTypes::ObjectType("IONotifyController"); return UniSetTypes::ObjectType("IONotifyController");
} }
virtual UniSetTypes::SimpleInfo* getInfo( ::CORBA::Long userparam = 0 ) override;
virtual void askSensor(const UniSetTypes::ObjectId sid, const UniSetTypes::ConsumerInfo& ci, UniversalIO::UIOCommand cmd) override; virtual void askSensor(const UniSetTypes::ObjectId sid, const UniSetTypes::ConsumerInfo& ci, UniversalIO::UIOCommand cmd) override;
...@@ -161,7 +162,7 @@ class IONotifyController: ...@@ -161,7 +162,7 @@ class IONotifyController:
/*! Информация о заказчике */ /*! Информация о заказчике */
struct ConsumerInfoExt: struct ConsumerInfoExt:
public UniSetTypes::ConsumerInfo public UniSetTypes::ConsumerInfo
{ {
ConsumerInfoExt( const UniSetTypes::ConsumerInfo& ci, ConsumerInfoExt( const UniSetTypes::ConsumerInfo& ci,
UniSetObject_i_ptr ref = 0, size_t maxAttemtps = 10 ): UniSetObject_i_ptr ref = 0, size_t maxAttemtps = 10 ):
...@@ -170,6 +171,7 @@ class IONotifyController: ...@@ -170,6 +171,7 @@ class IONotifyController:
UniSetObject_i_var ref; UniSetObject_i_var ref;
size_t attempt; size_t attempt;
size_t lostEvents = { 0 }; // количество потерянных сообщений (не смогли послать)
ConsumerInfoExt( const ConsumerInfoExt& ) = default; ConsumerInfoExt( const ConsumerInfoExt& ) = default;
ConsumerInfoExt& operator=( const ConsumerInfoExt& ) = default; ConsumerInfoExt& operator=( const ConsumerInfoExt& ) = default;
...@@ -192,8 +194,7 @@ class IONotifyController: ...@@ -192,8 +194,7 @@ class IONotifyController:
}; };
/*! словарь: датчик -> список потребителей */ /*! словарь: датчик -> список потребителей */
typedef std::unordered_map<UniSetTypes::KeyType, ConsumerListInfo> AskMap; typedef std::unordered_map<UniSetTypes::ObjectId, ConsumerListInfo> AskMap;
/*! Информация о пороговом значении */ /*! Информация о пороговом значении */
struct ThresholdInfoExt: struct ThresholdInfoExt:
......
...@@ -242,7 +242,7 @@ namespace UniSetTypes ...@@ -242,7 +242,7 @@ namespace UniSetTypes
ObjectId sensor_id; /* ID датчика (события) */ ObjectId sensor_id; /* ID датчика (события) */
double sensor_value; /* значение датчика (события) */ double sensor_value; /* значение датчика (события) */
struct timespec sensor_time; /* время срабатывания датчика(события), который квитируем */ struct timespec sensor_time; /* время срабатывания датчика(события), который квитируем */
struct timespec confirm_time; /* время, когда произошло квитирование */ struct timespec confirm_time; /* * время прошедшее до момента квитирования */
bool broadcast; bool broadcast;
......
...@@ -24,9 +24,11 @@ ...@@ -24,9 +24,11 @@
#include <sys/times.h> #include <sys/times.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <iomanip>
#include "UInterface.h" #include "UInterface.h"
#include "IONotifyController.h" #include "IONotifyController.h"
#include "ORepHelpers.h"
#include "Debug.h" #include "Debug.h"
#include "NCRestorer.h" #include "NCRestorer.h"
...@@ -70,6 +72,54 @@ IONotifyController::~IONotifyController() ...@@ -70,6 +72,54 @@ IONotifyController::~IONotifyController()
conUndef.disconnect(); conUndef.disconnect();
conInit.disconnect(); conInit.disconnect();
} }
// ------------------------------------------------------------------------------------------
SimpleInfo* IONotifyController::getInfo( ::CORBA::Long userparam )
{
UniSetTypes::SimpleInfo_var i = IOController::getInfo();
ostringstream inf;
inf << i->info << endl;
if( userparam == 1 )
{
inf << "------------------------------- consumers list ------------------------------" << endl;
{
auto oind = uniset_conf()->oind;
uniset_rwmutex_rlock lock(askIOMutex);
for( auto&& a: askIOList )
{
auto& i = a.second;
uniset_rwmutex_rlock lock(i.mut);
// отображаем только датчики с "не пустым" списком заказчиков
if( i.clst.empty() )
continue;
inf << "(" << setw(6) << a.first << ")[" << oind->getMapName(a.first) << "]" << endl;
for( const auto& c: i.clst )
{
inf << " " << "(" << setw(6) << c.id << ")"
<< setw(35) << ORepHelpers::getShortName(oind->getMapName(c.id))
<< " [lostEvents=" << c.lostEvents << " attempt=" << c.attempt << "]"
<< endl;
}
}
}
inf << "-----------------------------------------------------------------------------" << endl << endl;
}
inf << "IONotifyController::UserParam help: " << endl
<< " 0. Common info" << endl
<< " 1. Consumers list " << endl;
i->info = inf.str().c_str();
return i._retn();
}
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
/*! /*!
...@@ -271,7 +321,7 @@ void IONotifyController::ask( AskMap& askLst, const UniSetTypes::ObjectId sid, ...@@ -271,7 +321,7 @@ void IONotifyController::ask( AskMap& askLst, const UniSetTypes::ObjectId sid,
auto s = myiofind(sid); auto s = myiofind(sid);
if( s != myioEnd() ) if( s != myioEnd() )
s->second->userdata[udataConsumerList] = (void*)(&(askIterator->second)); s->second->userdata[udataConsumerList] = &(askIterator->second);
else else
s->second->userdata[udataConsumerList] = nullptr; s->second->userdata[udataConsumerList] = nullptr;
} }
...@@ -358,9 +408,9 @@ void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage ...@@ -358,9 +408,9 @@ void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage
uniset_rwmutex_wrlock l(lst.mut); uniset_rwmutex_wrlock l(lst.mut);
for( auto li = lst.clst.begin(); li != lst.clst.end(); ++li ) for( ConsumerList::iterator li = lst.clst.begin(); li != lst.clst.end(); ++li )
{ {
for( int i = 0; i < 2; i++ ) // на каждый объект по две поптыки for( int i = 0; i < 2; i++ ) // на каждый объект по две попытки послать
{ {
try try
{ {
...@@ -393,6 +443,10 @@ void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage ...@@ -393,6 +443,10 @@ void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage
<< " catch..." << endl; << " catch..." << endl;
} }
// фиксируем только после первой попытки послать
if( i > 0 )
li->lostEvents++;
if( maxAttemtps > 0 && --(li->attempt) <= 0 ) if( maxAttemtps > 0 && --(li->attempt) <= 0 )
{ {
li = lst.clst.erase(li); li = lst.clst.erase(li);
......
...@@ -75,8 +75,11 @@ void NCRestorer::addlist( IONotifyController* ic, std::shared_ptr<IOController:: ...@@ -75,8 +75,11 @@ void NCRestorer::addlist( IONotifyController* ic, std::shared_ptr<IOController::
case UniversalIO::AI: case UniversalIO::AI:
case UniversalIO::DO: case UniversalIO::DO:
case UniversalIO::AO: case UniversalIO::AO:
{
ic->askIOList[inf->si.id] = std::move(lst); ic->askIOList[inf->si.id] = std::move(lst);
inf->userdata[IONotifyController::udataConsumerList] = &(ic->askIOList[inf->si.id]);
break; break;
}
default: default:
ucrit << ic->getName() << "(NCRestorer::addlist): НЕИЗВЕСТНЫЙ ТИП ДАТЧИКА!-> " ucrit << ic->getName() << "(NCRestorer::addlist): НЕИЗВЕСТНЫЙ ТИП ДАТЧИКА!-> "
......
...@@ -442,7 +442,6 @@ void NCRestorer_XML::read_consumers( const std::shared_ptr<UniXML>& xml, xmlNode ...@@ -442,7 +442,6 @@ void NCRestorer_XML::read_consumers( const std::shared_ptr<UniXML>& xml, xmlNode
if( cit.goChildren() ) if( cit.goChildren() )
{ {
IONotifyController::ConsumerListInfo lst; IONotifyController::ConsumerListInfo lst;
if( getConsumerList(xml, cit, lst) ) if( getConsumerList(xml, cit, lst) )
{ {
std::shared_ptr<IOController::USensorInfo> uinf = std::static_pointer_cast<IOController::USensorInfo>(inf); std::shared_ptr<IOController::USensorInfo> uinf = std::static_pointer_cast<IOController::USensorInfo>(inf);
......
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