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