Avatar billede hustler79 Nybegynder
14. november 2003 - 08:42 Der er 5 kommentarer og
1 løsning

Joystick programmering

Jeg er ved at skrive et program der kan læse output fra et joystick. Det skal senere anvendes i Java vha. JNI (Dermed ville det være rart hvis det både kan køre på Linux og Windows platforme) . 
Til dette formål har jeg fundet det nedenstående eksempel på nettet. Men jeg har nogle problemer med at kompilere det med gcc pga. Conio.h.
Er der nogen der har nogle forslag til hvad jeg kan gøre ?? Det skal lige siges at jeg er lidt ’rusten’ i c/c++ 

#include <stdio.h>
#include <conio.h>

#define Data    0x378
#define Status  Data + 1
#define BS      8 /* ASCII BackSpace */

void main() {
    int JShigh, JSlow, i, oldbyte, newbyte;

    char backspace = BS;

    printf("\n");
    printf("Ian's Parallel Port JoyStick Reader\n");
    printf("===================================\n");
    printf("\n");
    printf("<Centre + Button> to Quit\n");
    printf("\n");

    oldbyte = 0xff; /* different from newbyte */

    outportb(Data,0xf8); /* output TTL High on enable lines */

    do {
        newbyte = inportb(Status);

        if (newbyte != oldbyte) { /* new joystick status */
        oldbyte = newbyte;

            for (i = 1; i <= 20; i++) { /* clear the previous status report */
                printf("%c",backspace); printf(" "); printf("%c",backspace);
            }

            JSlow  = (newbyte & 0x0f) >> 3; /*    Button Signal */
            JShigh = (newbyte ^ 0x80) >> 4; /* Direction Signal */

            switch (JShigh) {
                case  0: printf("Centre");
                    break;
                case  1: printf("North");
                    break;
                case  2: printf("South");
                    break;
                case  4: printf("East");
                    break;
                case  5: printf("NorthEast");
                    break;
                case  6: printf("SouthEast");
                    break;
                case  8: printf("West");
                    break;
                case  9: printf("NorthWest");
                    break;
                case 10: printf("SouthWest");
            }

            if (JSlow == 1)
                printf(" + Button");
        }
    }
    while ((JSlow != 1) || (JShigh != 0));

    printf("\n");
}
Avatar billede driis Nybegynder
14. november 2003 - 12:50 #1
Ovenstående kan ikke køres på en Windows platform, da du skriver og læser direkte til porten, som joysticket sidder på. Direkte hardwareadgang er ikke tilladt i Windows NT / 2000 / XP. Det kan selvfølgelig ophæves, men det er besværligt. Der findes dog 3. parts biblioteker der kan gøre det (og du kan selvfølgelig også gøre det selv, men det er besværligt).

Ydermere tror jeg heller ikke ovenstående direkte kan køre på Linux, af samme grund. Her er hardwarebeskyttelsen dog noget nemmere at slå fra via kode.

Hvis jeg skal gætte, tror jeg din kodestump er et gammelt DOS program - idet det lader til at direkte IO er tilladt per default, og conio.h oprindeligt er en gammel DOS header.
Avatar billede driis Nybegynder
14. november 2003 - 12:51 #2
#define Data    0x378
0x378 er normalt LPT1 porten - så noget kunne tyde på at programmet er skrevet til et joystick sluttet til en printer port. (Jeg ved ikke om man også slutter joysticks til printerporten i vore dage, men jeg tror det ikke).
Avatar billede hustler79 Nybegynder
14. november 2003 - 14:12 #3
driis ved du hvor jeg kan finde sådan et 3. parts bibliotek ?
jeg har set lidt på win32(http://www.gametutorials.com/Tutorials/win32/Win32_Pg4.htm) Men det kan jeg hverken kompilere med Cygwin eller Bloodshed Dev-C++ .
Avatar billede driis Nybegynder
14. november 2003 - 17:05 #4
Det compiler fint hos mig med MS VC++
Kender Cygwin / DevC++ headeren windows.h ?
Husker du at linke mod winmm.lib ?

Under Windows er det nok den fremgangsmåde du bør bruge. Jeg ved ikke hvordan det gøres i Linux.

Hvis du absolut vil læse direkte fra HW, skal du finde noget mere dokumentation/eksempler til et mere moderne joystick. Jeg tvivler stærkt på at du kan bruge kodeeksemplet du har postet her til noget som helst - med mindre du vil udvikle spil til en DOS maskine med digitalt joystick ;-)

Et lib til direkte HW adgang under Windows kunne eksempelvis være:
http://beyondlogic.org/porttalk/porttalk.htm
Avatar billede hustler79 Nybegynder
14. november 2003 - 19:06 #5
tak for hjælpen driis
Det ser ud til, at problemerne skyldes winmm.lib. Hvordan linker jeg det ?
Avatar billede driis Nybegynder
14. november 2003 - 19:31 #6
I DevC++
Højreklik på dit projekt og vælg "Projekt indstillinger".
Sørg for at du har valgt Win32 GUI under Type.
Klik på fanen parametre.
Under Linker vælger du filen libwinmm.a fra DevCpp\lib biblioteket.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester