![]() |
Re: HID Komponente - Komme nicht zurecht
Ich darf den Beitrag nicht mehr aendern. Neu posten geht schneller.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, // JvComponentBase kommt automatisch dazu wenn man die HID-Komponente // aus der JVCL benutzt. Fuer die Standalone-Version einfach loeschen. Dialogs, JvComponentBase, JvHidControllerClass, StdCtrls; type TForm1 = class(TForm) JvHidDeviceController1: TJvHidDeviceController; Label1: TLabel; Label2: TLabel; ListBox1: TListBox; procedure JvHidDeviceController1DeviceChange(Sender: TObject); procedure JvHidDeviceController1DeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word); procedure FormDestroy(Sender: TObject); public Device: TJvHidDevice; end; var Form1: TForm1; implementation uses HID, HidUsage; {$R *.dfm} const GriffinVID = $077D; PowerMatePID = $0410; type // kein HID-Report kann groesser als 64 Byte sein THidReport = packed record ReportID: Byte; Data: array [0..62] of Byte; end; // Standard-Implementierung zur Handhabung genau eines HID-Geraets. // Es wird das erste gefundene passende Geraet genommen. procedure TForm1.JvHidDeviceController1DeviceChange(Sender: TObject); var Report: THidReport; Written: DWORD; begin // erst mal sehen ob das Geraet ausgesteckt wurde if Assigned(Device) and not Device.IsPluggedIn then begin // das Objekt wird an den Controller zurueckgegeben // Device wird dabei auf nil gesetzt JvHidDeviceController1.CheckIn(Device); // hier gehoeren Finalisierungen der Oberflaeche hin Label1.Caption := '?'; Label2.Caption := '?'; ListBox1.Clear; end; // schauen ob wir nach einem Geraet suchen muessen if not Assigned(Device) then // schauen ob ein Griffin PowerMate vorhanden ist if JvHidDeviceController1.CheckOutByID(Device, GriffinVID, PowerMatePID) then begin // es wurde ein Geraet gefunden // hier gehoeren Initialisierungen des Geraets und der Oberflaeche hin // wir machen die LED an FillChar(Report, SizeOf(Report), 0); // das ist ziemlich aufwaendig dafuer das wir nur eine Usage im Report setzen wollen Report.ReportID := 0; // wir wollen in einen Output-Report schreiben Device.ReportTypeParam := HidP_Output; // das benennt die spezifische Usage die gesetzt werden soll Device.UsagePageParam := HID_USAGE_PAGE_CONSUMER; Device.LinkCollectionParam := $01; // CollectionType=Application Device.UsageParam := HID_USAGE_CONSUMER_CONSUMER_CONTROL; // den Wert setzen (LED Maximum) Device.SetUsageValue($FF, Report, Device.Caps.OutputReportByteLength); // ab damit ans Geraet Device.WriteFile(Report, Device.Caps.OutputReportByteLength, Written); end; end; procedure TForm1.FormDestroy(Sender: TObject); var Report: THidReport; Written: DWORD; begin // nur wenn beim Programmende das Geraet noch eingesteckt ist if Assigned(Device) then begin // da wir in der Initialisierung das Licht eh die LED angemacht haben, // machen wir jetzt brav das Licht wieder aus. FillChar(Report, SizeOf(Report), 0); Report.ReportID := 0; Device.ReportTypeParam := HidP_Output; Device.UsagePageParam := HID_USAGE_PAGE_CONSUMER; Device.LinkCollectionParam := $01; Device.UsageParam := HID_USAGE_CONSUMER_CONSUMER_CONTROL; // Wert setzen (LED aus) Device.SetUsageValue($00, Report, Device.Caps.OutputReportByteLength); Device.WriteFile(Report, Device.Caps.OutputReportByteLength, Written); end; end; // Reports vom Geraet empfangen // Der Event gilt fuer alle ausgecheckten Geraete procedure TForm1.JvHidDeviceController1DeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word); var Report: THidReport; Button: TUsage; Len: DWORD; Dial: Integer; I: Integer; S: string; begin // erst mal einen Designfehler der Komponente ausgleichen // wir brauchen den Report mit vorangestellter ReportID Report.ReportID := ReportID; Move(Data^, Report.Data[0], Size); // wir wollen den Buttonzustand extrahieren HidDev.ReportTypeParam := HidP_Input; HidDev.UsagePageParam := HID_USAGE_PAGE_BUTTON; HidDev.LinkCollectionParam := $01; // CollectionType=Application Len := 1; Button := $00; HidDev.GetButtons(@Button, Len, Report, Size + 1); // $01 ist die Usage des Buttons wie sie als "UsageMin: 1" von UsageDemo angegeben wurde. if Button = $01 then Label1.Caption := 'Button down' else Label1.Caption := 'Button up'; // wir wollen den Wert des Drehknopfes extrahieren // nur die veraenderten Parameter werden gesetzt HidDev.UsagePageParam := HID_USAGE_PAGE_GENERIC; HidDev.UsageParam := HID_USAGE_GENERIC_RX; HidDev.GetScaledUsageValue(Dial, Report, Size + 1); Label2.Caption := Format('%d', [Dial]); // Rohdaten-Ausgabe S := ''; for I := 0 to Size - 1 do S := S + Format('%.2x ', [Report.Data[I]]); ListBox1.Items.Add(S); end; end. |
Re: HID Komponente - Komme nicht zurecht
Hab mir heute auch ein Powermate bestellt... werde mich dann auch zum Thema mal melden wenn es da ist, da ich auch eigenen GUI mit verschiedenen funktionen basteln will :)
Die Griffin Software reicht mir nicht :D |
Re: HID Komponente - Komme nicht zurecht
So mein powermate ist entlich da *freu*
habs dann auch gleich angeschlossen und mit readwrite getestet... Zitat:
nämlich bis 04 und bis FD kommt dann zustande, wenn ich mein PowerMate sehr schnell drehe in eine Richtung. Werd mal gucken ob ich am WE zeit finde da dann tiefer einzutauchen :) |
Re: HID Komponente - Komme nicht zurecht
$FD = -3 das sind die Deltas der Drehbewegung die man da bekommt. Genau wie bei einer Maus.
Ich habe uebrigens meinen Chef nochmal gefragt und die Usage fuer diesen Wert ist definitiv im Deskriptor falsch deklariert.
Code:
IsAbsolute muesste False sein, denn es werden ja Relativwerte geschickt. Absolutwerte wuerden bedeuten das man den Drehwinkel bekommt nicht die Winkelaenderung.
Value Input
=========== 0) UsagePage: Generic Desktop ($0001) ReportID: 0 IsAlias: False BitField: 2 LinkCollection: 0 LinkUsage: Consumer Control ($0001) LinkUsagePage: Consumer ($000C) IsRange: False IsStringRange: False IsDesignatorRange: False IsAbsolute: True HasNull: False BitSize: 8 ReportCount: 1 UnitsExp: 0 Units: 0 LogicalMin: -127 LogicalMax: 127 PhysicalMin: 0 PhysicalMax: 0 Usage: Rotational X Axis ($0033) StringIndex: 0 DesignatorIndex: 0 DataIndex: 1 Warum das jetzt nicht mit dem Auswerten des Reports per Methode geht, kann ich nicht sagen. THE MATRIX, bitte kontakte mich mal direkt und wir legen mal ein paar Debugging Sessions ein. |
Re: HID Komponente - Komme nicht zurecht
Sorry, ich war im Krankenhaus.
War ja klar, dass gleich noch jemand kommt, der einem die Idee nachmachen möchte... Ich wusste es! Danke Robert, mit deiner letzten Source kann ich was anfangen. Label1 zeigt zwar immernoch nur "Button up" an und Label2 Hängt mit den Zahlen rum, aber die Listbox geht und mit diesen Werten kann ich arbeiten. Was noch interessant wäre: LED-Werte an das Powermate senden. Vielleicht kannst du mir da bitte noch einen ganz simplen "Wert senden" Button machen. dann kann ich mir das zurechtbasteln. Vielen Dank! Euch allen ein schönes Osterfest (dir auch Matrix *grummel*) |
Re: HID Komponente - Komme nicht zurecht
So, bin schon wieder da ;)
Wie gesagt, mit der Listbox gings dann einfach. 41 Minuten bis zum zum ersten Test. @Matrix Bitte mal testen: ![]() ![]() @Robert: Hast du evtl. eine etwas elegantere Art der "Angeschlossen?" Überprüfung? Ich hab mir das anfangs aus deinem Example zusammengeschraubt.
Delphi-Quellcode:
procedure TForm1.JvHidDeviceController1DeviceUnplug(HidDev: TJvHidDevice);
begin if DeviceName(HidDev) = 'Griffin PowerMate' Then Label3.Caption := 'Powermate nicht gefunden'; end; procedure TForm1.JvHidDeviceController1Arrival(HidDev: TJvHidDevice); begin if DeviceName(HidDev) = 'Griffin PowerMate' Then Label3.Caption := 'Powermate gefunden'; end; |
Re: HID Komponente - Komme nicht zurecht
Ich bevorzuge es das ganze im OnDeviceChange konzentriert zu halten. OnArrival und OnRemoval sind nicht wirklich wichtig. Ich bedaure inzwischen sie eingefuehrt zu haben.
Lies doch mal ![]() Da geht es noch ganz anders zur Sache. Mehrere hier wollen sich jetzt so ein Ding zulegen. |
Re: HID Komponente - Komme nicht zurecht
Naja, ich habe es halt in die Tests eingebaut, um anzuzeigen, dass das Gerät gefunden wurde.
Im eigentlichen Programm wollte ich einen "Offline"-Icon in den Systray machen. Aber wenn mein HID-Guru kein Fan von dieser Funktion ist, dann lasse ich sie weg. Was ich von dir noch bräuchte wäre ein "Werte an HID senden" damit ich die LED ändern kann. Ansonsten werde ich dann alleine zurrecht kommen. |
Re: HID Komponente - Komme nicht zurecht
Du kannst die Events ruhig benutzen. Ich bedauere nur das ich sie eingebaut habe, obwohl sie nicht noetig sind. Sie schlagen fuer jedes HID-Geraet an, daher muss man abpruefen ob es das gewuenschte ist. Letzlich mache sie alles nur komplizierter ohne wirklich zur Flexibilitset beizutragen. Ich habe eh schon einen langen Weg hinter mir was Missverstaendnisse mit der Komponente betrifft. Z. B. man darf ein TJvHidDevice nicht instantiieren, deshalb ist das jetzt unmoeglich.
|
Re: HID Komponente - Komme nicht zurecht
Für den Raketenwerfer hab ich irgendwo im Netz schon eine C++ Source gesehen.
Da hat einer auch noch seine Webcam auf das Ding gesetzt und mit reingecodet. Ist halt ne Spielerei. Beim Powermate ist es ja so, dass danach Logitech auch so ein Teil gebaut hat. (natürlich besser und stylischer) Ich bleib da lieber beim Original ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 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