From fb7413cc1310571f97f9378aceed5e82561a6378 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Tue, 14 Jan 2025 09:25:26 +0100 Subject: [PATCH] Added thing type registration --- SiteServer.cpp | 27 ++++++++++++++++++++------- SiteServer.h | 2 ++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/SiteServer.cpp b/SiteServer.cpp index a76bd3d..1a5e9a3 100644 --- a/SiteServer.cpp +++ b/SiteServer.cpp @@ -2,6 +2,8 @@ #include "Sensors/TemperatureSensor.h" +#include + namespace Passer { namespace Control { @@ -14,6 +16,8 @@ SiteServer::SiteServer(int port) { this->participants.push_back(this); SetupUDP(port, ipAddress, 0); + + Register((unsigned char)Thing::Type::TemperatureSensor); } void SiteServer::Update(unsigned long currentTimeMs) { @@ -33,19 +37,28 @@ void SiteServer::Process(Participant *sender, ClientMsg *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) { - switch ((Thing::Type)msg->thingType) { - case Thing::Type::TemperatureSensor: - new TemperatureSensor(msg->networkId, msg->thingId); - break; - default: + 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); - break; - } } } diff --git a/SiteServer.h b/SiteServer.h index 0a90a87..95a6c29 100644 --- a/SiteServer.h +++ b/SiteServer.h @@ -12,6 +12,8 @@ public: virtual void Update(unsigned long currentTimeMs) override; + template void Register(unsigned char thingType); + protected: unsigned long nextPublishMe = 0;