/// <summary> /// Creates and initializes an instance. /// </summary> public NavioRCInputDevice() { // Initialize buffers and events _valueBuffer = new ConcurrentQueue<PwmValue>(); _valueTrigger = new AutoResetEvent(false); _frameBuffer = new ConcurrentQueue<PwmFrame>(); _frameTrigger = new AutoResetEvent(false); // Configure GPIO _inputPin = GpioController.GetDefault().OpenPin(InputPinNumber); if (_inputPin.GetDriveMode() != GpioPinDriveMode.Input) _inputPin.SetDriveMode(GpioPinDriveMode.Input); _inputPin.DebounceTimeout = TimeSpan.Zero; _inputPin.ValueChanged += OnInputPinValueChanged; // Create decoder thread (CPPM only to start with, SBus desired) _decoder = new CppmDecoder(); _stop = new CancellationTokenSource(); _channels = new int[_decoder.MaximumChannels]; Channels = new ReadOnlyCollection<int>(_channels); _decoderTask = Task.Factory.StartNew(() => { _decoder.Decode(_valueBuffer, _valueTrigger, _frameBuffer, _frameTrigger, _stop.Token); }); // Create receiver thread _receiverTask = Task.Factory.StartNew(() => { Receiver(); }); }