Login
Aktuelle Version
Aktuelle 3d games creator / Darkbasic Professional Version: 7.2
vom: 04.02.2009

Zum Download bitte hier klicken.
Aktuelle News
letztes Update:
05.02.2009
(siehe Neues)
Hauptmenü
Suche
Internationale Seiten
DarkBASIC Lounge
Werbung
Aktuelle Themen im Forum
Forum Thema Antworten Gelesen Letzter Beitrag
Noch unfertige Projekte (3dgc) Doyle 2 9 109 01.09.2010 22:41 Mc-Over
Community Projekt Zum Spiel selbst 26 3490 28.08.2010 20:47 Mc-Over
Noch unfertige Projekte (3dgc) Lab Rush 15 763 28.08.2010 18:19 Mc-Over
Programmierung (3dgc) endloser Wettbewerb 1219 43492 27.08.2010 11:11 Valle
Community Projekt was ist mit dem community-projekt? 15 173 23.08.2010 19:33 basti123
Sonstiges 2 neue videos zum gucken 2 83 20.08.2010 23:58 codecrusher
Werbung
3d games creator Forenübersicht
   Noch unfertige Projekte (3dgc)
     Wii FB für PC Projekt
Du musst dich erst registrieren bevor du Beiträge veröffentlichen kannst

Diskussion | Neueste zuerst Vorheriges Thema | Nächstes Thema | Unten
Autor Diskussion
Flexus
Veröffentlicht am: 14.09.2009 13:43
DB Süchtiger
Registriert seit:: 04.07.2007
Aus:: Zell
Beiträge: 163
Re: Wii FB für PC Projekt
Also Kulle respekt! das sieht schon ziemlich geil aus.
Ich liebe es mit der Wii FB rumzufuchteln.

aber ich kanns nicht testen weil ich keine Wii FB hab, und weil ich glaub ich auch keinen passenden bluetoothstick habe.

Aber mich würde mal interessieren, wie du das gemacht hast!
ich hab irgendwas von Assembler, Bibliothek usw. gelesen aber so ganz komm ich nicht mit, was du da jetzt gemacht hast.

Und du hast gesagt sowas würde auch für G11/G15 Tastaturen gehen. Das würde mich seehr interessieren. Wenn du da auch mal was machen möchtest, steh ich gern für Versuchszwecke und Beta-Tests zur verfügung.
(hab ne G11)


----------------
Was? Nein! Ich bin nicht die Signatur! Ich putz hier nur!
...Soll ich was ausrichten?

Kulle
Veröffentlicht am: 16.09.2009 18:45
24 Stunden Online
Registriert seit:: 14.11.2003
Aus::
Beiträge: 876
Re: Wii FB für PC Projekt
Um das ganze mal etwas transparenter zu machen, hab ich
hier ein Bsp. in DBP geschieben. Dies liest alle
HID komformen Geräte aus die am PC aktiv sind oder
schoneimal waren. Zu Geräte die nicht angeschlossen sind
kann man natürlich eine Details auslesen. Es werden also
die Grundinfos ausgelen um überhaupt mit eine HID-Device
Datern austauschen zukönnen. Mehr Infos zuden Funktionen
sind unter MSDN zufinden oder einfach fragen.

Bsp.: HID-Device komformer Stack auslesen (Win2K oder höher)
#constant HID      = 1
#constant SETUPAPI = 2
#constant KERNEL32 = 3

#constant DIGCF_DEFAULT         =  1
#constant DIGCF_PRESENT         =  2
#constant DIGCF_ALLCLASSES      =  4
#constant DIGCF_PROFILE         =  8
#constant DIGCF_DEVICEINTERFACE = 16 

#constant FILE_SHARE_READ  = 1
#constant FILE_SHARE_WRITE = 2
#constant OPEN_EXISTING    = 3

load dll "hid.dll", HID
load dll "setupapi.dll", SETUPAPI
load dll "kernel32.dll", KERNEL32

HidGuid   = make memory(16)
HidCaps   = make memory(64)
HidAttrib = make memory(10)  : *HidAttrib = 10
DevData   = make memory(28)  : *DevData   = 28
DevDetail = make memory(260) : *DevDetail = 5
PreData   = make memory(4)
Buffer    = make memory(256)

call dll HID, "HidD_GetHidGuid", HidGuid
DevInfo = call dll(SETUPAPI, "SetupDiGetClassDevsA", HidGuid, 0, 0, DIGCF_DEVICEINTERFACE)

while call dll(SETUPAPI, "SetupDiEnumDeviceInterfaces", DevInfo, 0, HidGuid, Index, DevData)
    call dll SETUPAPI, "SetupDiGetDeviceInterfaceDetailA", DevInfo, DevData, DevDetail, 255, 0, 0
    DevPath$ = PeekStrA (DevDetail, 4)
    DevFlag = DevData + 20
    print "HID-Device: ", Index, " / "; 
    print "Status: "; : if *DevFlag then print "<ACTIVE>" else print "<REMOVED> "
    print "DevicePath: ", DevPath$
    if *DevFlag
        hDev = call dll(KERNEL32, "CreateFileA", DevPath$, 0, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0)
        call dll HID, "HidD_GetAttributes", hDev, HidAttrib
        print "VendorID: ",  hex$(PeekWord(HidAttrib, 4)), " / ";
        print "ProductID: ", hex$(PeekWord(HidAttrib, 6)), " / ";
        print "Version: ",   hex$(PeekWord(HidAttrib, 8))
        fill memory Buffer, 0, 256
        call dll HID, "HidD_GetManufacturerString", hDev, Buffer, 256
        Vendor$ = PeekStrW(Buffer)
        fill memory Buffer, 0, 256
        call dll HID, "HidD_GetProductString", hDev, Buffer, 256
        Product$ = PeekStrW(Buffer)
        print "VendorName: ";  : if len(Vendor$)  > 1 then print Vendor$  else print "unknown"
        print "ProductName: "; : if len(Product$) > 1 then print Product$ else print "unknown"
        call dll HID, "HidD_GetPreparsedData",hDev, PreData
        call dll HID, "HidP_GetCaps", *PreData, HidCaps
        print "InputReportLength: ",  hex$(PeekWord(HidCaps, 4))
        print "OutputReportLength: ", hex$(PeekWord(HidCaps, 6))
        call dll HID, "HidD_FreePreparsedData", *PreData
        call dll KERNEL32, "CloseHandle", hDev
    endif
    inc Index : wait key : print
endwhile
 
call dll SETUPAPI, "SetupDiDestroyDeviceInfoList", DevInfo

delete memory HidGuid
delete memory HidCaps
delete memory HidAttr
delete memory DevData
delete memory DevDetail
delete memory PreData
delete memory Buffer
delete dll HID
delete dll SETUPAPI
delete dll KERNEL32
end

function PeekStrA(p, o)
    inc p, o : repeat : s$ = s$ + chr$(*p) : inc p : until chr$(*p) = ""
endfunction s$

function PeekStrW(p)
    repeat : s$ = s$ + chr$(*p) : inc p, 2 : until chr$(*p) = ""
endfunction s$

function PeekWord(p, o)
    w as word : inc p, o : w = *p
endfunction w
Kulle
Veröffentlicht am: 16.09.2009 23:20
24 Stunden Online
Registriert seit:: 14.11.2003
Aus::
Beiträge: 876
Re: Wii FB für PC Projekt
Wer sehr nett von euch wenn jemand was dazu scheiben würde.
Ob es läuft oder austeigt?

Ich Versuche das gleiche in in meiner DLL und bekomm's einfach nicht hin. In Assembler eine DLL zu Debugen geht
auch nicht.

lg
kulle

Kulle
Veröffentlicht am: 19.09.2009 23:42
24 Stunden Online
Registriert seit:: 14.11.2003
Aus::
Beiträge: 876
Re: Wii FB für PC Projekt
habe jetzt einen kleinen teil in dbp geschrieben ...
@scot: bitte teste mal wieder ^^

beispiel "motion sensor xyz"
hWii = WiiConnect()
if hWii = -1 then print "WiiMote not found!" : wait key : WiiDisconnect(hWii) : end

sync on : sync rate 0 : autocam off : color backdrop 0 : disable escapekey
make object box 1, 2, 2, 4 : position camera 0, 0, -5

WiiInit(hWii)

repeat  
    set cursor 0, 0 : print "FPS: ", screen fps()
    
    WiiRead(hWii)
    
    rotate object 1, curvevalue(WiiMotionY() * 2, object angle x(1), 100), 0, curvevalue(WiiMotionX(), object angle z(1), 100)

    for i = 0 to 21 
        print hex$(PeekByte(RepData, i)), " ";
    next i

    sync 
until WiiButtonA() and WiiButtonB()

WiiDisconnect(hWii)
end


wiimote.dba als function include für dbp
function WiiConnect()

    #constant HID      = 253 
    #constant SETUPAPI = 254
    #constant KERNEL32 = 255
    
    load dll "hid.dll", HID
    load dll "setupapi.dll", SETUPAPI
    load dll "kernel32.dll", KERNEL32
    global WiTimer
    global RepTime
    global RepSize : RepSize = make memory(4)
    global RepData : RepData = make memory(22)
    HidGuid   = make memory(16)
    HidAttrib = make memory(10)  : *HidAttrib = 10
    DevData   = make memory(28)  : *DevData   = 28
    DevDetail = make memory(260) : *DevDetail = 5
    call dll HID, "HidD_GetHidGuid", HidGuid
    DevInfo = call dll(SETUPAPI, "SetupDiGetClassDevsA", HidGuid, 0, 0, 18)
    while call dll(SETUPAPI, "SetupDiEnumDeviceInterfaces", DevInfo, 0, HidGuid, Index, DevData)
        call dll SETUPAPI, "SetupDiGetDeviceInterfaceDetailA", DevInfo, DevData, DevDetail, 255, 0, 0
        DevPath$ = PeekStr(DevDetail, 4)
        hDev = call dll(KERNEL32, "CreateFileA", DevPath$, 0xc0000000, 3, 0, 3, 0, 0)
        if hDev <> -1
            call dll HID, "HidD_GetAttributes", hDev, HidAttrib
            if PeekWord(HidAttrib, 4) = 1406 and PeekWord(HidAttrib, 6) = 774 then exit
            call dll KERNEL32, "CloseHandle", hDev
        endif
        inc Index
    endwhile
    call dll SETUPAPI, "SetupDiDestroyDeviceInfoList", DevInfo
    delete memory HidGuid
    delete memory HidAttrib
    delete memory DevData
    delete memory DevDetail
endfunction hDev

function WiiDisconnect(hWii)
    if hWii <> -1 then call dll KERNEL32, "CloseHandle", hWii
    delete memory RepSize
    delete memory RepData
    delete dll HID
    delete dll SETUPAPI
    delete dll KERNEL32
endfunction

function WiiInit(hWii)
    WiiLED(hWii, %0001)
    WiiRumble(hWii, 1)
    wait 100
    WiiWrite(hWii, "120431")
endfunction

function WiiBatterie(hWii)
    WiiWrite(hWii, "1500") : WiiReadEx(hWii, 0x20)
    r  = PeekByte(RepData, 6) / 2
endfunction r

function WiiLED(hWii, n)
    WiiWrite(hWii, "11" + hex$(n) + "0")
endfunction

function WiiRumble(hWii, n)
    WiiWrite(hWii, "150" + hex$(n))
endfunction

function WiiMotionX()
    r = 500 - (PeekByte(RepData, 3) << 2 || PeekByte(RepData, 1) >> 5 && %11)
endfunction r

function WiiMotionY()
    r = (PeekByte(RepData, 4) << 1 || PeekByte(RepData, 2) >> 5 && %01) - 250
endfunction r

function WiiMotionZ()
    r = (PeekByte(RepData, 5) << 1 || PeekByte(RepData, 2) >> 6 && %01) - 300
endfunction r

function WiiButtonA()
    r = PeekByte(RepData, 2) >> 3 && 1
endfunction r 

function WiiButtonB()
    r = PeekByte(RepData, 2) >> 2 && 1
endfunction r

function WiiButtonMinus()
    r = PeekByte(RepData, 2) >> 4 && 1
endfunction r

function WiiButtonPlus()
    r = PeekByte(RepData, 1) >> 4 && 1
endfunction r

function WiiButtonHome()
    r = PeekByte(RepData, 2) >> 7 && 1
endfunction r

function WiiButtonOne()
    r = PeekByte(RepData, 2) >> 1 && 1
endfunction r

function WiiButtonTwo()
    r = PeekByte(RepData, 2) && 1
endfunction r

function WiiPadLeft()
    r = PeekByte(RepData, 1) && 1
endfunction r

function WiiPadRight()
    r = PeekByte(RepData, 1) >> 1 && 1
endfunction r

function WiiPadDown()
    r = PeekByte(RepData, 1) >> 2 && 1
endfunction r

function WiiPadUp()
    r = PeekByte(RepData, 1) >> 3 && 1
endfunction r

function WiiReadEx(hWii, ID)
    repeat
        call dll KERNEL32, "ReadFile", hWii, RepData, 22, RepSize, 0
    until PeekByte(RepData, 0) = ID
endfunction

function WiiRead(hWii)
    if timer() > RepTime
        call dll KERNEL32, "ReadFile", hWii, RepData, 22, RepSize, 0
        RepTime = timer() + 10
    endif
endfunction

function WiiWrite(hWii, d$)
    p = RepData
    for i = 1 to len(d$) step 2
        h = asc(mid$(d$, i)) - 48 : l = asc(mid$(d$, i + 1)) - 48
        b = (h - (h > 9) * 7) << 4 : *p = b + (l - (l > 9) * 7) : inc p
    next i
    call dll KERNEL32, "WriteFile", hWii, RepData, 22, RepSize, 0
endfunction

function PeekByte(p, o)
    b as byte : inc p, o : b = *p
endfunction b

function PeekWord(p, o)
    w as word : inc p, o : w = *p
endfunction w

function PeekStr(p, o)
    inc p, o : repeat : s$ = s$ + chr$(*p) : inc p : until chr$(*p) = ""
endfunction s$


hWii = WiiConnect()
Gibt das Handle von einer WiiMote zurück.
(evt. mehr WiiMote, wichtig für später)

WiiDisconnect(hWii)
Löscht den ganzem WiiMote müll.

WiiInit(hWii)
Initialisieren vor dem Main Loop.
(Wichtig, aber jetzt noch nicht wichtig)

WiiBat = WiiBatterie(hWii)
Status der Batterie abfragen (0-100%)

WiiLED(hWii, n)
4 Bits um die LED auf der WiiMote zu Steuern.
(Bsp. WiiLED(hWii, %0001) um linke LED zu aktivieren)

WiiRumble(hWii, n)
1 für an, 0 für aus.

X = WiiMotionX() / Y = WiiMotionY() / Z = WiiMotionz()
Wertebereich von X (10bit): -512 bis 512 (G abhängig)
Wertebereich von Y (9bit): -256 bis 256 (G abhängig)
Wertebereich von Z (9bit): -256 bis 256 (G abhängig)

B = WiiButton?()
Alle BUTTON geben einen TRUE(1) zurück, wenn sie
gedrückt wurden.

P = WiiPad?()
Alle PAD geben einen TRUE(1) zurück, wenn sie
gedrückt wurden.

WiiRead(hWii)
Schnelles auslesen des Wii Reports.

WiiReadEx(hWii, ID)
Warten auf den Request des Reports.

WiiWrite(hWii, d$)
Finger weg, oder man weiß was man macht.
Scot_o_tell
Veröffentlicht am: 20.09.2009 16:20
DB Süchtiger
Registriert seit:: 01.01.2005
Aus::
Beiträge: 106
Re: Wii FB für PC Projekt
Aber Gerne!

Test Erfolgreich! Sieht schon mal super aus! Bei mir hängt's nur ein wenig nach, liegt aber am PC
Ansonsten TOP - Der Würfel hat fast die gleiche Ausrichtung wie die FB. (Bissel viel nach vorne gekippt)

MfG.Scotty


----------------
<<A programmer is just a tool to convert coffe into code!>>

Kulle
Veröffentlicht am: 20.09.2009 18:40
24 Stunden Online
Registriert seit:: 14.11.2003
Aus::
Beiträge: 876
Re: Wii FB für PC Projekt
Vielen Dank für's testen Scotty!

Du kannst dir die Werte von WiiMotionX/Y/Z mal auslesen.
Sie sollten alle bei ~ 0 liegen, wenn die WiiFB einen
waagrechten Untergrund liegt. Man kann die ZERO-Point
auch speichern, falls die zb. zuviel abweichen. Normal
braucht man aber nicht zu machen, und wenn kann man
das mit der Software ausgleichen.

Du kannst auch die CURVEVALUE im Bsp. auf 0 setzen dann
spricht es auf die Bewegung sofort an. Die Sensoren
sind aber sehr genau und geben jede kleines zittern
sofort weiter. Die Werte sind auch keine Grad angaben
und zudem noch abhängig von der Geschwindigkeit der
Bewegung. Da ich die Werte direkt auf ROTATE OBJECT
anwende, kann es nie genau sein.

lg
Kulle
ZERO32
Veröffentlicht am: 07.10.2009 01:25
DB Süchtiger
Registriert seit:: 25.05.2007
Aus::
Beiträge: 109
Re: Wii FB für PC Projekt
ich hab mir jetzt nicht den ganzen code genau durchgelesen und auch leider keine geräte zum testen da (kein wii besitzer ). wollte mal fragen ob das ganze nur mit der original wiimote geht oder auch mit nachbauten?


edit:

hab von nem freund die wiimote ausgeborgt. hab jetzt mal probiert mit dem pc zu verbinden, was auch geklappt hat. als ich aber den code ausprobiert habe, hat der mir den würfel nur gedreht, wenn ich auf ne taste auf der wiimote drücke und irgendwann hat sichs ausgedreht. hab dann probiert mal nur die werte von WiiMotionX/Y/Z auszulesen. die waren Immer gleich. egal wie ich die wii gedreht habe. hab das neueste dbpro update und arbeite auf win7 RC x64.

Was passt da nicht?

mfg z32


----------------
wenn du im kampf gegen dich selbst verlierst, wer hat dann gewonnen?

DarkBasicer
Veröffentlicht am: 20.04.2010 19:22
DB Freak
Registriert seit:: 16.04.2004
Aus:: Dessau-Rosslau - SA
Beiträge: 209
Re: Wii FB für PC Projekt
Jetzt muss ich mich auch mal melden
Habe mir heute voller Vorfreude eine WiiMote gekauft und damit ist mein Problem auch schon da:
Verbinden per bluetooth ist kein Problem, dein Programm erkennt die wiiMote auch super.
Allerdings habe ich Probleme mit dem Motion sensor bzw. den Achsen.
Es scheint, so, als würde das bei mir falsch interpretiert werden. Der Würfel dreht sich zwar, aber nicht so, wie ich die Fernbedienung bewege... konkret: die Y-Achse reagiert garnicht, die anderen beiden Drehachsen scheinen miteinander gekoppelt zu sein. Kann es sein, dass ich die wiiMote falsch halte? Mit dem Wrapper, den es im TGC-Forum gibt, siehts genauso aus.
Wenn ich mir allerdings die neueste Bibliothek HIER herunterlade und das fertigcompilierte Beispielprogramm ausprobieren, ist alles perfekt: Drehung um die jeweilige Achse verändert auch NUR die Werte dieser Achse.
Muss man die wiiMote irgendwie kalibirieren? Habe dazu nichts im Internet gefunden.

Ich verwende DBP 7.5, allerdings hats auch mit allen Versionen ab 7.1 aufwärts nicht geklappt.

ich hoffe, dass jemand von euch eine Lösung hat.
Ich weiss nicht, ob es relevant ist zu erwähnen, dass ich nicht die originale wiiMote habe, sondern eine von "MadCatz" (halt soneFirma wie BigBen ). Wie gesagt, bei dem einen Beispielprogramm gehts...


EDIT:
Ich sehe gerade im Post über mir, dass ZERO32 ja genau eine alle entscheidende frage gestellt hat:
Zitat:

wollte mal fragen ob das ganze nur mit der original wiimote geht oder auch mit nachbauten?

Also,was sagt ihr? Ich hoffe, dass irgendjemand das weiss.


----------------
--- Projekte ---
Spacewars
Lab Rush

ZERO32
Veröffentlicht am: 22.04.2010 10:46
DB Süchtiger
Registriert seit:: 25.05.2007
Aus::
Beiträge: 109
Re: Wii FB für PC Projekt
hmmm... ich bin durch weiteres grübeln auf den entschluss gekommen,
das ne gafakte wiimote eg funktionieren sollte,
weil die ja die gleichen daten übergeben muss, wie das original.
zumindest ist das meine theorie.

ich werd mir heute abend oder spätestens morgen abend das ganze nochmal anschauen,
glaube ich hatte da iwie nen falschen bluetooth-treiber verwendet oder so

wenn ich alles ausprobiert hab, meld ich mich mit meinen neusten erfahrungen

mfg
z32


----------------
wenn du im kampf gegen dich selbst verlierst, wer hat dann gewonnen?

DarkBasicer
Veröffentlicht am: 23.04.2010 15:49
DB Freak
Registriert seit:: 16.04.2004
Aus:: Dessau-Rosslau - SA
Beiträge: 209
Re: Wii FB für PC Projekt
Hi ihr alle
Ich konnte jetzt mal eine originale wiiMote testen, und siehe da, der Quader in Kulles beispielcode ist nun tatsächlich perfekt richtig ausgerichtet.
Allerdings ist das mit den Motion-Sensoren immernoch nicht zufriedenstellend, denn die Y-Achse an der wiiMote scheint bei mir keinerlei Wirkung zu zeigen. Getestet habe ich das mit dem Beispielprogramm weiter vorn, wo die Motion-Sensoren als bunte Balken angezeigt werden. Schon da kann ich nicht klar durch Drehung der wiiMote um EINE Achse Einfluss auf nur EINEN Balken nehmen, sondern alles bewegt sich oft wild durcheinander.
Halte ich die wiiMote vllt falsch? Ich zeige mit ihr wie mit einer Fernbedienung Richtung Bildschirm. Es ist doch sicherlich unerheblich, dass mein bluetooth-Stick unten am Tower dransteckt^^

Irgendwas mache ich doch falsch!?


----------------
--- Projekte ---
Spacewars
Lab Rush

« 1 (2)
Diskussion | Neueste zuerst Vorheriges Thema | Nächstes Thema | Oben

Du musst dich erst registrieren bevor du Beiträge veröffentlichen kannst