public async Task <bool> IsFileOnDevice(string filename, CancellationToken cancellationToken) { if (FilesOnDevice.Any() == false) { await GetFilesAndCrcsAsync(DefaultTimeout, 0, cancellationToken) .ConfigureAwait(false); } return(FilesOnDevice.ContainsKey(filename)); }
public override async Task <List <string> > GetFilesOnDevice(bool refresh = true, int timeoutInMs = 30000) { if (SerialPort == null) { throw new Exception("SerialPort not intialized"); } if (FilesOnDevice.Count == 0 || refresh == true) { var timeOutTask = Task.Delay(timeoutInMs); EventHandler <MeadowMessageEventArgs> handler = null; var tcs = new TaskCompletionSource <bool>(); bool started = false; handler = (s, e) => { if (e.MessageType == MeadowMessageType.FileListTitle) { FilesOnDevice.Clear(); FileCrcs.Clear(); started = true; } else if (started == false) { //ignore everything until we've started a new file list request return; } if (e.MessageType == MeadowMessageType.FileListMember) { SetFileNameFromMessage(e.Message); } if (e.MessageType == MeadowMessageType.Concluded) { tcs.SetResult(true); } }; DataProcessor.OnReceiveData += handler; await MeadowFileManager.ListFiles(this); await Task.WhenAny(new Task[] { timeOutTask, tcs.Task }); DataProcessor.OnReceiveData -= handler; } return(FilesOnDevice); }
public override async Task <(List <string> files, List <UInt32> crcs)> GetFilesAndCrcs(int timeoutInMs = 60000) { if (SerialPort == null) { throw new Exception("SerialPort not intialized"); } var timeOutTask = Task.Delay(timeoutInMs); EventHandler <MeadowMessageEventArgs> handler = null; var tcs = new TaskCompletionSource <bool>(); var started = false; handler = (s, e) => { Console.WriteLine($"Msg: {e.MessageType}"); if (e.MessageType == MeadowMessageType.FileListTitle) { FilesOnDevice.Clear(); FileCrcs.Clear(); started = true; } else if (started == false) { //ignore everything until we've started a new file list request return; } if (e.MessageType == MeadowMessageType.FileListCrcMember) { SetFileAndCrcsFromMessage(e.Message); } if (e.MessageType == MeadowMessageType.Concluded) { tcs.TrySetResult(true); } }; DataProcessor.OnReceiveData += handler; await MeadowFileManager.ListFilesAndCrcs(this).ConfigureAwait(false); await Task.WhenAny(new Task[] { timeOutTask, tcs.Task }); DataProcessor.OnReceiveData -= handler; return(FilesOnDevice, FileCrcs); }
void SetFileNameFromMessage(string fileListMember) { int fileNameStart = fileListMember.LastIndexOf('/') + 1; int crcStart = fileListMember.IndexOf('[') + 1; if (fileNameStart == 0 && crcStart == 0) { return; // No files found } Debug.Assert(crcStart == 0); var file = fileListMember.Substring(fileNameStart, fileListMember.Length - fileNameStart); FilesOnDevice.Add(file.Trim()); }
private void SetFileAndCrcsFromMessage(string fileListMember) { int fileNameStart = fileListMember.LastIndexOf('/') + 1; int crcStart = fileListMember.IndexOf('[') + 1; if (fileNameStart == 0 && crcStart == 0) { return; // No files found } Debug.Assert(crcStart > fileNameStart); var file = fileListMember.Substring(fileNameStart, crcStart - fileNameStart - 2); var crc = Convert.ToUInt32(fileListMember.Substring(crcStart, 10), 16); FilesOnDevice.Add(file.Trim(), crc); }
public async Task <IDictionary <string, uint> > GetFilesAndCrcsAsync( TimeSpan timeout, int partition = 0, CancellationToken cancellationToken = default) { var started = false; EventHandler <MeadowMessageEventArgs> handler = (s, e) => { if (e.MessageType == MeadowMessageType.FileListTitle) { FilesOnDevice.Clear(); started = true; } else if (started == false) { //ignore everything until we've started a new file list request return; } if (e.MessageType == MeadowMessageType.FileListCrcMember) { SetFileAndCrcsFromMessage(e.Message); } }; var command = new SimpleCommandBuilder(HcomMeadowRequestType.HCOM_MDOW_REQUEST_LIST_PART_FILES_AND_CRC) .WithResponseHandler(handler) .WithUserData((uint)partition) .Build(); await SendCommandAsync(command, cancellationToken) .ConfigureAwait(false); return(FilesOnDevice); }
public Task <bool> IsFileOnDevice(string filename) { return(Task.FromResult(FilesOnDevice.Contains(filename))); }