Keep a separate list of controllers detected from hardware and dynamically add/remove them from the master list when redetecting so client controllers aren't deleted during redetection
This commit is contained in:
parent
31b6533193
commit
24de16f77b
2 changed files with 60 additions and 11 deletions
|
|
@ -43,7 +43,7 @@ ResourceManager::ResourceManager()
|
||||||
/*-------------------------------------------------------------------------*\
|
/*-------------------------------------------------------------------------*\
|
||||||
| Initialize Server Instance |
|
| Initialize Server Instance |
|
||||||
\*-------------------------------------------------------------------------*/
|
\*-------------------------------------------------------------------------*/
|
||||||
server = new NetworkServer(rgb_controllers);
|
server = new NetworkServer(rgb_controllers_hw);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResourceManager::~ResourceManager()
|
ResourceManager::~ResourceManager()
|
||||||
|
|
@ -105,6 +105,43 @@ void ResourceManager::DeviceListChanged()
|
||||||
{
|
{
|
||||||
DeviceListChangeMutex.lock();
|
DeviceListChangeMutex.lock();
|
||||||
|
|
||||||
|
/*-------------------------------------------------*\
|
||||||
|
| Insert hardware controllers into controller list |
|
||||||
|
\*-------------------------------------------------*/
|
||||||
|
for(unsigned int hw_controller_idx = 0; hw_controller_idx < rgb_controllers_hw.size(); hw_controller_idx++)
|
||||||
|
{
|
||||||
|
/*-------------------------------------------------*\
|
||||||
|
| Check if the controller is already in the list |
|
||||||
|
| at the correct index |
|
||||||
|
\*-------------------------------------------------*/
|
||||||
|
if(hw_controller_idx < rgb_controllers.size())
|
||||||
|
{
|
||||||
|
if(rgb_controllers[hw_controller_idx] == rgb_controllers_hw[hw_controller_idx])
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-------------------------------------------------*\
|
||||||
|
| If not, check if the controller is already in the |
|
||||||
|
| list at a different index |
|
||||||
|
\*-------------------------------------------------*/
|
||||||
|
for(unsigned int controller_idx = 0; controller_idx < rgb_controllers.size(); controller_idx++)
|
||||||
|
{
|
||||||
|
if(rgb_controllers[controller_idx] == rgb_controllers_hw[hw_controller_idx])
|
||||||
|
{
|
||||||
|
rgb_controllers.erase(rgb_controllers.begin() + controller_idx);
|
||||||
|
rgb_controllers.insert(rgb_controllers.begin() + hw_controller_idx, rgb_controllers_hw[hw_controller_idx]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-------------------------------------------------*\
|
||||||
|
| If it still hasn't been found, add it to the list |
|
||||||
|
\*-------------------------------------------------*/
|
||||||
|
rgb_controllers.insert(rgb_controllers.begin() + hw_controller_idx, rgb_controllers_hw[hw_controller_idx]);
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------*\
|
/*-------------------------------------------------*\
|
||||||
| Device list has changed, call the callbacks |
|
| Device list has changed, call the callbacks |
|
||||||
\*-------------------------------------------------*/
|
\*-------------------------------------------------*/
|
||||||
|
|
@ -161,11 +198,23 @@ void ResourceManager::Cleanup()
|
||||||
{
|
{
|
||||||
ResourceManager::get()->WaitForDeviceDetection();
|
ResourceManager::get()->WaitForDeviceDetection();
|
||||||
|
|
||||||
std::vector<RGBController *> rgb_controllers_copy = rgb_controllers;
|
std::vector<RGBController *> rgb_controllers_hw_copy = rgb_controllers_hw;
|
||||||
|
|
||||||
rgb_controllers.clear();
|
for(unsigned int hw_controller_idx = 0; hw_controller_idx < rgb_controllers_hw.size(); hw_controller_idx++)
|
||||||
|
{
|
||||||
|
for(unsigned int controller_idx = 0; controller_idx < rgb_controllers.size(); controller_idx++)
|
||||||
|
{
|
||||||
|
if(rgb_controllers[controller_idx] == rgb_controllers_hw[hw_controller_idx])
|
||||||
|
{
|
||||||
|
rgb_controllers.erase(rgb_controllers.begin() + controller_idx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for(RGBController* rgb_controller : rgb_controllers_copy)
|
rgb_controllers_hw.clear();
|
||||||
|
|
||||||
|
for(RGBController* rgb_controller : rgb_controllers_hw_copy)
|
||||||
{
|
{
|
||||||
delete rgb_controller;
|
delete rgb_controller;
|
||||||
}
|
}
|
||||||
|
|
@ -283,18 +332,18 @@ void ResourceManager::DetectDevicesThreadFunction()
|
||||||
|
|
||||||
if(!this_device_disabled)
|
if(!this_device_disabled)
|
||||||
{
|
{
|
||||||
i2c_device_detectors[i2c_detector_idx](busses, rgb_controllers);
|
i2c_device_detectors[i2c_detector_idx](busses, rgb_controllers_hw);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------*\
|
/*-------------------------------------------------*\
|
||||||
| If the device list size has changed, call the |
|
| If the device list size has changed, call the |
|
||||||
| device list changed callbacks |
|
| device list changed callbacks |
|
||||||
\*-------------------------------------------------*/
|
\*-------------------------------------------------*/
|
||||||
if(rgb_controllers.size() != prev_count)
|
if(rgb_controllers_hw.size() != prev_count)
|
||||||
{
|
{
|
||||||
DeviceListChanged();
|
DeviceListChanged();
|
||||||
}
|
}
|
||||||
prev_count = rgb_controllers.size();
|
prev_count = rgb_controllers_hw.size();
|
||||||
|
|
||||||
percent = (i2c_detector_idx + 1.0f) / (i2c_device_detectors.size() + device_detectors.size());
|
percent = (i2c_detector_idx + 1.0f) / (i2c_device_detectors.size() + device_detectors.size());
|
||||||
|
|
||||||
|
|
@ -321,18 +370,18 @@ void ResourceManager::DetectDevicesThreadFunction()
|
||||||
|
|
||||||
if(!this_device_disabled)
|
if(!this_device_disabled)
|
||||||
{
|
{
|
||||||
device_detectors[detector_idx](rgb_controllers);
|
device_detectors[detector_idx](rgb_controllers_hw);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------*\
|
/*-------------------------------------------------*\
|
||||||
| If the device list size has changed, call the |
|
| If the device list size has changed, call the |
|
||||||
| device list changed callbacks |
|
| device list changed callbacks |
|
||||||
\*-------------------------------------------------*/
|
\*-------------------------------------------------*/
|
||||||
if(rgb_controllers.size() != prev_count)
|
if(rgb_controllers_hw.size() != prev_count)
|
||||||
{
|
{
|
||||||
DeviceListChanged();
|
DeviceListChanged();
|
||||||
}
|
}
|
||||||
prev_count = rgb_controllers.size();
|
prev_count = rgb_controllers_hw.size();
|
||||||
|
|
||||||
percent = (detector_idx + 1.0f + i2c_device_detectors.size()) / (i2c_device_detectors.size() + device_detectors.size());
|
percent = (detector_idx + 1.0f + i2c_device_detectors.size()) / (i2c_device_detectors.size() + device_detectors.size());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ private:
|
||||||
/*-------------------------------------------------------------------------------------*\
|
/*-------------------------------------------------------------------------------------*\
|
||||||
| RGBControllers |
|
| RGBControllers |
|
||||||
\*-------------------------------------------------------------------------------------*/
|
\*-------------------------------------------------------------------------------------*/
|
||||||
//std::vector<RGBController*> rgb_controllers_hw;
|
std::vector<RGBController*> rgb_controllers_hw;
|
||||||
std::vector<RGBController*> rgb_controllers;
|
std::vector<RGBController*> rgb_controllers;
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------------------*\
|
/*-------------------------------------------------------------------------------------*\
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue