@@ -23,24 +23,13 @@ ResourceManager::ResourceManager()
2323{
2424 detection_percent = 100 ;
2525 detection_string = " " ;
26+ detection_is_required = false ;
27+ DetectDevicesThread = nullptr ;
2628}
2729
2830ResourceManager::~ResourceManager ()
2931{
30- ResourceManager::get ()->WaitForDeviceDetection ();
31-
32- for (RGBController* rgb_controller : rgb_controllers)
33- {
34- delete rgb_controller;
35- }
36-
37- for (i2c_smbus_interface* bus : busses)
38- {
39- delete bus;
40- }
41-
42- DetectDevicesThread->join ();
43- delete DetectDevicesThread;
32+ Cleanup ();
4433}
4534
4635void ResourceManager::RegisterI2CBus (i2c_smbus_interface *bus)
@@ -104,19 +93,59 @@ void ResourceManager::DeviceListChanged()
10493
10594unsigned int ResourceManager::GetDetectionPercent ()
10695{
107- return (detection_percent);
96+ return (detection_percent. load () );
10897}
10998
110- std::string ResourceManager::GetDetectionString ()
99+ const char * ResourceManager::GetDetectionString ()
111100{
112- return (detection_string);
101+ return (detection_string);
102+ }
103+
104+ void ResourceManager::Cleanup ()
105+ {
106+ ResourceManager::get ()->WaitForDeviceDetection ();
107+
108+ for (RGBController* rgb_controller : rgb_controllers)
109+ {
110+ delete rgb_controller;
111+ }
112+ rgb_controllers.clear ();
113+
114+ for (i2c_smbus_interface* bus : busses)
115+ {
116+ delete bus;
117+ }
118+ busses.clear ();
119+
120+ if (DetectDevicesThread)
121+ {
122+ DetectDevicesThread->join ();
123+ delete DetectDevicesThread;
124+ DetectDevicesThread = nullptr ;
125+ }
113126}
114127
115128void ResourceManager::DetectDevices ()
116129{
130+ /* -------------------------------------------------*\
131+ | Do nothing is it is already detecting devices |
132+ \*-------------------------------------------------*/
133+ if (detection_is_required.load ())
134+ {
135+ return ;
136+ }
137+
138+ /* -------------------------------------------------*\
139+ | If there's anything left from the last time, |
140+ | we shall remove it first |
141+ \*-------------------------------------------------*/
142+ detection_percent = 0 ;
143+ Cleanup ();
144+
117145 /* -------------------------------------------------*\
118146 | Start the device detection thread |
119147 \*-------------------------------------------------*/
148+ detection_is_required = true ;
120149 DetectDevicesThread = new std::thread (&ResourceManager::DetectDevicesThreadFunction, this );
121150
122151 /* -------------------------------------------------*\
@@ -161,17 +190,17 @@ void ResourceManager::DetectDevicesThreadFunction()
161190 /* -------------------------------------------------*\
162191 | Detect i2c busses |
163192 \*-------------------------------------------------*/
164- for (unsigned int i2c_bus_detector_idx = 0 ; i2c_bus_detector_idx < i2c_bus_detectors.size (); i2c_bus_detector_idx++)
193+ for (unsigned int i2c_bus_detector_idx = 0 ; i2c_bus_detector_idx < i2c_bus_detectors.size () && detection_is_required. load () ; i2c_bus_detector_idx++)
165194 {
166195 i2c_bus_detectors[i2c_bus_detector_idx](busses);
167196 }
168197
169198 /* -------------------------------------------------*\
170199 | Detect i2c devices |
171200 \*-------------------------------------------------*/
172- for (unsigned int i2c_detector_idx = 0 ; i2c_detector_idx < i2c_device_detectors.size (); i2c_detector_idx++)
201+ for (unsigned int i2c_detector_idx = 0 ; i2c_detector_idx < i2c_device_detectors.size () && detection_is_required. load () ; i2c_detector_idx++)
173202 {
174- detection_string = i2c_device_detector_strings[i2c_detector_idx];
203+ detection_string = i2c_device_detector_strings[i2c_detector_idx]. c_str () ;
175204 DeviceListChanged ();
176205
177206 bool this_device_disabled = false ;
@@ -207,9 +236,9 @@ void ResourceManager::DetectDevicesThreadFunction()
207236 /* -------------------------------------------------*\
208237 | Detect other devices |
209238 \*-------------------------------------------------*/
210- for (unsigned int detector_idx = 0 ; detector_idx < device_detectors.size (); detector_idx++)
239+ for (unsigned int detector_idx = 0 ; detector_idx < device_detectors.size () && detection_is_required. load () ; detector_idx++)
211240 {
212- detection_string = device_detector_strings[detector_idx];
241+ detection_string = device_detector_strings[detector_idx]. c_str () ;
213242 DeviceListChanged ();
214243
215244 bool this_device_disabled = false ;
@@ -243,10 +272,26 @@ void ResourceManager::DetectDevicesThreadFunction()
243272 }
244273
245274 profile_manager.LoadSizeFromProfile (" sizes.ors" );
246-
275+
276+ /* -------------------------------------------------*\
277+ | Make sure that when the detection is done, |
278+ | progress bar is set to 100% |
279+ \*-------------------------------------------------*/
280+
281+ detection_is_required = false ;
282+ detection_percent = 100 ;
283+ detection_string = " " ;
284+
247285 DetectDeviceMutex.unlock ();
248286}
249287
288+ void ResourceManager::StopDeviceDetection ()
289+ {
290+ detection_is_required = false ;
291+ detection_percent = 100 ;
292+ detection_string = " Stopping" ;
293+ }
294+
250295void ResourceManager::WaitForDeviceDetection ()
251296{
252297 DetectDeviceMutex.lock ();
0 commit comments