Skip to content

Commit a04fe26

Browse files
Implement Hue Settings Handler to prevent json type conflicts that resulted in a multiply defined linker warning
1 parent 236e67e commit a04fe26

File tree

3 files changed

+222
-50
lines changed

3 files changed

+222
-50
lines changed

Controllers/PhilipsHueController/PhilipsHueControllerDetect.cpp

+25-50
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
#include "PhilipsHueEntertainmentController.h"
2525
#include "RGBController_PhilipsHue.h"
2626
#include "RGBController_PhilipsHueEntertainment.h"
27-
#include "SettingsManager.h"
27+
#include "PhilipsHueSettingsHandler.h"
2828

2929
/******************************************************************************************\
3030
* *
@@ -36,7 +36,7 @@
3636

3737
void DetectPhilipsHueControllers()
3838
{
39-
json hue_settings;
39+
PhilipsHueSettingsHandler hue_settings;
4040

4141
/*-------------------------------------------------*\
4242
| Create an HTTP handler |
@@ -47,11 +47,6 @@ void DetectPhilipsHueControllers()
4747
using SystemHttpHandler = hueplusplus::LinHttpHandler;
4848
#endif
4949

50-
/*-------------------------------------------------*\
51-
| Get Philips Hue settings from settings manager |
52-
\*-------------------------------------------------*/
53-
hue_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("PhilipsHueDevices");
54-
5550
/*-------------------------------------------------*\
5651
| Create a finder and find bridges |
5752
\*-------------------------------------------------*/
@@ -62,24 +57,14 @@ void DetectPhilipsHueControllers()
6257
| If no bridges were detected, manually add bridge |
6358
| IP and MAC (need to get these from file) |
6459
\*-------------------------------------------------*/
65-
if(bridges.empty())
60+
if(hue_settings.GetBridgeCount() > 0)
6661
{
67-
if(hue_settings.contains("bridges"))
68-
{
69-
hueplusplus::BridgeFinder::BridgeIdentification ident;
62+
hueplusplus::BridgeFinder::BridgeIdentification ident;
7063

71-
if(hue_settings["bridges"][0].contains("ip"))
72-
{
73-
ident.ip = hue_settings["bridges"][0]["ip"];
74-
}
75-
76-
if(hue_settings["bridges"][0].contains("mac"))
77-
{
78-
ident.mac = hue_settings["bridges"][0]["mac"];
79-
}
64+
ident.ip = hue_settings.GetBridgeIP(0);
65+
ident.mac = hue_settings.GetBridgeMAC(0);
8066

81-
bridges.push_back(ident);
82-
}
67+
bridges.push_back(ident);
8368
}
8469

8570
/*-------------------------------------------------*\
@@ -95,22 +80,22 @@ void DetectPhilipsHueControllers()
9580
/*-------------------------------------------------*\
9681
| Check if a saved username exists |
9782
\*-------------------------------------------------*/
98-
if(hue_settings.contains("bridges"))
83+
if(hue_settings.GetBridgeCount() > 0)
9984
{
10085
/*-------------------------------------------------*\
10186
| Add the username if it exists |
10287
\*-------------------------------------------------*/
103-
if(hue_settings["bridges"][0].contains("username"))
88+
if(hue_settings.BridgeHasUsername(0))
10489
{
105-
finder.addUsername(bridges[0].mac, hue_settings["bridges"][0]["username"]);
90+
finder.addUsername(bridges[0].mac, hue_settings.GetBridgeUsername(0));
10691
}
10792

10893
/*-------------------------------------------------*\
10994
| Add the client key if it exists |
11095
\*-------------------------------------------------*/
111-
if(hue_settings["bridges"][0].contains("clientkey"))
96+
if(hue_settings.BridgeHasClientKey(0))
11297
{
113-
finder.addClientKey(bridges[0].mac, hue_settings["bridges"][0]["clientkey"]);
98+
finder.addClientKey(bridges[0].mac, hue_settings.GetBridgeClientKey(0));
11499
}
115100
}
116101

@@ -134,11 +119,11 @@ void DetectPhilipsHueControllers()
134119
bool use_entertainment = false;
135120
bool auto_connect = false;
136121

137-
if(hue_settings.contains("bridges"))
122+
if(hue_settings.GetBridgeCount() > 0)
138123
{
139-
if(hue_settings["bridges"][0].contains("username"))
124+
if(hue_settings.BridgeHasUsername(0))
140125
{
141-
if(hue_settings["bridges"][0]["username"] != bridge.getUsername())
126+
if(hue_settings.GetBridgeUsername(0) != bridge.getUsername())
142127
{
143128
save_settings = true;
144129
}
@@ -148,9 +133,9 @@ void DetectPhilipsHueControllers()
148133
save_settings = true;
149134
}
150135

151-
if(hue_settings["bridges"][0].contains("clientkey"))
136+
if(hue_settings.BridgeHasClientKey(0))
152137
{
153-
if(hue_settings["bridges"][0]["clientkey"] != bridge.getClientKey())
138+
if(hue_settings.GetBridgeClientKey(0) != bridge.getClientKey())
154139
{
155140
use_entertainment = true;
156141
save_settings = true;
@@ -167,28 +152,18 @@ void DetectPhilipsHueControllers()
167152
\*-------------------------------------------------*/
168153
if(save_settings)
169154
{
170-
hue_settings["bridges"][0]["username"] = bridge.getUsername();
171-
hue_settings["bridges"][0]["clientkey"] = bridge.getClientKey();
172-
hue_settings["bridges"][0]["entertainment"] = use_entertainment;
173-
hue_settings["bridges"][0]["autoconnect"] = auto_connect;
174-
175-
ResourceManager::get()->GetSettingsManager()->SetSettings("PhilipsHueDevices", hue_settings);
176-
177-
ResourceManager::get()->GetSettingsManager()->SaveSettings();
155+
hue_settings.SetBridgeUsername(0, bridge.getUsername());
156+
hue_settings.SetBridgeClientKey(0, bridge.getClientKey());
157+
hue_settings.SetBridgeUseEntertainment(0, use_entertainment);
158+
hue_settings.SetBridgeAutoconnect(0, auto_connect);
159+
hue_settings.SaveSettings();
178160
}
179161

180162
/*-------------------------------------------------*\
181-
| Get entertainment mode settings |
163+
| Get entertainment mode settings |
182164
\*-------------------------------------------------*/
183-
if(hue_settings["bridges"][0].contains("entertainment"))
184-
{
185-
use_entertainment = hue_settings["bridges"][0]["entertainment"];
186-
}
187-
188-
if(hue_settings["bridges"][0].contains("autoconnect"))
189-
{
190-
auto_connect = hue_settings["bridges"][0]["autoconnect"];
191-
}
165+
use_entertainment = hue_settings.GetBridgeUseEntertainment(0);
166+
auto_connect = hue_settings.GetBridgeAutoconnect(0);
192167

193168
/*-------------------------------------------------*\
194169
| Get all groups from the bridge |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
#include "PhilipsHueSettingsHandler.h"
2+
#include "ResourceManager.h"
3+
#include "SettingsManager.h"
4+
5+
#define HUE_SETTINGS ((hue_settings_type *)hue_settings)->hue_settings
6+
7+
typedef struct
8+
{
9+
json hue_settings;
10+
} hue_settings_type;
11+
12+
PhilipsHueSettingsHandler::PhilipsHueSettingsHandler()
13+
{
14+
/*-------------------------------------------------*\
15+
| Create an object to hold the hue settings json |
16+
| This cannot be a class member as json must not |
17+
| be included in the header file, so it is held as |
18+
| a void pointer instead. |
19+
\*-------------------------------------------------*/
20+
hue_settings = (void *)(new hue_settings_type);
21+
22+
/*-------------------------------------------------*\
23+
| Get Philips Hue settings from settings manager |
24+
\*-------------------------------------------------*/
25+
HUE_SETTINGS = ResourceManager::get()->GetSettingsManager()->GetSettings("PhilipsHueDevices");
26+
}
27+
28+
PhilipsHueSettingsHandler::~PhilipsHueSettingsHandler()
29+
{
30+
delete (hue_settings_type *)hue_settings;
31+
}
32+
33+
unsigned int PhilipsHueSettingsHandler::GetBridgeCount()
34+
{
35+
if(HUE_SETTINGS.contains("bridges"))
36+
{
37+
return(HUE_SETTINGS["bridges"].size());
38+
}
39+
else
40+
{
41+
return(0);
42+
}
43+
}
44+
45+
std::string PhilipsHueSettingsHandler::GetBridgeIP(unsigned int bridge_idx)
46+
{
47+
if(HUE_SETTINGS["bridges"][bridge_idx].contains("ip"))
48+
{
49+
return(HUE_SETTINGS["bridges"][bridge_idx]["ip"]);
50+
}
51+
else
52+
{
53+
return("");
54+
}
55+
}
56+
57+
std::string PhilipsHueSettingsHandler::GetBridgeMAC(unsigned int bridge_idx)
58+
{
59+
if(HUE_SETTINGS["bridges"][bridge_idx].contains("mac"))
60+
{
61+
return(HUE_SETTINGS["bridges"][bridge_idx]["mac"]);
62+
}
63+
else
64+
{
65+
return("");
66+
}
67+
}
68+
69+
std::string PhilipsHueSettingsHandler::GetBridgeUsername(unsigned int bridge_idx)
70+
{
71+
if(HUE_SETTINGS["bridges"][bridge_idx].contains("username"))
72+
{
73+
return(HUE_SETTINGS["bridges"][bridge_idx]["username"]);
74+
}
75+
else
76+
{
77+
return("");
78+
}
79+
}
80+
81+
std::string PhilipsHueSettingsHandler::GetBridgeClientKey(unsigned int bridge_idx)
82+
{
83+
if(HUE_SETTINGS["bridges"][bridge_idx].contains("clientkey"))
84+
{
85+
return(HUE_SETTINGS["bridges"][bridge_idx]["clientkey"]);
86+
}
87+
else
88+
{
89+
return("");
90+
}
91+
}
92+
93+
bool PhilipsHueSettingsHandler::GetBridgeAutoconnect(unsigned int bridge_idx)
94+
{
95+
if(HUE_SETTINGS["bridges"][bridge_idx].contains("autoconnect"))
96+
{
97+
return(HUE_SETTINGS["bridges"][bridge_idx]["autoconnect"]);
98+
}
99+
else
100+
{
101+
return(false);
102+
}
103+
}
104+
105+
bool PhilipsHueSettingsHandler::GetBridgeUseEntertainment(unsigned int bridge_idx)
106+
{
107+
if(HUE_SETTINGS["bridges"][bridge_idx].contains("entertainment"))
108+
{
109+
return(HUE_SETTINGS["bridges"][bridge_idx]["entertainment"]);
110+
}
111+
else
112+
{
113+
return(false);
114+
}
115+
}
116+
117+
bool PhilipsHueSettingsHandler::BridgeHasUsername(unsigned int bridge_idx)
118+
{
119+
return(HUE_SETTINGS["bridges"][bridge_idx].contains("username"));
120+
}
121+
122+
bool PhilipsHueSettingsHandler::BridgeHasClientKey(unsigned int bridge_idx)
123+
{
124+
return(HUE_SETTINGS["bridges"][bridge_idx].contains("clientkey"));
125+
}
126+
127+
void PhilipsHueSettingsHandler::SetBridgeUsername(unsigned int bridge_idx, std::string username)
128+
{
129+
HUE_SETTINGS["bridges"][bridge_idx]["username"] = username;
130+
}
131+
132+
void PhilipsHueSettingsHandler::SetBridgeClientKey(unsigned int bridge_idx, std::string clientkey)
133+
{
134+
HUE_SETTINGS["bridges"][bridge_idx]["clientkey"] = clientkey;
135+
}
136+
137+
void PhilipsHueSettingsHandler::SetBridgeAutoconnect(unsigned int bridge_idx, bool auto_connect)
138+
{
139+
HUE_SETTINGS["bridges"][bridge_idx]["autoconnect"] = auto_connect;
140+
}
141+
142+
void PhilipsHueSettingsHandler::SetBridgeUseEntertainment(unsigned int bridge_idx, bool use_entertainment)
143+
{
144+
HUE_SETTINGS["bridges"][bridge_idx]["entertainment"] = use_entertainment;
145+
}
146+
147+
void PhilipsHueSettingsHandler::SaveSettings()
148+
{
149+
ResourceManager::get()->GetSettingsManager()->SetSettings("PhilipsHueDevices", HUE_SETTINGS);
150+
ResourceManager::get()->GetSettingsManager()->SaveSettings();
151+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*---------------------------------------------------------*\
2+
| PhilipsHueSettingsHandler.h |
3+
| |
4+
| Settings Handler for Philips Hue |
5+
| Due to conflict in jsoh.hpp library, hueplusplus and |
6+
| SettingsManager should not be included in the same file |
7+
| so handle settings in a separate class. |
8+
| |
9+
| Adam Honse ([email protected]) 17 Jan 2025 |
10+
| |
11+
| This file is part of the OpenRGB project |
12+
| SPDX-License-Identifier: GPL-2.0-only |
13+
\*---------------------------------------------------------*/
14+
15+
#pragma once
16+
17+
#include <string>
18+
19+
class PhilipsHueSettingsHandler
20+
{
21+
public:
22+
PhilipsHueSettingsHandler();
23+
~PhilipsHueSettingsHandler();
24+
25+
unsigned int GetBridgeCount();
26+
27+
std::string GetBridgeIP(unsigned int bridge_idx);
28+
std::string GetBridgeMAC(unsigned int bridge_idx);
29+
std::string GetBridgeUsername(unsigned int bridge_idx);
30+
std::string GetBridgeClientKey(unsigned int bridge_idx);
31+
bool GetBridgeAutoconnect(unsigned int bridge_idx);
32+
bool GetBridgeUseEntertainment(unsigned int bridge_idx);
33+
34+
bool BridgeHasUsername(unsigned int bridge_idx);
35+
bool BridgeHasClientKey(unsigned int bridge_idx);
36+
37+
void SetBridgeUsername(unsigned int bridge_idx, std::string username);
38+
void SetBridgeClientKey(unsigned int bridge_idx, std::string clientkey);
39+
void SetBridgeAutoconnect(unsigned int bridge_ip, bool auto_connect);
40+
void SetBridgeUseEntertainment(unsigned int bridge_idx, bool use_entertainment);
41+
42+
void SaveSettings();
43+
44+
private:
45+
void * hue_settings;
46+
};

0 commit comments

Comments
 (0)