RoboidControl-csharp/SiteServer.cs
2024-12-06 15:39:36 +01:00

85 lines
3.3 KiB
C#

using System.IO;
using System.Threading.Tasks;
namespace Passer.Control {
public static class SiteServer {
public static async Task ReceiveData(Stream dataStream, Client client) {
while (true) {
byte packetSize = (byte)dataStream.ReadByte();
if (packetSize == 0xFF)
//Debug.Log("Receive timeout");
// Timeout
;
else
await ReceiveData(dataStream, client, packetSize);
}
}
public static async Task ReceiveData(Stream dataStream, Client client, byte packetSize) {
byte msgId = (byte)dataStream.ReadByte();
if (msgId == 0xFF) {
// Timeout
return;
}
bool result = false;
switch (msgId) {
case PoseMsg.Id: // Object Pose (16)
result = await PoseMsg.Receive(dataStream, client, packetSize);
break;
case DestroyMsg.Id: // Destroy object (32)
result = await DestroyMsg.Receive(dataStream, client, packetSize);
break;
case ThingMsg.Id:
result = await ThingMsg.Receive(dataStream, client, packetSize);
break;
case InvestigateMsg.Id:
result = await InvestigateMsg.Receive(dataStream, client, packetSize);
break;
case ModelUrlMsg.Id: // Model URL (144)
result = await BytesMsg.Receive(dataStream, client, packetSize);
break;
case NameMsg.Id: // Object Name (145)
result = await NameMsg.Receive(dataStream, client, packetSize);
break;
case ClientMsg.Id:
result = await ClientMsg.Receive(dataStream, client, packetSize);
break;
case NetworkIdMsg.Id:
result = await NetworkIdMsg.Receive(dataStream, client, packetSize);
break;
//case TextMsg.Id: // Text (176)
// result = await TextMsg.Receive(dataStream, client, packetSize);
// break;
case BytesMsg.Id:
result = await BytesMsg.Receive(dataStream, client, packetSize);
break;
default:
break;
}
if (result == false) {
packetSize = msgId; // skip 1 byte, msgId is possibly a packet size byte
await ReceiveData(dataStream, client, packetSize);
}
}
public static void ProcessMessage(ISiteServer site, Client client, IMessage msg) {
switch (msg) {
case NetworkIdMsg networkId:
site.ProcessNetworkId(client, networkId);
break;
case ModelUrlMsg modelUrl:
site.ProcessModelUrl(client, modelUrl);
break;
}
}
}
public interface ISiteServer {
public void ProcessNetworkId(Client client, NetworkIdMsg networkId);
public void ProcessModelUrl(Client client, ModelUrlMsg modelUrl);
}
}