Add detection progress callback to avoid unnecessary device list updates

This commit is contained in:
Adam Honse 2020-09-28 19:11:47 -05:00
parent c3b4489fd3
commit c30480af91
2 changed files with 44 additions and 7 deletions

View file

@ -89,12 +89,18 @@ void ResourceManager::RegisterDeviceDetector(std::string name, DeviceDetectorFun
device_detectors.push_back(detector);
}
void ResourceManager::RegisterDeviceListChangeCallback(ResourceManagerCallback new_callback, void * new_callback_arg)
void ResourceManager::RegisterDeviceListChangeCallback(DeviceListChangeCallback new_callback, void * new_callback_arg)
{
DeviceListChangeCallbacks.push_back(new_callback);
DeviceListChangeCallbackArgs.push_back(new_callback_arg);
}
void ResourceManager::RegisterDetectionProgressCallback(DetectionProgressCallback new_callback, void *new_callback_arg)
{
DetectionProgressCallbacks.push_back(new_callback);
DetectionProgressCallbackArgs.push_back(new_callback_arg);
}
void ResourceManager::DeviceListChanged()
{
DeviceListChangeMutex.lock();
@ -116,6 +122,27 @@ void ResourceManager::DeviceListChanged()
DeviceListChangeMutex.unlock();
}
void ResourceManager::DetectionProgressChanged()
{
DetectionProgressMutex.lock();
/*-------------------------------------------------*\
| Detection progress has changed, call the callbacks|
\*-------------------------------------------------*/
for(unsigned int callback_idx = 0; callback_idx < DetectionProgressCallbacks.size(); callback_idx++)
{
DetectionProgressCallbacks[callback_idx](DetectionProgressCallbackArgs[callback_idx]);
}
/*-------------------------------------------------*\
| Device list has changed, inform all clients |
| connected to this server |
\*-------------------------------------------------*/
server->DeviceListChanged();
DetectionProgressMutex.unlock();
}
NetworkServer* ResourceManager::GetServer()
{
return(server);
@ -236,7 +263,7 @@ void ResourceManager::DetectDevicesThreadFunction()
for(unsigned int i2c_detector_idx = 0; i2c_detector_idx < i2c_device_detectors.size() && detection_is_required.load(); i2c_detector_idx++)
{
detection_string = i2c_device_detector_strings[i2c_detector_idx].c_str();
DeviceListChanged();
DetectionProgressChanged();
bool this_device_disabled = false;
for(std::size_t disabled_idx = 0; disabled_idx < disabled_devices_list.size(); disabled_idx++)
@ -274,7 +301,7 @@ void ResourceManager::DetectDevicesThreadFunction()
for(unsigned int detector_idx = 0; detector_idx < device_detectors.size() && detection_is_required.load(); detector_idx++)
{
detection_string = device_detector_strings[detector_idx].c_str();
DeviceListChanged();
DetectionProgressChanged();
bool this_device_disabled = false;
for(std::size_t disabled_idx = 0; disabled_idx < disabled_devices_list.size(); disabled_idx++)
@ -317,7 +344,7 @@ void ResourceManager::DetectDevicesThreadFunction()
detection_percent = 100;
detection_string = "";
DeviceListChanged();
DetectionProgressChanged();
DetectDeviceMutex.unlock();
}

View file

@ -26,7 +26,8 @@ typedef std::function<void(std::vector<i2c_smbus_interface*>&)>
typedef std::function<void(std::vector<RGBController*>&)> DeviceDetectorFunction;
typedef std::function<void(std::vector<i2c_smbus_interface*>&, std::vector<RGBController*>&)> I2CDeviceDetectorFunction;
typedef void (*ResourceManagerCallback)(void *);
typedef void (*DeviceListChangeCallback)(void *);
typedef void (*DetectionProgressCallback)(void *);
class ResourceManager
{
@ -46,7 +47,8 @@ public:
void RegisterDeviceDetector (std::string name, DeviceDetectorFunction detector);
void RegisterI2CDeviceDetector (std::string name, I2CDeviceDetectorFunction detector);
void RegisterDeviceListChangeCallback(ResourceManagerCallback new_callback, void * new_callback_arg);
void RegisterDeviceListChangeCallback(DeviceListChangeCallback new_callback, void * new_callback_arg);
void RegisterDetectionProgressCallback(DetectionProgressCallback new_callback, void * new_callback_arg);
unsigned int GetDetectionPercent();
const char* GetDetectionString();
@ -55,6 +57,7 @@ public:
NetworkServer* GetServer();
void DeviceListChanged();
void DetectionProgressChanged();
void Cleanup();
@ -113,6 +116,13 @@ private:
| Device List Changed Callback |
\*-------------------------------------------------------------------------------------*/
std::mutex DeviceListChangeMutex;
std::vector<ResourceManagerCallback> DeviceListChangeCallbacks;
std::vector<DeviceListChangeCallback> DeviceListChangeCallbacks;
std::vector<void *> DeviceListChangeCallbackArgs;
/*-------------------------------------------------------------------------------------*\
| Detection Progress Callback |
\*-------------------------------------------------------------------------------------*/
std::mutex DetectionProgressMutex;
std::vector<DeviceListChangeCallback> DetectionProgressCallbacks;
std::vector<void *> DetectionProgressCallbackArgs;
};