예제 #1
0
 private async Task HandlePackets()
 {
     while (!m_bShutDown)
     {
         BbTcpPacket packet;
         try
         {
             packet = await m_receivedPackets.ReceiveAsync(m_CancelToken.Token);
         }
         catch (OperationCanceledException)
         {
             break;
         }
         lock (m_liExpectedAnswers)
         {
             m_liExpectedAnswers.RemoveAll(x => x.GetExpectedAnswer() == packet.Opcode);
         }
         m_swLastAliveSign.Start();
         await HandlePacket(packet);
     }
 }
예제 #2
0
        public async Task <bool> StartScreenCappingAsync()
        {
            if (m_taskScreenCap != null && m_taskScreenCap.Status == TaskStatus.Running && !m_screenCapCancelToken.IsCancellationRequested)
            {
                return(true);
            }
            if (m_screenCapCancelToken != null)
            {
                m_screenCapCancelToken.Dispose();
            }
            m_screenCapCancelToken = new CancellationTokenSource();
            if (!await GetIsADBReadyAsync(GetAdbLocation(), m_screenCapCancelToken.Token))
            {
                Log.w(TAG, "Unable to capture screens from ADB. See the Debug Log for details", true);
                return(false);
            }
            // get one screen to test if it works out and so that the layout can be adjusted once this function returns
            BitmapImage first = await Task.Run(async() => await GetADBScreenCapAsync(GetAdbLocation(), m_screenCapCancelToken.Token, false));

            if (first == null)
            {
                first = await Task.Run(async() => await GetADBScreenCapAsync(GetAdbLocation(), m_screenCapCancelToken.Token, true));

                if (first == null)
                {
                    Log.w(TAG, "Unable to capture screens from ADB. See the Debug Log for details", true);
                    return(false);
                }
                m_bScreenCapFallbackMethod = true;
                Log.w(TAG, "Preferred ADB screen capture method not supported (either local or remote ADB too old), using fallback", true);
            }
            else
            {
                m_bScreenCapFallbackMethod = false;
            }
            CurrentScreenCap = first;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("CurrentScreenCap"));
            m_swLastScreenCapUpdate.Start();
            IsScreenCapOutOfDate = false;
            IsScreenCapActive    = true;

            m_taskScreenCap = Task.Run(async() =>
            {
                while (!m_screenCapCancelToken.IsCancellationRequested)
                {
                    BitmapImage newCap = await GetADBScreenCapAsync(GetAdbLocation(), m_screenCapCancelToken.Token, m_bScreenCapFallbackMethod);
                    if (newCap != null)
                    {
                        CurrentScreenCap = newCap;
                        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("CurrentScreenCap"));
                        m_swLastScreenCapUpdate.Start();
                        IsScreenCapOutOfDate = false;
                        await Task.Delay(Properties.Settings.Default.ScreenCapRefresh, m_screenCapCancelToken.Token);
                    }
                    else
                    {
                        m_screenCapCancelToken.Token.ThrowIfCancellationRequested();
                        IsScreenCapOutOfDate = true;
                        while (!await GetIsADBReadyAsync(GetAdbLocation(), m_screenCapCancelToken.Token) && !m_screenCapCancelToken.IsCancellationRequested)
                        {
                            await Task.Delay(5000, m_screenCapCancelToken.Token);
                        }
                    }

                    while (IsScreenCapPaused && !m_screenCapCancelToken.IsCancellationRequested)
                    {
                        if (m_swLastScreenCapUpdate.ElapsedMilliseconds > Properties.Settings.Default.ScreenCapRefresh * 2)
                        {
                            IsScreenCapOutOfDate = true;
                        }
                        await Task.Delay(250, m_screenCapCancelToken.Token);
                    }
                }
            });
            Log.i(TAG, "Screen capture successfully started", true);
            return(true);
        }