RoboidControl-cpp/NetworkSync.h

135 lines
4.9 KiB
C++

#pragma once
#include "NetworkPerception.h"
#include "Perception.h"
#include "Roboid.h"
#include "Types.h"
namespace Passer {
namespace RoboidControl {
/// @brief Interface for synchronizaing state between clients across a network
class NetworkSync {
public:
NetworkSync() {};
NetworkSync(Roboid* roboid);
unsigned char networkId = 0;
/// @brief Retreive and send the roboid state
/// @param roboid The roboid for which the state is updated
virtual void NetworkUpdate(Roboid* roboid) = 0;
/// @brief Inform that the given object is no longer being tracked
/// @param obj
virtual void SendDestroyThing(InterestingThing* obj);
virtual void NewObject(InterestingThing* obj);
void SendName(Roboid* roboid);
virtual void SendModel(Roboid* obj);
void SendModel(Thing* thing);
/// @brief The id of a Pose message
static const unsigned char PoseMsg = 0x10;
static const unsigned char PoseTypeMsg = 0x11;
static const unsigned char RelativePoseMsg = 0x12;
static const unsigned char StateMsg = 0x18;
/// @brief A bit pattern for the pose, stating that this message contains a
/// position in world coordinates
static const unsigned char Pose_Position = 0x01;
/// @brief A bit pattern for the pose, stating that this message contains an
/// orientation in world coordinates
static const unsigned char Pose_Orientation = 0x02;
/// @brief A bit pattern for the pose, stating that this messsage contains a
/// linear velocity in world coordinates
static const unsigned char Pose_LinearVelocity = 0x04;
/// @brief A bit pattern for the pose, stating that this message contains an
/// angular velocity in world coordinates
static const char Pose_AngularVelocity = 0x08;
static const unsigned char DestroyMsg = 0x20;
static const unsigned char AngVelocity2DMsg = 0x46;
static const unsigned char Position2DMsg = 0x61;
static const unsigned char Velocity2DMsg = 0x62;
static const unsigned char CreateMsg = 0x80;
static const unsigned char InvestigateMsg = 0x81;
static const unsigned char ModelMsg = 0x90;
static const unsigned char NameMsg = 0x91;
static const unsigned char DeviceMsg = 0xA0;
static const unsigned char NetworkIdMsg = 0xA1;
typedef void (*Buffer)(UInt8* buffer, UInt16 bufferSize);
void ReceiveMessage(Roboid* roboid, unsigned char bytecount);
void ReceiveNetworkId();
void PublishState(Roboid* roboid);
void SendInvestigate(InterestingThing* thing);
void SendPoseMsg(Buffer sendBuffer, Roboid* roboid);
// void SendDestroyThing(Buffer sendBuffer, InterestingThing* obj);
// void PublishNewObject();
void PublishRelativeThing(Thing* thing, bool recurse = false);
void PublishPerception(Roboid* roboid);
void PublishTrackedObjects(Roboid* roboid, InterestingThing** objects);
virtual void SendPosition(Spherical16 worldPosition) {};
virtual void SendPose(Spherical16 worldPosition,
SwingTwist16 worldOrientation) {};
// void SendPose(Roboid* roboid, bool recurse = true);
void SendPose(Thing* thing, bool recurse = true);
virtual void SendText(const char* s);
void SendInt(const int x);
protected:
Roboid* roboid;
NetworkPerception* networkPerception;
void PublishState(Sensor* sensor);
void PublishTrackedObject(Roboid* roboid, InterestingThing* object);
// void PublishRelativeObject(Buffer sendBuffer,
// UInt8 parentId,
// InterestingThing* object);
void SendSingle100(unsigned char* data, unsigned int startIndex, float value);
void SendFloat16(unsigned char* data, unsigned char* startIndex, float value);
void SendInt32(unsigned char* data, unsigned int startIndex, Int32 value);
void SendAngle8(unsigned char* data,
unsigned int startIndex,
const float value);
// void SendAngle16(unsigned char *data, unsigned int startIndex,
// const float value);
// void SendAngle32(unsigned char *data, unsigned int startIndex,
// const float value);
void SendVector3(unsigned char* data,
unsigned char* startIndex,
const Vector3 v);
void SendQuaternion(unsigned char* data,
const int startIndex,
const Quaternion q);
void SendPolar(unsigned char* data, unsigned char* startIndex, Polar p);
void SendSpherical16(unsigned char* data,
unsigned char* startIndex,
Spherical16 s);
void SendSwingTwist(unsigned char* data,
unsigned char* startIndex,
const SwingTwist16 r);
void SendQuat32(unsigned char* data,
unsigned char* startIndex,
const Quaternion q);
unsigned char buffer[256];
virtual void SendBuffer(unsigned char bufferSize);
virtual void PublishBuffer(unsigned char bufferSize);
void PublishDevice();
};
} // namespace RoboidControl
} // namespace Passer