コード例 #1
0
        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}");
        }
コード例 #2
0
        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}");
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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}");
        }
コード例 #6
0
 async Task DeleteUnusedFiles(MeadowSerialDevice meadow, IOutputPaneWriter outputPaneWriter, CancellationToken cts,
                              (List <string> files, List <UInt32> crcs) meadowFiles, (List <string> files, List <UInt32> crcs) localFiles)
コード例 #7
0
        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);
        }
コード例 #8
0
        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);
        }