NX console driver is code complete but untested

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4529 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo
2012-03-27 19:40:49 +00:00
parent f5211035ab
commit 7ce2f90034
13 changed files with 635 additions and 36 deletions
+41 -8
View File
@@ -34,6 +34,9 @@ at the present, but here is the longer term roadmap:
and without NXTOOLKIT for raw access to window memory.
NXGLIB - Low level graphics utilities and direct framebuffer rendering logic.
NX is built on top of NXGLIB.
NxConsole - NxConsole is a write-only character device that is built on top of
an NX window. This character device can be used to provide stdout
and stderr and, hence, can provide the output side of NuttX console.
Related Header Files
^^^^^^^^^^^^^^^^^^^^
@@ -150,10 +153,10 @@ Installing New Fonts
genfontsources:
ifeq ($(CONFIG_NXFONT_SANS23X27),y)
@$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=1 EXTRADEFINES=$(EXTRADEFINES)
@$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=1 EXTRADEFINES=$(EXTRADEFINES)
endif
ifeq ($(CONFIG_NXFONT_MYFONT),y)
@$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=2 EXTRADEFINES=$(EXTRADEFINES)
@$(MAKE) -C nxfonts -f Makefile.sources TOPDIR=$(TOPDIR) NXFONTS_FONTID=2 EXTRADEFINES=$(EXTRADEFINES)
endif
6. nuttx/graphics/nxfonts/Make.defs. Set the make variable NXFSET_CSRCS.
@@ -161,10 +164,10 @@ Installing New Fonts
NXFONTS_FONTID=2:
ifeq ($(CONFIG_NXFONT_SANS23X27),y)
NXFSET_CSRCS += nxfonts_bitmaps_sans23x27.c
NXFSET_CSRCS += nxfonts_bitmaps_sans23x27.c
endif
ifeq ($(CONFIG_NXFONT_MYFONT),y)
NXFSET_CSRCS += nxfonts_bitmaps_myfont.c
NXFSET_CSRCS += nxfonts_bitmaps_myfont.c
endif
7. nuttx/graphics/nxfonts/Makefile.sources. This is the Makefile used
@@ -175,12 +178,12 @@ Installing New Fonts
was used in nuttx/graphics/nxfonts/Make.defs):
ifeq ($(NXFONTS_FONTID),1)
NXFONTS_PREFIX := g_sans23x27_
GEN_CSRC = nxfonts_bitmaps_sans23x27.c
NXFONTS_PREFIX := g_sans23x27_
GEN_CSRC = nxfonts_bitmaps_sans23x27.c
endif
ifeq ($(NXFONTS_FONTID),2)
NXFONTS_PREFIX := g_myfont_
GEN_CSRC = nxfonts_bitmaps_myfont.c
NXFONTS_PREFIX := g_myfont_
GEN_CSRC = nxfonts_bitmaps_myfont.c
endif
8. graphics/nxfonts/nxfonts_bitmaps.c. This is the file that contains
@@ -314,6 +317,36 @@ CONFIG_NXFONT_SERIF38X49B
This option enables support for a large, 38x49 bold font (with serifs)
(font ID FONTID_SERIF38X49B == 13).
NxConsole Configuration Settings:
CONFIG_NXCONSOLE_BPP
Currently, NxConsole supports only a single pixel depth. This
configuration setting must be provided to support that single pixel depth.
Default: The smallest enabled pixel depth. (see CONFIG_NX_DISABLE_*BPP)
CONFIG_NXCONSOLE_NOGETRUN
NxConsole needs to know if it can read from the LCD or not. If reading
from the LCD is supported, then NxConsole can do more efficient
scrolling. Default: Supported
CONFIG_NXCONSOLE_MXCHARS
NxConsole needs to remember every character written to the console so
that it can redraw the window. This setting determines the size of some
internal memory allocations used to hold the character data. Default: 128.
CONFIG_NXCONSOLE_FONTCACHE
If this setting is defined, then caching of fonts will be supported by
NxConsole. Each font must be rendered from the tiny font storage format
to the full display size and pixel depth. If this setting is defined, then
the more recently used font glyphs will be retained in a cache of size
CONFIG_NXCONSOLE_CACHESIZE. Default: No font caching.
CONFIG_NXCONSOLE_CACHESIZE
If CONFIG_NXCONSOLE_FONTCACHE, then this setting will control the size
of the font cache (in number of glyphs). Default: 16.
CONFIG_NXCONSOLE_LINESEPARATION
This the space (in rows) between each row of test. Default: 2
CONFIG_NXCONSOLE_NOWRAP
By default, lines will wrap when the test reaches the right hand side
of the window. This setting can be defining to change this behavior so
that the text is simply truncated until a new line is encountered.
NX Multi-user only options:
CONFIG_NX_BLOCKING
+3 -2
View File
@@ -34,5 +34,6 @@
############################################################################
NXCON_ASRCS =
NXCON_CSRCS = nx_register.c nxcon_driver.c nxcon_font.c nxcon_register.c
NXCON_CSRCS += nxcon_unregister.c nxtk_register.c nxtool_register.c
NXCON_CSRCS = nx_register.c nxcon_driver.c nxcon_font.c nxcon_redraw.c
NXCON_CSRCS += nxcon_register.c nxcon_scroll.c nxcon_unregister.c
NXCON_CSRCS += nxtk_register.c nxtool_register.c
+10
View File
@@ -126,12 +126,21 @@ static ssize_t nxcon_write(FAR struct file *filep, FAR const char *buffer,
FAR struct nxcon_state_s *priv;
char ch;
int lineheight;
int ret;
/* Recover our private state structure */
DEBUGASSERT(filep && filep->f_priv);
priv = (FAR struct nxcon_state_s *)filep->f_priv;
/* Get exclusive access */
ret = sem_wait(&priv->exclsem);
if (ret < 0)
{
return ret;
}
/* Loop writing each character to the display */
lineheight = (priv->fheight + CONFIG_NXCONSOLE_LINESEPARATION);
@@ -185,6 +194,7 @@ static ssize_t nxcon_write(FAR struct file *filep, FAR const char *buffer,
nxcon_putc(priv, (uint8_t)ch);
}
sem_post(&priv->exclsem);
return buflen;
}
+29 -7
View File
@@ -58,8 +58,8 @@
/* Configuration ************************************************************/
/* The maximum number of characters that can be remembered */
#ifndef CONFIG_NXCONSOLE_BMCACHE
# define CONFIG_NXCONSOLE_BMCACHE 128
#ifndef CONFIG_NXCONSOLE_MXCHARS
# define CONFIG_NXCONSOLE_MXCHARS 128
#endif
/* Font cache -- this is the number or pre-rendered font glyphs that can be
@@ -67,11 +67,33 @@
*/
#ifdef CONFIG_NXCONSOLE_FONTCACHE
# ifndef CONFIG_NXCONSOLE_GLCACHE
# define CONFIG_NXCONSOLE_GLCACHE 16
# ifndef CONFIG_NXCONSOLE_CACHESIZE
# define CONFIG_NXCONSOLE_CACHESIZE 16
# endif
#else
# undef CONFIG_NXCONSOLE_GLCACHE
# undef CONFIG_NXCONSOLE_CACHESIZE
#endif
/* Pixel depth */
#ifndef CONFIG_NXCONSOLE_BPP
# if !defined(CONFIG_NX_DISABLE_1BPP)
# define CONFIG_NXCONSOLE_BPP 1
# elif !defined(CONFIG_NX_DISABLE_2BPP)
# define CONFIG_NXCONSOLE_BPP 2
# elif !defined(CONFIG_NX_DISABLE_4BPP)
# define CONFIG_NXCONSOLE_BPP 4
# elif !defined(CONFIG_NX_DISABLE_8BPP)
# define CONFIG_NXCONSOLE_BPP 8
# elif !defined(CONFIG_NX_DISABLE_16BPP)
# define CONFIG_NXCONSOLE_BPP 16
//#elif !defined(CONFIG_NX_DISABLE_24BPP)
//# define CONFIG_NXCONSOLE_BPP 24
# elif !defined(CONFIG_NX_DISABLE_32BPP)
# define CONFIG_NXCONSOLE_BPP 32
# else
# error "No pixel depth provided"
# endif
#endif
/* Space (in rows) between lines */
@@ -164,12 +186,12 @@ struct nxcon_state_s
/* Font cache data storage */
struct nxcon_bitmap_s bm[CONFIG_NXCONSOLE_BMCACHE];
struct nxcon_bitmap_s bm[CONFIG_NXCONSOLE_MXCHARS];
/* Glyph cache data storage */
#ifdef CONFIG_NXCONSOLE_FONTCACHE
struct nxcon_glyph_s glyph[CONFIG_NXCONSOLE_GLCACHE];
struct nxcon_glyph_s glyph[CONFIG_NXCONSOLE_CACHESIZE];
#else
/* A glyph cache of size one -- all fonts will be re-rendered on each use */
+131
View File
@@ -0,0 +1,131 @@
/****************************************************************************
* nuttx/graphics/nxconsole/nxcon_bkgd.c
*
* Copyright (C) 2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
* 3. Neither the name NuttX 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
#include <stdbool.h>
#include <assert.h>
#include <errno.h>
#include <debug.h>
#include <nuttx/nx/nx.h>
#include <nuttx/nx/nxglib.h>
#include "nxcon_internal.h"
/****************************************************************************
* Definitions
****************************************************************************/
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: nxcon_redraw
*
* Description:
* Re-draw a portion of the NX console. This function should be called
* from the appropriate window callback logic.
*
* Input Parameters:
* handle - A handle previously returned by nx_register, nxtk_register, or
* nxtool_register.
* rect - The rectangle that needs to be re-drawn (in window relative
* coordinates)
* more - true: More re-draw requests will follow
*
* Returned Value:
* None
*
****************************************************************************/
void nxcon_redraw(NXCONSOLE handle, FAR const struct nxgl_rect_s *rect, bool more)
{
FAR struct nxcon_state_s *priv;
int ret;
int i;
DEBUGASSERT(handle && rect);
gvdbg("rect={(%d,%d),(%d,%d)} more=%s\n",
rect->pt1.x, rect->pt1.y, rect->pt2.x, rect->pt2.y,
more ? "true" : "false");
/* Recover our private state structure */
priv = (FAR struct nxcon_state_s *)handle;
/* Fill the rectangular region with the window background color */
ret = priv->ops->fill(priv, rect, priv->wndo.wcolor);
if (ret < 0)
{
gdbg("fill failed: %d\n", errno);
}
/* Then redraw each character on the display (Only the characters within
* the rectangle will actually be redrawn).
*/
for (i = 0; i < priv->nchars; i++)
{
nxcon_fillchar(priv, rect, &priv->bm[i]);
}
}
+2 -2
View File
@@ -122,9 +122,9 @@ FAR struct nxcon_state_s *
/* Set up the text caches */
priv->maxchars = CONFIG_NXCONSOLE_BMCACHE;
priv->maxchars = CONFIG_NXCONSOLE_MXCHARS;
#ifdef CONFIG_NXCONSOLE_FONTCACHE
priv->maxglyphs = CONFIG_NXCONSOLE_GLCACHE;
priv->maxglyphs = CONFIG_NXCONSOLE_CACHESIZE;
#endif
/* Set the initial display position */
+239
View File
@@ -0,0 +1,239 @@
/****************************************************************************
* nuttx/graphics/nxconsole/nxcon_scroll.c
*
* Copyright (C) 2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
* 3. Neither the name NuttX 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <semaphore.h>
#include <errno.h>
#include <debug.h>
#include <nuttx/nx/nx.h>
#include <nuttx/nx/nxfonts.h>
#include "nxcon_internal.h"
/****************************************************************************
* Definitions
****************************************************************************/
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: nxcon_movedisplay
*
* Description:
* This function implements the data movement for the scroll operation. If
* we can read the displays framebuffer memory, then the job is pretty
* easy. However, many displays (such as SPI-based LCDs) are often read-
* only.
****************************************************************************/
#ifndef CONFIG_NXCONSOLE_NOGETRUN
static inline void nxcon_movedisplay(FAR struct nxcon_state_s *priv,
int bottom, int scrollheight)
{
FAR struct nxcon_bitmap_s *bm;
struct nxgl_rect_s rect;
nxgl_coord_t row;
int ret;
int i;
/* Move each row, one at a time. They could all be moved at once (by calling
* nxcon_redraw), but the since the region is cleared, then re-written, the
* effect would not be good. Below the region is also cleared and re-written,
* however, in much smaller chunks.
*/
rect.pt1.x = 0;
rect.pt2.x = priv->wndo.wsize.w - 1;
for (row = CONFIG_NXCONSOLE_LINESEPARATION; row < bottom; row += scrollheight)
{
/* Create a bounding box the size of one row of characters */
rect.pt1.y = row;
rect.pt2.y = row + scrollheight - 1;
/* Clear the region */
ret = priv->ops->fill(priv, &rect, priv->wndo.wcolor);
if (ret < 0)
{
gdbg("fill failed: %d\n", errno);
}
/* Fill each character that might lie within in the bounding box */
for (i = 0; i < priv->nchars; i++)
{
bm = &priv->bm[i];
if (bm->pos.y <= rect.pt2.y && bm->pos.y + priv->fheight >= rect.pt1.y)
{
nxcon_fillchar(priv, &rect, bm);
}
}
}
/* Finally, clear the bottom part of the display */
rect.pt1.y = bottom;
rect.pt2.y = priv->wndo.wsize.h- 1;
ret = priv->ops->fill(priv, &rect, priv->wndo.wcolor);
if (ret < 0)
{
gdbg("nxcon_movedisplay: fill failed: %d\n", errno);
}
}
#else
static inline void nxcon_movedisplay(FAR struct nxcon_state_s *priv,
int bottom, int scrollheight)
{
struct nxgl_rect_s rect;
struct nxgl_point_s offset;
int ret;
/* Move the display in the range of 0-height up one scrollheight. The
* line at the bottom will be reset to the background color automatically.
*
* The source rectangle to be moved.
*/
rect.pt1.x = 0;
rect.pt1.y = scrollheight + CONFIG_NXCONSOLE_LINESEPARATION;
rect.pt2.x = priv->wndo.wsize.w - 1;
rect.pt2.y = priv->wndo.wsize.h - 1;
/* The offset that determines how far to move the source rectangle */
offset.x = 0;
offset.y = -scrollheight;
/* Move the source rectangle */
ret = priv->move(priv, &rect, &offset);
if (ret < 0)
{
gdbg("move failed: %d\n", errno);
}
}
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: nxcon_scroll
****************************************************************************/
void nxcon_scroll(FAR struct nxcon_state_s *priv, int scrollheight)
{
int i;
int j;
/* Adjust the vertical position of each character */
for (i = 0; i < priv->nchars; )
{
FAR struct nxcon_bitmap_s *bm = &priv->bm[i];
/* Has any part of this character scrolled off the screen? */
if (bm->pos.y < scrollheight + CONFIG_NXCONSOLE_LINESEPARATION)
{
/* Yes... Delete the character by moving all of the data */
for (j = i; j < priv->nchars-1; j++)
{
memcpy(&priv->bm[j], &priv->bm[j+1], sizeof(struct nxcon_bitmap_s));
}
/* Decrement the number of cached characters ('i' is not incremented
* in this case because it already points to the next character)
*/
priv->nchars--;
}
/* No.. just decrement its vertical position (moving it "up" the
* display by one line).
*/
else
{
bm->pos.y -= scrollheight;
/* We are keeping this one so increment to the next character */
i++;
}
}
/* And move the next display position up by one line as well */
priv->fpos.y -= scrollheight;
/* Move the display in the range of 0-height up one scrollheight. */
nxcon_movedisplay(priv, priv->fpos.y, scrollheight);
}