Beispiel #1
0
        /// <summary>
        /// Tuning with timeout
        /// </summary>
        /// <param name="frequency"></param>
        /// <param name="bandWidth"></param>
        /// <param name="deliverySystem"></param>
        /// <returns>Signal strength
        /// 0 .. no signal</returns>
        public async Task <TuneResult> TuneEnhanced(long frequency, long bandWidth, int deliverySystem)
        {
            _log.Debug($"Tuning enhanced freq: {frequency} Mhz, type: {deliverySystem}");

            var res = new TuneResult();

            try
            {
                DVBTResponse tuneRes   = null;
                DVBTResponse setPIDres = null;

                // five attempts
                for (var i = 1; i <= 5; i++)
                {
                    tuneRes = await Tune(frequency, bandWidth, deliverySystem);

                    if (tuneRes.SuccessFlag)
                    {
                        break;
                    }
                    else
                    {
                        await Task.Delay(500);
                    }
                }

                if (!tuneRes.SuccessFlag)
                {
                    res.Result = SearchProgramResultEnum.Error;
                    return(res);
                }

                // set PIDs 0 and 17
                for (var i = 1; i <= 5; i++)
                {
                    setPIDres = await SetPIDs(new List <long>() { 0, 17, 18 });

                    if (setPIDres.SuccessFlag)
                    {
                        break;
                    }
                    else
                    {
                        await Task.Delay(100);
                    }
                }

                if (!setPIDres.SuccessFlag)
                {
                    res.Result = SearchProgramResultEnum.Error;
                    return(res);
                }

                // freq tuned

                // timeout for get signal:
                var startTime = DateTime.Now;

                DVBTStatus status = new DVBTStatus();

                while ((DateTime.Now - startTime).TotalSeconds < 10)
                {
                    status = await GetStatus();

                    if (!status.SuccessFlag)
                    {
                        res.Result = SearchProgramResultEnum.Error;
                        return(res);
                    }

                    if (status.hasSignal == 0 && status.hasCarrier == 0 && (DateTime.Now - startTime).TotalSeconds > 5)
                    {
                        res.Result = SearchProgramResultEnum.NoSignal;
                        break;
                    }

                    if (status.hasSignal == 1 && status.hasSync == 1 && status.hasLock == 1)
                    {
                        res.Result = SearchProgramResultEnum.OK;
                        break;
                    }

                    // waiting
                    await Task.Delay(850);
                }

                if (status.hasSignal != 1 || status.hasSync != 1 || status.hasLock != 1)
                {
                    res.Result = SearchProgramResultEnum.NoSignal;
                    return(res);
                }

                res.SignalPercentStrength = status.rfStrengthPercentage;

                return(res);
            }
            catch (Exception ex)
            {
                _log.Error(ex);

                res.Result = SearchProgramResultEnum.Error;
                return(res);
            }
        }
Beispiel #2
0
        private async Task <DVBTResponse> SendRequest(DVBTRequest request, int secondsTimeout = 20)
        {
            _log.Debug($"Sending request {request}");

            var startTime  = DateTime.Now;
            var bufferSize = 1024;

            return(await Task.Run(async() =>
            {
                var _responseBuffer = new List <byte>();

                try
                {
                    byte[] buffer = new byte[bufferSize];

                    bool reading = true;

                    request.Send(_controlStream);

                    do
                    {
                        if (_controlClient.Client.Available > 0)
                        {
                            //_log.Debug("Reading from stream ...");

                            var readByteCount = _controlStream.Read(buffer, 0, bufferSize);

                            if (readByteCount > 0)
                            {
                                _log.Debug($"Received {readByteCount} bytes");

                                for (var i = 0; i < readByteCount; i++)
                                {
                                    _responseBuffer.Add(buffer[i]);
                                }
                                if (request.ResponseBytesExpectedCount >= _responseBuffer.Count)
                                {
                                    reading = false;
                                }
                            }
                        }
                        else
                        {
                            //_log.Debug("No data available ...");
                        }

                        var timeSpan = Math.Abs((DateTime.Now - startTime).TotalSeconds);
                        if (timeSpan > secondsTimeout)
                        {
                            throw new TimeoutException("TimeOut");
                        }

                        await Task.Delay(200);
                    }while (reading);
                }
                catch (TimeoutException)
                {
                    _log.Debug("Timeout for reading data ...");
                    return new DVBTResponse()
                    {
                        SuccessFlag = false
                    };
                }
                catch (Exception ex)
                {
                    _log.Debug($"General error: {ex}");
                    return new DVBTResponse()
                    {
                        SuccessFlag = false
                    };
                }

                _log.Debug($"Request sent");

                var response = new DVBTResponse()
                {
                    SuccessFlag = true,
                    RequestTime = startTime,
                    ResponseTime = DateTime.Now
                };
                response.Bytes.AddRange(_responseBuffer);
                return response;
            }));
        }