/* $Id$ */ /* Kontrola za pomocą joysticka */ /* Kontrola za pomocą klawiatury */ #include #include #include #include #include #include "JoyControl.h" /* Otwórz urządzenie */ struct IORequest *devOpen(STRPTR name, UBYTE unit, ULONG size) { struct MsgPort *mp; struct IORequest *io; if (mp = CreateMsgPort()) { if (io = CreateIORequest(mp, size)) { if (!OpenDevice(name, unit, io, 0L)) { return(io); } DeleteIORequest(io); } DeleteMsgPort(mp); } return(NULL); } /* Zamknij urządzenie */ void devClose(struct IORequest *io) { struct MsgPort *mp = io->io_Message.mn_ReplyPort; if (CheckIO(io) == NULL) AbortIO(io); WaitIO(io); CloseDevice(io); DeleteIORequest(io); DeleteMsgPort(mp); } /* Wykonaj akcję */ void doIO(struct IOStdReq *io, WORD cmd, APTR data, ULONG size, LONG flags) { io->io_Command = cmd; io->io_Data = data; io->io_Length = size; io->io_Flags = flags; DoIO((struct IORequest *)io); } /* Wyślij akcję */ void sendIO(struct IOStdReq *io, WORD cmd, APTR data, ULONG size, LONG flags) { io->io_Command = cmd; io->io_Data = data; io->io_Length = size; io->io_Flags = flags; SendIO((struct IORequest *)io); } /* Ustaw kontroler */ void setCtrl(struct IOStdReq *io, UBYTE ctrl) { doIO(io, GPD_SETCTYPE, &ctrl, sizeof(ctrl), IOF_QUICK); } /* Zapytaj o kontroler */ UBYTE askCtrl(struct IOStdReq *io) { UBYTE ctrl; doIO(io, GPD_ASKCTYPE, &ctrl, sizeof(ctrl), IOF_QUICK); return(ctrl); } /* Zapytaj i ustaw kontroler, gdy wolny */ BOOL checkCtrl(struct IOStdReq *io, UBYTE ctrl) { BOOL ok = FALSE; UBYTE prev; Forbid(); if ((prev = askCtrl(io)) == GPCT_NOCONTROLLER) { ok = TRUE; setCtrl(io, ctrl); } Permit(); return(ok); } /* Ustaw trigger */ void setTrigger(struct IOStdReq *io, struct GamePortTrigger *gpt) { doIO(io, GPD_SETTRIGGER, gpt, sizeof(*gpt), IOF_QUICK); } /* Pobierz standardowy trigger */ struct GamePortTrigger *stdTrigger(WORD timeout) { static struct GamePortTrigger gpt; gpt.gpt_Keys = GPTF_DOWNKEYS|GPTF_UPKEYS; gpt.gpt_XDelta = 1; gpt.gpt_YDelta = 1; gpt.gpt_Timeout = timeout; return(&gpt); } /* Wyczyść status */ void clearIO(struct IOStdReq *io) { doIO(io, CMD_CLEAR, NULL, 0, IOF_QUICK); } /* Wyślij prośbę o zapisanie statusu joysticka */ void readEvent(struct IOStdReq *io, struct InputEvent *ie) { sendIO(io, GPD_READEVENT, ie, sizeof(*ie), 0); } /* Otwórz joystick */ struct IOStdReq *joyOpen(struct InputEvent *ie, WORD timeout) { struct IOStdReq *io; if (io = (struct IOStdReq *)devOpen("gameport.device", 1, sizeof(*io))) { if (checkCtrl(io, GPCT_ABSJOYSTICK)) { setTrigger(io, stdTrigger(timeout)); clearIO(io); readEvent(io, ie); return(io); } devClose((struct IORequest *)io); } return(NULL); } /* Zamknij joystick */ void joyClose(struct IOStdReq *io) { if (CheckIO((struct IORequest *)io) == NULL) AbortIO((struct IORequest *)io); WaitIO((struct IORequest *)io); setCtrl(io, GPCT_NOCONTROLLER); devClose((struct IORequest *)io); } /* Otwórz klawiaturę */ struct IOStdReq *keyboardOpen(struct inputDataMessage *idm, struct Interrupt *is) { struct IOStdReq *io; idm->counter = 0; if (io = (struct IOStdReq *)devOpen("input.device", 0, sizeof(*io))) { is->is_Code = (void(*)())keyboardHandler; is->is_Data = (APTR)idm; is->is_Node.ln_Pri = 100; is->is_Node.ln_Name = "Game handler"; io->io_Data = (APTR)is; io->io_Command = IND_ADDHANDLER; DoIO((struct IORequest *)io); return(io); } return(NULL); } /* Zamknij klawiaturę */ void keyboardClose(struct IOStdReq *io, struct Interrupt *is) { io->io_Data = (APTR)is; io->io_Command = IND_REMHANDLER; DoIO((struct IORequest *)io); devClose((struct IORequest *)io); }