public void Start(string file) { if (file == null) { throw new ArgumentNullException(nameof(file)); } if (!CanStart) { throw new InvalidOperationException("Drone not ready for OTA"); } Started = true; Done = false; Position = 0; data = File.ReadAllBytes(file); using (var md5 = MD5.Create()) { Hash = BitConverter.ToString(md5.ComputeHash(data)).Replace("-", "").ToLower(); } Drone.SendPacket(new PacketBeginOTA(Hash, (uint)Size), true, (s, p) => { if (IsRunning) { SendData(); } else { Drone.OnDataChange += Drone_OnDataChange; } }); }
private void SendData() { if (!IsRunning) { Started = false; Done = false; return; } OnProgress?.Invoke(this, EventArgs.Empty); int chunkSize = Math.Min(256, Size - Position); byte[] chunk = new byte[chunkSize]; Array.Copy(data, Position, chunk, 0, chunkSize); byte hash = 0; foreach (byte b in chunk) { hash ^= b; } Drone.SendPacket(new PacketDataOTA(chunkSize, hash, chunk), true, (s, p) => { Position += chunkSize; if (Position >= Size) { Drone.SendPacket(new PacketEndOTA(false), true); Done = true; return; } SendData(); }); }
public void Abort() { if (!IsRunning) { throw new InvalidOperationException("OTA not running"); } Done = false; Started = false; Drone.SendPacket(new PacketEndOTA(true), false); Drone.OnDataChange -= Drone_OnDataChange; }