Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C++] Winamp control op Gameport

Pagina: 1
Acties:

  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:44
Ik ben bezig met het bouwen van een HTPC. De software maak ik ook zelf.
Ik wil ook buttons op de HTPC maken om hem te bedienen. Tevens moet hij via afstandsbediening werken.

Ik heb een mainboard met 3 poorten. 1 Com, 1 LPT, en 1 Gameport.
Op de Com zit afstandsbediening.
Op LPT zit een LCD.
Nu heb ik alleen de Gameport nog over. Hier moeten 8 Buttons op.

4 Buttons is geen probleem. Deze kunnen rechtstreeks op de digitale ingangen.

Maar nu moeten de andere 4 Buttons op de analoge ingangen. Hiervan weet ik inmiddels, dat je hier eerst iets naar toe moet schrijven. Dan worden de ingangen ‘hoog’. Vervolgens moet je dan net zolang lezen, totdat ze weer ‘laag’ zijn. De tijd hiertussen geeft de stand van bijv. een joystick weer.

Vraag is nu, wat gebeurt er als ik een write doe en dus de ingangen ‘hoog’ maak en vervolgens 0 Volt op de ingangen laat staan. Blijven ze nu net zolang hoog, totdat er een spanning > 0 op komt?
En als ik er 5V op zet? Zal de ingang dan zonder vertraging ‘Laag’ worden?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat is een HTPC?

De simpele joystick axes werken idd met een condensator. Die wordt gevuld met 5V. Op de joystick zit een potmetertje die eigenlijk direct is verbonden met de stick. De stand van de stick bepaalt dus de weerstand. En de weerstand bepaalt op zijn beurt weer hoe lang het duurt voordat de condensator leeg is.

De analoge joypads, dus met zeg maar 4 knopjes voor elke richting ipv een stick, zetten wel of niet weerstand op de lijn, afhankelijk van of de knop is ingedrukt of niet.

Je vraag zelf snap ik echter niet helemaal. Waarom zou je de gameport zelf aan willen sturen? Het OS levert daar toch gewoon functies voor? Onder welk OS werk je eigenlijk

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MisterData
  • Registratie: September 2001
  • Laatst online: 22-11 17:05
.oisyn schreef op 08 October 2003 @ 12:23:
Wat is een HTPC?

De simpele joystick axes werken idd met een condensator. Die wordt gevuld met 5V. Op de joystick zit een potmetertje die eigenlijk direct is verbonden met de stick. De stand van de stick bepaalt dus de weerstand. En de weerstand bepaalt op zijn beurt weer hoe lang het duurt voordat de condensator leeg is.

De analoge joypads, dus met zeg maar 4 knopjes voor elke richting ipv een stick, zetten wel of niet weerstand op de lijn, afhankelijk van of de knop is ingedrukt of niet.

Je vraag zelf snap ik echter niet helemaal. Waarom zou je de gameport zelf aan willen sturen? Het OS levert daar toch gewoon functies voor? Onder welk OS werk je eigenlijk
Home Theater PC ;) Dus een PC die speciaal bedoeld is om DivX'en of andere media mee af te spelen (meestal icm je televisie) :)

  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:44
Ik werk met Windows XP.

Ik wil de poort rechtstreeks aansturen met behulp van DLPortIO.
Ik wil graag 8 buttons. En het liefst elk op een eigen Pin.
Daarom vroeg ik mij af hoe de analoge ingang van de gameport reageerd op 'digitale' ingangsspanningen. Dus of +5V of 0V

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik wil de poort rechtstreeks aansturen met behulp van DLPortIO
waarom? en waarom niet gewoon joyGetPos () ofzo?
Timing is essentieel voor het uitlezen van joystick axes, en die timinggarantie heb je gewoon niet binnen een multitask OS. Destemeer reden dus om windows' functies te gebruiken

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-11 15:12
Quitter3 schreef op 07 oktober 2003 @ 10:04:
Maar nu moeten de andere 4 Buttons op de analoge ingangen. Hiervan weet ik inmiddels, dat je hier eerst iets naar toe moet schrijven. Dan worden de ingangen ‘hoog’. Vervolgens moet je dan net zolang lezen, totdat ze weer ‘laag’ zijn. De tijd hiertussen geeft de stand van bijv. een joystick weer.

Vraag is nu, wat gebeurt er als ik een write doe en dus de ingangen ‘hoog’ maak en vervolgens 0 Volt op de ingangen laat staan. Blijven ze nu net zolang hoog, totdat er een spanning > 0 op komt?
En als ik er 5V op zet? Zal de ingang dan zonder vertraging ‘Laag’ worden?
Zo te horen is de analoge ingang een voltage source ingang. Dwz dat de ingang zelf de spanning levert en de externe hardware afhankelijk van een weerstand de stroom regelt.

Dus, de jostick zet geen spanning op de ingang, maar heeft een passief element ( waarschijnlijk een schuifweerstand oid ) waarmee hij de stroom door de ingang regelt.

Als je de ingang hoog maakt, zal deze dus hoog blijven als er geen verbinding wordt gemaakt. ( Afgezien van misschien een lekstroom, die een oorzaak kan zijn dat je periodiek de ingang opnieuw moet 'schrijven' )

[edit]
Zelf spanning op de ingang zetten is dus waarschijnlijk NIET verstandig :)

[ Voor 15% gewijzigd door farlane op 08-10-2003 16:41 ]

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.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Oh bedoelt hij het zo :D ik begreep het al niet
Nee, je moet idd geen spanning op de poort zetten, die levert de poort zelf. Lees mijn stukje nog eens.

Je kunt programmatisch de spanning op de poort hoog zetten (als me niet vergis) (vandaar dus ook de verwarring aan mijn kant). Een opgeladen condensator ontlaadt dan richting de joystick. Door de weerstand op de joystick duurt het een bepaalde tijd voordat de condensator volledig leeg is. Je kunt uitlezen of de condensator leeg is, en dus zo de tijd bepalen van een ontlading. En die tijd is dus een functie van de weerstand, en dus een functie van de stand van de as

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-11 15:12
Ik had hier http://www.monmouth.com/~lw4750/electrical.htm ook nog een schema gevonden die de opmerkingen van .oisyn en * farlane bevestigen :)

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.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hmm ik had een aantal maanden terug nog een hele mooie datasheet van de joystick controller, maar ik kan 'm nergens meer vinden (natuurlijk ook niet opgeslagen of in mijn favorieten gezet |:()

.edit: hmm dit vond ik wel:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
¦7¦6¦5¦4¦3¦2¦1¦0¦ Port at 201h used with Joysticks
¦ ¦ ¦ ¦ ¦ ¦ ¦ +---- joystick a, x coord (0 = timing active)
¦ ¦ ¦ ¦ ¦ ¦ +----- joystick a, y coord (0 = timing active)
¦ ¦ ¦ ¦ ¦ +------ joystick b, x coord (0 = timing active)
¦ ¦ ¦ ¦ +------- joystick b, y coord (0 = timing active)
¦ ¦ ¦ +-------- joystick a, button 1 (0=pressed)
¦ ¦ +--------- joystick a, button 2 (0=pressed)
¦ +---------- joystick b, button 1 (0=pressed)
+----------- joystick b, button 2 (0=pressed)

- accessed through port 201h
- bits 3-0 are resistive inputs with the length of the pulse
determined by 0-100K ohm resistive load. Use this formula:
    % time = 24.2µ + ( 0.011µ * resistance )
or
    % resistance = ( time - 24.2 ) / 0.011
- a read should be immediately preceded by a write (any data)
to start timing for the resistive values.


.edit: ok, uit de verschillende stukjes informatie die ik zojuist vergaard heb blijkt dat mijn verhaaltje niet helemaal klopt. Bij een write naar poort 0x201 komt er op de as-pinnen 5V te staan. Die pin is via de joystick verbonden met een condensator die oplaadt, en zodra die op 3.3V zit zet die de respectievelijke axis-bit hoog. De tijd tussen de de write naar 0x201 en het moment dat de bit hoog is moet je dus meten, en je kunt de weerstand (en dus de positie) bepalen aan de hand van bovenstaande formule

[ Voor 92% gewijzigd door .oisyn op 08-10-2003 17:42 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:44
Dan zal ik dus toch alle 8 buttons op de digitale ingang moeten zetten volgens het schema in Topic :
[rml][ How-to] Winamp poort control[/rml]

Nog een vraagje. Moet ik gaan pollen of heeft de gamepoort een interrupt, die ik kan gebruiken?
En als ik moet pollen, wat is dan een geschikte frequentie? Zal om de 100 ms genoeg zijn? Als je de buttons normaal indrukt, moet dat toch kunnen.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-11 15:12
Je zou natuurlijk de digitale ingangen ook kunnen multiplexen, maar dan moet je wat meer electronica toevoegen.

De gamepoort heeft ongetwijfeld een interrupt, maar daar kun je niet bijkomen als je niet een kernel space proces bent ( een driver dus ).
Waarschijnlijk heeft DX hier wel mogelijkheden voor, bv door het aangeven van een callback functie, maar dat weet ik niet.

Makkelijkste is pollen, en dat kan in een aparte thread met een while loop met daarin een kleine Sleep.

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.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Quitter3 schreef op 09 October 2003 @ 09:20:
Dan zal ik dus toch alle 8 buttons op de digitale ingang moeten zetten volgens het schema in Topic :
[rml][ How-to] Winamp poort control[/rml]
waarom, je kunt toch prima knopjes op de assen kwijt? Sterker nog, je zou meerdere knoppen op 1 as kunnen plaatsen, als je de totale weerstand op een binaire manier vormt. Bijvoorbeeld een knopje van 3 kOhm, eentje van 8k, eentje van 18k en eentje van 40k (expres ruimte er tussen gelaten voor onnauwkeurigheden)
Nog een vraagje. Moet ik gaan pollen of heeft de gamepoort een interrupt, die ik kan gebruiken?
werk je in usermode? Dan moet je wel pollen. Maar dat maakt niet uit, want het OS doet al het werk voor je
En als ik moet pollen, wat is dan een geschikte frequentie? Zal om de 100 ms genoeg zijn? Als je de buttons normaal indrukt, moet dat toch kunnen.
dat is gewoon iets wat je door experimenteren moet ondervinden

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1