コード例 #1
0
 public async Task <bool> IsFileOnDevice(string filename, CancellationToken cancellationToken)
 {
     if (FilesOnDevice.Any() == false)
     {
         await GetFilesAndCrcsAsync(DefaultTimeout, 0, cancellationToken)
         .ConfigureAwait(false);
     }
     return(FilesOnDevice.ContainsKey(filename));
 }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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());
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
 public Task <bool> IsFileOnDevice(string filename)
 {
     return(Task.FromResult(FilesOnDevice.Contains(filename)));
 }