The NX console appears to be fully functional

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4536 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo
2012-03-28 19:29:30 +00:00
parent 9e5d37dcdd
commit 61c5ec1bc7
18 changed files with 164 additions and 92 deletions
+34 -11
View File
@@ -47,6 +47,8 @@
#include <errno.h>
#include <debug.h>
#include <nuttx/kmalloc.h>
#include <nuttx/nx/nx.h>
#include <nuttx/nx/nxtk.h>
#include <nuttx/nx/nxfonts.h>
@@ -103,14 +105,16 @@
* Name: nxcon_freeglyph
****************************************************************************/
#ifdef CONFIG_NXCONSOLE_FONTCACHE
static void nxcon_freeglyph(FAR struct nxcon_glyph_s *glyph)
{
if (glyph->bitmap)
{
free(glyph->bitmap);
kfree(glyph->bitmap);
}
memset(glyph, 0, sizeof(struct nxcon_glyph_s));
}
#endif
/****************************************************************************
* Name: nxcon_allocglyph
@@ -183,9 +187,6 @@ nxcon_allocglyph(FAR struct nxcon_state_s *priv)
luglyph->usecnt = 1;
return luglyph;
#else
/* TODO: Instead allocating an freeing, just allocate the max glyph once */
nxcon_freeglyph(&priv->glyph);
return &priv->glyph;
#endif
}
@@ -236,7 +237,6 @@ nxcon_renderglyph(FAR struct nxcon_state_s *priv,
#if CONFIG_NXCONSOLE_BPP < 8
nxgl_mxpixel_t pixel;
#endif
int bmsize;
int row;
int col;
int ret;
@@ -255,29 +255,50 @@ nxcon_renderglyph(FAR struct nxcon_state_s *priv,
glyph->width = fbm->metric.width + fbm->metric.xoffset;
glyph->height = fbm->metric.height + fbm->metric.yoffset;
/* Allocate memory to hold the glyph with its offsets */
/* Get the physical width of the glyph in bytes */
glyph->stride = (glyph->width * CONFIG_NXCONSOLE_BPP + 7) / 8;
bmsize = glyph->stride * glyph->height;
glyph->bitmap = (FAR uint8_t *)malloc(bmsize);
/* Allocate memory to hold the glyph with its offsets */
#ifdef CONFIG_NXCONSOLE_FONTCACHE
{
DEBUGASSERT(glyph->bitmap == NULL);
int bmsize = glyph->stride * glyph->height;
glyph->bitmap = (FAR uint8_t *)kmalloc(bmsize);
}
#else
DEBUGASSERT(glyph->bitmap != NULL);
#endif
if (glyph->bitmap)
{
/* Initialize the glyph memory to the background color */
/* Initialize the glyph memory to the background color using the
* hard-coded bits-per-pixel (BPP).
*
* TODO: The rest of NX is configured to support multiple devices
* with differing BPP. They logic should be extended to support
* differing BPP's as well.
*/
#if CONFIG_NXCONSOLE_BPP < 8
pixel = priv->wcolor[0];
# if CONFIG_NXCONSOLE_BPP == 1
/* Pack 1-bit pixels into a 2-bits */
pixel &= 0x01;
pixel = (pixel) << 1 |pixel;
pixel = (pixel) << 1 | pixel;
# endif
# if CONFIG_NXCONSOLE_BPP < 4
/* Pack 2-bit pixels into a nibble */
pixel &= 0x03;
pixel = (pixel) << 2 |pixel;
pixel = (pixel) << 2 | pixel;
# endif
/* Pack 4-bit nibbles into a byte */
@@ -323,7 +344,9 @@ nxcon_renderglyph(FAR struct nxcon_state_s *priv,
/* Actually, the RENDERER never returns a failure */
gdbg("nxcon_renderglyph: RENDERER failed\n");
#ifdef CONFIG_NXCONSOLE_FONTCACHE
nxcon_freeglyph(glyph);
#endif
glyph = NULL;
}
}
-47
View File
@@ -55,53 +55,6 @@
/****************************************************************************
* Definitions
****************************************************************************/
/* Configuration ************************************************************/
/* The maximum number of characters that can be remembered */
#ifndef CONFIG_NXCONSOLE_MXCHARS
# define CONFIG_NXCONSOLE_MXCHARS 128
#endif
/* Font cache -- this is the number or pre-rendered font glyphs that can be
* remembered.
*/
#ifdef CONFIG_NXCONSOLE_FONTCACHE
# ifndef CONFIG_NXCONSOLE_CACHESIZE
# define CONFIG_NXCONSOLE_CACHESIZE 16
# endif
#else
# 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 */
#ifndef CONFIG_NXCONSOLE_LINESEPARATION
# define CONFIG_NXCONSOLE_LINESEPARATION 2
#endif
/* NxConsole Definitions ****************************************************/
/* Bitmap flags */
+21
View File
@@ -41,6 +41,7 @@
#include <stdint.h>
#include <stdbool.h>
#include <semaphore.h>
#include <assert.h>
#include <errno.h>
#include <debug.h>
@@ -112,6 +113,25 @@ void nxcon_redraw(NXCONSOLE handle, FAR const struct nxgl_rect_s *rect, bool mor
priv = (FAR struct nxcon_state_s *)handle;
/* Get exclusive access to the state structure */
do
{
ret = sem_wait(&priv->exclsem);
/* Check for errors */
if (ret < 0)
{
/* The only expected error is if the wait failed because of it
* was interrupted by a signal.
*/
DEBUGASSERT(errno == EINTR);
}
}
while (ret < 0);
/* Fill the rectangular region with the window background color */
ret = priv->ops->fill(priv, rect, priv->wndo.wcolor);
@@ -128,4 +148,5 @@ void nxcon_redraw(NXCONSOLE handle, FAR const struct nxgl_rect_s *rect, bool mor
{
nxcon_fillchar(priv, rect, &priv->bm[i]);
}
ret = sem_post(&priv->exclsem);
}
+20 -1
View File
@@ -120,13 +120,32 @@ FAR struct nxcon_state_s *
priv->fwidth = fontset->mxwidth;
priv->spwidth = fontset->spwidth;
/* Set up the text caches */
/* Set up the text cache */
priv->maxchars = CONFIG_NXCONSOLE_MXCHARS;
/* Set up the font glyph bitmap cache (if enabled) */
#ifdef CONFIG_NXCONSOLE_FONTCACHE
priv->maxglyphs = CONFIG_NXCONSOLE_CACHESIZE;
#endif
/* Pre-allocate maximal sized glyph bitmap memory (only if we are not
* using the glyph cache.
*/
#ifndef CONFIG_NXCONSOLE_FONTCACHE
{
int allocsize = (priv->fheight * priv->fwidth * CONFIG_NXCONSOLE_BPP + 7) >> 3;
priv->glyph.bitmap = (FAR uint8_t *)kmalloc(allocsize);
if (!priv->glyph.bitmap)
{
gdbg("Failed to allocate glyph memory\n");
goto errout;
}
}
#endif
/* Set the initial display position */
nxcon_home(priv);
@@ -97,6 +97,12 @@ void nxcon_unregister(NXCONSOLE handle)
priv = (FAR struct nxcon_state_s *)handle;
sem_destroy(&priv->exclsem);
/* Free the pre-allocated glyph bitmap */
#ifndef CONFIG_NXCONSOLE_FONTCACHE
kfree(priv->glyph.bitmap);
#endif
/* Unregister the driver */
snprintf(devname, NX_DEVNAME_SIZE, NX_DEVNAME_FORMAT, priv->minor);
+1 -1
View File
@@ -94,7 +94,7 @@ void nx_disconnect(NXHANDLE handle)
/* Inform the server that this client no longer exists */
msg.msgid = NX_SVRMSG_CONNECT;
msg.msgid = NX_SVRMSG_DISCONNECT;
msg.conn = conn;
ret = mq_send(conn->cwrmq, &msg, sizeof(struct nxsvrmsg_s), NX_SVRMSG_PRIO);
+1 -1
View File
@@ -1,7 +1,7 @@
/****************************************************************************
* graphics/nxmu/nx_releasebkgd.c
*
* Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved.
* Copyright (C) 2008-2009, 2011-2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
-25
View File
@@ -129,31 +129,6 @@ static inline void nxmu_connect(FAR struct nxfe_conn_s *conn)
}
}
/****************************************************************************
* Name: nxmu_release
****************************************************************************/
static int nxmu_release(FAR struct nxfe_state_s *fe)
{
FAR struct nxbe_window_s *wnd;
struct nxclimsg_s outmsg;
int ret;
/* Don't want windows to close while we do this */
for (wnd = fe->be.topwnd; wnd; wnd = wnd->below)
{
outmsg.msgid = NX_CLIMSG_DISCONNECTED;
ret = mq_send(wnd->conn->swrmq, &outmsg, sizeof(struct nxclimsg_s), NX_CLIMSG_PRIO);
if (ret < 0)
{
gdbg("mq_send failed: %d\n", errno);
}
}
return OK;
}
/****************************************************************************
* Name: nxmu_shutdown
****************************************************************************/