From 5367cc196196071f3536f243b0622fac8b51f2cf Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 14 Jan 2025 20:19:02 +0100 Subject: [PATCH] Trying but failing to use Register --- SiteServer.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ SiteServer.h | 1 + 2 files changed, 75 insertions(+) diff --git a/SiteServer.cpp b/SiteServer.cpp index e69de29..a1c5dee 100644 --- a/SiteServer.cpp +++ b/SiteServer.cpp @@ -0,0 +1,74 @@ +#include "SiteServer.h" + +#include "Sensors/TemperatureSensor.h" + +#include +#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); + }; +} + +// template +// void SiteServer::Register(Thing::Type thingType) +// { +// Register((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 diff --git a/SiteServer.h b/SiteServer.h index 95a6c29..3f38b51 100644 --- a/SiteServer.h +++ b/SiteServer.h @@ -13,6 +13,7 @@ public: virtual void Update(unsigned long currentTimeMs) override; template void Register(unsigned char thingType); + // template void Register(Thing::Type thingType); protected: unsigned long nextPublishMe = 0;