![]() |
Starthilfe zu JvHidController-Komponente
Hallo,
ich bin über ![]() auf die tolle HID-Delphikomponente gestoßen, und wollte die einsetzen, um mit einem AVR_USB Device nach ![]() Die Postings in Delphipraxis habe ich studiert und mein Programm findet mein Device auch inzwischen. Aber das Device funktioniert irgendwie anders als eine Maus oder ein Drehknopf: Hier ist die komplette Usage-Info: ------------------------------------------------------------------------- Input Report Size=0 Output Report Size=0 Feature Report Size=128 Value Feature ============= 0) UsagePage: FF00 ($FF00) ReportID: 0 IsAlias: False BitField: 258 LinkCollection: 0 LinkUsage: 1 ($0001) LinkUsagePage: FF00 ($FF00) IsRange: False IsStringRange: False IsDesignatorRange: False IsAbsolute: True HasNull: False BitSize: 8 ReportCount: 128 UnitsExp: 0 Units: 0 LogicalMin: 0 LogicalMax: 255 PhysicalMin: 0 PhysicalMax: 0 Usage: 0 ($0000) StringIndex: 0 DesignatorIndex: 0 DataIndex: 0 ------------------------------------------------------------------------- Das ReadWrite Demo zur JvHidController-Komponente liefert einen "abstract error". Nun verstehe ich zu wenig von HID um an dieser Stelle weiter zu kommen. ObDev schreibt zum HID_DATA Device Demo: "This example demonstrates how the HID class can be misused to transfer fixed size blocks of data (up to the driver's transfer size limit) over HID feature reports." Als alter Pascaler habe ich zwar immerhin das Gnu-C Demo zum Compilieren und Laufen gebracht, aber wirklich verstehen tue ich es nicht. Ich möchte gerne das Gerät aus Delphi heraus bedienen, d.h. Daten senden und empfangen. Das Demo ist einfach. Die gesendeten Daten werden einfach ins EEPROM des AVR-Devices geschrieben. Beim Lesen werden sie wieder ausgelesen. Aber das ganze ist ausbaufähig... Könntet Ihr mir bitte auf die Sprünge helfen, dass ich mit Delphi weiter komme? Übrigens, wie groß ist denn "des Treibers transfer size limit"? Danke noch ein gutes neues Jahr, Thomas |
Re: Starthilfe zu JvHidController-Komponente
Hey,
ich habe genau das gleiche vor wie du und stehe vor den gleichen Problemen... Ich hab es z.B. mit GetInputReport probiert, aber es kommt nichts an im Programm. Leider hab ich aber auch wegen diesen ddk-includes das Konsolen-Programm noch nicht kompilieren können, deshalb weiß ich nicht, ob der Mikrocontroller überhaupt macht was er soll... aber zumindest meldet er sich richtig an. Bist du schon weiter gekommen? |
Re: Starthilfe zu JvHidController-Komponente
hallo,
ich mach das ganze auch gerade. allerdings mit erfolg :-). also als tip kann ich der geben, daß du Get bzw. SetFeatureReport nehmen mußt, wenn die mittels FeatureReport kommunizieren willst. was du laut deinem Reportdescriptor ja vor hast. meine sourcen sind sehr unaufgeräumt als bringts nix wenn ich sie hier poste. Mein ReportDeskriptor:
Code:
Meine USBSetupFunction:
PROGMEM char usbHidReportDescriptor[33] = {
0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) 0x85, 0x01, // REPORT_ID (1) 0x95, 0x02, // REPORT_COUNT (2) 0x09, 0x00, // USAGE (Undefined) 0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf) 0x85, 0x02, // REPORT_ID (2) 0x95, 0x01, // REPORT_COUNT (1) 0x09, 0x00, // USAGE (Undefined) 0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf) 0xc0 // END_COLLECTION }; (Achtung ich habe REport mit weniger als 9 Byte, also kann man es in der Setuptfunktion machen. wenns mehr sind, so wie bei dir mußte du aus der Setupfunktion es an die USBFunctionRead weiterleiten - das ist aber beim OBDEV Sample gut beschrieben)
Code:
Und so wird aus delphi aufs device geschrieben:
uchar usbFunctionSetup(uchar data[8])
{ static uchar replyBuf[3]; usbRequest_t *rq = (void *)data; usbMsgPtr = replyBuf; DBG1(0x49, &rq->bmRequestType, 1); /* debug output: print our request */ if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* class request type */ DBG1(0x50, &rq->bRequest, 1); /* debug output: print our request */ if(rq->bRequest == USBRQ_HID_GET_REPORT){ /* wValue: ReportType (highbyte), ReportID (lowbyte) */ if(rq->wValue.bytes[0] == 1){ /* ReportID 1 */ replyBuf[0] = rq->wValue.bytes[0]; replyBuf[1] = LOWBYTE(ledWord); replyBuf[2] = HIGHBYTE(ledWord); return 3; }else if(rq->wValue.bytes[0] == 2){ /* ReportID 2 */ replyBuf[0] = rq->wValue.bytes[0]; replyBuf[1] = PINC; return 2; } }else if(rq->bRequest == USBRQ_HID_SET_REPORT){ if(rq->wValue.bytes[0] == 1){ /* ReportID "SET ADDRESS" */ usbWriteLen = 0xff; /* indicates "address" */ return 0xff; /* use usbFunctionWrite() */ }else if(rq->wValue.bytes[0] == 2){ /* ReportID "SET 128 bytes block" */ usbWriteLen = 129; return 0xff; /* use usbFunctionWrite() */ } } }else{ if(data[1] == 0){ /* ECHO, for testing */ replyBuf[0] = data[2]; replyBuf[1] = data[3]; return 2; } } return 0; } /* Writing to the EEPROM may take 7 * 8.5ms = 59.9ms which is slightly more * than the allowable <50ms. We usually get away with that. */ uchar usbFunctionWrite(uchar *data, uchar len) { if(usbWriteLen == 0) return 1; if(usbWriteLen == 0xff){ /* expecting address */ usbWriteLen = 0; if(len < 3) return 0xff; /* stall */ LOWBYTE(ledWord) = data[1]; HIGHBYTE(ledWord) = data[2]; return 1; } if(usbWriteLen == 129){ /* first byte is report ID */ data++; len--; usbWriteLen--; } if(len > usbWriteLen) len = usbWriteLen; eeprom_write_block(data, (uchar *)0 + usbAddress, len); if(usbAddress < 2){ codeEepromSize = eeprom_read_word(0); /* refresh RAM copy of code size */ if(codeEepromSize > sizeof(code.data)) codeEepromSize = 0; } usbAddress += len; usbWriteLen -= len; return usbWriteLen == 0; }
Delphi-Quellcode:
Und so gelesen
TLCD = packed record
ID: byte; text: array[0..2] of char; end; procedure TMainForm.Button4Click(Sender: TObject); var rep:TLCD; i:integer; begin rep.id:=1; rep.text[0] := char(32); rep.text[1] := char(0); CurrentDevice.SetFeature(rep,sizeOf(rep)); end;
Delphi-Quellcode:
Nicht schön, aber ich hoffe es hilft.procedure TMainForm.Button6Click(Sender: TObject); var rep:TLCD; i:integer; begin rep.ID := 1; rep.text[0] := char(0); CurrentDevice.GetFeature(rep, SIZEOF(rep)); Button6.Caption := IntToStr(Integer(rep.text[0])); end; p.c.squirrel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz