UniSet  2.6.0
UniSetObject.h
1 /*
2  * Copyright (c) 2015 Pavel Vainerman.
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as
6  * published by the Free Software Foundation, version 2.1.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  * Lesser General Lesser Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  */
16 // --------------------------------------------------------------------------
22 //---------------------------------------------------------------------------
23 #ifndef UniSetObject_H_
24 #define UniSetObject_H_
25 //--------------------------------------------------------------------------
26 #include <condition_variable>
27 #include <thread>
28 #include <mutex>
29 #include <atomic>
30 #include <ostream>
31 #include <memory>
32 #include <string>
33 #include <list>
34 
35 #include "UniSetTypes.h"
36 #include "MessageType.h"
37 #include "PassiveTimer.h"
38 #include "Exceptions.h"
39 #include "UInterface.h"
40 #include "UniSetObject_i.hh"
41 #include "ThreadCreator.h"
42 #include "LT_Object.h"
43 #include "MQMutex.h"
44 #include "UHttpRequestHandler.h"
45 
46 //---------------------------------------------------------------------------
47 namespace uniset
48 {
49  //---------------------------------------------------------------------------
50  class UniSetActivator;
51  class UniSetManager;
52 
53  //---------------------------------------------------------------------------
54  class UniSetObject;
55  typedef std::list< std::shared_ptr<UniSetObject> > ObjectsList;
56  //---------------------------------------------------------------------------
73  class UniSetObject:
74  public std::enable_shared_from_this<UniSetObject>,
75  public POA_UniSetObject_i,
76  public LT_Object
77 #ifndef DISABLE_REST_API
79 #endif
80  {
81  public:
82  UniSetObject( const std::string& name, const std::string& section );
84  UniSetObject();
85  virtual ~UniSetObject();
86 
87  std::shared_ptr<UniSetObject> get_ptr();
88 
89  // Функции объявленные в IDL
90  virtual CORBA::Boolean exist() override;
91 
92  virtual uniset::ObjectId getId() override;
93 
94  const uniset::ObjectId getId() const;
95  std::string getName() const;
96 
97  virtual uniset::ObjectType getType() override
98  {
99  return uniset::ObjectType("UniSetObject");
100  }
101 
102  const std::string getStrType();
103 
104  virtual uniset::SimpleInfo* getInfo( const char* userparam = "" ) override;
105 
106  // обёртка для вызова HTTP API через RPC
107  virtual uniset::SimpleInfo* apiRequest( const char* query ) override;
108 
110  virtual void push( const uniset::TransportMessage& msg ) override;
111 
112 #ifndef DISABLE_REST_API
113  // HTTP API
114  virtual Poco::JSON::Object::Ptr httpGet( const Poco::URI::QueryParameters& p ) override;
115  virtual Poco::JSON::Object::Ptr httpHelp( const Poco::URI::QueryParameters& p ) override;
116 #endif
117  // -------------- вспомогательные --------------
119  uniset::ObjectPtr getRef() const;
120 
122  virtual timeout_t askTimer( uniset::TimerId timerid, timeout_t timeMS, clock_t ticks = -1,
123  uniset::Message::Priority p = uniset::Message::High ) override;
124 
125  friend std::ostream& operator<<(std::ostream& os, UniSetObject& obj );
126 
127  protected:
128 
129  std::shared_ptr<UInterface> ui;
130  std::string myname;
131  std::string section;
132  std::weak_ptr<UniSetManager> mymngr;
133 
135  virtual void processingMessage( const uniset::VoidMessage* msg );
136 
137  // конкретные виды сообщений
138  virtual void sysCommand( const uniset::SystemMessage* sm ) {}
139  virtual void sensorInfo( const uniset::SensorMessage* sm ) {}
140  virtual void timerInfo( const uniset::TimerMessage* tm ) {}
141 
143  VoidMessagePtr receiveMessage();
144 
146  virtual VoidMessagePtr waitMessage( timeout_t msec = UniSetTimer::WaitUpTime );
147 
149  void termWaiting();
150 
152  size_t countMessages();
153 
155  size_t getCountOfLostMessages() const;
156 
158  virtual bool activateObject();
159 
161  virtual bool deactivateObject();
162 
168  virtual void sigterm( int signo );
169 
170  void terminate();
171 
172  // управление созданием потока обработки сообщений -------
173 
175  void thread( bool create );
176 
178  void offThread();
179 
181  void onThread();
182 
184  virtual void callback();
185 
186  // ----- конфигурирование объекта -------
188  void setID(uniset::ObjectId id);
189 
191  void setThreadPriority( Poco::Thread::Priority p );
192 
194  void setMaxSizeOfMessageQueue( size_t s );
195 
197  size_t getMaxSizeOfMessageQueue() const;
198 
200  bool isActive() const;
201 
203  void setActive( bool set );
204 
205 #ifndef DISABLE_REST_API
206  // вспомогательные функции
207  virtual Poco::JSON::Object::Ptr httpGetMyInfo( Poco::JSON::Object::Ptr root );
208  Poco::JSON::Object::Ptr request_conf( const std::string& req, const Poco::URI::QueryParameters& p );
209  Poco::JSON::Object::Ptr request_conf_name( const std::string& name, const std::string& props );
210 #endif
211 
212  private:
213 
214  friend class UniSetManager;
215  friend class UniSetActivator;
216 
218  void work();
220  bool init( const std::weak_ptr<UniSetManager>& om );
222  bool deactivate();
224  bool activate();
225  /* регистрация в репозитории объектов */
226  void registration();
227  /* удаление ссылки из репозитория объектов */
228  void unregistration();
229 
230  void initObject();
231 
232  pid_t msgpid = { 0 }; // pid потока обработки сообщений
233  bool regOK = { false };
234  std::atomic_bool active;
235 
236  bool threadcreate;
237  std::shared_ptr<UniSetTimer> tmr;
238  uniset::ObjectId myid;
239  CORBA::Object_var oref;
240 
242  mutable uniset::uniset_rwmutex refmutex;
243 
244  std::shared_ptr< ThreadCreator<UniSetObject> > thr;
245 
247  MQMutex mqueueLow;
248  MQMutex mqueueMedium;
249  MQMutex mqueueHi;
250 
251  std::atomic_bool a_working;
252  std::mutex m_working;
253  std::condition_variable cv_working;
254  };
255  // -------------------------------------------------------------------------
256 } // end of uniset namespace
257 //---------------------------------------------------------------------------
258 #endif
259 //---------------------------------------------------------------------------
Definition: CallbackTimer.h:29
virtual void processingMessage(const uniset::VoidMessage *msg)
Definition: UniSetObject.cc:820
bool isActive() const
Definition: UniSetObject.cc:191
Definition: MessageType.h:166
virtual bool activateObject()
Активизация объекта (переопределяется для необходимых действий после активизации) ...
Definition: UniSetObject.cc:537
void onThread()
Definition: UniSetObject.cc:566
Definition: UHttpRequestHandler.h:81
Definition: UniSetObject.h:73
void offThread()
Definition: UniSetObject.cc:561
std::shared_ptr< UInterface > ui
Definition: UniSetObject.h:129
void setID(uniset::ObjectId id)
Definition: UniSetObject.cc:167
CORBA::Object_ptr ObjectPtr
Definition: UniSetTypes.h:84
size_t getMaxSizeOfMessageQueue() const
Definition: UniSetObject.cc:186
virtual timeout_t askTimer(uniset::TimerId timerid, timeout_t timeMS, clock_t ticks=-1, uniset::Message::Priority p=uniset::Message::High) override
Definition: UniSetObject.cc:878
void setMaxSizeOfMessageQueue(size_t s)
Definition: UniSetObject.cc:179
std::list< std::shared_ptr< UniSetObject > > ObjectsList
Definition: UniSetObject.h:54
virtual void callback()
Definition: UniSetObject.cc:799
long TimerId
Definition: UniSetTypes_i.idl:32
void thread(bool create)
Definition: UniSetObject.cc:556
void setThreadPriority(Poco::Thread::Priority p)
Definition: UniSetObject.cc:371
Definition: MessageType.h:122
Definition: UniSetTypes_i.idl:44
void termWaiting()
Definition: UniSetObject.cc:365
Definition: MessageType.h:86
virtual void push(const uniset::TransportMessage &msg) override
поместить сообщение в очередь
Definition: UniSetObject.cc:377
Definition: Mutex.h:32
uniset::ObjectPtr getRef() const
Definition: UniSetObject.cc:519
size_t countMessages()
Definition: UniSetObject.cc:525
Definition: MessageType.h:209
size_t getCountOfLostMessages() const
Definition: UniSetObject.cc:530
virtual void sigterm(int signo)
Definition: UniSetObject.cc:547
virtual VoidMessagePtr waitMessage(timeout_t msec=UniSetTimer::WaitUpTime)
Definition: UniSetObject.cc:216
string< SizeOfObjectType > ObjectType
Definition: UniSetTypes_i.idl:33
Definition: UniSetTypes_i.idl:64
Definition: LT_Object.h:96
virtual bool deactivateObject()
Деактивиция объекта (переопределяется для необходимых действий перед деактивацией) ...
Definition: UniSetObject.cc:542
VoidMessagePtr receiveMessage()
Definition: UniSetObject.cc:205
void setActive(bool set)
Definition: UniSetObject.cc:196
long ObjectId
Definition: UniSetTypes_i.idl:30
static const timeout_t WaitUpTime
Definition: PassiveTimer.h:69