Commit d9f71645 authored by Pavel Vainerman's avatar Pavel Vainerman

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

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