Hidden participant support
This commit is contained in:
parent
f2f942d084
commit
876ae441b4
@ -29,9 +29,9 @@ LocalParticipant::LocalParticipant(int port) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LocalParticipant::LocalParticipant(const char* ipAddress, int port) {
|
LocalParticipant::LocalParticipant(const char* ipAddress, int port) {
|
||||||
this->ipAddress = ipAddress; // maybe this is not needed anymore, keeping it to "0.0.0.0"
|
this->ipAddress = "0.0.0.0"; //ipAddress; // maybe this is not needed anymore, keeping it to "0.0.0.0"
|
||||||
this->port = port;
|
this->port = port;
|
||||||
this->site = new Participant(ipAddress, port);
|
this->remoteSite = new Participant(ipAddress, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalParticipant::begin() {
|
void LocalParticipant::begin() {
|
||||||
@ -68,10 +68,10 @@ void LocalParticipant::Update(unsigned long currentTimeMs) {
|
|||||||
|
|
||||||
if (this->publishInterval > 0 && currentTimeMs > this->nextPublishMe) {
|
if (this->publishInterval > 0 && currentTimeMs > this->nextPublishMe) {
|
||||||
ParticipantMsg* msg = new ParticipantMsg(this->networkId);
|
ParticipantMsg* msg = new ParticipantMsg(this->networkId);
|
||||||
if (this->site == nullptr)
|
if (this->remoteSite == nullptr)
|
||||||
this->Publish(msg);
|
this->Publish(msg);
|
||||||
else
|
else
|
||||||
this->Send(this->site, msg);
|
this->Send(this->remoteSite, msg);
|
||||||
delete msg;
|
delete msg;
|
||||||
|
|
||||||
this->nextPublishMe = currentTimeMs + this->publishInterval;
|
this->nextPublishMe = currentTimeMs + this->publishInterval;
|
||||||
|
@ -34,7 +34,7 @@ class LocalParticipant : public Participant {
|
|||||||
const char* name = "LocalParticipant";
|
const char* name = "LocalParticipant";
|
||||||
|
|
||||||
// int localPort = 0;
|
// int localPort = 0;
|
||||||
Participant* site = nullptr;
|
Participant* remoteSite = nullptr;
|
||||||
|
|
||||||
#if defined(ARDUINO)
|
#if defined(ARDUINO)
|
||||||
const char* remoteIpAddress = nullptr;
|
const char* remoteIpAddress = nullptr;
|
||||||
|
28
Thing.cpp
28
Thing.cpp
@ -4,13 +4,25 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
#include "LocalParticipant.h"
|
#include "LocalParticipant.h"
|
||||||
|
|
||||||
namespace RoboidControl {
|
namespace RoboidControl {
|
||||||
|
static LocalParticipant* hiddenParticipant = nullptr;
|
||||||
|
|
||||||
|
LocalParticipant* Thing::CheckHiddenParticipant() {
|
||||||
|
if (hiddenParticipant == nullptr)
|
||||||
|
hiddenParticipant = new LocalParticipant(0);
|
||||||
|
return hiddenParticipant;
|
||||||
|
}
|
||||||
|
|
||||||
|
Thing::Thing(int thingType) : Thing(CheckHiddenParticipant(), thingType) {
|
||||||
|
}
|
||||||
|
|
||||||
Thing::Thing(Participant* owner, Type thingType) : Thing(owner, (unsigned char)thingType) {}
|
Thing::Thing(Participant* owner, Type thingType) : Thing(owner, (unsigned char)thingType) {}
|
||||||
|
|
||||||
Thing::Thing(Participant* owner, unsigned char thingType) {
|
Thing::Thing(Participant* owner, int thingType) {
|
||||||
this->participant = owner;
|
this->participant = owner;
|
||||||
this->id = 0;
|
this->id = 0;
|
||||||
this->type = thingType;
|
this->type = thingType;
|
||||||
@ -153,6 +165,13 @@ void Thing::SetModel(const char* url) {
|
|||||||
this->modelUrl = url;
|
this->modelUrl = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long Thing::GetTimeMs() {
|
||||||
|
auto now = std::chrono::steady_clock::now();
|
||||||
|
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
|
now.time_since_epoch());
|
||||||
|
return static_cast<unsigned long>(ms.count());
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(ARDUINO)
|
#if defined(ARDUINO)
|
||||||
void Thing::Update() {
|
void Thing::Update() {
|
||||||
Update(millis());
|
Update(millis());
|
||||||
@ -168,6 +187,13 @@ void Thing::Update(unsigned long currentTimeMs) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Thing::UpdateThings(unsigned long currentTimeMs) {
|
||||||
|
if (hiddenParticipant == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
hiddenParticipant->Update(currentTimeMs);
|
||||||
|
}
|
||||||
|
|
||||||
void Thing::GenerateBinary(char* buffer, unsigned char* ix) {
|
void Thing::GenerateBinary(char* buffer, unsigned char* ix) {
|
||||||
(void)buffer;
|
(void)buffer;
|
||||||
(void)ix;
|
(void)ix;
|
||||||
|
37
Thing.h
37
Thing.h
@ -7,6 +7,7 @@
|
|||||||
namespace RoboidControl {
|
namespace RoboidControl {
|
||||||
|
|
||||||
class Participant;
|
class Participant;
|
||||||
|
class LocalParticipant;
|
||||||
|
|
||||||
#define THING_STORE_SIZE 256
|
#define THING_STORE_SIZE 256
|
||||||
// IMPORTANT: values higher than 256 will need to change the Thing::id type
|
// IMPORTANT: values higher than 256 will need to change the Thing::id type
|
||||||
@ -15,13 +16,8 @@ class Participant;
|
|||||||
/// @brief A thing is the primitive building block
|
/// @brief A thing is the primitive building block
|
||||||
class Thing {
|
class Thing {
|
||||||
public:
|
public:
|
||||||
Participant* participant; // -> owner
|
|
||||||
unsigned char networkId = 0;
|
|
||||||
/// @brief The ID of the thing
|
|
||||||
unsigned char id = 0;
|
|
||||||
|
|
||||||
/// @brief Predefined thing types
|
/// @brief Predefined thing types
|
||||||
enum class Type {
|
enum Type {
|
||||||
Undetermined,
|
Undetermined,
|
||||||
// Sensor,
|
// Sensor,
|
||||||
Switch,
|
Switch,
|
||||||
@ -38,24 +34,34 @@ class Thing {
|
|||||||
Humanoid,
|
Humanoid,
|
||||||
ExternalSensor,
|
ExternalSensor,
|
||||||
};
|
};
|
||||||
/// @brief The type of Thing
|
|
||||||
unsigned char type = 0;
|
|
||||||
|
|
||||||
|
/// @brief Create a new thing using an implicit local participant
|
||||||
|
/// @param thingType The type of thing
|
||||||
|
Thing(int thingType = Type::Undetermined);
|
||||||
/// @brief Create a new thing of the given type
|
/// @brief Create a new thing of the given type
|
||||||
/// @param thingType The predefined type of thing
|
/// @param thingType The predefined type of thing
|
||||||
Thing(Participant* participant, Type thingType = Type::Undetermined);
|
Thing(Participant* participant, Type thingType = Type::Undetermined);
|
||||||
/// @brief Create a new thing of the give type
|
/// @brief Create a new thing of the give type
|
||||||
/// @param thingType The custom type of the thing
|
/// @param thingType The custom type of the thing
|
||||||
Thing(Participant* participant, unsigned char thingType);
|
Thing(Participant* participant, int thingType);
|
||||||
/// @brief Create a new thing for the given participant
|
/// @brief Create a new thing for the given participant
|
||||||
/// @param participant The participant for which this thing is created
|
/// @param participant The participant for which this thing is created
|
||||||
/// @param networkId The network ID of the thing
|
/// @param networkId The network ID of the thing
|
||||||
/// @param thingId The ID of the thing
|
/// @param thingId The ID of the thing
|
||||||
/// @param thingType The type of thing
|
/// @param thingType The type of thing
|
||||||
Thing(Participant* participant,
|
Thing(Participant* participant, unsigned char networkId, unsigned char thingId, Type thingType = Type::Undetermined);
|
||||||
unsigned char networkId,
|
|
||||||
unsigned char thingId,
|
private:
|
||||||
Type thingType = Type::Undetermined);
|
LocalParticipant* CheckHiddenParticipant();
|
||||||
|
|
||||||
|
public:
|
||||||
|
Participant* participant; // -> owner
|
||||||
|
unsigned char networkId = 0;
|
||||||
|
/// @brief The ID of the thing
|
||||||
|
unsigned char id = 0;
|
||||||
|
|
||||||
|
/// @brief The type of Thing
|
||||||
|
unsigned char type = 0;
|
||||||
|
|
||||||
/// @brief Find a thing by name
|
/// @brief Find a thing by name
|
||||||
/// @param name Rhe name of the thing
|
/// @param name Rhe name of the thing
|
||||||
@ -165,13 +171,16 @@ class Thing {
|
|||||||
/// the only official supported model format is .obj
|
/// the only official supported model format is .obj
|
||||||
void SetModel(const char* url);
|
void SetModel(const char* url);
|
||||||
|
|
||||||
|
static unsigned long GetTimeMs();
|
||||||
#if defined(ARDUINO)
|
#if defined(ARDUINO)
|
||||||
void Update();
|
void Update();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// @brief Updates the state of the thing
|
/// @brief Updates the state of the thing
|
||||||
/// @param currentTimeMs The current clock time in milliseconds
|
/// @param currentTimeMs The current clock time in milliseconds
|
||||||
virtual void Update(unsigned long currentTimeMs); // { (void)currentTimeMs; };
|
virtual void Update(unsigned long currentTimeMs); // { (void)currentTimeMs; };
|
||||||
|
|
||||||
|
static void UpdateThings(unsigned long currentTimeMs);
|
||||||
|
|
||||||
/// @brief Function used to generate binary data for this thing
|
/// @brief Function used to generate binary data for this thing
|
||||||
/// @param buffer The byte array for thw binary data
|
/// @param buffer The byte array for thw binary data
|
||||||
|
114
test/participant_test.cc
Normal file
114
test/participant_test.cc
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
#if GTEST
|
||||||
|
|
||||||
|
// #include <gmock/gmock.h>
|
||||||
|
// not supported using Visual Studio 2022 compiler...
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <thread>
|
||||||
|
// #include <ws2tcpip.h>
|
||||||
|
|
||||||
|
#include "Participant.h"
|
||||||
|
#include "SiteServer.h"
|
||||||
|
#include "Thing.h"
|
||||||
|
|
||||||
|
using namespace RoboidControl;
|
||||||
|
|
||||||
|
// Function to get the current time in milliseconds as unsigned long
|
||||||
|
unsigned long get_time_ms() {
|
||||||
|
auto now = std::chrono::steady_clock::now();
|
||||||
|
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
|
now.time_since_epoch());
|
||||||
|
return static_cast<unsigned long>(ms.count());
|
||||||
|
}
|
||||||
|
|
||||||
|
// class RoboidControlSuite : public ::testing::test {
|
||||||
|
// TEST_F(RoboidControlSuite, HiddenParticipant) {
|
||||||
|
// Thing thing = Thing();
|
||||||
|
|
||||||
|
// unsigned long milliseconds = get_time_ms();
|
||||||
|
// unsigned long startTime = milliseconds;
|
||||||
|
// while (milliseconds < startTime + 1000) {
|
||||||
|
// Thing.Update(milliseconds);
|
||||||
|
|
||||||
|
// milliseconds = get_time_ms();
|
||||||
|
// }
|
||||||
|
// ASSERT_EQ(1, 1);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
class ParticipantSuite : public ::testing::Test {
|
||||||
|
protected:
|
||||||
|
// SetUp and TearDown can be used to set up and clean up before/after each
|
||||||
|
// test
|
||||||
|
void SetUp() override {
|
||||||
|
// Initialize test data here
|
||||||
|
}
|
||||||
|
|
||||||
|
void TearDown() override {
|
||||||
|
// Clean up test data here
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TEST_F(ParticipantSuite, LocalParticipant) {
|
||||||
|
LocalParticipant* participant = new LocalParticipant("127.0.0.1", 7681);
|
||||||
|
|
||||||
|
unsigned long milliseconds = get_time_ms();
|
||||||
|
unsigned long startTime = milliseconds;
|
||||||
|
while (milliseconds < startTime + 1000) {
|
||||||
|
participant->Update(milliseconds);
|
||||||
|
|
||||||
|
milliseconds = get_time_ms();
|
||||||
|
}
|
||||||
|
ASSERT_EQ(1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ParticipantSuite, SiteServer) {
|
||||||
|
SiteServer site = SiteServer(7681);
|
||||||
|
|
||||||
|
unsigned long milliseconds = get_time_ms();
|
||||||
|
unsigned long startTime = milliseconds;
|
||||||
|
while (milliseconds < startTime + 1000) {
|
||||||
|
site.Update(milliseconds);
|
||||||
|
|
||||||
|
milliseconds = get_time_ms();
|
||||||
|
}
|
||||||
|
ASSERT_EQ(1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ParticipantSuite, SiteParticipant) {
|
||||||
|
SiteServer site = SiteServer(7681);
|
||||||
|
LocalParticipant participant = LocalParticipant("127.0.0.1", 7681);
|
||||||
|
|
||||||
|
unsigned long milliseconds = get_time_ms();
|
||||||
|
unsigned long startTime = milliseconds;
|
||||||
|
while (milliseconds < startTime + 1000) {
|
||||||
|
site.Update(milliseconds);
|
||||||
|
participant.Update(milliseconds);
|
||||||
|
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
|
milliseconds = get_time_ms();
|
||||||
|
}
|
||||||
|
ASSERT_EQ(1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ParticipantSuite, Thing) {
|
||||||
|
SiteServer site = SiteServer(7681);
|
||||||
|
LocalParticipant participant = LocalParticipant("127.0.0.1", 7681);
|
||||||
|
Thing thing = Thing(&participant);
|
||||||
|
|
||||||
|
unsigned long milliseconds = get_time_ms();
|
||||||
|
unsigned long startTime = milliseconds;
|
||||||
|
while (milliseconds < startTime + 1000) {
|
||||||
|
site.Update(milliseconds);
|
||||||
|
participant.Update(milliseconds);
|
||||||
|
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
|
milliseconds = get_time_ms();
|
||||||
|
}
|
||||||
|
ASSERT_EQ(1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -1,43 +0,0 @@
|
|||||||
#if GTEST
|
|
||||||
|
|
||||||
// #include <gmock/gmock.h>
|
|
||||||
// not supported using Visual Studio 2022 compiler...
|
|
||||||
#include <gtest/gtest.h>
|
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
|
|
||||||
#include "Participant.h"
|
|
||||||
#include "Thing.h"
|
|
||||||
|
|
||||||
using namespace RoboidControl;
|
|
||||||
|
|
||||||
class ControlCoreSuite2 : public ::testing::Test {
|
|
||||||
protected:
|
|
||||||
// SetUp and TearDown can be used to set up and clean up before/after each
|
|
||||||
// test
|
|
||||||
void SetUp() override {
|
|
||||||
// Initialize test data here
|
|
||||||
}
|
|
||||||
|
|
||||||
void TearDown() override {
|
|
||||||
// Clean up test data here
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(ControlCoreSuite2, Dummytest2) {
|
|
||||||
LocalParticipant participant = LocalParticipant("127.0.0.1", 7681);
|
|
||||||
ASSERT_EQ(1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ControlCoreSuite2, Basic2) {
|
|
||||||
// Thing t = Thing();
|
|
||||||
|
|
||||||
// unsigned long milliseconds = (unsigned long)std::chrono::steady_clock::now()
|
|
||||||
// .time_since_epoch()
|
|
||||||
// .count();
|
|
||||||
|
|
||||||
// // Thing::UpdateAll(milliseconds);
|
|
||||||
// t.Update(milliseconds);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -4,94 +4,25 @@
|
|||||||
// not supported using Visual Studio 2022 compiler...
|
// not supported using Visual Studio 2022 compiler...
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include <chrono>
|
// #include <chrono>
|
||||||
#include <thread>
|
// #include <thread>
|
||||||
// #include <ws2tcpip.h>
|
|
||||||
|
|
||||||
#include "Participant.h"
|
|
||||||
#include "SiteServer.h"
|
|
||||||
#include "Thing.h"
|
#include "Thing.h"
|
||||||
|
|
||||||
using namespace RoboidControl;
|
using namespace RoboidControl;
|
||||||
|
|
||||||
// Function to get the current time in milliseconds as unsigned long
|
TEST(RoboidControlSuite, LocalParticipant) {
|
||||||
unsigned long get_time_ms() {
|
Thing* thing = new Thing();
|
||||||
auto now = std::chrono::steady_clock::now();
|
|
||||||
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
|
||||||
now.time_since_epoch());
|
|
||||||
return static_cast<unsigned long>(ms.count());
|
|
||||||
}
|
|
||||||
|
|
||||||
class ControlCoreSuite : public ::testing::Test {
|
unsigned long milliseconds = Thing::GetTimeMs();
|
||||||
protected:
|
|
||||||
// SetUp and TearDown can be used to set up and clean up before/after each
|
|
||||||
// test
|
|
||||||
void SetUp() override {
|
|
||||||
// Initialize test data here
|
|
||||||
}
|
|
||||||
|
|
||||||
void TearDown() override {
|
|
||||||
// Clean up test data here
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(ControlCoreSuite, LocalParticipant) {
|
|
||||||
LocalParticipant participant = LocalParticipant("127.0.0.1", 7681);
|
|
||||||
|
|
||||||
unsigned long milliseconds = get_time_ms();
|
|
||||||
unsigned long startTime = milliseconds;
|
unsigned long startTime = milliseconds;
|
||||||
while (milliseconds < startTime + 1000) {
|
while (milliseconds < startTime + 1000) {
|
||||||
participant.Update(milliseconds);
|
Thing::UpdateThings(milliseconds);
|
||||||
|
|
||||||
milliseconds = get_time_ms();
|
milliseconds = Thing::GetTimeMs();
|
||||||
}
|
}
|
||||||
ASSERT_EQ(1, 1);
|
SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ControlCoreSuite, SiteServer) {
|
|
||||||
SiteServer site = SiteServer(7681);
|
|
||||||
|
|
||||||
unsigned long milliseconds = get_time_ms();
|
|
||||||
unsigned long startTime = milliseconds;
|
|
||||||
while (milliseconds < startTime + 1000) {
|
|
||||||
site.Update(milliseconds);
|
|
||||||
|
|
||||||
milliseconds = get_time_ms();
|
|
||||||
}
|
|
||||||
ASSERT_EQ(1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ControlCoreSuite, SiteParticipant) {
|
|
||||||
SiteServer site = SiteServer(7681);
|
|
||||||
LocalParticipant participant = LocalParticipant("127.0.0.1", 7681);
|
|
||||||
|
|
||||||
unsigned long milliseconds = get_time_ms();
|
|
||||||
unsigned long startTime = milliseconds;
|
|
||||||
while (milliseconds < startTime + 1000) {
|
|
||||||
site.Update(milliseconds);
|
|
||||||
participant.Update(milliseconds);
|
|
||||||
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
||||||
milliseconds = get_time_ms();
|
|
||||||
}
|
|
||||||
ASSERT_EQ(1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ControlCoreSuite, Thing) {
|
|
||||||
SiteServer site = SiteServer(7681);
|
|
||||||
LocalParticipant participant = LocalParticipant("127.0.0.1", 7681);
|
|
||||||
Thing thing = Thing(&participant);
|
|
||||||
|
|
||||||
unsigned long milliseconds = get_time_ms();
|
|
||||||
unsigned long startTime = milliseconds;
|
|
||||||
while (milliseconds < startTime + 1000) {
|
|
||||||
site.Update(milliseconds);
|
|
||||||
participant.Update(milliseconds);
|
|
||||||
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
||||||
milliseconds = get_time_ms();
|
|
||||||
}
|
|
||||||
ASSERT_EQ(1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user