JEDI HidCtl de HidCtlDeviceData eventi hakkinda

Başlatan z, 06 Haziran 2012, 02:13:11

t2

#30
parça parça gittiği de oluyor. mesela  125  bayt gidecek olsun. bu aslında 3 tane 64 lük paket ile gidiyor paketlerin sonu boş olabilir. bu durumda en az 3 tane interval gerekli olur. ( belki de yanlış hatyırlıyor olaibliirm.  ama denemiştim  sanki gidiyordu)

ErsinErce

http://www.cygnal.org/ubb/Forum9/HTML/001942.html bu adreste
64 byte ve daha küçük veriler için report id eklenmesine gerek yok pc otomatik id'ye 0 olarak ekleme yapıyor
ama veri gelirken 65 byte olarak geliyor mu diyor bu yazıda yoksa ben mi yanlış anlıyorum?

z

#32
Report ID vermeye ihtiyac duymamin sebebi debug etme arzusundan kaynaklandi. Ilk zamanlar report ID zaten sifirdi. Sonradan acaba hatalarin sebebi id=0 olusumu diye merak edip id=1 e gectim. Bu durumda tekrardan sifir yapayim.

Jedinin set report ile ilgili rutini asagida

    Buf[0] := StrToIntDef('$' + ReportID.Text, 0);
    ReportID.Text := Format('%.2x', [Buf[0]]);
    for I := 1 to CurrentDevice.Caps.OutputReportByteLength - 1 do
    begin
      Buf[I] := StrToIntDef('$' + Edits[I-1].Text, 0);
      Edits[I-1].Text := Format('%.2x', [Buf[I]]);
    end;
    if not CurrentDevice.SetOutputReport(Buf[0], CurrentDevice.Caps.OutputReportByteLength) then
    begin
      Err := GetLastError;
      AddToHistory(Format('SET REPORT ERROR: %s (%x)', [SysErrorMessage(Err), Err]));
    end
    else......;


Device da hid reportta DCB    0x95, 0x3F          ;//   REPORT_COUNT (8  8 Bits, 8 Bytes) yaparsam 

PC tarafindaki yazilimda CurrentDevice.Caps.OutputReportByteLength =64 olarak set oluyor. (Bu degeri usb uzerinden hid desriptoru okuyarak elde ediyor)

DCB    0x95, 0x40          ;//   REPORT_COUNT (8  8 Bits, 8 Bytes) yaparsam  bu kez

CurrentDevice.Caps.OutputReportByteLength =65 oluyor.

-------------


Report count 63 yaptigimizda

    for I := 1 to CurrentDevice.Caps.OutputReportByteLength - 1 do
    begin
      Buf[I] := StrToIntDef('$' + Edits[I-1].Text, 0);

satirlari 1 ve 63 dahil benim verilerimi yukleyecegine gore;

if not CurrentDevice.SetOutputReport(Buf[0], CurrentDevice.Caps.OutputReportByteLength) then

satiri da ID de dahil olmak uzere 64 byte yollmaya calisiyor ve sonuc da basarili da oluyor.

Report count=64 yaptigimda

if not CurrentDevice.SetOutputReport(Buf[0], CurrentDevice.Caps.OutputReportByteLength) then

Gonderemeyip hata veriyor. Tabiki bunun sebebi device tarafindaki yazilim olabilir. Onu debug etmek gerekecek.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Evet sorun device yazilimimda imis.

report length 0x40 olunca set report desriptorun setup paketinde wlength=0x41 olarak geliyormus zaten.

Fakat ben programda wlength degerini hic dikkate almamistim. ilk 64 bytei aliyorum ve isim bitti diyorum. Halbuki daha bufferda bir 64 byte daha var. Onuda okuyup 65e tamamlamaliyim.

Kod standart olsunmu olmasin mi ona karar veririm artik. Veri paketinin iki asamali gitmesinden se veri boyunu max 64 olacak sekilde report length=3f yapmak simdilik daha iyi olacak.

Karsilikli olarak ID nin 0 yada 1 seciminin onemi yok gorunuyor. Her durumda bufferin ilk gozunu ID degeri kapliyor ve veri uzunlugunun 1 byte dusmesine neden oluyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

tamam hocam bizim programla deneyelim.  programda sorun çıkarsa bana da bildir. KOdu aldığım yere bildireyim. 3-4 senedir kullanıyorum. son olarak 1 senelik güncelleme ücreti ödedim. uzun zamandır güncelleme yapmadılar. gerçi neyi güncelleyecek sorun var mıdır? ben tespit etmedim. 

z

Senin programa baktim da JEDI kullaniyorsun diyesim geliyor.

Senin yazdigin kodu arada bir deniyorum fakat sorun device yazilimimda hala bir takim eksikliklerin olmasi.

Ben JEDI yi cok tuttum. Sen neden begenmedin?

Hala Event olusturamamis olsam da bunun sebebinin device tarafinda kaynaklandigini (benden) saniyorum. JEDI nin sorunu olmamasi lazim. Bu bilgiyi bir teyid edebilsem cok iyi olacak.

Aslinda ben de sana JEDI ile yazdigim kodu yollayayim sen kendi donaniminda dene. Fakat programi yollamam icin VID PID degerlerini gomulu durumdan cikartip parametrik hale getirmem gerekecek. Onumuzdeki gunlerde ilk firsatta denemen icin yollayacagim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

şimdi tek seferde 64 byte değilde 63 byte mı gönderebiliyoruz?  :o

z

PC den Device'a oyle gorunuyor. Bu durumda 63 byte 1ms de giderken 64 byte 2ms de gidecek.

Device tarafindan PC'ye 63 Byte mi yoksa 64 Byte mi yollayabiliyoruz incelemek lazim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

tek seferde 64 bayt kırallar gibi gitmektedir. hatta report IDyi de sayarsak 65 bayt

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

usbtrace'i yüklediniz mi hocam ordan bir kontrol etseniz?

z

Simdi indiriyorum. Fakat daha once device tarafinda debug ettim zaten. FIFO 64 byte oldugu icin 65 byte'in 64 byte'i geldi. bunun devami da ikinci kerede gelecek. Aksi takdirde HID 64 byte denmezdi.

Deneyip sonucu yazayim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

#42
Usblyser ile baktim. Kac msde gelmis yazuyor önceki paket, sonraki paket zamanları belli

z

JEDI nin ornek programini kirpip amacima gore uyarlamis ve ne zaman ugrasacak olsan bu program uzerinde calisiyordum.
JEDI HID de OnData eventini calistiramayinca bugun JEDInin orjinal programini yeni bastan ele aldim ve ondata eventi uzerinde buyuk bir oyun oynandigini, Object Inspecter penceresindeki event listesinden HidCtlDeviceData tiklanarak buna ait procedure olusturulsa bile bu procedureun asla calismayacagini cok gec farkettim. Ne kadar gec derseniz 1 yada 2 sene.

Bu event uzerinde oynanan oyun su sekilde.

Programi yazan kisi, ondata olayinda calismasi icin ap ayri bir procedure yazmis. Bu fonksiyonun adresini de programin calisma esnasinda sectigimiz usb cihazin parametrelerindeki ondata event adresine atamis.

Dolayisi ile program calistirildiktan sonra bu eventin harekete gecirecegi procedure, program yaziminda tanimlanan procedure'den farkli.

Dolayisi ile bosu bosuna asla calismayacak bir procedure icine kod yazip breakpoint koyarak programin interrupt transferinde buraya takilmasini bekliyordum.

Nihayet, usb cihazim PC ile hem control hem de interrupt modunda data alip verebiliyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

#44
ne mutlu sana.
Belki ben de bu yüzden çalıştıramamış olabilirm. şu an hatırlamadığım sorunlar nedeniyle bırakmıştım. helalolsun. azimle  çözdün olayı.

HidCtlDeviceData  her halde control transfer durumunda tetiklenecek olsa gerek içindeki Ctl bu anlama geliyor olabilir.

demekki Ondata ise  interrupt transfer içinmiş. belgesinde de yazmıyor olabilir.