Delphi-PRAXiS
Seite 2 von 6     12 34     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 10. Mär 2007 16:46

Re: HID Komponente - Komme nicht zurecht
 
Ach ja. Ideenklau is nich. http://www.claw.com.au da habe ich die Software fuer gemacht und es gibt noch andere Produkte mit aehnlichen Ideen.

Der Drehgeber gibt Deltas von sich wie eine Maus, also -1 fuer einen Bewegungsschritt linksrum und 1 fuer rechtsrum. Der Deskriptor sagt aber es sollten Absolutwerte sein, also die Drehposition. Ich schau mir mal am Dienstag die Deskriptoren von unseren SpinWarriors an ob ich da recht habe.

Michael94 10. Mär 2007 16:55

Re: HID Komponente - Komme nicht zurecht
 
Du bist ja der Experte, aber für mich Laien sollte es doch egal sein, solange ich den richtigen Wert abfrage oder ist das eine Gefahrenquelle für Bugs?

Robert Marquardt 10. Mär 2007 18:22

Re: HID Komponente - Komme nicht zurecht
 
Nein, es ist kein Problem. Es versaut nur die korrekte maschinelle Interpretation des Reports. Es ist eben eine falsche Bedeutung angegeben.

Robert Marquardt 11. Mär 2007 13:09

Re: HID Komponente - Komme nicht zurecht
 
Hier ist das Testprogramm. Es ist noch nicht ausprobiert.
Michael94, mach mal ein Programm auf das du zwei Label und einen JvHidDeviceController legst. Danach ersetze die gane Unit1 mit dieser Source.
Danach ausprobieren. Beim Einstecken sollte die LED angehen und beim Programmende sollte die LED ausgemacht werden.
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-Verison einfach loeschen.
  Dialogs, JvComponentBase, JvHidControllerClass, StdCtrls;

type
  TForm1 = class(TForm)
    JvHidDeviceController1: TJvHidDeviceController;
    Label1: TLabel;
    Label2: TLabel;
    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 := '?';
  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;
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]);
end;

end.

Michael94 11. Mär 2007 17:50

Re: HID Komponente - Komme nicht zurecht
 
Passiert garnichts. Kein Fehler, keine Reaktion.

JvComponentBase habe ich Commentgemäs aus der Uses entfernt.
Da ich die auch garnicht habe.

Robert Marquardt 11. Mär 2007 18:00

Re: HID Komponente - Komme nicht zurecht
 
Dann setz mal ein paar Breakpoints im Debugger. Einen nach CheckoutByID, damit du weisst ob das Device gefunden wird und einen an den Anfang von JvHidDeviceController1DeviceData, damit du weisst ob Daten kommen.

Michael94 16. Mär 2007 20:04

Re: HID Komponente - Komme nicht zurecht
 
Sorry, dass ich erst jetzt antworte:

Beide Breakpoints werden gelblich gün und haben einen Count von 0

Robert Marquardt 17. Mär 2007 04:41

Re: HID Komponente - Komme nicht zurecht
 
Das heisst das die Methoden vom Compiler herausoptimiert wurden. Du hast vermutlich vergessen sie der Komponente zuzuweisen.
Bei JvHidDeviceController1 auf dem Event-Tab in der IDE die Events OnDeviceChange und OnDeviceData zuweisen. Die Auswahl sollte nur je eine Methode zulassen.

Michael94 17. Mär 2007 15:03

Re: HID Komponente - Komme nicht zurecht
 
Wir kommen der sache schon näher!

- Er ändert Label beim anstecken nicht, aber beim drehen hat Label1 immer "Button up" und Label2 immer verschiedene Zahlen.

-Drücken und loslassen bewirkt nichts.

- Nach ein paar mal drehen ändert sich Label2 nicht mehr. egal ob links oder rechts rum.

- Mit der LED passiert garnichts.

Nachtrag:
Wenn die Zahlen nach ein paar mal drehen sich nicht mehr ändern, kann ich das Powermate abziehen (?, ?) und wieder anschließen, dann kann man wieder ein paar mal drehen bevor es wieder hängenbleibt.

Robert Marquardt 17. Mär 2007 15:17

Re: HID Komponente - Komme nicht zurecht
 
Das sich die Label beim Anstecken nicht aendern ist klar. Beim Anstecken kommen keine Daten und im JvHidDeviceController1DeviceChange wird nur beim Abstecken etwas an den Labels geaendert.
Ich aender mal gleich die Source das sie den rohen Report anzeigt wie SimpleHidWrite. Schmeiss schon mal eine ListBox auf deine Form.
Das die Daten haengenbleiben ist ungewoehnlich. Verhaelt sich der PowerMate genauso wenn man ihn mit SimpleHidWrite ausliest? Es sollte kein Unterschied sein. Die Aktivierung der LED ist nach deinen Angaben programmiert. Es sollte eigentlich funktionieren. Pruef mal im Debugger nach was im Report beim WriteFile steht. Wenn dort das $FF nicht im ersten Datenbyte steht, dann ist doch ein Fehler beim Setzen der Usage und es wird dann $00 also LED aus geschrieben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:05 Uhr.
Seite 2 von 6     12 34     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