UniSet 2.32.1
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//---------------------------------------------------------------------------
47namespace uniset
48{
49 //---------------------------------------------------------------------------
50 class UniSetActivator;
51 class UniSetManager;
52
53 //---------------------------------------------------------------------------
54 class UniSetObject;
55 typedef std::list< std::shared_ptr<UniSetObject> > ObjectsList;
56 //---------------------------------------------------------------------------
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 );
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 // -------------- вспомогательные --------------
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:283
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 Calibration.h:27
std::list< std::shared_ptr< UniSetObject > > ObjectsList
Definition UniSetObject.h:55
CORBA::Object_ptr ObjectPtr
Definition UniSetTypes.h:94
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