- 论坛徽章:
- 0
|
大家好,贴子有点长,请大家耐着性着看完一下,感激不尽
小弟最近在做qtopia core-4.3.3的移植.起初没有修改过它的源码哈,编译,安装都顺利通过,通过NFS启动系统后.执行那些示例程序,屏幕有反应,点击触摸屏,鼠标也会有反应,但是鼠标的位置却与点击位置出入很大,甚至是在相反的方向...后来我按照网上所说的方法对源码做了修改,即在qmouselinuxtp_qws.h加入
#define QT_QWS_IPAQ
#define QT_QWS_IPAQ_RAW
并修改原来的设备文件dev/h3600_tsraw为/dev/input/ts0,重新编译安装后,但问题依然....请问这是为什么呢?这个问题应该怎样解决呢,谢谢!
我的板子是s3c2440.
我的配置选项:
./configure -v -little-endian -embedded arm
我的qmouselinuxtp_qws.cpp文件:
/****************************************************************************
**
** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.
**
** This file is part of the QtGui module of the Qt Toolkit.
**
** This file may be used under the terms of the GNU General Public
** License version 2.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of
** this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
** http://trolltech.com/products/qt/licenses/licensing/opensource/
**
** If you are unsure which license is appropriate for your use, please
** review the following information:
** http://trolltech.com/products/qt ... g/licensingoverview
** or contact the sales department at sales@trolltech.com.
**
** In addition, as a special exception, Trolltech gives you certain
** additional rights. These rights are described in the Trolltech GPL
** Exception version 1.0, which can be found at
** http://www.trolltech.com/products/qt/gplexception/ and in the file
** GPL_EXCEPTION.txt in this package.
**
** In addition, as a special exception, Trolltech, as the sole copyright
** holder for Qt Designer, grants users of the Qt/Eclipse Integration
** plug-in the right for the Qt/Eclipse Integration to link to
** functionality provided by Qt Designer and its related libraries.
**
** Trolltech reserves all rights not expressly granted herein.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
****************************************************************************/
#include "qmouselinuxtp_qws.h"
#ifndef QT_NO_QWS_MOUSE_LINUXTP
#include "qwindowsystem_qws.h"
#include "qsocketnotifier.h"
#include "qtimer.h"
#include "qapplication.h"
#include "qscreen_qws.h"
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#if defined(QT_QWS_IPAQ)
#define QT_QWS_IPAQ_RAW
#define QT_QWS_SCREEN_COORDINATES
typedef struct {
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
} TS_EVENT;
#elif defined(QT_QWS_EBX)
#define QT_QWS_EBX_RAW
#define QT_QWS_SCREEN_COORDINATES
#ifndef QT_QWS_SHARP
typedef struct {
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
} TS_EVENT;
#else
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
#endif
#else // not IPAQ, not SHARP
typedef struct {
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
} TS_EVENT;
#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
#endif
#ifndef QT_QWS_TP_PRESSURE_THRESHOLD
#define QT_QWS_TP_PRESSURE_THRESHOLD 1
#endif
#ifndef QT_QWS_TP_MOVE_LIMIT
#define QT_QWS_TP_MOVE_LIMIT 100
#endif
#ifndef QT_QWS_TP_JITTER_LIMIT
#define QT_QWS_TP_JITTER_LIMIT 2
#endif
class QWSLinuxTPMouseHandlerPrivate : public QObject
{
Q_OBJECT
public:
QWSLinuxTPMouseHandlerPrivate(QWSLinuxTPMouseHandler *h, const QString &);
~QWSLinuxTPMouseHandlerPrivate();
void suspend();
void resume();
private:
static const int mouseBufSize = 2048;
int mouseFD;
QPoint oldmouse;
QPoint oldTotalMousePos;
bool waspressed;
QPolygon samples;
int currSample;
int lastSample;
int numSamples;
int skipCount;
int mouseIdx;
uchar mouseBuf[mouseBufSize];
QWSLinuxTPMouseHandler *handler;
QSocketNotifier *mouseNotifier;
private slots:
void readMouseData();
};
QWSLinuxTPMouseHandler::QWSLinuxTPMouseHandler(const QString &driver, const QString &device)
: QWSCalibratedMouseHandler(driver, device)
{
d = new QWSLinuxTPMouseHandlerPrivate(this, device);
}
QWSLinuxTPMouseHandler::~QWSLinuxTPMouseHandler()
{
delete d;
}
void QWSLinuxTPMouseHandler::suspend()
{
d->suspend();
}
void QWSLinuxTPMouseHandler::resume()
{
d->resume();
}
QWSLinuxTPMouseHandlerPrivate::QWSLinuxTPMouseHandlerPrivate(QWSLinuxTPMouseHandler *h,
const QString &device)
: samples(QT_QWS_TP_SAMPLE_SIZE), currSample(0), lastSample(0),
numSamples(0), skipCount(0), handler(h)
{
QString mousedev;
if (device.isEmpty()) {
#if defined(QT_QWS_IPAQ)
# ifdef QT_QWS_IPAQ_RAW
mousedev = QLatin1String("/dev/h3600_tsraw");
# else
mousedev = QLatin1String("/dev/h3600_ts");
# endif
#else
mousedev = QLatin1String("/dev/ts");
#endif
} else {
mousedev = device;
}
if ((mouseFD = open(mousedev.toLatin1().constData(), O_RDONLY | O_NDELAY)) < 0) {
qWarning("Cannot open %s (%s)", qPrintable(mousedev), strerror(errno));
return;
}
mouseNotifier = new QSocketNotifier(mouseFD, QSocketNotifier::Read,
this);
connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData()));
waspressed=false;
mouseIdx = 0;
}
QWSLinuxTPMouseHandlerPrivate::~QWSLinuxTPMouseHandlerPrivate()
{
if (mouseFD >= 0)
close(mouseFD);
}
void QWSLinuxTPMouseHandlerPrivate::suspend()
{
if (mouseNotifier)
mouseNotifier->setEnabled(false);
}
void QWSLinuxTPMouseHandlerPrivate::resume()
{
mouseIdx=0;
currSample=0;
lastSample=0;
numSamples=0;
skipCount=0;
if (mouseNotifier)
mouseNotifier->setEnabled(true);
}
void QWSLinuxTPMouseHandlerPrivate::readMouseData()
{
if(!qt_screen)
return;
int n;
do {
n = read(mouseFD, mouseBuf+mouseIdx, mouseBufSize-mouseIdx);
if (n > 0)
mouseIdx += n;
} while (n > 0 && mouseIdx < mouseBufSize);
//qDebug("readMouseData()");
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) {
#ifdef QT_QWS_SHARP
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
QPoint 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_SCREEN_COORDINATES)
mousePos = handler->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) {
handler->mouseChanged(mousePos,Qt::LeftButton);
oldmouse = mousePos;
skipCount = 0;
} else {
skipCount++;
}
} else {
handler->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) {
handler->mouseChanged(oldmouse,0);
oldmouse = QPoint(-100, -100);
waspressed=false;
}
}
idx += sizeof(TS_EVENT);
}
int surplus = mouseIdx - idx;
for (int i = 0; i < surplus; i++)
mouseBuf = mouseBuf[idx+i];
mouseIdx = surplus;
}
#include "qmouselinuxtp_qws.moc"
#endif //QT_NO_QWS_MOUSE_LINUXTP
[ 本帖最后由 lpzgbd 于 2008-3-5 21:16 编辑 ] |
|