mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-22 13:58:47 +00:00
This commit is contained in:
parent
7bf432310d
commit
0db7db6781
2 changed files with 75 additions and 60 deletions
|
|
@ -9,14 +9,20 @@ using Cosmos.IL2CPU.Debug;
|
|||
namespace Cosmos.Build.Windows {
|
||||
public abstract class DebugConnectorStream : DebugConnector {
|
||||
private Stream mStream;
|
||||
// Buffer to hold incoming message
|
||||
private byte[] mPacket = new byte[5];
|
||||
// Current # of bytes in mPacket
|
||||
private int mCurrentPos = 0;
|
||||
// Current packet size - Set after first byte (command) is received
|
||||
// Set to 0 when waiting on a packet
|
||||
private int mPacketSize = 0;
|
||||
private MsgType mMsgType;
|
||||
|
||||
protected delegate void PacketReceivedDelegate(byte[] aBytes);
|
||||
|
||||
protected class Incoming {
|
||||
public Stream Stream;
|
||||
// Buffer to hold incoming message
|
||||
public byte[] Packet = new byte[5];
|
||||
// Current # of bytes in mPacket
|
||||
public int CurrentPos = 0;
|
||||
// Current packet size - Set after first byte (command) is received
|
||||
// Set to 0 when waiting on a packet
|
||||
public int PacketSize = 0;
|
||||
public MsgType MsgType;
|
||||
}
|
||||
|
||||
public override void SendCommand(byte aCmd) {
|
||||
var xData = new byte[1];
|
||||
|
|
@ -26,66 +32,75 @@ namespace Cosmos.Build.Windows {
|
|||
|
||||
protected void Start(Stream aStream) {
|
||||
mStream = aStream;
|
||||
var xIncoming = new Incoming() { Stream = aStream };
|
||||
// Request first command
|
||||
aStream.BeginRead(mPacket, 0, 1, new AsyncCallback(DoRead), aStream);
|
||||
aStream.BeginRead(xIncoming.Packet, 0, 1, new AsyncCallback(DoRead), xIncoming);
|
||||
}
|
||||
|
||||
private void CmdReceived(byte[] aBytes) {
|
||||
}
|
||||
|
||||
private void DoRead(IAsyncResult aResult) {
|
||||
try {
|
||||
var xStream = (Stream)aResult.AsyncState;
|
||||
int xCount = xStream.EndRead(aResult);
|
||||
int xBytesToRead;
|
||||
// If 0, end of stream then just exit without calling BeginRead again
|
||||
if (xCount == 0) {
|
||||
return;
|
||||
// Command received, determine packet size
|
||||
} else if (mCurrentPos == 0) {
|
||||
mMsgType = (MsgType)mPacket[0];
|
||||
switch (mMsgType) {
|
||||
case MsgType.TracePoint:
|
||||
mPacketSize = 5;
|
||||
break;
|
||||
case MsgType.Text:
|
||||
mPacketSize = 2;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Unknown debug command");
|
||||
}
|
||||
mCurrentPos = 1;
|
||||
xBytesToRead = mPacketSize - 1;
|
||||
// Read size byte
|
||||
} else if ((mMsgType == MsgType.Text) && (mCurrentPos == 1)) {
|
||||
xBytesToRead = mPacket[1];
|
||||
mCurrentPos = 2;
|
||||
mPacketSize = xBytesToRead + mCurrentPos;
|
||||
mPacket = new byte[mPacketSize];
|
||||
// Full packet received, process it
|
||||
} else if ((xCount + mCurrentPos) == mPacketSize) {
|
||||
switch (mMsgType) {
|
||||
case MsgType.TracePoint:
|
||||
UInt32 xEIP = (UInt32)((mPacket[4] << 24) | (mPacket[3] << 16)
|
||||
| (mPacket[2] << 8) | mPacket[1]);
|
||||
Dispatcher.BeginInvoke(DispatcherPriority.Background, CmdTrace, xEIP);
|
||||
break;
|
||||
case MsgType.Text:
|
||||
string xText = ASCIIEncoding.ASCII.GetString(mPacket, 2, mPacket.Length - 2);
|
||||
Dispatcher.BeginInvoke(DispatcherPriority.Background, CmdText, xText);
|
||||
break;
|
||||
}
|
||||
// Request next command
|
||||
mCurrentPos = 0;
|
||||
mPacketSize = 0;
|
||||
xBytesToRead = 1;
|
||||
mPacket = new byte[5];
|
||||
} else {
|
||||
mCurrentPos += xCount;
|
||||
xBytesToRead = mPacketSize - mCurrentPos;
|
||||
}
|
||||
xStream.BeginRead(mPacket, mCurrentPos, xBytesToRead, new AsyncCallback(DoRead), xStream);
|
||||
} catch (System.IO.IOException ex) {
|
||||
Dispatcher.BeginInvoke(DispatcherPriority.Background, ConnectionLost, ex);
|
||||
}
|
||||
}
|
||||
|
||||
private void DoRead2(IAsyncResult aResult) {
|
||||
var xIncoming = (Incoming)aResult.AsyncState;
|
||||
int xCount = xIncoming.Stream.EndRead(aResult);
|
||||
int xBytesToRead;
|
||||
// If 0, end of stream then just exit without calling BeginRead again
|
||||
if (xCount == 0) {
|
||||
return;
|
||||
// Command received, determine packet size
|
||||
} else if (xIncoming.CurrentPos == 0) {
|
||||
xIncoming.MsgType = (MsgType)xIncoming.Packet[0];
|
||||
switch (xIncoming.MsgType) {
|
||||
case MsgType.TracePoint:
|
||||
xIncoming.PacketSize = 5;
|
||||
break;
|
||||
case MsgType.Text:
|
||||
xIncoming.PacketSize = 2;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Unknown debug command");
|
||||
}
|
||||
xIncoming.CurrentPos = 1;
|
||||
xBytesToRead = xIncoming.PacketSize - 1;
|
||||
// Read size byte
|
||||
} else if ((xIncoming.MsgType == MsgType.Text) && (xIncoming.CurrentPos == 1)) {
|
||||
xBytesToRead = xIncoming.Packet[1];
|
||||
xIncoming.CurrentPos = 2;
|
||||
xIncoming.PacketSize = xBytesToRead + xIncoming.CurrentPos;
|
||||
xIncoming.Packet = new byte[xIncoming.PacketSize];
|
||||
// Full packet received, process it
|
||||
} else if ((xCount + xIncoming.CurrentPos) == xIncoming.PacketSize) {
|
||||
switch (xIncoming.MsgType) {
|
||||
case MsgType.TracePoint:
|
||||
UInt32 xEIP = (UInt32)((xIncoming.Packet[4] << 24) | (xIncoming.Packet[3] << 16)
|
||||
| (xIncoming.Packet[2] << 8) | xIncoming.Packet[1]);
|
||||
Dispatcher.BeginInvoke(DispatcherPriority.Background, CmdTrace, xEIP);
|
||||
break;
|
||||
case MsgType.Text:
|
||||
string xText = ASCIIEncoding.ASCII.GetString(xIncoming.Packet, 2
|
||||
, xIncoming.Packet.Length - 2);
|
||||
Dispatcher.BeginInvoke(DispatcherPriority.Background, CmdText, xText);
|
||||
break;
|
||||
}
|
||||
// Request next command
|
||||
xIncoming.CurrentPos = 0;
|
||||
xIncoming.PacketSize = 0;
|
||||
xBytesToRead = 1;
|
||||
xIncoming.Packet = new byte[5];
|
||||
} else {
|
||||
xIncoming.CurrentPos += xCount;
|
||||
xBytesToRead = xIncoming.PacketSize - xIncoming.CurrentPos;
|
||||
}
|
||||
xIncoming.Stream.BeginRead(xIncoming.Packet, xIncoming.CurrentPos, xBytesToRead
|
||||
, new AsyncCallback(DoRead), xIncoming);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ namespace Cosmos.Demo.Guess {
|
|||
+ Cosmos.Hardware.RTC.GetSeconds()));
|
||||
// Divide by 100, get remainder
|
||||
int xMagicNo = xRandom.Next() % 100;
|
||||
Debugger.Send("The magic number is " + xMagicNo);
|
||||
//Debugger.Send("The magic number is " + xMagicNo);
|
||||
Console.WriteLine("I am thinking of a number between 0 and 100. What is it?");
|
||||
Debugger.TraceOff();
|
||||
while (true) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue