Page 1 of 2 1 2 LastLast
Results 1 to 15 of 17

Thread: NLDJoystick

  1. #1
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    4,846

    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...
    Last edited by NGLN; 28-Apr-08 at 21:10. Reason: Bijlage verwijderd, link naar SVN toegevoegd
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  2. #2
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    4,846

    Nieuwe versie...

    Wijzigingen:
    • Property Active toegevoegd
    • Property's RepeatButtonDelay en RepeatMoveDelay toegevoegd
    • Component van gemaakt

    To do:
    • Afvangen dat joystick uit systeem wordt getrokken.
    Last edited by NGLN; 28-Apr-08 at 21:07. Reason: Bijlage verwijderd
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  3. #3
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    4,846

    Versie 1.0.0.2

    Wijziging:
    • Property SuspendScreensaver toegevoegd
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  4. #4
    Hoi Albert,

    Een haast wel perfect component. Ik gebruik nog steeds Delphi 2008 op windows 7, want ik heb het niet zo DotNot 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é

  5. #5
    delphi 2008
    2008????

  6. #6
    Ach ja, die gekke fingers ook altijd, 2007 uiteraard...

  7. #7
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    4,846
    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';

  8. #8
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    4,846
    André, code is aangepast.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  9. #9
    Dat is vlot gefikst.
    Ik ga het vanavond meteen uitproberen en laat het resultaat weten.

    Groet André

  10. #10
    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

  11. #11
    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é

  12. #12
    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....
    Last edited by azrael11; 18-Jan-13 at 09:56.

  13. #13
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    4,846
    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';

  14. #14
    Quote Originally Posted by NGLN View Post
    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...

  15. #15
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    4,846
    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';

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •