Commit d9f71645 authored by Pavel Vainerman's avatar Pavel Vainerman

(Restorer): небольшая оптимизация

(SM): небольшая корректировка тестов
parent 3be517fb
...@@ -52,7 +52,9 @@ HTTP API: ...@@ -52,7 +52,9 @@ HTTP API:
- smonit запись значений в файл (csv?,sqlite?,gnuplot) - smonit запись значений в файл (csv?,sqlite?,gnuplot)
- python: gui sensor monitor - python: gui sensor monitor
- IOBase: возможность задавать свою формулу преобразования входного сигнала (помимо калибровки).. IOBase:
- возможность задавать свою формулу преобразования входного сигнала (помимо калибровки)..
- реализовать фильтр Калмана
- переписать систему инициализации и работы между UniSetActivator,UniSetManager и UniSetObject-ами (уменьшить количество функций (связность)) - переписать систему инициализации и работы между UniSetActivator,UniSetManager и UniSetObject-ами (уменьшить количество функций (связность))
...@@ -67,8 +69,7 @@ HTTP API: ...@@ -67,8 +69,7 @@ HTTP API:
ModbusSlave: подумать насчёт оптимизации по скорости (вместо поиска по RegMap, сделать массив на 65535 регистров или map-ов по номеру функции, ModbusSlave: подумать насчёт оптимизации по скорости (вместо поиска по RegMap, сделать массив на 65535 регистров или map-ов по номеру функции,
всего 65kB памяти). всего 65kB памяти).
libev libev:
=======
- переписать UNetUDP (на подумать) - переписать UNetUDP (на подумать)
- UniSetActivator (обработка сигналов и возможно вынести сюда DefaultEventLoop) (на подумать) - UniSetActivator (обработка сигналов и возможно вынести сюда DefaultEventLoop) (на подумать)
......
...@@ -497,7 +497,7 @@ namespace uniset ...@@ -497,7 +497,7 @@ namespace uniset
int activateTimeout; int activateTimeout;
virtual void logging( uniset::SensorMessage& sm ) override; virtual void logging( uniset::SensorMessage& sm ) override;
virtual void dumpOrdersList( const uniset::ObjectId sid, const IONotifyController::ConsumerListInfo& lst ) override {}; virtual void dumpOrdersList( const uniset::ObjectId sid, const IONotifyController::ConsumerListInfo& lst ) override {}
virtual void dumpThresholdList( const uniset::ObjectId sid, const IONotifyController::ThresholdExtList& lst ) override {} virtual void dumpThresholdList( const uniset::ObjectId sid, const IONotifyController::ThresholdExtList& lst ) override {}
bool dblogging = { false }; bool dblogging = { false };
......
...@@ -41,7 +41,7 @@ void TestObject::sensorInfo( const SensorMessage* sm ) ...@@ -41,7 +41,7 @@ void TestObject::sensorInfo( const SensorMessage* sm )
if( sm->id == monotonic_s ) if( sm->id == monotonic_s )
{ {
if( (sm->value - lastValue) < 0 ) if( (sm->value - lastValue) < 0 )
monitonicFailed = true; monotonicFailed = true;
if( (sm->value - lastValue) > 1 ) if( (sm->value - lastValue) > 1 )
{ {
...@@ -49,7 +49,7 @@ void TestObject::sensorInfo( const SensorMessage* sm ) ...@@ -49,7 +49,7 @@ void TestObject::sensorInfo( const SensorMessage* sm )
<< " lost: " << (sm->value - lastValue) << " lost: " << (sm->value - lastValue)
<< endl; << endl;
lostMessages = true; lostMessages += (sm->value - lastValue -1);
} }
lastValue = sm->value; lastValue = sm->value;
...@@ -73,17 +73,17 @@ void TestObject::askMonotonic() ...@@ -73,17 +73,17 @@ void TestObject::askMonotonic()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void TestObject::startMonitonicTest() void TestObject::startMonitonicTest()
{ {
monitonicFailed = false; monotonicFailed = false;
lostMessages = false; lostMessages = false;
lastValue = in_monotonic_s; lastValue = in_monotonic_s;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool TestObject::isMonotonicTestOK() const bool TestObject::isMonotonicTestOK() const
{ {
return !monitonicFailed; return !monotonicFailed;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool TestObject::isLostMessages() const long TestObject::getLostMessages() const
{ {
return lostMessages; return lostMessages;
} }
......
...@@ -31,7 +31,7 @@ class TestObject: ...@@ -31,7 +31,7 @@ class TestObject:
void askMonotonic(); void askMonotonic();
void startMonitonicTest(); void startMonitonicTest();
bool isMonotonicTestOK() const; bool isMonotonicTestOK() const;
bool isLostMessages() const; long getLostMessages() const;
long getLastValue() const; long getLastValue() const;
bool isEmptyQueue(); bool isEmptyQueue();
bool isFullQueue(); bool isFullQueue();
...@@ -46,8 +46,8 @@ class TestObject: ...@@ -46,8 +46,8 @@ class TestObject:
private: private:
bool evntIsOK = { false }; bool evntIsOK = { false };
bool monitonicFailed = { false }; bool monotonicFailed = { false };
bool lostMessages = { false }; long lostMessages = { false };
long lastValue = { 0 }; long lastValue = { 0 };
}; };
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -262,6 +262,8 @@ TEST_CASE("[SM]: monitonic sensor message", "[sm][monitonic]") ...@@ -262,6 +262,8 @@ TEST_CASE("[SM]: monitonic sensor message", "[sm][monitonic]")
{ {
InitTest(); InitTest();
REQUIRE( obj->exist() );
// Проверка корректной последовательности прихода SensorMessage. // Проверка корректной последовательности прихода SensorMessage.
// Тест заключается в том, что параллельно вызывается setValue() // Тест заключается в том, что параллельно вызывается setValue()
// и askSensors() и сообщения должны приходить в правильном порядке. // и askSensors() и сообщения должны приходить в правильном порядке.
...@@ -287,13 +289,11 @@ TEST_CASE("[SM]: monitonic sensor message", "[sm][monitonic]") ...@@ -287,13 +289,11 @@ TEST_CASE("[SM]: monitonic sensor message", "[sm][monitonic]")
obj->startMonitonicTest(); obj->startMonitonicTest();
// std::thread t(write_worker);
auto ret = std::async(std::launch::async, write_worker); auto ret = std::async(std::launch::async, write_worker);
for( long n=0; n <= max; n++ ) for( long n=0; n <= max; n++ )
obj->askMonotonic(); obj->askMonotonic();
// t.join();
REQUIRE( ret.get() ); REQUIRE( ret.get() );
DelayTimer dt(2000,0); DelayTimer dt(2000,0);
...@@ -301,8 +301,12 @@ TEST_CASE("[SM]: monitonic sensor message", "[sm][monitonic]") ...@@ -301,8 +301,12 @@ TEST_CASE("[SM]: monitonic sensor message", "[sm][monitonic]")
msleep(500); msleep(500);
REQUIRE( obj->isMonotonicTestOK() ); REQUIRE( obj->isMonotonicTestOK() );
REQUIRE_FALSE( obj->isLostMessages() ); REQUIRE( obj->getLostMessages() == 0 );
REQUIRE_FALSE( obj->isFullQueue() ); REQUIRE_FALSE( obj->isFullQueue() );
REQUIRE( obj->getLastValue() == max ); REQUIRE( obj->getLastValue() == max );
// print statistic
// uniset::SimpleInfo_var si = obj->getInfo(0);
// cerr << std::string(si->info) << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<settings> <settings>
<set name="class-name" val="TestObject"/> <set name="class-name" val="TestObject"/>
<set name="msg-count" val="30"/> <set name="msg-count" val="30"/>
<set name="sleep-msec" val="100"/> <set name="sleep-msec" val="50"/>
</settings> </settings>
<variables> <variables>
</variables> </variables>
......
...@@ -117,7 +117,7 @@ namespace uniset ...@@ -117,7 +117,7 @@ namespace uniset
Суть в том что к датчику через usedata мы привязываем указатель на список заказчиков. Сделано через userdata, Суть в том что к датчику через usedata мы привязываем указатель на список заказчиков. Сделано через userdata,
т.к. сам map "хранится" в IOController и IONotifyController не может поменять тип (в текущей реализации по крайней мере). т.к. сам map "хранится" в IOController и IONotifyController не может поменять тип (в текущей реализации по крайней мере).
В userdata задействованы два места (см. UserDataID) для списка заказчиков и для списка порогов. В userdata задействованы два места (см. UserDataID) для списка заказчиков и для списка порогов.
ри этом, чтобы гарантировать корректность работы, cписки заказчиков по тому или иному датчику, При этом, чтобы гарантировать корректность работы, cписки заказчиков по тому или иному датчику,
создаются (см. функцию ask()), но никогда не удаляются, даже если остаются пустыми. создаются (см. функцию ask()), но никогда не удаляются, даже если остаются пустыми.
Это сделано, чтобы сохранённые указатели в userdata, оставались всегда валидными Это сделано, чтобы сохранённые указатели в userdata, оставались всегда валидными
(т.к. используются из разных потоков). (т.к. используются из разных потоков).
......
...@@ -77,6 +77,9 @@ namespace uniset ...@@ -77,6 +77,9 @@ namespace uniset
virtual void dump(const IONotifyController* ic, std::shared_ptr<SInfo>& inf, const IONotifyController::ConsumerListInfo& lst) = 0; virtual void dump(const IONotifyController* ic, std::shared_ptr<SInfo>& inf, const IONotifyController::ConsumerListInfo& lst) = 0;
virtual void dumpThreshold(const IONotifyController* ic, std::shared_ptr<SInfo>& inf, const IONotifyController::ThresholdExtList& lst) = 0; virtual void dumpThreshold(const IONotifyController* ic, std::shared_ptr<SInfo>& inf, const IONotifyController::ThresholdExtList& lst) = 0;
// проверка поддерживаются ли функции dumpXXX (т.е. обновление списков)
virtual bool readOnly() const = 0;
protected: protected:
// добавление списка заказчиков // добавление списка заказчиков
...@@ -162,6 +165,7 @@ namespace uniset ...@@ -162,6 +165,7 @@ namespace uniset
virtual void dump(const IONotifyController* ic, std::shared_ptr<NCRestorer::SInfo>& inf, const IONotifyController::ConsumerListInfo& lst) override; virtual void dump(const IONotifyController* ic, std::shared_ptr<NCRestorer::SInfo>& inf, const IONotifyController::ConsumerListInfo& lst) override;
virtual void dumpThreshold(const IONotifyController* ic, std::shared_ptr<NCRestorer::SInfo>& inf, const IONotifyController::ThresholdExtList& lst) override; virtual void dumpThreshold(const IONotifyController* ic, std::shared_ptr<NCRestorer::SInfo>& inf, const IONotifyController::ThresholdExtList& lst) override;
virtual bool readOnly() const { return true; }
protected: protected:
......
...@@ -84,7 +84,6 @@ namespace uniset ...@@ -84,7 +84,6 @@ namespace uniset
} }
} }
cancelled = true;
isrunning = false; isrunning = false;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
......
...@@ -802,7 +802,7 @@ void IONotifyController::readDump() ...@@ -802,7 +802,7 @@ void IONotifyController::readDump()
{ {
try try
{ {
if( restorer != NULL ) if( restorer )
restorer->read(this); restorer->read(this);
} }
catch( const std::exception& ex ) catch( const std::exception& ex )
...@@ -824,7 +824,7 @@ void IONotifyController::initItem( std::shared_ptr<USensorInfo>& usi, IOControll ...@@ -824,7 +824,7 @@ void IONotifyController::initItem( std::shared_ptr<USensorInfo>& usi, IOControll
void IONotifyController::dumpOrdersList( const uniset::ObjectId sid, void IONotifyController::dumpOrdersList( const uniset::ObjectId sid,
const IONotifyController::ConsumerListInfo& lst ) const IONotifyController::ConsumerListInfo& lst )
{ {
if( restorer == NULL ) if( !restorer || restorer->readOnly() )
return; return;
try try
...@@ -844,7 +844,7 @@ void IONotifyController::dumpOrdersList( const uniset::ObjectId sid, ...@@ -844,7 +844,7 @@ void IONotifyController::dumpOrdersList( const uniset::ObjectId sid,
void IONotifyController::dumpThresholdList( const uniset::ObjectId sid, const IONotifyController::ThresholdExtList& lst ) void IONotifyController::dumpThresholdList( const uniset::ObjectId sid, const IONotifyController::ThresholdExtList& lst )
{ {
if( restorer == NULL ) if( !restorer || restorer->readOnly() )
return; return;
try try
...@@ -1030,12 +1030,13 @@ bool IONotifyController::removeThreshold( ThresholdExtList& lst, ThresholdInfoEx ...@@ -1030,12 +1030,13 @@ bool IONotifyController::removeThreshold( ThresholdExtList& lst, ThresholdInfoEx
{ {
if( removeConsumer(it->clst, ci) ) if( removeConsumer(it->clst, ci) )
{ {
/* Даже если список заказчиков по данному датчику стал пуст. /* Даже если список заказчиков по данному датчику стал пуст.
Не удаляем датчик из списка, чтобы не поломать итераторы * Не удаляем датчик из списка, чтобы не поломать итераторы
которые могут использоваться в этот момент в других потоках */ * которые могут использоваться в этот момент в других потоках
// uniset_rwmutex_wrlock lock(it->clst.mut); */
// if( it->clst.clst.empty() ) // uniset_rwmutex_wrlock lock(it->clst.mut);
// lst.erase(it); // if( it->clst.clst.empty() )
// lst.erase(it);
return true; return true;
} }
} }
...@@ -1066,7 +1067,6 @@ void IONotifyController::checkThreshold( std::shared_ptr<IOController::USensorIn ...@@ -1066,7 +1067,6 @@ void IONotifyController::checkThreshold( std::shared_ptr<IOController::USensorIn
return; return;
// обрабатываем текущее состояние датчика обязательно "залочив" значение.. // обрабатываем текущее состояние датчика обязательно "залочив" значение..
uniset_rwmutex_rlock vlock(usi->val_lock); uniset_rwmutex_rlock vlock(usi->val_lock);
SensorMessage sm(std::move(usi->makeSensorMessage(false))); SensorMessage sm(std::move(usi->makeSensorMessage(false)));
......
...@@ -20,6 +20,8 @@ include/libxml2/libxml ...@@ -20,6 +20,8 @@ include/libxml2/libxml
include/modbus include/modbus
python/lib/pyUniSet python/lib/pyUniSet
src/Log src/Log
src/Processes
src/Communications
Utilities/codegen Utilities/codegen
Utilities/codegen/tests Utilities/codegen/tests
Utilities/MBTester Utilities/MBTester
......
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