#include #include #include #include #include #include #include #include "joystick.h" /*#define DEBUG*/ /*#define DEBUGSTATE*/ #define MAXNUMEVENTS 2 extern LONG IntuitionBase; struct IntuiText ErrorText= { /* text for error-requester */ 0, 1, JAM1, /* FrontPen, BackPen, DrawMode */ 10, 10, /* LeftEdge, TopEdge */ NULL, /* ITextFont */ "3D: Software Error:", /* IText */ NULL /* NextText */ }; struct IntuiText AbortMessage= { /* more text for error-message requester */ 0, 1, JAM1, /* FrontPen, BackPen, DrawMode */ 11, 45, /* LeftEdge, TopEdge */ NULL, /* ITextFont */ "Select ABORT to exit", /* IText */ NULL /* NextText */ }; struct IntuiText ResumeMessage= { /* more text for error-message requester */ 0, 1, JAM1, /* FrontPen, BackPen, DrawMode */ 11, 45, /* LeftEdge, TopEdge */ NULL, /* ITextFont */ "Select RESUME to continue", /* IText */ NULL /* NextText */ }; struct IntuiText AbortText= { /* more text for error-requester */ 0, 1, JAM1, /* FrontPen, BackPen, DrawMode */ 6, 4, /* LeftEdge, TopEdge */ NULL, /* ITextFont */ "ABORT", /* IText */ NULL /* NextText */ }; struct IntuiText ResumeText= { /* more text for error-requester */ 0, 1, JAM1, /* FrontPen, BackPen, DrawMode */ 6, 4, /* LeftEdge, TopEdge */ NULL, /* ITextFont */ "RESUME", /* IText */ NULL /* NextText */ }; extern struct MsgPort *CreatePort(); extern DeletePort(); extern struct IOStdReq *CreateStdIO(); extern DeleteStdIO(); /******************************************************************************/ ULONG set_flags(joystick_data,flags) struct InputEvent *joystick_data; ULONG flags; { SHORT xmove, ymove; xmove = joystick_data->ie_X; ymove = joystick_data->ie_Y; switch(ymove) { case(-1): flags |= BUTTON_FORWARD; flags &= ~BUTTON_BACK; break; case( 0): flags &= ~BUTTON_FORWARD; flags &= ~BUTTON_BACK; break; case( 1): flags &= ~BUTTON_FORWARD; flags |= BUTTON_BACK; break; default: break; } switch(xmove) { case(-1): flags |= BUTTON_LEFT; flags &= ~BUTTON_RIGHT; break; case( 0): flags &= ~BUTTON_LEFT; flags &= ~BUTTON_RIGHT; break; case( 1): flags &= ~BUTTON_LEFT; flags |= BUTTON_RIGHT; break; default: break; } if(joystick_data->ie_Code != IECODE_NOBUTTON) { if(joystick_data->ie_Code == IECODE_LBUTTON) { if (!(flags & ACTION)) { flags |= BUTTON_DOWN; flags &= ~NO_BUTTON; } } if(joystick_data->ie_Code == (IECODE_LBUTTON + IECODE_UP_PREFIX)) { if (!(flags & BUTTON_DOWN)) { flags |= BUTTON_UP; flags &= ~NO_BUTTON; } else { if (!(flags & ACTION)) { flags |= ACTION; flags |= BUTTON_UP; flags &= ~NO_BUTTON; } else { flags |= BUTTON_UP; flags &= ~NO_BUTTON; } } } } else { if (!(flags & ACTION)) { if (!(flags & (BUTTON_DOWN | BUTTON_UP))) { flags |= NO_BUTTON; } } } if (flags & ACTION) { UBYTE actioncount; actioncount = ((flags & 0xFF00) >> 8 ); actioncount += 1; flags = ( (flags & 0xFFFF00FF) | (actioncount<<8) ); flags &= ~BUTTON_DOWN; flags &= ~BUTTON_UP; flags &= ~ACTION; } #ifdef DEBUG switch(ymove) { case (-1): switch(xmove) { case(-1): #ifdef DEBUG printf("NW"); #endif break; case( 0): #ifdef DEBUG printf("N "); #endif break; case( 1): #ifdef DEBUG printf("NE"); #endif break; default: break; } break; case ( 0): switch(xmove) { case(-1): #ifdef DEBUG printf(" W"); #endif break; case( 0): #ifdef DEBUG printf(" "); #endif break; case( 1): #ifdef DEBUG printf(" E"); #endif break; default: break; } break; case ( 1): switch(xmove) { case(-1): #ifdef DEBUG printf("SW"); #endif break; case( 0): #ifdef DEBUG printf("S "); #endif break; case( 1): #ifdef DEBUG printf("SE"); #endif break; default: break; } break; default: break; } #endif #ifdef DEBUG if(joystick_data->ie_Code != IECODE_NOBUTTON) { if(joystick_data->ie_Code == IECODE_LBUTTON) #ifdef DEBUG printf("!"); #endif if(joystick_data->ie_Code == (IECODE_LBUTTON + IECODE_UP_PREFIX)) #ifdef DEBUG printf("#"); #endif } else { #ifdef DEBUG /* printf(" "); */ #endif } #endif return(flags); } struct IOStdReq *open_joystick() { struct MsgPort *joystick_msg_port; struct IOStdReq *joystick_io_request; BYTE *joystick_eventbuf; struct Message *message; LONG error = FALSE; #ifdef DEBUG printf("joystick...entering\n"); #endif if ( (IntuitionBase = OpenLibrary("intuition.library", 31)) == NULL) { ErrorText.NextText = &AbortMessage; AutoRequest(NULL, &ErrorText, NULL, &AbortText, 0, 0, 330, 75); exit(0); } /* allocate memory for the joystick event buffer */ if ( (joystick_eventbuf = (BYTE *)AllocMem(sizeof(struct InputEvent)*MAXNUMEVENTS,MEMF_PUBLIC|MEMF_CLEAR)) == NULL) { ErrorText.NextText = &AbortMessage; AutoRequest(NULL, &ErrorText, NULL, &AbortText, 0, 0, 330, 75); exit(0); } /* provide a port for the IO request/response */ joystick_msg_port = CreatePort("joystickport",0); if(joystick_msg_port == 0) { ErrorText.NextText = &AbortMessage; AutoRequest(NULL, &ErrorText, NULL, &AbortText, 0, 0, 330, 75); exit(-1); } /* make an io request block for communicating with the joystick device */ joystick_io_request = CreateStdIO(joystick_msg_port); if(joystick_io_request == 0) { ErrorText.NextText = &AbortMessage; AutoRequest(NULL, &ErrorText, NULL, &AbortText, 0, 0, 330, 75); DeletePort(joystick_msg_port); exit(-2); } /* open the gameport device for access, unit 1 is right port */ if(OpenDevice("gameport.device",1,joystick_io_request,0)) { ErrorText.NextText = &AbortMessage; AutoRequest(NULL, &ErrorText, NULL, &AbortText, 0, 0, 330, 75); FreeMem(joystick_eventbuf,sizeof(struct InputEvent) * MAXNUMEVENTS); DeleteStdIO(joystick_io_request); DeletePort(joystick_msg_port); exit(-4); } /* set the device type to absolute joystick */ if (set_controller_type(joystick_io_request,GPCT_ABSJOYSTICK) != 0) { ErrorText.NextText = &AbortMessage; AutoRequest(NULL, &ErrorText, NULL, &AbortText, 0, 0, 330, 75); FreeMem(joystick_eventbuf,sizeof(struct InputEvent) * MAXNUMEVENTS); DeleteStdIO(joystick_io_request); DeletePort(joystick_msg_port); exit(-4); } /* trigger on button-down, button-up, front, back, left, right, center */ if (set_controller_trigger(joystick_io_request,GPTF_UPKEYS+GPTF_DOWNKEYS,1,1,1) != 0) { ErrorText.NextText = &AbortMessage; AutoRequest(NULL, &ErrorText, NULL, &AbortText, 0, 0, 330, 75); FreeMem(joystick_eventbuf,sizeof(struct InputEvent) * MAXNUMEVENTS); DeleteStdIO(joystick_io_request); DeletePort(joystick_msg_port); exit(-4); } /* SETUP THE IO MESSAGE BLOCK FOR THE ACTUAL DATA READ */ /* gameport.device replies to this task */ joystick_io_request->io_Message.mn_ReplyPort = joystick_msg_port; /* from now on, just read input events */ joystick_io_request->io_Command = GPD_READEVENT; /* into the input buffer, one at a time. */ joystick_io_request->io_Data = joystick_eventbuf; /* read num events each time we go back to the joystickport */ joystick_io_request->io_Length = sizeof(struct InputEvent)* MAXNUMEVENTS; return(joystick_io_request); } ULONG test_joystick(joystick_io_request,state) struct IOStdReq *joystick_io_request; ULONG state; { ULONG flags; struct InputEvent *joystick_data; /* test the joystick */ if (DoIO(joystick_io_request)) return(state); flags = state; for (joystick_data = joystick_io_request->io_Data; joystick_data; joystick_data = joystick_data->ie_NextEvent) { flags = set_flags(joystick_data,flags); } state = flags; #ifdef DEBUGSTATE printf("\nstate: %4lx",state); #endif return(state); } close_joystick(joystick_io_request) struct IOStdReq *joystick_io_request; { /* close up joystick device */ CloseDevice(joystick_io_request); /* clean up */ FreeMem(joystick_io_request->io_Data,sizeof(struct InputEvent) * MAXNUMEVENTS); DeletePort(joystick_io_request->io_Message.mn_ReplyPort); DeleteStdIO(joystick_io_request); } int set_controller_type(ior,type) struct IOStdReq *ior; BYTE type; { ior->io_Command = GPD_SETCTYPE; ior->io_Length = 1; /* set type of controller to "type" */ ior->io_Data = &type; #ifdef DEBUG printf("joystick:set_controller_type\n"); #endif return(DoIO(ior)); } int set_controller_trigger(ior,keys,timeout,xdelta,ydelta) struct IOStdReq *ior; UWORD keys,timeout,xdelta,ydelta; { struct GamePortTrigger gpt; ior->io_Command = GPD_SETTRIGGER; ior->io_Length = sizeof(gpt); ior->io_Data = &gpt; gpt.gpt_Keys = keys; gpt.gpt_Timeout = timeout; gpt.gpt_XDelta = xdelta; gpt.gpt_YDelta = ydelta; #ifdef DEBUG printf("joystick:set_controller_trigger\n"); #endif return(DoIO(ior)); } /* main() { ULONG state = 0; struct IOStdReq *ior; if ((ior = open_joystick()) == NULL) { exit(-1); } else { while ( ( (state & 0xFF00) >> 8 ) != 0xF ) { state = test_joystick(ior,state); } close_joystick(ior); } exit(0); } */