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 2 von 6     12 34     Letzte » 
Robert Marquardt
(Gast)

n/a Beiträge
 
#11

Re: HID Komponente - Komme nicht zurecht

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

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

Re: HID Komponente - Komme nicht zurecht

  Alt 10. Mär 2007, 17:55
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?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#13

Re: HID Komponente - Komme nicht zurecht

  Alt 10. Mär 2007, 19:22
Nein, es ist kein Problem. Es versaut nur die korrekte maschinelle Interpretation des Reports. Es ist eben eine falsche Bedeutung angegeben.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#14

Re: HID Komponente - Komme nicht zurecht

  Alt 11. Mär 2007, 14:09
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.
  Mit Zitat antworten Zitat
Michael94

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

Re: HID Komponente - Komme nicht zurecht

  Alt 11. Mär 2007, 18:50
Passiert garnichts. Kein Fehler, keine Reaktion.

JvComponentBase habe ich Commentgemäs aus der Uses entfernt.
Da ich die auch garnicht habe.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#16

Re: HID Komponente - Komme nicht zurecht

  Alt 11. Mär 2007, 19:00
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.
  Mit Zitat antworten Zitat
Michael94

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

Re: HID Komponente - Komme nicht zurecht

  Alt 16. Mär 2007, 21:04
Sorry, dass ich erst jetzt antworte:

Beide Breakpoints werden gelblich gün und haben einen Count von 0
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#18

Re: HID Komponente - Komme nicht zurecht

  Alt 17. Mär 2007, 05:41
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.
  Mit Zitat antworten Zitat
Michael94

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

Re: HID Komponente - Komme nicht zurecht

  Alt 17. Mär 2007, 16:03
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.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#20

Re: HID Komponente - Komme nicht zurecht

  Alt 17. Mär 2007, 16:17
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.
  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 05:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf