371 lines
12 KiB
ReStructuredText
371 lines
12 KiB
ReStructuredText
.. _nxwidgets:
|
||
|
||
=======================
|
||
``nxwidgets`` NXWidgets
|
||
=======================
|
||
In order to better support NuttX based platforms, a special graphical
|
||
userinterface has been created called NXWidgets. NXWidgets is written in
|
||
C++ and integrates seamlessly with the NuttX :ref:`NX graphics
|
||
subsystem <nxgraphics>` in order to provide graphic
|
||
objects, or "widgets," in the NX Graphics Subsystem
|
||
|
||
Some of the features of NXWidgets include:
|
||
|
||
- **Conservative C++**. NXWidgets is written entirely in C++ but using
|
||
only selected "embedded friendly" C++ constructs that are fully
|
||
supported under NuttX. No additional C++ support libraries are
|
||
required.
|
||
- **NX Integration**. NXWidgets integrate seamlessly with the
|
||
:ref:`NX graphics subsystem <nxgraphics>`. Think of the X
|
||
server under Linux … the NX graphics system is like a tiny X server
|
||
that provides windowing under NuttX. By adding NXWidgets, you can
|
||
support graphics objects like buttons and text boxes in the NX
|
||
windows and toolbars.
|
||
- **Small Footprint**. NXWidgets is tailored for use MCUs in embedded
|
||
applications. It is ideally suited for mid- and upper-range of most
|
||
MCU families. A complete NXWidgets is possible in as little as 40K of
|
||
FLASH and maybe 4K of SRAM.
|
||
- **Output Devices**. NXWidgets will work on the high-end frame buffer
|
||
devices as well as on LCDs connected via serial or parallel ports to
|
||
a small MCU.
|
||
- **Input Devices**. NXWidgets will accept position and selection
|
||
inputs from a mouse or a touchscreen. It will also support character
|
||
input from a keyboard such as a USB keyboard. NXWidgets supports on
|
||
very special widget called CKeypad that will provide keyboard input
|
||
via an on-screen keypad that can be operated via mouse or touchscreen
|
||
inputs.
|
||
- **Many Graphic Objects**. Some of the graphic objects supported by
|
||
NXWidgets include labels, buttons, text boxes, button arrays, check
|
||
boxes, cycle buttons, images, sliders, scrollable list boxes,
|
||
progress bars, and more.
|
||
- **DOxygen Documentation** DOxygen documentation is available.
|
||
|
||
Note: Many of the fundamental classed in NxWidgets derive from the
|
||
Antony Dzeryn's "Woopsi" project which also has a
|
||
BSD style license. See the COPYING file for details.
|
||
|
||
NXWidgets Doxygen Documentation
|
||
===============================
|
||
|
||
.. todo::
|
||
NXWidgets supports building HTML documentation via Doxygen. We should
|
||
integrate this into the Sphinx documentation build.
|
||
|
||
Thanks go to Jose Pablo Carballo for contributing this!
|
||
|
||
Directory Structure
|
||
-------------------
|
||
|
||
- ``Kconfig``
|
||
|
||
This is a ``Kconfig`` file that should be provided at ``apps/NxWidgets/Kconfig``.
|
||
When copied to that location, it will be used by the NuttX configuration
|
||
systems to configure settings for NxWidgets and NxWM
|
||
|
||
- ``nxwidgets``
|
||
|
||
The source code, header files, and build environment for NxWidgets is provided
|
||
in this directory.
|
||
|
||
- ``UnitTests``
|
||
|
||
Provides a collection of unit-level tests for many of the individual widgets
|
||
provided by ``nxwidgets``.
|
||
|
||
Doxygen
|
||
-------
|
||
|
||
Installing the necessary packages in Ubuntu
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
1. Install the following packages::
|
||
|
||
$ sudo aptitude install doxygen doxygen-doc doxygen-gui dot2tex graphviz
|
||
|
||
2. (Optional) Install Doxygen from the latest sourcode.
|
||
|
||
The Ubuntu package is outdated. The newer the version of Doxygen, the better
|
||
the documentation looks.
|
||
|
||
Place yourself in some temporary folder where you can download the source,
|
||
and run [1]::
|
||
|
||
$ svn co https://doxygen.svn.sourceforge.net/svnroot/doxygen/trunk doxygen-svn
|
||
$ cd doxygen-svn
|
||
$ ./configure
|
||
$ make
|
||
$ make install
|
||
|
||
Generating documentation
|
||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
Two ways described here:
|
||
|
||
1. Use the provided ``gendoc.sh`` script::
|
||
|
||
trunk/NXWidgets/Doxygen/gendoc.sh
|
||
|
||
The script only needs the argument to the absolute path where to place the
|
||
generated documentation. I.e.::
|
||
|
||
$ cd /path/to/nuttx/trunk/NXWidgets/Doxygen/
|
||
$ mkdir doc
|
||
$ ./gendoc.sh $PWD/doc
|
||
|
||
2. Using the ``Doxyfile`` directly:
|
||
|
||
The file ``Doxyfile`` contains the configuration of the Doxygen settings for
|
||
the run, edit only if necessary.
|
||
|
||
To generate the documentation type::
|
||
|
||
$ cd /path/to/nuttx/trunk/NXWidgets/Doxygen/
|
||
$ doxygen Doxyfile
|
||
|
||
References
|
||
~~~~~~~~~~
|
||
|
||
[1] http://www.stack.nl/~dimitri/doxygen/download.html
|
||
|
||
|
||
Unit Tests
|
||
----------
|
||
|
||
Installing and Building the Unit Tests
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
1. Setup NuttX
|
||
|
||
1. Configure NuttX
|
||
|
||
Configure NuttX to run one of the target configurations. For example,
|
||
let's assume that you are using the ``sim/nsh2`` configuration. The
|
||
``sim/nsh2`` configuration was specially created for use NXWidgets on the
|
||
simulation platform. A similar, special configuration ``stm3210e-eval/nsh2``
|
||
is also for the ``STM3210E-EVAL`` available. However, the unit test can be
|
||
run on other configurations (see steps d and e below).
|
||
|
||
**Note**: There are some other special configurationsrecommended for
|
||
unit-leveling testing of NxWM because the configuration is more complex in
|
||
that case. These are:
|
||
|
||
1) ``sim/nxwmm``, or the simulated platform (no touchscreen), and
|
||
2) ``stm3240g-evel``, for the ``STM3240G-EVAL`` board (with the STMPE11
|
||
touchscreen)
|
||
|
||
We will assume the ``sim/nsh2`` configuration in this discussion. The
|
||
``sim/nsh2`` configuration is installed as follows::
|
||
|
||
cd <nuttx-directory-path>
|
||
make distclean
|
||
tools/configure.sh sim:nsh2
|
||
|
||
Where:
|
||
|
||
``<nuttx-directory-path>`` is the full, absolute path to the NuttX build
|
||
directory
|
||
|
||
If you are using the ``sim/nsh2`` or ``stm3210e-eval`` configurations, then
|
||
skip to step 2 (Hmmm.. better check 1d) too).
|
||
|
||
There may be certain requirements for the configuration that you select...
|
||
for example, certain widget tests may require touchscreen support or
|
||
special font selections. These test-specific requirements are addressed
|
||
below under "Unit Test Directories"
|
||
|
||
2. Enable C++ Support
|
||
|
||
If you are not using the ``sim/nsh2`` or ``stm3210e-eval``, you will need to
|
||
add the following definitions to the NuttX configuration at
|
||
``nuttx/.config`` to enable C++ support::
|
||
|
||
CONFIG_HAVE_CXX=y
|
||
|
||
Check first, some configurations already have C++ support enabled (As of
|
||
this writing **ONLY** the ``sim/nsh2`` and ``stm321-e-eval`` configurations
|
||
have C++ support pre-enabled).
|
||
|
||
3. Enable Debug Options
|
||
|
||
If you are running on a simulated target, then you might also want to
|
||
enable debug symbols::
|
||
|
||
CONFIG_DEBUG_SYMBOLS=y
|
||
|
||
Then you can run the simulation using GDB or DDD which is a very powerful
|
||
debugging environment!
|
||
|
||
4. Special configuration requirements for the nxwm unit test::
|
||
|
||
CONFIG_NXTERM=y
|
||
|
||
5. Other ``.config`` file changes – NSH configurations only.
|
||
|
||
If the configuration that you are using supports NSH and NSH built-in
|
||
tasks then all is well. If it is an NSH configuration, then you will have
|
||
to define the following in your ``nuttx/.config`` file as well (if it is not
|
||
already defined)::
|
||
|
||
CONFIG_NSH_BUILTIN_APPS=y
|
||
|
||
``sim/nsh2`` and ``stm3210e-eval/nsh2`` already has this setting. You do not
|
||
need to change anything further in the ``nuttx/.config`` file if you are
|
||
using either of these configurations.
|
||
|
||
6. Other ``.config`` file changes – NON-NSH configurations only.
|
||
|
||
Entry Point. You will need to set the entry point in the .config file. For
|
||
NSH configurations, the entry point will always be ``nsh_main`` and you will
|
||
see that setting like::
|
||
|
||
CONFIG_INIT_ENTRYPOINT="nsh_main"
|
||
|
||
If you are not using in NSH, then each unit test has a unique entry point.
|
||
That entry point is the name of the unit test directory in all lower case
|
||
plus the suffix ``_main``. So, for example, the correct entry for the
|
||
``UnitTests/CButton`` would be::
|
||
|
||
CONFIG_INIT_ENTRYPOINT="cbutton_main"
|
||
|
||
And the correct entry point for ``UnitTests/nxwm`` would be::
|
||
|
||
CONFIG_INIT_ENTRYPOINT="nxwm_main"
|
||
|
||
etc.
|
||
|
||
For non-NSH configurations (such as the ``sim/touchscreen``) you will have
|
||
to remove the configuration setting that provided the ``main`` function so
|
||
that you use the ``main`` in the unit test code instead. So, for example,
|
||
with the ``sim/touchscreen`` configuration you need to remove the following
|
||
from the NuttX configuration file (``.config``)::
|
||
|
||
CONFIG_EXAMPLES_TOUSCHCREEN=y ## REMOVE (provided "tc_main")
|
||
|
||
2. Adjust the Stack Size
|
||
|
||
If using an simulation configuration (like ``sim/nsh2``) and your unit test
|
||
uses X11 as its display device, then you would have to increase the size of
|
||
unit test stack as described below under "Stack Size Issues with the X11
|
||
Simulation".
|
||
|
||
3. Build NuttX including the unit test and the NXWidgets library::
|
||
|
||
cd <nuttx-directory-path>
|
||
. ./setenv.sh
|
||
make
|
||
|
||
Work-Arounds
|
||
~~~~~~~~~~~~
|
||
|
||
Build Issues
|
||
............
|
||
|
||
1. I have seen this error on Cygwin building C++ code::
|
||
|
||
LD: nuttx.rel
|
||
ld: skipping incompatible /home/patacongo/projects/nuttx/nuttx/trunk/nuttx/libxx//liblibxx.a when searching for -llibxx
|
||
ld: cannot find -llibxx
|
||
|
||
The problem seems to be caused because ``gcc`` build code for 32-bit mode and
|
||
``g++`` builds code for 64-bit mode. Add the ``-m32`` option to the ``g++`` command
|
||
line seems to fix the problem. In ``Make.defs``::
|
||
|
||
CXXFLAGS = -m32 $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) \
|
||
$(ARCHCXXFLAGS) $(ARCHINCLUDESXX) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
|
||
|
||
2. Stack Size Issues with the X11 Simulation
|
||
|
||
When you run the NuttX simulation, it uses stacks allocated by NuttX from the
|
||
NuttX heap. The memory management model is exactly the same in the simulation
|
||
as it is real, target system. This is good because this produces a higher
|
||
fidelity simulation.
|
||
|
||
However, when the simulation calls into Linux/Cygwin libraries, it will still
|
||
use these small simulation stacks. This happens, for example, when you call
|
||
into the system to get and put characters to the console window or when you
|
||
make x11 calls into the system. The programming model within those libraries
|
||
will assume a Linux/Cygwin environment where the stack size grows dynamically
|
||
|
||
As a consequence, those system libraries may allocate large data structures
|
||
on the stack and overflow the small NuttX stacks. X11, in particular,
|
||
requires large stacks. If you are using X11 in the simulation, make sure that
|
||
you set aside a "lot" of stack for the X11 system calls (maybe 8 or 16Kb).
|
||
The stack size for the thread that begins with user start is controlled by
|
||
the configuration setting ``CONFIG_INIT_STACKSIZE``; you may need to
|
||
increase this value to larger number to survive the X11 system calls.
|
||
|
||
If you are running X11 applications as NSH add-on programs, then the stack
|
||
size of the add-on program is controlled in another way. Here are the steps
|
||
for increasing the stack size in that case::
|
||
|
||
cd ../apps/namedapps # Go to the namedapps directory
|
||
vi namedapps_list.h # Edit this file and increase the stack size of the add-on
|
||
rm .built *.o # This will force the namedapps logic to rebuild
|
||
|
||
Unit Tests Directories
|
||
~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
The following provide simple unit tests for each of the NXWidgets. In addition,
|
||
these unit tests provide examples for the use of each widget type.
|
||
|
||
- ``CButton``
|
||
|
||
- Exercises the ``CButton`` widget.
|
||
- Depends on ``CLabel``.
|
||
|
||
- ``CButtonArray``
|
||
|
||
- Exercises the ``CButtonArray`` widget.
|
||
|
||
- ``CCheckBox``
|
||
|
||
- Exercises the ``CCheckBox`` widget.
|
||
- Depends on ``CLabel`` and ``CButton``.
|
||
|
||
- ``CGlyphButton``
|
||
|
||
- Exercises the ``CGlyphButton`` widget.
|
||
- Depends on ``CLabel`` and ``CButton``.
|
||
|
||
- ``CImage``
|
||
|
||
- Exercises the ``CImage`` widget.
|
||
|
||
- ``CLabel``
|
||
|
||
- Exercises the ``CLabel`` widget.
|
||
|
||
- ``CProgressBar``
|
||
|
||
- Exercises the ``CProgressBar`` widget.
|
||
|
||
- ``CRadioButton``
|
||
|
||
- Exercises the ``CRadioButton`` and ``CRadioButtonGroup`` widgets.
|
||
- Depends on ``CLabel`` and ``CButton``.
|
||
|
||
- ``CScrollBarHorizontal``
|
||
|
||
- Exercises the ``ScrollbarHorizontal``.
|
||
- Depends on ``CSliderHorizontal`` and ``CGlyphButton``.
|
||
|
||
- ``CScrollBarVertical``
|
||
|
||
- Exercises the ``ScrollbarHorizontal``.
|
||
- Depends on ``CSliderVertical`` and ``CGlyphButton``.
|
||
|
||
- ``CSliderHorizontal``
|
||
|
||
- Exercises the ``CSliderHorizontal``.
|
||
- Depends on ``CSliderHorizontalGrip``.
|
||
|
||
- ``CSliderVertical``
|
||
|
||
- Exercises the ``CSliderVertical``.
|
||
- Depends on ``CSliderVerticalGrip``.
|
||
|
||
- ``CTextBox``
|
||
|
||
- Exercises the ``CTextBox`` widget.
|
||
- Depends on ``CLabel``.
|