NXWidgets::CImage needs to catch mouse/touchscreen events; All touchscreen drivers need to report the last valid X/Y data when the screen is untouched.

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4731 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-05-13 18:28:43 +00:00
parent 4da2091db0
commit 776db19800
7 changed files with 103 additions and 34 deletions

View File

@ -2746,4 +2746,7 @@
other logic can use the defaults. other logic can use the defaults.
* graphics/nxtk/nxtk_events.c: Fixed an important but in the logic that * graphics/nxtk/nxtk_events.c: Fixed an important but in the logic that
translates the mouse/touchscreen position data for framed windows and toolbars. translates the mouse/touchscreen position data for framed windows and toolbars.
* drivers/input/stmpe11_tsc.c, tsc2007.c, and ads7843e.c: Need to keep track of
when if positional data is valid. When the touch is released, the X/Y position
of the release must be the same as the X/Y position of the last touch (se that
the release occurs in the same window as the last touch).

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* drivers/input/ads7843e.c * drivers/input/ads7843e.c
* *
* Copyright (C) 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
* Authors: Gregory Nutt <gnutt@nuttx.org> * Authors: Gregory Nutt <gnutt@nuttx.org>
* Diego Sanchez <dsanchez@nx-engineering.com> * Diego Sanchez <dsanchez@nx-engineering.com>
* *
@ -383,9 +383,12 @@ static int ads7843e_sample(FAR struct ads7843e_dev_s *priv,
if (sample->contact == CONTACT_UP) if (sample->contact == CONTACT_UP)
{ {
/* Next.. no contact. Increment the ID so that next contact ID will be unique */ /* Next.. no contact. Increment the ID so that next contact ID
* will be unique. X/Y positions are no longer valid.
*/
priv->sample.contact = CONTACT_NONE; priv->sample.contact = CONTACT_NONE;
priv->sample.valid = false;
priv->id++; priv->id++;
} }
else if (sample->contact == CONTACT_DOWN) else if (sample->contact == CONTACT_DOWN)
@ -584,15 +587,28 @@ static void ads7843e_worker(FAR void *arg)
priv->sample.contact = CONTACT_UP; priv->sample.contact = CONTACT_UP;
} }
/* It is a pen down event. If the last loss-of-contact event has not been
* processed yet, then we have to ignore the pen down event (or else it will
* look like a drag event)
*/
else if (priv->sample.contact == CONTACT_UP)
{
goto errout;
}
else else
{ {
/* Handle all pen down events. First, sample positional values. */ /* Handle pen down events. First, sample positional values. */
priv->sample.x = ads7843e_sendcmd(priv, ADS7843_CMD_XPOSITION); priv->sample.x = ads7843e_sendcmd(priv, ADS7843_CMD_XPOSITION);
priv->sample.y = ads7843e_sendcmd(priv, ADS7843_CMD_YPOSITION); priv->sample.y = ads7843e_sendcmd(priv, ADS7843_CMD_YPOSITION);
(void)ads7843e_sendcmd(priv, ADS7843_CMD_ENABPINIRQ);
/* If this is the first (acknowledged) pend down report, then report /* The X/Y positional data is now valid */
priv->sample.valid = true;
/* If this is the first (acknowledged) pen down report, then report
* this as the first contact. If contact == CONTACT_DOWN, it will be * this as the first contact. If contact == CONTACT_DOWN, it will be
* set to set to CONTACT_MOVE after the contact is first sampled. * set to set to CONTACT_MOVE after the contact is first sampled.
*/ */
@ -621,6 +637,7 @@ static void ads7843e_worker(FAR void *arg)
/* Exit, re-enabling ADS7843E interrupts */ /* Exit, re-enabling ADS7843E interrupts */
errout: errout:
(void)ads7843e_sendcmd(priv, ADS7843_CMD_ENABPINIRQ);
config->enable(config, true); config->enable(config, true);
} }
@ -856,10 +873,21 @@ static ssize_t ads7843e_read(FAR struct file *filep, FAR char *buffer, size_t le
if (sample.contact == CONTACT_UP) if (sample.contact == CONTACT_UP)
{ {
/* Pen is now up */ /* Pen is now up. Is the positional data valid? This is important to
* know because the release will be sent to the window based on its
* last positional data.
*/
if (sample.valid)
{
report->point[0].flags = TOUCH_UP | TOUCH_ID_VALID |
TOUCH_POS_VALID | TOUCH_PRESSURE_VALID;
}
else
{
report->point[0].flags = TOUCH_UP | TOUCH_ID_VALID; report->point[0].flags = TOUCH_UP | TOUCH_ID_VALID;
} }
}
else if (sample.contact == CONTACT_DOWN) else if (sample.contact == CONTACT_DOWN)
{ {
/* First contact */ /* First contact */

View File

@ -1,7 +1,7 @@
/******************************************************************************************** /********************************************************************************************
* drivers/input/ads7843e.h * drivers/input/ads7843e.h
* *
* Copyright (C) 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* References: * References:
@ -115,6 +115,7 @@ struct ads7843e_sample_s
{ {
uint8_t id; /* Sampled touch point ID */ uint8_t id; /* Sampled touch point ID */
uint8_t contact; /* Contact state (see enum ads7843e_contact_e) */ uint8_t contact; /* Contact state (see enum ads7843e_contact_e) */
bool valid; /* True: x,y contain valid, sampled data */
uint16_t x; /* Measured X position */ uint16_t x; /* Measured X position */
uint16_t y; /* Measured Y position */ uint16_t y; /* Measured Y position */
}; };

View File

@ -111,6 +111,7 @@ struct stmpe11_sample_s
{ {
uint8_t id; /* Sampled touch point ID */ uint8_t id; /* Sampled touch point ID */
uint8_t contact; /* Contact state (see enum stmpe11_contact_e) */ uint8_t contact; /* Contact state (see enum stmpe11_contact_e) */
bool valid; /* True: x,y,z contain valid, sampled data */
uint16_t x; /* Measured X position */ uint16_t x; /* Measured X position */
uint16_t y; /* Measured Y position */ uint16_t y; /* Measured Y position */
uint8_t z; /* Measured Z index */ uint8_t z; /* Measured Z index */

View File

@ -242,6 +242,7 @@ static int stmpe11_sample(FAR struct stmpe11_dev_s *priv,
*/ */
priv->sample.contact = CONTACT_NONE; priv->sample.contact = CONTACT_NONE;
priv->sample.valid = false;
priv->id++; priv->id++;
} }
else if (sample->contact == CONTACT_DOWN) else if (sample->contact == CONTACT_DOWN)
@ -537,13 +538,22 @@ static ssize_t stmpe11_read(FAR struct file *filep, FAR char *buffer, size_t len
if (sample.contact == CONTACT_UP) if (sample.contact == CONTACT_UP)
{ {
/* Pen is now up */ /* Pen is now up. Is the positional data valid? This is important to
* know because the release will be sent to the window based on its
* last positional data.
*/
report->point[0].flags = TOUCH_UP | TOUCH_ID_VALID; if (sample.valid)
{
report->point[0].flags = TOUCH_UP | TOUCH_ID_VALID |
TOUCH_POS_VALID | TOUCH_PRESSURE_VALID;
} }
else else
{ {
if (sample.contact == CONTACT_DOWN) report->point[0].flags = TOUCH_UP | TOUCH_ID_VALID;
}
}
else if (sample.contact == CONTACT_DOWN)
{ {
/* First contact */ /* First contact */
@ -557,7 +567,6 @@ static ssize_t stmpe11_read(FAR struct file *filep, FAR char *buffer, size_t len
report->point[0].flags = TOUCH_MOVE | TOUCH_ID_VALID | report->point[0].flags = TOUCH_MOVE | TOUCH_ID_VALID |
TOUCH_POS_VALID | TOUCH_PRESSURE_VALID; TOUCH_POS_VALID | TOUCH_PRESSURE_VALID;
} }
}
ret = SIZEOF_TOUCH_SAMPLE_S(1); ret = SIZEOF_TOUCH_SAMPLE_S(1);
@ -1007,6 +1016,7 @@ void stmpe11_tscworker(FAR struct stmpe11_dev_s *priv, uint8_t intsta)
/* Update the Z pressure index */ /* Update the Z pressure index */
priv->sample.z = stmpe11_getreg8(priv, STMPE11_TSC_DATAZ); priv->sample.z = stmpe11_getreg8(priv, STMPE11_TSC_DATAZ);
priv->sample.valid = true;
/* If this is the first (acknowledged) pen down report, then report /* If this is the first (acknowledged) pen down report, then report
* this as the first contact. If contact == CONTACT_DOWN, it will be * this as the first contact. If contact == CONTACT_DOWN, it will be

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* drivers/input/tsc2007.c * drivers/input/tsc2007.c
* *
* Copyright (C) 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* References: * References:
@ -142,6 +142,7 @@ struct tsc2007_sample_s
{ {
uint8_t id; /* Sampled touch point ID */ uint8_t id; /* Sampled touch point ID */
uint8_t contact; /* Contact state (see enum tsc2007_contact_e) */ uint8_t contact; /* Contact state (see enum tsc2007_contact_e) */
bool valid; /* True: x,y,pressure contain valid, sampled data */
uint16_t x; /* Measured X position */ uint16_t x; /* Measured X position */
uint16_t y; /* Measured Y position */ uint16_t y; /* Measured Y position */
uint16_t pressure; /* Calculated pressure */ uint16_t pressure; /* Calculated pressure */
@ -314,9 +315,12 @@ static int tsc2007_sample(FAR struct tsc2007_dev_s *priv,
if (sample->contact == CONTACT_UP) if (sample->contact == CONTACT_UP)
{ {
/* Next.. no contract. Increment the ID so that next contact ID will be unique */ /* Next.. no contact. Increment the ID so that next contact ID
* will be unique. X/Y positions are no longer valid.
*/
priv->sample.contact = CONTACT_NONE; priv->sample.contact = CONTACT_NONE;
priv->sample.valid = false;
priv->id++; priv->id++;
} }
else if (sample->contact == CONTACT_DOWN) else if (sample->contact == CONTACT_DOWN)
@ -586,6 +590,16 @@ static void tsc2007_worker(FAR void *arg)
goto errout; goto errout;
} }
} }
/* It is a pen down event. If the last loss-of-contact event has not been
* processed yet, then we have to ignore the pen down event (or else it will
* look like a drag event)
*/
else if (priv->sample.contact == CONTACT_UP)
{
goto errout;
}
else else
{ {
/* Handle all pen down events. First, sample X, Y, Z1, and Z2 values. /* Handle all pen down events. First, sample X, Y, Z1, and Z2 values.
@ -678,6 +692,7 @@ static void tsc2007_worker(FAR void *arg)
priv->sample.x = x; priv->sample.x = x;
priv->sample.y = y; priv->sample.y = y;
priv->sample.pressure = pressure; priv->sample.pressure = pressure;
priv->sample.valid = true;
} }
/* Note the availability of new measurements */ /* Note the availability of new measurements */
@ -956,10 +971,21 @@ static ssize_t tsc2007_read(FAR struct file *filep, FAR char *buffer, size_t len
if (sample.contact == CONTACT_UP) if (sample.contact == CONTACT_UP)
{ {
/* Pen is now up */ /* Pen is now up. Is the positional data valid? This is important to
* know because the release will be sent to the window based on its
* last positional data.
*/
if (sample.valid)
{
report->point[0].flags = TOUCH_UP | TOUCH_ID_VALID |
TOUCH_POS_VALID | TOUCH_PRESSURE_VALID;
}
else
{
report->point[0].flags = TOUCH_UP | TOUCH_ID_VALID; report->point[0].flags = TOUCH_UP | TOUCH_ID_VALID;
} }
}
else else
{ {
if (sample.contact == CONTACT_DOWN) if (sample.contact == CONTACT_DOWN)

View File

@ -1,7 +1,7 @@
/******************************************************************************************** /********************************************************************************************
* drivers/input/tsc2007.h * drivers/input/tsc2007.h
* *
* Copyright (C) 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* References: * References: