# # Patch managed by http://www.holgerschurig.de/patcher.html # --- qt-2.3.10/src/kernel/qwsmouse_qws.cpp~ramses-touchscreen +++ qt-2.3.10/src/kernel/qwsmouse_qws.cpp @@ -1,5 +1,5 @@ /**************************************************************************** -** $Id: qt/src/kernel/qwsmouse_qws.cpp 2.3.10 edited 2005-01-24 $ +** $Id: qt/src/kernel/qwsmouse_qws.cpp 2.3.7 edited 2003-02-04 $ ** ** Implementation of Qt/Embedded mouse drivers ** @@ -47,85 +47,32 @@ #include #include #include -#include #include #include #include #include #include + #include #if !defined(_OS_QNX6_) -#ifdef QT_QWS_CASSIOPEIA -#include -#endif -#ifdef QT_QWS_TSLIB -#include -#endif - - -//#define QT_QWS_K2 - -#if defined(QT_QWS_IPAQ) || defined(QT_QWS_K2) -#define QT_QWS_IPAQ_RAW -typedef struct { - unsigned short pressure; - unsigned short x; - unsigned short y; - unsigned short pad; - struct timeval stamp; -} TS_EVENT; -#elif defined(QT_QWS_SL5XXX) -#define QT_QWS_SL5XXX_RAW -typedef struct { - long y; - long x; - long pressure; - long long millisecs; -} TS_EVENT; -#define QT_QWS_TP_SAMPLE_SIZE 10 -#define QT_QWS_TP_MINIMUM_SAMPLES 4 -#define QT_QWS_TP_PRESSURE_THRESHOLD 500 -#define QT_QWS_TP_MOVE_LIMIT 50 -#define QT_QWS_TP_JITTER_LIMIT 2 -#elif defined(QT_QWS_SLC700) -#define QT_QWS_SLC700_RAW -typedef struct { - unsigned short pressure; - unsigned short x; - unsigned short y; - unsigned short millisecs; -} TS_EVENT; -#define QT_QWS_TP_SAMPLE_SIZE 10 -#define QT_QWS_TP_MINIMUM_SAMPLES 4 -#define QT_QWS_TP_PRESSURE_THRESHOLD 500 -#define QT_QWS_TP_MOVE_LIMIT 50 -#define QT_QWS_TP_JITTER_LIMIT 2 -#endif - -#ifndef QT_QWS_TP_SAMPLE_SIZE -#define QT_QWS_TP_SAMPLE_SIZE 5 -#endif - -#ifndef QT_QWS_TP_MINIMUM_SAMPLES -#define QT_QWS_TP_MINIMUM_SAMPLES 5 +#ifndef QT_QWS_TP_PRESSURE_DOWN_THRESHOLD +#define QT_QWS_TP_PRESSURE_DOWN_THRESHOLD 500 #endif -#ifndef QT_QWS_TP_PRESSURE_THRESHOLD -#define QT_QWS_TP_PRESSURE_THRESHOLD 1 +#ifndef QT_QWS_TP_PRESSURE_UP_THRESHOLD +#define QT_QWS_TP_PRESSURE_UP_THRESHOLD 450 #endif -#ifndef QT_QWS_TP_MOVE_LIMIT -#define QT_QWS_TP_MOVE_LIMIT 100 +#ifndef QT_QWS_TP_TABLE_SIZE +#define QT_QWS_TP_TABLE_SIZE 2 #endif -#ifndef QT_QWS_TP_JITTER_LIMIT -#define QT_QWS_TP_JITTER_LIMIT 2 +#ifndef QT_QWS_TP_MOVE_MAX +#define QT_QWS_TP_MOVE_MAX 100 #endif -//#define QWS_CUSTOMTOUCHPANEL - /*! \class QWSMouseHandler qwsmouse_qws.h \brief Mouse driver/handler for Qt/Embedded @@ -168,8 +115,7 @@ enum MouseProtocol { Unknown = -1, Auto = 0, MouseMan, IntelliMouse, Microsoft, QVFBMouse, TPanel, BusMouse, - FirstAuto = MouseMan, - LastAuto = Microsoft }; + }; static void limitToScreen( QPoint &pt ) { @@ -186,810 +132,14 @@ } MouseConfig; static const MouseConfig mouseConfig[] = { -#ifndef QT_NO_QWS_MOUSE_AUTO { "Auto", Auto }, -#endif -#ifndef QT_NO_QWS_MOUSE_PC - { "MouseMan", MouseMan }, - { "IntelliMouse", IntelliMouse }, - { "USB", IntelliMouse }, - { "Microsoft", Microsoft }, -#endif -#ifndef QT_NO_QWS_VFB { "QVFbMouse", QVFBMouse }, -#endif { "TPanel", TPanel }, - { "BusMouse", BusMouse }, { 0, Unknown } }; -#ifndef QT_NO_QWS_MOUSE_AUTO -/* - * Automatic-detection mouse driver - */ - -class QAutoMouseSubHandler { -protected: - enum { max_buf=32 }; - - int fd; - - uchar buffer[max_buf]; - int nbuf; - - QPoint motion; - int bstate; - - int goodness; - int badness; - - virtual int tryData()=0; - -public: - QAutoMouseSubHandler(int f) : fd(f) - { - nbuf = bstate = goodness = badness = 0; - } - - int file() const { return fd; } - - void closeIfNot(int& f) - { - if ( fd != f ) { - f = fd; - close(fd); - } - } - - void worse(int by=1) { badness+=by; } - bool reliable() const { return goodness >= 5 && badness < 50; } - int buttonState() const { return bstate; } - bool motionPending() const { return motion!=QPoint(0,0); } - QPoint takeMotion() { QPoint r=motion; motion=QPoint(0,0); return r; } - - void appendData(uchar* data, int length) - { - memcpy(buffer+nbuf, data, length); - nbuf += length; - } - - enum UsageResult { Insufficient, Motion, Button }; - - UsageResult useData() - { - int pbstate = bstate; - int n = tryData(); - if ( n > 0 ) { - if ( n 0 ) { - goodness = 10; - switch ( reply[n-1] ) { - case 3: - case 4: - packetsize = 4; - break; - default: - packetsize = 3; - } - } else { - badness = 100; - } - } - - int tryData() - { - if ( nbuf >= packetsize ) { - //int overflow = (buffer[0]>>6 )& 0x03; - - if ( /*overflow ||*/ !(buffer[0] & 8) ) { - badness++; - return 1; - } else { - motion += - QPoint((buffer[0] & 0x10) ? buffer[1]-256 : buffer[1], - (buffer[0] & 0x20) ? 256-buffer[2] : -buffer[2]); - int nbstate = buffer[0] & 0x7; - if ( motion.x() || motion.y() || bstate != nbstate ) { - bstate = nbstate; - goodness++; - } else { - badness++; - return 1; - } - } - return packetsize; - } - return 0; - } -}; - -class QAutoMouseSubHandler_serial : public QAutoMouseSubHandler { -public: - QAutoMouseSubHandler_serial(int f) : QAutoMouseSubHandler(f) - { - initSerial(); - } - -protected: - void setflags(int f) - { - termios tty; - tcgetattr(fd, &tty); - tty.c_iflag = IGNBRK | IGNPAR; - tty.c_oflag = 0; - tty.c_lflag = 0; - tty.c_cflag = f | CREAD | CLOCAL | HUPCL; -#if !defined(_OS_FREEBSD_) && !defined(_OS_SOLARIS_) - tty.c_line = 0; -#endif - tty.c_cc[VTIME] = 0; - tty.c_cc[VMIN] = 1; - tcsetattr(fd, TCSANOW, &tty); - } - -private: - void initSerial() - { - int speed[4] = { B9600, B4800, B2400, B1200 }; - - for (int n = 0; n < 4; n++) { - setflags(CSTOPB | speed[n]); - write(fd, "*q", 2); - usleep(10000); - } - } -}; - -class QAutoMouseSubHandler_mousesystems : public QAutoMouseSubHandler_serial { -public: - // ##### This driver has not been tested - - QAutoMouseSubHandler_mousesystems(int f) : QAutoMouseSubHandler_serial(f) - { - init(); - } - - void init() - { - setflags(B1200|CS8|CSTOPB); - // 60Hz - if (write(fd, "R", 1)!=1) { - badness = 100; - return; - } - tcflush(fd,TCIOFLUSH); - } - - int tryData() - { - if ( nbuf >= 5 ) { - if ( (buffer[0] & 0xf8) != 0x80 ) { - badness++; - return 1; - } - motion += - QPoint((signed char)buffer[1] + (signed char)buffer[3], - -(signed char)buffer[2] + (signed char)buffer[4]); - int t = ~buffer[0]; - int nbstate = ((t&3) << 1) | ((t&4) >> 2); - if ( motion.x() || motion.y() || bstate != nbstate ) { - bstate = nbstate; - goodness++; - } else { - badness++; - return 1; - } - return 5; - } - return 0; - } -}; - -class QAutoMouseSubHandler_ms : public QAutoMouseSubHandler_serial { - int mman; -public: - QAutoMouseSubHandler_ms(int f) : QAutoMouseSubHandler_serial(f) - { - mman=0; - init(); - } - - void init() - { - setflags(B1200|CS7); - // 60Hz - if (write(fd, "R", 1)!=1) { - badness = 100; - return; - } - tcflush(fd,TCIOFLUSH); - } - - int tryData() - { - if ( !(buffer[0] & 0x40) ) { - if ( buffer[0] == 0x20 && (bstate & Qt::MidButton) ) { - mman=1; // mouseman extension - } - return 1; - } - int extra = mman&&(bstate & Qt::MidButton); - if ( nbuf >= 3+extra ) { - int nbstate = 0; - if ( buffer[0] == 0x40 && !bstate && !buffer[1] && !buffer[2] ) { - nbstate = Qt::MidButton; - } else { - nbstate = ((buffer[0] & 0x20) >> 5) - | ((buffer[0] & 0x10) >> 3); - if ( extra && buffer[3] == 0x20 ) - nbstate = Qt::MidButton; - } - - if ( buffer[1] & 0x40 ) { - badness++; - return 1; - } else { - motion += - QPoint((signed char)((buffer[0]&0x3)<<6) - |(signed char)(buffer[1]&0x3f), - (signed char)((buffer[0]&0xc)<<4) - |(signed char)(buffer[2]&0x3f)); - if ( motion.x() || motion.y() || bstate != nbstate ) { - bstate = nbstate; - goodness++; - } else { - badness++; - return 1; - } - return 3+extra; - } - } - return 0; - } -}; - -/* -QAutoMouseHandler::UsageResult QAutoMouseHandler::useDev(Dev& d) -{ - if ( d.nbuf >= mouseData[d.protocol].bytesPerPacket ) { - uchar *mb = d.buf; - int bstate = 0; - int dx = 0; - int dy = 0; - - switch (mouseProtocol) { - case MouseMan: - case IntelliMouse: - { - bstate = mb[0] & 0x7; // assuming Qt::*Button order - - int overflow = (mb[0]>>6 )& 0x03; - if (mouseProtocol == MouseMan && overflow) { - //### wheel events signalled with overflow bit, ignore for now - } - else { - bool xs = mb[0] & 0x10; - bool ys = mb[0] & 0x20; - dx = xs ? mb[1]-256 : mb[1]; - dy = ys ? mb[2]-256 : mb[2]; - } - break; - } - case Microsoft: - if ( ((mb[0] & 0x20) >> 3) ) { - bstate |= Qt::LeftButton; - } - if ( ((mb[0] & 0x10) >> 4) ) { - bstate |= Qt::RightButton; - } - - dx=(signed char)(((mb[0] & 0x03) << 6) | (mb[1] & 0x3f)); - dy=-(signed char)(((mb[0] & 0x0c) << 4) | (mb[2] & 0x3f)); - - break; - } - } - } -*/ - -#endif - -class QAutoMouseHandler : public QWSMouseHandler { - Q_OBJECT - -public: - QAutoMouseHandler(); - ~QAutoMouseHandler(); - -#ifndef QT_NO_QWS_MOUSE_AUTO -private: - enum { max_dev=32 }; - QAutoMouseSubHandler *sub[max_dev]; - QList notifiers; - int nsub; - int retries; -#endif - -private slots: - void readMouseData(int); - -private: -#ifndef QT_NO_QWS_MOUSE_AUTO - void openDevices(); - void closeDevices(); - void notify(int fd); - bool sendEvent(QAutoMouseSubHandler& h) - { - if ( h.reliable() ) { - mousePos += h.takeMotion(); - limitToScreen( mousePos ); -/* -qDebug("%d,%d %c%c%c", -mousePos.x(),mousePos.y(), -(h.buttonState()&Qt::LeftButton)?'L':'.', -(h.buttonState()&Qt::MidButton)?'M':'.', -(h.buttonState()&Qt::RightButton)?'R':'.'); -*/ - emit mouseChanged(mousePos,h.buttonState()); - return TRUE; - } else { - h.takeMotion(); - if ( h.buttonState() & (Qt::RightButton|Qt::MidButton) ) { - // Strange for the user to press right or middle without - // a moving mouse! - h.worse(); - } - return FALSE; - } - } -#endif -}; - -QAutoMouseHandler::QAutoMouseHandler() -{ -#ifndef QT_NO_QWS_MOUSE_AUTO - notifiers.setAutoDelete( TRUE ); - retries = 0; - openDevices(); -#endif -} - -QAutoMouseHandler::~QAutoMouseHandler() -{ -#ifndef QT_NO_QWS_MOUSE_AUTO - closeDevices(); -#endif -} - -#ifndef QT_NO_QWS_MOUSE_AUTO -void QAutoMouseHandler::openDevices() -{ - nsub=0; - int fd; - fd = open( "/dev/psaux", O_RDWR | O_NDELAY ); - if ( fd >= 0 ) { - sub[nsub++] = new QAutoMouseSubHandler_intellimouse(fd); - notify(fd); - } -#if !defined(QT_QWS_IPAQ) && !defined(QT_QWS_SL5XXX) && !defined(QT_QWS_K2) && !defined(QT_QWS_SLC700) - char fn[] = "/dev/ttyS?"; - for (int ch='0'; ch<='3'; ch++) { - fn[9] = ch; - fd = open( fn, O_RDWR | O_NDELAY ); - if ( fd >= 0 ) { - //sub[nsub++] = new QAutoMouseSubHandler_intellimouse(fd); - sub[nsub++] = new QAutoMouseSubHandler_mousesystems(fd); - sub[nsub++] = new QAutoMouseSubHandler_ms(fd); - notify(fd); - } - } -#endif - // ... -} - -void QAutoMouseHandler::closeDevices() -{ - int pfd=-1; - for (int i=0; icloseIfNot(pfd); - delete sub[i]; - } - notifiers.clear(); -} - -void QAutoMouseHandler::notify(int fd) -{ - QSocketNotifier *mouseNotifier - = new QSocketNotifier( fd, QSocketNotifier::Read, this ); - connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData(int))); - notifiers.append( mouseNotifier ); -} -#endif - -void QAutoMouseHandler::readMouseData(int fd) -{ -#ifndef QT_NO_QWS_MOUSE_AUTO - for (;;) { - uchar buf[8]; - int n = read(fd, buf, 8); - if ( n<=0 ) - break; - for (int i=0; i 0 ) - mouseIdx += n; - } while ( n > 0 ); - } - handleMouseData(); -#endif -} - - -#ifndef QT_NO_QWS_MOUSE_PC -/* -*/ - -void QWSMouseHandlerPrivate::handleMouseData() -{ - static const int accel_limit = 5; - static const int accel = 2; - - int idx = 0; - int bstate = 0; - int dx = 0, dy = 0; - bool sendEvent = false; - int tdx = 0, tdy = 0; - - while ( mouseIdx-idx >= mouseData[mouseProtocol].bytesPerPacket ) { - //qDebug( "Got mouse data" ); - uchar *mb = mouseBuf+idx; - bstate = 0; - dx = 0; - dy = 0; - sendEvent = false; - switch (mouseProtocol) { - case MouseMan: - case IntelliMouse: - { - if (mb[0] & 0x01) - bstate |= Qt::LeftButton; - if (mb[0] & 0x02) - bstate |= Qt::RightButton; - if (mb[0] & 0x04) - bstate |= Qt::MidButton; - - int overflow = (mb[0]>>6 )& 0x03; - if (mouseProtocol == MouseMan && overflow) { - //### wheel events signalled with overflow bit, ignore for now - } - else { - bool xs = mb[0] & 0x10; - bool ys = mb[0] & 0x20; - dx = xs ? mb[1]-256 : mb[1]; - dy = ys ? mb[2]-256 : mb[2]; - sendEvent = true; - } -#if 0 //debug - if (mouseProtocol == MouseMan) - printf("(%2d) %02x %02x %02x ", idx, mb[0], mb[1], mb[2]); - else - printf("(%2d) %02x %02x %02x %02x ",idx,mb[0],mb[1],mb[2],mb[3]); - const char *b1 = (mb[0] & 0x01) ? "b1":" ";//left - const char *b2 = (mb[0] & 0x02) ? "b2":" ";//right - const char *b3 = (mb[0] & 0x04) ? "b3":" ";//mid - if ( overflow ) - printf( "Overflow%d %s %s %s (%4d,%4d)\n", overflow, - b1, b2, b3, mousePos.x(), mousePos.y() ); - else - printf( "%s %s %s (%+3d,%+3d) (%4d,%4d)\n", - b1, b2, b3, dx, dy, mousePos.x(), mousePos.y() ); -#endif - break; - } - case Microsoft: - if ( (mb[0] & 0x20) ) - bstate |= Qt::LeftButton; - if ( (mb[0] & 0x10) ) - bstate |= Qt::RightButton; - - dx=(signed char)(((mb[0] & 0x03) << 6) | (mb[1] & 0x3f)); - dy=-(signed char)(((mb[0] & 0x0c) << 4) | (mb[2] & 0x3f)); - sendEvent=true; - - break; - case BusMouse: - if ( !(mb[0] & 0x04) ) - bstate |= Qt::LeftButton; - if ( !(mb[0] & 0x01) ) - bstate |= Qt::RightButton; - - dx=(signed char)mb[1]; - dy=(signed char)mb[2]; - sendEvent=true; - break; - - default: - qWarning( "Unknown mouse protocol in QWSMouseHandlerPrivate" ); - break; - } - if (sendEvent) { - if ( QABS(dx) > accel_limit || QABS(dy) > accel_limit ) { - dx *= accel; - dy *= accel; - } - tdx += dx; - tdy += dy; - if ( bstate != obstate ) { - mousePos += QPoint(tdx,-tdy); - limitToScreen( mousePos ); - emit mouseChanged(mousePos,bstate); - sendEvent = FALSE; - tdx = 0; - tdy = 0; - obstate = bstate; - } - } - idx += mouseData[mouseProtocol].bytesPerPacket; - } - if ( sendEvent ) { - mousePos += QPoint(tdx,-tdy); - limitToScreen( mousePos ); - emit mouseChanged(mousePos,bstate); - } - - int surplus = mouseIdx - idx; - for ( int i = 0; i < surplus; i++ ) - mouseBuf[i] = mouseBuf[idx+i]; - mouseIdx = surplus; -} -#endif - - -QWSMouseHandlerPrivate::QWSMouseHandlerPrivate( MouseProtocol protocol, - QString mouseDev ) -{ -#ifndef QT_NO_QWS_MOUSE_PC - mouseProtocol = protocol; - - if ( mouseDev.isEmpty() ) - mouseDev = "/dev/mouse"; - obstate = -1; - mouseFD = -1; - mouseFD = open( mouseDev.local8Bit().data(), O_RDWR | O_NDELAY); - if ( mouseFD < 0 ) { - mouseFD = open( mouseDev.local8Bit().data(), O_RDONLY | O_NDELAY); - if ( mouseFD < 0 ) - qDebug( "Cannot open %s (%s)", mouseDev.ascii(), - strerror(errno)); - } else { - // Clear pending input - tcflush(mouseFD,TCIFLUSH); - - bool ps2 = false; - - switch (mouseProtocol) { - case MouseMan: - ps2 = true; - write(mouseFD,"",1); - usleep(50000); - write(mouseFD,"@EeI!",5); - break; - - case IntelliMouse: { -// ps2 = true; - const unsigned char init1[] = { 243, 200, 243, 100, 243, 80 }; - const unsigned char init2[] = { 246, 230, 244, 243, 100, 232, 3 }; - write(mouseFD,init1,sizeof(init1)); - usleep(50000); - write(mouseFD,init2,sizeof(init2)); - } - break; - - case Microsoft: - struct termios tty; - - tcgetattr(mouseFD, &tty); - - tty.c_iflag = IGNBRK | IGNPAR; - tty.c_oflag = 0; - tty.c_lflag = 0; -#if !defined(_OS_FREEBSD_) && !defined(_OS_SOLARIS_) - tty.c_line = 0; -#endif // _OS_FREEBSD_ - tty.c_cc[VTIME] = 0; - tty.c_cc[VMIN] = 1; - tty.c_cflag = B1200 | CS7 | CREAD | CLOCAL | HUPCL; - tcsetattr(mouseFD, TCSAFLUSH, &tty); /* set parameters */ - break; - - case BusMouse: - usleep(50000); - break; - - default: - qDebug("Unknown mouse protocol"); - exit(1); - } - - if (ps2) { - char buf[] = { 246, 244 }; - write(mouseFD,buf,1); - write(mouseFD,buf+1,1); - } - - usleep(50000); - tcflush(mouseFD,TCIFLUSH); // ### doesn't seem to work. - usleep(50000); - tcflush(mouseFD,TCIFLUSH); // ### doesn't seem to work. - - char buf[100]; // busmouse driver will not read if bufsize < 3, YYD - while (read(mouseFD, buf, 100) > 0) { } // eat unwanted replies - - mouseIdx = 0; - - QSocketNotifier *mouseNotifier; - mouseNotifier = new QSocketNotifier( mouseFD, QSocketNotifier::Read, this ); - connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData())); - } -#else - Q_UNUSED(protocol); - Q_UNUSED(mouseDev); -#endif -} - -QWSMouseHandlerPrivate::~QWSMouseHandlerPrivate() -{ -#ifndef QT_NO_QWS_MOUSE_PC - if (mouseFD >= 0) { - tcflush(mouseFD,TCIFLUSH); // yyd. - close(mouseFD); - } -#endif -} - -/* - * - */ QCalibratedMouseHandler::QCalibratedMouseHandler() : samples(5), currSample(0), numSamples(0) @@ -1030,7 +180,8 @@ if ( file.open( IO_WriteOnly ) ) { QTextStream t( &file ); t << a << " " << b << " " << c << " "; - t << d << " " << e << " " << f << " " << s; + t << d << " " << e << " " << f << " " << s << endl; + file.close(); } else #endif { @@ -1046,6 +197,7 @@ if ( file.open( IO_ReadOnly ) ) { QTextStream t( &file ); t >> a >> b >> c >> d >> e >> f >> s; + file.close(); } else #endif { @@ -1073,12 +225,24 @@ writeCalibration(); } +void QCalibratedMouseHandler::setCalibration(int aa, int bb, int cc, int dd, int ee, int ff, int ss) +{ + a = aa; + b = bb; + c = cc; + d = dd; + e = ee; + f = ff; + s = ss; +} + QPoint QCalibratedMouseHandler::transform( const QPoint &p ) { QPoint tp; tp.setX( (a * p.x() + b * p.y() + c) / s ); tp.setY( (d * p.x() + e * p.y() + f) / s ); +//qDebug("QCalibratedMouseHandler::transform(%d,%d) -> %d,%d)", p.x(), p.y(), tp.x(), tp.y() ); return tp; } @@ -1143,814 +307,192 @@ return sent; } -/* - * Handler for /dev/tpanel Linux kernel driver - */ -class QVrTPanelHandlerPrivate : public QCalibratedMouseHandler { - Q_OBJECT -public: - QVrTPanelHandlerPrivate(MouseProtocol, QString dev); - ~QVrTPanelHandlerPrivate(); -private: - int mouseFD; - MouseProtocol mouseProtocol; -private slots: - void sendRelease(); - void readMouseData(); -private: - static const int mouseBufSize = 1280; - QTimer *rtimer; - int mouseIdx; - uchar mouseBuf[mouseBufSize]; -}; -#ifndef QT_QWS_CASSIOPEIA -QVrTPanelHandlerPrivate::QVrTPanelHandlerPrivate( MouseProtocol, QString ) : - QCalibratedMouseHandler() -{ -} -#else -QVrTPanelHandlerPrivate::QVrTPanelHandlerPrivate( MouseProtocol, QString dev ) : - QCalibratedMouseHandler() -{ - if ( dev.isEmpty() ) - dev = "/dev/tpanel"; - - if ((mouseFD = open( dev, O_RDONLY)) < 0) { - qFatal( "Cannot open %s (%s)", dev.latin1(), strerror(errno)); - } else { - sleep(1); - } - - struct scanparam s; - s.interval = 20000; - s.settletime = 480; - if ( ioctl(mouseFD, TPSETSCANPARM, &s) < 0 - || fcntl(mouseFD, F_SETFL, O_NONBLOCK) < 0 ) - qWarning("Error initializing touch panel."); - - QSocketNotifier *mouseNotifier; - mouseNotifier = new QSocketNotifier( mouseFD, QSocketNotifier::Read, - this ); - connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData())); - - rtimer = new QTimer( this ); - connect( rtimer, SIGNAL(timeout()), this, SLOT(sendRelease())); - mouseIdx = 0; - setFilterSize( 3 ); - - printf("\033[?25l"); fflush(stdout); // VT100 cursor off -} -#endif - -QVrTPanelHandlerPrivate::~QVrTPanelHandlerPrivate() -{ - if (mouseFD >= 0) - close(mouseFD); -} - -void QVrTPanelHandlerPrivate::sendRelease() -{ - sendFiltered( mousePos, 0 ); -} -void QVrTPanelHandlerPrivate::readMouseData() -{ -#ifdef QT_QWS_CASSIOPEIA - if(!qt_screen) - return; - static bool pressed = FALSE; - - int n; - do { - n = read(mouseFD, mouseBuf+mouseIdx, mouseBufSize-mouseIdx ); - if ( n > 0 ) - mouseIdx += n; - } while ( n > 0 && mouseIdx < mouseBufSize ); - - int idx = 0; - while ( mouseIdx-idx >= (int)sizeof( short ) * 6 ) { - uchar *mb = mouseBuf+idx; - ushort *data = (ushort *) mb; - if ( data[0] & 0x8000 ) { - if ( data[5] > 750 ) { - QPoint t(data[3]-data[4],data[2]-data[1]); - if ( sendFiltered( t, Qt::LeftButton ) ) - pressed = TRUE; - if ( pressed ) - rtimer->start( 200, TRUE ); // release unreliable - } - } else if ( pressed ) { - rtimer->start( 50, TRUE ); - pressed = FALSE; - } - idx += sizeof( ushort ) * 6; - } +struct input_event { + struct timeval time; + unsigned short type; + unsigned short code; + unsigned int value; +}; - int surplus = mouseIdx - idx; - for ( int i = 0; i < surplus; i++ ) - mouseBuf[i] = mouseBuf[idx+i]; - mouseIdx = surplus; -#endif -} +#define EV_ABS 0x03 +#define ABS_X 0x00 +#define ABS_Y 0x01 +#define ABS_PRESSURE 0x18 -class QTPanelHandlerPrivate : public QCalibratedMouseHandler +class QInputEventHandler : public QCalibratedMouseHandler { Q_OBJECT public: - QTPanelHandlerPrivate(MouseProtocol, QString dev); - ~QTPanelHandlerPrivate(); + QInputEventHandler(MouseProtocol, QString dev); + ~QInputEventHandler(); + + virtual void calibrate( QWSPointerCalibrationData * ); + virtual void setCalibration(int aa, int bb, int cc, int dd, int ee, int ff, int ss); private: - static const int mouseBufSize = 2048; + void init(); + void fini(); + int mouseFD; - QPoint oldmouse; - QPoint oldTotalMousePos; - bool waspressed; - QPointArray samples; - unsigned int currSample; - unsigned int lastSample; - unsigned int numSamples; - int skipCount; - int mouseIdx; - uchar mouseBuf[mouseBufSize]; + struct input_event sample; + int myX, myY, myP, oldX, oldY, oldP; + int xtable[QT_QWS_TP_TABLE_SIZE]; + int ytable[QT_QWS_TP_TABLE_SIZE]; + int ptr; private slots: void readMouseData(); }; -QTPanelHandlerPrivate::QTPanelHandlerPrivate( MouseProtocol, QString dev ) - : samples(QT_QWS_TP_SAMPLE_SIZE), currSample(0), lastSample(0), - numSamples(0), skipCount(0) -{ - Q_UNUSED(dev); -#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_K2) || defined(QT_QWS_SLC700) -#if defined(QT_QWS_IPAQ) -# ifdef QT_QWS_IPAQ_RAW - if ((mouseFD = open( "/dev/h3600_tsraw", O_RDONLY | O_NDELAY)) < 0) { -# else - if ((mouseFD = open( "/dev/h3600_ts", O_RDONLY | O_NDELAY)) < 0) { -# endif - qWarning( "Cannot open /dev/h3600_ts (%s)", strerror(errno)); - return; - } -#elif defined(QT_QWS_SL5XXX) || defined(QT_QWS_K2) || defined(QT_QWS_SLC700) -//# ifdef QT_QWS_SL5XXX_TSRAW -# if 0 - if ((mouseFD = open( "/dev/tsraw", O_RDONLY | O_NDELAY)) < 0) { - qWarning( "Cannot open /dev/tsraw (%s)", strerror(errno)); - return; - } -# else - if ((mouseFD = open( "/dev/ts", O_RDONLY | O_NDELAY)) < 0) { - qWarning( "Cannot open /dev/ts (%s)", strerror(errno)); - return; - } -# endif -#elif defined(QT_QWS_SIMPAD ) - if ((mouseFD = open( "/dev/touchscreen/ucb1x00", O_RDONLY | O_NONBLOCK )) < 0) { - qWarning( "Cannot open /dev/touchscreen/ucb1x00 (%s)", strerror(errno)); - return; - } -#endif - - QSocketNotifier *mouseNotifier; - mouseNotifier = new QSocketNotifier( mouseFD, QSocketNotifier::Read, - this ); - connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData())); - waspressed=FALSE; - mouseIdx = 0; -#endif -} - -QTPanelHandlerPrivate::~QTPanelHandlerPrivate() +QInputEventHandler::QInputEventHandler( MouseProtocol, QString ) + : myP(-1) { -#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_K2) || defined(QT_QWS_SLC700) || defined(QT_QWS_SIMPAD) - if (mouseFD >= 0) - close(mouseFD); -#endif + init(); } -void QTPanelHandlerPrivate::readMouseData() +QInputEventHandler::~QInputEventHandler() { -#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_K2) || defined(QT_QWS_SLC700) || defined(QT_QWS_SIMPAD) - if(!qt_screen) - return; - - int n; - do { - n = read(mouseFD, mouseBuf+mouseIdx, mouseBufSize-mouseIdx ); - if ( n > 0 ) - mouseIdx += n; - } while ( n > 0 && mouseIdx < mouseBufSize ); - - TS_EVENT *data; - int idx = 0; - - // perhaps we shouldn't be reading EVERY SAMPLE. - while ( mouseIdx-idx >= (int)sizeof( TS_EVENT ) ) { - uchar *mb = mouseBuf+idx; - data = (TS_EVENT *) mb; - if(data->pressure >= QT_QWS_TP_PRESSURE_THRESHOLD) { -#if defined(QT_QWS_SL5XXX) || defined(QT_QWS_SLC700) - samples[currSample] = QPoint( 1000 - data->x, data->y ); -#else - samples[currSample] = QPoint( data->x, data->y ); -#endif - - numSamples++; - if ( numSamples >= QT_QWS_TP_MINIMUM_SAMPLES ) { - int sampleCount = QMIN(numSamples + 1,samples.count()); - - // average the rest - mousePos = QPoint( 0, 0 ); - QPoint totalMousePos = oldTotalMousePos; - totalMousePos += samples[currSample]; - if(numSamples >= samples.count()) - totalMousePos -= samples[lastSample]; - - mousePos = totalMousePos / (sampleCount - 1); - -# if defined(QT_QWS_IPAQ_RAW) || defined(QT_QWS_SL5XXX_RAW) - mousePos = transform( mousePos ); -# endif - if(!waspressed) - oldmouse = mousePos; - QPoint dp = mousePos - oldmouse; - int dxSqr = dp.x() * dp.x(); - int dySqr = dp.y() * dp.y(); - if ( dxSqr + dySqr < (QT_QWS_TP_MOVE_LIMIT * QT_QWS_TP_MOVE_LIMIT) ) { - if ( waspressed ) { - if ( (dxSqr + dySqr > (QT_QWS_TP_JITTER_LIMIT * QT_QWS_TP_JITTER_LIMIT) ) || skipCount > 2) { - emit mouseChanged(mousePos,Qt::LeftButton); - oldmouse = mousePos; - skipCount = 0; - } else { - skipCount++; - } - } else { - emit mouseChanged(mousePos,Qt::LeftButton); - oldmouse=mousePos; - waspressed=true; - } - - // save recuring information - currSample++; - if (numSamples >= samples.count()) - lastSample++; - oldTotalMousePos = totalMousePos; - } else { - numSamples--; // don't use this sample, it was bad. - } - } else { - // build up the average - oldTotalMousePos += samples[currSample]; - currSample++; - } - if ( currSample >= samples.count() ) - currSample = 0; - if ( lastSample >= samples.count() ) - lastSample = 0; - } else { - currSample = 0; - lastSample = 0; - numSamples = 0; - skipCount = 0; - oldTotalMousePos = QPoint(0,0); - if ( waspressed ) { - emit mouseChanged(oldmouse,0); - oldmouse = QPoint( -100, -100 ); - waspressed=false; - } - } - idx += sizeof( TS_EVENT ); - } + fini(); - int surplus = mouseIdx - idx; - for ( int i = 0; i < surplus; i++ ) - mouseBuf[i] = mouseBuf[idx+i]; - mouseIdx = surplus; -#endif } -// YOPY touch panel support based on changes contributed by Ron Victorelli -// (victorrj at icubed.com) to Custom TP driver. -// -class QYopyTPanelHandlerPrivate : public QWSMouseHandler { - Q_OBJECT -public: - QYopyTPanelHandlerPrivate(MouseProtocol, QString dev); - ~QYopyTPanelHandlerPrivate(); - -private: - int mouseFD; - int prevstate; -private slots: - void readMouseData(); - -}; - -QYopyTPanelHandlerPrivate::QYopyTPanelHandlerPrivate( MouseProtocol, QString ) +void QInputEventHandler::setCalibration(int aa, int bb, int cc, int dd, int ee, int ff, int ss) { -#ifdef QT_QWS_YOPY - if ((mouseFD = open( "/dev/ts", O_RDONLY)) < 0) { - qWarning( "Cannot open /dev/ts (%s)", strerror(errno)); - return; - } else { - sleep(1); - } - prevstate=0; - QSocketNotifier *mouseNotifier; - mouseNotifier = new QSocketNotifier( mouseFD, QSocketNotifier::Read, - this ); - connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData())); -#endif -} + QCalibratedMouseHandler::setCalibration(aa, bb, cc, dd, ee, ff, ss); -QYopyTPanelHandlerPrivate::~QYopyTPanelHandlerPrivate() -{ - if (mouseFD >= 0) - close(mouseFD); + writeCalibration(); + fini(); + init(); } -#define YOPY_XPOS(d) (d[1]&0x3FF) -#define YOPY_YPOS(d) (d[2]&0x3FF) -#define YOPY_PRES(d) (d[0]&0xFF) -#define YOPY_STAT(d) (d[3]&0x01 ) - -struct YopyTPdata { - - unsigned char status; - unsigned short xpos; - unsigned short ypos; - -}; - -void QYopyTPanelHandlerPrivate::readMouseData() +void QInputEventHandler::calibrate( QWSPointerCalibrationData *cd ) { -#ifdef QT_QWS_YOPY - if(!qt_screen) - return; - YopyTPdata data; - - unsigned int yopDat[4]; - - int ret; - - ret=read(mouseFD,&yopDat,sizeof(yopDat)); + QCalibratedMouseHandler::calibrate( cd ); - if(ret) { - data.status= ( YOPY_PRES(yopDat) ) ? 1 : 0; - data.xpos=YOPY_XPOS(yopDat); - data.ypos=YOPY_YPOS(yopDat); - QPoint q; - q.setX(data.xpos); - q.setY(data.ypos); - mousePos=q; - if(data.status && !prevstate) { - emit mouseChanged(mousePos,Qt::LeftButton); - } else if( !data.status && prevstate ) { - emit mouseChanged(mousePos,0); - } - prevstate = data.status; - } - if(ret<0) { - qDebug("Error %s",strerror(errno)); - } -#endif + // write calibration data, and close and reopen + // tslib, in order to ensure it uses the new values + writeCalibration(); + fini(); + init(); } -class QCustomTPanelHandlerPrivate : public QWSMouseHandler { - Q_OBJECT -public: - QCustomTPanelHandlerPrivate(MouseProtocol, QString dev); - ~QCustomTPanelHandlerPrivate(); - -private: - int mouseFD; -private slots: - void readMouseData(); - -}; - -QCustomTPanelHandlerPrivate::QCustomTPanelHandlerPrivate( MouseProtocol, QString ) +void QInputEventHandler::init() { -#ifdef QWS_CUSTOMTOUCHPANEL - if ((mouseFD = open( "/dev/ts", O_RDONLY)) < 0) { - qWarning( "Cannot open /dev/ts (%s)", strerror(errno)); + if ((mouseFD = open( "/dev/input/event1", O_RDONLY)) < 0) { + qWarning( "Cannot open /dev/input/event1 (%s)", strerror(errno)); return; - } else { - sleep(1); } QSocketNotifier *mouseNotifier; - mouseNotifier = new QSocketNotifier( mouseFD, QSocketNotifier::Read, - this ); + mouseNotifier = new QSocketNotifier( mouseFD, QSocketNotifier::Read, this ); + setFilterSize(2); connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData())); -#endif } -QCustomTPanelHandlerPrivate::~QCustomTPanelHandlerPrivate() +void QInputEventHandler::fini() { if (mouseFD >= 0) close(mouseFD); } -struct CustomTPdata { - - unsigned char status; - unsigned short xpos; - unsigned short ypos; - -}; - -void QCustomTPanelHandlerPrivate::readMouseData() +void QInputEventHandler::readMouseData() { -#ifdef QWS_CUSTOMTOUCHPANEL - if(!qt_screen) - return; - CustomTPdata data; - - unsigned char data2[5]; - - int ret; - - ret=read(mouseFD,data2,5); + if (!qt_screen) + return; - if(ret==5) { - data.status=data2[0]; - data.xpos=(data2[1] << 8) | data2[2]; - data.ypos=(data2[3] << 8) | data2[4]; - QPoint q; - q.setX(data.xpos); - q.setY(data.ypos); - mousePos=q; - if(data.status & 0x40) { - emit mouseChanged(mousePos,Qt::LeftButton); - } else { - emit mouseChanged(mousePos,0); + unsigned int size = read(mouseFD, &sample, sizeof(sample)); + if (size < sizeof(sample)) { + qDebug("no input"); + return; + } + //qDebug("type,code,val: %d,%d,%d", sample.type, sample.code, sample.value); + if (sample.type == EV_ABS) { + if (sample.code == ABS_Y) { + myY = sample.value; + return; + } else + if (sample.code == ABS_X) { + myX = sample.value; + return; + } else + if (sample.code == ABS_PRESSURE) { + myP = sample.value; + } } - } - if(ret<0) { - qDebug("Error %s",strerror(errno)); - } -#endif -} - -/* - * Virtual framebuffer mouse driver - */ - -#ifndef QT_NO_QWS_VFB -#include "qvfbhdr.h" -extern int qws_display_id; -#endif - -class QVFbMouseHandlerPrivate : public QWSMouseHandler { - Q_OBJECT -public: - QVFbMouseHandlerPrivate(MouseProtocol, QString dev); - ~QVFbMouseHandlerPrivate(); - -#ifndef QT_NO_QWS_VFB - bool isOpen() const { return mouseFD > 0; } - -private: - static const int mouseBufSize = 128; - int mouseFD; - int mouseIdx; - uchar mouseBuf[mouseBufSize]; -#endif - -private slots: - void readMouseData(); -}; - -QVFbMouseHandlerPrivate::QVFbMouseHandlerPrivate( MouseProtocol, QString mouseDev ) -{ -#ifndef QT_NO_QWS_VFB - mouseFD = -1; - if ( mouseDev.isEmpty() ) - mouseDev = QString(QT_VFB_MOUSE_PIPE).arg(qws_display_id); - - if ((mouseFD = open( mouseDev.local8Bit().data(), O_RDWR | O_NDELAY)) < 0) { - qDebug( "Cannot open %s (%s)", mouseDev.ascii(), - strerror(errno)); - } else { - // Clear pending input - char buf[2]; - while (read(mouseFD, buf, 1) > 0) { } - - mouseIdx = 0; - - QSocketNotifier *mouseNotifier; - mouseNotifier = new QSocketNotifier( mouseFD, QSocketNotifier::Read, this ); - connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData())); - } -#endif -} - -QVFbMouseHandlerPrivate::~QVFbMouseHandlerPrivate() -{ -#ifndef QT_NO_QWS_VFB - if (mouseFD >= 0) - close(mouseFD); -#endif -} - -void QVFbMouseHandlerPrivate::readMouseData() -{ -#ifndef QT_NO_QWS_VFB - int n; - do { - n = read(mouseFD, mouseBuf+mouseIdx, mouseBufSize-mouseIdx ); - if ( n > 0 ) - mouseIdx += n; - } while ( n > 0 ); - - int idx = 0; - while ( mouseIdx-idx >= int(sizeof( QPoint ) + sizeof( int )) ) { - uchar *mb = mouseBuf+idx; - QPoint *p = (QPoint *) mb; - mb += sizeof( QPoint ); - int *bstate = (int *)mb; - mousePos = *p; - limitToScreen( mousePos ); - emit mouseChanged(mousePos, *bstate); - idx += sizeof( QPoint ) + sizeof( int ); - } - - int surplus = mouseIdx - idx; - for ( int i = 0; i < surplus; i++ ) - mouseBuf[i] = mouseBuf[idx+i]; - mouseIdx = surplus; -#endif -} - -/* - mouse handler for tslib - see http://cvs.arm.linux.org.uk/ - */ -/* - - Copyright (C) 2003, 2004, 2005 Texas Instruments, Inc. - Copyright (C) 2004, 2005 Holger Hans Peter Freyther - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name Texas Instruments, Inc nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - -*/ -class QTSLibHandlerPrivate : public QCalibratedMouseHandler -{ - Q_OBJECT -public: - QTSLibHandlerPrivate(); - ~QTSLibHandlerPrivate(); - - virtual void clearCalibration(); - virtual void calibrate( QWSPointerCalibrationData * ); - static int sortByX( const void*, const void* ); - static int sortByY( const void*, const void* ); - -private: - bool m_raw : 1; - QSocketNotifier *m_notify; - -#ifdef QT_QWS_TSLIB - struct tsdev *m_ts; -#endif - void openTs(); - void closeTs(); - void interpolateSample(); - -private slots: - void readMouseData(); - -}; - -QTSLibHandlerPrivate::QTSLibHandlerPrivate() - : m_raw(false), m_notify(0 ) -{ - openTs(); -} - -QTSLibHandlerPrivate::~QTSLibHandlerPrivate() -{ - closeTs(); -} - -void QTSLibHandlerPrivate::openTs() -{ -#ifdef QT_QWS_TSLIB - char *tsdevice; - if((tsdevice = getenv("TSLIB_TSDEVICE")) != NULL) { - m_ts = ts_open( tsdevice, 1 ); //1 = nonblocking, 0 = blocking mode - } else { - m_ts = ts_open( "/dev/ts", 1 ); - } - - if (!m_ts) { - qWarning( "Cannot open touchscreen (%s)", strerror( errno)); - return; - } - - if (ts_config( m_ts)) { - qWarning( "Cannot configure touchscreen (%s)", strerror( errno)); - return; - } - m_notify = new QSocketNotifier( ts_fd(m_ts), QSocketNotifier::Read, this ); - connect( m_notify, SIGNAL(activated(int)),this, SLOT(readMouseData())); -#endif -} - -void QTSLibHandlerPrivate::closeTs() -{ -#ifdef QT_QWS_TSLIB - if (m_ts) - ts_close(m_ts); - m_ts = 0; -#endif - - delete m_notify; - m_notify = 0; - m_raw = false; -} - -void QTSLibHandlerPrivate::clearCalibration() -{ - m_raw = true; -} - -void QTSLibHandlerPrivate::calibrate( QWSPointerCalibrationData * cd) -{ - QPoint dev_tl = cd->devPoints[ QWSPointerCalibrationData::TopLeft ]; - QPoint dev_br = cd->devPoints[ QWSPointerCalibrationData::BottomRight ]; - QPoint screen_tl = cd->screenPoints[ QWSPointerCalibrationData::TopLeft ]; - QPoint screen_br = cd->screenPoints[ QWSPointerCalibrationData::BottomRight ]; - int a, b, c, d, e, f, s; - - s = 1 << 16; - a = s * (screen_tl.x() - screen_br.x() ) / (dev_tl.x() - dev_br.x()); - b = 0; - c = s * screen_tl.x() - a * dev_tl.x(); + // up->up + if (oldP==0 && myP==0) { + //qDebug("uu %d,%d,%d", myX,myY,myP); + return; + } - d = 0; - e = s * (screen_tl.y() - screen_br.y() ) / (dev_tl.y() - dev_br.y()); - f = s * screen_tl.y() - e * dev_tl.y(); + // up->down + if (oldP==0 && myP>QT_QWS_TP_PRESSURE_DOWN_THRESHOLD) { + //qDebug("ud %d,%d,%d", myX,myY,myP); - QString calFile = "/etc/pointercal"; -#ifndef QT_NO_TEXTSTREAM - QFile file( calFile ); - if ( file.open( IO_WriteOnly ) ) { - QTextStream t( &file ); - t << a << " " << b << " " << c << " "; - t << d << " " << e << " " << f << " " << s; - file.flush(); closeTs(); - openTs(); - } else -#endif - { - qDebug( "Could not save calibration: %s", calFile.latin1() ); - } -} + xtable[0] = myX; + ytable[0] = myY; + ptr = 1; + oldX = myX; + oldY = myY; + oldP = myP; + return; + } -void QTSLibHandlerPrivate::readMouseData() -{ -#ifdef QT_QWS_TSLIB - if(!qt_screen) - return; + // down->down + if (oldP>QT_QWS_TP_PRESSURE_DOWN_THRESHOLD && myP>QT_QWS_TP_PRESSURE_UP_THRESHOLD) { + //qDebug("dd %d,%d,%d (%d,%d)", myX,myY,myP, oldX,oldY); - /* - * After clear Calibration - * we're in raw mode and do some easy median - * search. - */ - if ( m_raw ) - return interpolateSample(); + int dxSqr = myX-oldX; dxSqr *= dxSqr; + int dySqr = myY-oldY; dySqr *= dySqr; + oldX = myX; + oldY = myY; + if (dxSqr+dySqr > QT_QWS_TP_MOVE_MAX*QT_QWS_TP_MOVE_MAX) { + //qWarning("distance too wide %d", dxSqr+dySqr); + return; + } - static struct ts_sample sample; - static int ret; + if (ptr < QT_QWS_TP_TABLE_SIZE) { + xtable[ptr] = myX; + ytable[ptr++] = myY; + } - /* - * Ok. We need to see if we can read more than one event - * We do this not to lose an update. - */ - while ( true ) { - if ((ret = ts_read(m_ts, &sample, 1)) != 1 ) - return; + if (ptr == QT_QWS_TP_TABLE_SIZE) { + int i; + int mx = 0; + int my = 0; + for (i=0; i0) { + xtable[i-1] = xtable[i]; + ytable[i-1] = ytable[i]; + } + } + ptr--; + mousePos = transform(QPoint(mx/QT_QWS_TP_TABLE_SIZE, my/QT_QWS_TP_TABLE_SIZE)); + emit mouseChanged(mousePos, Qt::LeftButton); + } + return; + } - QPoint pos( sample.x, sample.y ); - mouseChanged( pos, sample.pressure != 0 ? 1 : 0 ); - } -#endif + // down->up + //qDebug("du %d,%d,%d", myX,myY,myP); + emit mouseChanged(mousePos, 0); + oldP = 0; } -/* - * Lets take all down events and then sort them - * and take the event in the middle. - * - * inspired by testutils.c - */ -void QTSLibHandlerPrivate::interpolateSample() { -#ifdef QT_QWS_TSLIB -#define TSLIB_MAX_SAMPLES 25 - static struct ts_sample samples[TSLIB_MAX_SAMPLES]; - int index = 0; - int read_samples = 0; - int ret; - - do { - /* do not access negative arrays */ - if ( index < 0 ) - index = 0; - - /* we're opened non-blocking */ - if((ret= ts_read_raw(m_ts, &samples[index], 1 ) ) != 1 ) - /* no event yet, so try again */ - if (ret==-1 ) - continue; - - read_samples++; - index = (index+1)%TSLIB_MAX_SAMPLES; - }while (samples[index == 0 ? (TSLIB_MAX_SAMPLES-1) : index-1].pressure != 0); - - /* - * If we've wrapped around each sample is used otherwise - * we will use the index - */ - index = read_samples >= TSLIB_MAX_SAMPLES ? - (TSLIB_MAX_SAMPLES-1 ) : index; - int x, y; - - /* - * now let us use the median value - * even index does not have an item in the middle - * so let us take the average of n/2 and (n/2)-1 as the middle - */ - int m = index/2; - ::qsort(samples, index, sizeof(ts_sample), QTSLibHandlerPrivate::sortByX); - x = (index % 2 ) ? samples[m].x : - ( samples[m-1].x + samples[m].x )/2; - - ::qsort(samples, index, sizeof(ts_sample), QTSLibHandlerPrivate::sortByY); - y = (index % 2 ) ? samples[m].y : - ( samples[m-1].y + samples[m].y )/2; - emit mouseChanged( QPoint(x, y), 1 ); - emit mouseChanged( QPoint(0, 0), 0 ); -#endif -} -int QTSLibHandlerPrivate::sortByX( const void* one, const void* two) { -#ifdef QT_QWS_TSLIB - return reinterpret_cast(one)->x - - reinterpret_cast(two)->x; -#else - return 0; -#endif -} -int QTSLibHandlerPrivate::sortByY( const void* one, const void* two) { -#ifdef QT_QWS_TSLIB - return reinterpret_cast(one)->y - - reinterpret_cast(two)->y; -#else - return 0; -#endif -} -////// /* * return a QWSMouseHandler that supports /a spec. @@ -1977,7 +519,7 @@ if ( mouseProto == "USB" && mouseDev.isEmpty() ) mouseDev = "/dev/input/mice"; - + MouseProtocol mouseProtocol = Unknown; int idx = 0; @@ -1988,50 +530,7 @@ idx++; } - - QWSMouseHandler *handler = 0; - - switch ( mouseProtocol ) { -#ifndef QT_NO_QWS_MOUSE_AUTO - case Auto: - handler = new QAutoMouseHandler(); - break; -#endif - -#ifndef QT_NO_QWS_MOUSE_PC - case MouseMan: - case IntelliMouse: - case Microsoft: - case BusMouse: - handler = new QWSMouseHandlerPrivate( mouseProtocol, mouseDev ); - break; -#endif - -#ifndef QT_NO_QWS_VFB - case QVFBMouse: - handler = new QVFbMouseHandlerPrivate( mouseProtocol, mouseDev ); - break; -#endif - - case TPanel: -#if defined(QWS_CUSTOMTOUCHPANEL) - handler = new QCustomTPanelHandlerPrivate(mouseProtocol,mouseDev); -#elif defined(QT_QWS_TSLIB) - handler = new QTSLibHandlerPrivate(); -#elif defined(QT_QWS_YOPY) - handler = new QYopyTPanelHandlerPrivate(mouseProtocol,mouseDev); -#elif defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_K2) || defined(QT_QWS_SLC700) || defined(QT_QWS_SIMPAD) - handler = new QTPanelHandlerPrivate(mouseProtocol,mouseDev); -#elif defined(QT_QWS_CASSIOPEIA) - handler = new QVrTPanelHandlerPrivate( mouseProtocol, mouseDev ); -#endif - break; - - default: - qDebug( "Mouse type %s unsupported", spec.latin1() ); - } - - return handler; + return new QInputEventHandler( mouseProtocol, mouseDev ); } #include "qwsmouse_qws.moc" --- qt-2.3.10/src/kernel/qwsmouse_qws.h~ramses-touchscreen +++ qt-2.3.10/src/kernel/qwsmouse_qws.h @@ -1,5 +1,5 @@ /**************************************************************************** -** $Id: qt/src/kernel/qwsmouse_qws.h 2.3.10 edited 2005-01-24 $ +** $Id: qt/src/kernel/qwsmouse_qws.h 2.3.7 edited 2001-10-03 $ ** ** Definition of Qt/FB central server classes ** @@ -70,6 +70,7 @@ virtual void clearCalibration(); virtual void calibrate( QWSPointerCalibrationData * ); virtual void getCalibration( QWSPointerCalibrationData * ); + virtual void setCalibration(int aa, int bb, int cc, int dd, int ee, int ff, int ss); protected: void readCalibration();