diff --git a/CoreThing.cpp b/CoreThing.cpp index 26a8740..93a081b 100644 --- a/CoreThing.cpp +++ b/CoreThing.cpp @@ -1,5 +1,6 @@ #include "CoreThing.h" +#include "Participant.h" #include CoreThing::CoreThing(unsigned char networkId, unsigned char thingType) { @@ -8,6 +9,7 @@ CoreThing::CoreThing(unsigned char networkId, unsigned char thingType) { this->Init(); int thingId = CoreThing::Add(this); + if (thingId < 0) { std::cout << "ERROR: Thing store is full\n"; this->id = 0; // what to do when we cannot store any more things? @@ -15,15 +17,17 @@ CoreThing::CoreThing(unsigned char networkId, unsigned char thingType) { this->id = thingId; } +void CoreThing::Terminate() { CoreThing::Remove(this); } + void CoreThing::Init() {} -void CoreThing::SetName(const char *name) { this->name = name; } +CoreThing *CoreThing::GetParent() { return this->parent; } // All things -CoreThing *CoreThing::allThings[256] = {nullptr}; +CoreThing *CoreThing::allThings[THING_STORE_SIZE] = {nullptr}; CoreThing *CoreThing::Get(unsigned char networkId, unsigned char thingId) { - for (unsigned char ix = 0; ix < 256; ix++) { + for (uint16_t ix = 0; ix < THING_STORE_SIZE; ix++) { CoreThing *thing = allThings[ix]; if (thing == nullptr) continue; @@ -34,13 +38,27 @@ CoreThing *CoreThing::Get(unsigned char networkId, unsigned char thingId) { } int CoreThing::Add(CoreThing *newThing) { - for (unsigned char ix = 0; ix < 256; ix++) { + for (uint16_t ix = 0; ix < THING_STORE_SIZE; ix++) { CoreThing *thing = allThings[ix]; if (thing == nullptr) { allThings[ix] = newThing; + // std::cout << " Add new thing " << (int)ix << "\n"; return ix; } } return -1; +} + +void CoreThing::Remove(CoreThing *thing) { allThings[thing->id] = nullptr; } + +void CoreThing::UpdateAll(unsigned long currentTimeMs) { + // Not very efficient, but it works for now. + for (uint16_t ix = 0; ix < THING_STORE_SIZE; ix++) { + CoreThing *thing = allThings[ix]; + if (thing != nullptr && + thing->parent == nullptr) { // update all root things + thing->Update(currentTimeMs); + } + } } \ No newline at end of file diff --git a/CoreThing.h b/CoreThing.h index 0ab5d05..bf441b4 100644 --- a/CoreThing.h +++ b/CoreThing.h @@ -1,19 +1,25 @@ #pragma once +#include namespace Passer { namespace Control { +#define THING_STORE_SIZE 256 +// IMPORTANT: values higher than 256 will need to change the CoreThing::id type +// to 16-bit or higher, breaking the networking protocol! + class CoreThing { public: // Participant *client; unsigned char networkId; /// @char The id of the thing unsigned char id; - // CoreThing *parent; + CoreThing *parent; /// @brief The type of Thing unsigned char type; const char *name = nullptr; const char *modelUrl = nullptr; + float modelScale = 1; // protected Sensor sensor; /// @brief Basic Thing types @@ -36,20 +42,32 @@ public: public: CoreThing(unsigned char networkId = 0, unsigned char thingType = (unsigned char)Type::Undetermined); + /// @brief Terminated thins are no longer updated + void Terminate(); - void SetName(const char *name); + /// @brief Gets the parent Thing + /// @return The parent Thing + CoreThing *GetParent(); + + /// @brief Updates the state of the thing + /// @param currentTimeMs The current clock time in milliseconds + virtual void Update(unsigned long currentTimeMs) {}; virtual void SendBytes(unsigned char *buffer, unsigned char *ix) {}; - - // All things -private: - static CoreThing *allThings[]; - - static CoreThing *Get(unsigned char networkId, unsigned char thingId); - static int Add(CoreThing *thing); + virtual void ProcessBytes(unsigned char *bytes) {}; protected: virtual void Init(); + + //------------ All things +public: + static CoreThing *Get(unsigned char networkId, unsigned char thingId); + static int Add(CoreThing *thing); + static void Remove(CoreThing *thing); + static void UpdateAll(unsigned long currentTimeMs); + +private: + static CoreThing *allThings[]; }; } // namespace Control diff --git a/Messages.cpp b/Messages.cpp index 5278400..67e1269 100644 --- a/Messages.cpp +++ b/Messages.cpp @@ -26,7 +26,7 @@ unsigned char *IMessage::ReceiveMsg(unsigned char packetSize) { bool IMessage::Publish(Participant *participant) { return participant->PublishBuffer(Serialize(participant->buffer)); } -bool IMessage::Send(Participant *participant) { +bool IMessage::SendTo(Participant *participant) { return participant->SendBuffer(Serialize(participant->buffer)); } @@ -251,7 +251,6 @@ CustomMsg::CustomMsg(unsigned char networkId, CoreThing *thing) { this->thing = thing; } -#include unsigned char CustomMsg::Serialize(unsigned char *buffer) { unsigned char ix = this->length; this->thing->SendBytes(buffer, &ix); @@ -271,3 +270,21 @@ CustomMsg CustomMsg::Receive(unsigned char *buffer, unsigned char bufferSize) { // CustomMsg #pragma endregion + +#pragma region DestroyMsg + +DestroyMsg::DestroyMsg(unsigned char networkId, CoreThing *thing) { + this->networkId = networkId; + this->thingId = thing->id; +} + +unsigned char DestroyMsg::Serialize(unsigned char *buffer) { + unsigned char ix = 0; + buffer[ix++] = this->id; + buffer[ix++] = this->networkId; + buffer[ix++] = this->thingId; + return ix; +} + +// DestroyMsg +#pragma endregion diff --git a/Messages.h b/Messages.h index 18c8e9a..f45c3b0 100644 --- a/Messages.h +++ b/Messages.h @@ -18,7 +18,7 @@ public: static unsigned char *ReceiveMsg(unsigned char packetSize); bool Publish(Participant *participant); - bool Send(Participant *participant); + bool SendTo(Participant *participant); }; class ClientMsg : public IMessage { @@ -147,6 +147,18 @@ public: static CustomMsg Receive(unsigned char *buffer, unsigned char bufferSize); }; +class DestroyMsg : public IMessage { +public: + static const unsigned char id = 0x20; + static const unsigned length = 3; + unsigned char networkId; + unsigned char thingId; + + DestroyMsg(unsigned char networkId, CoreThing *thing); + + virtual unsigned char Serialize(unsigned char *buffer) override; +}; + } // namespace Control } // namespace Passer