RoboidControl-python/Participant.py
2024-12-22 10:22:32 +01:00

66 lines
1.9 KiB
Python

import socket
from . import Messages
from .Thing import Thing
class Participant:
publishInterval = 3 # 3 seconds
def __init__(self, ipAddress, port):
self.buffer = bytearray(256)
self.ipAddress = ipAddress
self.port = port
self.udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# self.udpSocket.bind(("0.0.0.0", 7681))
self.buffer = bytearray(256)
self.network_id = 0
self.nextPublishMe = 0
def SendBuffer(self, bufferSize):
if self.ipAddress is None:
return False
if bufferSize <= 0:
return True
self.udpSocket.sendto(self.buffer[:bufferSize], (self.ipAddress, self.port))
return True
def PublishBuffer(self, bufferSize):
if self.ipAddress is None:
return False
if bufferSize <= 0:
return True
self.udpSocket.sendto(self.buffer[:bufferSize], ('<broadcast>', self.port))
return True
def PublishMe(self):
msg = Messages.ClientMsg(self.network_id)
msg.Publish(self)
def Update(self, currentTime):
if (currentTime > self.nextPublishMe):
self.PublishMe()
self.nextPublishMe = currentTime + Participant.publishInterval
Thing.UpdateAll(currentTime)
def ProcessClientMsg(self, data: bytearray):
pass
def ProcessNetworkIdMsg(self, data: bytearray):
pass
def ReceiveData(self, data):
msgId = data[0]
match msgId:
case Messages.ClientMsg.id:
msg = Messages.ClientMsg(data)
self.ProcessClientMsg(msg)
case Messages.NetworkIdMsg.id:
msg = Messages.NetworkIdMsg(data)
self.ProcessNetworkIdMsg(msg)