RoboidControl-cpp/Participant.h
2025-02-21 15:49:14 +01:00

108 lines
2.9 KiB
C++

#pragma once
//#include "Messages/"
#include "Messages/ParticipantMsg.h"
#include "Messages/BinaryMsg.h"
#include "Messages/InvestigateMsg.h"
#include "Messages/ModelUrlMsg.h"
#include "Messages/NameMsg.h"
#include "Messages/NetworkIdMsg.h"
#include "Messages/PoseMsg.h"
#include "Messages/ThingMsg.h"
#include "RemoteParticipant.h"
#include <list>
#if defined(_WIN32) || defined(_WIN64)
#include <winsock2.h>
#elif defined(__unix__) || defined(__APPLE__)
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#elif defined(ARDUINO)
#include <WiFiUdp.h>
#endif
namespace Passer {
namespace RoboidControl {
/// @brief A participant is device which can communicate with other participants
class Participant : public RemoteParticipant {
public:
char buffer[1024];
long publishInterval = 3000; // 3 seconds
// unsigned char networkId = 0;
const char *name = "Participant";
// const char *ipAddress = "0.0.0.0";
// int port = 0;
int localPort = 0;
#if defined(ARDUINO)
const char *remoteIpAddress = nullptr;
unsigned short remotePort = 0;
char *broadcastIpAddress = nullptr;
WiFiUDP udp;
#else
#if defined(_WIN32) || defined(_WIN64)
SOCKET sock;
#elif defined(__unix__) || defined(__APPLE__)
int sock;
#endif
sockaddr_in remote_addr;
sockaddr_in server_addr;
sockaddr_in broadcast_addr;
#endif
Participant();
Participant(int port);
Participant(const char *ipAddress, int port);
void begin();
bool connected = false;
virtual void Update(unsigned long currentTimeMs = 0);
// std::list<Thing *> things;
// Thing *Get(unsigned char networkId, unsigned char thingId);
// int Add(Thing *thing);
// void Remove(Thing *thing);
// void UpdateAll(unsigned long currentTimeMs);
void SendThingInfo(RemoteParticipant* remoteParticipant, Thing *thing);
void PublishThingInfo(Thing *thing);
bool Send(RemoteParticipant* remoteParticipant, IMessage *msg);
bool Publish(IMessage *msg);
void ReceiveData(unsigned char bufferSize, RemoteParticipant *remoteParticipant);
protected:
std::list<Participant *> senders;
unsigned long nextPublishMe = 0;
void SetupUDP(int localPort, const char *remoteIpAddress, int remotePort);
Participant *GetParticipant(const char *ipAddress, int port);
Participant *AddParticipant(const char *ipAddress, int port);
void ReceiveUDP();
virtual void Process(RemoteParticipant *sender, ParticipantMsg *msg);
virtual void Process(RemoteParticipant *sender, NetworkIdMsg *msg);
virtual void Process(RemoteParticipant* sender, InvestigateMsg *msg);
virtual void Process(RemoteParticipant* sender, ThingMsg *msg);
virtual void Process(RemoteParticipant* sender, NameMsg *msg);
virtual void Process(RemoteParticipant* sender, PoseMsg *msg);
virtual void Process(RemoteParticipant* sender, BinaryMsg *msg);
};
} // namespace Control
} // namespace Passer
using namespace Passer::RoboidControl;