Files
wlan-cloud-analytics/src/VenueWatcher.cpp
2023-02-21 13:38:18 -08:00

111 lines
3.2 KiB
C++

//
// Created by stephane bourque on 2022-03-10.
//
#include "VenueWatcher.h"
#include "DeviceStatusReceiver.h"
#include "HealthReceiver.h"
#include "StateReceiver.h"
namespace OpenWifi {
void VenueWatcher::Start() {
poco_notice(Logger(), "Starting...");
for (const auto &mac : SerialNumbers_) {
auto ap = std::make_shared<AP>(mac, venue_id_, boardId_, Logger());
APs_[mac] = ap;
}
for (const auto &i : SerialNumbers_)
StateReceiver()->Register(i, this);
DeviceStatusReceiver()->Register(SerialNumbers_, this);
HealthReceiver()->Register(SerialNumbers_, this);
Worker_.start(*this);
}
void VenueWatcher::Stop() {
poco_notice(Logger(), "Stopping...");
Running_ = false;
Queue_.wakeUpAll();
Worker_.join();
for (const auto &i : SerialNumbers_)
StateReceiver()->DeRegister(i, this);
DeviceStatusReceiver()->DeRegister(this);
HealthReceiver()->DeRegister(this);
poco_notice(Logger(), "Stopped...");
}
void VenueWatcher::run() {
Utils::SetThreadName("venue-watch");
Running_ = true;
Poco::AutoPtr<Poco::Notification> Msg(Queue_.waitDequeueNotification());
while (Msg && Running_) {
auto MsgContent = dynamic_cast<VenueMessage *>(Msg.get());
if (MsgContent != nullptr) {
try {
auto State = MsgContent->Payload();
if (MsgContent->Type() == VenueMessage::connection) {
auto It = APs_.find(MsgContent->SerialNumber());
if (It != end(APs_)) {
It->second->UpdateConnection(MsgContent->Payload());
}
} else if (MsgContent->Type() == VenueMessage::state) {
auto It = APs_.find(MsgContent->SerialNumber());
if (It != end(APs_)) {
It->second->UpdateStats(MsgContent->Payload());
}
} else if (MsgContent->Type() == VenueMessage::health) {
auto It = APs_.find(MsgContent->SerialNumber());
if (It != end(APs_)) {
It->second->UpdateHealth(MsgContent->Payload());
}
}
} catch (const Poco::Exception &E) {
Logger().log(E);
} catch (...) {
}
} else {
}
Msg = Queue_.waitDequeueNotification();
}
}
void VenueWatcher::ModifySerialNumbers(const std::vector<uint64_t> &SerialNumbers) {
std::lock_guard G(Mutex_);
std::vector<uint64_t> Diff;
std::set_symmetric_difference(SerialNumbers_.begin(), SerialNumbers_.end(),
SerialNumbers.begin(), SerialNumbers.end(),
std::inserter(Diff, Diff.begin()));
std::vector<uint64_t> ToRemove;
std::set_intersection(SerialNumbers_.begin(), SerialNumbers_.end(), Diff.begin(),
Diff.end(), std::inserter(ToRemove, ToRemove.begin()));
std::vector<uint64_t> ToAdd;
std::set_intersection(SerialNumbers.begin(), SerialNumbers.end(), Diff.begin(), Diff.end(),
std::inserter(ToAdd, ToAdd.begin()));
for (const auto &i : ToRemove) {
StateReceiver()->DeRegister(i, this);
}
for (const auto &i : ToAdd) {
StateReceiver()->Register(i, this);
}
HealthReceiver()->Register(SerialNumbers, this);
DeviceStatusReceiver()->Register(SerialNumbers, this);
SerialNumbers_ = SerialNumbers;
}
void VenueWatcher::GetDevices(std::vector<AnalyticsObjects::DeviceInfo> &DIL) {
std::lock_guard G(Mutex_);
DIL.reserve(APs_.size());
for (const auto &[serialNumber, DI] : APs_)
DIL.push_back(DI->Info());
}
} // namespace OpenWifi