Windows Phone 7'de Accelerometer verisini okumak.

0 dakikada yazıldı

7440 defa okundu

Düzenle

Cep telefonlarının en önemli parçalarından biri de artık
Accelerometer'lar. Telefonu farklı yönlenere çevirdiğimizde durumu
algılayan donanım parçasından bahsediyorum :) Aslında bu donanım son
dönemde cep telefonlarından çıkıp bilgisayarlarımıza kadar geldi hatta
bu konuda Windows 7 ile beraber "Sensor and Location
API
"
adında yeni bir API serisi bile var. Tabi Windows Phone 7 için uygulama
geliştirirken de doğal olarak cihazlardaki Accelerometer'a ulaşmamız
gerekecek. Merak edenler için özellikle belirtiyim; üzerinde WP7 bulunan
her telefonun bir Accelerometer içermesi Microsoft tarafından şart
koşuluyor. O nedenle uygulamalarınızı kodlarken rahat olabilirsiniz, her
halükarda bir Accelerometer sahibi olacaksınız.

İlk olarak gelin yeni yaratacağımız bir WP7 uygulamasına bir düğme ve üç
tane de TextBlock koyalım. Düğmeye basıldığı anda Accelerometer
sensörüne bağlantıyı kuracağız sonrasında da sensörden yeni veri
geldikçe X, Y ve Z koordinatlarını ayrı ayrı TextBlock'larda
göstereceğiz.

[XAML]

<Grid
x:Name="ContentGrid"
Grid.Row="1">

  <Button
Content="Button"
Height="50" HorizontalAlignment="Left"
Margin="116,23,0,0"
Name="button1"
VerticalAlignment="Top" Width="252" Click="button1_Click"
/>

  <TextBlock
Height="57" HorizontalAlignment="Left"
Margin="167,139,0,0"
Name="textBlock1"
Text="TextBlock"
VerticalAlignment="Top" Width="144" />

  <TextBlock
Height="57" HorizontalAlignment="Left"
Margin="154,201,0,0"
Name="textBlock2"
Text="TextBlock"
VerticalAlignment="Top" Width="144" />

  <TextBlock
Height="57" HorizontalAlignment="Left"
Margin="137,250,0,0"
Name="textBlock3"
Text="TextBlock"
VerticalAlignment="Top" Width="144" />

</Grid>

Tasarım kısmını kabaca bitirdiğimize göre sıra geldi Accelerometer
nesnemizi yakalamaya. Malum telefonlarda bir Accelerometer şart olsa da
sadece bir tane olması gerektiğine dair herhangi bir kural yok. O
nedenle eğer isterseniz sistemdeki tüm Accelerometer'ların bir listesini
Microsoft.Devices.Sensors.AccelerometerSensor listesinden
alabilirsiniz. Tabi tüm bunları yapabilmeniz için projenize
Microsoft.Devices.Sensors assembly'sini referans olarak da eklemiş
olmanız gerekiyor.

Eğer tüm liste sizi ilgilendirmiyorsa ve bir anlamda esas sensörü yani
varsayılan Accelerometer'ı almak istiyorsanız hızlıca
Microsoft.Devices.Sensors.AccelerometerSensor.Default
diyebilirsiniz.

[C#]

    AccelerometerSensor
accelerometer;

 

    private void button1_Click(object sender, RoutedEventArgs e)

    {

        accelerometer = AccelerometerSensor.Default;

        accelerometer.ReadingChanged += new EventHandler<AccelerometerReadingAsyncEventArgs>(accelerometer_ReadingChanged);

        accelerometer.Start();

    }

Kod içerisinde de görebileceğiniz gibi uygulamamızdaki düğmeye basıldığı
anda sistemdeki varsayılan Accelerometer'ı hemen daha önce
tanımladığımız AccelerometerSensor tipindeki bir değişkene
aktarıyoruz. Özünde bunu yapmamızın tek bir nedeni. Sensörü dinleme
işlemini başlatmak için Start ve bitirmek için de Stop
metodlarını kullanabiliyorsunuz. Malum sensöre ileride ulaşıp
durdurabilmek için global bir değişken tanımlamak en mantıklısı. Bunun
haricinde unutmamamız gereken birşey daha var; o da sensörün
ReadingChanged event'ine bir listener ataçlamak. Böylece sensörden
yeni data geldiği anda haberdar olabileceğiz.

[C#]

    void
accelerometer_ReadingChanged(object
sender, AccelerometerReadingAsyncEventArgs e)

    {

        Dispatcher.BeginInvoke(() => Degisti(e));

    }

 

    void Degisti(AccelerometerReadingAsyncEventArgs e)

    {

        textBlock1.Text = e.Value.Value.X.ToString();

        textBlock2.Text = e.Value.Value.Y.ToString();

        textBlock3.Text = e.Value.Value.Z.ToString();

    }

ReadingChanged eventı başka thread tarafından çalıştırıldığı için
doğrudan UIThread'e ulaşamıyoruz. Bu nedenle Dispathcher üzerinden
metodumuzu çalıştırmamız gerek ki UIThread'de işlem yapabilelim. Tüm bu
süreçte bizim için değerli olan datayı taşıyan ise ReadingChanged'e
gelen argüman parametresi. Söz konusu parametreyi doğrudan UIThread'deki
metodumuza da yolluyoruz ki değerleri alıp ekrana yazabilsin. Son olarak
Degisti adındaki metodun içerisinde X, Y ve Z değerlerinin nasıl
alınabildiğini de görebiliyorsunuz.

Artık elimizde sensörün o an için bize gönderdiği koordinat bilgisi var.
Geriye kalan bu bilgilere dayanarak uygulama içerisinde farklı birşeyler
yapmak. Tabi bu noktadan sonrası için makalemie devam edemeyeceğiz :)
Çünkü özünde minik ama kötü bir haberim var. Şu anda MIX ile yayınlanan
Windows Phone 7 CTP'sindeki simülatör sensör desteğine sahip değil :( O
nedenle bu yazdığımız kodların hiçbirini test etme veya uygulama
geliştirme şansımız olmuyor. Yine de şöyle bir bakış atmış ve olayın
nihai manzarada da ne kadar kolay olabileceğine dair fikir edinmiş
olduk.

Hepinize kolay gelsin.