nuttx-apps/graphics/nxwidgets/UnitTests
Gregory Nutt 950b4cb604 wm4Nx is a port of twm, Tab Window Manager (or Tom's Window Manager)
version 1.0.10 to NuttX NX windows server.  No, a port is not the right
word.  It is a re-design of TWM from the inside out to work with the NuttX
NX server.  The name Twm4Nx reflects this legacy.  But Twm4Nx is more a
homage to TWM than a port of TWM.

The original TWM was based on X11 which provides a rich set of features.
TWM provided titlebars, shaped windows, several forms of icon management,
user-defined macro functions, click-to-type and pointer-driven keyboard
focus, graphic contexts, and user-specified key and pointer button bindings,
etc.

Twm4Nx, on the other hand is based on the NuttX NX server which provides
comparatively minimal support.  Additional drawing support comes from
the NuttX NxWidgets library (which necessitated the change to C++).

Twm4Nx is greatly stripped down and targeted on small embedded systems
with minimal resources.  For example, no assumption is made about the
availability of a file system; no .twmrc file is used.  Bitmaps are not
used (other than for fonts).

The TWM license is, I believe compatible with the BSD license used by NuttX.
The origin TWM license required notice of copyrights within each file and
a full copy of the original license which you can find in the COPYING file.
within this directory.

STATUS:

This port was brutal.  Much TWM logic was removed because it depending on X11 features (or just because I could not understand how to use it).  The logic is partial.  A lot more needs to be done to have a complete system (hence, it is marked EXPERIMENTAL).  The kinds of things that need to done are:

1. Update some logic that is only fragmentary for how like resizing, and menus.
2. Integrate NxWidgets into the windows:  The resize menu needs a CLabel, the menus are CListBox'es, but not completely integrated, the Icon Manager needs to be a button array.
3. Resit Icons.  They are windows now, but need to be compound widgets lying on the background.
4. Widget events are only partially integrated.  A lot more needs to be done.  A partial change to thoe event system that hints at the redesign is in place but it is far from complete.
2019-04-25 16:54:17 -06:00
..
CButton Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CButtonArray Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CCheckBox Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CGlyphButton Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CGlyphSliderHorizontal Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CImage Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CKeypad Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CLabel Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CLatchButton Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CLatchButtonArray Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CListBox wm4Nx is a port of twm, Tab Window Manager (or Tom's Window Manager) 2019-04-25 16:54:17 -06:00
CProgressBar Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CRadioButton Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CScrollbarHorizontal Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CScrollbarVertical Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CSliderHorizonal Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CSliderVertical Squashed commit of the following: 2019-04-04 18:53:29 -06:00
CTextBox Squashed commit of the following: 2019-04-04 18:53:29 -06:00
Kconfig Squashed commit of the following: 2019-04-04 18:53:29 -06:00
Make.defs Squashed commit of the following: 2019-04-04 18:53:29 -06:00
Makefile Squashed commit of the following: 2019-04-04 18:53:29 -06:00
README.txt Squashed commit of the following: 2019-04-04 18:53:29 -06:00
TestStatus.txt Squashed commit of the following: 2019-04-04 18:53:29 -06:00

README
======

This directory contains a collection of Unit Tests that can be used to verify
NXWidgets.:

Contents
========
  o Building the Unit Tests
    1. Setup NuttX
      a) Configure NuttX
      b) Enable C++ Support
      c) Enable Debug Options
      d) NxWM
      e) Other Possible .config file changes
      f) Other Possible .config file changes
    2. Configure in the Selected Unit Test
  o Work-Arounds
    1. Build Issues
    2. Stack Size Issues with the X11 Simulation
  o Unit Test Directories

Installing and Building the Unit Tests
======================================

1. Setup NuttX

   a) 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
     cd 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"

   b) 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).

   c) 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!

   d) Special configuration requirements for the nxwm unit test:

     CONFIG_NXTERM=y

   e) 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.

   f) 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_USER_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_USER_ENTRYPOINT="cbutton_main"

   And the correct entry point for UnitTests/nxwm would be:

     CONFIG_USER_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) \
              $(ARCHCPUFLAGSXX) $(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_USERMAIN_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

UnitTests
=========

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