-
-
Save substanc3-dev/c82e746cc185eed989bd978a5a2d803b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Console.WriteLine("NTSerialTool by substanc3"); | |
int targetBaud = 4800; | |
var ipEndPoint = new IPEndPoint(IPAddress.Loopback, 31337); | |
using TcpClient client = new(); | |
await client.ConnectAsync(ipEndPoint); | |
await using NetworkStream vStream = client.GetStream(); | |
Console.WriteLine("Connected to VirtualBox."); | |
var ipEndPoint2 = new IPEndPoint(IPAddress.Any, 31338); | |
TcpListener listener = new(ipEndPoint2); | |
listener.Start(); | |
using TcpClient handler = await listener.AcceptTcpClientAsync(); | |
await using NetworkStream mStream = handler.GetStream(); | |
Console.WriteLine("Connected to MAME."); | |
Queue<byte> vQueue = new Queue<byte>(); | |
Queue<byte> mQueue = new Queue<byte>(); | |
var vBuffer = new byte[1]; | |
var mBuffer = new byte[1]; | |
var vTask = vStream.ReadAsync(vBuffer).AsTask(); | |
var mTask = mStream.ReadAsync(vBuffer).AsTask(); | |
var timeTask = Task.Delay(1000 / (targetBaud / 8)); | |
while(true) | |
{ | |
var task = await Task.WhenAny(vTask, mTask, timeTask); | |
if (task == vTask) | |
{ | |
var amt = await vTask; | |
for (int i = 0; i < amt; i++) | |
{ | |
vQueue.Enqueue(vBuffer[i]); | |
vBuffer[i] = 0; | |
} | |
vTask = vStream.ReadAsync(vBuffer).AsTask(); | |
} | |
else if (task == mTask) | |
{ | |
var amt = await mTask; | |
for (int i = 0; i < amt; i++) | |
{ | |
mQueue.Enqueue(mBuffer[i]); | |
mBuffer[i] = 0; | |
} | |
mTask = mStream.ReadAsync(mBuffer).AsTask(); | |
} | |
else if (task == timeTask) | |
{ | |
if(vQueue.Count > 0) | |
{ | |
var b = vQueue.Dequeue(); | |
await mStream.WriteAsync(new byte[] { b }); | |
} | |
else if (mQueue.Count > 0) | |
{ | |
var b = mQueue.Dequeue(); | |
await vStream.WriteAsync(new byte[] { b }); | |
} | |
await timeTask; | |
timeTask = Task.Delay(1000 / (targetBaud / 8)); | |
} | |
else | |
Console.WriteLine("Error"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment