UniSet  2.0.0
IOController.h
См. документацию.
00001 /* This file is part of the UniSet project
00002  * Copyright (c) 2002 Free Software Foundation, Inc.
00003  * Copyright (c) 2002 Pavel Vainerman
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation; either version 2 of the License, or
00008  * (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00018  */
00019 // --------------------------------------------------------------------------
00024 // -------------------------------------------------------------------------- 
00025 #ifndef IOController_H_
00026 #define IOController_H_
00027 //---------------------------------------------------------------------------
00028 #include <map>
00029 #include <list>
00030 #include <sigc++/sigc++.h>
00031 #include "IOController_i.hh"
00032 #include "UniSetTypes.h"
00033 #include "UniSetManager.h"
00034 #include "Configuration.h"
00035 #include "Mutex.h"
00036 //---------------------------------------------------------------------------
00038 class IOController: 
00039         public UniSetManager,
00040         public POA_IOController_i
00041 {
00042     public:
00043 
00044         IOController( const std::string& name, const std::string& section );
00045         IOController( const UniSetTypes::ObjectId id );
00046         ~IOController();
00047 
00048         virtual UniSetTypes::ObjectType getType() override { return UniSetTypes::ObjectType("IOController"); }
00049 
00050         virtual CORBA::Long getValue( UniSetTypes::ObjectId sid ) override;
00051 
00052 //     -------------------- !!!!!!!!! ---------------------------------
00053 //        Реализуются конкретным i/o контроллером
00054 //        Не забывайте писать реализацию этих функций
00055         virtual void setValue( UniSetTypes::ObjectId sid, CORBA::Long value,
00056                                 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ) override;
00057 
00058         virtual void fastSetValue( UniSetTypes::ObjectId sid, CORBA::Long value,
00059                                 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ) override;
00060 
00061 //     ----------------------------------------------------------------
00062         virtual void setUndefinedState( UniSetTypes::ObjectId sid,
00063                                         CORBA::Boolean undefined,
00064                                         UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ) override;
00065 
00066 
00067         virtual IOController_i::SensorInfoSeq* getSensorSeq( const UniSetTypes::IDSeq& lst ) override;
00068         virtual UniSetTypes::IDSeq* setOutputSeq( const IOController_i::OutSeq& lst, UniSetTypes::ObjectId sup_id ) override;
00069 
00070 //     ----------------------------------------------------------------
00071         virtual UniversalIO::IOType getIOType( UniSetTypes::ObjectId sid ) override;
00072 
00073         virtual IOController_i::SensorInfoSeq* getSensorsMap() override;
00074         virtual IOController_i::SensorIOInfo getSensorIOInfo( UniSetTypes::ObjectId sid ) override;
00075 
00076         virtual CORBA::Long getRawValue( UniSetTypes::ObjectId sid ) override;
00077         virtual void calibrate( UniSetTypes::ObjectId sid,
00078                                     const IOController_i::CalibrateInfo& ci,
00079                                     UniSetTypes::ObjectId adminId ) override;
00080 
00081         IOController_i::CalibrateInfo getCalibrateInfo( UniSetTypes::ObjectId sid ) override;
00082 
00083         inline IOController_i::SensorInfo SensorInfo( const UniSetTypes::ObjectId sid,
00084                                 const UniSetTypes::ObjectId node=UniSetTypes::uniset_conf()->getLocalNode())
00085         {
00086             IOController_i::SensorInfo si;
00087             si.id = sid;
00088             si.node = node;
00089             return si;
00090         };
00091 
00092         UniSetTypes::Message::Priority getPriority( const UniSetTypes::ObjectId id );
00093 
00094         virtual IOController_i::ShortIOInfo getChangedTime( const UniSetTypes::ObjectId id ) override;
00095 
00096         virtual IOController_i::ShortMapSeq* getSensors() override;
00097 
00098     public:
00099 
00100         // предварительное объявление, чтобы в структуре объявить итератор..
00101         struct USensorInfo;
00102         typedef std::map<UniSetTypes::ObjectId, USensorInfo> IOStateList;
00103 
00104         // ================== Достпуные сигналы =================
00110         typedef sigc::signal<void, IOStateList::iterator&, IOController*> ChangeSignal;
00111         typedef sigc::signal<void, IOStateList::iterator&, IOController*> ChangeUndefinedStateSignal;
00112 
00113         // signal по изменению определённого датчика
00114         ChangeSignal signal_change_value( UniSetTypes::ObjectId sid );
00115 
00116         // signal по изменению любого датчика
00117         ChangeSignal signal_change_value();
00118 
00119         // сигналы по изменению флага "неопределённое состояние" (обрыв датчика например)
00120         ChangeUndefinedStateSignal signal_change_undefined_state( UniSetTypes::ObjectId sid );
00121         ChangeUndefinedStateSignal signal_change_undefined_state();
00122         // -----------------------------------------------------------------------------------------
00123 
00124         struct USensorInfo:
00125             public IOController_i::SensorIOInfo
00126         {
00127             USensorInfo( const USensorInfo& ) = delete;
00128             const USensorInfo& operator=(const USensorInfo& ) = delete;
00129             USensorInfo( USensorInfo&& ) = default;
00130             USensorInfo& operator=(USensorInfo&& ) = default;
00131 
00132             USensorInfo():any(0),d_value(0),d_off_value(0)
00133             {
00134                 d_si.id = UniSetTypes::DefaultObjectId;
00135                 d_si.node = UniSetTypes::DefaultObjectId;
00136                 value = default_val;
00137                 real_value = default_val;
00138                 dbignore = false;
00139                 undefined = false;
00140                 blocked = false;
00141             }
00142 
00143             virtual ~USensorInfo(){}
00144 
00145             USensorInfo(IOController_i::SensorIOInfo& r);
00146             USensorInfo(IOController_i::SensorIOInfo* r);
00147             USensorInfo(const IOController_i::SensorIOInfo& r);
00148 
00149             USensorInfo& operator=(IOController_i::SensorIOInfo& r);
00150             const USensorInfo& operator=(const IOController_i::SensorIOInfo& r);
00151             USensorInfo& operator=(IOController_i::SensorIOInfo* r);
00152 
00153             // Дополнительные (вспомогательные поля)
00154             UniSetTypes::uniset_rwmutex val_lock; 
00156             IOStateList::iterator it;
00157 
00158             void* any; 
00160             // сигнал для реализации механизма зависимостией..
00161             // (все зависимые датчики подключаются к нему (см. NCRestorer::init_depends_signals)
00162             UniSetTypes::uniset_rwmutex changeMutex;
00163             ChangeSignal sigChange;
00164 
00165             UniSetTypes::uniset_rwmutex undefMutex;
00166             ChangeUndefinedStateSignal sigUndefChange;
00167 
00168             IOController_i::SensorInfo d_si;  
00169             long d_value; 
00170             long d_off_value; 
00172             // функция обработки информации об изменении состояния датчика, от которого зависит данный
00173             void checkDepend( IOStateList::iterator& it, IOController* );
00174         };
00175 
00176         inline IOStateList::iterator ioBegin(){ return ioList.begin(); }
00177         inline IOStateList::iterator ioEnd(){ return ioList.end(); }
00178         inline IOStateList::iterator find(UniSetTypes::KeyType k){ return ioList.find(k); }
00179         inline int ioCount(){ return ioList.size(); }
00180 
00181         // доступ к элементам через итератор
00182         virtual void localSetValue( IOStateList::iterator& it, const UniSetTypes::ObjectId sid,
00183                                         CORBA::Long value, UniSetTypes::ObjectId sup_id );
00184 
00185         virtual long localGetValue( IOStateList::iterator& it, const UniSetTypes::ObjectId sid );
00186 
00187 
00192         virtual void localSetUndefinedState( IOStateList::iterator& it, bool undefined,
00193                                                 const UniSetTypes::ObjectId sid );
00194 
00195     protected:
00196             // переопределяем для добавления вызова регистрации датчиков
00197             virtual bool deactivateObject() override;
00198             virtual bool activateObject() override;
00199 
00201             virtual void activateInit();
00202 
00204             virtual void sensorsRegistration(){};
00206             virtual void sensorsUnregistration();
00207 
00208             typedef sigc::signal<void, IOStateList::iterator&, IOController*> InitSignal;
00209             // signal по изменению определённого датчика
00210             inline InitSignal signal_init(){ return sigInit; }
00211 
00215             void ioRegistration( USensorInfo&&, bool force=false );
00216 
00218             void ioUnRegistration( const UniSetTypes::ObjectId sid );
00219 
00220             // ------------------------------
00221             inline IOController_i::SensorIOInfo
00222                 SensorIOInfo(long v, UniversalIO::IOType t, const IOController_i::SensorInfo& si,
00223                                 UniSetTypes::Message::Priority p = UniSetTypes::Message::Medium,
00224                                 long defval=0, IOController_i::CalibrateInfo* ci=0 )
00225             {
00226                 IOController_i::SensorIOInfo ai;
00227                 ai.si = si;
00228                 ai.type = t;
00229                 ai.value = v;
00230                 ai.priority = p;
00231                 ai.default_val = defval;
00232                 ai.real_value = v;
00233                 ai.blocked = false;
00234                 if( ci!=0 )
00235                     ai.ci = *ci;
00236                 else
00237                 {
00238                     ai.ci.minRaw = 0;
00239                     ai.ci.maxRaw = 0;
00240                     ai.ci.minCal = 0;
00241                     ai.ci.maxCal = 0;
00242                     ai.ci.precision = 0;
00243                 }
00244                 return ai;
00245             };
00246 
00248             virtual void logging( UniSetTypes::SensorMessage& sm );
00249 
00251             virtual void dumpToDB();
00252 
00253         IOController();
00254 
00255         // доступ к списку c изменением только для своих
00256         IOStateList::iterator myioBegin();
00257         IOStateList::iterator myioEnd();
00258         IOStateList::iterator myiofind( UniSetTypes::ObjectId id );
00259         // --------------------------
00260         // ФИЛЬТРОВАНИЕ
00261         //
00262         typedef sigc::slot<bool,const USensorInfo&, CORBA::Long, UniSetTypes::ObjectId> IOFilterSlot;
00263         typedef std::list<IOFilterSlot> IOFilterSlotList;
00264 
00265         /*
00266             Фильтрующая функция должна возвращать:
00267             TRUE - если значение 'нормальное'
00268             FALSE - если значение не подходит (отбрасывается)
00269 
00270             Пример использования:
00271                 addIOFilter( sigc::mem_fun(my,&MyClass::my_filter) );
00272         */
00273         IOFilterSlotList::iterator addIOFilter( IOFilterSlot sl, bool push_front=false );
00274         void eraseIOFilter(IOFilterSlotList::iterator& it);
00275 
00276         // функии проверки текущего значения
00277         bool checkIOFilters( const USensorInfo& ai, CORBA::Long& newvalue, UniSetTypes::ObjectId sup_id );
00278 
00279         inline bool iofiltersEmpty(){ return iofilters.empty(); }
00280         inline int iodiltersSize(){ return iofilters.size(); }
00281 
00282     private:
00283         friend class NCRestorer;
00284 
00285         UniSetTypes::uniset_mutex siganyMutex;
00286         ChangeSignal sigAnyChange;
00287 
00288         UniSetTypes::uniset_mutex siganyundefMutex;
00289         ChangeSignal sigAnyUndefChange;
00290         InitSignal sigInit;
00291 
00292         IOStateList ioList;    
00293         UniSetTypes::uniset_rwmutex ioMutex; 
00295         bool isPingDBServer;    // флаг связи с DBServer-ом
00296 
00297         IOFilterSlotList iofilters; 
00299         UniSetTypes::uniset_rwmutex loggingMutex; 
00300 };
00301 // --------------------------------------------------------------------------
00302 #endif
00303 // --------------------------------------------------------------------------