Beispiel #1
0
        public void TestArduinoStateToggles()
        {
            ArduinoCommsBase motorArduino = new MotorControllerArduino(mLogger);
            TestDelegate     connectDel   = new TestDelegate(delegate() { motorArduino.StartArduinoComms(); });

            Assert.AreEqual(motorArduino.ArduinoState, ProsthesisCore.Telemetry.ProsthesisTelemetry.DeviceState.Uninitialized);
            Assert.DoesNotThrow(connectDel);

            Assert.DoesNotThrow(delegate() { motorArduino.ToggleArduinoState(false); });
            //Wait 100ms for the message to cycle
            System.Threading.Thread.Sleep(100);

            Assert.AreEqual(motorArduino.ArduinoState, ProsthesisCore.Telemetry.ProsthesisTelemetry.DeviceState.Disabled);

            Assert.DoesNotThrow(delegate() { motorArduino.ToggleArduinoState(true); });
            //Wait 100ms for the message to cycle
            System.Threading.Thread.Sleep(100);
            Assert.AreEqual(motorArduino.ArduinoState, ProsthesisCore.Telemetry.ProsthesisTelemetry.DeviceState.Active);

            Assert.IsTrue(motorArduino.IsConnected);

            Assert.DoesNotThrow(delegate() { motorArduino.StopArduinoComms(true); });
            Assert.IsFalse(motorArduino.IsConnected);

            Assert.AreEqual(motorArduino.ArduinoState, ProsthesisCore.Telemetry.ProsthesisTelemetry.DeviceState.Disconnected);
        }
Beispiel #2
0
        public void TestForMotorControllerDisconnectionWhileInUse()
        {
            Console.WriteLine("Please ensure that the Motor controller ('mcon') is connected for this test. Press ENTER when ready");
            Console.ReadLine();

            ArduinoCommsBase motorArduino = new MotorControllerArduino(mLogger);
            TestDelegate     connectDel   = new TestDelegate(delegate() { motorArduino.StartArduinoComms(); });

            Assert.DoesNotThrow(connectDel);
            Assert.IsTrue(motorArduino.IsConnected);

            motorArduino.ToggleHeartbeat(true, 500, 3);

            Console.WriteLine(string.Format("Arduino {0} has now been connected. The test will validate behaviour when it is unplugged. Uplug the arduino to continue", motorArduino.ArduinoID));

            System.Threading.ManualResetEvent disconnectEvent = new System.Threading.ManualResetEvent(false);
            motorArduino.Disconnected += delegate(ArduinoCommsBase ard)
            {
                disconnectEvent.Set();
            };

            disconnectEvent.WaitOne();

            Assert.IsFalse(motorArduino.IsConnected);

            Assert.DoesNotThrow(delegate() { motorArduino.StopArduinoComms(true); });
        }
Beispiel #3
0
        public void TestForArduinoConnection()
        {
            ArduinoCommsBase motorArduino = new MotorControllerArduino(mLogger);
            TestDelegate     connectDel   = new TestDelegate(delegate() { motorArduino.StartArduinoComms(); });

            Assert.DoesNotThrow(connectDel);
            Assert.IsTrue(motorArduino.IsConnected);
            Assert.DoesNotThrow(delegate() { motorArduino.StopArduinoComms(true); });
            Assert.IsFalse(motorArduino.IsConnected);
        }
Beispiel #4
0
        public void TestArduinoEnumeration()
        {
            ArduinoCommsBase motorArduino     = new MotorControllerArduino(mLogger);
            ArduinoCommsBase sensorArduino    = new SensorNodeArduino(mLogger);
            TestDelegate     sensorConnectDel = new TestDelegate(delegate() { sensorArduino.StartArduinoComms(); });
            TestDelegate     motorConnectDel  = new TestDelegate(delegate() { motorArduino.StartArduinoComms(); });

            Assert.DoesNotThrow(motorConnectDel);
            Assert.DoesNotThrow(sensorConnectDel);

            Assert.IsTrue(sensorArduino.IsConnected);
            Assert.IsTrue(motorArduino.IsConnected);

            Assert.DoesNotThrow(delegate() { motorArduino.StopArduinoComms(true); });
            Assert.DoesNotThrow(delegate() { sensorArduino.StopArduinoComms(true); });

            Assert.IsFalse(motorArduino.IsConnected);
            Assert.IsFalse(sensorArduino.IsConnected);
        }
Beispiel #5
0
        public void TestArduinoTelemetryToggles()
        {
            MotorControllerArduino motorArduino = new MotorControllerArduino(mLogger);
            TestDelegate           connectDel   = new TestDelegate(delegate() { motorArduino.StartArduinoComms(); });

            Assert.AreEqual(motorArduino.ArduinoState, ProsthesisCore.Telemetry.ProsthesisTelemetry.DeviceState.Uninitialized);
            Assert.DoesNotThrow(connectDel);
            Assert.IsFalse(motorArduino.TelemetryActive);

            Assert.DoesNotThrow(delegate() { motorArduino.ToggleArduinoState(false); });
            //Wait 100ms for the message to cycle
            System.Threading.Thread.Sleep(100);

            Assert.IsFalse(motorArduino.TelemetryActive);
            Assert.AreEqual(motorArduino.ArduinoState, ProsthesisCore.Telemetry.ProsthesisTelemetry.DeviceState.Disabled);

            Assert.DoesNotThrow(delegate() { motorArduino.ToggleArduinoState(true); });
            //Wait 100ms for the message to cycle
            System.Threading.Thread.Sleep(100);
            Assert.AreEqual(motorArduino.ArduinoState, ProsthesisCore.Telemetry.ProsthesisTelemetry.DeviceState.Active);

            long telemetryCount = 0;

            motorArduino.TelemetryUpdate += delegate(ProsthesisCore.Telemetry.ProsthesisTelemetry.ProsthesisMotorTelemetry telem)
            {
                telemetryCount++;
            };

            const float cFastestTelemMS = 50;
            int         fastestTelem    = int.MaxValue;

            //Test at successively smaller telemetry periods. Find out where the arduino falls over, if at all
            for (int i = 1000; i >= cFastestTelemMS; i /= 2)
            {
                fastestTelem = i;
                Console.WriteLine(string.Format("Attemping to receive 10 seconds of telemetry at a period of {0}ms", i));
                telemetryCount = 0;
                Assert.DoesNotThrow(delegate() { motorArduino.TelemetryToggle(i); });
                //Wait 100ms for the message to cycle
                System.Threading.Thread.Sleep(100);
                Assert.IsTrue(motorArduino.TelemetryActive);

                System.Threading.Thread.Sleep(10000);

                Assert.DoesNotThrow(delegate() { motorArduino.TelemetryToggle(0); });
                //Wait 100ms for the message to cycle
                System.Threading.Thread.Sleep(100);
                Assert.IsFalse(motorArduino.TelemetryActive);

                //Telemetry timing isn't a hard realtime component. We'll take receiving 95% of what we asked for as a pass
                bool passed = (float)telemetryCount * 0.95f <= 10.0f * 1000.0f / (float)i;
                if (passed || i > 50)
                {
                    Assert.IsTrue(passed);
                }
                else
                {
                    Console.Write(string.Format("Arduino failed to produce telemetry at {0}ms", i));
                    break;
                }
            }

            //Attempting 30 minutes at fastest allowed telem
            Console.WriteLine(string.Format("Attemping to receive 30 minutes of telemetry at a period of {0}ms with the device enabled", fastestTelem));
            telemetryCount = 0;
            Assert.DoesNotThrow(delegate() { motorArduino.TelemetryToggle(fastestTelem); });
            Assert.DoesNotThrow(delegate() { motorArduino.ToggleArduinoState(true); });
            //Wait 100ms for the message to cycle
            System.Threading.Thread.Sleep(100);
            Assert.IsTrue(motorArduino.TelemetryActive);

            //30 minute sleep
            Console.WriteLine("\nSystem will now perform a 30 minute soak test to count telemetry packets at the fastest recorded rate. Press ENTER to run this test and any other key to skip it");
            bool doSoak = Console.ReadKey().Key == ConsoleKey.Enter;

            if (doSoak)
            {
                System.Threading.Thread.Sleep(30 * 60 * 1000);

                //Telemetry timing isn't a hard realtime component. We'll take receiving 95% of what we asked for as a pass
                bool passedSoak = (float)telemetryCount * 0.95f <= 1800.0f * 1000.0f / (float)fastestTelem;
                Assert.IsTrue(passedSoak);

                Assert.DoesNotThrow(delegate() { motorArduino.TelemetryToggle(0); });
                //Wait 100ms for the message to cycle
                System.Threading.Thread.Sleep(100);
                Assert.IsFalse(motorArduino.TelemetryActive);

                Assert.DoesNotThrow(delegate() { motorArduino.TelemetryToggle(0); });
                //Wait 100ms for the message to cycle
                System.Threading.Thread.Sleep(100);
                Assert.IsFalse(motorArduino.TelemetryActive);
            }

            Assert.IsTrue(motorArduino.IsConnected);
            Assert.DoesNotThrow(delegate() { motorArduino.StopArduinoComms(true); });
            Assert.IsFalse(motorArduino.IsConnected);

            Assert.IsFalse(motorArduino.TelemetryActive);
            Assert.AreEqual(motorArduino.ArduinoState, ProsthesisCore.Telemetry.ProsthesisTelemetry.DeviceState.Disconnected);

            if (fastestTelem > cFastestTelemMS)
            {
                Assert.Inconclusive();
            }
        }
Beispiel #6
0
        static void Main(string[] args)
        {
            mTelemetryBroadcastTimer           = new Timer(kTelemetryBroadcastPeriod);
            mTelemetryBroadcastTimer.AutoReset = true;
            mTelemetryBroadcastTimer.Elapsed  += OnTelemetryPublishAlarm;
            mTelemetryBroadcastTimer.Start();

            string fileName = string.Format("Arduino-comms-{0}.txt", System.DateTime.Now.ToString("dd MM yyyy HH-mm-ss"));

            ProsthesisCore.Utility.Logger logger = new ProsthesisCore.Utility.Logger(fileName, true);

            System.DateTime start = System.DateTime.Now;

            string telemFileName = string.Format("Arduino-telem-{0}.csv", System.DateTime.Now.ToString("dd MM yyyy HH-mm-ss"));

            System.IO.TextWriter writer = new System.IO.StreamWriter(telemFileName);

            ArduinoCommsBase.InitializeSerialConnections(logger);
            MotorControllerArduino test = new MotorControllerArduino(logger);

            writer.WriteLine("Timestamp(ms), Duty Cycle 1, Duty Cycle 2, Pressure 1, pressure 2, P, I, D");
            test.TelemetryUpdate += new Action <ProsthesisCore.Telemetry.ProsthesisTelemetry.ProsthesisMotorTelemetry>(delegate(ProsthesisCore.Telemetry.ProsthesisTelemetry.ProsthesisMotorTelemetry obj) {
                double ts         = (System.DateTime.Now - start).Duration().TotalMilliseconds;
                mTelem.MotorTelem = obj;
                string telemRow   = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}", ts, obj.MotorDutyCycles[1], obj.MotorDutyCycles[0], obj.OutputPressure[1], obj.OutputPressure[0], obj.ProportionalTunings[1], obj.IntegralTunings[1], obj.DifferentialTunings[1], obj.PressureSetPoints[0], obj.PressureSetPoints[1]);
                Console.WriteLine(telemRow);
                writer.WriteLine(telemRow);
            });

            bool telemEnable  = false;
            bool arduinoState = false;

            if (test.StartArduinoComms())
            {
                Console.WriteLine("Press 'x' to exit. 'T' to enable telemetry, 'E' to toggle device state");
                ConsoleKey key = ConsoleKey.A;

                test.ToggleHeartbeat(true, 1000, 3);
                do
                {
                    System.Threading.Thread.Sleep(16);
                    if (Console.KeyAvailable)
                    {
                        key = Console.ReadKey().Key;

                        if (key == ConsoleKey.T)
                        {
                            telemEnable = !telemEnable;
                            test.TelemetryToggle(telemEnable ? 25 : 0);
                        }
                        else if (key == ConsoleKey.E)
                        {
                            arduinoState = !arduinoState;
                            test.ToggleArduinoState(arduinoState);
                        }
                    }
                }while (key != ConsoleKey.X && test.IsConnected);

                test.StopArduinoComms(true);
            }
            else
            {
                Console.WriteLine("Failed to connect to the correct Arduino. Press any key to exit");
                do
                {
                    System.Threading.Thread.Sleep(16);
                }while (!Console.KeyAvailable);
            }

            mTelemetryBroadcastTimer.Start();
            writer.Close();
            logger.ShutDown();
        }