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 SetFileAndCrcsFromMessage(string fileListMember) { ConsoleOut($"SetFileAndCrcsFromMessage {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); FilesOnDevice.Add(file.Trim()); var crc = Convert.ToUInt32(fileListMember.Substring(crcStart, 10), 16); FileCrcs.Add(crc); }