NLDelphi logo

Apada
Start Forum Nieuws Artikelen Links E mail Statistieken
NLDelphi partnersite: nlDotnet
NLDelphi

Ga Terug   NLDelphi > Diversen > Open source

Antwoord
 
Onderwerpopties Zoek in onderwerp Stem op Onderwerp Weergavemodus
Oud 04-Dec-07, 21:58   #1
NGLN
Registered User
 
NGLN's Avatar
 
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
NLDJoystick

Omschrijving:
NLDJoystick is een runtime-unit welke tot maximaal twee joysticks kan monitoren en de gegevens daarvan met behulp van events ter beschikking stelt voor je eigen programma. NLDJoystick is een losstaande unit en werkt op basis van WinAPI (unit MMSystem.pas).

Oorsprong:
Laatst tijdens het maken van een spelletje kwam de wens om dat spelletje met een joystick te kunnen besturen om de hoek kijken. Verder komt mijn motivatie voor 32 knoppen-, 6 assen- en "Point Of View"-ondersteuning voornamelijk uit het onderwerp Joystick uitlezen met WinAPI. Hoewel het spelletje slechts 1 knop en 2 assen behoefde, zag ik er wel een uitdaging in om de unit algemeen geschikt te maken.

Gebruik:
De joysticks hoeven niet aangemaakt of vrijgegeven te worden. Roep de joysticks aan met de functie's Joystick1 of Joystick2. Vóór gebruik moet de betreffende joystick 'opgestart' worden met Initialize:
Code:
    function Initialize(const NeedAdvanced: Boolean = False): Boolean;
Het functieresultaat geeft aan of de benodigde driver is geïnstalleerd en of de betreffende joystick überhaupt is aangesloten.

NLDJoystick heeft per joystick twee mogelijke modi:
- De simpele modus: voor joysticks met maximaal 2 assen en maximaal 4 knoppen. Ook kun je deze modus gebruiken bij geavanceerde joysticks.
- De geavanceerde modus: voor joysticks met maximaal 6 assen, maximaal 32 knoppen of een 'Point Of View'-functionaliteit.

De simpele modus maakt gebruik van een messagehandler voor de standaard Windows joystick-messages. De geavanceerde modus maakt gebruik van een interne timer om de gegevens van de joystick met een gewenst interval uit te lezen.

Vervolgens zijn er vier events die ingesteld kunnen worden om de joystick aan je programma te koppelen:
Code:
  TJoyButtonEvent = procedure(Sender: TNLDJoystick;
    const Buttons: TJoyButtons) of object;
  TJoyMoveEvent = procedure(Sender: TNLDJoystick; const JoyPos: TJoyRelPos;
    const Buttons: TJoyButtons) of object;
  TJoyPOVChangedEvent = procedure(Sender: TNLDJoystick;
    const Degrees: Single) of object;

  ...
    property OnButtonDown: TJoyButtonEvent read FOnButtonDown
      write FOnButtonDown;
    property OnButtonUp: TJoyButtonEvent read FOnButtonUp write FOnButtonUp;
    property OnMove: TJoyMoveEvent read FOnMove write FOnMove;
    property OnPOVChanged: TJoyPOVChangedEvent read FOnPOVChanged
      write FOnPOVChanged;
Je kunt voor meerdere joysticks eventueel dezelfde eventhandlers gebruiken: controleer dan op Sender.ID (0: Joystick1, 1: Joystick2).

Verder zijn er nog een tweetal property's die ingesteld kunnen worden:
- PollingInterval: Cardinal: het interval waarop de interne timer de joystickgegevens uitleest (alleen in geavanceerde modus). Standaardwaarde = 40, of het minimale PollingInterval dat voor de betreffende joystick van toepassing is.
- ThresholdFactor: Single: het drempelpercentage waarbinnen de joystickbewegingen niet worden geregistreerd (alleen in simpele modus). Bijvoorbeeld ThresholdFactor = 0.1, dan moet de joystick minstens 10% worden bewogen voordat er een OnMove-event optreedt. Standaardwaarde = 0.

Dan zijn er nog een aantal alleen-lezen property's zoals: AbsCenter, AbsMax, AbsMin, Advanced, AxisCount, Axises, ButtonCount en HasPOV.

Voordelen:
Geen apart componenten-package nodig.

Nadelen:
Geen.

Bugs:
Voor zover ik weet zijn er geen bugs. Meldt ze alsjeblieft wel!

Disclaimer:
Het component is ongetwijfeld in vele gedaantes via andere componentensets verkrijgbaar, maar zou de wereld er niet stukken beter uitzien met de standaard componentenset van Borland, slechts aangevuld met die van NLDelphi?
Ik heb de unit zelf getest met slechts een game-pad met 2 assen, 10 knoppen en geen Point-Of-View.
En ik zet mijn vraagtekens bij de constante JOY_POVCENTERED = -1 (zie MMSystem.pas) die men vervolgens in een Cardinal wil stoppen. Overigens wordt die constante niet gebruikt in deze unit.

Waar te vinden?
Op de Subversion server, zie http://svn.nldelphi.com/nldelphi/ope...n/NLDJoystick/

Veel plezier...
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert';

Laatst aangepast door NGLN : 28-Apr-08 om 20:10 Reden: Bijlage verwijderd, link naar SVN toegevoegd
NGLN is offline   Met citaat antwoorden
Oud 09-Feb-08, 21:57   #2
NGLN
Registered User
 
NGLN's Avatar
 
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
Nieuwe versie...

Wijzigingen:
  • Property Active toegevoegd
  • Property's RepeatButtonDelay en RepeatMoveDelay toegevoegd
  • Component van gemaakt
To do:
  • Afvangen dat joystick uit systeem wordt getrokken.
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert';

Laatst aangepast door NGLN : 28-Apr-08 om 20:07 Reden: Bijlage verwijderd
NGLN is offline   Met citaat antwoorden
Oud 28-Apr-08, 23:07   #3
NGLN
Registered User
 
NGLN's Avatar
 
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
Versie 1.0.0.2

Wijziging:
  • Property SuspendScreensaver toegevoegd
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert';
NGLN is offline   Met citaat antwoorden
Oud 30-Nov-12, 01:11   #4
yogib3ar
Registered User
 
yogib3ar's Avatar
 
Geregistreerd op: Dec 2007
Berichten: 21
Hoi Albert,

Een haast wel perfect component. Ik gebruik nog steeds Delphi 2008 op windows 7, want ik heb het niet zo Dotnet() te staan.
Het is uiteraard al een hele tijd geleden dat je dit gemaakt hebt, maar goed ik waag de gok.

Ik ben er wat mee aan het 'stoeien' om een onderwater ROV aan te sturen middels een joystick met POV op een arduino microposcessor via een seriele aansluiting en wil daarbij ook de POV gebruiken.
Het blijkt echter dat de ONMove event van de POV alleen getriggerd wordt als je deze voor het eerst gebruikt.
Als je up drukt en deze vasthoud dan komt ie alleen de eerste keer in het onmove event en ook als je deze weer loslaat.
Maar als je deze vasthoudt in de up stand, dan krijg je geen event meer.

Is er een mogelijkheid om dit te veranderen?
Ik had alwat erover gelezen en dat lijkt met JOY_RETURNPOVCTS te moeten maar kom daar niet echt uit.

Kun je me verder helpen hiermee?

Groet André
yogib3ar is offline   Met citaat antwoorden
Oud 30-Nov-12, 14:59   #5
Benno
Senior Member
 
Geregistreerd op: Jan 2002
Berichten: 4.430
Citaat:
delphi 2008
2008????
Benno is offline   Met citaat antwoorden
Oud 01-Dec-12, 03:14   #6
yogib3ar
Registered User
 
yogib3ar's Avatar
 
Geregistreerd op: Dec 2007
Berichten: 21
Ach ja, die gekke fingers ook altijd, 2007 uiteraard...
yogib3ar is offline   Met citaat antwoorden
Oud 01-Dec-12, 11:38   #7
NGLN
Registered User
 
NGLN's Avatar
 
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
Ik snap je vraag. Je wilt net als bij de buttons dat het event blijft vuren zolang de POV niet gecentreerd is? Hmm, eigenlijk wel logisch... Nu heb ik geen joystick met POV om dat te testen, dus vandaar dat ik er wellicht ook niet aan gedacht heb om het in te bouwen, hihi.

Afijn, het component vraagt al om JOY_RETURNPOVCTS bij het verwerken van de joystick data, dus dat is wel in orde.

Wat je moet doen is een RepeatPOVDelay property toevoegen en deze in de ProcessAdvanced routine implementeren zoals ik dat met de RepeatButtonDelay heb gedaan. De code kun je bijna letterlijk overnemen.

Mocht het niet lukken, vanavond zal ik er naar kijken.
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert';
NGLN is offline   Met citaat antwoorden
Oud 02-Dec-12, 13:47   #8
NGLN
Registered User
 
NGLN's Avatar
 
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
André, code is aangepast.
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert';
NGLN is offline   Met citaat antwoorden
Oud 04-Dec-12, 08:09   #9
yogib3ar
Registered User
 
yogib3ar's Avatar
 
Geregistreerd op: Dec 2007
Berichten: 21
Dat is vlot gefikst.
Ik ga het vanavond meteen uitproberen en laat het resultaat weten.

Groet André
yogib3ar is offline   Met citaat antwoorden
Oud 04-Dec-12, 22:23   #10
yogib3ar
Registered User
 
yogib3ar's Avatar
 
Geregistreerd op: Dec 2007
Berichten: 21
Hoi Albert,

Wel ik heb de oude package verwijderd en de nieuwe geinstalleerd, nu zijn er dingen die niet meer werken.

DE POV doet het helemaal niet meer en de joypos.R ook niet.
De JoyPos.Z doet het daarintegen wel.
Er is iets niet helemaal goed gegaan, of ik doe iets verkeerd.

Groet andre
yogib3ar is offline   Met citaat antwoorden
Oud 04-Dec-12, 22:59   #11
yogib3ar
Registered User
 
yogib3ar's Avatar
 
Geregistreerd op: Dec 2007
Berichten: 21
My bad, was vergeten de Advanced propertie op true te zetten.

Het werkt precies zoals het de bedoeling was.
Hier ben ik blij mee.
Je inzet word zeer gewaardeerd,

groet andré
yogib3ar is offline   Met citaat antwoorden
Oud 18-Jan-13, 08:31   #12
azrael11
Registered User
 
Geregistreerd op: Jan 2013
Berichten: 4
Hello... everybody....
I use your component to my project...
But i have a problem...
Everything works except of the ButtonUp event...

Info...
I have Delphi 7 ....
And the joystick is a ...
Bluetooth.. insinde the GlovePie > PPjoy VirtualJoystick...
I get that is connected in ID 0...
Everthing works ok ... but ButtonUp Event not even strike in
Code:
procedure TNLDJoystick.DoButtonUp(const Buttons: TJoyButtons);
begin
  if Assigned(FOnButtonUp) then
    FOnButtonUp(Self, Buttons);
  if FSuspendScreensaver then
    NotifyKeyboardActivity;
end;
I hope you can help me..

Thanks ...

P.S.. How can i take the idle status of the joystick... e.x( When the joystick handle is in center and joypos.x = 0 and joypos.y = 0 and not moving...)

Thanks again....

Laatst aangepast door azrael11 : 18-Jan-13 om 08:56
azrael11 is offline   Met citaat antwoorden
Oud 21-Jan-13, 22:18   #13
NGLN
Registered User
 
NGLN's Avatar
 
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
I added an OnIdle event.

As for the OnButtonUp event not functioning, I cannot explain. Having no real joystick nor bluetooth device, I cannot test further either.

Try debugging yourself, you have the code. Please return with a report, if any.
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert';
NGLN is offline   Met citaat antwoorden
Oud 22-Jan-13, 11:52   #14
azrael11
Registered User
 
Geregistreerd op: Jan 2013
Berichten: 4
Citaat:
Origineel gepost door NGLN Bekijk Bericht
I added an OnIdle event.

As for the OnButtonUp event not functioning, I cannot explain. Having no real joystick nor bluetooth device, I cannot test further either.

Try debugging yourself, you have the code. Please return with a report, if any.
Ok OnIdle Works fine...

For the OnButtonUp event here what i found...
I give a very fast repeat button delay 10... and the result is that
when is butttonup i get null number buttons[] in every button...
But in OnButtonDown i get buttons[1] so somewhere in code it clear or lost the button number...

Bcs you know the code structure better from me ... i hope this helps you ...
I try to fix it.. but i think you do that much faster than me..

Thank you very much...
azrael11 is offline   Met citaat antwoorden
Oud 22-Jan-13, 12:48   #15
NGLN
Registered User
 
NGLN's Avatar
 
Geregistreerd op: Aug 2004
Locatie: Werkendam
Berichten: 4.614
The Buttons parameter from the OnButtonDown and OnButtonUp events reflect the current state of the buttons. Thus, the parameter in OnButtonUp being 1 less than in OnButtonDown is by design. Maybe I will change this in future, but the present implementation says that á button is released, not which. For now I recommend to save the previous button state in a private field and compare.

The typical use I had in mind with this component was:

Delphi Code:
  1. procedure TForm1.NLDJoystick1ButtonDown(Sender: TNLDJoystick;
  2.   const Buttons: TJoyButtons);
  3. begin
  4.   if JoyBtn12 in Buttons then
  5.     IsFiring := True;
  6. end;
  7.  
  8. procedure TForm1.NLDJoystick1ButtonUp(Sender: TNLDJoystick;
  9.   const Buttons: TJoyButtons);
  10. begin
  11.   if not (JoyBtn12 in Buttons) then
  12.     IsFiring := False;
  13. end;
__________________
(Sender as TNLDUser).Signature := 'Groeten van Albert';
NGLN is offline   Met citaat antwoorden
Antwoord

Bookmarks


Momenteel bekijken: 1 (0 leden en 1 gasten en/of zoekmachine bots) actieve gebruikers dit onderwerp
 
Onderwerpopties Zoek in onderwerp
Zoek in onderwerp:

Geavanceerd zoeken
Weergavemodus Stem op dit onderwerp:
Stem op dit onderwerp::

Berichting Regels
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Aan
Smilies zijn Aan
[IMG] code is Aan
HTML code is Uit

Forumnavigatie


Alle tijden zijn GMT +2. De tijd is nu 15:17.


Forum software: vBulletin, versie 3.8.6
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Copyright ©2011, NLDelphi.com (Dutch Delphi programming)