|
|
@@ -27,18 +27,29 @@ Device::~Device()
|
|
|
|
|
|
void Device::Start()
|
|
|
{
|
|
|
- m_deviceTimer.StartContinuous(10000, static_cast<std::function<void()>>(std::bind(&Device::UpdatePresentDevices, this)));
|
|
|
- m_inventoryTimer.StartContinuous(300000, static_cast<std::function<void()>>(std::bind(&Device::UpdateDevicesFromInventory, this)));
|
|
|
+ int timeout = m_timeout * 1000;
|
|
|
+ m_onlineDeviceTimer.StartContinuous(timeout, static_cast<std::function<void()>>(std::bind(&Device::UpdateOnlineDevices, this)));
|
|
|
+ m_offlineDeviceTimer.StartContinuous(3000, static_cast<std::function<void()>>(std::bind(&Device::UpdateOfflineDevices, this)));
|
|
|
+ if (!m_inventoryURL.empty())
|
|
|
+ m_inventoryTimer.StartContinuous(600000, static_cast<std::function<void()>>(std::bind(&Device::UpdateDevicesFromInventory, this)));
|
|
|
}
|
|
|
|
|
|
void Device::Stop()
|
|
|
{
|
|
|
- m_deviceTimer.Stop();
|
|
|
+ m_onlineDeviceTimer.Stop();
|
|
|
+ m_offlineDeviceTimer.Stop();
|
|
|
+ if (!m_inventoryURL.empty())
|
|
|
+ m_inventoryTimer.Stop();
|
|
|
}
|
|
|
|
|
|
void Device::Wait()
|
|
|
{
|
|
|
- m_deviceTimer.Wait();
|
|
|
+ m_onlineDeviceTimer.Wait();
|
|
|
+ m_offlineDeviceTimer.Wait();
|
|
|
+ if (!m_inventoryURL.empty())
|
|
|
+ m_inventoryTimer.Wait();
|
|
|
+}
|
|
|
+
|
|
|
void Device::ClearDevices()
|
|
|
{
|
|
|
for (std::vector<std::string>::iterator it = m_devices.begin(); it != m_devices.end(); ++it)
|
|
|
@@ -97,22 +108,40 @@ void Device::UpdateDevicesFromInventory()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void Device::UpdatePresentDevices()
|
|
|
+void Device::UpdateOnlineDevices()
|
|
|
+{
|
|
|
+ UpdatePresentDevices(true);
|
|
|
+}
|
|
|
+
|
|
|
+void Device::UpdateOfflineDevices()
|
|
|
+{
|
|
|
+ UpdatePresentDevices(false);
|
|
|
+}
|
|
|
+
|
|
|
+void Device::UpdatePresentDevices(bool updateOnlineDevices)
|
|
|
{
|
|
|
std::vector<std::string> presentDevices;
|
|
|
- std::vector<std::string> addedDevices;
|
|
|
- std::vector<std::string> removedDevices;
|
|
|
+ std::vector<std::string> ignoredDevices;
|
|
|
|
|
|
for (std::vector<std::string>::iterator it = m_devices.begin(); it != m_devices.end(); ++it)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- if (Functions::Ping(*it))
|
|
|
+ bool pollDevice = false;
|
|
|
+ if (std::find(m_presentDevices.begin(), m_presentDevices.end(), *it) == m_presentDevices.end())
|
|
|
+ pollDevice = true;
|
|
|
+ else
|
|
|
+ pollDevice = updateOnlineDevices;
|
|
|
+
|
|
|
+ if (pollDevice && Functions::Ping(*it))
|
|
|
{
|
|
|
if (std::find(m_presentDevices.begin(), m_presentDevices.end(), *it) == m_presentDevices.end())
|
|
|
SendStateChange(true, *it);
|
|
|
presentDevices.push_back(*it);
|
|
|
}
|
|
|
+
|
|
|
+ if (!pollDevice)
|
|
|
+ ignoredDevices.push_back(*it);
|
|
|
}
|
|
|
catch (const std::exception& e)
|
|
|
{
|
|
|
@@ -152,10 +181,16 @@ void Device::UpdatePresentDevices()
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
for (std::vector<std::string>::iterator it = m_presentDevices.begin(); it != m_presentDevices.end(); ++it)
|
|
|
- if (std::find(presentDevices.begin(), presentDevices.end(), *it) == presentDevices.end())
|
|
|
+ if (std::find(presentDevices.begin(), presentDevices.end(), *it) == presentDevices.end() &&
|
|
|
+ std::find(ignoredDevices.begin(), ignoredDevices.end(), *it) == ignoredDevices.end())
|
|
|
SendStateChange(false, *it);
|
|
|
|
|
|
+ for (std::vector<std::string>::iterator it = m_presentDevices.begin(); it != m_presentDevices.end(); ++it)
|
|
|
+ if (std::find(ignoredDevices.begin(), ignoredDevices.end(), *it) != ignoredDevices.end())
|
|
|
+ presentDevices.push_back(*it);
|
|
|
+
|
|
|
m_presentDevices.assign(presentDevices.begin(), presentDevices.end());
|
|
|
}
|
|
|
|