async Task DeployAppAsync(string target, string folder, IOutputPaneWriter outputPaneWriter, CancellationToken cts) { Stopwatch sw = Stopwatch.StartNew(); await outputPaneWriter.WriteAsync($"Deploying to Meadow on {target}..."); try { var meadow = _currentDevice = await MeadowDeviceManager.GetMeadowForSerialPort(target); EventHandler <MeadowMessageEventArgs> handler = (s, e) => { if (!string.IsNullOrEmpty(e.Message)) { outputPaneWriter.WriteAsync(e.Message).Wait(); } }; await MeadowDeviceManager.MonoDisable(meadow).ConfigureAwait(false); meadow.OnMeadowMessage += handler; await MeadowDeviceManager.DeployApp(meadow, Path.Combine(folder, "App.exe")); meadow.OnMeadowMessage -= handler; await MeadowDeviceManager.MonoEnable(meadow).ConfigureAwait(false); } catch (Exception ex) { throw ex; } sw.Stop(); await outputPaneWriter.WriteAsync($"Deployment Duration: {sw.Elapsed}"); }
async Task DeployAppAsync(string target, string folder, IOutputPaneWriter outputPaneWriter, CancellationToken cts) { Stopwatch sw = Stopwatch.StartNew(); await outputPaneWriter.WriteAsync($"Deploying to Meadow on {target}..."); try { var meadow = await MeadowDeviceManager.GetMeadowForSerialPort(target).ConfigureAwait(false); if (meadow == null) { await outputPaneWriter.WriteAsync($"Device connection error, please disconnect device and try again."); return; } await MeadowDeviceManager.ResetMeadow(meadow).ConfigureAwait(false); await Task.Delay(1000); meadow = await MeadowDeviceManager.GetMeadowForSerialPort(target).ConfigureAwait(false); await Task.Delay(1000); await MeadowDeviceManager.MonoDisable(meadow).ConfigureAwait(false); var meadowFiles = await GetFilesOnDevice(meadow, outputPaneWriter, cts).ConfigureAwait(false); var localFiles = await GetLocalFiles(outputPaneWriter, cts, folder).ConfigureAwait(false); await DeleteUnusedFiles(meadow, outputPaneWriter, cts, meadowFiles, localFiles).ConfigureAwait(false); await DeployApp(meadow, outputPaneWriter, cts, folder, meadowFiles, localFiles).ConfigureAwait(false); await MeadowDeviceManager.MonoEnable(meadow).ConfigureAwait(false); } catch (Exception ex) { throw ex; } sw.Stop(); await outputPaneWriter.WriteAsync($"Deployment Duration: {sw.Elapsed}"); }
async Task <(List <string> files, List <UInt32> crcs)> GetLocalFiles(IOutputPaneWriter outputPaneWriter, CancellationToken cts, string folder) { // get list of files in folder // var files = Directory.GetFiles(folder, "*.dll"); var paths = Directory.EnumerateFiles(folder, "*.*", SearchOption.TopDirectoryOnly) .Where(s => s.EndsWith(".exe") || s.EndsWith(".dll") || s.EndsWith(".bmp") || s.EndsWith(".jpg") || s.EndsWith(".jpeg") || s.EndsWith(".txt")); var files = new List <string>(); var crcs = new List <UInt32>(); foreach (var file in paths) { if (cts.IsCancellationRequested) { break; } using (FileStream fs = File.Open(file, FileMode.Open)) { var len = (int)fs.Length; var bytes = new byte[len]; fs.Read(bytes, 0, len); //0x var crc = CrcTools.Crc32part(bytes, len, 0);// 0x04C11DB7); Console.WriteLine($"{file} crc is {crc}"); files.Add(Path.GetFileName(file)); crcs.Add(crc); } } return(files, crcs); }
async Task <bool> InitializeMeadowDeviceAsync(MeadowSerialDevice meadow, IOutputPaneWriter outputPaneWriter, CancellationToken cts) { if (cts.IsCancellationRequested) { return(true); } await outputPaneWriter.WriteAsync("Initializing Meadow"); if (meadow == null) { await outputPaneWriter.WriteAsync("Can't read Meadow device"); return(false); } meadow.Initialize(false); MeadowDeviceManager.MonoDisable(meadow); await Task.Delay(5000); //hack for testing if (meadow.Initialize() == false) { await outputPaneWriter.WriteAsync("Couldn't initialize serial port"); return(false); } else { MeadowDeviceManager.GetDeviceInfo(meadow); await Task.Delay(1000); // wait for device info to populate await outputPaneWriter.WriteAsync($"Device {meadow.DeviceInfo.MeadowOSVersion}"); } return(true); }
async Task DeployAppAsync(string target, string folder, IOutputPaneWriter outputPaneWriter, CancellationToken cts) { Stopwatch sw = Stopwatch.StartNew(); await outputPaneWriter.WriteAsync($"Deploying to Meadow on {target}..."); try { var meadow = MeadowDeviceManager.CurrentDevice; if (meadow == null) { meadow = await MeadowDeviceManager.GetMeadowForSerialPort(target); } if (await InitializeMeadowDeviceAsync(meadow, outputPaneWriter, cts) == false) { throw new Exception("Failed to initialize Meadow. Try resetting or reconnecting the device."); } var meadowFiles = await GetFilesOnDevice(meadow, outputPaneWriter, cts); var localFiles = await GetLocalFiles(outputPaneWriter, cts, folder); await DeleteUnusedFiles(meadow, outputPaneWriter, cts, meadowFiles, localFiles); await DeployApp(meadow, outputPaneWriter, cts, folder, meadowFiles, localFiles); await ResetMeadowAndStartMonoAsync(meadow, outputPaneWriter, cts); } catch (Exception ex) { throw ex; } sw.Stop(); await outputPaneWriter.WriteAsync($"Deployment Duration: {sw.Elapsed}"); }
async Task DeleteUnusedFiles(MeadowSerialDevice meadow, IOutputPaneWriter outputPaneWriter, CancellationToken cts, (List <string> files, List <UInt32> crcs) meadowFiles, (List <string> files, List <UInt32> crcs) localFiles)
async Task <(List <string> files, List <UInt32> crcs)> GetFilesOnDevice(MeadowSerialDevice meadow, IOutputPaneWriter outputPaneWriter, CancellationToken cts) { if (cts.IsCancellationRequested) { return(new List <string>(), new List <UInt32>()); } await outputPaneWriter.WriteAsync("Checking files on device (may take several seconds)"); var meadowFiles = await meadow.GetFilesAndCrcs(30000); foreach (var f in meadowFiles.files) { if (cts.IsCancellationRequested) { break; } await outputPaneWriter.WriteAsync($"Found {f}").ConfigureAwait(false); } if (meadowFiles.files.Count == 0) { await outputPaneWriter.WriteAsync($"Deploying for the first time may take several minutes.").ConfigureAwait(false); } return(meadowFiles); }
async Task <(List <string> files, List <UInt32> crcs)> GetLocalFiles(IOutputPaneWriter outputPaneWriter, CancellationToken cts, string folder) { // get list of files in folder // var files = Directory.GetFiles(folder, "*.dll"); CopySystemNetHttpDll(); var extensions = new List <string> { ".exe", ".bmp", ".jpg", ".jpeg", ".json", ".xml", ".yml", ".txt" }; var paths = Directory.EnumerateFiles(folder, "*.*", SearchOption.TopDirectoryOnly) .Where(s => extensions.Contains(new FileInfo(s).Extension)); var files = new List <string>(); var crcs = new List <UInt32>(); foreach (var file in paths) { if (cts.IsCancellationRequested) { break; } using (FileStream fs = File.Open(file, FileMode.Open)) { var len = (int)fs.Length; var bytes = new byte[len]; fs.Read(bytes, 0, len); //0x var crc = CrcTools.Crc32part(bytes, len, 0);// 0x04C11DB7); Console.WriteLine($"{file} crc is {crc}"); files.Add(Path.GetFileName(file)); crcs.Add(crc); } } var dependences = AssemblyManager.GetDependencies("App.exe", folder); //crawl dependences foreach (var file in dependences) { if (cts.IsCancellationRequested) { break; } using (FileStream fs = File.Open(Path.Combine(folder, file), FileMode.Open)) { var len = (int)fs.Length; var bytes = new byte[len]; fs.Read(bytes, 0, len); //0x var crc = CrcTools.Crc32part(bytes, len, 0);// 0x04C11DB7); Console.WriteLine($"{file} crc is {crc}"); files.Add(Path.GetFileName(file)); crcs.Add(crc); } } return(files, crcs); }