X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInput%2FFGLinuxEventInput.cxx;h=86c04494ea4200826ca7f3e0d7d0907780ebbd04;hb=f1d0ac52a6155fd511f6dc7bc18642353a0ccea9;hp=621e15fd8b41a9d5994ab96139385a160f5c2ff8;hpb=02fb83c774020633cb62e3b8154337510bed1de3;p=flightgear.git diff --git a/src/Input/FGLinuxEventInput.cxx b/src/Input/FGLinuxEventInput.cxx index 621e15fd8..86c04494e 100644 --- a/src/Input/FGLinuxEventInput.cxx +++ b/src/Input/FGLinuxEventInput.cxx @@ -17,13 +17,18 @@ // 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -// $Id$ #ifdef HAVE_CONFIG_H # include #endif +#include +#include +#include +#include +#include +#include +#include #include "FGLinuxEventInput.hxx" #include @@ -31,6 +36,7 @@ #include #include +#include struct TypeCode { unsigned type; @@ -275,9 +281,9 @@ FGLinuxInputDevice::FGLinuxInputDevice() : { } -static inline bool bitSet( unsigned char * buf, unsigned char bit ) +static inline bool bitSet( unsigned char * buf, unsigned bit ) { - return (buf[bit/sizeof(bit)/8] >> (bit%(sizeof(bit)*8))) & 1; + return (buf[bit/sizeof(unsigned char)/8] >> (bit%(sizeof(unsigned char)*8))) & 1; } void FGLinuxInputDevice::Open() @@ -291,19 +297,77 @@ void FGLinuxInputDevice::Open() SG_LOG( SG_INPUT, SG_WARN, "Can't grab " << devname << " for exclusive access" ); } - unsigned char buf[ABS_CNT/sizeof(unsigned char)/8]; - // get axes maximums - if( ioctl( fd, EVIOCGBIT(EV_ABS,ABS_MAX), buf ) == -1 ) { - SG_LOG( SG_INPUT, SG_WARN, "Can't get abs-axes for " << devname ); - } else { - for( unsigned i = 0; i < ABS_MAX; i++ ) { - if( bitSet( buf, i ) ) { - struct input_absinfo ai; - if( ioctl(fd, EVIOCGABS(i), &ai) == -1 ) { - SG_LOG( SG_INPUT, SG_WARN, "Can't get abs-axes maximums for " << devname ); - continue; + { + unsigned char buf[ABS_CNT/sizeof(unsigned char)/8]; + // get axes maximums + if( ioctl( fd, EVIOCGBIT(EV_ABS,ABS_MAX), buf ) == -1 ) { + SG_LOG( SG_INPUT, SG_WARN, "Can't get abs-axes for " << devname ); + } else { + for( unsigned i = 0; i < ABS_MAX; i++ ) { + if( bitSet( buf, i ) ) { + struct input_absinfo ai; + if( ioctl(fd, EVIOCGABS(i), &ai) == -1 ) { + SG_LOG( SG_INPUT, SG_WARN, "Can't get abs-axes maximums for " << devname ); + continue; + } + absinfo[i] = ai; +/* + SG_LOG( SG_INPUT, SG_INFO, "Axis #" << i << + ": value=" << ai.value << + ": minimum=" << ai.minimum << + ": maximum=" << ai.maximum << + ": fuzz=" << ai.fuzz << + ": flat=" << ai.flat << + ": resolution=" << ai.resolution ); +*/ + + // kick an initial event + struct input_event event; + event.type = EV_ABS; + event.code = i; + event.value = ai.value; + FGLinuxEventData eventData( event, 0, 0 ); + eventData.value = Normalize( event ); + HandleEvent(eventData); + } + } + } + } + { + unsigned char mask[KEY_CNT/sizeof(unsigned char)/8]; + unsigned char flag[KEY_CNT/sizeof(unsigned char)/8]; + memset(mask,0,sizeof(mask)); + memset(flag,0,sizeof(flag)); + if( ioctl( fd, EVIOCGKEY(sizeof(flag)), flag ) == -1 || + ioctl( fd, EVIOCGBIT(EV_KEY, sizeof(mask)), mask ) == -1 ) { + SG_LOG( SG_INPUT, SG_WARN, "Can't get keys for " << devname ); + } else { + for( unsigned i = 0; i < KEY_MAX; i++ ) { + if( bitSet( mask, i ) ) { + struct input_event event; + event.type = EV_KEY; + event.code = i; + event.value = bitSet(flag,i); + FGLinuxEventData eventData( event, 0, 0 ); + HandleEvent(eventData); + } + } + } + } + { + unsigned char buf[SW_CNT/sizeof(unsigned char)/8]; + if( ioctl( fd, EVIOCGSW(sizeof(buf)), buf ) == -1 ) { + SG_LOG( SG_INPUT, SG_WARN, "Can't get switches for " << devname ); + } else { + for( unsigned i = 0; i < SW_MAX; i++ ) { + if( bitSet( buf, i ) ) { + struct input_event event; + event.type = EV_SW; + event.code = i; + event.value = 1; + FGLinuxEventData eventData( event, 0, 0 ); + HandleEvent(eventData); } - absinfo[i] = ai; } } } @@ -512,3 +576,4 @@ void FGLinuxEventInput::update( double dt ) } } } +