Exemple #1
0
        public void Loop()
        {
            NextState = CurrentState;
            UpdateStatus(CurrentState.ToString());

            switch (CurrentState)
            {
            case TestState.WaitForDevice:
                Dev.SetLed(false, false);
                if (IsStable(s => s.Sense))
                {
                    // Sensed a device.
                    NextState = TestState.SoftOn;
                    Dev.SetMode(SignTest.DeviceMode.SoftOn);
                }
                break;

            case TestState.WaitDeviceLeave:
                if (IsStable(s => s.DeviceGone))
                {
                    NextState = TestState.WaitForDevice;
                    Dev.SetMode(SignTest.DeviceMode.Off);     // Ensure that it's off.
                }
                if (Dev.GetButton())
                {
                    // If button is pressed, rerun the process for the currently attached device.
                    WriteText("Button pressed, restarting process");
                    NextState = TestState.WaitForDevice;
                }
                break;

            case TestState.SoftOn:
                if (IsStable(s => s.SoftOnOk))
                {
                    NextState = TestState.PowerOn;
                    Dev.SetMode(SignTest.DeviceMode.On);
                }
                break;

            case TestState.PowerOn:
                if (IsStable(s => s.PowerOk))
                {
                    // Higher power standards have been met.
                    NextState = TestState.CheckFlash;
                }
                break;

            case TestState.CheckFlash:
                // Sanity test flash
                Dev.SetMode(SignTest.DeviceMode.FlashSpi);

                UInt32 flashId = Dev.FlashReadId();
                WriteText("Flash ID: {0:x8}", flashId);


                byte[] checkData = Dev.FlashRead(0, 128);

                CheckReloadBitstream();

                // Confirm whether flash contains the latest program
                if (FpgaProgram == null)
                {
                    WriteText("Skipping flash contents check.");
                    NextState = TestState.BootFpga;
                    break;
                }


                if (!CompareBytes(checkData, 0, FpgaProgram, 0, checkData.Length))
                {
                    WriteText("Quick check shows we need to reprogram the FPGA.");
                    HexDump(0, checkData);
                    NextState = TestState.ProgramFpga;
                    break;
                }
                else
                {
                    WriteText("Checking full FPGA program...");
                }

                checkData = Dev.FlashRead(0, FpgaProgram.Length);

                if (!CompareBytes(checkData, 0, FpgaProgram, 0, checkData.Length))
                {
                    WriteText("Full check shows we need to reprogram the FPGA.");
                    NextState = TestState.ProgramFpga;
                    break;
                }

                WriteText("Fpga program is correct.");
                NextState = TestState.BootFpga;
                break;


            case TestState.ProgramFpga:
                WriteText("Erasing flash sectors...");
                Dev.FlashEraseRegion(0, FpgaProgram.Length);
                WriteText("Programming flash...");
                Dev.FlashWrite(0, FpgaProgram);

                NextState = TestState.BootFpga;
                break;

            case TestState.BootFpga:
                NextState = TestState.WaitDeviceLeave;
                try
                {
                    Dev.SetMode(SignTest.DeviceMode.FpgaActive);
                    Dev.SetLed(true, false);
                    WriteText("Fpga Booted!");
                    NextState = TestState.TestFpga;
                }
                catch (Exception ex)
                {
                    WriteText("Fpga Failed to boot.");
                    Dev.SetLed(false, true);
                    WriteText(ex.ToString());
                }
                break;

            case TestState.TestFpga:
                Thread.Sleep(5000);
                WriteText("Collecting some debug data from the FPGA");
                int    buffercount = 32;
                byte[] usbdata     = new byte[64 * buffercount];
                for (int i = 0; i < buffercount; i++)
                {
                    byte[] data = Dev.FpgaSpi(new byte[64]);
                    Array.Copy(data, 0, usbdata, i * 64, 64);
                }

                HexOnly(usbdata);
                DecodeUsbTrace(usbdata);

                WriteText("Sending a test image.");
                {
                    uint[] image = new uint[32 * 32];
                    for (int y = 0; y < 32; y++)
                    {
                        for (int x = 0; x < 32; x++)
                        {
                            double angle = Math.Atan2(x - 16, 16 - y) / (2 * Math.PI);
                            double rad   = Math.Sqrt((y - 16) * (y - 16) + (x - 16) * (x - 16));
                            if (angle < 0)
                            {
                                angle += 1;
                            }

                            int a = (int)Math.Round(angle * 127);
                            int r = (int)Math.Round(160 - rad * 8);
                            int z = (x + y * 32) * 191 / (32 * 32);
                            if (a < 0)
                            {
                                a = 0;
                            }
                            if (a > 255)
                            {
                                a = 255;
                            }
                            if (r < 0)
                            {
                                r = 0;
                            }
                            if (r > 255)
                            {
                                r = 255;
                            }

                            image[x + y * 32] = (uint)(a + r * 0x100 + z * 0x10000);
                        }
                    }
                    Dev.SendImage32x32(0, image);
                }
                NextState = TestState.WaitDeviceLeave;
                break;
            }

            // Did the device disappear?
            if (CurrentState != TestState.WaitForDevice)
            {
                if (IsStable(s => s.DeviceGone, StableCount * 2))
                {
                    WriteText("Unexpected device loss.");
                    NextState = TestState.WaitForDevice;
                    Dev.SetMode(SignTest.DeviceMode.Off); // Ensure that it's off.
                }
            }


            if (NextState != CurrentState)
            {
                WriteText("State change from {0} => {1}", CurrentState, NextState);
                CurrentState = NextState;
            }
        }
Exemple #2
0
        public void Run()
        {
            Dev = new SignTest(SignTest.Enumerate().First());
            Reset();
            while (true)
            {
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    // Run without exception handling in the debugger.
                    Loop();
                }
                else
                {
                    try
                    {
                        Loop();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine();
                        Console.WriteLine("Exception!");
                        Console.WriteLine(ex.ToString());

                        try
                        {
                            Dev.SetLed(false, true);
                        }
                        catch
                        {
                        }

                        Thread.Sleep(2000);
                        Console.WriteLine("Restarting...");
                        Reset();
                    }
                }

                // Check for some control characters
                if (Console.KeyAvailable)
                {
                    ConsoleKeyInfo k = Console.ReadKey(true);

                    switch (char.ToLower(k.KeyChar))
                    {
                    case '?':
                    case 'h':
                        WriteText("Special keys: 'x' Exit, 'r' Reprogram test board, <space> reprogram current board.");
                        break;

                    case 'x':
                        // Clean up and exit
                        WriteText("'x' pressed, exiting.");
                        Reset();
                        return;

                    case 'r':
                        WriteText("'r' pressed, putting test board into reprogramming mode.");
                        Reset();
                        Dev.Reprogram();
                        return;

                    case ' ':
                        WriteText("<Space> pressed, resetting test system state.");
                        Reset();
                        break;

                    case 'f':
                        WriteText("'f' pressed, restarting FPGA");
                        try
                        {
                            Dev.SetMode(SignTest.DeviceMode.FpgaActive);     // Restarts FPGA.
                        }
                        catch (Exception ex)
                        {
                            WriteText(ex.ToString());
                        }
                        break;

                    case 'c':
                        WriteText("Going into a cycle of power on/off");
                        int    count      = 0;
                        string statusText = "";
                        while (true)
                        {
                            if (count == 0)
                            {
                                statusText = "Power On";
                                Dev.SetLed(true, false);
                                Dev.SetMode(SignTest.DeviceMode.On);
                                try
                                {
                                    Dev.SetMode(SignTest.DeviceMode.FpgaActive);
                                }
                                catch { }
                            }
                            if (count == 40)
                            {
                                statusText = "Power Off";
                                Dev.SetLed(false, false);
                                Dev.SetMode(SignTest.DeviceMode.Off);
                            }
                            count++;
                            if (count == 80)
                            {
                                count = 0;
                            }
                            UpdateStatus(statusText);
                            Thread.Sleep(100);
                        }
                    }
                }


                Thread.Sleep(100);
            }
        }