#include "SiteServer.h" #include "Sensors/TemperatureSensor.h" #include #include 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((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( unsigned char networkId, unsigned char thingId)>; std::unordered_map thingMsgProcessors; template void SiteServer::Register(unsigned char thingType) { thingMsgProcessors[thingType] = [](unsigned char networkId, unsigned char thingId) { return std::make_unique(networkId, thingId); }; } 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