Facebook RSS Feed
 

.NET Micro Framework: WPF Uygulamalarında Buton Kullanımı

-Micro Framework ile buton kullanımı çoğunlukla Interrupt Port tanımlanarak yapılır. Bu yöntem konsol uygulamaları için idealdir. Fakat ScrollViewer gibi WPF'e özel interaktif kontrollerle çalışmak için GPIO Button Input Provider sınıfı daha iyi entegrasyon sağlayacaktır. Örneğimizde WPF uygulamalarında GPIO Button Input Provider ile buton girişlerini yakalamayı ele alacağız.

Adım 1: Proje Oluşturmak

Visual Studio üzerinden yeni bir Micro Framework Window Application oluşturalım. Projenin Program.cs dosyasında Window Application şablonu ile gelen bir Hello World! uygulaması göreceksiniz. Bu uygulama, GPIO Button Input Provider sınıfı ile entegre edilmiştir ve hiçbir değişiklik yapmadan uygulamayı çalıştırırsanız, simulatör üzerinde bastığınız butonların kodları debug mesajı olarak görülecektir.

Window Application şablonunda Program.cs sınıfının Main metoduna baktığımızda:

GPIOButtonInputProvider inputProvider = new GPIOButtonInputProvider(null);

komutuyla GPIOButtonInputProvider instance'ı alındığını görüyoruz. CreateWindow metodu içerisinde ise butona basılıp serbest bırakılınca fırlayacak event'leri yakalayan OnButtonUp Event Handler'i tanımlanmış:

mainWindow.AddHandler(Buttons.ButtonUpEvent, new RoutedEventHandler(OnButtonUp), false);

Ve butonlara basıldığında focus'un mainWindow'a aktarılması ayarlanmış:

Buttons.Focus(mainWindow);

Program.cs'deki OnbuttonUp metodu, buton serbest bırakılınca tetiklenecektir. Uygulama varsayılanına göre bu metod, basılan butonun kodunu debug mesajı olarak Visual Studio'ya göndermektir.

private void OnButtonUp(object sender, RoutedEventArgs evt)
{
    ButtonEventArgs e = (ButtonEventArgs)evt;
 
    // Print the button code to the Visual Studio output window.
    Debug.Print(e.Button.ToString());
}

6 Satırdan oluşan bu komut, butonlar ile uygulama arasında bir bağ kurulmasını sağlar.

Adım 2: Uygulama Geliştirmek

Şimdi Window Application şablonu üzerinde değişiklik yaparak belirli butonlara basıldığında işlem yapılmasını sağlayalım. Program.cs dosyasının Namespace'leri arasına Microsoft.SPOT.Hardware referansını ekleyelim ve CreateWindow ile OnButtonUp metodlarının içeriğini aşağıdaki gibi değiştirelim:

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Input;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Hardware;
 
namespace MFWPFGPIOButtonProvider
{
    public class Program : Microsoft.SPOT.Application
    {
        public static void Main()
        {
            Program myApplication = new Program();
            Window mainWindow = myApplication.CreateWindow();
 
            // GPIO pinlerini butonlara bağlayan GPIO Button Input Provider objesi oluşturalım:
            GPIOButtonInputProvider inputProvider = new GPIOButtonInputProvider(null);
 
            myApplication.Run(mainWindow);
        }
 
        private Window mainWindow;
 
        public Window CreateWindow()
        {
            // Ekran çözünürlüğünde bir Window objesi oluşturalım:
            mainWindow = new Window();
            mainWindow.Height = SystemMetrics.ScreenHeight;
            mainWindow.Width = SystemMetrics.ScreenWidth;
 
            // Başlık yazısını yazdırıp mainWindow'a ekleyelim:
            Text txt = new Text(Resources.GetFont(Resources.FontResources.small), "Buton Uygulamasi");
            mainWindow.Child = txt;
 
            // Button Handler'ı tüm butonlara bağlayalım:
            mainWindow.AddHandler(Buttons.ButtonUpEvent, new RoutedEventHandler(OnButtonUp), false);
 
            // Pencereyi görünür yapalım:
            mainWindow.Visibility = Visibility.Visible;
 
            // Button Focus'u pencereye ayarlayalım.
            Buttons.Focus(mainWindow);
 
            return mainWindow;
        }
 
        private void OnButtonUp(object sender, RoutedEventArgs evt)
        {
            ButtonEventArgs e = (ButtonEventArgs)evt;
 
            // Simulatör butonlarına basıldığında Debug mesajı alalım:
            switch (e.Button)
            {
                case Button.VK_LEFT:
                    Debug.Print("Sol Buton");
                    break;
 
                case Button.VK_RIGHT:
                    Debug.Print("Sağ Buton");
                    break;
 
                case Button.VK_UP:
                    Debug.Print("Üst Buton");
                    break;
 
                case Button.VK_DOWN:
                    Debug.Print("Alt Buton");
                    break;
 
                case Button.VK_SELECT:
                    Debug.Print("Orta Buton");
                    break;
 
                default:
                    break;
            }
            
            // Basılan buton kodunu Debug mesajı olarak alalım:
            Debug.Print("Buton kodu: " + e.Button.ToString() + "\r\n");
        }
    }
}

Uygulamayı simulatör üzerinde çalıştırıp yön butonlarına bastığınızda Visual Studio Output Window'da aşağıdaki gibi bir çıkış göreceksiniz:

Sol Buton
Buton kodu: 37

Üst Buton
Buton kodu: 38

Sağ Buton
Buton kodu: 39

Alt Buton
Buton kodu: 40

Orta Buton
Buton kodu: 41

Fiziksel bir cihaz kullanıyorsanız, butonlara bastıkça yalnızca buton kodlarını göreceksiniz.

Micro Framework üzerinde tanımlı tüm Button kodları listedeki gibidir:

None = 0
VK_LBUTTON = 1
VK_RBUTTON = 2
VK_CANCEL = 3
VK_MBUTTON = 4
VK_BACK = 8
VK_TAB = 9
VK_CLEAR = 12
VK_RETURN = 13
VK_SHIFT = 16
VK_CONTROL = 17
VK_MENU = 18
VK_PAUSE = 19
VK_CAPITAL = 20
VK_KANA = 21
VK_HANGUL = 21
VK_HANGEUL = 21
VK_JUNJA = 23
VK_FINAL = 24
VK_HANJA = 25
VK_KANJI = 25
VK_ESCAPE = 27
VK_CONVERT = 28
VK_NOCONVERT = 29
VK_SPACE = 32
VK_PRIOR = 33
VK_NEXT = 34
VK_END = 35
VK_HOME = 36
VK_LEFT = 37
VK_UP = 38
VK_RIGHT = 39
VK_DOWN = 40
VK_SELECT = 41
VK_PRINT = 42
VK_EXECUTE = 43
VK_SNAPSHOT = 44
VK_INSERT = 45
VK_DELETE = 46
VK_HELP = 47
VK_0 = 48
VK_1 = 49
VK_2 = 50
VK_3 = 51
VK_4 = 52
VK_5 = 53
VK_6 = 54
VK_7 = 55
VK_8 = 56
VK_9 = 57
VK_A = 65
VK_B = 66
VK_C = 67
VK_D = 68
VK_E = 69
VK_F = 70
VK_G = 71
VK_H = 72
VK_I = 73
VK_J = 74
VK_K = 75
VK_L = 76
VK_M = 77
VK_N = 78
VK_O = 79
VK_P = 80
VK_Q = 81
VK_R = 82
VK_S = 83
VK_T = 84
VK_U = 85
VK_V = 86
VK_W = 87
VK_X = 88
VK_Y = 89
VK_Z = 90
VK_LWIN = 91
VK_RWIN = 92
VK_APPS = 93
VK_SLEEP = 95
VK_NUMPAD0 = 96
VK_NUMPAD1 = 97
VK_NUMPAD2 = 98
VK_NUMPAD3 = 99
VK_NUMPAD4 = 100
VK_NUMPAD5 = 101
VK_NUMPAD6 = 102
VK_NUMPAD7 = 103
VK_NUMPAD8 = 104
VK_NUMPAD9 = 105
VK_MULTIPLY = 106
VK_ADD = 107
VK_SEPARATOR = 108
VK_SUBTRACT = 109
VK_DECIMAL = 110
VK_DIVIDE = 111
VK_F1 = 112
VK_F2 = 113
VK_F3 = 114
VK_F4 = 115
VK_F5 = 116
VK_F6 = 117
VK_F7 = 118
VK_F8 = 119
VK_F9 = 120
VK_F10 = 121
VK_F11 = 122
VK_F12 = 123
VK_F13 = 124
VK_F14 = 125
VK_F15 = 126
VK_F16 = 127
VK_F17 = 128
VK_F18 = 129
VK_F19 = 130
VK_F20 = 131
VK_F21 = 132
VK_F22 = 133
VK_F23 = 134
VK_F24 = 135
VK_NUMLOCK = 144
VK_SCROLL = 145
VK_LSHIFT = 160
VK_RSHIFT = 161
VK_LCONTROL = 162
VK_RCONTROL = 163
VK_LMENU = 164
VK_RMENU = 165
VK_BROWSER_BACK = 166
VK_BROWSER_FORWARD = 167
VK_BROWSER_REFRESH = 168
VK_BROWSER_STOP = 169
VK_BROWSER_SEARCH = 170
VK_BROWSER_FAVORITES = 171
VK_BROWSER_HOME = 172
VK_VOLUME_MUTE = 173
VK_VOLUME_DOWN = 174
VK_VOLUME_UP = 175
VK_MEDIA_NEXT_TRACK = 176
VK_MEDIA_PREV_TRACK = 177
VK_MEDIA_STOP = 178
VK_MEDIA_PLAY_PAUSE = 179
VK_LAUNCH_MAIL = 180
VK_LAUNCH_MEDIA_SELECT = 181
VK_LAUNCH_APP1 = 182
VK_LAUNCH_APP2 = 183
VK_SEMICOLON = 186
VK_EQUAL = 187
VK_COMMA = 188
VK_HYPHEN = 189
VK_PERIOD = 190
VK_SLASH = 191
VK_BACKQUOTE = 192
VK_LBRACKET = 219
VK_BACKSLASH = 220
VK_RBRACKET = 221
VK_APOSTROPHE = 222
VK_OFF = 223
VK_EXTEND_BSLASH = 226
VK_OEM_102 = 226
VK_PROCESSKEY = 229
VK_DBE_ALPHANUMERIC = 240
VK_DBE_KATAKANA = 241
VK_DBE_HIRAGANA = 242
VK_DBE_SBCSCHAR = 243
VK_DBE_DBCSCHAR = 244
VK_DBE_ROMAN = 245
VK_ATTN = 246
VK_DBE_NOROMAN = 246
VK_DBE_ENTERWORDREGISTERMODE = 247
VK_CRSEL = 247
VK_EXSEL = 248
VK_DBE_ENTERIMECONFIGMODE = 248
VK_EREOF = 249
VK_DBE_FLUSHSTRING = 249
VK_DBE_CODEINPUT = 250
VK_PLAY = 250
VK_DBE_NOCODEINPUT = 251
VK_ZOOM = 251
VK_DBE_DETERMINESTRING = 252
VK_NONAME = 252
VK_DBE_ENTERDLGCONVERSIONMODE = 253
VK_PA1 = 253
VK_OEM_CLEAR = 254
LastSystemDefinedButton = 272
AppDefined1 = 273
AppDefined2 = 274
AppDefined3 = 275
AppDefined4 = 276
AppDefined5 = 277
AppDefined6 = 278
AppDefined7 = 279
AppDefined8 = 280

Adım 3: GPIO Button Input Provider Sınıfı

Bir Window Application oluşturduğumuzda projeye dahil edilen GPIO Button Input Provider sınıfı, GPIO pin girişlerinde oluşan interruptları dinleyerek bunu uygulamaya iletir. Uygulama başladığında hardware provider ile pin yapılandırması kontrol edilir. Pin yapılandırması yapılmamışsa, sistem emulatör varsayılan ayarlarıyla çalışır. Bu durumda Sol: Pin 0, Sağ: Pin 1, Yukarı: Pin 2, Aşağı: Pin 4 ve Onay butonu Pin 3'e bağlı varsayılacaktır. Yön butonlarının bağlandığı pinleri değiştirmek için GPIOButtonInputProvider sınıfındaki ilgili değerleri değiştirmemiz gerekir.

Fiziksel cihaz üzerinde çalışıyorsanız aşağıdaki sarı ile vurgulanan bölümleri, simulatör üzerinde çalışıyorsanız yeşil ile vurgulu bölümleri isteğinize göre modifiye etmeniz gerekiyor.

GPIOButtonInputProvider.cs
50 - 85. Satır aralığı:

// Create a hardware provider.
HardwareProvider hwProvider = new HardwareProvider();
 
// Create the pins that are needed for the buttons. Default their 
// values for the emulator.
Cpu.Pin pinLeft = Cpu.Pin.GPIO_Pin0;
Cpu.Pin pinRight = Cpu.Pin.GPIO_Pin1;
Cpu.Pin pinUp = Cpu.Pin.GPIO_Pin2;
Cpu.Pin pinSelect = Cpu.Pin.GPIO_Pin3;
Cpu.Pin pinDown = Cpu.Pin.GPIO_Pin4;
 
// Use the hardware provider to get the pins.  If the left pin is 
// not set, assume none of the pins are set, and set the left pin 
// back to the default emulator value.
if ((pinLeft = hwProvider.GetButtonPins(Button.VK_LEFT)) ==
    Cpu.Pin.GPIO_NONE)
    pinLeft = Cpu.Pin.GPIO_Pin0;
else
{
    pinRight = hwProvider.GetButtonPins(Button.VK_RIGHT);
    pinUp = hwProvider.GetButtonPins(Button.VK_UP);
    pinSelect = hwProvider.GetButtonPins(Button.VK_SELECT);
    pinDown = hwProvider.GetButtonPins(Button.VK_DOWN);
}
 
// Allocate button pads and assign the (emulated) hardware pins as 
// input from specific buttons.
ButtonPad[] buttons = new ButtonPad[]
{
    // Associate the buttons to the pins as discovered or set above
    new ButtonPad(thisButton.VK_LEFT  , pinLeft),
    new ButtonPad(thisButton.VK_RIGHT , pinRight),
    new ButtonPad(thisButton.VK_UP    , pinUp),
    new ButtonPad(thisButton.VK_SELECT, pinSelect),
    new ButtonPad(thisButton.VK_DOWN  , pinDown),
};

Özetle...

WPF uygulamalarında en iyi entegrasyon için GPIO Button Input Provider tercih edilmektedir. Bu yöntem ile WPF'e özgü kontroller buton girişlerini yakalayarak gerekli işlemleri yapabilir. (Listbox'da yukarı / aşağı seçim yapılması gibi.) Donanım tasarımına göre buton yapısı kolaylıkla değiştirilebilir. Bir sonraki makalede buton ile Listbox kullanımına değineceğiz.

Uygulama kaynak kodlarını buradan indirebilirsiniz.




 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi