AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi HID Komponente - Komme nicht zurecht

HID Komponente - Komme nicht zurecht

Offene Frage von "wschrabi"
Ein Thema von Michael94 · begonnen am 10. Mär 2007 · letzter Beitrag vom 23. Mär 2016
Antwort Antwort
Seite 3 von 6     123 45     Letzte » 
Robert Marquardt
(Gast)

n/a Beiträge
 
#21

Re: HID Komponente - Komme nicht zurecht

  Alt 17. Mär 2007, 16:33
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.
  Mit Zitat antworten Zitat
THE MATRIX

Registriert seit: 26. Jul 2003
62 Beiträge
 
#22

Re: HID Komponente - Komme nicht zurecht

  Alt 19. Mär 2007, 23:13
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
§¤*~`~*¤§¤*~`~*¤§[* ((( THE MATRIX - Reloaded ))) ]§¤*~`~*¤§¤*~`~*¤§
  Mit Zitat antworten Zitat
THE MATRIX

Registriert seit: 26. Jul 2003
62 Beiträge
 
#23

Re: HID Komponente - Komme nicht zurecht

  Alt 23. Mär 2007, 10:29
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
§¤*~`~*¤§¤*~`~*¤§[* ((( THE MATRIX - Reloaded ))) ]§¤*~`~*¤§¤*~`~*¤§
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#24

Re: HID Komponente - Komme nicht zurecht

  Alt 23. Mär 2007, 10:53
$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.
  Mit Zitat antworten Zitat
Michael94

Registriert seit: 10. Mär 2007
Ort: Aalen
18 Beiträge
 
#25

Re: HID Komponente - Komme nicht zurecht

  Alt 6. Apr 2007, 16:47
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*)
  Mit Zitat antworten Zitat
Michael94

Registriert seit: 10. Mär 2007
Ort: Aalen
18 Beiträge
 
#26

Re: HID Komponente - Komme nicht zurecht

  Alt 6. Apr 2007, 17:28
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 PowerMateThen Label3.Caption := 'Powermate nicht gefunden';
end;

procedure TForm1.JvHidDeviceController1Arrival(HidDev: TJvHidDevice);
begin
if DeviceName(HidDev) = 'Griffin PowerMateThen Label3.Caption := 'Powermate gefunden';
end;
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#27

Re: HID Komponente - Komme nicht zurecht

  Alt 6. Apr 2007, 18:48
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.
  Mit Zitat antworten Zitat
Michael94

Registriert seit: 10. Mär 2007
Ort: Aalen
18 Beiträge
 
#28

Re: HID Komponente - Komme nicht zurecht

  Alt 6. Apr 2007, 18:53
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.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#29

Re: HID Komponente - Komme nicht zurecht

  Alt 6. Apr 2007, 18:59
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.
  Mit Zitat antworten Zitat
Michael94

Registriert seit: 10. Mär 2007
Ort: Aalen
18 Beiträge
 
#30

Re: HID Komponente - Komme nicht zurecht

  Alt 6. Apr 2007, 19:02
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:29 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