Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

inputDeviceJoystick.cpp

Go to the documentation of this file.
00001 /********************************************************************
00002 Description: joystick plug-in
00003 part of the 3Dsia project
00004 created: StonedBones, 26.2.2000
00005 
00006 History:
00007     date,   name,       changes,                    in funtion
00008     260200  StonedBones created source
00009 
00010 ********************************************************************/
00011 
00012 
00013 
00014 #include "inputDeviceJoystick.h"
00015 
00016 #include <unistd.h>
00017 #include <stdio.h>
00018 #include <linux/joystick.h>
00019 #include <sys/ioctl.h>
00020 #include <fcntl.h>
00021 #include <errno.h>
00022 #include <string.h>
00023 
00024 int joyHandle;
00025 bool    isPresent;
00026 struct js_event jsEvent;
00027 int intAxes;
00028 int intButtons;
00029 long    intAxis[MAXAXES];
00030 long    maxAxis[MAXAXES];
00031 bool    intButton[MAXBUTTONS];
00032 string  intName;
00033 
00034 /*...................................................................
00035 Description: returns the actual plugin
00036 Args: <none>
00037 Returns: plug-in pointer
00038 Created: StonedBones, 26.2.2000
00039 [ToDo:]
00040 [Comments:]
00041 Changes:
00042 -------------------------------------------------------------------*/
00043 
00044 extern "C" {DevicePlugIn* GetDevicePlugIn (void); };
00045 
00046 DevicePlugIn* GetDevicePlugIn () {
00047     return &inputPlugIn;
00048 };
00049 
00050 /*...................................................................
00051 Description: opens a joystick device
00052 Args: char* device: device-filename
00053 Returns: true on succes
00054 Created: StonedBones, 26.2.2000
00055 [ToDo:]
00056 [Comments:]
00057 Changes:
00058 -------------------------------------------------------------------*/
00059 
00060 bool openDevice () {
00061     for (int i = 1; i <= MAXAXES; i++) {
00062     intAxis[i]=0;
00063     maxAxis[i]=1;
00064     };
00065     
00066     joyHandle = open ("/dev/js0", O_RDONLY | O_NONBLOCK);
00067     
00068     if (joyHandle) {
00069     isPresent = true;
00070     } else {
00071     isPresent = false;
00072     return false;
00073     };
00074     
00075     char tmp[128];
00076     
00077     ioctl (joyHandle, JSIOCGAXES, &intAxes);
00078     ioctl (joyHandle, JSIOCGBUTTONS, &intButtons);
00079     ioctl (joyHandle, JSIOCGNAME(128), tmp);
00080     
00081     intName.assign (tmp);
00082 
00083     for (int i=0; i < intAxes; i++) {
00084     intAxis[i]=0;
00085     };
00086     for (int i=0; i < intButtons; i++) {
00087     intButton[i]=false;
00088     };
00089     
00090     update ();
00091     return true;
00092 };
00093 
00094 /*...................................................................
00095 Description: closes device if open
00096 Args: <none>
00097 Returns: <none>
00098 Created: StonedBones, 26.2.2000
00099 [ToDo:]
00100 [Comments:]
00101 Changes:
00102 -------------------------------------------------------------------*/
00103 
00104 void closeDevice () {
00105     close (joyHandle);
00106     return;
00107 };
00108 
00109 /*...................................................................
00110 Description: updates axis(int nr) and buttonPressed (int nr)
00111 Args:  <none>
00112 Returns: true on success
00113 Created: StonedBones, 26.2.2000
00114 [ToDo:]
00115 [Comments:]
00116 Changes:
00117 -------------------------------------------------------------------*/
00118 
00119 bool update () {
00120     if (isPresent) {
00121 
00122     read (joyHandle, &jsEvent, sizeof (struct js_event));
00123     
00124         switch (jsEvent.type) {
00125         case 1 : {  if (jsEvent.value == 1) {
00126                 intButton[jsEvent.number]=true;
00127             } else {
00128                 intButton[jsEvent.number]=false;
00129             };
00130             break;
00131              };
00132         case 2 : {  intAxis[jsEvent.number] = jsEvent.value;
00133             break;
00134              };
00135         case 129:
00136         case 130:   break;
00137         default: {  printf ("unhandled InputDeviceJoystick event: type=%i, number=%i, value=%i\n", jsEvent.type, jsEvent.number, jsEvent.value);
00138             break;
00139              };
00140     };
00141     return true;
00142     } else return false;
00143 };
00144 
00145 /*...................................................................
00146 Description: returns the joystick name (given by kernel-module)
00147 Args: <none>
00148 Returns: NULL if no joystick was opened
00149 Created: StonedBones, 26.2.2000
00150 [ToDo:]
00151 [Comments:]
00152 Changes:
00153 -------------------------------------------------------------------*/
00154 
00155 string name () {
00156     if (isPresent) {
00157     return intName;
00158     } else return "none found";
00159 };
00160 
00161 /*...................................................................
00162 Description: returns the amount of axes
00163 Args: <none>
00164 Returns: 0 if no joystick present
00165 Created: StonedBones, 26.2.2000
00166 [ToDo:]
00167 [Comments:]
00168 Changes:
00169 -------------------------------------------------------------------*/
00170 
00171 int axes () {
00172     if (isPresent) {
00173     return intAxes;
00174     } else return 0;
00175 };
00176 
00177 /*...................................................................
00178 Description: returns the amount of buttons
00179 Args: <none>
00180 Returns: 0 if no joystick present
00181 Created: StonedBones, 26.2.2000
00182 [ToDo:]
00183 [Comments:]
00184 Changes:
00185 -------------------------------------------------------------------*/
00186 
00187 int buttons () {
00188     if (isPresent) {
00189     return intButtons;
00190     } else return 0;
00191 };
00192 
00193 /*...................................................................
00194 Description: returns the value of axis 'nr'
00195 Args: int nr: axis-number
00196 Returns: axis-value
00197 Created: StonedBones, 26.2.2000
00198 [ToDo:]
00199 [Comments:]
00200 Changes:
00201 -------------------------------------------------------------------*/
00202 
00203 long axis (int nr) {
00204     if (isPresent) {
00205     if (nr < intAxes) {
00206         return (intAxis[nr]);
00207     } else {
00208         return 0;
00209     };
00210     } else {
00211     return 0;
00212     };
00213 };
00214 
00215 /*...................................................................
00216 Description: returns if a certain button is pressed
00217 Args: int nr: button-number
00218 Returns: true if pressed
00219 Created: StonedBones, 26.2.2000
00220 [ToDo:]
00221 [Comments:]
00222 Changes:
00223 -------------------------------------------------------------------*/
00224 
00225 bool buttonPressed (int nr) {
00226     if (isPresent) {
00227     if (nr < intButtons) {
00228         return intButton[nr];
00229     } else {
00230         return false;
00231     };
00232     } else {
00233     return false;
00234     };
00235 };
00236 

Generated at Sat May 13 13:50:19 2000 for 3Dsia by doxygen 1.1.2 written by Dimitri van Heesch, © 1997-2000