AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WiimoteLib.dll in Delphi

Ein Thema von napsterxx · begonnen am 5. Dez 2008 · letzter Beitrag vom 11. Okt 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#1

AW: WiimoteLib.dll in Delphi

  Alt 11. Okt 2010, 13:19
So, ich muß (möchte) noch die WiiControl.pas aufräumen, bevor ich diese mal zeige.
Darin 'ne eigene kleine Klasse, welche die HID-Geräte verwaltet, ähnlich dem TJvHidDeviceController. (nur daß ich ohne die JEDI arbeite )
Etwas, welches die Grundklasse der HID-Geräte darstellt und die ersten Teile des Wii-Controlers und einiger Extender (Nunchuk und Co.),


Im Anhang 'ne Test-Anwendung mit nachfolgendem Code.
Diese macht das, was sich schon ansteuern läßt ... LEDs und der Vibrator.

Funktioniert unter WinXP + BlueSoleil, sowie nativ unter Win7 x86 (ohne BlueSoleil).

Vielleicht kann's ja schonmal wer ausprobieren, also ob der Teil auch wirklich schon richtig funktioniert.
> die LEDs sollten blinken und der Vibrator sollte an und aus gehn.
Delphi-Quellcode:
Program WiiControlP;

Uses Windows, SysUtils, Forms, Generics.Collections, WiiControl;

Procedure OnRecive(Sender: THIDDevice; Const Data; Len: Integer);
  Var S: String;
    i: Integer;

  Begin
    WriteLn('OnRecive');
    WriteLn(' Instance ', Sender.DeviceInfo.Instance);
    S := ' Data';
    For i := 0 to Len - 1 do Begin
      If i mod 20 = 0 Then Begin
        WriteLn(S);
        S := ' ';
      End Else If i mod 5 = 0 Then
        S := S + ' ';
      S := Format('%s %.2x', [S, PByte(@Data)[i]]);
    End;
    WriteLn(S);
    WriteLn;
  End;

Procedure OnError(Sender: TWiiRemoteController; ReportID, ErrorCode: Byte);
  Begin
    WriteLn('OnReceptError');
    WriteLn(' Instance ', Sender.DeviceInfo.Instance);
    WriteLn(' ReportID ', Format('$%.2x', [ReportID]));
    WriteLn(' ErrorCode ', ErrorCode);
    WriteLn;
  End;

Procedure DeviceChange(Controler: THIDControler);
  Begin
    WriteLn('DeviceChange');
    WriteLn;
  End;

Procedure DeviceArrival(Controler: THIDControler; Const DeviceInfo: THIDDeviceInfo);
  Var Device: THIDDevice;

  Begin
    WriteLn('DeviceArrival');
    WriteLn(' ClassGUID ', GUIDToString(DeviceInfo.ClassGUID));
    WriteLn(' Instance ', DeviceInfo.Instance);
    WriteLn(' Path ', DeviceInfo.Path);
    WriteLn(' Description ', DeviceInfo.Description);
    WriteLn(' PhysicalDeviceObject ', DeviceInfo.PhysicalDeviceObject);
    If Controler.CompareByID(DeviceInfo, WIIMOTE_VENDOR_ID, WIIMOTE_PRODUCT_ID) Then Begin
      Device := Controler.Arrival(DeviceInfo, TWiiRemoteController);
      Device.OnRecive := OnRecive;
      TWiiRemoteController(Device).OnReceptError := OnError;

      WriteLn(' Arrivaled');
      WriteLn(' VendorID ', Format('$%.4x', [Device.VendorID]));
      WriteLn(' ProductID ', Format('$%.4x', [Device.ProductID]));
      WriteLn(' ProductStr ', Device.ProductStr);
      WriteLn(' Version ', Device.Version);
      WriteLn(' Manufacturer ', Device.Manufacturer);
      WriteLn(' SerialNumber ', Device.SerialNumber);
      WriteLn(' Identifier ', Device.Identifier);
    End;
    WriteLn;
  End;

Procedure DeviceRemoval(Controler: THIDControler; Const DeviceInfo: THIDDeviceInfo; DeviceObject: THIDDevice);
  Begin
    WriteLn('DeviceRemoval');
    WriteLn(' ClassGUID ', GUIDToString(DeviceInfo.ClassGUID));
    WriteLn(' Instance ', DeviceInfo.Instance);
    WriteLn(' Path ', DeviceInfo.Path);
    WriteLn(' Description ', DeviceInfo.Description);
    WriteLn(' PhysicalDeviceObject ', DeviceInfo.PhysicalDeviceObject);
    If Assigned(DeviceObject) Then Begin
      WriteLn(' Arrivaled');
      WriteLn(' SerialNumber ', DeviceObject.SerialNumber);
      WriteLn(' Identifier ', DeviceObject.Identifier);
      DeviceObject.Free;
    End;
    WriteLn;
  End;

Var HIDControler: THIDControler;
  Report: TWiiReport;

Begin
  Try
    AllocConsole;
    Application.Initialize;
    HIDControler := GlobalHIDControler;
    HIDControler.RegisterDeviceChangeProc(DeviceChange);
    HIDControler.RegisterDeviceArrivalProc(DeviceArrival);
    HIDControler.RegisterDeviceRemovalProc(DeviceRemoval);
    Repeat
      Application.ProcessMessages;
      Sleep(10);
      TWiiRemoteController(HIDControler.ArrivaledDevice[0]).LEDs := [blRumble, blLED2];
      Sleep(200);
      TWiiRemoteController(HIDControler.ArrivaledDevice[0]).LEDs := [blLED1, blLED4];
      Sleep(1000);
      Report.Clear;
      Report.ReportID := WII_RID_MODE;
      Report.Continuous := True;
      Report.RequestReportID := WII_RECEPT_STATUS;
      HIDControler.ArrivaledDevice[0].Send(Report, WIIMOTE_BT_REPORT_LEN);
    Until Application.Terminated;
    While HIDControler.ArrivaledDeviceCount > 0 do
      HIDControler.ArrivaledDevice[0].Free;
    HIDControler.UnregisterDeviceChangeProc(DeviceChange);
    HIDControler.UnregisterDeviceArrivalProc(DeviceArrival);
    HIDControler.UnregisterDeviceRemovalProc(DeviceRemoval);
  Except
    On E: Exception do WriteLn(E.ClassName, ': ', E.Message);
  End;
End.
[add]
hab das Ganze mal als eigenständiges Projekt reingestellt
http://www.delphipraxis.net/155160-wiimote-pc.html
Angehängte Dateien
Dateityp: 7z WiiControlP.7z (297,8 KB, 29x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Okt 2010 um 16:31 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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:41 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