===
=== FaCE (Front-end for ACE CE)
===
=== Object Computing, Inc.  <http://www.ociweb.com>
=== St. Louis, Missouri
=== Copyright (C) 2002.  All rights reserved.
===
=== V1.01, March 30th, 2002
===

== What's FaCE?

FaCE is a simple front-end framework for testing and debugging non-Windows
CE applications on the Pocket PC 2002 platform.  Originally, FaCE was
developed to test ACE and TAO components internally in Object Computing, Inc.
However, since it has shown dramatic increase of productivity in a lot
shorter amount of time, it has been prepared as a package for all programmers
who want to test and run existing codes (non-WinCE native codes) on Pocket PC
2002 and WinCE 3.0.

The features of FaCE are:

  1. command line parameter support
  2. command line history support (never type in same command line again)
  3. output displayed on the windows screen
  4. output to file (with append and overwrite support)
  5. does not use MFC
  6. almost no modification to existing user code
  7. easy to enable and disable after install

* Default project files only contain Pocket PC 2002 platform configuration.
  A new configuration can be added for other WinCE 3.0 platform from eVC.


== Package Contents

Files contained in FaCE package are:

 Main Framework Files for both ACE users and non-ACE users
  - ACE_Racer.bmp
  - FaCE.h & cpp
  - FaCE.ico
  - FaCE.rc
  - newres.h
  - resource.h
  - TAO.bmp

 ACE entry point definition file
  - FaCE_OS.h

 Additional Framework files for non-ACE users
  - CE_ARGV.h & cpp
  - CE_Screen_Output.h & cpp

 Files for loading skeleton FaCE from eVC
  - FaCE.vcp & vcw      : FaCE Project files for ACE users
  - FaCENOACE.vcp & vcw : FaCE Project files for non-ACE users
  - Main.cpp            : almost empty entry point function

 Misc. Files
  - ACE.ico         : a bonus icon of ACE logo
  - License.txt     : license and warranty information
  - ReadMe.txt      : this document


== Requirement

 - Microsoft(C) eMbedded Visual Studio/C++ (eVC) 3.0
 - Pocket PC 2002 SDK

 ** For ACE-users only:
 - ACE+TAO installed and configured for WinCE build only for ACE-users
 - ace and ace_os libraries built for WinCE and loaded on machine


== Important Note

It has been reported that certain Pocket PC 2002 machines with ARM processor
can be totally dead and will not even respond to the hard reset.  While the
real cause of this problem is unknown, HP has released a patch for this
problem.  We have tested it, and it seems working fine on our machine (HP
Jornada 568), which is our 5th machine that has been running fine for the
longest time.

As this has been identified by hardware manufacturer and can be fixed as HP
did, Object Computing, Inc. (OCI) or any member of ACE+TAO community cannot
be responsible for this problem.  If this problem happens during debugging,
contact your hardware manufacturer for fix or replacement.  It has found
that almost all Pocket PC 2002 machines regardless of manufacturers have same
problem.

Also, Phil Mesnier at OCI has found that virtual function calls under certain
situation can cause a problem that randomly changes parameter and pointer
values over function calls.  This is due to the incorrect instructions
generated by eVC for ARM processor.  So far, no solution or patch has been
released by compiler vendor, although vendor is aware of this problem.

Since Pocket PC 2002 is based on WinCE 3.0, ACE+TAO as well as FaCE should
be able to run on any WinCE 3.0 platform by adding a new configuration with
minimal change.


== Installation & Setup

1. Create a subdirectory named 'FaCE' (or anything in your taste) under
   your current project directory.

2. Copy FaCE_OS.h to the ACE_ROOT/ace directory, and add following line at
   the end of your ACE_ROOT/ace/config.h file:

   #include "FaCE_OS.h"

3. Copy main framework files listed above and add them into "your" project
   (NOT FaCE.vcw/vcp).  For non-ACE users, copy additional framework files
   for non-ACE users in addition to the main framework files.
   It would be a good idea to create a new folder in your project and put
   all FaCE files into it.  This way, it will be easy to disable FaCE by
   setting the folder excluded from the build on the folder property option.

   ** IMPORTANT! **
   FaCE does NOT use MFC.  Thus, if your project is already set for
   'Not using MFC', then do not change the setting.

   * Note: Make sure those files are not shared by multiple executables.
           Each project must have its own copy of those files.
           It is a good idea to create a separate folder on your project
           and put FaCE related files into that folder.  In that case,
           if you want to disable FaCE and run by using normal 'main',
           then you can simply set the whole FaCE folder excluded from
           build in the project setting menu.

4. Change your 'main()' function part similar to the following example.

   #ifdef ACE_HAS_WINCE
   #include "FaCE/FaCE.h"   // use the name of subdirectory you created
   int FaCE_MAIN (int argc, ACE_TCHAR *argv[])
   #else
   int ACE_TMAIN (int argc, ACE_TCHAR *argv[])  // ACE normal entry point
   #endif

   Change the directory name for "FaCE/FaCE.h" if necessary.
   For non-ACE users, use 'UNDER_CE' instead of 'ACE_HAS_WINCE'.

   == Possible Additional Change

   Above change will be the only change if your program compiles and links
   fine under eVC.  It does not mean that your program is WinCE-ready but
   just means that your program does not include the libraries that are not
   supported by WinCE, such as iostream.

   For ACE users, good examples will be the ACE test programs under
   $ACE_ROOT/test.

   For non-ACE users, I highly recommend to create a project for WinCE first
   if it has not already been done and write your code using wmain.
   Try compile and link your program without FaCE to check your program does
   not include any libraries not supported by WinCE.  FaCE supports text output
   by aliasing 'cout' in FaCE.h; however, it is NOT a real iostream but an alias
   for CE_Screen_Output class.  You may need to use '#ifdef UNDER_CE' for your
   iostream includes, if you want to share the code among different platforms.

   Also, it is important to match the parameter types for 'wmain' function.
   For WinCE, it MUST be in the format of:

     int FaCE_MAIN (int, wchar_t**)

   and you can leave your original wmain type as it was for non-CE platform
   definition.

5. Go to 'ResourceView' or double-click on the 'FaCE.rc'.  Open 'String Table ->
   String Table' from the resource browse view, and change the string value (caption)
   defined for 'IDS_APP_TITLE' from 'FaCE' to your program name.  This will
   help identifying multiple FaCE-fied applications when you browse them
   through system memory -> running programs in case of crash.

6. That's it!

** Optionally, you can personalize the icons defined for FaCE for your own.
   To do this easily, load "FaCE.vcw" (requires ACE library) or "FaCENOACE.vcw"
   from eVC.  Also, FaCENOACE.vcw can be used as 'hello world'-type starting
   frame-work for non-WinCE programmers.

** Non-ACE users may see the warning messages saying, "Could not find the file xxx",
   for ace.h, Log_Msg.h, OS.h, and CE_Screen_Output.h.  This is due to the eVC's
   not-so-perfect precompilation file checking and totally harmless.

** Later if you don't want to use FaCE anymore, simply restore your original
   main function and remove FaCE files from your project (or exclude FaCE files
   from build).  ACE library does not have to be rebuilt as FaCE_OS.h only
   contains macro.

== Running FaCE

1. Command line option

User can specify the command line option for the program by using 'Settings ->
Command Line' from the FaCE menu.  FaCE will automatically save all user-entered
command line parameters as a ASCII format file named 'Parameters.txt' in the
root directory of WinCE device/emulator.  User can edit and change by opening
this file from any text editor and save as a ASCII text file with DOS standard
CR/LF combo.  This will greatly save time especially when you are working on the
Pocket PC machine that does not have keyboard.  Remember NOT to convert file
format to Unicode; it must be standard DOS ASCII text file.

2. Output Saving

You can save output to file by selecting 'Tools -> Save To File'.  By default,
FaCE will not create/save any file.  Also, any output received before setting
up this feature will not be saved.

If the file with specified name exists, FaCE will ask whether you want to
append to the end of file or erase and overwrite.  All output files will be
saved in the root directory of the system.

3. Running Your Program

'Setting -> Run' will execute your program.  Two tags, 'START' and 'END'
indicate the beginning and end of your code.

For ACE users, any log message sent to ACE message log (ACE_DEBUG, for example)
will be displayed on the screen.  Also, if you have setup to save to file,
the same contents will be saved to the file as well.  Note that the output will
NOT have ACE internal tags (i.e. Dec 04 14:51:12.000 2001@LM_DEBUG@) because
FaCE uses callback message function, and ACE does not pass those tags along
with the output message.

For non-ACE users, you can declare your own local copy of CE_Screen_Output
object.  For example, you can declare CE_Screen_Output object in your cpp file
like:

  CE_Screen_Output cout;

and use it like,

  int a = 100;
  wchar_t* strTemp = L"Hello, world!";
  cout << L"String : " << strTemp << L"a = " << a << endl;

Remember, CE_Screen_Output is just a simple text output function and does not
have the full capabilities of iostream, which is not available for WinCE 3.0.

4. In case of crash

If you have started your code, but the code crashes, which can be easily
identified by looking for the 'END' tag, then you can use Windows CE's memory
program to kill the process (Start -> Settings -> System tag -> Memory ->
Running Programs tag).  If you have changed IDS_APP_TITLE in the resource
viewer, then you will see the name you have specified; otherwise, FaCE will be
listed.  You can select the name and stop the process by clicking 'Stop' button.
Sometimes, you may need to reset the machine if you cannot access memory program.


== Note

- This FaCE framework does not use any MFC; it only uses general Win32
  API, thus, your project setting does not have to be changed.

- FaCE is for the 'legacy' Unix/DOS style console applications that
  do not use any Win32 and MFC for Windows OS.  Programs that are already
  using native Windows/WinCE API's will not need FaCE framework.

- If you run your application from FaCE (Settings -> Run), 'START' and
  'END' will appear at the beginning and end of output messages from your
  application.  If you see 'END' lable after execution, you can run your
  program again without exit and start up FaCE again.

- Make sure to terminate FaCE by selecting 'Settings -> Exit'.  It will
  completely terminate FaCE session; Clicking on the 'X' button
  at the top-left corner of the screen will not, just like most WinCE programs.

- FaCE_MAIN is only for the WinCE port of ACE, ensuring proper windows system
  message filtering along with proper registraion so that user can see the
  process from memory setting and task switcher applications.

- ACE and FaCE do not overrides native WinMain.  If you are developing for
  Windows OS only, your WinMain should be just safe from any overrides.
  In this case, of course, you don't need to use FaCE package.


== Question or Comment

If you have question and/or comment specific to the FaCE, please contact
Si Park at spark@ociweb.com or Justin Michel at michel_j@ociweb.com.
