/// <summary> /// Flush data to the port /// </summary> /// <param name="force">Whether to flush all data to the port, even if it doesn't appear to have changed.</param> /// <returns>An awaitable task that completes when finished</returns> public async Task FlushAsync(bool force = false) { if (!CurrentValue.SequenceEqual(lastValues) || force) { if (Parent != null) { await Parent.FlushAsync().ConfigureAwait(false); } else { using (await lockObject.LockAsync().ConfigureAwait(false)) { // build the byte array to flush out of the port var bytes = new List <byte>(); var reversed = Children.Reverse().ToList(); // bytes are shuffled out last-device-first reversed.Add(this); // add ourselves foreach (var shift in reversed) { var shiftBytes = shift.CurrentValue; bytes.AddRange(shiftBytes.Reverse()); } await spiDevice.SendReceiveAsync(bytes.ToArray(), SpiBurstMode.BurstTx).ConfigureAwait(false); } } CurrentValue.CopyTo(lastValues, 0); } }