|
| IONotifyController (const std::string &name, const std::string §ion, std::shared_ptr< IOConfig > ioconf=nullptr) |
|
| IONotifyController (const uniset::ObjectId id, std::shared_ptr< IOConfig > ioconf=nullptr) |
|
virtual uniset::ObjectType | getType () override |
|
virtual uniset::SimpleInfo * | getInfo (const char *userparam=0) override |
|
virtual void | askSensor (const uniset::ObjectId sid, const uniset::ConsumerInfo &ci, UniversalIO::UIOCommand cmd) override |
|
virtual void | askThreshold (const uniset::ObjectId sid, const uniset::ConsumerInfo &ci, uniset::ThresholdId tid, CORBA::Long lowLimit, CORBA::Long hiLimit, CORBA::Boolean invert, UniversalIO::UIOCommand cmd) override |
|
virtual IONotifyController_i::ThresholdInfo | getThresholdInfo (const uniset::ObjectId sid, uniset::ThresholdId tid) override |
|
virtual IONotifyController_i::ThresholdList * | getThresholds (const uniset::ObjectId sid) override |
|
virtual IONotifyController_i::ThresholdsListSeq * | getThresholdsList () override |
|
virtual uniset::IDSeq * | askSensorsSeq (const uniset::IDSeq &lst, const uniset::ConsumerInfo &ci, UniversalIO::UIOCommand cmd) override |
|
virtual Poco::JSON::Object::Ptr | httpHelp (const Poco::URI::QueryParameters &p) override |
|
virtual Poco::JSON::Object::Ptr | httpRequest (const std::string &req, const Poco::URI::QueryParameters &p) override |
|
| IOController (const std::string &name, const std::string §ion) |
|
| IOController (const uniset::ObjectId id) |
|
void | setDBServer (const std::shared_ptr< uniset::DBServer > &dbserver) |
|
virtual CORBA::Long | getValue (uniset::ObjectId sid) override |
|
virtual void | setValue (uniset::ObjectId sid, CORBA::Long value, uniset::ObjectId sup_id=uniset::DefaultObjectId) override |
|
virtual void | setUndefinedState (uniset::ObjectId sid, CORBA::Boolean undefined, uniset::ObjectId sup_id=uniset::DefaultObjectId) override |
|
virtual void | freezeValue (uniset::ObjectId sid, CORBA::Boolean set, CORBA::Long value, uniset::ObjectId sup_id=uniset::DefaultObjectId) override |
|
virtual IOController_i::SensorInfoSeq * | getSensorSeq (const uniset::IDSeq &lst) override |
|
virtual uniset::IDSeq * | setOutputSeq (const IOController_i::OutSeq &lst, uniset::ObjectId sup_id) override |
|
virtual UniversalIO::IOType | getIOType (uniset::ObjectId sid) override |
|
virtual IOController_i::SensorInfoSeq * | getSensorsMap () override |
|
virtual IOController_i::SensorIOInfo | getSensorIOInfo (uniset::ObjectId sid) override |
|
virtual CORBA::Long | getRawValue (uniset::ObjectId sid) override |
|
virtual void | calibrate (uniset::ObjectId sid, const IOController_i::CalibrateInfo &ci, uniset::ObjectId adminId) override |
|
IOController_i::CalibrateInfo | getCalibrateInfo (uniset::ObjectId sid) override |
|
IOController_i::SensorInfo | SensorInfo (const uniset::ObjectId sid, const uniset::ObjectId node=uniset::uniset_conf() ->getLocalNode()) |
|
uniset::Message::Priority | getPriority (const uniset::ObjectId id) |
|
virtual IOController_i::ShortIOInfo | getTimeChange (const uniset::ObjectId id) override |
|
virtual IOController_i::ShortMapSeq * | getSensors () override |
|
ChangeSignal | signal_change_value (uniset::ObjectId sid) |
|
ChangeSignal | signal_change_value () |
|
ChangeUndefinedStateSignal | signal_change_undefined_state (uniset::ObjectId sid) |
|
ChangeUndefinedStateSignal | signal_change_undefined_state () |
|
IOStateList::iterator | ioBegin () |
|
IOStateList::iterator | ioEnd () |
|
IOStateList::iterator | find (uniset::ObjectId k) |
|
int | ioCount () const noexcept |
|
| UniSetManager (uniset::ObjectId id) |
|
| UniSetManager (const std::string &name, const std::string §ion) |
|
virtual void | broadcast (const uniset::TransportMessage &msg) override |
|
virtual uniset::SimpleInfoSeq * | getObjectsInfo (CORBA::Long MaxLength=300, const char *userparam=0) override |
|
virtual bool | add (const std::shared_ptr< UniSetObject > &obj) |
|
virtual bool | remove (const std::shared_ptr< UniSetObject > &obj) |
|
size_t | objectsCount () const |
|
PortableServer::POA_ptr | getPOA () |
|
PortableServer::POAManager_ptr | getPOAManager () |
|
std::shared_ptr< UniSetManager > | get_mptr () |
|
| UniSetObject (const std::string &name, const std::string §ion) |
|
| UniSetObject (uniset::ObjectId id) |
|
virtual CORBA::Boolean | exist () override |
|
virtual uniset::ObjectId | getId () override |
|
const uniset::ObjectId | getId () const |
|
std::string | getName () const |
|
const std::string | getStrType () |
|
virtual uniset::SimpleInfo * | apiRequest (const char *query) override |
|
virtual void | push (const uniset::TransportMessage &msg) override |
| поместить сообщение в очередь
|
|
virtual void | pushMessage (const char *msg, ::CORBA::Long mtype, const ::uniset::Timespec &tm, const ::uniset::ProducerInfo &pi, ::CORBA::Long priority, ::CORBA::Long consumer) override |
| поместить текстовое сообщение в очередь
|
|
virtual Poco::JSON::Object::Ptr | httpGet (const Poco::URI::QueryParameters &p) override |
|
uniset::ObjectPtr | getRef () const |
|
std::shared_ptr< UniSetObject > | get_ptr () |
|
virtual timeout_t | askTimer (uniset::TimerId timerid, timeout_t timeMS, clock_t ticks=-1, uniset::Message::Priority p=uniset::Message::High) override |
|
timeout_t | checkTimers (UniSetObject *obj) |
|
timeout_t | getTimeInterval (uniset::TimerId timerid) const |
|
timeout_t | getTimeLeft (uniset::TimerId timerid) const |
|
|
virtual bool | activateObject () override |
|
virtual void | sensorsRegistration () override |
|
virtual void | initItem (std::shared_ptr< USensorInfo > &usi, IOController *ic) |
|
virtual void | send (ConsumerListInfo &lst, const uniset::SensorMessage &sm, const uniset::ConsumerInfo *ci=nullptr) |
| посылка информации об изменении состояния датчика (всем или указанному заказчику)
|
|
virtual void | checkThreshold (std::shared_ptr< USensorInfo > &usi, bool send=true) |
| проверка срабатывания пороговых датчиков
|
|
virtual void | checkThreshold (IOController::IOStateList::iterator &li, const uniset::ObjectId sid, bool send_msg=true) |
|
std::shared_ptr< UThresholdInfo > | findThreshold (const uniset::ObjectId sid, const uniset::ThresholdId tid) |
| поиск информации о пороговом датчике
|
|
virtual void | readConf () |
|
void | onChangeUndefinedState (std::shared_ptr< USensorInfo > &usi, IOController *ic) |
|
virtual long | localSetValue (std::shared_ptr< USensorInfo > &usi, CORBA::Long value, uniset::ObjectId sup_id) override |
|
Poco::JSON::Object::Ptr | request_consumers (const std::string &req, const Poco::URI::QueryParameters &p) |
|
Poco::JSON::Object::Ptr | request_lost (const std::string &req, const Poco::URI::QueryParameters &p) |
|
Poco::JSON::Object::Ptr | getConsumers (uniset::ObjectId sid, ConsumerListInfo &clist, bool ifNotEmpty=true) |
|
void | showStatisticsForConsumer (std::ostringstream &inf, const std::string &consumer) |
|
void | showStatisticsForLostConsumers (std::ostringstream &inf) |
|
void | showStatisticsForConsusmers (std::ostringstream &inf) |
|
void | showStatisticsForConsumersWithLostEvent (std::ostringstream &inf) |
|
void | showStatisticsForSensor (std::ostringstream &inf, const std::string &name) |
|
virtual long | localSetValueIt (IOStateList::iterator &it, const uniset::ObjectId sid, CORBA::Long value, uniset::ObjectId sup_id) |
|
virtual long | localGetValue (IOStateList::iterator &it, const uniset::ObjectId sid) |
|
virtual void | localSetUndefinedState (IOStateList::iterator &it, bool undefined, const uniset::ObjectId sid) |
|
virtual void | localFreezeValueIt (IOController::IOStateList::iterator &li, uniset::ObjectId sid, CORBA::Boolean set, CORBA::Long value, uniset::ObjectId sup_id) |
|
virtual void | localFreezeValue (std::shared_ptr< USensorInfo > &usi, CORBA::Boolean set, CORBA::Long value, uniset::ObjectId sup_id) |
|
long | localGetValue (std::shared_ptr< USensorInfo > &usi) |
|
virtual Poco::JSON::Object::Ptr | request_get (const std::string &req, const Poco::URI::QueryParameters &p) |
|
virtual Poco::JSON::Object::Ptr | request_sensors (const std::string &req, const Poco::URI::QueryParameters &p) |
|
void | getSensorInfo (Poco::JSON::Array::Ptr &jdata, std::shared_ptr< USensorInfo > &s, bool shortInfo=false) |
|
virtual bool | deactivateObject () override |
|
virtual void | activateInit () |
|
virtual void | sensorsUnregistration () |
|
InitSignal | signal_init () |
|
void | ioRegistration (std::shared_ptr< USensorInfo > &usi) |
|
void | ioUnRegistration (const uniset::ObjectId sid) |
|
IOController_i::SensorIOInfo | SensorIOInfo (long v, UniversalIO::IOType t, const IOController_i::SensorInfo &si, uniset::Message::Priority p=uniset::Message::Medium, long defval=0, IOController_i::CalibrateInfo *ci=0, uniset::ObjectId sup_id=uniset::DefaultObjectId, uniset::ObjectId depend_sid=uniset::DefaultObjectId) |
|
virtual void | logging (uniset::SensorMessage &sm) |
| сохранение информации об изменении состояния датчика
|
|
virtual void | dumpToDB () |
| сохранение состояния всех датчиков в БД
|
|
IOStateList::iterator | myioBegin () |
|
IOStateList::iterator | myioEnd () |
|
IOStateList::iterator | myiofind (uniset::ObjectId id) |
|
void | initIOList (const IOStateList &&l) |
|
void | for_iolist (UFunction f) |
|
virtual bool | addManager (const std::shared_ptr< UniSetManager > &mngr) |
|
virtual bool | removeManager (const std::shared_ptr< UniSetManager > &mngr) |
|
virtual bool | addObject (const std::shared_ptr< UniSetObject > &obj) |
|
virtual bool | removeObject (const std::shared_ptr< UniSetObject > &obj) |
|
void | objects (OManagerCommand cmd) |
|
void | managers (OManagerCommand cmd) |
|
void | initPOA (const std::weak_ptr< UniSetManager > &rmngr) |
|
const std::shared_ptr< UniSetObject > | findObject (const std::string &name) const |
|
const std::shared_ptr< UniSetManager > | findManager (const std::string &name) const |
|
const std::shared_ptr< UniSetObject > | deepFindObject (const std::string &name) const |
|
void | getAllObjectsList (std::vector< std::shared_ptr< UniSetObject > > &vec, size_t lim=1000) |
|
int | getObjectsInfo (const std::shared_ptr< UniSetManager > &mngr, uniset::SimpleInfoSeq *seq, int begin, const long uplimit, const char *userparam) |
|
void | apply_for_objects (OFunction f) |
|
void | apply_for_managers (MFunction f) |
|
virtual void | processingMessage (const uniset::VoidMessage *msg) |
|
virtual void | sysCommand (const uniset::SystemMessage *sm) |
|
virtual void | sensorInfo (const uniset::SensorMessage *sm) |
|
virtual void | timerInfo (const uniset::TimerMessage *tm) |
|
virtual void | onTextMessage (const uniset::TextMessage *tm) |
|
VoidMessagePtr | receiveMessage () |
|
VoidMessagePtr | waitMessage (timeout_t msec=UniSetTimer::WaitUpTime) |
|
void | termWaiting () |
|
size_t | countMessages () |
|
size_t | getCountOfLostMessages () const |
|
void | uterminate () |
|
void | thread (bool create) |
|
void | offThread () |
|
void | onThread () |
|
virtual void | callback () |
|
void | setID (uniset::ObjectId id) |
|
void | setThreadPriority (Poco::Thread::Priority p) |
|
void | setMaxSizeOfMessageQueue (size_t s) |
|
size_t | getMaxSizeOfMessageQueue () const |
|
bool | isActive () const |
|
void | setActive (bool set) |
|
virtual Poco::JSON::Object::Ptr | httpGetMyInfo (Poco::JSON::Object::Ptr root) |
|
Poco::JSON::Object::Ptr | request_configure (const std::string &req, const Poco::URI::QueryParameters &p) |
|
Poco::JSON::Object::Ptr | request_configure_get (const std::string &req, const Poco::URI::QueryParameters &p) |
|
Poco::JSON::Object::Ptr | request_configure_by_name (const std::string &name, const std::string &props) |
|
Poco::JSON::Object::Ptr | request_params (const std::string &req, const Poco::URI::QueryParameters &p) |
|
virtual Poco::JSON::Object::Ptr | request_params_get (const std::string &req, const Poco::URI::QueryParameters &p) |
|
virtual Poco::JSON::Object::Ptr | request_params_set (const std::string &req, const Poco::URI::QueryParameters &p) |
|
virtual std::string | getTimerName (int id) const |
|
TimersList | getTimersList () const |
|
\page page_IONotifyController Хранение информации о состоянии с уведомлениями об изменении (IONotifyController)
Класс IONotifyController расширяет набор задач класса IOController.
Для ознакомления с базовыми функциями см. \ref page_IOController
Задачи решаемые IONotifyController-ом (\b IONC):
- \ref sec_NC_AskSensors
- \ref sec_NC_Consumers
- \ref sec_NC_Thresholds
- \ref sec_NC_Depends
\section sec_NC_AskSensors Механизм заказа датчиков
Главной задачей класса IONotifyController является уведомление
объектов (заказчиков) об изменении состояния датчика (входа или выхода).
Механизм функционирует по следующей логике: "заказчики" уведомляют IONC об изменении какого именно датчика они хотят получать уведомление, после чего, если данный датчик меняет своё состояние, заказчику посылается сообщение uniset::SensorMessage содержащее информацию о текущем(новом) состоянии датчика, времени изменения и т.п. В случае необходимости можно отказаться от уведомления. Для заказа датчиков предусмотрен ряд функций. На данный момент рекомендуется пользоваться функцией IONotifyController::askSensor.
ConsumerMaxAttempts - максимальное число неудачных попыток послать сообщение "заказчику". Настраивается в конфигурационном файле. По умолчанию = 5.
\section sec_NC_Consumers Заказчики
В качестве "заказчиков" могут выступать любые UniSet-объекты (UniSetObject), обладающие "обратным адресом" (идентификатором), по которому присылается уведомление об изменении состояния. Свой обратный адрес, объекты указывают непосредственно при заказе (см. IONotifyController::askSensor).
Помимо "динамического" заказа во время работы процессов, существует возможность задавать список заказчиков на этапе конфигурирования системы ("статический" способ). Для этого в конфигурационном файле, в секции <sensors> у каждого датчика предусмотрена специальная секция <consumers>.
<sensors>
...
<item name="Sensors1" textname="sensor N1" iotype="AI" ...>
<consumers>
<consumer name="TestProc1" type="objects"/>
<consumer name="TestProc2" type="managers" node="RemoteNode"/>
...
</consumers>
</item>
...
</sensors>
"Статический" способ заказа гарантирует, что при перезапуске IONC список заказчиков будет восстановлен по конфигурационному файлу.
\section sec_NC_Thresholds Пороговые датчики
\section sec_NC_Depends Механизм зависимостей между датчиками
Механизм зависимостей позволяет задать зависимость одного датчика, от другого.
Например пока "разрешающий" датчик не равен "1", у зависимого держится значение "0". Зависимость настраивается в конфигурационном файле, непосредственно у "зависимого датчика".
Доступные настройки:
- depend - задаёт имя датчика ОТ КОТОРОГО зависит данный
- depend_value - задаёт "разрешающее работу" значение (если поле не задано, считается depend_value="1").
- depend_off_value - задаёт значение которое будет выставлено для данного датчика, в случае его "блокировки". По умолчанию 0.
...
<sensors ..>
...
<item id="11" iotype="AI" name="AI11_AS" textname="AI 11" depend="Input4_S" depend_off_value="-50"/>
...
</sensors>
В данном примере можно увидеть, что датчик AI11_AS зависит от датчика Input4_S и пока Input4_S=0, в AI11_AS будет записано значение -50. Как только Input4_S=1 в AI11_AS - появиться его истинное значение.
- Заметки
- Следует иметь ввиду, что для ЗАВИСИМОГО датчика функция setValue(..) действует как обычно и даже если он "заблокирован", значение в него можно сохранять. Оно "появиться" как только снимется блокировка.
Оптимизация работы со списком "заказчиков"
Для оптимизации поиска списка заказчиков для конкретного датчика используется поле userdata (void*) у USensorInfo! Это опасный и "некрасивый" хак, но он позволяет избавиться от одного лишнего поиска по unordered_map<SensorID,ConsumerList>. Суть в том что к датчику через usedata мы привязываем указатель на список заказчиков. Сделано через userdata, т.к. сам map "хранится" в IOController и IONotifyController не может поменять тип (в текущей реализации по крайней мере). В userdata задействованы два места (см. UserDataID) для списка заказчиков и для списка порогов. При этом, чтобы гарантировать корректность работы, cписки заказчиков по тому или иному датчику, создаются (см. функцию ask()), но никогда не удаляются, даже если остаются пустыми. Это сделано, чтобы сохранённые указатели в userdata, оставались всегда валидными (т.к. используются из разных потоков).
Реализация IONotifyController. см. page_IONotifyController