X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInput%2FFGLinuxEventInput.cxx;h=86c04494ea4200826ca7f3e0d7d0907780ebbd04;hb=f1d0ac52a6155fd511f6dc7bc18642353a0ccea9;hp=183c7b3ab805c319b84bee27b0c3de372d611ac6;hpb=02c75ba583bdb1ded2565edc31cefaf093b057bd;p=flightgear.git diff --git a/src/Input/FGLinuxEventInput.cxx b/src/Input/FGLinuxEventInput.cxx index 183c7b3ab..86c04494e 100644 --- a/src/Input/FGLinuxEventInput.cxx +++ b/src/Input/FGLinuxEventInput.cxx @@ -17,18 +17,26 @@ // 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 #include #include +#include + +#include struct TypeCode { unsigned type; @@ -238,7 +246,7 @@ static EventNameByType EVENT_NAME_BY_TYPE; struct ltstr { bool operator()(const char * s1, const char * s2 ) const { - return strcmp( s1, s2 ) < 0; + return string(s1).compare( s2 ) < 0; } }; @@ -273,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() @@ -289,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; } } } @@ -510,3 +576,4 @@ void FGLinuxEventInput::update( double dt ) } } } +