Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi HID Komponente - Komme nicht zurecht (https://www.delphipraxis.net/88108-hid-komponente-komme-nicht-zurecht.html)

Robert Marquardt 17. Mär 2007 15:33

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.

THE MATRIX 19. Mär 2007 22:13

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

THE MATRIX 23. Mär 2007 09:29

Re: HID Komponente - Komme nicht zurecht
 
So mein powermate ist entlich da *freu*
habs dann auch gleich angeschlossen und mit readwrite getestet...
Zitat:

Delphi-Quellcode:
Links:             00 FF 00 4F 00 0A
Rechts:            00 01 00 4F 00 0A
Drücken:           01 00 00 4F 00 0A
Loslassen:         00 00 00 4F 00 0A
Gedrückt Links:    01 FF 00 4F 00 0A
Gedrückt Rechts:   01 01 00 4F 00 0A

bei meinem hab ich für links und rechts noch mehr werte als nur FF oder 01 ...
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 :)

Robert Marquardt 23. Mär 2007 09:53

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:
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
IsAbsolute muesste False sein, denn es werden ja Relativwerte geschickt. Absolutwerte wuerden bedeuten das man den Drehwinkel bekommt nicht die Winkelaenderung.

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.

Michael94 6. Apr 2007 15:47

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*)

Michael94 6. Apr 2007 16:28

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:
Input Test
Input Test mit Menü nach 1 Sekunde gedrückt halten und loslassen

@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;

Robert Marquardt 6. Apr 2007 17:48

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 http://www.delphipraxis.net/internal...t.php?t=107063 durch :-)
Da geht es noch ganz anders zur Sache. Mehrere hier wollen sich jetzt so ein Ding zulegen.

Michael94 6. Apr 2007 17:53

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.

Robert Marquardt 6. Apr 2007 17:59

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.

Michael94 6. Apr 2007 18:02

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
Logitech NuLooQ


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:22 Uhr.
Seite 3 von 6     123 45     Letzte »    

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