using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace AtariRobot { public interface IPaddle { void Rotate(NxcMotorPort port, sbyte power, short degrees); void ButtonPress(); void ButtonDown(); void ButtonUp(); bool Busy { get; set; } void StartRotation(NxcMotorPort port, sbyte power); void Stop(NxcMotorPort port); } public class MockPaddle : IPaddle { #region IPaddle Members public void Rotate(NxcMotorPort port, sbyte power, short degrees) { } public void StartRotation(NxcMotorPort port, sbyte power) { } public void Stop(NxcMotorPort port) { } public void ButtonPress() { } public void ButtonDown() { } public void ButtonUp() { } public bool Busy { get; set; } #endregion } public class NxtPaddleController : IPaddle { protected NxtBluetooth2 _nxt; protected bool _brake = true; public NxtPaddleController(string comPort) { _nxt = new NxtBluetooth2(comPort); //Completed = new ManualResetEvent(true); } public void Rotate(NxcMotorPort port, sbyte power, short degrees) { if (Busy) { //Should probably throw exception or something, but whatever. return; } Busy = true; //TODO: You know, a dedicated thread might be better... ThreadPool.QueueUserWorkItem( delegate { try { NxcMovementPacket packet = new NxcMovementPacket(); packet.MotorPort = port; packet.Power = power; packet.Degrees = degrees; packet.Brake = _brake; _nxt.SendMessage(0, packet.ToBytes(), false); byte[] bytes = null; do { bytes = _nxt.ReadMailbox(0, false); if (NxtResponsePacket.ReadStatus(bytes) == NxtResponseCode.DataOutOfRange) { break; } } while (NxtResponsePacket.ReadStatus(bytes) == NxtResponseCode.MailboxEmpty || !NxtMailbox.ReadLogic(bytes)); } finally { Busy = false; } }); } public void StartRotation(NxcMotorPort port, sbyte power) { NxcMovementPacket packet = new NxcMovementPacket(); packet.MotorPort = port; packet.Power = power; packet.Degrees = 0; packet.Brake = _brake; _nxt.SendMessage(0, packet.ToBytes(), false); } public void Stop(NxcMotorPort port) { NxcMovementPacket packet = new NxcMovementPacket(); packet.MotorPort = port; packet.Power = 0; packet.Degrees = 0; packet.Brake = _brake; _nxt.SendMessage(0, packet.ToBytes(), false); } public void ButtonPress() { if (Busy) { //Should probably throw exception or something, but whatever. return; } ThreadPool.QueueUserWorkItem( delegate { ButtonDown(); while (Busy) { Thread.Sleep(0); } ButtonUp(); }); } public void ButtonDown() { Rotate(NxcMotorPort.OUT_B, 50, 45); } public void ButtonUp() { Rotate(NxcMotorPort.OUT_B, -50, 45); } public bool Busy {get; set;} //{ // get // { // return !Completed.WaitOne(0); // } //} //public ManualResetEvent Completed { get; protected set; } } public static class NewPongBotInterface { public static void Send(NxtBluetooth2 nxt, RotationDirection direction, int degrees) { } } public enum RotationDirection { None, Clockwise, CounterClockwise } }