ftp.nice.ch/pub/next/tools/emulators/vice.0.15.0.NeXT.sd.tgz#/vice-0.15.0/src/arch/unix/joystick.c

This is joystick.c in view mode; [Download] [Up]

/*
 * joystick.c - Joystick support for Linux.
 *
 * Written by
 *  Bernhard Kuhn    (kuhn@eikon.e-technik.tu-muenchen.de)
 *  Ulmer Lionel     (ulmer@poly.polytechnique.fr)
 *
 * Patches by
 *  Daniel Sladic    (sladic@eecg.toronto.edu)
 *
 * NetBSD support by
 *  Krister Walfridsson (cato@df.lth.se)
 *
 * This file is part of VICE, the Versatile Commodore Emulator.
 * See README for copyright notice.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 *  02111-1307  USA.
 *
 */

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include "vice.h"
#include "types.h"
#include "kbd.h"
#include "resources.h"
#include "cmdline.h"
#include "joystick.h"

int joystick_port_map[2];

/* Resources */

static int joyport1select(resource_value_t v)
{
    joystick_port_map[0] = (int) v;
    return 0;
}

static int joyport2select(resource_value_t v)
{
    joystick_port_map[1] = (int) v;
    return 0;
}


static resource_t resources[] = {
    {"JoyDevice1", RES_INTEGER, (resource_value_t) 0,
     (resource_value_t *) & joystick_port_map[0], joyport1select},
    {"JoyDevice2", RES_INTEGER, (resource_value_t) 0,
     (resource_value_t *) & joystick_port_map[1], joyport2select},
    {NULL},
};

/* Command-line options.  */

static cmdline_option_t cmdline_options[] = {
    {"-joydev1", SET_RESOURCE, 1, NULL, NULL, "JoyDevice1", NULL,
     "<0-5>", "Set device for joystick port 1"},
    {"-joydev2", SET_RESOURCE, 1, NULL, NULL, "JoyDevice2", NULL,
     "<0-5>", "Set device for joystick port 2"},
    {NULL},
};

int joystick_init_resources(void)
{
    return resources_register(resources);
}

int joystick_init_cmdline_options(void)
{
    return cmdline_register_options(cmdline_options);
}


#ifdef HAS_JOYSTICK

#ifdef LINUX_JOYSTICK
#include <linux/joystick.h>
#elif defined(BSD_JOYSTICK)
#include <machine/joystick.h>
#define JS_DATA_TYPE joystick
#define JS_RETURN    sizeof(struct joystick)
#elif
#error Unknown Joystick
#endif

int ajoyfd[2] = {-1, -1};
int djoyfd[2] = {-1, -1};

#define JOYCALLOOPS 100
#define JOYSENSITIVITY 5
int joyxcal[2];
int joyycal[2];
int joyxmin[2];
int joyxmax[2];
int joyymin[2];
int joyymax[2];

void joystick_init(void)
{
    int i;

    /* close all device files */
    for (i = 0; i < 2; i++) {
	if (ajoyfd[i] != -1)
	    close(ajoyfd[i]);
	if (djoyfd[i] != -1)
	    close(djoyfd[i]);
    }

    /* open analog device files */
    for (i = 0; i < 2; i++) {

	char *dev;
#ifdef LINUX_JOYSTICK
	dev = (i == 0) ? "/dev/js0" : "/dev/js1";
#elif defined(BSD_JOYSTICK)
	dev = (i == 0) ? "/dev/joy0" : "/dev/joy1";
#endif

	ajoyfd[i] = open(dev, O_RDONLY);
	if (ajoyfd[i] < 0) {
	    fprintf(stderr, "Warning: couldn't open the joystick device %s!\n", dev);
	} else {
	    int j;

	    /* calibration loop */
	    for (j = 0; j < JOYCALLOOPS; j++) {
		struct JS_DATA_TYPE js;
		int status = read(ajoyfd[i], &js, JS_RETURN);

		if (status != JS_RETURN) {
		    fprintf(stderr, "Warning: error reading the joystick device%s!\n",
			    dev);
		} else {
		    /* determine average */
		    joyxcal[i] += js.x;
		    joyycal[i] += js.y;
		}
	    }

	    /* correct average */
	    joyxcal[i] /= JOYCALLOOPS;
	    joyycal[i] /= JOYCALLOOPS;

	    /* determine treshoulds */
	    joyxmin[i] = joyxcal[i] - joyxcal[i] / JOYSENSITIVITY;
	    joyxmax[i] = joyxcal[i] + joyxcal[i] / JOYSENSITIVITY;
	    joyymin[i] = joyycal[i] - joyycal[i] / JOYSENSITIVITY;
	    joyymax[i] = joyycal[i] + joyycal[i] / JOYSENSITIVITY;

	    printf("hardware joystick calibration %s:\n", dev);
	    printf("X: min: %i , mid: %i , max: %i\n", joyxmin[i], joyxcal[i],
		   joyxmax[i]);
	    printf("Y: min: %i , mid: %i , max: %i\n", joyymin[i], joyycal[i],
		   joyymax[i]);
	}
    }

#ifdef HAS_DIGITAL_JOYSTICK
    /* open device files for digital joystick */
    for (i = 0; i < 2; i++) {
	char *dev;
	dev = (i == 0) ? "/dev/djs0" : "/dev/djs1";

	djoyfd[i] = open(dev, O_RDONLY);
	if (djoyfd[i] < 0) {
	    fprintf(stderr, "Warning: couldn't open the joystick device %s!\n", dev);
	}
    }
#endif
}

void joystick_close(void)
{
    if (ajoyfd[0] > 0)
	close(ajoyfd[0]);
    if (ajoyfd[1] > 0)
	close(ajoyfd[1]);
    if (djoyfd[0] > 0)
	close(djoyfd[0]);
    if (djoyfd[1] > 0)
	close(djoyfd[1]);
}

void joystick(void)
{
    int i;

    for (i = 1; i <= 2; i++) {
	int joyport = joystick_port_map[i - 1];

#ifdef HAS_DIGITAL_JOYSTICK
	if (joyport == JOYDEV_DIGITAL_0 || joyport == JOYDEV_DIGITAL_1) {
	    int status;
	    struct DJS_DATA_TYPE djs;
	    int djoyport = joyport - JOYDEV_DIGITAL_0;

	    if (djoyfd[djoyport] > 0) {
		status = read(djoyfd[djoyport], &djs, DJS_RETURN);
		if (status != DJS_RETURN) {
		    fprintf(stderr,
			    "Warning: error reading the digital joystick device!\n");
		} else {
		    joy[2 - i] = ((joy[2 - i] & 0xe0)
				  | ((~(djs.switches >> 3)) & 0x1f));
		}
	    }
	} else
#endif
	if (joyport == JOYDEV_ANALOG_0 || joyport == JOYDEV_ANALOG_1) {
	    int status;
	    struct JS_DATA_TYPE js;
	    int ajoyport = joyport - JOYDEV_ANALOG_0;

	    if (ajoyfd[ajoyport] > 0) {
		status = read(ajoyfd[ajoyport], &js, JS_RETURN);
		if (status != JS_RETURN) {
		    fprintf(stderr, "Warning: error reading the joystick device!\n");
		} else {
		    joy[i] = 0;

		    if (js.y < joyymin[ajoyport])
			joy[i] |= 1;
		    if (js.y > joyymax[ajoyport])
			joy[i] |= 2;
		    if (js.x < joyxmin[ajoyport])
			joy[i] |= 4;
		    if (js.x > joyxmax[ajoyport])
			joy[i] |= 8;
#ifdef LINUX_JOYSTICK
		    if (js.buttons)
			joy[i] |= 16;
#elif defined(BSD_JOYSTICK)
		    if (js.b1 || js.b2)
			joy[i] |= 16;
#endif
		}
	    }
	}
    }
}

#else

void joystick_init(void)
{
}

void joystick_close(void)
{
}

#endif				/* HAS_JOYSTICK */

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.