コード例 #1
0
        /// <summary>
        /// Attempts auto-detection of the currently installed Navio board.
        /// </summary>
        public void Detect()
        {
            // Detect model
            var model = NavioDeviceProvider.Detect();

            if (model.HasValue && Board?.Model != model)
            {
                // Connect to hardware when found and not already connected
                Board = NavioDeviceProvider.Connect(model.Value);

                // Fire changed event
                DoPropertyChanged(nameof(Board));
            }
        }
コード例 #2
0
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            // Initialize task
            _taskDeferral          = taskInstance.GetDeferral();
            taskInstance.Canceled += OnTaskCancelled;

            // Connect to hardware
            Debug.WriteLine("Connecting to Navio board.");
            _board = NavioDeviceProvider.Connect();
            Debug.WriteLine("Navio board was detected as a \"{0}\".", _board.Model);
            var rcInput = _board.RCInput;

            // Log start
            Debug.WriteLine("Navio RC input test start.");

            // Start receiving frames
            Debug.WriteLine("Waiting for valid PWM frames...");
            rcInput.ChannelsChanged += OnChannelsChanged;
        }
コード例 #3
0
        /// <summary>
        /// Returns the current <see cref="INavioBoard"/> or creates it the first time.
        /// </summary>
        /// <param name="model">Hardware model.</param>
        /// <returns>Hardware interface for the requested model when successful.</returns>
        /// <remarks>
        /// The requested hardware model must be the same, otherwise any existing board
        /// is disposed and an attempt made to create a board of the new model.
        /// </remarks>
        public static INavioBoard Connect(NavioHardwareModel model)
        {
            // Thread-safe lock
            lock (_lock)
            {
                // Check existing board when present
                if (_board != null)
                {
                    // Return existing board when present
                    if (_board.Model == model)
                    {
                        return(_board);
                    }

                    // Dispose existing board when not null and different model (just in case)
                    _board.Dispose();
                    _board = null;
                }

                // Create new board
                switch (model)
                {
                case NavioHardwareModel.Navio1:
                    return(_board = new Navio1Board());

                case NavioHardwareModel.Navio1Plus:
                    return(_board = new Navio1PlusBoard());

                case NavioHardwareModel.Navio2:
                    return(_board = new Navio2Board());

                default:
                    // Invalid value or unsupported
                    throw new ArgumentOutOfRangeException(nameof(model));
                }
            }
        }
コード例 #4
0
ファイル: StartupTask.cs プロジェクト: tnkaiser/NavioIoT
        /// <summary>
        /// Application start-up.
        /// </summary>
        /// <param name="taskInstance">Task instance.</param>
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            // Initialize task
            _taskDeferral          = taskInstance.GetDeferral();
            taskInstance.Canceled += OnTaskCancelled;

            // Connect to hardware
            Debug.WriteLine("Connecting to Navio board.");
            _board = NavioDeviceProvider.Connect();
            Debug.WriteLine("Navio board was detected as a \"{0}\".", _board.Model);
            var barometer = _board.Barometer;

            // Reset
            Debug.WriteLine("Resetting device.");
            barometer.Reset();

            // Infinite update loop
            Debug.WriteLine("Starting infinite update loop...");
            while (true)
            {
                var measurement = barometer.Update();
                Debug.WriteLine(measurement);
            }
        }
コード例 #5
0
        /// <summary>
        /// Application start-up.
        /// </summary>
        /// <param name="taskInstance">Task instance.</param>
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            // Initialize task
            _taskDeferral          = taskInstance.GetDeferral();
            taskInstance.Canceled += OnTaskCancelled;

            // Connect to hardware
            Debug.WriteLine("Connecting to Navio board.");
            _board = NavioDeviceProvider.Connect();
            Debug.WriteLine("Navio board was detected as a \"{0}\".", _board.Model);
            var led = _board.Led;

            // Log start
            Debug.WriteLine("Navio LED test start.");

            // Enable oscillator and output if necessary
            if (!led.Enabled)
            {
                led.Enabled = true;
            }

            // Fade LEDs to blue
            Debug.WriteLine("Fading to blue.");
            var  maximum = led.MaximumValue;
            bool fade;

            do
            {
                fade = false;
                if (led.Red > 0)
                {
                    led.Red--;
                    fade = true;
                }
                if (led.Green > 0)
                {
                    led.Green--;
                    fade = true;
                }
                if (led.Blue < maximum)
                {
                    led.Blue++;
                    fade = true;
                }
            }while (fade);

            // Cycle LED in infinite loop...
            Debug.WriteLine("Cycling in infinite loop...");
            while (true)
            {
                // Red up via property...
                Debug.WriteLine("Red up via property...");
                while (led.Red < maximum)
                {
                    led.Red++;
                }

                // Wait a bit...
                Task.Delay(TimeSpan.FromSeconds(1)).Wait();

                // Blue down via property...
                Debug.WriteLine("Blue down via property...");
                while (led.Blue > 0)
                {
                    led.Blue--;
                }

                // Wait a bit...
                Task.Delay(TimeSpan.FromSeconds(1)).Wait();

                // Green up via property..
                Debug.WriteLine("Green up via property...");
                while (led.Green < maximum)
                {
                    led.Green++;
                }

                // Wait a bit...
                Task.Delay(TimeSpan.FromSeconds(1)).Wait();

                // Red down via set RGB method...
                Debug.WriteLine("Red down via set RGB method...");
                var red = maximum; var green = maximum; var blue = 0;
                do
                {
                    led.SetRgb(--red, green, blue);
                } while (red > 0);

                // Wait a bit...
                Task.Delay(TimeSpan.FromSeconds(1)).Wait();

                // Blue up via set RGB method...
                Debug.WriteLine("Blue up via set RGB method...");
                do
                {
                    led.SetRgb(red, green, ++blue);
                } while (blue < maximum);

                // Wait a bit...
                Task.Delay(TimeSpan.FromSeconds(1)).Wait();

                // Green down via set RGB method...
                Debug.WriteLine("Green down via set RGB method...");
                do
                {
                    led.SetRgb(red, --green, blue);
                } while (green > 0);

                // Wait a bit...
                Task.Delay(TimeSpan.FromSeconds(1)).Wait();
            }
        }
コード例 #6
0
        /// <summary>
        /// Application start-up.
        /// </summary>
        /// <param name="taskInstance">Task instance.</param>
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            // Initialize task
            _taskDeferral          = taskInstance.GetDeferral();
            taskInstance.Canceled += OnTaskCancelled;

            // Connect to hardware
            Debug.WriteLine("Connecting to Navio board.");
            _board = NavioDeviceProvider.Connect();
            Debug.WriteLine("Navio board was detected as a \"{0}\".", _board.Model);
            var fram = _board.Fram;

            if (fram == null)
            {
                // No FRAM on this board!
                Debug.WriteLine("This board does not have a FRAM chip!");
                throw new NotSupportedException();
            }
            Debug.WriteLine("FRAM has {0} bytes of memory.", fram.Size);

            // Log start
            Debug.WriteLine("Navio FRAM memory test start.");

            // Write single bytes
            Debug.WriteLine("Writing single bytes (all 1s)...");
            for (ushort address = 0; address < fram.Size; address++)
            {
                fram.WriteByte(address, 0xff);
            }

            // Read numbers
            Debug.WriteLine("Read single bytes (all 1s)...");
            for (ushort address = 0; address < fram.Size; address++)
            {
                var test = (address == 0) ?
                           fram.ReadByte(address) : // First call sets address to read from,
                           fram.ReadByte();         // then following calls continue forwards
                if (test != 0xff)
                {
                    // Data error!
                    throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
                                                                      "Invalid data, read {0:X2} but expected FF!", test));
                }
            }

            // Write numbers
            Debug.WriteLine("Writing sequential numbers...");
            for (ushort address = 0; address < fram.Size; address += 2)
            {
                var data = BitConverter.GetBytes(address);
                fram.WritePage(address, data);
            }

            // Read numbers
            Debug.WriteLine("Read of sequential numbers...");
            for (ushort address = 0; address < fram.Size; address += 2)
            {
                var data = BitConverter.GetBytes(address);
                var test = fram.ReadPage(address, 2);
                if (test.Length != data.Length || test[0] != data[0] || test[1] != data[1])
                {
                    // Data error!
                    throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
                                                                      "Invalid data, read {0:X2}{1:X2} but expected {2:X2}{3:X2}!", test[0], test[1], data[0], data[1]));
                }
            }

            // Block erase
            Debug.WriteLine("Block erase (write pages of 0s)...");
            var zeroBlock = new byte[fram.Size];

            fram.WritePage(0, zeroBlock);

            // Check erased
            Debug.WriteLine("Checking memory has been erased...");
            var testBlock = fram.ReadPage(0, zeroBlock.Length);

            for (var address = 0; address < zeroBlock.Length; address++)
            {
                var test = testBlock[address];
                if (test != 0)
                {
                    // Data error!
                    throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
                                                                      "Invalid data, read {0:X2} but expected 00!", address + address));
                }
            }

            // End
            Debug.WriteLine("Tests complete.");
            _taskDeferral.Complete();
        }