-
-
Notifications
You must be signed in to change notification settings - Fork 387
Expand file tree
/
Copy pathNetworkClient.h
More file actions
314 lines (272 loc) · 18.5 KB
/
Copy pathNetworkClient.h
File metadata and controls
314 lines (272 loc) · 18.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
/*---------------------------------------------------------*\
| NetworkClient.h |
| |
| OpenRGB SDK network client |
| |
| Adam Honse (CalcProgrammer1) 09 May 2020 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#pragma once
#include <condition_variable>
#include <list>
#include <mutex>
#include <queue>
#include <thread>
#include <condition_variable>
#include "i2c_smbus.h"
#include "ResourceManager.h"
#include "RGBController.h"
#include "NetworkProtocol.h"
#include "net_port.h"
/*---------------------------------------------------------*\
| Callback Types |
\*---------------------------------------------------------*/
typedef void (*NetworkClientCallback)(void*, unsigned int);
/*---------------------------------------------------------*\
| NetworkClient Update Reason Codes |
\*---------------------------------------------------------*/
enum
{
NETWORKCLIENT_UPDATE_REASON_CLIENT_STARTED, /* Client started */
NETWORKCLIENT_UPDATE_REASON_CLIENT_STOPPED, /* Client stopped */
NETWORKCLIENT_UPDATE_REASON_CLIENT_CONNECTED, /* Client connectedd */
NETWORKCLIENT_UPDATE_REASON_CLIENT_DISCONNECTED, /* Client disconnected */
NETWORKCLIENT_UPDATE_REASON_SERVER_STRING_RECEIVED, /* Server string received */
NETWORKCLIENT_UPDATE_REASON_PROTOCOL_NEGOTIATED, /* Protocol version negotiated */
NETWORKCLIENT_UPDATE_REASON_DEVICE_LIST_UPDATED, /* Device list updated */
NETWORKCLIENT_UPDATE_REASON_DETECTION_STARTED, /* Detection started */
NETWORKCLIENT_UPDATE_REASON_DETECTION_PROGRESS_CHANGED, /* Detection progress changed */
NETWORKCLIENT_UPDATE_REASON_DETECTION_COMPLETE, /* Detection completed */
NETWORKCLIENT_UPDATE_REASON_PROFILEMANAGER_PROFILE_LIST_UPDATED, /* Profile list updated */
NETWORKCLIENT_UPDATE_REASON_PROFILEMANAGER_ACTIVE_PROFILE_CHANGED, /* Active profile changed */
};
typedef struct
{
NetPacketHeader header;
unsigned char* data;
} NetworkClientListenerThreadQueueEntry;
typedef struct
{
unsigned int id;
unsigned int index;
std::queue<NetworkClientListenerThreadQueueEntry> queue;
std::mutex queue_mutex;
std::mutex start_mutex;
std::condition_variable start_cv;
std::thread* thread;
std::atomic<bool> online;
} NetworkClientListenerThread;
class NetworkClient
{
public:
NetworkClient();
~NetworkClient();
/*-----------------------------------------------------*\
| Client Information functions |
\*-----------------------------------------------------*/
bool GetConnected();
std::string GetIP();
bool GetLocal();
unsigned short GetPort();
unsigned int GetProtocolVersion();
bool GetOnline();
std::string GetServerName();
bool GetSupportsRGBControllerAPI();
bool GetSupportsLogManagerAPI();
bool GetSupportsProfileManagerAPI();
bool GetSupportsPluginManagerAPI();
bool GetSupportsSettingsManagerAPI();
bool GetSupportsDetectionAPI();
bool GetSupportsDeviceInfoAPI();
/*-----------------------------------------------------*\
| Client Control functions |
\*-----------------------------------------------------*/
void RequestLocalClient(bool request_local);
void SetIP(std::string new_ip);
void SetName(std::string new_name);
void SetPort(unsigned short new_port);
void StartClient();
void StopClient();
void SendRequest_ControllerData(unsigned int dev_id);
void SendRequest_RescanDevices();
/*-----------------------------------------------------*\
| Client Callback functions |
\*-----------------------------------------------------*/
void ClearCallbacks();
void RegisterNetworkClientCallback(NetworkClientCallback new_callback, void* new_callback_arg);
/*-----------------------------------------------------*\
| Device Info Functions |
\*-----------------------------------------------------*/
std::vector<HIDDeviceInfo> GetHIDDeviceInfo();
std::vector<i2c_smbus_info> GetI2CBusInfo();
std::vector<std::string> GetSerialPorts();
std::vector<USBDeviceInfo> GetUSBDeviceInfo();
std::vector<SerialDeviceInfo> GetUSBSerialPorts();
/*-----------------------------------------------------*\
| DetectionManager functions |
\*-----------------------------------------------------*/
unsigned int DetectionManager_GetDetectionPercent();
std::string DetectionManager_GetDetectionString();
/*-----------------------------------------------------*\
| LogManager functions |
\*-----------------------------------------------------*/
void LogManager_ClearLogBuffer();
void LogManager_GetLogBuffer();
unsigned int LogManager_GetLogLevel();
void LogManager_SetLogLevel(unsigned int log_level);
/*-----------------------------------------------------*\
| ProfileManager functions |
\*-----------------------------------------------------*/
void ProfileManager_GetProfileList();
void ProfileManager_LoadProfile(std::string profile_name);
void ProfileManager_SaveProfile(std::string profile_name);
void ProfileManager_DeleteProfile(std::string profile_name);
void ProfileManager_UploadProfile(std::string profile_json_str);
std::string ProfileManager_DownloadProfile(std::string profile_name);
std::string ProfileManager_GetActiveProfile();
void ProfileManager_ClearActiveProfile();
/*-----------------------------------------------------*\
| SettingsManager functions |
\*-----------------------------------------------------*/
std::string SettingsManager_GetSettings(std::string settings_key);
std::string SettingsManager_GetSettingsSchema(std::string settings_key);
void SettingsManager_ModifySettings(std::string settings_json_str);
void SettingsManager_SaveSettings();
void SettingsManager_SetSettings(std::string settings_json_str);
/*-----------------------------------------------------*\
| RGBController functions |
\*-----------------------------------------------------*/
std::vector<RGBController*>& GetRGBControllers();
void SendRequest_RGBController_ClearSegments(unsigned int dev_idx, int zone);
void SendRequest_RGBController_AddSegment(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size);
void SendRequest_RGBController_ConfigureZone(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size);
void SendRequest_RGBController_ResizeZone(unsigned int dev_idx, int zone, int new_size);
void SendRequest_RGBController_ConfigureDevice(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size);
void SendRequest_RGBController_SetHidden(unsigned int dev_idx, bool hidden);
void SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size);
void SendRequest_RGBController_UpdateZoneLEDs(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size);
void SendRequest_RGBController_UpdateSingleLED(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size);
void SendRequest_RGBController_SetCustomMode(unsigned int dev_idx);
void SendRequest_RGBController_UpdateMode(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size);
void SendRequest_RGBController_UpdateZoneMode(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size);
void SendRequest_RGBController_SaveMode(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size);
void SendRequest_RGBController_SetDeviceSpecificConfiguration(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size);
void SendRequest_RGBController_SetDeviceSpecificZoneConfiguration(unsigned int dev_idx, unsigned char* data_ptr, unsigned int data_size);
void WaitOnControllerData();
private:
/*-----------------------------------------------------*\
| Client state variables |
\*-----------------------------------------------------*/
std::atomic<bool> client_active;
bool client_flags_sent;
bool client_is_local_client;
bool client_string_sent;
bool controller_data_received;
bool controller_data_requested;
bool protocol_initialized;
unsigned int protocol_version;
bool change_in_progress;
unsigned int requested_controller_index;
std::mutex send_in_progress;
/*-----------------------------------------------------*\
| Response queue |
\*-----------------------------------------------------*/
std::list<NetworkClientListenerThreadQueueEntry>
response_queue;
std::mutex response_queue_mutex;
std::condition_variable response_queue_cv;
/*-----------------------------------------------------*\
| Client information |
\*-----------------------------------------------------*/
unsigned int client_flags;
std::string client_name;
SOCKET client_sock;
net_port port;
std::string port_ip;
unsigned short port_num;
/*-----------------------------------------------------*\
| Server information |
\*-----------------------------------------------------*/
unsigned int server_flags;
bool server_flags_initialized;
std::string server_name;
bool server_connected;
bool server_initialized;
bool server_reinitialize;
bool server_controller_ids_requested;
bool server_controller_ids_received;
unsigned int server_protocol_version;
bool server_protocol_version_received;
/*-----------------------------------------------------*\
| Client threads |
\*-----------------------------------------------------*/
std::mutex connection_mutex;
std::condition_variable connection_cv;
std::thread * ConnectionThread;
std::thread * ListenThread;
NetworkClientListenerThread* profilemanager_thread;
/*-----------------------------------------------------*\
| Callbacks |
\*-----------------------------------------------------*/
std::mutex NetworkClientCallbackMutex;
std::vector<NetworkClientCallback> NetworkClientCallbacks;
std::vector<void *> NetworkClientCallbackArgs;
/*-----------------------------------------------------*\
| Controller list |
\*-----------------------------------------------------*/
std::mutex ControllerListMutex;
std::vector<RGBController*> server_controllers;
std::vector<unsigned int> server_controller_ids;
/*-----------------------------------------------------*\
| Detection variables |
\*-----------------------------------------------------*/
unsigned int detection_percent;
std::string detection_string;
/*-----------------------------------------------------*\
| Client callback signal functions |
\*-----------------------------------------------------*/
void SignalNetworkClientUpdate(unsigned int update_reason);
/*-----------------------------------------------------*\
| Client thread functions |
\*-----------------------------------------------------*/
void ConnectionThreadFunction();
void ListenThreadFunction();
void ProfileManagerListenThread(NetworkClientListenerThread* this_thread);
/*-----------------------------------------------------*\
| Private Client functions |
\*-----------------------------------------------------*/
void ProcessReply_ControllerData(unsigned int data_size, unsigned char* data_ptr, unsigned int dev_id);
void ProcessReply_ControllerIDs(unsigned int data_size, unsigned char* data_ptr);
void ProcessReply_ProtocolVersion(unsigned int data_size, unsigned char* data_ptr);
void ProcessRequest_DetectionProgressChanged(unsigned int data_size, unsigned char* data_ptr);
void ProcessRequest_DeviceListChanged();
void ProcessRequest_RGBController_SignalUpdate(unsigned int data_size, unsigned char* data_ptr, unsigned int dev_id);
void ProcessRequest_ServerFlags(unsigned int data_size, unsigned char* data_ptr);
void ProcessRequest_ServerString(unsigned int data_size, unsigned char* data_ptr);
void ProcessRequest_LogManager_LoggedEntry(unsigned int data_size, unsigned char* data_ptr);
void ProcessRequest_ProfileManager_ActiveProfileChanged(unsigned int data_size, unsigned char* data_ptr);
void ProcessRequest_ProfileManager_ProfileAboutToLoad();
void ProcessRequest_ProfileManager_ProfileListUpdated(unsigned int data_size, unsigned char* data_ptr);
void ProcessRequest_ProfileManager_ProfileLoaded(unsigned int data_size, unsigned char* data_ptr);
void SendData_ClientFlags();
void SendData_ClientString();
void SendRequest_ControllerIDs();
void SendRequest_ProtocolVersion();
void UpdateDeviceList(RGBController* new_controller);
/*-----------------------------------------------------*\
| Private ProfileManager functions |
\*-----------------------------------------------------*/
std::vector<std::string>* ProcessReply_ProfileList(unsigned int data_size, unsigned char* data_ptr);
/*-----------------------------------------------------*\
| Response queue helper |
\*-----------------------------------------------------*/
NetworkClientListenerThreadQueueEntry
WaitForResponse(unsigned int expected_pkt_id);
/*-----------------------------------------------------*\
| Private helper functions |
\*-----------------------------------------------------*/
RGBController * controller_from_id(unsigned int id);
int recv_select(SOCKET s, char *buf, int len, int flags);
};