Category Archives: WinRT & UWP

[UWP] Async Storyboard çağırmak.

Windows uygulamaları geliştirirken sayfadaki elementler üzerinde animasyon kullanmak istiyorsak Storyboardları kullanıyoruz. Genellikle geliştiriciler bu animasyonları hazırlamak için Blend kullanırlar. (Düzenlemek istediğiniz elementin bulunduğu sayfanın üzerine Solution Explorer’dan sağ tıklayarak ‘Design in Blend’ seçeneğine basarak erişebilirsiniz.)

Animasyonu oluşturup Storyboardumuzu XAML tarafında tanımladıktan sonra kod tarafında bu animasyonu belirlenen obje üzerinde oynatmak için Begin methodunu kullanıyoruz. Begin methodu senkron çalışan bir method ve Storyboard sınıfının içerisinde bu methodu asenkron hale getirecek başka bir oynatmak methodu bulunmuyor. Fakat Completed eventini ve TaskCompletionSource sınıfını kullanarak bütün Storyboardları asenkron çalıştıran bir extension method yazabiliriz.

sampleAnimation isimli bir Storyboard düşünelim. Bu animasyon başlamadan önce ekrana animasyonun çıkan diyalog kapatıldıktan sonra başlayacağını belirten bir mesaj verdirtelim. Daha sonra animasyonu oynatalım ve animasyonun bittiğine dair bir mesaj daha verdirelim.

private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    await (new MessageDialog("Animasyon bu diyalog kapatıldığında başlayacak.").ShowAsync());
    sampleAnimation.Begin();
    await (new MessageDialog("Animasyon bitti!").ShowAsync());
}

Peki ya bu animasyon bitmeden kodun devamına geçmesini istemiyorsak? Şu anki haliyle ilk diyalogu kapattığımız gibi animasyon başlayacak fakat Begin methodu senkron çalıştığı için kod çalıştırması devam edecek ve animasyonun bittiğini belirten ikinci bir diyalog gelecek. Animasyon 3,5 milisaniyede bitmiyorsa bu durumda çok yanlış yapıyoruz demektir 🙂 İşte o zaman bu oynatma methodunun asenkron haline ihtiyacımız oluyor. Aşağıdaki şekilde bir StoryboardHelper içerisinde BeginAsync extension methodunu yazarak bu işten kurtulabiliriz.

public static class StoryboardHelper
{
    public static Task BeginAsync(this Storyboard storyboard)
    {
        var completionSource = new TaskCompletionSource<object>();

        storyboard.Completed += (c, r) =>
        {
            completionSource.SetResult(null);
        };

        storyboard.Begin();

        return completionSource.Task;
    }
}

Daha sonra animasyonu oynattığımız yeri de aşağıdaki gibi düzenlersek amacımıza ulaşmış oluyoruz.

private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    await (new MessageDialog("Animasyon bu diyalog kapatıldığında başlayacak.").ShowAsync());
    await sampleAnimation.BeginAsync();
    await (new MessageDialog("Animasyon bitti!").ShowAsync());
}

Asenkron Storyboard kullanımına ihtiyacınız varsa TaskCompletionSource kullanımına ait de çok güzel bir örnek olan yukarıdaki BeginAsync methodunu kullanabilirsiniz.

0
Shares

UWP için MVVM destekli Modal Dialog Helper.

UWP uygulamaları geliştirirken çok sorunla karşılaştığım ve uzunca bir süredir canımı sıkan bir konu var. ContentDialog. Oldukça hoş bir görüntüsü olduğunu söyleyebilirim. Kullanıcıdan cevap almak için birebir. FAKAT AŞIRI SINIRLI!

Evet çok sınırlı bir kontrol. Sınırlı kontrolden kastım özelleştirmesi oldukça zahmetli ve hatta bazı şeyleri yapabilmek için imkansız bir kontrol. Ben dahil bir çok geliştiricinin tam ekran kaplayan bir ContentDialog tasarlarken kafayı yediğini öngörebiliyorum. Hayır bahsettiğim FullSizeDesired değil…

Microsoft’un bu konudaki tutuculuğunu anlayabiliyorum. Bir amaç uğruna tasarlanmış bir kontrolün amacı dışında kullanılmasını engellemek oldukça mantıklı bir davranış. Bir modal dialog olarak ContentDialog altyapısını kullanmak ilk başta oldukça mantıklı gelse de biraz haşır neşir olunduktan sonra imkansız olduğunu anlayabiliyoruz. WinRT zamanlarında kullandığımız modal dialog açmamıza yarayan helper classların çoğunun yeni UWP altyapısında çalışmadığını görmek beni ilk başta üzmüş olsa da kendiminkini yazmak için cesaretlendirdi.

Tıpkı bir ContentDialog gibi çalışan, kolayca özelleştirilebilir ve MVVM altyapısına uygun bir ModalDialogHelper sınıfı hazırladım. Bu generic sınıfın özelliği parametre olarak verdiğiniz herhangi bir Control objesini ContentDialog gibi bir container elementinin içine basması ve async bir şekilde kapatılmasını beklemesi. Eğer ViewModel tarafından aktarmak istediğiniz bir sonuç varsa bu bekleme işlemi sırasında onu da yakalayabilmenize imkan sağlıyor. Yani:

var result = await (new ModalDialogHelper<bool>()).ShowDialogAsync(typeof(TestUserControl),new TestUserControlViewModel());

tarzındaki bir kullanım DataContext’i TestUserControlViewModel olan bir TestUserControl kontrolünü ekrana basıp ViewModel içerisinden diyaloğu kapatmak istediğiniz bir methoddaki cevabı bekler.

Kendi amacım için olan kısmında bu datacontext mevzusu tamamen yoktu çünkü projemde Unity container olduğu için viewmodel bağlantıları otomatik olarak oluşturuluyordu. Fakat paylaşmak adına bu şekilde bir kullanım da ekledim.

Diyaloğu ViewModel içerisinden kapatmak için :

DialogDismissRequested.Invoke(null, null);

DialogDismissRequested eventini çağırmanız yeterli. Bu eventin ikinci parametresi T generic alıyor ve geriye döndürmek istediğiniz cevabın türünden olmak zorunda. Yukarıdaki örnekte ModalDialogHelper<bool> kullanimindaki bool aslında döndürmek istediğim tür olduğu için bu şekilde örnekledim.

Yukarıda yazıya başlarken bir containerdan bahsetmiştim. Unity olmayan ModalDialogContainer. Bu container da aslında bir Control ve kendine ait bir ContentTemplate içeren bir XAML resource’u içeriyor :

<Style TargetType="local:ModalDialogContainer">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="local:ModalDialogContainer">
                        <Grid>
                            <Grid Background="Black" Opacity="0.8"/>
                            <ContentPresenter x:Name="ContentPresenter" Margin="16">
                                <ContentPresenter.Transitions>
                                    <TransitionCollection>
                                        <EntranceThemeTransition />
                                    </TransitionCollection>
                                </ContentPresenter.Transitions>
                            </ContentPresenter>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

Ben ContentDialog görünümü verebilmek için arkaya %80 opacity kullandım. Aşağıdaki resimde gördüğünüz kontrol TestUserControl ve yukarıdaki satırları kullanarak ekrana bastığınız Modal şu şekilde görülüyor :

testusercontrolpreview

Arkaplanda beyazdan kırmızıya giden bir grandient Grid mevcut.

ModalDialogHelper’ın işi UI ile olduğu için sanırım yapılan bütün çağrıların UI Thread üzerinden yapılması gerektiğinden bahsetmeme gerek yok 🙂

Bu helper özelleştirilebilir. Normal ContentDialogda aşina olduğumuz geri tuşuna basıldığında diyaloğu kapatma gibi özellikler eklenebilir. Fakat şimdilik başlangıç için yeterli diye düşünüyorum.

ModalDialogHelper’ı kullanırken hatırlamanız gereken şeyler :

  • ViewModel her zaman IModalDialog interface’inden türemeli.
  • ShowDialogAsync methodu her zaman UI thread üzerinden çağırılmalı.
  • ViewModel içerisinde açılışta bir yükleme yapmak istiyorsanız OnInitializedAsync Task’ını kullanabilirsiniz.
  • Diyaloğu kapatmak veya beklediğiniz yanıtı göndermek için ViewModel içerisinden DialogDismissRequested eventini kullanabilirsiniz.

Helper’a ve örnek projeye buraya tıklayarak ulaşabileceğiniz GitHub reposu üzerinden ulaşabilirsiniz.

Cheers.

0
Shares

Okunabilir XAML Yazmak

Any fool can write code that a computer can understand.  Good programmers write code that humans can understand. – Martin Fowler

Bahsettiğimiz konu kod yazmaya gelince bütün geliştiricilerin kendi standartları olabilir. Fakat yazdığımız kod ne olursa olsun biz bırakıp gittiğimizde kodumuzu okuyacak bir diğer insan bunu işkence görmeden başarabilmeli 🙂

Hangi dilde yazıyor olursak olalım eğer bir tasarım dili yazıyorsak visualization (görselleştirme) her zaman daha zor olacaktır. Çünkü yazdığımız şey aslında hayali bir çerçeve içerisinde hayali şeylerin nasıl görüneceğini belirlemek. Yazdığımız kodların bu hayali çerçeve içerisinde nasıl görüneceğini zaman içerisinde biz de kestirebiliyoruz. Fakat bu büyük bir uğraş ve zaman gerektiriyor. Yeni XAML yazmaya başlamış birinin Designer kullanmadan tasarım yapması beklenemez. Gün geçtikçe Designerdan uzaklaşıp XAML’ı kod tarafında yazmak hem geliştiricinin yazdığı kodu görselleştirmesinde hem de daha hızlı geliştirme yapmasına yardımcı olacaktır.

Daha önce de söylediğim gibi bütün geliştiricilerin kendilerine has standartları olabilir. En basitinden Camel & Pascal Case diye ayırdığımız naming conventionları örnek verebiliriz. Peki iş tamamen görsele dayalı bir dil olduğunda okunabilirliği nasıl sağlayabiliriz?

Bu yazıda kendi günlük geliştirmelerimde yaptığım XAML sayfalarında dikkat etmeye çalıştığım ve kod okunabilirliğini arttırmaya yardımcı olacak maddeleri sıraladım. Bunlar benim standartlarım olduğu için herhangi bir geçerliliği elbet yok. Fakat yazının amacı eğer okunabilirliği arttırmaksa aşağıdaki maddeler hem size hem de sizden sonraki geliştiricilere hayatı büyük bir oranda kolaylaştıracağından eminim.

Ortak özelliklere sahip elementler için Style kullanın.

Copy – paste programming günümüzde bu kadar yaygınlaşmışken sayfa veya proje içerisinde aynı özelliklere sahip elementler için kullanmanız gereken Style kodlarının da bu kadar az olması haliyle kaçınılmaz. Çoğu geliştirici için bir tane elementi tam haliyle yazıp onu kopyalayıp yapıştırarak çoğaltmak, bu elementlerin kullanabileceği ortak bir Style kodu yazmakdan daha kolay geliyor. Şimdi bunu yapmanın işinizi ne kadar kolaylaştırdığı tartışılabilir. Fakat kopyala – yapıştır yaparak çoğalttığınız elementlerin büyük çaplı projelerde başınıza dert olacağı bir kaçınılmazdır.

Style kodları kullanmak yönetmesi kolay bir tasarım kodu oluşturmaya yardımcı olur. Ayrıca her maddede olduğu gibi kod anlaşılabilirliğini had safhada tutmanızı sağlar. Resimlerle örneklemek gerekirse:

Birbirlerinden bağımsız fakat aynı özelliklere sahip TextBlocklar.

Birbirlerinden bağımsız fakat aynı özelliklere sahip TextBlocklar.

Page Resource içerisine tanımlanmış bir Style koduyla tanımlanmış TextBlocklar.

Page Resource içerisine tanımlanmış bir Style koduyla tanımlanmış TextBlocklar.

 

 

Birbirine benzer fakat çok az propertyler ile birbirinden ayrılan stil parçaları için BasedOn kullanarak ana stilden farklı stil parçaları oluşturabilirsiniz.

Sayfa içerisindeki bütün TextBlocklar aynı stile sahip olacaksa bir x:Key tanımlaması yapmanıza gerek yok. Ayrıca her zaman olduğu gibi gerektiği yerlerde comment tagleri içerisine açıklama yazmayı öncelik sıranıza almayı unutmayın.

UI Elementleri yazarken belirlediğiniz kurallara uyun.

Şimdi bu da aslında yazıda yazdığım bütün maddeler gibi size kalmış bir şey. Fakat code-readability (kod okunabilirliği) açısından en önemli unsurlardan biri. Geliştirdiğiniz projelerin her aşamasında olduğu gibi yazdığınız kodun başkası tarafından rahatça okunabilinip anlaşılabiliyor olması beklenir. İş tasarım dili olunca da backend kodu gibi şöyle bir göz gezdirilip devam edilemeyebiliyor çoğu zaman. Çünkü bir componentin tanımlanmış 10’dan fazla propertysi olabilir. Bunların hepsini bir XAML koduna bakıp akılda tutmak ya da yeri geldiğinde dönüp bulmak vakit kaybına yol açabilir. İşte bu tarz ufak gibi görünen ama aslında geliştirme zamanınızı çok daha hızlandırabilecek küçük unsurları düzeltmek için şunları yapabilirsiniz:

Inline yerine Newline kullanın

Aşağıya iki farklı resim ile çok propertyli bir UI element kodu ekliyorum, sanırım bahsettiğim şeyi anlayacaksınız.

Inline

Inline

Newline

Newline

 

 

 

 

 

 

Sonuç olarak iki resimdeki kod da aynı işi yapıyor ve aynı elementi ekrana basıyor. Fakat alt resimeki koda baktığımızda okunabilirlik diğerine göre daha çok daha fazla.

Kendi rulesetinizi oluşturun

Şimdi Ruleset dediğimiz olay aslında kod kalitesini arttırmak ve kod okunabilirliğini yüksek seviyelerde tutmak için geliştirilmiş bir dosyadan başka bir şey değil. Visual Studio içerisinde belirli rulelara (kurallara) göre kod yazmak da aslında bu bahsettiğim iki unsuru destekleyen bir unsur. Daha detaylı bilgi için şu MSDN sayfasını inceleyebilirsiniz.

Benim bahsettiğim ruleset ise tamamen sizin kendi kod standartınıza uygun bir hayali ruleset. Emin olmamakla beraber bildiğim kadarıyla şu an Rule dosyaları XAML içerisinde kullanılamıyor. Bu durumda da bize düşen kendi hayali rulesetimizi oluşturup kodu ona göre yazmak. Nasıl mı?

Örneğin XAML dosyası içerisine tanımladığımız her bir componente erişmek için bir x:Name tanımlar ve onu kullanırız. Ben şahsen bunu her zaman componentin ilk propertysi olarak hemen altına tanımlamaya özen gösteririm. Bu gerekli bir şey değil, isterseniz ortalarda bir yere ya da en görünmeyen yere yazın hiç fark etmez, sonuçta compilerdan geçtiğinde pek bir önemi kalmıyor, değil mi? 🙂 Değil abi. Özellikle designer çok exceptional caseler dışında designer kullanmayan biri olarak bu benim için önemli. Benim için aslında uymaya çalıştığım ruleset öncelik sırasına göre şöyle:

  1. x:Name her zaman en başta olmalı ki ben neyle uğraştığımı anlamak için gözümü ordan oraya çevirmeyeyim.
  2. Eğer kontrol bir Grid içerisinde ise attached propertyleri olan Row ve Column propertyleri her zaman ikinci sırada, x:Name’den sonra gelir. Bunun nedeni de Grid yapısını kullanırken elementin tam olarak nerede render edileceğini kafamda daha rahat canlandırabilmem aslında.
  3. Width ve Height propertyleri olabildiği en üst sıralara yazılır. Bunun sebebi de yine Row ve Column ile aynı aslında. Tamamen yazılan tasarım kodunu kafamda rahat canlandırabilmek.
  4. Bunlardan sonra gelen propertyler öncelik sırasına göre yazılır.

Bunlar benim uymaya çalıştığım kurallar. Siz de yukarıdakiler gibi kendi kurallarınızı oluşturup bunları projenin uygun bir yerine açıklayıcı bir şekilde yazabilirsiniz. Böylece bir dahaki sefere neyi nerde bulabileceğinizi daha kolay bir şekilde halledebilirsiniz. Aşağıda yine kıyaslama adına iki farklı resim paylaşıyorum.

Yapılması gereken.

Yapılması gereken.

Koşarak uzaklaşılması gereken.

Koşarak uzaklaşılması gereken.

 

 

 

 

 

 

 

Yukarıdaki Grid içerisinde Row setter indexi 0 olan Textblock için atama yapılması tercih sebebidir.

Bütün Resourceları tek bir yere yazmayın.

Hepimizin nimetlerini sonuna kadar kullandığı bir dosya var. App.xaml 🙂 İş resource yönetimine gelince çoğu zaman her şeyi en kolay yöntem olan App.xaml üzerine yüklüyoruz. Bu da geniş çaplı projelerde gereksiz resourceların tek bir dosyada toplanmasını beraberinde getiriyor. Bu durum her ne kadar günümüz bilgisayarlarının halledemeyeceği kadar yoğun bir iş yükü oluşturmuyor olsa da amacımız her şeyi nizami bir şekilde geliştirmek. Peki nedir bunun yolu / yordamı?

ResourceDictionary kullanın

ResourceDictionary ile farklı amaçlar için saklamak istediğiniz farklı türdeki resourceları (örneğin Converter’lar, DataTemplate’ler, Style’lar) farklı xaml dosyaları içerisine yazarak tek bir yerde toplayabilirsiniz.

Ayrıştırılmış Resource dosyaları.

Ayrıştırılmış Resource dosyaları.

 

 

 

 

 

Tek bir dosya için kullanacağınız resourceları ortak alanlara yazmaktan kaçının

Yalnızca tek bir sayfa için kullanacağınız bir DataTemplate’i App.xaml veya farklı bir Resource xaml’ı içerisinde yazmanın hiç bir anlamı yok. Eğer yazdığınız bu template yalnızca o sayfa içerisinde kullanılacaksa Page.Resources altına yazabilirsiniz. Bu ayrıca IntelliSense’in gerektiği durumlarda kod bölüğünü bulmasını da hızlandıracaktır.

Yüksek Margin ve Padding değerleri kullanmayın.

WinRT, UWP, WPF vs. konusunda yeni yeni geliştirme yapmaya başlamış bir geliştiricinin en çok düştüğü hatalardan biri Designer üzerinden ekrana sürükleyip bıraktığı kontrolün, uygulamanın çalıştığı ekran çözünürlüğü ne olursa olsun hep aynı yerde gözükeceğidir. Bu tabiki de yanlıştır, çünkü siz drag & drop yöntemiyle ekranın herhangi bir yerine bir element sürüklediğiniz zaman Designer bu elemente sizin koyduğunuz yere uygun olması için gerekli Margin değerlerini otomatik olarak atar. Görünürde bir saçmalık yoktur, çünkü zaten XAML Designer bunu sizin görmek istediğiniz şekilde ayarladı bile. Sorun bu uygulamayı farklı çözünürlüklerde çalıştırdığınız zaman ortaya çıkar.

Margin ve Padding propertyleri için okunabilirliği ele almamız yine bize visualization (canlandırma) konusunda yardımcı olabilir. Küçük değerlerle çalışmak hem bu canlandırmayı kolaylaştırdığı gibi hem de farklı çözünürlüklerde uçuk kaçık elementler görmemizi engeller. Yani aslında küçük değerlerle çalışıp istediğimiz ekran görüntüsünü yakalayabilmek bizim veya çalışma arkadaşlarımızın işini okunabilirlik konusunda kolaylaştırdığı gibi farklı ekran çözünürlüklerinde test ettiğimiz elementlerin çok farklı yerlerde konumlanmasını engeller.

 

0
Shares

UWPToolkit Yayınlandı!

UWPToolkit Nedir?

Evet yukarıda alıntı yaptığım tweetten de anlaşılacağı gibi 18 Ağustos tarihinde UWP Toolkit adı altında Windows 10 geliştiricilerinin işini kolaylaştıracak bir sürü user control, converer, service provider vs. barından bir toolkit yayınlandı. Bunu daha önce Windows Phone için yayınlanan WPToolkit’in UWP hali diyebiliriz. UWP olduğu için Windows 10 içeren bütün cihazlarda bu toolkiti kullanabiliriz demek oluyor bu elbette! Toolkitin içerisinde neler var şöyle bir göz atalım:

UWPToolkit'in GitHub sayfasından...

İçinde Neler Var?

Aslında yukarıdaki resimde tam olarak içerisinde neler olduğu anlatılmış. Fakat ben biraz da Githubdaki projeden bahsetmek istiyorum. Github’da projenin bütün source code’uyla beraber bir de sample app yani örnek proje yayınlanmış. Projeye ait bütün componentlerin detaylı bir şekilde kullanıldığı bu örnek uygulamayı Windows 10 cihazınıza yükleyerek projenin bütün içeriğini test edebilirsiniz.

Bilmeniz Gerekenler

  • UWP Toolkit minimum version olarak SDK 10586 gerektiriyor. Eğer projeniz 10586 öncesini hedef göstererek oluşturulmuşsa bu toolkiti malesef kullanamıyorsunuz. Çünkü içerisinde Composition API’dan estanteneler bulunduruyor ki bu API’da zaten minimum olarak bu sürümü destekliyor. Proje içerisindeki animasyonlar eğer destekleniyorsa Composition API aracılığı ile yapılıyor. Örneğin Blur efektini normalde XAML aracılığı ile veremezsiniz. (Araya DirectX falan sokmak gerekiyo, hiç araştırmayın :P)
  • Bir alt başlıkta da değindiğim gibi proje açık kaynak kodlu olarak Github üzerinden geliştirilmeye devam ediyor.
  • Visual Studio 2015 Update 3 kurmadan geliştirme yapamazsınız. Gereksinimler için buraya tıklayarak Getting Started sayfasını ziyaret edebilirsiniz.

Açık Kaynak

Yayınlandığı günden itibaren buraya tıklayarak ulaşabileceğiniz Github profili üzerinden açık kaynak olarak yayınlanan bu toolkit için henüz yayınlanmasının üzerinden 5 gün geçmesine rağmen bir çok pull request geldi bile… Hatta ben de birkaç tane gönderdim. 🙂 Eğer siz de projenin gelişmesine katkı sağlamak istiyorsanız Github sayfası üzerinden Issue’lar kapatabilir, eksik gördüğünüz yerleri tartışıp ortak karar alındığında pull request göndererek geliştirebilir ya da kendi projelerinizde kullanarak eksiklikleri dile getirebilirsiniz.

 

0
Shares

Güncel Televizyon geri dönüyor !

Hızlanan kalp atışlarınızı duyar gibiyim … Çok pardon o odamın camına çarpan kar tanelerinden geliyormuş 😛

Yaklaşık 10 gün önce Güncel Televizyon’un Windows 10 sürümünü yazmaya başladım.Azar azar buraya tıklayarak ulaşabileceğiniz GitHub reposunu güncelliyorum.Şu an için sadece tamamlanmamış ana sayfası , hakkında sayfası , kanal listeleme ve yayın akışı sayfası var.Henüz izleme kısmıyla ilgili bir çalışma göndermedim repoya.Yoğunluktan sıyrıldığım zaman elbet o da gelecek.

Projeyi Prism kullanarak MVVM altyapısıyla geliştiriyorum.Aslında bir Universal Windows Project (UWP) projesi.Yani çıktı alabildiğimiz zaman hem Windows 10 , hem Windows Phone 10 hem de Xbox üzerinde çalışacak.Xbox kısmı şu an için mümkün değil gerçi fakat ben projeyi tamamlayana kadar o SDK’i de sanırım yayına almış olur sayın Microsoft 🙂

Güncel Televizyon her zaman benim üzerinde çalışmaktan zevk aldığım bir proje olmuştur.Aslına bakarsanız kendimi ve diğerlerini geliştirmenin bir yolu olarak düşünebiliriz.Açık kaynaklı geliştiriyorum çünkü ‘Bunu ben yaptım, sadece benimdir‘ demeyi sevmiyorum.Ben yazdıkça, insanlar okudukça bu döngü mutual bir ilişkiye doğru gider.Ben yazarken kendimi geliştiriyorum, siz de öğrenmek istediğiniz yerler için bir referans bulabiliyorsunuz.Bundan güzel daha ne olabilir ki?

Uygulamanın Windows 10 sürümünde yepisyeni birkaç özellik daha eklemeyi düşünüyorum.Tamamen freestyle bir şekilde geliştirildiği için aslında yazarken “Aaa bu da olsa efsane olur” dediğim birçok özellik gelecektir aklıma.O nedenle main feature set henüz hazır değil.Fakat elbette bir önceki sürümde olan kanal bulma, canlı yayın akışı, bozuk kanal raporlama gibi ana özellikler bu sürümde de yerini koruyacak.Bunlara ek olarak yeni bir kanal eklendiğinde push notification gönderme gibi şekil şukul işlere de girişmek istiyorum aslında.Bakalım daha neler göreceğiz 🙂

Projeye her zaman destek olabilirsiniz.Bu projeye benim başlamış olmam sadece benim geliştiriyor olmam anlamına gelmiyor.Tıpkı çoğu açık kaynaklı geliştirilen proje gibi.Naming conventionlara ve proje altyapısına uygun her türlü kod desteği kabulümüzdür 🙂

Yakın zamanda bu proje üzerinde çok detaylı bir yazı hazırlamayı da düşünüyorum.Şimdilik bu kadar yeter, hayat toz pembe olmasa da hep gülücük saçın 🙂

0
Shares

Güncel Televizyon Artık Open Source !

Geçen sene ilk versionunu kodlamaya başladığım , Windows Store’da 3 binden fazla değerlendirmesi olan , 50 binden fazla indirilen ve 4.5 yıldız ortalamaya sahip olan televizyon izleme uygulamam Güncel Televizyonu Github üzerinden açık kaynak hale getirdim.Bu uygulamanın bende yeri aslında oldukça büyük.Küçük projelerin yanında bu tarz büyük bir projeye başlamamlaberaber Windows Phone ve Windows 8 üzerindeki tecrübelerimi fazlasıyla geliştirme fırsatı buldum.Şu an bu teknolojiler üzerinde bildiğim neredeyse herşeyi bu projede bulabilirsiniz.Aşağıda özene bezene yazdığım bir hikaye mevcut.Projenin her bir aşamasını , neyi nerde neye dayanarak nasıl yazdım vs. hepsini öğrenebilirsiniz 🙂

Projeye buraya tıklayarak GitHub üzerinden ulaşabilirsiniz !

Hikaye

Fikir tamamen ‘Acaba yapabilir miyim ?’ düşüncesiyle ortaya çıktı.Uzun bir yolculuk olacağını biliyordum , fakat herzamanki gibi bu korku da beni yıldırmadı 🙂 Küçük bir araştırma yaparak HLS (m3u8) , RTMP ve MMS protokolleri üzerinden streaming yapmayla ilgili bilgiler edindim.Daha sonra bu protokollerin Windows Development konusunda yapılan örneklerini araştırdım.Çoğu kanallar HLS yayını yapıyordu ve Windows’taki MediaElement kontrolü by default olarak bu desteği vermiyordu.Araştırmalarıma devam ederek Windows Phone Media Streaming Library (PhoneSM) adlı open-source kütüphaneyi buldum.Bu kütüphane sayesinde MediaElement’e HLS oynatma desteğini entegre edebiliyordum.

Web API

Yayın adresleri sürekli değişiyordu.Bir gün çalışan bir HLS yayını bir sonraki gün çalışmayabiliyordu.Bunu farkettikten sonra uygulamanın içerisinde yayın linklerini sabit olarak gömemeyeceğimi anladım.Bu sorunu çözmek için de çalışan canlı yayın linklerini uygulamaya iletebilecek bir Web API hazırladım.API, izlenilmek istenen kanalın yayın linkini kendi hafızasından uygulamaya iletiyordu ve bu linkleri değiştirmek için tek yapmam gereken sadece API projesini güncelleyip publish etmekti.Böylece her yayın linki değiştiğinde uygulamayı güncelleyip Windows Store’a update göndermek zorunda kalmayacaktım.

Basit bir web api projesi üzerinden çoktan uygulamaya bir farklılık yaratmıştım.Arkasında bir web servis çalışan tek televizyon izleme uygulaması Güncel Televizyondu.Fakat bu da yeterli değildi.Her gün bütün linkler çalışıyor mu acaba diye kontrol edemezdim.Bu soruna da bir çözüm bulmam gerekiyordu , buldum da 🙂 Çok izlenen ve resmi sitelerinde ‘Canlı İzle’ özelliği olan kanallar için Web API projesini güncelledim.API’a bu kanallardan izleme linki isteği geldiğinde API kanalın web sitesindeki ‘Canlı Izle’ sayfasına gidecek , siteyi okuyup içerisinden uygulamaya gönderilecek izleme linkini hazırlayacak ve göndericekti.Böylece az bir eforla çoğu kullanıcının izlediği popüler kanalların kontrolünü yaparak vakit kaybetmeyecektim ve uygulamadaki linkler daha uzun ömürlü ; hatta ömürsüz olacaktı 🙂

Sırf yukarıdaki özelliği API’a entegre etmem bile işimi oldukça kolaylaştırmıştı.Fakat bu da benim için yeterli değildi.Uygulamanın daha ön plana çıkabilmesi için değişik özellikler düşünmem gerekiyordu.Ben de yine hiçbir televizyon izleme uygulamasında olmayan Yayın Akışı desteğini getirdim.API , istenilen kanalın o günkü yayın akışını belli başlı web sitelerine bağlanıp hazırlayarak uygulamaya geri döndürüyordu.Ilk yazdığımda her istekte site tekrar analiz edilip öyle gönderiliyordu ve bu da ciddi bir vakit kaybıydı (4,5 saniye).Bu özelliği daha da geliştirerek her gece 2’de otomatik olarak desteklenen bütün kanalların yayın akışını hafızasında tutacak bir sistem hazırladım.Azure Websites üzerinde çalışan Web API projesi her gece Azure Webjobs’dan tetiklenen bir komutla hafızasındaki bütün kanalların yayın akışını yeniliyor ve bir sonraki güne kadar hafızasında tutuyordu.Böylece istenilen kanalın yayın akışı milisaniyeler içerisinde uygulamaya iletilebiliyordu.

Kanal sayısı arttıkça uygulamalaya iletilecek yayın linkleri artıyor ve bunların kontrolü de zorlaşıyordu.Bu linkleri bir veritabanı altyapısına bağlayarak herhangi bir link değiştiğinde Web API projesini tekrar tekrar publish etmekten kurtuldum.Artık yapacağım tek şey canlı sitesinden okunamayan kanallar için linkini veritabanına girmekti.Böylece uygulamada kullanabileceğim fully functional ve oldukça hızlı bir altyapıya sahip oldum.

Windows 8.1

Web API projesini hazırladıktan sonra uygulamayı derli toplu bir hale getirmek için çalışmalara devam ediyordum.PhoneSM’i izleme sayfasınad entegre ederek HLS yayın desteğini sağladım.Çoğu kanal kendi sitelerinde HLS yayını yapıyordu.Aslında Güncel Televizyon’un sahip olduğu bu zengin ve çalışan kanal listesinin tek sebebi HLS videoları oynatabilmesiydi.Arkasındaki API altyapısı sayesindeyse bu linkler hiçbir zaman ölmüyor , marketteki ratingleri gittikçe artıyordu.

Uygulama kullanılmaya başlandıkça yorumları okumaya devam ediyordum.Herkesin şikayetçi olduğu donma sorununa alternatif birşeyler bulmam gerekiyordu.Ülkemizdeki internet altyapısının verdiği düşüklük nedeniyle bazı kullanıcılar yayınları izlerken buffering sürecinde sıkılıyor ve kötü yorumda bulunuyorlardı.Ben de uygulamaya desteklenen kanallarda HD – Low quality özelliğini getirdim.Interent hızına güvenen kullanıcılar HD butonuna basarak en yüksek kalitede izleyebiliyorlardı.Düşük hızlı internete sahip kullanıcılar göz zevklerinden biraz fedakarlık ederek en düşük kalitede izleyebiliyorlardı 🙂 İleride bu özelliği daha da geliştirerek kullanıcılara destekleyen kanallarda seçebilecekleri bütün bandwith değerleri üzerinden izleme özelliği sundum.

Bu zamana kadar uygulamanın eksiklerini arkadaşlarımdan ve marketteki yorumlardan okuyordum.Bu takibin kontrolü biraz zordu haliyle.Kullanıcılar benimle olan iletişimlerini daha kolay yollardan iletmelilerdi.Bu nedenle bir Mobile Services projesi hazırlayarak uygulamaya iletişim formu koydum.Artık uygulamayı geliştirebilmek için daha fazla kaynağım vardı.

Uygulamaya yeni bir kanal eklendiğinde veya bazı kanalları kaldırmam gerektiğinde uygulamayı günellemem gerekiyordu.Bu başlı başına büyük bir sorundu ve çözümü çoktan düşünmüştüm aslında.Uygulamaya kanal senkronizasyon mantığını getirerek bu sorundan kurtulabilirdim.Uygulama açılırken version numarasını API’a gönderiyordu.API , version numarasını kontrol ederek o versiondan yeni bir version varmı diye kontrol ediyordu.Eğer update varsa , uygulamaya yeni kanal listesini gönderiyordu.Eğer yeni kanal listesi gelirse , uygulama bütün kanalları silip yeni kanal listesini locale kaydediyordu.Böylece bütün kanallar version numarasına göre senkron bir şekilde çalışıyordu.

Her kanalın fotoğrafı Azure Storage üzerinde açtığım bir blob üzerinde veritabanındaki kanal numarasına göre saklanıyordu.Eğer bir kanalın fotoğrafını güncellemem gerekirse sadece Storage hesabımdaki dosyanın üzerine kopyalıyordum.

Windows Phone 8.0

PhoneSM , Windows Phone 8.1 üzerinde çalışmıyordu.Ayrıca telefon uygulamasının Metro uygulamasından biraz daha yanar dönerli olması gerekiyordu , kısacası ekstra bazı componentlar kullanarak uygulamanın arayüzünü güzelleştirmem gerekiyordu.Telerik for Windows Phone kullanmaya karar verdim.API projesine çağrı yapan ve Windows 8.1 uygulamasında kullandığım bazı classları Windows Phone projesine aktararak büyük bir iş yükünün altıntan kolayca kurtuldum.Windows uygulamasındaki bütün özellikleri Windows Phone projesine aktararak Universal Project olarak markete gönderdim.

Mutluyum 😀

Sonuç

Benim için ‘Ben bunu yapabiliyorum !’ diyebildiğim bir proje oldu Güncel Televizyon.Şu an en yeni sürümü Windows Store mağzasında , telefon sürümü ise şu an için yayında değil.Vakit buldukça biraz daha geliştirip yayınlayacağım.Bunun yanında iki platformdaki appten de kaldırdığım push notification özelliği gibi özellikler de vardı , onları da vakit bulursam tekrar eklemeyi düşünüyorum.

Sayonara ! 🙂

0
Shares

Json.NET ile null propertyleri ignore etmek.

Son zamanlar üzerinde çalıştığım bir Jira uygulaması var.Daha önce duymayanlar için açıklayayım , Jira bir proje yönetim portalı.

Uygulama içerisinden Jira REST API’ı kullanarak giriş yaptığınız hesabınıza atanmış projeleri , size açık olan bugları vs. görüp işlem yapabiliyorsunuz.Proje üzerinde çalışırken rastladığım fakat çözümünü bir türlü bulamadığım bir hatayı sizlerle paylaşmak istiyorum.

Rest api üzerinde bir projeye issue oluşturmak için istek gönderirken bazen “It is not on the appropriate screen, or unknown” hatası alıyordum.Biraz araştırma sonucu bunun Jira portalında sorun oluştururken ekranda gözükmeyen alanları güncellemeye çalışırken alınan bir hata olduğunu öğrendim.Örneğin bir projenin hiçbir version bilgisi yoksa , siz version alanını null bile gönderseniz bu hatayı alabiliyorsunuz.

Sorun oluşturmak için gönderdiğim modelde Version ve Components adlı 2 property var.Version için geçerli olan bu hata components için de geçerli.Eğer bu propertyler boşsa , gönderilen Jsonda da olmamaları gerekiyordu.Json.NET’in ise null propertyleri serialize edilen jsondan ignorelamak için müthiş bir attribute’u var …

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]

null ise serialize ediliş halinde eklenmesini istemediğiniz propertylere bu attribute’u ekleyerek bu tarz hataları kolaylıkla atlatabilirsiniz 🙂

Herkese iyi pazarlar !

0
Shares

Güncel Televizyon – Yeni Sürüm

Herkese merhabalar ,

Uzun süredir üzerinde çalıştığım internetten televizyon izlemenize yarayan Windows 8 uygulamam Güncel Televizyonun yeni sürümünü yakın bir zamanda yayınlayacağım.Kanalların yönetilmesiyle ilgili birkaç ufak bir şey kaldı , o da tamam olduktan sonra yeni sürümün Windows 8 uygulaması hazır olacak.Windows Phone uygulaması ise metro app yayına girdikten birkaç hafta sonra WP Store’da olur sanırım …

Öncelikle değiştirdiğim şeylerden bahsetmek istiyorum.Aşağıda eski ve yeni sürüm arasında göze çarpan özellikler yer alıyor :

  • Daha fazla yayın akış desteği :
    Güncellenen web backendinde artık daha fazla yayının akış desteği bulunuyor.Ayrıca yayın akış alma sisteminde yapılan değişiklikler de ilk açılış ve yükleme süresini düşürüyor.
  • Flat UI :
    Windows uygulamaların çoğunda kullanılan Flat tasarım prensipleri yeni sürümdeki tasarımda bulunuyor.Birbiriyle uyumlu renk konseptleri ve tablet kullanımına uygun arayüz ile artık Güncel Televizyonu kullanmak çok çok daha kolay.
  • Akıllı yayın bulma :
    Yayın oynatma sistemine getirilen yeni bir özellik.Desteklenen kanallarda yayının izleme adresi çalışma esnasında oluşturulur.Bu adres kanalın resmi sitesinden elde edilir.Böylece bu yayının patlama ihtimali minimalize edilmiş olur.
  • Çökme raporlama sistemi :
    Bugsız app olmaz 🙂 Yeni sürümü kullanırken bir hatayla karşılaştığınız zaman bunu tek tuşla bana raporlayabilirsiniz.Böylece nerde & nasıl hata aldığınızı anlayabilir ve hatayı daha hızlı düzeltebilirim.
:(

🙁

  • Yayın raporlama sistemi :
    Bu özellik aslında eski sürümde de mevcut.Fakat yeni sürümdeki raporlama biraz daha detaylı ve hızlı çalışıyor.
  • Kanal favorileme :
    Artık sevdiğiniz kanalları favoriye alabilir ve menüden hızlı bir şekilde ulaşabilirsiniz.

4

  • Kanal senkronizasyon sistemi :
    Bir önceki sürümde kanallar uygulamanın içine gömülüydü.Yani her yeni kanal ekleme-çıkarma işleminde uygulamanın güncellenmesi gerekiyordu.Yayın adresleri için bu güncelleme şart değildi fakat kanal listesi güncelleme işleri için gerekliydi.Yeni sürümdeki kanal senkronizasyon mantığı işte bu sorunu ortadan kaldırıyor.

    Eski sürümde uygulama açıldığında bütün kanallar için bütün bilgiler tekrar yükleniyordu.Yeni sürümde ise sistem sunucudan en son kanalların güncelleme bilgisini kontrol edip yeni kanal var mı – yok mu anlıyor.Eğer değişiklik yoksa varolan kanallar kullanılmaya devam ediliyor.Eğer sunucudaki senkronizasyon zamanı ile uygulamadaki en son senkronizasyon zamanı farklıysa sistem bütün kanalları sunucudan güncelliyor.Böylece hem açılış daha hızlanıyor , hem de gereksiz internet kullanımı önleniyor.

  • Duyuru sistemi :
    Yeni bir kanal eklendiğinde , çıkartıldığında veya onarıldığında artık push notification alabiliyorsunuz.Bu duyuruları şimdilik bir yerde saklayamıyorsunuz , fakat implementasyonunu bitirebilirsem belki release zamanı saklayabilirsiniz 🙂
    2
  • Internet bağlantısı kontrolü :
    Eğer internetiniz yoksa uygulamanın internet gerektiren özelliklerini kullanamazsınız.Böylece gereksiz ve beklenmeyen çökmelerin önüne geçilmiş oluyor.
    3
  • Yeni kontrol menüsü :
    Izleme ekranındaki yeni alt menü ile izleme deneyimi arttırıldı.

5

 

Işin ön kısmı bu şekilde.Dediğim gibi hala bitmeyen birkaç ufak ayrıntı var , onları da tamamlayıp en kısa sürede yayınlamayı düşünüyorum 🙂

 

0
Shares

(IoT) TI Sensor Tag ile Sensör Verilerini Okumak

1,2 Ekim’de Haliç Konge Merkezi’nde düzenlenen Webit 2014 etkinliğinde Microsoft IoT Hackathona ben de katıldım.Hackathonda katılımcılardan beklenen Texas Instruments Sensor Tag isimli multi sensörlü bir cihazı Microsoft Azure ile entegreli bir şekilde kullanarak bir proje geliştirmekti.

Etkinlik alanında 3 tane de Bluetooth ile kontrol edilebilen BeeWi oyuncak arabalarından vardı.Ben de proje olarak 2 tane TI Sensor Tag kullanarak bu arabaların uzaktan kontrolünü sağlayabilecek bir Windows Phone uygulaması geliştirdim.2 farklı sensörden bir tanesi gaz – fren için , diğeri ise sol ve sağ için.Başta çok mantıksız geliyordu açıkçası fakat projeyi geliştirdikten sonra arabayı sürmeyi hiç bırakmak istemedim , o kadar zevkli oldu 🙂

Bu yazıda da size bu sensörlerden gelen veriyi nasıl olarak yakalayacağımızı anlatmak istiyorum..Bu cihazlar BLE ( Bluetooth Low Energy ) modunda çalıştıkları için pek fazla güç harcamıyorlar.Ayrıca içinde 6 farklı sensör ve sol – sağ tık içeren bir buton bölümü var.Bu sensörler de GATT ( Generic Attribute Profile ) profillerinde çalışıyorlar.Lumia Black güncellemesiyle bütün Lumia’lara GATT profillerini okuyabilme özelliğinin geldiğini de hatırlatmak isterim.Sensörleri kısaca listelemek gerekirse :

  • IR Temperature
  • Humidity
  • Pressure
  • Accelerometer
  • Gyroscope
  • Magnetometer

Son sürümünde artık iBeacon desteği de getirilmiş ve cihaz 25 $.Buraya tıklayarak sayfasını ziyaret edebilirsiniz.

Cihazdan kısaca bahsettikten sonra gelelim bu aletteki verileri okumaya.Öncelikle kitin kurulumunu yaptıktan sonra elinizde bir adet Sensor Tag oluyor , onu belirteyim :)Kurulum da gayet basit , kitin içindeki pili cihaza takıyorsunuz , bitiyor 😀 Dilerseniz yanında gelen plastik kabı veya silikon kırmızı kabı da kullanabilirsiniz.Cihazdaki verileri okuyabilmek için birçok platforma (iOS , Android , Windows Phone) SDK mevcut.Ben bu yazıda C# kütüphanesini kullanacağım.

Cihaz için hazırlanan Wiki sayfasına buraya tıklayarak , yazıda kullanacağımız TI SensorTag Library’nin Codeplex sayfasına ulaşmak için de buraya tıklayabilirsiniz.

Telefon ile cihaz arasında iletişim kurabilmeniz için öncelikle Bluetooth ayarlarından cihazları pair etmeniz gerekiyor.Pin ise 0000 veya sadece 0 🙂 GATT API Windows Phone 8 için mevcut değil.O nedenle Universal App veya sadece Windows Phone 8.1 uygulaması geliştirebilirsiniz.C# Library’sini indirdikten sonra projenize referans olarak ekleyin.

Projede Bluetooth kullanacağınız için Package.appmanifest dosyasında Capabilities altında Proximity ve Networking’i aktifleştirmeniz gerekiyor.Ardından GATT profillerini XML editör ile package.appmanifest dosyasında tanımlamalısınız.Bunun için öncelikle App.xaml dosyasını XAML kod editörüyle açın ve en üstte uygun bir yere aşağıdaki xaml referansını ekleyin :

xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest"

Daha sonra Package.manifest dosyasını XML editörüyle açın (sağ click > View code) , Capabilities kısmında en son eklediğiniz Proxmity kısmının altına aşağıdaki kod bölüğünü kopyalayın

<m2:DeviceCapability Name="bluetooth.genericAttributeProfile">
      <m2:Device Id="any">
        <m2:Function Type="serviceId:0000180a-0000-1000-8000-00805f9b34fb" />
        <!--Device Info Service-->
        <m2:Function Type="serviceId:f000aa00-0451-4000-b000-000000000000" />
        <!--Temperature Device Service-->
        <m2:Function Type="serviceId:f000aa10-0451-4000-b000-000000000000" />
        <!--Accelerometer Device Service-->
        <m2:Function Type="serviceId:f000aa20-0451-4000-b000-000000000000" />
        <!--Humidity Device Service-->
        <m2:Function Type="serviceId:f000aa30-0451-4000-b000-000000000000" />
        <!--Magnetometer Device Service-->
        <m2:Function Type="serviceId:f000aa40-0451-4000-b000-000000000000" />
        <!--Barometer Device Service-->
        <m2:Function Type="serviceId:f000aa50-0451-4000-b000-000000000000" />
        <!--Gyroscope Device Service-->
        <m2:Function Type="serviceId:0000ffe0-0000-1000-8000-00805f9b34fb" />
        <!--Key Device Service-->
      </m2:Device>
    </m2:DeviceCapability>

 

Ardından bütün sensörler kullanıma açılacaktır.Bu kısımlarda bir adımı yanlış yapmanız sensörlere erişiminiz sırasında “UnauthorizedException” almanısı sağlayacaktır , o nedenle dikkatli olalım. Sensörlerden veri alabilmek için öncelikle sensörün ait olduğu sınıftan bir nesne yaratıp nesneyi initialize etmeniz gerekiyor.Nesneleri initialize edebilmeniz için de öncelikle etrafınızda bulunan GATT profilinin sinyallerini yakalamnız gerekiyor.Bu işlem GattUtils sınıfının altındaki GetDevicesOfService isimli method ile yapılabiliyor.Parametre olarak da yakalamak istediğiniz sensörün static Id’sini gönderebilirsiniz.Bu Idler üstteki XAML tarafında manifest dosyasına eklediğimiz Id ler ve her sınıfın içinde aslında SensorServiceUuid  propertysi altında bulunuyor.

Şimdi etrafımızdaki Gyroscope GATT profiline ait sensörleri bulalım :

var gyro = new Gyroscope();
gyro.SensorValueChanged += SensorValueChanged;
var gyroProfiles = await GattUtils.GetDevicesOfService(gyro.SensorServiceUuid);

Buradaki gyroProfiles değişkeni bize etrafımızda gyroscope gatt yayını yapan SensorTag cihazlarını döndürecektir.Elinizde tek bir sensör varsa 0. indexi alarak işlem yapabilirsiniz.Ayrıca sensör tag cihazlarının isimleri SensorTag olarak geçer , DisplayName propertysinden kontrol ettirerek daha sağlıklı sonuçlar elde edebilirsiniz.Method async olduğundan kullandığınız fonksiyonu async keywordü ile modifiye etmeyi unutmayın.Eklediğimiz event handlerı yazının son kısmında yazacağız , o kısım bizim sensörden gelen verileri işlediğimiz bölüm olacak.

Cihazı yakaladığımıza göre bu cihazdaki sensörü bizi oluşturduğumuz sensör değişkenine initialize edebiliriz :

await gyro.Initialize(gyroProfiles[0]); /* 0. index = 1. cihaz */

Bu işlem başarıyla tamamlanırsa cihazdaki sensöre resmen bağlanmış oluyoruz.Fakat cihaz eğer ulaşılamaz bir konumdaysa , yayın sinyal seviyesi çok düşükse vs. nadir de olsa bağlanamayabiliyoruz.Veya siz profilleri okuduktan sonra işlem yaparken cihaz sinyal seviyesini kaybedebilir , bu nedenle de yüklenemez.Işte bu gibi durumlarda kullandığımız library bize özel bir exception döndürüyor : DeviceUnreachableException 🙂 Bunu da try – catch ile yakalayarak kullanıcıları bilgilendirebilirsiniz.

GATT sinyallerini sensörümüze yüklemeye başladık , fakat sensörümüz henüz aktif değil.Cihazdaki sensör çevresine aslında yalnızca “Bak benim gyroscope’um var ve bu id ile yayın yapıyorum ! Bana ulaşmak istersen bu Idyi kullan da haberim olsun”  tarzında bir yayın yapıyor.Bu nedenle low energy bluetooth ile çalışabiliyor.Biz de Initialize yaparak aslında “Senin Id’n bu mu ? Tamam ben biliyorum zaten , haberin olsun , bağlandım bak” diyoruz.

Işte bu adımdan sonra cihazdaki sensöre “Abi sen bana gyroscope’um var demiştin , onu bi açsana sana zahmet” diyebilmek için aşağıdaki kodu kullanıyoruz :

await gyro.EnableSensor();

Daha sonra cihazdaki sensör veri toplamaya başlıyor.Fakat bunu bize göndermiyor.Işte “E sen verileri topluyosun , bi zahmet gönderiver bak o kadar bağlandık” demek için de aşağıdaki kodu kullanarak cihazdan veri isteğimizi gerçekleştiriyoruz 🙂

await gyro.EnableNotifications();

Yukarıda yazdığımız EnableNotifications ve EnableSensor methodları için bir de Disable versionları mevcut.Cihazdan veri almayı kesmek istediğiniz zaman bu ikisini kullanabilirsiniz.Sensörü hafızadan silmek için de Dispose methodunu kullanabilirsiniz.

Cihaz bize verilerini gönderiyor , artık yakalamak için oluşturduğumuz event handleri yazabiliriz :

async void SensorValueChanged(object sender, SensorValueChangedEventArgs e)
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
            {
                var gyro = new Gyroscope();
                switch(e.Origin)
                {
                    case SensorName.Gyroscope:
                        float[] axisValues = Gyroscope.CalculateAxisValue(e.RawData, GyroscopeAxis.XYZ);
                        Debug.WriteLine("X: " + axisValues[0] + Environment.NewLine + "Y: " + axisValues[1] + "Z: " + axisValues[2]);
                        break;

                }
            });
        }

 

Yukarıdaki kodda e.Origin , verinin geldiği sensörün adını , e.Rawdata ise  sensörden gelen verinin işlenmemiş halini temsil ediyor.Gyroscopue’un bize gönderdiği X,Y,Z değerlerini yukarıda parçalayarak Debug ekranına yazdırıyoruz 🙂

  1. GATT Profil Idlerini kullanarak etrafındaki cihazları bul. (GetProfileOfDevices)
  2. Cihazları sensörlere yükle (Initialize)
  3. Cihazdaki sensörü aktifleştir (EnableSensor)
  4. Sensörden veri isteği yap (EnableNotifications)
  5. Gelen veriyi kullan (SensorValueChanged)

Işte hayat bu kadar basit arkadaşlar 😛 Hepinize kolay gelsin !

 

 

0
Shares