/*==========================================================================*
 * gport0.c - gameport unit 0 handling code for Discovery (alternate)       *
 *==========================================================================*/

#include "welcome.h"
#include <devices/gameport.h>
/* #include <pragmas.h> */

#define XMOVE 1
#define YMOVE 1

/* our functions */

void wrap_gameport(void);
void send_read_request(void);
void flush_gport(void);

struct IOStdReq		*game_io_msg = NULL;
struct MsgPort  	*game_msg_port = NULL;

/* trigger on all joystick key transitions */
struct GamePortTrigger joytrigger = {
    GPTF_UPKEYS+GPTF_DOWNKEYS,
    1,
    XMOVE,
    YMOVE
};

BOOL	GPortOpened = FALSE;

struct GamePortTrigger oldtrigger;
BYTE	oldtype;

	/* init gameport specifically for relative joystick */
BOOL init_gameport(void)
{
	BYTE	data;

	game_msg_port = CreatePort(NULL,0);
	if (game_msg_port == NULL) return FALSE;

	game_io_msg = CreateStdIO(game_msg_port);
	if (game_io_msg == NULL) goto fail;

	if (OpenDevice("gameport.device",0,(struct IORequest *)game_io_msg,0)) goto fail;

	GPortOpened = TRUE;

	game_io_msg->io_Command = GPD_ASKCTYPE;    /* inquire current status */
	game_io_msg->io_Length = 1; 
	game_io_msg->io_Flags = IOF_QUICK;
	game_io_msg->io_Data = (APTR)&oldtype; /* put answer in here */
	DoIO((struct IORequest *)game_io_msg);

	if (oldtype != GPCT_NOCONTROLLER)
    {
		game_io_msg->io_Command = GPD_ASKTRIGGER;    /* inquire current status */
		game_io_msg->io_Length = sizeof oldtrigger;
		game_io_msg->io_Flags = IOF_QUICK;
		game_io_msg->io_Data = (APTR)&oldtrigger; /* put answer in here */
		DoIO((struct IORequest *)game_io_msg);
	}

	data = GPCT_ABSJOYSTICK;
	game_io_msg->io_Command = GPD_SETCTYPE;
    game_io_msg->io_Flags = IOF_QUICK;   
	game_io_msg->io_Length = 1;
	game_io_msg->io_Data = (APTR)&data;
	DoIO((struct IORequest *)game_io_msg);

	game_io_msg->io_Command = GPD_SETTRIGGER;   
   	game_io_msg->io_Flags = 0;
	game_io_msg->io_Length = sizeof(struct GamePortTrigger);   
	game_io_msg->io_Data = (APTR)&joytrigger;   
	DoIO((struct IORequest *)game_io_msg);

	return TRUE;

fail:
	wrap_gameport();
	return FALSE;
}

void wrap_gameport(void)
{
	if (GPortOpened)
	{
		game_io_msg->io_Command = GPD_SETCTYPE;
		game_io_msg->io_Flags = IOF_QUICK;   
		game_io_msg->io_Length = 1;
		game_io_msg->io_Data = (APTR)&oldtype;
		DoIO((struct IORequest *)game_io_msg);   

		if (oldtype != GPCT_NOCONTROLLER)
		{
			game_io_msg->io_Command = GPD_SETTRIGGER;   
		   	game_io_msg->io_Flags = 0;
			game_io_msg->io_Length = sizeof(struct GamePortTrigger);   
			game_io_msg->io_Data = (APTR)&oldtrigger;   
			DoIO((struct IORequest *)game_io_msg);
		}

		CloseDevice((struct IORequest *)game_io_msg);
	}

	if (game_io_msg) DeleteStdIO(game_io_msg);
	if (game_msg_port) DeletePort(game_msg_port);

	GPortOpened = FALSE;
	game_io_msg = NULL;
	game_msg_port = NULL;
}

void gport1_handler(struct in_work *mydata)
{
#if 0
	if (GetMsg(game_msg_port))
	{
		mydata->xjoy = game_event.ie_X;
		mydata->yjoy = game_event.ie_Y;

		switch (game_event.ie_Code)
		{
			case IECODE_LBUTTON:
			mydata->joydown |= JOY_FIRE;
            break;

	        case (IECODE_LBUTTON | IECODE_UP_PREFIX):
			mydata->joydown &= ~JOY_FIRE;
            break;
		}

		send_read_request();
	}
#endif
}

void gport0_handler(struct in_work *mydata,struct InputEvent *ev)
{
	mydata->xjoy = ev->ie_X;
	mydata->yjoy = ev->ie_Y;

	switch (ev->ie_Code)
	{
		case IECODE_LBUTTON:
		mydata->joydown |= JOY_FIRE;
		break;

		case (IECODE_LBUTTON | IECODE_UP_PREFIX):
		mydata->joydown &= ~JOY_FIRE;
        break;
	}
}
