Commit 5a57e992 authored by Pavel Vainerman's avatar Pavel Vainerman Committed by Pavel Vainerman

[freeze-value]: fix "unfreeze", added some docs

parent b012c7c3
......@@ -850,6 +850,7 @@ int freezeValue( const string& args, bool set, UInterface& ui )
if( verb )
{
cout << " set: " << set << endl;
cout << " value: " << it.val << endl;
cout << " name: (" << it.si.id << ") " << it.fname << endl;
cout << " iotype: " << t << endl;
......
# Заморозка (фиксация) значения датчика в SM
В библиотеке поддерживается механизм, позволяющий замораживать значение датчика и оно не будет меняться,
пока не будет обратно"разморожено". При этом функция `setValue()` будет продолжать работать и будет менять
значение датчика в памяти SM. Но пока датчик не будет разморожен эти изменения не будут видны.
После разморозки датчика, будет выставлено текущее значение.
Для управления "заморозкой" существует две возможности
### Заморозка значения при помощи утилиты uniset2-admin
Для того, чтобы заморозить какое-то значение достаточно вызвать команду
```
uniset2-admin --confile xxx --freezeValue SID@node=value 1
```
Где:
- `SID` - это имя или идентификатор датчика
- `node` - узел на котором датчик находится (необязательный параметр)
- `value` - значение которое будет установлено у датчика (при "разморозке" значение не важно)
- `1` - заморозить
Можно замораживать или размораживать сразу несколько датчиков.
- Заморозить датчики
```
uniset2-admin --confile xxx --freezeValue sens1=10,sens2=100,sens3=42 1
```
- Разморозить датчики
```
uniset2-admin --confile xxx --freezeValue sens1,sens2,sens3 0
```
### Заморозка значения при помощи UInterface (в коде)
Для "заморозки/разморозки" значений в коде в UInterface предусмотрена функция
```
void freezeValue( const IOController_i::SensorInfo& si, bool set, long value, uniset::ObjectId supplier );
```
Пример заморозки:
```
...
IOController_i::SensorInfo si;
si.id = 100; // sensorID
si.node = conf->getLocalNode();
ui->freezeValue(si, true, 100);
```
......@@ -20,18 +20,18 @@ static const std::string aidName = "AI_AS";
// -----------------------------------------------------------------------------
static void init_test()
{
shm = smiInstance();
REQUIRE( shm != nullptr );
shm = smiInstance();
REQUIRE( shm != nullptr );
auto conf = uniset_conf();
auto conf = uniset_conf();
REQUIRE( conf != nullptr );
REQUIRE( conf != nullptr );
testOID = conf->getObjectID("TestProc");
CHECK( testOID != DefaultObjectId );
testOID = conf->getObjectID("TestProc");
CHECK( testOID != DefaultObjectId );
aid = conf->getSensorID(aidName);
CHECK( aid != DefaultObjectId );
aid = conf->getSensorID(aidName);
CHECK( aid != DefaultObjectId );
}
// -----------------------------------------------------------------------------
TEST_CASE("[REST API: conf]", "[restapi][conf]")
......@@ -255,6 +255,8 @@ TEST_CASE("[REST API: /consumers]", "[restapi][consumers]")
{
init_test();
REQUIRE_NOTHROW( shm->askSensor(aid, UniversalIO::UIONotify, testOID) );
// QUERY: /consumers
// Ожидаемый формат ответа:
// {"object":{"id":5003,"isActive":true,"lostMessages":0,"maxSizeOfMessageQueue":1000,"msgCount":0,"name":"SharedMemory","objectType":"IONotifyController"},
......@@ -285,8 +287,8 @@ TEST_CASE("[REST API: /consumers]", "[restapi][consumers]")
auto sens = jret->get("sensor").extract<Poco::JSON::Object::Ptr>();
REQUIRE(sens);
REQUIRE( sens->get("id").convert<ObjectId>() == 10 );
REQUIRE( sens->get("name").convert<std::string>() == "AI_AS" );
REQUIRE( sens->get("id").convert<ObjectId>() == aid );
REQUIRE( sens->get("name").convert<std::string>() == aidName );
auto cons = jret->get("consumers").extract<Poco::JSON::Array::Ptr>();
REQUIRE(cons);
......
......@@ -253,6 +253,9 @@ TEST_CASE("UInterface::freezeValue", "[UInterface][freezeValue]")
si.id = aid;
si.node = conf->getLocalNode();
REQUIRE_NOTHROW( ui->setValue(aid, 200) );
REQUIRE( ui->getValue(aid) == 200 );
REQUIRE_NOTHROW( ui->freezeValue(si, true, 10, testOID) );
REQUIRE( ui->getValue(aid) == 10 );
......@@ -264,7 +267,7 @@ TEST_CASE("UInterface::freezeValue", "[UInterface][freezeValue]")
REQUIRE_NOTHROW( ui->freezeValue(si, true, -1, testOID) );
REQUIRE( ui->getValue(aid) == -1 );
REQUIRE_NOTHROW( ui->freezeValue(si, false, -1, testOID) );
REQUIRE_NOTHROW( ui->freezeValue(si, false, 0, testOID) );
REQUIRE( ui->getValue(aid) == 100 );
REQUIRE_NOTHROW( ui->setValue(aid, 200) );
......
......@@ -179,9 +179,6 @@ namespace uniset
virtual void localSetUndefinedState( IOStateList::iterator& it, bool undefined,
const uniset::ObjectId sid );
// -- работа через указатель ---
virtual long localSetValue( std::shared_ptr<USensorInfo>& usi, CORBA::Long value, uniset::ObjectId sup_id );
long localGetValue( std::shared_ptr<USensorInfo>& usi) ;
virtual void localFreezeValueIt( IOController::IOStateList::iterator& li,
uniset::ObjectId sid,
CORBA::Boolean set,
......@@ -193,6 +190,11 @@ namespace uniset
CORBA::Long value,
uniset::ObjectId sup_id );
// -- работа через указатель ---
virtual long localSetValue( std::shared_ptr<USensorInfo>& usi, CORBA::Long value, uniset::ObjectId sup_id );
long localGetValue( std::shared_ptr<USensorInfo>& usi) ;
#ifndef DISABLE_REST_API
// http API
virtual Poco::JSON::Object::Ptr request_get( const std::string& req, const Poco::URI::QueryParameters& p );
......@@ -347,6 +349,7 @@ namespace uniset
size_t nchanges = { 0 }; // количество изменений датчика
long undef_value = { not_specified_value }; // значение для "неопределённого состояния датчика"
long frozen_value = { 0 };
// функция обработки информации об изменении состояния датчика, от которого зависит данный
void checkDepend( std::shared_ptr<USensorInfo>& d_usi, IOController* );
......
......@@ -317,10 +317,7 @@ void IOController::localFreezeValue( std::shared_ptr<USensorInfo>& usi,
// выставляем флаг заморозки
uniset_rwmutex_wrlock lock(usi->val_lock);
usi->frozen = set;
usi->frozen_value = value;
// берём текущее значение, чтобы его не затереть
// при вызове setValue()
usi->frozen_value = set ? value : usi->value;
value = usi->real_value;
}
......
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