/// <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); } }
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; })); }