RoboidControl-cpp/SiteServer.cpp
2025-01-14 20:19:02 +01:00

75 lines
2.0 KiB
C++

#include "SiteServer.h"
#include "Sensors/TemperatureSensor.h"
#include <functional>
#include <unordered_map>
#include <memory>
namespace Passer {
namespace Control {
SiteServer::SiteServer(int port) {
this->name = "Site Server";
this->ipAddress = "0.0.0.0";
this->port = port;
this->participants.push_back(this);
SetupUDP(port, ipAddress, 0);
Register<TemperatureSensor>((unsigned char)Thing::Type::TemperatureSensor);
}
void SiteServer::Update(unsigned long currentTimeMs) {
this->ReceiveUDP();
Thing::UpdateAll(currentTimeMs);
}
void SiteServer::Process(Participant *sender, ClientMsg *msg) {
if (msg->networkId == 0) {
std::cout << this->name << " received New Client -> " << sender->ipAddress
<< " " << (int)sender->networkId << "\n";
NetworkIdMsg *msg = new NetworkIdMsg(sender->networkId);
sender->Send(msg);
delete msg;
}
}
void SiteServer::Process(Participant *sender, NetworkIdMsg *msg) {}
using ThingConstructor = std::function<std::unique_ptr<Thing>(
unsigned char networkId, unsigned char thingId)>;
std::unordered_map<unsigned char, ThingConstructor> thingMsgProcessors;
template <typename ThingClass>
void SiteServer::Register(unsigned char thingType) {
thingMsgProcessors[thingType] = [](unsigned char networkId,
unsigned char thingId) {
return std::make_unique<ThingClass>(networkId, thingId);
};
}
// template <typename ThingClass>
// void SiteServer::Register(Thing::Type thingType)
// {
// Register<ThingClass>((unsigned char)thingType);
// }
void SiteServer::Process(ThingMsg *msg) {
Thing *thing = Thing::Get(msg->networkId, msg->thingId);
if (thing == nullptr) {
auto thingMsgProcessor = thingMsgProcessors.find(msg->thingType);
if (thingMsgProcessor != thingMsgProcessors.end()) // found item
thingMsgProcessor->second(msg->networkId, msg->thingId);
else
new Thing(this, msg->networkId, msg->thingId,
(Thing::Type)msg->thingType);
}
}
} // namespace Control
} // namespace Passer