Hacking on phonesim
*******************

phonesim is a soft modem that eliminates the need to have an actual AT
modem connected to the system for testing and developing Ofono.


Build tools requirements
========================

When building and testing directly from the repository it is important to
have at least automake version 1.10 or later installed. All modern
distributions should default to the latest version, but it seems that
Debian's default is still an earlier version:

  Check version
    # dpkg -l '*automake*'

  Install new version
    # apt-get install automake1.10
    # update-alternatives --config automake

QT development libraries (libqt4-dev) are also required for building
phonesim. It is recommended to install the QT 4 development tools package
(qt4-dev-tools) as an alternative if available with your distribution.


Working with the source code repository
=======================================

The repository contains two extra scripts that accomplish the bootstrap
process. One is called "bootstrap" which is the basic scripts that uses the
autotools scripts to create the needed files for building and installing.
It makes sure to call the right programs depending on the usage of shared or
static libraries or translations etc.

The second program is called "bootstrap-configure". This program will make
sure to properly clean the repository, call the "bootstrap" script and then
call configure with proper settings for development. It will use the best
options and pass them over to configure. These options normally include
the enabling the maintainer mode and the debugging features.

So while in a normal source project the call "./configure ..." is used to
configure the project with its settings like prefix and extra options. In
case of bare repositories call "./bootstrap-configure" and it will bootstrap
the repository and calls configure with all the correct options to make
development easier.

In case of preparing for a release with "make distcheck", don't use
bootstrap-configure since it could export development specific settings.

So the normal steps to checkout, build and install such a repository is
like this:

  Checkout repository
    # git clone git://git.kernel.org/pub/scm/network/ofono/phonesim.git
    # cd phonesim

  Configure and build
    # ./bootstrap-configure
    # make

  Check installation
    # make install DESTDIR=$PWD/x
    # find x
    # rm -rf x

  Check distribution
    # make distcheck

  Final installation
    # sudo make install

  Remove autogenerated files
    # make maintainer-clean


Running from within the source code repository
==============================================

When using "./configure --enable-maintainer-mode" the automake scripts will
use the plugins directly from within the repository. This removes the need
to use "make install" when testing "phonesim". The "bootstrap-configure"
automatically includes this option.

  Run phonesim in foreground using the following options
    # ./src/phonesim -p 12345 -gui src/default.xml

Check your modem.conf file and enable the phonesim configuration before
executing the above command. Argument -p should be followed by the proper
port number, in case you have changed the default "12345". Argument -gui
will launch the gui once the modem is enabled.

To enable the modem, make sure the ofono daemon is running and execute the
enable-modem script with /phonesim argument (default defined in modem.conf,
change if changes to that section has been made). The AT chat can then
be seen in the GUI window. Running the script disable-modem with /phonesim
argument will turn off the soft modem.

The default.xml can be tweaked further to include additional AT-Commands and
supposed responses from the soft modem.

For production installations or distribution packaging it is important that
the "--enable-maintainer-mode" option is NOT used.
