Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C#]2 dezelfde Hid devices

Pagina: 1
Acties:

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Ik ben bezig met een programma om op mijn computer Buzz Handsets ( Van de ps2 ) te gebruiken voor een soort Quiz.

Deze buzz handsets die worden onder windows gewoon herkend als HID devices dus wilde ik gewoon via de HID functies en de CreateFile functie deze devices aanspreken.

Als ik een device aansluit gaat het goed en kan ik ook de knoppen uitlezen en het lampje bedienen door middel van in en output reports.

Ik lees het path van een device uit d.m.v. de functies SetupDiGetClassDevs en SetupDiGetDeviceInterfaceDetail

En dan maak ik een FileHandle aan d.m.v. CreateFile

Dit gaat goed totdat ik een 2e zelfde Buzz Set aansluit. Ik krijg dan 2 maal hetzelfde hid path en die kan ik dus ook niet 2 maal openen.

Ik krijg dus bijvoorbeeld 2 maal het volgende path
\\?\hid#vid_054c&pid_1000#6&31bf6a8f&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
Hoe kan ik meerdere HID devices tegelijk aan sturen? Is er nog een alternatief path wat ik zou kunnen gebruiken waardoor ik wel onderscheid kan maken tussen deze 2 devices? Of maak ik nog ergens anders een fout?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Windows XP heeft geen support voor een 'dubbel' invoer apparaat. DirectX heeft sinds versie 9.0 wel support voor meerdere HID's die op hetzelfde moment gebruikt kunnen worden. Echter deze functionaliteit is alleen aanwezig op de Xbox.

Ik heb nog geen games gespeelt onder Vista, dus ik zou niet weten of daar inmiddels wel meerdere controllers worden ondersteund. Voor de duidelijkheid, ik heb het dus over het gebruik van twee controllers in een game. Onder XP is het in elk geval niet mogelijk.

De feature zou oorspronkelijk wel geplanned zijn, maar om meer game ontwikkelaars op het xbox platform te krijgen wouden ze daar wat extra argumenten voor hebben en eentje daarvan was het multiplayer scenario.

Maar ik denk persoonlijk dat je issue meer (en mogelijk betere) reacties zal krijgen op het XNA forum zoals http://forums.xna.com. Multiplayer op de PC betekend in de meeste gevallen dat je meerdere PC's via een netwerk (null kabel) nodig hebt.

If it isn't broken, fix it until it is..


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Mmm.. bedankt voor je antwoord. Ik had nog niet eens aan DirectX gedacht. Ik werk in princiepe op windows vista. Maar ik zou het wel vreemd vinden als je maar 1 HID device tegelijk aan zou kunnen sturen.

Je Toetsenbord en Muis zijn toch in princiepe ook gewoon HID devices? Hoe kan het dan dat die wel gewoon tegelijk werken, of worden die door windows niet als HID devices behandeld. Ik zal ieder geval ook eens op het XNA forum kijken.

Ik zie dat ze hier http://www.codeplex.com/WiimoteLib ook gebruik maken van HID en ze ondersteunen wel meerdere Wiimotes dus ik ga eens in die code kijken wat daar anders gedaan word als in mijn code.

[ Voor 18% gewijzigd door Woy op 10-07-2008 09:40 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Als je twee toetsenborden gebruikt (bijvoorbeeld toetsenbord laptop en een losse) dan zul je zien dat beide als 1 werken. Hetzelfde geld met muizen.

Windows ziet wel de dubbele hardware, maar beide vuren events af voor hetzelfde event. Ofwel je ontvangt wel het event MouseClick, maar niet of deze van muis 1 of 2 afkomt. Ik bedoelde dus meer dat XP geen support voor voor twee dezelfde typen HID's.

Maar ik zou niet raar opkijken als Microsoft het verschil tussen de xbox360 en Vista nog groter heeft gemaakt zodat developers nog sneller / gemakkelijker richting de xbox worden getrokken.

If it isn't broken, fix it until it is..


  • Icelus
  • Registratie: Januari 2004
  • Niet online
Misschien heb je hier iets aan?

Afbeeldingslocatie: http://www.vsj.co.uk/pix/articleimages/nov06/usb2.jpg

There are four handsets connected like a hydra through a central moulded hub with a single USB connector. The are five coloured buttons on each handset and the big round, red one has a lamp which can be turned on or off.

When the USB connector is plugged into a port on a PC, it will be detected as a compatible HID device, although Windows will be unable to find any actual driver. Device Manager will confirm that the device is HID compliant and will show its VID and PID, which can be used to locate the device. After detecting, locating and opening the device, we must read and write reports to control the handsets. Unfortunately, information on how the reports are structured is not freely available, but after a bit of experimentation, the appropriate formats become clear and seem remarkably straightforward.

There is one output report used to control the lights on the handsets and one input report giving details of which buttons are currently depressed. To change which handsets are illuminated, simply write an output report with the appropriate bits set. When a user presses or releases one of the buttons on the handset, the device issues an input report. There is no need to poll the device (repeatedly check its state) as the device sends unsolicited input reports whenever a button is pressed or released.

The output reports are formatted as a byte array. The first two bytes are not used and should be ignored. Bytes 3 to 6 control the state of the lamp on each handset (byte 3, handset 1; byte 4, handset 2; etc). Writing a zero turns the lamp off, 0xFF turns it on and anything else leaves it unchanged.

The input reports are slightly more complex. The state of each button is represented by a bit; 1 for pressed and 0 for not pressed. These bits are packed into five bit chunks per handset, with the first bit of each chunk appended immediately after the last bit of the previous chunk. So some bitwise masking is required to extract the button states for each handset. The first button bit is sent in byte 4, so the first three bytes can be ignored.

Afbeeldingslocatie: http://www.vsj.co.uk/pix/articleimages/nov06/usb3.jpg

Bron: VSj.

Developer Accused Of Unreadable Code Refuses To Comment


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:25

Janoz

Moderator Devschuur®

!litemod

Als ik zijn probleem goed geinterpreteerd heb zijn de eerste 4 controlers het probleem niet. Topicstarter heeft een probleem wanneer hij nogmaals een set Buzz controlers aansluit.

Uiteraard kan ik het mis hebben , maar daarover zal de topicstarter uitsluitsel moeten geven.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Idd de eerste set werkt gewoon goed. De Input en Output reports heb ik allemaal geimplementeerd. Maar het lukt niet om voor een tweede zelfde set ook een file te openen d.m.v. CreateFile
Niemand_Anders schreef op donderdag 10 juli 2008 @ 09:41:
Als je twee toetsenborden gebruikt (bijvoorbeeld toetsenbord laptop en een losse) dan zul je zien dat beide als 1 werken. Hetzelfde geld met muizen.

Windows ziet wel de dubbele hardware, maar beide vuren events af voor hetzelfde event. Ofwel je ontvangt wel het event MouseClick, maar niet of deze van muis 1 of 2 afkomt. Ik bedoelde dus meer dat XP geen support voor voor twee dezelfde typen HID's.

Maar ik zou niet raar opkijken als Microsoft het verschil tussen de xbox360 en Vista nog groter heeft gemaakt zodat developers nog sneller / gemakkelijker richting de xbox worden getrokken.
Dat zou dus betekenen dat ik op dezelfde virtuele file een event zou binnen krijgen? Dat zou wel lastig zijn inderdaad. Toch lijkt het in de link die ik hierboven aanhaalde over de WiiMote wel mogenlijk te moeten zijn. Maar als ik hun code bekijk is die nagenoeg hetzelfde als die ik gebruik. Ik zal vanavond eens een BT dongle zoeken en kijken hoe dat met die Wiimote's werkt en of die ook echt dezelfde paths hebben.

Maar het is toch ook mogenlijk om bijvoorbeeld de Xbox controllers op de PC te gebruiken? Is het dan niet mogenlijk om er 2 op een computer te gebruiken? Of maken die nou weer net geen gebruik van HID?

[ Voor 82% gewijzigd door Woy op 10-07-2008 13:11 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Staat er ook niets interessants in die bytes die niet gebruikt worden?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
farlane schreef op donderdag 10 juli 2008 @ 16:26:
Staat er ook niets interessants in die bytes die niet gebruikt worden?
Ik zal vanavond eens kijken of ik er nog interessante informatie in kan vinden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Ik had denk ergens een foutje gemaakt in mijn PInvoke code. Voor mijn 64 bits vista had ik wat dingen aangepast. Na het nog een keer netjes doorgelopen te zijn en wat slordigheden weg gewerkt te hebben krijg ik nu wel verschillende device paths
\\?\hid#vid_054c&pid_1000#6&31bf6a8f&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
Het dik gedrukt is nu voor elk device anders en ik kan dus ook meerdere maal CreateFile aanroepen.

Voor de volledigheid, dit is zo ongeveer mijn code

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
int index = 0;
Guid guid;
SafeFileHandle fileHandle;

// get the GUID of the HID class
HID.HidD_GetHidGuid(out guid);

IntPtr deviceInfoList = HID.SetupDiGetClassDevs(
                            ref guid
                            , null
                            , IntPtr.Zero
                            , HID.DIGCF_DEVICEINTERFACE | HID.DIGCF_PRESENT);

try
{
    HID.SP_DEVICE_INTERFACE_DATA deviceInterfaceData = new HID.SP_DEVICE_INTERFACE_DATA();
    deviceInterfaceData.cbSize = Marshal.SizeOf(deviceInterfaceData);

    while (HID.SetupDiEnumDeviceInterfaces(deviceInfoList, IntPtr.Zero, ref guid, index, ref deviceInterfaceData))
    {
        UInt32 size;

        HID.SetupDiGetDeviceInterfaceDetail(deviceInfoList, ref deviceInterfaceData, IntPtr.Zero, 0, out size, IntPtr.Zero);
        HID.SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetail = new HID.SP_DEVICE_INTERFACE_DETAIL_DATA();

        //Fix voor 64 bits
        deviceInterfaceDetail.cbSize = (uint)(IntPtr.Size == 8 ? 8 : 5);

        if ( HID.SetupDiGetDeviceInterfaceDetail(deviceInfoList, ref deviceInterfaceData, ref deviceInterfaceDetail, size, out size, IntPtr.Zero))
        {
            fileHandle = HID.CreateFile(
                            deviceInterfaceDetail.DevicePath
                            , FileAccess.ReadWrite
                            , FileShare.ReadWrite
                            , IntPtr.Zero
                            , FileMode.Open
                            , HID.EFileAttributes.Overlapped
                            , IntPtr.Zero);

            try
            {
                HID.HIDD_ATTRIBUTES attributes = new HID.HIDD_ATTRIBUTES();
                attributes.Size = Marshal.SizeOf(attributes);

                if (HID.HidD_GetAttributes(fileHandle.DangerousGetHandle(), ref attributes))
                {
                    if (attributes.VendorID == VID && attributes.ProductID == PID)
                    {
                        BuzzControllerFound(deviceInterfaceDetail.DevicePath);
                    }
                }
            }
            finally
            {
                fileHandle.Close();
            }
        }
        else
        {
            throw new BuzzException("SetupDiGetDeviceInterfaceDetail failed on index " + index);
        }
        index++;
    }
}
finally
{
    HID.SetupDiDestroyDeviceInfoList(deviceInfoList);
}

[ Voor 75% gewijzigd door Woy op 10-07-2008 18:19 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1