From 0db7db6781b400ccbc76bde62ad1207973efcfda Mon Sep 17 00:00:00 2001 From: kudzu_cp <6d05c8c8ef5431987001abfdb2eadc9593ac9498> Date: Thu, 18 Sep 2008 00:06:24 +0000 Subject: [PATCH] --- .../DebugConnectorStream.cs | 133 ++++++++++-------- source/Cosmos.Shell.Guess/Program.cs | 2 +- 2 files changed, 75 insertions(+), 60 deletions(-) diff --git a/source/Cosmos.Build.Windows/DebugConnectorStream.cs b/source/Cosmos.Build.Windows/DebugConnectorStream.cs index caa0a8fd3..7314f4879 100644 --- a/source/Cosmos.Build.Windows/DebugConnectorStream.cs +++ b/source/Cosmos.Build.Windows/DebugConnectorStream.cs @@ -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); + } } } diff --git a/source/Cosmos.Shell.Guess/Program.cs b/source/Cosmos.Shell.Guess/Program.cs index 24fbd7208..4cf9b7718 100644 --- a/source/Cosmos.Shell.Guess/Program.cs +++ b/source/Cosmos.Shell.Guess/Program.cs @@ -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) {