Add nx_start() to simplify starting the NX server from within the RTOS

This commit is contained in:
Gregory Nutt 2013-12-29 11:11:48 -06:00
parent 6eb5386b6f
commit 5c7a4896cc
6 changed files with 300 additions and 6 deletions

View File

@ -6332,4 +6332,6 @@
* Move graphics/nxtk to libnx/nxtk (2013-12-28).
* syscalls: Need to add sem_timedwait() (2013-12-28)
* Move more files from graphics/nxmu to libnx/nxmu (2013-12-29).
* graphics/nxmu/nx_start.c: NX server start-up wrapper function to
simplify starting the NX server from within the RTOS (2013-12-29).

View File

@ -168,7 +168,7 @@ config NXTK_BORDERCOLOR3
NXTK_BORDERCOLOR2 is the shadow side color and so is normally darker.
NXTK_BORDERCOLOR3 is the shiny side color and so is normally brighter.
endif
endif # !NXTK_DEFAULT_BORDERCOLORS
endmenu
config NXTK_AUTORAISE
@ -413,7 +413,7 @@ config NXCONSOLE_NPOLLWAITERS
The number of threads that can be waiting for read data available.
Default: 4
endif
endif # NXCONSOLE
comment "NX Multi-user only options"
@ -450,5 +450,57 @@ config NX_MXCLIENTMSGS
flooding of the client or server with too many messages (PREALLOC_MQ_MSGS
controls how many messages are pre-allocated).
endif
endif
config NX_NXSTART
bool "nx_start()"
default n
---help---
If this option is selected, then the nx_start() interface will be
built. The nx_start() interface provides a single call to initialize
and start the NX server.
if NX_NXSTART
config NXSTART_EXTERNINIT
bool "External display Initialization"
default n
---help---
Define to support external display initialization by platform-
specific code. This this option is defined, then nx_start() will
call up_nxdrvinit(CONFIG_NXSTART_DEVNO) to initialize the graphics
device. This option is necessary if display is used that cannot be
initialized using the standard LCD or framebuffer interfaces.
config NXSTART_SERVERPRIO
int "NX Server priority"
default 110
---help---
Priority of the NX server. This applies only if NX is configured in
multi-user mode (NX_MULTIUSER=y). Default: 110.
NOTE: NXSTART_SERVERPRIO should have a relatively high priority to
avoid data overrun race conditions.
config NXSTART_SERVERSTACK
int "NX Server Stack Size"
default 2048
---help---
NX server thread stack size (in multi-user mode). Default 2048
config NXSTART_DEVNO
int "LCD Device Number"
default 0
depends on NX_LCDDRIVER || NXSTART_EXTERNINIT
---help---
LCD device number (in case there are more than one LCDs connected).
Default: 0
config NXSTART_VPLANE
int "Plane Number"
default 0
depends on !NX_LCDDRIVER && !NXSTART_EXTERNINIT
---help---
Only a single video plane is supported. Default: 0
endif # NX_NXSTART
endif # NX_MULTIUSER
endif # NX

View File

@ -38,3 +38,7 @@ NX_ASRCS =
NX_CSRCS += nxmu_kbdin.c nxmu_mouse.c nxmu_openwindow.c nxmu_redrawreq.c
NX_CSRCS += nxmu_releasebkgd.c nxmu_requestbkgd.c nxmu_reportposition.c
NX_CSRCS += nxmu_sendclient.c nxmu_sendclientwindow.c nxmu_server.c
ifeq ($(CONFIG_NX_NXSTART),y)
NX_CSRCS += nx_start.c
endif

208
graphics/nxmu/nx_start.c Normal file
View File

@ -0,0 +1,208 @@
/****************************************************************************
* graphics/nxmu/nx_start.c
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <errno.h>
#include <debug.h>
#include <nuttx/nx/nx.h>
#include "nxfe.h"
#ifdef CONFIG_NX_NXSTART
/****************************************************************************
* Pre-Processor Definitions
****************************************************************************/
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: nx_servertask
*
* Description:
* NX server thread. This is the entry point into the server thread that
* serializes the multi-threaded accesses to the display.
*
* Input Parameters:
* Standard task start-up parameters (none of which are used)
*
* Returned Value:
* This function does not normally return but may exit with EXIT_FAILURE
* under certain error conditions.
*
****************************************************************************/
int nx_servertask(int argc, char *argv[])
{
FAR NX_DRIVERTYPE *dev;
int ret;
#if defined(CONFIG_NXSTART_EXTERNINIT)
/* Use external graphics driver initialization */
dev = up_nxdrvinit(CONFIG_NXSTART_DEVNO);
if (!dev)
{
gdbg("ERROR: up_nxdrvinit failed, devno=%d\n", CONFIG_NXSTART_DEVNO);
return EXIT_FAILURE;
}
#elif defined(CONFIG_NX_LCDDRIVER)
/* Initialize the LCD device */
ret = up_lcdinitialize();
if (ret < 0)
{
gdbg("ERROR: up_lcdinitialize failed: %d\n", ret);
return EXIT_FAILURE;
}
/* Get the device instance */
dev = up_lcdgetdev(CONFIG_NXSTART_DEVNO);
if (!dev)
{
gdbg("ERROR: up_lcdgetdev failed, devno=%d\n", CONFIG_NXSTART_DEVNO);
return EXIT_FAILURE;
}
/* Turn the LCD on at 75% power */
(void)dev->setpower(dev, ((3*CONFIG_LCD_MAXPOWER + 3)/4));
#else /* CONFIG_NX_LCDDRIVER */
/* Initialize the frame buffer device */
ret = up_fbinitialize();
if (ret < 0)
{
gdbg("ERROR: up_fbinitialize failed: %d\n", ret);
return EXIT_FAILURE;
}
dev = up_fbgetvplane(CONFIG_NXSTART_VPLANE);
if (!dev)
{
gdbg("ERROR: up_fbgetvplane failed, vplane=%d\n", CONFIG_NXSTART_VPLANE);
return EXIT_FAILURE;
}
#endif /* CONFIG_NX_LCDDRIVER */
/* Then start the server (nx_run does not normally retun) */
ret = nx_run(dev);
gvdbg("nx_run returned: %d\n", errno);
return EXIT_FAILURE;
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: nx_start
*
* Description:
* nx_start() provides a wrapper function to simplify and standardize the
* starting of the NX server.
*
* NOTE: Currently, many applications include logic to start the NX
* server from application initialization logic. That, of course, cannot
* work in the NuttX kernel build because the resources required by the
* NX server are private to the kernel mode logic.
*
* Input Parameters:
* None
*
* Returned Value:
* Zero (OK) is returned on success. This indicates that the NX server
* has been successfully started, is running, and waiting to accept
* connections from NX clients.
*
* A negated errno value is returned on failure. The errno value indicates
* the nature of the failure.
*
****************************************************************************/
int nx_start(void)
{
pid_t server;
/* Start the server task */
gvdbg("Starting server task\n");
server = TASK_CREATE("NX Server", CONFIG_NXSTART_SERVERPRIO,
CONFIG_NXSTART_SERVERSTACK, nx_servertask,
(FAR char * const *)0);
if (server < 0)
{
int errcode = errno;
DEBUGASSERT(errcode > 0);
gdbg("ERROR: Failed to create nx_servertask task: %d\n", errcode);
return -errcode;
}
/* Wait a bit to let the server get started */
usleep(50*1000);
return OK;
}
#endif /* CONFIG_NX_NXSTART */

View File

@ -78,7 +78,7 @@
/****************************************************************************
* Name: nxmu_kbdin
*
* Descripton:
* Description:
* New keyboard data has been received from the thread or interrupt
* handler that manages some kind of keyboard/keypad hardware. Route that
* positional data to the appropriate window client.
@ -116,4 +116,3 @@ void nxmu_kbdin(FAR struct nxfe_state_s *fe, uint8_t nch, FAR uint8_t *ch)
}
#endif /* CONFIG_NX_KBD */

View File

@ -269,6 +269,35 @@ int nx_runinstance(FAR const char *mqname, FAR NX_DRIVERTYPE *dev);
# define nx_run(dev) nx_runinstance(NX_DEFAULT_SERVER_MQNAME, dev)
#endif
/****************************************************************************
* Name: nx_start
*
* Description:
* nx_start() provides a wrapper function to simplify and standardize the
* starting of the NX server.
*
* NOTE: Currently, many applications include logic to start the NX
* server from application initialization logic. That, of course, cannot
* work in the NuttX kernel build because the resources required by the
* NX server are private to the kernel mode logic.
*
* Input Parameters:
* None
*
* Returned Value:
* Zero (OK) is returned on success. This indicates that the NX server
* has been successfully started, is running, and waiting to accept
* connections from NX clients.
*
* A negated errno value is returned on failure. The errno value indicates
* the nature of the failure.
*
****************************************************************************/
#if defined(CONFIG_NX_MULTIUSER) && defined(CONFIG_NX_START)
int nx_start(void);
#endif
/****************************************************************************
* Name:nx_connectinstance (and nx_connect macro)
*