Skip to content

Commit

Permalink
feat(sdr-flight-widget): add power reference indicator to FlightSdrView
Browse files Browse the repository at this point in the history
  • Loading branch information
asvol committed Nov 29, 2023
1 parent 0dceee1 commit ef90275
Show file tree
Hide file tree
Showing 7 changed files with 176 additions and 27 deletions.
4 changes: 2 additions & 2 deletions src/Asv.Drones.Gui.Custom.props
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
<Nullable>enable</Nullable>
<ProductVersion>0.1.0</ProductVersion>
<AvaloniaVersion>11.0.0</AvaloniaVersion>
<AsvCommonVersion>1.13.0</AsvCommonVersion>
<AsvMavlinkVersion>3.6.0-alpha07</AsvMavlinkVersion>
<AsvCommonVersion>1.13.1</AsvCommonVersion>
<AsvMavlinkVersion>3.6.0-alpha08</AsvMavlinkVersion>
<FluentAvaloniaUIVersion>2.0.0</FluentAvaloniaUIVersion>
<ReactiveUIVersion>19.3.3</ReactiveUIVersion>
<MaterialIconsAvaloniaVersion>2.0.1</MaterialIconsAvaloniaVersion>
Expand Down
27 changes: 27 additions & 0 deletions src/Asv.Drones.Gui.Sdr/RS.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions src/Asv.Drones.Gui.Sdr/RS.resx
Original file line number Diff line number Diff line change
Expand Up @@ -318,4 +318,13 @@
<data name="SdrStoreShellMenuItem_Name" xml:space="preserve">
<value>SDR store</value>
</data>
<data name="FlightSdrView_StartMission_Title" xml:space="preserve">
<value>Start mission</value>
</data>
<data name="FlightSdrView_StopMission_Title" xml:space="preserve">
<value>Stop mission</value>
</data>
<data name="FlightSdrView_SetMode_Title" xml:space="preserve">
<value>Set mode</value>
</data>
</root>
9 changes: 9 additions & 0 deletions src/Asv.Drones.Gui.Sdr/RS.ru.resx
Original file line number Diff line number Diff line change
Expand Up @@ -311,4 +311,13 @@
<data name="SdrStoreShellMenuItem_Name" xml:space="preserve">
<value>SDR хранилище</value>
</data>
<data name="FlightSdrView_StartMission_Title" xml:space="preserve">
<value>Старт миссии</value>
</data>
<data name="FlightSdrView_StopMission_Title" xml:space="preserve">
<value>Стоп миссии</value>
</data>
<data name="FlightSdrView_SetMode_Title" xml:space="preserve">
<value>Установить режим</value>
</data>
</root>
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@
<Design.DataContext>
<sdr:FlightSdrViewModel/>
</Design.DataContext>
<UserControl.Styles>
<Style Selector="ProgressBar#OverflowProgressBar.overflow">
<Setter Property="Foreground" Value="Red"/>
</Style>
<Style Selector="ProgressBar#OverflowProgressBar">
<Setter Property="Foreground" Value="Green"/>
</Style>
</UserControl.Styles>
<Border Background="{DynamicResource SolidBackgroundFillColorBase}" Opacity="0.8" CornerRadius="{DynamicResource ControlCornerRadius}" ClipToBounds="True">
<StackPanel Margin="10" Spacing="8">
<DockPanel DockPanel.Dock="Top">
Expand Down Expand Up @@ -63,28 +71,61 @@
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Grid IsVisible="{Binding !IsIdleMode}">
<DockPanel>
<DropDownButton VerticalAlignment="Top" IsVisible="{CompiledBinding !IsGpMode}" Margin="8 0 0 0" DockPanel.Dock="Right">
<avalonia:MaterialIcon Kind="Table"/>
<DropDownButton.Flyout>
<Flyout>
<AutoCompleteBox Width="250" ItemsSource="{Binding Channels}"
Text="{Binding Channel}"/>
</Flyout>
</DropDownButton.Flyout>
</DropDownButton>
<TextBox Text="{Binding FrequencyInMhz}">
<TextBox.InnerRightContent>
<TextBlock Margin="8 0" Text="{Binding FrequencyUnits}" VerticalAlignment="Center" />
</TextBox.InnerRightContent>
</TextBox>
</DockPanel>
<Grid IsVisible="{Binding !IsIdleMode}" ColumnDefinitions="*,8,Auto,0,Auto">
<TextBox Grid.Column="0" Text="{Binding FrequencyInMhz}">
<TextBox.InnerRightContent>
<TextBlock Margin="8 0" Text="{Binding FrequencyUnits}" VerticalAlignment="Center" />
</TextBox.InnerRightContent>
</TextBox>
<DropDownButton Grid.Column="2" VerticalAlignment="Top" IsVisible="{CompiledBinding !IsGpMode}" Margin="0,0,8,0">
<avalonia:MaterialIcon Kind="Table"/>
<DropDownButton.Flyout>
<Flyout>
<AutoCompleteBox Width="250" ItemsSource="{Binding Channels}"
Text="{Binding Channel}"/>
</Flyout>
</DropDownButton.Flyout>
</DropDownButton>

<Panel MinWidth="150" Grid.Column="4">
<ComboBox HorizontalAlignment="Stretch" SelectedItem="{Binding RefPowerSelectedItem}" ItemsSource="{Binding ReferencePowerItems}">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="sdr:ReferencePowerItem">
<StackPanel Orientation="Horizontal" Spacing="8">
<avalonia:MaterialIcon Kind="{Binding Icon, Mode=OneWay}" Width="16" Height="16"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ProgressBar x:Name="OverflowProgressBar" Margin="5,0" VerticalAlignment="Bottom" Minimum="0" Maximum="1" Value="{Binding SignalOverflowValue}"
Classes.overflow="{Binding IsSignalOverflow}" >

</ProgressBar>
</Panel>

</Grid>
<Button Command="{Binding UpdateMode}" HorizontalAlignment="Stretch">Set</Button>

<Button Command="{Binding UpdateMode}" HorizontalAlignment="Stretch">
<StackPanel Spacing="8" Orientation="Horizontal">
<avalonia:MaterialIcon Kind="Check"/>
<TextBlock Text="{x:Static sdr:RS.FlightSdrView_StartMission_Title}"/>
</StackPanel>

</Button>
<StackPanel Spacing="3">
<Button HorizontalAlignment="Stretch" IsVisible="{Binding !IsMissionStarted}" Command="{Binding StartMission}">Start mission</Button>
<Button HorizontalAlignment="Stretch" IsVisible="{Binding IsMissionStarted}" Command="{Binding StopMission}">Stop mission</Button>
<Button HorizontalAlignment="Stretch" IsVisible="{Binding !IsMissionStarted}" Command="{Binding StartMission}">
<StackPanel Spacing="8" Orientation="Horizontal">
<avalonia:MaterialIcon Kind="RayStartArrow"/>
<TextBlock Text="{x:Static sdr:RS.FlightSdrView_StartMission_Title}"/>
</StackPanel>
</Button>
<Button HorizontalAlignment="Stretch" IsVisible="{Binding IsMissionStarted}" Command="{Binding StopMission}">
<StackPanel Spacing="8" Orientation="Horizontal">
<avalonia:MaterialIcon Kind="RayStartArrow"/>
<TextBlock Text="{x:Static sdr:RS.FlightSdrView_StopMission_Title}"/>
</StackPanel>
</Button>
<TextBlock Text="{Binding MissionStatusText}"/>
<ProgressBar IsVisible="{Binding IsMissionStarted}" IsIndeterminate="True" />
</StackPanel>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using Asv.Mavlink.V2.AsvSdr;
using Asv.Mavlink.V2.Common;
using Avalonia.Controls;
using Avalonia.Media;
using DocumentFormat.OpenXml.Wordprocessing;
using DynamicData;
using DynamicData.Binding;
Expand All @@ -34,6 +35,22 @@ public class FlightSdrViewModelConfig
public uint ThinningFrequency { get; set; } = 5;
}

public class ReferencePowerItem
{
public ReferencePowerItem(string name, float power, bool isDefault,MaterialIconKind icon)
{
Name = name;
Power = power;
IsDefault = isDefault;
Icon = icon;
}

public MaterialIconKind Icon { get; set; }
public string Name { get; set; }
public float Power { get; set; }
public bool IsDefault { get; set; }
}

public class FlightSdrViewModel:FlightSdrWidgetBase
{
private readonly ISdrClientDevice _payload;
Expand All @@ -55,6 +72,13 @@ public FlightSdrViewModel()
{
new LlzSdrRttViewModel(),
});
ReferencePowerItems = new[]
{
new ReferencePowerItem("Low signal", -100, false, MaterialIconKind.SignalCellular1),
new ReferencePowerItem("Normal", -60, true, MaterialIconKind.SignalCellular2),
new ReferencePowerItem("High signal", 0, false, MaterialIconKind.SignalCellular3),
};
RefPowerSelectedItem = ReferencePowerItems[1];
}
}

Expand All @@ -68,8 +92,29 @@ public FlightSdrViewModel()
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
_config = _configuration.Get<FlightSdrViewModelConfig>();
_freqInMHzMeasureUnit = _loc.Frequency.AvailableUnits.First(_ => _.Id == Core.FrequencyUnits.MHz);


ReferencePowerItems = new[]
{
new ReferencePowerItem("Low signal", -100, false, MaterialIconKind.SignalCellular1),
new ReferencePowerItem("Normal", -60, true, MaterialIconKind.SignalCellular2),
new ReferencePowerItem("High signal", 0, false, MaterialIconKind.SignalCellular3),
};
RefPowerSelectedItem = ReferencePowerItems[1];

payload.Sdr.Base.Status.Select(_=>_.RefPower)
.DistinctUntilChanged()
.Where(x=>!float.IsNaN(x))
.Subscribe(x=>RefPowerSelectedItem = ReferencePowerItems.MinItem(t=>t.Power - x))
.DisposeItWith(Disposable);
payload.Sdr.Base.Status.Select(_=>_.SignalOverflow)
.DistinctUntilChanged()
.Where(x=>!float.IsNaN(x))
.Subscribe(x=>
{
SignalOverflowValue = x;
IsSignalOverflow = x > 0.8;
})
.DisposeItWith(Disposable);

this.WhenValueChanged(_ => _.SelectedMode)
.Subscribe(SelectedModeChanged).DisposeItWith(Disposable);
Expand Down Expand Up @@ -130,10 +175,16 @@ public FlightSdrViewModel()
case AsvSdrCustomMode.AsvSdrCustomModeIdle: default:
break;
}
// TODO: add reference poewer text box
var refPower = -60.0f;
if (RefPowerSelectedItem!= null)
{
refPower = RefPowerSelectedItem.Power;
}
_configuration.Set(_config);
return Payload.Sdr.SetModeAndCheckResult(SelectedMode.Mode,
(ulong)Math.Round(_freqInMHzMeasureUnit.ConvertToSi(FrequencyInMhz)), _config.WriteFrequency, _config.ThinningFrequency, -50, cancel);
(ulong)Math.Round(_freqInMHzMeasureUnit.ConvertToSi(FrequencyInMhz)), _config.WriteFrequency, _config.ThinningFrequency, refPower, cancel);
});
UpdateMode.ThrownExceptions.Subscribe(ex =>
{
Expand Down Expand Up @@ -231,6 +282,7 @@ private void SelectedModeChanged(SdrModeViewModel? _)
FrequencyInMhz = _config.GpFrequencyInMhz;
IsIdleMode = false;
IsGpMode = true;

break;
case AsvSdrCustomMode.AsvSdrCustomModeLlz:
Channels = SdrRttHelper.GetLlzChannels();
Expand Down Expand Up @@ -436,7 +488,17 @@ private void UpdateModes(AsvSdrCustomModeFlag flag)
public ReactiveCommand<Unit,Unit> StopRecord { get; }
public ICommand SafeRebootOSCommand { get; set; }
public ICommand SafeShutdownOSCommand { get; set; }



[Reactive]
public ReferencePowerItem[] ReferencePowerItems { get; set; }
[Reactive]
public ReferencePowerItem RefPowerSelectedItem { get; set; }

[Reactive]
public double SignalOverflowValue { get; set; }
[Reactive]
public bool IsSignalOverflow { get; set; }
}
public class SdrModeViewModel:ReactiveObject
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,8 @@ private async Task<Unit> DownloadRecordImpl(Unit arg, IProgress<double> progress
alreadyDownloaded += readed;
progress.Report((alreadyDownloaded / (double)remoteCount));
DownloadRecordAction = $"Read {alreadyDownloaded} of {writer.File.Count}";
}
}

await Store.Refresh.Execute();
return Unit.Default;
}
Expand Down

0 comments on commit ef90275

Please sign in to comment.