AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Starthilfe zu JvHidController-Komponente
Thema durchsuchen
Ansicht
Themen-Optionen

Starthilfe zu JvHidController-Komponente

Ein Thema von iphi · begonnen am 9. Jan 2010 · letzter Beitrag vom 28. Feb 2010
Antwort Antwort
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

Starthilfe zu JvHidController-Komponente

  Alt 9. Jan 2010, 12:16
Hallo,

ich bin über

http://www.delphipraxis.net/internal...&highlight=hid


auf die tolle HID-Delphikomponente gestoßen, und wollte die einsetzen, um mit einem AVR_USB Device nach http://www.obdev.at/products/vusb/index-de.html zu kommunizieren.

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
  Mit Zitat antworten Zitat
John Locke

Registriert seit: 16. Feb 2010
1 Beiträge
 
#2

Re: Starthilfe zu JvHidController-Komponente

  Alt 17. Feb 2010, 15:51
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?
  Mit Zitat antworten Zitat
pcsquirrel

Registriert seit: 19. Okt 2006
1 Beiträge
 
#3

Re: Starthilfe zu JvHidController-Komponente

  Alt 28. Feb 2010, 17:43
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:
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
};
Meine USBSetupFunction:

(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:
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;
}
Und so wird aus delphi aufs device geschrieben:

Delphi-Quellcode:
  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;
Und so gelesen

Delphi-Quellcode:

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;
Nicht schön, aber ich hoffe es hilft.

p.c.squirrel
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz