From 794b1ca80ebde95ff1799234b4ead7b14073d414 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 1 May 2025 11:01:40 +0200 Subject: [PATCH] Aligned Messages --- DoxyGen/DoxyWarnLogfile.txt | 216 +++++++++++-------- RoboidControl/Messages/BinaryMsg.py | 35 ++- RoboidControl/Messages/DestroyMsg.py | 47 ++++ RoboidControl/Messages/IMessage.py | 8 +- RoboidControl/Messages/InvestigateMsg.py | 44 +++- RoboidControl/Messages/LowLevelMessages.py | 72 +++---- RoboidControl/Messages/ModelUrlMsg.py | 53 +++-- RoboidControl/Messages/NameMsg.py | 39 +++- RoboidControl/Messages/NetworkIdMsg.py | 23 +- RoboidControl/Messages/PoseMsg.py | 69 ++++-- RoboidControl/Messages/TextMsg.py | 54 +++++ RoboidControl/Messages/ThingMsg.py | 25 ++- RoboidControl/Messages/__init__.py | 9 +- RoboidControl/Participant.py | 9 +- RoboidControl/Participants/ParticipantUDP.py | 52 +++-- RoboidControl/__init__.py | 5 +- 16 files changed, 544 insertions(+), 216 deletions(-) create mode 100644 RoboidControl/Messages/DestroyMsg.py create mode 100644 RoboidControl/Messages/TextMsg.py diff --git a/DoxyGen/DoxyWarnLogfile.txt b/DoxyGen/DoxyWarnLogfile.txt index b98ee3b..a1cea5e 100644 --- a/DoxyGen/DoxyWarnLogfile.txt +++ b/DoxyGen/DoxyWarnLogfile.txt @@ -1,6 +1,6 @@ warning: source 'images' is not a readable file or directory... skipping. -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:62: warning: @copybrief or @copydoc target 'Thing::Update' not found -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:46: warning: Found unknown command '@params' +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:77: warning: @copybrief or @copydoc target 'Thing::Update' not found +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:61: warning: Found unknown command '@params' d:/Python/RoboidControl/RoboidControl/LinearAlgebra/build/lib/LinearAlgebra/Direction.py:47: warning: Member FromVector3(Vector3 v) (function) of class LinearAlgebra.Direction.Direction is not documented. d:/Python/RoboidControl/RoboidControl/LinearAlgebra/build/lib/LinearAlgebra/Direction.py:100: warning: Member __repr__(self) (function) of class LinearAlgebra.Direction.Direction is not documented. d:/Python/RoboidControl/RoboidControl/LinearAlgebra/LinearAlgebra/Direction.py:47: warning: Member FromVector3(Vector3 v) (function) of class LinearAlgebra.Direction.Direction is not documented. @@ -78,99 +78,131 @@ d:/Python/RoboidControl/RoboidControl/LinearAlgebra/LinearAlgebra/SwingTwist.py: d:/Python/RoboidControl/RoboidControl/LinearAlgebra/LinearAlgebra/SwingTwist.py:29: warning: Member Radians(float horizontal, float vertical, float twist) (function) of class LinearAlgebra.SwingTwist.SwingTwist is not documented. d:/Python/RoboidControl/RoboidControl/LinearAlgebra/LinearAlgebra/SwingTwist.py:54: warning: Member FromQuaternion(Quaternion q) (function) of class LinearAlgebra.SwingTwist.SwingTwist is not documented. d:/Python/RoboidControl/RoboidControl/LinearAlgebra/LinearAlgebra/SwingTwist.py:90: warning: Member Angle(r1, r2) (function) of class LinearAlgebra.SwingTwist.SwingTwist is not documented. -d:/Python/RoboidControl/RoboidControl/Messages/NetworkIdMsg.py:14: warning: Member network_id (variable) of class RoboidControl.Messages.NetworkIdMsg.NetworkIdMsg is not documented. -d:/Python/RoboidControl/RoboidControl/Messages/NetworkIdMsg.py:7: warning: Member id (variable) of class RoboidControl.Messages.NetworkIdMsg.NetworkIdMsg is not documented. -d:/Python/RoboidControl/RoboidControl/Messages/NetworkIdMsg.py:8: warning: Member length (variable) of class RoboidControl.Messages.NetworkIdMsg.NetworkIdMsg is not documented. -d:/Python/RoboidControl/RoboidControl/Messages/ParticipantMsg.py:19: warning: Member network_id (variable) of class RoboidControl.Messages.ParticipantMsg.ParticipantMsg is not documented. -d:/Python/RoboidControl/RoboidControl/Participant.py:58: warning: argument 'The' of command @param is not found in the argument list of Participant::Update(self, currentTimeMs=0) -d:/Python/RoboidControl/RoboidControl/Participant.py:58: warning: The following parameter of RoboidControl.Participant.Participant.Update(self, currentTimeMs=0) is not documented: - parameter 'currentTimeMs' -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:68: warning: Member Isolated() (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:75: warning: Member GetParticipant(self, ip_address, port) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:85: warning: Member AddParticipant(self, ip_address, port) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:107: warning: Member UpdateMyThings(self, currentTimeMs) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:136: warning: Member SendThingInfo(self, owner, thing, bool recursively=False) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:148: warning: Member Send(self, owner, msg) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:157: warning: Member Publish(self, msg) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:170: warning: Member Receiver(self) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:186: warning: Member ReceiveData(self, data, sender) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:205: warning: Member ProcessParticipantMsg(self, sender, ParticipantMsg msg) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:208: warning: Member ProcessSiteIdMsg(self, sender, NetworkIdMsg msg) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:216: warning: Member ProcessInvestigateMsg(self, bytearray data) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:219: warning: Member ProcessThingMsg(self, ThingMsg msg) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:222: warning: Member ProcessNameMsg(self, NameMsg msg) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:225: warning: Member ProcessModelUrlMsg(self, ModelUrlMsg msg) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:228: warning: Member ProcessBinaryMsg(self, BinaryMsg msg) (function) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:46: warning: Member remote_site (variable) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:58: warning: Member publishInterval (variable) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:60: warning: Member udp_socket (variable) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:62: warning: Member port (variable) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:103: warning: Member nextPublishMe (variable) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:119: warning: Member network_id (variable) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:29: warning: Member buffer (variable) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:30: warning: Member nextPublishMe (variable) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:32: warning: Member thread (variable) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:33: warning: Member name (variable) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:34: warning: Member isolated_participant (variable) of class RoboidControl.ParticipantUDP.ParticipantUDP is not documented. -d:/Python/RoboidControl/RoboidControl/Participant.py:11: warning: The following parameter of RoboidControl.ParticipantUDP.ParticipantUDP.__init__(self, ip_address=7681, port=None, local_port=7681) is not documented: +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:92: warning: Member GetParticipant(self, str ip_address, int port) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:102: warning: Member AddParticipant(self, str ip_address, int port) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:128: warning: Member UpdateMyThings(self, int currentTimeMs) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:157: warning: Member SendThingInfo(self, Participant owner, 'Thing' thing, bool recursively=False) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:168: warning: Member PublishThingInfo(self, Thing thing) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:175: warning: Member Send(self, Participant owner, IMessage msg) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:184: warning: Member Publish(self, IMessage msg) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:197: warning: Member Receiver(self) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:213: warning: Member ReceiveData(self, bytes data, Participant sender) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:234: warning: Member ProcessParticipantMsg(self, Participant sender, ParticipantMsg msg) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:237: warning: Member ProcessSiteIdMsg(self, Participant sender, NetworkIdMsg msg) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:245: warning: Member ProcessInvestigateMsg(self, Participant sender, InvestigateMsg msg) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:248: warning: Member ProcessThingMsg(self, ThingMsg msg) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:251: warning: Member ProcessNameMsg(self, NameMsg msg) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:254: warning: Member ProcessModelUrlMsg(self, ModelUrlMsg msg) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:257: warning: Member ProcessPoseMsg(self, Participant sender, PoseMsg msg) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:277: warning: Member ProcessBinaryMsg(self, BinaryMsg msg) (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:83: warning: Member Isolated() (function) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:67: warning: Member is_isolated (variable) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:69: warning: Member remote_site (variable) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:74: warning: Member udp_socket (variable) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:76: warning: Member port (variable) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:78: warning: Member thread (variable) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:122: warning: Member nextPublishMe (variable) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:139: warning: Member network_id (variable) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:42: warning: Member name (variable) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:90: warning: Member isolated_participant (variable) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:126: warning: Member nextPublishMe (variable) of class ParticipantUDP.ParticipantUDP is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:51: warning: argument 'ipAddress' of command @param is not found in the argument list of ParticipantUDP::__init__(self, int port=7681, Optional[str] ip_address=None, int local_port=7681) +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:51: warning: argument 'localPort' of command @param is not found in the argument list of ParticipantUDP::__init__(self, int port=7681, Optional[str] ip_address=None, int local_port=7681) +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:51: warning: The following parameters of ParticipantUDP.ParticipantUDP.__init__(self, int port=7681, Optional[str] ip_address=None, int local_port=7681) are not documented: + parameter 'ip_address' parameter 'local_port' -d:/Python/RoboidControl/RoboidControl/ParticipantUDP.py:91: warning: argument 'The' of command @param is not found in the argument list of ParticipantUDP::Update(self, currentTimeMs=None) inherited from member Update at line 58 in file d:/Python/RoboidControl/RoboidControl/Participant.py -d:/Python/RoboidControl/RoboidControl/Participant.py:58: warning: The following parameter of RoboidControl.ParticipantUDP.ParticipantUDP.Update(self, currentTimeMs=None) is not documented: +d:/Python/RoboidControl/RoboidControl/Participants/ParticipantUDP.py:110: warning: argument 'The' of command @param is not found in the argument list of ParticipantUDP::Update(self, Optional[int] currentTimeMs=None) inherited from member Update at line 62 in file d:/Python/RoboidControl/RoboidControl/Participant.py +d:/Python/RoboidControl/RoboidControl/Participant.py:62: warning: The following parameter of ParticipantUDP.ParticipantUDP.Update(self, Optional[int] currentTimeMs=None) is not documented: parameter 'currentTimeMs' -d:/Python/RoboidControl/RoboidControl/Thing.py:113: warning: Member Update(self, currentTime, recurse=False) (function) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:125: warning: Member SetParent(self, parent) (function) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:134: warning: Member AddChild(self, child) (function) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:141: warning: Member RemoveChild(self, child) (function) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:144: warning: Member GenerateBinary(self, buffer, ix_ref) (function) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:147: warning: Member ProcessBinary(self, data) (function) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:58: warning: Member children (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:85: warning: Member position (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:86: warning: Member position_updated (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:92: warning: Member orientation (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:93: warning: Member orientation_updated (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:100: warning: Member linear_velocity_updated (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:102: warning: Member linear_velocity (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:109: warning: Member angular_velocity_updated (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:111: warning: Member angular_velocity (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:28: warning: Member Position (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:29: warning: Member Orientation (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:30: warning: Member LinearVelocity (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:31: warning: Member AngularVelocity (variable) of class RoboidControl.Thing.Thing is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:35: warning: argument 'thingId' of command @param is not found in the argument list of Thing::__init__(self, owner=None, parent=None, thing_type=Type.Undetermined, thing_id=0) -d:/Python/RoboidControl/RoboidControl/Thing.py:35: warning: The following parameter of RoboidControl.Thing.Thing.__init__(self, owner=None, parent=None, thing_type=Type.Undetermined, thing_id=0) is not documented: +d:/Python/RoboidControl/RoboidControl/Messages/DestroyMsg.py:23: warning: Member thing_id (variable) of class RoboidControl.Messages.DestroyMsg.DestroyMsg is not documented. +d:/Python/RoboidControl/RoboidControl/Messages/DestroyMsg.py:40: warning: Member network_id (variable) of class RoboidControl.Messages.DestroyMsg.DestroyMsg is not documented. +d:/Python/RoboidControl/RoboidControl/Messages/DestroyMsg.py:10: warning: Member id (variable) of class RoboidControl.Messages.DestroyMsg.DestroyMsg is not documented. +d:/Python/RoboidControl/RoboidControl/Messages/DestroyMsg.py:11: warning: Member length (variable) of class RoboidControl.Messages.DestroyMsg.DestroyMsg is not documented. +d:/Python/RoboidControl/RoboidControl/Messages/NetworkIdMsg.py:17: warning: Member network_id (variable) of class RoboidControl.Messages.NetworkIdMsg.NetworkIdMsg is not documented. +d:/Python/RoboidControl/RoboidControl/Messages/NetworkIdMsg.py:9: warning: Member id (variable) of class RoboidControl.Messages.NetworkIdMsg.NetworkIdMsg is not documented. +d:/Python/RoboidControl/RoboidControl/Messages/NetworkIdMsg.py:10: warning: Member length (variable) of class RoboidControl.Messages.NetworkIdMsg.NetworkIdMsg is not documented. +d:/Python/RoboidControl/RoboidControl/Messages/ParticipantMsg.py:19: warning: Member network_id (variable) of class RoboidControl.Messages.ParticipantMsg.ParticipantMsg is not documented. +d:/Python/RoboidControl/RoboidControl/Participant.py:84: warning: Member AddParticipant(Union[str, int] arg1, Optional[int] port) (function) of class RoboidControl.Participant.Participant is not documented. +d:/Python/RoboidControl/RoboidControl/Participant.py:70: warning: Member GetParticipant(Union[str, int] arg1, Optional[int] port) (function) of class RoboidControl.Participant.Participant is not documented. +d:/Python/RoboidControl/RoboidControl/Participant.py:64: warning: Member things (variable) of class RoboidControl.Participant.Participant is not documented. +d:/Python/RoboidControl/RoboidControl/Participant.py:67: warning: Member participants (variable) of class RoboidControl.Participant.Participant is not documented. +d:/Python/RoboidControl/RoboidControl/Participant.py:62: warning: argument 'The' of command @param is not found in the argument list of Participant::Update(self, int currentTimeMs=0) +d:/Python/RoboidControl/RoboidControl/Participant.py:62: warning: The following parameter of RoboidControl.Participant.Participant.Update(self, int currentTimeMs=0) is not documented: + parameter 'currentTimeMs' +d:/Python/RoboidControl/RoboidControl/Thing.py:57: warning: Member owner (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:109: warning: Member parent (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:168: warning: Member position (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:169: warning: Member position_updated (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:175: warning: Member orientation (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:176: warning: Member orientation_updated (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:183: warning: Member linear_velocity_updated (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:185: warning: Member linear_velocity (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:192: warning: Member angular_velocity_updated (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:194: warning: Member angular_velocity (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:31: warning: Member Position (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:32: warning: Member Orientation (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:33: warning: Member LinearVelocity (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:34: warning: Member AngularVelocity (variable) of class RoboidControl.Thing.Thing is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:40: warning: argument 'thingId' of command @param is not found in the argument list of Thing::__init__(self, Optional[ 'Participant'] owner=None, Optional[ 'Thing'] parent=None, int thing_type=Type.Undetermined, int thing_id=0) +d:/Python/RoboidControl/RoboidControl/Thing.py:40: warning: The following parameter of RoboidControl.Thing.Thing.__init__(self, Optional[ 'Participant'] owner=None, Optional[ 'Thing'] parent=None, int thing_type=Type.Undetermined, int thing_id=0) is not documented: parameter 'thing_id' -d:/Python/RoboidControl/RoboidControl/Thing.py:97: warning: argument 'linearVelocity' of command @param is not found in the argument list of Thing::SetLinearVelocity(self, linear_velocity) -d:/Python/RoboidControl/RoboidControl/Thing.py:97: warning: The following parameter of RoboidControl.Thing.Thing.SetLinearVelocity(self, linear_velocity) is not documented: +d:/Python/RoboidControl/RoboidControl/Thing.py:102: warning: argument 'The' of command @param is not found in the argument list of Thing::SetParent(self, Optional[ 'Thing'] parent) +d:/Python/RoboidControl/RoboidControl/Thing.py:102: warning: The following parameter of RoboidControl.Thing.Thing.SetParent(self, Optional[ 'Thing'] parent) is not documented: + parameter 'parent' +d:/Python/RoboidControl/RoboidControl/Thing.py:133: warning: argument 'id' of command @param is not found in the argument list of Thing::GetChild(self, int thing_id, bool recurse=False) +d:/Python/RoboidControl/RoboidControl/Thing.py:133: warning: The following parameter of RoboidControl.Thing.Thing.GetChild(self, int thing_id, bool recurse=False) is not documented: + parameter 'thing_id' +d:/Python/RoboidControl/RoboidControl/Thing.py:180: warning: argument 'linearVelocity' of command @param is not found in the argument list of Thing::SetLinearVelocity(self, Spherical linear_velocity) +d:/Python/RoboidControl/RoboidControl/Thing.py:180: warning: The following parameter of RoboidControl.Thing.Thing.SetLinearVelocity(self, Spherical linear_velocity) is not documented: parameter 'linear_velocity' -d:/Python/RoboidControl/RoboidControl/Thing.py:106: warning: argument 'angularVelocity' of command @param is not found in the argument list of Thing::SetAngularVelocity(self, angular_velocity) -d:/Python/RoboidControl/RoboidControl/Thing.py:106: warning: The following parameter of RoboidControl.Thing.Thing.SetAngularVelocity(self, angular_velocity) is not documented: +d:/Python/RoboidControl/RoboidControl/Thing.py:189: warning: argument 'angularVelocity' of command @param is not found in the argument list of Thing::SetAngularVelocity(self, Spherical angular_velocity) +d:/Python/RoboidControl/RoboidControl/Thing.py:189: warning: The following parameter of RoboidControl.Thing.Thing.SetAngularVelocity(self, Spherical angular_velocity) is not documented: parameter 'angular_velocity' -d:/Python/RoboidControl/RoboidControl/Thing.py:11: warning: Member Undetermined (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:13: warning: Member Switch (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:14: warning: Member DistanceSensor (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:15: warning: Member DirectionalSensor (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:16: warning: Member TemperatureSensor (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:17: warning: Member TouchSensor (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:19: warning: Member ControlledMotor (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:20: warning: Member UncontrolledMotor (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:21: warning: Member Servo (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:23: warning: Member Roboid (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:24: warning: Member Humanoid (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:25: warning: Member ExternalSensor (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Thing.py:26: warning: Member Animator (variable) of class RoboidControl.Thing.Thing.Type is not documented. -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:22: warning: Member SetDriveDimensions(self, wheel_diameter, wheel_separation) (function) of class RoboidControl.Things.DifferentialDrive.DifferentialDrive is not documented. -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:33: warning: Member SetMotors(self, wheel_left, wheel_right) (function) of class RoboidControl.Things.DifferentialDrive.DifferentialDrive is not documented. -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:46: warning: Found unknown command '@params' -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:62: warning: @copybrief or @copydoc target 'Thing::Update' not found -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:31: warning: Member wheel_left (variable) of class RoboidControl.Things.DifferentialDrive.DifferentialDrive is not documented. -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:31: warning: Member wheel_right (variable) of class RoboidControl.Things.DifferentialDrive.DifferentialDrive is not documented. -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:64: warning: Member angular_velocity_updated (variable) of class RoboidControl.Things.DifferentialDrive.DifferentialDrive is not documented. -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:46: warning: Found unknown command '@params' -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:47: warning: Found unknown command '@params' -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:62: warning: @copybrief or @copydoc target 'Thing::Update' not found -d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:63: warning: @copydetails or @copydoc target 'Thing::Update' not found -d:/Python/RoboidControl/RoboidControl/Participants/SiteServer.py:24: warning: Member ProcessParticipantMsg(self, sender, msg) (function) of class SiteServer.SiteServer is not documented. -d:/Python/RoboidControl/RoboidControl/Participants/SiteServer.py:29: warning: Member ProcessNetworkId(self, msg) (function) of class SiteServer.SiteServer is not documented. -d:/Python/RoboidControl/RoboidControl/Participants/SiteServer.py:21: warning: Member isolated (variable) of class SiteServer.SiteServer is not documented. -d:/Python/RoboidControl/RoboidControl/Participants/SiteServer.py:22: warning: Member publishInterval (variable) of class SiteServer.SiteServer is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:225: warning: argument 'buffer' of command @param is not found in the argument list of Thing::GenerateBinary(self, bytearray bytes, set[int] ix_ref) +d:/Python/RoboidControl/RoboidControl/Thing.py:225: warning: The following parameter of RoboidControl.Thing.Thing.GenerateBinary(self, bytearray bytes, set[int] ix_ref) is not documented: + parameter 'bytes' +d:/Python/RoboidControl/RoboidControl/Thing.py:233: warning: argument 'bytes' of command @param is not found in the argument list of Thing::ProcessBinary(self, bytes data) +d:/Python/RoboidControl/RoboidControl/Thing.py:233: warning: The following parameter of RoboidControl.Thing.Thing.ProcessBinary(self, bytes data) is not documented: + parameter 'data' +d:/Python/RoboidControl/RoboidControl/Thing.py:13: warning: Member Undetermined (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:15: warning: Member Switch (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:16: warning: Member DistanceSensor (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:17: warning: Member DirectionalSensor (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:18: warning: Member TemperatureSensor (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:19: warning: Member TouchSensor (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:21: warning: Member ControlledMotor (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:22: warning: Member UncontrolledMotor (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:23: warning: Member Servo (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:25: warning: Member Roboid (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:26: warning: Member Humanoid (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:27: warning: Member ExternalSensor (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:28: warning: Member Animator (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Thing.py:29: warning: Member DifferentialDrive (variable) of class RoboidControl.Thing.Thing.Type is not documented. +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:76: warning: unable to resolve link to 'https://en.wikipedia.org/wiki/Differential_wheeled_robot' for \link command +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:61: warning: Found unknown command '@params' +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:77: warning: @copybrief or @copydoc target 'Thing::Update' not found +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:42: warning: Member wheel_left (variable) of class RoboidControl.Things.DifferentialDrive.DifferentialDrive is not documented. +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:42: warning: Member wheel_right (variable) of class RoboidControl.Things.DifferentialDrive.DifferentialDrive is not documented. +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:79: warning: Member angular_velocity_updated (variable) of class RoboidControl.Things.DifferentialDrive.DifferentialDrive is not documented. +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:27: warning: argument 'wheelDiameter' of command @param is not found in the argument list of DifferentialDrive::SetDriveDimensions(self, wheel_diameter, wheel_separation) +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:27: warning: argument 'wheelSeparation' of command @param is not found in the argument list of DifferentialDrive::SetDriveDimensions(self, wheel_diameter, wheel_separation) +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:27: warning: The following parameters of RoboidControl.Things.DifferentialDrive.DifferentialDrive.SetDriveDimensions(self, wheel_diameter, wheel_separation) are not documented: + parameter 'wheel_diameter' + parameter 'wheel_separation' +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:46: warning: argument 'leftWheel' of command @param is not found in the argument list of DifferentialDrive::SetMotors(self, wheel_left, wheel_right) +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:46: warning: argument 'rightWheel' of command @param is not found in the argument list of DifferentialDrive::SetMotors(self, wheel_left, wheel_right) +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:46: warning: The following parameters of RoboidControl.Things.DifferentialDrive.DifferentialDrive.SetMotors(self, wheel_left, wheel_right) are not documented: + parameter 'wheel_left' + parameter 'wheel_right' +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:61: warning: Found unknown command '@params' +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:62: warning: Found unknown command '@params' +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:77: warning: @copybrief or @copydoc target 'Thing::Update' not found +d:/Python/RoboidControl/RoboidControl/Things/DifferentialDrive.py:78: warning: @copydetails or @copydoc target 'Thing::Update' not found +d:/Python/RoboidControl/RoboidControl/Things/TemperatureSensor.py:7: warning: argument 'thingId' of command @param is not found in the argument list of TemperatureSensor::__init__(self, owner=None, parent=None, thing_type=0) inherited from member __init__ at line 40 in file d:/Python/RoboidControl/RoboidControl/Thing.py +d:/Python/RoboidControl/RoboidControl/Participants/SiteServer.py:33: warning: Member ProcessParticipantMsg(self, sender, msg) (function) of class SiteServer.SiteServer is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/SiteServer.py:38: warning: Member ProcessNetworkIdMsg(self, sender, msg) (function) of class SiteServer.SiteServer is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/SiteServer.py:41: warning: Member ProcessThingMsg(self, sender, ThingMsg msg) (function) of class SiteServer.SiteServer is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/SiteServer.py:23: warning: Member isolated (variable) of class SiteServer.SiteServer is not documented. +d:/Python/RoboidControl/RoboidControl/Participants/SiteServer.py:24: warning: Member publishInterval (variable) of class SiteServer.SiteServer is not documented. d:/Python/RoboidControl/RoboidControl/Participants/SiteServer.py:14: warning: Member name (variable) of class SiteServer.SiteServer is not documented. +d:/Python/RoboidControl/README.md:13: warning: unable to resolve reference to 'RoboidControl::ParticipantUDP::ParticipantUDP' for \ref command diff --git a/RoboidControl/Messages/BinaryMsg.py b/RoboidControl/Messages/BinaryMsg.py index 313ff1a..19c90b0 100644 --- a/RoboidControl/Messages/BinaryMsg.py +++ b/RoboidControl/Messages/BinaryMsg.py @@ -2,30 +2,55 @@ from RoboidControl.Thing import Thing from RoboidControl.Messages.IMessage import IMessage from typing import Optional, Union +import logging +logger = logging.getLogger(__name__) class BinaryMsg(IMessage): - id = 0xB1 - length = 4 + """! A message containing binary data for custom communication + """ + ## The message ID + id: int = 0xB1 + ## The length of the message in bytes, excluding the binary data + # + ## For the total size of the message self.data_length should be added to this value. + length: int = 4 def __init__(self, arg1: Union[bytes, int], thing: Optional[Thing] = None): + """! Create a BinaryMsg + @param arg1 Either: + - bytes: contianing the serialized data; or + - int: containgint the network_id + @param thing The thing for which the data is communicated + """ if thing is None: data = bytes(arg1) + ## The network ID of the thing + self.network_id = data[1] + ## The ID of the thing self.thing_id = data[2] + ## The length of the data self.data_length = data[3] + ## The binary data self.data = data[4:] else: + ## The network ID of the thing self.network_id = int(arg1) + ## The ID of the thing self.thing_id = thing.id + ## The thing for which the binary data is communicated self.thing = thing - def Serialize(self, buffer_ref: list[bytearray]): - buffer: bytearray = buffer_ref[0] + def Serialize(self, ref_buffer: list[bytearray]): + """! + @copydoc RoboidControl::Messages::IMessage::IMessage::Serialize + """ + buffer: bytearray = ref_buffer[0] ix = self.length self.data_length = self.thing.GenerateBinary(buffer, {ix}) if ix <= self.length: return 0 - print(f'Send BinaryMsg [{self.network_id}/{self.thing_id}] {self.data_length}') + logger.debug(f'Send BinaryMsg [{self.network_id}/{self.thing_id}] {self.data_length}') buffer[0] = self.id buffer[1] = self.network_id diff --git a/RoboidControl/Messages/DestroyMsg.py b/RoboidControl/Messages/DestroyMsg.py new file mode 100644 index 0000000..1b7f673 --- /dev/null +++ b/RoboidControl/Messages/DestroyMsg.py @@ -0,0 +1,47 @@ +from RoboidControl.Messages.IMessage import IMessage +from RoboidControl.Thing import Thing + +from typing import Union, Optional +import logging +logger = logging.getLogger(__name__) + +class DestroyMsg(IMessage): + """! Message notifiying that a Thing no longer exists + """ + ## The message ID + id = 0xB1 + ## The length of the message in bytes + length = 4 + + def __init__(self, arg1: Union[bytes, int], thing: Optional[Thing] = None): + """! Create a destroy message + @param arg1 Either + - bytes containing the serialized data; or + - an int containing the network_id + @param thing The thing which is destroyed + """ + if thing is None: + ## Create from serialized data + data = bytes(arg1) + self.network_id = data[1] + self.thing_id = data[2] + else: + ## Create from the thing details + self.network_id: int = int(arg1) + self.thing_id: int = thing.id + + def Serialize(self, ref_buffer: list[bytearray]): + """! + @copydoc RoboidControl::Messages::IMessage::IMessage::Serialize + """ + + logger.debug(f'Send DestroyMsg [{self.network_id}/{self.thing_id}]') + + buffer: bytearray = ref_buffer[0] + + buffer[0:DestroyMsg.length] = [ + DestroyMsg.id, + self.network_id, + self.thing_id + ] + return DestroyMsg.length diff --git a/RoboidControl/Messages/IMessage.py b/RoboidControl/Messages/IMessage.py index b11af94..7632b61 100644 --- a/RoboidControl/Messages/IMessage.py +++ b/RoboidControl/Messages/IMessage.py @@ -1,8 +1,14 @@ class IMessage: - id = 0x00 + """! Root structure for all communcation messages + """ ## Serialize the message into the given buffer # ## @returns: the length of the message def Serialize(self, buffer_ref: list[bytearray]) -> int: + """! Serialize the message into the given buffer + @param ref_buffer Reference to the buffer to serilize into + @return The length of the message in the buffer + """ return 0 + diff --git a/RoboidControl/Messages/InvestigateMsg.py b/RoboidControl/Messages/InvestigateMsg.py index fb75360..bd51d51 100644 --- a/RoboidControl/Messages/InvestigateMsg.py +++ b/RoboidControl/Messages/InvestigateMsg.py @@ -1,7 +1,47 @@ +from RoboidControl.Messages.IMessage import IMessage +from RoboidControl.Thing import Thing + +from typing import Union, Optional +import logging +logger = logging.getLogger(__name__) class InvestigateMsg(): + """! Message to request details for a Thing + """ + ## The message ID id = 0x81 + ## The length of the message in bytes length = 3 - def __init__(self, buffer): - self.thing_id = buffer[2] + def __init__(self, arg1: Union[bytes, int], thing: Optional[Thing] = None): + """! Create an investigate message + @param arg1 Either + - bytes containing the serialized data; or + - an int containing the network_id + @param thing The thing for which the details are requested + """ + if thing is None: + ## Create from serialized data + data = bytes(arg1) + self.network_id: int = data[1] + self.thing_id: int = data[2] + else: + ## Create from thing details + self.network_id: int = int(arg1) + self.thing_id: int = thing.id + + def Serialize(self, ref_buffer: list[bytearray]): + """! + @copydoc RoboidControl::Messages::IMessage::IMessage::Serialize + """ + + logger.debug(f'Send DestroyMsg [{self.network_id}/{self.thing_id}]') + + buffer: bytearray = ref_buffer[0] + + buffer[0:InvestigateMsg.length] = [ + InvestigateMsg.id, + self.network_id, + self.thing_id + ] + return InvestigateMsg.length diff --git a/RoboidControl/Messages/LowLevelMessages.py b/RoboidControl/Messages/LowLevelMessages.py index 4aaf742..0328c93 100644 --- a/RoboidControl/Messages/LowLevelMessages.py +++ b/RoboidControl/Messages/LowLevelMessages.py @@ -4,49 +4,12 @@ from LinearAlgebra.Spherical import Spherical from LinearAlgebra.Quaternion import Quaternion from LinearAlgebra.Angle import Angle -def SendAngle8(buffer, ref_ix, angle): - """! Send an 8-bit angle value """ - # angle = Angle.Normalize(angle) - - ix = ref_ix[0] - buffer[ix] = int((angle.InDegrees() / 360) * 256).to_bytes(1, 'big', signed=True)[0] - ref_ix[0] += 1 - -def ReceiveAngle8(buffer: bytes, ref_ix: list[int]) -> Angle: - angle: Angle = Angle() - angle.value = buffer[ref_ix[0]] - ref_ix[0] += 1 - return angle - -def SendFloat16(buffer, ix_ref, value): - """! Send a 16-bit floating point value """ - ix = ix_ref[0] - value16 = np.float16(value) - binary = value16.view(np.uint16) - buffer[ix:ix+2] = [ - (binary & 0xFF00) >> 8, - (binary & 0x00FF) - ] - ix_ref[0] += 2 - -def ReceiveFloat16(buffer, ix_ref) -> float: - """! Receive a 16-bit floating point value """ - ix = ix_ref[0] - # if ix < len(buffer) - 1: - binary = (buffer[ix] << 8) + buffer[ix+1] - # else: - # binary = 0 - value16 = np.uint16(binary).view(np.float16) - ix_ref[0] += 2 - return float(value16) - def SendSpherical(buffer, ix_ref, vector): """! Send a spherical vector """ SendFloat16(buffer, ix_ref, vector.distance) SendAngle8(buffer, ix_ref, vector.direction.horizontal) SendAngle8(buffer, ix_ref, vector.direction.vertical) - def ReceiveSpherical(buffer: bytes, ref_ix: list[int]) -> Spherical: """! Receive a spherical vector """ @@ -78,7 +41,6 @@ def SendQuat32(buffer, ref_ix, q): qw ] ref_ix[0] += 4 - def ReceiveQuaternion(buffer: bytes, ref_ix: list[int]): qx: float = (buffer[ref_ix[0]] - 128) / 127 ref_ix[0] += 1 @@ -90,3 +52,37 @@ def ReceiveQuaternion(buffer: bytes, ref_ix: list[int]): ref_ix[0] += 1 q: Quaternion = Quaternion(qx, qy, qz, qw) return q + +def SendAngle8(buffer, ref_ix, angle): + """! Send an 8-bit angle value """ + # angle = Angle.Normalize(angle) + + ix = ref_ix[0] + buffer[ix] = int((angle.InDegrees() / 360) * 256).to_bytes(1, 'big', signed=True)[0] + ref_ix[0] += 1 +def ReceiveAngle8(buffer: bytes, ref_ix: list[int]) -> Angle: + angle: Angle = Angle() + angle.value = buffer[ref_ix[0]] + ref_ix[0] += 1 + return angle + +def SendFloat16(buffer, ix_ref, value): + """! Send a 16-bit floating point value """ + ix = ix_ref[0] + value16 = np.float16(value) + binary = value16.view(np.uint16) + buffer[ix:ix+2] = [ + (binary & 0xFF00) >> 8, + (binary & 0x00FF) + ] + ix_ref[0] += 2 +def ReceiveFloat16(buffer, ix_ref) -> float: + """! Receive a 16-bit floating point value """ + ix = ix_ref[0] + # if ix < len(buffer) - 1: + binary = (buffer[ix] << 8) + buffer[ix+1] + # else: + # binary = 0 + value16 = np.uint16(binary).view(np.float16) + ix_ref[0] += 2 + return float(value16) diff --git a/RoboidControl/Messages/ModelUrlMsg.py b/RoboidControl/Messages/ModelUrlMsg.py index 585f2aa..d99dee9 100644 --- a/RoboidControl/Messages/ModelUrlMsg.py +++ b/RoboidControl/Messages/ModelUrlMsg.py @@ -1,42 +1,71 @@ -from RoboidControl.Messages.IMessage import IMessage from RoboidControl.Thing import Thing +from RoboidControl.Messages.IMessage import IMessage -from typing import Union, Optional +from typing import Optional, Union +import logging +logger = logging.getLogger(__name__) class ModelUrlMsg(IMessage): + """! Message for communicating the URL for a model of the thing + """ + ## The message ID id = 0x90 + ## The length of the message in bytes, excluding the binary data + # + ## For the total size of the message self.url_length should be added to this value. length = 4 def __init__(self, arg1: Union[bytes, int], thing: Optional[Thing] = None): + """! Create a ModelUrlMsg + @param arg1 Either: + - bytes: containing the serialized data; or + - int: containing the network_id + @param thing The thing for which the data is communicated + """ if thing is None: data = bytes(arg1) + ## The network ID of the thing + self.network_id = data[1] + ## The ID of the thing self.thing_id = data[2] - # model url length is not needed here - self.url = data[ModelUrlMsg.length:].decode("utf-8") + ## The url + self.url = data[ModelUrlMsg.length:] + ## The length of the encoded url + self.url_length = len(self.url) + self.url = self.url.decode("utf-8") else: + ## The network ID of the thing self.network_id: int = int(arg1) + ## The ID of the thing self.thing_id: int = thing.id - self.url: Optional[str] = thing.model_url + ## The URL + self.url: Optional[str] = thing.model_url.encode('utf-8') + ## The length of the encoded URL + self.url_length = len(self.url) def Serialize(self, buffer_ref: list[bytearray]): + """! + @copydoc RoboidControl::Messages::IMessage::IMessage::Serialize + """ + if self.url is None: return 0 buffer: bytearray = buffer_ref[0] - encoded_url = self.url.encode('utf-8') - url_length = len(encoded_url) - full_length = ModelUrlMsg.length + url_length - if url_length == 0 or full_length > len(buffer): + full_length = ModelUrlMsg.length + self.url_length + if self.url_length == 0 or full_length > len(buffer): return 0 + + logger.debug(f'Send ModelUrlMsg [{self.network_id}/{self.thing_id}] {self.url_length}') buffer[0:ModelUrlMsg.length] = [ ModelUrlMsg.id, - 0, # network_id, + self.network_id, self.thing_id, - url_length + self.url_length ] # Append the url string - buffer[ModelUrlMsg.length:full_length] = encoded_url + buffer[ModelUrlMsg.length:full_length] = self.url return full_length diff --git a/RoboidControl/Messages/NameMsg.py b/RoboidControl/Messages/NameMsg.py index dc18e7b..3e99c07 100644 --- a/RoboidControl/Messages/NameMsg.py +++ b/RoboidControl/Messages/NameMsg.py @@ -1,24 +1,49 @@ from RoboidControl.Messages.IMessage import IMessage from RoboidControl.Thing import Thing -from typing import Union, Optional +from typing import Optional, Union +import logging +logger = logging.getLogger(__name__) class NameMsg(IMessage): id = 0x91 length = 4 def __init__(self, arg1: Union[bytes, int], thing: Optional[Thing] = None): + """! Create a NameMsg + @param arg1 Either: + - bytes: contianing the serialized data; or + - int: containgint the network_id + @param thing The thing for which the data is communicated + """ if thing is None: data = bytes(arg1) - self.thing_id = data[2] - # name_length is not needed here - self.name = data[NameMsg.length:].decode("utf-8") + ## The network ID of the thing + self.network_id: int = data[1] + ## The ID of the thing + self.thing_id: int = data[2] + ## The name + self.name: str = data[NameMsg.length:] + ## The length of the encoded name + self.name_length: int = len(self.name) + self.name = self.name.decode("utf-8") else: + ## The network ID of the thing self.network_id: int = int(arg1) + ## The ID of the thing self.thing_id: int = thing.id - self.name: Optional[str] = thing.name + ## The name + if thing.name is None: + self.name: Optional[str] = None + else: + self.name: Optional[str] = thing.name.encode('utf-8') + ## The length of the encoded name + self.name_length = len(self.name) def Serialize(self, buffer_ref: list[bytearray]): + """! + @copydoc RoboidControl::Messages::IMessage::IMessage::Serialize + """ if self.name is None: return 0 @@ -30,9 +55,11 @@ class NameMsg(IMessage): if name_length == 0 or full_length > len(buffer): return 0 + logger.debug(f'Send NameMsg [{self.network_id}/{self.thing_id}] {self.name_length}') + buffer[0:NameMsg.length] = [ NameMsg.id, - 0, #self.network_id, + self.network_id, self.thing_id, name_length ] diff --git a/RoboidControl/Messages/NetworkIdMsg.py b/RoboidControl/Messages/NetworkIdMsg.py index 3e5075b..a3640f3 100644 --- a/RoboidControl/Messages/NetworkIdMsg.py +++ b/RoboidControl/Messages/NetworkIdMsg.py @@ -1,16 +1,22 @@ from RoboidControl.Messages.IMessage import IMessage from typing import Union +import logging +logger = logging.getLogger(__name__) -## A network id message invites another participant to a site -# -## This can be sent in response to a ClientMsg +## A message communicating the network ID for that participant class NetworkIdMsg(IMessage): + ## The message ID id: int = 0xA1 + ## The length of the message in bytes length: int = 2 - ## Create a network id message def __init__(self, arg1: Union[bytes, int]): + """! Create a NetworkIdMsg + @param arg1 Either: + - bytes: contianing the serialized data; or + - int: containgint the network_id + """ self.network_id: int = 0 if isinstance(arg1, bytes): buffer = bytearray(arg1) @@ -18,11 +24,12 @@ class NetworkIdMsg(IMessage): else: self.network_id = int(arg1) - ## Serialize the message into the given buffer - # - ## @param buffer_ref A reference to the buffer to use. This should be a list with the buffer as its first and only element - ## @returns the length of the message def Serialize(self, buffer_ref: list[bytearray]) -> int: + """! + @copydoc RoboidControl::Messages::IMessage::IMessage::Serialize + """ + logger.debug(f'Send NetworkIdMsg {self.network_id}') + buffer: bytearray = buffer_ref[0] last:int = NetworkIdMsg.length buffer[0:last] = [ diff --git a/RoboidControl/Messages/PoseMsg.py b/RoboidControl/Messages/PoseMsg.py index e806ca3..dba53ac 100644 --- a/RoboidControl/Messages/PoseMsg.py +++ b/RoboidControl/Messages/PoseMsg.py @@ -1,61 +1,94 @@ import RoboidControl.Messages.LowLevelMessages as LowLevelMessages from RoboidControl.Messages.IMessage import IMessage +from RoboidControl.Thing import Thing from LinearAlgebra.Spherical import Spherical from LinearAlgebra.Quaternion import Quaternion -from RoboidControl.Thing import Thing from typing import Union, Optional +import logging +logger = logging.getLogger(__name__) class PoseMsg(IMessage): + """! Message to communicate the pose of the thing + The pose is in local space relative to the parent. If there is no parent + (the thing is a root thing), the pose will be in world space. + """ + ## The message ID id = 0x10 + ## The length of the message in bytes length = 4 - Position = 0x01 - Orientation = 0x02 - LinearVelocity = 0x04 - AngularVelocity = 0x08 + ## Bit pattern for a pose with position + Pose_Position = 0x01 + ## Bit pattern for a pose with orientation + Pose_Orientation = 0x02 + ## Bit pattern for a pose with linear velocity + Pose_LinearVelocity = 0x04 + ## Bit pattern for a pose with angular velocity + Pose_AngularVelocity = 0x08 def __init__(self, arg1: Union[bytes, int], thing: Optional[Thing], force: bool = False): + """! Create a PoseMsg + @param arg1 Either: + - bytes: contianing the serialized data; or + - int: containgint the network_id + @param thing The thing for which the data is communicated + @param force If true, position and orientation are always included, even when they are not updated + """ + if thing is None: buffer = bytes(arg1) + ## The network ID of the thing self.network_id = buffer[1] + ## The ID of the thing self.thing_id = buffer[2] + ## Bit pattern stating which pose components are available self.pose_type = buffer[3] + ## The position of the thing in local space in meters self.position: Optional[Spherical] = None + ## The orientation of the thing in local space self.orientation: Optional[Quaternion] = None + ## The linear velocity of the thing in local space in meters per second self.linear_velocity: Optional[Spherical] = None + ## The angular velocity of the thing in local space self.angular_velocity: Optional[Spherical] = None ix:int = 4 ix_ref = [ix] - if self.pose_type & PoseMsg.Position != 0: + if self.pose_type & PoseMsg.Pose_Position != 0: self.position = LowLevelMessages.ReceiveSpherical(buffer, ix_ref) - if self.pose_type & PoseMsg.Orientation != 0: + if self.pose_type & PoseMsg.Pose_Orientation != 0: self.orientation = LowLevelMessages.ReceiveQuaternion(buffer, ix_ref) - if self.pose_type & PoseMsg.LinearVelocity != 0: + if self.pose_type & PoseMsg.Pose_LinearVelocity != 0: self.linear_velocity = LowLevelMessages.ReceiveSpherical(buffer, ix_ref) - if self.pose_type & PoseMsg.AngularVelocity != 0: + if self.pose_type & PoseMsg.Pose_AngularVelocity != 0: self.angular_velocity = LowLevelMessages.ReceiveSpherical(buffer, ix_ref) else: + ## The network ID of the thing self.network_id = arg1 + ## The ID of the thing self.thing = thing + ## Bit pattern stating which pose components are available self.pose_type = 0 if thing.position_updated or force: - self.pose_type |= PoseMsg.Position + self.pose_type |= PoseMsg.Pose_Position if thing.orientation_updated or force: - self.pose_type |= PoseMsg.Orientation + self.pose_type |= PoseMsg.Pose_Orientation if thing.linear_velocity_updated or force: - self.pose_type |= PoseMsg.LinearVelocity + self.pose_type |= PoseMsg.Pose_LinearVelocity if thing.angular_velocity_updated or force: - self.pose_type |= PoseMsg.AngularVelocity + self.pose_type |= PoseMsg.Pose_AngularVelocity def Serialize(self, buffer_ref): + """! + @copydoc RoboidControl::Messages::IMessage::IMessage::Serialize + """ if self.thing is None or self.pose_type == 0: return 0 - print(f'Send PoseMsg [{self.network_id}/{self.thing.id}] {self.pose_type}') + logger.debug(f'Send PoseMsg [{self.network_id}/{self.thing.id}] {self.pose_type}') buffer: bytearray = buffer_ref[0] buffer[0:PoseMsg.length] = [ @@ -65,12 +98,12 @@ class PoseMsg(IMessage): self.pose_type ] ix = [4] - if self.pose_type & PoseMsg.Position: + if self.pose_type & PoseMsg.Pose_Position: LowLevelMessages.SendSpherical(buffer, ix, self.thing.position) - if self.pose_type & PoseMsg.Orientation: + if self.pose_type & PoseMsg.Pose_Orientation: LowLevelMessages.SendQuat32(buffer, ix, self.thing.orientation) - if self.pose_type & PoseMsg.LinearVelocity: + if self.pose_type & PoseMsg.Pose_LinearVelocity: LowLevelMessages.SendSpherical(buffer, ix, self.thing.linear_velocity) - if self.pose_type & PoseMsg.AngularVelocity: + if self.pose_type & PoseMsg.Pose_AngularVelocity: LowLevelMessages.SendSpherical(buffer, ix, self.thing.angular_velocity) return PoseMsg.length + ix[0] diff --git a/RoboidControl/Messages/TextMsg.py b/RoboidControl/Messages/TextMsg.py new file mode 100644 index 0000000..8ca8761 --- /dev/null +++ b/RoboidControl/Messages/TextMsg.py @@ -0,0 +1,54 @@ +from RoboidControl.Messages.IMessage import IMessage + +from typing import Union +import logging +logger = logging.getLogger(__name__) + +class TextMsg(IMessage): + """! Message for sending generic text + """ + ## The message ID + id: int = 0xB0 + ## The length of the message in bytes without the text itself + length: int = 2 + + def __init__(self, arg1: Union[bytes, str]): + """! Create a new message for sending + @param arg1 Either: + - bytes: containing the serialized data; or + - str: containing the text + """ + if isinstance(arg1, bytes): + data = arg1 + ## The text + self.text = data[TextMsg.length:] + ## The length of the encoded text + self.text_length = len(self.text) + self.text = self.text.decode("utf-8") + else: + text = str(arg1) + self.text: str = text.encode('utf-8') + ## The length of the encoded text + self.text_length = len(self.text) + + def Serialize(self, buffer_ref): + """! + @copydoc RoboidControl::Messages::IMessage::IMessage::Serialize + """ + if buffer_ref is None: + return 0 + + full_length = TextMsg.length + self.text_length + if self.text_length == 0 or full_length > len(buffer): + return 0 + + logger.debug(f'Send TextMsg {self.text}') + + buffer: bytearray = buffer_ref[0] + buffer[0:TextMsg.length] = [ + TextMsg.id, + self.text_length + ] + # Append the text string + buffer[TextMsg.length:full_length] = self.text + return full_length \ No newline at end of file diff --git a/RoboidControl/Messages/ThingMsg.py b/RoboidControl/Messages/ThingMsg.py index d847607..b2f85ef 100644 --- a/RoboidControl/Messages/ThingMsg.py +++ b/RoboidControl/Messages/ThingMsg.py @@ -2,30 +2,53 @@ from RoboidControl.Messages.IMessage import IMessage from RoboidControl.Thing import Thing from typing import Optional, Union +import logging +logger = logging.getLogger(__name__) class ThingMsg(IMessage): + """! Message providing generic details about a Thing + """ + ## The message ID id = 0x80 + ## The length of the message length = 5 def __init__(self, arg1: Union[bytes, int], thing: Optional[Thing]=None): + """! Create a ModelUrlMsg + @param arg1 Either: + - bytes: containing the serialized data; or + - int: containing the network_id + @param thing The thing for which the data is communicated + """ if thing is None: buffer = bytes(arg1) + ## The network ID of the thing self.network_id: int = buffer[1] + ## The ID of the thing self.thing_id: int = buffer[2] + ## The type of thing self.thing_type: int = buffer[3] + ## The ID of the parent thing in the hierarchy. This is zero for root things self.parent_id: int = buffer[4] else: + ## The network ID of the thing self.network_id = int(arg1) + ## The ID of the thing self.thing_id = thing.id + ## The type of thing self.thing_type = thing.type + ## The ID of the parent thing in the hierarchy. This is zero for root things if thing.parent is not None: self.parent_id = thing.parent.id else: self.parent_id = 0 def Serialize(self, buffer_ref: list[bytearray]): + """! + @copydoc RoboidControl::Messages::IMessage::IMessage::Serialize + """ - print(f'Send ThingMsg [{self.network_id}/{self.thing_id}] {self.thing_type} {self.parent_id}') + logger.debug(f'Send ThingMsg [{self.network_id}/{self.thing_id}] {self.thing_type} {self.parent_id}') buffer: bytearray = buffer_ref[0] buffer[0:ThingMsg.length] = [ diff --git a/RoboidControl/Messages/__init__.py b/RoboidControl/Messages/__init__.py index 4b9928e..31bded0 100644 --- a/RoboidControl/Messages/__init__.py +++ b/RoboidControl/Messages/__init__.py @@ -1,9 +1,10 @@ __all__ = ['BinaryMsg', - 'NetworkIdMsg', + 'DestroyMsg', 'InvestigateMsg', - 'ThingMsg', - 'NameMsg', + 'IMessage', 'ModelUrlMsg', + 'NameMsg', + 'NetworkIdMsg', 'ParticipantMsg', 'PoseMsg', - 'IMessage'] + 'ThingMsg'] diff --git a/RoboidControl/Participant.py b/RoboidControl/Participant.py index 6e76f72..a169100 100644 --- a/RoboidControl/Participant.py +++ b/RoboidControl/Participant.py @@ -10,6 +10,7 @@ class Participant: 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. """ + def __init__(self, ip_address: str, port: int) -> None: """! Create a new participant with the given communcation info @param ip_address The IP address of the participant @@ -64,7 +65,7 @@ class Participant: for thing in list(self.things): thing.Update(currentTimeMs) - participants: set['Participant'] + participants: set['Participant'] = set() @staticmethod def GetParticipant(arg1: Union[str, int], port: Optional[int]) -> Optional['Participant']: @@ -81,7 +82,7 @@ class Participant: return participant return None - def AddParticipant(arg1: Union[str, int], port: Optional[int]) -> 'Participant': + def AddParticipant(arg1: Union[str, 'Participant'], port: Optional[int] = None) -> 'Participant': if port is not None: ip_address = str(arg1) participant = Participant(ip_address, port) @@ -89,8 +90,8 @@ class Participant: Participant.AddParticipant(participant) return participant else: - participant = Participant(arg1) - foundParticipant = Participant.GetParticipant(participant.network_id) + participant: Participant = arg1 + foundParticipant = Participant.GetParticipant(participant.network_id, participant.port) if foundParticipant is not None: Participant.participants.add(participant) return participant diff --git a/RoboidControl/Participants/ParticipantUDP.py b/RoboidControl/Participants/ParticipantUDP.py index da0ea66..6801815 100644 --- a/RoboidControl/Participants/ParticipantUDP.py +++ b/RoboidControl/Participants/ParticipantUDP.py @@ -1,6 +1,5 @@ from RoboidControl.Participant import Participant from RoboidControl.Thing import Thing -# from RoboidControl.Messages.ParticipantMsg import ParticipantMsg # from RoboidControl.Messages.NetworkIdMsg import NetworkIdMsg # from RoboidControl.Messages.ThingMsg import ThingMsg # from RoboidControl.Messages.NameMsg import NameMsg @@ -9,6 +8,7 @@ from RoboidControl.Thing import Thing # from RoboidControl.Messages.InvestigateMsg import InvestigateMsg # from RoboidControl.Messages.PoseMsg import PoseMsg from RoboidControl.Messages import * +from RoboidControl.Messages.ParticipantMsg import ParticipantMsg import socket import threading @@ -89,21 +89,21 @@ class ParticipantUDP(Participant): isolated_participant = None - def GetParticipant(self, ip_address: str, port: int): - # print(f'{self.name} Get participant {ip_address} {port}') - # for item in self.others: - # print(f'- {item.ip_address} {item.port}') + # def GetParticipant(self, ip_address: str, port: int): + # # print(f'{self.name} Get participant {ip_address} {port}') + # # for item in self.others: + # # print(f'- {item.ip_address} {item.port}') - found_participants = (item for item in self.others - if item.ip_address == ip_address and item.port == port) - participant = next(found_participants, None) - return participant + # found_participants = (item for item in self.others + # if item.ip_address == ip_address and item.port == port) + # participant = next(found_participants, None) + # return participant - def AddParticipant(self, ip_address: str, port: int): - print(f'{self.name} Add participant {ip_address} {port}') - remote_participant = Participant(ip_address = ip_address, port = port) - self.others.append(remote_participant) - return remote_participant + # def AddParticipant(self, ip_address: str, port: int): + # print(f'{self.name} Add participant {ip_address} {port}') + # remote_participant = Participant(ip_address = ip_address, port = port) + # self.others.append(remote_participant) + # return remote_participant #region Update @@ -137,10 +137,10 @@ class ParticipantUDP(Participant): thing.Update(currentTimeMs, False) if not(self.is_isolated or self.network_id == 0): - # if thing.terminate: - # destroyMsg = DestroyMsg(self.network_id, thing) - # self.Send(self.remote_site, destroyMsg) - # else: + if thing.terminate: + destroyMsg = DestroyMsg.Create(self.network_id, thing) + self.Send(self.remote_site, destroyMsg) + else: if self.remote_site is not None and thing.owner is not None: # Send to remote site poseMsg = PoseMsg(thing.owner.network_id, thing) @@ -201,10 +201,10 @@ class ParticipantUDP(Participant): remote_ip_address = addr[0] remote_port = addr[1] # print(f'msg received from {remote_ip_address}:{remote_port}') - remote_participant = self.GetParticipant(remote_ip_address, remote_port) + remote_participant = Participant.GetParticipant(remote_ip_address, remote_port) if remote_participant is None: # print(f'new participant') - remote_participant = self.AddParticipant(remote_ip_address, remote_port) + remote_participant = Participant.AddParticipant(remote_ip_address, remote_port) self.ReceiveData(data, remote_participant) except ConnectionError: self.network_id = 0 @@ -223,7 +223,7 @@ class ParticipantUDP(Participant): case ThingMsg.id: self.ProcessThingMsg(ThingMsg(data)) case NameMsg.id: - self.ProcessNameMsg(NameMsg(data)) + self.ProcessNameMsg(NameMsg.NameMsg.Deserialize(data)) case ModelUrlMsg.id: self.ProcessModelUrlMsg(ModelUrlMsg(data)) case BinaryMsg.id: @@ -250,6 +250,16 @@ class ParticipantUDP(Participant): def ProcessNameMsg(self, msg: NameMsg): logger.debug(f'{self.name}: Process NameMsg [{msg.networkId}/{msg.thingId}] {msg.nameLength} {msg.name}') + + owner: Optional[Participant] = Participant.GetParticipant(msg.network_id) + if owner is None: + return + + thing: Optional[Thing] = self.Get(msg.thing_id) + if thing is None: + return + + thing.name = msg.name def ProcessModelUrlMsg(self, msg: ModelUrlMsg): logger.debug(f'{self.name}: Process ModelUrlMsg [{msg.networkId}/{msg.thingId}] {msg.urlLength} {msg.url}') diff --git a/RoboidControl/__init__.py b/RoboidControl/__init__.py index ab10e5b..7158d9b 100644 --- a/RoboidControl/__init__.py +++ b/RoboidControl/__init__.py @@ -1,5 +1,2 @@ __all__ = ['Thing', - 'ParticipantUDP'] - -from .Participants.ParticipantUDP import ParticipantUDP -from .Thing import Thing + 'Participant']