Forum: Projeler Genel RSS
D ile Pin Kontrolü
ozanselte #1
Kullanıcı başlığı: Ozan Şelte
Üye Haz 2013 tarihinden beri · 12 mesaj · Konum: Bodrum
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: D ile Pin Kontrolü
Merhabalar.
Raspberry Pi projelerimde kullanmak için D ile pin kontrol kütüphanesi yazmaya çalıştım. Yorumlarınızı bekliyorum.
https://github.com/ozanselte/dgpio
Mengu (Moderatör) #2
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
ozanselte:
Merhabalar.
Raspberry Pi projelerimde kullanmak için D ile pin kontrol kütüphanesi yazmaya çalıştım. Yorumlarınızı bekliyorum.
https://github.com/ozanselte/dgpio

ozan

ilk gozume carpanlari soyleyeyim:

- exceptionlarin amaci hatalari yakalayip farkli bir yol ile akisi surdurmek veya direkt akisi durdurmaktir. exception yakalayip err = true harici bir sey yapmamissin. hangi hatayi aldin? farkli hata turlerinde farkli sonuclar uretecek misin?
- err = true/false set ediyorsun ancak herhangi bir yerde kullanmiyorsun.
- read ve write yaptigin dosyalari birer fonksiyonda toplayip, pathlerini ve iceriklerini arguman olarak gecmen daha az is yaptirir:

void writeToFile(string filePath, string content) {
    scope(failure) { err = true; }
    File fileToWrite = File(filePath, "w");
    fileToWrite.writefln(content);
    fileToWrite.close();
}
 
string fileLine(string filePath) {
    scope(failure) { err = true; }
    File myFile = File(filePath, "r");
    string str = strip(myFile.readln());
    myFile.close();
    return str;
}
 
// kullanim
 
void setOutput() {
    writeToFile("/sys/class/gpio/gpio" ~ to!string(gpio) ~ "/direction", "out");
}
 
bool isOutput() {
    string direction = fileLine("/sys/class/gpio/gpio" ~ to!string(gpio) ~ "/direction");
    return direction == "out"
}

- directionlara switch yapip ona gore return true veya false yapiyorsun, buna gerek yok. return direction == "out" dedigin zaman ayni seyi kisa sekilde yapmis oluyorsun.

- her yerde "/sys/class/gpio/gpio" pathini goruyorum. bunu bir degiskene atayip onu kullanman daha temiz ve yonetilebilir olur.

- string concatenation yerine buildPath [0] fonksiyonunu kullanmani tavsiye ederim.

kolay gelsin.

[0] https://dlang.org/phobos/std_path.html#.buildPath
http://www.mengu.net - some kind of monster
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Güzel. :)

Notlar:

(Bunları Mengu'nun yazdıklarını okumadan yazdım.)

  • Kapsamdan çıkılırken File nesneleri otomatik olarak kapatılırlar. .close() çağrılarını kaldırabilirsin.

  • err gibi üyeler program doğruluğu açısından güvensiz kabul edilir çünkü bütünüyle kullanıcının (programcının) dikkatli davranmasına ve her işlemden sonra err'in değerini denetlemesini gerektirir. Hem de eziyet... :)

O eziyete modül sahibinin yazdığı try-catch bloklarını da ekleyince hata atma düzeneğinden yararlanmak yerine, onu külfetli biçimde kullanmış oluyoruz. Ben olsam err üyesini ve try-catch bloklarını kaldırırım. Nasıl olsa bu sınıfın kullanıcısı yukarılarda bir yerde try-catch bloğu kullanacak ve atılan hatayı yakalayacaktır...

Öyle düşününce, bizim dosya sistemiyle ilgili hataları böylece gizlemiş olmamız yanlış bile kabul edilebilir. Atılan hataları yakalamasak bizim kullanıcımız çok daha memnun olur çünkü o zaman kendileri yakalarlar ve durumdan haberdar olurlar.

Ali
ozanselte #4
Kullanıcı başlığı: Ozan Şelte
Üye Haz 2013 tarihinden beri · 12 mesaj · Konum: Bodrum
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yorumlarınız için çok teşekkürler. Pini aktive etme kısmında try catch kullanmamın sebebi sbclerde pinlerin bazen zaten aktif halde geliyor oluşu. Yani aktif bir pini zaten aktivite etmeye çalışınca da sistem hata veriyor. O yüzden program aksıyor. Ya da pin deaktive edilmeden program kapanırsa tekrar başladığında zaten aktif olduğu için sistem yine hata atıyor. Aklıma bir tek catch ile hatayı yoksaymak geldi.
Mengü hocanın dediklerini de en kısa sürede düzelteceğim.
zafer #5
Üye Tem 2009 tarihinden beri · 710 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu yazıyı okumadan biraz önce Erdem'e Raspberry Pi'nin bacaklarına nasıl ulaşabilirim diye sormuştum, Biraz aşağıya inince senin measjını gördüm. Sanırım bu şans olsa gerek :) Bende böyle bir kütüphane arıyordum, umarım kısa sürede kullanılacak hele gelir.

Ali ve Mengü'ye bende katılıyorum özellikle Mengü'nün kodları kısaltan ve yönetimi kolaylaştıran yaklaşımı ile Ali'nin gerçek hatanın sınıf kullanıcısından gizlenmemesi konusu önemli,
https://github.com/zafer06 - depo
Bu mesaj zafer tarafından değiştirildi; zaman: 2016-02-02, 02:30.
ozanselte #6
Kullanıcı başlığı: Ozan Şelte
Üye Haz 2013 tarihinden beri · 12 mesaj · Konum: Bodrum
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sınıfı düzenledim. Eve dönüş yolunda try-catch kullanmadan nasıl çözeceğim aklıma geldi. Sorunsuz çalışıyor. Tekrardan teşekkürler. PWM eklemeyi düşündüm fakat bunun için her işlemciye özel ayar yapmak gerekiyordu. Şimdilik bıraktım.
zafer #7
Üye Tem 2009 tarihinden beri · 710 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Merhaba Ozan,

dgpio.d dosyasını alıp projeme ekledim. Raspbery PI2 (ARMv7 Processor rev 5 (v7l)) üzerinde gdc derleyicisi ile derlemeye çalıştığımda aşağıdaki hataları alıyorum.
pi@raspberrypi ~/projects/led $ gdc main.d dgpio.d -w
dgpio.d:9: no identifier for declarator immutable
dgpio.d:9: semicolon expected to close declaration, not 'ubyte'
dgpio.d:10: enum declaration is invalid
dgpio.d:10: no identifier for declarator exportFile
dgpio.d:11: enum declaration is invalid
dgpio.d:11: no identifier for declarator unexportFile
dgpio.d:12: semicolon expected to close declaration, not 'pinFolder'
dgpio.d:12: no identifier for declarator pinFolder
dgpio.d:13: semicolon expected to close declaration, not 'directionFile'
dgpio.d:13: no identifier for declarator directionFile
dgpio.d:14: semicolon expected to close declaration, not 'valueFile'
dgpio.d:14: no identifier for declarator valueFile
dgpio.d:29: found '!' when expecting ',' following argument
dgpio.d:35: found '!' when expecting ',' following argument
dgpio.d:96: found '!' when expecting ';' following statement
dgpio.d:9: no identifier for declarator immutable
dgpio.d:9: semicolon expected to close declaration, not 'ubyte'
dgpio.d:10: enum declaration is invalid
dgpio.d:10: no identifier for declarator exportFile
dgpio.d:11: enum declaration is invalid
dgpio.d:11: no identifier for declarator unexportFile
dgpio.d:12: semicolon expected to close declaration, not 'pinFolder'
dgpio.d:12: no identifier for declarator pinFolder
dgpio.d:13: semicolon expected to close declaration, not 'directionFile'
dgpio.d:13: no identifier for declarator directionFile
dgpio.d:14: semicolon expected to close declaration, not 'valueFile'
dgpio.d:14: no identifier for declarator valueFile
dgpio.d:29: found '!' when expecting ',' following argument
dgpio.d:35: found '!' when expecting ',' following argument
dgpio.d:96: found '!' when expecting ';' following statement
pi@raspberrypi ~/projects/led $
https://github.com/zafer06 - depo
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Zafer, o gdc çok eski olmasın? Örneğin, immutable'ı tanımıyorsa belki de D1 derleyicisidir. (?)

Ali
ozanselte #9
Kullanıcı başlığı: Ozan Şelte
Üye Haz 2013 tarihinden beri · 12 mesaj · Konum: Bodrum
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Zafer hocam az önce Raspberry Pi 1 B ve kendi kişisel amd64 bilgisayarımde derleyip denedim bir sorun göremedim. GDC eski olabilir sanırım.
zafer #10
Üye Tem 2009 tarihinden beri · 710 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #8
acehreli:
Zafer, o gdc çok eski olmasın? Örneğin, immutable'ı tanımıyorsa belki de D1 derleyicisidir. (?)

Ali, sen haklısın, Ozan sende kusura bakma. Sistemde hem D1 hemde D2 için olan sürüm varmış, bende pratik olsun diye bir sembolik link (ln) oluşturmuştum. Bu linke hedef olarak D1 derleyicisini göstermişim. Hepsini kaldırdım ve gdc-4.8 sürümünü yükledim bir sorun yok :)

Raspbery PI konusunda çok bilgim yok. Örnek kodlarda Python için yazılan GPIO kütüphanesinide görüyorum. Bizim kütüphanede sanki  şöyle bir karışıklık var gibi;

GPIO nesnesini kurarken ona bir pin vermek zorundayız. Daha sonrasında ise bu nesne ile işlem yaparken hep bu pin üzerinde çalışıyoruz. GPIO nesnesi farklı pinlerle çalışacak şekilde düzenlense daha iyi olmaz mı?
https://github.com/zafer06 - depo
ozanselte #11
Kullanıcı başlığı: Ozan Şelte
Üye Haz 2013 tarihinden beri · 12 mesaj · Konum: Bodrum
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben kullanırken her pin için bir nesne oluşturmayı tercih etmiştim kolaylık açısından. Örneğin bağladığım her lede ve butona ayrı nesne oluşturduğumda kod(bence) çok okunaklı oluyor. Böyle yapmasaydım nesne olmadan direk Wiring/Arduino stili yapacaktım ama bu daha kolay geldi.
zafer #12
Üye Tem 2009 tarihinden beri · 710 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Merhaba,

Basit bir led yakma uygulaması yapmak istiyorum. Python ile denedim gayet güzel çalışıyor. D ile yapmak istediğimde kodum hatasız derleniyor ancak çalıştırmak istediğimde aşağıdaki hatayı alıyorum.

import std.stdio;
import dgpio;
 
void main()
{
     writefln("Raspberry PI Led Yakmak");
 
     GPIO pin18 = new GPIO(18);
     pin18.setOutput();
     pin18.setLow();
     pin18.setHigh();
     pin18.deactivate();
}

pi@raspberrypi ~/projects/led $ ./a.out
Raspberry PI Led Yakmak
std.exception.ErrnoException@../../../../src/libphobos/src/std/stdio.d(368): Cannot open file `/sys/class/gpio/18/direction' in mode `w' (No such file or directory)
0x2a197 _d_throw
    ../../../../src/libphobos/libdruntime/gcc/deh.d:144
0x8e02b shared(core.stdc.stdio._IO_FILE)* std.exception.__T12errnoEnforceTPOS4core4stdc5stdio8_IO_FILEVAyaa41_2e2e2f2e2e2f2e2e2f2e2e2f7372632f6c696270686f626f732f7372632f7374642f737464696f2e64Vk368Z.errnoEnforce(shared(core.stdc.stdio._IO_FILE)*, lazy immutable(char)[])
    /usr/src/packages/BUILD/gcc-4.8-4.8.2/src/libphobos/src/std/exception.d:503
0x89237 ref std.stdio.File std.stdio.File.__ctor(immutable(char)[], const(char[]))
    ../../../../src/libphobos/src/std/stdio.d:368
0x10b23 void dgpio.GPIO.writeLine(immutable(char)[], immutable(char)[])
    ???:0
0x10f3f void dgpio.GPIO.setOutput()
    ???:0
0xe21f _Dmain
    ???:0
0x1a503 void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll().void __lambda1()
    ../../../../src/libphobos/libdruntime/rt/dmain2.d:412
0x1aad7 void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())
    ../../../../src/libphobos/libdruntime/rt/dmain2.d:387
0x1acff void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll()
    ../../../../src/libphobos/libdruntime/rt/dmain2.d:412
0x1aad7 void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())
    ../../../../src/libphobos/libdruntime/rt/dmain2.d:387
0x1ac1b _d_run_main
    ../../../../src/libphobos/libdruntime/rt/dmain2.d:420
0xe1ab main
    ???:0
0x76dbc81b ???
    ???:0
Segmentation fault
pi@raspberrypi ~/projects/led $

https://github.com/zafer06 - depo
Bu mesaj zafer tarafından değiştirildi; zaman: 2016-02-08, 05:50.
ozanselte #13
Kullanıcı başlığı: Ozan Şelte
Üye Haz 2013 tarihinden beri · 12 mesaj · Konum: Bodrum
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
"/sys/class/gpio/gpio" olması gereken yeri "/sys/class/gpio" yazmışım. Az önce güncelledim. Çok sağolun.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Projeler Genel RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-12-16, 06:43:36 (UTC -08:00)