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"
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 \
--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 \
#--dlog-add-levels info,crit,warn \
......@@ -142,6 +142,7 @@ class 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;
......@@ -161,7 +162,7 @@ class IONotifyController:
/*! Информация о заказчике */
struct ConsumerInfoExt:
public UniSetTypes::ConsumerInfo
public UniSetTypes::ConsumerInfo
{
ConsumerInfoExt( const UniSetTypes::ConsumerInfo& ci,
UniSetObject_i_ptr ref = 0, size_t maxAttemtps = 10 ):
......@@ -170,6 +171,7 @@ class IONotifyController:
UniSetObject_i_var ref;
size_t attempt;
size_t lostEvents = { 0 }; // количество потерянных сообщений (не смогли послать)
ConsumerInfoExt( const ConsumerInfoExt& ) = default;
ConsumerInfoExt& operator=( const ConsumerInfoExt& ) = default;
......@@ -192,8 +194,7 @@ class IONotifyController:
};
/*! словарь: датчик -> список потребителей */
typedef std::unordered_map<UniSetTypes::KeyType, ConsumerListInfo> AskMap;
typedef std::unordered_map<UniSetTypes::ObjectId, ConsumerListInfo> AskMap;
/*! Информация о пороговом значении */
struct ThresholdInfoExt:
......
......@@ -242,7 +242,7 @@ namespace UniSetTypes
ObjectId sensor_id; /* ID датчика (события) */
double sensor_value; /* значение датчика (события) */
struct timespec sensor_time; /* время срабатывания датчика(события), который квитируем */
struct timespec confirm_time; /* время, когда произошло квитирование */
struct timespec confirm_time; /* * время прошедшее до момента квитирования */
bool broadcast;
......
......@@ -24,9 +24,11 @@
#include <sys/times.h>
#include <stdio.h>
#include <unistd.h>
#include <iomanip>
#include "UInterface.h"
#include "IONotifyController.h"
#include "ORepHelpers.h"
#include "Debug.h"
#include "NCRestorer.h"
......@@ -70,6 +72,54 @@ IONotifyController::~IONotifyController()
conUndef.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,
auto s = myiofind(sid);
if( s != myioEnd() )
s->second->userdata[udataConsumerList] = (void*)(&(askIterator->second));
s->second->userdata[udataConsumerList] = &(askIterator->second);
else
s->second->userdata[udataConsumerList] = nullptr;
}
......@@ -358,9 +408,9 @@ void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage
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
{
......@@ -393,6 +443,10 @@ void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage
<< " catch..." << endl;
}
// фиксируем только после первой попытки послать
if( i > 0 )
li->lostEvents++;
if( maxAttemtps > 0 && --(li->attempt) <= 0 )
{
li = lst.clst.erase(li);
......
......@@ -75,8 +75,11 @@ void NCRestorer::addlist( IONotifyController* ic, std::shared_ptr<IOController::
case UniversalIO::AI:
case UniversalIO::DO:
case UniversalIO::AO:
{
ic->askIOList[inf->si.id] = std::move(lst);
inf->userdata[IONotifyController::udataConsumerList] = &(ic->askIOList[inf->si.id]);
break;
}
default:
ucrit << ic->getName() << "(NCRestorer::addlist): НЕИЗВЕСТНЫЙ ТИП ДАТЧИКА!-> "
......
......@@ -442,7 +442,6 @@ void NCRestorer_XML::read_consumers( const std::shared_ptr<UniXML>& xml, xmlNode
if( cit.goChildren() )
{
IONotifyController::ConsumerListInfo lst;
if( getConsumerList(xml, cit, lst) )
{
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