252 lines
7.6 KiB
C++
252 lines
7.6 KiB
C++
#include "Participant.h"
|
|
|
|
#include <string.h>
|
|
#include "Arduino/ArduinoParticipant.h"
|
|
#include "EspIdf/EspIdfParticipant.h"
|
|
#include "Posix/PosixParticipant.h"
|
|
#include "Windows/WindowsParticipant.h"
|
|
|
|
namespace RoboidControl {
|
|
|
|
#pragma region Participant
|
|
|
|
Participant* Participant::LocalParticipant = new Participant();
|
|
|
|
void Participant::ReplaceLocalParticipant(Participant& newParticipant) {
|
|
LocalParticipant = &newParticipant;
|
|
std::cout << "Replaced local participant" << std::endl;
|
|
}
|
|
|
|
Participant::Participant() {
|
|
Thing::CreateRoot(this);
|
|
//this->Add(this->root);
|
|
}
|
|
|
|
/*
|
|
Participant::Participant(const char* ipAddress, int port) {
|
|
Thing::CreateRoot(this);
|
|
//this->Add(this->root);
|
|
|
|
// make a copy of the ip address string
|
|
int addressLength = (int)strlen(ipAddress);
|
|
int stringLength = addressLength + 1;
|
|
char* addressString = new char[stringLength];
|
|
#if defined(_WIN32) || defined(_WIN64)
|
|
strncpy_s(addressString, stringLength, ipAddress,
|
|
addressLength); // Leave space for null terminator
|
|
#else
|
|
strncpy(addressString, ipAddress, addressLength);
|
|
#endif
|
|
addressString[addressLength] = '\0';
|
|
|
|
this->ipAddress = addressString;
|
|
this->port = port;
|
|
}
|
|
*/
|
|
Participant::~Participant() {
|
|
// registry.Remove(this);
|
|
// delete[] this->ipAddress;
|
|
}
|
|
|
|
void Participant::Update(bool recurse) {
|
|
for (Thing* thing : this->things) {
|
|
if (thing != nullptr)
|
|
thing->Update();
|
|
}
|
|
}
|
|
|
|
bool Participant::Send(IMessage* msg) {
|
|
std::cout << "sending message " << (static_cast<int>(this->buffer[0]) & 0xff)
|
|
<< " to base Participant without communcation support " << std::endl;
|
|
|
|
return true;
|
|
}
|
|
/*
|
|
bool Participant::Send(IMessage* msg) {
|
|
int bufferSize = msg->Serialize(this->buffer);
|
|
if (bufferSize <= 0)
|
|
return true;
|
|
|
|
// std::cout << "send msg " << (static_cast<int>(this->buffer[0]) & 0xff)
|
|
// << " to " << this->ipAddress << std::endl;
|
|
|
|
#if defined(_WIN32) || defined(_WIN64)
|
|
Windows::ParticipantUDP* thisWindows =
|
|
static_cast<Windows::ParticipantUDP*>(this);
|
|
return thisWindows->SendTo(this, bufferSize);
|
|
#elif defined(__unix__) || defined(__APPLE__)
|
|
Posix::ParticipantUDP* thisPosix = static_cast<Posix::ParticipantUDP*>(this);
|
|
return thisPosix->SendTo(this, bufferSize);
|
|
#elif defined(ARDUINO)
|
|
Arduino::ParticipantUDP* thisArduino =
|
|
static_cast<Arduino::ParticipantUDP*>(this);
|
|
return thisArduino->SendTo(this, bufferSize);
|
|
#elif defined(IDF_VER)
|
|
EspIdf::ParticipantUDP* thisEspIdf =
|
|
static_cast<EspIdf::ParticipantUDP*>(this);
|
|
return thisEspIdf->SendTo(this, bufferSize);
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
*/
|
|
|
|
Thing* Participant::Get(unsigned char networkId, unsigned char thingId) {
|
|
for (Thing* thing : this->things) {
|
|
if (thing->owner->networkId == networkId && thing->id == thingId)
|
|
return thing;
|
|
}
|
|
std::cout << "Could not find thing " //<< this->ipAddress << ":" << this->port
|
|
<< "[" << (int)thingId << "]\n";
|
|
return nullptr;
|
|
}
|
|
|
|
void Participant::Add(Thing* thing, bool checkId) {
|
|
if (checkId && thing->id == 0) {
|
|
// allocate a new thing ID
|
|
#if defined(NO_STD)
|
|
thing->id = this->thingCount + 1;
|
|
this->things[this->thingCount++] = thing;
|
|
#else
|
|
// find highest id
|
|
int highestIx = 0;
|
|
for (Thing* thing : this->things) {
|
|
if (thing == nullptr)
|
|
continue;
|
|
if (thing->id > highestIx)
|
|
highestIx = thing->id;
|
|
}
|
|
thing->id = highestIx + 1;
|
|
this->things.push_back(thing);
|
|
#endif
|
|
std::cout << "Add thing with generated ID "
|
|
//<< this->ipAddress << ":" << this->port
|
|
<< "[" << (int)thing->id << "]\n";
|
|
} else {
|
|
Thing* foundThing = Get(thing->owner->networkId, thing->id);
|
|
if (foundThing == nullptr) {
|
|
#if defined(NO_STD)
|
|
this->things[this->thingCount++] = thing;
|
|
#else
|
|
this->things.push_back(thing);
|
|
#endif
|
|
std::cout << "Add thing " << //this->ipAddress << ":" << this->port <<
|
|
"["
|
|
<< (int)thing->id << "]\n";
|
|
} else {
|
|
std::cout << "Did not add, existing thing "
|
|
//<< this->ipAddress << ":" << this->port
|
|
<< "[" << (int)thing->id << "]\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
void Participant::Remove(Thing* thing) {
|
|
#if defined(NO_STD)
|
|
for (unsigned char thingIx = 0; thingIx < this->thingCount; thingIx++)
|
|
if (this->things[thingIx] == thing)
|
|
this->things[thingIx] = nullptr;
|
|
// compacting
|
|
unsigned char lastThingIx = 0;
|
|
for (unsigned char thingIx = 0; thingIx < this->thingCount; thingIx++) {
|
|
if (this->things[thingIx] == nullptr)
|
|
continue;
|
|
this->things[lastThingIx] = this->things[thingIx];
|
|
lastThingIx++;
|
|
}
|
|
this->thingCount = lastThingIx;
|
|
#else
|
|
this->things.remove_if([thing](Thing* obj) { return obj == thing; });
|
|
// std::cout << "Removing [" << (int)thing->networkId << "/" << (int)thing->id
|
|
// << "] list size = " << this->things.size() << "\n";
|
|
#endif
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
// #pragma region ParticipantRegistry
|
|
|
|
// /*
|
|
// Participant* ParticipantRegistry::Get(const char* ipAddress,
|
|
// unsigned int port) {
|
|
// #if !defined(NO_STD)
|
|
// for (Participant* participant : ParticipantRegistry::participants) {
|
|
// if (participant == nullptr)
|
|
// continue;
|
|
// if (strcmp(participant->ipAddress, ipAddress) == 0 &&
|
|
// participant->port == port) {
|
|
// // std::cout << "found participant " << participant->ipAddress << ":"
|
|
// // << (int)participant->port << std::endl;
|
|
// return participant;
|
|
// }
|
|
// }
|
|
// std::cout << "Could not find participant " << ipAddress << ":" << (int)port
|
|
// << std::endl;
|
|
// #endif
|
|
// return nullptr;
|
|
// }
|
|
// */
|
|
// Participant* ParticipantRegistry::Get(unsigned char participantId) {
|
|
// #if !defined(NO_STD)
|
|
// for (Participant* participant : ParticipantRegistry::participants) {
|
|
// if (participant == nullptr)
|
|
// continue;
|
|
// if (participant->networkId == participantId)
|
|
// return participant;
|
|
// }
|
|
// std::cout << "Could not find participant " << (int)participantId << std::endl;
|
|
// #endif
|
|
// return nullptr;
|
|
// }
|
|
|
|
// // Participant* ParticipantRegistry::Add(const char* ipAddress,
|
|
// // unsigned int port) {
|
|
// // Participant* participant = new Participant(ipAddress, port);
|
|
// // Add(participant);
|
|
// // return participant;
|
|
// // }
|
|
|
|
// void ParticipantRegistry::Add(Participant* participant) {
|
|
// Participant* foundParticipant =
|
|
// Get(participant->networkId);
|
|
// //Get(participant->ipAddress, participant->port);
|
|
|
|
// if (foundParticipant == nullptr) {
|
|
// #if defined(NO_STD)
|
|
// // this->things[this->thingCount++] = thing;
|
|
// #else
|
|
// ParticipantRegistry::participants.push_back(participant);
|
|
// #endif
|
|
// // std::cout << "Add participant " << participant->ipAddress << ":"
|
|
// // << participant->port << "[" << (int)participant->networkId
|
|
// // << "]\n";
|
|
// // std::cout << "participants " <<
|
|
// // ParticipantRegistry::participants.size()
|
|
// // << "\n";
|
|
// // } else {
|
|
// // std::cout << "Did not add, existing participant " <<
|
|
// // participant->ipAddress
|
|
// // << ":" << participant->port << "[" <<
|
|
// // (int)participant->networkId
|
|
// // << "]\n";
|
|
// }
|
|
// }
|
|
|
|
// void ParticipantRegistry::Remove(Participant* participant) {
|
|
// // participants.remove(participant);
|
|
// }
|
|
|
|
// #if defined(NO_STD)
|
|
// Participant** ParticipantRegistry::GetAll() const {
|
|
// return ParticipantRegistry::participants;
|
|
// }
|
|
// #else
|
|
// const std::list<Participant*>& ParticipantRegistry::GetAll() const {
|
|
// return ParticipantRegistry::participants;
|
|
// }
|
|
// #endif
|
|
|
|
// #pragma endregion ParticipantRegistry
|
|
|
|
} // namespace RoboidControl
|