9
0
Fork 0

Add a test for NX text displays and also a configuration for the STM3210E-EVAL

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@3754 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo 2011-07-08 16:36:26 +00:00
parent ca05c9f1b4
commit 044fedb4a7
17 changed files with 3894 additions and 3 deletions

View File

@ -66,3 +66,6 @@
* Make.defs, namedapp/namedapp.c: Several structural changes made to get a
clean compile under the ez80 ZDS-II toolchain (no design changes).
* apps/examples/buttons: Add a test for the new standardized button interfaces
* apps/examples/nxtext: Add another NX graphics test. This one focus on
placing text on the background while pop-up windows occur. Text should
continue to update normally with or without the popup windows present.

View File

@ -249,7 +249,7 @@ examples/nx
CONFIG_EXAMPLES_NX_BPP.
CONFIG_EXAMPLES_NX_TBCOLOR -- The color of the toolbar. Default depends on
CONFIG_EXAMPLES_NX_BPP.
CONFIG_EXAMPLES_NX_FONTCOLOR -- The color of the toolbar. Default depends on
CONFIG_EXAMPLES_NX_FONTCOLOR -- The color of the fonts. Default depends on
CONFIG_EXAMPLES_NX_BPP.
CONFIG_EXAMPLES_NX_BPP -- Pixels per pixel to use. Valid options
include 2, 4, 8, 16, 24, and 32. Default is 32.
@ -305,6 +305,69 @@ examples/nxflat
the NXFLAT format and installed in a ROMFS file system. At run time,
each program in the ROMFS file system is executed. Requires CONFIG_NXFLAT.
examples/nxtest
^^^^^^^^^^^^^^^
This directory contains another simple test of a subset of the NX APIs
defined in include/nuttx/nx.h. This text focuses on text displays on
the dispaly background combined with pop-up displays over the text.
The text display will continue to update while the pop-up is visible.
The following configuration options can be selected:
CONFIG_EXAMPLES_NXTEXT_VPLANE -- The plane to select from the frame-
buffer driver for use in the test. Default: 0
CONFIG_EXAMPLES_NXTEXT_DEVNO - The LCD device to select from the LCD
driver for use in the test: Default: 0
CONFIG_EXAMPLES_NXTEXT_BGCOLOR -- The color of the background. Default
depends on CONFIG_EXAMPLES_NXTEXT_BPP.
CONFIG_EXAMPLES_NXTEXT_BGFONTCOLOR -- The color of the fonts used in the
background window. Default depends on CONFIG_EXAMPLES_NXTEXT_BPP.
CONFIG_EXAMPLES_NXTEXT_PUCOLOR -- The color of the pop-up window. Default
depends on CONFIG_EXAMPLES_NXTEXT_BPP.
CONFIG_EXAMPLES_NXTEXT_PUFONTCOLOR -- The color of the fonts used in the
background window. Default depends on CONFIG_EXAMPLES_NXTEXT_BPP.
CONFIG_EXAMPLES_NXTEXT_BPP -- Pixels per pixel to use. Valid options
include 2, 4, 8, 16, 24, and 32. Default is 32.
CONFIG_EXAMPLES_NXTEXT_EXTERNINIT - The driver for the graphics device on
this platform requires some unusual initialization. This is the
for, for example, SPI LCD/OLED devices. If this configuration is
selected, then the platform code must provide an LCD initialization
function with a prototype like:
#ifdef CONFIG_NX_LCDDRIVER
FAR struct lcd_dev_s *up_nxdrvinit(unsigned int devno);
#else
FAR struct fb_vtable_s *up_nxdrvinit(unsigned int devno);
#endif
CONFIG_EXAMPLES_NXTEXT_BMCACHE - The maximum number of characters that
can be put in the background window. Default is 128.
CONFIG_EXAMPLES_NXTEXT_GLCACHE - The maximum nuber of pre-rendered
fonts that can be retained for the background window.
This test can be performed with either the single-user version of
NX or with the multiple user version of NX selected with CONFIG_NX_MULTIUSER.
If CONFIG_NX_MULTIUSER is defined, then the following configuration
options also apply:
CONFIG_EXAMPLES_NXTEXT_STACKSIZE -- The stacksize to use when creating
the NX server. Default 2048
CONFIG_EXAMPLES_NXTEXT_CLIENTPRIO -- The client priority. Default: 100
CONFIG_EXAMPLES_NXTEXT_SERVERPRIO -- The server priority. Default: 120
CONFIG_EXAMPLES_NXTEXT_LISTENERPRIO -- The priority of the event listener
thread. Default 80.
CONFIG_EXAMPLES_NXTEXT_NOTIFYSIGNO -- The signal number to use with
nx_eventnotify(). Default: 4
If CONFIG_NX_MULTIUSER is defined, then the example also expects the
following settings and will generate an error if they are not as expected:
CONFIG_DISABLE_MQUEUE=n
CONFIG_DISABLE_SIGNALS=n
CONFIG_DISABLE_PTHREAD=n
CONFIG_NX_BLOCKING=y
examples/null
^^^^^^^^^^^^^

View File

@ -0,0 +1,97 @@
############################################################################
# apps/examples/nxtext/Makefile
#
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
#
# 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.
#
############################################################################
-include $(TOPDIR)/.config
-include $(TOPDIR)/Make.defs
include $(APPDIR)/Make.defs
# NuttX NX Graphics Example.
ASRCS =
CSRCS = nxtext_main.c nxtext_bkgd.c nxtext_popup.c nxtext_putc.c
ifeq ($(CONFIG_NX_MULTIUSER),y)
CSRCS += nxtext_server.c
endif
AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS)
OBJS = $(AOBJS) $(COBJS)
ifeq ($(WINTOOL),y)
BIN = "${shell cygpath -w $(APPDIR)/libapps$(LIBEXT)}"
else
BIN = "$(APPDIR)/libapps$(LIBEXT)"
endif
ROOTDEPPATH = --dep-path .
# Common build
VPATH =
all: .built
.PHONY: clean depend distclean
$(AOBJS): %$(OBJEXT): %.S
$(call ASSEMBLE, $<, $@)
$(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
.built: $(OBJS)
@( for obj in $(OBJS) ; do \
$(call ARCHIVE, $(BIN), $${obj}); \
done ; )
@touch .built
context:
.depend: Makefile $(SRCS)
@$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
@touch $@
depend: .depend
clean:
@rm -f *.o *~ .*.swp .built
$(call CLEAN)
distclean: clean
@rm -f Make.dep .depend
-include Make.dep

View File

@ -0,0 +1,370 @@
/****************************************************************************
* examples/nxtext/nxtext_bkgd.c
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* 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 <semaphore.h>
#include <debug.h>
#include <errno.h>
#include <nuttx/nx.h>
#include <nuttx/nxtk.h>
#include "nxtext_internal.h"
/****************************************************************************
* Definitions
****************************************************************************/
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
static void nxbg_redraw(NXEGWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
bool morem, FAR void *arg);
static void nxbg_position(NXEGWINDOW hwnd, FAR const struct nxgl_size_s *size,
FAR const struct nxgl_point_s *pos,
FAR const struct nxgl_rect_s *bounds,
FAR void *arg);
#ifdef CONFIG_NX_MOUSE
static void nxbg_mousein(NXEGWINDOW hwnd, FAR const struct nxgl_point_s *pos,
uint8_t buttons, FAR void *arg);
#endif
#ifdef CONFIG_NX_KBD
static void nxbg_kbdin(NXWINDOW hwnd, uint8_t nch, FAR const uint8_t *ch,
FAR void *arg)
#endif
/****************************************************************************
* Private Data
****************************************************************************/
static struct nxtext_state_s g_bgstate;
static struct nxtext_bitmap_s g_bgbm[CONFIG_EXAMPLES_NXTEXT_BMCACHE];
static struct nxtext_glyph_s g_bgglyph[CONFIG_EXAMPLES_NXTEXT_GLCACHE];
/****************************************************************************
* Public Data
****************************************************************************/
const struct nx_callback_s g_bkgdcb =
{
nxbg_redraw, /* redraw */
nxbg_position /* position */
#ifdef CONFIG_NX_MOUSE
, nxbg_mousein /* mousein */
#endif
#ifdef CONFIG_NX_KBD
, nxbg_kbdin /* my kbdin */
#endif
};
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: nxbg_fillwindow
****************************************************************************/
static inline void nxbg_fillwindow(NXEGWINDOW hwnd,
FAR const struct nxgl_rect_s *rect,
FAR struct nxtext_state_s *st)
{
int ret;
int i;
ret = nx_fill(hwnd, rect, st->color);
if (ret < 0)
{
message("nxbg_fillwindow: nx_fill failed: %d\n", errno);
}
/* Fill each character on the display (Only the characters within rect
* will actually be redrawn).
*/
#ifdef CONFIG_NX_KBD
nxtext_home(st);
for (i = 0; i < st->nchars; i++)
{
nxtext_fillchar(hwnd, rect, &st->bm[i]);
}
#endif
}
/****************************************************************************
* Name: nxbg_redraw
****************************************************************************/
static void nxbg_redraw(NXEGWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
bool more, FAR void *arg)
{
FAR struct nxtext_state_s *st = (FAR struct nxtext_state_s *)arg;
message("nxbg_redraw: hwnd=%p rect={(%d,%d),(%d,%d)} more=%s\n",
hwnd, rect->pt1.x, rect->pt1.y, rect->pt2.x, rect->pt2.y,
more ? "true" : "false");
nxbg_fillwindow(hwnd, rect, st);
}
/****************************************************************************
* Name: nxbg_position
****************************************************************************/
static void nxbg_position(NXEGWINDOW hwnd, FAR const struct nxgl_size_s *size,
FAR const struct nxgl_point_s *pos,
FAR const struct nxgl_rect_s *bounds,
FAR void *arg)
{
FAR struct nxtext_state_s *st = (FAR struct nxtext_state_s *)arg;
/* Report the position */
message("nxbg_position: hwnd=%p size=(%d,%d) pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n",
hwnd, size->w, size->h, pos->x, pos->y,
bounds->pt1.x, bounds->pt1.y, bounds->pt2.x, bounds->pt2.y);
/* Have we picked off the window bounds yet? */
if (!b_haveresolution)
{
/* Save the window size */
st->wsize.w = size->w;
st->wsize.h = size->h;
/* Save the window limits (these should be the same for all places and all windows */
g_xres = bounds->pt2.x;
g_yres = bounds->pt2.y;
b_haveresolution = true;
sem_post(&g_semevent);
message("nxbg_position: Have xres=%d yres=%d\n", g_xres, g_yres);
}
}
/****************************************************************************
* Name: nxbg_mousein
****************************************************************************/
#ifdef CONFIG_NX_MOUSE
static void nxbg_mousein(NXEGWINDOW hwnd, FAR const struct nxgl_point_s *pos,
uint8_t buttons, FAR void *arg)
{
FAR struct nxtext_state_s *st = (FAR struct nxtext_state_s *)arg;
message("nxbg_mousein: hwnd=%p pos=(%d,%d) button=%02x\n",
hwnd, pos->x, pos->y, buttons);
}
#endif
/****************************************************************************
* Name: nxbg_kbdin
****************************************************************************/
#ifdef CONFIG_NX_KBD
static void nxbg_kbdin(NXWINDOW hwnd, uint8_t nch, FAR const uint8_t *ch,
FAR void *arg)
{
FAR struct nxtext_state_s *st = (FAR struct nxtext_state_s *)arg;
message("nxbg_kbdin: hwnd=%p nch=%d\n", hwnd, nch);
nxbg_puts(hwnd, st, nch, ch);
}
#endif
/****************************************************************************
* Name: nxbg_scroll
****************************************************************************/
static void nxbg_scroll(NXWINDOW hwnd, int lineheight)
{
struct nxgl_rect_s rect;
int i;
int j;
/* Scroll up until the next display position is in the window. We may need
* do this more than once (unlikely)
*/
while (g_bgstate.pos.y >= g_bgstate.wsize.h - lineheight)
{
/* Adjust the vertical position of each character */
for (i = 0; i < g_bgstate.nchars; )
{
FAR struct nxtext_bitmap_s *bm = &g_bgstate.bm[i];
/* Has any part of this character scrolled off the screen? */
if (bm->bounds.pt1.y < lineheight)
{
/* Yes... Delete the character by moving all of the data */
for (j = i; j < g_bgstate.nchars-1; j++)
{
memcpy(&g_bgstate.bm[j], &g_bgstate.bm[j+1], sizeof(struct nxtext_bitmap_s));
}
/* Decrement the number of cached characters (i is not incremented
* in this case because it already points to the next charactger)
*/
g_bgstate.nchars--;
}
/* No.. just decrement its vertical position (moving it "up" the
* display by one line.
*/
else
{
bm->bounds.pt1.y -= lineheight;
bm->bounds.pt2.y -= lineheight;
/* Increment to the next character */
i++;
}
}
/* And move the next display position up by one line as well */
g_bgstate.pos.y -= lineheight;
}
/* Then re-draw the entry display */
rect.pt1.x = 0;
rect.pt1.y = 0;
rect.pt2.x = g_bgstate.wsize.w -1;
rect.pt2.y = g_bgstate.wsize.h -1;
nxbg_fillwindow(hwnd, &rect, &g_bgstate);
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: nxbg_initstate
****************************************************************************/
FAR struct nxtext_state_s *nxbg_getstate(void)
{
FAR const struct nx_font_s *fontset;
/* Initialize the color (used for redrawing the window) */
memset(&g_gbstate, 0, sizeof(struct nxtext_state_s));
g_bgstate.wcolor[0] = CONFIG_EXAMPLES_NXTEXT_BGCOLOR;
g_bgstate.fcolor[0] = CONFIG_EXAMPLES_NXTEXT_BGFONTCOLOR;
/* Get information about the font set being used and save this in the
* state structure
*/
fontset = nxf_getfontset();
g_bgstate.fheight = fontset->mxheight;
g_bgstate.fwidth = fontset->mxwidth;
g_bgstate.spwidth = fontset->spwidth;
/* Set up the text caches */
g_bgstate.maxchars = CONFIG_EXAMPLES_NXTEXT_BMCACHE;
g_bgstate.maxglyphs = CONFIG_EXAMPLES_NXTEXT_GLCACHE;
g_bgstate.bm = g_bgbm;
g_bgstate.glyph = g_bgglyph;
/* Set the first display position */
nxtext_home(st);
return &g_bgstate;
}
/****************************************************************************
* Name: nxbg_puts
****************************************************************************/
void nxbg_puts(NXWINDOW hwnd, FAR const uint8_t *ch)
{
int lineheight = (g_bgstate.fheight + 2);
while (*ch)
{
/* Will another character fit on this line? */
if (g_bgstate.pos.x + b_bgstate.spwidth > bg_state.size.w)
{
/* No.. move to the next line */
nxtext_newline(&g_bgstate);
/* If we were about to output a newline character, then don't */
if (*ch == '\n')
{
ch++;
continue;
}
}
/* Check if we need to scroll up */
if (g_bgstate.pos.y >= g_bgstate.wsize.h - lineheight)
{
nxbg_scroll(hwnd, lineheight);
}
/* Finally, we can output the character */
nxtext_putc(hwnd, &g_bgstate, *ch++);
}
}

View File

@ -0,0 +1,309 @@
/****************************************************************************
* examples/nxtext/nxtext_internal.h
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* 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.
*
****************************************************************************/
#ifndef __EXAMPLES_NXTEXT_NXTEXT_INTERNAL_H
#define __EXAMPLES_NXTEXT_NXTEXT_INTERNAL_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
#include <stdbool.h>
#include <semaphore.h>
#include <nuttx/nx.h>
#include <nuttx/nxtk.h>
/****************************************************************************
* Definitions
****************************************************************************/
/* Configuration ************************************************************/
#ifndef CONFIG_NX
# error "NX is not enabled (CONFIG_NX)"
#endif
#ifndef CONFIG_EXAMPLES_NXTEXT_VPLANE
# define CONFIG_EXAMPLES_NXTEXT_VPLANE 0
#endif
#ifndef CONFIG_EXAMPLES_NXTEXT_BPP
# define CONFIG_EXAMPLES_NXTEXT_BPP 32
#endif
#ifndef CONFIG_EXAMPLES_NXTEXT_BGCOLOR
# if CONFIG_EXAMPLES_NXTEXT_BPP == 24 || CONFIG_EXAMPLES_NXTEXT_BPP == 32
# define CONFIG_EXAMPLES_NXTEXT_BGCOLOR 0x007b68ee
# elif CONFIG_EXAMPLES_NXTEXT_BPP == 16
# define CONFIG_EXAMPLES_NXTEXT_BGCOLOR 0x7b5d
# else
# define CONFIG_EXAMPLES_NXTEXT_BGCOLOR ' '
# endif
#endif
#ifndef CONFIG_EXAMPLES_NXTEXT_PUCOLOR
# if CONFIG_EXAMPLES_NXTEXT_BPP == 24 || CONFIG_EXAMPLES_NXTEXT_BPP == 32
# define CONFIG_EXAMPLES_NXTEXT_PUCOLOR 0x00dcdcdc
# elif CONFIG_EXAMPLES_NXTEXT_BPP == 16
# define CONFIG_EXAMPLES_NXTEXT_PUCOLOR 0xdefb
# else
# define CONFIG_EXAMPLES_NXTEXT_PUCOLOR '2'
# endif
#endif
#ifndef CONFIG_EXAMPLES_NXTEXT_BGFONTCOLOR
# if CONFIG_EXAMPLES_NXTEXT_BPP == 24 || CONFIG_EXAMPLES_NXTEXT_BPP == 32
# define CONFIG_EXAMPLES_NXTEXT_BGFONTCOLOR 0x00000000
# elif CONFIG_EXAMPLES_NXTEXT_BPP == 16
# define CONFIG_EXAMPLES_NXTEXT_BGFONTCOLOR 0x0000
# else
# define CONFIG_EXAMPLES_NXTEXT_BGFONTCOLOR 'F'
# endif
#endif
#ifndef CONFIG_EXAMPLES_NXTEXT_PUFONTCOLOR
# if CONFIG_EXAMPLES_NXTEXT_BPP == 24 || CONFIG_EXAMPLES_NXTEXT_BPP == 32
# define CONFIG_EXAMPLES_NXTEXT_PUFONTCOLOR 0x00000000
# elif CONFIG_EXAMPLES_NXTEXT_BPP == 16
# define CONFIG_EXAMPLES_NXTEXT_PUFONTCOLOR 0x0000
# else
# define CONFIG_EXAMPLES_NXTEXT_PUFONTCOLOR 'F'
# endif
#endif
#ifndef CONFIG_EXAMPLES_NXTEXT_BMCACHE
# define CONFIG_EXAMPLES_NXTEXT_BMCACHE 128
#endif
#ifndef CONFIG_EXAMPLES_NXTEXT_GLCACHE
# if CONFIG_NXFONTS_CHARBITS < 8
# define CONFIG_EXAMPLES_NXTEXT_GLCACHE MIN(CONFIG_EXAMPLES_NXTEXT_BMCACHE, 128)
# else
# define CONFIG_EXAMPLES_NXTEXT_GLCACHE MIN(CONFIG_EXAMPLES_NXTEXT_BMCACHE, 256)
# endif
#endif
#ifdef CONFIG_NX_MULTIUSER
# ifdef CONFIG_DISABLE_MQUEUE
# error "The multi-threaded example requires MQ support (CONFIG_DISABLE_MQUEUE=n)"
# endif
# ifdef CONFIG_DISABLE_SIGNALS
# error "This example requires signal support (CONFIG_DISABLE_SIGNALS=n)"
# endif
# ifdef CONFIG_DISABLE_PTHREAD
# error "This example requires pthread support (CONFIG_DISABLE_PTHREAD=n)"
# endif
# ifndef CONFIG_NX_BLOCKING
# error "This example depends on CONFIG_NX_BLOCKING"
# endif
# ifndef CONFIG_EXAMPLES_NXTEXT_STACKSIZE
# define CONFIG_EXAMPLES_NXTEXT_STACKSIZE 2048
# endif
# ifndef CONFIG_EXAMPLES_NXTEXT_LISTENERPRIO
# define CONFIG_EXAMPLES_NXTEXT_LISTENERPRIO 100
# endif
# ifndef CONFIG_EXAMPLES_NXTEXT_CLIENTPRIO
# define CONFIG_EXAMPLES_NXTEXT_CLIENTPRIO 100
# endif
# ifndef CONFIG_EXAMPLES_NXTEXT_SERVERPRIO
# define CONFIG_EXAMPLES_NXTEXT_SERVERPRIO 120
# endif
# ifndef CONFIG_EXAMPLES_NXTEXT_NOTIFYSIGNO
# define CONFIG_EXAMPLES_NXTEXT_NOTIFYSIGNO 4
# endif
#endif
#define NXEGWINDOW NXWINDOW
#define NXTK_MAXKBDCHARS 16
/* Debug ********************************************************************/
#ifdef CONFIG_CPP_HAVE_VARARGS
# ifdef CONFIG_DEBUG
# define message(...) lib_lowprintf(__VA_ARGS__)
# define msgflush()
# else
# define message(...) printf(__VA_ARGS__)
# define msgflush() fflush(stdout)
# endif
#else
# ifdef CONFIG_DEBUG
# define message lib_lowprintf
# define msgflush()
# else
# define message printf
# define msgflush() fflush(stdout)
# endif
#endif
/****************************************************************************
* Public Types
****************************************************************************/
enum exitcode_e
{
NXEXIT_SUCCESS = 0,
NXEXIT_SIGPROCMASK,
NXEXIT_SCHEDSETPARAM,
NXEXIT_EVENTNOTIFY,
NXEXIT_TASKCREATE,
NXEXIT_PTHREADCREATE,
NXEXIT_EXTINITIALIZE,
NXEXIT_FBINITIALIZE,
NXEXIT_FBGETVPLANE,
NXEXIT_LCDINITIALIZE,
NXEXIT_LCDGETDEV,
NXEXIT_NXOPEN,
NXEXIT_NXREQUESTBKGD
NXEXIT_NXOPENTOOLBAR,
NXEXIT_NXCONNECT,
NXEXIT_NXSETBGCOLOR,
NXEXIT_NXOPENWINDOW,
NXEXIT_NXSETSIZE,
NXEXIT_NXSETPOSITION,
NXEXIT_NXLOWER,
NXEXIT_NXRAISE,
NXEXIT_NXCLOSEWINDOW,
NXEXIT_LOSTSERVERCONN
};
/* Describes one cached glyph bitmap */
struct nxtext_glyph_s
{
uint8_t code; /* Character code */
uint8_t height; /* Height of this glyph (in rows) */
uint8_t width; /* Width of this glyph (in pixels) */
uint8_t stride; /* Width of the glyph row (in bytes) */
FAR uint8_t *bitmap; /* Allocated bitmap memory */
};
/* Describes on character on the display */
struct nxtext_bitmap_s
{
struct nxgl_rect_s bounds; /* Size/position of bitmap */
FAR const struct nxtext_glyph_s *glyph; /* The cached glyph */
};
/* Describes the state of one text display */
struct nxtext_state_s
{
/* The following describe the window */
nxgl_mxpixel_t wcolor[CONFIG_NX_NPLANES]; /* Window color */
struct nxgl_size_s wsize, /* Window size */
/* These characterize the font in use */
nxgl_mxpixel_t fcolor[CONFIG_NX_NPLANES]; /* Font color */
uint8_t fheight; /* Max height of a font in pixels */
uint8_t fwidth; /* Max width of a font in pixels */
uint8_t spwidth; /* The width of a space */
/* This is the next display position */
struct nxgl_point_s pos; /* Next display position */
/* These describe all text already added to the display */
uint8_t maxchars; /* Size of the mb array */
uint8_t maxglyphs; /* Size of the glyph array */
uint8_t nchars; /* Number of chars already displayed */
uint8_t nglyphs; /* Number of glyphs cached */
FAR struct nxtext_bitmap_s *bm;
FAR struct nxtext_glyph_s *glyph;
};
/****************************************************************************
* Public Variables
****************************************************************************/
/* The connecton handler */
extern NXHANDLE g_hnx;
/* NX callback vtables */
extern const struct nx_callback_s g_bkgdcb;
/* The screen resolution */
nxgl_coord_t g_xres;
nxgl_coord_t g_yres;
extern bool b_haveresolution;
#ifdef CONFIG_NX_MULTIUSER
extern bool g_connected;
#endif
extern sem_t g_semevent;
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
#ifdef CONFIG_EXAMPLES_NXTEXT_EXTERNINIT
extern FAR NX_DRIVERTYPE *up_nxdrvinit(unsigned int devno);
#endif
#if defined(CONFIG_NX) && defined(CONFIG_NX_MULTIUSER)
extern int nxtext_server(int argc, char *argv[]);
extern FAR void *nxtext_listener(FAR void *arg);
#endif
/* Background window interfaces */
extern FAR struct nxtext_state_s *nxgb_getstate(void);
extern void nxbg_puts(NXWINDOW hwnd, FAR struct nxtext_state_s *st,
uint8_t nch, FAR const uint8_t *ch)
/* Pop-up window interfaces */
extern NXEGWINDOW nxpu_open(void);
/* Generic text helpers */
extern void nxtext_home(FAR struct nxtext_state_s *st);
extern void nxtext_newline(FAR struct nxtext_state_s *st);
extern void nxtext_putc(NXWINDOW hwnd, FAR struct nxtext_state_s *st,
uint8_t ch);
extern void nxtext_fillchar(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
FAR const struct nxtext_bitmap_s *bm)
#endif /* __EXAMPLES_NXTEXT_NXTEXT_INTERNAL_H */

View File

@ -0,0 +1,494 @@
/****************************************************************************
* examples/nxtext/nxtext_main.c
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* 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 <sys/types.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <sched.h>
#include <pthread.h>
#include <errno.h>
#include <debug.h>
#ifdef CONFIG_NX_LCDDRIVER
# include <nuttx/lcd/lcd.h>
#else
# include <nuttx/fb.h>
#endif
#include <nuttx/arch.h>
#include <nuttx/nx.h>
#include <nuttx/nxglib.h>
#include <nuttx/nxtk.h>
#include <nuttx/nxfonts.h>
#include "nxtext_internal.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Configuration ************************************************************/
/* If not specified, assume that the hardware supports one video plane */
#ifndef CONFIG_EXAMPLES_NXTEXT_VPLANE
# define CONFIG_EXAMPLES_NXTEXT_VPLANE 0
#endif
/* If not specified, assume that the hardware supports one LCD device */
#ifndef CONFIG_EXAMPLES_NXTEXT_DEVNO
# define CONFIG_EXAMPLES_NXTEXT_DEVNO 0
#endif
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
static int g_exitcode = NXEXIT_SUCCESS;
#ifdef CONFIG_NX_KBD
static const uint8_t g_pumsg[] = "Pop-Up!";
static const char *g_bkgdmsg[4] =
{
"Now is the time ",
"for all good men ",
"To come to the aid ",
"of their party "
};
#endif
/****************************************************************************
* Public Data
****************************************************************************/
/* The connecton handler */
NXHANDLE g_hnx = NULL;
/* The screen resolution */
nxgl_coord_t g_xres;
nxgl_coord_t g_yres;
bool b_haveresolution = false;
#ifdef CONFIG_NX_MULTIUSER
bool g_connected = false;
#endif
sem_t g_semevent = {0};
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: nxtext_openwindow
****************************************************************************/
static inline NXEGWINDOW nxtext_openwindow(FAR const struct nx_callback_s *cb,
FAR struct nxtext_state_s *state)
{
NXEGWINDOW hwnd;
hwnd = nx_openwindow(g_hnx, cb, (FAR void *)state);
if (!hwnd)
{
message("user_start: nx_openwindow failed: %d\n", errno);
g_exitcode = NXEXIT_NXOPENWINDOW;
}
return hwnd;
}
/****************************************************************************
* Name: nxtext_closewindow
****************************************************************************/
static inline int nxtext_closewindow(NXEGWINDOW hwnd, FAR struct nxtext_state_s *state)
{
int ret = nx_closewindow(hwnd);
if (ret < 0)
{
message("user_start: nx_closewindow failed: %d\n", errno);
g_exitcode = NXEXIT_NXCLOSEWINDOW;
}
return ret;
}
/****************************************************************************
* Name: nxtext_suinitialize
****************************************************************************/
#ifndef CONFIG_NX_MULTIUSER
static inline int nxtext_suinitialize(void)
{
FAR NX_DRIVERTYPE *dev;
#if defined(CONFIG_EXAMPLES_NXTEXT_EXTERNINIT)
/* Use external graphics driver initialization */
message("nxtext_initialize: Initializing external graphics device\n");
dev = up_nxdrvinit(CONFIG_EXAMPLES_NXTEXT_DEVNO);
if (!dev)
{
message("nxtext_initialize: up_nxdrvinit failed, devno=%d\n", CONFIG_EXAMPLES_NXTEXT_DEVNO);
g_exitcode = NXEXIT_EXTINITIALIZE;
return ERROR;
}
#elif defined(CONFIG_NX_LCDDRIVER)
int ret;
/* Initialize the LCD device */
message("nxtext_initialize: Initializing LCD\n");
ret = up_lcdinitialize();
if (ret < 0)
{
message("nxtext_initialize: up_lcdinitialize failed: %d\n", -ret);
g_exitcode = NXEXIT_LCDINITIALIZE;
return ERROR;
}
/* Get the device instance */
dev = up_lcdgetdev(CONFIG_EXAMPLES_NXTEXT_DEVNO);
if (!dev)
{
message("nxtext_initialize: up_lcdgetdev failed, devno=%d\n", CONFIG_EXAMPLES_NXTEXT_DEVNO);
g_exitcode = NXEXIT_LCDGETDEV;
return ERROR;
}
/* Turn the LCD on at 75% power */
(void)dev->setpower(dev, ((3*CONFIG_LCD_MAXPOWER + 3)/4));
#else
int ret;
/* Initialize the frame buffer device */
message("nxtext_initialize: Initializing framebuffer\n");
ret = up_fbinitialize();
if (ret < 0)
{
message("nxtext_initialize: up_fbinitialize failed: %d\n", -ret);
g_exitcode = NXEXIT_FBINITIALIZE;
return ERROR;
}
dev = up_fbgetvplane(CONFIG_EXAMPLES_NXTEXT_VPLANE);
if (!dev)
{
message("nxtext_initialize: up_fbgetvplane failed, vplane=%d\n", CONFIG_EXAMPLES_NXTEXT_VPLANE);
g_exitcode = NXEXIT_FBGETVPLANE;
return ERROR;
}
#endif
/* Then open NX */
message("nxtext_initialize: Open NX\n");
g_hnx = nx_open(dev);
if (!g_hnx)
{
message("user_start: nx_open failed: %d\n", errno);
g_exitcode = NXEXIT_NXOPEN;
return ERROR;
}
return OK;
}
#endif
/****************************************************************************
* Name: nxtext_initialize
****************************************************************************/
#ifdef CONFIG_NX_MULTIUSER
static inline int nxtext_muinitialize(void)
{
struct sched_param param;
pthread_t thread;
pid_t servrid;
int ret;
/* Set the client task priority */
param.sched_priority = CONFIG_EXAMPLES_NXTEXT_CLIENTPRIO;
ret = sched_setparam(0, &param);
if (ret < 0)
{
message("nxtext_initialize: sched_setparam failed: %d\n" , ret);
g_exitcode = NXEXIT_SCHEDSETPARAM;
return ERROR;
}
/* Start the server task */
message("nxtext_initialize: Starting nxtext_server task\n");
servrid = task_create("NX Server", CONFIG_EXAMPLES_NXTEXT_SERVERPRIO,
CONFIG_EXAMPLES_NXTEXT_STACKSIZE, nxtext_server, NULL);
if (servrid < 0)
{
message("nxtext_initialize: Failed to create nxtext_server task: %d\n", errno);
g_exitcode = NXEXIT_TASKCREATE;
return ERROR;
}
/* Wait a bit to let the server get started */
sleep(1);
/* Connect to the server */
g_hnx = nx_connect();
if (g_hnx)
{
pthread_attr_t attr;
/* Start a separate thread to listen for server events. This is probably
* the least efficient way to do this, but it makes this example flow more
* smoothly.
*/
(void)pthread_attr_init(&attr);
param.sched_priority = CONFIG_EXAMPLES_NXTEXT_LISTENERPRIO;
(void)pthread_attr_setschedparam(&attr, &param);
(void)pthread_attr_setstacksize(&attr, CONFIG_EXAMPLES_NXTEXT_STACKSIZE);
ret = pthread_create(&thread, &attr, nxtext_listener, NULL);
if (ret != 0)
{
printf("nxtext_initialize: pthread_create failed: %d\n", ret);
g_exitcode = NXEXIT_PTHREADCREATE;
return ERROR;
}
/* Don't return until we are connected to the server */
while (!g_connected)
{
/* Wait for the listener thread to wake us up when we really
* are connected.
*/
(void)sem_wait(&g_semevent);
}
}
else
{
message("nxtext_initialize: nx_connect failed: %d\n", errno);
g_exitcode = NXEXIT_NXCONNECT;
return ERROR;
}
return OK;
}
#endif
/****************************************************************************
* Name: nxtext_initialize
****************************************************************************/
static int nxtext_initialize(void)
{
#ifdef CONFIG_NX_MULTIUSER
return nxtext_muinitialize();
#else
return nxtext_suinitialize();
#endif
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: user_start
****************************************************************************/
int user_start(int argc, char *argv[])
{
FAR struct nxtext_state_s *bgstate;
NXEGWINDOW hwnd;
nxgl_mxpixel_t color;
int popcnt;
int bkgndx;
int ret;
/* Seed the random number generator */
srand(0x1234);
/* Initialize NX */
ret = nxtext_initialize();
message("user_start: NX handle=%p\n", g_hnx);
if (!g_hnx || ret < 0)
{
message("user_start: Failed to get NX handle: %d\n", errno);
g_exitcode = NXEXIT_NXOPEN;
goto errout;
}
/* Set the background to the configured background color */
message("user_start: Set background color=%d\n", CONFIG_EXAMPLES_NXTEXT_BGCOLOR);
color = CONFIG_EXAMPLES_NXTEXT_BGCOLOR;
ret = nx_setbgcolor(g_hnx, &color);
if (ret < 0)
{
message("user_start: nx_setbgcolor failed: %d\n", errno);
g_exitcode = NXEXIT_NXSETBGCOLOR;
goto errout_with_nx;
}
/* Get the background window */
bgstate = nxbg_getstate();
ret = nx_requestbkgd(g_hnx, &g_bgcb, bgstate);
if (ret < 0)
{
message("user_start: nx_setbgcolor failed: %d\n", errno);
g_exitcode = NXEXIT_NXREQUESTBKGD;
goto errout_with_nx;
}
/* Wait until we have the screen resolution. We'll have this immediately
* unless we are dealing with the NX server.
*/
while (!b_haveresolution)
{
(void)sem_wait(&g_semevent);
}
message("user_start: Screen resolution (%d,%d)\n", g_xres, g_yres);
/* Now loop, adding text to the background and periodically presenting
* a pop-up window.
*/
popcnt = 0;
bkgndx = 0;
for (;;)
{
/* Sleep for one second */
sleep(1);
popcnt++;
/* Each three seconds, create a pop-up window. Destroy the pop-up
* window after two more seconds.
*/
if (popcnt >= 5)
{
/* Destroy the pop-up window and restart the sequence */
message("user_start: Close pop-up\n");
(void)nxtext_closewindow(hwnd, &g_pustate);
popcnt = 0;
}
else if (popcnt >= 3)
{
/* Create a pop-up window */
hwnd = nxpu_open();
/* Give keyboard input to the top window */
#ifdef CONFIG_NX_KBD
message("user_start: Send keyboard input: %s\n", g_pumsg);
ret = nx_kbdin(g_hnx, strlen((FAR const char *)g_pumsg), g_pumsg);
if (ret < 0)
{
message("user_start: nx_kbdin failed: %d\n", errno);
goto errout_with_hwnd;
}
#endif
}
/* Give another line of text to the background window. Force this
* text to go the background by calling the kbdin method directly.
*/
nxbg_puts(g_hnx, strlen(g_bkgdmsg[bkgndx]), g_bkgdmsg[bkgndx], g_bkgdstate);
#endif
}
/* Close the pop-up window */
errout_with_hwnd:
if (popcnt >= 3)
{
message("user_start: Close pop-up\n");
(void)nxtext_closewindow(hwnd, &g_pustate);
}
errout_with_bkgd:
(void)nx_releasebkgd(g_hnx);
errout_with_nx:
#ifdef CONFIG_NX_MULTIUSER
/* Disconnect from the server */
message("user_start: Disconnect from the server\n");
nx_disconnect(g_hnx);
#else
/* Close the server */
message("user_start: Close NX\n");
nx_close(g_hnx);
#endif
errout:
return g_exitcode;
}

View File

@ -0,0 +1,348 @@
/****************************************************************************
* examples/nxtext/nxtext_popup.c
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* 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 <semaphore.h>
#include <debug.h>
#include <errno.h>
#include <nuttx/nx.h>
#include <nuttx/nxtk.h>
#include "nxtext_internal.h"
/****************************************************************************
* Definitions
****************************************************************************/
#define NBM_CACHE 8
#define NGLYPH_CACHE 8
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
static void nxpu_redraw(NXEGWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
bool morem, FAR void *arg);
static void nxpu_position(NXEGWINDOW hwnd, FAR const struct nxgl_size_s *size,
FAR const struct nxgl_point_s *pos,
FAR const struct nxgl_rect_s *bounds,
FAR void *arg);
#ifdef CONFIG_NX_MOUSE
static void nxpu_mousein(NXEGWINDOW hwnd, FAR const struct nxgl_point_s *pos,
uint8_t buttons, FAR void *arg);
#endif
#ifdef CONFIG_NX_KBD
static void nxpu_kbdin(NXWINDOW hwnd, uint8_t nch, FAR const uint8_t *ch,
FAR void *arg)
#endif
/****************************************************************************
* Private Data
****************************************************************************/
static const struct nx_callback_s g_pucb =
{
nxpu_redraw, /* redraw */
nxpu_position /* position */
#ifdef CONFIG_NX_MOUSE
, nxpu_mousein /* mousein */
#endif
#ifdef CONFIG_NX_KBD
, nxpu_kbdin /* my kbdin */
#endif
};
static struct nxtext_state_s g_pustate;
#ifdef CONFIG_NX_KBD
static struct nxtext_bitmap_s g_pubm[NBM_CACHE];
static struct nxtext_glyph_s g_puglyph[NGLYPH_CACHE];
#endif
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: nxpu_setsize
****************************************************************************/
static inline int nxpu_setsize(NXEGWINDOW hwnd, FAR struct nxgl_size_s *size)
{
int ret = nx_setsize(hwnd, size);
if (ret < 0)
{
message("user_start: nx_setsize failed: %d\n", errno);
g_exitcode = NXEXIT_NXSETSIZE;
}
return ret;
}
/****************************************************************************
* Name: nxpu_setposition
****************************************************************************/
static inline int nxpu_setposition(NXEGWINDOW hwnd, FAR struct nxgl_point_s *pos)
{
int ret = nx_setposition(hwnd, pos);
if (ret < 0)
{
message("user_start: nx_setposition failed: %d\n", errno);
g_exitcode = NXEXIT_NXSETPOSITION;
}
return ret;
}
/****************************************************************************
* Name: nxpu_fillwindow
****************************************************************************/
static inline void nxpu_fillwindow(NXEGWINDOW hwnd,
FAR const struct nxgl_rect_s *rect,
FAR struct nxtext_state_s *st)
{
int ret;
int i;
ret = nx_fill(hwnd, rect, st->color);
if (ret < 0)
{
message("nxpu_fillwindow: nx_fill failed: %d\n", errno);
}
/* Fill each character on the display (Only the characters within rect
* will actually be redrawn).
*/
nxtext_home(st);
for (i = 0; i < st->nchars; i++)
{
nxtext_fillchar(hwnd, rect, &st->bm[i]);
}
}
/****************************************************************************
* Name: nxpu_redraw
****************************************************************************/
static void nxpu_redraw(NXEGWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
bool more, FAR void *arg)
{
FAR struct nxtext_state_s *st = (FAR struct nxtext_state_s *)arg;
message("nxpu_redraw: hwnd=%p rect={(%d,%d),(%d,%d)} more=%s\n",
hwnd, rect->pt1.x, rect->pt1.y, rect->pt2.x, rect->pt2.y,
more ? "true" : "false");
nxpu_fillwindow(hwnd, rect, st);
}
/****************************************************************************
* Name: nxpu_position
****************************************************************************/
static void nxpu_position(NXEGWINDOW hwnd, FAR const struct nxgl_size_s *size,
FAR const struct nxgl_point_s *pos,
FAR const struct nxgl_rect_s *bounds,
FAR void *arg)
{
FAR struct nxtext_state_s *st = (FAR struct nxtext_state_s *)arg;
/* Report the position */
message("nxpu_position: hwnd=%p size=(%d,%d) pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n",
hwnd, size->w, size->h, pos->x, pos->y,
bounds->pt1.x, bounds->pt1.y, bounds->pt2.x, bounds->pt2.y);
/* Save the window size */
st->wsize.w = size->w;
st->wsize.h = size->h;
}
/****************************************************************************
* Name: nxpu_mousein
****************************************************************************/
#ifdef CONFIG_NX_MOUSE
static void nxpu_mousein(NXEGWINDOW hwnd, FAR const struct nxgl_point_s *pos,
uint8_t buttons, FAR void *arg)
{
FAR struct nxtext_state_s *st = (FAR struct nxtext_state_s *)arg;
message("nxpu_mousein: hwnd=%p pos=(%d,%d) button=%02x\n",
hwnd, pos->x, pos->y, buttons);
}
#endif
/****************************************************************************
* Name: nxpu_puts
****************************************************************************/
static inline void nxpu_puts(NXWINDOW hwnd, FAR struct nxtext_state_s *st,
uint8_t nch, FAR const uint8_t *ch)
{
nxtext_home(st);
while (nch--)
{
nxtext_putc(hwnd, st, *ch++);
}
}
/****************************************************************************
* Name: nxpu_kbdin
****************************************************************************/
#ifdef CONFIG_NX_KBD
static void nxpu_kbdin(NXWINDOW hwnd, uint8_t nch, FAR const uint8_t *ch,
FAR void *arg)
{
FAR struct nxtext_state_s *st = (FAR struct nxtext_state_s *)arg;
message("nxpu_kbdin: hwnd=%p nch=%d\n", hwnd, nch);
nxpu_puts(hwnd, st, nch, ch);
}
#endif
/****************************************************************************
* Name: nxpu_initstate
****************************************************************************/
static inline void nxpu_initstate(void)
{
#ifdef CONFIG_NX_KBD
FAR const struct nx_font_s *fontset;
#endif
/* Initialize the color (used for redrawing the window) */
memset(&g_gbstate, 0, sizeof(struct nxtext_state_s));
g_pustate.wcolor[0] = CONFIG_EXAMPLES_NXTEXT_PUCOLOR;
g_pustate.fcolor[0] = CONFIG_EXAMPLES_NXTEXT_PUFONTCOLOR;
/* Get information about the font set being used and save this in the
* state structure
*/
#ifdef CONFIG_NX_KBD
fontset = nxf_getfontset();
g_pustate.fheight = fontset->mxheight;
g_pustate.fwidth = fontset->mxwidth;
g_pustate.spwidth = fontset->spwidth;
/* Set up the text caches */
g_pustate.maxchars = NBM_CACHE;
g_pustate.maxglyphs = NGLYPH_CACHE;
g_pustate.bm = g_pubm;
g_pustate.glyph = g_puglyph;
/* Set the first display position */
nxtext_home(st);
#endif
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: nxpu_open
****************************************************************************/
NXEGWINDOW nxpu_open(void)
{
NXEGWINDOW hwnd;
struct nxgl_size_s size;
struct nxgl_point_s pt;
/* Create a pop-up window */
message("user_start: Create pop-up\n");
nxpu_initstate();
hwnd = nx_openwindow(g_hnx, cb, (FAR void *)state);
message("user_start: hwnd=%p\n", hwnd);
if (!hwnd)
{
message("user_start: nx_openwindow failed: %d\n", errno);
g_exitcode = NXEXIT_NXOPENWINDOW;
goto errout_with_bkgd;
}
/* Set the size of the pop-up window */
size.w = g_xres / 4;
size.h = g_yres / 4;
message("user_start: Set pop-up size to (%d,%d)\n", size.w, size.h);
ret = nxpu_setsize(hwnd, &g_pustate.size);
if (ret < 0)
{
goto errout_with_hwnd;
}
/* Set a random position for pop-up */
pt.x = ((uint32_t)(g_xres - size.w) * rand()) >> 16;
pt.y = ((uint32_t)(g_yres - size.h) * rand()) >> 16;
message("user_start: Set pop-up postion to (%d,%d)\n", pt.x, pt.y);
ret = nxpu_setposition(hwnd, &pt);
if (ret < 0)
{
goto errout_with_hwnd;
}
return hwnd;
}

View File

@ -0,0 +1,468 @@
/****************************************************************************
* examples/nxtext/nxtext_putc.c
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* 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 <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <debug.h>
#include <errno.h>
#include <nuttx/nx.h>
#include <nuttx/nxtk.h>
#include <nuttx/nxfonts.h>
#include "nxtext_internal.h"
/****************************************************************************
* Definitions
****************************************************************************/
/* Select renderer -- Some additional logic would be required to support
* pixel depths that are not directly addressable (1,2,4, and 24).
*/
#if CONFIG_EXAMPLES_NXTEXT_BPP == 1
# define RENDERER nxf_convert_1bpp
#elif CONFIG_EXAMPLES_NXTEXT_BPP == 2
# define RENDERER nxf_convert_2bpp
#elif CONFIG_EXAMPLES_NXTEXT_BPP == 4
# define RENDERER nxf_convert_4bpp
#elif CONFIG_EXAMPLES_NXTEXT_BPP == 8
# define RENDERER nxf_convert_8bpp
#elif CONFIG_EXAMPLES_NXTEXT_BPP == 16
# define RENDERER nxf_convert_16bpp
#elif CONFIG_EXAMPLES_NXTEXT_BPP == 24
# define RENDERER nxf_convert_24bpp
#elif CONFIG_EXAMPLES_NXTEXT_BPP == 32
# define RENDERER nxf_convert_32bpp
#else
# error "Unsupported CONFIG_EXAMPLES_NXTEXT_BPP"
#endif
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: nxtext_renderglyph
****************************************************************************/
static inline FAR const struct nxtext_glyph_s *
nxtext_renderglyph(FAR struct nxtext_state_s *st,
FAR const struct nx_fontbitmap_s *bm, uint8_t ch)
{
FAR struct nxtext_glyph_s *glyph = NULL;
FAR nxgl_mxpixel_t *ptr;
#if CONFIG_EXAMPLES_NXTEXT_BPP < 8
nxgl_mxpixel_t pixel;
#endif
int bmsize;
int row;
int col;
int ret;
/* Make sure that there is room for another glyph */
message("nxtext_renderglyph: ch=%02x\n", ch);
if (st->nglyphs < NXTK_MAXKBDCHARS)
{
/* Allocate the glyph */
glyph = &st->glyph[st->nglyphs];
glyph->code = ch;
/* Get the dimensions of the glyph */
glyph->width = bm->metric.width + bm->metric.xoffset;
glyph->height = bm->metric.height + bm->metric.yoffset;
/* Allocate memory to hold the glyph with its offsets */
glyph->stride = (glyph->width * CONFIG_EXAMPLES_NXTEXT_BPP + 7) / 8;
bmsize = glyph->stride * glyph->height;
glyph->bitmap = (FAR uint8_t *)malloc(bmsize);
if (glyph->bitmap)
{
/* Initialize the glyph memory to the background color */
#if CONFIG_EXAMPLES_NXTEXT_BPP < 8
pixel = st->wcolor[0];
# if CONFIG_EXAMPLES_NXTEXT_BPP == 1
/* Pack 1-bit pixels into a 2-bits */
pixel &= 0x01;
pixel = (pixel) << 1 |pixel;
# endif
# if CONFIG_EXAMPLES_NXTEXT_BPP < 4
/* Pack 2-bit pixels into a nibble */
pixel &= 0x03;
pixel = (pixel) << 2 |pixel;
# endif
/* Pack 4-bit nibbles into a byte */
pixel &= 0x0f;
pixel = (pixel) << 4 | pixel;
ptr = (FAR nxgl_mxpixel_t *)glyph->bitmap;
for (row = 0; row < glyph->height; row++)
{
for (col = 0; col < glyph->stride; col++)
{
/* Transfer the packed bytes into the buffer */
*ptr++ = pixel;
}
}
#elif CONFIG_EXAMPLES_NXTEXT_BPP == 24
# error "Additional logic is needed here for 24bpp support"
#else /* CONFIG_EXAMPLES_NXTEXT_BPP = {8,16,32} */
ptr = (FAR nxgl_mxpixel_t *)glyph->bitmap;
for (row = 0; row < glyph->height; row++)
{
/* Just copy the color value into the glyph memory */
for (col = 0; col < glyph->width; col++)
{
*ptr++ = st->wcolor[0];
}
}
#endif
/* Then render the glyph into the allocated memory */
ret = RENDERER((FAR nxgl_mxpixel_t*)glyph->bitmap,
glyph->fheight, glyph->width, glyph->stride,
bm, st->fcolor);
if (ret < 0)
{
/* Actually, the RENDERER never returns a failure */
message("nxtext_renderglyph: RENDERER failed\n");
free(glyph->bitmap);
glyph->bitmap = NULL;
glyph = NULL;
}
else
{
/* Make it permanent */
st->nglyphs++;
}
}
}
return glyph;
}
/****************************************************************************
* Name: nxtext_addspace
****************************************************************************/
static inline FAR const struct nxtext_glyph_s *
nxtext_addspace(FAR struct nxtext_state_s *st, uint8_t ch)
{
FAR struct nxtext_glyph_s *glyph = NULL;
/* Make sure that there is room for another glyph */
if (st->nglyphs < NXTK_MAXKBDCHARS)
{
/* Allocate the NULL glyph */
glyph = &st->glyph[st->nglyphs];
memset(glyph, 0, sizeof(struct nxtext_glyph_s));
glyph->code = ' ';
glyph->width = st->spwidth;
st->nglyphs++;
}
return glyph;
}
/****************************************************************************
* Name: nxtext_findglyph
****************************************************************************/
static FAR const struct nxtext_glyph_s *
nxtext_findglyph(FAR struct nxtext_state_s *st, uint8_t ch)
{
int i;
/* First, try to find the glyph in the cache of pre-rendered glyphs */
for (i = 0; i < st->nglyphs; i++)
{
if (st->glyph[i].code == ch)
{
return &st->glyph[i];
}
}
return NULL;
}
/****************************************************************************
* Name: nxtext_getglyph
****************************************************************************/
static FAR const struct nxtext_glyph_s *
nxtext_getglyph(FAR struct nxtext_state_s *st, uint8_t ch)
{
FAR const struct nxtext_glyph_s *glyph;
FAR const struct nx_fontbitmap_s *bm;
/* First, try to find the glyph in the cache of pre-rendered glyphs */
glyph = nxtext_findglyph(st, ch);
if (!glyph)
{
/* No, it is not cached... Does the code map to a glyph? */
bm = nxf_getbitmap(ch);
if (!bm)
{
/* No, there is no glyph for this code. Use space */
glyph = nxtext_findglyph(st, ' ');
if (!glyph)
{
/* There isn't fake glyph for ' ' yet... create one */
glyph = nxtext_addspace(st, ' ');
}
}
else
{
glyph = nxtext_renderglyph(st, bm, ch);
}
}
return glyph;
}
/****************************************************************************
* Name: nxtext_addchar
****************************************************************************/
static FAR const struct nxtext_bitmap_s *
nxtext_addchar(FAR struct nxtext_state_s *st, uint8_t ch)
{
FAR struct nxtext_bitmap_s *bm = NULL;
FAR struct nxtext_bitmap_s *bmleft;
/* Is there space for another character on the display? */
if (st->nchars < NXTK_MAXKBDCHARS)
{
/* Yes, setup the bitmap */
bm = &st->bm[st->nchars];
/* Find the matching glyph */
bm->glyph = nxtext_getglyph(st, ch);
if (!bm->glyph)
{
return NULL;
}
/* Set up the bounds for the bitmap */
if (st->nchars <= 0)
{
/* The first character is one space from the left */
st->pos.x = st->spwidth;
}
else
{
/* Otherwise, it is to the left of the preceding char */
bmleft = &st->bm[st->nchars-1];
st->pos.x = bmleft->bounds.pt2.x + 1;
}
bm->bounds.pt1.x = st->pos.x;
bm->bounds.pt1.y = st->pos.y;
bm->bounds.pt2.x = st->pos.x + bm->glyph->width - 1;
bm->bounds.pt2.y = st->pos.y + bm->glyph->height - 1;
st->nchars++;
}
return bm;
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: nxtext_home
*
* Description:
* Set the next character position to the top-left corner of the display.
*
****************************************************************************/
void nxtext_home(FAR struct nxtext_state_s *st)
{
/* The first character is one space from the left */
st->pox.x = st->spwidth;
/* And two lines from the top */
st->pos.y = 2;
}
/****************************************************************************
* Name: nxtext_newline
*
* Description:
* Set the next character position to the beginning of the next line.
*
****************************************************************************/
void nxtext_newline(FAR struct nxtext_state_s *st)
{
/* Carriage return: The first character is one space from the left */
st->pox.x = st->spwidth;
/* Linefeed: Done the max font height + 2 */
st->pos.y += (st->fheight + 2);
}
/****************************************************************************
* Name: nxtext_putc
*
* Description:
* Render the specified character at the current display position.
*
****************************************************************************/
void nxtext_putc(NXWINDOW hwnd, FAR struct nxtext_state_s *st, uint8_t ch)
{
FAR const struct nxtext_bitmap_s *bm;
/* If it is a newline character, then just perform the logical newline
* operation.
*/
if (ch == '\n')
{
nxtext_newline(st);
}
/* Otherwise, find the glyph associated with the character and render it
* onto the display.
*/
else
{
bm = nxtext_addchar(st, ch);
if (bm)
{
nxtext_fillchar(hwnd, &bm->bounds, bm);
}
}
}
/****************************************************************************
* Name: nxtext_fillchar
*
* Description:
* This implements the character display. It is part of the nxtext_putc
* operation but may also be used when redrawing an existing display.
*
****************************************************************************/
void nxtext_fillchar(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
FAR const struct nxtext_bitmap_s *bm)
{
FAR void *src = (FAR void *)bm->glyph->bitmap;
struct nxgl_rect_s intersection;
int ret;
/* Handle the special case of spaces which have no glyph bitmap */
if (src)
{
/* Get the intersection of the redraw region and the character bitmap */
nxgl_rectintersect(&intersection, rect, &bm->bounds);
if (!nxgl_nullrect(&intersection))
{
ret = nx_bitmap((NXWINDOW)hwnd, &intersection, &src,
&bm->bounds.pt1,
(unsigned int)bm->glyph->stride);
if (ret < 0)
{
message("nxtext_fillchar: nx_bitmapwindow failed: %d\n", errno);
}
}
}
}

View File

@ -0,0 +1,194 @@
/****************************************************************************
* examples/nxtext/nxtext_server.c
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* 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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <errno.h>
#include <debug.h>
#include <nuttx/arch.h>
#include <nuttx/nx.h>
#ifdef CONFIG_NX_LCDDRIVER
# include <nuttx/lcd/lcd.h>
#else
# include <nuttx/fb.h>
#endif
#include "nxtext_internal.h"
#ifdef CONFIG_NX_MULTIUSER
/****************************************************************************
* Definitions
****************************************************************************/
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: nxtext_server
****************************************************************************/
int nxtext_server(int argc, char *argv[])
{
FAR NX_DRIVERTYPE *dev;
int ret;
#if defined(CONFIG_EXAMPLES_NXTEXT_EXTERNINIT)
/* Use external graphics driver initialization */
message("nxtext_server: Initializing external graphics device\n");
dev = up_nxdrvinit(CONFIG_EXAMPLES_NXTEXT_DEVNO);
if (!dev)
{
message("nxtext_server: up_nxdrvinit failed, devno=%d\n", CONFIG_EXAMPLES_NXTEXT_DEVNO);
g_exitcode = NXEXIT_EXTINITIALIZE;
return ERROR;
}
#elif defined(CONFIG_NX_LCDDRIVER)
/* Initialize the LCD device */
message("nxtext_server: Initializing LCD\n");
ret = up_lcdinitialize();
if (ret < 0)
{
message("nxtext_server: up_lcdinitialize failed: %d\n", -ret);
return 1;
}
/* Get the device instance */
dev = up_lcdgetdev(CONFIG_EXAMPLES_NXTEXT_DEVNO);
if (!dev)
{
message("nxtext_server: up_lcdgetdev failed, devno=%d\n", CONFIG_EXAMPLES_NXTEXT_DEVNO);
return 2;
}
/* Turn the LCD on at 75% power */
(void)dev->setpower(dev, ((3*CONFIG_LCD_MAXPOWER + 3)/4));
#else
/* Initialize the frame buffer device */
message("nxtext_server: Initializing framebuffer\n");
ret = up_fbinitialize();
if (ret < 0)
{
message("nxtext_server: up_fbinitialize failed: %d\n", -ret);
return 1;
}
dev = up_fbgetvplane(CONFIG_EXAMPLES_NXTEXT_VPLANE);
if (!dev)
{
message("nxtext_server: up_fbgetvplane failed, vplane=%d\n", CONFIG_EXAMPLES_NXTEXT_VPLANE);
return 2;
}
#endif
/* Then start the server */
ret = nx_run(dev);
message("nxtext_server: nx_run returned: %d\n", errno);
return 3;
}
/****************************************************************************
* Name: nxtext_listener
****************************************************************************/
FAR void *nxtext_listener(FAR void *arg)
{
int ret;
/* Process events forever */
for (;;)
{
/* Handle the next event. If we were configured blocking, then
* we will stay right here until the next event is received. Since
* we have dedicated a while thread to servicing events, it would
* be most natural to also select CONFIG_NX_BLOCKING -- if not, the
* following would be a tight infinite loop (unless we added addition
* logic with nx_eventnotify and sigwait to pace it).
*/
ret = nx_eventhandler(g_hnx);
if (ret < 0)
{
/* An error occurred... assume that we have lost connection with
* the server.
*/
message("nxtext_listener: Lost server connection: %d\n", errno);
exit(NXEXIT_LOSTSERVERCONN);
}
/* If we received a message, we must be connected */
if (!g_connected)
{
g_connected = true;
sem_post(&g_semevent);
message("nxtext_listener: Connected\n");
}
}
}
#endif /* CONFIG_NX_MULTIUSER */

View File

@ -1875,3 +1875,11 @@
Also fixes a few errors in STM3210E-EVAL button decoding.
* configs/stm3210e-eval/buttons: Add a configuration to exercise STM3210E-EVAL
buttons.
* arch/arm/src/stm32/stm32_gpio.c: GPIO interrupt handling for pin
numbers were being aliased: 5-9 together and 10-15 together. Extended
the logic to peform decoding of GPIO interrupts and unique dispatching
for all 16 pins.
* configs/stm3210e-eval/nxtext: Add a configuration for the apps/examples/nxtext
example. This example focuses on placing text on the background while
pop-up windows occur. Text should continue to update normally with or without
the popup windows present.

View File

@ -472,8 +472,19 @@ Where <subdir> is one of the following:
nx:
---
And example using the NuttX graphics system (NX). This example
uses the Nokia 6100 LCD driver.
An example using the NuttX graphics system (NX). This example
focuses on general window controls, movement, mouse and keyboard
input.
CONFIG_STM32_CODESOURCERYW=y : CodeSourcery under Windows
CONFIG_LCD_PORTRAIT=y : 240x320
nxtext:
------
Another example using the NuttX graphics system (NX). This
example focuses on placing text on the background while pop-up
windows occur. Text should continue to update normally with
or without the popup windows present.
CONFIG_STM32_CODESOURCERYW=y : CodeSourcery under Windows
CONFIG_LCD_PORTRAIT=y : 240x320

View File

@ -0,0 +1,174 @@
############################################################################
# configs/stm3210e-eval/nxtext/Make.defs
#
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
#
# 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.
#
############################################################################
include ${TOPDIR}/.config
# Setup for the selected toolchain
ifeq ($(CONFIG_STM32_DFU),y)
LDSCRIPT = ld.script.dfu
else
LDSCRIPT = ld.script
endif
ifeq ($(CONFIG_STM32_CODESOURCERYW),y)
# CodeSourcery under Windows
CROSSDEV = arm-none-eabi-
WINTOOL = y
ARCHCPUFLAGS = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft
endif
ifeq ($(CONFIG_STM32_CODESOURCERYL),y)
# CodeSourcery under Linux
CROSSDEV = arm-none-eabi-
ARCHCPUFLAGS = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft
MAXOPTIMIZATION = -O2
endif
ifeq ($(CONFIG_STM32_DEVKITARM),y)
# devkitARM under Windows
CROSSDEV = arm-eabi-
WINTOOL = y
ARCHCPUFLAGS = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft
endif
ifeq ($(CONFIG_STM32_RAISONANCE),y)
# Raisonance RIDE7 under Windows
CROSSDEV = arm-none-eabi-
WINTOOL = y
ARCHCPUFLAGS = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft
endif
ifeq ($(CONFIG_STM32_BUILDROOT),y)
# NuttX buildroot under Linux or Cygwin
CROSSDEV = arm-elf-
ARCHCPUFLAGS = -mtune=cortex-m3 -march=armv7-m -mfloat-abi=soft
MAXOPTIMIZATION = -Os
endif
ifeq ($(WINTOOL),y)
# Windows-native toolchains
DIRLINK = $(TOPDIR)/tools/winlink.sh
DIRUNLINK = $(TOPDIR)/tools/unlink.sh
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/nxtext/$(LDSCRIPT)}"
MAXOPTIMIZATION = -O2
else
# Linux/Cygwin-native toolchain
MKDEP = $(TOPDIR)/tools/mkdeps.sh
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/nxtext/$(LDSCRIPT)
endif
CC = $(CROSSDEV)gcc
CXX = $(CROSSDEV)g++
CPP = $(CROSSDEV)gcc -E
LD = $(CROSSDEV)ld
AR = $(CROSSDEV)ar rcs
NM = $(CROSSDEV)nm
OBJCOPY = $(CROSSDEV)objcopy
OBJDUMP = $(CROSSDEV)objdump
ARCHCCVERSION = ${shell $(CC) -v 2>&1 | sed -n '/^gcc version/p' | sed -e 's/^gcc version \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q'}
ARCHCCMAJOR = ${shell echo $(ARCHCCVERSION) | cut -d'.' -f1}
ifeq ("${CONFIG_DEBUG_SYMBOLS}","y")
ARCHOPTIMIZATION = -g
else
ARCHOPTIMIZATION = $(MAXOPTIMIZATION) -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer
endif
ARCHCFLAGS = -fno-builtin
ARCHCXXFLAGS = -fno-builtin -fno-exceptions
ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow
ARCHWARNINGSXX = -Wall -Wshadow
ARCHDEFINES =
ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
CFLAGS = $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
CXXFLAGS = $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS)
CPPFLAGS = $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES)
AFLAGS = $(CFLAGS) -D__ASSEMBLY__
NXFLATLDFLAGS1 = -r -d -warn-common
NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat.ld -no-check-sections
LDNXFLATFLAGS = -e main -s 2048
OBJEXT = .o
LIBEXT = .a
EXEEXT =
ifneq ($(CROSSDEV),arm-elf-)
LDFLAGS += -nostartfiles -nodefaultlibs
endif
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
LDFLAGS += -g
endif
define PREPROCESS
@echo "CPP: $1->$2"
@$(CPP) $(CPPFLAGS) $1 -o $2
endef
define COMPILE
@echo "CC: $1"
@$(CC) -c $(CFLAGS) $1 -o $2
endef
define COMPILEXX
@echo "CXX: $1"
@$(CXX) -c $(CXXFLAGS) $1 -o $2
endef
define ASSEMBLE
@echo "AS: $1"
@$(CC) -c $(AFLAGS) $1 -o $2
endef
define ARCHIVE
echo "AR: $2"; \
$(AR) $1 $2 || { echo "$(AR) $1 $2 FAILED!" ; exit 1 ; }
endef
define CLEAN
@rm -f *.o *.a
endef
HOSTCC = gcc
HOSTINCLUDES = -I.
HOSTCFLAGS = -Wall -Wstrict-prototypes -Wshadow -g -pipe
HOSTLDFLAGS =

View File

@ -0,0 +1,39 @@
############################################################################
# configs/stm3210e-eval/nxtext/appconfig
#
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
#
# 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.
#
############################################################################
# Path to example in apps/examples containing the user_start entry point
CONFIGURED_APPS += examples/nxtext

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,112 @@
/****************************************************************************
* configs/stm3210e-eval/nxtext/ld.script
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* 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.
*
****************************************************************************/
/* The STM32F103ZET6 has 512Kb of FLASH beginning at address 0x0800:0000 and
* 64Kb of SRAM beginning at address 0x2000:0000. When booting from FLASH,
* FLASH memory is aliased to address 0x0000:0000 where the code expects to
* begin execution by jumping to the entry point in the 0x0800:0000 address
* range.
*/
MEMORY
{
flash (rx) : ORIGIN = 0x08000000, LENGTH = 512K
sram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
}
OUTPUT_ARCH(arm)
ENTRY(_stext)
SECTIONS
{
.text : {
_stext = ABSOLUTE(.);
*(.vectors)
*(.text .text.*)
*(.fixup)
*(.gnu.warning)
*(.rodata .rodata.*)
*(.gnu.linkonce.t.*)
*(.glue_7)
*(.glue_7t)
*(.got)
*(.gcc_except_table)
*(.gnu.linkonce.r.*)
_etext = ABSOLUTE(.);
} > flash
_eronly = ABSOLUTE(.);
/* The STM32F103Z has 64Kb of SRAM beginning at the following address */
.data : {
_sdata = ABSOLUTE(.);
*(.data .data.*)
*(.gnu.linkonce.d.*)
CONSTRUCTORS
_edata = ABSOLUTE(.);
} > sram AT > flash
.ARM.extab : {
*(.ARM.extab*)
} >sram
__exidx_start = ABSOLUTE(.);
.ARM.exidx : {
*(.ARM.exidx*)
} >sram
__exidx_end = ABSOLUTE(.);
.bss : {
_sbss = ABSOLUTE(.);
*(.bss .bss.*)
*(.gnu.linkonce.b.*)
*(COMMON)
_ebss = ABSOLUTE(.);
} > sram
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_info 0 : { *(.debug_info) }
.debug_line 0 : { *(.debug_line) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.debug_aranges 0 : { *(.debug_aranges) }
}

View File

@ -0,0 +1,111 @@
/****************************************************************************
* configs/stm3210e-eval/nxtext/ld.script.dfu
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* 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.
*
****************************************************************************/
/* The STM32F103ZET6 has 512Kb of FLASH beginning at address 0x0800:0000 and
* 64Kb of SRAM beginning at address 0x2000:0000. Here we assume that the
* STM3210E-EVAL's DFU bootloader is being used. In that case, the corrct
* load .text load address is 0x08003000 (leaving 464Kb).
*/
MEMORY
{
flash (rx) : ORIGIN = 0x08003000, LENGTH = 464K
sram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
}
OUTPUT_ARCH(arm)
ENTRY(_stext)
SECTIONS
{
.text : {
_stext = ABSOLUTE(.);
*(.vectors)
*(.text .text.*)
*(.fixup)
*(.gnu.warning)
*(.rodata .rodata.*)
*(.gnu.linkonce.t.*)
*(.glue_7)
*(.glue_7t)
*(.got)
*(.gcc_except_table)
*(.gnu.linkonce.r.*)
_etext = ABSOLUTE(.);
} > flash
_eronly = ABSOLUTE(.);
/* The STM32F103Z has 64Kb of SRAM beginning at the following address */
.data : {
_sdata = ABSOLUTE(.);
*(.data .data.*)
*(.gnu.linkonce.d.*)
CONSTRUCTORS
_edata = ABSOLUTE(.);
} > sram AT > flash
.ARM.extab : {
*(.ARM.extab*)
} >sram
__exidx_start = ABSOLUTE(.);
.ARM.exidx : {
*(.ARM.exidx*)
} >sram
__exidx_end = ABSOLUTE(.);
.bss : {
_sbss = ABSOLUTE(.);
*(.bss .bss.*)
*(.gnu.linkonce.b.*)
*(COMMON)
_ebss = ABSOLUTE(.);
} > sram
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_info 0 : { *(.debug_info) }
.debug_line 0 : { *(.debug_line) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.debug_aranges 0 : { *(.debug_aranges) }
}

View File

@ -0,0 +1,62 @@
#!/bin/bash
# configs/stm3210e-eval/nxtext/setenv.sh
#
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
#
# 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.
#
if [ "$_" = "$0" ] ; then
echo "You must source this script, not run it!" 1>&2
exit 1
fi
WD=`pwd`
if [ ! -x "setenv.sh" ]; then
echo "This script must be executed from the top-level NuttX build directory"
exit 1
fi
if [ -z "${PATH_ORIG}" ]; then
export PATH_ORIG="${PATH}"
fi
# This the Cygwin path to the location where I installed the CodeSourcery
# toolchain under windows. You will also have to edit this if you install
# the CodeSourcery toolchain in any other location
export TOOLCHAIN_BIN="/cygdrive/c/Program Files (x86)/CodeSourcery/Sourcery G++ Lite/bin"
# This the Cygwin path to the location where I build the buildroot
# toolchain.
#export TOOLCHAIN_BIN="${WD}/../misc/buildroot/build_arm_nofpu/staging_dir/bin"
# Add the path to the toolchain to the PATH varialble
export PATH="${TOOLCHAIN_BIN}:/sbin:/usr/sbin:${PATH_ORIG}"
echo "PATH : ${PATH}"