diff --git a/.github/workflows/ApiReleaseDeployAction.yml b/.github/workflows/ApiReleaseDeployAction.yml
new file mode 100644
index 00000000..8a706188
--- /dev/null
+++ b/.github/workflows/ApiReleaseDeployAction.yml
@@ -0,0 +1,68 @@
+name: Build and Publish Api NuGet
+
+on:
+ push:
+ tags:
+ - "api-v*"
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ if: startsWith(github.ref, 'refs/tags/api-v')
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v1
+ with:
+ dotnet-version: '8.0.x'
+
+ - name: Setup NuGet config
+ env:
+ NUGET_USERNAME: ${{ secrets.USER_NAME }}
+ NUGET_PASSWORD: ${{ secrets.GIHUB_NUGET_AUTH_TOKEN }}
+ run: |
+ echo "" > nuget.config
+ echo "" >> nuget.config
+ echo "" >> nuget.config
+ echo "" >> nuget.config
+ echo "" >> nuget.config
+ echo "" >> nuget.config
+ echo "" >> nuget.config
+ echo "" >> nuget.config
+ echo "" >> nuget.config
+ echo "" >> nuget.config
+ echo "" >> nuget.config
+ echo "" >> nuget.config
+
+ - name: Install dependencies
+ run: dotnet restore ./src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj
+
+ - name: Build
+ run: dotnet build ./src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj --configuration Release --no-restore
+
+ - name: Set version variable
+ env:
+ TAG: ${{ github.ref_name }}
+ run: echo "VERSION=${TAG#api-v}" >> $GITHUB_ENV
+
+ - name: Read version from Directory.Build.props
+ id: read-version
+ run: echo "::set-output name=version::$(grep -oP '\K[^<]+' ./src/Directory.Build.props)"
+
+ - name: Compare tag with NuGet package version
+ run: |
+ if [ "${{ steps.read-version.outputs.version }}" != "${{ env.VERSION }}" ]; then
+ echo "Error: Tag does not match NuGet package version"
+ exit 1
+ fi
+
+ - name: Pack package
+ run: dotnet pack ./src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj -c Release /p:Version=${VERSION} --no-build -o .
+
+ - name: List output files
+ run: ls -la
+
+ - name: Push package to GitHub
+ run: dotnet nuget push Asv.Drones.Gui.Api.${VERSION}.nupkg --api-key ${{ secrets.GIHUB_NUGET_AUTH_TOKEN }} --skip-duplicate --source "https://nuget.pkg.github.com/asv-soft/index.json"
\ No newline at end of file
diff --git a/api_build.bat b/api_build.bat
new file mode 100644
index 00000000..a0b21e49
--- /dev/null
+++ b/api_build.bat
@@ -0,0 +1,32 @@
+@echo off
+setlocal enabledelayedexpansion
+rem ====== projects ======
+
+set project=Asv.Drones.Gui.Api
+
+
+set "file=.\src\Directory.Build.props"
+
+
+:: Èùåì ñòðîêó ñ ApiVersion è èçâëåêàåì çíà÷åíèå
+for /f "tokens=2 delims=> " %%a in ('findstr /i /c:"" "%file%"') do (
+ set "line=%%a"
+ for /f "tokens=1 delims=<" %%b in ("!line!") do (
+ set "ApiVersion=%%b"
+ )
+)
+
+:: Ïðîâåðÿåì è âûâîäèì ðåçóëüòàò
+if defined ApiVersion (
+ echo ApiVersion: %ApiVersion%
+ dotnet restore ./src/%project%/%project%.csproj
+ dotnet build /p:SolutionDir=../;ProductVersion=%ApiVersion% ./src/%project%/%project%.csproj -c Release
+ dotnet pack ./src/%project%/%project%.csproj -c Release
+
+
+) else (
+ echo ApiVersion not found
+)
+
+endlocal
+pause
\ No newline at end of file
diff --git a/api_publish_github.bat b/api_publish_github.bat
new file mode 100644
index 00000000..639afff2
--- /dev/null
+++ b/api_publish_github.bat
@@ -0,0 +1,35 @@
+@echo off
+setlocal enabledelayedexpansion
+rem ====== projects ======
+
+set project=Asv.Drones.Gui.Api
+
+
+set "file=.\src\Directory.Build.props"
+
+
+:: Èùåì ñòðîêó ñ ApiVersion è èçâëåêàåì çíà÷åíèå
+for /f "tokens=2 delims=> " %%a in ('findstr /i /c:"" "%file%"') do (
+ set "line=%%a"
+ for /f "tokens=1 delims=<" %%b in ("!line!") do (
+ set "ApiVersion=%%b"
+ )
+)
+
+:: Ïðîâåðÿåì è âûâîäèì ðåçóëüòàò
+if defined ApiVersion (
+ echo ApiVersion: %ApiVersion%
+ cd src\%project%\bin\Release\
+rem dotnet nuget push %project%.%ApiVersion%.nupkg --skip-duplicate --source https://api.nuget.org/v3/index.json
+ dotnet nuget push %project%.%ApiVersion%.nupkg --skip-duplicate --source https://nuget.pkg.github.com/asv-soft/index.json
+
+
+) else (
+ echo ApiVersion not found
+)
+
+endlocal
+pause
+
+
+
diff --git a/publish.bat b/publish.bat
new file mode 100644
index 00000000..d73d3fb6
--- /dev/null
+++ b/publish.bat
@@ -0,0 +1,144 @@
+cd publish
+
+for /d %%i in (".\*") do (
+ rmdir /s /q "%%i"
+)
+
+cd ../src/Asv.Drones.Gui.Desktop
+
+dotnet publish -c Release -r win-arm --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/win-arm/app
+dotnet publish -c Release -r win-arm64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/win-arm64/app
+dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/win-x64/app
+dotnet publish -c Release -r win-x86 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/win-x86/app
+
+dotnet publish -c Release -r linux-arm --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/linux-arm/app
+dotnet publish -c Release -r linux-arm64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/linux-arm64/app
+dotnet publish -c Release -r linux-musl-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/linux-musl-x64/app
+dotnet publish -c Release -r linux-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/linux-x64/app
+
+dotnet publish -c Release -r osx-arm64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/osx-arm64/app
+dotnet publish -c Release -r osx-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/osx-x64/app
+
+cd ../../publish
+del /S *.pdb
+
+cd win-arm/app
+move Asv.Drones.Gui.Desktop.exe asv-drones-win-arm.exe
+cd ../../win-arm64/app
+move Asv.Drones.Gui.Desktop.exe asv-drones-win-arm64.exe
+cd ../../win-x64/app
+move Asv.Drones.Gui.Desktop.exe asv-drones-win-x64.exe
+cd ../../win-x86/app
+move Asv.Drones.Gui.Desktop.exe asv-drones-win-x86.exe
+
+cd ../../linux-arm/app
+move Asv.Drones.Gui.Desktop asv-drones-linux-arm
+cd ../../linux-arm64/app
+move Asv.Drones.Gui.Desktop asv-drones-linux-arm64
+cd ../../linux-musl-x64/app
+move Asv.Drones.Gui.Desktop asv-drones-linux-musl-x64
+cd ../../linux-x64/app
+move Asv.Drones.Gui.Desktop asv-drones-linux-x64
+
+cd ../../osx-arm64/app
+move Asv.Drones.Gui.Desktop asv-drones-osx-arm64
+cd ../../osx-x64/app
+move Asv.Drones.Gui.Desktop asv-drones-osx-x64
+cd ../../..
+
+setlocal enabledelayedexpansion
+
+set "xmlFile=src\Directory.Build.props"
+
+for /f "tokens=2 delims=<> " %%a in ('findstr /i "" "%xmlFile%"') do (
+ set "productVersion=%%a"
+)
+
+set "issFile=win-arm-install.iss"
+
+set "tempFile=%temp%\temp.iss"
+
+for /f "tokens=*" %%a in ('type "%issFile%"') do (
+ set "line=%%a"
+
+ echo !line! | findstr /C:"#define MyAppVersion" > nul
+
+ if !errorlevel! == 0 (
+ echo #define MyAppVersion "%productVersion%" >> "%tempFile%"
+ ) else (
+ echo !line! >> "%tempFile%"
+ )
+)
+
+move /y "%tempFile%" "%issFile%" > nul
+
+set "issFile=win-arm64-install.iss"
+
+set "tempFile=%temp%\temp.iss"
+
+for /f "tokens=*" %%a in ('type "%issFile%"') do (
+ set "line=%%a"
+
+ echo !line! | findstr /C:"#define MyAppVersion" > nul
+
+ if !errorlevel! == 0 (
+ echo #define MyAppVersion "%productVersion%" >> "%tempFile%"
+ ) else (
+ echo !line! >> "%tempFile%"
+ )
+)
+
+move /y "%tempFile%" "%issFile%" > nul
+
+set "issFile=win-x64-install.iss"
+
+set "tempFile=%temp%\temp.iss"
+
+for /f "tokens=*" %%a in ('type "%issFile%"') do (
+ set "line=%%a"
+
+ echo !line! | findstr /C:"#define MyAppVersion" > nul
+
+ if !errorlevel! == 0 (
+ echo #define MyAppVersion "%productVersion%" >> "%tempFile%"
+ ) else (
+ echo !line! >> "%tempFile%"
+ )
+)
+
+move /y "%tempFile%" "%issFile%" > nul
+
+set "issFile=win-x86-install.iss"
+
+set "tempFile=%temp%\temp.iss"
+
+for /f "tokens=*" %%a in ('type "%issFile%"') do (
+ set "line=%%a"
+
+ echo !line! | findstr /C:"#define MyAppVersion" > nul
+
+ if !errorlevel! == 0 (
+ echo #define MyAppVersion "%productVersion%" >> "%tempFile%"
+ ) else (
+ echo !line! >> "%tempFile%"
+ )
+)
+
+move /y "%tempFile%" "%issFile%" > nul
+
+endlocal
+
+cd publish
+
+iscc ../win-arm-install.iss
+iscc ../win-arm64-install.iss
+iscc ../win-x86-install.iss
+iscc ../win-x64-install.iss
+
+
+wsl sed -i 's/\r//' linux_packages.sh
+wsl sed -i 's/\r//' osx_packages.sh
+
+wsl ../linux_packages.sh
+
+wsl ../osx_packages.sh
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Android/Asv.Drones.Gui.Android.csproj b/src/Asv.Drones.Gui.Android/Asv.Drones.Gui.Android.csproj
index ff2f4c25..9bf0a4ca 100644
--- a/src/Asv.Drones.Gui.Android/Asv.Drones.Gui.Android.csproj
+++ b/src/Asv.Drones.Gui.Android/Asv.Drones.Gui.Android.csproj
@@ -1,27 +1,15 @@
-
- ../Asv.Drones.Gui.Custom.props
- $(SolutionDir)Asv.Drones.Gui.Custom.props
-
-
Exe
- net7.0-android
+ net8.0-android
21
enable
me.asv.drones.gui
1
1.0
apk
- false
- false
- None
- false
- Debug;Release
- AnyCPU
+ False
-
-
@@ -31,6 +19,7 @@
+
diff --git a/src/Asv.Drones.Gui.Android/MainActivity.cs b/src/Asv.Drones.Gui.Android/MainActivity.cs
index 037bba7d..28e82d98 100644
--- a/src/Asv.Drones.Gui.Android/MainActivity.cs
+++ b/src/Asv.Drones.Gui.Android/MainActivity.cs
@@ -1,18 +1,28 @@
using Android.App;
using Android.Content.PM;
+using Android.OS;
using Avalonia;
using Avalonia.Android;
using Avalonia.ReactiveUI;
+using Environment = System.Environment;
namespace Asv.Drones.Gui.Android;
-[Activity(Label = "Asv.Drones.Gui.Android", Theme = "@style/MyTheme.NoActionBar", Icon = "@drawable/icon",
- LaunchMode = LaunchMode.SingleTop, MainLauncher = true,
+[Activity(
+ Label = "Asv.Drones.Gui.Android",
+ Theme = "@style/MyTheme.NoActionBar",
+ Icon = "@drawable/icon",
+ MainLauncher = true,
ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)]
public class MainActivity : AvaloniaMainActivity
{
protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
{
+ AppArgs.Instance.TryParse(Environment.GetCommandLineArgs());
+ AppArgs.Instance.TryParseFile();
+ // this is required to use the AndroidHttpClientHandler in main thread
+ StrictMode.SetThreadPolicy(new StrictMode.ThreadPolicy.Builder().PermitAll().Build());
+
return base.CustomizeAppBuilder(builder)
.WithInterFont()
.UseReactiveUI();
diff --git a/src/Asv.Drones.Gui.Android/Resources/AboutResources.txt b/src/Asv.Drones.Gui.Android/Resources/AboutResources.txt
new file mode 100644
index 00000000..c2bca974
--- /dev/null
+++ b/src/Asv.Drones.Gui.Android/Resources/AboutResources.txt
@@ -0,0 +1,44 @@
+Images, layout descriptions, binary blobs and string dictionaries can be included
+in your application as resource files. Various Android APIs are designed to
+operate on the resource IDs instead of dealing with images, strings or binary blobs
+directly.
+
+For example, a sample Android app that contains a user interface layout (main.axml),
+an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
+would keep its resources in the "Resources" directory of the application:
+
+Resources/
+ drawable/
+ icon.png
+
+ layout/
+ main.axml
+
+ values/
+ strings.xml
+
+In order to get the build system to recognize Android resources, set the build action to
+"AndroidResource". The native Android APIs do not operate directly with filenames, but
+instead operate on resource IDs. When you compile an Android application that uses resources,
+the build system will package the resources for distribution and generate a class called "R"
+(this is an Android convention) that contains the tokens for each one of the resources
+included. For example, for the above Resources layout, this is what the R class would expose:
+
+public class R {
+ public class drawable {
+ public const int icon = 0x123;
+ }
+
+ public class layout {
+ public const int main = 0x456;
+ }
+
+ public class strings {
+ public const int first_string = 0xabc;
+ public const int second_string = 0xbcd;
+ }
+}
+
+You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
+to reference the layout/main.axml file, or R.strings.first_string to reference the first
+string in the dictionary file values/strings.xml.
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Android/Resources/drawable-night-v31/avalonia_anim.xml b/src/Asv.Drones.Gui.Android/Resources/drawable-night-v31/avalonia_anim.xml
new file mode 100644
index 00000000..fb8ed421
--- /dev/null
+++ b/src/Asv.Drones.Gui.Android/Resources/drawable-night-v31/avalonia_anim.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Asv.Drones.Gui.Android/Resources/drawable-v31/avalonia_anim.xml b/src/Asv.Drones.Gui.Android/Resources/drawable-v31/avalonia_anim.xml
new file mode 100644
index 00000000..149badfc
--- /dev/null
+++ b/src/Asv.Drones.Gui.Android/Resources/drawable-v31/avalonia_anim.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Asv.Drones.Gui.Android/Resources/drawable/splash_screen.xml b/src/Asv.Drones.Gui.Android/Resources/drawable/splash_screen.xml
index 2e920b4b..fcceec62 100644
--- a/src/Asv.Drones.Gui.Android/Resources/drawable/splash_screen.xml
+++ b/src/Asv.Drones.Gui.Android/Resources/drawable/splash_screen.xml
@@ -1,13 +1,13 @@

- -
-
-
+ -
+
+
-
+
diff --git a/src/Asv.Drones.Gui.Android/Resources/values-night/colors.xml b/src/Asv.Drones.Gui.Android/Resources/values-night/colors.xml
index 3d47b6fc..3c9f0b1e 100644
--- a/src/Asv.Drones.Gui.Android/Resources/values-night/colors.xml
+++ b/src/Asv.Drones.Gui.Android/Resources/values-night/colors.xml
@@ -1,4 +1,4 @@

- #212121
+ #212121
diff --git a/src/Asv.Drones.Gui.Android/Resources/values-v31/styles.xml b/src/Asv.Drones.Gui.Android/Resources/values-v31/styles.xml
new file mode 100644
index 00000000..a93e7c47
--- /dev/null
+++ b/src/Asv.Drones.Gui.Android/Resources/values-v31/styles.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
diff --git a/src/Asv.Drones.Gui.Android/Resources/values/colors.xml b/src/Asv.Drones.Gui.Android/Resources/values/colors.xml
index 59279d5d..53097afb 100644
--- a/src/Asv.Drones.Gui.Android/Resources/values/colors.xml
+++ b/src/Asv.Drones.Gui.Android/Resources/values/colors.xml
@@ -1,4 +1,4 @@

- #FFFFFF
+ #FFFFFF
diff --git a/src/Asv.Drones.Gui.Android/Resources/values/styles.xml b/src/Asv.Drones.Gui.Android/Resources/values/styles.xml
index 2759d290..2deaa4c7 100644
--- a/src/Asv.Drones.Gui.Android/Resources/values/styles.xml
+++ b/src/Asv.Drones.Gui.Android/Resources/values/styles.xml
@@ -1,17 +1,12 @@

-
-
-
-
-
-
+
+
+
diff --git a/src/Asv.Drones.Gui.Api/App.axaml b/src/Asv.Drones.Gui.Api/App.axaml
new file mode 100644
index 00000000..efc3b285
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/App.axaml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj b/src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj
new file mode 100644
index 00000000..cc25d583
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj
@@ -0,0 +1,84 @@
+
+
+
+ net8.0
+ enable
+ enable
+ $(ApiVersion)
+ true
+ $(ApiVersion)
+ https://github.com/asv-soft
+ API reference for Asv.Drones GUI application
+ https://github.com/asv-soft
+ true
+ $(ApiVersion)
+ true
+ $(ApiPrevVersion)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ all
+
+
+
+
+ PublicResXFileCodeGenerator
+ RS.Designer.cs
+
+
+
+
+ True
+ True
+ RS.resx
+
+
+ Code
+ AttitudeIndicator.axaml
+
+
+ TreePageExampleView.axaml
+ Code
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj.DotSettings b/src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj.DotSettings
new file mode 100644
index 00000000..7bcf04b5
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj.DotSettings
@@ -0,0 +1,67 @@
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Api/CompatibilitySuppressions.xml b/src/Asv.Drones.Gui.Api/CompatibilitySuppressions.xml
new file mode 100644
index 00000000..277a2ac9
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/CompatibilitySuppressions.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ CP0006
+ P:Asv.Drones.Gui.Api.ILocalizationService.Accuracy
+ lib/net8.0/Asv.Drones.Gui.Api.dll
+ lib/net8.0/Asv.Drones.Gui.Api.dll
+ true
+
+
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Core/FodyWeavers.xml b/src/Asv.Drones.Gui.Api/FodyWeavers.xml
similarity index 100%
rename from src/Asv.Drones.Gui.Core/FodyWeavers.xml
rename to src/Asv.Drones.Gui.Api/FodyWeavers.xml
diff --git a/src/Asv.Drones.Gui.Api/RS.Designer.cs b/src/Asv.Drones.Gui.Api/RS.Designer.cs
new file mode 100644
index 00000000..6fe140e4
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/RS.Designer.cs
@@ -0,0 +1,557 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Asv.Drones.Gui.Api {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ public class RS {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal RS() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ public static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Asv.Drones.Gui.Api.RS", typeof(RS).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ public static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Vibration and clipping of UAV.
+ ///
+ public static string AltitudeIndicator_Vibration_ToolTip {
+ get {
+ return ResourceManager.GetString("AltitudeIndicator_Vibration_ToolTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Copy.
+ ///
+ public static string Anchor_Editor_Action_Copy {
+ get {
+ return ResourceManager.GetString("Anchor_Editor_Action_Copy", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Paste.
+ ///
+ public static string Anchor_Editor_Action_Paste {
+ get {
+ return ResourceManager.GetString("Anchor_Editor_Action_Paste", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Altitude.
+ ///
+ public static string AnchorsEditorView_TextBlock_Altitude_Text {
+ get {
+ return ResourceManager.GetString("AnchorsEditorView_TextBlock_Altitude_Text", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Latitude.
+ ///
+ public static string AnchorsEditorView_TextBlock_Latitude_Text {
+ get {
+ return ResourceManager.GetString("AnchorsEditorView_TextBlock_Latitude_Text", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Longitude.
+ ///
+ public static string AnchorsEditorView_TextBlock_Longitude_Text {
+ get {
+ return ResourceManager.GetString("AnchorsEditorView_TextBlock_Longitude_Text", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Altitude.
+ ///
+ public static string AttitudeIndicator_Altitude_ToolTip {
+ get {
+ return ResourceManager.GetString("AttitudeIndicator_Altitude_ToolTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Compass.
+ ///
+ public static string AttitudeIndicator_Compass_ToolTip {
+ get {
+ return ResourceManager.GetString("AttitudeIndicator_Compass_ToolTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Velocity.
+ ///
+ public static string AttitudeIndicator_Velocity_ToolTip {
+ get {
+ return ResourceManager.GetString("AttitudeIndicator_Velocity_ToolTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Delete.
+ ///
+ public static string HierarchicalStoreView_Button_DeleteFile {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_Button_DeleteFile", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Rename.
+ ///
+ public static string HierarchicalStoreView_Button_EditFileName {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_Button_EditFileName", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Move To Folder.
+ ///
+ public static string HierarchicalStoreView_Button_MovefileToFolder {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_Button_MovefileToFolder", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Create New File.
+ ///
+ public static string HierarchicalStoreView_Button_ToolTip_CreateNewFile {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_Button_ToolTip_CreateNewFile", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Create New Folder.
+ ///
+ public static string HierarchicalStoreView_Button_ToolTip_CreateNewFolder {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_Button_ToolTip_CreateNewFolder", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Refresh .
+ ///
+ public static string HierarchicalStoreView_Button_ToolTip_Refresh {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_Button_ToolTip_Refresh", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Delete File.
+ ///
+ public static string HierarchicalStoreView_File_Button_DeleteFile {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_File_Button_DeleteFile", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Rename File.
+ ///
+ public static string HierarchicalStoreView_File_Button_EditeFileName {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_File_Button_EditeFileName", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Move File.
+ ///
+ public static string HierarchicalStoreView_File_Button_MoveFile {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_File_Button_MoveFile", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Delete Folder.
+ ///
+ public static string HierarchicalStoreView_Folder_Button_DeleteFolder {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_Folder_Button_DeleteFolder", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Rename Folder.
+ ///
+ public static string HierarchicalStoreView_Folder_Button_EditFolderName {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_Folder_Button_EditFolderName", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Move Folder.
+ ///
+ public static string HierarchicalStoreView_Folder_Button_MoveFolderToFolder {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_Folder_Button_MoveFolderToFolder", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Cancel.
+ ///
+ public static string HierarchicalStoreView_TextBlock_Text_Cancel {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_TextBlock_Text_Cancel", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Move Folder.
+ ///
+ public static string HierarchicalStoreView_TextBlock_Text_MoveFolder {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_TextBlock_Text_MoveFolder", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Move Here.
+ ///
+ public static string HierarchicalStoreView_TextBlock_Text_MoveHere {
+ get {
+ return ResourceManager.GetString("HierarchicalStoreView_TextBlock_Text_MoveHere", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Search.
+ ///
+ public static string HierarhicalStoreView_Search_Textbox_Watermark {
+ get {
+ return ResourceManager.GetString("HierarhicalStoreView_Search_Textbox_Watermark", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Move anchors.
+ ///
+ public static string MapMoverActionView_Title {
+ get {
+ return ResourceManager.GetString("MapMoverActionView_Title", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fixed wing.
+ ///
+ public static string MavlinkHelper_GetTypeName_FixedWing {
+ get {
+ return ResourceManager.GetString("MavlinkHelper_GetTypeName_FixedWing", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Helicopter.
+ ///
+ public static string MavlinkHelper_GetTypeName_Helicopter {
+ get {
+ return ResourceManager.GetString("MavlinkHelper_GetTypeName_Helicopter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Hexarotor.
+ ///
+ public static string MavlinkHelper_GetTypeName_HexaRotor {
+ get {
+ return ResourceManager.GetString("MavlinkHelper_GetTypeName_HexaRotor", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Octorotor.
+ ///
+ public static string MavlinkHelper_GetTypeName_OctoRotor {
+ get {
+ return ResourceManager.GetString("MavlinkHelper_GetTypeName_OctoRotor", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Quadrotor.
+ ///
+ public static string MavlinkHelper_GetTypeName_QuadRotor {
+ get {
+ return ResourceManager.GetString("MavlinkHelper_GetTypeName_QuadRotor", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Tricopter.
+ ///
+ public static string MavlinkHelper_GetTypeName_TriCopter {
+ get {
+ return ResourceManager.GetString("MavlinkHelper_GetTypeName_TriCopter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Unknown type.
+ ///
+ public static string MavlinkHelper_GetTypeName_UnknownType {
+ get {
+ return ResourceManager.GetString("MavlinkHelper_GetTypeName_UnknownType", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Value must be a number.
+ ///
+ public static string MeasureUnitBase_ErrorMessage_NotANumber {
+ get {
+ return ResourceManager.GetString("MeasureUnitBase_ErrorMessage_NotANumber", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Value can't be null or white space.
+ ///
+ public static string MeasureUnitBase_ErrorMessage_NullOrWhiteSpace {
+ get {
+ return ResourceManager.GetString("MeasureUnitBase_ErrorMessage_NullOrWhiteSpace", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Value must be greater than {0} ({1}).
+ ///
+ public static string MeasureUnitExtensions_ErrorMessage_GreaterValue {
+ get {
+ return ResourceManager.GetString("MeasureUnitExtensions_ErrorMessage_GreaterValue", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Value must be less than {0} ({1}).
+ ///
+ public static string MeasureUnitExtensions_ErrorMessage_LesserValue {
+ get {
+ return ResourceManager.GetString("MeasureUnitExtensions_ErrorMessage_LesserValue", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Remove all pinned parameters.
+ ///
+ public static string ParametersEditorPageView_PinsOffButton_ToolTip {
+ get {
+ return ResourceManager.GetString("ParametersEditorPageView_PinsOffButton_ToolTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Star this parameter.
+ ///
+ public static string ParametersEditorPageView_StarButton_ToolTip {
+ get {
+ return ResourceManager.GetString("ParametersEditorPageView_StarButton_ToolTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Show only starred parameters.
+ ///
+ public static string ParametersEditorPageView_StarsToggleButton_ToolTip {
+ get {
+ return ResourceManager.GetString("ParametersEditorPageView_StarsToggleButton_ToolTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Update all parameters.
+ ///
+ public static string ParametersEditorPageView_UpdateButton_ToolTip {
+ get {
+ return ResourceManager.GetString("ParametersEditorPageView_UpdateButton_ToolTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Search.
+ ///
+ public static string ParametersEditorPageViewModel_Search {
+ get {
+ return ResourceManager.GetString("ParametersEditorPageViewModel_Search", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Parameters editor [{0}].
+ ///
+ public static string ParametersEditorPageViewModel_Title {
+ get {
+ return ResourceManager.GetString("ParametersEditorPageViewModel_Title", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Total: {0}.
+ ///
+ public static string ParametersEditorPageViewModel_Total {
+ get {
+ return ResourceManager.GetString("ParametersEditorPageViewModel_Total", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to On/off pin for this parameter.
+ ///
+ public static string ParametersEditorParameterView_PinToggleButton_ToolTip {
+ get {
+ return ResourceManager.GetString("ParametersEditorParameterView_PinToggleButton_ToolTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Reboot required.
+ ///
+ public static string ParametersEditorParameterView_RebootRequired {
+ get {
+ return ResourceManager.GetString("ParametersEditorParameterView_RebootRequired", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Update.
+ ///
+ public static string ParametersEditorParameterView_UpdateButton {
+ get {
+ return ResourceManager.GetString("ParametersEditorParameterView_UpdateButton", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Update this parameter from UAV.
+ ///
+ public static string ParametersEditorParameterView_UpdateButton_ToolTip {
+ get {
+ return ResourceManager.GetString("ParametersEditorParameterView_UpdateButton_ToolTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Write.
+ ///
+ public static string ParametersEditorParameterView_WriteButton {
+ get {
+ return ResourceManager.GetString("ParametersEditorParameterView_WriteButton", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Write this parameter to UAV.
+ ///
+ public static string ParametersEditorParameterView_WriteButton_ToolTip {
+ get {
+ return ResourceManager.GetString("ParametersEditorParameterView_WriteButton_ToolTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Cancel.
+ ///
+ public static string ParamPageViewModel_DataLossDialog_CloseButtonText {
+ get {
+ return ResourceManager.GetString("ParamPageViewModel_DataLossDialog_CloseButtonText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to You're trying to open another menu folder, but you have unsaved changes in the current one. Do you want to save them?.
+ ///
+ public static string ParamPageViewModel_DataLossDialog_Content {
+ get {
+ return ResourceManager.GetString("ParamPageViewModel_DataLossDialog_Content", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Save.
+ ///
+ public static string ParamPageViewModel_DataLossDialog_PrimaryButtonText {
+ get {
+ return ResourceManager.GetString("ParamPageViewModel_DataLossDialog_PrimaryButtonText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Don't save.
+ ///
+ public static string ParamPageViewModel_DataLossDialog_SecondaryButtonText {
+ get {
+ return ResourceManager.GetString("ParamPageViewModel_DataLossDialog_SecondaryButtonText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Potential data loss warning.
+ ///
+ public static string ParamPageViewModel_DataLossDialog_Title {
+ get {
+ return ResourceManager.GetString("ParamPageViewModel_DataLossDialog_Title", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/src/Asv.Drones.Gui.Api/RS.resx b/src/Asv.Drones.Gui.Api/RS.resx
new file mode 100644
index 00000000..c1d9ae68
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/RS.resx
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
+ PublicKeyToken=b77a5c561934e089
+
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
+ PublicKeyToken=b77a5c561934e089
+
+
+
+ Value can't be null or white space
+
+
+ Value must be a number
+
+
+ Value must be greater than {0} ({1})
+
+
+ Value must be less than {0} ({1})
+
+
+
+
+ Move anchors
+
+
+ Latitude
+
+
+ Altitude
+
+
+ Longitude
+
+
+ Vibration and clipping of UAV
+
+
+ Velocity
+
+
+ Altitude
+
+
+ Compass
+
+
+ Refresh
+
+
+ Create New Folder
+
+
+ Create New File
+
+
+ Rename Folder
+
+
+ Move Folder
+
+
+ Delete Folder
+
+
+ Delete File
+
+
+ Delete
+
+
+ Rename
+
+
+ Move To Folder
+
+
+ Rename File
+
+
+ Move File
+
+
+ Search
+
+
+ Move Folder
+
+
+ Move Here
+
+
+ Cancel
+
+
+ On/off pin for this parameter
+
+
+ Update this parameter from UAV
+
+
+ Write this parameter to UAV
+
+
+ Reboot required
+
+
+ Update
+
+
+ Write
+
+
+ Potential data loss warning
+
+
+ You're trying to open another menu folder, but you have unsaved changes in the current one. Do you want to save them?
+
+
+ Save
+
+
+ Don't save
+
+
+ Cancel
+
+
+ Show only starred parameters
+
+
+ Update all parameters
+
+
+ Remove all pinned parameters
+
+
+ Parameters editor [{0}]
+
+
+ Search
+
+
+ Total: {0}
+
+
+ Star this parameter
+
+
+ Fixed wing
+
+
+ Quadrotor
+
+
+ Hexarotor
+
+
+ Octorotor
+
+
+ Helicopter
+
+
+ Tricopter
+
+
+ Unknown type
+
+
+ Copy
+
+
+ Paste
+
+
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Api/RS.ru.resx b/src/Asv.Drones.Gui.Api/RS.ru.resx
new file mode 100644
index 00000000..5c30337d
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/RS.ru.resx
@@ -0,0 +1,189 @@
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
+ PublicKeyToken=b77a5c561934e089
+
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
+ PublicKeyToken=b77a5c561934e089
+
+
+
+ sdsd
+
+
+ Значение не должно быть пуÑтым или пробелом
+
+
+ Значение должно быть чиÑлом
+
+
+ Значение должно быть больше чем {0} ({1})
+
+
+ Значение должно быть меньше чем {0} ({1})
+
+
+
+
+ ПеремеÑтить ÑкорÑ
+
+
+ Широта
+
+
+ Ð’Ñ‹Ñота
+
+
+ Долгота
+
+
+ Ð’Ð¸Ð±Ñ€Ð°Ñ†Ð¸Ñ Ð¸ клиппинг БПЛÐ
+
+
+ СкороÑÑ‚ÑŒ
+
+
+ Ð’Ñ‹Ñота
+
+
+ КомпаÑ
+
+
+ Обновить
+
+
+ Удалить Файл
+
+
+ Переименовать
+
+
+ ПеремеÑтить
+
+
+ ПеремеÑтить папку
+
+
+ Переименовать папку
+
+
+ Удалить файл
+
+
+ Переименовать файл
+
+
+ ПеремеÑтить файл
+
+
+ Удалить папку
+
+
+ ПоиÑк
+
+
+ ПеремеÑтить папку
+
+
+ ПеремеÑтить Ñюда
+
+
+ Отмена
+
+
+ Включить/выключить закрепление Ñтого параметра
+
+
+ Обновить Ñтот парметр из БПЛÐ
+
+
+ ЗапиÑать Ñтот парметр в БПЛÐ
+
+
+ ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°
+
+
+ Обновить
+
+
+ ЗапиÑать
+
+
+ Отмена
+
+
+ Ð’Ñ‹ пытаетеÑÑŒ открыть другой пункт меню, но в текущем у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ неÑохраненные изменениÑ. Хотите Ñохранить их?
+
+
+ Сохранить
+
+
+ Ðе ÑохранÑÑ‚ÑŒ
+
+
+ Предупреждение о возможной потере данных
+
+
+ Показать только избранные параметры
+
+
+ Обновить вÑе параметры
+
+
+ Убрать вÑе прикреплённые параметры
+
+
+
+ Добавить параметр в избранные
+
+
+ Редактор параметров [{0}]
+
+
+ Ðайти
+
+
+ Ð’Ñего: {0}
+
+
+ Создать файл
+
+
+ Создать папку
+
+
+ Ðеподвижное крыло
+
+
+ Вертолёт
+
+
+ ГекÑакоптер
+
+
+ Октокоптер
+
+
+ Квадрокоптер
+
+
+ Трикоптер
+
+
+ ÐеизвеÑтный тип
+
+
+ Копировать
+
+
+ Ð’Ñтавить
+
+
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Api/Services/AppHost/IAppArgs.cs b/src/Asv.Drones.Gui.Api/Services/AppHost/IAppArgs.cs
new file mode 100644
index 00000000..8ab49860
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/Services/AppHost/IAppArgs.cs
@@ -0,0 +1,12 @@
+namespace Asv.Drones.Gui.Api;
+
+public interface IAppArgs
+{
+ IReadOnlyDictionary Args { get; }
+ IReadOnlySet Tags { get; }
+
+ bool TryParse(IEnumerable args);
+ bool TryParseFile(string argsFile = "app.args");
+
+ string this[string key, string defaultValue] { get; }
+}
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Api/Services/AppHost/IAppInfo.cs b/src/Asv.Drones.Gui.Api/Services/AppHost/IAppInfo.cs
new file mode 100644
index 00000000..b170420e
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/Services/AppHost/IAppInfo.cs
@@ -0,0 +1,34 @@
+namespace Asv.Drones.Gui.Api;
+
+public interface IAppInfo
+{
+ ///
+ /// Application title
+ ///
+ string Name { get; }
+
+ ///
+ /// Application version
+ ///
+ string Version { get; }
+
+ ///
+ /// Authors
+ ///
+ string Author { get; }
+
+ ///
+ /// Application home page URL
+ ///
+ string AppUrl { get; }
+
+ ///
+ /// Licence name
+ ///
+ string AppLicense { get; }
+
+ ///
+ /// Avalonia UI package version
+ ///
+ string AvaloniaVersion { get; }
+}
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Api/Services/AppHost/IAppPathInfo.cs b/src/Asv.Drones.Gui.Api/Services/AppHost/IAppPathInfo.cs
new file mode 100644
index 00000000..a775b62d
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/Services/AppHost/IAppPathInfo.cs
@@ -0,0 +1,15 @@
+namespace Asv.Drones.Gui.Api;
+
+///
+/// Information about the application's path
+///
+public interface IAppPathInfo
+{
+ ///
+ /// The folder where the application stores its data.
+ /// This is the folder where the application stores its data, such as configuration files, logs, and plugins.
+ /// Folder is created by the application if it does not exist.
+ /// The folder is created in the user's home directory and will not be deleted when the application is uninstalled or updated.
+ ///
+ string AppDataFolder { get; }
+}
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Api/Services/AppHost/IApplicationHost.cs b/src/Asv.Drones.Gui.Api/Services/AppHost/IApplicationHost.cs
new file mode 100644
index 00000000..b9f1890c
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/Services/AppHost/IApplicationHost.cs
@@ -0,0 +1,74 @@
+using System.Collections.Specialized;
+using System.Composition.Hosting;
+using Asv.Cfg;
+using Asv.Common;
+using Avalonia.Controls.Templates;
+
+namespace Asv.Drones.Gui.Api;
+
+///
+/// Application host
+///
+public interface IApplicationHost
+{
+ ///
+ /// Application args
+ ///
+ IAppArgs Args { get; }
+ ///
+ /// Base information about current application
+ ///
+ IAppInfo Info { get; }
+
+ ///
+ /// Path helper
+ ///
+ IAppPathInfo Paths { get; }
+
+ ///
+ /// Host for add data templates
+ ///
+ IDataTemplateHost DataTemplateHost { get; }
+
+ ///
+ /// Configuration of the application
+ ///
+ IConfiguration Configuration { get; }
+
+ ILocalizationService Localization { get; }
+ ILogService Logs { get; }
+ IPluginManager PluginManager { get; }
+
+ ///
+ /// IoC container
+ ///
+ CompositionHost Container { get; }
+
+ ///
+ /// Gets an enumerable collection of theme items.
+ ///
+ ///
+ /// An enumerable collection of theme items.
+ ///
+ IEnumerable Themes { get; }
+
+ ///
+ /// Gets the current theme of the application.
+ ///
+ ///
+ /// This property returns an instance of which represents the current theme.
+ ///
+ ///
+ /// An instance representing the current theme of the application.
+ ///
+ IRxEditableValue CurrentTheme { get; }
+ ///
+ /// Main application view. Can be NULL! before main activity is loading
+ ///
+ IShell? Shell { get; }
+ ///
+ /// Try to restart application
+ ///
+ void RestartApplication();
+
+}
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Api/Services/AppHost/IThemeInfo.cs b/src/Asv.Drones.Gui.Api/Services/AppHost/IThemeInfo.cs
new file mode 100644
index 00000000..4039c3ff
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/Services/AppHost/IThemeInfo.cs
@@ -0,0 +1,10 @@
+namespace Asv.Drones.Gui.Api;
+
+///
+/// Represents a theme item.
+///
+public interface IThemeInfo
+{
+ string Id { get; }
+ string Name { get; }
+}
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Api/Services/Localization/ILocalizationService.cs b/src/Asv.Drones.Gui.Api/Services/Localization/ILocalizationService.cs
new file mode 100644
index 00000000..d9ac76c2
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/Services/Localization/ILocalizationService.cs
@@ -0,0 +1,182 @@
+using Asv.Common;
+
+namespace Asv.Drones.Gui.Api
+{
+ public interface ILocalizationService
+ {
+ ///
+ /// Allows you to select or get the current application language
+ ///
+ IRxEditableValue CurrentLanguage { get; }
+
+ ///
+ /// Returns the list of available languages
+ ///
+ IEnumerable AvailableLanguages { get; }
+
+ #region Units
+
+ ///
+ /// Convert bytes rate to short localized string
+ /// For example: 1024 => 1 KB/s
+ ///
+ ///
+ IReadOnlyMeasureUnit ByteRate { get; }
+
+ ///
+ /// Convert items rate to short localized string
+ /// For example: 1000 => 1 KHz
+ ///
+ ///
+ IReadOnlyMeasureUnit ItemsRate { get; }
+
+ ///
+ /// Convert bytes count to short localized string
+ /// For example: 1024 => 1 KB
+ ///
+ ///
+ IReadOnlyMeasureUnit ByteSize { get; }
+
+ IReadOnlyMeasureUnit RelativeTime { get; }
+
+ IReadOnlyMeasureUnit Voltage { get; }
+
+ IReadOnlyMeasureUnit Current { get; }
+ IReadOnlyMeasureUnit MAh { get; }
+
+ IMeasureUnit Altitude { get; }
+
+ IMeasureUnit Distance { get; }
+
+ IMeasureUnit Accuracy { get; } // field for gbs plugin only
+
+ IMeasureUnit Latitude { get; }
+ IMeasureUnit Longitude { get; }
+
+ IMeasureUnit Velocity { get; }
+
+ IMeasureUnit DdmLlz { get; }
+ IMeasureUnit DdmGp { get; }
+
+ IMeasureUnit Sdm { get; }
+
+ IMeasureUnit Power { get; }
+ IMeasureUnit AmplitudeModulation { get; }
+ IMeasureUnit Frequency { get; }
+ IMeasureUnit Phase { get; }
+ IMeasureUnit Bearing { get; }
+ IMeasureUnit Temperature { get; }
+ IMeasureUnit Degree { get; }
+ IMeasureUnit FieldStrength { get; }
+
+ #endregion
+
+ public GeoPoint ToSiGeoPoint(string? latitude, string? longitude, string? altitude)
+ {
+ var lat = Latitude.IsValid(latitude) ? Latitude.ConvertToSi(latitude) : double.NaN;
+ var lon = Longitude.IsValid(longitude) ? Longitude.ConvertToSi(longitude) : double.NaN;
+ var alt = Altitude.IsValid(altitude) ? Altitude.ConvertToSi(altitude) : double.NaN;
+ return new GeoPoint(lat, lon, alt);
+ }
+ }
+
+ public interface ILanguageInfo
+ {
+ string Id { get; }
+ string DisplayName { get; }
+ }
+
+ public enum AltitudeUnits
+ {
+ Meters,
+ Feets
+ }
+
+ public enum AmplitudeModulationUnits
+ {
+ Percent,
+ InParts
+ }
+
+ public enum BearingUnits
+ {
+ Degree,
+ DegreesMinutes
+ }
+
+ public enum DdmUnits
+ {
+ InParts,
+ Percent,
+ MicroAmp,
+ MicroAmpRu
+ }
+
+ public enum DegreeUnits
+ {
+ Degrees,
+ MinutesSeconds,
+ DegreesMinutesSeconds
+ }
+
+ public enum DistanceUnits
+ {
+ Meters,
+ NauticalMiles
+ }
+
+ public enum FieldStrengthUnits
+ {
+ MicroVoltsPerMeter
+ }
+
+ public enum FrequencyUnits
+ {
+ Hz,
+ KHz,
+ MHz,
+ GHz
+ }
+
+ public enum LatitudeUnits
+ {
+ Deg,
+ Dms
+ }
+
+ public enum LongitudeUnits
+ {
+ Deg,
+ Dms
+ }
+
+ public enum PhaseUnits
+ {
+ Degree,
+ Radian
+ }
+
+ public enum PowerUnits
+ {
+ Dbm
+ }
+
+ public enum SdmUnits
+ {
+ Percent
+ }
+
+ public enum TemperatureUnits
+ {
+ Celsius,
+ Farenheit,
+ Kelvin
+ }
+
+ public enum VelocityUnits
+ {
+ MetersPerSecond,
+ KilometersPerHour,
+ MilesPerHour
+ }
+}
\ No newline at end of file
diff --git a/src/Asv.Drones.Gui.Api/Services/Localization/IMeasureUnit.cs b/src/Asv.Drones.Gui.Api/Services/Localization/IMeasureUnit.cs
new file mode 100644
index 00000000..1a1647f7
--- /dev/null
+++ b/src/Asv.Drones.Gui.Api/Services/Localization/IMeasureUnit.cs
@@ -0,0 +1,145 @@
+#nullable enable
+using System.Globalization;
+using Asv.Common;
+using Avalonia;
+using Avalonia.Data.Converters;
+
+namespace Asv.Drones.Gui.Api
+{
+ public interface IMeasureUnitItem
+ {
+ public string Title { get; }
+ public string Unit { get; }
+ public bool IsSiUnit { get; }
+ public TValue ConvertFromSi(TValue siValue);
+ public TValue ConvertToSi(TValue value);
+ public TValue Parse(string? value);
+ bool IsValid(string? value);
+ string? GetErrorMessage(string? value);
+ string Print(TValue value);
+ string PrintWithUnits(TValue value);
+
+ public TValue ConvertToSi(string? value)
+ {
+ return ConvertToSi(Parse(value));
+ }
+
+ public string FromSiToString(TValue value)
+ {
+ return Print(ConvertFromSi(value));
+ }
+
+ public string FromSiToStringWithUnits(TValue value)
+ {
+ return PrintWithUnits(ConvertFromSi(value));
+ }
+ }
+
+ public interface IMeasureUnitItem : IMeasureUnitItem
+ {
+ public TEnum Id { get; }
+ }
+
+ public interface IMeasureUnit
+ {
+ string Title { get; }
+ string Description { get; }
+ IEnumerable> AvailableUnits { get; }
+ IRxEditableValue> CurrentUnit { get; }
+ IMeasureUnitItem SiUnit { get; }
+
+ public string FromSiToStringWithUnits(TValue value)
+ {
+ return CurrentUnit.Value.FromSiToStringWithUnits(value);
+ }
+
+ public string FromSiToString(TValue value)
+ {
+ return CurrentUnit.Value.FromSiToString(value);
+ }
+
+ public TValue ConvertFromSi(TValue value)
+ {
+ return CurrentUnit.Value.ConvertFromSi(value);
+ }
+
+ public TValue ConvertToSi(TValue value)
+ {
+ return CurrentUnit.Value.ConvertToSi(value);
+ }
+
+ public TValue ConvertToSi(string? value)
+ {
+ return CurrentUnit.Value.ConvertToSi(value);
+ }
+
+ public bool IsValid(string? value)
+ {
+ return CurrentUnit.Value.IsValid(value);
+ }
+ }
+
+ public static class MeasureUnitExtensions
+ {
+ public static bool IsValid(this IMeasureUnit src, double minSiValue, double maxSiValue,
+ string value)
+ {
+ if (src.CurrentUnit.Value.IsValid(value) == false) return false;
+ if (src.CurrentUnit.Value.ConvertToSi(value) < minSiValue) return false;
+ if (src.CurrentUnit.Value.ConvertToSi(value) > maxSiValue) return false;
+ return true;
+ }
+
+ public static string? GetErrorMessage(this IMeasureUnit src, string? value)
+ {
+ return src.CurrentUnit.Value.GetErrorMessage(value);
+ }
+
+ public static string? GetErrorMessage(this IMeasureUnit src, double minSiValue,
+ double maxSiValue, string? value)
+ {
+ var msg = src.CurrentUnit.Value.GetErrorMessage(value);
+ if (string.IsNullOrWhiteSpace(msg) == false) return msg;
+ var siValue = src.CurrentUnit.Value.ConvertToSi(value);
+ if (siValue < minSiValue)
+ return string.Format(RS.MeasureUnitExtensions_ErrorMessage_GreaterValue,
+ src.CurrentUnit.Value.FromSiToStringWithUnits(minSiValue),
+ src.SiUnit.FromSiToStringWithUnits(siValue));
+ if (siValue > maxSiValue)
+ return string.Format(RS.MeasureUnitExtensions_ErrorMessage_LesserValue,
+ src.CurrentUnit.Value.FromSiToStringWithUnits(minSiValue),
+ src.SiUnit.FromSiToStringWithUnits(siValue));
+ return null;
+ }
+ }
+
+
+ public static class MeasureUnitConverter
+ {
+ static MeasureUnitConverter()
+ {
+ DoubleInstance = new MeasureUnitConverter();
+ UlongInstance = new MeasureUnitConverter();
+ }
+
+ public static MeasureUnitConverter UlongInstance { get; set; }
+ public static MeasureUnitConverter DoubleInstance { get; }
+ }
+
+
+ public class MeasureUnitConverter : IMultiValueConverter
+ {
+ public object? Convert(IList