NxWM::CCalibration: Add an option to provide some instructions in the center of the calibration screen

This commit is contained in:
Gregory Nutt 2013-10-14 14:52:17 -06:00
parent c62e1b5cc4
commit 1393518ba7
8 changed files with 250 additions and 40 deletions

View File

@ -380,3 +380,8 @@
Petteri Aimonen (2013-6-4).
1.9 2013-xx-xx Gregory Nutt <gnutt@nuttx.org>
* NxWM::CCalibration.cxx/hxx: If CONFIG_NXWM_CALIBRATION_MESSAGES is
defined then CCalibration will provide some instructions in the center
of the display (2013-10-14).

40
Kconfig
View File

@ -718,6 +718,17 @@ endif
comment "Calibration display settings"
config NXWM_CALIBRATION_MARGIN
int "Calibration Margin"
default 40
---help---
The Calbration display consists of a target press offset from the edges
of the display by this number of pixels (in the horizontal direction)
or rows (in the vertical). The closer that you can comfortabley
position the press positions to the edge, the more accurate will be the
linear interpolation (provide that the hardware provides equally good
measurements near the edges).
config NXWM_CALIBRATION_CUSTOM_COLORS
bool "Custom Calibration Colors"
default n
@ -754,6 +765,35 @@ config NXWM_CALIBRATION_TOUCHEDCOLOR
the touch is recorder. Default: RGB(255, 255, 96) (very light yellow)
endif
config NXWM_CALIBRATION_MESSAGES
bool "Add Instructions in Center"
default n
---help---
By default, the calibration screen is clear excecpt for the
calibratino touchpoints. If this options are enabled, then
instructions when to touch and when to release the touch will
be added in the center of the display,
if NXWM_CALIBRATION_MESSAGES
config NXWM_CALIBRATION_CUSTOM_FONTID
bool "Use a Custom Font in Calibration Display"
default n
---help---
Set to override the system default font id (NXFONT_DEFAULT).
if NXWM_CALIBRATION_CUSTOM_FONTID
config NXWM_CALIBRATION_FONTID
int "Calibration Font ID"
default 0
---help---
Use this default NxWidgets font ID instead of the system font ID
(NXFONT_DEFAULT). Default: 0
endif
endif
config NXWM_CUSTOM_CALIBRATION_ICON
bool "Custom Calibration Icon"
default n

View File

@ -73,7 +73,7 @@
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
@ -88,11 +88,11 @@
/****************************************************************************
* Pre-Processor Definitions
****************************************************************************/
/****************************************************************************
* Implementation Classes
****************************************************************************/
#if defined(__cplusplus)
namespace NXWidgets
@ -150,7 +150,7 @@ namespace NXWidgets
*
* @see redraw()
*/
virtual void drawContents(CGraphicsPort *port);
/**
@ -240,7 +240,7 @@ namespace NXWidgets
*/
virtual void setTextAlignmentVert(TextAlignmentVert alignment);
/**
* Set the horizontal alignment of text within the label.
*
@ -262,7 +262,7 @@ namespace NXWidgets
{
return m_vAlignment;
}
/**
* Returns the string shown in the label.
*

View File

@ -74,7 +74,7 @@
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <sys/types.h>
@ -122,7 +122,7 @@ namespace NXWidgets
{
private:
friend class CStringIterator;
int m_stringLength; /**< Number of characters in the string */
int m_allocatedSize; /**< Number of bytes allocated for this string */
int m_growAmount; /**< Number of chars that the string grows by

View File

@ -70,7 +70,7 @@
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <sys/types.h>
@ -119,7 +119,7 @@ CLabel::CLabel(CWidgetControl *pWidgetControl,
m_vAlignment = TEXT_ALIGNMENT_VERT_CENTER;
// The border thickness is 1 pixel
m_borderSize.top = 1;
m_borderSize.right = 1;
m_borderSize.bottom = 1;
@ -272,7 +272,7 @@ void CLabel::setFont(CNxFont *font)
*
* @see redraw()
*/
void CLabel::drawContents(CGraphicsPort *port)
{
// Get the drawing area (excluding the border)
@ -318,7 +318,7 @@ void CLabel::drawContents(CGraphicsPort *port)
CNxFont* font = getFont();
int height = font->getHeight();
int width = font->getStringWidth(m_text);
// Draw the background (excluding the border and the text area)
port->drawFilledRect(rect.getX(), rect.getY(),
@ -393,7 +393,7 @@ void CLabel::calculateTextPositionVertical(void)
case TEXT_ALIGNMENT_VERT_TOP:
m_align.y = 0;
break;
case TEXT_ALIGNMENT_VERT_BOTTOM:
m_align.y = height - getFont()->getHeight();
break;
@ -409,7 +409,7 @@ void CLabel::calculateTextPositionHorizontal(void)
{
CRect rect;
getClientRect(rect);
nxgl_coord_t width = rect.getWidth();
switch (m_hAlignment)

View File

@ -32,7 +32,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#ifndef __INCLUDE_CCALIBRATION_HXX
#define __INCLUDE_CCALIBRATION_HXX
@ -48,6 +48,8 @@
#include "cnxstring.hxx"
#include "cwidgeteventhandler.hxx"
#include "cwidgetcontrol.hxx"
#include "clabel.hxx"
#include "cnxfont.hxx"
#include "ctaskbar.hxx"
#include "iapplication.hxx"
@ -146,6 +148,10 @@ namespace NxWM
CTaskbar *m_taskbar; /**< The taskbar (used to terminate calibration) */
CFullScreenWindow *m_window; /**< The window for the calibration display */
CTouchscreen *m_touchscreen; /**< The touchscreen device */
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
NXWidgets::CLabel *m_text; /**< Calibration message */
NXWidgets::CNxFont *m_font; /**< The font used in the message */
#endif
pthread_t m_thread; /**< The calibration thread ID */
struct SCalibScreenInfo m_screenInfo; /**< Describes the current calibration display */
struct nxgl_point_s m_touchPos; /**< This is the last touch position */

View File

@ -39,7 +39,7 @@
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/input/touchscreen.h>
@ -116,7 +116,7 @@
*
* CONFIG_NXWM_DEFAULT_BACKGROUNDCOLOR - Normal background color. Default:
* MKRGB(148,189,215)
* CONFIG_NXWM_DEFAULT_SELECTEDBACKGROUNDCOLOR - Select background color.
* CONFIG_NXWM_DEFAULT_SELECTEDBACKGROUNDCOLOR - Select background color.
* Default: MKRGB(206,227,241)
* CONFIG_NXWM_DEFAULT_SHINEEDGECOLOR - Color of the bright edge of a border.
* Default: MKRGB(255,255,255)
@ -265,7 +265,7 @@
* CONFIG_NXWM_STARTWINDOW_HSPACING - Horizontal spacing. Default: 4 rows
* CONFIG_NXWM_STARTWINDOW_ICON - The glyph to use as the start window icon
* CONFIG_NXWM_STARTWINDOW_MQNAME - The well known name of the message queue
* Used to communicated from CWindowMessenger to the start window thread.
* Used to communicated from CWindowMessenger to the start window thread.
* Default: "/dev/nxwm"
* CONFIG_NXWM_STARTWINDOW_MXMSGS - The maximum number of messages to queue
* before blocking. Defualt 32
@ -465,8 +465,10 @@
* CONFIG_NXWM_CALIBRATION_CIRCLECOLOR - The color of the circle in the
* touchscreen calibration display. Default: MKRGB(255, 255, 255) (white)
* CONFIG_NXWM_CALIBRATION_TOUCHEDCOLOR - The color of the circle in the
* touchscreen calibration display after the touch is recorder. Default:
* touchscreen calibration display after the touch is recorder. Default:
* MKRGB(255, 255, 96) (very light yellow)
* CONFIG_NXWM_CALIBRATION_FONTID - Use this default NxWidgets font ID
* instead of the system font ID (NXFONT_DEFAULT).
* CONFIG_NXWM_CALIBRATION_ICON - The ICON to use for the touchscreen
* calibration application. Default: NxWM::g_calibrationBitmap
* CONFIG_NXWM_CALIBRATION_SIGNO - The realtime signal used to wake up the
@ -475,6 +477,13 @@
* thread. Default: SCHED_PRIORITY_DEFAULT
* CONFIG_NXWM_CALIBRATION_LISTENERSTACK - Calibration listener thread stack
* size. Default 2048
* CONFIG_NXWM_CALIBRATION_MARGIN
* The Calbration display consists of a target press offset from the edges
* of the display by this number of pixels (in the horizontal direction)
* or rows (in the vertical). The closer that you can comfortabley
* position the press positions to the edge, the more accurate will be the
* linear interpolation (provide that the hardware provides equally good
* measurements near the edges).
*/
#ifndef CONFIG_NXWM_CALIBRATION_BACKGROUNDCOLOR
@ -493,6 +502,10 @@
# define CONFIG_NXWM_CALIBRATION_TOUCHEDCOLOR MKRGB(255, 255, 96)
#endif
#ifndef CONFIG_NXWM_CALIBRATION_FONTID
# define CONFIG_NXWM_CALIBRATION_FONTID NXFONT_DEFAULT
#endif
#ifndef CONFIG_NXWM_CALIBRATION_ICON
# define CONFIG_NXWM_CALIBRATION_ICON NxWM::g_calibrationBitmap
#endif
@ -509,6 +522,10 @@
# define CONFIG_NXWM_CALIBRATION_LISTENERSTACK 2048
#endif
#ifndef CONFIG_NXWM_CALIBRATION_MARGIN
# define CONFIG_NXWM_CALIBRATION_MARGIN 40
#endif
/* Hexcalculator applications ***********************************************/
/**
* Calibration display settings:

View File

@ -64,20 +64,30 @@
* Positional/size data for the calibration lines and circles
*/
#define CALIBRATION_LEFTX 40
#define CALIBRATION_RIGHTX (windowSize.w - 41)
#define CALIBRATION_TOPY 40
#define CALIBRATION_BOTTOMY (windowSize.h - 41)
#define CALIBRATION_LEFTX CONFIG_NXWM_CALIBRATION_MARGIN
#define CALIBRATION_RIGHTX (windowSize.w - CONFIG_NXWM_CALIBRATION_MARGIN + 1)
#define CALIBRATION_TOPY CONFIG_NXWM_CALIBRATION_MARGIN
#define CALIBRATION_BOTTOMY (windowSize.h - CONFIG_NXWM_CALIBRATION_MARGIN + 1)
#define CALIBRATION_CIRCLE_RADIUS 16
#define CALIBRATION_LINE_THICKNESS 2
/****************************************************************************
* CCalibration Implementation Classes
* Private Data
****************************************************************************/
using namespace NxWM;
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
static const char g_touchmsg[] = "Touch";
static const char g_againmsg[] = "Again";
static const char g_okmsg[] = "OK";
#endif
/****************************************************************************
* CCalibration Implementation Classes
****************************************************************************/
/**
* CCalibration Constructor
*
@ -99,6 +109,14 @@ CCalibration::CCalibration(CTaskbar *taskbar, CFullScreenWindow *window,
m_calthread = CALTHREAD_NOTRUNNING;
m_calphase = CALPHASE_NOT_STARTED;
m_touched = false;
// Nullify widgets that will be instantiated when the calibration thread
// is started
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
m_text = (NXWidgets::CLabel *)0;
m_font = (NXWidgets::CNxFont *)0;
#endif
}
/**
@ -180,7 +198,7 @@ void CCalibration::stop(void)
if (m_thread != 0)
{
// Is the calibration thread running?
// Is the calibration thread running?
if (isRunning())
{
@ -191,10 +209,15 @@ void CCalibration::stop(void)
m_calthread = CALTHREAD_STOPREQUESTED;
// Try to wake up the calibration thread so that it will see our
// terminatin request
// termination request
gvdbg("Stopping calibration: m_calthread=%d\n", (int)m_calthread);
gvdbg("Stopping calibration: m_calthread=%d\n", (int)m_calthread);
(void)pthread_kill(m_thread, CONFIG_NXWM_CALIBRATION_SIGNO);
// Wait for the calibration thread to exit
FAR pthread_addr_t value;
(void)pthread_join(m_thread, &value);
}
}
}
@ -328,6 +351,9 @@ void CCalibration::touchscreenInput(struct touch_sample_s &sample)
if (!m_touched)
{
m_screenInfo.circleFillColor = CONFIG_NXWM_CALIBRATION_TOUCHEDCOLOR;
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
m_text->setText(g_okmsg);
#endif
showCalibration();
m_touched = true;
}
@ -361,8 +387,11 @@ void CCalibration::touchscreenInput(struct touch_sample_s &sample)
else
{
// No... restore the un-highlighted circle
m_screenInfo.circleFillColor = CONFIG_NXWM_CALIBRATION_CIRCLECOLOR;
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
m_text->setText("");
#endif
showCalibration();
}
}
@ -415,10 +444,6 @@ bool CCalibration::startCalibration(enum ECalThreadState initialState)
return false;
}
// Detach from the pthread so that we do not have any memory leaks
(void)pthread_detach(m_thread);
gvdbg("Calibration thread m_calthread=%d\n", (int)m_calthread);
return true;
}
@ -436,12 +461,87 @@ FAR void *CCalibration::calibration(FAR void *arg)
CCalibration *This = (CCalibration *)arg;
bool stalled = true;
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
// Create widgets that will be used in the calibration display
// Select a font for the calculator
This->m_font = new NXWidgets::
CNxFont((nx_fontid_e)CONFIG_NXWM_CALIBRATION_FONTID,
CONFIG_NXWM_DEFAULT_FONTCOLOR, CONFIG_NXWM_TRANSPARENT_COLOR);
if (!This->m_font)
{
gdbg("ERROR failed to create font\n");
return false;
}
// Recover the window instance contained in the application window
NXWidgets::INxWindow *window = This->m_window->getWindow();
// Get the size of the window
struct nxgl_size_s windowSize;
if (!window->getSize(&windowSize))
{
gdbg("ERROR: Failed to get window size\n");
delete This->m_font;
This->m_font = (NXWidgets::CNxFont *)0;
return false;
}
// How big can the label be?
struct nxgl_size_s labelSize;
labelSize.w = (windowSize.w - 2*CONFIG_NXWM_CALIBRATION_MARGIN - 20);
labelSize.h = This->m_font->getHeight() + 2*4;
// Where should the label be?
struct nxgl_point_s labelPos;
labelPos.x = ((windowSize.w - labelSize.w) / 2);
labelPos.y = ((windowSize.h - labelSize.h) / 2);
// Get the widget control associated with the application window
NXWidgets::CWidgetControl *control = This->m_window->getWidgetControl();
// Create a label to show the calibration message.
This->m_text = new NXWidgets::
CLabel(control, labelPos.x, labelPos.y, labelSize.w, labelSize.h, "");
if (!This->m_text)
{
gdbg("ERROR: Failed to create CLabel\n");
delete This->m_font;
This->m_font = (NXWidgets::CNxFont *)0;
return false;
}
// No border
This->m_text->setBorderless(true);
// Center text
This->m_text->setTextAlignmentHoriz(NXWidgets::CLabel::TEXT_ALIGNMENT_HORIZ_CENTER);
// Disable drawing and events until we are asked to redraw the window
This->m_text->disableDrawing();
This->m_text->setRaisesEvents(false);
// Select the font
This->m_text->setFont(This->m_font);
#endif
// The calibration thread is now running
This->m_calthread = CALTHREAD_RUNNING;
This->m_calphase = CALPHASE_NOT_STARTED;
gvdbg("Started: m_calthread=%d\n", (int)This->m_calthread);
// Loop until calibration completes or we have been requested to terminate
while (This->m_calthread != CALTHREAD_STOPREQUESTED &&
@ -468,7 +568,7 @@ FAR void *CCalibration::calibration(FAR void *arg)
}
// The calibration thread will stall if has been asked to hide the
// display. While stalled, we will just sleep for a bit abd test
// display. While stalled, we will just sleep for a bit and test
// the state again. If we are re-awakened by a redraw(), then we
// will be given a signal which will wake us up immediately.
//
@ -494,14 +594,33 @@ FAR void *CCalibration::calibration(FAR void *arg)
if (This->m_calthread == CALTHREAD_RUNNING)
{
This->touchscreenInput(sample);
}
}
}
}
// Hide the message
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
This->m_text->setText("");
This->m_text->enableDrawing();
This->m_text->redraw();
This->m_text->disableDrawing();
#endif
// Perform the final steps of calibration
This->finishCalibration();
// Destroy widgets
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
delete This->m_text;
This->m_text = (NXWidgets::CLabel *)0;
delete This->m_font;
This->m_font = (NXWidgets::CNxFont *)0;
#endif
gvdbg("Terminated: m_calthread=%d\n", (int)This->m_calthread);
return (FAR void *)0;
}
@ -552,6 +671,9 @@ void CCalibration::stateMachine(void)
m_screenInfo.pos.y = CALIBRATION_TOPY;
m_screenInfo.lineColor = CONFIG_NXWM_CALIBRATION_LINECOLOR;
m_screenInfo.circleFillColor = CONFIG_NXWM_CALIBRATION_CIRCLECOLOR;
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
m_text->setText(g_touchmsg);
#endif
showCalibration();
// Then set up the current state
@ -568,7 +690,7 @@ void CCalibration::stateMachine(void)
m_calibData[CALIB_UPPER_LEFT_INDEX].x = m_touchPos.x;
m_calibData[CALIB_UPPER_LEFT_INDEX].y = m_touchPos.y;
// Clear the previous screen by re-drawing it using the backgro9und
// Clear the previous screen by re-drawing it using the background
// color. That is much faster than clearing the whole display
m_screenInfo.lineColor = CONFIG_NXWM_CALIBRATION_BACKGROUNDCOLOR;
@ -581,6 +703,9 @@ void CCalibration::stateMachine(void)
m_screenInfo.pos.y = CALIBRATION_TOPY;
m_screenInfo.lineColor = CONFIG_NXWM_CALIBRATION_LINECOLOR;
m_screenInfo.circleFillColor = CONFIG_NXWM_CALIBRATION_CIRCLECOLOR;
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
m_text->setText(g_touchmsg);
#endif
showCalibration();
// Then set up the current state
@ -610,6 +735,9 @@ void CCalibration::stateMachine(void)
m_screenInfo.pos.y = CALIBRATION_BOTTOMY;
m_screenInfo.lineColor = CONFIG_NXWM_CALIBRATION_LINECOLOR;
m_screenInfo.circleFillColor = CONFIG_NXWM_CALIBRATION_CIRCLECOLOR;
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
m_text->setText(g_touchmsg);
#endif
showCalibration();
// Then set up the current state
@ -639,6 +767,9 @@ void CCalibration::stateMachine(void)
m_screenInfo.pos.y = CALIBRATION_BOTTOMY;
m_screenInfo.lineColor = CONFIG_NXWM_CALIBRATION_LINECOLOR;
m_screenInfo.circleFillColor = CONFIG_NXWM_CALIBRATION_CIRCLECOLOR;
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
m_text->setText(g_touchmsg);
#endif
showCalibration();
// Then set up the current state
@ -660,6 +791,9 @@ void CCalibration::stateMachine(void)
m_screenInfo.lineColor = CONFIG_NXWM_CALIBRATION_BACKGROUNDCOLOR;
m_screenInfo.circleFillColor = CONFIG_NXWM_CALIBRATION_BACKGROUNDCOLOR;
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
m_text->setText(g_touchmsg);
#endif
showCalibration();
// Inform any waiter that calibration is complete
@ -711,14 +845,22 @@ void CCalibration::showCalibration(void)
m_screenInfo.circleFillColor);
/* Draw horizontal line */
port->drawFilledRect(0, m_screenInfo.pos.y, windowSize.w, CALIBRATION_LINE_THICKNESS,
m_screenInfo.lineColor);
/* Draw vertical line */
port->drawFilledRect(m_screenInfo.pos.x, 0, CALIBRATION_LINE_THICKNESS, windowSize.h,
m_screenInfo.lineColor);
/* Show the touchscreen message */
#ifdef CONFIG_NXWM_CALIBRATION_MESSAGES
m_text->enableDrawing();
m_text->redraw();
m_text->disableDrawing();
#endif
}
/**
@ -733,7 +875,7 @@ void CCalibration::finishCalibration(void)
if (m_calphase == CALPHASE_COMPLETE)
{
// Yes... Get the final Calibration data
struct SCalibrationData caldata;
if (createCalibrationData(caldata))
{
@ -773,7 +915,7 @@ bool CCalibration::createCalibrationData(struct SCalibrationData &data)
struct nxgl_size_s windowSize;
if (!window->getSize(&windowSize))
{
gdbg("NXWidgets::INxWindow::getSize failed\n");
gdbg("NXWidgets::INxWindow::getSize failed\n");
return false;
}