PDA

View Full Version : Problem with QT embedded and touchscreen calibration.



webquinty
2nd July 2008, 11:33
Hello,

After look for a lot of information in the net, now my touchscreen works properly with QT, but now I have tried to calibrate it and I can not do it.

There is a function called "Calibrate::sanityCheck()" that return me all time false but I do not understand why is the reason.

This is the source code:


bool Calibrate::sanityCheck()
{
#ifdef QWS
QPoint tl = cd.devPoints[QWSPointerCalibrationData::TopLeft];
QPoint tr = cd.devPoints[QWSPointerCalibrationData::TopRight];
QPoint bl = cd.devPoints[QWSPointerCalibrationData::BottomLeft];
QPoint br = cd.devPoints[QWSPointerCalibrationData::BottomRight];

// not needed anywhere .. just calculate it, so it's there
cd. devPoints [QWSPointerCalibrationData::Center] = QRect ( tl, br ). normalize ( ). center ( );

int dlx = QABS( bl. x ( ) - tl. x ( ));
int dly = QABS( bl. y ( ) - tl. y ( ));
int drx = QABS( br. x ( ) - tr. x ( ));
int dry = QABS( br. y ( ) - tr. y ( ));
int dtx = QABS( tr. x ( ) - tl. x ( ));
int dty = QABS( tr. y ( ) - tl. y ( ));
int dbx = QABS( br. x ( ) - bl. x ( ));
int dby = QABS( br. y ( ) - bl. y ( ));

int dl = (int) ::sqrt (( dlx * dlx ) + ( dly * dly )); // calculate vector lengths for all sides
int dr = (int) ::sqrt (( drx * drx ) + ( dry * dry ));
int dt = (int) ::sqrt (( dtx * dtx ) + ( dty * dty ));
int db = (int) ::sqrt (( dbx * dbx ) + ( dby * dby ));

// Calculate leeway for x/y (we do not care if diff1/diff2 is for x or y here !)
int diff1 = QABS( dl - dr );
int avg1 = ( dl + dr ) / 2;
int diff2 = QABS( dt - db );
int avg2 = ( dt + db ) / 2;

// Calculate leeway for "real" vector length against "manhattan" vector length
// This is a check, if the rect is rotated (other then 0/90/180/270)
// It needs to be performed only for the triange (bl, tl, tr)
int diff3 = QABS(( dlx + dly + dtx + dty ) - ( dl + dt ));
int avg3 = (( dlx + dly + dtx + dty ) + ( dl + dt )) / 2;

if (( diff1 > ( avg1 / 20 )) || // 5% leeway
( diff2 > ( avg2 / 20 )) ||
( diff3 > ( avg3 / 20 )))
return false;
else
return true;
#else
return true;
#endif
}

Values of diff1, avg1, diff2, avg2, diff3, avg3:

diff1 = 5
avg1 = 591 -->> diff1 > avg1/20 -- 5 > 29

diff2 = 11
avg2 = 386 -->> diff2 > avg2/20 -- 11 > 19

diff3 = 364
avg3 = 1168 -->> diff3 > avg3/20 -- 364 > 58

Then, my problem is diff3 and avg3.

Any advice??
Best regards.