WebCFace 2.9.0
Web-based Communication Framework & Dashboard-like UI
Loading...
Searching...
No Matches
client_internal.h
Go to the documentation of this file.
1#pragma once
2#include <vector>
3#include <string>
4#include <memory>
5#include <chrono>
6#include <atomic>
7#include <unordered_map>
8#include <cstdlib>
12#include "webcface/field.h"
13#include "webcface/log.h"
14#include "queue.h"
16#include "data_store1.h"
17#include "data_store2.h"
18#include "func_internal.h"
20#ifdef WEBCFACE_COMPILER_IS_GCC
21#pragma GCC diagnostic push
22#pragma GCC diagnostic ignored "-Wabi"
23#endif
24#include <spdlog/logger.h>
25#ifdef WEBCFACE_COMPILER_IS_GCC
26#pragma GCC diagnostic pop
27#endif
28
30
31class Log;
32class Variant;
33
34namespace message {
35template <typename T>
36std::string packSingle(const T &obj);
37}
38
39namespace internal {
40
41void wsThreadMain(const std::shared_ptr<ClientData> &data);
42// void syncThreadMain(const std::shared_ptr<ClientData> &data);
43
44extern std::atomic<int> log_keep_lines;
45
46struct ClientData : std::enable_shared_from_this<ClientData> {
47 explicit ClientData(const SharedString &name,
48 const SharedString &host = nullptr, int port = -1);
49 ClientData(const ClientData&) = delete;
50 ClientData &operator=(const ClientData&) = delete;
52
53 void close();
54
60 std::optional<unsigned int> self_member_id;
61 bool isSelf(const FieldBase &base) const {
62 return base.member_ == self_member_name;
63 }
64
65 // std::mutex curl_m;
67 int port;
68 bool current_curl_connected = false;
69 void *current_curl_handle = nullptr;
70 std::string current_curl_path;
71 std::string current_ws_buf = "";
72 std::vector<char> curl_err_buffer;
73
83 std::thread ws_thread;
84 // /*!
85 // * \brief recv_queueのメッセージを処理するスレッド
86 // *
87 // * auto_recv がtrueの場合のみ。
88 // *
89 // */
90 // std::thread sync_thread;
91
92 struct SyncDataSnapshot {
93 std::chrono::system_clock::time_point time;
99 canvas3d_data;
101 canvas2d_data;
102 StrMap1<ImageData> image_data;
105 };
106
107 struct SyncDataFirst {
108 StrMap2<unsigned int> value_req, text_req, robot_model_req, view_req,
109 canvas3d_req, canvas2d_req, image_req, log_req;
110 StrMap2<message::ImageReq> image_req_info;
111 bool ping_status_req;
112 SyncDataSnapshot sync_data;
113 };
114
118 std::atomic<bool> closing = false;
119
120 struct WsData {
125 bool connected = false;
130 bool sync_init_end = false;
137 bool do_ws_init = false;
147 bool do_ws_recv = false;
152 bool recv_ready = false;
153
154 std::queue<std::vector<std::pair<int, std::shared_ptr<void>>>>
161 bool did_disconnect = false;
175 std::queue<std::variant<std::string, SyncDataSnapshot>> sync_queue;
176 };
177
179
183 std::atomic<bool> auto_reconnect = true;
184
185 struct SyncData {
199 std::optional<SyncDataFirst> sync_first;
208 SyncDataFirst syncDataFirst(internal::ClientData *this_);
219 SyncDataSnapshot syncData(internal::ClientData *this_, bool is_first);
220 };
221
223
230 template <typename T>
231 bool messagePushOnline(const T &obj) {
232 auto lock_ws = this->ws_data.lock();
233 if (lock_ws->connected) {
234 this->logger_internal->debug("-> queued to send: {}", obj);
235 lock_ws->sync_queue.push(message::packSingle(obj));
236 lock_ws.cond().notify_all();
237 return true;
238 } else {
239 return false;
240 }
241 }
248 template <typename T>
249 bool messagePushReq(const T &obj) {
250 if (this->sync_data.lock()->sync_first != std::nullopt) {
251 this->logger_internal->debug("-> queued to send: {}", obj);
252 auto lock_ws = this->ws_data.lock();
253 lock_ws->sync_queue.push(message::packSingle(obj));
254 lock_ws.cond().notify_all();
255 return true;
256 } else {
257 return false;
258 }
259 }
265 template <typename T>
266 void messagePushAlways(const T &obj) {
267 this->logger_internal->debug("-> queued to send: {}", obj);
268 auto lock_ws = this->ws_data.lock();
269 lock_ws->sync_queue.push(message::packSingle(obj));
270 lock_ws.cond().notify_all();
271 }
272 void messagePushAlways(SyncDataSnapshot &&msg) {
273 this->logger_internal->debug("-> sync data queued");
274 auto lock_ws = this->ws_data.lock();
275 lock_ws->sync_queue.push(std::move(msg));
276 lock_ws.cond().notify_all();
277 }
278
279 std::string packSyncDataFirst(const SyncDataFirst &data);
280 std::string packSyncData(std::stringstream &buffer, int &len,
281 const SyncDataSnapshot &data);
282
287 void start();
292 void join();
293
302 void syncImpl(bool sync, bool forever,
303 std::optional<std::chrono::microseconds> timeout);
304
309 void
310 onRecv(const std::vector<std::pair<int, std::shared_ptr<void>>> &messages);
311
319
331
337
340 member_lib_name, member_lib_ver, member_addr;
341 const SharedString &getMemberNameFromId(unsigned int id) const {
342 if (self_member_id && *self_member_id == id) {
343 return self_member_name;
344 }
345 auto lock_member_ids = member_ids.shared_lock();
346 for (const auto &it : lock_member_ids.get()) {
347 if (it.second == id) {
348 return it.first;
349 }
350 }
351 static SharedString empty;
352 return empty;
353 }
354 unsigned int getMemberIdFromName(const SharedString &name) const {
355 if (name == self_member_name && self_member_id) {
356 return *self_member_id;
357 }
358 auto lock_member_ids = member_ids.shared_lock();
359 auto it = lock_member_ids->find(name);
360 if (it != lock_member_ids->end()) {
361 return it->second;
362 }
363 return 0;
364 }
365
372 std::shared_ptr<std::function<void(Member)>> member_entry_event;
373
378 SharedMutexProxy<StrMap1<std::shared_ptr<std::function<void(Member)>>>>
379 member_connected_event, member_disconnected_event;
380
381 SharedMutexProxy<StrMap2<std::shared_ptr<std::function<void(Value)>>>>
383 SharedMutexProxy<StrMap2<std::shared_ptr<std::function<void(Variant)>>>>
385 SharedMutexProxy<StrMap2<std::shared_ptr<std::function<void(Image)>>>>
387 SharedMutexProxy<StrMap2<std::shared_ptr<std::function<void(RobotModel)>>>>
389 SharedMutexProxy<StrMap2<std::shared_ptr<std::function<void(View)>>>>
391 SharedMutexProxy<StrMap2<std::shared_ptr<std::function<void(Canvas3D)>>>>
393 SharedMutexProxy<StrMap2<std::shared_ptr<std::function<void(Canvas2D)>>>>
395 SharedMutexProxy<StrMap2<std::shared_ptr<std::function<void(Log)>>>>
397 SharedMutexProxy<StrMap1<std::shared_ptr<std::function<void(Member)>>>>
398 sync_event, ping_event;
399 SharedMutexProxy<StrMap1<std::shared_ptr<std::function<void(Value)>>>>
401 SharedMutexProxy<StrMap1<std::shared_ptr<std::function<void(Text)>>>>
403 SharedMutexProxy<StrMap1<std::shared_ptr<std::function<void(Func)>>>>
405 SharedMutexProxy<StrMap1<std::shared_ptr<std::function<void(View)>>>>
407 SharedMutexProxy<StrMap1<std::shared_ptr<std::function<void(Image)>>>>
409 SharedMutexProxy<StrMap1<std::shared_ptr<std::function<void(RobotModel)>>>>
411 SharedMutexProxy<StrMap1<std::shared_ptr<std::function<void(Canvas3D)>>>>
413 SharedMutexProxy<StrMap1<std::shared_ptr<std::function<void(Canvas2D)>>>>
415 SharedMutexProxy<StrMap1<std::shared_ptr<std::function<void(Log)>>>>
417
418 std::shared_ptr<spdlog::logger> logger_internal;
423
425
426 std::shared_ptr<std::unordered_map<unsigned int, int>> ping_status =
427 nullptr;
428 bool ping_status_req = false;
433 void pingStatusReq();
434};
435} // namespace internal
Canvas2Dの送受信データを表すクラス
Definition canvas2d.h:24
Canvas3Dの送受信データを表すクラス
Definition canvas3d.h:28
関数1つを表すクラス
Definition func.h:95
(ver1.3から追加) 画像の送受信データを表すクラス
Definition image.h:20
ログの送受信データを表すクラス
Definition log.h:65
Memberを指すクラス
Definition member.h:23
RobotModelの送受信データを表すクラス
Definition robot_model.h:26
u8stringとstringとwstringをshared_ptrで持ち共有する
Definition encoding.h:67
文字列の送受信データを表すクラス
Definition text.h:183
実数値またはその配列の送受信データを表すクラス
Definition value.h:59
文字列、数値などの型を送受信するクラス
Definition text.h:25
Viewの送受信データを表すクラス
Definition view.h:36
PromiseDataのリストを保持する。
Definition func_internal.h:88
RustのMutexのようにデータを保護するクラス
Definition mutex.h:49
ScopedLock< MutexProxy, std::unique_lock< std::mutex > > lock()
Definition mutex.h:58
ScopedLock< const SharedMutexProxy, std::shared_lock< std::shared_mutex > > shared_lock() const
Definition mutex.h:82
Definition data_store1.h:11
送受信するデータを保持するクラス
Definition data_store2.h:22
std::atomic< int > log_keep_lines
Definition log.cc:9
std::map< SharedString, T > StrMap1
Definition map.h:15
StrMap1< StrMap1< T > > StrMap2
Definition map.h:17
void wsThreadMain(const std::shared_ptr< ClientData > &data)
Definition client_threading.cc:88
std::string packSingle(const T &obj)
メッセージ1つを要素数2の配列としてシリアル化
Definition pack.h:48
メンバ名とデータ名を持つクラス
Definition field.h:38
SharedString member_
メンバー名
Definition field.h:43
Definition client_internal.h:185
std::optional< SyncDataFirst > sync_first
Definition client_internal.h:199
Definition client_internal.h:120
std::queue< std::vector< std::pair< int, std::shared_ptr< void > > > > recv_queue
Definition client_internal.h:155
std::queue< std::variant< std::string, SyncDataSnapshot > > sync_queue
送信したいメッセージを入れるキュー
Definition client_internal.h:175
Definition client_internal.h:46
FuncResultStore func_result_store
Definition client_internal.h:330
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Canvas2D)> > > > canvas2d_change_event
Definition client_internal.h:394
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Variant)> > > > text_change_event
Definition client_internal.h:384
unsigned int getMemberIdFromName(const SharedString &name) const
Definition client_internal.h:354
ClientData(const ClientData &)=delete
SharedMutexProxy< StrMap1< std::unique_ptr< std::wostream > > > logger_os_w
Definition client_internal.h:422
SyncDataStore2< std::shared_ptr< message::Canvas3DData > > canvas3d_store
Definition client_internal.h:326
std::thread ws_thread
websocket接続、通信するスレッド
Definition client_internal.h:83
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Member)> > > > ping_event
Definition client_internal.h:398
MutexProxy< SyncData > sync_data
Definition client_internal.h:222
std::optional< unsigned int > self_member_id
Definition client_internal.h:60
SyncDataStore2< std::shared_ptr< TextData > > text_store
Definition client_internal.h:321
MutexProxy< StrMap1< Queue< FuncCallHandle > > > func_listener_handlers
listenerがfetchするの待ちの関数呼び出しをためておく
Definition client_internal.h:336
SharedMutexProxy< std::string > svr_hostname
Definition client_internal.h:424
SharedMutexProxy< StrMap1< unsigned int > > member_ids
Definition client_internal.h:338
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Value)> > > > value_change_event
Definition client_internal.h:382
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Member)> > > > member_connected_event
Definition client_internal.h:379
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Text)> > > > text_entry_event
Definition client_internal.h:402
std::vector< char > curl_err_buffer
Definition client_internal.h:72
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Canvas2D)> > > > canvas2d_entry_event
Definition client_internal.h:414
std::shared_ptr< std::function< void(Member)> > member_entry_event
Definition client_internal.h:372
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(RobotModel)> > > > robot_model_change_event
Definition client_internal.h:388
bool isSelf(const FieldBase &base) const
Definition client_internal.h:61
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(View)> > > > view_change_event
Definition client_internal.h:390
std::string current_curl_path
Definition client_internal.h:70
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Canvas3D)> > > > canvas3d_entry_event
Definition client_internal.h:412
int port
Definition client_internal.h:67
SyncDataStore2< std::shared_ptr< LogData > > log_store
Definition client_internal.h:328
SyncDataStore2< std::shared_ptr< ValueData > > value_store
Definition client_internal.h:320
SyncDataStore2< ImageData, message::ImageReq > image_store
Definition client_internal.h:324
SharedString host
Definition client_internal.h:66
bool messagePushReq(const T &obj)
Definition client_internal.h:249
MutexProxy< WsData > ws_data
Definition client_internal.h:178
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Image)> > > > image_change_event
Definition client_internal.h:386
SharedString self_member_name
Client自身の名前
Definition client_internal.h:59
SharedMutexProxy< StrMap1< std::unique_ptr< std::ostream > > > logger_os
Definition client_internal.h:420
SharedMutexProxy< std::unordered_map< unsigned int, std::string > > member_addr
Definition client_internal.h:340
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Value)> > > > value_entry_event
Definition client_internal.h:400
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Func)> > > > func_entry_event
Definition client_internal.h:404
SyncDataStore1< std::chrono::system_clock::time_point > sync_time_store
Definition client_internal.h:329
SharedMutexProxy< StrMap1< std::unique_ptr< std::streambuf > > > logger_buf
Definition client_internal.h:419
ClientData & operator=(const ClientData &)=delete
SyncDataStore2< std::shared_ptr< FuncData > > func_store
Definition client_internal.h:322
const SharedString & getMemberNameFromId(unsigned int id) const
Definition client_internal.h:341
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Image)> > > > image_entry_event
Definition client_internal.h:408
SyncDataStore2< std::shared_ptr< message::Canvas2DData > > canvas2d_store
Definition client_internal.h:327
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(View)> > > > view_entry_event
Definition client_internal.h:406
SharedMutexProxy< StrMap1< std::unique_ptr< std::wstreambuf > > > logger_buf_w
Definition client_internal.h:421
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Canvas3D)> > > > canvas3d_change_event
Definition client_internal.h:392
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Log)> > > > log_entry_event
Definition client_internal.h:416
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(RobotModel)> > > > robot_model_entry_event
Definition client_internal.h:410
SyncDataStore2< std::shared_ptr< RobotModelData > > robot_model_store
Definition client_internal.h:325
SyncDataStore2< std::shared_ptr< message::ViewData > > view_store
Definition client_internal.h:323
void messagePushAlways(const T &obj)
Definition client_internal.h:266
std::shared_ptr< spdlog::logger > logger_internal
Definition client_internal.h:418
bool messagePushOnline(const T &obj)
Definition client_internal.h:231
SharedMutexProxy< StrMap1< bool > > member_entry
Definition client_internal.h:318
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Log)> > > > log_append_event
Definition client_internal.h:396
void messagePushAlways(SyncDataSnapshot &&msg)
Definition client_internal.h:272
#define WEBCFACE_NS_END
Definition webcface-config.h:118
#define WEBCFACE_NS_BEGIN
Definition webcface-config.h:117