#pragma once #include "Thing.h" namespace RoboidControl { constexpr int MAX_THING_COUNT = 256; class ParticipantRegistry { public: Participant* GetParticipant(const char* ipAddress, unsigned int port); Participant* GetParticipant(unsigned char participantId); Participant* AddParticipant(const char* ipAddress, unsigned int port); void AddParticipant(Participant* participant); void Remove(Participant* participant); const std::list& GetAll() const; private: #if defined(NO_STD) #else /// @brief The list of known participants std::list participants; #endif }; /// @brief A participant is a device which manages things. /// It can communicate with other participant to synchronise the state of /// things. This class is used to register the things the participant is /// managing. It also maintains the communcation information to contact the /// participant. It is used as a basis for the local participant, but also as a /// reference to remote participants. class Participant { public: /// @brief The Ip Address of a participant. const char* ipAddress = "0.0.0.0"; /// @brief The port number for UDP communication with the participant. unsigned int port = 0; /// @brief The network Id to identify the participant unsigned char networkId = 0; /// @brief Create a new participant with the given communcation info /// @param ipAddress The IP address of the participant /// @param port The UDP port of the participant Participant(const char* ipAddress, int port); /// @brief Destructor for the participant ~Participant(); public: #if defined(NO_STD) unsigned char thingCount = 0; Thing* things[MAX_THING_COUNT]; #else /// @brief The things managed by this participant std::list things; #endif /// @brief Find a thing managed by this participant /// @param thingId The ID of the thing /// @return The thing if found, nullptr when no thing has been found Thing* Get(unsigned char thingId); /// @brief Add a new thing for this participant. /// @param thing The thing to add /// @param checkId If true, the thing.id is regenerated if it is zero void Add(Thing* thing, bool checkId = true); /// @brief Remove a thing for this participant /// @param thing The thing to remove void Remove(Thing* thing); /// @brief Update all things for this participant /// @param currentTimeMs The current time in milliseconds (optional) virtual void Update(unsigned long currentTimeMs = 0); public: static ParticipantRegistry registry; }; } // namespace RoboidControl