public async Task FinishTune() { await Task.Run(() => { try { TunedChannels.Clear(); _actualTuningDVBTType = -1; _actualTunningChannel = -1; State = TuneState.Ready; } catch (Exception ex) { _loggingService.Error(ex); } finally { OnPropertyChanged(nameof(TuningLabel)); OnPropertyChanged(nameof(AutomaticTuningProgress)); OnPropertyChanged(nameof(TuningFinished)); OnPropertyChanged(nameof(TunedChannels)); OnPropertyChanged(nameof(AddChannelsVisible)); } }); }
private async Task Tune(long freq, long bandWidth, int dvbtTypeIndex) { try { //#if DEBUG // await Task.Delay(1000); // var channel = new DVBTChannel(); // channel.PIDs = "0,16,17"; // channel.ProgramMapPID = 5000; // channel.Name = "Channel name"; // channel.ProviderName = "Multiplex"; // channel.Frequency = freq; // channel.Bandwdith = bandWidth; // channel.Number = String.Empty; // channel.DVBTType = dvbtTypeIndex; // channel.Type = ServiceTypeEnum.DigitalTelevisionService; // TunedChannels.Add(channel); // Device.BeginInvokeOnMainThread(() => // { // SelectedChannel = channel; // }); //#endif var tuneResult = await _driver.TuneEnhanced(freq, bandWidth, dvbtTypeIndex); switch (tuneResult.Result) { case SearchProgramResultEnum.Error: _loggingService.Debug("Search error"); SignalStrengthProgress = 0; return; case SearchProgramResultEnum.NoSignal: _loggingService.Debug("No signal"); SignalStrengthProgress = 0; return; case SearchProgramResultEnum.OK: SignalStrengthProgress = tuneResult.SignalPercentStrength / 100.0; break; } var searchMapPIDsResult = await _driver.SearchProgramMapPIDs(false); switch (searchMapPIDsResult.Result) { case SearchProgramResultEnum.Error: _loggingService.Debug("Search error"); return; case SearchProgramResultEnum.NoSignal: _loggingService.Debug("No signal"); return; case SearchProgramResultEnum.NoProgramFound: _loggingService.Debug("No program found"); return; } var mapPIDs = new List <long>(); var mapPIDToServiceDescriptor = new Dictionary <long, ServiceDescriptor>(); foreach (var sd in searchMapPIDsResult.ServiceDescriptors) { mapPIDs.Add(sd.Value); mapPIDToServiceDescriptor.Add(sd.Value, sd.Key); } _loggingService.Debug($"Program MAP PIDs found: {String.Join(",", mapPIDs)}"); if (TuningAborted) { _loggingService.Debug($"Tuning aborted"); return; } // searching PIDs var searchProgramPIDsResult = await _driver.SearchProgramPIDs(mapPIDs); switch (searchProgramPIDsResult.Result) { case SearchProgramResultEnum.Error: _loggingService.Debug($"Error scanning Map PIDs"); break; case SearchProgramResultEnum.NoSignal: _loggingService.Debug("No signal"); break; case SearchProgramResultEnum.NoProgramFound: _loggingService.Debug("No program found"); break; case SearchProgramResultEnum.OK: var totalChannelsAddedCount = 0; foreach (var kvp in searchProgramPIDsResult.PIDs) { var pids = string.Join(",", kvp.Value); var sDescriptor = mapPIDToServiceDescriptor[kvp.Key]; var ch = new DVBTChannel(); ch.PIDs = pids; ch.ProgramMapPID = kvp.Key; ch.Name = sDescriptor.ServiceName; ch.ProviderName = sDescriptor.ProviderName; ch.Frequency = freq; ch.Bandwdith = bandWidth; ch.Number = String.Empty; ch.DVBTType = dvbtTypeIndex; ch.Type = (ServiceTypeEnum)sDescriptor.ServisType; TunedChannels.Add(ch); Device.BeginInvokeOnMainThread(() => { SelectedChannel = ch; }); _loggingService.Debug($"Found channel \"{sDescriptor.ServiceName}\""); // automatically adding new tuned channel if does not exist if (!ConfigViewModel.ChannelExists(_channels, ch.Frequency, ch.ProgramMapPID)) { ch.Number = ConfigViewModel.GetNextChannelNumber(_channels).ToString(); _channels.Add(ch); await _channelService.SaveChannels(_channels); totalChannelsAddedCount++; } } if (totalChannelsAddedCount > 0) { if (totalChannelsAddedCount > 1) { MessagingCenter.Send($"{totalChannelsAddedCount} channels saved", BaseViewModel.MSG_ToastMessage); } else { MessagingCenter.Send($"Channel saved", BaseViewModel.MSG_ToastMessage); } } break; } } catch (Exception ex) { throw; } }
private async Task Tune() { _loggingService.Info($"Tuning"); State = TuneState.TuningInProgress; TunedChannels.Clear(); _channels = await _channelService.LoadChannels(); if (_channels == null) { _channels = new ObservableCollection <DVBTChannel>(); } OnPropertyChanged(nameof(TuningLabel)); OnPropertyChanged(nameof(AutomaticTuningProgress)); TuningAborted = false; try { if (ManualTuning) { long freq = Convert.ToInt64(TuneFrequency) * 1000000; long bandWidth = TuneBandwidth * 1000000; var ch = Convert.ToInt32((Convert.ToInt64(TuneFrequency) - 474 + 8 * 21) / 8); _actualTunningChannel = ch; _actualTuningDVBTType = 0; OnPropertyChanged(nameof(TuningLabel)); if (DVBTTuning) { await Tune(freq, bandWidth, 0); } _actualTuningDVBTType = 1; OnPropertyChanged(nameof(TuningLabel)); if (DVBT2Tuning) { await Tune(freq, bandWidth, 1); } } else { await AutomaticTune(); } State = TuneState.TuneFinishedOK; } catch (Exception ex) { State = TuneState.TuneFailed; } finally { OnPropertyChanged(nameof(TuningFinished)); OnPropertyChanged(nameof(TunedChannels)); OnPropertyChanged(nameof(AddChannelsVisible)); OnPropertyChanged(nameof(TuningLabel)); OnPropertyChanged(nameof(AutomaticTuningProgress)); } }