UniSet  2.24.2
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  // Функции объявленые в IDL
88  virtual CORBA::Boolean exist() override;
89 
90  virtual uniset::ObjectId getId() override;
91 
92  const uniset::ObjectId getId() const;
93  std::string getName() const;
94 
95  virtual uniset::ObjectType getType() override
96  {
97  return uniset::ObjectType("UniSetObject");
98  }
99 
100  const std::string getStrType();
101 
102  virtual uniset::SimpleInfo* getInfo( const char* userparam = "" ) override;
103 
104  // обёртка для вызова HTTP API через RPC
105  virtual uniset::SimpleInfo* apiRequest( const char* query ) override;
106 
108  virtual void push( const uniset::TransportMessage& msg ) override;
109 
111  virtual void pushMessage( const char* msg,
112  ::CORBA::Long mtype,
113  const ::uniset::Timespec& tm,
114  const ::uniset::ProducerInfo& pi,
115  ::CORBA::Long priority,
116  ::CORBA::Long consumer ) override;
117 
118 #ifndef DISABLE_REST_API
119  // HTTP API
120  virtual Poco::JSON::Object::Ptr httpGet( const Poco::URI::QueryParameters& p ) override;
121  virtual Poco::JSON::Object::Ptr httpHelp( const Poco::URI::QueryParameters& p ) override;
122 #endif
123  // -------------- вспомогательные --------------
125  uniset::ObjectPtr getRef() const;
126  std::shared_ptr<UniSetObject> get_ptr();
127 
129  virtual timeout_t askTimer( uniset::TimerId timerid, timeout_t timeMS, clock_t ticks = -1,
130  uniset::Message::Priority p = uniset::Message::High ) override;
131 
132  friend std::ostream& operator<<(std::ostream& os, UniSetObject& obj );
133 
134  protected:
135 
136  std::shared_ptr<UInterface> ui;
137  std::string myname;
138  std::weak_ptr<UniSetManager> mymngr;
139 
141  virtual void processingMessage( const uniset::VoidMessage* msg );
142 
143  // конкретные виды сообщений
144  virtual void sysCommand( const uniset::SystemMessage* sm ) {}
145  virtual void sensorInfo( const uniset::SensorMessage* sm ) {}
146  virtual void timerInfo( const uniset::TimerMessage* tm ) {}
147  virtual void onTextMessage( const uniset::TextMessage* tm ) {}
148 
150  VoidMessagePtr receiveMessage();
151 
153  VoidMessagePtr waitMessage( timeout_t msec = UniSetTimer::WaitUpTime );
154 
156  void termWaiting();
157 
159  size_t countMessages();
160 
162  size_t getCountOfLostMessages() const;
163 
165  virtual bool activateObject();
166 
168  virtual bool deactivateObject();
169 
170  // прерывание работы всей программы (с вызовом shutdown)
171  void uterminate();
172 
173  // управление созданием потока обработки сообщений -------
174 
176  void thread( bool create );
177 
179  void offThread();
180 
182  void onThread();
183 
185  virtual void callback();
186 
187  // ----- конфигурирование объекта -------
189  void setID(uniset::ObjectId id);
190 
192  void setThreadPriority( Poco::Thread::Priority p );
193 
195  void setMaxSizeOfMessageQueue( size_t s );
196 
198  size_t getMaxSizeOfMessageQueue() const;
199 
201  bool isActive() const;
202 
204  void setActive( bool set );
205 
206 #ifndef DISABLE_REST_API
207  // вспомогательные функции
208  virtual Poco::JSON::Object::Ptr httpGetMyInfo( Poco::JSON::Object::Ptr root );
209  Poco::JSON::Object::Ptr request_configure( const std::string& req, const Poco::URI::QueryParameters& p );
210  Poco::JSON::Object::Ptr request_configure_get( const std::string& req, const Poco::URI::QueryParameters& p );
211  Poco::JSON::Object::Ptr request_configure_by_name( const std::string& name, const std::string& props );
212  Poco::JSON::Object::Ptr request_params( const std::string& req, const Poco::URI::QueryParameters& p );
213  virtual Poco::JSON::Object::Ptr request_params_get( const std::string& req, const Poco::URI::QueryParameters& p );
214  virtual Poco::JSON::Object::Ptr request_params_set( const std::string& req, const Poco::URI::QueryParameters& p );
215 #endif
216 
217  private:
218 
219  friend class UniSetManager;
220  friend class UniSetActivator;
221 
223  void work();
225  bool init( const std::weak_ptr<UniSetManager>& om );
227  bool deactivate();
229  bool activate();
230  /* регистрация в репозитории объектов */
231  void registration();
232  /* удаление ссылки из репозитория объектов */
233  void unregistration();
234 
235  void waitFinish();
236 
237  void initObject();
238 
239  pid_t msgpid = { 0 }; // pid потока обработки сообщений
240  bool regOK = { false };
241  std::atomic_bool active;
242 
243  bool threadcreate;
244  std::unique_ptr<UniSetTimer> tmr;
245  uniset::ObjectId myid;
246  CORBA::Object_var oref;
247 
249  mutable uniset::uniset_rwmutex refmutex;
250 
251  std::unique_ptr< ThreadCreator<UniSetObject> > thr;
252 
254  MQMutex mqueueLow;
255  MQMutex mqueueMedium;
256  MQMutex mqueueHi;
257 
258  bool a_working;
259  std::mutex m_working;
260  std::condition_variable cv_working;
261  };
262  // -------------------------------------------------------------------------
263 } // end of uniset namespace
264 //---------------------------------------------------------------------------
265 #endif
266 //---------------------------------------------------------------------------
Definition: LT_Object.h:98
Definition: MessageType.h:127
Definition: MessageType.h:171
Definition: MessageType.h:280
Definition: MessageType.h:214
Definition: UHttpRequestHandler.h:95
Definition: UniSetObject.h:80
void setID(uniset::ObjectId id)
Definition: UniSetObject.cc:154
size_t getMaxSizeOfMessageQueue() const
Definition: UniSetObject.cc:172
void offThread()
Definition: UniSetObject.cc:643
uniset::ObjectPtr getRef() const
Definition: UniSetObject.cc:603
virtual bool deactivateObject()
Деактивация объекта (переопределяется для необходимых действий при завершении работы)
Definition: UniSetObject.cc:626
VoidMessagePtr waitMessage(timeout_t msec=UniSetTimer::WaitUpTime)
Definition: UniSetObject.cc:202
void onThread()
Definition: UniSetObject.cc:648
void setMaxSizeOfMessageQueue(size_t s)
Definition: UniSetObject.cc:165
virtual void processingMessage(const uniset::VoidMessage *msg)
Definition: UniSetObject.cc:899
size_t countMessages()
Definition: UniSetObject.cc:609
virtual void pushMessage(const char *msg, ::CORBA::Long mtype, const ::uniset::Timespec &tm, const ::uniset::ProducerInfo &pi, ::CORBA::Long priority, ::CORBA::Long consumer) override
поместить текстовое сообщение в очередь
Definition: UniSetObject.cc:404
size_t getCountOfLostMessages() const
Definition: UniSetObject.cc:614
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:964
void setThreadPriority(Poco::Thread::Priority p)
Definition: UniSetObject.cc:382
std::shared_ptr< UInterface > ui
Definition: UniSetObject.h:136
void termWaiting()
Definition: UniSetObject.cc:376
virtual bool activateObject()
Активизация объекта (переопределяется для необходимых действий после активизации)
Definition: UniSetObject.cc:621
virtual void callback()
Definition: UniSetObject.cc:875
VoidMessagePtr receiveMessage()
Definition: UniSetObject.cc:191
void thread(bool create)
Definition: UniSetObject.cc:638
void setActive(bool set)
Definition: UniSetObject.cc:182
virtual void push(const uniset::TransportMessage &msg) override
поместить сообщение в очередь
Definition: UniSetObject.cc:388
bool isActive() const
Definition: UniSetObject.cc:177
static const timeout_t WaitUpTime
Definition: PassiveTimer.h:69
Definition: MessageType.h:91
Definition: Mutex.h:32
Definition: CommonEventLoop.h:15
std::list< std::shared_ptr< UniSetObject > > ObjectsList
Definition: UniSetObject.h:54
CORBA::Object_ptr ObjectPtr
Definition: UniSetTypes.h:93
string< SizeOfObjectType > ObjectType
Definition: UniSetTypes_i.idl:33
long ObjectId
Definition: UniSetTypes_i.idl:30
long TimerId
Definition: UniSetTypes_i.idl:32
Definition: UniSetTypes_i.idl:65
Definition: UniSetTypes_i.idl:45