From 372eeb7aa70f1b4ecdbd94dda139260b319c7d03 Mon Sep 17 00:00:00 2001 From: curt Date: Sun, 25 Oct 1998 10:56:25 +0000 Subject: [PATCH] Completely rewritten to use Steve Baker's joystick interface class. --- Joystick/joystick.cxx | 391 +++++++++++++----------------------------- Joystick/joystick.hxx | 105 ++++++------ 2 files changed, 175 insertions(+), 321 deletions(-) diff --git a/Joystick/joystick.cxx b/Joystick/joystick.cxx index 7e2cc2f73..0cba4f6e5 100644 --- a/Joystick/joystick.cxx +++ b/Joystick/joystick.cxx @@ -1,289 +1,144 @@ -/************************************************************************** - * joystick.h -- joystick support - * - * Written by Michele America, started September 1997. - * - * Copyright (C) 1997 Michele F. America - nomimarketing@mail.telepac.pt - * - * 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., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id$ - * (Log is kept at end of this file) - **************************************************************************/ +// joystick.cxx -- joystick support +// +// Written by Curtis Olson, started October 1998. +// +// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu +// +// 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., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ +// (Log is kept at end of this file) -#ifdef HAVE_JOYSTICK - -#include -#include -#include -#include - -#endif - +#include #include +#include -static joy_x_min=0, joy_x_ctr=0, joy_x_max=0; -static joy_y_min=0, joy_y_ctr=0, joy_y_max=0; -static joy_x_dead_min=1000, joy_x_dead_max=-1000; -static joy_y_dead_min=1000, joy_y_dead_max=-1000; +#include "joystick.hxx" -static int joystick_fd; +// joystick classes +static jsJoystick *js0; +static jsJoystick *js1; -int fgJoystickInit( int joy_num ) { +// these will hold the values of the axes +static float *js_ax0, *js_ax1; + + +// Initialize the joystick(s) +int fgJoystickInit( void ) { fgPrintf( FG_INPUT, FG_INFO, "Initializing joystick\n"); -#ifdef HAVE_JOYSTICK - int status; - char *fname; - struct JS_DATA_TYPE js; - int button; + js0 = new jsJoystick ( 0 ); + js1 = new jsJoystick ( 1 ); - /* argument should be 0 or 1 */ - if( joy_num != 1 && joy_num != 0 ) { - perror( "js" ); - return( 1 ); - } + if ( js0->notWorking () ) { + // not working + } else { + // allocate storage for axes values + js_ax0 = new float [ js0->getNumAxes() ]; - /* pick appropriate device file */ - if (joy_num == 0) - fname = "/dev/js0"; - if (joy_num == 1) - fname = "/dev/js1"; + // configure + js0->setDeadBand( 0, 0.1 ); + js0->setDeadBand( 1, 0.1 ); - /* open device file */ - joystick_fd = open(fname, O_RDONLY); - if (joystick_fd < 0) { - perror ("js"); - return( 1 ); - } - - fgPrintf( FG_INPUT,FG_ALERT, - "\nMove joystick around dead spot and press any joystick button.\n" ); - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - button = js.buttons & 1 || js.buttons & 2; - while(button == 0 ) { - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - button = js.buttons & 1 || js.buttons & 2; - if( js.x > joy_x_dead_max ) - joy_x_dead_max = js.x; - if( js.x < joy_x_dead_min ) - joy_x_dead_min = js.x; - if( js.y > joy_y_dead_max ) - joy_y_dead_max = js.y; - if( js.y < joy_y_dead_min ) - joy_y_dead_min = js.y; - - /* printf( "Xmin %d Xmax %d Ymin %d Ymax %d", - joy_x_dead_min, joy_x_dead_max, - joy_y_dead_min, joy_y_dead_max ); */ - } - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - - fgPrintf( FG_INPUT, FG_DEBUG, - "\nJoystick calibration: X_dead_min = %d, X_dead_max = %d\n", - joy_x_dead_min, joy_x_dead_max ); - fgPrintf( FG_INPUT, FG_DEBUG, - " Y_dead_min = %d, Y_dead_max = %d\n", - joy_y_dead_min, joy_y_dead_max ); - - sleep( 1 ); - - fgPrintf( FG_INPUT, FG_DEBUG, - "\nCenter joystick and press any joystick button.\n" ); - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - button = js.buttons & 1 || js.buttons & 2; - while(button == 0 ) { - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - button = js.buttons & 1 || js.buttons & 2; - } - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - joy_x_ctr = js.x; - joy_y_ctr = js.y; - - fgPrintf( FG_INPUT, FG_DEBUG, - "Joystick calibration: X_ctr = %d, Y_ctr = %d\n", - joy_x_ctr, joy_y_ctr ); - - sleep( 1 ); - - fgPrintf( FG_INPUT, FG_DEBUG, - "\nMove joystick to upper left and press any joystick button.\n" ); - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - button = js.buttons & 1 || js.buttons & 2; - while(button == 0 ) { - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - button = js.buttons & 1 || js.buttons & 2; - } - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - joy_x_min = js.x; - joy_y_min = js.y; - fgPrintf( FG_INPUT, FG_DEBUG, - "Joystick calibration: X_min = %d, Y_min = %d\n", - joy_x_min, joy_y_min ); - - sleep( 1 ); - - fgPrintf( FG_INPUT, FG_DEBUG, - "\nMove joystick to lower right and press any joystick button.\n" ); - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - button = js.buttons & 1 || js.buttons & 2; - while(button == 0 ) { - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - button = js.buttons & 1 || js.buttons & 2; - } - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } - joy_x_max = js.x; - joy_y_max = js.y; - - fgPrintf( FG_INPUT, FG_DEBUG, - "Joystick calibration: X_max = %d, Y_max = %d\n", - joy_x_max, joy_y_max ); - - // joy_x_ctr = (joy_x_max-joy_x_min)/2; - // joy_y_ctr = (joy_y_max-joy_y_min)/2; - // printf("Joystick calibration: X_ctr = %d, Y_ctr = %d\n", joy_x_ctr, joy_y_ctr ); - - return( joystick_fd ); -#else - return( 1 ); -#endif -} + fgPrintf ( FG_INPUT, FG_INFO, + " Joystick 0 detected with %d axes\n", + js0->getNumAxes() ); + } -/* void fgJoystickCalibrate( int joy_fd ) -{ + if ( js1->notWorking () ) { + // not working + } else { + // allocate storage for axes values + js_ax1 = new float [ js1->getNumAxes() ]; -} */ + // configure + js1->setDeadBand( 0, 0.1 ); + js1->setDeadBand( 1, 0.1 ); -int fgJoystickRead( double *joy_x, double *joy_y, int *joy_b1, int *joy_b2 ) -{ -#ifdef HAVE_JOYSTICK - struct JS_DATA_TYPE js; - int status; - - status = read(joystick_fd, &js, JS_RETURN); - if (status != JS_RETURN) { - perror("js"); - return( 1 ); - } + fgPrintf ( FG_INPUT, FG_INFO, + " Joystick 1 detected with %d axes\n", + js1->getNumAxes() ); + } - /* printf("\n button 0: %s button 1: %s X position: %4d Y position: %4d\n", - (js.buttons & 1) ? "on " : "off", - (js.buttons & 2) ? "on " : "off", - js.x, - js.y ); */ - - if( js.x >= joy_x_dead_min && js.x <= joy_x_dead_max ) - *joy_x = 0.5; - else - *joy_x = (double)js.x/(double)(joy_x_max-joy_x_min); - *joy_x = *joy_x*2-1; - - if( js.y >= joy_y_dead_min && js.y <= joy_y_dead_max ) - *joy_y = 0.5; - else - *joy_y = (double)js.y/(double)(joy_y_max-joy_y_min); - *joy_y = *joy_y*2-1; - - *joy_b1 = js.buttons & 1; - *joy_b2 = js.buttons & 2; + if ( js0->notWorking() && js1->notWorking() ) { + fgPrintf ( FG_INPUT, FG_INFO, " No joysticks detected\n" ); + return 0; + } -#endif - return( 0 ); + return 1; } -/* $Log$ -/* Revision 1.1 1998/10/24 22:28:16 curt -/* Renamed joystick.[ch] to joystick.[ch]xx -/* Added js.hxx which is Steve's joystick interface class. -/* - * Revision 1.7 1998/04/25 22:06:29 curt - * Edited cvs log messages in source files ... bad bad bad! - * - * Revision 1.6 1998/04/18 04:14:05 curt - * Moved fg_debug.c to it's own library. - * - * Revision 1.5 1998/02/12 21:59:44 curt - * Incorporated code changes contributed by Charlie Hotchkiss - * - * - * Revision 1.4 1998/02/03 23:20:20 curt - * Lots of little tweaks to fix various consistency problems discovered by - * Solaris' CC. Fixed a bug in fg_debug.c with how the fgPrintf() wrapper - * passed arguments along to the real printf(). Also incorporated HUD changes - * by Michele America. - * - * Revision 1.3 1998/01/27 00:47:54 curt - * Incorporated Paul Bleisch's new debug message - * system and commandline/config file processing code. - * - * Revision 1.2 1997/12/30 20:47:40 curt - * Integrated new event manager with subsystem initializations. - * - * Revision 1.1 1997/08/29 18:06:54 curt - * Initial revision. - * - */ +// update the control parameters based on joystick intput +int fgJoystickRead( void ) { + fgCONTROLS *c; + int b; + + c = current_aircraft.controls; + + if ( ! js0->notWorking() ) { + js0->read( &b, js_ax0 ) ; + fgAileronSet( js_ax0[0] ); + fgElevSet( -js_ax0[1] ); + } + + if ( ! js1->notWorking() ) { + js1->read( &b, js_ax1 ) ; + fgRudderSet( js_ax1[0] ); + fgThrottleSet(FG_Throttle_All, -js_ax1[1] * 1.05 ); + } + + return 1; +} + + +// $Log$ +// Revision 1.2 1998/10/25 10:56:25 curt +// Completely rewritten to use Steve Baker's joystick interface class. +// +// Revision 1.1 1998/10/24 22:28:16 curt +// Renamed joystick.[ch] to joystick.[ch]xx +// Added js.hxx which is Steve's joystick interface class. +// +// Revision 1.7 1998/04/25 22:06:29 curt +// Edited cvs log messages in source files ... bad bad bad! +// +// Revision 1.6 1998/04/18 04:14:05 curt +// Moved fg_debug.c to it's own library. +// +// Revision 1.5 1998/02/12 21:59:44 curt +// Incorporated code changes contributed by Charlie Hotchkiss +// +// +// Revision 1.4 1998/02/03 23:20:20 curt +// Lots of little tweaks to fix various consistency problems discovered by +// Solaris' CC. Fixed a bug in fg_debug.c with how the fgPrintf() wrapper +// passed arguments along to the real printf(). Also incorporated HUD changes +// by Michele America. +// +// Revision 1.3 1998/01/27 00:47:54 curt +// Incorporated Paul Bleisch's new debug message +// system and commandline/config file processing code. +// +// Revision 1.2 1997/12/30 20:47:40 curt +// Integrated new event manager with subsystem initializations. +// +// Revision 1.1 1997/08/29 18:06:54 curt +// Initial revision. +// + diff --git a/Joystick/joystick.hxx b/Joystick/joystick.hxx index d26428356..6a47e0d09 100644 --- a/Joystick/joystick.hxx +++ b/Joystick/joystick.hxx @@ -1,62 +1,61 @@ -/************************************************************************** - * joystick.h -- joystick support - * - * Written by Michele America, started September 1997. - * - * Copyright (C) 1997 Michele F. America - nomimarketing@mail.telepac.pt - * - * 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., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id$ - * (Log is kept at end of this file) - **************************************************************************/ +// joystick.cxx -- joystick support +// +// Written by Curtis Olson, started October 1998. +// +// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu +// +// 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., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ +// (Log is kept at end of this file) -#ifndef _JOYSTICK_H -#define _JOYSTICK_H +#ifndef _JOYSTICK_HXX +#define _JOYSTICK_HXX -#ifdef __cplusplus -extern "C" { -#endif - - -int fgJoystickInit( int joy_num ); -int fgJoystickRead( double *joy_x, double *joy_y, int *joy_b1, int *joy_b2 ); - - -#ifdef __cplusplus -} +#ifndef __cplusplus +# error This library requires C++ #endif -#endif /* _JOYSTICK_H */ +// Initialize the joystick(s) +int fgJoystickInit( void ); + +// update the control parameters based on joystick intput +int fgJoystickRead( void ); -/* $Log$ -/* Revision 1.1 1998/10/24 22:28:18 curt -/* Renamed joystick.[ch] to joystick.[ch]xx -/* Added js.hxx which is Steve's joystick interface class. -/* - * Revision 1.3 1998/04/22 13:26:21 curt - * C++ - ifing the code a bit. - * - * Revision 1.2 1998/01/22 02:59:36 curt - * Changed #ifdef FILE_H to #ifdef _FILE_H - * - * Revision 1.1 1997/08/29 18:06:55 curt - * Initial revision. - * - */ +#endif // _JOYSTICK_HXX + + +// $Log$ +// Revision 1.2 1998/10/25 10:56:27 curt +// Completely rewritten to use Steve Baker's joystick interface class. +// +// Revision 1.1 1998/10/24 22:28:18 curt +// Renamed joystick.[ch] to joystick.[ch]xx +// Added js.hxx which is Steve's joystick interface class. +// +// Revision 1.3 1998/04/22 13:26:21 curt +// C++ - ifing the code a bit. +// +// Revision 1.2 1998/01/22 02:59:36 curt +// Changed #ifdef FILE_H to #ifdef _FILE_H +// +// Revision 1.1 1997/08/29 18:06:55 curt +// Initial revision. +// +