Motion Master
Loading...
Searching...
No Matches
server.h
Go to the documentation of this file.
1#pragma once
2
3#include <ixwebsocket/IXConnectionState.h>
4#include <ixwebsocket/IXWebSocket.h>
5#include <readerwriterqueue/readerwriterqueue.h>
6
7#include <atomic>
8#include <chrono>
9#include <thread>
10#include <zmq.hpp>
11
14
15class Server {
16 public:
17 Server(moodycamel::ReaderWriterQueue<IncomingMachineMessage>
18 &incoming_machine_message_queue,
19 moodycamel::ReaderWriterQueue<OutgoingMachineMessage>
20 &outgoing_machine_message_queue);
21 ~Server();
22
26 void start();
27
31 void stop();
32
36 void wait();
37
38 /******************** CUSTOM WS CONNECTION STATE CLASS ********************/
39 class MotionMasterConnectionState : public ix::ConnectionState {
40 public:
41 MotionMasterConnectionState() : ConnectionState() {}
42
43 std::string getClientId() { return client_id_; }
44
45 bool setClientId(const std::string &client_id) {
46 if (client_id_.empty()) {
47 client_id_ = client_id;
48 return true;
49 } else {
50 return false;
51 }
52 }
53
54 static std::shared_ptr<ConnectionState>
56 return std::make_shared<MotionMasterConnectionState>();
57 }
58
59 protected:
60 std::string client_id_;
61 };
62
63 private:
64 zmq::context_t context_;
65
66 zmq::socket_t frontend_socket_;
67 zmq::socket_t forwarder_frontend_socket_;
68
69 std::unique_ptr<std::thread> server_thread_;
70 std::atomic_bool running_;
71
72 moodycamel::ReaderWriterQueue<IncomingMachineMessage>
73 &incoming_machine_message_queue_;
74 moodycamel::ReaderWriterQueue<OutgoingMachineMessage>
75 &outgoing_machine_message_queue_;
76
77 // WebSockets
78 std::unordered_map<std::string /* client ID */,
79 std::shared_ptr<ix::WebSocket>>
80 dealer_ws_client_map_;
81 std::unordered_map<std::string /* client ID */,
82 std::shared_ptr<ix::WebSocket>>
83 sub_ws_client_map_;
84
85 std::unordered_map<std::string /* client ID */,
86 moodycamel::ReaderWriterQueue<IncomingMachineMessage>>
87 dealer_ws_incoming_message_map_;
88
89 std::unordered_map<std::string /* topic */,
90 std::vector<std::string> /* client IDs */>
91 topic_to_client_ids_map_;
92
93 std::unordered_map<std::string /* request message ID */,
94 std::string /* topic */>
95 request_id_to_topic_map_;
96
97 std::mutex mutex_;
98
102 void run();
103
109 void dealer_ws_close_clean_up(const std::string &client_id);
110
116 void sub_ws_close_clean_up(const std::string &client_id);
117
121 void ws_clean_up();
122
126 void send_outgoing_messages();
127};
MotionMasterConnectionState()
Definition: server.h:41
std::string getClientId()
Definition: server.h:43
bool setClientId(const std::string &client_id)
Definition: server.h:45
std::string client_id_
Definition: server.h:60
static std::shared_ptr< ConnectionState > createMotionMasterConnectionState()
Definition: server.h:55
Definition: server.h:15
void stop()
Stop the Server.
Definition: server.cc:389
void wait()
block until the Server finishes execution
Definition: server.cc:391
~Server()
Definition: server.cc:33
void start()
Start the Server.
Definition: server.cc:384