Использование инклинометраUse the inclinometer

Важные APIImportant APIs

ОбразецSample

Узнайте, как использовать инклинометр для определения поворотов относительно поперечной, продольной и вертикальной осей.Learn how to use the inclinometer to determine pitch, roll, and yaw.

В некоторых трехмерных играх инклинометр используется в качестве устройства ввода.Some 3-D games require an inclinometer as an input device. Простой пример — авиационный тренажер, в котором три оси инклинометра (X, Y и Z) сопоставлены командам управления рулем высоты, элероном и рулем направления самолета.One common example is the flight simulator, which maps the three axes of the inclinometer (X, Y, and Z) to the elevator, aileron, and rudder inputs of the aircraft.

Предварительные требованияPrerequisites

Вы должны быть знакомы с языком XAML, Microsoft Visual C# и событиями.You should be familiar with Extensible Application Markup Language (XAML), Microsoft Visual C#, and events.

Используемые вами устройство или эмулятор должны поддерживать инклинометр.The device or emulator that you're using must support a inclinometer.

Создание простого приложения инклинометраCreate a simple inclinometer app

Данный раздел состоит из двух подразделов.This section is divided into two subsections. В первом подразделе описаны необходимые этапы создания простого приложения инклинометра с нуля.The first subsection will take you through the steps necessary to create a simple inclinometer application from scratch. В следующем подразделе описано приложение, которое вы только что создали.The following subsection explains the app you have just created.

InstructionsInstructions

  • Для создания нового проекта выберите Пустое приложение (универсальное приложение Windows) из шаблонов проектов Visual C#.Create a new project, choosing a Blank App (Universal Windows) from the Visual C# project templates.

  • Откройте файл проекта MainPage.xaml.cs и замените существующий код следующим.Open your project's MainPage.xaml.cs file and replace the existing code with the following.

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;

    using Windows.UI.Core;
    using Windows.Devices.Sensors;


    namespace App1
    {
        /// <summary>
        /// An empty page that can be used on its own or navigated to within a Frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            private Inclinometer _inclinometer;

            // This event handler writes the current inclinometer reading to
            // the three text blocks on the app' s main page.

            private async void ReadingChanged(object sender, InclinometerReadingChangedEventArgs e)
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    InclinometerReading reading = e.Reading;
                    txtPitch.Text = String.Format("{0,5:0.00}", reading.PitchDegrees);
                    txtRoll.Text = String.Format("{0,5:0.00}", reading.RollDegrees);
                    txtYaw.Text = String.Format("{0,5:0.00}", reading.YawDegrees);
                });
            }

            public MainPage()
            {
                this.InitializeComponent();
                _inclinometer = Inclinometer.GetDefault();


                if (_inclinometer != null)
                {
                    // Establish the report interval for all scenarios
                    uint minReportInterval = _inclinometer.MinimumReportInterval;
                    uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
                    _inclinometer.ReportInterval = reportInterval;

                    // Establish the event handler
                    _inclinometer.ReadingChanged += new TypedEventHandler<Inclinometer, InclinometerReadingChangedEventArgs>(ReadingChanged);
                }
            }
        }
    }

Имя пространства имен в предыдущем фрагменте нужно заменить именем вашего проекта.You'll need to rename the namespace in the previous snippet with the name you gave your project. Например, если вы создали проект под названием InclinometerCS, необходимо заменить namespace App1 на namespace InclinometerCS.For example, if you created a project named InclinometerCS, you'd replace namespace App1 with namespace InclinometerCS.

  • Откройте файл MainPage.xaml и замените исходное содержимое следующим XML-кодом.Open the file MainPage.xaml and replace the original contents with the following XML.
        <Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">

        <Grid x:Name="LayoutRoot" Background="#FF0C0C0C">
            <TextBlock HorizontalAlignment="Left" Height="21" Margin="0,8,0,0" TextWrapping="Wrap" Text="Pitch: " VerticalAlignment="Top" Width="45" Foreground="#FFF9F4F4"/>
            <TextBlock x:Name="txtPitch" HorizontalAlignment="Left" Height="21" Margin="59,8,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="71" Foreground="#FFFDF9F9"/>
            <TextBlock HorizontalAlignment="Left" Height="23" Margin="0,29,0,0" TextWrapping="Wrap" Text="Roll:" VerticalAlignment="Top" Width="55" Foreground="#FFF7F1F1"/>
            <TextBlock x:Name="txtRoll" HorizontalAlignment="Left" Height="23" Margin="59,29,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="50" Foreground="#FFFCF9F9"/>
            <TextBlock HorizontalAlignment="Left" Height="19" Margin="0,56,0,0" TextWrapping="Wrap" Text="Yaw:" VerticalAlignment="Top" Width="55" Foreground="#FFF7F3F3"/>
            <TextBlock x:Name="txtYaw" HorizontalAlignment="Left" Height="19" Margin="55,56,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="54" Foreground="#FFF6F2F2"/>

        </Grid>
    </Page>

Первую часть имени класса из предыдущего фрагмента нужно заменить на пространство имен вашего приложения.You'll need to replace the first part of the class name in the previous snippet with the namespace of your app. Например, если вы создали проект под названием InclinometerCS, необходимо заменить x:Class="App1.MainPage" на x:Class="InclinometerCS.MainPage".For example, if you created a project named InclinometerCS, you'd replace x:Class="App1.MainPage" with x:Class="InclinometerCS.MainPage". Кроме того, необходимо заменить xmlns:local="using:App1" на xmlns:local="using:InclinometerCS".You should also replace xmlns:local="using:App1" with xmlns:local="using:InclinometerCS".

  • Нажмите клавишу F5 или выберите Отладка > начать отладку , чтобы выполнить сборку, развертывание и запуск приложения.Press F5 or select Debug > Start Debugging to build, deploy, and run the app.

После запуска приложения можно изменить значения инклинометра, перемещая устройство или используя средства эмулятора.Once the app is running, you can change the inclinometer values by moving the device or using the emulator tools.

  • Закройте приложение, вернувшись в Visual Studio и нажав клавиши Shift + F5 или выбрав Отладка > отменить отладку , чтобы прерывать работу приложения.Stop the app by returning to Visual Studio and pressing Shift+F5 or select Debug > Stop Debugging to stop the app.

ОбъяснениеExplanation

Из предыдущего примера видно, какой небольшой объем кода требуется написать, чтобы включить в ваше приложение обработку входных данных инклинометра.The previous example demonstrates how little code you'll need to write in order to integrate inclinometer input in your app.

Приложение устанавливает связь с инклинометром по умолчанию в методе MainPage.The app establishes a connection with the default inclinometer in the MainPage method.

_inclinometer = Inclinometer.GetDefault();

Приложение устанавливает интервал передачи данных в методе MainPage.The app establishes the report interval within the MainPage method. Этот код позволяет получить значение минимально допустимого для данного устройства интервала и сравнить его с требуемым интервалом в 16 миллисекунд (что приблизительно соответствует частоте обновления 60 Гц).This code retrieves the minimum interval supported by the device and compares it to a requested interval of 16 milliseconds (which approximates a 60-Hz refresh rate). Если минимально допустимый интервал больше требуемого, то код задает значение интервала, равное минимальному.If the minimum supported interval is greater than the requested interval, the code sets the value to the minimum. В противном случае задается значение интервала, равное необходимому.Otherwise, it sets the value to the requested interval.

uint minReportInterval = _inclinometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
_inclinometer.ReportInterval = reportInterval;

Новые данные от инклинометра принимаются в методе ReadingChanged.The new inclinometer data is captured in the ReadingChanged method. Каждый раз, когда драйвер датчика получает от датчика новые данные, он передает их вашему приложению с помощью этого обработчика событий.Each time the sensor driver receives new data from the sensor, it passes the values to your app using this event handler. Приложение регистрирует этот обработчик событий в следующей строке:The app registers this event handler on the following line.

_inclinometer.ReadingChanged += new TypedEventHandler<Inclinometer,
InclinometerReadingChangedEventArgs>(ReadingChanged);

Новые значения записываются в элементы TextBlock в XAML-коде проекта.These new values are written to the TextBlocks found in the project's XAML.

<TextBlock HorizontalAlignment="Left" Height="21" Margin="0,8,0,0" TextWrapping="Wrap" Text="Pitch: " VerticalAlignment="Top" Width="45" Foreground="#FFF9F4F4"/>
 <TextBlock x:Name="txtPitch" HorizontalAlignment="Left" Height="21" Margin="59,8,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="71" Foreground="#FFFDF9F9"/>
 <TextBlock HorizontalAlignment="Left" Height="23" Margin="0,29,0,0" TextWrapping="Wrap" Text="Roll:" VerticalAlignment="Top" Width="55" Foreground="#FFF7F1F1"/>
 <TextBlock x:Name="txtRoll" HorizontalAlignment="Left" Height="23" Margin="59,29,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="50" Foreground="#FFFCF9F9"/>
 <TextBlock HorizontalAlignment="Left" Height="19" Margin="0,56,0,0" TextWrapping="Wrap" Text="Yaw:" VerticalAlignment="Top" Width="55" Foreground="#FFF7F3F3"/>
 <TextBlock x:Name="txtYaw" HorizontalAlignment="Left" Height="19" Margin="55,56,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="54" Foreground="#FFF6F2F2"/>