Index: tags/0.2.3/.clang-format
===================================================================
--- tags/0.2.3/.clang-format	(revision 368)
+++ tags/0.2.3/.clang-format	(revision 368)
@@ -0,0 +1,4 @@
+BasedOnStyle: WebKit
+BreakBeforeBraces: Linux
+BreakClassInheritanceListsBeforeColon: true
+BreakClassInheritanceListsBeforeComma: true
Index: tags/0.2.3/.gitignore
===================================================================
--- tags/0.2.3/.gitignore	(revision 368)
+++ tags/0.2.3/.gitignore	(revision 368)
@@ -0,0 +1,4 @@
+*Config.h
+*Plugin.cpp
+*Plugin.h
+*Plugin.json
Index: tags/0.2.3/CMakeLists.txt
===================================================================
--- tags/0.2.3/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/CMakeLists.txt	(revision 368)
@@ -0,0 +1,147 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+project(Pacpus)
+cmake_minimum_required(VERSION 2.8)
+
+if(POLICY CMP0020)
+    cmake_policy(SET CMP0020 NEW) # for QT5.1 on windows / not work on linux
+endif()
+if(POLICY CMP0026)
+    # allow using LOCATION_DEBUG in cmake/PacpusUtilities.cmake
+    cmake_policy(SET CMP0026 OLD)
+endif()
+
+################################################################################
+# Pacpus version
+set(${PROJECT_NAME}_MAJOR_VERSION 0)
+set(${PROJECT_NAME}_MINOR_VERSION 2)
+set(${PROJECT_NAME}_PATCH_VERSION 3)
+set(${PROJECT_NAME}_VERSION
+    "${${PROJECT_NAME}_MAJOR_VERSION}.${${PROJECT_NAME}_MINOR_VERSION}.${${PROJECT_NAME}_PATCH_VERSION}")
+
+################################################################################
+# CMake variables
+set(PACPUS_ROOT_DIR         ${CMAKE_SOURCE_DIR})
+set(PACPUS_3RD_PARTY_DIR    ${PACPUS_ROOT_DIR}/3rd)
+set(PACPUS_CMAKE_DIR        ${PACPUS_ROOT_DIR}/cmake)
+set(PACPUS_DOC_DIR          ${PACPUS_ROOT_DIR}/doc)
+set(PACPUS_EXAMPLES_DIR     ${PACPUS_ROOT_DIR}/examples)
+set(PACPUS_INCLUDE_DIR      ${PACPUS_ROOT_DIR}/include)
+set(PACPUS_SCRIPTS_DIR      ${PACPUS_ROOT_DIR}/scripts)
+set(PACPUS_SOURCE_DIR       ${PACPUS_ROOT_DIR}/src)
+set(PACPUS_TEST_DIR       ${PACPUS_ROOT_DIR}/test)
+set(IS_BUILDING_PACPUS      TRUE)
+
+set(PACPUS_DEFINITIONS "")
+
+################################################################################
+set(PACPUS_BUILD_TESTS TRUE CACHE BOOL "Whether build the tests")
+
+################################################################################
+# Configure CMake
+list(APPEND CMAKE_MODULE_PATH ${PACPUS_CMAKE_DIR})
+
+################################################################################
+# Import some functions
+include(${PACPUS_CMAKE_DIR}/PacpusUtilities.cmake)
+
+################################################################################
+# Configure Pacpus
+include(${PACPUS_CMAKE_DIR}/PacpusConfiguration.cmake)
+
+################################################################################
+# Find dependencies
+include(${PACPUS_CMAKE_DIR}/PacpusDependencies.cmake)
+
+################################################################################
+# Handle platform-specific behaviour
+include(${PACPUS_CMAKE_DIR}/PacpusPlatforms.cmake)
+
+################################################################################
+# Compiler flags coming from PacpusDependencies and PacpusPlatforms
+message(STATUS "\${PACPUS_DEFINITIONS} = ${PACPUS_DEFINITIONS}")
+message(STATUS "\${PACPUS_DEPENDENCIES_INC} = ${PACPUS_DEPENDENCIES_INC}")
+message(STATUS "\${PACPUS_DEPENDENCIES_LIB} = ${PACPUS_DEPENDENCIES_LIB}")
+add_definitions(${PACPUS_DEFINITIONS})
+
+################################################################################
+# Includes directories
+include_directories(
+    ${PACPUS_DEPENDENCIES_INC}
+    ${PACPUS_INCLUDE_DIR}
+)
+
+################################################################################
+# Build the Pacpus' modules
+add_subdirectory(${PACPUS_SOURCE_DIR})
+
+################################################################################
+# DOCUMENTATION
+if(PACPUS_BUILD_DOC)
+    add_subdirectory(${PACPUS_DOC_DIR})
+endif()
+
+################################################################################
+# Pacpus Installation
+include(${PACPUS_CMAKE_DIR}/PacpusInstall.cmake)
+set(ENV{PACPUS_ROOT} ${PACPUS_INSTALL_DIR})
+
+################################################################################
+# EXAMPLES
+if(PACPUS_BUILD_EXAMPLES)
+    add_subdirectory(${PACPUS_EXAMPLES_DIR})
+endif()
+
+################################################################################
+# TESTS
+if(${PACPUS_BUILD_TESTS})
+    enable_testing()
+    #add_subdirectory(${PACPUS_TEST_DIR})
+endif()
+
+################################################################################
+# SUMMARY
+pacpus_info("")
+pacpus_info("=====================================================================")
+pacpus_info("Configuration for Pacpus ${${PROJECT_NAME}_VERSION}")
+pacpus_info("=====================================================================")
+pacpus_info("")
+pacpus_info("  Platform:")
+pacpus_info("    Host:" ${CMAKE_HOST_SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_VERSION} ${CMAKE_HOST_SYSTEM_PROCESSOR})
+if(CMAKE_CROSS_COMPILING)
+    pacpus_info("    Target:" ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION} ${CMAKE_SYSTEM_PROCESSOR})
+endif()
+pacpus_info("    CMake:" ${CMAKE_VERSION})
+pacpus_info("    CMake generator:" ${CMAKE_GENERATOR})
+pacpus_info("    CMake build tool:" ${CMAKE_BUILD_TOOL})
+if(MSVC)
+    pacpus_info("    MSVC:" ${MSVC_VERSION})
+else()
+    pacpus_info("    Configuration:" ${CMAKE_BUILD_TYPE})
+endif()
+pacpus_info("")
+pacpus_info("  Compiler:")
+pacpus_info("    C++ Compiler:" ${CMAKE_CXX_COMPILER})
+pacpus_info("    C++ flags (release):" ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE})
+pacpus_info("    C++ flags (debug):" ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG})
+pacpus_info("")
+pacpus_info("  Result:")
+pacpus_info("    Install directory:" ${PACPUS_INSTALL_DIR})
+pacpus_info("    Install with version number:" ${PACPUS_INSTALL_WITH_VERSION_NUMBER})
+pacpus_info("")
+pacpus_info("  Options:")
+pacpus_info("    Logging enabled:" ${PACPUS_USE_LOG})
+pacpus_info("    Colored logging enabled:" ${PACPUS_LOG_COLORED_OUTPUT})
+pacpus_info("    Installation of 3rd party:" ${PACPUS_INSTALL_3RD})
+pacpus_info("    Documentation enabled:" ${PACPUS_BUILD_DOC})
+pacpus_info("")
+if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
+    message(WARNING "The source directory is the same as build directory. \"make clean\" may damage the source tree")
+endif()
Index: tags/0.2.3/CODING_STYLE.txt
===================================================================
--- tags/0.2.3/CODING_STYLE.txt	(revision 368)
+++ tags/0.2.3/CODING_STYLE.txt	(revision 368)
@@ -0,0 +1,9 @@
+Follow the coding style described in:
+    http://www.webkit.org/coding/coding-style.html
+
+If possible, use clang-format tool to format your code:
+    // in-place formatting
+    clang-format -i --style="WebKit" INPUT_FILE
+    
+    // out-of-place formatting
+    clang-format --style="WebKit" INPUT_FILE > OUTPUT_FILE
Index: tags/0.2.3/DEPENDENCIES.txt
===================================================================
--- tags/0.2.3/DEPENDENCIES.txt	(revision 368)
+++ tags/0.2.3/DEPENDENCIES.txt	(revision 368)
@@ -0,0 +1,29 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+See INSTALL.txt for information about how to install libraries.
+
+========================================
+Compilers:
+========================================
+clang >= 3.3
+gcc >= 4.7
+MSVC >= 2012
+
+========================================
+3rd party libraries:
+========================================
+Boost 1.54 (built libraries: log, log_setup, program_options)
+Qt 5.1.1
+
+========================================
+Tools:
+========================================
+CMake >= 2.8.10
+Doxygen (for the documentation)
Index: tags/0.2.3/INSTALL.txt
===================================================================
--- tags/0.2.3/INSTALL.txt	(revision 368)
+++ tags/0.2.3/INSTALL.txt	(revision 368)
@@ -0,0 +1,54 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+========================================
+Boost
+========================================
+See:
+* http://www.boost.org
+* http://www.boost.org/doc/libs/release/more/getting_started/
+* http://www.boost.org/doc/libs/release/more/getting_started/windows.html
+* http://www.boost.org/doc/libs/release/more/getting_started/unix-variants.html
+
+You can directly install Boost binaries for Windows from
+* http://sourceforge.net/projects/winbin/files/boost/
+
+If you want to build it on your own. Please follow these steps:
+
+1. Download boost archive (let's call it BOOST.ZIP) for your system from:
+* http://sourceforge.net/projects/boost/files/boost/
+or get latest directly:
+* http://sourceforge.net/projects/boost/files/latest/download?source=files
+
+2. Unpack the downloaded boost archive BOOST.ZIP to some directory (e.g. HOME_DIR).
+
+3. Go to HOME_DIR.
+
+4. Run `bootstrap` in HOME_DIR.
+    bootstrap.bat
+        or
+    ./booststrap.sh
+
+Note: Run `bootstrap --help` for more info.
+
+5. Run `b2` in HOME_DIR.
+    b2 --with-log install
+        or
+    ./b2 --with-log install
+
+    5.1
+        a. If needed, you can run `b2` with additional parameters to specify the installation directory
+        b2 --prefix="C:\lib\boost" install
+    
+        b. In this case you'll have to add environment variables:
+        BOOST_ROOT="c:\lib\Boost"
+        BOOST_LIBRARYDIR="c:\lib\Boost\lib"
+
+    5.2. You can install full Boost using:
+        b2 --build-type=complete install
Index: tags/0.2.3/LICENCE-fr.txt
===================================================================
--- tags/0.2.3/LICENCE-fr.txt	(revision 368)
+++ tags/0.2.3/LICENCE-fr.txt	(revision 368)
@@ -0,0 +1,529 @@
+
+Le framework de développement UTC/CNRS Heudiasyc Pacpus est distribué 
+sous les termes de la licence CECILL-C version 1.0.
+
+Copyright (c) UTC/CNRS Heudiasyc 2005 - 2015. All rights reserved.
+
+
+
+CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-C
+
+
+    Avertissement
+
+Ce contrat est une licence de logiciel libre issue d'une concertation
+entre ses auteurs afin que le respect de deux grands principes préside à
+sa rédaction:
+
+    * d'une part, le respect des principes de diffusion des logiciels
+      libres: accès au code source, droits étendus conférés aux
+      utilisateurs,
+    * d'autre part, la désignation d'un droit applicable, le droit
+      français, auquel elle est conforme, tant au regard du droit de la
+      responsabilité civile que du droit de la propriété intellectuelle
+      et de la protection qu'il offre aux auteurs et titulaires des
+      droits patrimoniaux sur un logiciel.
+
+Les auteurs de la licence CeCILL-C (pour Ce[a] C[nrs] I[nria] L[ogiciel]
+L[ibre]) sont:
+
+Commissariat à l'Energie Atomique - CEA, établissement public de
+recherche à caractère scientifique, technique et industriel, dont le
+siège est situé 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris.
+
+Centre National de la Recherche Scientifique - CNRS, établissement
+public à caractère scientifique et technologique, dont le siège est
+situé 3 rue Michel-Ange, 75794 Paris cedex 16.
+
+Institut National de Recherche en Informatique et en Automatique -
+INRIA, établissement public à caractère scientifique et technologique,
+dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153
+Le Chesnay cedex.
+
+
+    Préambule
+
+Ce contrat est une licence de logiciel libre dont l'objectif est de
+conférer aux utilisateurs la liberté de modifier et de réutiliser le
+logiciel régi par cette licence.
+
+L'exercice de cette liberté est assorti d'une obligation de remettre à
+la disposition de la communauté les modifications apportées au code
+source du logiciel afin de contribuer à son évolution.
+
+L'accessibilité au code source et les droits de copie, de modification
+et de redistribution qui découlent de ce contrat ont pour contrepartie
+de n'offrir aux utilisateurs qu'une garantie limitée et de ne faire
+peser sur l'auteur du logiciel, le titulaire des droits patrimoniaux et
+les concédants successifs qu'une responsabilité restreinte.
+
+A cet égard l'attention de l'utilisateur est attirée sur les risques
+associés au chargement, à l'utilisation, à la modification et/ou au
+développement et à la reproduction du logiciel par l'utilisateur étant
+donné sa spécificité de logiciel libre, qui peut le rendre complexe à
+manipuler et qui le réserve donc à des développeurs ou des
+professionnels avertis possédant des connaissances informatiques
+approfondies. Les utilisateurs sont donc invités à charger et tester
+l'adéquation du logiciel à leurs besoins dans des conditions permettant
+d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus
+généralement, à l'utiliser et l'exploiter dans les mêmes conditions de
+sécurité. Ce contrat peut être reproduit et diffusé librement, sous
+réserve de le conserver en l'état, sans ajout ni suppression de clauses.
+
+Ce contrat est susceptible de s'appliquer à tout logiciel dont le
+titulaire des droits patrimoniaux décide de soumettre l'exploitation aux
+dispositions qu'il contient.
+
+
+    Article 1 - DEFINITIONS
+
+Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une
+lettre capitale, auront la signification suivante:
+
+Contrat: désigne le présent contrat de licence, ses éventuelles versions
+postérieures et annexes.
+
+Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code
+Source et le cas échéant sa documentation, dans leur état au moment de
+l'acceptation du Contrat par le Licencié.
+
+Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et
+éventuellement de Code Objet et le cas échéant sa documentation, dans
+leur état au moment de leur première diffusion sous les termes du Contrat.
+
+Logiciel Modifié: désigne le Logiciel modifié par au moins une
+Contribution Intégrée.
+
+Code Source: désigne l'ensemble des instructions et des lignes de
+programme du Logiciel et auquel l'accès est nécessaire en vue de
+modifier le Logiciel.
+
+Code Objet: désigne les fichiers binaires issus de la compilation du
+Code Source.
+
+Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur
+sur le Logiciel Initial.
+
+Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le
+Contrat.
+
+Contributeur: désigne le Licencié auteur d'au moins une Contribution
+Intégrée.
+
+Concédant: désigne le Titulaire ou toute personne physique ou morale
+distribuant le Logiciel sous le Contrat.
+
+Contribution Intégrée: désigne l'ensemble des modifications,
+corrections, traductions, adaptations et/ou nouvelles fonctionnalités
+intégrées dans le Code Source par tout Contributeur.
+
+Module Lié: désigne un ensemble de fichiers sources y compris leur
+documentation qui, sans modification du Code Source, permet de réaliser
+des fonctionnalités ou services supplémentaires à ceux fournis par le
+Logiciel.
+
+Logiciel Dérivé: désigne toute combinaison du Logiciel, modifié ou non,
+et d'un Module Lié.
+
+Parties: désigne collectivement le Licencié et le Concédant.
+
+Ces termes s'entendent au singulier comme au pluriel.
+
+
+    Article 2 - OBJET
+
+Le Contrat a pour objet la concession par le Concédant au Licencié d'une
+licence non exclusive, cessible et mondiale du Logiciel telle que
+définie ci-après à l'article 5 pour toute la durée de protection des droits
+portant sur ce Logiciel.
+
+
+    Article 3 - ACCEPTATION
+
+3.1 L'acceptation par le Licencié des termes du Contrat est réputée
+acquise du fait du premier des faits suivants:
+
+    * (i) le chargement du Logiciel par tout moyen notamment par
+      téléchargement à partir d'un serveur distant ou par chargement à
+      partir d'un support physique;
+    * (ii) le premier exercice par le Licencié de l'un quelconque des
+      droits concédés par le Contrat.
+
+3.2 Un exemplaire du Contrat, contenant notamment un avertissement
+relatif aux spécificités du Logiciel, à la restriction de garantie et à
+la limitation à un usage par des utilisateurs expérimentés a été mis à
+disposition du Licencié préalablement à son acceptation telle que
+définie à l'article 3.1 ci dessus et le Licencié reconnaît en avoir pris
+connaissance.
+
+
+    Article 4 - ENTREE EN VIGUEUR ET DUREE
+
+
+      4.1 ENTREE EN VIGUEUR
+
+Le Contrat entre en vigueur à la date de son acceptation par le Licencié
+telle que définie en 3.1.
+
+
+      4.2 DUREE
+
+Le Contrat produira ses effets pendant toute la durée légale de
+protection des droits patrimoniaux portant sur le Logiciel.
+
+
+    Article 5 - ETENDUE DES DROITS CONCEDES
+
+Le Concédant concède au Licencié, qui accepte, les droits suivants sur
+le Logiciel pour toutes destinations et pour la durée du Contrat dans
+les conditions ci-après détaillées.
+
+Par ailleurs, si le Concédant détient ou venait à détenir un ou
+plusieurs brevets d'invention protégeant tout ou partie des
+fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas
+opposer les éventuels droits conférés par ces brevets aux Licenciés
+successifs qui utiliseraient, exploiteraient ou modifieraient le
+Logiciel. En cas de cession de ces brevets, le Concédant s'engage à
+faire reprendre les obligations du présent alinéa aux cessionnaires.
+
+
+      5.1 DROIT D'UTILISATION
+
+Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant
+aux domaines d'application, étant ci-après précisé que cela comporte:
+
+   1. la reproduction permanente ou provisoire du Logiciel en tout ou
+      partie par tout moyen et sous toute forme.
+
+   2. le chargement, l'affichage, l'exécution, ou le stockage du
+      Logiciel sur tout support.
+
+   3. la possibilité d'en observer, d'en étudier, ou d'en tester le
+      fonctionnement afin de déterminer les idées et principes qui sont
+      à la base de n'importe quel élément de ce Logiciel; et ceci,
+      lorsque le Licencié effectue toute opération de chargement,
+      d'affichage, d'exécution, de transmission ou de stockage du
+      Logiciel qu'il est en droit d'effectuer en vertu du Contrat.
+
+
+      5.2 DROIT DE MODIFICATION
+
+Le droit de modification comporte le droit de traduire, d'adapter,
+d'arranger ou d'apporter toute autre modification au Logiciel et le
+droit de reproduire le logiciel en résultant. Il comprend en particulier
+le droit de créer un Logiciel Dérivé.
+
+Le Licencié est autorisé à apporter toute modification au Logiciel sous
+réserve de mentionner, de façon explicite, son nom en tant qu'auteur de
+cette modification et la date de création de celle-ci.
+
+
+      5.3 DROIT DE DISTRIBUTION
+
+Le droit de distribution comporte notamment le droit de diffuser, de
+transmettre et de communiquer le Logiciel au public sur tout support et
+par tout moyen ainsi que le droit de mettre sur le marché à titre
+onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé.
+
+Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou
+non, à des tiers dans les conditions ci-après détaillées.
+
+
+        5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION
+
+Le Licencié est autorisé à distribuer des copies conformes du Logiciel,
+sous forme de Code Source ou de Code Objet, à condition que cette
+distribution respecte les dispositions du Contrat dans leur totalité et
+soit accompagnée:
+
+   1. d'un exemplaire du Contrat,
+
+   2. d'un avertissement relatif à la restriction de garantie et de
+      responsabilité du Concédant telle que prévue aux articles 8
+      et 9,
+
+et que, dans le cas où seul le Code Objet du Logiciel est redistribué,
+le Licencié permette un accès effectif au Code Source complet du
+Logiciel pendant au moins toute la durée de sa distribution du Logiciel,
+étant entendu que le coût additionnel d'acquisition du Code Source ne
+devra pas excéder le simple coût de transfert des données.
+
+
+        5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE
+
+Lorsque le Licencié apporte une Contribution Intégrée au Logiciel, les
+conditions de distribution du Logiciel Modifié en résultant sont alors
+soumises à l'intégralité des dispositions du Contrat.
+
+Le Licencié est autorisé à distribuer le Logiciel Modifié sous forme de
+code source ou de code objet, à condition que cette distribution
+respecte les dispositions du Contrat dans leur totalité et soit
+accompagnée:
+
+   1. d'un exemplaire du Contrat,
+
+   2. d'un avertissement relatif à la restriction de garantie et de
+      responsabilité du Concédant telle que prévue aux articles 8
+      et 9,
+
+et que, dans le cas où seul le code objet du Logiciel Modifié est
+redistribué, le Licencié permette un accès effectif à son code source
+complet pendant au moins toute la durée de sa distribution du Logiciel
+Modifié, étant entendu que le coût additionnel d'acquisition du code
+source ne devra pas excéder le simple coût de transfert des données.
+
+
+        5.3.3 DISTRIBUTION DU LOGICIEL DERIVE
+
+Lorsque le Licencié crée un Logiciel Dérivé, ce Logiciel Dérivé peut
+être distribué sous un contrat de licence autre que le présent Contrat à
+condition de respecter les obligations de mention des droits sur le
+Logiciel telles que définies à l'article 6.4. Dans le cas où la création du
+Logiciel Dérivé a nécessité une modification du Code Source le licencié
+s'engage à ce que: 
+
+   1. le Logiciel Modifié correspondant à cette modification soit régi
+      par le présent Contrat,
+   2. les Contributions Intégrées dont le Logiciel Modifié résulte
+      soient clairement identifiées et documentées,
+   3. le Licencié permette un accès effectif au code source du Logiciel
+      Modifié, pendant au moins toute la durée de la distribution du
+      Logiciel Dérivé, de telle sorte que ces modifications puissent
+      être reprises dans une version ultérieure du Logiciel, étant
+      entendu que le coût additionnel d'acquisition du code source du
+      Logiciel Modifié ne devra pas excéder le simple coût du transfert
+      des données.
+
+
+        5.3.4 COMPATIBILITE AVEC LA LICENCE CeCILL
+
+Lorsqu'un Logiciel Modifié contient une Contribution Intégrée soumise au
+contrat de licence CeCILL, ou lorsqu'un Logiciel Dérivé contient un
+Module Lié soumis au contrat de licence CeCILL, les stipulations prévues
+au troisième item de l'article 6.4 sont facultatives.
+
+
+    Article 6 - PROPRIETE INTELLECTUELLE
+
+
+      6.1 SUR LE LOGICIEL INITIAL
+
+Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel
+Initial. Toute utilisation du Logiciel Initial est soumise au respect
+des conditions dans lesquelles le Titulaire a choisi de diffuser son
+oeuvre et nul autre n'a la faculté de modifier les conditions de
+diffusion de ce Logiciel Initial.
+
+Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi
+par le Contrat et ce, pour la durée visée à l'article 4.2.
+
+
+      6.2 SUR LES CONTRIBUTIONS INTEGREES
+
+Le Licencié qui a développé une Contribution Intégrée est titulaire sur
+celle-ci des droits de propriété intellectuelle dans les conditions
+définies par la législation applicable.
+
+
+      6.3 SUR LES MODULES LIES
+
+Le Licencié qui a développé un Module Lié est titulaire sur celui-ci des
+droits de propriété intellectuelle dans les conditions définies par la
+législation applicable et reste libre du choix du contrat régissant sa
+diffusion dans les conditions définies à l'article 5.3.3.
+
+
+      6.4 MENTIONS DES DROITS
+
+Le Licencié s'engage expressément:
+
+   1. à ne pas supprimer ou modifier de quelque manière que ce soit les
+      mentions de propriété intellectuelle apposées sur le Logiciel;
+
+   2. à reproduire à l'identique lesdites mentions de propriété
+      intellectuelle sur les copies du Logiciel modifié ou non;
+
+   3. à faire en sorte que l'utilisation du Logiciel, ses mentions de
+      propriété intellectuelle et le fait qu'il est régi par le Contrat
+      soient indiqués dans un texte facilement accessible notamment
+      depuis l'interface de tout Logiciel Dérivé.
+
+Le Licencié s'engage à ne pas porter atteinte, directement ou
+indirectement, aux droits de propriété intellectuelle du Titulaire et/ou
+des Contributeurs sur le Logiciel et à prendre, le cas échéant, à
+l'égard de son personnel toutes les mesures nécessaires pour assurer le
+respect des dits droits de propriété intellectuelle du Titulaire et/ou
+des Contributeurs.
+
+
+    Article 7 - SERVICES ASSOCIES
+
+7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de
+prestations d'assistance technique ou de maintenance du Logiciel.
+
+Cependant le Concédant reste libre de proposer ce type de services. Les
+termes et conditions d'une telle assistance technique et/ou d'une telle
+maintenance seront alors déterminés dans un acte séparé. Ces actes de
+maintenance et/ou assistance technique n'engageront que la seule
+responsabilité du Concédant qui les propose.
+
+7.2 De même, tout Concédant est libre de proposer, sous sa seule
+responsabilité, à ses licenciés une garantie, qui n'engagera que lui,
+lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce,
+dans les conditions qu'il souhaite. Cette garantie et les modalités
+financières de son application feront l'objet d'un acte séparé entre le
+Concédant et le Licencié.
+
+
+    Article 8 - RESPONSABILITE
+
+8.1 Sous réserve des dispositions de l'article 8.2, le Licencié a la 
+faculté, sous réserve de prouver la faute du Concédant concerné, de
+solliciter la réparation du préjudice direct qu'il subirait du fait du
+Logiciel et dont il apportera la preuve.
+
+8.2 La responsabilité du Concédant est limitée aux engagements pris en
+application du Contrat et ne saurait être engagée en raison notamment:
+(i) des dommages dus à l'inexécution, totale ou partielle, de ses
+obligations par le Licencié, (ii) des dommages directs ou indirects
+découlant de l'utilisation ou des performances du Logiciel subis par le
+Licencié et (iii) plus généralement d'un quelconque dommage indirect. En
+particulier, les Parties conviennent expressément que tout préjudice
+financier ou commercial (par exemple perte de données, perte de
+bénéfices, perte d'exploitation, perte de clientèle ou de commandes,
+manque à gagner, trouble commercial quelconque) ou toute action dirigée
+contre le Licencié par un tiers, constitue un dommage indirect et
+n'ouvre pas droit à réparation par le Concédant.
+
+
+    Article 9 - GARANTIE
+
+9.1 Le Licencié reconnaît que l'état actuel des connaissances
+scientifiques et techniques au moment de la mise en circulation du
+Logiciel ne permet pas d'en tester et d'en vérifier toutes les
+utilisations ni de détecter l'existence d'éventuels défauts. L'attention
+du Licencié a été attirée sur ce point sur les risques associés au
+chargement, à l'utilisation, la modification et/ou au développement et à
+la reproduction du Logiciel qui sont réservés à des utilisateurs avertis.
+
+Il relève de la responsabilité du Licencié de contrôler, par tous
+moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et
+de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens.
+
+9.2 Le Concédant déclare de bonne foi être en droit de concéder
+l'ensemble des droits attachés au Logiciel (comprenant notamment les
+droits visés à l'article 5).
+
+9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le
+Concédant sans autre garantie, expresse ou tacite, que celle prévue à
+l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale,
+son caractère sécurisé, innovant ou pertinent.
+
+En particulier, le Concédant ne garantit pas que le Logiciel est exempt
+d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible
+avec l'équipement du Licencié et sa configuration logicielle ni qu'il
+remplira les besoins du Licencié.
+
+9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le
+Logiciel ne porte pas atteinte à un quelconque droit de propriété
+intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout
+autre droit de propriété. Ainsi, le Concédant exclut toute garantie au
+profit du Licencié contre les actions en contrefaçon qui pourraient être
+diligentées au titre de l'utilisation, de la modification, et de la
+redistribution du Logiciel. Néanmoins, si de telles actions sont
+exercées contre le Licencié, le Concédant lui apportera son aide
+technique et juridique pour sa défense. Cette aide technique et
+juridique est déterminée au cas par cas entre le Concédant concerné et
+le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage
+toute responsabilité quant à l'utilisation de la dénomination du
+Logiciel par le Licencié. Aucune garantie n'est apportée quant à
+l'existence de droits antérieurs sur le nom du Logiciel et sur
+l'existence d'une marque.
+
+
+    Article 10 - RESILIATION
+
+10.1 En cas de manquement par le Licencié aux obligations mises à sa
+charge par le Contrat, le Concédant pourra résilier de plein droit le
+Contrat trente (30) jours après notification adressée au Licencié et
+restée sans effet.
+
+10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à
+utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les
+licences qu'il aura concédées antérieurement à la résiliation du Contrat
+resteront valides sous réserve qu'elles aient été effectuées en
+conformité avec le Contrat.
+
+
+    Article 11 - DISPOSITIONS DIVERSES
+
+
+      11.1 CAUSE EXTERIEURE
+
+Aucune des Parties ne sera responsable d'un retard ou d'une défaillance
+d'exécution du Contrat qui serait dû à un cas de force majeure, un cas
+fortuit ou une cause extérieure, telle que, notamment, le mauvais
+fonctionnement ou les interruptions du réseau électrique ou de
+télécommunication, la paralysie du réseau liée à une attaque
+informatique, l'intervention des autorités gouvernementales, les
+catastrophes naturelles, les dégâts des eaux, les tremblements de terre,
+le feu, les explosions, les grèves et les conflits sociaux, l'état de
+guerre...
+
+11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou
+plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du
+Contrat, ne pourra en aucun cas impliquer renonciation par la Partie
+intéressée à s'en prévaloir ultérieurement.
+
+11.3 Le Contrat annule et remplace toute convention antérieure, écrite
+ou orale, entre les Parties sur le même objet et constitue l'accord
+entier entre les Parties sur cet objet. Aucune addition ou modification
+aux termes du Contrat n'aura d'effet à l'égard des Parties à moins
+d'être faite par écrit et signée par leurs représentants dûment habilités.
+
+11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat
+s'avèrerait contraire à une loi ou à un texte applicable, existants ou
+futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les
+amendements nécessaires pour se conformer à cette loi ou à ce texte.
+Toutes les autres dispositions resteront en vigueur. De même, la
+nullité, pour quelque raison que ce soit, d'une des dispositions du
+Contrat ne saurait entraîner la nullité de l'ensemble du Contrat.
+
+
+      11.5 LANGUE
+
+Le Contrat est rédigé en langue française et en langue anglaise, ces
+deux versions faisant également foi.
+
+
+    Article 12 - NOUVELLES VERSIONS DU CONTRAT
+
+12.1 Toute personne est autorisée à copier et distribuer des copies de
+ce Contrat.
+
+12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé
+et ne peut être modifié que par les auteurs de la licence, lesquels se
+réservent le droit de publier périodiquement des mises à jour ou de
+nouvelles versions du Contrat, qui posséderont chacune un numéro
+distinct. Ces versions ultérieures seront susceptibles de prendre en
+compte de nouvelles problématiques rencontrées par les logiciels libres.
+
+12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra
+faire l'objet d'une diffusion ultérieure que sous la même version du
+Contrat ou une version postérieure.
+
+
+    Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE
+
+13.1 Le Contrat est régi par la loi française. Les Parties conviennent
+de tenter de régler à l'amiable les différends ou litiges qui
+viendraient à se produire par suite ou à l'occasion du Contrat.
+
+13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter
+de leur survenance et sauf situation relevant d'une procédure d'urgence,
+les différends ou litiges seront portés par la Partie la plus diligente
+devant les Tribunaux compétents de Paris.
+
+
+Version 1.0 du 2006-09-05.
+
Index: tags/0.2.3/LICENSE-header.txt
===================================================================
--- tags/0.2.3/LICENSE-header.txt	(revision 368)
+++ tags/0.2.3/LICENSE-header.txt	(revision 368)
@@ -0,0 +1,2 @@
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.1.
Index: tags/0.2.3/LICENSE.txt
===================================================================
--- tags/0.2.3/LICENSE.txt	(revision 368)
+++ tags/0.2.3/LICENSE.txt	(revision 368)
@@ -0,0 +1,561 @@
+
+UTC/CNRS Heudiasyc Pacpus framework is distributed under the CECILL-C 
+License, Version 1.0.
+
+Copyright (c) UTC/CNRS Heudiasyc 2005 - 2015. All rights reserved.
+
+
+
+CeCILL-C FREE SOFTWARE LICENSE AGREEMENT
+
+
+    Notice
+
+This Agreement is a Free Software license agreement that is the result
+of discussions between its authors in order to ensure compliance with
+the two main principles guiding its drafting:
+
+    * firstly, compliance with the principles governing the distribution
+      of Free Software: access to source code, broad rights granted to
+      users,
+    * secondly, the election of a governing law, French law, with which
+      it is conformant, both as regards the law of torts and
+      intellectual property law, and the protection that it offers to
+      both authors and holders of the economic rights over software.
+
+The authors of the CeCILL-C (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre])
+license are:
+
+Commissariat à l'Energie Atomique - CEA, a public scientific, technical
+and industrial research establishment, having its principal place of
+business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France.
+
+Centre National de la Recherche Scientifique - CNRS, a public scientific
+and technological establishment, having its principal place of business
+at 3 rue Michel-Ange, 75794 Paris cedex 16, France.
+
+Institut National de Recherche en Informatique et en Automatique -
+INRIA, a public scientific and technological establishment, having its
+principal place of business at Domaine de Voluceau, Rocquencourt, BP
+105, 78153 Le Chesnay cedex, France.
+
+
+    Preamble
+
+The purpose of this Free Software license agreement is to grant users
+the right to modify and re-use the software governed by this license.
+
+The exercising of this right is conditional upon the obligation to make
+available to the community the modifications made to the source code of
+the software so as to contribute to its evolution.
+
+In consideration of access to the source code and the rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty and the software's author, the holder of the
+economic rights, and the successive licensors only have limited liability.
+
+In this respect, the risks associated with loading, using, modifying
+and/or developing or reproducing the software by the user are brought to
+the user's attention, given its Free Software status, which may make it
+complicated to use, with the result that its use is reserved for
+developers and experienced professionals having in-depth computer
+knowledge. Users are therefore encouraged to load and test the
+suitability of the software as regards their requirements in conditions
+enabling the security of their systems and/or data to be ensured and,
+more generally, to use and operate it in the same conditions of
+security. This Agreement may be freely reproduced and published,
+provided it is not altered, and that no provisions are either added or
+removed herefrom.
+
+This Agreement may apply to any or all software for which the holder of
+the economic rights decides to submit the use thereof to its provisions.
+
+
+    Article 1 - DEFINITIONS
+
+For the purpose of this Agreement, when the following expressions
+commence with a capital letter, they shall have the following meaning:
+
+Agreement: means this license agreement, and its possible subsequent
+versions and annexes.
+
+Software: means the software in its Object Code and/or Source Code form
+and, where applicable, its documentation, "as is" when the Licensee
+accepts the Agreement.
+
+Initial Software: means the Software in its Source Code and possibly its
+Object Code form and, where applicable, its documentation, "as is" when
+it is first distributed under the terms and conditions of the Agreement.
+
+Modified Software: means the Software modified by at least one
+Integrated Contribution.
+
+Source Code: means all the Software's instructions and program lines to
+which access is required so as to modify the Software.
+
+Object Code: means the binary files originating from the compilation of
+the Source Code.
+
+Holder: means the holder(s) of the economic rights over the Initial
+Software.
+
+Licensee: means the Software user(s) having accepted the Agreement.
+
+Contributor: means a Licensee having made at least one Integrated
+Contribution.
+
+Licensor: means the Holder, or any other individual or legal entity, who
+distributes the Software under the Agreement.
+
+Integrated Contribution: means any or all modifications, corrections,
+translations, adaptations and/or new functions integrated into the
+Source Code by any or all Contributors.
+
+Related Module: means a set of sources files including their
+documentation that, without modification to the Source Code, enables
+supplementary functions or services in addition to those offered by the
+Software.
+
+Derivative Software: means any combination of the Software, modified or
+not, and of a Related Module.
+
+Parties: mean both the Licensee and the Licensor.
+
+These expressions may be used both in singular and plural form.
+
+
+    Article 2 - PURPOSE
+
+The purpose of the Agreement is the grant by the Licensor to the
+Licensee of a non-exclusive, transferable and worldwide license for the
+Software as set forth in Article 5 hereinafter for the whole term of the
+protection granted by the rights over said Software. 
+
+
+    Article 3 - ACCEPTANCE
+
+3.1 The Licensee shall be deemed as having accepted the terms and
+conditions of this Agreement upon the occurrence of the first of the
+following events:
+
+    * (i) loading the Software by any or all means, notably, by
+      downloading from a remote server, or by loading from a physical
+      medium;
+    * (ii) the first time the Licensee exercises any of the rights
+      granted hereunder.
+
+3.2 One copy of the Agreement, containing a notice relating to the
+characteristics of the Software, to the limited warranty, and to the
+fact that its use is restricted to experienced users has been provided
+to the Licensee prior to its acceptance as set forth in Article 3.1
+hereinabove, and the Licensee hereby acknowledges that it has read and
+understood it.
+
+
+    Article 4 - EFFECTIVE DATE AND TERM
+
+
+      4.1 EFFECTIVE DATE
+
+The Agreement shall become effective on the date when it is accepted by
+the Licensee as set forth in Article 3.1.
+
+
+      4.2 TERM
+
+The Agreement shall remain in force for the entire legal term of
+protection of the economic rights over the Software.
+
+
+    Article 5 - SCOPE OF RIGHTS GRANTED
+
+The Licensor hereby grants to the Licensee, who accepts, the following
+rights over the Software for any or all use, and for the term of the
+Agreement, on the basis of the terms and conditions set forth hereinafter.
+
+Besides, if the Licensor owns or comes to own one or more patents
+protecting all or part of the functions of the Software or of its
+components, the Licensor undertakes not to enforce the rights granted by
+these patents against successive Licensees using, exploiting or
+modifying the Software. If these patents are transferred, the Licensor
+undertakes to have the transferees subscribe to the obligations set
+forth in this paragraph.
+
+
+      5.1 RIGHT OF USE
+
+The Licensee is authorized to use the Software, without any limitation
+as to its fields of application, with it being hereinafter specified
+that this comprises:
+
+   1. permanent or temporary reproduction of all or part of the Software
+      by any or all means and in any or all form.
+
+   2. loading, displaying, running, or storing the Software on any or
+      all medium.
+
+   3. entitlement to observe, study or test its operation so as to
+      determine the ideas and principles behind any or all constituent
+      elements of said Software. This shall apply when the Licensee
+      carries out any or all loading, displaying, running, transmission
+      or storage operation as regards the Software, that it is entitled
+      to carry out hereunder.
+
+
+      5.2 RIGHT OF MODIFICATION
+
+The right of modification includes the right to translate, adapt,
+arrange, or make any or all modifications to the Software, and the right
+to reproduce the resulting software. It includes, in particular, the
+right to create a Derivative Software.
+
+The Licensee is authorized to make any or all modification to the
+Software provided that it includes an explicit notice that it is the
+author of said modification and indicates the date of the creation thereof.
+
+
+      5.3 RIGHT OF DISTRIBUTION
+
+In particular, the right of distribution includes the right to publish,
+transmit and communicate the Software to the general public on any or
+all medium, and by any or all means, and the right to market, either in
+consideration of a fee, or free of charge, one or more copies of the
+Software by any means.
+
+The Licensee is further authorized to distribute copies of the modified
+or unmodified Software to third parties according to the terms and
+conditions set forth hereinafter.
+
+
+        5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION
+
+The Licensee is authorized to distribute true copies of the Software in
+Source Code or Object Code form, provided that said distribution
+complies with all the provisions of the Agreement and is accompanied by:
+
+   1. a copy of the Agreement,
+
+   2. a notice relating to the limitation of both the Licensor's
+      warranty and liability as set forth in Articles 8 and 9,
+
+and that, in the event that only the Object Code of the Software is
+redistributed, the Licensee allows effective access to the full Source
+Code of the Software at a minimum during the entire period of its
+distribution of the Software, it being understood that the additional
+cost of acquiring the Source Code shall not exceed the cost of
+transferring the data.
+
+
+        5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE
+
+When the Licensee makes an Integrated Contribution to the Software, the
+terms and conditions for the distribution of the resulting Modified
+Software become subject to all the provisions of this Agreement.
+
+The Licensee is authorized to distribute the Modified Software, in
+source code or object code form, provided that said distribution
+complies with all the provisions of the Agreement and is accompanied by:
+
+   1. a copy of the Agreement,
+
+   2. a notice relating to the limitation of both the Licensor's
+      warranty and liability as set forth in Articles 8 and 9,
+
+and that, in the event that only the object code of the Modified
+Software is redistributed, the Licensee allows effective access to the
+full source code of the Modified Software at a minimum during the entire
+period of its distribution of the Modified Software, it being understood
+that the additional cost of acquiring the source code shall not exceed
+the cost of transferring the data.
+
+
+        5.3.3 DISTRIBUTION OF DERIVATIVE SOFTWARE
+
+When the Licensee creates Derivative Software, this Derivative Software
+may be distributed under a license agreement other than this Agreement,
+subject to compliance with the requirement to include a notice
+concerning the rights over the Software as defined in Article 6.4.
+In the event the creation of the Derivative Software required modification 
+of the Source Code, the Licensee undertakes that:
+
+   1. the resulting Modified Software will be governed by this Agreement,
+   2. the Integrated Contributions in the resulting Modified Software
+      will be clearly identified and documented,
+   3. the Licensee will allow effective access to the source code of the
+      Modified Software, at a minimum during the entire period of
+      distribution of the Derivative Software, such that such
+      modifications may be carried over in a subsequent version of the
+      Software; it being understood that the additional cost of
+      purchasing the source code of the Modified Software shall not
+      exceed the cost of transferring the data.
+
+
+        5.3.4 COMPATIBILITY WITH THE CeCILL LICENSE
+
+When a Modified Software contains an Integrated Contribution subject to
+the CeCILL license agreement, or when a Derivative Software contains a
+Related Module subject to the CeCILL license agreement, the provisions
+set forth in the third item of Article 6.4 are optional.
+
+
+    Article 6 - INTELLECTUAL PROPERTY
+
+
+      6.1 OVER THE INITIAL SOFTWARE
+
+The Holder owns the economic rights over the Initial Software. Any or
+all use of the Initial Software is subject to compliance with the terms
+and conditions under which the Holder has elected to distribute its work
+and no one shall be entitled to modify the terms and conditions for the
+distribution of said Initial Software.
+
+The Holder undertakes that the Initial Software will remain ruled at
+least by this Agreement, for the duration set forth in Article 4.2.
+
+
+      6.2 OVER THE INTEGRATED CONTRIBUTIONS
+
+The Licensee who develops an Integrated Contribution is the owner of the
+intellectual property rights over this Contribution as defined by
+applicable law.
+
+
+      6.3 OVER THE RELATED MODULES
+
+The Licensee who develops a Related Module is the owner of the
+intellectual property rights over this Related Module as defined by
+applicable law and is free to choose the type of agreement that shall
+govern its distribution under the conditions defined in Article 5.3.3.
+
+
+      6.4 NOTICE OF RIGHTS
+
+The Licensee expressly undertakes:
+
+   1. not to remove, or modify, in any manner, the intellectual property
+      notices attached to the Software;
+
+   2. to reproduce said notices, in an identical manner, in the copies
+      of the Software modified or not;
+
+   3. to ensure that use of the Software, its intellectual property
+      notices and the fact that it is governed by the Agreement is
+      indicated in a text that is easily accessible, specifically from
+      the interface of any Derivative Software.
+
+The Licensee undertakes not to directly or indirectly infringe the
+intellectual property rights of the Holder and/or Contributors on the
+Software and to take, where applicable, vis-à-vis its staff, any and all
+measures required to ensure respect of said intellectual property rights
+of the Holder and/or Contributors.
+
+
+    Article 7 - RELATED SERVICES
+
+7.1 Under no circumstances shall the Agreement oblige the Licensor to
+provide technical assistance or maintenance services for the Software.
+
+However, the Licensor is entitled to offer this type of services. The
+terms and conditions of such technical assistance, and/or such
+maintenance, shall be set forth in a separate instrument. Only the
+Licensor offering said maintenance and/or technical assistance services
+shall incur liability therefor.
+
+7.2 Similarly, any Licensor is entitled to offer to its licensees, under
+its sole responsibility, a warranty, that shall only be binding upon
+itself, for the redistribution of the Software and/or the Modified
+Software, under terms and conditions that it is free to decide. Said
+warranty, and the financial terms and conditions of its application,
+shall be subject of a separate instrument executed between the Licensor
+and the Licensee.
+
+
+    Article 8 - LIABILITY
+
+8.1 Subject to the provisions of Article 8.2, the Licensee shall be
+entitled to claim compensation for any direct loss it may have suffered
+from the Software as a result of a fault on the part of the relevant
+Licensor, subject to providing evidence thereof.
+
+8.2 The Licensor's liability is limited to the commitments made under
+this Agreement and shall not be incurred as a result of in particular:
+(i) loss due the Licensee's total or partial failure to fulfill its
+obligations, (ii) direct or consequential loss that is suffered by the
+Licensee due to the use or performance of the Software, and (iii) more
+generally, any consequential loss. In particular the Parties expressly
+agree that any or all pecuniary or business loss (i.e. loss of data,
+loss of profits, operating loss, loss of customers or orders,
+opportunity cost, any disturbance to business activities) or any or all
+legal proceedings instituted against the Licensee by a third party,
+shall constitute consequential loss and shall not provide entitlement to
+any or all compensation from the Licensor.
+
+
+    Article 9 - WARRANTY
+
+9.1 The Licensee acknowledges that the scientific and technical
+state-of-the-art when the Software was distributed did not enable all
+possible uses to be tested and verified, nor for the presence of
+possible defects to be detected. In this respect, the Licensee's
+attention has been drawn to the risks associated with loading, using,
+modifying and/or developing and reproducing the Software which are
+reserved for experienced users.
+
+The Licensee shall be responsible for verifying, by any or all means,
+the suitability of the product for its requirements, its good working
+order, and for ensuring that it shall not cause damage to either persons
+or properties.
+
+9.2 The Licensor hereby represents, in good faith, that it is entitled
+to grant all the rights over the Software (including in particular the
+rights set forth in Article 5).
+
+9.3 The Licensee acknowledges that the Software is supplied "as is" by
+the Licensor without any other express or tacit warranty, other than
+that provided for in Article 9.2 and, in particular, without any warranty
+as to its commercial value, its secured, safe, innovative or relevant
+nature.
+
+Specifically, the Licensor does not warrant that the Software is free
+from any error, that it will operate without interruption, that it will
+be compatible with the Licensee's own equipment and software
+configuration, nor that it will meet the Licensee's requirements.
+
+9.4 The Licensor does not either expressly or tacitly warrant that the
+Software does not infringe any third party intellectual property right
+relating to a patent, software or any other property right. Therefore,
+the Licensor disclaims any and all liability towards the Licensee
+arising out of any or all proceedings for infringement that may be
+instituted in respect of the use, modification and redistribution of the
+Software. Nevertheless, should such proceedings be instituted against
+the Licensee, the Licensor shall provide it with technical and legal
+assistance for its defense. Such technical and legal assistance shall be
+decided on a case-by-case basis between the relevant Licensor and the
+Licensee pursuant to a memorandum of understanding. The Licensor
+disclaims any and all liability as regards the Licensee's use of the
+name of the Software. No warranty is given as regards the existence of
+prior rights over the name of the Software or as regards the existence
+of a trademark.
+
+
+    Article 10 - TERMINATION
+
+10.1 In the event of a breach by the Licensee of its obligations
+hereunder, the Licensor may automatically terminate this Agreement
+thirty (30) days after notice has been sent to the Licensee and has
+remained ineffective.
+
+10.2 A Licensee whose Agreement is terminated shall no longer be
+authorized to use, modify or distribute the Software. However, any
+licenses that it may have granted prior to termination of the Agreement
+shall remain valid subject to their having been granted in compliance
+with the terms and conditions hereof.
+
+
+    Article 11 - MISCELLANEOUS
+
+
+      11.1 EXCUSABLE EVENTS
+
+Neither Party shall be liable for any or all delay, or failure to
+perform the Agreement, that may be attributable to an event of force
+majeure, an act of God or an outside cause, such as defective
+functioning or interruptions of the electricity or telecommunications
+networks, network paralysis following a virus attack, intervention by
+government authorities, natural disasters, water damage, earthquakes,
+fire, explosions, strikes and labor unrest, war, etc.
+
+11.2 Any failure by either Party, on one or more occasions, to invoke
+one or more of the provisions hereof, shall under no circumstances be
+interpreted as being a waiver by the interested Party of its right to
+invoke said provision(s) subsequently.
+
+11.3 The Agreement cancels and replaces any or all previous agreements,
+whether written or oral, between the Parties and having the same
+purpose, and constitutes the entirety of the agreement between said
+Parties concerning said purpose. No supplement or modification to the
+terms and conditions hereof shall be effective as between the Parties
+unless it is made in writing and signed by their duly authorized
+representatives.
+
+11.4 In the event that one or more of the provisions hereof were to
+conflict with a current or future applicable act or legislative text,
+said act or legislative text shall prevail, and the Parties shall make
+the necessary amendments so as to comply with said act or legislative
+text. All other provisions shall remain effective. Similarly, invalidity
+of a provision of the Agreement, for any reason whatsoever, shall not
+cause the Agreement as a whole to be invalid.
+
+
+      11.5 LANGUAGE
+
+The Agreement is drafted in both French and English and both versions
+are deemed authentic.
+
+
+    Article 12 - NEW VERSIONS OF THE AGREEMENT
+
+12.1 Any person is authorized to duplicate and distribute copies of this
+Agreement.
+
+12.2 So as to ensure coherence, the wording of this Agreement is
+protected and may only be modified by the authors of the License, who
+reserve the right to periodically publish updates or new versions of the
+Agreement, each with a separate number. These subsequent versions may
+address new issues encountered by Free Software.
+
+12.3 Any Software distributed under a given version of the Agreement may
+only be subsequently distributed under the same version of the Agreement
+or a subsequent version.
+
+
+    Article 13 - GOVERNING LAW AND JURISDICTION
+
+13.1 The Agreement is governed by French law. The Parties agree to
+endeavor to seek an amicable solution to any disagreements or disputes
+that may arise during the performance of the Agreement.
+
+13.2 Failing an amicable solution within two (2) months as from their
+occurrence, and unless emergency proceedings are necessary, the
+disagreements or disputes shall be referred to the Paris Courts having
+jurisdiction, by the more diligent Party.
+
+
+Version 1.0 dated 2006-09-05.
+
+
+LICENSE
+
+1. By using and/or opening any packaging enclosing this 
+software, expanding any compressed file containing this 
+software or by utilizing this software, you agree to be 
+bound by the terms of this license agreement.
+
+2. THE SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY 
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
+PURPOSE AND NONINFRINGEMENT. No oral or written advice given 
+by Licensor or by an authorized representative of Licensor 
+shall create a warranty.
+
+3. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL 
+THE LICENSOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+LIABILITY, INCLUDING BUT NOT LIMITED TO PERSONAL INJURY, OR 
+ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES 
+WHATSOEVER, INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS 
+OF PROFITS, LOSS OF DATA, BUSINESS INTERRUPTION OR ANY OTHER 
+COMMERCIAL DAMAGES OR LOSSES, ARISING OUT OF OR RELATED TO 
+YOUR USE OR INABILITY TO USE THE SOFTWARE, HOWEVER CAUSED, 
+REGARDLESS OF THE THEORY OF LIABILITY (CONTRACT, TORT OR 
+OTHERWISE) AND EVEN IF LICENSOR HAS BEEN ADVISED OF THE 
+POSSIBILITY OF SUCH DAMAGES.
+
+4. THIS SOFTWARE IS NOT INTENDED FOR USE IN ANY APPLICATION 
+IN WHICH THE FAILURE OF THE SOFTWARE COULD LEAD TO DEATH, 
+PERSONAL INJURY OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE.
+
+5. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED 
+WARRANTIES, LIABILITY OR LIMITATIONS ON APPLICABLE STATUTORY 
+RIGHTS OF A CONSUMER, SO THE ABOVE EXCLUSIONS AND 
+LIMITATIONS MAY NOT APPLY TO YOU. IF SUCH EXCLUSIONS FROM 
+LIABILITY APPLY TO YOU, DO NOT USE THIS SOFTWARE.
Index: tags/0.2.3/README.txt
===================================================================
--- tags/0.2.3/README.txt	(revision 368)
+++ tags/0.2.3/README.txt	(revision 368)
@@ -0,0 +1,13 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+PACPUS Framework.
+
+TODO: description in Doxygen format.
+TODO: include into Doxygen documentation.
Index: tags/0.2.3/TODO.txt
===================================================================
--- tags/0.2.3/TODO.txt	(revision 368)
+++ tags/0.2.3/TODO.txt	(revision 368)
@@ -0,0 +1,9 @@
+TODO:
+* (kurdejma) Use create_export everywhere, remove -D${PROJECT_NAME}EXPORTS
+* (kurdejma) Unify Windows and Unix files, e.g. shared memory, serial port, camera, etc. It concerns as well other projects such as CityVIP.
+
+Temps directories use for experimentales test (comming from pacpuscitypiv beta2 : morasjul): /src/TestComponents/ , /include/PacpusCityVIP/ , /include/extlib/
+
+DONE:
+* (2013-01-09, kurdejma) installing .pdb (Debug info) files on Windows MSVC. 
+
Index: tags/0.2.3/build/build_igep.sh
===================================================================
--- tags/0.2.3/build/build_igep.sh	(revision 368)
+++ tags/0.2.3/build/build_igep.sh	(revision 368)
@@ -0,0 +1,2 @@
+#!/bin/sh
+../scripts/build-igep.sh "/opt/igep/pacpus"
Index: tags/0.2.3/build/build_linux.sh
===================================================================
--- tags/0.2.3/build/build_linux.sh	(revision 368)
+++ tags/0.2.3/build/build_linux.sh	(revision 368)
@@ -0,0 +1,2 @@
+#!/bin/sh
+../scripts/build-linux.sh "/opt/pacpus"
Index: tags/0.2.3/build/build_win.bat
===================================================================
--- tags/0.2.3/build/build_win.bat	(revision 368)
+++ tags/0.2.3/build/build_win.bat	(revision 368)
@@ -0,0 +1,2 @@
+rem ..\scripts\build-msvc-default-installdir.bat
+..\scripts\build-msvc.bat "C:\Pacpus"
Index: tags/0.2.3/cmake/FindPacpus.cmake
===================================================================
--- tags/0.2.3/cmake/FindPacpus.cmake	(revision 368)
+++ tags/0.2.3/cmake/FindPacpus.cmake	(revision 368)
@@ -0,0 +1,101 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+# TODO: write the output variables of this CMake file.
+
+# Locate the include files
+set(PACPUS_INCLUDE_HINTS
+    "${PACPUS_ROOT}/include"
+    "$ENV{PACPUS_ROOT}/include"
+)
+if(WIN32)
+    list(APPEND PACPUS_INCLUDE_HINTS
+        "C:/Program Files/Pacpus/include"
+        "C:/Program Files (x86)/Pacpus/include"
+        "C:/Pacpus/include"
+        "C:/lib/Pacpus/include"
+        "D:/Program Files/Pacpus/include"
+        "D:/Program Files (x86)/Pacpus/include"
+        "D:/Pacpus/include"
+        "D:/lib/Pacpus/include"
+    )
+else()
+    # TODO: add default paths on Unix-like systems
+    list(APPEND PACPUS_INCLUDE_HINTS
+    )
+endif()
+find_path(PACPUS_INCLUDE_DIR
+    NAMES "Pacpus/kernel/pacpus.h"
+    HINTS ${PACPUS_INCLUDE_HINTS}
+    DOC "The Pacpus include directory"
+)
+
+if(NOT PACPUS_INCLUDE_DIR)
+    message(FATAL_ERROR "Could not find PACPUS. Please set CMake variable PACPUS_ROOT or environment variable PACPUS_ROOT.")
+endif()
+
+get_filename_component(PACPUS_ROOT ${PACPUS_INCLUDE_DIR}/.. ABSOLUTE)
+set(PACPUS_LIB_DIR ${PACPUS_ROOT}/lib ${PACPUS_ROOT}/bin)
+
+# List of required modules
+set(PACPUS_MODULES "FileLib" "PacpusLib" "PacpusTools" "dbiteplayerlib")
+if(WIN32)
+    list(APPEND PACPUS_MODULES "ROAD_TIME")
+endif()
+
+set(MODULE_MISSING FALSE)
+set(PACPUS_LIBRARIES "")
+
+# Check the presence of each module
+foreach(module ${PACPUS_MODULES})
+    # release version
+    find_library(
+        PACPUS_${module}_LIB
+        NAMES ${module}
+        HINTS ${PACPUS_LIB_DIR}
+    )
+    if(PACPUS_${module}_LIB)
+        list(APPEND PACPUS_LIBRARIES optimized ${PACPUS_${module}_LIB})
+    else()
+        message(SEND_ERROR "Cannot find Pacpus module ${module} (release version)")
+        set(MODULE_MISSING TRUE)
+    endif()
+    
+    # debug version
+    find_library(
+        PACPUS_${module}_LIBD
+        NAMES ${module}_d
+        HINTS ${PACPUS_LIB_DIR}
+    )
+    if(PACPUS_${module}_LIBD)
+        list(APPEND PACPUS_LIBRARIES debug ${PACPUS_${module}_LIBD})
+    else()
+        message(SEND_ERROR "Cannot find Pacpus module ${module}_d (debug version)")
+        set(MODULE_MISSING TRUE)
+    endif()
+endforeach()
+
+# handle the QUIETLY and REQUIRED arguments and set PACPUS_FOUND to TRUE if
+# all listed variables are TRUE
+include (FindPackageHandleStandardArgs)
+set(PACPUS_ALL_MODULES_FOUND NOT MODULE_MISSING)
+find_package_handle_standard_args (PACPUS DEFAULT_MSG PACPUS_LIBRARIES PACPUS_INCLUDE_DIR PACPUS_ALL_MODULES_FOUND)
+
+if(PACPUS_FOUND)
+    set(PACPUS_INSTALL_DIR ${PACPUS_ROOT})
+    set(PACPUS_CMAKE_DIR ${PACPUS_ROOT}/cmake)
+    set(CMAKE_INSTALL_PREFIX ${PACPUS_INSTALL_DIR})
+    list(APPEND CMAKE_PREFIX_PATH ${PACPUS_CMAKE_DIR})
+    list(APPEND CMAKE_MODULE_PATH "${PACPUS_CMAKE_DIR}")
+    
+    include(${PACPUS_CMAKE_DIR}/PacpusUtilities.cmake)
+    include(${PACPUS_CMAKE_DIR}/PacpusConfiguration.cmake)
+    include(${PACPUS_CMAKE_DIR}/PacpusDependencies.cmake)
+    include(${PACPUS_CMAKE_DIR}/PacpusPlatforms.cmake)
+endif()
Index: tags/0.2.3/cmake/PacpusConfiguration.cmake
===================================================================
--- tags/0.2.3/cmake/PacpusConfiguration.cmake	(revision 368)
+++ tags/0.2.3/cmake/PacpusConfiguration.cmake	(revision 368)
@@ -0,0 +1,46 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+# ========================================
+# Build-specific configuration
+# ========================================
+if(IS_BUILDING_PACPUS)
+	if(PACPUS_INSTALL_WITH_VERSION_NUMBER)
+		pacpus_purge_backslash(PACPUS_INSTALL_DIR)
+		set(PACPUS_INSTALL_DIR ${PACPUS_INSTALL_DIR}/${Pacpus_VERSION} )
+	endif()
+    set(PACPUS_INSTALL_3RD    FALSE                     CACHE BOOL      "Installation of the 3rd party")
+endif()
+
+# ========================================
+# Global configuration
+# ========================================
+set(PACPUS_USE_LOG              TRUE  CACHE BOOL "Logging using Boost.Log, the library is required")
+set(PACPUS_LOG_COLORED_OUTPUT   TRUE CACHE BOOL "Logging in color.")
+set(PACPUS_INSTALL_3RD          FALSE CACHE BOOL "Installation of the 3rd party")
+set(PACPUS_BUILD_DOC            FALSE CACHE BOOL "Whether build the documentation - requires Doxygen")
+set(PACPUS_BUILD_EXAMPLES       TRUE CACHE BOOL "Whether build the examples")
+set(PACPUS_USE_SOLUTION_FOLDERS TRUE CACHE BOOL "Use solution folders to classify projects, works in MS Visual Studio")
+
+if(PACPUS_USE_SOLUTION_FOLDERS)
+    if(CMAKE_VERSION VERSION_GREATER "2.8.0")
+        set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+    else()
+        message(AUTHOR_WARNING "Folders are only supported with CMake 2.8.0 and newer, and MSVC 2005 and newer except for 2005/2008/2010 Express Edition")
+    endif()
+endif(PACPUS_USE_SOLUTION_FOLDERS)
+
+
+if(PACPUS_USE_LOG)
+    list(APPEND PACPUS_DEFINITIONS " -DPACPUS_USE_LOG=1 ")
+endif()
+
+if(PACPUS_LOG_COLORED_OUTPUT)
+    list(APPEND PACPUS_DEFINITIONS " -DPACPUS_LOG_COLORED_OUTPUT=1 ")
+endif()
Index: tags/0.2.3/cmake/PacpusDependencies.cmake
===================================================================
--- tags/0.2.3/cmake/PacpusDependencies.cmake	(revision 368)
+++ tags/0.2.3/cmake/PacpusDependencies.cmake	(revision 368)
@@ -0,0 +1,166 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+################################################################################
+# OUTPUT
+set(PACPUS_DEPENDENCIES_INC "")
+set(PACPUS_DEPENDENCIES_LIB "")
+
+################################################################################
+# Necessary for Qt5
+# message(STATUS "Set CMake variable 'CMAKE_PREFIX_PATH' to the path like '%QT_BIN%/../lib/cmake'")
+set(QT_CMAKE_DIR "$ENV{QT_BIN}/../lib/cmake")
+get_filename_component(QT_CMAKE_DIR "${QT_CMAKE_DIR}" ABSOLUTE)
+message(STATUS "\${QT_CMAKE_DIR} = '${QT_CMAKE_DIR}'")
+list(APPEND CMAKE_PREFIX_PATH
+    ${QT_CMAKE_DIR}
+)
+if(WIN32)
+    find_library(GLU32_LIB_PATH
+        NAMES glu32
+        HINTS
+            "${WINSDK_LIB}"
+            "$ENV{WINSDK_LIB}"
+            # 8.1
+            "C:/Program Files/Windows Kits/8.1/Lib/winv6.3/um/x86"
+            "C:/Program Files (x86)/Windows Kits/8.1/Lib/winv6.3/um/x86"
+            "C:/Program Files/Windows Kits/8.1/Lib/winv6.3/um/x64"
+            "C:/Program Files (x86)/Windows Kits/8.1/Lib/winv6.3/um/x64"
+            # 8.0
+            "C:/Program Files/Windows Kits/8.0/Lib/win8/um/x86"
+            "C:/Program Files (x86)/Windows Kits/8.0/Lib/win8/um/x86"
+            "C:/Program Files/Windows Kits/8.0/Lib/win8/um/x64"
+            "C:/Program Files (x86)/Windows Kits/8.0/Lib/win8/um/x64"
+    )
+    get_filename_component(GLU32_LIB_DIR "${GLU32_LIB_PATH}" DIRECTORY)
+    set(WINSDK_LIB "${GLU32_LIB_DIR}" CACHE PATH "Directory of Windows Development Kit, should contain glu32.lib.")
+    if("${WINSDK_LIB}" STREQUAL "")
+        message(STATUS "Environment variable 'WINSDK_LIB' should be set to the path containing glu32 library, e.g. 'C:/Program Files (x86)/Windows Kits/8.0/Lib/win8/um/x86'")
+    else()
+        message(STATUS "\$ENV{WINSDK_LIB} = '$ENV{WINSDK_LIB}'")
+        message(STATUS "\${WINSDK_LIB} = '${WINSDK_LIB}'")
+    endif()
+    list(APPEND CMAKE_PREFIX_PATH
+        ${WINSDK_LIB}
+    )
+endif()
+if(DEBUG)
+    message(STATUS "\${CMAKE_PREFIX_PATH} = '${CMAKE_PREFIX_PATH}'")
+endif()
+
+################################################################################
+# Find Qt
+find_package(Qt5Widgets QUIET)
+if(Qt5Widgets_FOUND)
+    # Tell CMake to run moc when necessary:
+    #set(CMAKE_AUTOMOC ON)
+    # As moc files are generated in the binary dir, tell CMake
+    # to always look for includes there:
+    set(CMAKE_INCLUDE_CURRENT_DIR ON)        
+    
+    find_package(Qt5Core REQUIRED)
+    find_package(Qt5Xml REQUIRED)
+    find_package(Qt5Gui REQUIRED)
+    #find_package(Qt5OpenGL REQUIRED)
+    #find_package(Qt5Network REQUIRED)
+    #find_package(Qt5SerialPort REQUIRED)
+        
+    set(QT_DEFINITIONS
+        ${Qt5Widgets_DEFINITIONS}
+        ${Qt5Core_DEFINITIONS}
+        ${Qt5Xml_DEFINITIONS}
+        ${Qt5Gui_DEFINITIONS}
+        ${Qt5OpenGL_DEFINITIONS}
+        ${Qt5Network_DEFINITIONS}
+        ${Qt5SerialPort_DEFINITIONS}
+    )
+    set(QT_INCLUDE_DIR
+        ${Qt5Widgets_INCLUDE_DIRS}
+        ${Qt5Core_INCLUDE_DIRS}
+        ${Qt5Xml_INCLUDE_DIRS}
+        ${Qt5Gui_INCLUDE_DIRS}
+        ${Qt5OpenGL_INCLUDE_DIRS}
+        ${Qt5Network_INCLUDE_DIRS}
+        ${Qt5SerialPort_INCLUDE_DIRS}
+    )
+    set(QT_LIBRARIES
+        ${Qt5Widgets_LIBRARIES}
+        ${Qt5Core_LIBRARIES}
+        ${Qt5Xml_LIBRARIES}
+        ${Qt5Gui_LIBRARIES}
+        ${Qt5OpenGL_LIBRARIES}
+        ${Qt5Network_LIBRARIES}
+        ${Qt5SerialPort_LIBRARIES}
+    )
+    
+    if(Qt5_POSITION_INDEPENDENT_CODE)
+      set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+    endif()
+else()
+    message(STATUS "Qt5 not found: try to find Qt4")
+    
+    find_package(Qt4 REQUIRED QtCore QtGui QtXml)
+    include(${QT_USE_FILE})
+endif()
+
+################################################################################
+# All the Pacpus modules depend on Qt5
+# However, since each module requires specific Qt's modules, they have to include their own QT_USE_FILE
+
+################################################################################
+# Boost
+set(Boost_USE_STATIC_LIBS       OFF)
+set(Boost_USE_MULTITHREADED      ON)
+set(Boost_USE_STATIC_RUNTIME    OFF)
+list(APPEND PACPUS_DEFINITIONS " -DBOOST_ALL_DYN_LINK ")
+if(CMAKE_COMPILER_IS_GNUC)
+    list(APPEND PACPUS_DEFINITIONS " -lpthread ")
+endif()
+find_package(Boost 1.54.0
+    COMPONENTS
+        chrono # thread
+        date_time # thread
+        program_options #1.32.0
+        system # log, thread needed on Linux
+        thread
+)
+if(Boost_FOUND)
+    include_directories(${Boost_INCLUDE_DIRS})
+    link_directories(${Boost_LIBRARY_DIRS})
+    list(APPEND PACPUS_DEPENDENCIES_INC ${Boost_INCLUDE_DIRS})
+    list(APPEND PACPUS_DEPENDENCIES_LIB ${Boost_LIBRARIES})
+endif()
+
+if(PACPUS_USE_LOG)
+    find_package(Boost 1.54.0 REQUIRED
+        COMPONENTS
+            #filesystem
+            log # 1.54.0
+            log_setup # log
+    )
+    list(APPEND PACPUS_DEPENDENCIES_INC ${Boost_INCLUDE_DIRS})
+    list(APPEND PACPUS_DEPENDENCIES_LIB ${Boost_LIBRARIES})
+endif()
+if(PACPUS_BUILD_TESTS)
+    find_package(Boost 1.21.0 REQUIRED
+        COMPONENTS
+            unit_test_framework
+    )
+    list(APPEND PACPUS_DEPENDENCIES_INC ${Boost_INCLUDE_DIRS})
+    list(APPEND PACPUS_DEPENDENCIES_LIB ${Boost_LIBRARIES})
+endif()
+
+################################################################################
+# DOCUMENTATION
+if(PACPUS_BUILD_DOC)
+    find_package(Doxygen)
+    if(NOT DOXYGEN_FOUND)
+        message(FATAL_ERROR "Doxygen is needed to build the documentation. Please install it correctly")
+    endif()
+endif()
Index: tags/0.2.3/cmake/PacpusInstall.cmake
===================================================================
--- tags/0.2.3/cmake/PacpusInstall.cmake	(revision 368)
+++ tags/0.2.3/cmake/PacpusInstall.cmake	(revision 368)
@@ -0,0 +1,52 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+################################################################################
+# CMake
+install(
+    DIRECTORY ${PACPUS_CMAKE_DIR}
+    DESTINATION ${PACPUS_INSTALL_DIR}
+    PATTERN "in" EXCLUDE
+)
+configure_file("${PACPUS_CMAKE_DIR}/in/${PROJECT_NAME}Config.cmake.in" "${CMAKE_BINARY_DIR}/${PROJECT_NAME}Config.cmake" @ONLY)
+install(
+    FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}Config.cmake
+    DESTINATION ${PACPUS_INSTALL_DIR}
+)
+
+################################################################################
+# INCLUDES
+install(
+    DIRECTORY
+        ${PACPUS_INCLUDE_DIR}
+    DESTINATION
+        ${PACPUS_INSTALL_DIR}
+)
+
+################################################################################
+# Installation of the 3rd party
+if(PACPUS_INSTALL_3RD)
+    install(
+    DIRECTORY
+        ${PACPUS_3RD_PARTY_DIR}
+    DESTINATION
+        ${PACPUS_INSTALL_DIR}
+    )
+endif()
+
+################################################################################
+# Installation of the documentation
+if(PACPUS_BUILD_DOC)
+    install(
+        DIRECTORY
+            ${CMAKE_BINARY_DIR}/doc/html
+        DESTINATION
+            ${PACPUS_INSTALL_DIR}/doc
+    )
+endif()
Index: tags/0.2.3/cmake/PacpusPlatforms.cmake
===================================================================
--- tags/0.2.3/cmake/PacpusPlatforms.cmake	(revision 368)
+++ tags/0.2.3/cmake/PacpusPlatforms.cmake	(revision 368)
@@ -0,0 +1,16 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+# ========================================
+# GCC-Based compilers
+# ========================================
+if("${CMAKE_C_COMPILER}" MATCHES "gcc|icc|clang")
+    pacpus_info("The libraries will be compiled with -fPIC")
+    list(APPEND PACPUS_DEFINITIONS " -fPIC ")
+endif()
Index: tags/0.2.3/cmake/PacpusUtilities.cmake
===================================================================
--- tags/0.2.3/cmake/PacpusUtilities.cmake	(revision 368)
+++ tags/0.2.3/cmake/PacpusUtilities.cmake	(revision 368)
@@ -0,0 +1,470 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+## ========================================
+## Qt macro compatibility Qt4 / Qt5
+## ========================================
+function(qt_wrap_cpp OUT_MOC_SRCS)
+    set(FILES_TO_MOC ${ARGN})
+    if(QT4_FOUND)
+        qt4_wrap_cpp(MOC_SRCS ${FILES_TO_MOC}
+            OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION # fixes QTBUG-22829
+        )
+    elseif(Qt5Core_FOUND)
+        qt5_wrap_cpp(MOC_SRCS ${FILES_TO_MOC})
+    else()
+        message(WARNING "QT not found, cannot wrap moc files")
+    endif()
+
+    set(${OUT_MOC_SRCS} ${MOC_SRCS} PARENT_SCOPE)
+endfunction(qt_wrap_cpp)
+
+## ========================================
+## Qt macro compatibility Qt4 / Qt5
+## ========================================
+function(qt_wrap_ui OUT_UI_SRCS)
+    set(UI_FILES ${ARGN})
+    if(QT4_FOUND)
+        qt4_wrap_ui( UI_SRCS ${UI_FILES})
+    elseif(Qt5Core_FOUND)
+        qt5_wrap_ui( UI_SRCS ${UI_FILES})
+    else()
+        message(WARNING "QT not found, cannot wrap ui files")
+    endif()
+
+    set(${OUT_UI_SRCS} ${UI_SRCS} PARENT_SCOPE)
+endfunction()
+
+## ========================================
+## Qt macro compatibility Qt4 / Qt5
+## ========================================
+function(qt_add_resources OUT_RESOURCES)
+    set(RCS_FILES ${ARGN})
+    if(QT4_FOUND)
+        qt4_add_resources( RESOURCES ${RCS_FILES})
+    elseif(Qt5Core_FOUND)
+        qt5_add_resources( RESOURCES ${RCS_FILES})
+    else()
+        message(WARNING "QT not found, cannot add resources")
+    endif()
+
+    set(${OUT_RESOURCES} ${RESOURCES} PARENT_SCOPE)
+endfunction()
+
+# ========================================
+# Generic macro for Pacpus plugin
+# ========================================
+function(PACPUS_PLUGIN OUT_CPP OUT_H PLUGIN_NAME)
+    if(QT4_FOUND)
+        pacpus_plugin_qt4(PLUGIN_CPP PLUGIN_H ${PROJECT_NAME} )
+    elseif(Qt5Core_FOUND)
+        pacpus_plugin_qt5(PLUGIN_CPP PLUGIN_H ${PROJECT_NAME} )
+    else()
+        message(WARNING "QT not found, can't create Plugin")
+    endif()
+
+    set(${OUT_CPP} ${PLUGIN_CPP} PARENT_SCOPE)
+    set(${OUT_H} ${PLUGIN_H} PARENT_SCOPE)
+endfunction(PACPUS_PLUGIN)
+
+# ========================================
+# Create a Pacpus plugin QT4
+# ========================================
+function(PACPUS_PLUGIN_QT4 OUT_CPP OUT_H PLUGIN_NAME)
+    set(PLUGIN_NAME ${PLUGIN_NAME}Plugin)
+    set(${OUT_CPP} ${PLUGIN_NAME}.cpp PARENT_SCOPE)
+    set(${OUT_H} ${PLUGIN_NAME}.h PARENT_SCOPE)
+
+    string(TOUPPER ${PLUGIN_NAME} PLUGIN_NAME_UPPER)
+
+    # create the header file
+    file(WRITE ${PLUGIN_NAME}.h
+        "// Autogenerated file by PacpusPlugin.cmake\n"
+        "// DO NOT EDIT!!! ALL CHANGES WOULD BE REMOVED BY THE NEXT CALL OF CMAKE\n"
+        "\n"
+        "#ifndef __${PLUGIN_NAME_UPPER}_H__\n"
+        "#define __${PLUGIN_NAME_UPPER}_H__\n"
+        "\n"
+        "#include <QObject>\n"
+        "#include <qplugin.h>\n"
+        "\n"
+        "#include <Pacpus/kernel/PacpusPluginInterface.h>\n"
+        "\n"
+        "/// Auto-generated plugin class\n"
+        "class ${PLUGIN_NAME}\n"
+        "    : public QObject\n"
+        "    , public PacpusPluginInterface\n"
+        "{\n"
+        "    Q_OBJECT\n"
+        "    Q_INTERFACES(PacpusPluginInterface)\n"
+        "\n"
+        "public:\n"
+        "    ${PLUGIN_NAME}();\n"
+        "    ~${PLUGIN_NAME}();\n"
+        "\n"
+        "protected:\n"
+        "    QString name();\n"
+        "};\n"
+        "\n"
+        "#endif // __${PLUGIN_NAME_UPPER}_H__\n"
+    )
+
+    # create the cpp file
+    file(WRITE ${PLUGIN_NAME}.cpp
+        "// Autogenerated file by PacpusPlugin.cmake\n"
+        "// DO NOT EDIT!!! ALL CHANGES WOULD BE REMOVED BY THE NEXT CALL OF CMAKE\n"
+        "\n"
+        "#include \"${PLUGIN_NAME}.h\"\n"
+        "\n"
+        "${PLUGIN_NAME}::${PLUGIN_NAME}()\n"
+        "{\n"
+        "}\n"
+        "\n"
+        "${PLUGIN_NAME}::~${PLUGIN_NAME}()\n"
+        "{\n"
+        "}\n"
+        "\n"
+        "QString ${PLUGIN_NAME}::name()\n"
+        "{\n"
+        "    return \"${PLUGIN_NAME}\";\n"
+        "}\n"
+        "\n"
+        "Q_EXPORT_PLUGIN2(${PLUGIN_NAME}, ${PLUGIN_NAME})\n"
+    )
+endfunction(PACPUS_PLUGIN_QT4)
+
+# ========================================
+# Create a Pacpus plugin QT5
+# ========================================
+function(PACPUS_PLUGIN_QT5 OUT_CPP OUT_H PLUGIN_NAME)
+    set(PLUGIN_NAME ${PLUGIN_NAME}Plugin)
+    set(${OUT_CPP} ${PLUGIN_NAME}.cpp ${PLUGIN_NAME}.json PARENT_SCOPE)
+    set(${OUT_H} ${PLUGIN_NAME}.h PARENT_SCOPE)
+
+    string(TOUPPER ${PLUGIN_NAME} PLUGIN_NAME_UPPER)
+
+    # create the header file
+    file(WRITE ${PLUGIN_NAME}.h
+        "// Autogenerated file by PacpusUtilities.cmake\n"
+        "// DO NOT EDIT!!! ALL CHANGES WOULD BE REMOVED BY THE NEXT CALL OF CMAKE\n"
+        "\n"
+        "#ifndef __${PLUGIN_NAME_UPPER}_H__\n"
+        "#define __${PLUGIN_NAME_UPPER}_H__\n"
+        "\n"
+        "#include <QObject>\n"
+        "#include <qplugin.h>\n"
+        "\n"
+        "#include <Pacpus/kernel/PacpusPluginInterface.h>\n"
+        "\n"
+        "/// Auto-generated plugin class\n"
+        "class ${PLUGIN_NAME}\n"
+        "    : public QObject\n"
+        "    , public PacpusPluginInterface\n"
+        "{\n"
+        "    Q_OBJECT\n"
+        "    //Qt5 Plugins Macro\n"
+        "    Q_PLUGIN_METADATA(IID \"pacpus." ${PLUGIN_NAME} "\" FILE \"" ${PLUGIN_NAME} ".json\")\n"
+        "    Q_INTERFACES(PacpusPluginInterface)\n"    
+        "\n"
+        "public:\n"
+        "    ${PLUGIN_NAME}();\n"
+        "    ~${PLUGIN_NAME}();\n" 
+        "\n"
+        "protected:\n"
+        "    QString name();\n"
+        "};\n"
+        "\n"
+        "#endif // __${PLUGIN_NAME_UPPER}_H__\n"
+    )
+
+    # create the cpp file
+    file(WRITE ${PLUGIN_NAME}.cpp
+        "// Autogenerated file by PacpusUtilities.cmake\n"
+        "// DO NOT EDIT!!! ALL CHANGES WOULD BE REMOVED BY THE NEXT CALL OF CMAKE\n"
+        "\n"
+        "#include \"${PLUGIN_NAME}.h\"\n"
+        "\n"
+        "${PLUGIN_NAME}::${PLUGIN_NAME}()\n"
+        "{\n"
+        "}\n"
+        "\n"
+        "${PLUGIN_NAME}::~${PLUGIN_NAME}()\n"
+        "{\n"
+        "}\n"
+        "\n"
+        "QString ${PLUGIN_NAME}::name()\n"
+        "{\n"
+        "    return \"${PLUGIN_NAME}\";\n"
+        "}\n"
+        "\n"
+        "//Qt4 Plugin Macro desactivated\n"
+        "//Q_EXPORT_PLUGIN2(${PLUGIN_NAME}, ${PLUGIN_NAME})\n"
+    )
+
+    file(WRITE ${PLUGIN_NAME}.json
+        "{\n"
+        "    \"Keys\": [\"${PLUGIN_NAME}\"]\n"
+        "}\n"
+    )
+endfunction(PACPUS_PLUGIN_QT5)
+
+# ========================================
+# Replace backslashes by slashes
+# ========================================
+macro(pacpus_purge_backslash var)
+    string(REGEX REPLACE "\\\\" "/" ${var} "${${var}}")
+endmacro()
+
+# ========================================
+# Get the version of MSVC as a string
+# ========================================
+macro(pacpus_get_msvc output)
+    # By default, unknown
+    set(${output} "unknown")
+    if(MSVC9)
+        set(${output} "msvc2008")
+    elseif(MSVC10)
+        set(${output} "msvc2010")
+    else(MSVC11)
+        set(${output} "msvc2012")
+    endif()
+endmacro()
+
+# ========================================
+# Print a debug message
+# ========================================
+function(pacpus_output_status msg)
+    message(STATUS "${msg}")
+    string(REPLACE "\\" "\\\\" msg "${msg}")
+    string(REPLACE "\"" "\\\"" msg "${msg}")
+endfunction()
+
+# ========================================
+# Pacpus log message
+# ========================================
+function(pacpus_info text)
+    set(status_cond)
+    set(status_then)
+    set(status_else)
+
+    set(status_current_name "cond")
+    foreach(arg ${ARGN})
+        if(arg STREQUAL "THEN")
+            set(status_current_name "then")
+        elseif(arg STREQUAL "ELSE")
+            set(status_current_name "else")
+        else()
+            list(APPEND status_${status_current_name} ${arg})
+        endif()
+    endforeach()
+
+    if(DEFINED status_cond)
+        set(status_placeholder_length 32)
+        string(RANDOM LENGTH ${status_placeholder_length} ALPHABET " " status_placeholder)
+        string(LENGTH "${text}" status_text_length)
+        if(status_text_length LESS status_placeholder_length)
+            string(SUBSTRING "${text}${status_placeholder}" 0 ${status_placeholder_length} status_text)
+        elseif(DEFINED status_then OR DEFINED status_else)
+            pacpus_output_status("${text}")
+            set(status_text "${status_placeholder}")
+        else()
+            set(status_text "${text}")
+        endif()
+
+        if(DEFINED status_then OR DEFINED status_else)
+            if(${status_cond})
+                string(REPLACE ";" " " status_then "${status_then}")
+                string(REGEX REPLACE "^[ \t]+" "" status_then "${status_then}")
+                pacpus_output_status("${status_text} ${status_then}")
+            else()
+                string(REPLACE ";" " " status_else "${status_else}")
+                string(REGEX REPLACE "^[ \t]+" "" status_else "${status_else}")
+                pacpus_output_status("${status_text} ${status_else}")
+            endif()
+        else()
+            string(REPLACE ";" " " status_cond "${status_cond}")
+            string(REGEX REPLACE "^[ \t]+" "" status_cond "${status_cond}")
+            pacpus_output_status("${status_text} ${status_cond}")
+        endif()
+    else()
+        pacpus_output_status("${text}")
+    endif()
+endfunction()
+
+# ========================================
+# Pacpus add library and set debug postfix
+# ========================================
+function(pacpus_add_library target)
+    add_library(
+        ${ARGV}
+    )
+    set_target_properties(
+        ${target}
+        PROPERTIES DEBUG_POSTFIX "_d"
+    )
+    # Add manifest to the target (Windows SxS)
+    # TODO: do the same for executable (change #2 to #1)
+    #if(MSVC)
+    #    pacpus_info("\${CMAKE_CURRENT_SOURCE_DIR}/\${target}.manifest = ${CMAKE_CURRENT_SOURCE_DIR}/${target}.manifest")
+    #    if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}\\${target}.manifest")
+    #        pacpus_info("Exists: ${CMAKE_CURRENT_SOURCE_DIR}/${target}.manifest")
+    #        add_custom_command(
+    #            TARGET ${target}
+    #            POST_BUILD
+    #            COMMAND "mt.exe" -manifest \"${CMAKE_CURRENT_SOURCE_DIR}\\${target}.manifest\" -outputresource:\"$(TargetDir)\\$(TargetFileName)\"\;\#2
+    #            COMMENT "Adding custom manifest containing MSVCRT80 dependency..." 
+    #        )
+    #    endif()
+    #endif()
+endfunction()
+
+# ========================================
+# Pacpus add executable and set debug postfix
+# ========================================
+function(pacpus_add_executable target)
+    add_executable(
+        ${ARGV}
+    )
+    set_target_properties(
+        ${target}
+        PROPERTIES DEBUG_POSTFIX "_d"
+    )
+endfunction()
+
+# ========================================
+# Pacpus install
+# ========================================
+function(pacpus_install)
+    install(
+        TARGETS ${ARGV}
+        RUNTIME DESTINATION ${PACPUS_INSTALL_DIR}/bin
+        LIBRARY DESTINATION ${PACPUS_INSTALL_DIR}/bin
+        ARCHIVE DESTINATION ${PACPUS_INSTALL_DIR}/lib
+    )
+    if(MSVC)
+        # install debug information files .pdb
+        foreach(target ${ARGV})
+            get_target_property(target_type ${target} TYPE)
+            if(NOT target_type STREQUAL STATIC_LIBRARY)
+                get_target_property(target_filepath ${target} LOCATION_DEBUG)
+                get_filename_component(target_directory ${target_filepath} PATH)
+                get_filename_component(target_basename ${target_filepath} NAME_WE)
+                
+                set(target_pdb "${target_directory}/${target_basename}.pdb")
+                install(FILES ${target_pdb}
+                    CONFIGURATIONS Debug
+                    DESTINATION ${PACPUS_INSTALL_DIR}/bin
+                )
+            endif()
+        endforeach()
+    endif(MSVC)
+endfunction()
+
+# ========================================
+# Pacpus folder
+# ========================================
+function(pacpus_folder target folder_name)
+    if(PACPUS_USE_SOLUTION_FOLDERS AND MSVC)
+        set_target_properties(${target}
+            PROPERTIES FOLDER ${folder_name}
+        )
+    endif()
+endfunction()
+
+################################################################################
+# pacpus_add_test_executable(TEST_NAME SOURCES)
+function(pacpus_add_test_executable TEST_NAME)
+    set(SOURCES ${ARGN})
+    if(DEBUG)
+        message(STATUS "SOURCES = ${SOURCES}")
+    endif()
+    set(EXE_NAME ${TEST_NAME})
+    pacpus_add_executable(${EXE_NAME} ${SOURCES})
+    add_test(
+        NAME ${TEST_NAME}
+        WORKING_DIRECTORY ${PACPUS_INSTALL_DIR}/bin
+        COMMAND ${EXE_NAME}
+    )
+    set_target_properties(${TEST_NAME} PROPERTIES FOLDER "tests")
+    target_link_libraries(${EXE_NAME}
+        ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
+        ${PACPUS_LIBRARIES}
+        ${PACPUS_DEPENDENCIES_LIB}
+        #${QT_LIBRARIES}
+    )
+endfunction()
+
+# ========================================
+# Get sub directories
+# ========================================
+MACRO(SUBDIRLIST result curdir)
+  FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
+  SET(dirlist "")
+  FOREACH(child ${children})
+    IF(IS_DIRECTORY ${curdir}/${child})
+        SET(dirlist ${dirlist} ${child})
+    ENDIF()
+  ENDFOREACH()
+  SET(${result} ${dirlist})
+ENDMACRO()
+
+
+# ========================================
+# Create export header for plugins
+#
+# Usage: `create_export(PluginExportHeader "MyPluginName")`
+#
+# DLL export/import will depend on macro `${PLUGIN_NAME_UPPER}_EXPORTS`
+# which can be set using `add_definitions( -D${PLUGIN_NAME_UPPER}_EXPORTS )`
+# ========================================
+function(CREATE_EXPORT OUT_H PLUGIN_NAME)
+    # set output directory if given, otherwise use current directory
+    set(PLUGIN_OUTPUT_DIR "${ARGN}")
+    # set file name to the input variable
+    set(PLUGIN_CONFIG_FILE "${PLUGIN_NAME}Config.h")
+    if (NOT "${PLUGIN_OUTPUT_DIR}" STREQUAL "")
+        set(PLUGIN_CONFIG_FILE "${PLUGIN_OUTPUT_DIR}/${PLUGIN_CONFIG_FILE}")
+    endif()
+    
+    set(${OUT_H} "${PLUGIN_CONFIG_FILE}" PARENT_SCOPE)
+    
+    string(TOUPPER ${PLUGIN_NAME} PLUGIN_NAME_UPPER)
+    add_definitions( -D${PLUGIN_NAME_UPPER}_EXPORTS )
+    
+    # create the header file
+    file(WRITE "${PLUGIN_CONFIG_FILE}"
+        "// Autogenerated file by PacpusUtilities.cmake\n"
+        "// DO NOT EDIT!!! ALL CHANGES WOULD BE REMOVED BY THE NEXT CALL OF CMAKE\n"
+        "\n"
+
+        "#ifndef __${PLUGIN_NAME_UPPER}_CONFIG_H__\n"
+        "#define __${PLUGIN_NAME_UPPER}_CONFIG_H__\n"
+        "\n"
+        "// Export macro for use DLL for Windows only\n"
+        "#ifdef WIN32\n"
+        "   #ifdef ${PLUGIN_NAME_UPPER}_EXPORTS\n"
+        "//      make DLL\n"
+        "       #define ${PLUGIN_NAME_UPPER}_API __declspec(dllexport)\n"
+        "   #else\n"
+        "//      use DLL\n"
+        "       #define ${PLUGIN_NAME_UPPER}_API __declspec(dllimport)\n"
+        "   #endif\n"
+        "#else\n"
+        "//      On other platforms, simply ignore this\n"
+        "   #define ${PLUGIN_NAME_UPPER}_API\n"
+        "#endif\n\n"
+
+        "#endif // __${PLUGIN_NAME_UPPER}_CONFIG_H__\n"
+        )
+endfunction()
+
+function(UNDEF_EXPORT PLUGIN_NAME)
+    string(TOUPPER ${PLUGIN_NAME} PLUGIN_NAME_UPPER)
+    add_definitions( -U${PLUGIN_NAME_UPPER}_EXPORTS )
+endfunction()
Index: tags/0.2.3/cmake/igep_toolchain.cmake
===================================================================
--- tags/0.2.3/cmake/igep_toolchain.cmake	(revision 368)
+++ tags/0.2.3/cmake/igep_toolchain.cmake	(revision 368)
@@ -0,0 +1,52 @@
+cmake_minimum_required(VERSION 2.8)
+
+# CMake system name must be something like "Linux".
+# This is important for cross-compiling.
+set( CMAKE_SYSTEM_NAME Linux )
+set( CMAKE_SYSTEM_PROCESSOR arm )
+
+if(EXISTS "/opt/poky/1.3/sysroots/x86_64-pokysdk-linux")#64 bits
+    SET(CMAKE_C_COMPILER   /opt/poky/1.3/sysroots/x86_64-pokysdk-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc)
+    SET(CMAKE_CXX_COMPILER /opt/poky/1.3/sysroots/x86_64-pokysdk-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++)
+        SET(CMAKE_LINKER       /opt/poky/1.3/sysroots/x86_64-pokysdk-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi-ld)
+        SET(CMAKE_AR           /opt/poky/1.3/sysroots/x86_64-pokysdk-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi-ar)
+        SET(QT_QMAKE_EXECUTABLE /opt/poky/1.3/sysroots/x86_64-pokysdk-linux/usr/bin/qmake2)
+elseif(EXISTS "/opt/poky/1.3/sysroots/i686-pokysdk-linux")#32 bits
+    SET(CMAKE_C_COMPILER   /opt/poky/1.3/sysroots/i686-pokysdk-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc)
+    SET(CMAKE_CXX_COMPILER /opt/poky/1.3/sysroots/i686-pokysdk-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++)
+        SET(CMAKE_LINKER       /opt/poky/1.3/sysroots/i686-pokysdk-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi-ld)
+        SET(CMAKE_AR           /opt/poky/1.3/sysroots/i686-pokysdk-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi-ar)
+        SET(QT_QMAKE_EXECUTABLE /opt/poky/1.3/sysroots/i686-pokysdk-linux/usr/bin/qmake2)
+else()
+        message(FATAL_ERROR "Cross-compilator is not installed, please read https://devel.hds.utc.fr/projects/igep" )
+endif()
+
+SET(CMAKE_C_ARCHIVE_CREATE "${CMAKE_AR} cr <TARGET> <LINK_FLAGS> <OBJECTS>")
+SET(CMAKE_CXX_ARCHIVE_CREATE ${CMAKE_C_ARCHIVE_CREATE})
+
+SET(CMAKE_SYSTEM_PREFIX_PATH /opt/poky/1.3/sysroots/armv7a-vfp-neon-poky-linux-gnueabi/)
+
+set( CMAKE_C_FLAGS " -march=armv7-a -fno-tree-vectorize     -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -mtune=cortex-a8  --sysroot=/opt/poky/1.3/sysroots/armv7a-vfp-neon-poky-linux-gnueabi " CACHE STRING "CFLAGS" )
+set( CMAKE_CXX_FLAGS " -march=armv7-a -fno-tree-vectorize     -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -mtune=cortex-a8  --sysroot=/opt/poky/1.3/sysroots/armv7a-vfp-neon-poky-linux-gnueabi -O2 -pipe -g -feliminate-unused-debug-types -fpermissive -fvisibility-inlines-hidden -fpermissive" CACHE STRING "CXXFLAGS" )
+set( CMAKE_C_FLAGS_RELEASE "-O2 -pipe -g -feliminate-unused-debug-types  -DNDEBUG" CACHE STRING "CFLAGS for release" )
+set( CMAKE_CXX_FLAGS_RELEASE "-O2 -pipe -g -feliminate-unused-debug-types  -O2 -pipe -g -feliminate-unused-debug-types -fpermissive -fvisibility-inlines-hidden -DNDEBUG" CACHE STRING "CXXFLAGS for release" )
+
+# only search in the paths provided so cmake doesnt pick
+# up libraries and tools from the native build machine
+set( CMAKE_FIND_ROOT_PATH /opt/poky/1.3/sysroots/armv7a-vfp-neon-poky-linux-gnueabi/ )
+set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
+set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
+set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
+
+# Use qt.conf settings
+#set( ENV{QT_CONF_PATH} $ENV{IGEP_ROOT}/uav_dev/include/qt.conf )
+
+# Use native cmake modules
+set( CMAKE_MODULE_PATH /opt/poky/1.3/sysroots/armv7a-vfp-neon-poky-linux-gnueabi/usr/share/cmake-2.8/Modules/ )
+list (APPEND CMAKE_MODULE_PATH " /home/romain/TX1/tmpTarget/cmake/")
+
+# add for non /usr/lib libdir, e.g. /usr/lib64
+set( CMAKE_LIBRARY_PATH /home/romain/TX1/tmpTarget/lib)
+
+set (CMAKE_CXX_FLAGS "-fPIC")
+
Index: tags/0.2.3/cmake/in/PacpusConfig.cmake.in
===================================================================
--- tags/0.2.3/cmake/in/PacpusConfig.cmake.in	(revision 368)
+++ tags/0.2.3/cmake/in/PacpusConfig.cmake.in	(revision 368)
@@ -0,0 +1,132 @@
+# ===================================================================================
+#  The Pacpus CMake configuration file
+#
+#  Usage from an external project:
+#    In your CMakeLists.txt, add these lines:
+#
+#    FIND_PACKAGE(Pacpus REQUIRED)
+#    TARGET_LINK_LIBRARIES(MY_TARGET_NAME ${Pacpus_LIBS})
+#
+#    This file will define the following variables:
+#      - Pacpus_LIBS                     : The list of libraries to links against.
+#      - Pacpus_LIB_DIR                  : The directory(es) where lib files are. Calling LINK_DIRECTORIES
+#                                          with this path is NOT needed.
+#      - Pacpus_INCLUDE_DIRS             : The Pacpus include directories.
+#      - Pacpus_VERSION                  : The version of this Pacpus build. Example: "1.2.3"
+#      - Pacpus_MAJOR_VERSION            : Major version part of Pacpus_VERSION. Example: "1"
+#      - Pacpus_MINOR_VERSION            : Minor version part of Pacpus_VERSION. Example: "2"
+#      - Pacpus_PATCH_VERSION            : Patch version part of Pacpus_VERSION. Example: "3"
+#
+#    Advanced variables:
+#      - Pacpus_CONFIG_PATH
+#
+# ===================================================================================
+
+# Extract the directory where *this* file has been installed (determined at cmake run-time)
+get_filename_component(Pacpus_CONFIG_PATH "${CMAKE_CURRENT_LIST_FILE}" PATH CACHE)
+
+# ======================================================
+# Include directories to add to the user project:
+# ======================================================
+
+# Provide the include directories to the caller
+set(Pacpus_INCLUDE_DIRS "${Pacpus_CONFIG_PATH}/include")
+include_directories(${Pacpus_INCLUDE_DIRS})
+
+# ======================================================
+# Link directories to add to the user project:
+# ======================================================
+
+# Provide the libs directories to the caller
+set(Pacpus_LIB_DIR_RELEASE "${Pacpus_CONFIG_PATH}/lib" CACHE PATH "Path where release Pacpus libraries are located")
+set(Pacpus_LIB_DIR_DEBUG "${Pacpus_CONFIG_PATH}/lib" CACHE PATH "Path where debug Pacpus libraries are located")
+set(Pacpus_3RDPARTY_LIB_DIR_RELEASE "${Pacpus_CONFIG_PATH}/3rdparty/lib" CACHE PATH "Path where release 3rdparty Pacpus dependencies are located")
+set(Pacpus_3RDPARTY_LIB_DIR_DEBUG "${Pacpus_CONFIG_PATH}/3rdparty/lib" CACHE PATH "Path where debug 3rdparty Pacpus dependencies are located")
+mark_as_advanced(FORCE Pacpus_LIB_DIR_RELEASE Pacpus_LIB_DIR_DEBUG Pacpus_3RDPARTY_LIB_DIR_RELEASE Pacpus_3RDPARTY_LIB_DIR_DEBUG Pacpus_CONFIG_PATH)
+
+# ======================================================
+#  Version variables:
+# ======================================================
+set(Pacpus_MAJOR_VERSION @Pacpus_MAJOR_VERSION@)
+set(Pacpus_MINOR_VERSION @Pacpus_MINOR_VERSION@)
+set(Pacpus_PATCH_VERSION @Pacpus_PATCH_VERSION@)
+set(Pacpus_VERSION
+    "${Pacpus_MAJOR_VERSION}.${Pacpus_MINOR_VERSION}.${Pacpus_PATCH_VERSION}")
+
+# ====================================================================
+# Link libraries: e.g.   libPacpusLib.so, PacpusLibd.lib, etc...
+# ====================================================================
+
+set(Pacpus_LIB_COMPONENTS
+    dbiteplayerlib
+    FileLib
+    PacpusLib
+    PacpusTools
+)
+if(WIN32)
+    list(APPEND Pacpus_LIB_COMPONENTS
+        ROAD_TIME
+    )
+endif()
+
+# ==============================================================
+set(_Pacpus_MODULE_MISSING FALSE)
+set(Pacpus_LIBS "")
+
+# Check the presence of each component
+foreach(__opttype RELEASE DEBUG)
+    if(${__opttype} STREQUAL DEBUG)
+        set(Pacpus_LIB_TYPE debug)
+        set(Pacpus_LIB_SUFFIX "_d")
+    else()
+        set(Pacpus_LIB_TYPE optimized)
+        set(Pacpus_LIB_SUFFIX "")
+    endif()
+    foreach(__component ${Pacpus_LIB_COMPONENTS})
+        find_library(
+            Pacpus_${__component}_LIB_${__opttype}
+            NAMES ${__component}${Pacpus_LIB_SUFFIX}
+            HINTS ${Pacpus_LIB_DIR_${__opttype}}
+        )
+        if(Pacpus_${__component}_LIB_${__opttype})
+            list(APPEND Pacpus_LIBS ${Pacpus_LIB_TYPE} ${Pacpus_${__component}_LIB_${__opttype}})
+        else()
+            message(SEND_ERROR "Cannot find Pacpus component ${__component}${Pacpus_LIB_SUFFIX} (${Pacpus_LIB_TYPE} version)")
+            set(_Pacpus_MODULE_MISSING TRUE)
+        endif()
+    endforeach()
+endforeach()
+
+# handle the QUIETLY and REQUIRED arguments and set PACPUS_FOUND to TRUE if
+# all listed variables are TRUE
+include (FindPackageHandleStandardArgs)
+set(Pacpus_ALL_MODULES_FOUND NOT _Pacpus_MODULE_MISSING)
+find_package_handle_standard_args (Pacpus DEFAULT_MSG Pacpus_LIBS Pacpus_INCLUDE_DIRS Pacpus_ALL_MODULES_FOUND)
+
+# ==============================================================
+set(Pacpus_INSTALL_DIR ${Pacpus_CONFIG_PATH})
+set(Pacpus_CMAKE_DIR ${Pacpus_CONFIG_PATH}/cmake)
+set(CMAKE_INSTALL_PREFIX ${Pacpus_INSTALL_DIR})
+list(APPEND CMAKE_PREFIX_PATH ${Pacpus_CMAKE_DIR})
+list(APPEND CMAKE_MODULE_PATH ${Pacpus_CMAKE_DIR})
+
+include(${Pacpus_CMAKE_DIR}/PacpusUtilities.cmake)
+include(${Pacpus_CMAKE_DIR}/PacpusConfiguration.cmake)
+include(${Pacpus_CMAKE_DIR}/PacpusDependencies.cmake)
+include(${Pacpus_CMAKE_DIR}/PacpusPlatforms.cmake)
+
+# ==============================================================
+# Compatibility stuff
+# ==============================================================
+set(Pacpus_ROOT ${Pacpus_CONFIG_PATH})
+if(CMAKE_BUILD_TYPE MATCHES "Debug")
+    set(Pacpus_LIB_DIR ${Pacpus_LIB_DIR_DEBUG} ${Pacpus_3RDPARTY_LIB_DIR_DEBUG})
+else()
+    set(Pacpus_LIB_DIR ${Pacpus_LIB_DIR_RELEASE} ${Pacpus_3RDPARTY_LIB_DIR_RELEASE})
+endif()
+set(Pacpus_LIBRARIES ${Pacpus_LIBS})
+set(Pacpus_INCLUDE_DIR ${Pacpus_INCLUDE_DIRS})
+
+set(PACPUS_ROOT ${Pacpus_ROOT})
+set(PACPUS_LIBRARIES ${Pacpus_LIBS})
+set(PACPUS_INCLUDE_DIR ${Pacpus_INCLUDE_DIR})
Index: tags/0.2.3/doc/CMakeLists.txt
===================================================================
--- tags/0.2.3/doc/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/doc/CMakeLists.txt	(revision 368)
@@ -0,0 +1,20 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+if(PACPUS_BUILD_DOC)
+    # Debug
+    pacpus_info("Adding target: documentation")
+    # Configure the template Doxyfile for our specific project
+    configure_file(doxyfile.in ${CMAKE_BINARY_DIR}/Doxyfile @ONLY IMMEDIATE)
+    # Add a custom target to run Doxygen when ever the project is built
+    add_custom_target (
+        documentation 
+        COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile
+        SOURCES ${CMAKE_BINARY_DIR}/Doxyfile)
+endif()
Index: tags/0.2.3/doc/PacpusFramework.h
===================================================================
--- tags/0.2.3/doc/PacpusFramework.h	(revision 368)
+++ tags/0.2.3/doc/PacpusFramework.h	(revision 368)
@@ -0,0 +1,16 @@
+/**
+@mainpage PACPUS Framework API reference
+
+@section sec_introduction Introduction
+
+@todo Write intro
+
+@section sec_overview Overview
+
+@todo Write overview
+
+@section sec_rationale Rationale
+
+@todo Write rationale
+
+*/
Index: tags/0.2.3/doc/doxyfile.in
===================================================================
--- tags/0.2.3/doc/doxyfile.in	(revision 368)
+++ tags/0.2.3/doc/doxyfile.in	(revision 368)
@@ -0,0 +1,1864 @@
+# Doxyfile 1.8.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a hash (#) is considered a comment and will be ignored.
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or sequence of words) that should
+# identify the project. Note that if you do not use Doxywizard you need
+# to put quotes around the project name if it contains spaces.
+
+PROJECT_NAME           = "PACPUS Framework"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = @CMAKE_BINARY_DIR@/doc
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = YES
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip. Note that you specify absolute paths here, but also
+# relative paths, which will be relative from the directory where doxygen is
+# started.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful if your file system
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding
+# "class=itcl::class" will allow you to use the command class in the
+# itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension,
+# and language is one of the parsers supported by doxygen: IDL, Java,
+# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C,
+# C++. For instance to make doxygen treat .inc files as Fortran files (default
+# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note
+# that for custom extensions you also need to set FILE_PATTERNS otherwise the
+# files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all
+# comments according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you
+# can mix doxygen, HTML, and XML commands with Markdown formatting.
+# Disable only in case of backward compatibilities issues.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented classes,
+# or namespaces to their corresponding documentation. Such a link can be
+# prevented in individual cases by by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = YES
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES (the
+# default) will make doxygen replace the get and set methods by a property in
+# the documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+# unions are shown inside the group in which they are included (e.g. using
+# @ingroup) instead of on a separate page (for HTML and Man pages) or
+# section (for LaTeX and RTF).
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
+# unions with only public data fields will be shown inline in the documentation
+# of the scope in which they are defined (i.e. file, namespace, or group
+# documentation), provided this scope is documented. If set to NO (the default),
+# structs, classes, and unions are shown on a separate page (for HTML and Man
+# pages) or section (for LaTeX and RTF).
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penalty.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will roughly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols.
+
+SYMBOL_CACHE_SIZE      = 0
+
+# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be
+# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
+# their name and scope. Since this can be an expensive process and often the
+# same symbol appear multiple times in the code, doxygen keeps a cache of
+# pre-resolved symbols. If the cache is too small doxygen will become slower.
+# If the cache is too large, memory is wasted. The cache size is given by this
+# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = YES
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = YES
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if section-label ... \endif
+# and \cond section-label ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or macro consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files
+# containing the references data. This must be a list of .bib files. The
+# .bib extension is automatically appended if omitted. Using this command
+# requires the bibtex tool to be installed. See also
+# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
+# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this
+# feature you need bibtex and perl available in the search path. Do not use
+# file names with spaces, bibtex cannot handle them.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = @PACPUS_INCLUDE_DIR@ @PACPUS_DOC_DIR@
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS          =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page (index.html).
+# This can be useful if you have a project on for instance GitHub and want reuse
+# the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C, C++ and Fortran comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+#  for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is advised to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when
+# changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If left blank doxygen will
+# generate a default style sheet. Note that it is recommended to use
+# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this
+# tag will in the future become obsolete.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional
+# user-defined cascading style sheet that is included after the standard
+# style sheets created by doxygen. Using this option one can overrule
+# certain style aspects. This is preferred over using HTML_STYLESHEET
+# since it does not replace the standard style sheet and is therefor more
+# robust against future updates. Doxygen will copy the style sheet file to
+# the output directory.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the style sheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of
+# entries shown in the various tree structured indices initially; the user
+# can expand and collapse entries dynamically later on. Doxygen will expand
+# the tree to such a level that at most the specified number of entries are
+# visible (unless a fully collapsed tree already exceeds this amount).
+# So setting the number of entries 1 will produce a full collapsed tree by
+# default. 0 is a special value representing an infinite number of entries
+# and will result in a full expanded tree by default.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Pacpus
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely
+# identify the documentation publisher. This should be a reverse domain-name
+# style string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Heudiasyc
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Heudiasyc
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+#  will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)
+# at top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it. Since the tabs have the same information as the
+# navigation tree you can set this option to NO if you already set
+# GENERATE_TREEVIEW to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+# Since the tree basically has the same information as the tab index you
+# could consider to set DISABLE_INDEX to NO when enabling this option.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you may also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and
+# SVG. The default value is HTML-CSS, which is slower, but has the best
+# compatibility.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to
+# the MathJax Content Delivery Network so you can quickly see the result without
+# installing MathJax.
+# However, it is strongly recommended to install a local
+# copy of MathJax from http://www.mathjax.org before deployment.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
+# names that should be enabled during MathJax rendering.
+
+MATHJAX_EXTENSIONS     =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript.
+# There are two flavours of web server based search depending on the
+# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
+# searching and an index file used by the script. When EXTERNAL_SEARCH is
+# enabled the indexing and searching needs to be provided by external tools.
+# See the manual for details.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain
+# the search results. Doxygen ships with an example indexer (doxyindexer) and
+# search engine (doxysearch.cgi) which are based on the open source search engine
+# library Xapian. See the manual for configuration details.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will returned the search results when EXTERNAL_SEARCH is enabled.
+# Doxygen ships with an example search engine (doxysearch) which is based on
+# the open source search engine library Xapian. See the manual for configuration
+# details.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through other
+# doxygen projects that are not otherwise connected via tags files, but are
+# all added to the same search index. Each project needs to have a tag file set
+# via GENERATE_TAGFILE. The search mapping then maps the name of the tag file
+# to a relative location where the documentation can be found,
+# similar to the
+# TAGFILES option but without actually processing the tag file.
+# The format is: EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER           =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
+# http://en.wikipedia.org/wiki/BibTeX for more info.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load style sheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. For each
+# tag file the location of the external documentation should be added. The
+# format of a tag file without this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths
+# or URLs. Note that each tag file must have a unique name (where the name does
+# NOT include the path). If a tag file is not located in the directory in which
+# doxygen is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option also works with HAVE_DOT disabled, but it is recommended to
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will use the Helvetica font for all dot files that
+# doxygen generates. When you want a differently looking font you can specify
+# the font name using DOT_FONTNAME. You need to make sure dot is able to find
+# the font, which can be done by putting it in a standard location or by setting
+# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the Helvetica font.
+# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
+# set the path where dot can find it.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside
+# the class node. If there are many fields or methods and many nodes the
+# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS
+# threshold limits the number of items for each type to make the size more
+# managable. Set this to 0 for no limit. Note that the threshold may be
+# exceeded by 50% before the limit is enforced.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are svg, png, jpg, or gif.
+# If left blank png will be used. If you choose svg you need to set
+# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible in IE 9+ (other browsers do not have this requirement).
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+# Note that this requires a modern browser other than Internet Explorer.
+# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
+# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible. Older versions of IE do not have SVG support.
+
+INTERACTIVE_SVG        = NO
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
Index: tags/0.2.3/examples/CMakeLists.txt
===================================================================
--- tags/0.2.3/examples/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/examples/CMakeLists.txt	(revision 368)
@@ -0,0 +1,1 @@
+add_subdirectory(ProducerConsumerExample)
Index: tags/0.2.3/examples/ProducerConsumerExample/CMakeLists.txt
===================================================================
--- tags/0.2.3/examples/ProducerConsumerExample/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/examples/ProducerConsumerExample/CMakeLists.txt	(revision 368)
@@ -0,0 +1,98 @@
+project(ProducerConsumerExample)
+
+set(${PROJECT_NAME}_VERSION_MAJOR 0)
+set(${PROJECT_NAME}_VERSION_MINOR 1)
+
+################################################################################
+create_export(EXPORT_HDR ${PROJECT_NAME})
+pacpus_plugin(PLUGIN_CPP PLUGIN_HDR ${PROJECT_NAME})
+
+################################################################################
+# DIRECTORIES
+include_directories(
+    ${PACPUSCITYVIP_INCLUDE_DIR}
+    ${PROJECT_BINARY_DIR}
+    ${QT_INCLUDE_DIR}
+)
+
+set(SRC_BINARY_DIR "${PROJECT_BINARY_DIR}/../../src")
+get_filename_component(SRC_BINARY_DIR "${SRC_BINARY_DIR}" ABSOLUTE)
+#message("\${SRC_BINARY_DIR} = ${SRC_BINARY_DIR}")
+link_directories(
+    ${SRC_BINARY_DIR}/PacpusLib
+    ${SRC_BINARY_DIR}/PacpusTools
+    ${SRC_BINARY_DIR}/RoadTime
+)
+
+################################################################################
+# FILES
+set(PROJECT_HDRS
+    ${EXPORT_HDR}
+    ProducerExample.h
+    ConsumerExample.h
+    XML/${PROJECT_NAME}.xml
+    XML/${PROJECT_NAME}_d.xml
+)
+set(PROJECT_SRCS
+    ${PLUGIN_CPP}
+    ProducerExample.cpp
+    ConsumerExample.cpp
+)
+
+set(FILES_TO_MOC
+    ${PLUGIN_HDR}
+    ProducerExample.h
+    ConsumerExample.h
+)
+
+set(UI_FILES
+)
+
+################################################################################
+# Qt: call moc, uic
+qt_wrap_cpp(PROJECT_MOC_SRCS
+    ${FILES_TO_MOC}
+)
+
+qt_wrap_ui(PROJECT_UI_SRCS
+    ${UI_FILES}
+)
+
+################################################################################
+# BUILD and LINK
+pacpus_add_library(${PROJECT_NAME} SHARED
+    ${PROJECT_HDRS}
+    ${PROJECT_SRCS}
+    ${PROJECT_MOC_SRCS}
+    ${PROJECT_UI_SRCS}
+)
+
+list(APPEND PACPUS_LIBRARIES
+    optimized PacpusLib debug PacpusLib_d
+)
+if(WIN32)
+    list(APPEND PACPUS_LIBRARIES
+        optimized ROAD_TIME debug ROAD_TIME_d
+    )
+endif()
+
+# LIBS
+set(LIBS
+    ${PACPUS_LIBRARIES}
+    ${PACPUS_DEPENDENCIES_LIB}
+    ${QT_LIBRARIES}
+)
+
+# LINK
+target_link_libraries(${PROJECT_NAME} ${LIBS})
+
+################################################################################
+# FOLDERS
+pacpus_folder(${PROJECT_NAME} "examples")
+
+################################################################################
+# INSTALL
+pacpus_install(${PROJECT_NAME})
+
+# Installation of the headers
+#install(DIRECTORY ${PACPUSCITYVIP_INCLUDE_DIR} DESTINATION "${PACPUS_ROOT}")
Index: tags/0.2.3/examples/ProducerConsumerExample/ConsumerExample.cpp
===================================================================
--- tags/0.2.3/examples/ProducerConsumerExample/ConsumerExample.cpp	(revision 368)
+++ tags/0.2.3/examples/ProducerConsumerExample/ConsumerExample.cpp	(revision 368)
@@ -0,0 +1,95 @@
+#include "ConsumerExample.h"
+
+#include <Pacpus/kernel/ComponentFactory.h>
+#include <Pacpus/kernel/Log.h>
+#include <Pacpus/kernel/InputOutputInterface.h>
+
+using namespace pacpus;
+using namespace std;
+
+DECLARE_STATIC_LOGGER("pacpus.cityvip.test.ConsumerExample");
+
+PACPUS_REGISTER_COMPONENT(ConsumerExample);
+
+ConsumerExample::ConsumerExample(QString name)
+    : ComponentBase(name)
+{
+    LOG_TRACE("constructor(" << name << ")");
+
+    addParameter("output-path", value<std::string>(&mOutputFileName)->default_value("consumer.txt"), "set output file path");
+}
+
+ConsumerExample::~ConsumerExample()
+{
+    LOG_TRACE("destructor");
+}
+
+void ConsumerExample::addInputs()
+{
+    addInput<QImage, ConsumerExample>("image", &ConsumerExample::process);
+}
+
+void ConsumerExample::addOutputs()
+{
+    // empty: no outputs
+}
+
+ComponentBase::COMPONENT_CONFIGURATION
+ConsumerExample::configureComponent(XmlComponentConfig /*config*/)
+{
+    PACPUS_LOG_FUNCTION();
+
+    // load XML parameters -- NOT NEEDED - loaded by boost::program_options (used addParameters())
+
+    LOG_INFO("component '" << getName() << "' configured");
+    return ComponentBase::CONFIGURED_OK;
+}
+
+void ConsumerExample::startActivity()
+{
+    LOG_TRACE(Q_FUNC_INFO);
+    m_counter = 0;
+    
+    m_file.open(mOutputFileName.c_str(), std::ios_base::out | std::ios_base::app);
+    if (!m_file.is_open()) {
+        LOG_ERROR("file '" << mOutputFileName << "' cannot be opened");
+    }
+
+    setState(MONITOR_OK);
+    LOG_INFO("started component '" << getName() << "'");
+
+    moveToThread(&mThread);
+    mThread.start();
+}
+
+void ConsumerExample::stopActivity()
+{
+    LOG_TRACE(Q_FUNC_INFO);
+
+    m_file.close();
+    setState(STOPPED);
+    LOG_INFO("stopped component '" << getName() << "'");
+    QMetaObject::invokeMethod(&mThread, "quit");
+}
+
+void ConsumerExample::process(const QImage& matrix)
+{
+    m_file << ++m_counter << " " << road_time() << "\n" << std::flush;
+
+    LOG_INFO("Received QIMage: "
+        << "size = " << matrix.size().width()<< " x " << matrix.size().height()
+        );
+
+    // DO PROCESSING
+
+    setState(MONITOR_OK);
+}
+
+void testPacpusTypedEventConverts()
+{
+    PacpusTypedEvent<float> floatEvent(TYPED_EVENT, 1.0f);
+    PacpusTypedEvent<double> doubleEvent = floatEvent;
+    
+    PacpusTypedEvent<int> intEvent(TYPED_EVENT, 2);
+    //PacpusTypedEvent<QImage> imageEvent = intEvent; // should not compile
+}
Index: tags/0.2.3/examples/ProducerConsumerExample/ConsumerExample.h
===================================================================
--- tags/0.2.3/examples/ProducerConsumerExample/ConsumerExample.h	(revision 368)
+++ tags/0.2.3/examples/ProducerConsumerExample/ConsumerExample.h	(revision 368)
@@ -0,0 +1,45 @@
+#ifndef CONSUMEREXAMPLE_H
+#define CONSUMEREXAMPLE_H
+
+#include "ProducerConsumerExampleConfig.h"
+
+#include <fstream>
+#include <Pacpus/kernel/ComponentBase.h>
+#include <QImage>
+#include <QThread>
+#include <string>
+
+namespace pacpus
+{
+
+class PRODUCERCONSUMEREXAMPLE_API ConsumerExample
+    : public QObject
+    , public ComponentBase
+{
+    Q_OBJECT
+
+public:
+    ConsumerExample(QString name);
+    ~ConsumerExample();
+
+    virtual void stopActivity();
+    virtual void startActivity();
+    virtual COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config);
+    void process(const QImage& matrix);
+
+private:
+    virtual void addInputs();
+    virtual void addOutputs();
+
+    QImage matrix;
+
+    int m_counter;
+    std::ofstream m_file;
+
+    std::string mOutputFileName;
+    QThread mThread;
+};
+
+} // namespace pacpus
+
+#endif // CONSUMEREXAMPLE_H
Index: tags/0.2.3/examples/ProducerConsumerExample/ProducerExample.cpp
===================================================================
--- tags/0.2.3/examples/ProducerConsumerExample/ProducerExample.cpp	(revision 368)
+++ tags/0.2.3/examples/ProducerConsumerExample/ProducerExample.cpp	(revision 368)
@@ -0,0 +1,110 @@
+#include "ProducerExample.h"
+
+#include <Pacpus/kernel/ComponentFactory.h>
+#include <Pacpus/kernel/ComponentManager.h>
+#include <Pacpus/kernel/InputOutputInterface.h>
+#include <Pacpus/kernel/Log.h>
+
+#include <boost/bind.hpp>
+#include <boost/thread.hpp>
+
+using namespace pacpus;
+using namespace std;
+
+DECLARE_STATIC_LOGGER("pacpus.cityvip.test.ProducerExample");
+
+PACPUS_REGISTER_COMPONENT(ProducerExample);
+
+ProducerExample::ProducerExample(QString name)
+    : ComponentBase(name)
+    , mInterval(boost::posix_time::milliseconds(150))
+    , mTimer(mIo, mInterval)
+{
+    PACPUS_LOG_FUNCTION();
+
+    addParameter("output-path", value<std::string>(&mOutputFileName)->default_value("producer.txt"), "set output file path");
+}
+
+ProducerExample::~ProducerExample()
+{
+    PACPUS_LOG_FUNCTION();
+}
+
+ComponentBase::COMPONENT_CONFIGURATION ProducerExample::configureComponent(XmlComponentConfig /*config*/)
+{
+    PACPUS_LOG_FUNCTION();
+
+    LOG_INFO("component '" << getName() << "' configured");
+    return ComponentBase::CONFIGURED_OK;
+}
+    
+void ProducerExample::addInputs()
+{
+    // empty: no inputs
+}
+
+void ProducerExample::addOutputs()
+{
+    addOutput<QImage, ProducerExample>("image");
+}
+
+void ProducerExample::startActivity()
+{
+    PACPUS_LOG_FUNCTION();
+
+    using boost::bind;
+    using boost::ref;
+
+    std::fstream mFile(mOutputFileName.c_str(), std::ios_base::out | std::ios_base::app);
+    if (!mFile.is_open()) {
+        LOG_ERROR("file '" << mOutputFileName << "' cannot be opened");
+        return;
+    }
+
+    mImageOutput = getTypedOutput<QImage, ProducerExample>("image");
+
+    setActive(true);
+    setState(MONITOR_OK);
+    LOG_INFO("started component '" << getName() << "'");
+
+    int counter = 0;
+    mTimer.async_wait(bind(&ProducerExample::produce, this, ref(counter)));
+    boost::thread t(bind(&boost::asio::io_service::run, ref(mIo)));
+    //mIo.run();
+}
+
+void ProducerExample::stopActivity()
+{
+    PACPUS_LOG_FUNCTION();
+
+    setActive(false);
+    setState(STOPPED);
+    LOG_INFO("stopped component '" << getName() << "'");
+    
+    mFile.close();
+}
+
+void ProducerExample::produce(int& counter)
+{
+    if (!isActive()) {
+        return;
+    }
+    
+    QImage mat(10, 10, QImage::Format_RGB32);
+    //mat.fill( qRgb(189, 149, 39));
+    //mat.setPixel(0,0,i);
+    LOG_INFO("Sending QImage: "
+        << "size = " << mat.size().width()<< " x " << mat.size().height()
+        );
+
+    checkedSend(mImageOutput, mat);
+    LOG_INFO("Sent data=" << counter << ", time=" << road_time());
+    mFile << counter << " " << road_time() << "\n" << std::flush;
+    ++counter;
+    setState(MONITOR_OK);
+    
+    using boost::bind;
+    using boost::ref;
+    mTimer.expires_at(mTimer.expires_at() + mInterval);
+    mTimer.async_wait(bind(&ProducerExample::produce, this, ref(counter)));
+}
Index: tags/0.2.3/examples/ProducerConsumerExample/ProducerExample.h
===================================================================
--- tags/0.2.3/examples/ProducerConsumerExample/ProducerExample.h	(revision 368)
+++ tags/0.2.3/examples/ProducerConsumerExample/ProducerExample.h	(revision 368)
@@ -0,0 +1,63 @@
+/**
+@file
+Purpose: Lidar Detection
+
+@date created 2010-06-03 16:13
+@author Julien Moras
+@version $Id: $
+*/
+
+#ifndef PRODUCEREXAMPLE_H
+#define PRODUCEREXAMPLE_H
+
+#include "ProducerConsumerExampleConfig.h"
+
+#include <Pacpus/kernel/ComponentBase.h>
+#include <Pacpus/kernel/road_time.h>
+//#include <Pacpus/structure/genericStructures.h>
+
+#include <boost/asio.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <fstream>
+#include <QImage>
+
+namespace pacpus
+{
+
+class PRODUCERCONSUMEREXAMPLE_API ProducerExample
+    : public QObject
+    , public ComponentBase
+{
+    Q_OBJECT
+
+public:
+    static const char * COMPONENT_TYPE;
+
+    ProducerExample(QString name);
+    ~ProducerExample();
+
+    virtual void addInputs();
+    virtual void addOutputs();
+    
+    virtual void startActivity();
+    virtual void stopActivity();
+
+    virtual COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config);
+
+private:
+    void produce(int& counter);
+
+private:
+    std::string mOutputFileName;
+
+    std::fstream mFile;
+    OutputInterface<QImage, ProducerExample>* mImageOutput;
+
+    boost::asio::io_service mIo;
+    boost::posix_time::time_duration mInterval;
+    boost::asio::deadline_timer mTimer;
+};
+
+} // namespace pacpus
+
+#endif // PRODUCEREXAMPLE_H
Index: tags/0.2.3/examples/ProducerConsumerExample/XML/ProducerConsumerExample.xml
===================================================================
--- tags/0.2.3/examples/ProducerConsumerExample/XML/ProducerConsumerExample.xml	(revision 368)
+++ tags/0.2.3/examples/ProducerConsumerExample/XML/ProducerConsumerExample.xml	(revision 368)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<pacpus>
+    <components>
+        <component name="producer" type="ProducerExample" ui="0" verbose="1" />
+        <component name="consumer" type="ConsumerExample" ui="0" verbose="1" verbosity-level="2" output-path="output-consumer.txt" />
+    </components>
+
+    <connections>
+        <connection output="producer.image" input="consumer.image" type="direct" priority="0" />
+    </connections>
+
+    <plugins prefix="" postfix="" extension="dll">
+        <plugin lib="ProducerConsumerExample" />
+    </plugins>
+    
+    <parameters>
+    </parameters>
+</pacpus>
Index: tags/0.2.3/examples/ProducerConsumerExample/XML/ProducerConsumerExample_d.xml
===================================================================
--- tags/0.2.3/examples/ProducerConsumerExample/XML/ProducerConsumerExample_d.xml	(revision 368)
+++ tags/0.2.3/examples/ProducerConsumerExample/XML/ProducerConsumerExample_d.xml	(revision 368)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<pacpus>
+    <components>
+        <component name="producer" type="ProducerExample" ui="0" verbose="1" />
+        <component name="consumer" type="ConsumerExample" ui="0" verbose="1" verbosity-level="2" output-path="output-consumer.txt" />
+    </components>
+
+    <connections>
+        <connection output="producer.image" input="consumer.image" type="direct" priority="0" />
+    </connections>
+
+    <plugins prefix="" postfix="_d" extension="dll">
+        <plugin lib="ProducerConsumerExample" />
+    </plugins>
+    
+    <parameters>
+    </parameters>
+</pacpus>
Index: tags/0.2.3/include/Pacpus/DbitePlayer/DbitePlayerConfig.h
===================================================================
--- tags/0.2.3/include/Pacpus/DbitePlayer/DbitePlayerConfig.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/DbitePlayer/DbitePlayerConfig.h	(revision 368)
@@ -0,0 +1,31 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: DbitePlayerConfig.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_DBITEPLAYERCONFIG_H
+#define DEF_PACPUS_DBITEPLAYERCONFIG_H
+
+// Export macro for DbitePlayer DLL for Windows only
+#ifdef WIN32
+#   ifdef DBITE_PLAYER_EXPORTS
+        // make DLL
+#       define DBITE_PLAYER_API __declspec(dllexport)
+#   else
+        // use DLL
+#       define DBITE_PLAYER_API __declspec(dllimport)
+#   endif
+#else
+    // On other platforms, simply ignore this 
+#   define DBITE_PLAYER_API 
+#endif
+
+#endif // DEF_PACPUS_DBITEPLAYERCONFIG_H
Index: tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyEngine.h
===================================================================
--- tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyEngine.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyEngine.h	(revision 368)
@@ -0,0 +1,178 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Elie Al Alam <firstname.surname@utc.fr>
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    April, 2007
+/// @version $Id: DbtPlyEngine.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief DbitePlayer DbitePlayer.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_DBTPLYENGINE_H
+#define DEF_PACPUS_DBTPLYENGINE_H
+
+#include <Pacpus/kernel/ComponentBase.h>
+#include <Pacpus/kernel/ComponentFactory.h>
+#include <Pacpus/DbitePlayer/DbitePlayerConfig.h>
+#include <Pacpus/DbitePlayer/DbtPlyEngineStateChart.h>
+#include <Pacpus/DbitePlayer/DbtPlyUserInterface.h>
+
+#include <QSemaphore>
+#include <QThread>
+#include <string>
+
+namespace pacpus
+{
+
+class DbtPlyEngineStateChart;
+class DbtPlyEngineState;
+
+/// @todo Documentation
+enum PlayMode
+{
+    PlayModeLastData = 1,   ///< replay_mode="1"
+    PlayModeAllData = 2     ///< replay_mode="2"
+};
+
+/// XML config properties:
+///     datadir         PATH    root data directory,
+///         e.g. datadir="/home/user/dbt_data"
+///     replay_mode     STRING  {1}|2
+///         e.g. replay_mode="2"
+class DBITE_PLAYER_API DbtPlyEngine
+    : public QThread // FIXME: remove QThread
+    , public ComponentBase
+{
+    Q_OBJECT
+
+public:
+    /// Constructor
+    DbtPlyEngine(QString name);
+    /// Destructor
+    ~DbtPlyEngine();
+
+    /// @returns the directory where the data are stored
+    QString getDataDir();
+
+    /// @returns the current replay time
+    road_time_t getTime()
+    {
+        return tDbt_;
+    }
+
+    /// @returns @b true if the player is playing, @b false otherwise
+    bool isPlaying();
+    /// Accessor to playmode
+    int replayMode()
+    {
+        return replayMode_;
+    }
+
+    /// @todo Documentation
+    const DbtPlyEngineState * getState();
+    /// @todo Documentation
+    void setState(DbtPlyEngineState * newState);
+
+    /// Goes back to the beginning, sets speed to initial value
+    void reset();
+
+    /// @todo Documentation
+    void speedUp();
+    /// @todo Documentation
+    void speedDown();
+    /// @todo Documentation
+    void setLastTNow(road_time_t newTNow)
+    {
+        this->lastTNow_= newTNow;
+    }
+
+protected:
+    virtual void addInputs();
+    virtual void addOutputs();
+
+    /// @todo Documentation
+    virtual void startActivity();
+    /// @todo Documentation
+    virtual void stopActivity();
+    /// @todo Documentation
+    virtual COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config);
+
+    /// Thread main loop
+    virtual void run();
+
+private:
+    DbtPlyEngineState * mCurrentState;
+    float mSpeed;
+    bool mIsReverse;
+
+    /// The state chart of the engine (speed, state and direction)
+    DbtPlyEngineStateChart * stateChart_;
+
+    /// A semaphore of protection of the critical section
+    QSemaphore * tMinMaxSem_;
+    /// tmin and tmax regarding to all the DBT files replayed
+    road_time_t tDbtMin_, tDbtMax_;
+
+    /// tNow_ = the current time when the trigger alerts the engine
+    road_time_t tNow_;
+    /// lastTNow_ = previous tNow_
+    road_time_t lastTNow_;
+    /// tDbt_ = the DBT time at which the data have to be replayed corresponding the state of the engine
+    road_time_t tDbt_;
+    /// lastTDbt_ = previous tDbt_
+    road_time_t lastTDbt_;
+
+    /// the direction of reading: forward=1 or backward=-1 used to compute the tDbt that must be replayed
+    short direction_;
+
+    /// the synchronization semaphore with the trigger
+    QSemaphore * sync_;
+
+    /// where the data are stored
+    std::string mDataDir;
+
+    /// mode
+    PlayMode replayMode_;
+
+    std::string mLoggerConfigFile;
+
+Q_SIGNALS:
+    /// @todo Documentation
+    void play(road_time_t timeToPlay, road_time_t actualTime, bool direction);
+    /// @todo Documentation
+    void stopfile();
+    /// @todo Documentation
+    void displayStateSig(DbtPlyEngineState * state, float speed);
+    /// @todo Documentation
+    void timeMinMax(road_time_t tMin, road_time_t tMax);
+    /// @todo Documentation
+    void curReplayTime(road_time_t time);
+
+public Q_SLOTS:
+    /// @todo Documentation
+    void engReceiver();
+    /// @todo Documentation
+    void changeDirection(bool reverse);
+    /// @todo Documentation
+    void tMinMax(road_time_t tMin, road_time_t tMax);
+
+    /// @todo Documentation
+    void playEvent();
+    /// @todo Documentation
+    void pauseEvent();
+    /// @todo Documentation
+    void stopEvent();
+    /// @todo Documentation
+    void speedUpEvent();
+    /// @todo Documentation
+    void speedDownEvent();
+};
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_DBTPLYENGINE_H
Index: tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyEngineStateChart.h
===================================================================
--- tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyEngineStateChart.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyEngineStateChart.h	(revision 368)
@@ -0,0 +1,122 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Elie Al Alam <firstname.surname@utc.fr>
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    April, 2007
+/// @version $Id: DbtPlyEngineStateChart.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief DbitePlayer state machine.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_DBTPLYENGINESTATECHART_H
+#define DEF_PACPUS_DBTPLYENGINESTATECHART_H
+
+#include <QString>
+
+#include <Pacpus/DbitePlayer/DbitePlayerConfig.h>
+
+namespace pacpus {
+
+class DbtPlyEngine;
+
+////////////////////////////////////////////////////////////////////////////////
+class DBITE_PLAYER_API DbtPlyEngineState
+{
+public:
+    /// @todo Documentation
+    virtual ~DbtPlyEngineState();
+    
+    /// @todo Documentation
+    virtual void play(DbtPlyEngine & engine);
+    /// @todo Documentation
+    virtual void pause(DbtPlyEngine & engine);
+    /// @todo Documentation
+    virtual void stop(DbtPlyEngine & engine);
+    
+    /// @todo Documentation
+    virtual void speedUp(DbtPlyEngine & engine);
+    /// @todo Documentation
+    virtual void speedDown(DbtPlyEngine & engine);
+    
+    /// @todo Documentation
+    virtual bool isPlaying();
+    
+    /// @todo Documentation
+    virtual QString toString() const = 0;
+
+protected:
+    /// @todo Documentation
+    DbtPlyEngineState();
+};
+
+////////////////////////////////////////////////////////////////////////////////
+class DBITE_PLAYER_API PlayingState
+        : public DbtPlyEngineState
+{
+public:
+    /// @todo Documentation
+    virtual void pause(DbtPlyEngine & engine);
+    /// @todo Documentation
+    virtual void stop(DbtPlyEngine & engine);
+    
+    /// @todo Documentation
+    virtual bool isPlaying();
+    
+    /// @todo Documentation
+    virtual QString toString() const;
+    /// @todo Documentation
+    static DbtPlyEngineState * getInstance();
+
+private:
+    PlayingState();
+    static PlayingState mInstance;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+/// State class when player is on pause.
+class DBITE_PLAYER_API PausedState
+        : public DbtPlyEngineState
+{
+public:
+    /// @todo Documentation
+    virtual void play(DbtPlyEngine & engine);
+    /// @todo Documentation
+    virtual void stop(DbtPlyEngine & engine);
+    
+    /// @todo Documentation
+    virtual QString toString() const;
+    /// @todo Documentation
+    static DbtPlyEngineState * getInstance();
+
+private:
+    PausedState();
+    static PausedState mInstance;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+/// State class when player is stopped.
+class DBITE_PLAYER_API StoppedState
+        : public DbtPlyEngineState
+{
+public:
+    /// @todo Documentation
+    virtual void play(DbtPlyEngine & engine);
+    
+    /// @todo Documentation
+    virtual QString toString() const;
+    /// @todo Documentation
+    static DbtPlyEngineState * getInstance();
+
+private:
+    StoppedState();
+    static StoppedState mInstance;
+};
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_DBTPLYENGINESTATECHART_H
Index: tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyFileManager.h
===================================================================
--- tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyFileManager.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyFileManager.h	(revision 368)
@@ -0,0 +1,169 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Elie Al Alam <firstname.surname@utc.fr>
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    April, 2007
+/// @version $Id: DbtPlyFileManager.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief DbitePlayer file manager.
+///
+/// Detailed description.
+///
+/// @todo Manage a vector of dbite files and update the functions
+///      playModen and configureComponent to support this funtionnality.
+///      Put the type of data that has just been replayed in a protected 
+///      variable of the abstract class in order to the derived class can
+///      know what to do.
+/// @todo Complete the function playMode2.
+/// @todo Make the variable kMaxPendingTimeFromEngineMicrosecs a property.
+
+#ifndef DEF_PACPUS_DBTPLYFILEMANAGER_H
+#define DEF_PACPUS_DBTPLYFILEMANAGER_H
+
+#include <Pacpus/DbitePlayer/DbitePlayerConfig.h>
+#include <Pacpus/DbitePlayer/DbtPlyEngine.h>
+#include <Pacpus/kernel/road_time.h>
+#include <Pacpus/kernel/ComponentBase.h>
+#include <Pacpus/kernel/DbiteFile.h>
+
+#include <QString>
+#include <QThread>
+#include <string>
+
+class QSemaphore;
+
+namespace pacpus
+{
+
+class DbtPlyEngine;
+
+/// XML config properties:
+///     dbt             PATH(S) path to DBT data file(s), separated by pipe symbol '|', relative to datadir property of DbtPlyEngine
+///         e.g. dbt="gps/ublox.dbt|gps/ublox2.dbt"
+///     ui              INT     graphical user interface (GUI) window number
+///         e.g. ui="0"
+///     verbose         INT     verbosity level
+///         e.g. verbose="1"
+/// @see DbtPlyEngine
+class DBITE_PLAYER_API DbtPlyFileManager
+    : public QThread // FIXME: remove QThread
+    , public ComponentBase
+{
+    Q_OBJECT
+
+public:
+    /// constructor
+    DbtPlyFileManager(QString name);
+    /// destructor
+    virtual ~DbtPlyFileManager();
+
+    /// the player replays only the last data that has not been yet replayed
+    /// @todo Rename
+    void playMode1(road_time_t tDbt, bool reverse);
+    /// the player replays all the data that have not been yet replayed
+    /// @todo Rename
+    void playMode2(road_time_t tDbt, bool reverse);
+
+    /// virtual method: call when new DBT data are replayed
+    virtual void processData(road_time_t time, road_timerange_t timeRange, void * data) = 0;
+    /// @todo Documentation
+    virtual void displayUI();
+
+    /// 3 Virtual methods relative to the ComponentBase inheritance
+    virtual COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config);
+    /// @todo Documentation
+    virtual void startActivity();
+    /// @todo Documentation
+    virtual void stopActivity();
+
+    /// The loop of the thread
+    virtual void run();
+
+public Q_SLOTS:
+    /// slot activated by the engine when it computes new DBT time
+    void playData(road_time_t tDbt,road_time_t tNow, bool reverse);
+
+    /// put the file descriptor to the beginning of the file
+    void beginfile();
+
+Q_SIGNALS:
+    /// signal sent to the engine to provide to it the tmin and tmax of the file
+    void tMinMaxIs(road_time_t tmin, road_time_t tmax);
+
+protected:
+    /// Verbosity level
+    int mVerbose;
+
+    /// a pointer on the player engine
+    boost::shared_ptr<DbtPlyEngine> mEngine;
+
+    QStringList getDbiteFilenameList() const;
+
+    /// The directory where the DBT file is located
+    QString mDbtDataPath;
+
+    /// @todo Documentation
+    struct dbtStruct
+    {
+        /// Data buffer
+        char * buffer;
+        /// Acquisition time
+        road_time_t t;
+        /// Acquisition timerange
+        road_timerange_t tr;
+    };
+
+    /// @todo Documentation
+    struct dbtStructFile
+    {
+        /// the DBT file descriptor
+        pacpus::DbiteFile * pfile;
+        /// the buffer where the data are stored after the reading and the associated time, timerange and file descriptor
+        dbtStruct cur;
+        /// the previous DBT data, these ones that must be processed
+        dbtStruct toProcess;
+    };
+
+    /// @todo Documentation
+    QList<dbtStructFile> dbt_;
+    /// @todo Documentation
+    int dbtIndex_;
+
+private:
+    /// @todo Documentation
+    bool processDbtFileHdfile(dbtStructFile & dbtFile, pacpus::DbiteFile::ReadDirection direction);
+
+private:
+    /// dbt property value
+    std::string dbtProperty_;
+    /// @todo Documentation
+    QStringList mDbtFilenameList;
+
+    /// reading backward?
+    bool reverse_;
+
+    /// the estimated DBT time sent by the engine and computed relatively to the state of the player
+    road_time_t timeToRead_;
+
+    /// The mode of replay
+    /// @see playMode1, playMode2 methods
+    int mode_;
+
+    /// The minimum and maximum time of the data contained in the file
+    road_time_t tMin_, tMax_;
+
+    /// the synchronization semaphore with the engine
+    QSemaphore * sync_;
+
+    /// For statistics purpose - delta time between the instant when the tDbt is computed and the instant when it is
+    /// taken into account by the file manager
+    int deltaTDbtTab_[1000];
+    int deltaTDbtTabLoop_;
+};
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_DBTPLYFILEMANAGER_H
Index: tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyTrigger.h
===================================================================
--- tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyTrigger.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyTrigger.h	(revision 368)
@@ -0,0 +1,73 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Elie Al Alam <firstname.surname@utc.fr>
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    April, 2007
+/// @version $Id: DbtPlyTrigger.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief DbitePlayer trigger.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_DBTPLYTRIGGER_H
+#define DEF_PACPUS_DBTPLYTRIGGER_H
+
+#include <Pacpus/DbitePlayer/DbitePlayerConfig.h>
+#include <Pacpus/DbitePlayer/DbtPlyEngine.h>
+#include <Pacpus/kernel/ComponentBase.h>
+#include <Pacpus/kernel/ComponentFactory.h>
+
+#include <QString>
+#include <QThread>
+
+#ifdef WIN32
+#   include <windows.h>
+#   include <mmsystem.h>
+#endif
+
+namespace pacpus
+{
+
+class DbtPlyEngine;
+
+class DBITE_PLAYER_API DbtPlyTrigger
+    : public QThread // FIXME: remove QThread
+    , public ComponentBase
+{    
+    Q_OBJECT
+
+public:
+    /// @todo Documentation
+    DbtPlyTrigger(QString name);
+    /// @todo Documentation
+    virtual ~DbtPlyTrigger();
+
+    /// @todo Documentation
+    virtual ComponentBase::COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config);
+
+    /// @todo Documentation
+    virtual void run();
+
+Q_SIGNALS:
+    /// @todo Documentation
+    void triggerSig();
+
+protected:
+    virtual void addInputs();
+    virtual void addOutputs();
+
+    /// @todo Documentation
+    virtual void startActivity();
+    /// @todo Documentation
+    virtual void stopActivity();
+
+private:
+    boost::shared_ptr<DbtPlyEngine> mEngine;
+};
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_DBTPLYTRIGGER_H
Index: tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyUserInterface.h
===================================================================
--- tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyUserInterface.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/DbitePlayer/DbtPlyUserInterface.h	(revision 368)
@@ -0,0 +1,135 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Elie Al Alam <firstname.surname@utc.fr>
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    April, 2007
+/// @version $Id: DbtPlyUserInterface.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief DbitePlayer graphical user interface.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_DBTPLYUSERINTERFACE_H
+#define DEF_PACPUS_DBTPLYUSERINTERFACE_H
+
+#include <QWidget>
+
+#include <Pacpus/kernel/ComponentBase.h>
+#include <Pacpus/kernel/ComponentFactory.h>
+#include <Pacpus/DbitePlayer/DbitePlayerConfig.h>
+#include <Pacpus/DbitePlayer/DbtPlyFileManager.h>
+#include <Pacpus/DbitePlayer/DbtPlyEngine.h>
+
+class QButtonGroup;
+class QCheckBox;
+class QCloseEvent;
+class QGroupBox;
+class QLabel;
+class QLayout;
+class QPushButton;
+class QSlider;
+class QTableWidget;
+
+namespace pacpus
+{
+    
+class DbtPlyEngine;
+class DbtPlyEngineState;
+
+class DBITE_PLAYER_API DbtPlyUserInterface
+    : public QWidget
+    , public ComponentBase
+{
+    Q_OBJECT
+
+public:
+    /// Constructor.
+    ///
+    /// @param name component name
+    /// @see ComponentBase::ComponentBase(QString)
+    DbtPlyUserInterface(QString name);
+
+    /// Destructor.
+    ~DbtPlyUserInterface();
+
+    /// @returns time slider value
+    int getTime();
+
+    /// sets time slider value to 0
+    void resetTime();
+
+public Q_SLOTS:
+    /// Slot.
+    /// Refreshes the state of the player.
+    void displayStateSlot(DbtPlyEngineState * state, float speed);
+
+    /// Slot.
+    /// Displays the max and min times.
+    void displayMinMaxTime(road_time_t min, road_time_t max);
+
+    /// Slot.
+    /// Displays the current time of the player.
+    void displayTime(road_time_t time);
+    
+protected:
+    virtual void addInputs();
+    virtual void addOutputs();
+
+private:
+    /// Configures the component.
+    virtual COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config);
+
+    /// Starts component activity.
+    virtual void startActivity();
+
+    /// Stops component activity.
+    virtual void stopActivity();
+
+    void closeEvent(QCloseEvent * e);
+
+    void connectButtons();
+    void connectDisplay();
+    void connectSlider();
+    QLayout * createMainLayout();
+    QGroupBox * createControlGroupBox();
+    QGroupBox * createComponentListGroupBox();
+    void updateComponentList();
+    
+private:
+    boost::shared_ptr<DbtPlyEngine> mEngine;
+
+    QWidget * wTel_ ;
+    QButtonGroup * butGroup;
+    QPushButton * playBut ;
+    QPushButton * pauseBut ;
+    QPushButton * stopBut ;
+    QPushButton * speedUpBut ;
+    QPushButton * speedDownBut ;
+    QLabel * lab;
+    QCheckBox * rev;
+    QSlider * timeSlider;
+    QLabel * timeMinTitle;
+    QLabel * timeMinValue;
+    QLabel * timeMaxTitle;
+    QLabel * timeMaxValue;
+    QLabel * timeCurTitle;
+    QLabel * timeCurValue;
+
+    QTableWidget * componentTableWidget;
+
+    // current max time
+    road_time_t tMax_;
+    // current min time
+    road_time_t tMin_;
+    // current absolute time
+    road_time_t absTime_;
+    // current relative time
+    int relTime_;
+};
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_DBTPLYUSERINTERFACE_H
Index: tags/0.2.3/include/Pacpus/PacpusTools/AsyncWorkerBase.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/AsyncWorkerBase.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/AsyncWorkerBase.h	(revision 368)
@@ -0,0 +1,102 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Samuel Gosselin <firstname.surname@utc.fr>
+/// @date    December, 2012
+/// @version $Id: AsyncWorkerBase.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Async worker base class
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_ASYNC_WORKER_BASE_H
+#define DEF_PACPUS_ASYNC_WORKER_BASE_H
+
+//#include <boost/noncopyable.hpp>
+#include <Pacpus/PacpusTools/PacpusToolsConfig.h>
+#include <QObject>
+
+namespace pacpus
+{
+
+/// A simple base class for asynchronous workers able to partake in the
+/// Qt slot / signal mechanism
+///
+/// This class represents an asynchronous event-based worker able to receive and
+/// send Qt signals to other workers or threads. The rationale is to be able to
+/// define stateful objects that perform calculations asynchronously, triggered
+/// by external user-defined messages.
+class PACPUSTOOLS_API AsyncWorkerBase
+    : public QObject
+    //, private boost::noncopyable
+{
+    Q_OBJECT
+    Q_DISABLE_COPY(AsyncWorkerBase)
+
+public:
+    /// Constructor.
+      AsyncWorkerBase();
+
+    /// Destructor.
+    virtual ~AsyncWorkerBase();
+
+    /// Starts the worker by creating a new thread for it, and calling the setup() virtual method. */
+    void start();
+
+    /// Terminates the worker as soon as there are no more requests pending and its current processing
+    /// is finished.
+    ///
+    /// This method tries to end the worker gracefully. All pending signals sent before the stop() request will
+    /// be honored.
+    /// It is safe to call this method from any thread.
+    ///
+    ///  @param autoDelete if true, deletes the worker as soon as its event loop has finished processing.
+    void stop(bool autoDelete);
+
+    /// @returns @b true if the worker is active, @b false otherwise.
+    bool isActive() const
+    {
+        return active_;
+    }
+
+    Q_SIGNALS:
+       /// @todo Documentation
+       void finished();
+       /// @todo Documentation
+       void stopped();
+
+    protected:
+       /// @todo Documentation
+       virtual void setup();
+       /// @todo Documentation
+       virtual void process();
+       /// @todo Documentation
+       virtual void cleanup();
+
+    /// Returns true if the worker is stopping.
+       bool isStopping() const { return stopping_; }
+
+    private Q_SLOTS:
+      /// @todo Documentation
+      void doSetup();
+      /// @todo Documentation
+      void doFinish();
+
+    private:
+    /// Ends the worker, asking the underlying thread to terminate
+    ///
+    /// This method signals the end of processing and requests the underlying thread to terminate. Actual termination
+    /// will occur as soon as all pending signals (including those that may come from other workers during the
+    /// finish request handling) have been processed.
+      void finish();
+
+      // Attributes
+      bool active_;
+      bool stopping_;
+  };
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_ASYNC_WORKER_BASE_H
Index: tags/0.2.3/include/Pacpus/PacpusTools/BinaryDecoder.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/BinaryDecoder.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/BinaryDecoder.h	(revision 368)
@@ -0,0 +1,1394 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    July, 2008
+/// @version $Id: BinaryDecoder.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Extracts data of specified type in a string.
+///
+/// Purpose:    Extract data of specified type in a string (char *)
+/// Usage:
+///     bool xDecodeToXXX(T* result, const char * data, const unsigned int startBit, const unsigned int length)
+///     => x = format (i:Intel, Little Endian)
+///                   (m:Motorola, Big Endian)
+///     => XXX = type of return value
+///                   (Bool = bool)
+///                   (I8 = char - 8 bits)
+///                   (UI8 = unsigned char - 8 bits)
+///                   (I16 = short - 16 bits)
+///                   (UI16 = unsigned short - 16 bits)
+///                   (I32 = long - 32 bits)
+///                   (UI32 = unsigned long - 32 bits)
+///                   (I64 = long long - 64 bits)
+///                   (UI16 = unisgned long long - 64 bits)
+///
+///     ex: inline bool mDecodeToUI16(r, str, 8, 12);
+
+#ifndef BINARYDECODER_H
+#define BINARYDECODER_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif // __cplusplus
+
+#include "PacpusToolsConfig.h"  
+  
+#include <stdio.h>
+
+//////////////////////////////////////////////////////////////////////////
+// print the data in the hexadecimal format in the console
+inline void displayData(const unsigned char * data, const unsigned long length, const int id)
+{
+    printf("\ndata = ");
+    for (unsigned int i = 0;i< length;++i )
+        printf("%02x ",data[i]);
+    printf(" dlc = %ld ID = 0x%x\n", length, id);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// for Big Endian - Motorola coding
+//------------------------------------------------------------------------
+// return true if the signal is spread on more than 1 byte
+// ie if length is greater than ((startBit%8) + 1)
+// example:
+//   7654 3210
+// 0 .... ..||
+// 1 |||| ....
+// startBit is 1 and the length is 8: result gives (1%8)+1 = 2 < length(=6)
+inline bool mSpreadOnMoreThan1Byte(const unsigned int startBit, const unsigned int length)
+{
+    if ( (length  > (startBit & 0x07) + 1) ) {
+        return true;
+    } else {
+        return false;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// for Little Endian - Intel coding
+//------------------------------------------------------------------------
+// return true if the signal is spread on more than 1 byte
+// ie if length is greater than 8-(startBit%8)
+// example:
+//   7654 3210
+// 0 ||.. ....
+// 1 .... ||||
+// startBit is 6 and the length is 6: result gives 8-((6%8)) = 2 < length(=6)
+inline bool iSpreadOnMoreThan1Byte(const unsigned int startBit, const unsigned int length)
+{
+    if ( length  > 8 - (startBit & 0x07) ) {
+        return true;
+    } else {
+        return false;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// for Big Endian - Motorola coding
+//------------------------------------------------------------------------
+// return true if the signal is spread on more than 2 bytes
+// ie if (length - ((startBit%8) + 1) is greater than 8
+// example:
+//   7654 3210
+// 0 .... ...|
+// 1 |||| ||||
+// 2 ||.. ....
+// the start bit is 0 and the length is 11: result gives 11 - (0%8+1) = 10 (>8)
+//////////////////////////////////////////////////////////////////////////
+inline bool mSpreadOnMoreThan2Bytes(const unsigned int startBit, const unsigned int length)
+{
+    if ( length - ((startBit & 0x07) + 1) > 8 )
+        return true;
+    else
+        return false;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// for Little Endian - Intel coding
+//------------------------------------------------------------------------
+// return true if the signal is spread on more than 2 bytes
+// ie if (length - (8 - startBit)) is greater than 8
+// example:
+//   7654 3210
+// 0 |... ....
+// 1 |||| ||||
+// 2 .... ..||
+// the start bit is 7 and the length is 11: result gives 11 - (8 - 7) = 10 (>8)
+//////////////////////////////////////////////////////////////////////////
+inline bool iSpreadOnMoreThan2Bytes(const unsigned int startBit, const unsigned int length)
+{
+    if ( length - (8 - (startBit & 0x07)) > 8 )
+        return true;
+    else
+        return false;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// for Big Endian - Motorola coding
+//------------------------------------------------------------------------
+// return true if the signal is spread on more than 4 bytes
+// ie if length is greater than ((startBit%8) + 1)
+// example:
+//   7654 3210
+// 0 .... ..||
+// 1 |||| ||||
+// 2 |||| ||||
+// 3 |||| ||||
+// 4 |||. ....
+// startBit is 1 and the length is 29: result gives 29 - ((1%8)+1) = 27 (> 24)
+inline bool mSpreadOnMoreThan4Bytes(const unsigned int startBit, const unsigned int length)
+{
+    return (3*8) < (length - ((startBit & 0x07) + 1));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// for Little Endian - Intel coding
+//------------------------------------------------------------------------
+// return true if the signal is spread on more than 4 bytes
+// ie if length is greater than 8-(startBit%8)
+// example:
+//   7654 3210
+// 0 ||.. ....
+// 1 |||| ||||
+// 2 |||| ||||
+// 3 |||| ||||
+// 4 .... ..||
+// startBit is 6 and the length is 28: result gives 28 - (8-((6%8))) = 26  (>24)
+inline bool iSpreadOnMoreThan4Bytes(const unsigned int startBit, const unsigned int length)
+{
+    return (3*8) < (length - (8 - (startBit & 0x07)));
+}
+
+//////////////////////////////////////////////////////////////////////////
+// return a 8-bits shifted-left mask corresponding to the length parameter
+// ex: shift = 2 and length = 3
+// mask will be 0b00011100
+inline unsigned char getShiftMask8(const unsigned int shift, const unsigned int length)
+{
+    unsigned char mask;
+    switch (length)
+    {
+    case 1: mask = 0x01; break;
+    case 2: mask = 0x03; break;
+    case 3: mask = 0x07; break;
+    case 4: mask = 0x0F; break;
+    case 5: mask = 0x1F; break;
+    case 6: mask = 0x3F; break;
+    case 7: mask = 0x7F; break;
+    case 8: mask = 0xFF; break;
+    default: mask = 0; break;
+    }
+    return mask << shift;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// return a 8-bits mask corresponding to the length parameter with bit order decreasing
+// ex: startBit = 2 and length = 3
+// mask will be 0b00000111
+inline unsigned char getMask8( const unsigned int length )
+{
+    unsigned char mask;
+    switch (length) {
+    case 1: mask = 0x01; break;
+    case 2: mask = 0x03; break;
+    case 3: mask = 0x07; break;
+    case 4: mask = 0x0F; break;
+    case 5: mask = 0x1F; break;
+    case 6: mask = 0x3F; break;
+    case 7: mask = 0x7F; break;
+    case 8: mask = 0xFF; break;
+    default: mask = 0; break;
+    }
+    return mask;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// return a 16-bits shifted-left mask corresponding to the length parameter
+inline unsigned short getShiftMask16(const unsigned int shift, const unsigned int length)
+{
+    unsigned short mask;
+    switch (length) {
+    case 1: mask = 0x0001; break;
+    case 2: mask = 0x0003; break;
+    case 3: mask = 0x0007; break;
+    case 4: mask = 0x000F; break;
+    case 5: mask = 0x001F; break;
+    case 6: mask = 0x003F; break;
+    case 7: mask = 0x007F; break;
+    case 8: mask = 0x00FF; break;
+    case 9: mask = 0x01FF; break;
+    case 10: mask = 0x03FF; break;
+    case 11: mask = 0x07FF; break;
+    case 12: mask = 0x0FFF; break;
+    case 13: mask = 0x1FFF; break;
+    case 14: mask = 0x3FFF; break;
+    case 15: mask = 0x7FFF; break;
+    case 16: mask = 0xFFFF; break;
+    default: mask = 0; break;
+    }
+    return mask << shift;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// return a 16-bits mask corresponding to the length parameter with bit order decreasing
+inline unsigned short getMask16( const unsigned int length )
+{
+    unsigned short mask;
+    switch (length) {
+    case 1: mask = 0x0001; break;
+    case 2: mask = 0x0003; break;
+    case 3: mask = 0x0007; break;
+    case 4: mask = 0x000F; break;
+    case 5: mask = 0x001F; break;
+    case 6: mask = 0x003F; break;
+    case 7: mask = 0x007F; break;
+    case 8: mask = 0x00FF; break;
+    case 9: mask = 0x01FF; break;
+    case 10: mask = 0x03FF; break;
+    case 11: mask = 0x07FF; break;
+    case 12: mask = 0x0FFF; break;
+    case 13: mask = 0x1FFF; break;
+    case 14: mask = 0x3FFF; break;
+    case 15: mask = 0x7FFF; break;
+    case 16: mask = 0xFFFF; break;
+    default: mask = 0; break;
+    }
+    return mask;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// return a 32-bits shifted-left mask corresponding to the length parameter
+inline unsigned long getShiftMask32(const unsigned int shift, const unsigned int length)
+{
+    unsigned long mask;
+    switch (length) {
+    case 1: mask = 0x00000001; break;
+    case 2: mask = 0x00000003; break;
+    case 3: mask = 0x00000007; break;
+    case 4: mask = 0x0000000F; break;
+    case 5: mask = 0x0000001F; break;
+    case 6: mask = 0x0000003F; break;
+    case 7: mask = 0x0000007F; break;
+    case 8: mask = 0x000000FF; break;
+    case 9: mask = 0x000001FF; break;
+    case 10: mask = 0x000003FF; break;
+    case 11: mask = 0x000007FF; break;
+    case 12: mask = 0x00000FFF; break;
+    case 13: mask = 0x00001FFF; break;
+    case 14: mask = 0x00003FFF; break;
+    case 15: mask = 0x00007FFF; break;
+    case 16: mask = 0x0000FFFF; break;
+    case 17: mask = 0x0001FFFF; break;
+    case 18: mask = 0x0003FFFF; break;
+    case 19: mask = 0x0007FFFF; break;
+    case 20: mask = 0x000FFFFF; break;
+    case 21: mask = 0x001FFFFF; break;
+    case 22: mask = 0x003FFFFF; break;
+    case 23: mask = 0x007FFFFF; break;
+    case 24: mask = 0x00FFFFFF; break;
+    case 25: mask = 0x01FFFFFF; break;
+    case 26: mask = 0x03FFFFFF; break;
+    case 27: mask = 0x07FFFFFF; break;
+    case 28: mask = 0x0FFFFFFF; break;
+    case 29: mask = 0x1FFFFFFF; break;
+    case 30: mask = 0x3FFFFFFF; break;
+    case 31: mask = 0x7FFFFFFF; break;
+    case 32: mask = 0xFFFFFFFF; break;
+    default: mask = 0; break;
+    }
+    return mask << shift;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// return a 32-bits mask corresponding to the length parameter with bit order decreasing
+inline unsigned long getMask32( const unsigned int length )
+{
+    unsigned long mask;
+    switch (length) {
+    case 1: mask = 0x00000001; break;
+    case 2: mask = 0x00000003; break;
+    case 3: mask = 0x00000007; break;
+    case 4: mask = 0x0000000F; break;
+    case 5: mask = 0x0000001F; break;
+    case 6: mask = 0x0000003F; break;
+    case 7: mask = 0x0000007F; break;
+    case 8: mask = 0x000000FF; break;
+    case 9: mask = 0x000001FF; break;
+    case 10: mask = 0x000003FF; break;
+    case 11: mask = 0x000007FF; break;
+    case 12: mask = 0x00000FFF; break;
+    case 13: mask = 0x00001FFF; break;
+    case 14: mask = 0x00003FFF; break;
+    case 15: mask = 0x00007FFF; break;
+    case 16: mask = 0x0000FFFF; break;
+    case 17: mask = 0x0001FFFF; break;
+    case 18: mask = 0x0003FFFF; break;
+    case 19: mask = 0x0007FFFF; break;
+    case 20: mask = 0x000FFFFF; break;
+    case 21: mask = 0x001FFFFF; break;
+    case 22: mask = 0x003FFFFF; break;
+    case 23: mask = 0x007FFFFF; break;
+    case 24: mask = 0x00FFFFFF; break;
+    case 25: mask = 0x01FFFFFF; break;
+    case 26: mask = 0x03FFFFFF; break;
+    case 27: mask = 0x07FFFFFF; break;
+    case 28: mask = 0x0FFFFFFF; break;
+    case 29: mask = 0x1FFFFFFF; break;
+    case 30: mask = 0x3FFFFFFF; break;
+    case 31: mask = 0x7FFFFFFF; break;
+    case 32: mask = 0xFFFFFFFF; break;
+    default: mask = 0; break;
+    }
+    return mask;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// return a 64-bits mask corresponding to the length parameter with bit order decreasing
+inline unsigned long long getMask64( const unsigned int length )
+{
+    unsigned long long mask;
+    switch (length) {
+    case 1: mask = 0x0000000000000001ULL; break;
+    case 2: mask = 0x0000000000000003ULL; break;
+    case 3: mask = 0x0000000000000007ULL; break;
+    case 4: mask = 0x000000000000000FULL; break;
+    case 5: mask = 0x000000000000001FULL; break;
+    case 6: mask = 0x000000000000003FULL; break;
+    case 7: mask = 0x000000000000007FULL; break;
+    case 8: mask = 0x00000000000000FFULL; break;
+    case 9: mask = 0x00000000000001FFULL; break;
+    case 10: mask = 0x00000000000003FFULL; break;
+    case 11: mask = 0x00000000000007FFULL; break;
+    case 12: mask = 0x0000000000000FFFULL; break;
+    case 13: mask = 0x0000000000001FFFULL; break;
+    case 14: mask = 0x0000000000003FFFULL; break;
+    case 15: mask = 0x0000000000007FFFULL; break;
+    case 16: mask = 0x000000000000FFFFULL; break;
+    case 17: mask = 0x000000000001FFFFULL; break;
+    case 18: mask = 0x000000000003FFFFULL; break;
+    case 19: mask = 0x000000000007FFFFULL; break;
+    case 20: mask = 0x00000000000FFFFFULL; break;
+    case 21: mask = 0x00000000001FFFFFULL; break;
+    case 22: mask = 0x00000000003FFFFFULL; break;
+    case 23: mask = 0x00000000007FFFFFULL; break;
+    case 24: mask = 0x0000000000FFFFFFULL; break;
+    case 25: mask = 0x0000000001FFFFFFULL; break;
+    case 26: mask = 0x0000000003FFFFFFULL; break;
+    case 27: mask = 0x0000000007FFFFFFULL; break;
+    case 28: mask = 0x000000000FFFFFFFULL; break;
+    case 29: mask = 0x000000001FFFFFFFULL; break;
+    case 30: mask = 0x000000003FFFFFFFULL; break;
+    case 31: mask = 0x000000007FFFFFFFULL; break;
+    case 32: mask = 0x00000000FFFFFFFFULL; break;
+    case 33: mask = 0x00000001FFFFFFFFULL; break;
+    case 34: mask = 0x00000003FFFFFFFFULL; break;
+    case 35: mask = 0x00000007FFFFFFFFULL; break;
+    case 36: mask = 0x0000000FFFFFFFFFULL; break;
+    case 37: mask = 0x0000001FFFFFFFFFULL; break;
+    case 38: mask = 0x0000003FFFFFFFFFULL; break;
+    case 39: mask = 0x0000007FFFFFFFFFULL; break;
+    case 40: mask = 0x000000FFFFFFFFFFULL; break;
+    case 41: mask = 0x000001FFFFFFFFFFULL; break;
+    case 42: mask = 0x000003FFFFFFFFFFULL; break;
+    case 43: mask = 0x000007FFFFFFFFFFULL; break;
+    case 44: mask = 0x00000FFFFFFFFFFFULL; break;
+    case 45: mask = 0x00001FFFFFFFFFFFULL; break;
+    case 46: mask = 0x00003FFFFFFFFFFFULL; break;
+    case 47: mask = 0x00007FFFFFFFFFFFULL; break;
+    case 48: mask = 0x0000FFFFFFFFFFFFULL; break;
+    case 49: mask = 0x0001FFFFFFFFFFFFULL; break;
+    case 50: mask = 0x0003FFFFFFFFFFFFULL; break;
+    case 51: mask = 0x0007FFFFFFFFFFFFULL; break;
+    case 52: mask = 0x000FFFFFFFFFFFFFULL; break;
+    case 53: mask = 0x001FFFFFFFFFFFFFULL; break;
+    case 54: mask = 0x003FFFFFFFFFFFFFULL; break;
+    case 55: mask = 0x007FFFFFFFFFFFFFULL; break;
+    case 56: mask = 0x00FFFFFFFFFFFFFFULL; break;
+    case 57: mask = 0x01FFFFFFFFFFFFFFULL; break;
+    case 58: mask = 0x03FFFFFFFFFFFFFFULL; break;
+    case 59: mask = 0x07FFFFFFFFFFFFFFULL; break;
+    case 60: mask = 0x0FFFFFFFFFFFFFFFULL; break;
+    case 61: mask = 0x1FFFFFFFFFFFFFFFULL; break;
+    case 62: mask = 0x3FFFFFFFFFFFFFFFULL; break;
+    case 63: mask = 0x7FFFFFFFFFFFFFFFULL; break;
+    case 64: mask = 0xFFFFFFFFFFFFFFFFULL; break;
+    default: mask = 0; break;
+    }
+    return mask;
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Returns a 64-bits shifted-left mask corresponding to the length parameter
+inline unsigned long long getShiftMask64(const unsigned int shift, const unsigned int length)
+{
+    unsigned long long mask;
+    mask = getMask64( length );
+    mask <<= shift;
+    return mask;
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Big Endian - Motorola coding
+inline bool mDecodeToBool(const unsigned char * data, const unsigned int startBit)
+{
+    return (data[startBit>>3] & getShiftMask8(startBit&0x07,1)) != 0;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// to test ?
+inline bool mDecodeToUI64(unsigned long long * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length > 64) {
+        *result = 0;
+        return false;
+    }
+
+    if (length == 64) {
+        // only work if data are correctly byte-aligned
+        unsigned char c[8];   // c[0] = MSB
+        for (int i = 0 ; i < 8 ; i++)
+            c[i] = data[(startBit>>3) + i];
+
+        unsigned long long temp = 0;
+        for (int i = 0 ; i < 8 ; i++)
+            temp += (c[i] << ( 56 - (8*i) ) );
+        *result = temp;
+        return true;
+    } else {
+        unsigned char c[8], mask[8], nbBits[8]; // MSB = c[0]
+        nbBits[0] = (startBit & 0x07)+1;
+        mask[0] = getMask8( nbBits[0] );
+        c[0] = data[startBit>>3] & mask[0];
+        unsigned short nbBitsIncrement = nbBits[0];
+        for (int i = 1 ; i < 8 ; i++) {
+            nbBits[i] = static_cast<unsigned char>( (length - nbBitsIncrement) < 8 ? length - nbBitsIncrement : 8 );
+            nbBitsIncrement += nbBits[i];
+            mask[i] = getShiftMask8(8 - nbBits[i],nbBits[i]);
+            c[i] = data[(startBit>>3) + i] & mask[i];
+        }
+
+        unsigned long long temp = 0;
+        for (int i = 0 ; i < 8 ; i++)
+            temp += (c[i] << ( 56 - (8*i) ) );
+        *result = temp >> (56 + (startBit&0x07) + 1 - length);
+        return true;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// to test ?
+inline bool mDecodeToI64(long long *result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length>64) {
+        *result = 0;
+        return false;
+    }
+
+    if (length == 64) {
+        // only work if data are correctly byte-aligned
+        unsigned char c[8];   // c[0] = MSB
+        for (int i = 0 ; i < 8 ; i++)
+            c[i] = data[(startBit>>3) + i];
+
+        for (int i = 0 ; i < 8 ; i++)
+            *result += (c[i] << ( 56 - (8*i) ) );
+
+        // need to be signed ??
+        return true;
+    } else {
+        unsigned char c[8], mask[8], nbBits[8]; // MSB = c[0]
+        nbBits[0] = (startBit & 0x07)+1;
+        mask[0] = getMask8( nbBits[0] );
+        c[0] = data[startBit>>3] & mask[0];
+        unsigned short nbBitsIncrement = nbBits[0];
+        for (int i = 1 ; i < 8 ; i++) {
+            nbBits[i] = static_cast<unsigned char>( (length - nbBitsIncrement) < 8 ? (length - nbBitsIncrement) : 8 );
+            nbBitsIncrement += nbBits[i];
+            mask[i] = getShiftMask8(8 - nbBits[i],nbBits[i]);
+            c[i] = data[(startBit>>3) + i] & mask[i];
+        }
+        unsigned long long temp = 0;
+        for (int i = 0 ; i < 8 ; i++)
+            temp += (c[i] << ( 56 - (8*i) ) );
+        temp >>= (56 + (startBit&0x07) + 1 - length);
+
+        if ( temp & getShiftMask64(length-1,1) )
+            // do the two's complement to get the signed value if the msb=1
+            *result = -1 * ( ( (~temp) + 1 ) & getMask64(length) );
+        else
+            *result = temp;
+
+        return true;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// ok
+inline bool mDecodeToUI32(unsigned long *result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length>32) {
+        *result = 0;
+        return false;
+    }
+
+    // verify that the frame is not spread in 5 bytes
+    if (mSpreadOnMoreThan4Bytes(startBit, length)) {
+        // decode in a 64-bits integer
+        unsigned long long temp;
+        if (mDecodeToUI64(&temp,data,startBit,length))
+        {
+            *result = static_cast<unsigned long> (temp);
+            return true;
+        } else {
+            *result = 0;
+            return false;
+        }
+    } else {
+        if (length == 32) {
+            // only work if data are correctly byte-aligned
+            unsigned char c1, c2, c3, c4;
+            c1 = data[startBit>>3];
+            c2 = data[(startBit>>3) + 1];
+            c3 = data[(startBit>>3) + 2];
+            c4 = data[(startBit>>3) + 3];
+
+            *result = (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
+            return true;
+        } else {
+            unsigned char c[4], mask[4], nbBits[4]; // MSB = c[0]
+            nbBits[0] = (startBit & 0x07)+1;
+            nbBits[1] = static_cast<unsigned char>( (length - nbBits[0]) < 8 ? length - nbBits[0] : 8 );
+            nbBits[2] = static_cast<unsigned char>( (length - nbBits[0] - nbBits[1]) < 8 ? (length - nbBits[0] - nbBits[1]) : 8 );
+            nbBits[3] = static_cast<unsigned char>( (length - nbBits[0] - nbBits[1] - nbBits[2]) < 8 ? (length - nbBits[0] - nbBits[1] - nbBits[2]) : 8 );
+            mask[0] = getMask8( nbBits[0] );
+            mask[1] = getShiftMask8(8 - nbBits[1],nbBits[1]);
+            mask[2] = getShiftMask8(8 - nbBits[2],nbBits[2]);
+            mask[3] = getShiftMask8(8 - nbBits[3],nbBits[3]);
+            c[0] = data[startBit>>3] & mask[0];
+            c[1] = data[(startBit>>3) + 1] & mask[1];
+            c[2] = data[(startBit>>3) + 2] & mask[2];
+            c[3] = data[(startBit>>3) + 3] & mask[3];
+            *result = ( (c[0]<<24) + (c[1]<<16) + (c[2]<<8) + c[3]) >> (24 + (startBit&0x07) + 1 - length);
+            return true;
+        }
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// ok
+inline bool mDecodeToI32(long *result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length>32) {
+        *result = 0;
+        return false;
+    }
+
+    // verify that the frame is not spread in 5 bytes
+    if (mSpreadOnMoreThan4Bytes(startBit, length)) {
+        // decode in a 64-bits integer
+        long long temp;
+        if (mDecodeToI64(&temp,data,startBit,length))
+        {
+            *result = static_cast<long>(temp);
+            return true;
+        } else {
+            *result = 0;
+            return false;
+        }
+    } else {
+        if (length == 32)
+        {
+            // only work if data are correctly byte-aligned
+            unsigned char c1, c2, c3, c4;
+            c1 = data[startBit>>3];
+            c2 = data[(startBit>>3) + 1];
+            c3 = data[(startBit>>3) + 2];
+            c4 = data[(startBit>>3) + 3];
+
+            *result = (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
+            return true;
+        } else {
+            unsigned char c[4], mask[4], nbBits[4]; // MSB = c[0]
+            nbBits[0] = (startBit & 0x07) + 1;
+            nbBits[1] = static_cast<unsigned char>( (length - nbBits[0]) < 8 ? length - nbBits[0] : 8 );
+            nbBits[2] = static_cast<unsigned char>( (length - nbBits[0] - nbBits[1]) < 8 ? (length - nbBits[0] - nbBits[1]) : 8 );
+            nbBits[3] = static_cast<unsigned char>( (length - nbBits[0] - nbBits[1] - nbBits[2]) < 8 ? length - nbBits[0] - nbBits[1] - nbBits[2] : 8 );
+            mask[0] = getMask8( nbBits[0] );
+            mask[1] = getShiftMask8(8 - nbBits[1],nbBits[1]);
+            mask[2] = getShiftMask8(8 - nbBits[2],nbBits[2]);
+            mask[3] = getShiftMask8(8 - nbBits[3],nbBits[3]);
+            c[0] = data[startBit>>3] & mask[0];
+            c[1] = data[(startBit>>3) + 1] & mask[1];
+            c[2] = data[(startBit>>3) + 2] & mask[2];
+            c[3] = data[(startBit>>3) + 3] & mask[3];
+
+            unsigned long temp = ( (c[0]<<24) + (c[1]<<16) + (c[2]<<8) + c[3]) >> (24 + (startBit&0x07) + 1 - length);
+            if (temp & getShiftMask32(length-1, 1))
+                // do the two's complement to get the signed value if the msb=1
+                *result = -1 * ( ( (~temp) + 1 ) & getMask32(length) );
+            else
+                *result = temp;
+            return true;
+        }
+    }
+}
+
+
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// ok
+inline bool mDecodeToUI16(unsigned short * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length > 16) {
+        *result = 0;
+        return false;
+    }
+
+    // verify that the frame is not spread in 3 bytes
+    if (mSpreadOnMoreThan2Bytes(startBit, length)) {
+        // decode in a 32-bits integer
+        unsigned long temp;
+        if (mDecodeToUI32(&temp,data,startBit,length)) {
+            *result = static_cast<unsigned short>(temp);
+            return true;
+        } else {
+            *result = 0;
+            return false;
+        }
+    } else {
+        if (length == 16) {
+            // only work if data are correctly byte-aligned
+            unsigned char LSB, MSB;
+            MSB = data[startBit>>3];
+            LSB = data[(startBit>>3) + 1];
+
+            *result = ( (MSB << 8) + LSB );
+            return true;
+        } else {
+            unsigned char LSB, MSB, maskMSB, maskLSB, nbBitsMSB, nbBitsLSB;
+            nbBitsMSB = (startBit & 0x07) + 1;  // the number of bits contained in the MSB
+            nbBitsLSB = static_cast<unsigned char>(length - nbBitsMSB);
+            maskMSB = getMask8( nbBitsMSB );
+            maskLSB = getShiftMask8(8 - nbBitsLSB , nbBitsLSB);
+            MSB = data[startBit>>3] & maskMSB;
+            LSB = data[(startBit>>3) + 1] & maskLSB;
+
+            *result = ( (MSB << 8) + LSB ) >> (8 + (startBit&0x07) + 1 - length);
+            return true;
+        }
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// ok
+inline bool mDecodeToI16(short *result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length > 16) {
+        *result = 0;
+        return false;
+    }
+
+    // verify that the frame is not spread in 3 bytes
+    if (mSpreadOnMoreThan2Bytes(startBit, length)) {
+        // decode in a 32-bits integer
+        long temp;
+        if (mDecodeToI32(&temp, data, startBit, length)) {
+            *result = (short)temp;
+            return true;
+        } else  {
+            *result = 0;
+            return false;
+        }
+    } else {
+        // ok data are stored at most in 2 bytes
+        if (length == 16) {
+            // only work if data are correctly byte-aligned
+            unsigned char LSB, MSB;
+            MSB = data[startBit>>3];
+            LSB = data[(startBit>>3) + 1];
+            short temp = (MSB << 8) + LSB;
+
+            // Attention : a-t on besoin d'appliquer le signe ?
+            // n'est-il pas deja inclu dans la donn�e comme elle est correctement align�e sur l'octet ?
+            if (temp & 0x8000) {
+                // do the two's complement to get the signed value
+                *result = - ( ( (~temp) + 1 ) & 0xFFFF );
+            } else {
+                *result = temp;
+            }
+            return true;
+        } else {
+            unsigned char LSB, MSB, maskMSB, maskLSB, nbBitsMSB, nbBitsLSB;
+            nbBitsMSB = (startBit & 0x07) + 1;  // the number of bits contained in the MSB
+            nbBitsLSB = static_cast<unsigned char>(length - nbBitsMSB);
+            maskMSB = getMask8( nbBitsMSB );
+            maskLSB = getShiftMask8(8 - nbBitsLSB , nbBitsLSB);
+            MSB = data[startBit>>3] & maskMSB;
+            LSB = data[(startBit>>3) + 1] & maskLSB;
+            // assign the MSB and LSB char in the short integer value and right-shift
+            // to place the lsb to the bit 0
+            unsigned short temp = ( (MSB << 8) + LSB ) >> (8 + (startBit&0x07) + 1 - length);
+            if (temp & getShiftMask16(length-1,1))
+                // do the two's complement to get the signed value if the msb=1
+                *result = -1 * ( ( (~temp) + 1 ) & getMask16(length) );
+            else
+                *result = temp;
+            return true;
+        }
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// OK
+inline bool mDecodeToUI8(unsigned char * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length > 8) {
+        *result = 0;
+        return false;
+    }
+
+    // verify that the frame is not spread in 2 bytes
+    if (mSpreadOnMoreThan1Byte(startBit, length)) {
+        // decode in a 16-bit integer
+        unsigned short temp;
+        if ( mDecodeToUI16(&temp, data, startBit, length) ) {
+            *result = static_cast<unsigned char>(temp);
+            return true;
+        } else {
+            *result = 0;
+            return false;
+        }
+    } else {
+        // ok data is stored at most in 1 byte
+        unsigned char c;
+        
+		c = data[startBit>>3];                // >>3 <=> div 8
+        //c >>= (8-((startBit & 0x07)+1));      // &0x07 <=> modulo 8
+		c >>= (startBit & 0x07) - (length - 1);    // &0x07 <=> modulo 8
+		*result = c & getMask8( length );
+
+        return true;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// OK
+inline bool mDecodeToI8(char * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length > 8) {
+        *result = 0;
+        return false;
+    }
+
+    // verify that the frame is not spread in 2 bytes
+    if (mSpreadOnMoreThan1Byte(startBit, length)) {
+        // decode in a 16-bit integer
+        short temp;
+        if ( mDecodeToI16(&temp, data, startBit, length) ) {
+            *result = static_cast<char>(temp);
+            return true;
+        } else {
+            *result = 0;
+            return false;
+        }
+    }
+    else {
+        // ok data is stored at most in 1 byte
+        char c;
+        c = data[startBit>>3];
+        c >>= (8-((startBit & 0x07)+1));
+        c = c & getMask8( length );
+
+        // a-t-on besoin d'appliquer le signe dans le cas ou length = 8
+        // la donnee est correctement alignee sur l'octet donc le signe est peut-etre compris
+        if (c & getShiftMask8(length-1,1))
+            // do the two's complement to get the signed value if the msb=1
+            *result = - ( ( (~c) + 1 ) & getMask8(length) );
+        else
+            *result = c;
+        return true;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// ok
+inline bool iDecodeToBool(const unsigned char * data, const unsigned int startBit)
+{
+    mDecodeToBool(data, startBit);
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// pas de depassement possible - la trame CAN fait 64 bits max
+// gerer le signe
+inline bool iDecodeToUI64(unsigned long long * /*result*/, const unsigned char * /*data*/, const unsigned int /*startBit*/, const unsigned int /*length*/)
+{
+    return true;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// pas de depassement possible - la trame CAN fait 64 bits max
+// gerer le signe
+inline bool iDecodeToI64(long long * /*result*/, const unsigned char * /*data*/, const unsigned int /*startBit*/, const unsigned int /*length*/)
+{
+    return true;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// gerer le depassement sur plus de 4 octets : necessite la fonction de decodage 64 bits
+// verifier le depassement avant cette ligne :   if (length == 32)
+inline bool iDecodeToUI32(unsigned long * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length>32) {
+        *result = 0;
+        return false;
+    }
+
+    if (length == 32) {
+        // only work if length == 32
+        unsigned char c1, c2, c3, c4;
+        c4 = data[startBit>>3];       // LSB
+        c3 = data[(startBit>>3) + 1];
+        c2 = data[(startBit>>3) + 2];
+        c1 = data[(startBit>>3) + 3]; // MSB
+
+        *result = (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
+        return true;
+    } else {
+        // todo
+        *result = 0;
+        return false;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// gerer le signe
+// gerer le depassement sur plus de 4 octets : necessite la fonction de decodage 64 bits
+// verifier le depassement avant cette ligne :   if (length == 32)
+inline bool iDecodeToI32(long * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length>32) {
+        *result = 0;
+        return false;
+    }
+
+    if (length == 32) {
+        // only work if length == 32
+        unsigned char c1, c2, c3, c4;
+        c4 = data[startBit>>3];       // LSB
+        c3 = data[(startBit>>3) + 1];
+        c2 = data[(startBit>>3) + 2];
+        c1 = data[(startBit>>3) + 3]; // MSB
+
+        *result = (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
+        return true;
+    } else {
+        // todo
+        *result = 0;
+        return false;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// gerer le depassement sur plus de 2 octets
+// verifier le depassement avant cette ligne :   if (length == 16)
+inline bool iDecodeToUI16(unsigned short * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length > 16) {
+        *result = 0;
+        return false;
+    }
+
+    if (length == 16) {
+        // only work if length == 16
+        unsigned char LSB, MSB;
+        LSB = data[startBit>>3];
+        MSB = data[(startBit>>3) + 1];
+
+        *result = (MSB << 8) + LSB;
+        return true;
+    } else {
+        // TODO
+        *result = 0;
+        return false;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// gerer le signe
+// gerer le depassement sur plus de 2 octets
+// verifier le depassement avant cette ligne :   if (length == 16)
+// manque le decalage
+inline bool iDecodeToI16(short * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length > 16) {
+        *result = 0;
+        return false;
+    }
+
+    if (length == 16) {
+        // only work if length == 16
+        unsigned char LSB, MSB;
+        LSB = data[startBit>>3];
+        MSB = data[(startBit>>3) + 1];
+
+        *result = (MSB << 8) + LSB;
+        return true;
+    } else {
+        // todo
+        *result = 0;
+        return false;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// OK
+inline bool iDecodeToUI8(unsigned char * result,const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length > 8) {
+        *result = 0;
+        return false;
+    }
+
+    // verify that the frame is not spread in 2 bytes
+    if (iSpreadOnMoreThan1Byte(startBit, length)) {
+        // decode in a 16-bit integer
+        unsigned short temp;
+        if ( iDecodeToUI16(&temp, data, startBit, length) ) {
+            // and cast in an 8 bit integer
+            *result = (unsigned char) temp;
+            return true;
+        } else {
+            *result = 0;
+            return true;
+        }
+    } else {
+        // ok data is stored at most in 1 byte
+        unsigned char c;
+        c = data[startBit>>3];
+        c >>= (startBit & 0x07);
+        *result = c & getMask8( length );
+
+        return true;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// OK
+inline bool iDecodeToI8(char * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length > 8) {
+        *result = 0;
+        return false;
+    }
+
+    // verify that the frame is not spread in 2 bytes
+    if (iSpreadOnMoreThan1Byte(startBit, length)) {
+        // decode in a 16-bit integer
+        short temp;
+        if ( iDecodeToI16(&temp, data, startBit, length) ) {
+            // and cast in an 8 bit integer
+            *result = static_cast<char>(temp);
+            return true;
+        } else {
+            *result = 0;
+            return true;
+        }
+    } else {
+        // ok data is stored at most in 1 byte
+        char c;
+        c = data[startBit>>3];     // >>3 <=> div 8
+        c >>= (startBit & 0x07);    // &0x07 <=> modulo 8
+        c = c & getMask8( length );
+        if (c & getShiftMask8(length-1,1))
+            // do the two's complement to get the signed value if the msb=1
+            *result = - ( ( (~c) + 1 ) & getMask8(length) );
+        else
+            *result = c;
+
+        return true;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// ok
+inline bool mobileyemDecodeToUI16(unsigned short * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length>16){ *result = 0; return false; }
+
+    // verify that the frame is not spread in 3 bytes
+    /*    if (mSpreadOnMoreThan2Bytes(startBit, length))
+    {
+    // decode in a 32-bits integer
+    unsigned long temp;
+    if (mDecodeToUI32(&temp,data,startBit,length))
+    {
+    *result = static_cast<unsigned short>(temp);
+    return true;
+    } else {
+    *result = 0;
+    return false;
+    }
+    }
+    else
+    {*/
+    if (length == 16) {
+        // only work if data are correctly byte-aligned
+        unsigned char LSB, MSB;
+        MSB = data[startBit>>3];
+        LSB = data[(startBit>>3) + 1];
+
+        *result = ( (MSB << 8) + LSB );
+        return true;
+    } else {
+        unsigned char LSB, MSB, maskMSB, maskLSB, nbBitsMSB, nbBitsLSB;
+        nbBitsMSB = (startBit & 0x07) + 1;  // the number of bits contained in the MSB
+        nbBitsLSB = static_cast<unsigned char>(length - nbBitsMSB);
+        maskMSB = getMask8( nbBitsMSB );
+        maskLSB = getShiftMask8(8 - nbBitsLSB , nbBitsLSB);
+        MSB = data[startBit>>3] & maskMSB;
+        LSB = data[(startBit>>3) + 1] & maskLSB;
+
+        *result = ( (MSB << 8) + LSB ) >> (8 + (startBit&0x07) + 1 - length);
+        return true;
+    }
+    //}
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// ok
+inline bool mobileyemDecodeToI16(short *result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length>16) { *result = 0; return false; }
+
+    // verify that the frame is not spread in 3 bytes
+    /*    if (mSpreadOnMoreThan2Bytes(startBit, length))
+    {
+    // decode in a 32-bits integer
+    long temp;
+    if (mDecodeToI32(&temp, data, startBit, length)) {
+    *result = (short)temp;
+    return true;
+    } else  {
+    *result = 0;
+    return false;
+    }
+    }
+    else  // ok data are stored at most in 2 bytes
+    {*/
+    if (length == 16)
+    {
+        // only work if data are correctly byte-aligned
+        unsigned char LSB, MSB;
+        MSB = data[startBit>>3];
+        LSB = data[(startBit>>3) + 1];
+        short temp = (MSB << 8) + LSB;
+
+        // Attention : a-t on besoin d'appliquer le signe ?
+        // n'est-il pas deja inclu dans la donn�e comme elle est correctement align�e sur l'octet ?
+        if (temp & 0x8000) {
+            // do the two's complement to get the signed value
+            *result = - ( ( (~temp) + 1 ) & 0xFFFF );
+        } else {
+            *result = temp;
+        }
+        return true;
+    } else {
+        unsigned char LSB, MSB, maskMSB, maskLSB, nbBitsMSB, nbBitsLSB;
+        nbBitsMSB = (startBit & 0x07)+1;  // the number of bits contained in the MSB
+        nbBitsLSB = static_cast<unsigned char>(length - nbBitsMSB);
+        maskMSB = getMask8( nbBitsMSB );
+        maskLSB = getShiftMask8(8 - nbBitsLSB , nbBitsLSB);
+        MSB = data[startBit>>3] & maskMSB;
+        LSB = data[(startBit>>3) + 1] & maskLSB;
+        // assign the MSB and LSB char in the short integer value and right-shift
+        // to place the lsb to the bit 0
+        unsigned short temp = ( (MSB << 8) + LSB ) >> (8 + (startBit&0x07) + 1 - length);
+        if (temp & getShiftMask16(length-1,1))
+            // do the two's complement to get the signed value if the msb=1
+            *result = -1 * ( ( (~temp) + 1 ) & getMask16(length) );
+        else
+            *result = temp;
+        return true;
+    }
+    //}
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// OK
+inline bool mobileyemDecodeToUI8(unsigned char * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length>8) { *result = 0; return false; }
+
+    // verify that the frame is not spread in 2 bytes
+    if (mSpreadOnMoreThan1Byte(startBit, length))
+    {
+        // decode in a 16-bit integer
+        unsigned short temp;
+        if ( mDecodeToUI16(&temp, data, startBit, length) ) {
+            *result = static_cast<unsigned char>(temp);
+            return true;
+        } else {
+            *result = 0;
+            return true;
+        }
+    }
+    else // ok data is stored at most in 1 byte
+    {
+        unsigned char c;
+        c = data[startBit>>3];                // >>3 <=> div 8
+        c >>= (8-((startBit & 0x07)+1));      // &0x07 <=> modulo 8
+        *result = c & getMask8( length );
+
+        return true;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Big Endian - Motorola coding
+// OK
+inline bool mobileyemDecodeToI8(char * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length>8) { *result = 0; return false; }
+
+    // verify that the frame is not spread in 2 bytes
+    if (mSpreadOnMoreThan1Byte(startBit, length))
+    {
+        // decode in a 16-bit integer
+        short temp;
+        if ( mDecodeToI16(&temp, data, startBit, length) ) {
+            *result = static_cast<char>(temp);
+            return true;
+        } else {
+            *result = 0;
+            return true;
+        }
+    }
+    else // ok data is stored at most in 1 byte
+    {
+        char c;
+        c = data[startBit>>3];
+        c >>= (8-((startBit & 0x07)+1));
+        c = c & getMask8( length );
+
+        // a-t-on besoin d'appliquer le signe dans le cas ou length = 8
+        // la donnee est correctement alignee sur l'octet donc le signe est peut-etre compris
+        if (c & getShiftMask8(length-1,1))
+            // do the two's complement to get the signed value if the msb=1
+            *result = - ( ( (~c) + 1 ) & getMask8(length) );
+        else
+            *result = c;
+        return true;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// OK, mais gerer le depassement sur plus de 2 octets
+inline bool mobileyeiDecodeToUI16(unsigned short * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length>16) {
+        *result = 0;
+        return false;
+    }
+
+    if (length == 16) {
+        // only work if length == 16
+        unsigned char LSB, MSB;
+        LSB = data[startBit>>3];
+        MSB = data[(startBit>>3) + 1];
+
+        *result = (unsigned short)((MSB << 8) + LSB);
+        return true;
+    } else {
+        unsigned char LSB, MSB, maskMSB, maskLSB, nbBitsMSB, nbBitsLSB;
+
+        nbBitsLSB = static_cast<unsigned char>(8*((startBit>>3) + 1) - startBit);
+        nbBitsMSB = static_cast<unsigned char>(length - nbBitsLSB);
+        maskLSB = getShiftMask8(8 - nbBitsLSB , nbBitsLSB);
+        maskMSB = getMask8( nbBitsMSB );
+        LSB = data[startBit>>3] & maskLSB;
+        MSB = data[(startBit>>3) + 1] & maskMSB;
+
+        *result = (unsigned short)((MSB<<8) + (LSB>>(startBit-8*(startBit>>3))));
+
+        return true;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// gerer le signe
+// gerer le depassement sur plus de 2 octets
+// verifier le depassement avant cette ligne :   if (length == 16)
+// manque le decalage
+inline bool mobileyeiDecodeToI16(short * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length > 16) {
+        *result = 0;
+        return false;
+    }
+
+    if (length == 16) {
+        // only work if length == 16
+        unsigned char LSB, MSB;
+        LSB = data[startBit>>3];
+        MSB = data[(startBit>>3) + 1];
+
+        short temp = (MSB << 8) + LSB;
+
+        if (temp & 0x8000) {
+            // do the two's complement to get the signed value
+            *result = - ( ( (~temp) + 1 ) & 0xFFFF );
+        } else {
+            *result = temp;
+        }
+        return true;
+    } else {
+        unsigned char LSB, MSB, maskMSB, maskLSB, nbBitsMSB, nbBitsLSB;
+
+        nbBitsLSB = static_cast<unsigned char>(8*((startBit>>3) + 1) - startBit);
+        nbBitsMSB = static_cast<unsigned char>(length - nbBitsLSB);
+        maskLSB = getShiftMask8(8 - nbBitsLSB , nbBitsLSB);
+        maskMSB = getMask8( nbBitsMSB );
+        LSB = data[startBit>>3] & maskLSB;
+        MSB = data[(startBit>>3) + 1] & maskMSB;
+
+        unsigned short temp = (unsigned short)((MSB<<8) + (LSB>>(startBit-8*(startBit>>3))));
+
+        if (temp & getShiftMask16(length-1,1))
+            // do the two's complement to get the signed value if the msb=1
+            *result = -1 * ( ( (~temp) + 1 ) & getMask16(length) );
+        else
+            *result = temp;
+        return true;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// OK
+inline bool mobileyeiDecodeToUI8(unsigned char * result,const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length>8) { *result = 0; return false; }
+
+    // verify that the frame is not spread in 2 bytes
+    if (iSpreadOnMoreThan1Byte(startBit, length))
+    {
+        // decode in a 16-bit integer
+        unsigned short temp;
+        if ( iDecodeToUI16(&temp, data, startBit, length) )
+        {
+            // and cast in an 8 bit integer
+            *result = (unsigned char) temp;
+            return true;
+        }
+        else
+        {
+            *result = 0;
+            return true;
+        }
+    }
+    else // ok data is stored at most in 1 byte
+    {
+        unsigned char c;
+        c = data[startBit>>3];
+        c >>= (startBit & 0x07);
+        *result = c & getMask8( length );
+
+        return true;
+    }
+
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Little Endian - Intel coding
+// OK
+inline bool mobileyeiDecodeToI8(char * result, const unsigned char * data, const unsigned int startBit, const unsigned int length)
+{
+    if (length > 8) {
+        *result = 0;
+        return false;
+    }
+
+    // verify that the frame is not spread in 2 bytes
+    if (iSpreadOnMoreThan1Byte(startBit, length)) {
+        // decode in a 16-bit integer
+        short temp;
+        if ( iDecodeToI16(&temp, data, startBit, length) ) {
+            // and cast in an 8 bit integer
+            *result = (char)(temp);
+            return true;
+        } else {
+            *result = 0;
+            return true;
+        }
+    } else {
+        // ok data is stored at most in 1 byte
+        char c;
+        c = data[startBit>>3];     // >>3 <=> div 8
+        c >>= (startBit & 0x07);    // &0x07 <=> modulo 8
+        c = c & getMask8( length );
+        if (c & getShiftMask8(length-1,1))
+            // do the two's complement to get the signed value if the msb=1
+            *result = - ( ( (~c) + 1 ) & getMask8(length) );
+        else
+            *result = c;
+
+        return true;
+    }
+}
+
+inline int mobileyeDecodeCAN(unsigned char *data,unsigned char bigEndian,unsigned int startBit,unsigned int length,unsigned char Signed)
+{
+    int value;
+    unsigned short ustemp16 = 0;
+    unsigned char uctemp8 = 0;
+    short stemp16 = 0;
+    char ctemp8 = 0;
+
+    if(bigEndian) {
+        if(length>8){
+            if(Signed){mobileyemDecodeToI16(&stemp16,data, startBit, length);value = stemp16;}
+            else {mobileyemDecodeToUI16(&ustemp16,data, startBit, length);value = ustemp16;}}
+        else if(Signed) {mobileyemDecodeToI8(&ctemp8,data, startBit, length);value = ctemp8;}
+        else {mobileyemDecodeToUI8(&uctemp8,data, startBit, length);value = uctemp8;}
+    } else {
+        if(length>8){
+            if(Signed) {mobileyeiDecodeToI16(&stemp16,data, startBit, length);value = stemp16;}
+            else {mobileyeiDecodeToUI16(&ustemp16,data, startBit, length);value = ustemp16;}}
+        else if(Signed) {mobileyeiDecodeToI8(&ctemp8,data, startBit, length);value = ctemp8;}
+        else {mobileyeiDecodeToUI8(&uctemp8,data, startBit, length);value = uctemp8;}
+    }
+
+    return value;
+}
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+#endif // BINARYDECODER_H
Index: tags/0.2.3/include/Pacpus/PacpusTools/PacpusSerialPort.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/PacpusSerialPort.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/PacpusSerialPort.h	(revision 368)
@@ -0,0 +1,77 @@
+/*********************************************************************
+// created:    2013/07/10
+// filename:   PacpusSerialPort.h
+//
+// author:     Julien Moras
+//
+// version:    $Id: $
+//
+// purpose:    This class defines a Qt 5.1 driver for serial port
+*********************************************************************/
+#ifndef _PacpusSerialPort_H_
+#define _PacpusSerialPort_H_
+
+#include <QtSerialPort/QSerialPort>
+#include <QtSerialPort/QSerialPortInfo>
+#include <QThread>
+
+#include <Pacpus/kernel/ComponentBase.h>
+
+namespace pacpus {
+
+class PacpusSerialPort
+    : public QObject
+    , public ComponentBase
+{
+    Q_OBJECT
+    
+public:
+    typedef enum {
+        ASCII,
+        BINARY
+    } DataMode;
+
+    PacpusSerialPort(QString name);
+    ~PacpusSerialPort();
+
+protected:
+    void startActivity(); /*!< to start the processing thread */
+    void stopActivity(); /*!< to stop the processing thread */
+    ComponentBase::COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config);
+
+    virtual void addInputs();
+    virtual void addOutputs();
+    void processInputFrame(const QByteArray &);
+
+private Q_SLOTS:
+    void readData();
+
+private:
+    QThread       thread_;
+
+    QSerialPort * serialPort;
+
+    QString portName;
+    QSerialPort::Direction direction;
+    QSerialPort::BaudRate baudRate;
+    QSerialPort::DataBits dataBits;
+    QSerialPort::Parity parity;
+    QSerialPort::StopBits stopBits;
+    QSerialPort::FlowControl flowControl;
+    QSerialPort::DataErrorPolicy errorPolicy;
+    DataMode dataMode;
+
+    QByteArray buffer;
+
+    QString sepChar;
+    QString startChar;
+    QString stopChar;
+
+    int minPacketSize;
+
+    bool log;
+};
+
+} // end namespace
+
+#endif
Index: tags/0.2.3/include/Pacpus/PacpusTools/PeriodicWorker.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/PeriodicWorker.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/PeriodicWorker.h	(revision 368)
@@ -0,0 +1,71 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Samuel Gosselin <firstname.surname@utc.fr>
+/// @date    December, 2012
+/// @version $Id: PeriodicWorker.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Periodic worker base class
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_PERIODIC_WORKER_H
+#define DEF_PACPUS_PERIODIC_WORKER_H
+
+#include <Pacpus/PacpusTools/AsyncWorkerBase.h>
+#include <Pacpus/PacpusTools/PacpusToolsConfig.h>
+
+class QTimer;
+
+namespace pacpus
+{
+
+/// @brief A simple base class for periodic worker.
+/// 
+/// @example
+/// To use the PeriodicWorker, simply inherit from this class when creating your worker.
+/// ~~~
+/// class MyWorker
+///     : public PeriodicWorkder
+/// {
+/// public:
+///     void doWork() { std::cout << "Hey, I'm working!" << std::endl; }
+/// };
+///
+/// // Do its work every second.
+/// MyWorker worker;
+/// worker.startWork(1000);
+/// ~~~
+class PACPUSTOOLS_API PeriodicWorker
+    : public AsyncWorkerBase
+  {
+    Q_OBJECT
+    public:
+      /// Ctor of PeriodicWorker.
+      PeriodicWorker();
+      
+      /// Dtor of PeriodicWorker.
+      virtual ~PeriodicWorker();
+      
+    /// Start the periodic worker.
+    /// @param msec Period in mseconds.
+      void startWork(int msec);
+      
+    /// Stop the periodic worker, but do not delete it.
+      void stopWork();
+      
+    public Q_SLOTS:
+        /// Do the work.
+        /// This method need to be implemented in the subclasses, it will be called
+        /// each time the timer has reached its period.
+      virtual void doWork() = 0;
+      
+    private:
+      QTimer* mHeartbeat;
+  };
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_PERIODIC_WORKER_H
Index: tags/0.2.3/include/Pacpus/PacpusTools/PosixShMem.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/PosixShMem.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/PosixShMem.h	(revision 368)
@@ -0,0 +1,51 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: PosixShMem.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_POSIXSHMEM_H
+#define DEF_PACPUS_POSIXSHMEM_H
+
+#include <QSharedMemory>
+#include <QSystemSemaphore>
+
+#include "ShMemBase.h"
+#include "PacpusToolsConfig.h"
+
+/// @todo Documentation
+class PACPUSTOOLS_API PosixShMem
+        : public ShMemBase
+{
+public:
+    /// @todo Documentation
+    PosixShMem(const char * name, int size);
+    /// @todo Documentation
+    virtual ~PosixShMem();
+
+    /// @todo Documentation
+    virtual void *read();
+    /// @todo Documentation
+    virtual void read(void * mem, int size);
+    /// @todo Documentation
+    virtual void write(void *data, int size, unsigned long offset = 0);
+    /// @todo Documentation
+    virtual bool wait(unsigned long timeout = 0);
+    /// @todo Documentation
+    virtual void lockMemory();
+    /// @todo Documentation
+    virtual void unlockMemory();
+
+private:
+    QSystemSemaphore * event_;
+    QSharedMemory * memory_;
+};
+
+#endif // DEF_PACPUS_POSIXSHMEM_H
Index: tags/0.2.3/include/Pacpus/PacpusTools/ShMem.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/ShMem.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/ShMem.h	(revision 368)
@@ -0,0 +1,66 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    January, 2007
+/// @version $Id: ShMem.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_SHMEM_H
+#define DEF_PACPUS_SHMEM_H
+
+#include "PacpusToolsConfig.h"
+
+#ifdef WIN32
+#   include "Win32ShMem.h"
+/// Defines shared memory as a Windows shared memory
+#   define ShMemType Win32ShMem
+#else
+#   include "PosixShMem.h"
+/// Defines shared memory as a POSIX shared memory
+#   define ShMemType PosixShMem
+#endif
+
+namespace pacpus {
+
+/// Shared memory class.
+///
+/// Inherits from Win32ShMem on Windows system and from PosixShMem on Unix-like systems.
+class /*PACPUSTOOLS_API*/ ShMem
+    : public ShMemType
+{
+public:
+    /// Ctor of shared memory class.
+    ///
+    /// Creates a shared memory of size @b size and named @b name.
+    /// If a shared memory with the name @b name already exists, than
+    /// it will return object pointing to the same memory.
+    /// If this existing memory space has a size smaller than @b size,
+    /// a warning will be issued.
+    ///
+    /// @param name Name of the created shared memory space.
+    /// @param size Size of the created shared memory space in [bytes].
+    ShMem(const char * name, int size)
+        : ShMemType(name, size)
+    {
+    }
+
+    /// Dtor of shared memory class.
+    ///
+    /// Does nothing.
+    ~ShMem()
+    {
+    }
+
+protected:
+private:
+};
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_SHMEM_H
Index: tags/0.2.3/include/Pacpus/PacpusTools/ShMemBase.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/ShMemBase.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/ShMemBase.h	(revision 368)
@@ -0,0 +1,63 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: ShMemBase.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_SHMEMBASE_H
+#define DEF_PACPUS_SHMEMBASE_H
+
+#include "PacpusToolsConfig.h"
+
+/// Base class for shared memory objects.
+class PACPUSTOOLS_API ShMemBase
+{
+public:
+    /// Ctor
+    ShMemBase()
+    {
+    }
+
+    /// Dtor
+    virtual ~ShMemBase()
+    {
+    }
+
+    /// Use this method to get the data of the shared memory
+    virtual void *read() = 0; 
+
+    /// Use this method to write data in shared memory
+    virtual void write(void *data, int size, unsigned long offset = 0) = 0; 
+
+    /// Use this method to wait the incoming of new data
+    /// you can specify a timeout in ms to avoid infinite blocking or 0 (infinite)
+    /// @returns @b true if new data available before the timeout, @b false otherwise
+    virtual bool wait(unsigned long timeout = 0) = 0; 
+
+    /// To lock the access to the memory
+    virtual void lockMemory() = 0; 
+
+    /// To unlock the access to the memory
+    virtual void unlockMemory() = 0; 
+
+#ifdef WIN32
+    /// Return the event handle under Windows 
+    /// @todo ... under Linux ? 
+    virtual void * getEventIdentifier() = 0; 
+#endif 
+  
+protected:
+    /// @todo Documentation
+    void * shMem_;
+
+private:
+};
+
+#endif // DEF_PACPUS_SHMEMBASE_H
Index: tags/0.2.3/include/Pacpus/PacpusTools/SharedMemory.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/SharedMemory.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/SharedMemory.h	(revision 368)
@@ -0,0 +1,101 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    January, 2007
+/// @version $Id: ShMem.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef PACPUS_SHARED_MEMORY_H
+#define PACPUS_SHARED_MEMORY_H
+
+#include "PacpusToolsConfig.h"
+#include "ShMemBase.h"
+
+#include <Pacpus/kernel/deprecated.h>
+#include <Pacpus/predef/compiler.h>
+#include <Pacpus/predef/os.h>
+
+#if PACPUS_OS_WINDOWS
+/// Windows handle (opaque pointer) type definition
+typedef void * HANDLE;
+#elif PACPUS_OS_UNIX
+#   include <QSharedMemory>
+#   include <QSystemSemaphore>
+#endif
+
+#if PACPUS_COMP_MSVC
+#   pragma warning(push)
+#   pragma warning(disable: 4275)
+#endif // PACPUS_COMP_MSVC
+
+namespace pacpus
+{
+
+/// Shared memory class.
+class /*PACPUSTOOLS_API*/ SharedMemory
+    : public ShMemBase
+{
+public:
+    /// Ctor of shared memory class.
+    ///
+    /// Creates a shared memory of size @b size and named @b name.
+    /// If a shared memory with the name @b name already exists, than
+    /// it will return object pointing to the same memory.
+    /// If this existing memory space has a size smaller than @b size,
+    /// a warning will be issued.
+    ///
+    /// @param name Name of the created shared memory space.
+    /// @param size Size of the created shared memory space in [bytes].
+    SharedMemory(const char* name, int size);
+
+    /// Dtor of shared memory class.
+    virtual ~SharedMemory();
+
+    /// Returns pointer to shared memory
+    virtual void* read();
+    /// Copies a chunk of shared memory to dst buffer
+    virtual void read(void* dst, int size);
+
+    /// Use this method to write data in shared memory. Offset is given in bytes
+    virtual void write(void* data, int size, unsigned long offset = 0);
+
+    /// Use this method to wait the incoming of new data
+    /// you can specify a timeout in ms to avoid infinite blocking or 0 (infinite)
+    /// @returns @b true if new data available before the timeout, @b false otherwise
+    virtual bool wait(unsigned long timeout = 0);
+
+    /// Function that locks access to the shared memory
+    virtual void lockMemory();
+    /// Function that unlocks access to the shared memory
+    virtual void unlockMemory();
+
+    /// Returns event handle on Windows and NULL on Unix.
+    virtual void* getEventIdentifier();
+
+private:
+#if PACPUS_OS_WINDOWS
+    HANDLE semaphore_;
+    HANDLE shMemHandle_;
+    HANDLE event_;
+#elif PACPUS_OS_UNIX
+    QSystemSemaphore* event_;
+    QSharedMemory* memory_;
+#endif
+};
+
+// FIXME: rename references and remove
+PACPUS_DEPRECATED(typedef SharedMemory ShMem);
+
+} // namespace pacpus
+
+#if PACPUS_COMP_MSVC
+#   pragma warning(pop)
+#endif // PACPUS_COMP_MSVC
+
+#endif // PACPUS_SHARED_MEMORY_H
Index: tags/0.2.3/include/Pacpus/PacpusTools/Win32ShMem.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/Win32ShMem.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/Win32ShMem.h	(revision 368)
@@ -0,0 +1,72 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    January, 2007
+/// @version $Id: Win32ShMem.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Shared memory implementation for Windows.
+///
+/// Shared memory implementation for Windows.
+/// @todo Derive from a common base class. Same for @link PosixShMem @endlink.
+
+#ifndef DEF_PACPUS_WIN32SHMEM_H
+#define DEF_PACPUS_WIN32SHMEM_H
+
+#include "PacpusToolsConfig.h"
+#include "ShMemBase.h"
+
+/// Windows handle (opaque pointer) type definition
+/// 
+/// Forward declaration of typedefs is impossible.
+typedef void * HANDLE;
+
+#ifdef _MSC_VER
+#   pragma warning(push)
+#   pragma warning(disable: 4275)
+#endif // _MSC_VER
+
+namespace pacpus {
+
+/// Shared memory object for Windows.
+class PACPUSTOOLS_API Win32ShMem
+        : public ShMemBase
+{
+public:
+    /// Ctor
+    Win32ShMem(const char * name, int size);
+    /// Dtor
+    ~Win32ShMem();
+
+    /// @todo Documentation
+    virtual bool wait(unsigned long timeout = 0);
+    /// @todo Documentation
+    virtual void * read();
+    /// @todo Documentation
+    virtual void read(void * mem, int size);
+    /// @todo Documentation
+    virtual void write(void * data, int size, unsigned long offset = 0);
+    /// @todo Documentation
+    virtual void lockMemory();
+    /// @todo Documentation
+    virtual void unlockMemory();
+    /// @todo Documentation
+    virtual void * getEventIdentifier();
+
+protected:  
+
+private:
+    HANDLE semaphore_;
+    HANDLE shMemHandle_;
+    HANDLE event_;
+};
+
+} // namespace pacpus
+
+#ifdef _MSC_VER
+#   pragma warning(pop)
+#endif // _MSC_VER
+
+#endif // DEF_PACPUS_WIN32SHMEM_H
Index: tags/0.2.3/include/Pacpus/PacpusTools/filtering/bayes_filtering.hpp
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/filtering/bayes_filtering.hpp	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/filtering/bayes_filtering.hpp	(revision 368)
@@ -0,0 +1,92 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: bayes_filtering.hpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef __BAYES_FILTERING__
+#define __BAYES_FILTERING__
+
+#include "filter_exception.hpp"
+
+namespace filter {
+
+   /*!
+    * \enum Filters
+    * \brief Enumeration of bayes filters
+    */
+   enum Filters { KF, EKF, UKF, GSF, PF };
+
+
+    /*!
+    * \class BayesDynamicEquation 
+    * \brief This class describes a basic dynamic equation in bayes filtering scheme \n
+    * Class S describe the filter state \n
+    * Class I describe middle variable stored in the filter state \n 
+    * ( for exmaple in  particle scheme, the state vector (S) is a set of particle (I) ) \n   
+    */
+   template <class S, class I> class BayesDynamicEquation{
+     public :
+
+        /*!
+        * \brief virtual method where the a priori state vector must be computed
+        * \param in : the state vector at time k-1  
+        * \param out : the state vector at time k 
+        */  
+       virtual void Predict(S *in,S *out)=0;
+ 
+       /*!
+        * \brief virtual method where parameters of the dynamic equation must be evaluated 
+        * \param  s : the middle variable at time k-1 
+        */
+       virtual void EvaluateParameters(I *s)=0;
+
+        
+       /*!
+        * \brief Destructor 
+        */ 
+       virtual ~BayesDynamicEquation(){}
+
+   }; 
+
+
+    /*!
+    * \class BayesMeasureEquation
+    * \brief This class describes a basic measure equation in bayes filtering scheme \n
+    * Class S describe the filter state \n
+    * Class I describe middle variable stored in the filter state  \n
+    * ( for exmaple in  particle scheme, the state vector (S) is a set of particle (I) ) \n   
+    */
+   template <class S, class I> class BayesMeasureEquation{
+       public :
+
+       /*!
+        * \brief virtual method where parameters of the measure equation must be evaluated 
+        * \param s : the meedle variable at time k 
+        */
+        virtual void EvaluateParameters(I *s)=0;
+
+        /*!
+        * \brief virtual method where the a posteriori state vector must be computed
+        * \param in : the a priori state vector at time k  
+        * \param out : the a posteriori state vector at time k 
+        */      
+       virtual void Update(S *in,S *out)=0;
+
+       /*!
+        * \brief  Destructor 
+        */ 
+       virtual ~BayesMeasureEquation(){}
+
+   };
+
+} // namespace filter
+
+#endif // __BAYES_FILTERING__
Index: tags/0.2.3/include/Pacpus/PacpusTools/filtering/filter_exception.hpp
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/filtering/filter_exception.hpp	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/filtering/filter_exception.hpp	(revision 368)
@@ -0,0 +1,36 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: filter_exception.hpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef __FILTERING_EXECPTION_HPP__
+#define __FILTERING_EXECPTION_HPP__
+
+#include <stdexcept>
+
+namespace filter {
+
+   /*!
+    *  \class filter_error
+    *  \brief This class describes the filtering exception
+    */ 
+   class filter_error : public std::logic_error
+   {
+    public: 
+        /*!
+         * \brief Construtor 
+         */
+        filter_error (const std::string& what_arg) : logic_error( what_arg) {}
+   };
+
+} // namespace filter
+
+#endif // __FILTERING_EXECPTION_HPP__
Index: tags/0.2.3/include/Pacpus/PacpusTools/filtering/gaussian_sum_filtering.hpp
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/filtering/gaussian_sum_filtering.hpp	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/filtering/gaussian_sum_filtering.hpp	(revision 368)
@@ -0,0 +1,343 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: gaussian_sum_filtering.hpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef __GAUSSIAN_FILTERING_BASE__
+#define __GAUSSIAN_FILTERING_BASE__
+
+#include "kalman_filtering.hpp"
+#include "../math/pdf.hpp"
+
+#include <vector>
+
+namespace filter{
+
+namespace gaussiansum{
+
+   using namespace math;
+//   using namespace rng;
+   using namespace ublas;
+
+  /*!
+   * \class Gaussian
+   * \brief This class describes a basic weighted kalman state
+   */
+  class Gaussian : public filter::kalman::State{
+     public :
+
+     /*!
+      * \brief Constructor
+      * \param state_size : Size of the state vector 
+      * \param weight_ : Initial weight
+      */
+    Gaussian(const size_t &state_size, const double &weight_){
+       filter::kalman::State::Allocator(state_size);
+       weight=weight_;
+     }
+
+     /**
+      * \brief Constructor
+      * \param state_size : Size of the state vector 
+      */
+
+     Gaussian(const size_t &state_size){
+       filter::kalman::State::Allocator(state_size);
+       weight=0;
+     }
+
+     double weight; /*!< Weight of the Kalman state */
+
+/*
+    protected :*/
+
+//      Gaussian:weight(1){};
+  };
+
+
+  /*!
+   * \class GaussianSet
+   * \brief  This method describes a set of gaussians \n
+   *  A set of gaussains is reprented by a vector of weighted kalman state \n 
+   *  somes methods can be applied to the set of particles like :\n 
+   *  estimate computation, resampling scheme or normalization method \n
+   */
+  template<class G=Gaussian> class GaussianSet {
+    public :
+
+      /** Normalize the weights of gaussian states*/
+      void NormalizeWeights();
+
+      /*!
+      * \brief Allocate the set of gaussians  
+      * \param ngaussian : number of gaussians in the set
+      */  
+      void Allocator(const size_t &ngaussian);
+
+      /*!
+       * \brief Compute the estimate
+       *  \return Vector
+       */  
+      Vector Estimate();
+
+      /*!
+       * \brief Destructor 
+       */
+      ~GaussianSet(){}
+
+
+      std::vector<G>  gaussians; /*!< gaussian states */
+
+
+    };
+
+
+     template<class G> void GaussianSet<G>::NormalizeWeights(){
+        double sum=0;
+        for(typename std::vector<G>::iterator I=gaussians.begin();I!=gaussians.end();I++)
+          sum+=(*I).weight;
+
+        if(sum==0){throw filter_error("Gaussian set normalization weight sum =0");}
+        for(typename std::vector<G>::iterator I=gaussians.begin();I!=gaussians.end();I++)
+           (*I).weight/=sum;
+      }
+
+      
+      template<class G> void GaussianSet<G>::Allocator(const size_t &ngaussian){
+        gaussians.reserve(ngaussian);
+      } 
+
+     template<class G> Vector GaussianSet<G>::Estimate(){
+       Vector estimate = ZeroVector(gaussians[0].X.size());
+       for(typename std::vector<G>::iterator I=gaussians.begin();I!=gaussians.end();I++)
+         estimate+=(*I).X*(*I).weight;
+       return estimate;
+     }
+
+
+  /*!
+   * \class LinearDynamicEquation
+   * \brief This class describes a linear dynamic equation 
+   */
+  template <template <class> class S=GaussianSet, class G=Gaussian > class LinearDynamicEquation:public filter::kalman::LinearDynamicEquation<G>{
+   public :
+       /*!
+        * \brief virtual method where parameters of the dynamic equation must be  evaluated 
+        * \param s : weighted kalman state at time k-1
+        */
+        virtual void EvaluateParameters(G *s)=0;
+
+        /*!
+        * \brief virtual method where the a posteriori state vector must be computed
+        * \param in : the a posteriori set of gaussian at time k-1 
+        * \param out : the a priori set of gaussian at time k 
+        */  
+        virtual void Predict(S<G> *in,S<G> *out);
+
+       /*!
+        * \brief Destructor 
+        */
+        virtual ~LinearDynamicEquation(){}
+   };
+
+
+       template <template <class> class S, class G> void LinearDynamicEquation<S,G>::Predict(S<G> *in,S<G> *out){
+          for(size_t i=0;i<in->gaussians.size();i++){
+            EvaluateParameters(&in->gaussians[i]); 
+
+            out->gaussians[i].P= filter::kalman::LinearDynamicEquation<G>::_A*in->gaussians[i].P*Trans( filter::kalman::LinearDynamicEquation<G>::_A)
+                                 +filter::kalman::LinearDynamicEquation<G>::_B*filter::kalman::LinearDynamicEquation<G>::_Q*Trans(filter::kalman::LinearDynamicEquation<G>::_B);
+            out->gaussians[i].X= filter::kalman::LinearDynamicEquation<G>::_A*in->gaussians[i].X
+                                 +filter::kalman::LinearDynamicEquation<G>::_B*filter::kalman::LinearDynamicEquation<G>::_U;
+            out->gaussians[i].weight=in->gaussians[i].weight;
+          }
+      }
+
+
+  /*!
+   * \class NonLinearDynamicEquation
+   * \brief This class describes a non linear dynamic equation 
+   */
+   template <template <class> class S=GaussianSet, class G=Gaussian > class NonLinearDynamicEquation:public filter::kalman::NonLinearDynamicEquation<G>{
+   public :
+       /*!
+        * \brief virtual method where parameters of the dynamic equation must be  evaluated 
+        * \param s : weighted kalman state at time k-1
+        * f= \n
+        * F= \n
+        * G= \n
+        */
+        virtual void EvaluateParameters(G *s)=0;
+
+       /*!
+        * \brief virtual method where the a posteriori state vector must be computed
+        * \param in : the a posteriori set of gaussian at time k-1 
+        * \param out : the a priori set of gaussian at time k 
+        */  
+      virtual void Predict(S<G> *in,S<G> *out);
+
+      /*!
+       * \brief Destructor 
+       */
+      virtual ~NonLinearDynamicEquation(){}
+  };
+
+
+       template <template <class> class S, class G>  void NonLinearDynamicEquation<S,G>::Predict(S<G> *in,S<G> *out){
+        for(size_t i=0;i<in->gaussians.size();i++){
+            EvaluateParameters(&in->gaussians[i]); 
+
+            out->gaussians[i].P=filter::kalman::NonLinearDynamicEquation<G>::_F*in->gaussians[i].P*Trans(filter::kalman::NonLinearDynamicEquation<G>::_F)
+                                +filter::kalman::NonLinearDynamicEquation<G>::_G*filter::kalman::NonLinearDynamicEquation<G>::_Q*Trans(filter::kalman::NonLinearDynamicEquation<G>::_G);
+            out->gaussians[i].X=filter::kalman::NonLinearDynamicEquation<G>::_f;
+            out->gaussians[i].weight=in->gaussians[i].weight;
+         }
+      }
+
+  /*!
+   * \class LinearMeasureEquation
+   * \brief This class describes a linear measure equation 
+   */  
+   template <template <class> class S=GaussianSet, class G=Gau
+ssian >class LinearMeasureEquation:public filter::kalman::LinearMeasureEquation<G>{
+   public :
+
+        /*!
+        * \brief virtual method where parameters of the measure equation must be  evaluated 
+        * \param s : weighted kalman state at time k-1
+        */
+      virtual void EvaluateParameters(G *s)=0;
+     
+
+       /*!
+        * \brief virtual method where the a posteriori state vector must be computed
+        * \param in : the a priori set of gaussian at time k 
+        * \param out : the a posteriori set of gaussian at time k 
+        */  
+        virtual void Update(S<G> *in,S<G> *out);
+
+
+ 
+
+       /*! 
+        * \brief Destructor 
+        */ 
+        virtual ~LinearMeasureEquation(){};
+
+      protected :
+
+       /*!
+        * \brief virtual method where likelihood value for each particle is computed
+        * \param s :  a priori weighted kalman state at time k
+        * \return likelihood value
+        */
+        virtual double ZPDF(G *s);
+
+ };
+
+
+      template <template <class> class S, class G>  void LinearMeasureEquation<S,G>::Update(S<G> *in,S<G> *out){ 
+  
+         for(size_t i=0;i<in->gaussians.size();i++){
+            filter::kalman::LinearMeasureEquation<G>::_coherency=true;
+            EvaluateParameters(&in->gaussians[i]); 
+   
+           if(filter::kalman::LinearMeasureEquation<G>::_coherency){
+              filter::kalman::LinearMeasureEquation<G>::_K=in->gaussians[i].P*Trans(filter::kalman::LinearMeasureEquation<G>::_H) *
+                ( InvQR(filter::kalman::LinearMeasureEquation<G>::_H*in->gaussians[i].P*Trans(filter::kalman::LinearMeasureEquation<G>::_H)+filter::kalman::LinearMeasureEquation<G>::_R) );
+               out->gaussians[i].X=in->gaussians[i].X+filter::kalman::LinearMeasureEquation<G>::_K*(filter::kalman::LinearMeasureEquation<G>::_Z-filter::kalman::LinearMeasureEquation<G>::_H*in->gaussians[i].X);
+               out->gaussians[i].P=in->gaussians[i].P-filter::kalman::LinearMeasureEquation<G>::_K*filter::kalman::LinearMeasureEquation<G>::_H*in->gaussians[i].P;
+           }   
+        
+           out->gaussians[i].weigh=ZPDF(&in->gaussian[i])*in->gaussians[i].weight;
+
+         }
+
+         //out->NormalizeWeights();
+      }
+
+     template <template <class> class S, class G> double LinearMeasureEquation<S,G>::ZPDF(G *s){
+        Vector apvec=filter::kalman::LinearMeasureEquation<G>::_H*s->X;
+        Matrix apcov=filter::kalman::LinearMeasureEquation<G>::_H*s->P*Trans(filter::kalman::LinearMeasureEquation<G>::_H)+filter::kalman::LinearMeasureEquation<G>::_R;
+        Matrix apinv=InvQR(apcov);
+        double apdet=Det(apcov);
+        return (std::exp(-0.5*Dot(filter::kalman::LinearMeasureEquation<G>::_Z-apvec,apinv*(filter::kalman::LinearMeasureEquation<G>::_Z-apvec)))/
+               (std::sqrt(std::pow(2*M_PI,static_cast<int>(apvec.size()))*std::abs(apdet))));
+     }
+
+
+  /*!
+   * \class NonLinearMeasureEquation
+   * \brief This class describes a non linear measure equation 
+   */  
+ template <template <class> class S=GaussianSet, class G=Gaussian > class NonLinearMeasureEquation:public filter::kalman::NonLinearMeasureEquation<G>{
+   public :
+        /*!
+        * \brief virtual method where parameters of the measure equation must be  evaluated 
+        * \param s : weighted kalman state at time k-1
+        * h= \n
+        * H= \n
+        */
+        virtual void EvaluateParameters(G *s )=0;
+
+       /*!
+        * \brief virtual method where the a posteriori state vector must be computed
+        * \param in : the a priori set of gaussian at time k 
+        * \param out : the a posteriori set of gaussian at time k 
+        */  
+        virtual void Update(S<G> *in,S<G> *out);
+      
+       /*!
+        * \brief  destructor 
+        */
+        virtual ~NonLinearMeasureEquation(){}
+
+     protected :
+
+       /*!
+        * \brief virtual method where likelihood value for each particle is computed
+        * \param s :  a priori weighted kalman state at time k
+        * \return likelihood value
+        */
+        virtual  double ZPDF(G *s);
+
+  };
+
+     template <template <class> class S, class G> void NonLinearMeasureEquation<S,G>::Update(S<G> *in,S<G> *out){
+
+        for(size_t i=0;i<in->gaussians.size();i++){
+            filter::kalman::NonLinearMeasureEquation<G>::_coherency=true;
+            EvaluateParameters(&in->gaussians[i]); 
+
+            if(filter::kalman::NonLinearMeasureEquation<G>::_coherency){
+               filter::kalman::NonLinearMeasureEquation<G>::_K=in->gaussians[i].P*Trans(filter::kalman::NonLinearMeasureEquation<G>::_H)*(InvQR(filter::kalman::NonLinearMeasureEquation<G>::_H*in->gaussians[i].P*Trans(filter::kalman::NonLinearMeasureEquation<G>::_H) + filter::kalman::NonLinearMeasureEquation<G>::_R));
+                out->gaussians[i].X=in->gaussians[i].X+filter::kalman::NonLinearMeasureEquation<G>::_K*(filter::kalman::NonLinearMeasureEquation<G>::_Z-filter::kalman::NonLinearMeasureEquation<G>::_h);
+                out->gaussians[i].P=in->gaussians[i].P-filter::kalman::NonLinearMeasureEquation<G>::_K*filter::kalman::NonLinearMeasureEquation<G>::_H*in->gaussians[i].P;
+            }
+            out->gaussians[i].weight=ZPDF(&in->gaussians[i])*in->gaussians[i].weight;
+         }
+ 
+         //out->NormalizeWeights();
+     }
+
+     template <template <class> class S, class G> double NonLinearMeasureEquation<S,G>::ZPDF(G *s){
+        Vector apvec=filter::kalman::NonLinearMeasureEquation<G>::_H*s->X;
+        Matrix apcov=filter::kalman::NonLinearMeasureEquation<G>::_H*s->P*Trans(filter::kalman::NonLinearMeasureEquation<G>::_H)+filter::kalman::NonLinearMeasureEquation<G>::_R;
+        Matrix apinv=InvQR(apcov);
+        double apdet=Det(apcov);
+        return (std::exp(-0.5*Dot(filter::kalman::NonLinearMeasureEquation<G>::_Z-apvec,apinv*(filter::kalman::NonLinearMeasureEquation<G>::_Z-apvec)))/
+               (std::sqrt(std::pow(2*M_PI,static_cast<int>(apvec.size()))*std::abs(apdet))));
+     }
+
+} // namespace gaussiansum
+} // namespace filter
+
+#endif // __GAUSSIAN_FILTERING_BASE__
Index: tags/0.2.3/include/Pacpus/PacpusTools/filtering/kalman_filtering.hpp
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/filtering/kalman_filtering.hpp	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/filtering/kalman_filtering.hpp	(revision 368)
@@ -0,0 +1,477 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: kalman_filtering.hpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef __KALMAN_FILTERING__
+#define __KALMAN_FILTERING__
+
+#include "bayes_filtering.hpp"
+#include "../math/ublas.hpp"
+
+namespace filter{
+namespace kalman{
+  using namespace math::ublas;
+
+
+  /*!
+   * \class State
+   * \brief This class describes a basic Kalman state
+   */
+  class State {
+    public :
+
+      Vector X; /*!<  State vector */
+    
+      Matrix P; /*!< Covariance matrix*/ 
+
+      /*!
+       * \brief method where the state vector and covariance matrix are allocated 
+       * \param state_size : the size of the state vector
+       */ 
+      void Allocator(const size_t &state_size){
+         X=ZeroVector(state_size);
+         P=ZeroMatrix(state_size,state_size);
+      }
+
+   };
+
+  
+  /*!
+   * \class DynamicEquation
+   * \brief This class describes a basic Kalman dynamic equation
+   */
+  template <class S=State> class DynamicEquation: public BayesDynamicEquation<S,S>{
+   public :
+    
+       /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector
+        * \param data_size : the size of the input vector 
+        */ 
+       virtual void Allocator(const size_t &state_size,const size_t &data_size)=0;
+
+       /*!
+        * \brief virtual method where parameters of the dynamic equation must be evaluated 
+        * \param s : the state vector at time k-1 
+        */
+       virtual void EvaluateParameters(S *s)=0;
+  
+       /*!
+        * \brief virtual method where the a priori state vector must be computed
+        * \param in  the state vector at time k-1  
+        * \param out  the state vector at time k 
+        */
+       virtual void Predict(S *in,S *out)=0;
+ 
+       /*! 
+        * \brief Destructor 
+        */ 
+       virtual ~DynamicEquation(){}
+
+       /*!
+        * \brief Get/Set data in input vector U
+        * \return  vector U
+        */ 
+       double & U(const int &row){return _U(row);}
+
+       /*!
+        * \brief Get/Set data in covariance matrix Q
+        * return  matrix Q
+        */ 
+       double & Q(const int &row, const int &column){return _Q(row,column);}
+
+     protected :
+       Vector _U; /*!<   Input vector */
+
+       Matrix _Q; /*!<   Input covariance matrix */
+   };
+
+    /*!
+    * \class LinearDynamicEquation 
+    * \brief This clas dscribes a linear dynamic equation 
+    *  \n
+    *   X(k+1|k) =A*X(k)+B*U(k) \n
+    *   P(k+1|k) = A*P(k+1|k)*A'+B*Q(k)*B' \n
+    *   A = state matrix \n
+    *   B = input matrix \n
+    *   U = input of dynamic system \n
+    *   Q = input covariance matrix  \n
+    */
+    template <class S=State> class LinearDynamicEquation : public DynamicEquation<S>{
+      public :
+        /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector
+        * \param data_size : the size of the input vector 
+        */ 
+      virtual void Allocator(const size_t &state_size,const size_t &data_size);
+        /*!
+        * \brief virtual method where parameters of the dynamic equation must be evaluated 
+        * \param s : the state vector at time k-1 
+        */
+      virtual void EvaluateParameters(S *s)=0;
+
+      /*!
+        * \brief virtual method where the a priori state vector must be computed
+        * \param in : the state vector at time k-1  
+        * \param out : the state vector at time k 
+        */      
+      virtual void Predict(S *in,S *out);
+
+      /*!
+       * \brief Destructor 
+       */
+      virtual ~LinearDynamicEquation(){}
+
+      /*!
+       * \brief Get/Set an constant variable in A matrix
+       *  \return  A(row,column) 
+       */ 
+      double & A(const int &row, const int &column){return _A(row,column);}
+
+      /*!
+       * \brief Get/Set an constant variable in B matrix
+       * \return   B(row,column)
+       */ 
+      double & B(const int &row, const int &column){return _B(row,column);}
+
+     protected :  
+       Matrix _A;   /*!<   A matrix */
+
+       Matrix _B;  /*!<    B matrix */
+
+
+   };
+
+
+    // Kalman linear dynamic equation member functions
+   template <class S> void LinearDynamicEquation<S>::Allocator(const size_t &state_size,const size_t &data_size){
+      DynamicEquation<S>::_U=ZeroVector(data_size);
+      DynamicEquation<S>::_Q=ZeroMatrix(data_size,data_size);
+      _A=ZeroMatrix(state_size,state_size);
+      _B=ZeroMatrix(state_size,data_size);
+
+    }
+    
+   template <class S> void LinearDynamicEquation<S>::Predict(S *in,S *out){
+          EvaluateParameters(in); 
+          out->P=_A*in->P*Trans(_A) +_B*DynamicEquation<S>::_Q*Trans(_B);
+          out->X=_A*in->X+_B*DynamicEquation<S>::_U; 
+    }
+
+
+
+    /*!
+     *  \class NonLinearDynamicEquation
+     *  \brief this class describes a non linear dynamic equation
+     *  \n
+     *   X(k+1|k) =f(X(k)+U(k)) \n
+     *   P(k+1|k) = F*P(k+1|k)*F'+G*Q(k)*G' \n
+     *   F= Jacobian of dynamic equation with respect of the state vector \n
+     *   G= Jacobian of dynamic equation with respect of the entrie vector \n
+     *   U = entrie of dynamic system \n
+     *   Q = covariance matrix associated with U \n
+     */
+    template <class S=State> class NonLinearDynamicEquation : public DynamicEquation<S>{
+       public :
+       /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector
+        * \param data_size : the size of the input vector 
+        */ 
+        virtual void Allocator(const size_t &state_size,const size_t &data_size);
+
+       /*!
+        * \brief virtual method where parameters of the dynamic equation must be evaluated 
+        * \param s : the state vector at time k-1 
+        * f=
+        * F= 
+        * G=
+        */
+
+      virtual void EvaluateParameters(S *s)=0;
+
+      
+      /*!
+        * \brief virtual method where the a priori state vector must be computed
+        * \param in : the state vector at time k-1  
+        * \param out : the state vector at time k 
+        */      
+      virtual void Predict(S *in,S *out);
+
+      /*! 
+       * \brief Destructor 
+       */
+      virtual ~NonLinearDynamicEquation(){}
+
+      /*!
+       * \brief Get/Set a constant variable in F matrix 
+       * return : F(row,column)
+       */ 
+      double & F(const int &row, const int &column){return _F(row,column);}
+
+      /*!
+       * \brief Get/Set a constant variable in G matrix 
+       * return : G(row,column)
+       */ 
+      double & G(const int &row, const int &column){return _G(row,column);}
+       
+
+       protected:
+      
+       Vector _f; /*!< Vector f where f(X,U) is stored */  
+
+       Matrix _F; /*!< Jacobian of dynamic equation with respect of the state vector */
+
+       Matrix _G; /*!< Jacobian of dynamic equation with respect of the input vector*/
+
+   };
+
+
+    // Kalman non linear dynamic equation member functions
+    template <class S> void NonLinearDynamicEquation<S>::Allocator(const size_t &state_size,const size_t &data_size){
+        DynamicEquation<S>::_U=ZeroVector(data_size);
+        DynamicEquation<S>::_Q=ZeroMatrix(data_size,data_size);
+        _f=ZeroVector(state_size);
+        _F=ZeroMatrix(state_size,state_size);
+        _G=ZeroMatrix(state_size,data_size);
+     }
+
+    template <class S> void NonLinearDynamicEquation<S>::Predict(S *in,S *out){
+         EvaluateParameters(in);
+         out->X=_f;
+         out->P=_F*in->P*Trans(_F) + _G*DynamicEquation<S>::_Q*Trans(_G);
+    }
+   
+
+
+  /*!
+   * \class MeasureEquation
+   * \brief This class describes a basic Kalman measure equation
+   */
+   template <class S=State> class MeasureEquation: public BayesMeasureEquation<S,S>{
+   public :
+
+
+       /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector
+        * \param data_size : the size of the observation vector 
+        */ 
+       virtual void Allocator(const size_t &state_size,const size_t &data_size)=0;
+
+       /*!
+        * \brief virtual method where parameters of the dynamic equation must be evaluated 
+        * \param s  the state vector at time k 
+        */
+       virtual void EvaluateParameters(S *s)=0;
+
+      /*!
+        * \brief virtual method where the a posteriori state vector must be computed
+        * \param in : the a priori state vector at time k  
+        * \param out : the a posteriori state vector at time k 
+        */      
+       virtual void Update(S *in,S *out)=0;
+ 
+       /*!
+        * \brief Destructor 
+        */ 
+       virtual ~MeasureEquation(){};
+
+       /*!
+        * \brief Get/Set data in observation vector Z 
+        * \return  Z(row,column)
+        */ 
+       double & Z(const int &row){return _Z(row);}
+
+       /*!
+        * \brief Get/Set data in observation covariane matrix R
+        * return  R(row,column)
+        */ 
+       double & R(const int &row,const int &column){return _R(row,column);}
+
+       /*!
+        * \brief Get/Set observation vector Z
+        * return  vector Z
+        */ 
+       Vector & Z(){return _Z;}
+       /*!
+        * \brief Get/Set observation covariance matrix R 
+        * return  matrix R
+        */ 
+       Matrix & R(){return _R;}
+       
+     
+       protected :
+    
+       Vector _Z;  /*!< Observation  vector */
+
+       Matrix _R;  /*!< Observation  covariance matrix */
+
+       Matrix _K;  /*!< Kalman gain matrix */
+
+       
+       /*!
+        * \brief Coherency of observation data \n
+        *  This parameter must be computed in the EvaluateParameters method \n
+        *  For kalman filtering the mahalanobis distance is usually used \n
+        *  By default the coherency value is true  \n
+        */
+       bool _coherency;
+   };
+
+
+
+    /*! 
+    *   \class LinearMeasureEquation
+    *   \brief This class describes a linear measure equation \n 
+    *   X(k+1|k+1)=X(k+1|k)+K(Z(k)-H*X(k+1|k)) \n
+    *   P(k+1|k+1) = (I-K*H)P(k+1|k) \n
+    *   K=P(k+1|k)*H'/(H*P(k+1|k)*H'+R) \n
+    *   H = observation matrix \n
+    *   Z = observation data \n
+    *   Q = observation covariance matrix \n
+    */
+    template<class S=State> class LinearMeasureEquation : public MeasureEquation<S>{
+      public :
+       /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector
+        * \param data_size : the size of the observation vector 
+        */ 
+       virtual void Allocator(const size_t &state_size,const size_t &data_size);
+
+       /*!
+        * \brief virtual method where parameters of the dynamic equation must be evaluated 
+        * \param s : the state vector at time k 
+        */
+       virtual void EvaluateParameters(S *s)=0;
+
+        /*!
+        * \brief virtual method where the a posteriori state vector must be computed
+        * \param in : the a priori state vector at time k  
+        * \param out : the a posteriori state vector at time k 
+        */  
+       virtual void Update(S *in,S *out);
+
+       /*!
+        *  \brief Destructor 
+        */
+       virtual ~LinearMeasureEquation(){}
+
+       /*!
+        * \brief Get/Set an constant variable in observation matrix H 
+        */ 
+       double & H(int row, int column){return _H(row,column);}
+
+      protected:  
+
+       Matrix _H; /*!< Observation matrix */
+
+   };
+
+
+    // Kalman  linear measure equation member functions
+    template <class S> void LinearMeasureEquation<S>::Allocator(const size_t &state_size,const size_t &data_size){
+        MeasureEquation<S>::_Z=ZeroVector(data_size);
+        MeasureEquation<S>::_R=ZeroMatrix(data_size,data_size);
+        _H=ZeroMatrix(data_size,state_size);
+        MeasureEquation<S>::_coherency=true;
+    }
+    
+    template <class S> void LinearMeasureEquation<S>::Update(S *in,S *out){
+         MeasureEquation<S>::_coherency=true;
+         EvaluateParameters(in);  
+
+         if(MeasureEquation<S>::_coherency){
+            MeasureEquation<S>::_K=in->P*Trans(_H) *InvQR( _H*in->P*Trans(_H) +MeasureEquation<S>::_R );     
+             out->X=in->X + MeasureEquation<S>::_K*(MeasureEquation<S>::_Z - _H*in->X);       
+             out->P=in->P - MeasureEquation<S>::_K*_H*in->P;
+         }
+    }
+
+
+    /*!
+    *   \class NonLinearMeasureEquation
+    *   \brief This clas describes a non linear measure equation \n
+    *   X(k+1|k+1)=X(k+1|k)+K(Z(k)-h(X(k+1|k))) \n
+    *   P(k+1|k+1) = (I-K*H)P(k+1|k) \n
+    *   K=P(k+1|k)*H'/(H*P(k+1|k)*H'+R) \n
+    *   H = jacobian matrix of h() with respect of X \n
+    *   Z = observation data \n
+    *   Q = covariance matrix associated with Z \n
+    */
+    template <class S=State> class NonLinearMeasureEquation : public MeasureEquation<S>{
+      public :
+       /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector
+        * \param data_size : the size of the observation vector 
+        */ 
+       virtual void Allocator(const size_t &state_size,const size_t &data_size);
+
+       /*!
+        * \brief virtual method where parameters of the dynamic equation must be evaluated 
+        * \param s : the state vector at time k   
+        * h=
+        * H=
+        */
+       virtual void EvaluateParameters(S *s )=0;
+
+        /*!
+        * \brief virtual method where the a posteriori state vector must be computed
+        * \param in : the a priori state vector at time k  
+        * \param out : the a posteriori state vector at time k 
+        */  
+       virtual void Update(S *in,S *out); 
+       
+        /** destructor */
+       virtual ~NonLinearMeasureEquation(){}
+
+        /*!
+         * \brief Get/Set  constant data in H matrix  
+         * \return H(row,column) 
+         */ 
+        double & H(const int &row,const int &column){return _H(row,column);}
+
+      protected :  
+        
+
+
+       Matrix _H;   /*!< Jacobian of measure equation with respect of the state vector */
+     
+       Vector _h;   /*!< Vector f where h(X) is stored */  
+
+   };
+
+    // Kalman  non linear measure equation member functions
+    template <class S> void NonLinearMeasureEquation<S>::Allocator(const size_t &state_size,const size_t &data_size){
+        MeasureEquation<S>::_Z=ZeroVector(data_size);
+        MeasureEquation<S>::_R=ZeroMatrix(data_size,data_size);
+        _H=ZeroMatrix(data_size,state_size);
+        _h=ZeroVector(data_size);
+    }
+    
+    template <class S> void NonLinearMeasureEquation<S>::Update(S *in,S *out){
+         MeasureEquation<S>::_coherency=true;
+         EvaluateParameters(in);   
+
+         if(MeasureEquation<S>::_coherency){ 
+             MeasureEquation<S>::_K=in->P*Trans(_H) *( InvLU(_H*in->P*Trans(_H) + MeasureEquation<S>::_R));
+             out->X=in->X+MeasureEquation<S>::_K*(MeasureEquation<S>::_Z-_h);
+             out->P=in->P-MeasureEquation<S>::_K*_H*in->P;
+         }
+    }
+} // namespace kalman
+} // namespace filter
+
+#endif // __KALMAN_FILTERING__
Index: tags/0.2.3/include/Pacpus/PacpusTools/filtering/particle_filtering.hpp
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/filtering/particle_filtering.hpp	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/filtering/particle_filtering.hpp	(revision 368)
@@ -0,0 +1,596 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: particle_filtering.hpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef __PARTICLE_FILTERING_BASE__
+#define __PARTICLE_FILTERING_BASE__
+
+#include "bayes_filtering.hpp"
+#include "../math/ublas.hpp"
+#include "../math/rng.hpp"
+#include "../math/distributions.hpp"
+
+namespace filter{
+namespace particle {
+
+   using namespace math;
+   using namespace ublas;
+   using namespace rng;
+   using namespace distributions;
+
+
+   /*! 
+   * \class Particle
+   * \brief This class describe a particle \n
+   *  A particle is constituted by : 1) a state vector and 2) importance weight \n
+   */
+  class Particle {
+    public :
+      /*!
+       * \brief Constructor 
+       * \param state_size : the size of the state vector
+       * \param weight_ : the initial weight of the particle  
+       */
+      Particle(const size_t state_size, const double & weight_){
+       X=ZeroVector(state_size);
+       weight=weight_;
+      }
+
+      Vector X; /*!< state vector */
+
+      double weight; /*!< particle weight */
+  
+   };
+
+   /*! \class ParticleSet
+   *   \brief This class describe a set of particles \n
+   *   A set of particle is reprented by a vector of particles \n
+   *   somes methods can be applied to the set of particles like : \n
+   *   estimate computation, resampling scheme or normalization method \n
+   */
+
+  template<class P=Particle> class ParticleSet {
+    public :
+    
+     std::vector<P> particles;  /*!< vector of particles */
+
+    
+     std::vector<P> particles_; /*!< temporary vector of particles used in resample scheme */
+
+
+     /*!
+      * \brief Allocate the set of paticles  
+      * \param nparticle : number of particles
+      */
+     void Allocator(const size_t &nparticle);
+
+     /*!
+      *  \brief Resample the set of particles  \n
+      *  \param threshold : threshold parameter  \n
+      *  The resampling scheme is the reasmpling scheme proposed by Kitawaga \n 
+      *  This can be overloaded to use an another resampling scheme  \n 
+      */
+     virtual void Resample(const double & threshold=1.0);
+   
+     /*!
+      * \brief Compute the number of effective samples in the particle set 
+      * \return number of effective samples
+      */ 
+     double Ness();
+
+    /*! 
+     *  \brief Get the number of particles 
+     *  \return number of particles 
+     */
+    size_t ParticlesNo(){ return particles.size(); }
+
+    /*!
+     * \brief Compute the estimate
+     * \return a vector double describing the estimate 
+     */
+    Vector Estimate ();   
+
+    /*!
+     * \brief Normalize the weights of each particles
+     */
+    void NormalizeWeights();
+
+    /*!
+     * \brief Destructor
+     */
+    virtual ~ParticleSet(){};
+
+    protected :
+
+    /*!
+    * \brief Compute the cumulative sum of the weight of each particles
+    * \return a vector of double describing this cumulative sum 
+    */ 
+      std::vector<double> WeightCumSum();
+
+    /*!
+    * \brief Create the a random cumulative sum  
+    * \return a vector of double describing this cumulative sum 
+    */  
+    std::vector<double> RandomCumSum();
+
+  };
+
+
+   //Particle set memeber functions 
+  template<class P> void ParticleSet<P>::Allocator(const size_t &nparticles){
+     particles.resize(nparticles); 
+     particles_.resize(nparticles);
+   }
+
+   template<class P> double ParticleSet<P>::Ness(){
+     double ness =0;
+     for(typename std::vector<P>::iterator I=particles.begin();I!=particles.end();I++) 
+        ness+=(*I).weight*(*I).weight;
+
+     if(ness==0)throw filter_error("In particle filter :: number effective sample computation ->  ness is equal to infinity"); 
+
+     return 1/ness;
+   }
+
+
+   template<class P> std::vector<double> ParticleSet<P>::WeightCumSum(){
+       double sum=0;
+       std::vector<double> cumsum(particles.size());
+       for(size_t i=0;i<particles.size();i++){ 
+         sum+=particles[i].weight;
+         cumsum[i]=sum; 
+       }
+       return cumsum;
+   }
+
+   template<class P> void ParticleSet<P>::NormalizeWeights(){
+     
+    double sum=0;
+    for(typename std::vector<P>::iterator I=particles.begin();I!=particles.end();I++)
+       sum+=(*I).weight;
+
+
+    if(sum==0) throw filter_error("In particle filter :: normalization of weight ->  weight sum is equal to 0"); 
+
+    for(typename std::vector<P>::iterator I=particles.begin();I!=particles.end();I++)
+        (*I).weight=(*I).weight/sum;
+
+   }
+
+   template<class P> std::vector<double> ParticleSet<P>::RandomCumSum(){
+       double sum=0;
+       std::vector<double> cumsum(particles.size());
+       uniform_rng UD;
+       for(size_t i=0;i<particles.size();i++){ 
+         sum+=UD();
+         cumsum[i]=sum; 
+       }
+       
+       //normalization 
+       for(size_t i=0;i<particles.size();i++)cumsum[i]=cumsum[i]/sum;
+
+       return cumsum;
+   }
+
+
+  template<class P> void ParticleSet<P>::Resample(const double & threshold){
+     size_t N=ParticlesNo();
+     if(Ness()<=N*threshold){ 
+       // resample method by Carpenter
+       std::vector<double> Q=WeightCumSum();
+       std::vector<double> T=RandomCumSum();
+
+       // select the best particle
+       std::vector <size_t> ind(N);
+       unsigned int j=0;
+       for(unsigned int i=0; i <N; i++){
+         do{
+ 	  if(T[i] < Q[j]){ind[i] = j;break;}
+ 	  j++;
+         }while(j<N);
+       }
+
+       // build the new particle set  
+       for(unsigned int i=0; i <N; i++){
+         particles_[i]=particles[ind[i]];
+         particles_[i].weight=1.0/static_cast<double>(N);
+       }
+
+       // swap the particle set
+       particles.swap(particles_);
+     }    
+  }
+ 
+ 
+
+   template<class P> Vector ParticleSet<P>::Estimate(){
+     Vector estimate = ZeroVector(particles[0]->X.size());
+     for(typename std::vector<P>::iterator I=particles.begin();I!=particles.end();I++)
+       estimate+=(*I).X*(*I).weight;
+     return estimate;
+   }
+
+
+   /*!
+    * \class DynamicEquation
+    * \brief This class describe a basic dynamic equation for particle filtering \n
+    * where : class  S is  a set particle \n
+    *       : class  I is a particle \n
+    *       : class  D is a random generator used to draw input data \n 
+    */ 
+  template <class D, template <class> class S=ParticleSet, class P=Particle> class DynamicEquation:public BayesDynamicEquation< S<P>, P >{
+   public :
+
+       /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector of each particle
+        * \param data_size : the size of the input vector 
+        */  
+       virtual void Allocator(const size_t &state_size,const size_t &data_size)=0;
+
+       /*!
+        * \brief virtual method where parameters of the dynamic equation must be  evaluated 
+        * \param s : set of particles at time k-1
+        *
+        */
+       virtual void EvaluateParameters( P *s)=0;
+  
+       /*!
+        * \brief virtual method where the a priori state vector must be computed
+        * \param in : the set of particles at time k-1  
+        * \param out : the set of particles  at time k 
+        */
+       virtual void Predict(S<P> *in, S<P> *out)=0;
+ 
+
+       /*! 
+        * \brief Destructor 
+        */ 
+       virtual ~DynamicEquation(){}
+
+       /*!
+        * \brief Get/Set random generator used to draw input random U 
+        */ 
+       D & URNG(){return _URNG;}
+
+     protected :
+
+       D _URNG; /*!< Random generator used to drawing input data*/
+ 
+       Vector _Urand; /*!< Vector where random input data are stored */
+
+   };
+
+
+
+
+    /*!
+    * \class LinearDynamicEquation
+    * \brief This class describe a linear dynamic equation \n
+    *   X(k+1)(i) =A*X(k)(i)+B*U(k)(i) \n
+    *   X(.)(i) = the state of the particle i \n
+    *   A = state matrix \n
+    *   B = entrie matrix \n
+    *   U = input random vector \n
+    */
+    template <class D,template <class> class S=ParticleSet, class P=Particle> class LinearDynamicEquation : public DynamicEquation<D,S,P>{
+      public :
+       /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector of each particle
+        * \param data_size : the size of the input vector 
+        */ 
+       void Allocator(const size_t &state_size,const size_t &data_size);
+      
+       /*!
+        * \brief virtual method where parameters of the dynamic equation must be  evaluated 
+        * \param s : set of particles at time k-1
+        */
+        virtual void EvaluateParameters(P *s)=0;
+
+       /*!
+        * \brief virtual method where the a priori state vector must be computed
+        * \param in : the set of particles at time k-1  
+        * \param out : the set of particles  at time k 
+        */
+        virtual void Predict(S<P> *in,S<P> *out);
+
+        /*!
+         * \brief Destructor 
+         */
+        virtual ~LinearDynamicEquation(){}
+
+        /*!
+         * \brief Get/Set a constant data in A matrix 
+         */ 
+        double & A(const int &row, const int &column){return _A(row,column);}
+
+        /*!
+         * \brief Get/Set a constant data in B matrix 
+         */ 
+        double & B(const int &row, const int &column){return _B(row,column);}
+
+     protected :  
+
+       Matrix _A; /*!< A matrix */
+
+       Matrix _B; /*!< A matrix */
+
+   };
+
+
+   // Particle linear dynamic equation member functions
+   template <class D, template <class> class S,class P> void LinearDynamicEquation<D,S,P>::Allocator(const size_t &state_size,const size_t &data_size){
+      DynamicEquation<D,S,P>::_Urand=ZeroVector(data_size);
+      _A=ZeroMatrix(state_size,state_size);
+      _B=ZeroMatrix(state_size,data_size);
+   }
+      
+
+   template <class D, template <class> class S,class P> void LinearDynamicEquation<D,S,P>::Predict(S<P> *in,S<P> *out){
+
+          for(size_t i=0;i<in->particles.size();i++){
+            EvaluateParameters(&in->particles[i]); 
+
+            out->particles[i]->X=_A*in->particles[i]->X+_B*DynamicEquation<D,S,P>::_Urand;
+            out->particles[i]->weight=in->particles[i]->weight;
+          }
+   }
+
+
+     /*!
+     * \class NonLinearDynamicEquation
+     * \brief  This class describe a linear dynamic equation 
+     *   \n 
+     *   X(k+1)(i) =f(X(k)(i)+U(k)(i))  \n
+     *   X(.)(i) = the state of the particle i \n 
+     *   A = state matrix \n
+     *   B = entrie matrix \n
+     *   U = input random vector \n
+     */
+    template <class D, template <class> class S,class P> class NonLinearDynamicEquation : public DynamicEquation<D,S,P>{
+       public :
+       /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector of each particle
+        * \param data_size : the size of the input vector 
+        */ 
+       void Allocator(const size_t &state_size,const size_t &data_size);
+
+       /*!
+        * \brief virtual method where parameters of the dynamic equation must be  evaluated 
+        * \param s : set of particles at time k-1
+        * f=
+        */
+       virtual void EvaluateParameters(P *s)=0;
+      
+       /*!
+        * \brief virtual method where the a priori state vector must be computed
+        * \param in : the set of particles at time k-1  
+        * \param out : the set of particles  at time k 
+        */
+      virtual void Predict(S<P> *in,S<P> *out);
+
+      /*!
+       * \brief Destructor 
+       */
+      virtual ~NonLinearDynamicEquation(){}
+       
+
+      protected:   
+
+      Vector _f; /*!< Matrix f where result of (f(X,U)) is stored */  
+
+   };
+
+   // Particle non linear dynamic equation member functions
+   template <class D,template <class> class S,class P> void NonLinearDynamicEquation<D,S,P>::Allocator(const size_t &state_size,const size_t &data_size){
+      DynamicEquation<D,S,P>::_Urand=ZeroVector(data_size);
+      _f=ZeroVector(state_size);
+   }   
+
+ 
+
+    template <class D,template <class> class S,class P> void NonLinearDynamicEquation<D,S,P>::Predict(S<P> *in,S<P> *out){
+         for(size_t i=0;i<in->particles.size();i++){
+            EvaluateParameters(&in->particles[i]); 
+           
+            out->particles[i].X=_f;
+            out->particles[i].weight=in->particles[i].weight;
+
+         }
+   }
+
+   /*!
+    * \class MeasureEquation
+    * \brief This clas describe a basic measure equation particle filtering
+    * \n
+    * where : class  S is  a set particle \n
+    *       : class  I is a particle \n
+    *       : class  D is the distribution of probability of observation data \n
+    */
+   template <class D , template <class> class S=ParticleSet, class P=Particle> class MeasureEquation: public BayesMeasureEquation< S<P>, P >{
+   public :
+ 
+       /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector of each particle
+        * \param data_size : the size of the input vector 
+        */ 
+       virtual void Allocator(const size_t &state_size,const size_t &data_size)=0;
+
+
+       /*!
+        * \brief virtual method where parameters of the measure equation must be  evaluated 
+        * \param s : set of particles at time k
+        */
+       virtual void EvaluateParameters(P *s)=0;
+
+      /*!
+        * \brief virtual method where the a posteriori state vector must be computed
+        * \param in : the a priori set of particles at time k  
+        * \param out : the a posteriori set of particles at time k 
+        */   
+       virtual void Update(S<P> *in,S<P> *out)=0;
+ 
+       /*!
+        * \brief Destructor 
+        */ 
+       virtual ~MeasureEquation(){};
+
+       /*!
+        * \brief Get/Set the distribution of probability  of data observation Z 
+        */ 
+       D & ZDistribution(){return _ZDistribution;}
+     
+       protected :
+
+       D _ZDistribution; /*!< The distribution of probability of observation data Z*/
+   };
+
+
+
+    /*!
+    * \class LinearMeasureEquation
+    *  \brief This class describe a linear measure equation 
+    *   \n
+    *   X(k)(i)=H*Z(k) \n
+    *   Z(k) = observation data \n
+    *   => weigth update \n
+    *   w(k+1)(i)=p(Z|HX(i))w(k)(i) \n
+    *   w(.)(i)= weight of particle  i \n
+    */
+    template <class D, template <class> class S=ParticleSet, class P=Particle> class LinearMeasureEquation : public MeasureEquation< D,S,P >{
+      public :
+       /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector of each particle
+        * \param data_size : the size of the input vector 
+        */ 
+       void Allocator(const size_t &state_size,const size_t &data_size);
+
+
+       /*!
+        * \brief virtual method where parameters of the measure equation must be  evaluated 
+        * \param s : set of particles at time k
+        */
+       virtual void EvaluateParameters(P *s)=0;
+
+       /*!
+        * \brief virtual method where the a posteriori state vector must be computed
+        * \param in : the a priori set of particles at time k  
+        * \param out : the a posteriori set of particles at time k 
+        */   
+       virtual void Update(S<P> *in,S<P> *out);
+
+       /*!
+        * \brief Destructor 
+        */
+       virtual ~LinearMeasureEquation(){}
+
+       /*!
+        * \brief Get/Set a constant data in observation matrix H 
+        */ 
+       double & H(int row, int column){return _H(row,column);}
+
+      protected:  
+
+       Matrix _H;  /*!< Observation matrix */
+   };
+
+
+   // Particle linear measure equation member functions
+   template <class D,template <class> class S, class P> void LinearMeasureEquation<D,S,P>::Allocator(const size_t &state_size,const size_t &data_size){
+        _H=ZeroMatrix(data_size,state_size);
+   }
+
+   template <class D,template <class> class S, class P> void LinearMeasureEquation<D,S,P>::Update(S<P> *in,S<P> *out){
+         for(size_t i=0;i<in->particles.size();i++){
+            EvaluateParameters(&in->particles[i]); 
+           
+            out->particles[i].weight=pdf(MeasureEquation<D,S,P>::_ZDistribution, _H*in->particles[i].X)*in->particles[i].weight;
+
+         }
+        out->NormalizeWeights();
+   }
+
+
+
+    /*!
+    *  \class NonLinearMeasureEquation
+    *  \brief This class describe a non linear measure equation 
+    *   \n 
+    *   Z(k)=h(X)(i) \n
+    *   Z = observation data \n
+    *   => weigth update \n
+    *   w(k+1)(i)=p(Z|h(X(k)(i)))w(k)(i) \n
+    *   w(.)(i)= weight of particle  i \n
+    */
+    template <class D,template <class> class S=ParticleSet, class P=Particle> class NonLinearMeasureEquation : public MeasureEquation<D,S,P>{
+      public :
+       /*!
+        * \brief virtual method where matrices of state system must be allocated 
+        * \param state_size : the size of the state vector of each particle
+        * \param data_size : the size of the input vector 
+        */ 
+       void Allocator(const size_t &state_size,const size_t &data_size);
+
+       /*!
+        * \brief virtual method where parameters of the measure equation must be  evaluated 
+        * \param s : set of particles at time k
+        * h=    
+        * H=
+        */
+       virtual void EvaluateParameters(P *s )=0;
+
+       /*!
+        * \brief virtual method where the a posteriori state vector must be computed
+        * \param in : the a priori set of particles at time k  
+        * \param out : the a posteriori set of particles at time k 
+        */   
+       virtual void Update(S<P> *in,S<P> *out); 
+       
+        /*!
+         * \brief Destructor 
+         */
+       virtual ~NonLinearMeasureEquation(){}
+
+      protected :
+
+       Vector _h; /*!< vector where h(X) is stored */  
+
+   };
+
+    // Particle non linear measure equation member functions
+    template <class D,template <class> class S, class P>  void NonLinearMeasureEquation<D,S,P>::Allocator(const size_t &state_size,const size_t &data_size){
+        _h=ZeroVector(data_size);
+    }
+
+
+   template <class D,template <class> class S, class P> void NonLinearMeasureEquation<D,S,P>::Update(S<P> *in,S<P> *out){
+
+         for(size_t i=0;i<in->particles.size();i++){
+            EvaluateParameters(&in->particles[i]); 
+          
+            out->particles[i].weight=pdf(MeasureEquation<D,S,P>::_ZDistribution,_h)*in->particles[i].weight;
+
+         }
+
+        out->NormalizeWeights();
+   }
+
+} // namespace particle
+} // namespace filter
+
+
+#endif // __PARTICLE_FILTERING_BASE__
Index: tags/0.2.3/include/Pacpus/PacpusTools/geodesie.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/geodesie.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/geodesie.h	(revision 368)
@@ -0,0 +1,255 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @author  Jean Laneurit <firstname.surname@utc.fr>
+/// @date    April, 2010
+/// @version $Id: geodesie.h 75 2013-01-10 17:04:19Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef GEODESIE_H
+#define GEODESIE_H
+
+#ifdef _MSC_VER
+#   pragma warning(push)
+#   pragma warning(disable: 4251 4275)
+#endif // _MSC_VER
+
+#include "PacpusToolsConfig.h"
+
+#include <Pacpus/kernel/deprecated.h>
+
+#include <boost/math/constants/constants.hpp>
+#include <boost/operators.hpp>
+#include <cmath>
+#include <iostream>
+#include <vector>
+
+class QMatrix4x4;
+class QVector3D;
+
+namespace Geodesy
+{
+
+/// 3x3 matrix ???
+///
+/// @todo Documentation
+/// @todo Rewrite!
+struct PACPUSTOOLS_API Matrice
+    : boost::multipliable<Matrice>
+{
+    /// Copy ctor
+    Matrice(Matrice const& A);
+    /// Ctor
+    Matrice();
+    /// Ctor
+    Matrice(
+        double l0c0, double l0c1, double l0c2,
+        double l1c0, double l1c1, double l1c2,
+        double l2c0, double l2c1, double l2c2
+    );
+
+    /// @todo Documentation
+    void Apply(double v0, double v1, double v2, double& Mv0, double& Mv1, double& Mv2);
+
+    Matrice& operator*=(Matrice const& other);
+
+    /// @todo Documentation
+    double c0_l0;
+    /// @todo Documentation
+    double c1_l0;
+    /// @todo Documentation
+    double c2_l0;
+
+    /// @todo Documentation
+    double c0_l1;
+    /// @todo Documentation
+    double c1_l1;
+    /// @todo Documentation
+    double c2_l1;
+
+    /// @todo Documentation
+    double c0_l2;
+    /// @todo Documentation
+    double c1_l2;
+    /// @todo Documentation
+    double c2_l2;
+};
+
+PACPUSTOOLS_API Matrice TransMat(Matrice const& A);
+PACPUSTOOLS_API PACPUS_DEPRECATED_MSG(Matrice ProdMat(Matrice const& A, Matrice const& B), "use Matrice::operator *");
+PACPUSTOOLS_API PACPUS_DEPRECATED_MSG(void Write(Matrice const& A, std::ostream& out), "use operator<<");
+PACPUSTOOLS_API std::ostream& operator<<(std::ostream& os, Matrice const& A);
+
+////////////////////////////////////////////////////////////////////////
+/// @todo Documentation
+class PACPUSTOOLS_API Raf98
+{
+public:
+    /// Ctor of Raf98 class.
+    Raf98();
+
+    /// Dtor of Raf98 class.
+    ~Raf98();
+
+    /// @todo Documentation
+    /// @param filepath Path to the input file with RAF98 data.
+    bool Load(const std::string& filepath);
+
+    /// @todo Documentation
+    /// @param longitude [degrees]
+    /// @param latitude [degrees]
+    /// @param Hwgs84 Output: interpolated altitude using WGS84 geoid model [meters]
+    bool Interpol(double longitude /*deg*/, double latitude /*deg*/, double* Hwgs84) const;
+
+private:
+    std::vector<double> m_dvalues;
+    double LitGrille(unsigned int c, unsigned int l) const;
+};
+
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+inline double Deg2Rad(double deg)
+{
+    using ::boost::math::constants::pi;
+    return deg * pi<double>() / 180.0;
+}
+
+inline double Rad2Deg(double rad)
+{
+    using ::boost::math::constants::pi;
+    return rad * 180.0 / pi<double>();
+}
+
+////////////////////////////////////////////////////////////////////////
+
+const double a_Lambert93 = 6378137;
+const double f_Lambert93 = 1 / 298.257222101;
+const double e_Lambert93 = sqrt(f_Lambert93 * (2 - f_Lambert93));
+const double lambda0_Lambert93 = Deg2Rad(3.0); //degres
+const double phi0_Lambert93 = Deg2Rad(46.5);
+const double phi1_Lambert93 = Deg2Rad(44.0);
+const double phi2_Lambert93 = Deg2Rad(49.0); //degres
+const double X0_Lambert93 = 700000; //
+const double Y0_Lambert93 = 6600000; //
+const double n_Lambert93 = 0.7256077650;
+const double c_Lambert93 = 11754255.426;
+const double xs_Lambert93 = 700000;
+const double ys_Lambert93 = 12655612.050;
+
+const double GRS_a = 6378137;
+const double GRS_f = 1 / 298.257222101;
+const double GRS_b = GRS_a * (1 - GRS_f);
+const double GRS_e = sqrt((pow(GRS_a, 2) - pow(GRS_b, 2)) / pow(GRS_a, 2));
+
+////////////////////////////////////////////////////////////////////////
+PACPUSTOOLS_API void Geographique_2_Lambert93(const Raf98& raf98, double lambda, double phi, double he, Matrice in, double& E, double& N, double& h, Matrice& out);
+PACPUSTOOLS_API void Geographique_2_Lambert93(const Raf98& raf98, double lambda, double phi, double he, double& E, double& N, double& h);
+PACPUSTOOLS_API void Lambert93_2_Geographique(const Raf98& raf98, double E, double N, double h, double& lambda, double& phi, double& he);
+PACPUSTOOLS_API void Lambert93_2_Geographique(const Raf98& raf98, double E, double N, double h, Matrice in, double& lambda, double& phi, double& he, Matrice& out);
+/** Convert from geographique to ECEF.
+ * @param[in] longitude Longitude in radian.
+ * @param[in] latitude Latitude in radian.
+ * @param[in] he Height in meter.
+ */
+PACPUSTOOLS_API void Geographique_2_ECEF(double longitude, double latitude, double he, double& x, double& y, double& z);
+/** Convert from ECEF two ENU.
+ * @param[in] lon0 Longitude of the origin in radian.
+ * @param[in] lat0 Latitude of the origin in radian.
+ * @param[in] he0 Height of the origin in radian.
+ */
+PACPUSTOOLS_API void ECEF_2_ENU(double x, double y, double z, double& e, double& n, double& u, double lon0, double lat0, double he0);
+////////////////////////////////////////////////////////////////////////
+
+///ALGO0001
+/// @todo Rename
+PACPUSTOOLS_API double LatitueIsometrique(double latitude, double e);
+///ALGO0002
+/// @todo Rename
+PACPUSTOOLS_API double LatitueIsometrique2Lat(double latitude_iso, double e, double epsilon);
+
+///ALGO0003
+PACPUSTOOLS_API void Geo2ProjLambert(
+    double lambda, double phi,
+    double n, double c, double e,
+    double lambdac, double xs, double ys,
+    double& X, double& Y);
+///ALGO0004
+PACPUSTOOLS_API void Proj2GeoLambert(
+    double X, double Y,
+    double n, double c, double e,
+    double lambdac, double xs, double ys,
+    double epsilon,
+    double& lambda, double& phi);
+
+PACPUSTOOLS_API double ConvMerApp(double longitude);
+
+/// Converts Cartesian (x, y) coordinates to polar coordinates (r, theta)
+template <typename _T1, typename _T2>
+void cartesianToPolar(const _T1 x, const _T1 y, _T2& r, _T2& theta)
+{
+    using ::std::atan2;
+    using ::std::sqrt;
+
+    r = sqrt(x * x + y * y);
+    theta = atan2(x, y);
+}
+
+/// Converts polar coordinates (r, theta) to Cartesian (x, y) coordinates
+template <typename _T1, typename _T2>
+void polarToCartesian(const _T1 r, const _T1 theta, _T2& x, _T2& y)
+{
+    using ::std::cos;
+    using ::std::sin;
+
+    x = _T2(r * cos(theta));
+    y = _T2(r * sin(theta));
+}
+
+/// Converts Cartesian (x, y, z) coordinates to spherical coordinates (r, theta, phi)
+/// Angles expressed in radians.
+template <typename _T1, typename _T2>
+void cartesianToSpherical(const _T1 x, const _T1 y, const _T1 z, _T2& r, _T2& theta, _T2& phi)
+{
+    using ::std::acos;
+    using ::std::atan2;
+    using ::std::sqrt;
+
+    r = sqrt(x * x + y * y + z * z);
+    theta = acos(z / r);
+    phi = atan2(y, x);
+}
+
+/// Converts spherical coordinates (r, theta, phi) to Cartesian (x, y, z) coordinates.
+/// Angles expressed in radians.
+template <typename _T1, typename _T2>
+void sphericalToCartesian(const _T1 r, const _T1 theta, const _T1 phi, _T2& x, _T2& y, _T2& z)
+{
+    using ::std::cos;
+    using ::std::sin;
+
+    x = r * sin(theta) * cos(phi);
+    y = r * sin(theta) * sin(phi);
+    z = r * cos(theta);
+}
+
+PACPUSTOOLS_API QMatrix4x4 yprenuToMatrix(QVector3D angle, QVector3D position);
+
+} // namespace Geodesy
+
+namespace Geodesie
+{
+using namespace Geodesy;
+} // namespace Geodesie
+
+#ifdef _MSC_VER
+#   pragma warning(pop)
+#endif // _MSC_VER
+
+#endif // GEODESIE_H
Index: tags/0.2.3/include/Pacpus/PacpusTools/math/distributions.hpp
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/math/distributions.hpp	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/math/distributions.hpp	(revision 368)
@@ -0,0 +1,228 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: distributions.hpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef __DISTRIBUTIONS_HPP__
+#define __DISTRIBUTIONS_HPP__
+
+#include "ublas.hpp"
+#include <boost/math/distributions.hpp>
+
+namespace math{
+namespace distributions{
+
+
+template <class RealType> 
+inline RealType pdf(const boost::math::normal_distribution<RealType> & dist , boost::numeric::ublas::vector<RealType> & v){
+ return pdf(dist,v[0]);
+} 
+
+template <class RealType> 
+inline RealType pdf(const boost::math::uniform_distribution<RealType> & dist , boost::numeric::ublas::vector<RealType> & v){
+ return pdf(dist,v[0]);
+} 
+
+
+/*!
+ *\class multivariate_normal_distribution
+ *\brief This clas describes a multivariate normal distribution
+ */
+template < class RealType =double >
+class multivariate_normal_distribution{
+public :
+ 
+ /*!
+  *\brief Default constructor
+  */
+  multivariate_normal_distribution(boost::numeric::ublas::vector<RealType> mean,boost::numeric::ublas::matrix<RealType> cov){
+
+    using namespace boost::numeric::ublas;
+
+    if(mean.size()==cov.size1() && mean.size()==cov.size2()){
+      m_mean=mean;
+      m_cov=cov;
+    }else throw math_error("Multivariate normal distribution : the mean vector of covariance matrix must have the same size");
+
+
+    typedef permutation_matrix<std::size_t> pmatrix;
+    // create a working copy of the input
+    matrix<RealType> A(m_cov);
+    // create a permutation matrix for the LU-factorization
+    pmatrix pm(A.size1());
+    // perform LU-factorization
+    int res = lu_factorize(A,pm);
+    if( res != 0 )  throw math_error("Pdf function : covariance matrix is a singular matrix");
+
+    // create identity matrix of "inverse"
+    m_invcov = identity_matrix<double>(A.size1());
+    // backsubstitute to get the inverse
+   lu_substitute(A, pm, invcov);
+
+   //compute determinant
+   m_detcov = 1.0;
+     for (std::size_t i=0; i < pm.size(); ++i) {
+       if (pm(i) != i)
+          m_detcov *= -1.0;
+       m_detcov *= A(i,i);
+     }
+
+  }
+
+ /*!
+  *\brief Get the inversion of covariance matrix 
+  */
+ boost::numeric::ublas::matrix<RealType> invcov() const {
+  return m_invcov;
+ }
+
+ /*!
+  *\brief Get determinant of covariance matrix
+  */
+ boost::numeric::ublas::matrix<RealType> detcov() const {
+  return m_detcov;
+ }
+
+
+ /*!
+  *\brief Get mean vector
+  */
+ boost::numeric::ublas::vector<RealType> mean() const {
+  return m_mean;
+ }
+
+ /*!
+  *\brief Get covariance matrix
+  */
+ boost::numeric::ublas::matrix<RealType> cov() const {
+  return m_cov;
+ }
+
+
+
+
+private :
+
+
+
+
+ /*!
+  *\brief mean vector
+  */
+ boost::numeric::ublas::vector<RealType> m_mean;
+
+ /*!
+  *\brief covariance matrix
+  */
+ boost::numeric::ublas::matrix<RealType> m_cov;
+
+
+ /*!
+  *\brief covar
+  */
+ boost::numeric::ublas::matrix<RealType> m_invcov;
+
+ /*!
+  *\brief cov matrix
+  */
+ double m_detcov;
+
+};
+
+typedef   multivariate_normal_distribution<double> mvnormal;
+
+
+/*!
+ *\fn inline RealType pdf(const multivariate_normal_distribution<RealType>& dist, const boost::numeric::ublas::vector<RealType> & x)
+ *\brief Compute probability density function for a multivariate normal distribution
+ */
+template <class RealType>
+inline RealType pdf(const multivariate_normal_distribution<RealType>& dist, const boost::numeric::ublas::vector<RealType> & x)
+{
+
+    boost::numeric::ublas::vector<RealType> mean = dist.mean();
+    boost::numeric::ublas::matrix<RealType> cov= dist.cov();
+    boost::numeric::ublas::matrix<RealType> invcov =dist.invcov();
+    double detcov= dist.detcov;
+
+
+   RealType exponent = - Dot(x-mean, invcov*(x-mean));
+   exponent /= 2 ;
+
+   RealType result = std::exp(exponent);
+   result /= std::sqrt(pow(2*M_PI,mean.size())*std::abs(detcov));
+
+   return result;
+} // pdf
+
+
+/*!
+ *\class multivariate_uniform_distribution
+ *\brief This clas describes a multivariate normal distribution
+ */
+template < class RealType =double >
+class multivariate_uniform_distribution{
+public :
+ 
+ /*!
+  *\brief Default constructor
+  */
+  multivariate_uniform_distribution(boost::numeric::ublas::vector<RealType> lower,boost::numeric::ublas::matrix<RealType> upper){
+
+    if(upper.size()!= lower.size()) throw math_error("Multivariate uniform distribution : the upper vector and the loxer vector must have the same size");
+    for (size_t i=0;i<upper.size();i++)
+      if(lower[i]>upper[i]) throw math_error("Multivariate uniform distribution : the lower vector is not lower than upper vector");
+
+    m_lower=lower;
+    m_upper=upper;
+  }
+ private :
+
+ /*!
+  *\brief Lower vector
+  */
+ boost::numeric::ublas::vector<RealType> m_lower;
+
+ /*!
+  *\brief Upper vector 
+  */
+ boost::numeric::ublas::matrix<RealType> m_upper;
+
+};
+
+typedef multivariate_normal_distribution<double> mvuniform;
+
+
+/*!
+ *\fn inline RealType pdf(const multivariate_uniform_distribution<RealType>& dist, const boost::numeric::ublas::vector<RealType> & x)
+ *\brief Compute probability density function for a multivariate uniform distribution
+ */
+template <class RealType>
+inline RealType pdf(const multivariate_uniform_distribution<RealType>& dist, const boost::numeric::ublas::vector<RealType> & x)
+{
+
+   double result =1;
+
+   boost::numeric::ublas::vector<RealType> upper = dist.upper();
+   boost::numeric::ublas::matrix<RealType> lower= dist.lower();
+
+
+   for(size_t i=0;i<upper.size();i++){
+     if(x<upper[i] && x[i]>lower[i]) result/=(upper[i]-lower[i]);
+     else {result=0; break;}
+  }
+
+  return result;
+} // pdf
+
+};
+};
+#endif
Index: tags/0.2.3/include/Pacpus/PacpusTools/math/geodesy.hpp
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/math/geodesy.hpp	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/math/geodesy.hpp	(revision 368)
@@ -0,0 +1,417 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: geodesy.hpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef __GEO_UTILITIES__
+#define __GEO_UTILITIES__
+
+#include <cmath>
+#include <iostream>
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/matrix.hpp>
+
+namespace math{
+
+   namespace geodesy {
+
+#ifndef M_PI
+       const double M_PI = std::atan(1.0)*4.0;
+#endif
+  
+   /*!
+    *  \enum CoordinateSystem
+    *  \brief coordinate system enumeration  
+    */
+   enum CoordinateSystem {_LLH_,_ECEF_,_LAMBERT93_,_ENU_,_NED_,_NONE_};
+	
+   /*!
+    * \def WGS84_a 
+    * \brief semi-major axis of WGS84 ellipsoid
+    */
+   const double WGS84_a = 6378137.0;
+   /*!
+    * \def WGS84_e 
+    * \brief eccentricity of WGS84 ellipsoid
+    */
+   const double WGS84_e = 0.0818191913108695;
+
+   /*!
+    * \def GRS80_a 
+    * \brief  semi-major axis of GRS80 ellipsoid
+    */
+   const double GRS80_a = 6378137.0;
+   /*!
+    * \def GRS80_a 
+    * \brief eccentricity of GRS80 ellipsoid
+    */
+   const double GRS80_e =0.0818191910428152;
+
+ 
+   /**Lambert93 conversion parameters */
+   const double LAMBERT93_n=0.725607765053267;
+   const double LAMBERT93_c = 11754255.4261;
+   const double LAMBERT93_Xs = 700000.0;
+   const double LAMBERT93_Ys = 12655612.0499;
+   const double LAMBERT93_lon0 = 0.0523598775598299;
+
+   /**Conversion functions*/
+
+   /*!
+    * \fn inline boost::numeric::ublas::vector<T> LLH2ECEF(const boost::numeric::ublas::vector<T> &llh, const T &a, const T &e)
+    * \brief convert an LLH position to a ECEF position
+    * \param llh : ublas vector describing a llh position (latitude, longitude,ellipsoidal height) 
+    * \param a : semi-major axis of ellipsoid (by default WGS84 value is used)
+    * \param e : ellipsoid eccentricity  (by default WGS84 value is used)
+    * \return  ublas vector describing a ecef position (x,y,z)
+    */
+   template<class T> inline boost::numeric::ublas::vector<T> LLH2ECEF(const boost::numeric::ublas::vector<T> &llh, const T &a=WGS84_a, const T &e=WGS84_e){
+
+    	T N=TranversalRadius(llh[0],a,e);
+	boost::numeric::ublas::vector<T> ecef(3);
+	ecef[0]=(N+llh[2])*std::cos(llh[0])*std::cos(llh[1]);
+	ecef[1]=(N+llh[2])*std::cos(llh[0])*std::sin(llh[1]);
+	ecef[2]=(N*(1-std::pow(e,2))+llh[2])*std::sin(llh[0]);
+
+	return ecef;
+   }
+
+   /*!
+    * \fn  inline boost::numeric::ublas::vector<T> ECEF2LLH(const boost::numeric::ublas::vector<T> &ecef,const T &a, const T &e)
+    * \brief convert an ECEF position to a LLH position
+    * \param ecef : ublas vector describing a ecef position (x,y,z)
+    * \param a : semi-major axis of ellipsoid (by default WGS84 value is used)
+    * \param e : ellipsoid eccentricity  (by default WGS84 value is used)
+    * \return  ublas vector describing a llh position (latitude, longitude,ellipsoidal height)
+    */
+   template<class T> inline boost::numeric::ublas::vector<T> ECEF2LLH(const boost::numeric::ublas::vector<T> &ecef,const T &a=WGS84_a, const T &e=WGS84_e){
+        boost::numeric::ublas::vector<T> lla(3);
+	T P= std::sqrt(pow(ecef[0],2) + pow(ecef[1],2));
+	T l0 =std::atan(ecef[2]/(P*(1-a*std::pow(e,2)/std::sqrt(std::pow(ecef[0],2) + std::pow(ecef[1],2) + std::pow(ecef[2],2)))));
+	lla[1]= std::atan(ecef[1]/ecef[0]);
+	lla[0]= std::atan((ecef[2]/P)/(1-a*std::pow(e,2)*std::cos(l0)/(P*std::sqrt(1-std::pow(e,2)*std::pow(sin(l0),2)))));
+	while(std::fabs(lla[0]*180/M_PI-l0*180/M_PI)>std::pow(10.0,-12.0)){
+		l0=lla[0];
+		lla[0]=std::atan((ecef[2]/P)/(1-a*std::pow(e,2)*std::cos(l0)/(P*sqrt(1-std::pow(e*std::sin(l0),2)))));
+	}
+	lla[2]=(P/std::cos(lla[0]))-(a/std::sqrt(1-pow(e*sin(lla[0]),2)));
+	return lla;
+   }
+
+   /*!
+    * \fn  inline boost::numeric::ublas::vector<T> ECEF2NTF(const boost::numeric::ublas::vector<T> &ecef)
+    * \brief convert an ECEF position to a NTF position
+    * \param ecef : ublas vector describing a ecef position (x,y,z)
+    * \return  ublas vector describing a ntf position (x,y,z)
+    */
+   template <class T> inline boost::numeric::ublas::vector<T> ECEF2NTF(const boost::numeric::ublas::vector<T> &ecef){      
+       boost::numeric::ublas::vector<T> ntf(3);
+       ntf[0]=ecef[0]+168;
+       ntf[1]=ecef[1]+60;
+       ntf[2]=ecef[2]-320;
+       return ntf;
+   }
+
+   /*!
+    * \fn  inline boost::numeric::ublas::vector<T> NTF2ECEF(const boost::numeric::ublas::vector<T> &ntf)
+    * \brief convert an ECEF position to a NTF position
+    * \param ntf : ublas vector describing a ntf position (x,y,z)
+    * \return  ublas vector describing a ecef position (x,y,z)
+    */
+    template <class T> inline boost::numeric::ublas::vector<T> NTF2ECEF(const boost::numeric::ublas::vector<T> &ntf){
+       boost::numeric::ublas::vector<T> ecef(3);
+       ecef[0]=ntf[0]-168;
+       ecef[1]=ntf[1]-60;
+       ecef[2]=ntf[2]+320;
+       return ecef;
+   }
+
+
+   /*!
+    * \fn  inline boost::numeric::ublas::matrix<T> C_ECEF2ENU(const T &lat0,const  T &lon0)
+    * \brief compute transformation matrix using to convert an ECEF position to a ENU position
+    * \param lat0 : reference latitude   
+    * \param lon0 : reference longitude 
+    * \return  ublas matrix 
+    */
+    template <class T> inline boost::numeric::ublas::matrix<T> C_ECEF2ENU(const T &lat0,const  T &lon0){
+     
+        T slat = std::sin(lat0);
+        T clat = std::cos(lat0);
+        T slon = std::sin(lon0);
+        T clon = std::cos(lon0);
+
+        boost::numeric::ublas::matrix<T> C(3,3);
+        C(0,0) = -slon;
+        C(0,1) = clon;
+        C(0,2) = 0.0;
+
+        C(1,0) = -clon * slat;
+        C(1,1) = -slon * slat;
+        C(1,2) = clat;
+
+        C(2,0) = clon * clat;
+        C(2,1) = slon * clat;
+        C(2,2) = slat;
+   
+       return C;
+   }
+
+   /*!
+    * \fn  inline boost::numeric::ublas::matrix<T> C_ENU2ECEF(const T &lat0, const T &lon0)
+    * \brief compute transformation matrix using to convert an ENU position to a ECEF position
+    * \param lat0 : reference latitude   
+    * \param lon0 : reference longitude 
+    * \return  ublas matrix 
+    */
+  template <class T> inline boost::numeric::ublas::matrix<T> C_ENU2ECEF(const T &lat0, const T &lon0){
+       T clat = std::cos(lat0);
+       T slat = std::sin(lat0);
+       T clon = std::cos(lon0);
+       T slon = std::sin(lon0);
+
+       boost::numeric::ublas::matrix<T> C(3,3);
+       C(0,0) = -slon;
+       C(0,1) = -clon * slat;
+       C(0,2) = clon * clat;
+
+       C(1,0) = clon;
+       C(1,1) = -slon * slat;
+       C(1,2) = slon * clat;
+
+       C(2,0) = 0.0;
+       C(2,1) = clat;
+       C(2,2) = slat;
+      
+      return C;
+   }
+
+   /*!
+    * \fn inline boost::numeric::ublas::matrix<T> C_ECEF2NED(const T &lat0,const  T &lon0)
+    * \brief compute transformation matrix using to convert an ECEF position to a NED position
+    * \param lat0 : reference latitude   
+    * \param lon0 : reference longitude 
+    * \return  ublas matrix 
+    */
+   template <class T> inline boost::numeric::ublas::matrix<T> C_ECEF2NED(const T &lat0,const T &lon0){
+    
+        T clat = std::cos(lat0);
+        T clon = std::cos(lon0);
+        T slat = std::sin(lat0);
+        T slon = std::sin(lon0);
+
+        boost::numeric::ublas::matrix<T> C(3,3);
+
+        C(0,0) = -slat * clon;
+        C(0,1) = -slat * slon;
+        C(0,2) = clat;
+
+        C(1,0) = -slon;
+        C(1,1) = clon;
+        C(1,2) = 0.0;
+
+        C(2,0) = -clat * clon;
+        C(2,1) = -clat * slon;
+        C(2,2) = -slat;
+
+       return C;
+    }
+ 
+   /*!
+    * \fn  inline boost::numeric::ublas::matrix<T> C_NED2ECEF(const T &lat0, const T &lon0)
+    * \brief compute transformation matrix using to convert NED position to a ECEF position
+    * \param lat0 : reference latitude   
+    * \param lon0 : reference longitude 
+    * \return  ublas matrix 
+    */
+    template <class T> inline boost::numeric::ublas::matrix<T> C_NED2ECEF(const T &lat0, const T &lon0){
+
+        T clat = std::cos(lat0);
+        T clon = std::cos(lon0);
+        T slat = std::sin(lat0);
+        T slon = std::sin(lon0);
+
+        boost::numeric::ublas::matrix<T> C(3,3);
+
+        C(0,0) = -slat * clon;
+        C(1,0) = -slat * slon;
+        C(2,0) = clat;
+
+        C(0,1) = -slon;
+        C(1,1) = clon;
+        C(2,1) = 0.0;
+
+        C(0,2) = -clat * clon;
+        C(1,2) = -clat * slon;
+        C(2,2) = -slat;
+
+      return C;
+    }
+
+   /*!
+    * \fn  inline boost::numeric::ublas::vector<T> ECEF2TANGENT (const boost::numeric::ublas::matrix<T> & C, const boost::numeric::ublas::vector<T> & P ,const boost::numeric::ublas::vector<T> Ref )
+    * \brief convert an ECEF position to a ENU or NED position
+    * \param C : transformation matrix 
+    * \param P : ECEF position  
+    * \param Ref : reference position in ECEF frame 
+    * \return  ublas vector 
+    */
+    template <class T> inline boost::numeric::ublas::vector<T> 
+    ECEF2TANGENT (const boost::numeric::ublas::matrix<T> & C, const boost::numeric::ublas::vector<T> & P ,const boost::numeric::ublas::vector<T> Ref ){
+      return   prod(C,(P-Ref));
+    }
+
+   /*!
+    * \fn inline boost::numeric::ublas::vector<T> TANGENT2ECEF (const boost::numeric::ublas::matrix<T> & C, const boost::numeric::ublas::vector<T> & P ,const boost::numeric::ublas::vector<T> Ref )
+    * \brief convert an ENU or NED position to an ECEF position
+    * \param C : transformation matrix 
+    * \param P : ENU or NED position  
+    * \param Ref : reference position in ECEF frame 
+    * \return  ublas vector 
+    */
+    template <class T> inline boost::numeric::ublas::vector<T> 
+    TANGENT2ECEF (const boost::numeric::ublas::matrix<T> & C, const boost::numeric::ublas::vector<T> & P ,const boost::numeric::ublas::vector<T> Ref ){
+      return Ref+prod(C,P);
+    }
+
+   /*!
+    * \fn inline boost::numeric::ublas::vector<T> ENU2NED(const boost::numeric::ublas::vector<T> &enu)
+    * \brief convert an ENU position to an NED position
+    * \param enu : ENU  position  
+    * \return  ublas vector 
+    */
+    template <class T> inline boost::numeric::ublas::vector<T> ENU2NED(const boost::numeric::ublas::vector<T> &enu){
+      boost::numeric::ublas::vector<T> ned(3);
+      ned[0]=enu[1];
+      ned[1]=enu[0];
+      ned[2]=-enu[2];
+      return ned;
+    } 
+
+   /*!
+    * \fn inline boost::numeric::ublas::vector<T> NED2ENU(const boost::numeric::ublas::vector<T> &ned)
+    * \brief convert an NED position to an ENU position
+    * \param ned : NED  position  
+    * \return  ublas vector 
+    */
+    template <class T> inline boost::numeric::ublas::vector<T> NED2ENU(const boost::numeric::ublas::vector<T> &ned){
+       return ENU2NED(ned);
+    }
+
+ 
+   /*!
+    * \fn inline boost::numeric::ublas::vector<T> LLH2LAMBERT(const boost::numeric::ublas::vector<T> &llh, T lon0 ,T e, T n, T c ,T Xs, T Ys)
+    * \brief convert an LLH position to a LAMBERT position
+    * \param llh : LLH position
+    * \param lon0 : reference longitude
+    * \param e : ellipsoid eccentricity
+    * \param n :
+    * \param c :
+    * \param Xs : false easting
+    * \param Ys : false northing
+    * \return  ublas vector 
+    */
+    template <class T> inline boost::numeric::ublas::vector<T> LLH2LAMBERT(const boost::numeric::ublas::vector<T> &llh, T lon0 ,T e, T n, T c ,T Xs, T Ys){; 
+       boost::numeric::ublas::vector<T> lambert(3);
+       T latiso= std::log(std::tan((M_PI / 4) + (llh[0] / 2)) * std::pow((1 - e * std::sin(llh[0])) / (1 + e * std::sin(llh[0])),e / 2));
+       lambert[0] = Xs + c*std::exp(-n*latiso)*std::sin(n*(llh[1]-lon0));
+       lambert[1] = Ys - c*std::exp(-n*latiso)*std::cos(n*(llh[1]-lon0));
+       return lambert;
+    }
+ 
+
+   /*!
+    * \fn inline boost::numeric::ublas::vector<T> LLH2LAMBERT93(const boost::numeric::ublas::vector<T> &llh)
+    * \brief convert an LLH position to a LAMBERT 93 position
+    * \param llh : llh position
+    * \return  ublas vector 
+    */
+   template <class T> inline boost::numeric::ublas::vector<T> LLH2LAMBERT93(const boost::numeric::ublas::vector<T> &llh){
+//      boost::numeric::ublas::vector<T> ecef=LLH2ECEF<T>(llh);
+//      boost::numeric::ublas::vector<T> ntf=ECEF2NTF<T>(ecef);
+//      boost::numeric::ublas::vector<T> llhntf=ECEF2LLH<T>(ntf,GRS80_a,GRS80_e);
+     return LLH2LAMBERT<T>(llh,LAMBERT93_lon0 ,GRS80_e, LAMBERT93_n, LAMBERT93_c , LAMBERT93_Xs, LAMBERT93_Ys);
+   } 
+
+
+   /*!
+    * \fn inline boost::numeric::ublas::vector <T> LAMBERT2LLH(const boost::numeric::ublas::vector<T> &lambert, T lon0, T e , T n, T c, T Xs ,T Ys )
+    * \brief convert an LLH position to a LAMBERT position
+    * \param lambert : lambert position
+    * \param lon0 : reference longitude
+    * \param e : ellipsoid eccentricity
+    * \param n :
+    * \param c :
+    * \param Xs : false easting
+    * \param Ys : false northing
+    * \return  ublas vector 
+    */
+    template <class T> inline boost::numeric::ublas::vector<T> LAMBERT2LLH(const boost::numeric::ublas::vector<T> &lambert, T lon0, T e , T n, T c, T Xs ,T Ys ){
+      boost::numeric::ublas::vector<T> llh(3);
+
+      T latiso=std::log(c/std::abs(std::sqrt(std::pow(lambert[0]-Xs,2)+std::pow(lambert[1]-Ys,2))))/n;
+      llh[0]=2*std::atan(std::exp(latiso))-M_PI/2;
+      llh[1]=lon0+std::atan(-(lambert[0]-Xs)/(lambert[1]-Ys))/n;
+      T l0=llh[0]+1;
+
+      while(std::abs(llh[0]-l0)>std::pow(10.0,-12.0)){
+        l0=llh[0];
+        llh[0]=2 * std::atan(std::pow((1 + e * std::sin(l0)) / (1 - e * std::sin(l0)), e / 2)*std::exp(latiso)) - M_PI / 2;
+      }
+      return llh;
+    }
+  
+   /*!
+    * \fn inline boost::numeric::ublas::vector<T> LAMBERT932LLH(const boost::numeric::ublas::vector<T> &lambert)
+    * \brief convert an LAMBERT93 position to a LLH position
+    * \param lambert : lmabert 9 position
+    * \return  ublas vector 
+    */
+    template <class T> inline boost::numeric::ublas::vector<T> LAMBERT932LLH(const boost::numeric::ublas::vector<T> &lambert){
+      return LAMBERT2LLH<T>(lambert, LAMBERT93_lon0 ,GRS80_e, LAMBERT93_n, LAMBERT93_c , LAMBERT93_Xs, LAMBERT93_Ys);
+      //boost::numeric::ublas::vector<T> llhntf=LAMBERT2LLHCARTO<T>(lambert, LAMBERT93_lon0 ,GRS80_e, LAMBERT93_n, LAMBERT93_c , LAMBERT93_Xs, LAMBERT93_Ys);
+      //boost::numeric::ublas::vector<T> ecefntf=LLH2ECEF<T>(llhntf);
+      //boost::numeric::ublas::vector<T> ecef=NTF2ECEF<T>(ecefntf);
+      //return ECEF2LLH<T>(ecef);
+    } 
+
+   /*!
+    * \fn inline T MeridionalRadius(const T &latitude,const T &a, const T &e)
+    * \brief compute the prime vertical curvature radius
+    * \param latitude : a latitude 
+    * \param a : semi-major axis of ellipsoid (by default WGS84 value is used)
+    * \param e : ellipsoid eccentricity  (by default WGS84 value is used)
+    * \return  ublas vector 
+    */
+   template<class T> inline T MeridionalRadius(const T &latitude,const T &a=WGS84_a, const T &e=WGS84_e){
+       return a/(std::pow(1-std::pow(e*std::sin(latitude),2),1.5));
+   }
+
+   /*!
+    * \fn inline T TranversalRadius(const T &latitude,const T &a, const T &e)
+    * \brief compute the prime horizontal curvature radius
+    * \param latitude : a latitude 
+    * \param a : semi-major axis of ellipsoid (by default WGS84 value is used)
+    * \param e : ellipsoid eccentricity  (by default WGS84 value is used)
+    * \return  ublas vector 
+    */
+   template<class T> inline T TranversalRadius(const T &latitude,const T &a=WGS84_a, const T &e=WGS84_e){
+      return a/std::sqrt(1-std::pow(e*std::sin(latitude),2));
+   }
+
+
+};
+};
+#endif
+
+
+
Index: tags/0.2.3/include/Pacpus/PacpusTools/math/math_exception.hpp
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/math/math_exception.hpp	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/math/math_exception.hpp	(revision 368)
@@ -0,0 +1,36 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: math_exception.hpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef PACPUS_MATH_EXCEPTION_HPP
+#define PACPUS_MATH_EXCEPTION_HPP
+
+namespace math {
+
+/*!
+* \class math_error
+* \brief This class describes the math exception
+*/
+class math_error
+    : public std::logic_error
+{
+  public:
+    /*!
+     * \brief Constructor
+     * \param  what_arg : a string describing the math problem
+     */
+    math_error (const std::string& what_arg) : logic_error( what_arg) {}
+ };
+
+} // namespace math
+
+#endif // PACPUS_MATH_EXCEPTION_HPP
Index: tags/0.2.3/include/Pacpus/PacpusTools/math/rng.hpp
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/math/rng.hpp	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/math/rng.hpp	(revision 368)
@@ -0,0 +1,226 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: rng.hpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Random number generators.
+///
+/// Detailed description.
+
+#ifndef __BOOST_RNG__
+#define __BOOST_RNG__
+
+#include <boost/random.hpp>
+#include <boost/math/distributions.hpp>
+#include <ctime>
+
+namespace math {
+
+namespace rng {
+
+/// This class is basic normal random number generator
+///
+/// @tparam RealType describe number precision, e.g. @c float, @c double
+/// @tparam PRNG describe pseudo random number generator
+/// @see boost::random
+template <class RealType, class PRNG>
+class normal_generator
+{
+public:
+    /// Default construtor
+    normal_generator()
+        : engine(time(NULL))
+        , generator(engine,boost::normal_distribution<RealType>(0,1))
+    {}
+
+    /// Construtor
+    ///
+    /// @param dist a normal distribution
+    /// @see boost::distributions
+    normal_generator(const boost::math::normal_distribution<RealType> & dist)
+        : engine(time(NULL))
+        , generator(engine,boost::normal_distribution<RealType>(dist.mean(),dist.sigma()))
+    {}
+
+    /// Constructor
+    ///
+    /// @param mean mean of the normal distribution 
+    /// @param sigma standard deviation of the normal distribution
+    normal_generator(const RealType & mean ,const RealType & sigma)
+        : engine(time(NULL))
+        , generator(engine,boost::normal_distribution<RealType>(mean(),sigma()))
+    {}
+
+    /// Get a random number
+    RealType operator()()
+    {
+        return generator();
+    }
+
+    /// Set normal distribution
+    ///
+    /// @param dist : a normal distribution
+    /// @see boost::distributions
+    void distribution( const boost::math::normal_distribution<RealType> & dist)
+    { 
+        generator.dist= boost::normal_distribution<RealType>(dist.mean(),dist.standard_deviation());
+    }
+
+    /// Set normal distrubution
+    ///
+    /// @param mean : mean of the normal distribution 
+    /// @param sigma : satndard deviation of the normal distribution
+    void distribution( const RealType & mean ,const RealType & sigma) { 
+        generator.distribution()= boost::normal_distribution<RealType>(mean,sigma);
+    }
+
+private:
+    /// pseudorandom number generator
+    PRNG engine; 
+
+    /// the normal random number generator
+    boost::variate_generator<PRNG, boost::normal_distribution<RealType> > generator;
+};
+
+/// Defines normal random number generator as a Mersenne Twister 19937 with double-precision numbers
+typedef class normal_generator<double, boost::mt19937> normal_rng;
+
+/// This class is basic uniform random number generator.
+///
+/// @tparam RealType describe number precision, e.g. @c float, @c double
+/// @tparam PRNG describe pseudo random number generator
+/// @see boost::random
+template <class RealType, class PRNG>
+class uniform_generator
+{
+public:
+    /// Default construtor
+    uniform_generator()
+        : engine(time(NULL))
+        , generator(engine, boost::uniform_real<RealType>(0,1))
+    {}
+
+    /// Construtor
+    /// @param dist a uniform distribution
+    /// @see boost::distributions
+    uniform_generator(const boost::math::uniform_distribution<RealType> & dist)
+        : engine(time(NULL))
+        , generator(engine, boost::uniform_real<RealType>(dist.lower(),dist.upper()))
+    {}
+    
+    /// Constructor
+    ///
+    /// @param lower the lower value of the uniform distribution
+    /// @param upper the upper value of the uniform distribution
+    uniform_generator(const RealType & lower , const RealType & upper)
+        : engine(time(NULL))
+        , generator(engine, boost::uniform_real<RealType>(lower,upper))
+    {}
+
+    /// Get a random number
+    RealType operator()()
+    {
+        return generator();
+    }
+
+    /// Set uniform distribution
+    ///
+    /// @param dist a normal distribution
+    /// @see boost::distributions
+    void distribution( const boost::math::uniform_distribution<RealType> & dist)
+    {
+        generator.dist()= boost::uniform_real<RealType>(dist.lower(),dist.upper());
+    }
+
+    /// Set uniform distribution
+    ///
+    /// @param lower the lower value of the uniform distribution
+    /// @param upper the upper value of the uniform distribution
+    void distribution( const RealType & lower , const RealType & upper)
+    {
+        generator.dist()= boost::uniform_real<RealType>(lower,upper);
+    }
+
+private:
+    /// @brief pseudo random number generator
+    PRNG engine;
+    /// @brief the uniform random number generator
+    boost::variate_generator<PRNG, boost::uniform_real<RealType> > generator;
+};
+
+/// Defines uniform random number generator as a Mersenne Twister 19937 with double-precision numbers
+typedef class uniform_generator<double, boost::mt19937> uniform_rng;
+
+/// This class is basic triangular random number generator
+///
+/// @tparam RealType describe number precision, e.g. @c float, @c double
+/// @tparam PRNG describe pseudo random number generator ( see boost random)
+template <class RealType, class PRNG>
+class triangle_generator
+{
+public: 
+    /// Default construtor
+    triangle_generator()
+        : engine(time(NULL))
+        , generator(engine, boost::triangle_distribution<RealType>(-1,0,1))
+    {}
+
+    /// Construtor
+    ///
+    /// @param dist : a traingle distribution
+    /// @see boost distributions
+    triangle_generator(const boost::math::triangular_distribution<RealType> & dist)
+        : engine(time(NULL))
+        ,generator(engine, boost::triangle_distribution<RealType>(dist.lower(),dist.upper()))
+    {}
+
+    /// Constructor
+    ///
+    /// @param lower the lower value of the uniform distribution 
+    /// @param mode the mode value of the uniform distribution 
+    /// @param upper the upper value of the uniform distribution
+    triangle_generator(const RealType & lower, const RealType & mode ,const RealType & upper)
+        : engine(time(NULL))
+        , generator(engine, boost::triangle_distribution<RealType>(lower,mode,upper))
+    {}
+
+    /// Get a random number
+    RealType operator()()
+    {
+        return generator();
+    }
+
+    /// Set triangle distribution
+    /// @param dist a normal distribution
+    /// @see boost::distributions
+    void distribution( const boost::math::triangular_distribution<RealType> & dist)
+    {
+        generator.dist()= boost::triangle_distribution<RealType>(dist.lower(),dist.mode(),dist.upper());
+    }
+
+    /// Set triangle distribution
+    /// @param lower    the lower value of the uniform distribution 
+    /// @param mode     the mode value of the uniform distribution 
+    /// @param upper    the upper value of the uniform distribution
+    void distribution( const RealType & lower, const RealType & mode ,const RealType & upper)
+    {
+        generator.dist()= boost::triangle_distribution<RealType>(lower,mode,upper);
+    }
+
+private :
+    /// pseudorandom number generator
+    PRNG engine;
+    /// the triangle random number generator
+    boost::variate_generator<PRNG, boost::triangle_distribution<RealType> > generator;
+};
+
+typedef class triangle_generator<double, boost::mt19937> triangle_rng;
+
+} // namespace rng
+} // namespace math
+
+#endif // __BOOST_RNG__
Index: tags/0.2.3/include/Pacpus/PacpusTools/math/ublas.hpp
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/math/ublas.hpp	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/math/ublas.hpp	(revision 368)
@@ -0,0 +1,405 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: ublas.hpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef __BOOST_UBLAS__
+#define __BOOST_UBLAS__
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/matrix.hpp>
+
+#include <boost/numeric/ublas/lu.hpp>
+#include <boost/numeric/ublas/vector_proxy.hpp>
+#include <boost/numeric/ublas/triangular.hpp>
+#include <boost/numeric/ublas/lu.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+#include <cmath>
+#include "math_exception.hpp"
+
+namespace math {
+namespace ublas {
+
+/// Definition of a matrix using double precision
+typedef boost::numeric::ublas::matrix<double> Matrix;
+/// Definition of a vector using double precision
+typedef boost::numeric::ublas::vector<double> Vector;
+/// Definition of empty vector using double precision
+typedef boost::numeric::ublas::zero_vector<double> ZeroVector;
+/// Definition of empty matrix using double precision
+typedef boost::numeric::ublas::zero_matrix<double> ZeroMatrix;
+
+/// Multiplication of two matrices.
+///
+/// @tparam T @todo Documentation
+/// @param m1 ublas matrix
+/// @param m2 ublas matrix
+/// @returns ublas matrix
+template<class T>
+inline boost::numeric::ublas::matrix<T> operator *(const boost::numeric::ublas::matrix<T> & m1, const boost::numeric::ublas::matrix<T> & m2)
+{
+    return prod(m1,m2);
+}
+
+/// product of a vector by a matrix
+///
+/// @tparam T @todo Documentation
+/// @param m ublas matrix
+/// @param v ublas vector
+/// @returns ublas vector
+template<class T>
+inline boost::numeric::ublas::vector<T> operator *(const boost::numeric::ublas::matrix<T> & m, const boost::numeric::ublas::vector<T> & v)
+{
+    return prod(m,v);
+}
+
+/// addition of two vectors
+///
+/// @tparam T @todo Documentation
+/// @param v1 ublas vector
+/// @param v2 ublas vector
+/// @returns ublas vector
+template<class T>
+inline boost::numeric::ublas::vector<T> operator +(const boost::numeric::ublas::vector<T> & v1, const boost::numeric::ublas::vector<T> & v2)
+{
+    boost::numeric::ublas::vector<T> tmp = v1;
+    return tmp+=v2;
+}
+
+/// subtraction of two vectors
+///
+/// @tparam T @todo Documentation
+/// @param v1 ublas vector
+/// @param v2 ublas vector
+/// @returns ublas vector
+template<class T>
+inline boost::numeric::ublas::vector<T> operator -(const boost::numeric::ublas::vector<T> & v1, const boost::numeric::ublas::vector<T> & v2)
+{
+    boost::numeric::ublas::vector<T> tmp = v1;
+    return tmp-=v2;
+}
+
+/// Transposes a matrix
+///
+/// @tparam T @todo Documentation
+/// @param m ublas matrix
+/// @returns ublas matrix
+template<class T>
+inline boost::numeric::ublas::matrix<T> Trans(boost::numeric::ublas::matrix<T> &m)
+{
+    return trans(m);
+}
+
+/// Converts a vector to a matrix.
+///
+/// @param v ublas vector
+/// @returns ublas matrix
+template <class T>
+inline boost::numeric::ublas::matrix<T> vector2matrix(const boost::numeric::ublas::vector<T> &v)
+{
+    boost::numeric::ublas::matrix<T> tmp(v.size(),1);
+    for(size_t i=0;i<v.size();i++) {
+        tmp(i,0)=v[i];
+    }
+    return tmp;
+}
+
+/// compute the norm of a vector
+///
+/// @param v ublas vector
+/// @returns norm value
+template <class T>
+inline double Norm(const boost::numeric::ublas::vector<T> & v){
+    double norm =0;
+    for(typename boost::numeric::ublas::vector<T>::const_iterator I=v.begin(); I != v.end(); ++I) {
+        norm+=(*I)*(*I);
+    }
+    return std::sqrt(norm);
+}
+
+/// term by term multiplication of two vectors
+///
+/// @param v1 : ublas vector
+/// @param v2 : ublas vector
+/// @returns ublas vector
+template <class T>
+inline boost::numeric::ublas::vector<T> Mult(const boost::numeric::ublas::vector<T> & v1, const boost::numeric::ublas::vector<T> & v2)
+{
+    if(v1.size()!=v2.size()) {
+        throw math_error("Dot(v1,v2) : vectors must have the same size");
+    }
+    boost::numeric::ublas::vector<T> v(v1.size());
+    for(size_t i=0;i<v1.size();i++) {
+        v[i]=v1[i]*v2[i];
+    }
+    return v;
+}
+
+/// dot product
+///
+/// @param v1 ublas vector
+/// @param v2 ublas vector
+/// @returns dot product value
+template <class T>
+inline double Dot(const boost::numeric::ublas::vector<T> & v1, const boost::numeric::ublas::vector<T> & v2)
+{
+    if(v1.size()!=v2.size()) {
+        throw math_error("Dot(v1,v2) : vectors must have the same size");
+    }
+    double dot=0;
+    for(size_t i=0;i<v1.size();i++) {
+        dot+=v1[i]*v2[i];
+    }
+    return dot;
+}
+
+/// matrix inversion using LU decomposition
+/// @param m ublas matrix
+/// @returns ublas matrix
+inline Matrix InvLU(const Matrix &m)
+    throw(math_error)
+{
+    using namespace boost::numeric::ublas;
+    typedef permutation_matrix<std::size_t> pmatrix;
+
+    if(m.size1() != m.size2()) throw math_error("Inv(m): matrix must be square");
+
+    // create a working copy of the input
+    Matrix A(m);
+    // create a permutation matrix for the LU-factorization
+    pmatrix pm(A.size1());
+    // perform LU-factorization
+    int res = lu_factorize(A,pm);
+    if( res != 0 )  throw math_error("Inv(m) : singular matrix");
+    // create identity matrix of "inverse"
+    Matrix inverse = identity_matrix<double>(A.size1());
+    // backsubstitute to get the inverse
+    lu_substitute(A, pm, inverse);
+
+    return inverse;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+///////////////////////// QR  DECOMPOSITION ////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+/// @todo Documentation
+/// @tparam T @todo Documentation
+template<class T>
+bool InvertMatrix (const boost::numeric::ublas::matrix<T>& input, boost::numeric::ublas::matrix<T>& inverse)
+{
+    using namespace boost::numeric::ublas;
+    typedef permutation_matrix<std::size_t> pmatrix;
+    // create a working copy of the input
+    matrix<T> A(input);
+    // create a permutation matrix for the LU-factorization
+    pmatrix pm(A.size1());
+
+    // perform LU-factorization
+    int res = lu_factorize(A,pm);
+    if( res != 0 ) return false;
+
+    // create identity matrix of "inverse"
+    inverse.assign(boost::numeric::ublas::identity_matrix<T>(A.size1()));
+
+    // backsubstitute to get the inverse
+    lu_substitute(A, pm, inverse);
+
+    return true;
+}
+
+/// @todo Documentation
+/// @tparam T @todo Documentation
+template<class T>
+void TransposeMultiply(const boost::numeric::ublas::vector<T>& vector,
+    boost::numeric::ublas::matrix<T>& result,
+    size_t size)
+{
+    result.resize (size,size);
+    result.clear ();
+    for(unsigned int row=0; row< vector.size(); ++row)
+    {
+        for(unsigned int col=0; col < vector.size(); ++col)
+            result(row,col) = vector(col) * vector(row);
+
+    }
+}
+
+/// @todo Documentation
+/// @tparam T @todo Documentation
+template<class T>
+void HouseholderCornerSubstraction (boost::numeric::ublas::matrix<T>& LeftLarge,
+    const boost::numeric::ublas::matrix<T>& RightSmall)
+{
+    using namespace boost::numeric::ublas;
+    using namespace std;
+    if(
+        !(
+        (LeftLarge.size1() >= RightSmall.size1())
+        && (LeftLarge.size2() >= RightSmall.size2())
+        )
+        )
+    {
+        cerr << "invalid matrix dimensions" << endl;
+        return;
+    }
+
+    size_t row_offset = LeftLarge.size2() - RightSmall.size2();
+    size_t col_offset = LeftLarge.size1() - RightSmall.size1();
+
+    for(unsigned int row = 0; row < RightSmall.size2(); ++row )
+        for(unsigned int col = 0; col < RightSmall.size1(); ++col )
+            LeftLarge(col_offset+col,row_offset+row) -= RightSmall(col,row);
+}
+
+/// @todo Documentation
+/// @tparam T @todo Documentation
+template<class T>
+void QR (const boost::numeric::ublas::matrix<T>& M,
+    boost::numeric::ublas::matrix<T>& Q,
+    boost::numeric::ublas::matrix<T>& R)
+{
+    using namespace boost::numeric::ublas;
+    using namespace std;
+
+    if(
+        !(
+        (M.size1() == M.size2())
+        )
+        )
+    {
+        cerr << "invalid matrix dimensions" << endl;
+        return;
+    }
+    size_t size = M.size1();
+
+    // init Matrices
+    matrix<T> H, HTemp;
+    HTemp = identity_matrix<T>(size);
+    Q = identity_matrix<T>(size);
+    R = M;
+
+    // find Householder reflection matrices
+    for(unsigned int col = 0; col < size-1; ++col)
+    {
+        // create X vector
+        boost::numeric::ublas::vector<T> RRowView = boost::numeric::ublas::column(R,col);
+        vector_range< boost::numeric::ublas::vector<T> > X2 (RRowView, range (col, size));
+        boost::numeric::ublas::vector<T> X = X2;
+
+        // X -> U~
+        if(X(0) >= 0)
+            X(0) += norm_2(X);
+        else
+            X(0) += -1*norm_2(X);
+
+        HTemp.resize(X.size(),X.size(),true);
+
+        TransposeMultiply(X, HTemp, X.size());
+
+        // HTemp = the 2UUt part of H
+        HTemp *= ( 2 / inner_prod(X,X) );
+
+        // H = I - 2UUt
+        H = identity_matrix<T>(size);
+        HouseholderCornerSubstraction(H,HTemp);
+
+        // add H to Q and R
+        Q = prod(Q,H);
+        R = prod(H,R);
+    }
+}
+//////////////////////////////////////////////////////////////////////////////////////////::
+
+/// Matrix inversion using QR decomposition
+/// @param m ublas matrix
+/// @returns ublas matrix
+inline Matrix InvQR(const Matrix &m)
+    throw(math_error)
+{
+    using namespace boost::numeric::ublas;
+
+    if(m.size1() != m.size2()) throw math_error("Inv(m): matrix must be square");
+    Matrix Q(m), R(m), Rinv(m);
+    QR (m,Q,R);
+    for( int i = 0 ; i < R.size1() ; i++ )
+        for( int j = 0 ; j < R.size2() ; j++ )
+            if( R(i,j) < 1e-10 )
+                R(i,j) = 0;
+    InvertMatrix(R,Rinv);
+    return Rinv*Trans(Q);
+}
+
+
+/// compute matrix determinant using LU decomposition
+/// @param m ublas matrix
+/// @returns ublas matrix
+inline double DetLU(const Matrix & m)
+    throw(math_error)
+{
+    using namespace boost::numeric::ublas;
+    typedef permutation_matrix<std::size_t> pmatrix;
+
+
+    if(m.size1() != m.size2()) throw math_error("Determinant(m): matrix must be square");
+
+    // create a working copy of the input
+    Matrix A(m);
+    // create a permutation matrix for the LU-factorization
+    pmatrix pm(m.size1());
+    // perform LU-factorization
+    int res = lu_factorize(A, pm);
+    if( res != 0 )  throw math_error("Determinant(m) : singular matrix");
+    //compute determinant
+    double det = 1.0;
+    for (std::size_t i=0; i < pm.size(); ++i) {
+        if (pm(i) != i)
+            det *= -1.0;
+        det *= A(i,i);
+    }
+    return det;
+}
+
+
+/// output stream function
+inline std::ostream& operator << (std::ostream& ostrm, const Matrix & m)
+{
+    for (size_t i=0; i < m.size1(); i++)
+    {
+        ostrm << '['<<'\t';
+        for (size_t j=0; j < m.size2(); j++)
+        {
+            double x = m(i,j);
+            ostrm << x << '\t';
+        }
+        ostrm << ']'<< std::endl;
+    }
+    return ostrm;
+}
+
+/// output stream function
+inline std::ostream& operator << (std::ostream& ostrm, const Vector & v)
+{
+    for (size_t i=0; i < v.size(); i++)
+    {
+        ostrm << '['<<'\t';
+        double x = v(i);
+        ostrm << x << '\t';
+        ostrm << ']'<< std::endl;
+    }
+    return ostrm;
+}
+
+} // namespace ublas
+} // namespace math
+
+#endif // __BOOST_UBLAS__
Index: tags/0.2.3/include/Pacpus/PacpusTools/math/utilities.hpp
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/math/utilities.hpp	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/math/utilities.hpp	(revision 368)
@@ -0,0 +1,159 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: utilities.hpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef __UTILITIES_HPP__
+#define __UTILITIES_HPP__
+
+
+namespace math {
+
+ namespace utility {
+
+
+   /*!
+    * \fn inline  std::vector<T> LineCircleIntersection(const boost::numeric::ublas::vector<T> & A,const boost::numeric::ublas::vector<T> & B, const boost::numeric::ublas::vector<T> & C,const double R)
+    * \brief Compute points of intersection of circle and line defined  through two poinst A and B
+    * \param A : a point of the line
+    * \param B : a point of the line
+    * \param C : 
+    * \param R : circle radius
+    * \return  a list of abscissas with respect of point A
+    */
+    template <class T> inline  std::vector<T> LineCircleIntersection(const boost::numeric::ublas::vector<T> & A,    
+                                                                       const boost::numeric::ublas::vector<T> & B,
+                                                                       const boost::numeric::ublas::vector<T> & C,
+                                                                       const double R){
+           std::vector<T> intersection;
+           
+           double alpha = (B[0]-A[0])*(B[0]-A[0]) + (B[1]-A[1])*(B[1]-A[1]);
+           double norm = std::sqrt(alpha);
+           double beta = 2 *(B[0]-A[0])*(A[0]-C[0]) + (B[1]-A[1])*(A[1]-C[1]);
+           double gamma = A[0]*A[0] + A[1]*A[1] + C[0]*C[0] + C[1]*C[1] - 2*(A[0]*C[0] + A[1]*C[1] ) - R*R;
+           double delta = beta*beta - 4*alpha*gamma;
+
+           if(delta>0){
+              intersection.push_back( (-beta -sqrt(delta))/(2*norm) );
+              intersection.push_back( (-beta +sqrt(delta))/(2*norm) );
+           }
+
+           return intersection;
+    }
+
+   /*!
+    * \fn inline  std::vector<T> SegmentCircleIntersection(const boost::numeric::ublas::vector<T> & A,const boost::numeric::ublas::vector<T> & B, const boost::numeric::ublas::vector<T> & C,const double R)
+    * \brief Compute points of intersection of circle and segment defined  through two poinst A and B
+    * \param A : a point of the line
+    * \param B : a point of the line
+    * \param C : 
+    * \param R : circle radius
+    * \return  a list of abscissas with respect of point A and in taking account the hypothesis abscissas in [A,B]
+    */
+    template <class T> inline  std::vector<T> SegmentCircleIntersection(const boost::numeric::ublas::vector<T> & A,    
+                                                                       const boost::numeric::ublas::vector<T> & B,
+                                                                       const boost::numeric::ublas::vector<T> & C,
+                                                                       const double R){
+
+
+           std::vector<T> intersection;
+           double  alpha = (B[0] - A[0]) * (B[0] - A[0]) + (B[1] - A[1]) * (B[1] - A[1]);
+           double norm = std::sqrt(alpha);
+           double  beta  = 2 * ((B[0] - A[0]) * (A[0] - C[0]) + (B[1] - A[1]) * (A[1] - C[1]));
+           double  gamma = A[0] * A[0] + A[1] * A[1] + C[0] * C[0] + C[1] * C[1] - 2 * (A[0] * C[0] + A[1] * C[1]) - R * R;
+          
+           double delta = beta*beta - 4*alpha*gamma;
+
+           if(delta>0){
+              intersection.push_back( (-beta -sqrt(delta))/(2*norm) );
+              intersection.push_back( (-beta +sqrt(delta))/(2*norm) );
+
+               if(intersection[0]<1 && intersection[1]>0){
+                   if(intersection[0] <0 ) intersection[0]=0;
+                   if(intersection[1] >norm) intersection[1]=norm;
+               }else{
+                intersection.clear();
+              }
+           }
+
+
+          return intersection;
+    }
+
+   /*!
+    * \fn inline boost::numeric::ublas::vector<RealType> Cov2Ellipse(const RealType & pxx,const RealType & pxy,const RealType & pyy,const RealType &proba)
+    * \brief Convert 2D covariance to a ellipse parameters
+    * \param pxx : variance X
+    * \param pxy : covariance XY
+    * \param pyy : variance Y
+    * \param proba : percentage 
+    * \return  ublas vector  containing semi-major axis, semi-minor axis and orientation of the ellipse
+    */
+    template <class RealType> inline boost::numeric::ublas::vector<RealType> Cov2Ellipse(const RealType & pxx,const RealType & pxy,const RealType & pyy,const RealType &proba){
+
+        boost::numeric::ublas::vector<RealType> ellipse(3);
+
+        // le scalaire "k" definit l'ellipse avec l'equation :(x-mx)T*(1/P)*(x-mx)=k^2
+        double k=sqrt(-2*log(1-proba));
+  
+        // coeficient de correlation
+        double ro = pxy / sqrt(pxx * pyy);
+        if ( fabs( ro ) > 1 ) 
+	  {
+	    std::cout << "ro=" << ro << "pxx=" << pxx << "pxy=" << pxy << "pyy=" << pyy << std::endl; 
+	    throw math_error("Cov2Ellipse: correlation coefficient is not included between -1 and 1. Covariance matrix is not defined positive");
+	  }
+        double a = 1/(pxx*(1- ro * ro));
+        double b = -ro/(sqrt(pyy*pxx)*(1- ro * ro)); 
+        double c = 1/(pyy*(1- ro * ro));
+  
+        // calcul des deux valeurs propres
+        // la gde vp (lambda1) est associee au petit axe.
+        double delta = (a-c)*(a-c)+4*b*b;
+        double lambda1 = 0.5*(a+c+sqrt(delta));
+        double lambda2 = 0.5*(a+c-sqrt(delta));
+  
+        // vecteur directeur du grand axe
+        double aux = (lambda2-a)/b; 
+        double deno=sqrt(1+aux*aux);
+        double Ux = 1/deno;
+        double Uy = aux/deno;
+  
+        // longueur des axes dans le repere propre
+        double axeX = k/sqrt(lambda2); // demi axe
+        double axeY = k/sqrt(lambda1); // demi axe
+  
+        ellipse(2) = - atan2(Uy, Ux);//heading 
+        ellipse(0) = axeY * 2 * 3; // width    x3 (sigma) si PROBA = 0.4 ellipsoide a deux dimensions (test du khi2)
+        ellipse(1) = axeX * 2 * 3; //height
+
+        //   heading = - atan2(Uy, Ux); 
+        //   width = axeY * 2 * 3; // x3 (sigma) si PROBA = 0.4 ellipsoide a deux dimensions (test du khi2)
+        //   height = axeX * 2 * 3; 
+
+       return ellipse; 
+    }
+
+   /*!
+    * \fn inline boost::numeric::ublas::vector<RealType> Cov2Ellipse(boost::numeric::ublas::matrix<RealType> P,const RealType &proba)
+    * \brief Convert 2D covariance to a ellipse parameters
+    * \param P : 2D covariance matrix 
+    * \param proba : 
+    * \return  ublas vector  containing semi-major axis, semi-minor axis and orientation of the ellipse
+    */
+    template <class RealType> inline boost::numeric::ublas::vector<RealType> Cov2Ellipse(boost::numeric::ublas::matrix<RealType> P,const RealType &proba){
+        if(P.size1()==2 & P.size2()==2) throw math_error("Cov2Ellipse: covariance is not a 2D square matrix");
+        return Cov2Ellipse(P(0,0),P(0,1),P(1,1),proba);
+     }
+
+};
+};
+#endif
Index: tags/0.2.3/include/Pacpus/PacpusTools/matrice.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/matrice.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/matrice.h	(revision 368)
@@ -0,0 +1,113 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Jean Laneurit <firstname.surname@utc.fr>
+/// @date    April, 2010
+/// @version $Id: matrice.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Matrix algebra functions.
+///
+/// Detailed description.
+
+#ifndef MATRIX_H
+#define MATRIX_H
+
+#include "PacpusToolsConfig.h"
+
+typedef enum
+{
+    ONES,
+    ZEROS,
+    IDENTITY
+} t_m;
+
+/// Simple matrix.
+/// @todo Documentation
+class PACPUSTOOLS_API matrice
+{
+    typedef double *ligne;
+    ligne *lignes;
+    unsigned short int n;   // Nombre de lignes (1erparamètre).
+    unsigned short int m;   // Nombre de colonnes (2èmeparamètre).
+
+public:
+    /// Ctor
+    matrice();
+    /// Ctor
+    matrice(unsigned short int nl, unsigned short int nc);
+    /// Ctor
+    matrice(unsigned short int nl, unsigned short int nc,t_m type);
+    /// Copy ctor
+    matrice(const matrice &source); //constructeur par copie
+    /// Dtor
+    virtual ~matrice(void);
+
+    /// Allocates matrix data
+    /// @todo Rename
+    void Alloue(unsigned short int nl, unsigned short int nc);
+
+    /// Assignment operator for matrix operand
+    matrice &operator=(const matrice &m);//m=m1
+    /// Assignment operator for scalar operand
+    matrice &operator=(double x); //m=x
+    /// Conversion operator to double
+    /// @todo FIXME
+    operator double() const
+    {
+        return **lignes;
+    }
+
+    /// @todo Documentation
+    matrice &operator+=(const matrice &m); //m+=m1
+    /// @todo Documentation
+    matrice &operator-=(const matrice &m); //m-=m1
+
+    /// @todo Documentation
+    matrice operator+(const matrice &m1) const; //m=m1+m2
+    /// @todo Documentation
+    matrice operator-(const matrice &m1) const; //m=m1-m2
+    /// @todo Documentation
+    matrice operator*(const matrice &m1) const; //m=m1*m2
+
+    /// @todo Documentation
+    matrice &operator+=(double x); //m+=x
+    /// @todo Documentation
+    matrice &operator-=(double x); //m-=x
+
+    /// @todo Documentation
+    matrice operator+(double x)const; //m+x
+    /// @todo Documentation
+    matrice operator-(double x)const; //m-x
+    /// @todo Documentation
+    matrice operator*(double x)const; //m*x
+    /// @todo Documentation
+    matrice operator/(double x)const; //m/x
+
+    /// @todo Documentation
+    friend matrice operator+(double x,matrice m1) {return m1+x ;} // x+m ;
+    /// @todo Documentation
+    friend matrice operator-(double x,matrice m1) {return m1-x ;} // x-m ;
+    /// @todo Documentation
+    friend matrice operator*(double x,matrice m1) {return m1*x ;} // x*m ;
+
+    /// Matrix transpose.
+    matrice T();
+    /// Matrix inverse.
+    matrice I();
+
+    /// @todo Documentation
+    double &operator()(unsigned short int i, unsigned short int j); // ecriture m(i,j)=x
+    /// @todo Documentation
+    double operator()(unsigned short int i, unsigned short int j) const; //lecture x=m(i,j)
+    /// @todo Documentation
+    double &operator()(unsigned short int i); // ecriture m(i)=x
+    /// @todo Documentation
+    double operator()(unsigned short int i) const; //lecture x=m(i)
+
+    /// @todo Documentation
+    void print(const char *nom);
+};
+
+#endif // MATRIX_H
Index: tags/0.2.3/include/Pacpus/PacpusTools/transf_lamb_93.h
===================================================================
--- tags/0.2.3/include/Pacpus/PacpusTools/transf_lamb_93.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/PacpusTools/transf_lamb_93.h	(revision 368)
@@ -0,0 +1,109 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: transf_lamb_93.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#include <math.h>
+#define pi 3.141592653589793
+double atanh(double  z)
+{
+	return (0.5 * log((z+1)/(1-z)));
+}
+
+double  abs_me(double x)
+{
+	if(x<0) x=-x;
+	return x;
+}
+
+//transformation des longitudes tatitudes en Lambert93
+void lonlattolam(double lon, double lat, double & lam93x, double & lam93y)
+	{
+		double GRS_a = 6378137;
+		double GRS_f = 1./298.257222101;
+
+		double GRS_b = GRS_a*(1-GRS_f);
+		double GRS_bb= GRS_b*GRS_b;
+		double GRS_aa= 40680631590769.;
+		double GRS_e = sqrt((GRS_aa - GRS_bb) / (GRS_aa));
+
+		double n = 0.725607765053267;
+		double C = 11754255.4261;
+		double XS = 700000;
+		double YS = 12655612.0499;
+
+		double latiso;
+		latiso = atanh(sin(lat)) - GRS_e*atanh(GRS_e*sin(lat));
+		double gamma;
+		gamma = (lon - 0.0523598775598299)*n;
+		double R;
+		R = C * exp(-n*latiso);
+
+		lam93x = R *sin(gamma)+XS;
+		lam93y = -R *cos(gamma)+YS;
+		//printf("x: %.20lf\n y: %.20lf\n",lam93x,lam93y);
+
+	}
+
+
+
+//Transformation des coordonnees de Lambert93 en Longitude lattitude
+
+void lamtolonlat(double lamx, double lamy, double & lon, double & lat)
+{
+
+	double GRS_a = 6378137;
+	double GRS_f = 1./298.257222101;
+	double GRS_b = GRS_a*(1-GRS_f);
+	double GRS_bb= GRS_b*GRS_b;
+	double GRS_aa= 40680631590769.;
+	double GRS_e = sqrt((GRS_aa - GRS_bb) / (GRS_aa));
+
+	//double n = 0.725607765053267;
+	//double C = 11754255.4261;
+	//double XS = 700000;
+	//double YS = 12655612.0499;
+
+
+	//lamx = lamx-700000;
+	//lamy = lamy-12655612.0499;
+
+	double gamma;
+	gamma = atan(-(lamx-700000)/(lamy-12655612.0499));
+
+
+	lon = gamma/0.725607765053267 + 0.0523598775598299;
+	double R;
+	R = sqrt((lamx-700000) * (lamx-700000) + (lamy-12655612.0499) * (lamy-12655612.0499));
+
+	double latiso;
+	latiso = log((11754255.4261)/R)/(0.725607765053267);
+
+	double phiNew, phiOld;
+	phiOld =1;
+	phiNew= asin (tanh ( latiso + GRS_e * atanh(GRS_e * sin(phiOld))));
+	//printf("\nphiNew: %.20lf",phiNew);
+	while (abs_me(phiOld-phiNew) > 1e-10)
+	{
+
+		if(abs_me(phiOld-phiNew) > 1e-10)
+		{
+
+			phiOld = phiNew;
+			phiNew = asin(tanh(latiso+GRS_e*atanh(GRS_e*sin(phiOld))));
+		}
+		else
+			phiOld = phiNew;
+	}
+
+	lat = phiNew;
+
+}
Index: tags/0.2.3/include/Pacpus/kernel/ComponentBase.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/ComponentBase.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/ComponentBase.h	(revision 368)
@@ -0,0 +1,263 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dhermobez <firstname.surname@utc.fr>
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @author  Samuel Gosselin <firstname.surname@utc.fr>
+/// @author  Julien Moras <firstname.surname@utc.fr>
+/// @date    February, 2006
+/// @version $Id: ComponentBase.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Generic ComponentBase class. This is an abstract class.
+///
+/// Detailed description.
+/// @todo        - see if some methods can be private with ComponentManager
+///              friendship
+///              - include the copy of Xml node in param here
+///              - see if there is a possibility to avoid the constraint
+///              on parameters in the constructor of derived class
+
+#ifndef DEF_PACPUS_COMPONENTBASE_H
+#define DEF_PACPUS_COMPONENTBASE_H
+
+//#include <Pacpus/kernel/ComponentManager.h>
+#include <Pacpus/kernel/InputOutputBase.h>
+// InputOutputInterface.h must be included, otherwise we could not use addInput, addOutput template methods
+#include <Pacpus/kernel/InputOutputInterface.h>
+#include <Pacpus/kernel/PacpusLibConfig.h>
+#include <Pacpus/kernel/XmlComponentConfig.h>
+
+#include <boost/noncopyable.hpp>
+#include <boost/program_options/options_description.hpp>
+#include <boost/program_options/value_semantic.hpp>
+#include <QMap>
+#include <QString>
+#include <string>
+
+class QWidget;
+
+namespace boost
+{
+class exception_ptr;
+
+namespace program_options
+{
+    class options_description_easy_init;
+} // namespace program_options
+
+} // namespace boost
+
+namespace pacpus
+{
+
+class ComponentBase;
+
+class ComponentManager;
+
+class InputInterfaceBase;
+class OutputInterfaceBase;
+
+template <typename T, class C>
+class InputInterface;
+template <typename T, class C>
+class OutputInterface;
+
+using boost::program_options::value;
+
+/// @brief Base class of a Pacpus component.
+class PACPUSLIB_API ComponentBase
+    : boost::noncopyable
+{
+    friend class ComponentManager;
+
+public:
+    /// Enumeration of the state that can take a component, the three last states suppose
+    /// that the component is started.
+    enum COMPONENT_STATE {
+        STOPPED,
+        NOT_MONITORED,
+        MONITOR_OK,
+        MONITOR_NOK
+    };
+
+    /// Resulting state of a component after its configuration.
+    enum COMPONENT_CONFIGURATION {
+        CONFIGURED_OK,
+        NOT_CONFIGURED,
+        CONFIGURATION_DELAYED,
+        CONFIGURED_FAILED
+    };
+
+    /// Ctor of ComponentBase.
+    /// @param name Name of your component.
+    ComponentBase(QString const& name);
+
+    /// Dtor of ComponentBase.
+    virtual ~ComponentBase();
+
+    /// Returns the state of the component.
+    /// @return Value of the current state.
+    COMPONENT_STATE getState();
+    COMPONENT_STATE state();
+
+    /// Checks whether the component if configurer or not.
+    /// @return @b true if the component is configured, otherwise @b false.
+    bool isConfigured() const;
+
+    /// Returns the name of the component.
+    /// @return Name of the component.
+    QString getName() const;
+    QString name() const;
+    
+    /// @returns @b true if the component has been started and is active (working)
+    bool isActive() const;
+
+protected:
+    /// Changes the state of the component.
+    /// @param state New component state.
+    void setState(COMPONENT_STATE state);
+
+    /// Called when the component starts, you must override this function.
+    virtual void startActivity() = 0;
+
+    /// Called when the component stops, you must override this function.
+    virtual void stopActivity() = 0;
+
+    /// Called by the ComponentManager, it configure the component thanks a XML node.
+    /// @param config Component's XML node.
+    /// @return State of the configuration.
+    /// @todo FIXME: 'config' should be const, but it will be a breaking change
+    /// old stuff.
+    virtual COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config) = 0;
+
+    // virtual QString getType() = 0;
+
+    /// @todo FIXME: should be pure virtual, but it will be a breaking change
+    virtual void addInputs() {}
+    virtual void addOutputs() {}
+
+    /// Returns an object permitting to add component parameters.
+    boost::program_options::options_description_easy_init addParameters();
+    void addParameter(const char* name, const char* description);
+    void addParameter(const char* name, const boost::program_options::value_semantic* s);
+    void addParameter(const char* name, const boost::program_options::value_semantic* s, const char* description);
+
+protected:
+    typedef QMap<QString, InputSharedPointer> InputsMap;
+    typedef QMap<QString, OutputSharedPointer> OutputsMap;
+
+    template <typename DataType, class ComponentType, typename Function>
+    void addInput(const char * name, Function function)
+    {
+        typedef InputInterface<DataType, ComponentType> InputType;
+        InputSharedPointer connection(new InputType(name, dynamic_cast<ComponentType *>(this), function));
+        inputs().insert(name, connection);
+    }
+
+    template <typename DataType, class ComponentType>
+    void addOutput(const char * name)
+    {
+        typedef OutputInterface<DataType, ComponentType> OutputType;
+        OutputSharedPointer connection(new OutputType(name, dynamic_cast<ComponentType *>(this)));
+        outputs().insert(name, connection);
+    }
+    
+    /// @todo DOC
+    InputInterfaceBase* getInput(QString name) const;
+
+    /// @todo DOC
+    OutputInterfaceBase* getOutput(QString name) const;
+
+    template <typename DataType, class ComponentType>
+    InputInterface<DataType, ComponentType>* getTypedInput(const char * name) const
+    {
+        //using boost::dynamic_pointer_cast;
+        //return dynamic_pointer_cast<InputInterface<DataType, ComponentType> >(getInput(name));
+        return dynamic_cast<InputInterface<DataType, ComponentType>*>(getInput(name));
+    }
+
+    template <typename DataType, class ComponentType>
+    OutputInterface<DataType, ComponentType>* getTypedOutput(const char * name) const
+    {
+        //using boost::dynamic_pointer_cast;
+        //return dynamic_pointer_cast<OutputInterface<DataType, ComponentType> >(getOutput(name));
+        return dynamic_cast<OutputInterface<DataType, ComponentType>*>(getOutput(name));
+    }
+
+    void setActive(bool isActive);
+    bool isRecording() const;
+    void setRecording(bool isRecording);
+
+    InputsMap & inputs();
+    const InputsMap & inputs() const;
+    OutputsMap & outputs();
+    const OutputsMap & outputs() const;
+
+    COMPONENT_CONFIGURATION configurationState() const;
+    void setConfigurationState(COMPONENT_CONFIGURATION state);
+
+    const XmlComponentConfig xmlParameters() const;
+
+protected:
+    std::string mName;
+    std::string mTypeName;
+    //QThread mThread;
+
+    /// Whether to display or not the graphical interface (GUI)
+    bool hasGui() const;
+    bool isOutputVerbose() const;
+    int getVerbosityLevel() const;
+    
+private:
+    /// Called by ComponentManager to handle parameters
+    /// @throws
+    void parseParameters(const XmlComponentConfig & cfg);
+
+    /// called by the ComponentManager to start the component
+    int startComponent();
+    void startComponentInThread();
+    void startComponentWithException(boost::exception_ptr& error);
+
+    /// called by the ComponentManager to stop the component
+    int stopComponent();
+
+private:
+    bool mHasGui;
+    bool mVerbose;
+    int mVerbosityLevel;
+
+    boost::program_options::options_description mOptionsDescription;
+
+    /// The XML node that is got in the configureComponent method
+    XmlComponentConfig param;
+
+    /// the name of the component. It is this one in the XML config file
+    QString m_componentName;
+    
+    /// is the component active?
+    volatile bool m_isActive;
+
+    /// is the component is recording data?
+    bool mIsRecording;
+
+    /// a pointer to the manager of components
+    ComponentManager * m_manager;
+
+    InputsMap m_inputs;
+    OutputsMap m_outputs;
+
+    /// a pointer to an optional widget
+    QWidget * m_ui;
+
+    /// store the state of the component
+    COMPONENT_STATE m_componentState;
+
+    /// is the component configured (ie configureComponent method was called)
+    COMPONENT_CONFIGURATION m_configurationState;
+};
+
+} // pacpus
+
+#endif // DEF_PACPUS_COMPONENTBASE_H
Index: tags/0.2.3/include/Pacpus/kernel/ComponentFactory.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/ComponentFactory.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/ComponentFactory.h	(revision 368)
@@ -0,0 +1,102 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    February, 2006
+/// @version $Id: ComponentFactory.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Purpose:    Template class ComponentFactory.
+///             Use it to interface your components with the application.
+
+#ifndef DEF_PACPUS_COMPONENTFACTORY_H
+#define DEF_PACPUS_COMPONENTFACTORY_H
+
+#include <boost/assert.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+
+#include <Pacpus/kernel/ComponentFactoryBase.h>
+
+#include <QtGlobal>
+#include <QString>
+
+/// @def REGISTER_COMPONENT(className, factoryName)
+/// Registers a component to the factory.
+///
+/// @param className     Name of the class, without the quotes.
+/// @param factoryName   Name of the class in the factory.
+/// @example
+///     REGISTER_COMPONENT("DummyComponent", DummyComponent);
+/// @see pacpus::ComponentFactory
+#define REGISTER_COMPONENT(className, factoryName) \
+  static pacpus::ComponentFactory<className> sFactory(factoryName)
+
+#define PACPUS_REGISTER_COMPONENT(Class) \
+    static pacpus::ComponentFactory<Class> sFactory(#Class)
+
+namespace pacpus
+{
+
+/// Use it to interface your components with the application.
+///
+/// @tparam T   Component class
+/// @see #REGISTER_COMPONENT(className, factoryName)
+template <typename T>
+class ComponentFactory
+    : public ComponentFactoryBase
+{
+    BOOST_STATIC_ASSERT_MSG((boost::is_base_of<ComponentBase, T>::value), "component T must inherit from ComponentBase");
+
+public:
+    /** Ctor of ComponentFactory, initialize the factory of the components of type @em T.
+     * @param type Name of the type of the components.
+     */
+    ComponentFactory(QString const& type);
+    
+    /** Dtor of ComponentFactory. */
+    virtual ~ComponentFactory();
+
+    /** Get the name of the type of the components.
+     * @return Name of the type of the components.
+     */
+    QString const& getType() const;
+
+protected:
+    virtual ComponentSharedPointer instantiateComponent(QString const& name);
+
+private:
+    QString mType;
+};
+
+template <typename T>
+ComponentFactory<T>::ComponentFactory(QString const& type)
+    : mType(type)
+{
+    BOOST_ASSERT(!type.isEmpty());
+    addFactory(this, mType);
+}
+
+template<typename T>
+ComponentFactory<T>::~ComponentFactory()
+{
+}
+
+template <typename T>
+QString const& ComponentFactory<T>::getType() const
+{
+    return mType;
+}
+
+template<typename T>
+ComponentSharedPointer ComponentFactory<T>::instantiateComponent(QString const& name)
+{
+    return ComponentSharedPointer(new T(name));
+}
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_DBITEEXCEPTION_H
Index: tags/0.2.3/include/Pacpus/kernel/ComponentFactoryBase.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/ComponentFactoryBase.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/ComponentFactoryBase.h	(revision 368)
@@ -0,0 +1,72 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    February, 2006
+/// @version $Id: ComponentFactoryBase.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Purpose:    The ComponentFactoryBase class is used to provide an 
+///             abstract class to the template ComponentFactory
+
+#ifndef DEF_PACPUS_COMPONENTFACTORYBASE_H
+#define DEF_PACPUS_COMPONENTFACTORYBASE_H
+
+#include <Pacpus/kernel/PacpusLibConfig.h>
+
+#include <boost/smart_ptr/shared_ptr.hpp>
+//#include <boost/smart_ptr/weak_ptr.hpp>
+
+class QString;
+
+namespace pacpus
+{
+
+class ComponentBase;
+
+typedef boost::shared_ptr<ComponentBase> ComponentSharedPointer;
+//typedef boost::weak_ptr<ComponentBase> ComponentWeakPointer;
+
+class ComponentManager;
+
+/** ComponentFactoryBase
+ * @brief Provide an abstract class to the template ComponentFactory.
+ */
+class PACPUSLIB_API ComponentFactoryBase
+{
+    friend class ComponentManager;
+
+public:
+    /** Ctor of ComponentFactoryBase. */
+    ComponentFactoryBase();
+    /** Dtor of ComponentFactoryBase. */
+    virtual ~ComponentFactoryBase();
+
+protected:
+    /** Create a new component having @em name as component name.
+     * @param name Name of the instantiated component.
+     * @return Pointer on the newly created component, you become the owner of its lifetime.
+     */
+    virtual ComponentSharedPointer instantiateComponent(QString const& name) = 0;
+    
+    /** Register a new factory.
+     * @param addr Address of the factory.
+     * @param type Name of the type created by the factory.
+     */
+    void addFactory(ComponentFactoryBase* addr, QString const& type);
+    
+    /** Add a new component.
+     * @param name Name of the new component.
+     */
+    void createComponent(QString const& name);
+
+private:
+    ComponentManager* mgr_;
+};
+
+} // namespace pacpus
+
+#endif
Index: tags/0.2.3/include/Pacpus/kernel/ComponentManager.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/ComponentManager.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/ComponentManager.h	(revision 368)
@@ -0,0 +1,166 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    January, 2006
+/// @version $Id: ComponentManager.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Purpose:     This class records the components and manages them
+///              This class is a singleton
+///              Use the static ComponentManager::create() function
+///              to get a pointer on this object.
+
+#ifndef DEF_PACPUS_COMPONENTMANAGER_H
+#define DEF_PACPUS_COMPONENTMANAGER_H
+
+#include <Pacpus/kernel/ComponentFactoryBase.h>
+#include <Pacpus/kernel/PacpusLibConfig.h>
+#include <Pacpus/kernel/PacpusPluginInterface.h>
+#include <Pacpus/kernel/XmlConfigFile.h>
+
+#include <cstddef>
+#include <QList>
+#include <QMap>
+#include <QPluginLoader>
+
+namespace pacpus
+{
+
+class ComponentBase;
+
+/// @todo Documentation
+typedef QMap<QString, ComponentSharedPointer> ComponentMap;
+/// @todo Documentation
+typedef QMap<QString, ComponentFactoryBase* > FactoryMap;
+
+/// Singleton recording the components and managing them.
+class PACPUSLIB_API ComponentManager
+{
+    friend class ComponentBase;
+
+public:
+    /// @returns a pointer to the ComponentManager object
+    /// @deprecated Use getInstance()
+    PACPUS_DEPRECATED_MSG( static ComponentManager * create(), "use 'getInstance()'" );
+
+    /// Returns an instance of the singleton ComponentManager class.
+    /// @returns Pointer to the ComponentManager singleton.
+    static ComponentManager* getInstance();
+
+    /// Destroys the ComponentManager singleton.
+    ///
+    /// After this call, every pointer to the ComponentManager becomes invalid.
+    static void destroy();
+
+    /// Automatic deleter class.
+    struct destroyer {
+        /// Invokes ComponentManager::destroy() method if @b mgr pointer is not null.
+        void operator()(ComponentManager* mgr) const
+        {
+            if (!mgr) {
+                return;
+            }
+            mgr->destroy();
+        }
+    };
+
+    /** Load the components included in the XML config file.
+     * @param file Name of the XML file.
+     * @return Number of components loaded by the manager.
+     */
+    std::size_t loadComponents(QString const& file);
+
+    /** Start all the components
+     * @return True if all the component has been started, otherwise false.
+     */
+    bool start();
+
+    /** Start only the component passed in parameter.
+     * @param component Component to start.
+     * @return True if the component exists and has been started, otherwise false.
+     */
+    bool start(QString const& component);
+
+    /** Stop all the components
+     * @return True if all the component has been stopped, otherwise false.
+     */
+    bool stop();
+
+    /** Stop only the component passed in parameter.
+     * @param component Component to stop.
+     * @return True if the component has been stopped, otherwise false.
+     */
+    bool stop(QString const& component);
+
+    /** Get a pointer to the component referred by @em name.
+     * @param name Name of the component.
+     * @return Pointer to the component if it exists, otherwise @em NULL.
+     */
+    ComponentSharedPointer getComponent(QString const& name);
+
+    /** Get the list of all the names of the component known by the manager.
+     * @return List of all the component's name.
+     */
+    QStringList getAllComponentsName() const;
+
+    /** Load a new plugin from the file filename (it may be a .so/.dll file)
+     * @param filename Name of the shared object or the dll.
+     * @return True if the plugin has been loaded, otherwise false.
+     */
+    bool loadPlugin(QString const& filename);
+
+private:
+    bool stop(ComponentSharedPointer component) const;
+
+    /// Create a new component of type 'type' and with the name 'name'
+    bool createComponent(QString const& type, QString const& name);
+
+    bool checkComponent(QString const& componentName);
+    bool checkComponentInput(QString const& componentName, QString const& inputName);
+    bool checkComponentOutput(QString const& componentName, QString const& outputName);
+
+    bool createConnection(QString const& type, QString const& name, QString const& , int );
+
+    bool registerComponent(ComponentSharedPointer addr, QString const& name);
+    bool registerComponentFactory(ComponentFactoryBase* addr, QString const& type);
+
+    bool unregisterComponent(QString const& name);
+    bool unregisterComponentFactory(QString const& type);
+
+    // Allow 2 functions to access to private members of ComponentManager
+    friend void ComponentFactoryBase::addFactory(ComponentFactoryBase* addr, QString const& type);
+    friend void ComponentFactoryBase::createComponent(QString const& name);
+
+    /// private constructor accessible only via static create() function
+    ComponentManager();
+
+    /// private destructor accessible only via static destroy() function
+    ~ComponentManager();
+
+private:
+    /// The static pointer to this object (ComponentManager is a singleton)
+    static ComponentManager * mInstance;
+
+    /// The map of available factories of component
+    FactoryMap factoryMap_;
+
+    /// The map of loaded components
+    ComponentMap componentMap_;
+
+    /// a pointer on the xml interface
+    pacpus::XmlConfigFile * xmlTree_;
+
+    /// a list of QObject in which plugins are embedded
+    QObjectList pluginList_;
+
+    /// The object used to load the plugins
+    QPluginLoader pluginLoader_;
+};
+
+} // namespace pacpus
+
+#endif
Index: tags/0.2.3/include/Pacpus/kernel/ConnectionBase.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/ConnectionBase.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/ConnectionBase.h	(revision 368)
@@ -0,0 +1,27 @@
+#ifndef CONNECTIONBASE_H
+#define CONNECTIONBASE_H
+
+#include <Pacpus/kernel/PacpusLibConfig.h>
+
+namespace pacpus {
+
+class AbstractInterface;
+
+class PACPUSLIB_API ConnectionBase
+{
+public:
+    ConnectionBase(AbstractInterface * anInterface, int priority);
+    virtual ~ConnectionBase();
+
+    AbstractInterface * getInterface() const;
+    int getPriority() const;
+    bool operator==(ConnectionBase const & c);
+
+private:
+    AbstractInterface * m_interface;
+    int m_priority;
+};
+
+} // namespace pacpus
+
+#endif // CONNECTIONBASE_H
Index: tags/0.2.3/include/Pacpus/kernel/DbiteException.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/DbiteException.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/DbiteException.h	(revision 368)
@@ -0,0 +1,44 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    Month, 2012
+/// @version $Id: DbiteException.h 117 2013-06-25 11:50:46Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_DBITEEXCEPTION_H
+#define DEF_PACPUS_DBITEEXCEPTION_H
+
+#include <Pacpus/kernel/FileLibConfig.h>
+#include <Pacpus/kernel/PacpusException.h>
+
+#include <ios>
+#include <string>
+
+namespace pacpus {
+
+/// Exception thrown when an error during manipulation a dbite file occurs.
+class FILELIB_API DbiteException
+    : virtual public PacpusException
+{
+public:
+    DbiteException(char const* what);
+
+    /// Ctor.
+    /// @param what Information about the exception.
+    DbiteException(std::string const& what = "");
+
+    /// Dtor.
+    virtual ~DbiteException() throw();
+};
+
+typedef boost::error_info<struct tag_errinfo_ios_base_open_mode, std::ios_base::openmode> errinfo_ios_base_open_mode;
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_DBITEEXCEPTION_H
Index: tags/0.2.3/include/Pacpus/kernel/DbiteFile.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/DbiteFile.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/DbiteFile.h	(revision 368)
@@ -0,0 +1,276 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    June, 2012
+/// @version $Id: DbiteFile.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_DBITEFILE_H
+#define DEF_PACPUS_DBITEFILE_H
+
+#include <Pacpus/kernel/cstdint.h>
+#include <Pacpus/kernel/FileLibConfig.h>
+#include <Pacpus/kernel/hdfile_header_t.h>
+#include <Pacpus/kernel/road_time.h>
+
+#include <fstream>
+#include <iosfwd>
+#include <string>
+
+#ifdef _MSC_VER
+#   pragma warning(push)
+#   pragma warning(disable: 4251)
+#endif // _MSC_VER
+
+namespace pacpus {
+
+/// @todo Documentation
+struct FILELIB_API VariableDataSizeTag {};
+/// @todo Documentation
+FILELIB_API extern VariableDataSizeTag VariableDataSize;
+
+/// @todo Documentation
+struct FILELIB_API ReadModeTag {};
+std::ostream& operator<<(std::ostream& os, ReadModeTag const&);
+/// @todo Documentation
+FILELIB_API extern ReadModeTag ReadMode;
+
+/// @todo Documentation
+struct FILELIB_API WriteModeTag {};
+std::ostream& operator<<(std::ostream& os, WriteModeTag const&);
+/// @todo Documentation
+FILELIB_API extern WriteModeTag WriteMode;
+
+/// @todo Documentation
+struct FILELIB_API DiagnoseModeTag {};
+std::ostream& operator<<(std::ostream& os, DiagnoseModeTag const&);
+/// @todo Documentation
+FILELIB_API extern DiagnoseModeTag DiagnoseMode;
+
+/// @todo Documentation
+class FILELIB_API DbiteFile
+{
+public:
+    /// @todo Documentation
+    enum ReadDirection
+    {
+        ReadForward
+        , ReadBackward
+    };
+
+    /// @throws nothing
+    DbiteFile();
+    /// @throws nothing
+    ~DbiteFile();
+
+    /// Opens the file in read mode.
+    ///
+    /// @throws DbiteException on I/O error (read: cannot open the file)
+    /// @throws DbiteException on invalid file signature
+    void open(const std::string & path, ReadModeTag);
+
+    /// Opens the file in write mode using default settings.
+    /// It is necessary to set data type and data size afterwards.
+    ///
+    /// @throws DbiteException on I/O error (write: cannot write the header)
+    /// @see setRecordSize
+    /// @see setType
+    void open(const std::string & path, WriteModeTag);
+
+    /// Opens the file in write mode using given data type and data size.
+    ///
+    /// @code
+    ///     DbiteFile dbt;
+    ///     dbt.open(path, WriteMode, type, dataSize);
+    /// @endcode
+    /// is equivalent to
+    /// @code
+    ///     DbiteFile dbt;
+    ///     dbt.open(path, WriteMode)
+    ///     dbt.setRecordSize(dataSize);
+    ///     dbt.setType(type);
+    /// @endcode
+    ///
+    /// @throws DbiteException on I/O error (write: cannot write the header)
+    void open(const std::string & path, WriteModeTag, hdfile_header_t::DataTypeT type, hdfile_header_t::DataSizeT dataSize);
+
+    /// Opens the file in write mode using given data type and variable data size.
+    ///
+    /// @code
+    ///     DbiteFile dbt;
+    ///     dbt.open(path, WriteMode, type, VariableDataSize);
+    /// @endcode
+    /// is equivalent to
+    /// @code
+    ///     DbiteFile dbt;
+    ///     dbt.open(path, WriteMode)
+    ///     dbt.setRecordSize(VariableDataSize);
+    ///     dbt.setType(type);
+    /// @endcode
+    ///
+    /// @throws DbiteException on I/O error (write: cannot write the header)
+    void open(const std::string & path, WriteModeTag, hdfile_header_t::DataTypeT type, VariableDataSizeTag);
+
+    /// Tries to diagnose and repair the file.
+    /// @throws DbiteException on I/O error (write: cannot write the header)
+    //void open(const std::string & path, DiagnoseModeTag); // TODO
+
+    /// @throws nothing
+    void close();
+    /// @throws nothing
+    bool isOpen() const;
+
+    /// @throws DbiteException when file is not open
+    void goToFileBegin();
+    /// @throws DbiteException when file is not open
+    void goToFileEnd();
+    /// @throws DbiteException when file is not open
+    void goToDataBegin();
+
+    /// @throws nothing
+    const std::string & getPath() const;
+    /// @throws nothing
+    std::string getSignature() const;
+    /// @throws nothing
+    hdfile_header_t::DataTypeT getType() const;
+    /// @throws nothing
+    hdfile_header_t::VersionT getVersion() const;
+    /// @throws nothing
+    hdfile_header_t::DataOffsetT getDataOffset() const;
+    /// @throws nothing
+    hdfile_header_t::DataSizeT getRecordSize() const;
+    // FIXME: file size should be 64-bit long, have to change the hdfile_header_t structure as well
+    /// @throws nothing
+    hdfile_header_t::FileSizeT getFileSize() const;
+    /// @returns the real size of the written file in [bytes] as obtaine from system.
+    int64_t getRealFileSize();
+    /// @throws nothing
+    road_time_t getTimeMin() const;
+    /// @throws nothing
+    road_time_t getTimeMax() const;
+    /// @throws nothing
+    hdfile_header_t::RecordCountT getRecordCount() const;
+
+    /// @throws nothing
+    void setType(hdfile_header_t::DataTypeT type);
+    /// @throws nothing
+    void setRecordSize(hdfile_header_t::DataSizeT recordSize);
+    /// @throws nothing
+    void setRecordSize(VariableDataSizeTag tag);
+    /// @throws nothing
+    void setTimeMin(road_time_t time);
+    /// @throws nothing
+    void setTimeMax(road_time_t time);
+    /// @throws nothing
+    void setRecordCount(hdfile_header_t::RecordCountT recourdCount);
+
+    /// prints header
+    /// @throws nothing
+    operator std::string();
+
+    /// @throws nothing
+    bool isVariableDataSize() const;
+
+    /// @throws DbiteException on I/O error
+    bool readRecord(size_t recordIndex, road_time_t & time, road_timerange_t & timeRange, char * data);
+    /// @throws DbiteException on I/O error
+    bool readRecord(size_t recordIndex, road_time_t & time, road_timerange_t & timeRange, char * data, size_t & dataSize);
+    /// @throws DbiteException on I/O error
+    bool readRecord(road_time_t & time, road_timerange_t & timeRange, char * data, const ReadDirection & direction = ReadForward);
+    /// @throws DbiteException on I/O error
+    bool readRecord(road_time_t & time, road_timerange_t & timeRange, char * data, size_t & dataSize, const ReadDirection & direction = ReadForward);
+    /// Reads only time and time range and moves the file position to the beginning of the next record
+    /// @throws DbiteException on I/O error
+    bool readRecord(road_time_t & time, road_timerange_t & timeRange, const ReadDirection & direction = ReadForward);
+    /// @throws DbiteException on I/O error
+    bool writeRecord(const road_time_t & time, const road_timerange_t & timeRange, const char * data, const size_t dataSize);
+    /// @throws DbiteException on I/O error
+    template <typename T>
+    bool writeRecord(const road_time_t & time, const road_timerange_t & timeRange, const T* data);
+
+    /// @throws nothing
+    bool isEndOfFile();
+
+private:
+    /// @throws nothing
+    void setPath(const std::string & path);
+    /// @throws nothing
+    void setVersion(hdfile_header_t::VersionT version);
+    /// @throws nothing
+    void setDataOffset(hdfile_header_t::DataOffsetT dataOffset);
+    /// @throws nothing
+    void setFileSize(hdfile_header_t::FileSizeT fileSize);
+
+    void initializeHeader();
+
+    bool isSignatureCorrect() const;
+    void setSignature();
+
+    const hdfile_header_t & getHeader() const;
+    hdfile_header_t & header();
+    void writeHeader();
+
+    void openWriteMode(const std::string & path);
+    void openWriteMode(const std::string & path, hdfile_header_t::DataTypeT type);
+    void closeDbite();
+    void closeDbite(ReadModeTag);
+    void closeDbite(WriteModeTag);
+    void readHeader();
+    void verifyHeader();
+
+    /// @throws DbiteException when file is not open
+    int64_t getReadPosition();
+    /// @throws DbiteException when file is not open
+    int64_t getWritePosition();
+    /// @throws DbiteException when file is not open
+    void setReadPosition(int64_t offset, std::ios_base::seekdir direction);
+    /// @throws DbiteException when file is not open
+    void setReadPosition(int64_t position);
+    /// @throws DbiteException when file is not open
+    void setWritePosition(int64_t offset, std::ios_base::seekdir direction);
+    /// @throws DbiteException when file is not open
+    void setWritePosition(int64_t position);
+
+    /// @throws DbiteException on I/O error
+    bool readRecordNoBufferCheck(road_time_t & time, road_timerange_t & timeRange, char * data, size_t & dataSize, const ReadDirection & direction);
+    /// @throws DbiteException on I/O error
+    bool readRecordForward(road_time_t & time, road_timerange_t & timeRange, char * data, size_t & dataSize);
+    /// @throws DbiteException on I/O error
+    bool readRecordBackward(road_time_t & time, road_timerange_t & timeRange, char * data, size_t & dataSize);
+
+    /// @throws DbiteException on I/O error
+    void read(std::fstream::char_type * s, std::streamsize n);
+    /// @throws DbiteException on I/O error
+    void write(const std::fstream::char_type * s, std::streamsize n);
+
+    /// @throws DbiteException when file is not open
+    void checkFileOpen();
+
+private:
+    std::fstream mFile;
+    hdfile_header_t mHeader;
+    bool mIsWriting;
+    std::string mPath;
+
+    bool mIsVariableRecordSize;
+};
+
+template <typename T>
+bool DbiteFile::writeRecord(const road_time_t & time, const road_timerange_t & timeRange, const T* data)
+{
+  return writeRecord(time, timeRange, (const char*) data, sizeof(T));
+}
+
+} // namespace pacpus
+
+#ifdef _MSC_VER
+#   pragma warning(pop)
+#endif // _MSC_VER
+
+#endif // DEF_PACPUS_DBITEFILE_H
Index: tags/0.2.3/include/Pacpus/kernel/DbiteFileTypes.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/DbiteFileTypes.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/DbiteFileTypes.h	(revision 368)
@@ -0,0 +1,301 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: DbiteFileTypes.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_DBITEFILETYPES_H
+#define DEF_PACPUS_DBITEFILETYPES_H
+
+/// Basic file types
+enum BasicType
+{
+    FILE_IMAGE = 0
+    , FILE_CAN
+    , FILE_TEXT
+    , FILE_IMAGE3D
+    , FILE_DBT_UNKNOWN          ///< Unknown file type
+    , FILE_JPEG
+    , STREAM8POSITION = 100
+};
+
+enum ExtendedType
+{
+    SIGNAL_PPS = 511
+    , FILE_AUDIO
+    , AUDIO_WAV
+    , TYPE_DOUBLE = 518
+    , TYPE_FLOAT
+    , TYPE_INT
+    , TYPE_INT64
+    , DATA_PHYSIO = 600
+};
+
+enum UtcHeudiasycType
+{
+    WGS84_POSITION = 500
+    , GPS_SYNCHRO_FRAME
+    , TRAME_GGA = 514
+    , TRAME_VTG
+    , TRAME_GST
+    , TRAME_GGA_DBL = 614
+    , TRAME_HDT
+    , TRAME_ROT
+    , TRAME_GSV
+    , TRAME_GSA
+    , TRAME_RMC
+    , TRAME_ZDA
+    , DYNA_ROADYN
+    , DYNA_HT500
+    , DYNA_CUBE_RAWDATA
+    , DATA_ABS = 517
+    , GYRO_KVH = 522
+    , TELEM_SICK
+    , CORREVIT
+    , SIG
+    , LOC
+    , DATA_INS = 540
+    , DATA_ABS_CITROEN
+    , VOLANT
+    , DATA_3DMG
+    , DATA_COMODOS
+    , CROSSBOW_VG700
+    , CARMEN_CAN_RAW = 2200
+    , CARMEN_CAN_WHEELSPEED
+    , CARMEN_CAN_SUSPENSION
+    , CARMEN_CAN_RAWLATDYN
+    , CARMEN_CAN_ODOMETRY
+    , CARMEN_CAN_LATDYN
+    , CARMEN_CAN_STEERINGWHEEL
+    , CARMEN_CAN_LIGHTING
+    , CARMEN_CAN_ENGINE
+    , CARMEN_CAN_CLUTCH
+    , CARMEN_CAN_FRONTSPEED
+    , CARMEN_CAN_FLUIDINFO
+    , CARMEN_CAN_BRAKE
+    , CARMEN_CAN_ABRREGUL
+    , CARMEN_CAN_ASR_ESP
+    , CARMEN_CAN_WIPERSPEED
+    , CARMEN_CAN_COMODOS
+    , FLUENCE_ZE_STEERINGWHEEL = 2300
+    , FLUENCE_ZE_KINEMATICS
+    , FLUENCE_ZE_GEARS
+    , FLUENCE_ZE_FRONT_WHEELSPEED
+    , FLUENCE_ZE_REAR_WHEELSPEED
+    , FLUENCE_ZE_LOWSPEED
+    , ZOE_STEERINGWHEEL        //begin copy from 0.1.x
+    , ZOE_KINEMATICS
+    , ZOE_GEARS
+    , ZOE_FRONT_WHEELSPEED
+    , ZOE_REAR_WHEELSPEED
+    , ZOE_VEHICLESTATE
+    , ZOE_INITION
+    , PROVEL_MABXFEEDBACK 
+    , PROVEL_MABXDIAG 
+    , PROVEL_MABX100MS          //end copy from 0.1.x
+    , RADAR_TRW_AC20 = 3000
+    , SMS_RADAR = 4000          // by Arthur Miranda 2012-02-23 (PAMU Project)
+    , FILE_MJPEG = 4096
+    , GENERIC_LIDAR = 8000
+    , TELEM_100 = 8192
+    , TELEM_180
+    , TELEM_360
+    , TELEM_SICK_LDMRS
+    , TELEM_SICK_LMS
+    , ALASCA_XT = 8200
+    , VELODYNE_RAW_SPHERIC_DATA = 8300
+    , GENERIC_3D_POSE = 9000
+};
+
+enum StereoCameraType
+{
+    STEREO_RIGHT_IMAGE = 1982
+    , STEREO_LEFT_IMAGE
+    , CARMEN_VISUAL_ODOMETRY
+    , CARMEN_LIDAR_DETECTION
+    , CARMEN_VISUAL_DETECTOR
+};
+
+/// for the Renault's Case study
+enum RenaultType
+{
+    FILE_FACELAB = 610
+    , DBT_T_HEADWAY = 1001
+    , DBT_PERC_T_HEADWAY
+    , DBT_D_O_C_F_DIST
+    , DBT_F_DIST
+    , DBT_S_INDICATOR
+    // Lane Changing
+    , DBT_L_CHANGE
+    , DBT_M_SPEED
+    , DBT_V_I_L_SPEED
+    , DBT_R_TIME
+    , DBT_B_R_TIME
+    , DBT_E_B_EPISOD
+    // state of the road
+    , DBT_R_STATE
+    // Comments from the ergonom
+    , DBT_COMMENTS
+    // State of the HVI of the ADAS
+    , DBT_ADAS
+    , DBT_R_SPEED
+    , DBT_TTC
+    , DBT_D_BRAKE_ACTUATION
+    , DBT_ACC_PED_RELEASE
+    , DBT_COV_DISTANCE
+    // classes of time headway: [2.0 2.5]  [1.5 2.0]  [1.0 1.5]  [0.5 1.0]  [0.0 0.5] -> c2
+    , DBT_T_HEADWAY_CLASSES
+};
+
+enum SbasType
+{
+    DBT_SBAS_MT1 = 10001
+    , DBT_SBAS_MT2 = 10002
+    , DBT_SBAS_MT3 = 10003
+    , DBT_SBAS_MT4 = 10004
+    , DBT_SBAS_MT5 = 10005
+    , DBT_SBAS_MT6 = 10006
+    , DBT_SBAS_MT7 = 10007
+    , DBT_SBAS_MT10 = 10010
+    , DBT_SBAS_MT18 = 10018
+    , DBT_SBAS_MT24 = 10024
+    , DBT_SBAS_MT25 = 10025
+    , DBT_SBAS_MT26 = 10026
+};
+
+enum UbloxType
+{
+    DBT_UBX_RXM_RAW = 10121
+    , DBT_UBX_RXM_SFRB = 10122
+    , DBT_UBX_NAV_CLOCK = 10110
+    , DBT_UBX_NAV_POSLLH = 10111
+    , DBT_UBX_NAV_POSUTM = 10112
+    , DBT_UBX_NAV_SBAS = 10113
+    , DBT_UBX_NAV_SOL = 10114
+    , DBT_UBX_NAV_SVINFO = 10115
+    , DBT_UBX_NAV_VELNED = 10116
+};
+
+enum SbfType
+{
+    DBT_SBF_FRAMERAW = 11000
+    , DBT_SBF_MEASEPOCH = 11889
+    , DBT_SBF_SHORTMEASEPOCH = 11890
+    , DBT_SBF_GENMEASEPOCH = 11944
+    , DBT_SBF_ENDOFMEAS = 11922
+
+    , DBT_SBF_GPSNAV = 11891
+    , DBT_SBF_GPSALM = 11892
+    , DBT_SBF_GPSION = 11893
+    , DBT_SBF_GPSUTC = 11894
+    , DBT_SBF_GPSRAW = 11895
+    , DBT_SBF_CNAVRAW = 11947
+
+    , DBT_SBF_GEOMT00 = 11925
+    , DBT_SBF_GEOPRNMASK = 11926
+    , DBT_SBF_GEOFASTCORR = 11927
+    , DBT_SBF_GEOINTEGRITY = 11928
+    , DBT_SBF_GEOFASTCORRDEGR = 11929
+    , DBT_SBF_GEONAV = 11896
+    , DBT_SBF_GEODEGRFACTORS = 11930
+    , DBT_SBF_GEONETWORKTIME = 11918
+    , DBT_SBF_GEOALM = 11897
+    , DBT_SBF_GEOIGPMASK = 11931
+    , DBT_SBF_GEOLONGTERMCORR = 11932
+    , DBT_SBF_GEOIONODELAY = 11933
+    , DBT_SBF_GEOSERVICELEVEL = 11917
+    , DBT_SBF_GEOCLOCKEPHCOVMATRIX = 11934
+    , DBT_SBF_GEORAW = 11898
+
+    , DBT_SBF_PVTCARTESIAN = 11903
+    , DBT_SBF_PVTGEODETIC = 11904
+    , DBT_SBF_POSCOVCARTESIAN = 11905
+    , DBT_SBF_POSCOVGEODETIC = 11906
+    , DBT_SBF_VELCOVCARTESIAN = 11907
+    , DBT_SBF_VELCOVGEODETIC = 11908
+    , DBT_SBF_DOP = 11909
+    , DBT_SBF_PVTRESIDUALS = 11910
+    , DBT_SBF_RAIMSTATISTICS = 11915
+    , DBT_SBF_GEOCORRECTIONS = 11935
+    , DBT_SBF_BASELINE = 11950
+    , DBT_SBF_ENDOFPVT = 11921
+
+    , DBT_SBF_ATTITUDEEULER = 11938
+    , DBT_SBF_ATTITUDECOVEULER = 11939
+    , DBT_SBF_ATTITUDEQUAT = 11940
+    , DBT_SBF_ATTITUDECOVQUAT = 11941
+    , DBT_SBF_AUXANTPOSITIONS = 11942
+    , DBT_SBF_ENDOFATTITUDE = 11943
+
+    , DBT_SBF_RECEIVERTIME = 11914
+    , DBT_SBF_XPPSOFFSET = 11911
+    , DBT_SBF_EXTEVENT = 11924
+
+    , DBT_SBF_DIFFCORRIN = 11919
+    , DBT_SBF_BASESTATION = 11949
+    , DBT_SBF_BASELINK = 11948
+
+    , DBT_SBF_TRACKINGSTATUS = 11912
+    , DBT_SBF_RECEIVERSTATUS = 11913
+    , DBT_SBF_RECEIVERSETUP = 11902
+
+    , DBT_SBF_COMMENT = 11936
+};
+
+enum NaviflowType
+{
+    TRAME_3DMGX1 = 12100
+    , TRAME_AVIONIQUE = 12101
+    , TRAME_UEYE_STEREO_INDEX = 12102
+};
+
+enum MobileyeType
+{
+    MOBILEYE_OBSTACLE_COUNT = 12200
+
+    , MOBILEYE_OBSTACLE_0_PART_1 = 12210
+    , MOBILEYE_OBSTACLE_1_PART_1 = 12211
+    , MOBILEYE_OBSTACLE_2_PART_1 = 12212
+    , MOBILEYE_OBSTACLE_3_PART_1 = 12213
+    , MOBILEYE_OBSTACLE_4_PART_1 = 12214
+    , MOBILEYE_OBSTACLE_5_PART_1 = 12215
+    , MOBILEYE_OBSTACLE_6_PART_1 = 12216
+    , MOBILEYE_OBSTACLE_7_PART_1 = 12217
+    , MOBILEYE_OBSTACLE_8_PART_1 = 12218
+    , MOBILEYE_OBSTACLE_9_PART_1 = 12219
+
+    , MOBILEYE_OBSTACLE_0_PART_2 = 12220
+    , MOBILEYE_OBSTACLE_1_PART_2 = 12221
+    , MOBILEYE_OBSTACLE_2_PART_2 = 12222
+    , MOBILEYE_OBSTACLE_3_PART_2 = 12223
+    , MOBILEYE_OBSTACLE_4_PART_2 = 12224
+    , MOBILEYE_OBSTACLE_5_PART_2 = 12225
+    , MOBILEYE_OBSTACLE_6_PART_2 = 12226
+    , MOBILEYE_OBSTACLE_7_PART_2 = 12227
+    , MOBILEYE_OBSTACLE_8_PART_2 = 12228
+    , MOBILEYE_OBSTACLE_9_PART_2 = 12229
+
+    , MOBILEYE_OBSTACLES = 12290
+
+    , MOBILEYE_CENTER_LANE = 12300
+    , MOBILEYE_RIGHT_LANE = 12301
+    , MOBILEYE_LEFT_LANE = 12302
+};
+
+enum SpanCptType
+{
+    TRAME_BESTGPSPOSA = 621
+    , TRAME_RAWIMUSA = 622
+    , TRAME_INSPVAA = 623
+    , TRAME_INSCOV = 624
+};
+
+#endif // DEF_PACPUS_DBITEFILETYPES_H
Index: tags/0.2.3/include/Pacpus/kernel/GenericObservable.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/GenericObservable.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/GenericObservable.h	(revision 368)
@@ -0,0 +1,87 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Stephane Bonnet <firstname.surname@utc.fr>
+/// @date    October, 2012
+/// @version $Id: GenericObservable.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_GENERIC_OBSERVER_H
+#define DEF_PACPUS_GENERIC_OBSERVER_H
+
+#include <list>
+
+#include <Pacpus/kernel/GenericObserverInterface.h>
+#include <QMutex>
+
+namespace pacpus {
+
+/** Base class for te GenericObservable template.
+
+    The purpose of this class is to be able to take generic pointers on
+    GenericObservable class template instances.
+*/
+class GenericObservableBase
+{
+public:
+    /// @todo Documentation
+  virtual ~GenericObservableBase() {}
+};
+
+/** GenericObservable
+    Base class template for observable objects (see Observable/Observer
+    design pattern).
+
+    This class implements a simple subject able to notify a list of 
+    observers through calls to the notifyObservers protected method.
+*/
+template <typename T>
+class GenericObservable
+    : GenericObservableBase
+{
+public:
+    /// @todo Documentation
+  typedef GenericObserverInterface<T> ObserverType;
+
+    /// @todo Documentation
+  GenericObservable() {}
+    /// @todo Documentation
+  virtual ~GenericObservable() {}
+
+  /** Attaches a new observer to the observable.
+      @param observer A reference to a class obeying the GenericObserverInterface interface.
+  */
+  void attachObserver(ObserverType& observer) {
+    observers_.push_back(&observer);
+  }
+
+  /** Detaches an observer.
+
+      @param observer A reference to a class obeying the GenericObserverInterface interface.
+      @note Does nothing if the observer has not been previously attached
+  */
+  void detachObserver(ObserverType& observer) {
+    observers_.remove(&observer);
+  }
+
+  /** Notifies all observers about an observable event.
+  */
+  void notifyObservers() {
+    typename std::list<ObserverType*>::const_iterator it;
+    for (it = observers_.begin(); it != observers_.end(); ++it) {
+      (*it)->update(static_cast<T*>(this));
+    }
+  }
+
+private:
+  std::list<ObserverType*> observers_;
+};
+  
+} // namespace pacpus
+
+#endif // DEF_PACPUS_GENERIC_OBSERVER_H
Index: tags/0.2.3/include/Pacpus/kernel/GenericObserverInterface.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/GenericObserverInterface.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/GenericObserverInterface.h	(revision 368)
@@ -0,0 +1,53 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Stephane Bonnet <firstname.surname@utc.fr>
+/// @date    October, 2012
+/// @version $Id: GenericObserverInterface.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+ 
+#ifndef DEF_PACPUS_GENERIC_OBSERVER_INTERFACE_H
+#define DEF_PACPUS_GENERIC_OBSERVER_INTERFACE_H
+
+namespace pacpus {
+
+/** Base class for te GenericObserverInterface template.
+
+    The purpose of this class is to be able to take generic pointers on
+    GenericObserverInterface<T> class template instances.
+*/
+class GenericObserverBase {
+public:
+  virtual ~GenericObserverBase() {}
+};
+
+/** Template interface for generic observers.
+  
+    This is a pure virtual class that should be used as a base to classes 
+    wishing to receive notifications from GenericObservable classes.
+*/
+template <typename T> 
+class GenericObserverInterface : public GenericObserverBase {
+public:
+  virtual ~GenericObserverInterface() {};
+
+  /** Update function.
+
+      This function is called each time the observables notifies its observers
+      of a change. It must be implemented by all classes obeying the 
+      GenericObserverInterface interface.
+
+      @param observable is a pointer to the observed object that was updated.
+  */
+  virtual void update(T* observable) = 0;
+};
+
+} // namespace pacpus
+
+
+#endif // DEF_PACPUS_GENERIC_OBSERVER_INTERFACE_H
Index: tags/0.2.3/include/Pacpus/kernel/InputOutputBase.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/InputOutputBase.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/InputOutputBase.h	(revision 368)
@@ -0,0 +1,114 @@
+#ifndef IN_OUT_BASE_H
+#define IN_OUT_BASE_H
+
+#include <Pacpus/kernel/ConnectionBase.h>
+#include <Pacpus/kernel/Log.h>
+#include <Pacpus/kernel/PacpusEvent.h>
+#include <Pacpus/kernel/PacpusLibConfig.h>
+
+#include <boost/smart_ptr/shared_ptr.hpp>
+//#include <boost/smart_ptr/weak_ptr.hpp>
+#include <QList>
+#include <QString>
+#include <QStringList>
+#include <typeinfo>
+
+class QByteArray;
+
+namespace pacpus
+{
+
+class ComponentBase;
+
+class PACPUSLIB_API AbstractInterface
+    : public QObject
+{
+     Q_OBJECT
+
+protected:
+    AbstractInterface(QString name, ComponentBase * component, QObject * parent = 0);
+    virtual ~AbstractInterface();
+
+public:
+    QString getSignature() const;
+    QString getName() const;
+    virtual std::size_t getDataSize() const = 0;
+    virtual const std::type_info & getDataType() const = 0;
+    
+    //virtual PacpusEvent * getEventTemplate() = 0;
+    
+    void addConnection(ConnectionBase connection);
+    bool removeConnection(ConnectionBase connection);
+    bool hasConnection();
+    
+protected:
+    QList<ConnectionBase> & connections();
+    const QList<ConnectionBase> & getConnections() const;
+
+    ComponentBase * component();
+    const ComponentBase * getComponent() const;
+    
+private:
+    QString m_name;
+    ComponentBase * m_component;
+    QList<ConnectionBase> m_connections;
+};
+
+class PACPUSLIB_API InputInterfaceBase
+    : public AbstractInterface
+{
+    Q_OBJECT
+
+protected:
+    // TODO: add ctor with function pointer
+    InputInterfaceBase(QString name, ComponentBase * component, QObject * parent = 0);
+
+public:
+    enum ReadingMode {
+        NeverSkip,
+        TimeBounded,
+        GetLast
+    };
+
+    virtual ~InputInterfaceBase();
+
+    virtual void customEvent(QEvent * e);
+
+    ReadingMode & readingMode();
+    const ReadingMode & getReadingMode() const;
+    void setReadingMode(ReadingMode mode);
+
+    // FIXME: what's the purpose of this function?
+    virtual PacpusEvent * getEventTemplate();
+    
+private:
+    ReadingMode m_readingMode;
+
+    // metode(QByteArray)
+    //QQueue jobQueue_;
+};
+
+class PACPUSLIB_API OutputInterfaceBase
+    : public AbstractInterface
+{
+    Q_OBJECT
+
+public:
+    OutputInterfaceBase(QString name, ComponentBase * component, QObject * parent = 0)
+        : AbstractInterface(name, component, parent)
+    {}
+
+    virtual ~OutputInterfaceBase()
+    {}
+
+    QStringList getInputConnectedList();
+
+    //void send(/*const*/ QByteArray & data);
+};
+
+typedef boost::shared_ptr<InputInterfaceBase> InputSharedPointer;
+typedef boost::shared_ptr<OutputInterfaceBase> OutputSharedPointer;
+
+} // namespace pacpus
+
+#endif // IN_OUT_BASE_H
Index: tags/0.2.3/include/Pacpus/kernel/InputOutputInterface.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/InputOutputInterface.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/InputOutputInterface.h	(revision 368)
@@ -0,0 +1,293 @@
+#ifndef IN_OUT_INTERFACE_H
+#define IN_OUT_INTERFACE_H
+
+#include <Pacpus/kernel/InputOutputBase.h>
+#include <Pacpus/kernel/Log.h>
+
+#include <boost/function.hpp>
+#include <QByteArray>
+#include <QCoreApplication>
+//#include <QThread>
+#include <typeinfo>
+
+namespace pacpus
+{
+
+template <typename T, class C>
+class InputInterface
+    : public InputInterfaceBase
+{
+public:
+    typedef T data_type;
+    typedef C component_type;
+    typedef void (C::*process_data_function_type_with_event)(T&, PacpusEvent);
+    typedef void (C::*process_data_function_type)(T&);
+    typedef void (C::*process_const_data_function_type_with_event)(T const&, PacpusEvent);
+    typedef void (C::*process_const_data_function_type)(T const&);
+    //typedef boost::function<void (C*, T&, PacpusEvent)> process_data_function_type_with_event;
+    //typedef boost::function<void (C*, T&)> process_data_function_type;
+    //typedef boost::function<void (C*, T const&, PacpusEvent)> process_const_data_function_type_with_event;
+    //typedef boost::function<void (C*, T const&)> process_const_data_function_type;
+
+    void initialize()
+    {
+        // each input slot will be processed by a separate thread
+        //moveToThread(&mProcessingThread);
+        //mProcessingThread.start();
+    }
+
+    InputInterface(QString name, C* component, process_data_function_type_with_event processingMethod)
+        : InputInterfaceBase(name, component, component)
+    {
+        mProcessingMethod.fe = processingMethod;
+        initialize();
+    }
+    
+    InputInterface(QString name, C* component, process_data_function_type processingMethod)
+        : InputInterfaceBase(name, component, component)
+    {
+        mProcessingMethod.f = processingMethod;
+        initialize();
+    }
+    
+    InputInterface(QString name, C* component, process_const_data_function_type_with_event processingMethod)
+        : InputInterfaceBase(name, component, component)
+    {
+        mProcessingMethod.cfe = processingMethod;
+        initialize();
+    }
+    
+    InputInterface(QString name, C* component, process_const_data_function_type processingMethod)
+        : InputInterfaceBase(name, component, component)
+    {
+        mProcessingMethod.cf = processingMethod;
+        initialize();
+    }
+
+    ~InputInterface()
+    {
+    }
+
+    std::size_t getDataSize() const
+    {
+        return sizeof(T);
+    }
+
+    std::type_info const& getDataType() const
+    {
+        return typeid(T);
+    }
+
+    // FIXME: what's the purpose of this function?
+    //PacpusEvent * getEventTemplate()
+    //{
+    //    return new PacpusTypedEvent<T>(TYPED_EVENT);
+    //}
+
+    // FIXME: what's the purpose of this function?
+    void customEvent(QEvent* event)
+    {
+        static road_timerange_t const kMaximumBoundedTimeRange = 500;
+
+        if (!event) {
+            LOG_WARN("null event");
+            return;
+        }
+        
+        // check that component has been started
+        if ((NULL == getComponent()) || (!getComponent()->isActive())) {
+            LOG_DEBUG("component is not active");
+            return;
+        }
+        
+        LOG_TRACE("Receiver: " << getSignature());
+
+        //PacpusTypedEvent<T>* typedEvent = dynamic_cast<PacpusTypedEvent<T> *>(event);
+        PacpusEvent* pacpusEvent = dynamic_cast<PacpusEvent*>(event);
+        if (!pacpusEvent) {
+            LOG_WARN("dynamic_cast failed: not a PacpusEvent");
+            return;
+        }
+        PacpusTypedEvent<T>* typedEvent = dynamic_cast<PacpusTypedEvent<T>*>(pacpusEvent);
+        if (!typedEvent) {
+            LOG_WARN("dynamic_cast failed: incompatible event types");
+            return;
+        }
+
+        switch (event->type()) {
+        case TYPED_EVENT:
+            if (TimeBounded == readingMode() && typedEvent->timerange() < kMaximumBoundedTimeRange) {
+                LOG_WARN("Incorrect TimeRange (< " << kMaximumBoundedTimeRange << "), switching to NeverSkip mode");
+                readingMode() = NeverSkip;
+            }
+
+            switch (readingMode()) {
+            case TimeBounded:
+                if (road_time() - typedEvent->time() > typedEvent->timerange()) {
+                    LOG_TRACE("Data skipped, receiver: " << this->getSignature());
+                    break;
+                }
+
+                mProcessingMethod.invoke(component(), typedEvent->data(), *typedEvent);
+                break;
+
+            case GetLast:
+                mProcessingMethod.invoke(component(), typedEvent->data(), *typedEvent);
+
+                // delete all remaining events
+                QCoreApplication::removePostedEvents(this, TYPED_EVENT);
+                break;
+
+            case NeverSkip:
+                mProcessingMethod.invoke(component(), typedEvent->data(), *typedEvent);
+                break;
+
+            default:
+                LOG_WARN("Unknown reading mode " << readingMode());
+                break;
+            }
+            break;
+
+        // Add here new event type if needed
+
+        default:
+            LOG_WARN("Unknown event ID " << event->type());
+            break;
+        }
+        event->accept();
+    }
+
+    // TODO: pull mode (NOT YET IMPLEMENTED!!!)
+    T& getData()
+    {
+        T data;
+        // TODO: ask the  output data;
+        return data;
+    }
+
+protected:
+    struct ProcessingMethod
+    {
+        ProcessingMethod()
+        {
+            fe = NULL;
+            f = NULL;
+            cfe = NULL;
+            cf = NULL;
+        }
+
+        void invoke(ComponentBase* component, T& data, PacpusEvent event)
+        {
+            C* comp = dynamic_cast<C*>(component);
+            if (NULL == comp) {
+                LOG_WARN("NULL component");
+                return;
+            }
+            //if (fe) {
+            //    fe(comp, data, event);
+            //} else if (f) {
+            //    f(comp, data);
+            //} else if (cfe) {
+            //    cfe(comp, data, event);
+            //} else if (cf) {
+            //    cf(comp, data);
+            //} else {
+            //    LOG_WARN("no method to invoke");
+            //}
+            if (fe) {
+                (comp->*fe)(data, event);
+            } else if (f) {
+                (comp->*f)(data);
+            } else if (cfe) {
+                (comp->*cfe)(data, event);
+            } else if (cf) {
+                (comp->*cf)(data);
+            } else {
+                LOG_WARN("no method to invoke");
+            }
+        }
+            
+        process_data_function_type_with_event fe;
+        process_data_function_type f;
+        process_const_data_function_type_with_event cfe;
+        process_const_data_function_type cf;
+    };
+
+    ProcessingMethod mProcessingMethod;
+    //QThread mProcessingThread;
+};
+
+template <typename T, class C>
+class OutputInterface
+    : public OutputInterfaceBase
+{
+public:
+    typedef T data_type;
+    typedef C component_type;
+
+    OutputInterface(QString name, C* component)
+        : OutputInterfaceBase(name, component, component)
+    {}
+
+    ~OutputInterface()
+    {}
+
+    /// Send data through a typed output
+    void send(T const& data, road_time_t t = road_time(), road_timerange_t tr = 0);
+    
+    std::size_t getDataSize() const
+    {
+        return sizeof(T);
+    }
+
+    std::type_info const& getDataType() const
+    {
+        return typeid(T);
+    }
+};
+
+template <typename T, class C>
+void OutputInterface<T, C>::send(T const& data, road_time_t t, road_timerange_t tr)
+{
+    // FIXME: use shared data
+    //QSharedPointer<T> sharedPointer = new T(data);
+
+    for (QList<ConnectionBase>::iterator it = connections().begin(), itend = connections().end(); it != itend; ++it) {
+        // Qt documentation:
+        //  The event must be allocated on the heap since the post event queue will take ownership of the event and delete it once it has been posted.
+        //  It is not safe to access the event after it has been posted.    
+        QEvent* pacpusEvent = new PacpusTypedEvent<T>(TYPED_EVENT, data, t, tr);
+        QCoreApplication::postEvent(
+            it->getInterface(), 
+            pacpusEvent, 
+            it->getPriority()
+        );
+        LOG_TRACE("Sending from " << getSignature() << " to " << it->getInterface()->getSignature());
+    }
+}
+
+template <typename T1, typename T2, class C>
+bool checkedSend(OutputInterface<T1, C>* sender, T2 const& data, road_time_t t = road_time(), road_timerange_t tr = 0);
+
+template <typename T1, typename T2, class C>
+bool checkedSend(OutputInterface<T1, C>* sender, T2 const& data, road_time_t t, road_timerange_t tr)
+{
+    if (sender && sender->hasConnection()) {
+        sender->send(data, t, tr);
+        return true;
+    }
+    return false;
+}
+
+//template <typename T1, typename T2, class C>
+//bool checkedSend(boost::shared_ptr< OutputInterface<T1, C> > sender, T2 const& data, road_time_t t = road_time(), road_timerange_t tr = 0);
+//
+//template <typename T1, typename T2, class C>
+//bool checkedSend(boost::shared_ptr< OutputInterface<T1, C> > sender, T2 const& data, road_time_t t, road_timerange_t tr)
+//{
+//    return checkedSend(sender.get(), data, t, tr);
+//}
+
+} // namespace pacpus
+
+#endif // IN_OUT_INTERFACE_H
Index: tags/0.2.3/include/Pacpus/kernel/Log.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/Log.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/Log.h	(revision 368)
@@ -0,0 +1,89 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    March, 2012
+/// @version $Id: Log.h 73 2013-01-10 16:56:42Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Logging facility.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_LOG_H
+#define DEF_PACPUS_LOG_H
+
+#include <Pacpus/kernel/PacpusLibConfig.h>
+
+namespace pacpus
+{
+
+/// Static log facility initializer
+///
+/// Uses Schwarz counter (nifty counter) idiom to initialize the log before
+/// other static objects that could use the log.
+static class PACPUSLIB_API LogConfigurator
+{
+public:
+    LogConfigurator();
+    ~LogConfigurator();
+    static void configureLoggerWithFile(const char * configFilename);
+} logInitializer;
+
+} // namespace pacpus
+
+#if defined(PACPUS_USE_LOG)
+#   include <boost/log/common.hpp>
+#   include <boost/log/attributes/named_scope.hpp>
+#   include <boost/log/core.hpp>
+#   include <boost/log/sources/record_ostream.hpp>
+#   include <boost/log/sources/severity_logger.hpp>
+#   include <boost/log/trivial.hpp>
+#   include <iosfwd>
+
+namespace pacpus
+{
+
+    typedef boost::log::trivial::severity_level SeverityLevel;
+    using boost::log::trivial::trace;
+    using boost::log::trivial::debug;
+    using boost::log::trivial::info;
+    using boost::log::trivial::warning;
+    using boost::log::trivial::error;
+    using boost::log::trivial::fatal;
+
+    BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(gLogger, ::boost::log::sources::severity_logger_mt< ::pacpus::SeverityLevel>)
+
+} // namespace pacpus
+
+class QString;
+template< typename CharT, typename TraitsT >
+PACPUSLIB_API std::basic_ostream< CharT, TraitsT >& operator<< (std::basic_ostream< CharT, TraitsT >& strm, QString const& s);
+
+#   define DECLARE_STATIC_LOGGER(name)        //BOOST_LOG_NAMED_SCOPE(name)
+#   define PACPUS_LOG_FUNCTION()              BOOST_LOG_FUNCTION()
+#   define PACPUS_LOG_NAMED_SCOPE(name)       BOOST_LOG_NAMED_SCOPE(name)
+#   define PACPUS_LOG(level, message)         BOOST_LOG_SEV( ::pacpus::gLogger::get(), level) << message
+#else
+/// @param name Name of the logger, displayed when logging a message.
+#   define DECLARE_STATIC_LOGGER(name)
+#   define PACPUS_LOG_FUNCTION()              ((void) 0)
+#   define PACPUS_LOG_NAMED_SCOPE(name)       ((void) 0)
+#   define PACPUS_LOG(level, message)         ((void) 0)
+#endif // PACPUS_USE_LOG
+
+/// Logs a message at TRACE level using default logger
+#define LOG_TRACE(message)          PACPUS_LOG( ::pacpus::trace, message)
+/// Logs a message at DEBUG level using default logger
+#define LOG_DEBUG(message)          PACPUS_LOG( ::pacpus::debug, message)
+/// Logs a message at INFO level using default logger
+#define LOG_INFO(message)           PACPUS_LOG( ::pacpus::info, message)
+/// Logs a message at WARN level using default logger
+#define LOG_WARN(message)           PACPUS_LOG( ::pacpus::warning, message)
+/// Logs a message at ERROR level using default logger
+#define LOG_ERROR(message)          PACPUS_LOG( ::pacpus::error, message)
+/// Logs a message at FATAL level using default logger
+#define LOG_FATAL(message)          PACPUS_LOG( ::pacpus::fatal, message)
+
+#endif // DEF_PACPUS_LOG_H
Index: tags/0.2.3/include/Pacpus/kernel/PacpusApplication.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/PacpusApplication.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/PacpusApplication.h	(revision 368)
@@ -0,0 +1,50 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    March, 2013
+/// @version $Id$
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Generic ComponentBase class. This is an abstract class.
+///
+/// Detailed description.
+
+#ifndef PACPUSAPPLICATION_H
+#define PACPUSAPPLICATION_H
+
+#include <Pacpus/kernel/PacpusLibConfig.h>
+
+#include <QApplication>
+
+namespace pacpus {
+
+class PACPUSLIB_API PacpusApplication
+    : public QApplication
+{
+public:
+#ifndef qdoc
+    PacpusApplication(int &argc, char **argv, int = ApplicationFlags);
+//    PacpusApplication(int &argc, char **argv, bool GUIenabled, int = ApplicationFlags);
+//    PacpusApplication(int &argc, char **argv, Type, int = ApplicationFlags);
+#if defined(Q_WS_X11)
+    PacpusApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0, int = ApplicationFlags);
+    PacpusApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0, int = ApplicationFlags);
+#endif
+#if defined(Q_OS_SYMBIAN)
+    PacpusApplication(QApplication::QS60MainApplicationFactory factory, int &argc, char **argv, int = ApplicationFlags);
+#endif
+#endif
+
+    virtual	~PacpusApplication();
+
+    virtual bool notify(QObject * receiver, QEvent * ev);
+
+private:
+    void installSignalHandler();
+};
+
+} //namespace pacpus
+
+#endif // PACPUSAPPLICATION_H
Index: tags/0.2.3/include/Pacpus/kernel/PacpusEvent.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/PacpusEvent.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/PacpusEvent.h	(revision 368)
@@ -0,0 +1,218 @@
+#ifndef PACPUS_EVENT_H
+#define PACPUS_EVENT_H
+
+#include <Pacpus/kernel/PacpusLibConfig.h>
+#include <Pacpus/kernel/road_time.h>
+
+#include <algorithm>
+#include <QDataStream>
+#include <QEvent>
+
+namespace pacpus {
+
+// registerEventType // TODO
+
+// FIXME: move to another header file
+enum PacpusEventType {
+    TYPED_EVENT = 1000,
+    GENERIC_EVENT = 2000,
+    GENERIC_EVENT2 = 2002,
+    GENERIC_EVENT3 = 2003,
+    CONFIG_EVENT = 3000
+};
+
+class PACPUSLIB_API PacpusEvent
+    : public QEvent
+{
+    Q_GADGET // permits to use signals and slots (using Q_SIGNAL, Q_SLOT) without inheriting from QObject
+
+public:
+    PacpusEvent(PacpusEventType type, road_time_t t = road_time(), road_timerange_t tr = 0)
+        : QEvent(QEvent::Type(type))
+        , m_time(t)
+        , m_timerange(tr)
+    {}
+
+    virtual ~PacpusEvent()
+    {}
+
+    // TODO: should we make it virtual pure ???
+    virtual QDataStream & streamOut(QDataStream & out)
+    {
+        return out;
+    }
+
+    // TODO: should we make it virtual pure ???
+    virtual QDataStream& streamIn(QDataStream& in)
+    {
+        return in;
+    }
+
+    road_time_t& time()
+    {
+        return m_time;
+    }
+
+    road_time_t const& time() const
+    {
+        return m_time;
+    }
+
+    road_timerange_t& timerange()
+    {
+        return m_timerange;
+    }
+
+    road_timerange_t const& timerange() const
+    {
+        return m_timerange;
+    }
+
+protected:
+    road_time_t m_time;
+    road_timerange_t m_timerange;
+};
+
+template <typename T>
+class /*PACPUSLIB_API*/ TypedData
+{
+public:
+    TypedData(const T & data)
+        : m_data(data)
+    {
+    }
+
+    ~TypedData()
+    {
+    }
+
+    T & data()
+    {
+        return m_data;
+    }
+
+    const T & data() const
+    {
+        return m_data;
+    }
+
+    std::size_t size() const
+    {
+        return sizeof(T);
+    }
+
+private:
+    T m_data;
+};
+
+template<class T>
+class /*PACPUSLIB_API*/ PacpusTypedEvent
+    : public PacpusEvent
+    , public TypedData<T>
+{
+public:
+    // FIXME: why we need `data = T()` ???
+    PacpusTypedEvent(PacpusEventType type, const T & data/* = T()*/, road_time_t t = road_time(), road_timerange_t tr = 0)
+        : PacpusEvent(type, t, tr)
+        , TypedData<T>(data)
+    {
+    }
+    
+    /// Conversion constructor from another PacpusTypedEvent,
+    /// when T is convertible to S
+    template <typename S>
+    PacpusTypedEvent(PacpusTypedEvent<S> const& other)
+        : PacpusEvent(static_cast<PacpusEventType>(other.type()), other.time(), other.timerange())
+        , TypedData<T>(other.data())
+    {
+    }
+
+    ~PacpusTypedEvent()
+    {
+    }
+
+    QDataStream & streamOut(QDataStream & out)
+    {
+        // FIXME Stream Data errors
+        return out << (quint64) time() << timerange() /*<< m_data*/;
+    }
+
+    QDataStream & streamIn(QDataStream & in)
+    {
+        return in >> (quint64&) time() >> timerange() /*>> m_data*/;
+    }
+};
+
+class PACPUSLIB_API GenericData
+{
+public:
+    GenericData(char const* data, size_t size)
+        : m_data(NULL)
+        , m_dataSize(size)
+    {
+        m_data = new char[m_dataSize];
+        ::std::copy(data, data + m_dataSize, // source
+#ifdef _MSC_VER
+            ::stdext::checked_array_iterator<char *>(m_data, m_dataSize) // destination
+#else
+            m_data // destination
+#endif
+            );
+    }
+
+    ~GenericData()
+    {
+        delete[] m_data;
+    }
+
+    char * data()
+    {
+        return m_data;
+    }
+    
+    const char * data() const
+    {
+        return m_data;
+    }
+
+    std::size_t size() const
+    {
+        return m_dataSize;
+    }
+
+private:
+    char * m_data;
+    std::size_t m_dataSize;
+};
+
+class PACPUSLIB_API PacpusGenericEvent
+    : public PacpusEvent
+    , public GenericData
+{
+public:
+    PacpusGenericEvent(PacpusEventType type, const char * data, size_t size)
+        : PacpusEvent(type)
+        , GenericData(data, size)
+    {
+    }
+
+    virtual ~PacpusGenericEvent()
+    {
+    }
+};
+
+} // namespace pacpus
+
+PACPUSLIB_API inline QDataStream & operator<<(QDataStream & out, pacpus::PacpusEvent& /*ev*/)
+{
+    /*return ev.streamOut(out);*/
+    return out;
+}
+
+PACPUSLIB_API inline QDataStream & operator>>(QDataStream & in, pacpus::PacpusEvent& /*ev*/)
+{
+    /*return ev.streamIn(in);*/
+    return in;
+}
+
+#endif // PACPUS_EVENT_H
Index: tags/0.2.3/include/Pacpus/kernel/PacpusException.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/PacpusException.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/PacpusException.h	(revision 368)
@@ -0,0 +1,56 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    June, 2013
+/// @version $Id$
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_PACPUSEXCEPTION_H
+#define DEF_PACPUS_PACPUSEXCEPTION_H
+
+#include <Pacpus/kernel/PacpusLibConfig.h>
+
+#include <boost/exception/exception.hpp>
+#include <boost/exception/error_info.hpp>
+#include <stdexcept>
+#include <string>
+
+#ifdef _MSC_VER
+#   pragma warning(push)
+#   pragma warning(disable: 4251 4275)
+#endif // _MSC_VER
+
+namespace pacpus
+{
+
+/// Base class for all exceptions in the framework
+class PACPUSLIB_API PacpusException
+    : /*virtual*/ public std::runtime_error
+    , virtual public boost::exception
+{
+public:
+    PacpusException(char const* what);
+
+    /// Ctor.
+    /// @param what Information about the exception.
+    PacpusException(std::string const& what = "");
+
+    /// Dtor.
+    virtual ~PacpusException() throw();
+};
+
+} // namespace pacpus
+
+typedef boost::error_info<struct tag_errinfo_signal, int> errinfo_signal;
+
+#ifdef _MSC_VER
+#   pragma warning(pop)
+#endif // _MSC_VER
+
+#endif // DEF_PACPUS_PACPUSEXCEPTION_H
Index: tags/0.2.3/include/Pacpus/kernel/PacpusPluginInterface.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/PacpusPluginInterface.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/PacpusPluginInterface.h	(revision 368)
@@ -0,0 +1,34 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: PacpusPluginInterface.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_PLUGININTERFACE_H
+#define DEF_PACPUS_PLUGININTERFACE_H
+
+#include <QObject>
+
+/** PacpusPluginInterface
+ * @brief Base class of a Pacpus plugin.
+ */
+class PacpusPluginInterface
+{
+public:
+  /** Dtor of PacpusPluginInterface. */
+  virtual ~PacpusPluginInterface(){} 
+  
+  /** Name of the plugin. */
+  virtual QString name() = 0;
+};
+
+Q_DECLARE_INTERFACE(PacpusPluginInterface, "pacpus.ComponentBaseInterface/1.0")
+
+#endif // DEF_PACPUS_PLUGININTERFACE_H
Index: tags/0.2.3/include/Pacpus/kernel/XmlComponentConfig.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/XmlComponentConfig.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/XmlComponentConfig.h	(revision 368)
@@ -0,0 +1,117 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    January, 2006
+/// @version $Id: XmlComponentConfig.h 79 2013-01-14 08:52:06Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Purpose:    definit la structure XML des paramètres de configuration
+///             d'un composant
+
+#ifndef DEF_PACPUS_XMLCOMPONENTCONFIG_H
+#define DEF_PACPUS_XMLCOMPONENTCONFIG_H
+
+#include <Pacpus/kernel/PacpusLibConfig.h>
+
+#include <QDomElement>
+
+namespace pacpus {
+    
+//class QDomNamedNodeMap;
+class XmlConfigFile;
+
+/** XmlComponentConfig
+ * @brief Defines the XML structure of a component.
+ */
+class PACPUSLIB_API XmlComponentConfig
+{
+    friend class ComponentManager;
+public:
+    /** Ctor of XmlComponentConfig.
+     * @param name Name of the ComponentFactory, by convention equal to class name.
+     */
+    explicit XmlComponentConfig(QString const& name = QString::null);
+
+    /** Dtor of XmlComponentConfig. */
+    ~XmlComponentConfig();
+
+    QDomNamedNodeMap getProperties() const;
+
+    /** Add the property @em name to the XML and set its value to @em 0 if it does not exist.
+     * @param name Name of the property.
+     */
+    void addProperty(QString const& name);
+
+    /** Delete a property from the XML.
+     * @return False if the property does not exist, false otherwise.
+     */
+    int delProperty(QString const& name);
+
+    /** Get the value of a property.
+     * @param name Name of the property.
+     * @param defaultValue Value returned if the property does not exist.
+     * @return Value of the property, @em defaultValue otherwise.
+     */
+    QString getProperty(QString const& name, QString const& defaultValue = QString::null) const;
+
+    /** Get the value of a property as a boolean.
+     * @param name Name of the property.
+     * @param defaultValue Value returned if the property does not exist.
+     * @return Value of the property, @em defaultValue otherwise.
+     */
+    bool getBoolProperty(QString const& name, bool defaultValue = false) const;
+
+    /** Get the value of a property as an integer.
+     * @param name Name of the property.
+     * @param defaultValue Value returned if the property does not exist.
+     * @return Value of the property, @em defaultValue otherwise.
+     */
+    int getIntProperty(QString const& name, int defaultValue = 0) const;
+
+    /** Get the value of a property as a double.
+     * @param name Name of the property.
+     * @param defaultValue Value returned if the property does not exist.
+     * @return Value of the property, @em defaultValue otherwise.
+     */
+    double getDoubleProperty(QString const& name, double defaultValue = 0.0) const;
+
+    /** Set the value of a property.
+     * @param name Name of the property.
+     * @param value Value to set.
+     */
+    void setProperty(QString const& name, QString const& value);
+
+    /** Check if a property exists.
+     * @param name Name of the property.
+     * @return True if the property exists, false otherwise.
+     */
+    bool hasProperty(QString const& name) const;
+    
+public:
+    // Returns the local QDomElement.
+    QDomElement const& getDomElement() const;
+    
+private:
+    // Copy internally the node in the internal QDomElement. 
+    void localCopy(const QDomElement & elementToCopy);
+
+    QString const getComponentName() const;
+    QString const getComponentType() const;
+
+    QString const getConnectionType() const;
+    QString const getConnectionInput() const;
+    QString const getConnectionOutput() const;
+    int const getConnectionPriority() const;
+
+private:
+    QDomElement component_;
+    XmlConfigFile * parentDocument_;
+};
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_XMLCOMPONENTCONFIG_H
Index: tags/0.2.3/include/Pacpus/kernel/XmlConfigFile.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/XmlConfigFile.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/XmlConfigFile.h	(revision 368)
@@ -0,0 +1,115 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    January, 2006
+/// @version $Id: XmlConfigFile.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Purpose:    Classe permettant d'enregistrer un fichier de 
+///             configuration XML
+///             Le fichier XML contient 2 sections : 
+///             - parameters : contient les parametres de l'application 
+///             - components : contient les composants
+///             les composants ne peuvent pas avoir de noeuds fils
+///
+/// @todo       Creer une dtd qui permet de definir la liste des classes possibles
+///             que peuvent prendre les composants 
+
+#ifndef DEF_PACPUS_XMLCONFIGFILE_H
+#define DEF_PACPUS_XMLCONFIGFILE_H
+
+#include <Pacpus/kernel/deprecated.h>
+#include <Pacpus/kernel/PacpusLibConfig.h>
+#include <Pacpus/kernel/XmlComponentConfig.h>
+
+#include <QDomElement>
+#include <QFile>
+#include <QMutex>
+#include <QStringList>
+
+class QFile;
+
+namespace pacpus {
+
+/// XML config properties:
+///     list            STRING(S)   name(s) of plugin files to be loaded, separated by pipe symbol '|'
+///         e.g. dbt="libDbtPlyGps.so|libDbtPlyVision.so
+class PACPUSLIB_API XmlConfigFile
+{
+    friend XmlComponentConfig::XmlComponentConfig(QString const&);
+    friend class ComponentManager;
+
+public:
+    /// @todo Documentation
+    static XmlConfigFile * create();
+    /// @todo Documentation
+    static void destroy();
+
+    /// @returns a list of all names of components declared in the XML tree
+    QStringList getAllComponentsNames() const;
+    /// @todo Documentation
+    QDomElement getComponent(QString name) const;
+    
+    // TODO: QStringList getAllConnectionsNames() const;
+    QDomElement getConnection(QString connectionName) const;
+
+    /// @todo Documentation
+    QStringList getAllPluginsNames();
+    
+    /// @todo Documentation
+    int loadFile(QString fileName);
+
+    /// @todo Documentation
+    /// not used
+    void saveFile(QString fileName);
+    
+    /// @todo Documentation
+    /// not used
+    void addComponent(QDomElement component);
+    
+    /// @todo Documentation
+    /// @deprecated Use removeComponent()
+    /// not used
+    PACPUS_DEPRECATED_MSG( void delComponent(QDomElement component), "use removeComponent()" );
+    void removeComponent(QDomElement component);
+
+protected:
+    QDomElement getSection(const char * name) const;
+    QDomNodeList getNodesInSection(const char * sectionName, const char * nodeName) const;
+
+    QDomNodeList getAllComponents() const;
+    QDomNodeList getAllConnections() const;
+    QDomNodeList getAllParameters() const;
+    QDomNodeList getAllPlugins();
+
+private:
+    XmlConfigFile();
+    ~XmlConfigFile();
+
+    QDomElement createComponent(QString name);
+
+    QString libraryExtension() const;
+    QString libraryPrefix() const;
+    QString libraryPostfix() const;
+
+private:
+    static XmlConfigFile * m_xmlConfigFile;
+    
+    QDomDocument m_document;
+    QFile m_file;
+    QMutex m_mutex;
+
+    QString m_libraryExtension;
+    QString m_libraryPrefix;
+    QString m_libraryPostfix;
+    
+    int m_numberOfComponents;
+};
+
+} // namespace pacpus
+
+#endif // DEF_PACPUS_XMLCONFIGFILE_H
Index: tags/0.2.3/include/Pacpus/kernel/cstdint.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/cstdint.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/cstdint.h	(revision 368)
@@ -0,0 +1,38 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: cstdint.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Portable version of \<cstdint\> C99 header.
+///
+/// Portable version of \<cstdint\> C99 header.
+/// It is necessary due to the non-conformance of MSVC before version 2010 to the C99 standard.
+
+#ifndef DEF_PACPUS_CSTDINT_H
+#define DEF_PACPUS_CSTDINT_H
+
+#if defined(_MSC_VER) && _MSC_VER < 1600
+// MSVC before 2010 has not <stdint.h> header (is not C99-compatible)
+
+typedef __int8      int8_t;
+typedef __int16     int16_t;
+typedef __int32     int32_t;
+typedef __int64     int64_t;
+
+typedef unsigned __int8      uint8_t;
+typedef unsigned __int16    uint16_t;
+typedef unsigned __int32    uint32_t;
+typedef unsigned __int64    uint64_t;
+
+#else
+
+#include <stdint.h>
+
+#endif
+
+#endif // DEF_PACPUS_CSTDINT_H
+
Index: tags/0.2.3/include/Pacpus/kernel/deprecated.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/deprecated.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/deprecated.h	(revision 368)
@@ -0,0 +1,36 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    2014-04-07 10:38:32
+/// @version $Id$
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef PACPUS_DEPRECATED_H
+#define PACPUS_DEPRECATED_H
+
+/// @def PACPUS_DEPRECATED(func)
+/// Develops to the function or method declaration @b func
+/// and marks it as deprecated.
+
+/// @def PACPUS_DEPRECATED_MSG(func, msg)
+/// Develops to the function or method declaration @b func
+/// and marks it as deprecated with a given comment @b msg.
+#ifdef __GNUC__
+#   define PACPUS_DEPRECATED(func)              func __attribute__ ((deprecated))
+#   define PACPUS_DEPRECATED_MSG(func, msg)     PACPUS_DEPRECATED(func)
+#elif defined(_MSC_VER)
+#   define PACPUS_DEPRECATED(func)              __declspec(deprecated) func
+#   define PACPUS_DEPRECATED_MSG(func, msg)     __declspec(deprecated("was declared deprecated: " msg)) func
+#else
+#   pragma message("WARNING: You need to implement PACPUS_DEPRECATED for this compiler")
+#   define PACPUS_DEPRECATED(func)              func
+#   define PACPUS_DEPRECATED_MSG(func, msg)     func
+#endif
+
+#endif // PACPUS_DEPRECATED_H
Index: tags/0.2.3/include/Pacpus/kernel/hdfile_header_t.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/hdfile_header_t.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/hdfile_header_t.h	(revision 368)
@@ -0,0 +1,71 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Firstname Surname <firstname.surname@utc.fr>
+/// @date    Month, Year
+/// @version $Id: hdfile_header_t.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_HDFILE_HEADER_T_H
+#define DEF_HDFILE_HEADER_T_H
+
+#include <Pacpus/kernel/cstdint.h>
+#include <Pacpus/kernel/road_time.h>
+
+/// @todo Documentation
+#define HEADER_SIGNATURE_LENGTH 4
+/// @todo Documentation
+#define VERSION_NUMBER 2
+
+#pragma pack(push,4)
+/// @todo Documentation
+struct hdfile_header_t
+{
+    /// @todo Documentation
+    typedef  int8_t SignatureT;
+    /// @todo Documentation
+    typedef int32_t DataTypeT;
+    /// @todo Documentation
+    typedef int32_t VersionT;
+    /// @todo Documentation
+    typedef int32_t DataSizeT;
+    /// @todo Documentation
+    typedef int32_t DataOffsetT;
+    /// @todo Documentation
+    /// @todo FIXME: file size should be 64-bit long to support large (>2GB) files
+    typedef int32_t FileSizeT;
+    /// @todo Documentation
+    typedef int32_t RecordCountT;
+
+    /// @todo Documentation
+    static const DataSizeT kVariableRecordSize = -1;
+
+    /// @todo Documentation
+    SignatureT      Signature[HEADER_SIGNATURE_LENGTH];
+    /// Record data type.
+    /// Should default to ::FILE_DBT_UNKNOWN
+    /// @see DbiteFileTypes.h for more information about available types.
+    DataTypeT       Type;
+    /// File format version
+    VersionT        VersionNumber;
+    /// Offset indicating the start of the data [bytes]
+    DataOffsetT     DataOffset;
+    /// Current size of the data, without header [bytes]
+    DataSizeT       DataSize;
+    /// Current size of the file [bytes]
+    FileSizeT       FileSize;
+    /// @todo Documentation
+    road_time_t     TimeMin;
+    /// @todo Documentation
+    road_time_t     TimeMax;
+    /// Number of records already in the file
+    RecordCountT    NbRecords;
+};
+#pragma pack(pop)
+
+#endif // DEF_HDFILE_HEADER_T_H
Index: tags/0.2.3/include/Pacpus/kernel/pacpus.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/pacpus.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/pacpus.h	(revision 368)
@@ -0,0 +1,68 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    February, 2006
+/// @version $Id: pacpus.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef DEF_PACPUS_H
+#define DEF_PACPUS_H
+
+#include <Pacpus/kernel/road_time.h>
+
+struct donnees_gps
+{
+    long  ind_qualite;
+    double x, y;
+    double lon, lat;
+    float a, b, phi, sigma_lat, sigma_lon;
+    road_time_t time;
+    double alt_msl, d_geoidal;
+};
+
+struct donnees_abs_zy
+{
+    float dArD, dArG;
+    float speed;
+    road_time_t time;
+};
+
+struct donnees_gyro
+{
+    // les mesures sont prises par rapport au point C
+    // position de la centrale inertielle
+    // vitesse de lacet (rad.s-1) dans le repère de la masse suspendue
+    float psi_s;
+    road_time_t time;
+};
+
+/// Definition of the structure which will be sent for each positioning
+/// requests -> MapMatching.cpp 
+struct s_MatchedPosition
+{
+    int				state;      /* Etat du serveur de position absolue hybridée*/
+    double			x_match;	/* Position Matchée         */
+    double			y_match;	/*  en x et y				*/
+    double			x;			/* Position du véhicule		*/
+    double			y;			/*	en x et y				*/
+    double			theta;		/* cap (par rapport à l'est) dans le système de la carte */
+    double			v;			/* vitesse horizontale par rapport à la terre  */
+    unsigned long	ID;			/* ID de la route à laquelle appartient la position matchée */
+    road_time_t		time;
+    int				way;		/* Sens de la route parcourue 1=W2E, 2=E2W*/
+    double			dist;		/* abscisse curviligne par rapport au début de la route */
+    double			pxx, pyy, pxy; /* covariance de l'erreur en position absolue*/
+    double			ptheta;		/*covariance de l'erreur en cap*/
+    double      error; 
+    donnees_gyro gyro;  
+    donnees_abs_zy odo; 
+};
+
+#endif // DEF_PACPUS_H
Index: tags/0.2.3/include/Pacpus/kernel/road_time.h
===================================================================
--- tags/0.2.3/include/Pacpus/kernel/road_time.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/kernel/road_time.h	(revision 368)
@@ -0,0 +1,111 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    January, 2006
+/// @version $Id: road_time.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+// FIXME: update this note.
+// NOTE:
+//      This DLL was compiled as a Standard C Language Dynamic Link Libtrary.
+//      So in order to be compatible with C++ program, we must add the command extern "C"
+//      for the whole include file.
+
+#ifndef DEF_PACPUS_ROAD_TIME_H
+#define DEF_PACPUS_ROAD_TIME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
+
+#include <stddef.h>  // defines: NULL
+
+#include <Pacpus/kernel/cstdint.h>
+
+/// Export macro for ROAD_TIME DLL for Windows only
+#ifdef WIN32
+#   ifdef ROAD_TIME_EXPORTS
+#       define ROAD_TIME_API __declspec(dllexport)
+#   else
+#       define ROAD_TIME_API __declspec(dllimport)
+#   endif
+#else
+#   define ROAD_TIME_API /* nothing */
+#endif
+
+/// Timestamp type
+typedef uint64_t road_time_t;
+/// Timerange type
+typedef int32_t road_timerange_t;
+
+/// Timestamp difference type
+typedef int64_t road_time_diff_t;
+/// Timerange difference type
+typedef int32_t road_timerange_diff_t;
+
+#ifdef WIN32
+
+/// Structure exchanged to give the Initialization parameters. All these fields are filled when the
+/// first process attached to the DLL. It gives the Real Time and the value of the Performance Counter
+/// at the same time.
+/// Description of each field is provided inside the structure
+struct Initialisation_Time
+{
+    /// Time (extended to micro seconds precision)
+    /// that was given by the Real Time Clock of
+    /// windows (using ftime()) at the first time the DLL was called.
+    road_time_t    Real_Time;
+
+    /// Correpsonding number of cycles of the CPU Performance Counter,
+    /// if it is available. Normally it is the Multimedia Counter.
+    /// If the Performance Counter is not availaible, normally it
+    /// should return the Real Time Counter Value (accuracy of 10 ms)..
+    uint64_t	Multimedia_Counter;
+
+    /// Frequency of the Performance Counter, if it is available
+    /// This Frequency is given in Hertz.
+    uint64_t	Multimedia_Counter_Frequency;
+
+    /// Delta_t is used to have less work when asking time.
+    /// Delta_t is equal to Real_Time - (Multimedia_Counter/Multimedia_Counter_Frequancy)/1000000
+    road_time_t    delta_t;
+};
+
+/// This method just return the actual time using a method based on delta_t (1 less operation).
+/// Return a road_time_t: ellapsed time in microseconds since the 1/01/1970
+road_time_t ROAD_TIME_API road_time(void);
+
+/// This method just return the actual time using all the fields of the Initiaiztion_Time Structure.
+/// Return a road_time_t: ellapsed time in microseconds since the 1/01/1970
+road_time_t ROAD_TIME_API road_time2(void);
+
+/// This method just return the Initialization Parameter
+/// Return an Initialization_Time structure (see below)
+struct Initialisation_Time ROAD_TIME_API road_time_init(void);
+
+#else // WIN32
+
+// UNIX
+
+#include <sys/time.h>
+
+static road_time_t road_time(void)
+{
+    struct timeval t;
+    gettimeofday(&t, NULL);
+    return(road_time_t)((road_time_t)(t.tv_sec)*1000000 + (road_time_t)(t.tv_usec));
+}
+
+#endif // WIN32
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+#endif // DEF_PACPUS_ROAD_TIME_H
Index: tags/0.2.3/include/Pacpus/predef/compiler.h
===================================================================
--- tags/0.2.3/include/Pacpus/predef/compiler.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/predef/compiler.h	(revision 368)
@@ -0,0 +1,90 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    2014-04-07 10:36:35
+/// @version $Id$
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef PACPUS_PREDEF_COMPILER_H
+#define PACPUS_PREDEF_COMPILER_H
+
+#include <Pacpus/predef/version_number.h>
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define PACPUS_COMP_MSVC PACPUS_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(_MSC_VER)
+#   undef PACPUS_COMP_MSVC
+#   if !defined (_MSC_FULL_VER)
+#       define PACPUS_COMP_MSVC_BUILD 0
+#   else
+        /* how many digits does the build number have? */
+#       if _MSC_FULL_VER / 10000 == _MSC_VER
+            /* four digits */
+#           define PACPUS_COMP_MSVC_BUILD (_MSC_FULL_VER % 10000)
+#       elif _MSC_FULL_VER / 100000 == _MSC_VER
+            /* five digits */
+#           define PACPUS_COMP_MSVC_BUILD (_MSC_FULL_VER % 100000)
+#       else
+#           error "Cannot determine build number from _MSC_FULL_VER"
+#       endif
+#   endif
+#   define PACPUS_COMP_MSVC PACPUS_VERSION_NUMBER(\
+        _MSC_VER/100-6,\
+        _MSC_VER%100,\
+        PACPUS_COMP_MSVC_BUILD)
+#endif
+
+#if PACPUS_COMP_MSVC
+#   define PACPUS_COMP_MSVC_AVAILABLE
+#endif
+
+#define PACPUS_COMP_MSVC_NAME "Microsoft Visual C/C++"
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define PACPUS_COMP_GNUC PACPUS_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__GNUC__)
+#   undef PACPUS_COMP_GNUC
+#   if !defined(PACPUS_COMP_GNUC) && defined(__GNUC_PATCHLEVEL__)
+#       define PACPUS_COMP_GNUC \
+            PACPUS_VERSION_NUMBER(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__)
+#   endif
+#   if !defined(PACPUS_COMP_GNUC)
+#       define PACPUS_COMP_GNUC \
+            PACPUS_VERSION_NUMBER(__GNUC__,__GNUC_MINOR__,0)
+#   endif
+#endif
+
+#if PACPUS_COMP_GNUC
+#   define PACPUS_COMP_GNUC_AVAILABLE
+#endif
+
+#define PACPUS_COMP_GNUC_NAME "Gnu GCC C/C++"
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define PACPUS_COMP_CLANG PACPUS_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__clang__)
+#   undef PACPUS_COMP_CLANG
+#   define PACPUS_COMP_CLANG PACPUS_VERSION_NUMBER(__clang_major__,__clang_minor__,__clang_patchlevel__)
+#endif
+
+#if PACPUS_COMP_CLANG
+#   define PACPUS_COMP_CLANG_AVAILABLE
+#endif
+
+#define PACPUS_COMP_CLANG_NAME "Clang"
+
+////////////////////////////////////////////////////////////////////////////////
+
+#endif // PACPUS_PREDEF_COMPILER_H
Index: tags/0.2.3/include/Pacpus/predef/os.h
===================================================================
--- tags/0.2.3/include/Pacpus/predef/os.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/predef/os.h	(revision 368)
@@ -0,0 +1,90 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    2014-04-07 10:36:35
+/// @version $Id$
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef PACPUS_PREDEF_OS_H
+#define PACPUS_PREDEF_OS_H
+
+#include <Pacpus/predef/version_number.h>
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define PACPUS_OS_WINDOWS PACPUS_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(_WIN32) || defined(_WIN64) || \
+    defined(__WIN32__) || defined(__TOS_WIN__) || \
+    defined(__WINDOWS__)
+#   undef PACPUS_OS_WINDOWS
+#   define PACPUS_OS_WINDOWS PACPUS_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if PACPUS_OS_WINDOWS
+#   define PACPUS_OS_WINDOWS_AVAILABLE
+#endif
+
+#define PACPUS_OS_WINDOWS_NAME "Microsoft Windows"
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define PACPUS_OS_UNIX PACPUS_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(unix) || defined(__unix) || \
+    defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE)
+#   undef PACPUS_OS_UNIX
+#   define PACPUS_OS_UNIX PACPUS_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if PACPUS_OS_UNIX
+#   define PACPUS_OS_UNIX_AVAILABLE
+#endif
+
+#define PACPUS_OS_UNIX_NAME "Unix Environment"
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define PACPUS_OS_LINUX PACPUS_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(linux) || defined(__linux)
+#   undef PACPUS_OS_LINUX
+#   define PACPUS_OS_LINUX PACPUS_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if PACPUS_OS_LINUX
+#   define PACPUS_OS_LINUX_AVAILABLE
+#endif
+
+#define PACPUS_OS_LINUX_NAME "Linux"
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define PACPUS_OS_MACOS PACPUS_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(macintosh) || defined(Macintosh) || \
+    (defined(__APPLE__) && defined(__MACH__))
+#   undef PACPUS_OS_MACOS
+#   if !defined(PACPUS_OS_MACOS) && defined(__APPLE__) && defined(__MACH__)
+#       define PACPUS_OS_MACOS PACPUS_VERSION_NUMBER(10,0,0)
+#   endif
+#   if !defined(PACPUS_OS_MACOS)
+#       define PACPUS_OS_MACOS PACPUS_VERSION_NUMBER(9,0,0)
+#   endif
+#endif
+
+#if PACPUS_OS_MACOS
+#   define PACPUS_OS_MACOS_AVAILABLE
+#endif
+
+#define PACPUS_OS_MACOS_NAME "Mac OS"
+
+////////////////////////////////////////////////////////////////////////////////
+
+#endif // PACPUS_PREDEF_OS_H
Index: tags/0.2.3/include/Pacpus/predef/version_number.h
===================================================================
--- tags/0.2.3/include/Pacpus/predef/version_number.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/predef/version_number.h	(revision 368)
@@ -0,0 +1,35 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    2014-04-07 10:32:10
+/// @version $Id$
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef PACPUS_PREDEF_VERSION_NUMBER_H
+#define PACPUS_PREDEF_VERSION_NUMBER_H
+
+#define PACPUS_VERSION_NUMBER(major,minor,patch) \
+    ( (((major)%100)*10000000) + (((minor)%100)*100000) + ((patch)%100000) )
+
+#define PACPUS_VERSION_NUMBER_MAX \
+    PACPUS_VERSION_NUMBER(99,99,99999)
+
+#define PACPUS_VERSION_NUMBER_ZERO \
+    PACPUS_VERSION_NUMBER(0,0,0)
+
+#define PACPUS_VERSION_NUMBER_MIN \
+    PACPUS_VERSION_NUMBER(0,0,1)
+
+#define PACPUS_VERSION_NUMBER_AVAILABLE \
+    PACPUS_VERSION_NUMBER_MIN
+
+#define PACPUS_VERSION_NUMBER_NOT_AVAILABLE \
+    PACPUS_VERSION_NUMBER_ZERO
+
+#endif // PACPUS_PREDEF_VERSION_NUMBER_H
Index: tags/0.2.3/include/Pacpus/structures/genericLidarStructures.h
===================================================================
--- tags/0.2.3/include/Pacpus/structures/genericLidarStructures.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/structures/genericLidarStructures.h	(revision 368)
@@ -0,0 +1,106 @@
+#ifndef STRUCTURE_LIDAR_H
+#define STRUCTURE_LIDAR_H
+
+#include <Pacpus/structures/pacpusStruct.h>
+#include <QVariant>
+#include <QVector>
+#include <QMatrix4x4>
+
+namespace pacpus {
+
+typedef enum {
+    NONE = 0,
+    ALASCA_XT = 10,
+    SICK = 20,
+    HOKUYO_ = 30,
+    HOKUYO_30LX = 40,
+    VELODYNE_64HEL = 50
+} ScannerType;
+
+typedef struct {
+    float x,y,z;
+    quint16 d;        // distance in cm
+    quint8 echo;
+    quint8 intensity;
+} LidarPoint; // Plusieurs
+
+//template <class T>
+struct LidarLayer{
+    quint16 layerNumber;
+    quint16 nbPoint;
+    float verticalAngle;
+    //QVector<T> points;
+    QVector<LidarPoint> points;
+};
+
+//template <class T>
+struct LidarScan : public PacpusTimeStampedData{
+
+    quint8 scannerType;
+    quint8 scannerId;
+    quint8 nbLayer;
+    quint32 nbPoint;
+    QMatrix4x4 calib;
+    //int reserved;
+    //QVector< LidarLayer<T> > layers;
+    QVector<LidarLayer> layers;
+    LidarScan(int layerCount = 1, int pointsPerLayer = 2100){
+        layers.resize(layerCount);
+        /*for (typename QVector< LidarLayer<T> >::iterator it = layers.begin(), itend = layers.end(); it != itend; ++it) {
+            it->points.reserve(pointsPerLayer);
+        }*/
+        nbLayer = layerCount;
+        for (/*typename*/ QVector<LidarLayer>::iterator it = layers.begin(), itend = layers.end(); it != itend; ++it)
+                    it->points.reserve(pointsPerLayer);
+
+    }
+};
+
+// A définir
+typedef struct {
+
+
+} LidarConfig;
+
+} // end namespace pacpus
+
+Q_DECLARE_METATYPE(pacpus::LidarPoint)
+inline QDataStream & operator << (QDataStream & out, const pacpus::LidarPoint & Valeur){
+    out << Valeur.x << Valeur.y << Valeur.z << Valeur.intensity << Valeur.d << Valeur.echo;
+    return out;}
+
+inline QDataStream & operator >> (QDataStream & in, pacpus::LidarPoint & Valeur){
+    in >> Valeur.x >> Valeur.y >> Valeur.z >> Valeur.intensity >> Valeur.d >> Valeur.echo;
+    return in;}
+
+Q_DECLARE_METATYPE(pacpus::LidarLayer)
+inline QDataStream & operator << (QDataStream & out, const pacpus::LidarLayer & Valeur){
+    out << Valeur.nbPoint << Valeur.layerNumber << Valeur.verticalAngle;
+    for(int i = 0; i < Valeur.nbPoint ; ++i)
+        out << Valeur.points[i];
+    return out;}
+
+inline QDataStream & operator >> (QDataStream & in, pacpus::LidarLayer & Valeur){
+    in >> Valeur.nbPoint >> Valeur.layerNumber >> Valeur.verticalAngle;
+    for(int i = 0; i < Valeur.nbPoint; ++i)
+        in >> Valeur.points[i];
+    return in;}
+
+Q_DECLARE_METATYPE(pacpus::LidarScan)
+inline QDataStream & operator << (QDataStream & out, const pacpus::LidarScan & Valeur){
+    out << (quint64)Valeur.time << Valeur.timerange << Valeur.sequenceNumber <<
+           Valeur.scannerId << Valeur.scannerType << Valeur.nbPoint << Valeur.nbLayer;
+    for(int i=0; i < Valeur.nbLayer ; ++i)
+        out << Valeur.layers[i];
+    return out;
+}
+
+inline QDataStream & operator >> (QDataStream & in, pacpus::LidarScan & Valeur){
+    in >> (quint64&)Valeur.time >> Valeur.timerange >> Valeur.sequenceNumber >>
+           Valeur.scannerId >> Valeur.scannerType >> Valeur.nbPoint >> Valeur.nbLayer;
+    for(int i=0; i < Valeur.nbLayer ; ++i)
+        in >> Valeur.layers[i];
+    return in;
+}
+
+#endif // STRUCTURE_LIDAR_H
Index: tags/0.2.3/include/Pacpus/structures/genericStructures.h
===================================================================
--- tags/0.2.3/include/Pacpus/structures/genericStructures.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/structures/genericStructures.h	(revision 368)
@@ -0,0 +1,50 @@
+#ifndef GENERIC_STRUCTURES_H
+#define GENERIC_STRUCTURES_H
+
+#include <Pacpus/structures/pacpusStruct.h>
+#include <QVariant>
+#include <QVector>
+#include <QMatrix4x4>
+#include <QImage>
+
+namespace pacpus {
+
+class Pose3D : public PacpusTimeStampedData {
+public:
+    QVector3D position;
+    QVector3D angle;
+    //QMatrix3x3 poscov;
+    //QMatrix3x3 angconv;
+    QMatrix4x4 transform;
+};
+
+class PacpusImage : public PacpusTimeStampedData {
+public:
+    QImage image;
+};
+
+} // end namespace pacpus
+
+Q_DECLARE_METATYPE(pacpus::PacpusImage)
+inline QDataStream & operator << (QDataStream & out, const pacpus::PacpusImage & Valeur){
+    out << (quint64)Valeur.time << Valeur.timerange << Valeur.image;
+    return out;
+}
+
+inline QDataStream & operator >> (QDataStream & in, pacpus::PacpusImage & Valeur){
+    in >> (quint64&)Valeur.time >> Valeur.timerange >> Valeur.image;
+    return in;
+}
+
+Q_DECLARE_METATYPE(pacpus::Pose3D)
+inline QDataStream & operator << (QDataStream & out, const pacpus::Pose3D & Valeur){
+    out << (quint64)Valeur.time << Valeur.timerange << Valeur.position << Valeur.angle << Valeur.transform;
+    return out;
+}
+
+inline QDataStream & operator >> (QDataStream & in, pacpus::Pose3D & Valeur){
+    in >> (quint64&)Valeur.time >> Valeur.timerange >> Valeur.position >> Valeur.angle >> Valeur.transform;
+    return in;
+}
+
+#endif // GENERIC_STRUCTURES_H
Index: tags/0.2.3/include/Pacpus/structures/pacpusStruct.h
===================================================================
--- tags/0.2.3/include/Pacpus/structures/pacpusStruct.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/structures/pacpusStruct.h	(revision 368)
@@ -0,0 +1,14 @@
+ 
+#ifndef PACPUSSTRUCT_H
+#define PACPUSSTRUCT_H
+
+#include <Pacpus/kernel/road_time.h>
+
+class PacpusTimeStampedData {
+public:
+    road_time_t time;
+    road_timerange_t timerange;
+    unsigned int sequenceNumber;
+};
+
+#endif // PACPUSSTRUCT_H
Index: tags/0.2.3/include/Pacpus/structures/structure_gps.h
===================================================================
--- tags/0.2.3/include/Pacpus/structures/structure_gps.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/structures/structure_gps.h	(revision 368)
@@ -0,0 +1,471 @@
+// donnees NMEA emises par l'ag132 sur la liaison serie
+// revision le 23/08/2004 PhB et GD : trame_gga_dbl
+// revision le 20/05/2005 Maria Alwan et Gerald Dherbomez : 5700
+
+#ifndef STRUCTURE_GPS_H
+#define STRUCTURE_GPS_H
+
+#include "Pacpus/kernel/road_time.h"
+
+/// POSITION WGS84
+typedef struct
+{
+    double lat;       // radians
+    double lon;       // radians
+    double altitude;  // meters
+    float sigma_lat;  // meters
+    float sigma_lon;  // meters
+    float sigma_alt;  // meters
+    int32_t gps_week;    // GPS week number
+    double gps_time;  // seconds
+    int32_t quality;     // quality indicator of the position, referred to NMEA standard
+    int32_t nb_sats;     // number of satellites used to compute the solution
+} wgs84_position;
+
+typedef struct
+{
+    wgs84_position position;
+    road_time_t time;
+    road_timerange_t timerange;
+} TimestampedWgs84Position;
+
+/// TRAME AVR
+typedef struct
+{
+    int32_t H,Mi,S,Ms;
+    float Yaw,Tilt,Range;
+    int32_t ind_qualite;
+    float pdop;
+    int32_t nb_sat;
+} trame_avr;
+
+/// TRAME GGA, PRECISION FLOAT (30 cm en Lambert93)
+typedef struct{
+    int32_t H ,Mi,S;
+    int32_t nb_sat,ind_qualite;
+    float lon,age,lat,alt_msl,hdop,d_geoidal;
+    int32_t Ms;//modif du 20040121 pour recupere les millisecondes
+} trame_gga;
+
+/// TRAME GGA, A UTILISER
+typedef struct
+{
+    int32_t H,Mi,S,Ms;
+    int32_t nb_sat,ind_qualite;
+    float age,hdop;
+    double lon,lat,alt_msl,d_geoidal;
+    int8_t dir_lat,dir_lon;
+    int32_t ref_station_ID;
+} trame_gga_dbl;
+
+typedef struct DONNEES_GGA_
+{
+    trame_gga_dbl tramegga;
+    road_time_t t;
+    DONNEES_GGA_()
+    {
+        t = 0;
+        tramegga.alt_msl = 0;
+        tramegga.d_geoidal = 0;
+        tramegga.H = 0;
+        tramegga.Mi = 0;
+        tramegga.S = 0;
+        tramegga.Ms = 0;
+        tramegga.lat = 0;
+        tramegga.lon = 0;
+    }
+} DONNEES_GGA;
+
+/// TRAME GLL
+typedef struct
+{
+    int32_t H,Mi,S,Ms;
+    double lat,lon;
+    int8_t dir_lat,dir_lon;
+    int32_t valid_data;
+} trame_gll;
+
+/// TRAME GRS
+typedef struct
+{
+    int32_t H,Mi,S,Ms;
+    int32_t residus_status;
+    float residus[12];
+} trame_grs;
+
+/// TRAME GSA
+typedef struct
+{
+    int32_t mode_select, mode_result;
+    int32_t SV_PRN[12];
+    float pdop,hdop,vdop;
+} trame_gsa;
+
+/// TRAME GST
+typedef struct
+{
+    float a,b,rms,phi,sigma_lat,sigma_lon,sigma_alt;
+    int32_t H,Mi,S,Ms;
+} trame_gst;
+
+/// TRAME GSV
+// Matrice SatellitesInView (36 satellites max) contient :
+// en ligne : les 4 caracteristiques d'un satellite
+// en colonne : SatelliteNumber, ElevationDegrees, AzimuthDegreesTrue, SignalToNoiseRatio
+typedef struct{
+    int32_t NumberOfSatellites;
+    int32_t Totalmessages;
+    int32_t SatellitesInView[36][4];
+} trame_gsv;
+
+/// TRAME HDT
+typedef struct
+{
+    /// in degrees
+    double DegreesTrue;
+} trame_hdt;
+
+/// TRAME MSS
+typedef struct
+{
+    float SS,SNR;
+    float beacon_freq;
+    int32_t beacon_bitrate;
+    int32_t channel;
+} trame_mss;
+
+/// TRAME RMC
+typedef struct
+{
+    int32_t H,Mi,S,Ms,JJ,MM,AA;
+    int32_t valid_data;
+    double lat,lon;
+    int8_t dir_lat, dir_lon;
+    float vitesse;
+    float track_true_north;
+    float magnet_var;
+    int8_t dir_magnet_var;
+    int32_t mode;
+} trame_rmc;
+
+/// TRAME ROT
+typedef struct
+{
+    double RateOfTurn;
+    int32_t valid_data;
+} trame_rot;
+
+/// TRAME VTG
+typedef struct
+{
+    /// meters per second [km/h]
+    float v;
+    float track_true_north, track_magnet_north;
+} trame_vtg;
+
+/// TRAME XTE
+typedef struct
+{
+    int32_t valid_LCBlink;
+    int32_t valid_LCCycleLock;
+    float error;
+    int32_t dir_to_steer;
+} trame_xte;
+
+/// TRAME_ZDA
+typedef struct
+{
+    int32_t H,Mi,S,Ms,JJ,MM,AA;
+    int32_t H_offset,Mi_offset;
+} trame_zda;
+
+/// GPS SYNCHRO FRAME
+typedef struct
+{
+    trame_zda zda;                 // Data containing GPS time
+    road_timerange_t timeOffset;   // Time elapsed between PPS and ZDA
+    road_time_t ppsTime;           // timestamp of the last PPS received on the computer
+    road_time_t zdaTime;           // timestamp of the ZDA frame
+} GpsSynchroFrame;
+
+
+/// TRAME PTNLEV
+typedef struct
+{
+    int32_t H,Mi,S,Ms;
+    int32_t evt_nb;
+} trame_ptnlev;
+
+/// TRAME PTNLID
+typedef struct
+{
+    int32_t machineID,productID;
+    int32_t maj_FW_nb,min_FW_nb;
+    int32_t JJ_FW,MM_FW,AA_FW;
+} trame_ptnlid;
+
+/// TRAME PTNLDG
+typedef struct
+{
+    float SS,SNR,freq;
+    int32_t bitrate,number,tracking;
+    int32_t rtcm,ind_perf;
+} trame_ptnldg;
+
+/// TRAME PTNLSM
+typedef struct
+{
+    int32_t ref_station_ID;
+    int8_t message[30];
+} trame_ptnlsm;
+
+/// TRAME PTNL,GGK
+typedef struct
+{
+    int32_t H,Mi,S,Ms,JJ,MM,AA;
+    double lat,lon;
+    int8_t dir_lat, dir_lon;
+    int32_t ind_qualite,nb_sat;
+    float dop;
+    /// ellipsoidal height
+    float eht;
+} trame_ptnl_ggk;
+
+/// TRAME PTNL,GGK_SYNC
+typedef struct
+{
+    int32_t H,Mi,S,Ms,JJ,MM,AA;
+    double lat,lon;
+    int8_t dir_lat, dir_lon;
+    int32_t ind_qualite,nb_sat;
+    float dop;
+    /// ellipsoidal height
+    float eht;
+} trame_ptnl_ggk_sync;
+
+/// TRAME PTNL,PJK
+typedef struct
+{
+    int32_t H,Mi,S,Ms,JJ,MM,AA;
+    double northing,easting;
+    int32_t ind_qualite,nb_sat;
+    float dop;
+    /// ellipsoidal height
+    float eht;
+} trame_ptnl_pjk;
+
+/// TRAME PTNL,PJT
+typedef struct
+{
+    int8_t coord_syst_name[30];
+    int8_t projection_name[30];
+} trame_ptnl_pjt;
+
+/// TRAME PTNL,VGK
+typedef struct
+{
+    int32_t H,Mi,S,Ms,JJ,MM,AA;
+    double east_vect,north_vect,up_vect;
+    int32_t ind_qualite,nb_sat;
+    float dop;
+} trame_ptnl_vgk;
+
+/// TRAME PTNL,VHD
+typedef struct
+{
+    int32_t H,Mi,S,Ms,JJ,MM,AA;
+    float azimuth,delta_azimuth;
+    float vert_angle,delta_vert_angle;
+    float range,delta_range;
+    int32_t ind_qualite,nb_sat;
+    float pdop;
+} trame_ptnl_vhd;
+
+/// SPAN CPT SOLUTION STATUS
+enum SolStatus
+{
+    SOL_COMPUTED = 0,
+    INSUFFICIENT_OBS = 1,
+    NO_CONVERGENCE = 2,
+    SINGULARITY = 3,
+    COV_TRACE = 4,
+    TEST_DIST = 5,
+    COLD_START = 6,
+    V_H_LIMIT = 7,
+    VARIANCE = 8,
+    RESIDUALS = 9,
+    DELTA_POS = 10,
+    NEGATIVE_VAR = 11,
+    INTEGRITY_WARNING = 13,
+    IMU_UNPLUGGED = 17,
+    PENDING = 18
+};
+
+/// SPAN CPT POSITION TYPE
+enum PosType
+{
+    NONE = 0,
+    FIXEDPOS = 1,
+    FIXEDHEIGHT = 2,
+    FLOATCONV = 4,
+    WIDELANE = 5,
+    NARROWLANE = 6,
+    DOPPLER_VELOCITY = 8,
+    SINGLE = 16,
+    PSRDIFF = 17,
+    WAAS = 18,
+    PROPAGATED = 19,
+    OMNISTAR = 20,
+    L1_FLOAT = 32,
+    IONOFREE_FLOAT = 33,
+    NARROW_FLOAT = 34,
+    L1_INT = 48,
+    WIDE_INT = 49,
+    NARROW_INT = 50,
+    RTK_DIRECT_INS = 51,
+    INS = 52,
+    INS_PSRSP =53,
+    INS_PSRDIFF =54,
+    INS_RTKFLOAT = 55,
+    INS_RTKFIXED = 56,
+    INS_OMNISTAR = 57,
+    INS_OMNISTAR_HP = 58,
+    INS_OMNISTAR_XP = 59,
+    OMNISTAR_HP = 64,
+    OMNISTAR_XP = 65,
+    CDGPS = 66
+};
+
+/// SPAN CPT Inertial Solution Status
+enum INSStatus
+{
+    INS_INACTIVE = 0,
+    INS_ALIGNING =1,
+    INS_SOLUTION_NOT_GOOD = 2,
+    INS_SOLUTION_GOOD = 3,
+    INS_BAD_GPS_AGREEMENT = 4,
+    INS_ALIGNMENT_COMPLETE = 5
+};
+
+/// TRAME BESTGPSPOSA
+typedef struct
+{
+    SolStatus Status;
+    PosType   posType;
+    double    Lat;
+    double    Lon;
+    double    Hgt;
+    float     Undulation;
+    float     LatStd;
+    float     LonStd;
+    float     HgtStd;
+    double    e;
+    double    n;
+    double    u;
+} trame_bestgpsposa;
+
+/// TRAME RAWIMUSA
+typedef struct
+{
+    uint32_t Week;
+    int32_t          reserved;
+    double        Seconds;
+    // FIXME: use a portable type instead of long double (which is 128-bit on Linux and 64-bit on Windows)
+    /*long */double   ZAccel;
+    /*long */double   YAccel;
+    /*long */double   XAccel;
+    /*long */double   ZGyro;
+    /*long */double   YGyro;
+    /*long */double   XGyro;
+} trame_rawimusa;
+
+/// TRAME INSPVAA
+typedef struct
+{
+    uint32_t Week;
+    int32_t          reserved;
+    double        Seconds;
+    double        Lat;
+    double        Lon;
+    double        Hgt;
+    double        NorthVel;
+    double        EastVel;
+    double        UpVel;
+    double        Roll;
+    double        Pitch;
+    double        Azimuth;
+    INSStatus     Status;
+    int32_t          reserved1;
+    double        e;
+    double        n;
+    double        u;
+} trame_inspvaa;
+
+/// TRAME INSCOV
+typedef struct
+{
+    uint32_t Week;
+    int32_t   reserved;
+    double Seconds;
+    double PosCov[3][3];
+    double AttCov[3][3];
+    double VelCov[3][3];
+} trame_inscov;
+
+/// trame_bestgpsposa structure with timestamping
+struct TimestampedBestgpsposaFrame
+{
+    trame_bestgpsposa frame;
+    road_time_t time;
+    road_timerange_t timerange;
+};
+
+/// trame_rawimusa structure with timestamping
+struct TimestampedRawimusaFrame
+{
+    trame_rawimusa frame;
+    road_time_t time;
+    road_timerange_t timerange;
+};
+
+/// trame_inspvaa structure with timestamping
+struct TimestampedInspvaaFrame
+{
+    trame_inspvaa frame;
+    road_time_t time;
+    road_timerange_t timerange;
+};
+
+/// trame_inscov structure with timestamping
+struct TimestampedInscovFrame
+{
+    trame_inscov frame;
+    road_time_t time;
+    road_timerange_t timerange;
+};
+
+/// trame_gga structure with timestamping
+struct TimestampedGgaFrame
+{
+    trame_gga_dbl frame;
+    road_time_t time;
+    road_timerange_t timerange;
+};
+
+/// trame_gst structure with timestamping
+struct TimestampedGstFrame
+{
+    trame_gst frame;
+    road_time_t time;
+    road_timerange_t timerange;
+};
+
+/// trame_vtg structure with timestamping
+struct TimestampedVtgFrame
+{
+    trame_vtg frame;
+    road_time_t time;
+    road_timerange_t timerange;
+};
+
+#endif // STRUCTURE_GPS_H
Index: tags/0.2.3/include/Pacpus/structures/structure_telemetre.h
===================================================================
--- tags/0.2.3/include/Pacpus/structures/structure_telemetre.h	(revision 368)
+++ tags/0.2.3/include/Pacpus/structures/structure_telemetre.h	(revision 368)
@@ -0,0 +1,100 @@
+#ifndef STRUCTURE_TELEMETRE_H
+#define STRUCTURE_TELEMETRE_H
+
+#include "kernel/cstdint.h"
+#include "kernel/road_time.h"
+
+////////////////////////////////////////////////////////////////////////////////
+// some constants defined for the Alasca component
+static const uint32_t MAX_SCAN_POINT = 8648;
+static const uint32_t MAX_SCAN_POINT_PER_LAYER = 2162;
+static const int32_t UTC_MAGIC_WORD = 0x55544300;
+
+// Data recorded in the DBITE file
+// Alasca XT laserscanner
+typedef struct
+{
+    int8_t scannertype;
+    uint32_t timeStart;	  // time start of the scan
+    float startAngle;			      // the start angle of the measurement (in [rad*e4])
+    float endAngle;			        // the stop angle of the measurement (in [rad*e4])
+    uint32_t nbPoint;		  // number of points
+    int32_t dataPos;               // the position of the data in the binary file associated to the dbt file
+} AlascaXT;
+
+// An Alasca point
+// see Manual_Alasca.pdf page 27
+// Orientation of the frame regarding the car:
+// X ahead, Y on the left and Z upside
+struct ScanPoint
+{
+    uint8_t scannerId;    // ID of the scanner that has detected the point - Alasca has type 2
+    uint8_t layerNumber;  // channel (0 = bottom channel ...)
+    uint8_t echoNumber;	  // subChannel (0 = A, 1 = B ...)
+    uint8_t pointStatus;  // ground, rain, dirt ...
+    int16_t x;                    // X coordinate in centimeters
+    int16_t y;                    // Y coordinate in centimeters
+    int16_t z;                    // Z coordinate in centimeters
+    uint16_t width;       // the echo width
+};
+
+// Data obtained after decoding
+// The complete structure is written in shared memory
+// Only the point[MAX_SCAN_POINT] array is recorded in the binary file
+// associated to the DBT file (see struct AlascaXT)
+struct ScanAlascaData
+{
+    uint8_t scannertype;        // Alasca has type 2
+    uint32_t timeStart;	        // time start of the scan
+    float startAngle;			            // the start angle of the measurement (in [rad*e4])
+    float endAngle;			              // the stop angle of the measurement (in [rad*e4])
+    uint32_t nbPoint;		        // number of points
+    road_time_t time;                 // DBT timestamp
+    road_timerange_t timerange;       // DBT timerange
+    ScanPoint point[MAX_SCAN_POINT];  // the data, see struct ScanPoint
+};
+
+struct SortedScanAlascaData
+{
+    double xYellow[MAX_SCAN_POINT_PER_LAYER];
+    double yYellow[MAX_SCAN_POINT_PER_LAYER];
+    double xGreen[MAX_SCAN_POINT_PER_LAYER];
+    double yGreen[MAX_SCAN_POINT_PER_LAYER];
+    double xBlue[MAX_SCAN_POINT_PER_LAYER];
+    double yBlue[MAX_SCAN_POINT_PER_LAYER];
+    double xRed[MAX_SCAN_POINT_PER_LAYER];
+    double yRed[MAX_SCAN_POINT_PER_LAYER];
+
+    int32_t totalSize;
+    int32_t yellowSize;
+    int32_t greenSize;
+    int32_t blueSize;
+    int32_t redSize;
+};
+
+/// Sick LMS 221 laserscanner
+typedef struct
+{
+    static const std::size_t DATA_COUNT = 101;
+    float data[DATA_COUNT];
+} TELEMETRE_100;
+
+/// Sick LMS 291 laserscanner
+typedef struct
+{
+    static const std::size_t DATA_COUNT = 181;
+    float data[DATA_COUNT];
+} TELEMETRE_180;
+
+// cf. page 23
+// faire une structure avec le nb de secteurs
+
+// pour chaque secteur :
+// donnees statiques : timestamp debut et fin - angles debut et fin - pas de l'angle nb de pts dans le secteur
+// tableaux => donnees de base : distance direction et echo amplitude
+typedef struct
+{
+    // TODO
+} SickLdoemData;
+
+#endif // STRUCTURE_TELEMETRE_H
Index: tags/0.2.3/scripts/build-linux.sh
===================================================================
--- tags/0.2.3/scripts/build-linux.sh	(revision 368)
+++ tags/0.2.3/scripts/build-linux.sh	(revision 368)
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+
+echo "##########################################################"
+echo "#   ___________    ____ ______  __ __  _____             #"
+echo "#   \____ \__  \ _/ ___\\____ \^|  ^|  \/  ___/          #"
+echo "#   ^|  ^|_^> ^> __ \\  \___^|  ^|_^> ^>  ^|  /\___ \    #"
+echo "#   ^|   __(____  /\___  ^>   __/^|____//____  ^>        #"
+echo "#   ^|__^|       \/     \/^|__^|              \/         #"
+echo "#                                                        #"
+echo "##########################################################"
+echo ""
+echo "========================================"
+echo "          PACPUS BUILD Linux            "
+echo "========================================"
+
+
+function usage {
+    echo Usage:
+    echo     build-linux.sh [install_dir]
+    echo     [install-dir] is optional
+    echo The script must be run in the build directory, which is 'trunk\build'
+    echo ""
+    echo Where:
+    echo     install_dir   is the installation directory of the library
+    echo ""
+    echo For instance, here is how to build Pacpus:
+    echo     ../scripts/build-linux.sh "/opt/Pacpus"
+    echo ""
+    exit 1
+}
+
+function build {
+    # Initialize the build
+    cmake .. -DPACPUS_INSTALL_DIR=$1 -DPACPUS_INSTALL_3RD=TRUE \
+        -DPACPUS_USE_LOG=TRUE -DCMAKE_BUILD_TYPE=Release \
+        -DPACPUS_INSTALL_WITH_VERSION_NUMBER=TRUE
+    make -j4
+    make install
+    cmake .. -DPACPUS_INSTALL_DIR=$1 -DPACPUS_INSTALL_3RD=TRUE \
+        -DPACPUS_USE_LOG=TRUE -DCMAKE_BUILD_TYPE=Debug
+        -DPACPUS_INSTALL_WITH_VERSION_NUMBER=TRUE \
+    make -j4
+    make install
+    echo "Build finished"
+    exit 0
+}
+
+#Check if the user is in the build directory
+if [ `basename $PWD` == "build" ]; then
+    if [ $# -ne 1 ]; then
+        INST_PATH="/opt/pacpus"
+    else
+        INST_PATH=$1
+    fi
+    build $INST_PATH
+else
+    usage
+fi
Index: tags/0.2.3/scripts/build-msvc-default-installdir.bat
===================================================================
--- tags/0.2.3/scripts/build-msvc-default-installdir.bat	(revision 368)
+++ tags/0.2.3/scripts/build-msvc-default-installdir.bat	(revision 368)
@@ -0,0 +1,50 @@
+@echo off
+
+echo #################################################
+echo #   ___________    ____ ______  __ __  _____    #
+echo #   \____ \__  \ _/ ___\\____ \^|  ^|  \/  ___/   #
+echo #   ^|  ^|_^> ^> __ \\  \___^|  ^|_^> ^>  ^|  /\___ \    #
+echo #   ^|   __(____  /\___  ^>   __/^|____//____  ^>   #
+echo #   ^|__^|       \/     \/^|__^|              \/    #
+echo #                                               #
+echo #################################################
+echo:
+
+echo ========================================
+echo           PACPUS BUILD MSVC             
+echo ========================================
+echo:
+
+:preamble
+:: Check if the user is in the build directory
+if not exist "%CD%\..\README.txt" goto usage
+:: Args ok, go to build
+goto build
+
+:usage
+echo Usage:
+echo     build-msvc.bat [install_dir]
+echo     [install-dir] is optional
+echo The script must be run in the build directory, which is 'trunk\build'
+echo:
+echo Where:
+echo     install_dir   is the installation directory of the library
+echo:
+echo For instance, here is how to build Pacpus:
+echo     ..\scripts\build-msvc.bat "D:\Libraries\Pacpus"
+echo:
+goto exit
+
+:build
+:: Initialize the build
+cmake .. -DPACPUS_INSTALL_3RD=TRUE -DPACPUS_USE_LOG=TRUE -DPACPUS_INSTALL_WITH_VERSION_NUMBER=TRUE
+:: Build in debug and release
+REM msbuild Pacpus.sln /p:Configuration=Debug
+REM msbuild Pacpus.sln /p:Configuration=Release
+:: Install
+REM msbuild INSTALL.vcxproj /p:Configuration=Debug
+REM msbuild INSTALL.vcxproj /p:Configuration=Release
+REM echo Build finished, do not forget to check the MSVC's output
+
+:exit
+pause
Index: tags/0.2.3/scripts/build-msvc.bat
===================================================================
--- tags/0.2.3/scripts/build-msvc.bat	(revision 368)
+++ tags/0.2.3/scripts/build-msvc.bat	(revision 368)
@@ -0,0 +1,55 @@
+@echo off
+
+echo #################################################
+echo #   ___________    ____ ______  __ __  _____    #
+echo #   \____ \__  \ _/ ___\\____ \^|  ^|  \/  ___/   #
+echo #   ^|  ^|_^> ^> __ \\  \___^|  ^|_^> ^>  ^|  /\___ \    #
+echo #   ^|   __(____  /\___  ^>   __/^|____//____  ^>   #
+echo #   ^|__^|       \/     \/^|__^|              \/    #
+echo #                                               #
+echo #################################################
+echo:
+
+echo ========================================
+echo           PACPUS BUILD MSVC             
+echo ========================================
+echo:
+
+:preamble
+:: Check the args
+if "%1" == "" goto usage
+:: Check if the user is in the build directory
+if not exist "%CD%\..\README.txt" goto usage
+:: Args ok, go to build
+goto build
+
+:usage
+echo Usage:
+echo     build-msvc.bat [install_dir]
+echo The script must be run in the build directory, which is 'trunk\build'
+echo:
+echo Where:
+echo     install_dir   is the installation directory of the library
+echo:
+echo For instance, here is how to build Pacpus:
+echo     ..\scripts\build-msvc.bat "D:\Libraries\Pacpus"
+echo:
+goto exit
+
+:build
+:: Root of the repository
+set root_dir=%CD%\..
+:: Initialize the environment of log4cxx
+set LOG4CXX_ROOT=%root_dir%\3rd\apache-log4cxx
+:: Initialize the build
+cmake .. -DPACPUS_INSTALL_DIR="%1" -DPACPUS_INSTALL_3RD=TRUE -DPACPUS_USE_LOG=TRUE -DPACPUS_INSTALL_WITH_VERSION_NUMBER=TRUE
+:: Build in debug and release
+REM msbuild Pacpus.sln /p:Configuration=Debug
+REM msbuild Pacpus.sln /p:Configuration=Release
+:: Install
+REM msbuild INSTALL.vcxproj /p:Configuration=Debug
+REM msbuild INSTALL.vcxproj /p:Configuration=Release
+REM echo Build finished, do not forget to check the MSVC's output
+
+:exit
+pause
Index: tags/0.2.3/scripts/change-all-licenses.bat
===================================================================
--- tags/0.2.3/scripts/change-all-licenses.bat	(revision 368)
+++ tags/0.2.3/scripts/change-all-licenses.bat	(revision 368)
@@ -0,0 +1,23 @@
+@echo off
+
+:parameters
+set SCRIPTS_DIR=%CD%
+set DIRECTORIES=..\include ..\src
+set FILES_TO_UPDATE=*.h *.c *.hpp *.cpp *.hxx *.cxx *.cc *.tcc
+
+:scan
+:: for all directories
+for %%D in (%DIRECTORIES%) do (
+    ::echo %%D
+    cd %SCRIPTS_DIR%
+    cd %%D
+    :: find source files
+    :: update each file
+    for /R %%E in (%FILES_TO_UPDATE%) do (
+        "%SCRIPTS_DIR%\update-license.bat" "%%E" "%SCRIPTS_DIR%"
+    )
+)
+
+:exit
+cd %SCRIPTS_DIR%
+pause
Index: tags/0.2.3/scripts/format-sources.bat
===================================================================
--- tags/0.2.3/scripts/format-sources.bat	(revision 368)
+++ tags/0.2.3/scripts/format-sources.bat	(revision 368)
@@ -0,0 +1,25 @@
+@echo off
+
+:parameters
+set SCRIPTS_DIR=%CD%
+set DIRECTORIES=..\examples ..\include ..\src
+set FILES_TO_UPDATE=*.h *.c *.hpp *.cpp *.hxx *.cxx *.cc *.tcc
+
+:scan
+:: for all directories
+for %%D in (%DIRECTORIES%) do (
+    echo Scanning directory '%%D'
+    
+    cd %SCRIPTS_DIR%
+    cd %%D
+    :: find source files
+    :: update each file
+    for /R %%E in (%FILES_TO_UPDATE%) do (
+        echo Formatting file '%%E'
+        clang-format -i --style=file %%E
+    )
+)
+
+:exit
+cd %SCRIPTS_DIR%
+pause
Index: tags/0.2.3/scripts/update-license.bat
===================================================================
--- tags/0.2.3/scripts/update-license.bat	(revision 368)
+++ tags/0.2.3/scripts/update-license.bat	(revision 368)
@@ -0,0 +1,26 @@
+@echo off
+
+:: You have to install `sed` first!
+
+:init
+:: get full path of the file
+set FILE=%~df1
+set SCRIPTS_DIR=%2
+set MV=move
+
+::echo %FILE%
+::echo %LICENSE_HEADER_FILE%
+
+:find
+:: remove license
+:: sed '/^%pacpus:license{/,/^%pacpuse:license}/d' %FILE%
+
+sed -nf %SCRIPTS_DIR%\update-license.sed "%FILE%" > update-license.tmp
+%MV% update-license.tmp "%FILE%"
+
+:: print lines from begin of file till begin of license
+::sed -n '0,/^%pacpus:license{/   p' %FILE%
+:: print new license
+
+:: print lines from end of license till end of file
+::sed -n '/^%pacpus:license}/,$   p' %FILE%
Index: tags/0.2.3/scripts/update-license.sed
===================================================================
--- tags/0.2.3/scripts/update-license.sed	(revision 368)
+++ tags/0.2.3/scripts/update-license.sed	(revision 368)
@@ -0,0 +1,17 @@
+:writefromstart
+0,/%pacpus:license{/ {
+    p           # print line
+    $b exit     # exit if the license not found (branch to exit if on on the last line)
+}
+
+# put license file after the line with %pacpus:license{
+/%pacpus:license{/ {
+    r ../LICENSE-header.txt
+}
+
+:writetillend
+/%pacpus:license}/,$ {
+    p           # print line
+}
+
+:exit
Index: tags/0.2.3/src/CMakeLists.txt
===================================================================
--- tags/0.2.3/src/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/src/CMakeLists.txt	(revision 368)
@@ -0,0 +1,21 @@
+# ========================================
+# Libraries, all platforms
+# ========================================
+add_subdirectory(FileLib)
+add_subdirectory(PacpusLib)
+add_subdirectory(PacpusTools)
+add_subdirectory(DBITEPlayerLib)
+
+# ========================================
+# Libraries, windows
+# ========================================
+if(WIN32)
+    add_subdirectory(RoadTime)
+endif()
+
+# ========================================
+# Executables
+# ========================================
+add_subdirectory(DBITEPlayer)
+add_subdirectory(PacpusSensor)
+#add_subdirectory(dbcDecriptor)
Index: tags/0.2.3/src/DBITEPlayer/CMakeLists.txt
===================================================================
--- tags/0.2.3/src/DBITEPlayer/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/src/DBITEPlayer/CMakeLists.txt	(revision 368)
@@ -0,0 +1,108 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+project(DBITEPlayer)
+
+# ========================================
+# Compiler definitions
+# ========================================
+add_definitions(${QT_DEFINITIONS})
+
+# ========================================
+# Include directories
+# ========================================
+include_directories(
+    ${CMAKE_BINARY_DIR}/DBITEPlayer
+    ${QT_INCLUDE_DIR}
+)
+
+# ========================================
+# Link directories
+# ========================================
+link_directories(
+    ${PROJECT_BINARY_DIR}/../PacpusLib
+    ${PROJECT_BINARY_DIR}/../FileLib
+    ${PROJECT_BINARY_DIR}/../DBITEPlayerLib
+	${PROJECT_BINARY_DIR}/../PacpusTools
+	${PROJECT_BINARY_DIR}/../RoadTime
+)
+
+# ========================================
+# List of sources
+# ========================================
+set(PROJECT_HDRS
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/cstdint.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/ComponentBase.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/ComponentFactory.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/ComponentFactoryBase.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/ComponentManager.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/Log.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/pacpus.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/road_time.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/XmlComponentConfig.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/XmlConfigFile.h
+)
+set(PROJECT_SRCS
+    ./ComponentBase.cpp
+    ./ComponentFactoryBase.cpp
+    ./ComponentManager.cpp
+    ./Log.cpp
+    ./XmlComponentConfig.cpp
+    ./XmlConfigFile.cpp
+)
+
+# ========================================
+# Build an executable
+# ========================================
+pacpus_add_executable(
+    ${PROJECT_NAME}
+    ./src/main.cpp
+    ../ico/heudiasycIco.rc
+)
+
+# ========================================
+# Libraries & Dependencies
+# ========================================
+
+set(OPT_LIBRARIES
+    optimized dbiteplayerlib debug dbiteplayerlib_d
+    optimized FileLib debug FileLib_d
+    optimized PacpusLib debug PacpusLib_d
+)
+
+# Windows platform
+if(WIN32)
+    LIST(APPEND OPT_LIBRARIES
+        optimized ROAD_TIME debug ROAD_TIME_d
+        Winmm
+    )
+endif()
+
+if(UNIX)
+    LIST(APPEND OPT_LIBRARIES
+        pthread
+    )
+endif()
+
+# All the platform
+target_link_libraries(
+    ${PROJECT_NAME}
+    ${QT_LIBRARIES}
+    ${OPT_LIBRARIES}
+    ${PACPUS_DEPENDENCIES_LIB}
+)
+
+# ========================================
+# Install
+# ========================================
+pacpus_install(${PROJECT_NAME})
+
+# ========================================
+# Folder
+# ========================================
+pacpus_folder(${PROJECT_NAME} "tools")
Index: tags/0.2.3/src/DBITEPlayer/src/main.cpp
===================================================================
--- tags/0.2.3/src/DBITEPlayer/src/main.cpp	(revision 368)
+++ tags/0.2.3/src/DBITEPlayer/src/main.cpp	(revision 368)
@@ -0,0 +1,103 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @author  Elie Al Alam <firstname.surname@utc.fr>
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    April, 2007
+/// @version $Id: main.cpp 81 2013-01-11 22:31:02Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief DbitePlayer main function.
+///
+/// Detailed description.
+/// @todo        - barre de temps dans l'affichage graphique
+///              - am�liorer l'affichage ; ic�ne, emplacement des boutons...
+///              - ajouter r�pertoire racine des donn�es (fait) :
+///              ajouter affichage de ce r�pertoire
+///              - ajouter classe g�n�rique d'�change de donn�es vers
+///              d'autres applications
+///              - fen�tre de monitoring des composants : valable pour
+///              toutes les applis bas�es sur PacpusLib
+///              avec possibilit� de masquer cette partie
+///              - faire une classe GraphViewer :
+///              permet d'afficher un nombre ind�fini de courbes
+///              offre des param�tres basiques : couleurs de la courbe,
+///              types de points, reli�s ou pas
+///              les courbes sont identifi�s par des noms
+///              voir comment l'utilisateur peut interagir avec les courbes
+///              par ex recuperer la valeur d'un point
+///              - associer a chaque composant une fenetre en dock view,
+///              affichagable ou pas defini dans le fichier de config
+
+#include <Pacpus/DbitePlayer/DbtPlyEngine.h>
+#include <Pacpus/DbitePlayer/DbtPlyTrigger.h>
+#include <Pacpus/DbitePlayer/DbtPlyUserInterface.h>
+#include <Pacpus/kernel/ComponentManager.h>
+#include <Pacpus/kernel/ComponentFactory.h>
+#include <Pacpus/kernel/Log.h>
+#include <Pacpus/kernel/PacpusApplication.h>
+#include <Pacpus/kernel/PacpusException.h>
+#include <Pacpus/kernel/PacpusPluginInterface.h>
+
+#include <boost/assert.hpp>
+#include <boost/cstdlib.hpp>
+#include <boost/exception/diagnostic_information.hpp>
+
+using namespace pacpus;
+using namespace std;
+
+DECLARE_STATIC_LOGGER("pacpus.core.DbitePlayer");
+
+static const string kDefaultXmlConfigFilePath = "DbitePlayer.xml";
+
+int main(int argc, char * argv[])
+{
+    LogConfigurator::configureLoggerWithFile("PacpusDbitePlayer_%N.log");
+
+    PacpusApplication app(argc, argv);
+    ComponentManager* mgr = ComponentManager::getInstance();
+
+    static ComponentFactory<DbtPlyEngine> factoryDbtPlyEngine("DbtPlyEngine");
+    (void) factoryDbtPlyEngine; // unused
+    static ComponentFactory<DbtPlyTrigger> factoryDbtPlyTrigger("DbtPlyTrigger");
+    (void) factoryDbtPlyTrigger; // unused
+    static ComponentFactory<DbtPlyUserInterface> factoryDbtPlyUserInterface("DbtPlyUserInterface");
+    (void) factoryDbtPlyUserInterface; // unused
+
+    string configFilePath;
+    if (argc > 1) {
+        configFilePath = argv[1];
+    } else {
+        configFilePath = kDefaultXmlConfigFilePath;
+        LOG_WARN("no XML config file specified. Using default: " << configFilePath);
+    }
+    LOG_INFO("loading file '" << configFilePath << "'");
+    const size_t componentCount = mgr->loadComponents(configFilePath.c_str());
+    if (componentCount == 0) {
+        LOG_FATAL("no components, exiting");
+        return EXIT_FAILURE;
+    }
+
+    int exitStatus = boost::exit_exception_failure;
+    try {
+        // start all the components (engine, trigger, user interface and the DBT file managers)
+        mgr->start();
+        // save application exit status
+        exitStatus = app.exec();
+        // stop all components before exiting app
+        mgr->stop();
+        mgr->destroy();
+    } catch (PacpusException& e) {
+        LOG_FATAL("PacpusException caught:" << e.what() << "\n" << boost::diagnostic_information(e));
+    } catch (boost::exception& e) {
+        (void)e; // unused
+        LOG_FATAL("boost::exception caught:" << boost::diagnostic_information(e));
+    } catch (std::exception& e) {
+        (void)e; // unused
+        LOG_FATAL("std::exception caught:" << e.what());
+    }
+
+    // return application exit status
+    return exitStatus;
+}
Index: tags/0.2.3/src/DBITEPlayerLib/CMakeLists.txt
===================================================================
--- tags/0.2.3/src/DBITEPlayerLib/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/src/DBITEPlayerLib/CMakeLists.txt	(revision 368)
@@ -0,0 +1,119 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+project(dbiteplayerlib)
+
+# ========================================
+# Compiler definitions
+# ========================================
+add_definitions(
+    -DDBITE_PLAYER_EXPORTS
+    ${QT_DEFINITIONS}
+)
+
+# ========================================
+# Include directories
+# ========================================
+include_directories(
+    ${CMAKE_BINARY_DIR}/DBITEPlayer
+    ${QT_INCLUDE_DIR}
+)
+
+# ========================================
+# Link directories
+# ========================================
+link_directories(
+    ${PROJECT_BINARY_DIR}/../PacpusLib
+    ${PROJECT_BINARY_DIR}/../FileLib
+    ${PROJECT_BINARY_DIR}/../RoadTime
+)
+
+# ========================================
+# List of sources
+# ========================================
+set(
+    PROJECT_SRCS
+    ./DbtPlyEngine.cpp
+    ./DbtPlyUserInterface.cpp
+    ./DbtPlyEngineStateChart.cpp
+    ./DbtPlyFileManager.cpp
+    ./DbtPlyTrigger.cpp
+    ${PACPUS_INCLUDE_DIR}/Pacpus/DbitePlayer/DbtPlyEngine.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/DbitePlayer/DbtPlyFileManager.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/DbitePlayer/DbtPlyTrigger.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/DbitePlayer/DbtPlyEngineStateChart.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/DbitePlayer/DbtPlyUserInterface.h
+)
+
+# ========================================
+# Files to MOC
+# ========================================
+set(
+    FILES_TO_MOC
+    ${PACPUS_INCLUDE_DIR}/Pacpus/DbitePlayer/DbtPlyEngine.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/DbitePlayer/DbtPlyFileManager.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/DbitePlayer/DbtPlyTrigger.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/DbitePlayer/DbtPlyUserInterface.h
+)
+
+# ========================================
+# Call MOC
+# ========================================
+qt_wrap_cpp(
+    PROJECT_MOC_SRCS
+    ${FILES_TO_MOC}
+)
+
+# ========================================
+# Directories architecture
+# ========================================
+SOURCE_GROUP(Core FILES ${PROJECT_SRCS} )
+SOURCE_GROUP(moc FILES ${PROJECT_MOC_SRCS})
+
+# ========================================
+# Build a library
+# ========================================
+pacpus_add_library(
+    ${PROJECT_NAME} SHARED
+    ${PROJECT_SRCS}
+    ${PROJECT_MOC_SRCS}
+)
+
+# ========================================
+# Libraries
+# ========================================
+set(OPT_LIBRARIES
+        optimized FileLib debug FileLib_d
+        optimized PacpusLib debug PacpusLib_d
+)
+
+# Windows platform
+if(WIN32)
+    LIST(APPEND OPT_LIBRARIES
+        optimized ROAD_TIME debug ROAD_TIME_d
+        Winmm
+)
+endif()
+
+# All platform
+target_link_libraries(
+    ${PROJECT_NAME}
+    ${PACPUS_DEPENDENCIES_LIB}
+    ${OPT_LIBRARIES}
+    ${QT_LIBRARIES}
+)
+
+# ========================================
+# Install
+# ========================================
+pacpus_install(${PROJECT_NAME})
+
+# ========================================
+# Folder
+# ========================================
+pacpus_folder(${PROJECT_NAME} "libraries")
Index: tags/0.2.3/src/DBITEPlayerLib/DbtPlyEngine.cpp
===================================================================
--- tags/0.2.3/src/DBITEPlayerLib/DbtPlyEngine.cpp	(revision 368)
+++ tags/0.2.3/src/DBITEPlayerLib/DbtPlyEngine.cpp	(revision 368)
@@ -0,0 +1,323 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version $Id: DbtPlyEngine.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include <Pacpus/DbitePlayer/DbtPlyEngine.h>
+
+#include <Pacpus/kernel/ComponentManager.h>
+#include <Pacpus/kernel/Log.h>
+
+#include <boost/assert.hpp>
+#include <limits>
+#include <QDir>
+
+using namespace std;
+
+// Construction de la fabrique de composant DbtPlyEngine
+//static ComponentFactory<DbtPlyEngine> factory("DbtPlyEngine");
+
+namespace pacpus {
+
+DECLARE_STATIC_LOGGER("pacpus.core.DbtPlyEngine");
+
+typedef float SpeedType;
+static const SpeedType kInitialSpeed = 1.0;
+static const SpeedType kMinSpeed = 1.0 / 32;
+static const SpeedType kMaxSpeed = 32;
+
+static const PlayMode kDefaultPlayMode = PlayModeLastData;
+
+////////////////////////////////////////////////////////////////////////////////
+/// Constructor
+DbtPlyEngine::DbtPlyEngine(QString name)
+    : ComponentBase(name)
+    , mCurrentState(StoppedState::getInstance())
+    , mSpeed(kInitialSpeed)
+    , mIsReverse(false)
+{
+    LOG_TRACE("constructor");
+
+    sync_ = new QSemaphore(1);
+    sync_->acquire();
+    direction_ = 1;
+    tMinMaxSem_ = new QSemaphore(1);
+    tMinMaxSem_->release();
+    tDbtMin_ = numeric_limits<road_time_t>::max();
+    tDbtMax_ = 0;
+
+    namespace po = boost::program_options;
+    addParameters()
+        ("datadir", po::value<string>(&mDataDir)->required(), "set root data directory")
+        ("replay_mode", po::value<unsigned>(&reinterpret_cast<unsigned&>(replayMode_))->default_value(kDefaultPlayMode), "set data replay mode")
+        ("log-config-file", po::value<string>(&mLoggerConfigFile), "set logger configuration file path")
+    ;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Destructor.
+DbtPlyEngine::~DbtPlyEngine()
+{
+    LOG_TRACE("destructor");
+}
+
+void DbtPlyEngine::addInputs()
+{
+    // empty: no inputs
+}
+
+void DbtPlyEngine::addOutputs()
+{
+    // empty: no outputs
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Returns the directory where the data are stored.
+/// @return QString::null if directory is invalid.
+QString DbtPlyEngine::getDataDir()
+{
+    return mDataDir.c_str();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Slot.
+/// called when trigger reaches a new timer event
+void DbtPlyEngine::engReceiver()
+{
+    sync_->release();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// @returns @b true if the engine is in the PLAY_STATE, @b false otherwise
+bool DbtPlyEngine::isPlaying()
+{
+    return mCurrentState->isPlaying();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// main loop of the thread
+/// entry point for a new thread after the invocation of QThread::start()
+void DbtPlyEngine::run()
+{
+    PACPUS_LOG_FUNCTION();
+
+    // We are waiting the first trigger signal to init some values
+    // before entering in the while loop
+    sync_->acquire();
+    lastTDbt_ = tDbtMin_;
+
+    // For statistics purpose
+    static const size_t kDeltaArraySize = 1000;
+    int deltaTDbtTab[kDeltaArraySize];
+    int i = 0;
+
+    while (isActive()) {
+        tNow_ = road_time();
+        float elapsedTime = tNow_ - lastTNow_;
+        int deltaTDbt = direction_ * elapsedTime * mSpeed;
+        tDbt_ = lastTDbt_ + deltaTDbt;
+        deltaTDbtTab[(i++) % kDeltaArraySize] = elapsedTime;
+
+        if ((tDbt_ <= tDbtMax_) && (tDbt_ >= tDbtMin_)) {
+            Q_EMIT play(tDbt_, tNow_, mIsReverse);
+            Q_EMIT curReplayTime(tDbt_);
+            lastTNow_ = tNow_ ;
+            lastTDbt_ = tDbt_ ;
+        } else {
+            lastTNow_ = tNow_ ;
+            lastTDbt_ = tDbt_ ;
+            LOG_INFO("Reading is finished.");
+
+            mCurrentState->stop(*this);
+        }
+
+        // The waiting is placed at the end due to the init before the while loop
+        sync_->acquire();
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Slot.
+/// change the direction of replaying : normal or reverse
+void DbtPlyEngine::changeDirection(bool reverse)
+{
+    if (reverse) {
+        direction_ = -1;
+        mIsReverse = true;
+    } else {
+        direction_ = +1;
+        mIsReverse = false;
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Configuration method of the engine
+/// called automatically by the component manager
+ComponentBase::COMPONENT_CONFIGURATION DbtPlyEngine::configureComponent(XmlComponentConfig config)
+{
+    {
+        // data directory: add path separator at end if needed
+        QString dataDir = mDataDir.c_str();
+        dataDir = QDir::toNativeSeparators(dataDir);
+        if (!dataDir.endsWith(QDir::separator())) {
+            dataDir += QDir::separator();
+            mDataDir = dataDir.toStdString();
+        }
+    }
+
+    ////////////////////////////////////////////////////////////////////////////////
+    // logger configuration
+    if (!mLoggerConfigFile.empty()) {
+        LOG_INFO("configuring logger with file '" << mLoggerConfigFile << "'");
+        LogConfigurator::configureLoggerWithFile(mLoggerConfigFile.c_str());
+    }
+
+    return ComponentBase::CONFIGURED_OK;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// The start function of the engine
+void DbtPlyEngine::startActivity()
+{
+    LOG_INFO("Starting...");
+
+    setActive(true);
+    start();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// The stop function of the engine
+void DbtPlyEngine::stopActivity()
+{ 
+    LOG_TRACE("stopping activity...");
+
+    setActive(false);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Slot.
+/// called by each file manager to provide min and max time of their data
+void DbtPlyEngine::tMinMax(road_time_t tMin, road_time_t tMax)
+{
+    tMinMaxSem_->acquire();
+    if (tDbtMin_>tMin) {
+        tDbtMin_= tMin;
+    }
+    if (tDbtMax_<tMax) {
+        tDbtMax_ = tMax;
+    }
+    Q_EMIT timeMinMax(tDbtMin_, tDbtMax_);
+    tMinMaxSem_->release();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Slot.
+/// called when the time slider is pressed
+void DbtPlyEngine::pauseEvent()
+{
+    LOG_DEBUG("Clicked: pause");
+    mCurrentState->pause(*this);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Slot.
+/// called when the time slider is released
+void DbtPlyEngine::playEvent()
+{
+    using boost::dynamic_pointer_cast;
+
+    LOG_DEBUG("Clicked: play");
+
+    // get user interface
+    ComponentManager * mgr = ComponentManager::getInstance();
+    boost::shared_ptr<DbtPlyUserInterface> ui = dynamic_pointer_cast<DbtPlyUserInterface>(mgr->getComponent("dbiteUserInterface"));
+    BOOST_ASSERT(ui);
+    // get time value from slider
+    lastTDbt_ = ui->getTime() + tDbtMin_;
+
+    mCurrentState->play(*this);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void DbtPlyEngine::stopEvent()
+{
+    LOG_DEBUG("Clicked: stop");
+    mCurrentState->stop(*this);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void DbtPlyEngine::speedUpEvent()
+{
+    LOG_DEBUG("Clicked: speed Up");
+    mCurrentState->speedUp(*this);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void DbtPlyEngine::speedDownEvent()
+{
+    LOG_DEBUG("Clicked: speed down");
+    mCurrentState->speedDown(*this);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+const DbtPlyEngineState * DbtPlyEngine::getState()
+{
+    return mCurrentState;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void DbtPlyEngine::setState(DbtPlyEngineState * newState)
+{
+	BOOST_ASSERT(newState);
+	LOG_DEBUG(mCurrentState->toString().toStdString() << " => " << newState->toString().toStdString()); 
+    mCurrentState = newState;
+
+    Q_EMIT displayStateSig(mCurrentState, mSpeed);
+
+    LOG_DEBUG("tDbt = " << tDbt_ << "\tlastTDbt = " << lastTDbt_);
+    LOG_DEBUG("tNow = " << tNow_ << "\tlastTNow = " << lastTNow_);
+}
+
+void DbtPlyEngine::speedUp()
+{
+    mSpeed *= 2;
+    if (mSpeed > kMaxSpeed) {
+        mSpeed = kMaxSpeed;
+    }
+    BOOST_ASSERT(kMinSpeed <= mSpeed);
+    BOOST_ASSERT(mSpeed <= kMaxSpeed);
+    LOG_INFO("event: Speed Up, speed = " << mSpeed);
+    Q_EMIT displayStateSig(mCurrentState, mSpeed);
+}
+
+void DbtPlyEngine::speedDown()
+{
+    mSpeed /= 2;
+    if (mSpeed < kMinSpeed) {
+        mSpeed = kMinSpeed;
+    }
+    BOOST_ASSERT(kMinSpeed <= mSpeed);
+    BOOST_ASSERT(mSpeed <= kMaxSpeed);
+    LOG_INFO("event: Speed Up, speed = " << mSpeed);
+    Q_EMIT displayStateSig(mCurrentState, mSpeed);
+}
+
+void DbtPlyEngine::reset()
+{
+    using boost::dynamic_pointer_cast;
+
+    lastTNow_ = road_time();
+    lastTDbt_ = tDbtMin_;
+    mSpeed = kInitialSpeed;
+    Q_EMIT stopfile();
+
+    // get user interface
+    ComponentManager * mgr = ComponentManager::getInstance();
+    boost::shared_ptr<DbtPlyUserInterface> ui = dynamic_pointer_cast<DbtPlyUserInterface>(mgr->getComponent("dbiteUserInterface"));
+    BOOST_ASSERT(ui);
+    // reset time value of the slider
+    ui->resetTime();
+}
+
+} // namespace pacpus
Index: tags/0.2.3/src/DBITEPlayerLib/DbtPlyEngineStateChart.cpp
===================================================================
--- tags/0.2.3/src/DBITEPlayerLib/DbtPlyEngineStateChart.cpp	(revision 368)
+++ tags/0.2.3/src/DBITEPlayerLib/DbtPlyEngineStateChart.cpp	(revision 368)
@@ -0,0 +1,144 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version $Id: DbtPlyEngineStateChart.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include <Pacpus/DbitePlayer/DbtPlyEngineStateChart.h>
+
+#include <Pacpus/DbitePlayer/DbtPlyEngine.h>
+#include <Pacpus/kernel/Log.h>
+
+namespace pacpus {
+
+DECLARE_STATIC_LOGGER("pacpus.core.DbtPlyEngineStateChart");
+
+typedef float SpeedType;
+static const SpeedType kMinSpeed = 1.0 / 32;
+static const SpeedType kMaxSpeed = 32;
+
+////////////////////////////////////////////////////////////////////////////////
+DbtPlyEngineState::DbtPlyEngineState()
+{
+}
+
+DbtPlyEngineState::~DbtPlyEngineState()
+{
+}
+
+void DbtPlyEngineState::play(DbtPlyEngine & /*engine*/)
+{
+    // do nothing
+}
+
+void DbtPlyEngineState::pause(DbtPlyEngine & /*engine*/)
+{
+    // do nothing
+}
+
+void DbtPlyEngineState::stop(DbtPlyEngine & /*engine*/)
+{
+    // do nothing
+}
+
+void DbtPlyEngineState::speedUp(DbtPlyEngine & engine)
+{
+    engine.speedUp();
+}
+
+void DbtPlyEngineState::speedDown(DbtPlyEngine & engine)
+{
+    engine.speedDown();
+}
+
+bool DbtPlyEngineState::isPlaying()
+{
+    return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+PlayingState::PlayingState()
+{
+}
+
+void PlayingState::pause(DbtPlyEngine & engine)
+{
+    engine.setState(PausedState::getInstance());
+}
+
+void PlayingState::stop(DbtPlyEngine & engine)
+{
+    engine.reset();
+    engine.setState(StoppedState::getInstance());
+}
+
+bool PlayingState::isPlaying()
+{
+    return true;
+}
+
+QString PlayingState::toString() const
+{
+    return "Playing";
+}
+
+DbtPlyEngineState * PlayingState::getInstance()
+{
+    return &mInstance;
+}
+
+PlayingState PlayingState::mInstance;
+
+////////////////////////////////////////////////////////////////////////////////
+PausedState::PausedState()
+{
+}
+
+void PausedState::play(DbtPlyEngine & engine)
+{
+    engine.setLastTNow(road_time());
+    engine.setState(PlayingState::getInstance());
+}
+
+void PausedState::stop(DbtPlyEngine & engine)
+{
+    engine.reset();
+    engine.setState(StoppedState::getInstance());
+}
+
+QString PausedState::toString() const
+{
+    return "Paused";
+}
+
+DbtPlyEngineState * PausedState::getInstance()
+{
+    return &mInstance;
+}
+
+PausedState PausedState::mInstance;
+
+////////////////////////////////////////////////////////////////////////////////
+StoppedState::StoppedState()
+{
+}
+
+void StoppedState::play(DbtPlyEngine & engine)
+{
+    engine.setLastTNow(road_time());
+    engine.setState(PlayingState::getInstance());
+}
+
+QString StoppedState::toString() const
+{
+    return "Stopped";
+}
+
+DbtPlyEngineState * StoppedState::getInstance()
+{
+    return &mInstance;
+}
+
+StoppedState StoppedState::mInstance;
+
+} // namespace pacpus
Index: tags/0.2.3/src/DBITEPlayerLib/DbtPlyFileManager.cpp
===================================================================
--- tags/0.2.3/src/DBITEPlayerLib/DbtPlyFileManager.cpp	(revision 368)
+++ tags/0.2.3/src/DBITEPlayerLib/DbtPlyFileManager.cpp	(revision 368)
@@ -0,0 +1,319 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version $Id: DbtPlyFileManager.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include <Pacpus/DbitePlayer/DbtPlyFileManager.h>
+#include <Pacpus/kernel/ComponentManager.h>
+#include <Pacpus/kernel/DbiteException.h>
+#include <Pacpus/kernel/Log.h>
+
+#include <cassert>
+#include <iostream>
+#include <limits>
+#include <QMetaType>
+#include <QSemaphore>
+
+using namespace pacpus;
+using namespace std;
+
+DECLARE_STATIC_LOGGER("pacpus.core.DbtPlyFileManager");
+
+// It is the maximum time elapsed between the computation of the tDbt and the data replay in microseconds
+static const int kMaxPendingTimeFromEngineMicrosecs = 10000;
+
+static const char kFilenameSeparator = '|';
+
+////////////////////////////////////////////////////////////////////////////////
+/// Constructor.
+DbtPlyFileManager::DbtPlyFileManager(QString name)
+    : ComponentBase(name)
+{
+    LOG_TRACE("constructor");
+
+    sync_ = new QSemaphore(1);
+    sync_->acquire();
+    tMin_ = numeric_limits<road_time_t>::max();
+    tMax_ = numeric_limits<road_time_t>::min();
+
+    namespace po = boost::program_options;
+    addParameters()
+        ("dbt", po::value<std::string>(&dbtProperty_)->required(), "set path to input DbiteFile(s) (*.dbt), separate files by '|'")
+    ;
+}
+
+QStringList DbtPlyFileManager::getDbiteFilenameList() const
+{
+    return mDbtFilenameList;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Destructor.
+DbtPlyFileManager::~DbtPlyFileManager() 
+{
+    LOG_TRACE("destructor");
+
+    for (QList<dbtStructFile>::iterator it = dbt_.begin(), itend = dbt_.end(); it != itend; ++it) {
+        dbtStructFile & dbtFile = *it;
+
+        delete[] dbtFile.cur.buffer;
+        delete[] dbtFile.toProcess.buffer;
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Configures the file manager.
+ComponentBase::COMPONENT_CONFIGURATION DbtPlyFileManager::configureComponent(XmlComponentConfig config)
+{
+    using boost::dynamic_pointer_cast;
+
+    ComponentManager * mgr = ComponentManager::getInstance();
+    mEngine = dynamic_pointer_cast<DbtPlyEngine>(mgr->getComponent("dbiteEngine"));
+    if (!mEngine) {
+        LOG_FATAL("cannot get a pointer of the 'dbiteEngine' component");
+        return CONFIGURED_FAILED;
+    }
+    if (!mEngine->isConfigured()) {
+        LOG_WARN("'dbiteEngine' component was not configured");
+        return CONFIGURATION_DELAYED;
+    }
+
+    // Qt Signal-Slot connections
+    // register the road_time_t type for the connection
+    qRegisterMetaType<road_time_t>("road_time_t");
+    connect(mEngine.get(), SIGNAL(play(road_time_t,road_time_t, bool)),
+            this, SLOT(playData(road_time_t,road_time_t, bool)),
+            Qt::DirectConnection);
+    connect(this, SIGNAL(tMinMaxIs(road_time_t,road_time_t )),
+            mEngine.get(), SLOT(tMinMax(road_time_t, road_time_t)));
+    connect(mEngine.get(), SIGNAL(stopfile()),
+            this, SLOT (beginfile()));
+
+    // get the properties in the XML node
+    mDbtDataPath = mEngine->getDataDir();
+    mDbtFilenameList = QString(dbtProperty_.c_str()).split(kFilenameSeparator);
+
+    for (int i = 0; i < mDbtFilenameList.size(); ++i) {
+        mDbtFilenameList[i] = mDbtDataPath + mDbtFilenameList.at(i);
+        LOG_INFO("opening DBT file \"" << mDbtFilenameList.at(i) << "\"");
+
+        // temporary dbt object
+        dbtStructFile dbt;
+        dbt.pfile = new DbiteFile();
+        assert(dbt.pfile);
+        try {
+            dbt.pfile->open(mDbtFilenameList.at(i).toStdString(), ReadMode);
+        } catch (DbiteException & e) {
+            (void) e; // unused
+            LOG_ERROR("cannot open DBT file \"" << mDbtFilenameList.at(i) << "\"");
+            LOG_DEBUG("error: " << e.what());
+            return CONFIGURED_FAILED;
+        }
+        if (!dbt.pfile->isOpen()) {
+            LOG_ERROR("cannot open DBT file \"" << mDbtFilenameList.at(i) << "\"");
+            return CONFIGURED_FAILED;
+        }
+        cout << "Header: " << "\n"
+             << (string) *dbt.pfile << "\n";
+
+        // alloc buffer with the Data Size given in the header
+        dbt.cur.buffer = new char[dbt.pfile->getRecordSize()];
+        dbt.toProcess.buffer = new char[dbt.pfile->getRecordSize()];
+
+        dbt_.insert(i, dbt);
+
+        // Reading of the first data to put in the buffer_
+        dbt_[i].pfile->readRecord(dbt_[i].cur.t, dbt_[i].cur.tr, reinterpret_cast<char *>(dbt_[i].cur.buffer));
+
+        if (dbt_.at(i).pfile->getRecordCount() > 0) {
+            if (dbt_.at(i).pfile->getTimeMin() < tMin_) {
+                tMin_ = dbt_.at(i).pfile->getTimeMin();
+            }
+            if (dbt_.at(i).pfile->getTimeMax() > tMax_ ) {
+                tMax_ = dbt_.at(i).pfile->getTimeMax();
+            }
+            Q_EMIT tMinMaxIs(tMin_, tMax_);
+        }
+    }
+
+    return CONFIGURED_OK;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Starts activity of the file manager
+void DbtPlyFileManager::startActivity()
+{
+    // graphical user interface
+    if (hasGui()) {
+        displayUI();
+    }
+
+    deltaTDbtTabLoop_ = 0;
+
+    mode_ = mEngine->replayMode();
+    LOG_INFO("replay mode " << mode_);
+    start();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Stops activity of the file manager
+void DbtPlyFileManager::stopActivity()
+{ 
+    deltaTDbtTabLoop_ = 0;
+}
+
+void DbtPlyFileManager::displayUI()
+{
+    LOG_WARN("component '" << getName() << "' has no user interface. Please set ui property to 0 in your XML configuration");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Goes back to the beginning of the file.
+/// Places the descriptor to the first data.
+void DbtPlyFileManager::beginfile()
+{
+    LOG_DEBUG("called beginfile()");
+    for (QList<dbtStructFile>::iterator it = dbt_.begin(), itend = dbt_.end(); it != itend; ++it) {
+        dbtStructFile & dbtFile = *it;
+
+        dbtFile.pfile->goToDataBegin();
+        // reinitialize buffer and times to the 1st value
+        dbtFile.pfile->readRecord(dbtFile.cur.t, dbtFile.cur.tr, reinterpret_cast<char *>(dbtFile.cur.buffer));
+    }
+}
+
+bool DbtPlyFileManager::processDbtFileHdfile(dbtStructFile & dbtFile, DbiteFile::ReadDirection direction)
+{
+    dbtFile.toProcess.t = dbtFile.cur.t;
+    dbtFile.toProcess.tr = dbtFile.cur.tr;
+    memcpy(dbtFile.toProcess.buffer, dbtFile.cur.buffer, dbtFile.pfile->getRecordSize());
+
+    if (!dbtFile.pfile->readRecord(dbtFile.cur.t, dbtFile.cur.tr, reinterpret_cast<char *>(dbtFile.cur.buffer), direction)) {
+        LOG_WARN("EOF or there was a problem in read function, no data read");
+        dbtFile.cur.t = tMax_;
+        return false;
+    }
+    return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// play mode 1
+/// the player replays only the last data that has not been yet replayed
+void DbtPlyFileManager::playMode1(road_time_t tDbt, bool reverse)
+{
+    DbiteFile::ReadDirection readDirection = DbiteFile::ReadForward;
+    if (reverse) {
+        readDirection = DbiteFile::ReadBackward;
+    }
+
+    dbtIndex_ = 0;
+    for (QList<dbtStructFile>::iterator it = dbt_.begin(), itend = dbt_.end(); it != itend; ++it) {
+        dbtStructFile & dbtFile = *it;
+
+        bool mustProcess = false;
+        if (reverse) {
+            // backward
+            while (dbtFile.cur.t > tDbt) {
+                mustProcess = true;
+                if (!processDbtFileHdfile(dbtFile, readDirection)) {
+                    break;
+                }
+            }
+        } else {
+            // forward
+            while (dbtFile.cur.t < tDbt) {
+                mustProcess = true;
+                if (!processDbtFileHdfile(dbtFile, readDirection)) {
+                    break;
+                }
+            }
+        }
+
+        if (mustProcess) {
+            processData(dbtFile.cur.t, dbtFile.toProcess.tr, dbtFile.cur.buffer);
+        }
+        ++dbtIndex_;
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// play mode 2
+// the player replays all the data that have not been yet replayed
+void DbtPlyFileManager::playMode2(road_time_t tDbt, bool reverse)
+{
+    DbiteFile::ReadDirection readDirection = DbiteFile::ReadForward;
+    if (reverse) {
+        readDirection = DbiteFile::ReadBackward;
+    }
+
+    dbtIndex_ = 0;
+    for (QList<dbtStructFile>::iterator it = dbt_.begin(), itend = dbt_.end(); it != itend; ++it) {
+        dbtStructFile & dbtFile = *it;
+
+        if (reverse) {
+            // backward
+            while (dbtFile.cur.t > tDbt) {
+                processDbtFileHdfile(dbtFile, readDirection);
+                processData(dbtFile.cur.t, dbtFile.toProcess.tr, dbtFile.cur.buffer);
+            }
+        } else {
+            // forward
+            while (dbtFile.cur.t < tDbt) {
+                processDbtFileHdfile(dbtFile, readDirection);
+                processData(dbtFile.cur.t, dbtFile.toProcess.tr, dbtFile.cur.buffer);
+            }
+        }
+        ++dbtIndex_;
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// slot 
+// Called by the player engine 
+// Before replaying data, this funtion verifies that the replayed time is  
+// included in the time interval of the data and that the time elapsed between  
+// the estimation of this replayed time is not too big
+void DbtPlyFileManager::playData(road_time_t tDbt,road_time_t tNow, bool reverse)
+{
+    // If tDbt is not included in the time interval of the data, we don't have any data to play
+    if ((tDbt>tMax_) || (tDbt<tMin_)) {
+        return;
+    }
+
+    // measure the difference between the current time and the tNow used to calculate the tDbt
+    int deltaT = road_time() - tNow;
+    deltaTDbtTab_[(deltaTDbtTabLoop_++)%1000] = deltaT;
+    if (deltaT > kMaxPendingTimeFromEngineMicrosecs) {
+		LOG_WARN(getName().toStdString() << ": data not replayed: elapsed time since engine notification too big:" << deltaT << "us");
+		return;
+    }
+
+    timeToRead_ = tDbt;
+    reverse_ = reverse;
+    sync_->release();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Main loop of the thread.
+/// Only synchronize on the player engine and when activated call the correct
+/// replay method.
+void DbtPlyFileManager::run()
+{
+    for (;;) {
+        sync_->acquire();
+
+        switch (mode_) {
+        case 1:
+            playMode1(timeToRead_, reverse_);
+            break;
+
+        case 2:
+            playMode2(timeToRead_, reverse_);
+            break;
+
+        default:
+            break;
+        }
+    }
+}
Index: tags/0.2.3/src/DBITEPlayerLib/DbtPlyTrigger.cpp
===================================================================
--- tags/0.2.3/src/DBITEPlayerLib/DbtPlyTrigger.cpp	(revision 368)
+++ tags/0.2.3/src/DBITEPlayerLib/DbtPlyTrigger.cpp	(revision 368)
@@ -0,0 +1,84 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version $Id: DbtPlyTrigger.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include <Pacpus/DbitePlayer/DbtPlyTrigger.h>
+
+#include <Pacpus/kernel/ComponentManager.h>
+#include <Pacpus/kernel/Log.h>
+
+namespace pacpus {
+
+DECLARE_STATIC_LOGGER("pacpus.core.DbtPlyTrigger");
+
+// Construction de la fabrique de composant DbtPlyTrigger
+//static ComponentFactory<DbtPlyTrigger> factory("DbtPlyTrigger");
+
+DbtPlyTrigger::DbtPlyTrigger(QString name)
+    : ComponentBase(name)
+{
+}
+
+DbtPlyTrigger::~DbtPlyTrigger()
+{ 
+}
+
+void DbtPlyTrigger::addInputs()
+{
+    // empty: no inputs
+}
+
+void DbtPlyTrigger::addOutputs()
+{
+    // empty: no outputs
+}
+
+ComponentBase::COMPONENT_CONFIGURATION DbtPlyTrigger::configureComponent(XmlComponentConfig /*config*/)
+{
+    using boost::dynamic_pointer_cast;
+
+    ComponentManager * mgr = ComponentManager::getInstance();
+    // we get a pointer to the engine component
+    mEngine = dynamic_pointer_cast<DbtPlyEngine>(mgr->getComponent("dbiteEngine"));
+    if (!mEngine) {
+        LOG_FATAL("cannot get a pointer of the 'dbiteEngine' component");
+        return CONFIGURED_FAILED;
+    }
+    QObject::connect(this, SIGNAL(triggerSig()),
+            mEngine.get(), SLOT(engReceiver()),
+            Qt::DirectConnection);
+
+    return CONFIGURED_OK;
+}
+
+void DbtPlyTrigger::startActivity()
+{   
+    start();
+}
+
+void DbtPlyTrigger::stopActivity()
+{ 
+}
+
+// The thread is started when the user press the play button
+void DbtPlyTrigger::run()
+{
+#ifdef WIN32
+    timeBeginPeriod(1);
+#endif
+
+    while(isActive()) {
+        if (mEngine->isPlaying()) {
+            Q_EMIT triggerSig();
+        }
+        msleep(1);
+    }
+
+#ifdef WIN32
+    timeEndPeriod(1);
+#endif 
+}
+
+} // namespace pacpus
Index: tags/0.2.3/src/DBITEPlayerLib/DbtPlyUserInterface.cpp
===================================================================
--- tags/0.2.3/src/DBITEPlayerLib/DbtPlyUserInterface.cpp	(revision 368)
+++ tags/0.2.3/src/DBITEPlayerLib/DbtPlyUserInterface.cpp	(revision 368)
@@ -0,0 +1,349 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version $Id: DbtPlyUserInterface.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include <Pacpus/DbitePlayer/DbtPlyUserInterface.h>
+
+#include <Pacpus/kernel/ComponentManager.h>
+#include <Pacpus/kernel/Log.h>
+
+#include <cassert>
+#include <cmath> // fabs
+#include <qapplication.h>   // quit()
+#include <qboxlayout.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <qtablewidget.h>
+
+namespace pacpus {
+
+class DbtPlyEngineState;
+
+DECLARE_STATIC_LOGGER("pacpus.core.DbtPlyUserInterface");
+
+//static ComponentFactory<DbtPlyUserInterface> factory("DbtPlyUserInterface");
+
+////////////////////////////////////////////////////////////////////////////////
+DbtPlyUserInterface::DbtPlyUserInterface(QString name)
+    : ComponentBase(name)
+    , componentTableWidget(NULL)
+{
+    relTime_ = absTime_ = tMin_ = tMax_ = 0;
+
+    setLayout(createMainLayout());
+
+    show();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+DbtPlyUserInterface::~DbtPlyUserInterface()
+{  
+}
+
+void DbtPlyUserInterface::addInputs()
+{
+    // empty: no inputs
+}
+
+void DbtPlyUserInterface::addOutputs()
+{
+    // empty: no outputs
+}
+
+////////////////////////////////////////////////////////////////////////////////
+ComponentBase::COMPONENT_CONFIGURATION DbtPlyUserInterface::configureComponent(XmlComponentConfig /*config*/)
+{
+    using boost::dynamic_pointer_cast;
+
+    ComponentManager * mgr = ComponentManager::getInstance();
+    mEngine = dynamic_pointer_cast<DbtPlyEngine>(mgr->getComponent("dbiteEngine"));
+    if (!mEngine) {
+        LOG_FATAL("cannot get a pointer of the 'dbiteEngine' component");
+        return CONFIGURED_FAILED;
+    }
+
+    connectButtons();
+    connectDisplay();
+    connectSlider();
+
+    updateComponentList();
+
+    return ComponentBase::CONFIGURED_OK;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Starts activity.
+void DbtPlyUserInterface::startActivity()
+{ 
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Stops activity.
+void DbtPlyUserInterface::stopActivity()
+{ 
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Overloaded.
+/// Invoked on close event.
+void DbtPlyUserInterface::closeEvent(QCloseEvent * /*event*/)
+{
+    qApp->quit();
+}
+
+void DbtPlyUserInterface::displayStateSlot(DbtPlyEngineState * state, float speed)
+{
+    LOG_DEBUG("displayStateSlot, state = " << state->toString() << ", speed = " << speed);
+
+    QString speedString;
+    if (fabs(speed) >= 1) {
+        speedString = speedString.setNum((int)speed);
+    } else {
+        speedString = "1/" + speedString.setNum((int)(1.0 / speed));
+    }
+
+    QString stateAndSpeedText;
+    stateAndSpeedText = state->toString() + " - speed : " + speedString;
+
+    lab->setText(stateAndSpeedText);
+    lab->adjustSize();
+}
+
+void DbtPlyUserInterface::displayMinMaxTime(road_time_t min, road_time_t max)
+{
+    timeMinValue->setText(QString::number(min));
+    tMin_ = min;
+    timeMaxValue->setText(QString::number(max));
+    tMax_ = max;
+    timeSlider->setMaximum(tMax_-tMin_);
+}
+
+void DbtPlyUserInterface::displayTime(road_time_t time)
+{
+    absTime_ = time;
+    if ((time - tMin_ - relTime_) > 40000 )
+    {
+        // refresh at 25Hz rate
+        relTime_ = (int)(time - tMin_);
+        timeCurValue->setText(QString::number(relTime_/1e6) + " - " + QString::number(absTime_));
+        timeSlider->setValue(relTime_);
+    }
+}
+
+int DbtPlyUserInterface::getTime()
+{
+    return timeSlider->value();
+}
+
+void DbtPlyUserInterface::resetTime()
+{
+    timeSlider->setValue(0);
+}
+
+QLayout * DbtPlyUserInterface::createMainLayout()
+{
+    QGroupBox * mainGroupBox = createControlGroupBox();
+    QGroupBox * componentListGroupBox = createComponentListGroupBox();
+
+    QGridLayout * generalLayout = new QGridLayout(this);
+    generalLayout->addWidget(mainGroupBox, /* row = */ 0, /* column = */ 0, /* rowSpan = */ 1, /* columnSpan = */ 3);
+    generalLayout->addWidget(componentListGroupBox, /* row = */ 1, /* column = */ 0, /* rowSpan = */ 1, /* columnSpan = */ 1);
+
+    return generalLayout;
+}
+
+QGroupBox * DbtPlyUserInterface::createControlGroupBox()
+{
+    const int kButtonWidthInPixels = 20;
+    const int kButtonHeightInPixels = 20;
+
+    QGridLayout * mainLayout = new QGridLayout(this);
+
+    butGroup = new QButtonGroup(this);
+    playBut = new QPushButton (style()->standardIcon(QStyle::SP_MediaPlay), "Play", this);
+    playBut->resize(kButtonWidthInPixels, kButtonHeightInPixels);
+    butGroup->addButton(playBut,1);
+    mainLayout->addWidget(playBut,0,0);
+
+    pauseBut = new QPushButton (style()->standardIcon(QStyle::SP_MediaPause), "Pause", this);
+    pauseBut->resize(kButtonWidthInPixels, kButtonHeightInPixels);
+    butGroup->addButton(pauseBut,2);
+    mainLayout->addWidget(pauseBut,0,1);
+
+    stopBut = new QPushButton (style()->standardIcon(QStyle::SP_MediaStop), "Stop", this);
+    stopBut->resize(kButtonWidthInPixels, kButtonHeightInPixels);
+    butGroup->addButton(stopBut,3);
+    mainLayout->addWidget(stopBut,0,2);
+
+    speedUpBut = new QPushButton (style()->standardIcon(QStyle::SP_MediaSeekForward), "", this);
+    speedUpBut->resize(kButtonWidthInPixels, kButtonHeightInPixels);
+    speedUpBut->setToolTip("Increase speed");
+    butGroup->addButton(speedUpBut,4);
+    mainLayout->addWidget(speedUpBut,1,1);
+
+    speedDownBut = new QPushButton (style()->standardIcon(QStyle::SP_MediaSeekBackward), "", this);
+    speedDownBut->resize(kButtonWidthInPixels, kButtonHeightInPixels);
+    speedDownBut->setToolTip("Decrease speed");
+    butGroup->addButton(speedDownBut,5);
+    mainLayout->addWidget(speedDownBut,1,0);
+
+    rev = new QCheckBox(tr("Reverse"), this);
+    mainLayout->addWidget(rev,1,2);
+
+    mainLayout->columnMinimumWidth(1);
+
+    lab = new QLabel (this);
+    lab->setText(tr("Player State"));
+    lab->adjustSize();
+    mainLayout->addWidget(lab,2,0,1,3);
+
+    timeMinTitle = new QLabel(this);
+    timeMinTitle->setText(tr("Min time"));
+    timeMinTitle->adjustSize();
+    mainLayout->addWidget(timeMinTitle,3,0);
+
+    timeMinValue = new QLabel(this);
+    timeMinValue->setText("0");
+    timeMinValue->adjustSize();
+    timeMinValue->setFrameStyle(QFrame::Panel | QFrame::Sunken);
+    mainLayout->addWidget(timeMinValue,3,1,1,2);
+
+    timeMaxTitle = new QLabel(this);
+    timeMaxTitle->setText(tr("Max time"));
+    timeMaxTitle->adjustSize();
+    mainLayout->addWidget(timeMaxTitle,4,0);
+
+    timeMaxValue = new QLabel(this);
+    timeMaxValue->setText("0");
+    timeMaxValue->adjustSize();
+    timeMaxValue->setFrameStyle(QFrame::Panel | QFrame::Sunken);
+    mainLayout->addWidget(timeMaxValue,4,1,1,2);
+
+    timeCurTitle = new QLabel(this);
+    timeCurTitle->setText(tr("Current time"));
+    timeCurTitle->adjustSize();
+    mainLayout->addWidget(timeCurTitle,5,0);
+
+    timeCurValue = new QLabel(this);
+    timeCurValue->setText("0 - 0");
+    timeCurValue->adjustSize();
+    timeCurValue->setFrameStyle(QFrame::Panel | QFrame::Sunken);
+    mainLayout->addWidget(timeCurValue,5,1,1,2);
+
+    timeSlider = new QSlider(Qt::Horizontal, this);
+    timeSlider->setMinimum(0);
+    timeSlider->adjustSize();
+    mainLayout->addWidget(timeSlider, /* row = */ 6, /* column = */ 0, /* rowSpan = */ 1, /* columnSpan = */ 3);
+
+    QGroupBox * mainGroupBox = new QGroupBox(tr("Control"));
+    mainGroupBox->setLayout(mainLayout);
+
+    return mainGroupBox;
+}
+
+QGroupBox * DbtPlyUserInterface::createComponentListGroupBox()
+{
+    QGroupBox * componentListGroupBox = new QGroupBox(tr("Component list"));
+
+    QBoxLayout * componentListLayout = new QBoxLayout(QBoxLayout::TopToBottom, this);
+    componentListGroupBox->setLayout(componentListLayout);
+
+    componentTableWidget = new QTableWidget(this);
+    componentListLayout->addWidget(componentTableWidget);
+
+    return componentListGroupBox;
+}
+
+void DbtPlyUserInterface::updateComponentList()
+{
+    ComponentManager * mgr = ComponentManager::getInstance();
+    QStringList componentNames = mgr->getAllComponentsName();
+
+    componentTableWidget->setRowCount(componentNames.size());
+    componentTableWidget->setColumnCount(2);
+    QStringList labels;
+    labels << tr("Name") << tr("State") << tr("Details");
+    componentTableWidget->setHorizontalHeaderLabels(labels);
+
+    int idx = 0;
+    for (QStringList::const_iterator it = componentNames.constBegin(), itend = componentNames.constEnd(); it != itend; ++it, ++idx) {
+        QString componentName = *it;
+        LOG_DEBUG("adding to component list: " << componentName);
+        componentTableWidget->setItem(idx, 0, new QTableWidgetItem(componentName));
+
+        ComponentSharedPointer component = mgr->getComponent(componentName);
+        if (!component) {
+            continue;
+        }
+
+        COMPONENT_STATE state = component->getState();
+
+        QString stateString;
+        switch (state) {
+        case STOPPED:
+            stateString = tr("Stopped");
+            break;
+        case NOT_MONITORED:
+            stateString = tr("Not monitored");
+            break;
+        case MONITOR_OK:
+            stateString = tr("Monitor OK");
+            break;
+        case MONITOR_NOK:
+            stateString = tr("Monitor wrong");
+            break;
+
+        default:
+            stateString = tr("UNKNOWN");
+            break;
+        }
+        componentTableWidget->setItem(idx, 1, new QTableWidgetItem(stateString));
+
+        // TODO: ADD component type and some detailed information (e.g. parameters)
+        //QString componentInfo = component->getDetails();
+        //componentTableWidget->setItem(idx, 2, new QTableWidgetItem(componentInfo));
+    }
+}
+
+void DbtPlyUserInterface::connectButtons()
+{
+    // FIXME: use Qt5 connect style
+    QObject::connect(playBut, SIGNAL(clicked()),
+        mEngine.get(), SLOT(playEvent()));
+    QObject::connect(pauseBut, SIGNAL(clicked()),
+        mEngine.get(), SLOT(pauseEvent()));
+    QObject::connect(stopBut, SIGNAL(clicked()),
+        mEngine.get(), SLOT(stopEvent()));
+    QObject::connect(speedUpBut, SIGNAL(clicked()),
+        mEngine.get(), SLOT(speedUpEvent()));
+    QObject::connect(speedDownBut, SIGNAL(clicked()),
+        mEngine.get(), SLOT(speedDownEvent()));
+}
+
+void DbtPlyUserInterface::connectDisplay()
+{
+    QObject::connect(mEngine.get(), SIGNAL(displayStateSig(DbtPlyEngineState *, float)),
+        this, SLOT(displayStateSlot(DbtPlyEngineState *, float)));
+    QObject::connect(mEngine.get(), SIGNAL(timeMinMax(road_time_t, road_time_t)),
+        this, SLOT(displayMinMaxTime(road_time_t , road_time_t)));
+    QObject::connect(mEngine.get(), SIGNAL(curReplayTime(road_time_t)),
+        this, SLOT(displayTime(road_time_t)));
+    QObject::connect(rev, SIGNAL(toggled(bool)),
+        mEngine.get(), SLOT(changeDirection(bool)));
+}
+
+void DbtPlyUserInterface::connectSlider()
+{
+    QObject::connect(timeSlider, SIGNAL(sliderPressed()),
+        mEngine.get(), SLOT(pauseEvent()));
+    QObject::connect(timeSlider, SIGNAL(sliderReleased()),
+        mEngine.get(), SLOT(playEvent()));
+}
+
+} // namespace pacpus
Index: tags/0.2.3/src/FileLib/CMakeLists.txt
===================================================================
--- tags/0.2.3/src/FileLib/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/src/FileLib/CMakeLists.txt	(revision 368)
@@ -0,0 +1,71 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+project(FileLib)
+
+if(${PACPUS_BUILD_TESTS})
+    add_subdirectory(test)
+endif()
+
+################################################################################
+create_export(EXPORT_HDR ${PROJECT_NAME} "${PACPUS_INCLUDE_DIR}/Pacpus/kernel")
+
+################################################################################
+# DIRECTORIES
+link_directories(
+    ${PROJECT_BINARY_DIR}/../PacpusLib
+)
+
+################################################################################
+# FILES
+set(SRCS
+    src/DbiteException.cpp
+    src/DbiteFile.cpp
+)
+
+set(HDRS
+    ${EXPORT_HDR}
+
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/DbiteException.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/DbiteFile.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/DbiteFileTypes.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/FileLibConfig.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/hdfile_header_t.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/road_time.h
+)
+
+################################################################################
+# BUILD and LINK
+pacpus_add_library(${PROJECT_NAME} SHARED
+    ${SRCS}
+    ${HDRS}
+)
+
+# LIBS
+set(LIBS
+    ${PACPUS_DEPENDENCIES_LIB}
+)
+
+if(WIN32)
+    list(APPEND LIBS
+        optimized PacpusLib debug PacpusLib_d
+    )
+endif()
+
+# LINK
+target_link_libraries(${PROJECT_NAME}
+    ${LIBS}
+)
+
+################################################################################
+# INSTALL
+pacpus_install(${PROJECT_NAME})
+
+################################################################################
+# FOLDER
+pacpus_folder(${PROJECT_NAME} "libraries")
Index: tags/0.2.3/src/FileLib/src/DbiteException.cpp
===================================================================
--- tags/0.2.3/src/FileLib/src/DbiteException.cpp	(revision 368)
+++ tags/0.2.3/src/FileLib/src/DbiteException.cpp	(revision 368)
@@ -0,0 +1,24 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @version    $Id: DbiteException.cpp 116 2013-06-25 11:44:25Z kurdejma $
+
+#include <Pacpus/kernel/DbiteException.h>
+
+using namespace pacpus;
+
+DbiteException::DbiteException(char const* what)
+    : PacpusException(what)
+{
+}
+
+DbiteException::DbiteException(std::string const& what)
+    : PacpusException(what)
+{
+}
+
+DbiteException::~DbiteException() throw()
+{
+}
Index: tags/0.2.3/src/FileLib/src/DbiteFile.cpp
===================================================================
--- tags/0.2.3/src/FileLib/src/DbiteFile.cpp	(revision 368)
+++ tags/0.2.3/src/FileLib/src/DbiteFile.cpp	(revision 368)
@@ -0,0 +1,865 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version $Id: DbiteFile.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include <Pacpus/kernel/DbiteFile.h>
+#include <Pacpus/kernel/DbiteException.h>
+#include <Pacpus/kernel/DbiteFileTypes.h>
+#include <Pacpus/kernel/Log.h>
+
+#include <boost/exception/detail/exception_ptr.hpp>
+#include <boost/exception/errinfo_api_function.hpp>
+#include <boost/exception/errinfo_file_name.hpp>
+#include <boost/exception/errinfo_nested_exception.hpp>
+#include <cassert>
+#include <cmath>
+#include <iostream>
+#include <limits>
+#include <sstream>
+
+using boost::copy_exception;
+using boost::errinfo_api_function;
+using boost::errinfo_file_name;
+using boost::errinfo_nested_exception;
+using boost::exception_ptr;
+using namespace pacpus;
+using std::fstream;
+using std::ios_base;
+using std::min;
+using std::max;
+using std::numeric_limits;
+using std::streamsize;
+using std::string;
+using std::stringstream;
+
+// FIXME: record size is only 8-bit long!
+typedef int8_t VariableDataSizeT;
+
+DECLARE_STATIC_LOGGER("pacpus.core.DbiteFile")
+
+namespace pacpus
+{
+    VariableDataSizeTag VariableDataSize;
+    ReadModeTag ReadMode;
+    WriteModeTag WriteMode;
+    DiagnoseModeTag DiagnoseMode;
+}
+
+std::ostream& operator<<(std::ostream& os, ReadModeTag const&)
+{
+    os << "ReadMode";
+    return os;
+}
+
+std::ostream& operator<<(std::ostream& os, WriteModeTag const&)
+{
+    os << "WriteMode";
+    return os;
+}
+
+std::ostream& operator<<(std::ostream& os, DiagnoseModeTag const&)
+{
+    os << "DiagnoseMode";
+    return os;
+}
+
+bool doesFileExist(string const& path);
+
+DbiteFile::DbiteFile()
+    : mIsWriting(false)
+{
+    setPath("");
+
+    (void) ReadMode; // unused
+    (void) WriteMode; // unused
+    (void) VariableDataSize; // unused
+    (void) DiagnoseMode; // unused
+}
+
+DbiteFile::~DbiteFile()
+{
+    if (isOpen()) {
+        close();
+    }
+}
+
+DbiteFile::operator string()
+{
+    static const int64_t kMicrosInSecond = 1000 * 1000;
+    stringstream os;
+
+    os << "Signature    : " << getSignature() << "\n";
+    os << "Version      : " << getVersion() << "\n";
+    os << "Header size  : " << getDataOffset() << " [bytes]" << "\n";
+    os << "Record size  : " << getRecordSize() << " [bytes]" << "\n";
+    os << "Data type    : " << getType() << "\n";
+    os << "Time min.    : " << getTimeMin() << "\n";
+    os << "Time max.    : " << getTimeMax() << "\n";
+    os << "Duration     : " << (getTimeMax() - getTimeMin()) / kMicrosInSecond << " [seconds]" << "\n";
+    os << "File size    : " << getFileSize() << " [bytes]" << "\n";
+    os << "Record count : " << getRecordCount() << "\n";
+
+    return os.str();
+}
+
+const string & DbiteFile::getPath() const
+{
+    return mPath;
+}
+
+void DbiteFile::setPath(const string & path)
+{
+    mPath = path;
+}
+
+void DbiteFile::open(const string & path, ReadModeTag)
+{
+    mIsWriting = false;
+    if (isOpen()) {
+        LOG_DEBUG("file is already open, closing...");
+        close();
+    }
+
+    setPath(path);
+
+    ios_base::openmode openmode = ios_base::binary | ios_base::in;
+    mFile.open(getPath().c_str(), openmode);
+    try {
+        checkFileOpen();
+    } catch (DbiteException & e) {
+        (void) e; // unused
+        LOG_ERROR("Dbite exception: " << e.what());
+        close();
+        BOOST_THROW_EXCEPTION(e
+            //<< "cannot open file for reading"
+            << errinfo_file_name(getPath())
+            << errinfo_ios_base_open_mode(openmode)
+        );
+    }
+
+    try {
+        readHeader();
+    } catch (DbiteException& e) {
+        (void) e; // unused
+        LOG_ERROR("Dbite exception: " << e.what());
+        // TODO: readAndDiagnoseHeader();
+        close();
+        BOOST_THROW_EXCEPTION(DbiteException("cannot read header")
+            << errinfo_api_function("open")
+            << errinfo_ios_base_open_mode(openmode)
+            << errinfo_nested_exception(copy_exception(e))
+        );
+    }
+    verifyHeader();
+    goToDataBegin();
+}
+
+void DbiteFile::open(const string & path, WriteModeTag)
+{
+    openWriteMode(path);
+}
+
+void DbiteFile::open(const string & path, WriteModeTag, hdfile_header_t::DataTypeT type, hdfile_header_t::DataSizeT dataSize)
+{
+    openWriteMode(path, type);
+    setRecordSize(dataSize);
+}
+
+void DbiteFile::open(const string & path, WriteModeTag, hdfile_header_t::DataTypeT type, VariableDataSizeTag tag)
+{
+    openWriteMode(path, type);
+    setRecordSize(tag);
+}
+
+void DbiteFile::openWriteMode(const string & path, hdfile_header_t::DataTypeT type)
+{
+    openWriteMode(path);
+    setType(type);
+}
+
+void DbiteFile::openWriteMode(const string & path)
+{
+    mIsWriting = true;
+    if (isOpen()) {
+        LOG_DEBUG("file is already open, closing...");
+        close();
+    }
+
+    setPath(path);
+    bool fileExists = doesFileExist(path);
+    ios_base::openmode openmode;
+    if (fileExists) {
+        openmode = ios_base::binary | ios_base::in | ios_base::out;
+    } else {
+        openmode = ios_base::binary | ios_base::out;
+    }
+    mFile.open(getPath().c_str(), openmode);
+    if (!isOpen()) {
+        LOG_ERROR("cannot open file for writing");
+        BOOST_THROW_EXCEPTION(DbiteException("cannot open file for writing")
+            << errinfo_ios_base_open_mode(openmode)
+        );
+    }
+
+    if (fileExists) {
+        // file exists
+        LOG_DEBUG("file already exists, appending");
+        try {
+            readHeader();
+            // TODO: check if same type and record size
+        } catch (DbiteException & e) {
+            (void) e; // unused
+            LOG_ERROR("Dbite exception: " << e.what());
+            // TODO: readAndDiagnoseHeader();
+            close();
+            //BOOST_THROW_EXCEPTION(DbiteException("cannot read header"));
+            throw;
+        }
+    } else {
+        // file does not exist
+        initializeHeader();
+        writeHeader();
+    }
+    //goToDataBegin();
+    goToFileEnd();
+}
+
+void DbiteFile::initializeHeader()
+{
+    setSignature();
+    setType(FILE_DBT_UNKNOWN);
+    setVersion(VERSION_NUMBER);
+    setDataOffset(sizeof(hdfile_header_t));
+    setRecordSize(0);
+    // same as header size
+    setFileSize(getDataOffset());
+    setTimeMin(numeric_limits<road_time_t>::max());
+    setTimeMax(numeric_limits<road_time_t>::min());
+    setRecordCount(0);
+}
+
+void DbiteFile::close()
+{
+    if (!isOpen()) {
+        LOG_WARN("file is not open");
+        return;
+    }
+    closeDbite();
+    setPath("");
+}
+
+void DbiteFile::closeDbite()
+{
+    if (mIsWriting) {
+        try {
+            writeHeader();
+        } catch (DbiteException & e) {
+            (void) e; // unused
+            LOG_ERROR("cannot write header on close: " << e.what());
+        }
+    }
+    mFile.close();
+}
+
+bool DbiteFile::isOpen() const
+{
+    return mFile.is_open();
+}
+
+void DbiteFile::goToFileBegin()
+{
+    LOG_DEBUG("goToFileBegin()");
+    mFile.clear();
+    setReadPosition(0);
+    setWritePosition(0);
+}
+
+void DbiteFile::goToDataBegin()
+{
+    LOG_DEBUG("goToDataBegin()");
+    LOG_TRACE("getDataOffset() = " << getDataOffset());
+    mFile.clear();
+    setReadPosition(getDataOffset());
+    setWritePosition(getDataOffset());
+}
+
+void DbiteFile::goToFileEnd()
+{
+    LOG_TRACE("goToFileEnd()");
+    LOG_TRACE("getFileSize() = " << getFileSize());
+    mFile.clear();
+    // do not use fstream::seekg/seekp(0, ios_base::end),
+    // because in case of write failure,
+    // we should write at position=getFileSize() which can be before the actual file end
+    setReadPosition(getFileSize());
+    setWritePosition(getFileSize());
+}
+
+int64_t DbiteFile::getReadPosition()
+{
+    checkFileOpen();
+    return mFile.tellg();
+}
+
+int64_t DbiteFile::getWritePosition()
+{
+    checkFileOpen();
+    return mFile.tellp();
+}
+
+void DbiteFile::setReadPosition(int64_t offset, ios_base::seekdir direction)
+{
+    LOG_TRACE("set read position = " << offset << " direction = " << direction);
+    checkFileOpen();
+    mFile.seekg(offset, direction);
+    if (mFile.fail()) {
+        LOG_ERROR("failed to set write position");
+    }
+}
+
+void DbiteFile::setReadPosition(int64_t position)
+{
+    LOG_TRACE("set read position = " << position);
+    checkFileOpen();
+    mFile.seekg(position);
+    if (mFile.fail()) {
+        LOG_ERROR("failed to set read position");
+    }
+}
+
+void DbiteFile::setWritePosition(int64_t offset, ios_base::seekdir direction)
+{
+    LOG_TRACE("set write position = " << offset << " direction = " << direction);
+    checkFileOpen();
+    mFile.seekp(offset, direction);
+    if (mFile.fail()) {
+        LOG_ERROR("failed to set write position");
+    }
+}
+
+void DbiteFile::setWritePosition(int64_t position)
+{
+    LOG_TRACE("set write position = " << position);
+    checkFileOpen();
+    mFile.seekp(position);
+    if (mFile.fail()) {
+        LOG_ERROR("failed to set write position");
+    }
+}
+
+const hdfile_header_t & DbiteFile::getHeader() const
+{
+    return mHeader;
+}
+
+hdfile_header_t & DbiteFile::header()
+{
+    return mHeader;
+}
+
+void DbiteFile::readHeader()
+{
+    goToFileBegin();
+    checkFileOpen();
+    read((char *)(&mHeader), sizeof(mHeader));
+    // FIXME: header has good format
+    LOG_DEBUG("file: " << getPath());
+    LOG_TRACE("header read:\n" << string(*this));
+}
+
+void DbiteFile::verifyHeader()
+{
+    // verify file size
+    const int64_t realFileSize = getRealFileSize();
+    const hdfile_header_t::FileSizeT fileSize = getFileSize();
+    if (realFileSize != fileSize) {
+        LOG_WARN("real file size different than header information");
+        LOG_INFO("real file size = " << realFileSize);
+        LOG_INFO("file size = " << fileSize);
+    }
+
+    if (getVersion() != VERSION_NUMBER) {
+        LOG_ERROR("bad version number");
+        BOOST_THROW_EXCEPTION(DbiteException("bad version number"));
+    }
+
+    if (!isSignatureCorrect()) {
+        LOG_ERROR("bad signature");
+        BOOST_THROW_EXCEPTION(DbiteException("bad signature"));
+    }
+
+    LOG_DEBUG("header verified");
+}
+
+void DbiteFile::writeHeader()
+{
+    LOG_DEBUG("writing header:\n" << string(*this));
+
+    goToFileBegin();
+
+    LOG_DEBUG("begin position=" << getWritePosition());
+
+    const size_t bytesToWrite = sizeof(mHeader);
+    write((char *)(&mHeader), bytesToWrite);
+    LOG_DEBUG("header written");
+
+    LOG_DEBUG("final position=" << getWritePosition());
+}
+
+string DbiteFile::getSignature() const
+{
+    const char signature[] = { getHeader().Signature[0], getHeader().Signature[1], getHeader().Signature[2], getHeader().Signature[3], '\0' };
+    return signature;
+}
+
+bool DbiteFile::isSignatureCorrect() const
+{
+    if ('R' != getHeader().Signature[0]) {
+        return false;
+    }
+    if ('O' != getHeader().Signature[1]) {
+        return false;
+    }
+    if ('A' != getHeader().Signature[2]) {
+        return false;
+    }
+    if ('D' != getHeader().Signature[3]) {
+        return false;
+    }
+    return true;
+}
+
+void DbiteFile::setSignature()
+{
+    header().Signature[0] = 'R';
+    header().Signature[1] = 'O';
+    header().Signature[2] = 'A';
+    header().Signature[3] = 'D';
+}
+
+hdfile_header_t::DataTypeT DbiteFile::getType() const
+{
+    return getHeader().Type;
+}
+
+void DbiteFile::setType(hdfile_header_t::DataTypeT type)
+{
+    header().Type = type;
+}
+
+hdfile_header_t::VersionT DbiteFile::getVersion() const
+{
+    return getHeader().VersionNumber;
+}
+
+void DbiteFile::setVersion(hdfile_header_t::VersionT version)
+{
+    header().VersionNumber = version;
+}
+
+hdfile_header_t::DataOffsetT DbiteFile::getDataOffset() const
+{
+    return getHeader().DataOffset;
+}
+
+void DbiteFile::setDataOffset(hdfile_header_t::DataOffsetT dataOffset)
+{
+    header().DataOffset = dataOffset;
+}
+
+hdfile_header_t::DataSizeT DbiteFile::getRecordSize() const
+{
+    return getHeader().DataSize;
+}
+
+void DbiteFile::setRecordSize(hdfile_header_t::DataSizeT recordSize)
+{
+    header().DataSize = recordSize;
+}
+
+void DbiteFile::setRecordSize(VariableDataSizeTag)
+{
+    header().DataSize = hdfile_header_t::kVariableRecordSize;
+}
+
+hdfile_header_t::FileSizeT DbiteFile::getFileSize() const
+{
+    if (getHeader().FileSize < getHeader().DataOffset) {
+        LOG_WARN("wrong header information: file size lesser than data offset");
+    }
+    return getHeader().FileSize;
+}
+
+void DbiteFile::setFileSize(hdfile_header_t::FileSizeT fileSize)
+{
+    header().FileSize = fileSize;
+}
+
+int64_t DbiteFile::getRealFileSize()
+{
+    checkFileOpen();
+
+    mFile.clear();
+    // save position
+    int64_t oldReadPosition = getReadPosition();
+    int64_t oldWritePosition = getWritePosition();
+
+    // go to file end and get position = file size
+    goToFileEnd();
+    int64_t fileSize = mFile.tellg();
+
+    // restore position
+    setReadPosition(oldReadPosition);
+    setWritePosition(oldWritePosition);
+    return fileSize;
+}
+
+road_time_t DbiteFile::getTimeMin() const
+{
+    return getHeader().TimeMin;
+}
+
+void DbiteFile::setTimeMin(road_time_t time)
+{
+    header().TimeMin = time;
+}
+
+road_time_t DbiteFile::getTimeMax() const
+{
+    return getHeader().TimeMax;
+}
+
+void DbiteFile::setTimeMax(road_time_t time)
+{
+    header().TimeMax = time;
+}
+
+hdfile_header_t::RecordCountT DbiteFile::getRecordCount() const
+{
+    return getHeader().NbRecords;
+}
+
+void DbiteFile::setRecordCount(hdfile_header_t::RecordCountT recourdCount)
+{
+    header().NbRecords = recourdCount;
+}
+
+bool DbiteFile::isVariableDataSize() const
+{
+    return hdfile_header_t::kVariableRecordSize == getRecordSize();
+}
+
+bool DbiteFile::readRecord(size_t recordIndex, road_time_t & time, road_timerange_t & timeRange, char * data, size_t & dataSize)
+{
+    LOG_DEBUG("reading record no. " << recordIndex);
+
+    if (isVariableDataSize()) {
+        LOG_ERROR("cannot read nth record in a variable");
+        BOOST_THROW_EXCEPTION(DbiteException("cannot read nth record in a variable"));
+    }
+
+    int64_t nthRecordPosition = getDataOffset() + recordIndex * (getRecordSize() + sizeof(road_time_t) + sizeof(road_timerange_t));
+    LOG_DEBUG(recordIndex << "th record position = " << nthRecordPosition);
+    if (getFileSize() < nthRecordPosition) {
+        LOG_WARN("wanted to read past the file end");
+        //BOOST_THROW_EXCEPTION(DbiteException("wanted to read past the file end"));
+    }
+    mFile.clear();
+    setReadPosition(nthRecordPosition);
+
+    return readRecord(time, timeRange, data, dataSize);
+}
+
+bool DbiteFile::readRecord(road_time_t & time, road_timerange_t & timeRange, char * buffer, size_t & bufferSize, const ReadDirection & direction)
+{
+    if (!buffer) {
+        LOG_WARN("data buffer must be a non-NULL pointer");
+        BOOST_THROW_EXCEPTION(DbiteException("data buffer must be a non-NULL pointer"));
+    }
+
+    return readRecordNoBufferCheck(time, timeRange, buffer, bufferSize, direction);
+}
+
+bool DbiteFile::readRecord(road_time_t & time, road_timerange_t & timeRange, char * buffer, const ReadDirection & direction)
+{
+    size_t bufferSize = getRecordSize();
+    return readRecord(time, timeRange, buffer, bufferSize, direction);
+}
+
+bool DbiteFile::readRecord(road_time_t & time, road_timerange_t & timeRange, const ReadDirection & direction)
+{
+    size_t bufferSize = 0;
+    return readRecordNoBufferCheck(time, timeRange, (char *) NULL, bufferSize, direction);
+}
+
+bool DbiteFile::readRecordNoBufferCheck(road_time_t & time, road_timerange_t & timeRange, char * buffer, size_t & bufferSize, const ReadDirection & direction)
+{
+    switch (direction) {
+    case ReadForward:
+        return readRecordForward(time, timeRange, buffer, bufferSize);
+        break;
+
+    case ReadBackward:
+        return readRecordBackward(time, timeRange, buffer, bufferSize);
+        break;
+
+    default:
+        assert(false && "wrong ReadDirection parameter");
+        return false;
+    }
+}
+
+bool DbiteFile::readRecordForward(road_time_t & time, road_timerange_t & timeRange, char * buffer, size_t & bufferSize)
+{
+    //LOG_TRACE("reading record...");
+    checkFileOpen();
+
+    int64_t initialPosition = getReadPosition();
+    //LOG_TRACE("initial position    = " << initialPosition);
+
+    ////////////////////////////////////////
+    // read acquisition time
+    mFile.read((char *)(&time), sizeof(time));
+    if (!mFile) {
+        if (isEndOfFile()) {
+            bufferSize = 0;
+            return false;
+        }
+        LOG_ERROR("cannot read acquisition time");
+        BOOST_THROW_EXCEPTION(DbiteException("cannot read acquisition time")
+            << errinfo_file_name(mPath)
+            << errinfo_api_function("read")
+        );
+    }
+
+    ////////////////////////////////////////
+    // read acquisition time range
+    read((char *)(&timeRange), sizeof(timeRange));
+
+    ////////////////////////////////////////
+    // get data and record size
+    size_t dataSize = 0;
+    size_t recordSize = sizeof(time) + sizeof(timeRange);
+    if (isVariableDataSize()) {
+        recordSize += 2 * sizeof(VariableDataSizeT);
+
+        // read record size
+        VariableDataSizeT readVarDataSize = 0;
+        read((char *)(&readVarDataSize), sizeof(VariableDataSizeT));
+        dataSize = static_cast<size_t>(readVarDataSize);
+        LOG_DEBUG("variable record size = " << dataSize);
+    } else {
+        dataSize = getRecordSize();
+    }
+    recordSize += dataSize;
+
+    ////////////////////////////////////////
+    // read/skip data
+    if (buffer) {
+        if (bufferSize < dataSize) {
+            LOG_WARN("buffer is smaller than the record size");
+            LOG_INFO("buffer size = " << bufferSize);
+            LOG_INFO("data   size = " << dataSize);
+            BOOST_THROW_EXCEPTION(DbiteException("buffer is smaller than the data size"));
+            // TODO: don't throw exception, but read only as much data as possible
+        }
+
+        // read data
+        read(buffer, dataSize);
+
+        if (isVariableDataSize()) {
+            // read record size
+            VariableDataSizeT readVarDataSize = 0;
+            read((char *)(&readVarDataSize), sizeof(VariableDataSizeT));
+            size_t varDataSize = static_cast<size_t>(readVarDataSize);
+            LOG_TRACE("variable record size = " << varDataSize);
+
+            if (dataSize != varDataSize) {
+                LOG_WARN("corrupted data: data sizes differ");
+                LOG_INFO("data size (before) = " << dataSize);
+                LOG_INFO("data size (after)  = " << varDataSize);
+            }
+        }
+    } else {
+        // skip data
+        setReadPosition(dataSize, ios_base::cur);
+        if (isVariableDataSize()) {
+            setReadPosition(dataSize, ios_base::cur);
+        }
+    }
+
+    ////////////////////////////////////////
+    // check how many bytes were read/skipped
+    int64_t positionDifference = getReadPosition() - initialPosition;
+    if (positionDifference != recordSize) {
+        LOG_WARN("should be read   : " << recordSize << " [bytes]");
+        LOG_WARN("was actually read: " << positionDifference << " [bytes]");
+    }
+    return true;
+}
+
+bool DbiteFile::readRecordBackward(road_time_t & time, road_timerange_t & timeRange, char * buffer, size_t & bufferSize)
+{
+    int64_t initialPosition = getReadPosition();
+    LOG_TRACE("initial position    = " << initialPosition);
+
+    size_t dataSize = 0;
+    size_t recordSize = sizeof(time) + sizeof(timeRange);
+    if (isVariableDataSize()) {
+        recordSize += 2 * sizeof(VariableDataSizeT);
+
+        // go back sizeof(VariableDataSizeT)
+        setReadPosition(initialPosition - sizeof(VariableDataSizeT));
+
+        // read VariableDataSizeT
+        VariableDataSizeT readVarDataSize = 0;
+        read((char *)(&readVarDataSize), sizeof(VariableDataSizeT));
+        dataSize = static_cast<size_t>(readVarDataSize);
+        LOG_DEBUG("variable record size = " << dataSize);
+    } else {
+        dataSize = getRecordSize();
+    }
+    // recordSize = sizeof(time) + sizeof(timeRange) + dataSize + [2 * sizeof(VariableDataSizeT)]
+    recordSize += dataSize;
+
+    // go back to the beginning of the previous record
+    setReadPosition(initialPosition - recordSize);
+
+    bool readResult = false;
+    try {
+        // read forward
+        readResult = readRecordForward(time, timeRange, buffer, bufferSize);
+    } catch (DbiteException& /*e*/) {
+        setReadPosition(initialPosition);
+        throw;
+    }
+
+    // go back to the beginning of the previous record
+    setReadPosition(initialPosition - recordSize);
+    return readResult;
+}
+
+bool DbiteFile::writeRecord(const road_time_t & time, const road_timerange_t & timeRange, const char * data, const size_t dataSize)
+{
+    LOG_DEBUG("writing record:" << "\t"
+              << "time=" << time << "\t"
+              << "time range=" << timeRange << "\t"
+              << "data size=" << dataSize);
+    checkFileOpen();
+
+    if (isVariableDataSize()) {
+        if (dataSize > static_cast<size_t>(numeric_limits<VariableDataSizeT>::max())) {
+            LOG_ERROR("variable data size too big");
+            BOOST_THROW_EXCEPTION(DbiteException("variable data size too big")
+                << errinfo_file_name(mPath)
+            );
+        }
+    }
+
+    int64_t initialPosition = getWritePosition();
+    LOG_TRACE("getFileSize() = " << getFileSize());
+    LOG_TRACE("getWritePosition() = " << getWritePosition());
+    assert(initialPosition == getFileSize());
+
+    size_t writtenBytes = 0;
+    try {
+        // write acquisition time, acquisition time range, data
+        // if variable size, then write record size before and after data
+
+        write((const char *)(&time), sizeof(time));
+        writtenBytes += sizeof(time);
+
+        write((const char *)(&timeRange), sizeof(timeRange));
+        writtenBytes += sizeof(timeRange);
+
+        if (isVariableDataSize()) {
+            write((const char *)(&dataSize), sizeof(VariableDataSizeT));
+            writtenBytes += sizeof(VariableDataSizeT);
+        }
+        write((const char *)(data), dataSize);
+        writtenBytes += dataSize;
+
+        if (isVariableDataSize()) {
+            write((const char *)(&dataSize), sizeof(VariableDataSizeT));
+            writtenBytes += sizeof(VariableDataSizeT);
+        }
+    } catch (DbiteException& e) {
+        LOG_ERROR("Dbite exception: " << e.what());
+        LOG_INFO("restoring initial write position");
+        
+        // on error, go back to record start
+        setWritePosition(- (int64_t) writtenBytes, ios_base::cur);
+        throw;
+    }
+ 
+    // check how many bytes were written
+    int64_t finalPosition = getWritePosition();
+    int64_t positionDifference = finalPosition - initialPosition;
+    LOG_TRACE("position difference = " << positionDifference);
+    size_t totalRecordSize = dataSize + sizeof(time) + sizeof(timeRange);
+
+    setFileSize(finalPosition);     // FIXME: possible loss of data, conversion int64_t -> FileSizeT
+    setRecordCount(getRecordCount() + 1);
+    setTimeMin(min(getTimeMin(), time));
+    setTimeMax(max(getTimeMax(), time));
+
+    if (positionDifference != totalRecordSize) {
+        LOG_WARN("should be written   : " << totalRecordSize << " [bytes]");
+        LOG_WARN("was actually written: " << positionDifference << " [bytes]");
+    }
+    return true;
+}
+
+void DbiteFile::read(fstream::char_type * s, streamsize n)
+{
+    mFile.read(s, n);
+    if (!mFile) {
+        LOG_ERROR("cannot read data");
+        BOOST_THROW_EXCEPTION(DbiteException("cannot read data")
+            << errinfo_file_name(mPath)
+            << errinfo_api_function("read")
+        );
+    }
+}
+
+void DbiteFile::write(const fstream::char_type * s, streamsize n)
+{
+    mFile.write(s, n);
+    if (!mFile) {
+        LOG_ERROR("cannot write data");
+        BOOST_THROW_EXCEPTION(DbiteException("cannot write data")
+            << errinfo_file_name(mPath)
+            << errinfo_api_function("write")
+        );
+    }
+}
+
+bool DbiteFile::isEndOfFile()
+{
+    return mFile.eof();
+}
+
+void DbiteFile::checkFileOpen()
+{
+    if (!isOpen()) {
+        string errorMessage = "file is not open";
+        LOG_WARN(errorMessage);
+        BOOST_THROW_EXCEPTION(DbiteException(errorMessage)
+            << errinfo_file_name(mPath)
+            << errinfo_api_function("open")
+        );
+    }
+}
+
+bool doesFileExist(const string & path)
+{
+    bool fileExist = false;
+    fstream f(path.c_str(), ios_base::in);
+    if (f.good()) {
+        fileExist = true;
+    }
+    f.close();
+    return fileExist;
+}
Index: tags/0.2.3/src/FileLib/test/CMakeLists.txt
===================================================================
--- tags/0.2.3/src/FileLib/test/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/src/FileLib/test/CMakeLists.txt	(revision 368)
@@ -0,0 +1,65 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+project(TestFileLib)
+
+################################################################################
+# necessary because TestFileLib is a subdirectory of FileLib and all definitions
+# are inherited, including those from create_export(...)
+undef_export(FileLib)
+
+################################################################################
+# DIRECTORIES
+link_directories(
+    ${PROJECT_BINARY_DIR}/../../FileLib
+    ${PROJECT_BINARY_DIR}/../../PacpusLib
+)
+
+################################################################################
+# FILES
+set(SRCS
+    TestFileLib.cpp
+)
+
+set(HDRS
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/DbiteFile.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/FileLibConfig.h
+)
+
+################################################################################
+# BUILD and LINK
+pacpus_add_test_executable(${PROJECT_NAME}
+    ${SRCS}
+    ${HDRS}
+)
+
+# LIBS
+set(LIBS
+    ${PACPUS_DEPENDENCIES_LIB}
+)
+
+list(APPEND LIBS
+    optimized FileLib debug FileLib_d
+    optimized PacpusLib debug PacpusLib_d
+)
+
+# LINK
+target_link_libraries(${PROJECT_NAME}
+    ${LIBS}
+)
+
+################################################################################
+# INSTALL
+pacpus_install(${PROJECT_NAME})
+install(DIRECTORY data
+    DESTINATION ${PACPUS_INSTALL_DIR}/bin
+)
+
+################################################################################
+# FOLDER
+pacpus_folder(${PROJECT_NAME} "tests")
Index: tags/0.2.3/src/FileLib/test/TestFileLib.cpp
===================================================================
--- tags/0.2.3/src/FileLib/test/TestFileLib.cpp	(revision 368)
+++ tags/0.2.3/src/FileLib/test/TestFileLib.cpp	(revision 368)
@@ -0,0 +1,381 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version    $Id: TestFileLib.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#ifdef _MSC_VER
+#   pragma warning(push)
+#   pragma warning(disable:4265 4365 4571 4640)
+#endif // _MSC_VER
+
+#define BOOST_TEST_MODULE TestFileLib
+#include <boost/test/unit_test.hpp>
+
+#ifdef _MSC_VER
+#   pragma warning(pop)
+#endif // _MSC_VER
+
+#include <Pacpus/kernel/DbiteException.h>
+#include <Pacpus/kernel/DbiteFile.h>
+#include <Pacpus/kernel/Log.h>
+
+#include <boost/exception/diagnostic_information.hpp>
+#include <boost/exception/errinfo_api_function.hpp>
+#include <boost/exception/get_error_info.hpp>
+#include <boost/noncopyable.hpp>
+#include <cstdio>
+
+DECLARE_STATIC_LOGGER("pacpus.framework.test.FileLib")
+
+using namespace boost;
+using namespace pacpus;
+using namespace std;
+
+struct HasExceptionMessage
+    : noncopyable
+{
+    HasExceptionMessage(const string expectedMessage)
+        : mExpectedMessage(expectedMessage)
+    {
+    }
+
+    bool operator()(const DbiteException & ex)
+    {
+        LOG_INFO("diagnostic_information: " << diagnostic_information(ex));
+        BOOST_TEST_CHECKPOINT("what() =" << ex.what());
+        return std::string(mExpectedMessage) == std::string(ex.what());
+    }
+
+private:
+    const string mExpectedMessage;
+};
+
+template <
+    typename ErrorInfo,
+    typename E = typename ErrorInfo::value_type
+>
+struct HasErrorInfo
+    : noncopyable
+{
+    HasErrorInfo(E const& expectedValue)
+        : mExpectedValue(expectedValue)
+    {
+    }
+
+    bool operator()(DbiteException const& ex)
+    {
+        LOG_INFO("diagnostic_information: " << diagnostic_information(ex));
+        E const* value = get_error_info<ErrorInfo>(ex);
+        if (!value) {
+            return false;
+        }
+        return mExpectedValue == *value;
+    }
+
+private:
+    E const mExpectedValue;
+};
+
+template <typename ErrorInfo>
+struct HasErrorInfo<ErrorInfo, char const*>
+    : noncopyable
+{
+private:
+    typedef char const* E;
+public:
+    HasErrorInfo(E const& expectedValue)
+        : mExpectedValue(expectedValue)
+    {
+    }
+
+    bool operator()(DbiteException const& ex)
+    {
+        LOG_INFO("diagnostic_information: " << diagnostic_information(ex));
+        E const* value = get_error_info<ErrorInfo>(ex);
+        if (!value) {
+            return false;
+        }
+        return std::string(mExpectedValue) == std::string(*value);
+    }
+
+private:
+    E const mExpectedValue;
+};
+
+BOOST_AUTO_TEST_SUITE(suiteBasic)
+
+BOOST_AUTO_TEST_CASE(isNotOpenAfterConstruction)
+{
+    DbiteFile df;
+    BOOST_CHECK(!df.isOpen());
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+BOOST_AUTO_TEST_SUITE(suiteRead)
+
+BOOST_AUTO_TEST_CASE(opensFileWithoutData)
+{
+    DbiteFile df;
+    df.open("data/ok-empty-data.dbt", ReadMode);
+    
+    BOOST_CHECK_EQUAL(df.getDataOffset(), 48);
+    BOOST_CHECK_EQUAL(df.getPath(), "data/ok-empty-data.dbt");
+    BOOST_CHECK_EQUAL(df.getFileSize(), 48);
+    BOOST_CHECK_EQUAL(df.getFileSize(), df.getRealFileSize());
+    BOOST_CHECK_EQUAL(df.getRecordCount(), 0);
+    BOOST_CHECK_EQUAL(df.getRecordSize(), 32);
+    BOOST_CHECK_EQUAL(df.getSignature(), "ROAD");
+    BOOST_CHECK(df.getTimeMin() <= df.getTimeMax());
+    BOOST_CHECK_EQUAL(df.getType(), 12210);
+    BOOST_CHECK_EQUAL(df.getVersion(), 2);
+}
+
+BOOST_AUTO_TEST_CASE(readsFileSingleData)
+{
+    DbiteFile df;
+    df.open("data/ok-single-data.dbt", ReadMode);
+
+    BOOST_CHECK_EQUAL(df.getDataOffset(), 44);
+    BOOST_CHECK_EQUAL(df.getPath(), "data/ok-single-data.dbt");
+    BOOST_CHECK_EQUAL(df.getFileSize(), 64);
+    BOOST_CHECK_EQUAL(df.getFileSize(), df.getRealFileSize());
+    BOOST_CHECK_EQUAL(df.getRecordCount(), 1);
+    BOOST_CHECK_EQUAL(df.getRecordSize(), 8);
+    BOOST_CHECK_EQUAL(df.getSignature(), "ROAD");
+    BOOST_CHECK_EQUAL(df.getTimeMin(), df.getTimeMax());
+    BOOST_CHECK_EQUAL(df.getTimeMin(), static_cast<road_time_t>(1311847165023717));
+    BOOST_CHECK_EQUAL(df.getTimeMax(), static_cast<road_time_t>(1311847165023717));
+    BOOST_CHECK_EQUAL(df.getType(), 100);
+    BOOST_CHECK_EQUAL(df.getVersion(), 2);
+
+    road_time_t t;
+    road_timerange_t tr;
+    char data[8];
+
+    df.readRecord(t, tr, data);
+    BOOST_CHECK_EQUAL(t, static_cast<road_time_t>(1311847165023717));
+    BOOST_CHECK_EQUAL(tr, 0);
+
+    int64_t value = *((uint64_t *)data);
+    BOOST_CHECK_EQUAL(value, (int64_t) (static_cast<uint64_t>(15) << 32) + 0);
+}
+
+BOOST_AUTO_TEST_CASE(readsFileManyData)
+{
+    DbiteFile df;
+    df.open("data/ok-many-data.dbt", ReadMode);
+
+    BOOST_CHECK_EQUAL(df.getDataOffset(), 44);
+    BOOST_CHECK_EQUAL(df.getPath(), "data/ok-many-data.dbt");
+    BOOST_CHECK_EQUAL(df.getFileSize(), 344);
+    BOOST_CHECK_EQUAL(df.getFileSize(), df.getRealFileSize());
+    BOOST_CHECK_EQUAL(df.getRecordCount(), 15);
+    BOOST_CHECK_EQUAL(df.getRecordSize(), 8);
+    BOOST_CHECK_EQUAL(df.getSignature(), "ROAD");
+    BOOST_CHECK(df.getTimeMin() < df.getTimeMax());
+    BOOST_CHECK_EQUAL(df.getTimeMin(), static_cast<road_time_t>(1311847165023717));
+    BOOST_CHECK_EQUAL(df.getTimeMax(), static_cast<road_time_t>(1311847166112739));
+    BOOST_CHECK_EQUAL(df.getType(), 100);
+    BOOST_CHECK_EQUAL(df.getVersion(), 2);
+
+    for (uint64_t ir = 0; ir < df.getRecordCount(); ++ir) {
+        road_time_t t;
+        road_timerange_t tr;
+        char data[8];
+
+        df.readRecord(t, tr, data);
+        BOOST_CHECK(df.getTimeMin() <= t);
+        BOOST_CHECK(t <= df.getTimeMax());
+        BOOST_CHECK_EQUAL(tr, 0);
+
+        int64_t value = *((uint64_t *)data);
+        BOOST_CHECK_EQUAL(value, (int64_t) (ir << 32) + 0x01A0);
+    }
+}
+
+BOOST_AUTO_TEST_CASE(throwsDbiteExceptionOnEmptyFile)
+{
+    DbiteFile df;
+    BOOST_CHECK_THROW(
+        (df.open("data/bad-empty-file.dbt", ReadMode))
+        , DbiteException
+    );
+    BOOST_CHECK_EXCEPTION(
+        (df.open("data/bad-empty-file.dbt", ReadMode))
+        , DbiteException
+        //, HasExceptionMessage("cannot read data") // FIXME: cannot read header
+        , HasErrorInfo<errinfo_api_function>("open")
+    );
+}
+
+BOOST_AUTO_TEST_CASE(throwsDbiteExceptionOnIncompleteHeader)
+{
+    DbiteFile df;
+    BOOST_CHECK_THROW(
+        (df.open("data/bad-incomplete-header.dbt", ReadMode))
+        , DbiteException
+    );
+    BOOST_CHECK_EXCEPTION(
+        (df.open("data/bad-incomplete-header.dbt", ReadMode))
+        , DbiteException
+        //, HasExceptionMessage("cannot read data") // FIXME: cannot read header
+        , HasErrorInfo<errinfo_api_function>("open")
+    );
+}
+
+BOOST_AUTO_TEST_CASE(throwsDbiteExceptionOnBadSignature)
+{
+    DbiteFile df;
+    BOOST_CHECK_THROW(
+        (df.open("data/bad-signature.dbt", ReadMode))
+        , DbiteException
+    );
+    //BOOST_CHECK_EXCEPTION(
+    //    (df.open("data/bad-signature.dbt", ReadMode))
+    //    , DbiteException
+    //    , HasExceptionMessage("bad signature")
+    //);
+}
+
+BOOST_AUTO_TEST_CASE(throwsDbiteExceptionOnWrongVersion)
+{
+    DbiteFile df;
+    BOOST_CHECK_THROW(
+        (df.open("data/bad-wrong-version.dbt", ReadMode))
+        , DbiteException
+    );
+    //BOOST_CHECK_EXCEPTION(
+    //    (df.open("data/bad-wrong-version.dbt", ReadMode))
+    //    , DbiteException
+    //    , HasExceptionMessage("bad version number")
+    //);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+BOOST_AUTO_TEST_SUITE(suiteWrite)
+
+BOOST_AUTO_TEST_CASE(throwsDbiteExceptionWhenFileDoesntExist)
+{
+    DbiteFile df;
+    const char * kInexistingFilename = "";
+    
+    BOOST_CHECK_THROW(
+        (df.open(kInexistingFilename, ReadMode))
+        , DbiteException
+    );
+    //BOOST_CHECK_EXCEPTION(
+    //    (df.open(kInexistingFilename, ReadMode))
+    //    , DbiteException
+    //    , HasExceptionMessage("cannot open file for reading")
+    //);
+}
+
+BOOST_AUTO_TEST_CASE(throwsDbiteExceptionWhenCannotCreateTheFile)
+{
+    DbiteFile df;
+    const char * kIllegalFilename = "";
+
+    BOOST_CHECK_THROW(
+        (df.open(kIllegalFilename, WriteMode))
+        , DbiteException
+    );
+    //BOOST_CHECK_EXCEPTION(
+    //    (df.open(kIllegalFilename, WriteMode))
+    //    , DbiteException
+    //    , HasExceptionMessage("cannot open file for writing")
+    //);
+}
+
+// TODO: creates file for writing when it doesn't exist
+// TODO: creates file for writing when it exists ??? warning?
+
+BOOST_AUTO_TEST_SUITE_END()
+
+BOOST_AUTO_TEST_SUITE(suiteWrite)
+    
+BOOST_AUTO_TEST_CASE(writesNormallyWhenTheFileDoesntExist)
+{
+    DbiteFile df;
+    const char * filename = "data/unexisting-file.dbt";
+
+    // delete file
+    ::remove(filename);
+
+    // create
+    df.open(filename, WriteMode, 0x4321, 0x1234);
+    BOOST_REQUIRE(df.isOpen());
+    df.close();
+    
+    df.open(filename, ReadMode);
+    BOOST_REQUIRE(df.isOpen());
+    BOOST_CHECK_EQUAL(df.getPath(), filename);
+    BOOST_CHECK_EQUAL(df.getFileSize(), df.getRealFileSize());
+    BOOST_CHECK_EQUAL(df.getRecordCount(), 0);
+    BOOST_CHECK_EQUAL(df.getRecordSize(), 0x1234);
+    BOOST_CHECK_EQUAL(df.getSignature(), "ROAD");
+    BOOST_CHECK_EQUAL(df.getType(), 0x4321);
+    BOOST_CHECK_EQUAL(df.getVersion(), 2);
+    df.close();
+}
+
+BOOST_AUTO_TEST_CASE(appendsAtEndWhenFileExists)
+{
+    DbiteFile df;
+    const hdfile_header_t::DataSizeT dataSize = 0x1234;
+    const hdfile_header_t::DataTypeT dataType = 0x4321;
+    const char * filename = "data/existing-file-no-data.dbt";
+    
+    road_time_t time = 0xAABBCCDD;
+    road_timerange_t tr = 0xABCD;
+    char data[dataSize];
+
+    // delete file
+    ::remove(filename);
+
+    // create
+    df.open(filename, WriteMode, dataType, 0x1234);
+    BOOST_REQUIRE(df.isOpen());
+    df.close();
+    BOOST_REQUIRE(!df.isOpen());
+
+    // append
+    df.open(filename, WriteMode, dataType, dataSize);
+    BOOST_REQUIRE(df.isOpen());
+    df.writeRecord(time++, tr, data, dataSize);
+    df.close();
+    BOOST_REQUIRE(!df.isOpen());
+
+    // check
+    df.open(filename, ReadMode);
+    BOOST_CHECK_EQUAL(df.getPath(), filename);
+    BOOST_CHECK_EQUAL(df.getFileSize(), df.getRealFileSize());
+    BOOST_CHECK_EQUAL(df.getRecordCount(), 1);
+    BOOST_CHECK_EQUAL(df.getRecordSize(), dataSize);
+    BOOST_CHECK_EQUAL(df.getSignature(), "ROAD");
+    BOOST_CHECK_EQUAL(df.getType(), dataType);
+    BOOST_CHECK_EQUAL(df.getVersion(), 2);
+    df.close();
+
+    // append
+    df.open(filename, WriteMode, dataType, dataSize);
+    BOOST_REQUIRE(df.isOpen());
+    df.writeRecord(time++, tr, data, dataSize);
+    df.close();
+    BOOST_REQUIRE(!df.isOpen());
+
+    // check
+    df.open(filename, ReadMode);
+    BOOST_CHECK_EQUAL(df.getPath(), filename);
+    BOOST_CHECK_EQUAL(df.getFileSize(), df.getRealFileSize());
+    BOOST_CHECK_EQUAL(df.getRecordCount(), 2);
+    BOOST_CHECK_EQUAL(df.getRecordSize(), dataSize);
+    BOOST_CHECK_EQUAL(df.getSignature(), "ROAD");
+    BOOST_CHECK_EQUAL(df.getType(), dataType);
+    BOOST_CHECK_EQUAL(df.getVersion(), 2);
+    df.close();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
Index: tags/0.2.3/src/PacpusLib/CMakeLists.txt
===================================================================
--- tags/0.2.3/src/PacpusLib/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/src/PacpusLib/CMakeLists.txt	(revision 368)
@@ -0,0 +1,111 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+project(PacpusLib)
+
+create_export(EXPORT_HDR ${PROJECT_NAME} "${PACPUS_INCLUDE_DIR}/Pacpus/kernel")
+
+################################################################################
+add_definitions(
+    -DQT_NO_KEYWORDS
+    ${QT_DEFINITIONS}
+)
+
+################################################################################
+# INCLUDES
+include_directories(
+    ${QT_INCLUDE_DIR}
+)
+
+################################################################################
+# LINK
+link_directories(
+    ${PROJECT_BINARY_DIR}/../RoadTime
+    ${PROJECT_BINARY_DIR}/../FileLib
+)
+
+################################################################################
+# FILES
+set(PROJECT_HDRS
+    ${EXPORT_HDR}
+
+    ColorSeverityFormatter.hpp
+
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/cstdint.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/ComponentBase.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/ComponentFactory.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/ComponentFactoryBase.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/ComponentManager.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/Log.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/pacpus.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/PacpusApplication.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/PacpusException.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/road_time.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/XmlComponentConfig.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/XmlConfigFile.h
+
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/ConnectionBase.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/InputOutputBase.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/InputOutputInterface.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/PacpusEvent.h
+ #   ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/pacpusStruct.h
+)
+
+set(PROJECT_SRCS
+    ComponentBase.cpp
+    ComponentFactoryBase.cpp
+    ComponentManager.cpp
+    ConnectionBase.cpp
+    InputOutputBase.cpp
+    Log.cpp
+    PacpusApplication.cpp
+    PacpusException.cpp
+ #   PacpusStruct.cpp
+    XmlComponentConfig.cpp
+    XmlConfigFile.cpp
+)
+
+set(FILES_TO_MOC
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/InputOutputBase.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/kernel/PacpusEvent.h
+)
+
+qt_wrap_cpp(PROJECT_MOC_SRCS
+    ${FILES_TO_MOC}
+)
+ 
+################################################################################
+# BUILD AND LINK
+pacpus_add_library(${PROJECT_NAME} SHARED
+    ${PROJECT_HDRS}
+    ${PROJECT_SRCS}
+    ${PROJECT_MOC_SRCS}
+)
+
+if(UNIX)
+    set(OPT_LIBRARIES optimized FileLib debug FileLib_d)
+else()
+    set(OPT_LIBRARIES optimized ROAD_TIME debug ROAD_TIME_d)
+endif()
+
+################################################################################
+# LIBS
+target_link_libraries(
+    ${PROJECT_NAME}
+    ${QT_LIBRARIES}
+    ${PACPUS_DEPENDENCIES_LIB}
+    ${OPT_LIBRARIES}
+)
+
+################################################################################
+# INSTALL
+pacpus_install(${PROJECT_NAME})
+
+################################################################################
+# FOLDER
+pacpus_folder(${PROJECT_NAME} "libraries")
Index: tags/0.2.3/src/PacpusLib/ColorSeverityFormatter.hpp
===================================================================
--- tags/0.2.3/src/PacpusLib/ColorSeverityFormatter.hpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/ColorSeverityFormatter.hpp	(revision 368)
@@ -0,0 +1,370 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version    $Id: Log.cpp 76 2013-01-10 17:05:10Z kurdejma $
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    2013-11-28
+/// @version $Id$
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Color logger output depending on severity level.
+///
+/// Detailed description.
+
+#ifndef COLORSEVERITYFORMATTER_HPP
+#define COLORSEVERITYFORMATTER_HPP
+
+#if defined(PACPUS_LOG_COLORED_OUTPUT)
+
+#include <Pacpus/predef/os.h>
+
+#include <boost/assert.hpp>
+#include <boost/log/attributes/attribute_name.hpp>
+#include <boost/log/attributes/fallback_policy.hpp>
+#include <boost/log/attributes/value_visitation.hpp>
+#include <boost/log/expressions.hpp>
+#include <boost/log/utility/functional/bind.hpp>
+#include <cstdlib>
+#include <sstream>
+#include <string>
+
+#if PACPUS_OS_WINDOWS
+#   include <Windows.h>
+#endif
+
+namespace pacpus
+{
+
+enum Color {
+  COLOR_DEFAULT,
+  COLOR_BLACK,
+  COLOR_RED,
+  COLOR_GREEN,
+  COLOR_YELLOW,
+  COLOR_BLUE,
+  COLOR_MAGENTA,
+  COLOR_CYAN,
+  COLOR_WHITE
+};
+
+Color getColor(SeverityLevel const& sev)
+{
+    if (sev >= error) {
+        return COLOR_RED;
+    } else if (sev >= warning) {
+        return COLOR_YELLOW;
+    } else if (sev >= info) {
+        return COLOR_WHITE; //COLOR_GREEN;
+    }
+    return COLOR_DEFAULT;
+}
+
+#if PACPUS_OS_WINDOWS
+
+// Returns the character attribute for the given color.
+WORD getColorAttribute(Color color)
+{
+    switch (color) {
+    case COLOR_BLACK:   return 0;
+    case COLOR_RED:     return FOREGROUND_RED;
+    case COLOR_GREEN:   return FOREGROUND_GREEN;
+    case COLOR_YELLOW:  return FOREGROUND_RED | FOREGROUND_GREEN;
+    case COLOR_BLUE:    return FOREGROUND_BLUE;
+    case COLOR_MAGENTA: return FOREGROUND_RED | FOREGROUND_BLUE;
+    case COLOR_CYAN:    return FOREGROUND_GREEN | FOREGROUND_BLUE;
+    case COLOR_WHITE:   return FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
+    case COLOR_DEFAULT: return 0;
+    default:
+        BOOST_ASSERT(false && "wrong Color enum value");
+        return 0;
+    }
+}
+
+#else
+
+/// @returns the ANSI color code for the given color. COLOR_DEFAULT is
+/// an invalid input.
+std::string getAnsiColorCode(Color color)
+{
+    const char* kEscapeSequence = "\033[";
+//    const char* kBackground = "";
+    const char* kFontRegular = "0;";
+//    const char* kFontBold = "1;";
+//    const char* kFontWeak = "2;";
+//    const char* kFontStrong = "3;";
+//    const char* kFontUnderline = "4;";
+
+    std::stringstream ss;
+    ss << kEscapeSequence << kFontRegular;
+
+    switch (color) {
+    case COLOR_BLACK:   ss << "30"; break;
+    case COLOR_RED:     ss << "31"; break;
+    case COLOR_GREEN:   ss << "32"; break;
+    case COLOR_YELLOW:  ss << "33"; break;
+    case COLOR_BLUE:    ss << "34"; break;
+    case COLOR_MAGENTA: ss << "35"; break;
+    case COLOR_CYAN:    ss << "36"; break;
+    case COLOR_WHITE:   ss << "37"; break;
+    default:            return "";
+    };
+
+    const char* kPostfix = "m";
+    ss << kPostfix;
+
+    return ss.str();
+}
+
+std::string getAnsiColorCodeRestoreDefault()
+{
+    return "\033[0m";
+}
+
+#endif // PACPUS_OS_WINDOWS
+
+bool shouldUseColor(bool stdoutIsTty)
+{
+#if PACPUS_OS_WINDOWS // && !PACPUS_OS_WINDOWS_MOBILE
+    return true;
+#else
+    // On non-Windows platforms, we rely on the TERM variable.
+    std::string const term = std::getenv("TERM");
+    const bool termSupportsColor = (term == "xterm")
+            || (term == "xterm-color")
+            || (term == "xterm-256color")
+            || (term == "screen")
+            || (term == "linux")
+            || (term == "cygwin");
+    return stdoutIsTty && termSupportsColor;
+#endif // PACPUS_OS_WINDOWS
+}
+
+template < typename CharT >
+struct ColorFormatter
+{
+    ColorFormatter()
+#if PACPUS_OS_WINDOWS
+        : mStreamHandle(GetStdHandle(STD_OUTPUT_HANDLE))
+#endif // PACPUS_OS_WINDOWS
+    {
+        mShouldUseColor = shouldUseColor(/*stdoutIsTty*/ true);
+    }
+
+    void operator()(boost::log::basic_formatting_ostream<CharT>& strm, SeverityLevel const& sev)
+    {
+        if (!mShouldUseColor) {
+            return;
+        }
+#if PACPUS_OS_WINDOWS
+        // Gets the current text color.
+        CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
+        GetConsoleScreenBufferInfo(mStreamHandle, &bufferInfo);
+        mSavedConsoleBufferInfo = bufferInfo.wAttributes;
+
+        // We need to flush the stream buffers into the console before each
+        // SetConsoleTextAttribute call lest it affect the text that is already
+        // printed but has not yet reached the console.
+        fflush(stdout);
+        SetConsoleTextAttribute(mStreamHandle, getColorAttribute(getColor(sev)) | FOREGROUND_INTENSITY);
+#else
+        strm << getAnsiColorCode(getColor(sev)).c_str();
+#endif // PACPUS_OS_WINDOWS
+    }
+
+    bool mShouldUseColor;
+#if PACPUS_OS_WINDOWS
+    const HANDLE mStreamHandle;
+    WORD mSavedConsoleBufferInfo;
+#endif // PACPUS_OS_WINDOWS
+};
+
+template < typename CharT >
+struct DefaultFormatter
+{
+    DefaultFormatter()
+#if PACPUS_OS_WINDOWS
+    //DefaultFormatter(WORD savedConsoleBufferInfo)
+        : mStreamHandle(GetStdHandle(STD_OUTPUT_HANDLE))
+        //, mSavedConsoleBufferInfo(savedConsoleBufferInfo)
+        , mSavedConsoleBufferInfo(getColorAttribute(COLOR_WHITE)) // FIXME: restore old value, not just reset
+#endif // PACPUS_OS_WINDOWS
+    {
+        mShouldUseColor = shouldUseColor(/*stdoutIsTty*/ true);
+    }
+
+    void operator()(boost::log::basic_formatting_ostream<CharT>& strm, SeverityLevel const& /*sev*/)
+    {
+        if (!mShouldUseColor) {
+            return;
+        }
+#if PACPUS_OS_WINDOWS
+        fflush(stdout);
+        // Restores the text color.
+        SetConsoleTextAttribute(mStreamHandle, mSavedConsoleBufferInfo);
+#else
+        strm << getAnsiColorCodeRestoreDefault().c_str();
+#endif // PACPUS_OS_WINDOWS
+    }
+
+    bool mShouldUseColor;
+#if PACPUS_OS_WINDOWS
+    const HANDLE mStreamHandle;
+    WORD mSavedConsoleBufferInfo;
+#endif // PACPUS_OS_WINDOWS
+};
+
+template< typename T, typename FallbackPolicyT, typename CharT >
+class FormatSeverityWithColorsTerminal
+{
+public:
+    //! Internal typedef for type categorization
+    typedef void _is_boost_log_terminal;
+
+    //! Attribute value type
+    typedef T value_type;
+    //! Fallback policy
+    typedef FallbackPolicyT fallback_policy;
+    //! Character type
+    typedef CharT char_type;
+    //! String type
+    typedef std::basic_string< char_type > string_type;
+    //! Formatting stream type
+    typedef boost::log::basic_formatting_ostream< char_type > stream_type;
+
+    //! Formatter function
+    typedef boost::log::aux::light_function< void (stream_type&, value_type const&) > formatter_function_type;
+
+    //! Function result type
+    typedef string_type result_type;
+
+    typedef boost::log::attribute_name attribute_name;
+
+private:
+    //! Attribute value visitor invoker
+    typedef boost::log::value_visitor_invoker< value_type, fallback_policy > visitor_invoker_type;
+
+private:
+    //! Attribute name
+    attribute_name m_name;
+    //! Formattr function
+    formatter_function_type m_formatter;
+    //! Attribute value visitor invoker
+    visitor_invoker_type m_visitor_invoker;
+
+public:
+    //! Initializing constructor
+    FormatSeverityWithColorsTerminal(attribute_name const& name, fallback_policy const& fallback, bool restoreDefault)
+        : m_name(name)
+        //, m_formatter(formatter_generator::parse(format))
+        , m_visitor_invoker(fallback)
+    {
+        if (restoreDefault) {
+//#if PACPUS_OS_WINDOWS
+//            m_formatter = formatter_function_type(DefaultFormatter<char_type>());
+//#else // PACPUS_OS_WINDOWS
+            m_formatter = formatter_function_type(DefaultFormatter<char_type>());
+//#endif // PACPUS_OS_WINDOWS
+        } else {
+            m_formatter = formatter_function_type(ColorFormatter<char_type>());
+        }
+    }
+
+    //! Copy constructor
+    FormatSeverityWithColorsTerminal(FormatSeverityWithColorsTerminal const& that) :
+        m_name(that.m_name), m_formatter(that.m_formatter), m_visitor_invoker(that.m_visitor_invoker)
+    {
+    }
+
+    //! Invokation operator
+    template< typename ContextT >
+    result_type operator() (ContextT const& ctx)
+    {
+        using namespace boost;
+        using boost::log::binder1st;
+        string_type str;
+        stream_type strm(str);
+        m_visitor_invoker(m_name, fusion::at_c< 0 >(phoenix::env(ctx).args()), binder1st< formatter_function_type&, stream_type& >(m_formatter, strm));
+        strm.flush();
+        return boost::move(str);
+    }
+
+    //! Invokation operator
+    template< typename ContextT >
+    result_type operator() (ContextT const& ctx) const
+    {
+        using namespace boost;
+        using boost::log::binder1st;
+        string_type str;
+        stream_type strm(str);
+        m_visitor_invoker(m_name, fusion::at_c< 0 >(phoenix::env(ctx).args()), binder1st< formatter_function_type const&, stream_type& >(m_formatter, strm));
+        strm.flush();
+        return boost::move(str);
+    }
+
+};
+
+template< typename T, typename FallbackPolicyT, typename CharT = char, template< typename > class ActorT = boost::phoenix::actor >
+class FormatSeverityWithColorsActor
+    : public ActorT< FormatSeverityWithColorsTerminal< T, FallbackPolicyT, CharT > >
+{
+public:
+    //! Attribute value type
+    typedef T value_type;
+    //! Character type
+    typedef CharT char_type;
+    //! Fallback policy
+    typedef FallbackPolicyT fallback_policy;
+    //! Base terminal type
+    typedef FormatSeverityWithColorsTerminal< value_type, fallback_policy, char_type > terminal_type;
+    //! Formatter function
+    typedef typename terminal_type::formatter_function_type formatter_function_type;
+
+    //! Base actor type
+    typedef ActorT< terminal_type > base_type;
+
+public:
+    //! Initializing constructor
+    explicit FormatSeverityWithColorsActor(base_type const& act)
+        : base_type(act)
+    {
+    }
+};
+
+template< typename AttributeValueT >
+/*BOOST_FORCEINLINE*/ FormatSeverityWithColorsActor< AttributeValueT, boost::log::fallback_to_none >
+formatSeverityWithColors(boost::log::attribute_name const& name, bool restoreDefault = false)
+{
+    using boost::log::fallback_to_none;
+    typedef FormatSeverityWithColorsActor< AttributeValueT, fallback_to_none > actor_type;
+    typedef typename actor_type::terminal_type terminal_type;
+    typename actor_type::base_type act = {{ terminal_type(name, fallback_to_none(), restoreDefault) }};
+    return actor_type(act);
+}
+
+template< typename DescriptorT, template< typename > class ActorT, typename CharT >
+/*BOOST_FORCEINLINE*/ FormatSeverityWithColorsActor< typename DescriptorT::value_type, boost::log::fallback_to_none, CharT, ActorT >
+formatSeverityWithColors(boost::log::expressions::attribute_keyword< DescriptorT, ActorT > const& keyword, bool restoreDefault = false)
+{
+    using boost::log::fallback_to_none;
+    typedef FormatSeverityWithColorsActor< typename DescriptorT::value_type, fallback_to_none, CharT, ActorT > actor_type;
+    typedef typename actor_type::terminal_type terminal_type;
+    typename actor_type::base_type act = {{ terminal_type(keyword.get_name(), fallback_to_none(), restoreDefault) }};
+    return actor_type(act);
+}
+
+template< typename T, typename FallbackPolicyT, typename TagT, template< typename > class ActorT>
+/*BOOST_FORCEINLINE*/ FormatSeverityWithColorsActor< T, FallbackPolicyT, char, ActorT >
+formatSeverityWithColors(boost::log::expressions::attribute_actor< T, FallbackPolicyT, TagT, ActorT > const& placeholder, bool restoreDefault = false)
+{
+    typedef FormatSeverityWithColorsActor< T, FallbackPolicyT, char, ActorT > actor_type;
+    typedef typename actor_type::terminal_type terminal_type;
+    typename actor_type::base_type act = {{ terminal_type(placeholder.get_name(), placeholder.get_fallback_policy(), restoreDefault) }};
+    return actor_type(act);
+}
+
+} // namespace pacpus
+
+#endif // defined(PACPUS_LOG_COLORED_OUTPUT)
+
+#endif // COLORSEVERITYFORMATTER_HPP
Index: tags/0.2.3/src/PacpusLib/ComponentBase.cpp
===================================================================
--- tags/0.2.3/src/PacpusLib/ComponentBase.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/ComponentBase.cpp	(revision 368)
@@ -0,0 +1,614 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version $Id: ComponentBase.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include <Pacpus/kernel/ComponentBase.h>
+
+#include <Pacpus/kernel/ComponentManager.h>
+#include <Pacpus/kernel/Log.h>
+#include <Pacpus/kernel/PacpusException.h>
+
+#include <boost/bind/bind.hpp>
+#include <boost/exception/detail/exception_ptr.hpp>
+#include <boost/exception/diagnostic_information.hpp>
+#include <boost/exception/exception.hpp>
+#include <boost/program_options/parsers.hpp>
+#include <boost/program_options/variables_map.hpp>
+#include <ostream>
+#include <string>
+#include <vector>
+
+namespace po = boost::program_options;
+using namespace pacpus;
+using namespace std;
+
+//vector<string> convertAttributesToArgumentVector(QDomNamedNodeMap const& attributes);
+
+namespace std
+{
+
+template <typename _Elem, typename _Traits>
+std::basic_ostream<_Elem, _Traits>& operator<<(std::basic_ostream<_Elem, _Traits>& os, boost::program_options::variables_map const& vm)
+{
+    for (po::variables_map::const_iterator i = vm.begin(); i != vm.end(); ++i) { 
+        const po::variable_value & v = i->second;
+        if (v.empty()) {
+            continue;
+        }
+        const type_info & type = v.value().type();
+        if (type == typeid(string)) {
+            const string & val = v.as<string>();
+            os << i->first << "=" << val;
+        } else if (type == typeid(long)) {
+            int val = v.as<long>();
+            os << i->first << "=" << val;
+        } else if (type == typeid(int)) {
+            int val = v.as<int>();
+            os << i->first << "=" << val;
+        } else if (type == typeid(unsigned long)) {
+            int val = v.as<unsigned long>();
+            os << i->first << "=" << val;
+        } else if (type == typeid(unsigned int)) {
+            int val = v.as<unsigned int>();
+            os << i->first << "=" << val;
+        } else if (type == typeid(double)) {
+            int val = v.as<double>();
+            os << i->first << "=" << val;
+        } else if (type == typeid(float)) {
+            int val = v.as<float>();
+            os << i->first << "=" << val;
+        } else if (type == typeid(bool)) {
+            int val = v.as<bool>();
+            os << i->first << "=" << val;
+        } else {
+			// unknown value type
+			os << i->first;
+		}
+        os << "\n";
+    }
+    return os;
+}
+
+} // namespace std
+
+DECLARE_STATIC_LOGGER("pacpus.core.ComponentBase");
+
+ComponentBase::ComponentBase(QString const& componentName)
+    : m_componentName(componentName)
+    , m_isActive(false)
+    , mIsRecording(true)
+    , m_manager(NULL)
+    , m_ui(NULL)
+    , m_componentState(NOT_MONITORED)
+    , mOptionsDescription("Component parameters")
+{
+    LOG_TRACE("constructor");
+
+    // Get a pointer on the instance of ComponentManager.
+    m_manager = ComponentManager::getInstance();
+    LOG_INFO("component " << getName() << " was created");
+
+    addParameter("name", value<string>(&mName)->required(), "component name");
+    addParameter("type", value<string>(&mTypeName)->required(), "component type");
+    addParameters()
+        //("name", value<string>(&mName)->required(), "component name")
+        //("type", value<string>(&mTypeName)->required(), "component type")
+        ("ui", value<bool>(&mHasGui)->default_value(false), "whether to show GUI")
+        ("verbose", value<bool>(&mVerbose)->default_value(false), "set output verbose")
+        ("verbosity-level", value<int>(&mVerbosityLevel)->default_value(0), "set verbosity level")
+        ("recording", value<bool>(&mIsRecording)->default_value(false), "whether to record data")
+    ;
+}
+
+ComponentBase::~ComponentBase()
+{  
+    LOG_TRACE("destructor");
+}
+
+bool ComponentBase::isActive() const
+{
+    return m_isActive;
+}
+
+void ComponentBase::setActive(bool isActive)
+{
+    m_isActive = isActive;
+}
+
+bool ComponentBase::isRecording() const
+{
+    return mIsRecording;
+}
+
+void ComponentBase::setRecording(bool isRecording)
+{
+    mIsRecording = isRecording;
+}
+
+const XmlComponentConfig ComponentBase::xmlParameters() const
+{
+    return param;
+}
+
+//void ComponentBase::startComponentWithException(boost::exception_ptr& error)
+//{
+//    try {
+//        startActivity();
+//        error = boost::exception_ptr();
+//    } catch (...) {
+//        error = boost::current_exception();
+//    }
+//}
+//
+//void ComponentBase::startComponentInThread()
+//{
+//    boost::exception_ptr error;
+//    boost::thread t(
+//        boost::bind(
+//            &ComponentBase::startComponentWithException,
+//            this,
+//            boost::ref(error)
+//        )
+//    );
+//    t.join();
+//    if (error) {
+//        try {
+//            boost::rethrow_exception(error);
+//        } catch (boost::exception& e) {
+//            LOG_FATAL("[" << getName() << "]" << "\tboost::exception thrown: " << boost::diagnostic_information(e));
+//            //throw;
+//        }
+//    }
+//}
+
+int ComponentBase::startComponent()
+{
+    if (isActive()) {
+        LOG_DEBUG("component already started, cannot (re-)start");
+        return false;
+    }
+
+    setActive(true);
+    //boost::thread worker(&ComponentBase::startComponentInThread, this);
+    startActivity();
+    //moveToThread(&mThread);
+    //mThread.start();
+    return true;
+}
+
+int ComponentBase::stopComponent()
+{
+    if (!isActive()) {
+        LOG_DEBUG("component already stopped, cannot (re-)stop");
+        return false;
+    }
+    
+    setActive(false);
+    stopActivity();
+    //QMetaObject::invokeMethod(&mThread, "quit");
+    return true;
+}
+
+void ComponentBase::setState(const COMPONENT_STATE state)
+{
+    m_componentState = state;
+}
+
+// FIXME: this should be const.
+ComponentBase::COMPONENT_STATE ComponentBase::getState()
+{
+    COMPONENT_STATE state = m_componentState;
+    if (ComponentBase::NOT_MONITORED != m_componentState) {
+        m_componentState = ComponentBase::MONITOR_NOK;
+    }
+    return state;
+}
+
+// FIXME: this should be const.
+ComponentBase::COMPONENT_STATE ComponentBase::state()
+{
+    return getState();
+}
+
+
+ComponentBase::COMPONENT_CONFIGURATION ComponentBase::configurationState() const
+{
+    return m_configurationState;
+}
+
+void ComponentBase::setConfigurationState(COMPONENT_CONFIGURATION state)
+{
+    m_configurationState = state;
+}
+
+bool ComponentBase::isConfigured() const
+{
+    return (m_configurationState == CONFIGURED_OK);
+}
+
+QString ComponentBase::getName() const
+{
+    return m_componentName;
+}
+
+QString ComponentBase::name() const
+{
+    return getName();
+}
+
+ComponentBase::InputsMap & ComponentBase::inputs()
+{
+    return m_inputs;
+}
+
+const ComponentBase::InputsMap & ComponentBase::inputs() const
+{
+    return m_inputs;
+}
+
+ComponentBase::OutputsMap & ComponentBase::outputs()
+{
+    return m_outputs;
+}
+
+const ComponentBase::OutputsMap & ComponentBase::outputs() const
+{
+    return m_outputs;
+}
+
+InputInterfaceBase* ComponentBase::getInput(QString inputName) const
+{
+    if (inputs().contains(inputName)) {
+        return inputs()[inputName].get();
+    }
+    LOG_WARN("Component " << getName() << " does not contain input " << inputName);
+    return NULL;
+}
+
+OutputInterfaceBase* ComponentBase::getOutput(QString outputName) const
+{
+    if (outputs().contains(outputName)) {
+        return outputs()[outputName].get();
+    }
+    LOG_WARN("Component " << getName() << " does not contain output " << outputName);
+    return NULL;
+}
+
+bool ComponentBase::hasGui() const
+{
+    return mHasGui;
+}
+
+bool ComponentBase::isOutputVerbose() const
+{
+    return mVerbose || (getVerbosityLevel() > 0);
+}
+
+int ComponentBase::getVerbosityLevel() const
+{
+    return mVerbosityLevel;
+}
+
+po::options_description_easy_init ComponentBase::addParameters()
+{
+    return mOptionsDescription.add_options();
+}
+
+void ComponentBase::addParameter(const char* name, const char* description)
+{
+    addParameters()(name, description);
+}
+
+void ComponentBase::addParameter(const char* name, const po::value_semantic* s)
+{
+    addParameters()(name, s);
+}
+
+void ComponentBase::addParameter(const char* name, const po::value_semantic* s, const char* description)
+{
+    addParameters()(name, s, description);
+}
+       
+class DomElementParser
+    : boost::noncopyable
+{
+public:
+    DomElementParser(QDomElement const& args);
+    
+    /** Sets options descriptions to use. */
+    DomElementParser& options(const boost::program_options::options_description& desc);
+    
+    /** Parses the options and returns the result of parsing.
+        Throws on error.
+    */
+    boost::program_options::basic_parsed_options<char> run();
+
+    /** Specifies that unregistered options are allowed and should
+        be passed though. For each command like token that looks
+        like an option but does not contain a recognized name, an
+        instance of basic_option<charT> will be added to result,
+        with 'unrecognized' field set to 'true'. It's possible to
+        collect all unrecognized options with the 'collect_unrecognized'
+        funciton. 
+    */
+    DomElementParser& allow_unregistered();
+    
+private:
+    boost::program_options::basic_parsed_options<char> parseDomElement(
+        const QDomElement& dom_element,
+        const boost::program_options::options_description& desc,
+        bool allow_unregistered = false);
+
+private:
+    boost::program_options::options_description const* m_desc;
+    QDomElement const& m_dom_element;
+    bool m_allow_unregistered;
+};
+
+DomElementParser::DomElementParser(const QDomElement& dom_element)
+    : m_dom_element(dom_element)
+    , m_allow_unregistered(false)
+{
+}
+
+DomElementParser& DomElementParser::options(const boost::program_options::options_description& desc)
+{
+    m_desc = &desc;
+    return *this;
+}
+
+DomElementParser& DomElementParser::allow_unregistered()
+{
+    m_allow_unregistered = true;
+    return *this;
+}
+
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/program_options/errors.hpp>
+
+namespace detail
+{
+template <typename charT>
+class basic_dom_element_iterator
+    : public boost::iterator_facade<
+        basic_dom_element_iterator<charT>
+        , const boost::program_options::option
+        , boost::random_access_traversal_tag
+    >
+{
+public:
+    typedef boost::program_options::option ValueType;
+    typedef basic_dom_element_iterator<charT> self_type;
+    typedef typename self_type::iterator_facade_ base_type;
+    typedef typename self_type::difference_type difference_type;
+
+    basic_dom_element_iterator<charT>(QDomElement const& dom_element)
+        : m_dom_element(NULL)
+        , m_at_eof(true)
+        , m_i(dom_element.attributes().size())
+    {
+    }
+
+    basic_dom_element_iterator<charT>(QDomElement const& dom_element,
+            std::set<std::string> const& allowed_options,
+            bool allow_unregistered = false)
+        : m_dom_element(&dom_element)
+        , m_allowed_options(allowed_options)
+        , m_allow_unregistered(allow_unregistered)
+        , m_i(0)
+    {
+        m_attrs = m_dom_element->attributes();
+        m_at_eof = !(m_i < m_attrs.size());
+        if (!m_at_eof) {
+            get();
+        }
+    }
+    
+private:
+    friend class ::boost::iterator_core_access;
+
+    bool equal(const basic_dom_element_iterator<charT>& other) const
+    {
+        if (m_at_eof && other.m_at_eof) {
+            return true;
+        }
+        return false;
+    }
+    
+    void increment() 
+    {
+        ++m_i;
+        m_at_eof = !(m_i < m_attrs.size());
+        if (!m_at_eof) {
+            get();
+        }
+    }
+    
+    const ValueType& dereference() const
+    {
+        return m_value;
+    }
+    
+    void advance(size_t n)
+    {
+        m_i += n;
+        m_at_eof = !(m_i < m_attrs.size());
+        if (!m_at_eof) {
+            get();
+        }
+    }
+
+    difference_type distance_to(const basic_dom_element_iterator<charT>& other) const
+    {
+        return other.m_i - this->m_i;
+    }
+
+private:
+    ValueType& value()
+    {
+        return m_value;
+    }
+    
+    void get()
+    {
+        using namespace boost::program_options;
+
+        QDomNode node = m_attrs.item(m_i);
+        QDomAttr attr = node.toAttr();
+
+        string name = attr.name().toStdString();
+        string value = attr.value().toStdString();
+
+        bool registered = allowed_option(name);
+        if (!registered && !m_allow_unregistered) {
+            boost::throw_exception(unknown_option(name));
+        }
+
+        this->value().string_key = name;
+        this->value().value.clear();
+        this->value().value.push_back(value);
+        this->value().unregistered = !registered;
+        //this->value().original_tokens.push_back(name);
+        //this->value().original_tokens.push_back(value);
+    }
+
+    bool allowed_option(const std::string& s) const
+    {
+        set<string>::const_iterator it = m_allowed_options.find(s);
+        if (it != m_allowed_options.end()) {
+            return true;        
+        }
+        return false;
+    }
+
+private:
+    const QDomElement* m_dom_element;
+    std::set<std::string> m_allowed_options;
+    bool m_allow_unregistered;
+
+    QDomNamedNodeMap m_attrs;
+    int m_i;
+    bool m_at_eof;
+    ValueType m_value;
+};
+
+typedef basic_dom_element_iterator<char> dom_element_iterator;
+typedef basic_dom_element_iterator<wchar_t> wdom_element_iterator;
+
+}
+
+boost::program_options::basic_parsed_options<char> DomElementParser::run()
+{
+    assert(m_desc);
+    return parseDomElement(m_dom_element, *m_desc, m_allow_unregistered);
+}
+
+boost::program_options::basic_parsed_options<char> DomElementParser::parseDomElement(
+        const QDomElement& dom_element,
+        const boost::program_options::options_description& desc,
+        bool allow_unregistered)
+{
+    // TODO: use XPath paths
+
+    typedef char charT;
+
+    using boost::program_options::error;
+    using boost::shared_ptr;
+    using namespace boost::program_options;
+    using ::detail::basic_dom_element_iterator;
+    
+    set<string> allowed_options;
+
+    const vector<shared_ptr<option_description> >& options = desc.options();
+    for (unsigned i = 0; i < options.size(); ++i) {
+        const option_description& d = *options[i];
+
+        if (d.long_name().empty()) {
+            boost::throw_exception(
+                error("abbreviated option names are not permitted when parsing DOM elements"));
+        }
+        
+        allowed_options.insert(d.long_name());
+    }
+    
+    // Parser returns char strings
+    parsed_options result(&desc);        
+    copy(basic_dom_element_iterator<charT>(dom_element, allowed_options, allow_unregistered),
+            basic_dom_element_iterator<charT>(dom_element),
+            back_inserter(result.options));
+
+    // Convert char strings into desired type.
+    return basic_parsed_options<charT>(result);
+}
+
+DomElementParser parseDomElement();
+
+/** Creates instance of 'command_line_parser', passes parameters to it,
+    and returns the result of calling the 'run' method.        
+    */
+boost::program_options::basic_parsed_options<char> 
+parseDomElement(QDomElement const& domElement, const boost::program_options::options_description&);
+
+boost::program_options::basic_parsed_options<char> 
+parseDomElement(QDomElement const& domElement, const boost::program_options::options_description& desc)
+{
+    return DomElementParser(domElement)
+        .options(desc)
+        .run();
+}
+
+void ComponentBase::parseParameters(XmlComponentConfig const& cfg)
+{
+    LOG_INFO("Parsing parameters...");
+	std::ostringstream temp_stream;		
+	temp_stream << mOptionsDescription;	
+	LOG_INFO(temp_stream.str());		
+    
+    po::variables_map vm;
+    try {
+        po::store(
+            DomElementParser(cfg.getDomElement())
+                .options(mOptionsDescription)
+                .allow_unregistered()   // FIXME: temporary only, at term all the components specify all parameters
+                .run()
+        , vm);
+        po::notify(vm);
+    } catch (po::error& e) {
+        LOG_WARN(e.what());
+        BOOST_THROW_EXCEPTION(PacpusException(e.what()));
+    }
+
+    LOG_INFO("Parsed parameter values:\n" << vm);
+}
+
+//vector<string> convertAttributesToArgumentVector(const QDomNamedNodeMap & attributes)
+//{
+//    vector<string> xargs;
+//    xargs.reserve(attributes.size());
+//
+//    for (int i = 0; i < attributes.size(); ++i) {
+//        QDomAttr parameter = attributes.item(i).toAttr();
+//        if (parameter.isNull()) {
+//            LOG_WARN("node is not a parameter");
+//            continue;
+//        }
+//        
+//        QString arg = QString("--") + parameter.name() + "=";
+//        
+//        bool shouldAddQuotes = parameter.value().contains(' ');
+//        if (shouldAddQuotes) {
+//            arg += '\"';
+//            arg += parameter.value();
+//            arg += '\"';
+//        } else {
+//            arg += parameter.value();
+//        }
+//        
+//        LOG_DEBUG("parameter: " << arg);
+//        xargs.push_back(arg.toStdString());
+//    }
+//
+//    return xargs;
+//}
Index: tags/0.2.3/src/PacpusLib/ComponentFactoryBase.cpp
===================================================================
--- tags/0.2.3/src/PacpusLib/ComponentFactoryBase.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/ComponentFactoryBase.cpp	(revision 368)
@@ -0,0 +1,52 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version    $Id: ComponentFactoryBase.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include <Pacpus/kernel/ComponentFactoryBase.h>
+#include <Pacpus/kernel/ComponentBase.h>
+#include <Pacpus/kernel/ComponentManager.h>
+#include <Pacpus/kernel/Log.h>
+
+#include <boost/assert.hpp>
+#include <QString>
+
+using namespace pacpus;
+
+DECLARE_STATIC_LOGGER("pacpus.core.ComponentFactoryBase");
+
+ComponentFactoryBase::ComponentFactoryBase()
+    : mgr_(NULL)
+{
+    LOG_TRACE("constructor");
+    // get the adress of the ComponentManager instance
+    mgr_ = ComponentManager::getInstance();
+    BOOST_ASSERT(mgr_);
+}
+
+ComponentFactoryBase::~ComponentFactoryBase()
+{
+    LOG_TRACE("destructor");
+}
+
+void ComponentFactoryBase::addFactory(ComponentFactoryBase* addr, QString const& type)
+{
+    LOG_DEBUG("addFactory(type="<< type << ")");
+
+    if (!mgr_->registerComponentFactory(addr, type)) {
+        /*
+        // FIXME: delete in a secure manner (no double delete)
+        delete addr;
+        addr = NULL;
+        */
+    }
+}
+
+void ComponentFactoryBase::createComponent(QString const& name)
+{
+    LOG_DEBUG("addComponent(" << name << ")");
+
+    ComponentSharedPointer component = instantiateComponent(name);
+    mgr_->registerComponent(component, name);
+}
Index: tags/0.2.3/src/PacpusLib/ComponentManager.cpp
===================================================================
--- tags/0.2.3/src/PacpusLib/ComponentManager.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/ComponentManager.cpp	(revision 368)
@@ -0,0 +1,512 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @version    $Id: ComponentManager.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include <Pacpus/kernel/ComponentManager.h>
+
+#include <Pacpus/kernel/ComponentFactoryBase.h>
+#include <Pacpus/kernel/ComponentBase.h>
+#include <Pacpus/kernel/ConnectionBase.h>
+#include <Pacpus/kernel/InputOutputBase.h>
+#include <Pacpus/kernel/Log.h>
+#include <Pacpus/kernel/PacpusException.h>
+
+#include <QDomNodeList>
+#include <QObject>
+#include <QList>
+#include <ostream>
+
+using namespace pacpus;
+
+template <typename _Elem, typename _Traits, typename _ListElem>
+std::basic_ostream<_Elem, _Traits> & operator<<(std::basic_ostream<_Elem, _Traits> & os, const QList<_ListElem> & list)
+{
+    typedef QList<_ListElem> ListType;
+    for (typename ListType::const_iterator it = list.begin(), itend = list.end(); it != itend; ++it) {
+        os << *it << "\n";
+    }
+    return os;
+}
+
+DECLARE_STATIC_LOGGER("pacpus.core.ComponentManager");
+
+////////////////////////////////////////////////////////////////////////////////
+
+/// Connects OutputInterfaceBase @b out to InputInterfaceBase @b in using given priority and reading mode.
+/// @returns @b true if connection has been added successfully, @b false otherwise.
+bool connectInterface(OutputInterfaceBase* out, InputInterfaceBase* in, int priority, InputInterfaceBase::ReadingMode mode = InputInterfaceBase::GetLast);
+
+////////////////////////////////////////////////////////////////////////////////
+
+bool connectInterface(OutputInterfaceBase* out, InputInterfaceBase* in, int priority, InputInterfaceBase::ReadingMode mode)
+{
+    // check connections
+    if (!out || !in) {
+        LOG_WARN("null connection");
+        return false;
+    }
+
+    // check if connection type are compatible
+    // FIXME: it should permit an OutputType to be a type conversible to InputType
+    if (out->getDataType() != in->getDataType()) {
+        LOG_WARN("connection types do not match: "
+            << out->getSignature() << "." << out->getDataType().name()
+            << " -> "
+            << in->getSignature() << "." << in->getDataType().name()
+        );
+        return false;
+    }
+    //if ((out->getDataType() == in->getDataType())
+    //        || (out->getDataType() == typeid(QByteArray))
+    //        || (in->getDataType() == typeid(QByteArray))) {
+    
+    // add connection
+    out->addConnection(ConnectionBase(in, priority));  // TODO make connect function
+    in->addConnection(ConnectionBase(out, priority));
+    in->setReadingMode(mode);
+    LOG_INFO("connection created: source=" << out->getSignature() << ", destination=" << in->getSignature());
+    return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+ComponentManager * ComponentManager::mInstance = NULL;
+
+ComponentManager * ComponentManager::create()
+{
+    return getInstance();
+}
+
+ComponentManager * ComponentManager::getInstance()
+{
+    LOG_TRACE("getInstance()");
+    LOG_TRACE("before: mInstance = " << mInstance);
+
+    if (!mInstance) {
+        LOG_INFO("creating new instance...");
+        mInstance = new ComponentManager();
+        LOG_DEBUG("mInstance = " << mInstance);
+    }
+
+    LOG_TRACE("after : mInstance = " << mInstance);
+    return mInstance;
+}
+
+void ComponentManager::destroy()
+{
+    LOG_TRACE("destroy");
+
+    LOG_TRACE("before: mInstance = " << mInstance);
+    delete mInstance;
+    mInstance = NULL;
+    LOG_TRACE("after : mInstance = " << mInstance);
+}
+
+ComponentManager::ComponentManager()
+{
+    LOG_TRACE("constructor");
+
+    xmlTree_ = XmlConfigFile::create();
+    LOG_DEBUG("component manager was created");
+}
+
+ComponentManager::~ComponentManager()
+{
+    LOG_TRACE("destructor");
+
+    for (ComponentMap::iterator it = componentMap_.begin(), itend = componentMap_.end(); it != itend; ++it) {
+        bool unregisteredSuccessfully = unregisterComponent(it.key());
+    }
+
+    LOG_DEBUG("component manager was deleted");
+}
+
+bool ComponentManager::registerComponentFactory(ComponentFactoryBase* addr, QString const& type)
+{
+    LOG_TRACE("registerComponentFactory(type="<< type << ")");
+
+    if (factoryMap_.contains(type))
+    {
+        LOG_WARN("cannot register a component factory of type '" << type << "'. It already belongs to the manager");
+        return false;
+    }
+
+    factoryMap_[type] = addr;
+    LOG_INFO("registered component factory '" << type << "'");
+
+    return true;
+}
+
+bool ComponentManager::unregisterComponentFactory(QString const& type)
+{
+    LOG_TRACE("unregisterComponentFactory(type="<< type << ")");
+
+    if (!factoryMap_.contains(type)) {
+        LOG_WARN("cannot unregister component factory '" << type << "'. It was not registered");
+        return false;
+    }
+
+    factoryMap_.remove(type);
+    LOG_INFO("unregistered component factory '" << type << "'");
+
+    return true;
+}
+
+bool ComponentManager::registerComponent(boost::shared_ptr<ComponentBase> addr, QString const& name)
+{
+    LOG_TRACE("registerComponent(name="<< name << ")");
+
+    if (componentMap_.contains(name)) {
+        LOG_WARN("cannot register component '" << name << "'. A component with the same name exists already");
+        return false;
+    }
+
+    componentMap_[name] = addr;
+    LOG_INFO("registered component " << name);
+
+    return true;
+}
+
+bool ComponentManager::unregisterComponent(QString const& name)
+{
+    LOG_TRACE("unregisterComponent(name="<< name << ")");
+
+    if (!componentMap_.contains(name)) {
+        LOG_WARN("cannot unregister component '" << name << "'. It was not registered");
+        return false;
+    }
+
+    ComponentSharedPointer component = componentMap_.value(name, ComponentSharedPointer());
+    
+    // FIXME: remove from map (causes segfault in QMap::qMapLessThanKey on Windows)
+    //componentMap_.remove(name);
+    LOG_INFO("unregistered component '" << name << "'");
+    return true;
+}
+
+bool ComponentManager::createComponent(QString const& type, QString const& name)
+{
+    LOG_TRACE("createComponent(type=" << type << ", " << "name="<< name << ")");
+
+    if (factoryMap_.contains(type)) {
+        ComponentFactoryBase* factory = factoryMap_.value(type);
+        assert(factory);
+        factory->createComponent(name);
+        return true;
+    }
+
+    LOG_WARN("cannot create component '" << name << "'"
+             << ". Component factory for type '" << type << "'"
+             << " does not exist or was not registered"
+             );
+    return false;
+}
+
+bool ComponentManager::loadPlugin(QString const& filename)
+{
+    LOG_TRACE("loadPlugin(filename=" << filename << ")");
+
+    pluginLoader_.setFileName(filename);
+
+    if (!pluginLoader_.load()) {
+        LOG_ERROR("cannot load plugin '" << filename << "'"
+                  << ". Plugin loader returned error: " << pluginLoader_.errorString()
+                  );
+        return false;
+    }
+
+    QObject * plugin = pluginLoader_.instance();
+    if (NULL == plugin) {
+        LOG_WARN("cannot create an instance of the plugin '" << filename << "'"
+                 << ". Plugin loader returned error: " << pluginLoader_.errorString()
+                 );
+        return false;
+    }
+    pluginList_.append(plugin);
+    LOG_INFO("loaded plugin '" << qobject_cast<PacpusPluginInterface*>(plugin)->name() << "'"
+             << " from file '" << pluginLoader_.fileName() << "'"
+             );
+    return true;
+}
+
+bool ComponentManager::checkComponent(QString const& componentName)
+{
+    if (NULL == getComponent(componentName)) {
+        LOG_WARN("component " << componentName << " does not exist");
+        return false;
+    }
+    return true;
+}
+
+bool ComponentManager::checkComponentInput(QString const& componentName, QString const& inputName)
+{
+    if (!checkComponent(componentName)) {
+        return false;
+    }
+    if (NULL == getComponent(componentName)->getInput(inputName)) {
+        LOG_WARN("cannot make connection: component " << componentName << " does not have input " << inputName);
+        return false;
+    }
+    return true;
+}
+
+bool ComponentManager::checkComponentOutput(QString const& componentName, QString const& outputName)
+{
+    if (!checkComponent(componentName)) {
+        return false;
+    }
+    if (NULL == getComponent(componentName)->getOutput(outputName)) {
+        LOG_WARN("cannot make connection: component " << componentName << " does not have output " << outputName);
+        return false;
+    }
+    return true;
+}
+
+bool ComponentManager::createConnection(QString const& outputSignature, QString const& inputSignature, QString const& type, int priority = 0)
+{
+    // FIXME: use 2 signatures (output component + output connection) instead of 1 separated by a (".") dot
+    QStringList output = outputSignature.split(".");
+    QStringList input  = inputSignature.split(".");
+
+    if (!checkComponentOutput(output[0], output[1])) {
+        return false;
+    }
+    if (!checkComponentInput(input[0], input[1])) {
+        return false;
+    }
+    // FIXME: Create communicationInterface if needed ??
+    return connectInterface(
+        getComponent(output[0])->getOutput(output[1]), 
+        getComponent(input[0])->getInput(input[1]),
+        priority
+    );
+}
+
+std::size_t ComponentManager::loadComponents(QString const& configFilename)
+{
+    LOG_TRACE("loadComponents(filename=" << configFilename << ")");
+
+    // load the components tree in memory
+    xmlTree_->loadFile(configFilename);
+
+    {
+        // Load the plugins containing the components
+        QStringList plugins = xmlTree_->getAllPluginsNames();
+        Q_FOREACH (QString plugin, plugins) {
+            if (!loadPlugin(plugin)) {
+                LOG_WARN("cannot load plugin '" << plugin << "'");
+            } else {
+                LOG_INFO("successfully loaded plugin '" << plugin << "'");
+            }
+        }
+    }
+
+    QDomNodeList componentsNodeList = xmlTree_->getAllComponents();
+    XmlComponentConfig cfg;
+
+    // First, create all the components in the XML list
+    for (int i = 0; i < componentsNodeList.size(); ++i) {
+        cfg.localCopy(componentsNodeList.item(i).toElement());
+        QString componentType = cfg.getComponentType();
+        QString componentName = cfg.getComponentName();
+        LOG_DEBUG("try to create component '" << componentName << "'");
+
+        // create the component and automatically add it to the component manager list
+        if (!createComponent(componentType, componentName)) {
+            LOG_ERROR("cannot create component '" << componentName << "'");
+            continue;
+        }
+    }
+
+    int componentsToConfigureCount = componentMap_.count();
+
+    // Second, try to configure the components without regarding the dependencies
+    for (int i = 0; i < componentsNodeList.size(); ++i) {
+        cfg.localCopy(componentsNodeList.item(i).toElement());
+        QString componentName = cfg.getComponentName();
+        LOG_DEBUG("try to configure component '" << componentName << "'");
+
+        // copy locally the config parameters of the component
+        ComponentSharedPointer component = getComponent(componentName);
+        if (NULL == component) {
+            LOG_WARN("component '" << componentName << "' does not exist");
+            continue;
+        }
+
+        component->param.localCopy(cfg.getDomElement());
+        try {
+            component->parseParameters(cfg);
+            component->setConfigurationState(component->configureComponent(cfg));
+        } catch (PacpusException & e) {
+            LOG_ERROR("component '" << componentName << "' has thrown an exception");
+            LOG_ERROR(e.what());
+            component->setConfigurationState(ComponentBase::CONFIGURED_FAILED);
+        }
+    } // for
+
+    // Third, if some components requested a delayed configuration, retry
+    for (int i = 0, iend = componentsNodeList.size(); i < iend; ++i) {
+        cfg.localCopy(componentsNodeList.item(i).toElement());
+        QString componentName = cfg.getComponentName();
+
+        ComponentSharedPointer component = getComponent(componentName);
+        if (!component) {
+            LOG_WARN("component '" << componentName << "' does not exist");
+            continue;
+        }
+         
+        // add inputs and outputs
+        component->addInputs();
+        component->addOutputs();
+        // print inputs and outputs
+        LOG_INFO("Inputs for component '" << componentName << "':\n" << component->inputs().keys());
+        LOG_INFO("Outputs for component '" << componentName << "':\n" << component->outputs().keys());
+
+        if (ComponentBase::CONFIGURATION_DELAYED == component->configurationState()) {
+            LOG_DEBUG("try to configure component '" << componentName << "'");
+
+            // copy locally the config parameters of the component
+            component->param.localCopy(cfg.getDomElement());
+            component->setConfigurationState(component->configureComponent(cfg));
+        }
+
+        if (ComponentBase::CONFIGURED_OK == component->configurationState()) {
+            --componentsToConfigureCount;
+        } else {
+            LOG_ERROR("cannot configure component '" << componentName << "'"
+                        << ". Dependencies with other components are too complex"
+                        << ". It was not configured, please review your configuration and/or your component"
+                        );
+            component->setConfigurationState(ComponentBase::CONFIGURED_FAILED);
+        }
+    } // for
+
+    LOG_INFO(componentMap_.count() << " component(s) were loaded");
+    if (componentsToConfigureCount > 0) {
+        LOG_WARN(componentsToConfigureCount << " component(s) were not configured");
+    }
+
+    // Fourthly, create connections find in the XML list
+    QDomNodeList connectionsNodeList = xmlTree_->getAllConnections();
+
+    for (int i = 0, iend = connectionsNodeList.size(); i < iend; ++i) {
+        cfg.localCopy(connectionsNodeList.item(i).toElement());
+        QString connectionInput = cfg.getConnectionInput();
+        QString connectionOutput = cfg.getConnectionOutput();
+        QString connectionType = cfg.getConnectionType();
+        int connectionPriority = cfg.getConnectionPriority();
+
+        //TODO set connection mode from string
+
+        //InputInterfaceBase::GetLast;
+        //InputInterfaceBase::NeverSkip;
+        //InputInterfaceBase::TimeBounded;
+
+        if (!createConnection(connectionOutput, connectionInput, connectionType,connectionPriority)) {
+            LOG_ERROR("cannot create connection '" << connectionOutput + " => " + connectionInput << "'");
+            continue;
+        }
+    } // for
+
+    return componentMap_.count();
+}
+
+bool ComponentManager::start()
+{
+    LOG_TRACE("start()");
+
+    bool result = true;
+    for (ComponentMap::iterator it = componentMap_.begin(), itend = componentMap_.end(); it != itend; ++it) {
+        result &= start(it.key());
+    }
+
+    return result;
+}
+
+bool ComponentManager::start(QString const& componentName)
+{
+    LOG_TRACE("start(component=" << componentName << ")");
+
+    ComponentSharedPointer component = getComponent(componentName);
+    if (!component) {
+        LOG_WARN("cannot start component '" << componentName << "'.  It does not exist!");
+        return false;
+    }
+
+    if (ComponentBase::CONFIGURED_OK != component->configurationState()) {
+        LOG_WARN("cannot start component '" << componentName << "'.  It has not been configured properly!");
+        return false;
+    }
+
+    LOG_INFO("starting component '" << componentName << "'...");
+    if (!component->startComponent()) {
+        LOG_WARN("cannot start component '" << componentName << "'. It can already be started");
+    }
+    LOG_INFO("successfully started component '" << componentName << "'");
+    return true;
+}
+
+bool ComponentManager::stop()
+{
+    LOG_TRACE("stop()");
+
+    bool result = true;
+    for (ComponentMap::iterator it = componentMap_.begin(), itend = componentMap_.end(); it != itend; ++it) {
+        result &= stop(*it);
+    }
+
+    return result;
+}
+
+bool ComponentManager::stop(ComponentSharedPointer component) const
+{
+    if (!component) {
+        LOG_WARN("NULL component pointer");
+        return false;
+    }
+    if (!component->stopComponent()) {
+        return false;
+    }
+    return true;
+}
+
+bool ComponentManager::stop(QString const& componentName)
+{
+    LOG_TRACE("stop(component=" << componentName << ")");
+
+    ComponentSharedPointer component = getComponent(componentName);
+    if (!component) {
+        LOG_WARN("cannot stop component '" << componentName << "'" << ". It does not exist");
+        return false;
+    }
+
+    LOG_INFO("stopping component '" << componentName << "'...");
+    if (!stop(component)) {
+        LOG_WARN("cannot stop component '" << componentName << "'" << ". It can be already stopped");
+    }
+
+    return true;
+}
+
+ComponentSharedPointer ComponentManager::getComponent(QString const& name)
+{
+    LOG_TRACE("getComponent(name=" << name << ")");
+
+    ComponentMap::iterator it = componentMap_.find(name);
+    if (it != componentMap_.end()) {
+        return *it;
+    }
+
+    // FIXME: throw
+    LOG_WARN("cannot retrieve component '" << name << "'" << ". It does not exist");
+    return ComponentSharedPointer();
+}
+
+QStringList ComponentManager::getAllComponentsName() const
+{
+    LOG_TRACE("getAllComponentsName()");
+    return xmlTree_->getAllComponentsNames();
+}
Index: tags/0.2.3/src/PacpusLib/ConnectionBase.cpp
===================================================================
--- tags/0.2.3/src/PacpusLib/ConnectionBase.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/ConnectionBase.cpp	(revision 368)
@@ -0,0 +1,28 @@
+#include <Pacpus/kernel/ConnectionBase.h>
+
+using namespace pacpus;
+
+ConnectionBase::ConnectionBase(AbstractInterface * anInterface, int priority)
+    : m_interface(anInterface)
+    , m_priority(priority)
+{}
+
+ConnectionBase::~ConnectionBase()
+{}
+
+AbstractInterface * ConnectionBase::getInterface() const
+{
+    return m_interface;
+}
+
+int ConnectionBase::getPriority() const
+{
+    return m_priority;
+}
+
+bool ConnectionBase::operator==(ConnectionBase const & c)
+{
+    return getInterface() == c.getInterface()
+        && getPriority() == c.getPriority()
+    ;
+}
Index: tags/0.2.3/src/PacpusLib/ConnectionManager.cpp
===================================================================
--- tags/0.2.3/src/PacpusLib/ConnectionManager.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/ConnectionManager.cpp	(revision 368)
@@ -0,0 +1,77 @@
+#include  <Pacpus/kernel/ConnectionManager.h>
+#include  <Pacpus/kernel/Log.h>
+
+using namespace pacpus;
+
+DECLARE_STATIC_LOGGER("pacpus.core.ConnectionManager");
+
+ConnectionManager::ConnectionManager()
+{
+    LOG_TRACE("constructor");
+}
+
+ConnectionManager::~ConnectionManager()
+{
+    LOG_TRACE("destructor");
+}
+
+ConnectionManager * ConnectionManager::getInstance()
+{
+    LOG_TRACE("getInstance()");
+    LOG_TRACE("before:  mInstance = " << mInstance);
+
+    if (!mInstance)
+    {
+        LOG_INFO("creating new instance...");
+        mInstance = new ConnectionManager();
+        LOG_DEBUG("mInstance = " << mInstance);
+    }
+
+    LOG_TRACE("after:   mInstance = " << mInstance);
+    return mInstance;
+}
+
+//void ConnectionManager::LoadConnection()
+
+void ConnectionManager::setConnection()
+{
+    LOG_TRACE(Q_FUNC_INFO);
+
+    ComponentManager * mgr = ComponentManager::getInstance();
+
+    // TODO read XML file and build ConnectionList
+    QList<ConnectionDescriptor> ConnectionList;
+    ConnectionList.append(ConnectionDescriptor("testComponent1", "image", "testComponent2", "image", "type"));
+
+    ComponentBase * sender, * receiver;
+    InputInterfaceBase * in;
+    OutputInterfaceBase * out;
+
+    for (QList<ConnectionDescriptor>::iterator i = ConnectionList.begin(); i != ConnectionList.end(); ++i) {
+        // TODO Handle errors
+        sender = mgr->getComponent(i->_outputComponent);
+        out = sender->getOutput(i->_outputName);
+
+        receiver = mgr->getComponent(i->_inputComponent);
+        in = receiver->getInput(i->_inputName);
+
+        //connect(out,SIGNAL(),in,SLOT());  // TODO make connection
+
+        LOG_INFO(" Output " << "out" << " connected to " << "in") // TODO replace out / in
+    }
+
+//    CledComponent * cledComponent = (CledComponent*) m_component[cName];
+
+//    InputInterface<ScanAlascaData> * in1 = static_cast<InputInterface<ScanAlascaData> *> (cledComponent->input.at(0));
+//    OutputInterface<ScanAlascaData> * out1 = static_cast<OutputInterface<ScanAlascaData> *> (cledComponent->output.at(0));
+
+//    if(in1->getDataType() != out1->getDataType())
+//        LOG_ERROR("Connection  Error: Incomaptible dataType between " << cledComponent->getName() << " and " << cledComponent->getName());
+
+
+//    PacpusBuffer * buffer = new PacpusBuffer(5,in1->getDataSize());
+//    LOG_INFO("Device opened:" << buffer->open(QIODevice::ReadWrite));
+
+//    in1->setConnection(buffer,true);
+//    out1->setConnection(buffer,true);
+}
Index: tags/0.2.3/src/PacpusLib/InputOutputBase.cpp
===================================================================
--- tags/0.2.3/src/PacpusLib/InputOutputBase.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/InputOutputBase.cpp	(revision 368)
@@ -0,0 +1,151 @@
+#include <Pacpus/kernel/InputOutputBase.h>
+
+#include <Pacpus/kernel/ComponentBase.h>
+#include <Pacpus/kernel/ConnectionBase.h>
+#include <Pacpus/kernel/InputOutputInterface.h>
+#include <Pacpus/kernel/Log.h>
+
+using namespace pacpus;
+
+DECLARE_STATIC_LOGGER("pacpus.core.InputOutputInterface");
+
+////////////////////////////////////////////////////////////////////////////////
+
+AbstractInterface::AbstractInterface(QString name, ComponentBase * component, QObject * parent)
+    : m_name(name)
+    , m_component(component)
+    , QObject(parent)
+{
+    LOG_DEBUG("constructing abstract connection '" << getName() << "'");
+}
+
+AbstractInterface::~AbstractInterface()
+{
+}
+
+QString AbstractInterface::getSignature() const
+{
+    return getComponent()->getName() + '.' + getName();
+}
+
+QString AbstractInterface::getName() const
+{
+    return m_name;
+}
+
+QList<ConnectionBase> & AbstractInterface::connections()
+{
+    return m_connections;
+}
+
+const QList<ConnectionBase> & AbstractInterface::getConnections() const
+{
+    return m_connections;
+}
+
+ComponentBase * AbstractInterface::component()
+{
+    return m_component;
+}
+
+const ComponentBase * AbstractInterface::getComponent() const
+{
+    return m_component;
+}
+
+void AbstractInterface::addConnection(ConnectionBase connection)
+{
+    m_connections.append(connection);
+}
+
+bool AbstractInterface::removeConnection(ConnectionBase connection)
+{
+    return m_connections.removeOne(connection);
+}
+
+bool AbstractInterface::hasConnection()
+{
+    return m_connections.size() > 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+InputInterfaceBase::InputInterfaceBase(QString name, ComponentBase * component, QObject * parent)
+    : AbstractInterface(name, component, parent)
+{
+}
+
+InputInterfaceBase::~InputInterfaceBase()
+{
+}
+
+// TODO for serialization prupose (not yet implemented !!!)
+void InputInterfaceBase::customEvent(QEvent* e)
+{
+    //if (event->type())
+    //TODO get event Type anf call callback function
+
+    PacpusEvent * event = dynamic_cast<PacpusEvent *>(e);
+    QByteArray buf;
+    QDataStream out(&buf, QIODevice::WriteOnly);
+    event->streamOut(out);
+    // Callback QByteArray
+}
+
+InputInterfaceBase::ReadingMode & InputInterfaceBase::readingMode()
+{
+    return m_readingMode;
+}
+
+const InputInterfaceBase::ReadingMode & InputInterfaceBase::getReadingMode() const
+{
+    return m_readingMode;
+}
+
+void InputInterfaceBase::setReadingMode(ReadingMode mode)
+{
+    m_readingMode = mode;
+}
+
+PacpusEvent * InputInterfaceBase::getEventTemplate()
+{
+    // TODO: check
+    return new PacpusEvent(GENERIC_EVENT);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+QStringList OutputInterfaceBase::getInputConnectedList()
+{
+    QStringList list;
+    for (QList<ConnectionBase>::iterator it = connections().begin(); it != connections().end(); ++it) {
+        list.append(it->getInterface()->getName());
+    }
+    return list;
+}
+
+// TODO for serialization purpose (not yet implemented !!!)
+//void OutputInterfaceBase::send(/*const*/ QByteArray & data)
+//{
+//    // TODO check at least one Typed connection
+//
+//    for (QList<ConnectionBase>::iterator it = connections().begin(), itend = connections().end(); it != itend; ++it) {
+//            QDataStream in(&data, QIODevice::ReadOnly);
+//            InputInterfaceBase * interfaceBase
+//                = dynamic_cast<InputInterfaceBase *>(connections().at(0).getInterface());
+//            //AbstractInterface * interfaceBase = connections().at(0).getInterface();
+//            if (!interfaceBase) {
+//                continue;
+//            }
+//            PacpusEvent * event = interfaceBase->getEventTemplate();
+//            if (!event) {
+//                continue;
+//            }
+//            event->streamIn(in);
+//            QCoreApplication::postEvent(
+//                it->getInterface(),
+//                event,
+//                it->getPriority()
+//            );
+//    }
+//}
Index: tags/0.2.3/src/PacpusLib/Log.cpp
===================================================================
--- tags/0.2.3/src/PacpusLib/Log.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/Log.cpp	(revision 368)
@@ -0,0 +1,211 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version    $Id: Log.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include <Pacpus/kernel/Log.h>
+
+#if defined(PACPUS_USE_LOG)
+
+#if defined(PACPUS_LOG_COLORED_OUTPUT)
+#   include "ColorSeverityFormatter.hpp"
+#endif
+
+#include <boost/log/detail/date_time_format_parser.hpp>
+#include <boost/log/expressions.hpp>
+#include <boost/log/expressions/formatters/if.hpp>
+#include <boost/log/sinks/text_file_backend.hpp>
+#include <boost/log/sinks/text_ostream_backend.hpp>
+#include <boost/log/sources/severity_logger.hpp>
+#include <boost/log/support/date_time.hpp>
+#include <boost/log/utility/setup/common_attributes.hpp>
+#include <boost/log/utility/setup/file.hpp>
+#include <boost/log/utility/setup/formatter_parser.hpp>
+#if BOOST_VERSION >= 105500 // header exists from 1.55
+#   include <boost/utility/empty_deleter.hpp>
+#else
+#   include <boost/log/utility/empty_deleter.hpp>
+#endif
+#include <ostream>
+#include <QString>
+
+//template <typename CharT>
+//PACPUSLIB_API std::basic_ostream<CharT>& operator<< (std::basic_ostream<CharT>& strm, QString const& s)
+//{
+//    strm << s.toLocal8Bit().data();
+//    return strm;
+//}
+
+// specialization for char
+template <>
+PACPUSLIB_API std::basic_ostream<char>& operator<< (std::basic_ostream<char>& strm, QString const& s)
+{
+    strm << s.toStdString();
+    return strm;
+}
+
+// specialization for wchar_t
+template <>
+PACPUSLIB_API std::basic_ostream<wchar_t>& operator<< (std::basic_ostream<wchar_t>& strm, QString const& s)
+{
+    strm << s.toStdWString();
+    return strm;
+}
+
+namespace pacpus
+{
+
+BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", ::pacpus::SeverityLevel)
+
+void init_log_factories()
+{
+    boost::log::register_simple_formatter_factory< QString, char >("QString");
+}
+
+static int niftyCounter;
+
+LogConfigurator::LogConfigurator()
+{
+    if (0 == niftyCounter++) {
+        LOG_INFO("LogConfigurator constructor");
+        init_log_factories();
+    }
+}
+
+LogConfigurator::~LogConfigurator()
+{
+    if (0 == --niftyCounter) {
+        // clean up
+        LOG_INFO("LogConfigurator destructor");
+    }
+}
+
+void LogConfigurator::configureLoggerWithFile(const char* logFileName)
+{
+    using namespace boost;
+
+    namespace logging = boost::log;
+    namespace sinks = boost::log::sinks;
+    namespace src = boost::log::sources;
+    namespace expr = boost::log::expressions;
+    namespace attrs = boost::log::attributes;
+    namespace keywords = boost::log::keywords;
+    
+    logging::add_common_attributes();
+    logging::core::get()->add_global_attribute(
+        "ProcessID",
+        attrs::current_process_id());
+    logging::core::get()->add_global_attribute(
+        "ThreadID",
+        attrs::current_thread_id());
+    //logging::core::get()->add_global_attribute(
+    //    "Scope",
+    //    attrs::named_scope());
+
+    logging::core::get()->set_filter
+    (
+#ifdef NDEBUG
+        // release
+        severity >= debug
+#else
+        // debug
+        severity >= trace
+#endif
+    );
+
+    ////////////////////////////////////////////////////////////////////////////////
+    // FILE
+    logging::add_file_log
+    (
+        keywords::file_name = logFileName,
+        keywords::rotation_size = 10 * 1024 * 1024,
+        keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
+        //keywords::format = "%LineID% [%TimeStamp%]: %Message%"
+        keywords::format =
+        (
+            expr::stream
+                << std::setfill('0') << std::setw(6) << expr::attr< unsigned int >("LineID")
+                //<< " [" << expr::format_date_time< posix_time::ptime >("TimeStamp", date_time::iso_extended_format) << "]"
+                << " [" << boost::log::expressions::format_date_time< posix_time::ptime >("TimeStamp", "%Y-%m-%d %T.%f") << "]"
+                //<< " [" << std::setw(20) << expr::attr<std::string>("Scope") << ">"
+                << " <" << severity << ">"
+                << " <" << expr::attr< attrs::current_process_id::value_type >("ProcessID")
+                << ":" << expr::attr< attrs::current_thread_id::value_type >("ThreadID") << ">"
+                << " " << expr::smessage
+        )
+    );
+    
+    ////////////////////////////////////////////////////////////////////////////////
+    // CONSOLE
+    // Create a backend and attach a couple of streams to it
+#if ! (BOOST_VERSION >= 105500)
+    using logging::empty_deleter;
+#endif
+    boost::shared_ptr< sinks::text_ostream_backend > backend =
+        make_shared< sinks::text_ostream_backend >();
+    backend->add_stream(
+        shared_ptr< std::ostream >(&std::clog, empty_deleter())
+    );
+
+    // Enable auto-flushing after each log record written
+    backend->auto_flush(true);
+
+    // Wrap it into the frontend and register in the core.
+    // The backend requires synchronization in the frontend.
+    typedef sinks::synchronous_sink< sinks::text_ostream_backend > sink_t;
+    shared_ptr< sink_t > sink(new sink_t(backend));
+    sink->set_filter
+    (
+#ifdef NDEBUG
+        // release
+        severity >= info
+#else
+        // debug
+        severity >= debug
+#endif
+    );
+
+    sink->set_formatter
+    (
+        expr::stream
+#if defined(PACPUS_LOG_COLORED_OUTPUT)
+            << formatSeverityWithColors< SeverityLevel >("Severity")
+#endif
+            << std::setfill('0') << std::setw(6) << expr::attr< unsigned int >("LineID")
+            //<< " [" << expr::format_date_time< posix_time::ptime >("TimeStamp", date_time::iso_extended_format) << "] "
+            << " [" << expr::format_date_time< posix_time::ptime >("TimeStamp", "%Y-%m-%d %T.%f") << "] "
+            //<< " [" << std::setw(20) << expr::attr<std::string>("Scope") << ">"
+            << "<" << severity << ">"
+            << " "
+            << expr::smessage
+#if defined(PACPUS_LOG_COLORED_OUTPUT)
+            << formatSeverityWithColors< SeverityLevel >("Severity", /*restoreDefault=*/ true) // Resets the terminal to default.
+#endif
+    );
+
+    logging::core::get()->add_sink(sink);
+
+    LOG_INFO("logger initialised");
+}
+
+} // namespace pacpus
+
+#else // PACPUS_USE_LOG
+
+namespace pacpus
+{
+
+    LogConfigurator::LogConfigurator()
+    {}
+
+    LogConfigurator::~LogConfigurator()
+    {}
+
+    void LogConfigurator::configureLoggerWithFile(const char* /*configFilename*/)
+    {}
+
+} // namespace pacpus
+
+#endif // PACPUS_USE_LOG
+
Index: tags/0.2.3/src/PacpusLib/PacpusApplication.cpp
===================================================================
--- tags/0.2.3/src/PacpusLib/PacpusApplication.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/PacpusApplication.cpp	(revision 368)
@@ -0,0 +1,130 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    March, 2013
+/// @version $Id$
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+
+#include <boost/exception/diagnostic_information.hpp>
+#include <boost/exception/exception.hpp>
+#include <csignal>
+#include <Pacpus/kernel/Log.h>
+#include <Pacpus/kernel/PacpusApplication.h>
+#include <Pacpus/kernel/PacpusException.h>
+#include <sstream>
+#include <string>
+
+using namespace pacpus;
+
+DECLARE_STATIC_LOGGER("pacpus.core.PacpusApplication");
+
+PacpusApplication::PacpusApplication(int& argc, char** argv
+#ifndef Q_QDOC
+                                     , int _internal
+#endif
+                                     )
+    : QApplication(argc, argv, _internal)
+{
+    //installSignalHandler();
+}
+
+//PacpusApplication::PacpusApplication(int& argc, char** argv, bool GUIenabled
+//#ifndef Q_QDOC
+//                                    , int _internal
+//#endif
+//                                    )
+//    : QApplication(argc, argv, GUIenabled, _internal)
+//{
+//}
+
+//PacpusApplication::PacpusApplication(int& argc, char** argv, Type type
+//#ifndef Q_QDOC
+//                                    , int _internal
+//#endif
+//                                    )
+//    : QApplication(argc, argv, type, _internal)
+//{
+//}
+
+#if defined(Q_WS_X11)
+PacpusApplication::PacpusApplication(Display* display, Qt::HANDLE visual, Qt::HANDLE colormap
+#ifndef Q_QDOC
+                                     , int _internal
+#endif
+                                     )
+    : QApplication(display, visual, colormap, _internal)
+{
+}
+
+PacpusApplication::PacpusApplication(Display* display, int& argc, char** argv, Qt::HANDLE visual, Qt::HANDLE colormap
+#ifndef Q_QDOC
+                                     , int _internal
+#endif
+                                     )
+    : QApplication(display, argc, argv, visual, colormap, _internal)
+{
+}
+#endif
+
+#if defined(Q_OS_SYMBIAN)
+PacpusApplication::PacpusApplication(QApplication::QS60MainApplicationFactory factory, int& argc, char** argv
+#ifndef Q_QDOC
+                                     , int _internal
+#endif
+                                     )
+    : QApplication(factory, argc, argv, _internal)
+{
+}
+#endif
+
+PacpusApplication::~PacpusApplication()
+{
+}
+
+bool PacpusApplication::notify(QObject* receiver, QEvent* ev)
+{
+    try {
+        return QApplication::notify(receiver, ev);
+    } catch (PacpusException& e) {
+        (void)e; // unused
+        LOG_ERROR("PacpusException caught:" << e.what() << "\n" << boost::diagnostic_information(e));
+    } catch (boost::exception& e) {
+        (void)e; // unused
+        LOG_ERROR("boost::exception caught:" << boost::diagnostic_information(e));
+    } catch (std::exception& e) {
+        (void)e; // unused
+        LOG_ERROR("std::exception caught:" << e.what());
+    }
+    return false;
+}
+
+void signalHandler(int signal);
+
+void PacpusApplication::installSignalHandler()
+{
+    LOG_INFO("installing signal handler...");
+
+    typedef void (*SignalHandlerType)(int);
+
+    //std::signal(SIGABRT, &signalHandler);
+    //std::signal(SIGFPE, &signalHandler);
+    //std::signal(SIGILL, &signalHandler);
+    std::signal(SIGINT, &signalHandler); // interrupt (CTRL-C)
+    //std::signal(SIGSEGV, &signalHandler);
+    //std::signal(SIGTERM, &signalHandler);
+
+    LOG_INFO("successfully installed signal handler");
+}
+
+void signalHandler(int signal)
+{
+    LOG_FATAL("signal received: sig = " << signal);
+    std::stringstream errorMessage;
+    errorMessage << "received signal number " << signal;
+    BOOST_THROW_EXCEPTION(PacpusException(errorMessage.str())
+        << errinfo_signal(signal)
+    );
+}
Index: tags/0.2.3/src/PacpusLib/PacpusException.cpp
===================================================================
--- tags/0.2.3/src/PacpusLib/PacpusException.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/PacpusException.cpp	(revision 368)
@@ -0,0 +1,24 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @version    $Id$
+
+#include <Pacpus/kernel/PacpusException.h>
+
+using namespace pacpus;
+
+PacpusException::PacpusException(char const* what)
+    : std::runtime_error(what)
+{
+}
+
+PacpusException::PacpusException(std::string const& what)
+    : std::runtime_error(what)
+{
+}
+
+PacpusException::~PacpusException() throw()
+{
+}
Index: tags/0.2.3/src/PacpusLib/XmlComponentConfig.cpp
===================================================================
--- tags/0.2.3/src/PacpusLib/XmlComponentConfig.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/XmlComponentConfig.cpp	(revision 368)
@@ -0,0 +1,166 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version    $Id: XmlComponentConfig.cpp 79 2013-01-14 08:52:06Z kurdejma $
+
+#include <Pacpus/kernel/XmlComponentConfig.h>
+#include <Pacpus/kernel/Log.h>
+#include <Pacpus/kernel/XmlConfigFile.h>
+#include <QDomNamedNodeMap>
+
+using namespace pacpus;
+using namespace std;
+
+DECLARE_STATIC_LOGGER("pacpus.core.XmlComponentConfig");
+
+static const char* kPropertyComponentName = "name";
+static const char* kPropertyComponentType = "type";
+static const char* kPropertyConnectionType = "type";
+static const char* kPropertyConnectionInput = "input";
+static const char* kPropertyConnectionOutput = "output";
+static const char* kPropertyConnectionPriority = "priority";
+
+XmlComponentConfig::XmlComponentConfig(QString const& name)
+{
+    LOG_TRACE("XmlComponentConfig(QString)");
+
+    // Get the pointer to the document and create the component.
+    parentDocument_ = XmlConfigFile::create();
+    if (name != QString::null)
+      component_ = parentDocument_->createComponent(name);
+}
+
+/// Destructor.
+XmlComponentConfig::~XmlComponentConfig()
+{
+    LOG_TRACE("~XmlComponentConfig()");
+}
+
+QDomNamedNodeMap XmlComponentConfig::getProperties() const
+{
+    return component_.attributes();
+}
+
+void XmlComponentConfig::addProperty(QString const& name)
+{
+    if (hasProperty(name)) {
+        LOG_ERROR("cannot add component property:"
+                  << " component '" << component_.attribute(kPropertyComponentName) << "'"
+                  << " already contains property '" << name << "'"
+                  << " and its value is '" << component_.attribute(name) << "'"
+                  );
+        return;
+    }
+
+    // The property does not exist, it can be added.
+    component_.setAttribute(name, 0);
+    LOG_INFO("property '" << name << "'"
+              << " was added to the component " << component_.attribute(kPropertyComponentName) << "'"
+              << " and set to '" << component_.attribute(name) << "'"
+              );
+}
+
+int XmlComponentConfig::delProperty(QString const& name)
+{
+    if (!hasProperty(name)) {
+        LOG_WARN("cannot delete compoenent property '" << name << "'"
+                 << " of component '" << component_.attribute(kPropertyComponentName) << "'"
+                 << ". Component does not contain this property."
+                 );
+        return false;
+    }
+
+    // The property exists, it can be removed.
+    component_.removeAttribute(name);
+    LOG_INFO("property '" << name << "' "
+      << " of component '" << component_.attribute(kPropertyComponentName) << "'"
+      << " was deleted"
+      );
+
+    return true;
+}
+
+QString XmlComponentConfig::getProperty(QString const& name, QString const& defaultValue) const
+{
+    if (!hasProperty(name))
+    {
+        LOG_WARN("cannot retrieve component property '" << name << "'"
+                 << " of component '" << component_.attribute(kPropertyComponentName) << "'"
+                 << ". Component does not contain this property."
+                 );
+        return defaultValue;
+    }
+
+    // The property exists, the value can be retrieved.
+    return component_.attribute(name);
+}
+
+bool XmlComponentConfig::getBoolProperty(QString const& name, bool defaultValue) const
+{
+  return hasProperty(name) ? getProperty(name) == "true" : defaultValue;
+}
+
+int XmlComponentConfig::getIntProperty(QString const& name, int defaultValue) const
+{
+  return hasProperty(name) ? getProperty(name).toInt() : defaultValue;
+}
+
+double XmlComponentConfig::getDoubleProperty(QString const& name, double defaultValue) const
+{
+  return hasProperty(name) ? getProperty(name).toDouble() : defaultValue;
+}
+
+void XmlComponentConfig::setProperty(QString const& name, QString const& value)
+{
+    component_.setAttribute(name, value);
+    LOG_INFO("property " << name
+             << " of the component " << component_.attribute(kPropertyComponentName)
+             << " was set to : " << value
+             );
+}
+
+bool XmlComponentConfig::hasProperty(QString const& name) const
+{
+    return component_.hasAttribute(name);
+}
+
+QDomElement const& XmlComponentConfig::getDomElement() const
+{
+    return component_;
+}
+
+void XmlComponentConfig::localCopy(const QDomElement& elementToCopy)
+{
+    component_ = elementToCopy;
+}
+
+QString const XmlComponentConfig::getComponentName() const
+{
+    return getProperty(kPropertyComponentName);
+}
+
+QString const XmlComponentConfig::getComponentType() const
+{
+    return getProperty(kPropertyComponentType);
+}
+
+QString const XmlComponentConfig::getConnectionType() const
+{
+    return getProperty(kPropertyConnectionType);
+}
+
+QString const XmlComponentConfig::getConnectionInput() const
+{
+    return getProperty(kPropertyConnectionInput);
+}
+
+QString const XmlComponentConfig::getConnectionOutput() const
+{
+    return getProperty(kPropertyConnectionOutput);
+}
+
+int const XmlComponentConfig::getConnectionPriority() const
+{
+    return getIntProperty(kPropertyConnectionPriority, /*defaultValue=*/0);
+}
Index: tags/0.2.3/src/PacpusLib/XmlConfigFile.cpp
===================================================================
--- tags/0.2.3/src/PacpusLib/XmlConfigFile.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusLib/XmlConfigFile.cpp	(revision 368)
@@ -0,0 +1,354 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @version    $Id: XmlConfigFile.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include <Pacpus/kernel/XmlConfigFile.h>
+
+#include <Pacpus/kernel/Log.h>
+#include <Pacpus/kernel/PacpusException.h>
+
+#include <cassert>
+#include <QFile>
+#include <QTextStream>
+
+////////////////////////////////////////////////////////////////////////////////
+
+using namespace pacpus;
+using namespace std;
+
+DECLARE_STATIC_LOGGER("pacpus.core.XmlConfigFile");
+
+XmlConfigFile * XmlConfigFile::m_xmlConfigFile = NULL;
+
+static const char * kXmlConfigFilename = "pacpus_config.xml";
+
+static const char * kRootSection = "pacpus";
+
+static const char * kComponentSection = "components";
+static const char * kConnectionSection = "connections";
+static const char * kParameterSection = "parameters";
+static const char * kPluginSection = "plugins";
+
+static const char * kComponentNode = "component";
+static const char * kConnectionNode = "connection";
+static const char * kParameterNode = "parameter";
+static const char * kPluginNode = "plugin";
+
+static const char * kNameAttribute = "name"; // <component name="MyComponent1" type="MyComponentType"/>
+static const char * kLibAttribute = "lib"; // <plugin lib="MyLibrary.dll"/>
+static const char * kExtensionAttribute = "extension"; // <parameter extension=".dll">
+static const char * kPrefixAttribute = "prefix"; // <parameter prefix="lib">
+static const char * kPostfixAttribute = "postfix"; // <parameter postfix="_d">
+
+////////////////////////////////////////////////////////////////////////////////
+// helper method
+QDomNode getNamedItemFromDomDocument(const QDomDocument & document, const char * itemName);
+
+////////////////////////////////////////////////////////////////////////////////
+
+// CTOR/DTOR
+XmlConfigFile::XmlConfigFile()
+    : m_numberOfComponents(0)
+{
+    LOG_TRACE("constructor");
+
+    // create the root of the XML tree
+    m_document.appendChild(m_document.createElement(kRootSection));
+    // create the sections
+    m_document.documentElement().appendChild(m_document.createElement(kParameterSection));
+    m_document.documentElement().appendChild(m_document.createElement(kPluginSection));
+    m_document.documentElement().appendChild(m_document.createElement(kComponentSection));
+    m_document.documentElement().appendChild(m_document.createElement(kConnectionSection));
+    m_file.setFileName(kXmlConfigFilename);
+    bool isOpenedSuccessfully = m_file.open(QIODevice::ReadWrite); // FIXME: ReadOnly ?
+    if (isOpenedSuccessfully) {
+        LOG_INFO("XML document " << kXmlConfigFilename << " was created");
+    } else {
+        LOG_ERROR("cannot open XML document " << kXmlConfigFilename);
+        BOOST_THROW_EXCEPTION(PacpusException("cannot open XML document file"));
+    }
+}
+
+XmlConfigFile::~XmlConfigFile()
+{
+    LOG_TRACE("destructor");
+}
+
+// CREATE/DESTROY
+XmlConfigFile * XmlConfigFile::create()
+{
+    if (NULL ==m_xmlConfigFile) {
+        m_xmlConfigFile = new XmlConfigFile();
+    }
+    return m_xmlConfigFile;
+}
+
+void XmlConfigFile::destroy()
+{
+    delete m_xmlConfigFile;
+    m_xmlConfigFile = NULL;
+}
+
+// COMPONENTS ADD/REMOVE/CREATE
+void XmlConfigFile::addComponent(QDomElement component)
+{ 
+    QMutexLocker mutexLocker(&m_mutex); // locks mutex, unlocks it in destructor
+    (void) mutexLocker; // unused
+
+    // TODO: change .tagName => .attribute(kPropertyComponentName)
+    QDomNode componentSectionNode = getNamedItemFromDomDocument(m_document, kComponentSection);
+    if (componentSectionNode.namedItem(component.attribute(kNameAttribute)/*.tagName()*/).isNull()) {
+        LOG_WARN("component " << component.attribute(kNameAttribute)/*tagName()*/ << " exists already in the document");
+    } else {
+        QDomNode node = getNamedItemFromDomDocument(m_document, kComponentSection).appendChild(component);
+        ++m_numberOfComponents;
+        LOG_INFO("component " << node.nodeName() << " has been added to the section "
+            << getNamedItemFromDomDocument(m_document, kComponentSection).nodeName());
+    }
+}
+
+void XmlConfigFile::delComponent(QDomElement component)
+{
+    removeComponent(component);
+}
+
+void XmlConfigFile::removeComponent(QDomElement component)
+{
+    QMutexLocker mutexLocker(&m_mutex); // locks mutex, unlocks it in destructor
+    (void) mutexLocker; // unused
+
+    QDomNode node = getNamedItemFromDomDocument(m_document, kComponentSection).removeChild(component);
+    if (node.isNull()) {
+        LOG_WARN("component " << component.attribute(kNameAttribute)/*tagName()*/ << " doesn't exist in the document.");
+    } else {
+        LOG_INFO("component " << node.nodeName() << " has been removed from the section "
+            << getNamedItemFromDomDocument(m_document, kComponentSection).nodeName());
+        --m_numberOfComponents;
+    }
+}
+
+QDomElement XmlConfigFile::createComponent(QString name)
+{
+    LOG_DEBUG("creating component " << name);
+
+    QMutexLocker mutexLocker(&m_mutex); // locks mutex, unlocks it in destructor
+    (void) mutexLocker; // unused
+    return m_document.createElement(name);
+}
+
+// FILE I/O
+void XmlConfigFile::saveFile(QString fileName)
+{
+    QMutexLocker mutexLocker(&m_mutex);
+    (void) mutexLocker; // unused
+
+    m_file.close();
+    assert(!m_file.isOpen());
+    m_file.setFileName(fileName);
+    {
+        // open file
+        bool isOpenedSuccessfully = m_file.open(QIODevice::WriteOnly);
+        if (!isOpenedSuccessfully) {
+            LOG_ERROR("cannot open file '" << m_file.fileName() << "' for writing");
+            return;
+        }
+        QTextStream ts(&m_file);
+        ts << "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
+        ts << m_document.toString();
+        m_file.close();
+    }
+    LOG_DEBUG("file \"" << m_file.fileName() << "\" has been saved");
+}
+
+int XmlConfigFile::loadFile(QString fileName)
+{
+    // lock access
+    QMutexLocker mutexLocker(&m_mutex);
+    (void) mutexLocker; // unused
+
+    // check if there are components already
+    if (0 != m_numberOfComponents) {
+        LOG_WARN("XML document contained " << m_numberOfComponents << " components that will be lost!");
+    }
+
+    m_file.close();
+    assert(!m_file.isOpen());
+    m_file.setFileName(fileName);
+    {
+        // open file
+        bool isOpenedSuccessfully = m_file.open(QIODevice::ReadOnly);
+        if (!isOpenedSuccessfully) {
+            LOG_ERROR("cannot open file '" << m_file.fileName() << "' for reading");
+            return 0;
+        }
+        // read and parse input XML file
+        QString errorMsg;
+        int errorLine = 0;
+        int errorColumn = 0;
+        if (!m_document.setContent(&m_file, /*namespaceProcessing=*/true, &errorMsg, &errorLine, &errorColumn)) {
+            LOG_ERROR("cannot parse XML file " << m_file.fileName());
+			LOG_ERROR(errorMsg.toStdString() << " at " << errorLine << ":" << errorColumn << " (line:col)"); 
+            m_file.close();
+            return 0;
+        }
+        // close file
+        m_file.close();
+    }
+
+    // get the number of components in the loaded tree
+    m_numberOfComponents = getAllComponents().count();
+
+    LOG_INFO("XML file \"" << m_file.fileName() << "\" has been loaded. Number of components = " << m_numberOfComponents);
+    LOG_DEBUG("XML file content:\n"
+        << "BEGIN============================================================================\n"
+        << m_document.toString()
+        << "END==============================================================================\n"
+        );
+
+    return m_numberOfComponents;
+}
+
+// XML
+QDomElement XmlConfigFile::getSection(const char * name) const
+{
+    QDomElement sectionElement = getNamedItemFromDomDocument(m_document, name).toElement();
+    if (sectionElement.isNull()) {
+        LOG_WARN("there is no '" << name << "' section in the XML");
+        return QDomElement();
+    }
+    return sectionElement;
+}
+
+QDomNodeList XmlConfigFile::getNodesInSection(const char * sectionName, const char * nodeName) const
+{
+    QDomElement sectionElement = getSection(sectionName);
+    return sectionElement.elementsByTagName(nodeName);
+}
+
+// COMPONENTS
+QDomNodeList XmlConfigFile::getAllComponents() const
+{
+    return getNodesInSection(kComponentSection, kComponentNode);
+}
+
+QStringList XmlConfigFile::getAllComponentsNames() const
+{
+    // get component nodes
+    QDomNodeList componentNodes = getAllComponents();
+    // get component names
+    QStringList componentNameList;
+    for (int i = 0; i < componentNodes.size(); ++i) {
+        QDomElement componentElement = componentNodes.at(i).toElement();
+        componentNameList.append(componentElement.attribute(kNameAttribute));
+    }
+    return componentNameList;
+}
+
+QDomElement XmlConfigFile::getComponent(QString componentName) const
+{
+    LOG_DEBUG("getting component " << componentName);
+
+    QDomNodeList componentNodes = getAllComponents();
+    for (int i = 0; i < componentNodes.size(); ++i) {
+        QDomElement componentElement = componentNodes.at(i).toElement();
+        if (componentName == componentElement.attribute(kNameAttribute)) {
+            return componentElement;
+        }
+    }
+    LOG_WARN("cannot get component " << componentName << ": document does not contain a component with this name");
+
+    return QDomElement();
+} 
+
+// CONNECTIONS
+QDomNodeList XmlConfigFile::getAllConnections() const
+{
+    return getNodesInSection(kConnectionSection, kConnectionNode);
+}
+
+QDomElement XmlConfigFile::getConnection(QString name) const
+{
+    LOG_DEBUG("getting connection " << name);
+
+    QDomNodeList connectionNodes = getAllConnections();
+    for (int i = 0; i < connectionNodes.size(); ++i) {
+        QDomElement connectionElement = connectionNodes.at(i).toElement();
+        // TODO: name by attribute 'name'
+        if (name == connectionElement.attribute(kNameAttribute)) {
+            return connectionElement;
+        }
+    }
+    LOG_WARN("cannot get connection " << name << ": document does not contain a connection with this name");
+
+    return QDomElement();
+}
+
+// PARAMETERS
+QDomNodeList XmlConfigFile::getAllParameters() const
+{
+    return getNodesInSection(kParameterSection, kParameterNode);
+}
+
+// PLUGINS
+QDomNodeList XmlConfigFile::getAllPlugins()
+{
+    // get section
+    QDomElement pluginsElement = getSection(kPluginSection);
+
+    // get attributes
+    m_libraryExtension = pluginsElement.attribute(kExtensionAttribute);
+    if (!m_libraryExtension.isEmpty()) {
+        // prefix with a dot '.' if there is no one
+        if ('.' != m_libraryExtension.at(0)) {
+            m_libraryExtension = '.' + m_libraryExtension;
+        }
+    }
+    m_libraryPrefix = pluginsElement.attribute(kPrefixAttribute);
+    m_libraryPostfix = pluginsElement.attribute(kPostfixAttribute);
+    
+    // get nodes
+    return getNodesInSection(kPluginSection, kPluginNode);
+}
+
+QStringList XmlConfigFile::getAllPluginsNames()
+{
+    QDomNodeList pluginList = getAllPlugins();
+    if (0 == pluginList.size()) {
+        LOG_ERROR("no plugins were specified");
+        return QStringList();
+    }
+    LOG_INFO("there are " << pluginList.size() << " plugins");
+
+    // get plugin library paths
+    QStringList pluginLibraryNames;
+    for (int i = 0; i < pluginList.size(); ++i) {
+        QDomElement pluginElement = pluginList.at(i).toElement();
+        QString libraryFileName = libraryPrefix() + pluginElement.attribute(kLibAttribute) + libraryPostfix() + libraryExtension();
+        pluginLibraryNames.append(libraryFileName);
+    }
+    return pluginLibraryNames;
+}
+
+QString XmlConfigFile::libraryExtension() const
+{
+    return m_libraryExtension;
+}
+
+QString XmlConfigFile::libraryPrefix() const
+{
+    return m_libraryPrefix;
+}
+
+QString XmlConfigFile::libraryPostfix() const
+{
+    return m_libraryPostfix;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// HELPER METHODS
+QDomNode getNamedItemFromDomDocument(const QDomDocument & document, const char * itemName)
+{
+    return document.documentElement().namedItem(itemName);
+}
Index: tags/0.2.3/src/PacpusSensor/CMakeLists.txt
===================================================================
--- tags/0.2.3/src/PacpusSensor/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/src/PacpusSensor/CMakeLists.txt	(revision 368)
@@ -0,0 +1,108 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+project(PacpusSensor)
+
+# ========================================
+# Compiler definitions
+# ========================================
+add_definitions(
+	${QT_DEFINITIONS}
+)
+
+# ========================================
+# Include directories
+# ========================================
+include_directories(
+	${PROJECT_BINARY_DIR}
+	${QT_INCLUDE_DIR}
+)
+# ========================================
+# Link directories
+# ========================================
+link_directories(
+	${PROJECT_BINARY_DIR}/../PacpusLib
+	${PROJECT_BINARY_DIR}/../FileLib
+	${PROJECT_BINARY_DIR}/../RoadTime
+)
+
+# ========================================
+# List of sources
+# ========================================
+set(
+	PROJECT_SRCS
+	src/ui/pacpusmainwindow.cpp
+	src/ui/pacpusmainwindow.h
+	src/main.cpp
+)
+
+# ========================================
+# Qt4 stuff
+# ========================================
+set(SENSOR_UI_CLASSES src/ui/pacpusmainwindow.ui)
+set(SENSOR_MOC_CLASSES src/ui/pacpusmainwindow.h)
+
+qt_wrap_ui(SENSOR_UI_SOURCES_H ${SENSOR_UI_CLASSES})
+qt_wrap_cpp(SENSOR_MOC_SOURCES ${SENSOR_MOC_CLASSES})
+
+source_group(Main_ui FILES ${PROJECT_SRCS})
+source_group(moc FILES ${SENSOR_MOC_SOURCES} ${SENSOR_UI_SOURCES_H})
+
+# ========================================
+# Build an executable
+# ========================================
+pacpus_add_executable(
+	${PROJECT_NAME}
+	./src/main.cpp
+	./src/ui/pacpusmainwindow.cpp
+	./src/ui/pacpusmainwindow.h
+	../ico/heudiasycIco.rc
+	${SENSOR_MOC_SOURCES}
+	${SENSOR_UI_CLASSES}
+)
+
+# ========================================
+# Libraries
+# ========================================
+
+set(OPT_LIBRARIES
+	optimized FileLib debug FileLib_d
+	optimized PacpusLib debug PacpusLib_d
+)
+
+# Windows platform
+if(WIN32)
+	LIST(APPEND OPT_LIBRARIES
+		optimized ROAD_TIME debug ROAD_TIME_d
+		Winmm
+)
+endif()
+
+if(UNIX)
+	LIST(APPEND OPT_LIBRARIES
+		pthread
+)
+endif()
+
+# All the platform
+target_link_libraries(
+	${PROJECT_NAME}
+	${PACPUS_DEPENDENCIES_LIB}
+	${OPT_LIBRARIES}
+	${QT_LIBRARIES}
+)
+
+# ========================================
+# Install
+# ========================================
+pacpus_install(${PROJECT_NAME})
+
+# ========================================
+# Folder
+# ========================================
+pacpus_folder(${PROJECT_NAME} "tools")
Index: tags/0.2.3/src/PacpusSensor/src/main.cpp
===================================================================
--- tags/0.2.3/src/PacpusSensor/src/main.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusSensor/src/main.cpp	(revision 368)
@@ -0,0 +1,88 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @version    $Id: main.cpp 81 2013-01-11 22:31:02Z kurdejma $
+
+#include "ui/pacpusmainwindow.h"
+#include <Pacpus/kernel/ComponentManager.h>
+#include <Pacpus/kernel/Log.h>
+#include <Pacpus/kernel/PacpusApplication.h>
+#include <Pacpus/kernel/PacpusException.h>
+
+#include <boost/cstdlib.hpp>
+#include <boost/exception/diagnostic_information.hpp>
+#ifdef WIN32
+#   define NOMINMAX 
+#   include <windows.h>
+#endif
+
+using namespace pacpus;
+using namespace std;
+
+DECLARE_STATIC_LOGGER("pacpus.core.Sensor");
+
+static const string kDefaultXmlConfigFilePath = "PACPUS.xml";
+
+int main(int argc, char * argv[])
+{
+    LogConfigurator::configureLoggerWithFile("PacpusSensor_%N.log");
+
+    PacpusApplication app(argc, argv);
+
+    // faire une boucle pour charger tous les plugins
+    // il faudrait faire une classe supplementaire integree a PacpusLib  /home/gdherbom/dev/pacpus/pacpusbase/pacpusbin/trunk/
+    /*  QPluginLoader loader("libVelodyneHDL64S2.so");
+    qDebug() << loader.errorString();
+    qDebug() << loader.load();
+    qDebug() << loader.errorString();
+    QObject * plugin = loader.instance();
+
+    qDebug() << "Loading plugin:" << qobject_cast<PacpusPluginInterface*>(plugin)->name() << "associated to file:" << loader.fileName();
+    qDebug() << loader.errorString();
+    */
+    ComponentManager * mgr = ComponentManager::getInstance();
+    LOG_DEBUG("main : " << mgr);
+
+#ifdef WIN32
+    timeBeginPeriod(1);
+#endif
+
+    string configFilePath;
+    if (argc > 1) {
+        configFilePath = argv[1];
+    } else {
+        configFilePath = kDefaultXmlConfigFilePath;
+        LOG_WARN("no XML config file specified. Using default: " << configFilePath.c_str());
+    }
+    LOG_INFO("loading file '" << configFilePath.c_str() << "'");
+    mgr->loadComponents(configFilePath.c_str());
+
+    PacpusMainWindow window;
+    window.show();
+    
+    int exitStatus = boost::exit_exception_failure;
+    try {
+        // save application exit status
+        exitStatus = app.exec();
+        // stop all components before exiting app
+        mgr->stop();
+        mgr->destroy();
+    } catch (PacpusException& e) {
+        LOG_FATAL("PacpusException caught:" << e.what() << "\n" << boost::diagnostic_information(e));
+    } catch (boost::exception& e) {
+        (void)e; // unused
+        LOG_FATAL("boost::exception caught:" << boost::diagnostic_information(e));
+    } catch (std::exception& e) {
+        (void)e; // unused
+        LOG_FATAL("std::exception caught:" << e.what());
+    }
+
+#ifdef WIN32
+    timeEndPeriod(1);
+#endif 
+
+    // return application exit status
+    return exitStatus;
+}
Index: tags/0.2.3/src/PacpusSensor/src/ui/pacpusmainwindow.cpp
===================================================================
--- tags/0.2.3/src/PacpusSensor/src/ui/pacpusmainwindow.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusSensor/src/ui/pacpusmainwindow.cpp	(revision 368)
@@ -0,0 +1,187 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @version    $Id: pacpusmainwindow.cpp 76 2013-01-10 17:05:10Z kurdejma $
+
+#include "pacpusmainwindow.h"
+
+#include <iostream>
+#include <qapplication.h>
+#include <qgroupbox.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qstringlist.h>
+
+#include <Pacpus/kernel/ComponentBase.h>
+#include <Pacpus/kernel/Log.h>
+
+namespace pacpus {
+
+DECLARE_STATIC_LOGGER("pacpus.core.PacpusMainWindow");
+
+//////////////////////////////////////////////////////////////////////////
+PacpusMainWindow::PacpusMainWindow(QWidget * parent)
+    : QDialog(parent)
+{
+    setupUi(this);
+
+    componentManager_ = ComponentManager::getInstance();
+
+    // create the box that will display the components and add it to the main layout of the window
+    componentContainer_ = new QGroupBox( "Components" );
+    gridLayout->addWidget(componentContainer_);
+
+    // create the own vertical layout of the components list
+    layoutBox_ = new QVBoxLayout;
+    //create the logical container of the components
+    componentGroup_ = new QButtonGroup;
+    componentGroup_->setExclusive (false);
+
+    // insert the checkbox corresponding to the components
+    QStringList l = componentManager_->getAllComponentsName();
+    for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+        ComponentCheckBox * chkBox = new ComponentCheckBox( *it, componentContainer_ );
+        layoutBox_->addWidget(chkBox);
+        componentGroup_->addButton(chkBox);
+        QObject::connect(chkBox, SIGNAL(activate(QString)),(QDialog*)this, SLOT(startComponent(QString)) );
+        QObject::connect(chkBox, SIGNAL(deactivate(QString)),(QDialog*)this, SLOT(stopComponent(QString)) );
+    }
+    componentContainer_->setLayout(layoutBox_);
+
+    connect(&monitoringTimer_, SIGNAL(timeout()), this, SLOT(monitoring()));
+    monitoringTimer_.start(1000);
+
+    nbActiveComponent_ = 0;
+    
+    buttonStart->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
+    buttonStop->setIcon(style()->standardIcon(QStyle::SP_MediaStop));
+}
+
+//////////////////////////////////////////////////////////////////////////
+PacpusMainWindow::~PacpusMainWindow()
+{
+    monitoringTimer_.stop();
+}
+
+//////////////////////////////////////////////////////////////////////////
+void PacpusMainWindow::startAcquisition()
+{
+    for (int i = 0; i < componentGroup_->buttons().size(); ++i) {
+        componentGroup_->buttons().at(i)->setChecked(true);
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+void PacpusMainWindow::stopAcquisition()
+{
+    for (int i = componentGroup_->buttons().size() - 1 ; i >=0 ; --i) {
+        componentGroup_->buttons().at(i)->setChecked(false);
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+void PacpusMainWindow::startComponent(QString component)
+{
+    componentManager_->start(component);
+    ++nbActiveComponent_;
+    if (nbActiveComponent_ == componentGroup_->buttons().size()) {
+        buttonStop->setEnabled(true);
+        buttonStart->setEnabled(false);
+    } else {
+        buttonStop->setEnabled(true);
+        buttonStart->setEnabled(true);
+    }
+    /*if (!isRunning()) {
+        continue_=true;
+        start();
+    }*/
+    //monitoringTimer_.start(100);
+}
+
+//////////////////////////////////////////////////////////////////////////
+void PacpusMainWindow::stopComponent(QString component)
+{
+    --nbActiveComponent_;
+    componentManager_->stop(component);
+    if (nbActiveComponent_ == 0) {
+        //msleep(200);
+        continue_ = false;
+        buttonStop->setEnabled(false);
+        buttonStart->setEnabled(true);
+    } else {
+        buttonStop->setEnabled(true);
+        buttonStart->setEnabled(true);
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Parallel loop of the graphical interface 
+// Monitor the component and display their state in the checkbox with the 
+// following color code: 
+//      state           color       box
+//      --------------------------------------
+//      stopped         white       unchecked
+//      not monitored   gray        checked
+//      monitor ok      green       checked 
+//      monitor nok     red         checked
+//////////////////////////////////////////////////////////////////////////
+
+/// @todo Voir si besoin de faire un thread : un timer est peut être suffisant ?? 
+void PacpusMainWindow::monitoring()
+{
+    /*
+    qDebug ("Component monitoring thread running");
+    while (continue_)
+    {
+    msleep(100); */
+    // Scan the states of each component and apply the corresponding color to the checkbox
+
+    //QPalette  palet = buttonStop->palette();
+    //palet.setColor(QPalette::Button,Qt::red);
+    //buttonStop->setPalette(palet);
+
+    for (int i = 0; i < componentGroup_->buttons().size(); ++i) {
+        QString componentName = componentGroup_->buttons().at(i)->text();
+        ComponentBase::COMPONENT_STATE state = componentManager_->getComponent(componentName)->getState();
+        QAbstractButton * b = componentGroup_->buttons()[i];
+        QPalette palette = b->palette();
+
+        switch(state) {
+        case ComponentBase::STOPPED :
+            palette.setColor(QPalette::Base, Qt::white);
+            b->setPalette(palette);
+            //qDebug() << "STOPPED";
+            break;
+
+        case ComponentBase::NOT_MONITORED :
+            palette.setColor(QPalette::Base, Qt::gray);
+            b->setPalette(palette);
+            //qDebug() << "NOT_MONITORED";
+            break;
+
+        case ComponentBase::MONITOR_OK :
+            palette.setColor(QPalette::Base, Qt::green);
+            b->setPalette(palette);
+            //qDebug() << "MONITOR_OK";
+            break;
+
+        case ComponentBase::MONITOR_NOK :
+            palette.setColor(QPalette::Base, Qt::red);
+            b->setPalette(palette);
+            //qDebug() << "MONITOR_NOK";
+            break;
+
+        default:
+            std::cerr << "Unkown state " << state << " of component: " << componentName.toStdString() << "\n";
+        }
+        //componentGroup_->buttons().at(i)->setPalette(palette);
+    }
+    repaint();
+    /*}
+    qDebug ("Component monitoring thread stopped"); */
+}
+
+} // namespace pacpus
Index: tags/0.2.3/src/PacpusSensor/src/ui/pacpusmainwindow.h
===================================================================
--- tags/0.2.3/src/PacpusSensor/src/ui/pacpusmainwindow.h	(revision 368)
+++ tags/0.2.3/src/PacpusSensor/src/ui/pacpusmainwindow.h	(revision 368)
@@ -0,0 +1,119 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    June, 2006
+/// @version $Id: pacpusmainwindow.h 76 2013-01-10 17:05:10Z kurdejma $
+/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
+/// @brief Brief description.
+///
+/// Detailed description.
+
+#ifndef PACPUSMAINWINDOW_H
+#define PACPUSMAINWINDOW_H
+
+#include <qcheckbox.h>
+#include <qdialog.h>
+#include <qtimer.h>
+
+#include <Pacpus/kernel/ComponentManager.h>
+#include <Pacpus/kernel/XmlConfigFile.h>
+#include "ui_pacpusmainwindow.h"
+
+class QGroupBox;
+class QVBoxLayout;
+
+namespace pacpus {
+
+/// Overloaded class of the QCheckBox in order to get the text
+/// of the button when it is clicked.
+class ComponentCheckBox
+        : public QCheckBox
+{ 
+    Q_OBJECT
+
+public:
+    /// @todo Documentation
+    ComponentCheckBox(const QString & text, QWidget * parent, const char * /*name*/ = 0 )
+        : QCheckBox(text, parent)
+    {
+        connect(this, SIGNAL(toggled(bool)),
+                SLOT(change(bool)));
+    }
+
+    /// @todo Documentation
+    ~ComponentCheckBox()
+    {
+    }
+
+public Q_SLOTS:
+    /// @todo Documentation
+    void change(bool state)
+    {
+        if (state) {
+            Q_EMIT activate(text());
+        } else {
+            Q_EMIT deactivate(text());
+        }
+    }
+
+Q_SIGNALS:
+    /// @todo Documentation
+    void activate(QString);
+    /// @todo Documentation
+    void deactivate(QString);
+};
+
+////////////////////////////////////////////////////////////////////////////////
+/// @todo Documentation
+class PacpusMainWindow
+        : public QDialog
+        , public Ui::PacpusMainWindow
+{
+    Q_OBJECT
+
+public:
+    /// Constructor
+    PacpusMainWindow(QWidget * parent = 0);
+    /// Destructor
+	~PacpusMainWindow();
+
+public Q_SLOTS:
+    /// slot
+    /// Starts all the components and checks all the checkbox
+    void startAcquisition();
+    /// slot
+    /// called when a checkbox is checked 
+    /// start the corresponding component 
+    /// start the monitoring loop if not running 
+    void startComponent(QString component);
+    
+    /// slot
+    /// Stops all the components and unchecks all the checkbox
+    void stopAcquisition();
+    /// slot
+    /// called when a checkbox is unchecked
+    /// stop the corresponding component
+    /// eventually stop the monitoring loop if any other component is active
+    void stopComponent(QString component);
+
+    /// @todo Documentation
+    void monitoring();
+
+private:
+    ComponentManager * componentManager_;
+
+    QVBoxLayout * layoutBox_;
+    QGroupBox * componentContainer_;
+    QButtonGroup * componentGroup_;
+
+    QTimer monitoringTimer_;
+
+    bool continue_;
+    unsigned short nbActiveComponent_;
+};
+
+} // namespace pacpus
+
+#endif // PACPUSMAINWINDOW_H
Index: tags/0.2.3/src/PacpusSensor/src/ui/pacpusmainwindow.ui
===================================================================
--- tags/0.2.3/src/PacpusSensor/src/ui/pacpusmainwindow.ui	(revision 368)
+++ tags/0.2.3/src/PacpusSensor/src/ui/pacpusmainwindow.ui	(revision 368)
@@ -0,0 +1,82 @@
+<ui version="4.0" >
+ <class>PacpusMainWindow</class>
+ <widget class="QWidget" name="PacpusMainWindow" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>120</width>
+    <height>78</height>
+   </rect>
+  </property>
+  <property name="sizePolicy" >
+   <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle" >
+   <string>Pacpus</string>
+  </property>
+  <layout class="QGridLayout" >
+   <item row="0" column="0" >
+    <layout class="QGridLayout" >
+     <item row="2" column="0" >
+      <widget class="QPushButton" name="buttonStop" >
+       <property name="enabled" >
+        <bool>false</bool>
+       </property>
+       <property name="text" >
+        <string>Stop</string>
+       </property>
+      </widget>
+     </item>
+     <item rowspan="2" row="0" column="0" >
+      <widget class="QPushButton" name="buttonStart" >
+       <property name="text" >
+        <string>Start</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonStart</sender>
+   <signal>clicked()</signal>
+   <receiver>PacpusMainWindow</receiver>
+   <slot>startAcquisition()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>20</x>
+     <y>20</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>20</x>
+     <y>20</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonStop</sender>
+   <signal>clicked()</signal>
+   <receiver>PacpusMainWindow</receiver>
+   <slot>stopAcquisition()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>20</x>
+     <y>20</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>20</x>
+     <y>20</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
Index: tags/0.2.3/src/PacpusTools/CMakeLists.txt
===================================================================
--- tags/0.2.3/src/PacpusTools/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/src/PacpusTools/CMakeLists.txt	(revision 368)
@@ -0,0 +1,111 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+project(PacpusTools)
+
+create_export(EXPORT_HDR ${PROJECT_NAME} "${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools")
+
+################################################################################
+# Compiler definitions
+add_definitions(${QT_DEFINITIONS})
+
+################################################################################
+# DIRECTORIES
+include_directories(
+    ${QT_INCLUDE_DIR}
+)
+
+link_directories(
+    ${PROJECT_BINARY_DIR}/../PacpusLib
+	${PROJECT_BINARY_DIR}/../RoadTime
+)
+
+################################################################################
+# FILES
+set(HDRS
+    ${EXPORT_HDR}
+    ${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/AsyncWorkerBase.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/BinaryDecoder.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/geodesie.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/matrice.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/PeriodicWorker.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/SharedMemory.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/PosixShMem.h
+	${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/Win32ShMem.h
+
+    #${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/pacpusStruct.h
+    #${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/PacpusSerialPort.h
+)
+
+set(SRCS
+    src/matrice.cpp
+    src/geodesie.cpp
+    src/AsyncWorkerBase.cpp
+    src/PeriodicWorker.cpp
+    #src/PacpusSerialPort.cpp
+    src/SharedMemory.cpp
+)
+
+IF(UNIX)
+LIST(APPEND SRCS
+	src/PosixShMem.cpp
+	)
+ENDIF(UNIX)
+
+IF(WIN32)
+LIST(APPEND SRCS
+	src/Win32ShMem.cpp
+	)
+ENDIF(WIN32)
+
+################################################################################
+# QT
+set(FILES_TO_MOC
+    ${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/AsyncWorkerBase.h
+    ${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/PeriodicWorker.h
+    #${PACPUS_INCLUDE_DIR}/Pacpus/PacpusTools/PacpusSerialPort.h
+)
+
+qt_wrap_cpp(
+    PROJECT_MOC_SRCS
+    ${FILES_TO_MOC}
+)
+
+################################################################################
+# BUILD and LINK
+pacpus_add_library(${PROJECT_NAME} SHARED
+    ${HDRS}
+    ${SRCS}
+    ${PROJECT_MOC_SRCS}
+)
+
+# LIBS
+set(OPT_LIBRARIES
+    optimized PacpusLib debug PacpusLib_d
+)
+
+if(WIN32)
+    LIST(APPEND OPT_LIBRARIES
+        optimized ROAD_TIME debug ROAD_TIME_d
+)
+endif()
+
+# LINK
+target_link_libraries(${PROJECT_NAME}
+    ${QT_LIBRARIES}
+    ${PACPUS_DEPENDENCIES_LIB}
+    ${OPT_LIBRARIES}
+)
+
+################################################################################
+# INSTALL
+pacpus_install(${PROJECT_NAME})
+
+################################################################################
+# FOLDER
+pacpus_folder(${PROJECT_NAME} "libraries")
Index: tags/0.2.3/src/PacpusTools/src/AsyncWorkerBase.cpp
===================================================================
--- tags/0.2.3/src/PacpusTools/src/AsyncWorkerBase.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusTools/src/AsyncWorkerBase.cpp	(revision 368)
@@ -0,0 +1,105 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+/// @author  Samuel Gosselin <firstname.surname@utc.fr>
+/// @date    December, 2012
+// %pacpus:license}
+
+#include <Pacpus/PacpusTools/AsyncWorkerBase.h>
+
+#include <Pacpus/kernel/Log.h>
+
+#include <QThread>
+
+using namespace pacpus;
+DECLARE_STATIC_LOGGER("pacpus.core.workers");
+
+AsyncWorkerBase::AsyncWorkerBase()
+  : active_(false)
+  , stopping_(false)
+{
+}
+
+AsyncWorkerBase::~AsyncWorkerBase()
+{
+}
+
+void
+AsyncWorkerBase::start()
+{
+  if (!isActive())
+  {
+    QThread* theThread = new QThread;
+
+    // Executes the setup() method as soon as theThread is started
+    connect(theThread, SIGNAL(started()), SLOT(doSetup()));
+
+    // Executes the finish() method as soon as theThread 
+
+    // Allows stopping requests to be handled withing the worker thread instead
+    // of the thread that made the stop() call.
+    connect(this, SIGNAL(stopped()), this, SLOT(doFinish()));
+
+    // Guarantees theThread is terminated and deleted once the worker has 
+    // stopped and is destroyed
+    connect(this, SIGNAL(finished()), theThread, SLOT(quit()));
+    connect(theThread, SIGNAL(finished()), theThread, SLOT(deleteLater()));
+    
+    active_ = true;
+    this->moveToThread(theThread);
+    theThread->start();
+  }
+}
+
+void
+AsyncWorkerBase::stop(bool autoDelete)
+{
+	if (isActive())
+  {
+    if (autoDelete)
+    {
+      // Guarantees deletion of this once all pending signals have been handled
+      connect(this, SIGNAL(finished()), this, SLOT(deleteLater()));
+    }
+		stopping_ = true;
+		emit stopped();
+	}
+  else
+  {
+    if (autoDelete)
+      delete this;
+  }
+}
+
+void AsyncWorkerBase::finish()
+{
+	if (isActive())
+  {
+    cleanup();
+		emit finished();
+		active_ = false;
+	}
+}
+
+void AsyncWorkerBase::setup()
+{
+}
+
+void AsyncWorkerBase::process()
+{
+}
+
+void AsyncWorkerBase::cleanup()
+{
+}
+
+void AsyncWorkerBase::doSetup()
+{
+  setup();
+  process();
+}
+
+void AsyncWorkerBase::doFinish()
+{ 
+  finish();
+}
Index: tags/0.2.3/src/PacpusTools/src/PacpusSerialPort.cpp
===================================================================
--- tags/0.2.3/src/PacpusTools/src/PacpusSerialPort.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusTools/src/PacpusSerialPort.cpp	(revision 368)
@@ -0,0 +1,286 @@
+/*********************************************************************
+// created:    2013/07/10
+// filename:   PacpusSerialPort.cpp
+//
+// author:     Julien Moras
+// 
+// version:    $Id: $
+//
+// purpose:    This class defines a Qt 5.1 driver for serial port
+ *********************************************************************/
+
+#include <Pacpus/PacpusTools/PacpusSerialPort.h>
+
+#include <Pacpus/kernel/ComponentFactory.h>
+#include <Pacpus/kernel/Log.h>
+#include <Pacpus/kernel/inputOutputInterface.h>
+
+using namespace pacpus;
+
+DECLARE_STATIC_LOGGER("pacpus.core.serialport");
+
+static ComponentFactory<PacpusSerialPort> sFactory("PacpusSerialPort");
+
+PacpusSerialPort::PacpusSerialPort(QString name):ComponentBase(name) {
+
+    serialPort = new QSerialPort(this);
+    // Default settings
+#if(Win32)
+    portName = "COM1";
+#else
+    portName = "/dev/tty0";
+#endif
+    direction = QSerialPort::AllDirections;
+    baudRate  = QSerialPort::Baud9600;
+    dataBits  = QSerialPort::Data8;
+    parity    = QSerialPort::NoParity;
+    stopBits  = QSerialPort::OneStop;
+    flowControl = QSerialPort::NoFlowControl;
+    errorPolicy = QSerialPort::SkipPolicy;
+
+    dataMode = ASCII;
+    sepChar = "\n";     // TODO remove
+
+    startChar = "";
+    stopChar = "\n";
+    minPacketSize=0;
+
+    log = false; // TODO remove when component ok
+
+    // Or threaded
+    connect(serialPort,SIGNAL(readyRead()),this,SLOT(readData()));
+
+}
+
+PacpusSerialPort::~PacpusSerialPort() {
+
+    if(serialPort->isOpen())
+        serialPort->close();
+    delete serialPort;
+}
+
+void PacpusSerialPort:: addInput()
+{
+    ADD_INPUT("inStream",PacpusSerialPort,QByteArray,processInputFrame);
+}
+
+void PacpusSerialPort:: addOutput()
+{
+    ADD_OUTPUT("outStream",PacpusSerialPort,QByteArray);
+    ADD_OUTPUT("pinOutSignal",PacpusSerialPort,quint16);
+}
+
+
+ComponentBase::COMPONENT_CONFIGURATION PacpusSerialPort::configureComponent(XmlComponentConfig config)
+{
+
+    /// TODO get parameter from xml
+
+    if(param.hasProperty("portName"))
+    portName = param.getProperty("portName");
+
+    if(param.hasProperty("baudRate"))
+    baudRate = (QSerialPort::BaudRate) param.getProperty("baudRate").toInt();
+
+    if(param.hasProperty("direction"))
+    direction = (QSerialPort::Direction) param.getProperty("direction").toInt();
+
+    if(param.hasProperty("dataBits"))
+    dataBits = (QSerialPort::DataBits) param.getProperty("dataBits").toInt();
+
+    if(param.hasProperty("parity"))
+    parity = (QSerialPort::Parity) param.getProperty("parity").toInt();
+
+    if(param.hasProperty("stopBits"))
+    stopBits = (QSerialPort::StopBits) param.getProperty("stopBits").toInt();
+
+    if(param.hasProperty("flowControl"))
+    flowControl = (QSerialPort::FlowControl) param.getProperty("flowControl").toInt();
+
+    if(param.hasProperty("errorPolicy"))
+    errorPolicy = (QSerialPort::DataErrorPolicy) param.getProperty("errorPolicy").toInt();
+
+    if(param.hasProperty("dataMode"))
+    dataMode = (DataMode) param.getProperty("dataMode").toInt();
+
+    if(param.hasProperty("sepChar"))
+    sepChar =  param.getProperty("sepChar");
+
+    if(param.hasProperty("startChar"))
+    startChar =  param.getProperty("startChar");
+
+    if(param.hasProperty("stopChar"))
+    stopChar =  param.getProperty("stopChar");
+
+    if(param.hasProperty("minPacketSize"))
+    minPacketSize = (DataMode) param.getProperty("minPacketSize").toInt();
+
+    serialPort->setPortName(portName);
+
+    if(!serialPort->setBaudRate(baudRate,direction))
+        LOG_ERROR(getName() << "\t error n° "<< serialPort->error());
+    if(!serialPort->setDataBits(dataBits))
+        LOG_ERROR(getName() << "\t error n° "<< serialPort->error());
+    if(!serialPort->setParity(parity))
+        LOG_ERROR(getName() << "\t error n° "<< serialPort->error());
+    if(!serialPort->setStopBits(stopBits))
+        LOG_ERROR(getName() << "\t error n° "<< serialPort->error());
+    if(!serialPort->setFlowControl(flowControl))
+        LOG_ERROR(getName() << "\t error n° "<< serialPort->error());
+    if(!serialPort->setDataErrorPolicy(errorPolicy))
+        LOG_ERROR(getName() << "\t error n° "<< serialPort->error());
+
+    // For futher developpements
+//    serialPort->setBreakEnabled();
+//    serialPort->setDataTerminalReady();
+//    serialPort->setRequestToSend();
+    return ComponentBase::CONFIGURED_OK;
+}
+
+void PacpusSerialPort::startActivity()
+{
+
+    buffer.clear();
+
+    if(!serialPort->open((QSerialPort::OpenModeFlag)direction))
+    { LOG_FATAL("device "<< serialPort->portName().toStdString() <<" failed to open: " << serialPort->errorString()); }
+    else
+       { LOG_INFO("listening for data on " << serialPort->portName()); }
+
+    moveToThread(&thread_);
+    thread_.start();
+
+    //TODO Remove QThread inheritance if this works fine
+    //THREAD_ALIVE = true;
+    //start();
+    setState(ComponentBase::MONITOR_OK);
+}
+
+void PacpusSerialPort::stopActivity()
+{     
+    QMetaObject::invokeMethod(&thread_, "quit");
+
+    //THREAD_ALIVE = false;
+    //while(!isFinished()); // TODO timeout
+
+    serialPort->close();
+
+
+}
+
+void PacpusSerialPort::processInputFrame(const QByteArray & inputFrame)
+{
+    LOG_TRACE("Input frame " << inputFrame.data());
+
+    // Write input to serial port
+    if(serialPort->write(inputFrame)>=0)
+    {
+        setState(MONITOR_OK);
+        LOG_DEBUG(getName() << " Serial write performed")
+    }
+    else
+     {
+        setState(MONITOR_NOK);
+        LOG_WARN(getName() << " Serial write error")
+    }
+}
+
+void PacpusSerialPort::readData()
+{
+    int n;
+
+    if(dataMode == BINARY & minPacketSize >0)
+        if(serialPort->bytesAvailable() < minPacketSize)
+            return;
+
+    buffer += serialPort->readAll();
+
+    while(true) // loop until no data to send
+        {
+        switch(dataMode)
+        {
+            case ASCII : // Split the first line to send
+            {
+                if(startChar.size()>0)
+                {
+                    int indexStart = buffer.indexOf(startChar,0);
+                    if(indexStart < 0)
+                        return;
+                    else
+                        buffer.remove(0,indexStart);
+                }
+
+                int indexStop = buffer.indexOf(stopChar,1);
+                if(indexStop < 1)
+                    return;
+
+                n=indexStop;
+                break;
+
+            // This work but replace by previous code that need to be test
+//                n = buffer.indexOf(sepChar,1) + 1;
+//                if(n<=0)
+//                    return; // end line char not found
+//                break;
+            }
+            case BINARY : // Get all data
+                n = buffer.size();//serialPort->bytesAvailable();
+                if(n<=0)
+                    return;
+                break;
+
+            default:
+
+                LOG_WARN("unknown dataMode")
+                setState(MONITOR_NOK);
+                return;
+
+        }
+
+        QByteArray data(buffer.data(),n);
+        buffer.remove(0,n);
+
+        quint16 pinout = (quint16)serialPort->pinoutSignals();
+
+        GET_OUTPUT("outStream",PacpusSerialPort,QByteArray)->send(data);
+        GET_OUTPUT("pinOutSignal",PacpusSerialPort,quint16)->send(pinout);
+        setState(MONITOR_OK);
+        LOG_DEBUG("Signal Read " << n << " bytes, PinOut : " << pinout);
+        LOG_DEBUG(data.data());
+
+        if(log)
+        {
+            switch(dataMode)
+            {
+                case ASCII :
+                    LOG_INFO("Buffer " << buffer.data());
+
+                case BINARY :
+                {
+                        QByteArray str;
+                        for(int i =0;i<22 ;i++)
+                            str+= QByteArray::number((uchar)buffer.data()[i],16).toUpper() + " ";
+                        LOG_INFO("Value " << str.data());
+                }
+            }
+        }
+    }
+}
+
+/*void PacpusSerialPort::run()
+{
+    while (THREAD_ALIVE)
+    {
+        if (serialPort->waitForReadyRead(timeOut))
+        {
+            QByteArray data = serialPort->readAll();
+            GET_OUTPUT("outStream",PacpusSerialPort,QByteArray)->send(data);
+            GET_OUTPUT("pinOutSignal",PacpusSerialPort,quint16)->send((quint16)serialPort->pinoutSignals());
+            setState(MONITOR_OK);
+            LOG_INFO("Run Read");
+            LOG_INFO(data.data());
+        } else {
+            setState(MONITOR_NOK);
+        }
+    }
+}*/
Index: tags/0.2.3/src/PacpusTools/src/PeriodicWorker.cpp
===================================================================
--- tags/0.2.3/src/PacpusTools/src/PeriodicWorker.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusTools/src/PeriodicWorker.cpp	(revision 368)
@@ -0,0 +1,38 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+/// @author  Samuel Gosselin <firstname.surname@utc.fr>
+/// @date    December, 2012
+// %pacpus:license}
+
+#include <Pacpus/PacpusTools/PeriodicWorker.h>
+
+#include <QTimer>
+
+using namespace pacpus;
+
+PeriodicWorker::PeriodicWorker()
+  : AsyncWorkerBase()
+  , mHeartbeat(NULL)
+{
+  mHeartbeat = new QTimer(this);
+}
+
+PeriodicWorker::~PeriodicWorker()
+{
+}
+
+void
+PeriodicWorker::startWork(int msec)
+{
+  mHeartbeat->start(msec);
+  connect(mHeartbeat, SIGNAL(timeout()), this, SLOT(doWork()));
+  
+  this->start();
+}
+
+void
+PeriodicWorker::stopWork()
+{
+  disconnect(mHeartbeat, SIGNAL(timeout()), this, SLOT(doWork()));
+}
Index: tags/0.2.3/src/PacpusTools/src/PosixShMem.cpp
===================================================================
--- tags/0.2.3/src/PacpusTools/src/PosixShMem.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusTools/src/PosixShMem.cpp	(revision 368)
@@ -0,0 +1,174 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    January, 2007
+// %pacpus:license}
+
+#include <cassert>
+#include <cstdlib>
+#include <iomanip>
+
+#include <Pacpus/PacpusTools/PosixShMem.h>
+#include <Pacpus/kernel/Log.h>
+
+DECLARE_STATIC_LOGGER("pacpus.core.PosixShMem");
+
+using std::hex;
+
+//////////////////////////////////////////////////////////////////////////
+/// Constructor
+PosixShMem::PosixShMem(const char * name, int size)
+{
+    LOG_TRACE("constructor(" << name << ", " << size << ")");
+    LOG_INFO("creating shared memory" << "\t"
+             << "name=" << name << "\t"
+             << "size=" << size
+             );
+
+    {
+        QString memoryName = QString(name);
+        memory_ = new QSharedMemory(memoryName);
+    }
+    if (!memory_) {
+        LOG_FATAL("out of memory: cannot create shared memory object");
+        exit(-1);
+    }
+
+    bool result = false;
+    LOG_DEBUG("trying to create a memory segment");
+    if (!memory_->create(size)) {
+        if (QSharedMemory::AlreadyExists == memory_->error()) {
+            LOG_DEBUG("trying to attach to an existing memory segment");
+            if (!memory_->attach()) {
+                LOG_ERROR("cannot attach to an existing shared memory segment '" << name << "'"
+                          << ". error code: " << memory_->error()
+                          << ". error message:" << memory_->errorString().toStdString()
+                          );
+            } else {
+                LOG_INFO("attached shared memory segment '" << name << "'");
+                int attachedMemorySize = memory_->size();
+                LOG_INFO("attached memory size = " << attachedMemorySize);
+                if (attachedMemorySize < size) {
+                    LOG_ERROR("attached memory is smaller than requested, unexpected behaviour possible");
+                    LOG_INFO("use system tools like 'ipcs' and 'ipcrm' to remove shared memory and re-run");
+                }
+                result = true;
+            }
+        } else {
+            LOG_ERROR("cannot create shared memory segment '" << name << "'"
+                      << ". error code: " << memory_->error()
+                      << ". error message:" << memory_->errorString().toStdString()
+                      );
+        }
+    } else {
+        LOG_INFO("created shared memory segment '" << name << "'");
+        result = true;
+    }
+
+    /////////////////////////////////////////
+    if (result) {
+        // create the equivalent Windows event (autoreset mode?)
+        QString eventName = "EvtShMem_" + QString(name);
+        LOG_DEBUG("creating event '" << eventName << "'...");
+        event_ = new QSystemSemaphore(eventName, 0, QSystemSemaphore::Create);
+        if (event_) {
+            LOG_DEBUG("created event '" << eventName << "'");
+        } else {
+            LOG_ERROR("cannot create event '" << eventName << "'"
+                      );
+        }
+
+        // get a pointer to the shared memory segment
+        shMem_ = memory_->data();
+    } else {
+        LOG_FATAL("cannot create shared memory segment '" << name << "'");
+        //throw MemoryCreationError();
+        exit(memory_->error());
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Destructor
+PosixShMem::~PosixShMem()
+{
+    LOG_TRACE("destructor");
+
+    // detach this process from the shared memory
+    memory_->detach();
+    // free shared memory
+    delete memory_;
+    // free event
+    delete event_;
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Use this method to get a pointer to data of the shared memory
+void * PosixShMem::read()
+{
+    void * shMem;
+    lockMemory();
+    shMem = shMem_;
+    unlockMemory();
+    return shMem;
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Use this method to get a pointer to data of the shared memory
+void PosixShMem::read(void * mem, int size)
+{
+    lockMemory();
+    memcpy(mem,shMem_,size);
+    unlockMemory();
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Use this method to write data in shared memory. Offset is given in bytes
+void PosixShMem::write(void * data, int size, unsigned long offset)
+{
+    LOG_TRACE("writing " << size << " bytes to shared memory");
+
+    lockMemory();
+    uint32_t * dest = (uint32_t *) shMem_ + offset;
+
+    LOG_TRACE("adresses:"
+              << " shm = " << hex << shMem_
+              << " dst = " << hex << dest
+              << " src = " << hex << data
+              );
+
+    memcpy(dest, data, size);
+    unlockMemory();
+    event_->release();
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Function that locks access to the shared memory
+void PosixShMem::lockMemory()
+{
+    assert(memory_);
+    if (!memory_->lock()) {
+        LOG_ERROR("cannot lock memory '" << memory_->key().toStdString() << "'");
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Function that unlocks access to the shared memory
+void PosixShMem::unlockMemory()
+{
+    assert(memory_);
+    if (!memory_->unlock()) {
+        LOG_ERROR("cannot unlock memory '" << memory_->key().toStdString() << "'");
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Use this method to wait the incoming of new data
+/// you can specify a timeout in ms to avoid infinite blocking or 0 (infinite)
+/// return true if new data available before the timeout or else false
+bool PosixShMem::wait(unsigned long /*timeout*/)
+{
+    bool result = event_->acquire();
+    LOG_TRACE("event acquired: note that timeout doesn't work yet on linux platform");
+    return result;
+}
Index: tags/0.2.3/src/PacpusTools/src/SharedMemory.cpp
===================================================================
--- tags/0.2.3/src/PacpusTools/src/SharedMemory.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusTools/src/SharedMemory.cpp	(revision 368)
@@ -0,0 +1,288 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @date    2014-04-07 10:17:22
+// %pacpus:license}
+
+#include <Pacpus/PacpusTools/SharedMemory.h>
+#include <Pacpus/kernel/Log.h>
+
+#include <boost/assert.hpp>
+#include <cstdlib>
+#include <iomanip>
+#include <sstream>
+#if PACPUS_OS_WINDOWS
+#   include <windows.h>
+#endif
+
+DECLARE_STATIC_LOGGER("pacpus.framwork.SharedMemory")
+
+using namespace pacpus;
+
+//////////////////////////////////////////////////////////////////////////
+SharedMemory::SharedMemory(const char* name, int size)
+{
+    LOG_TRACE("constructor(" << name << ", " << size << ")");
+    LOG_INFO("creating shared memory" << "\t"
+             << "name=" << name << "\t"
+             << "size=" << size
+             );
+
+#if PACPUS_OS_WINDOWS
+    // semaphore name
+    std::stringstream semaphoreNameSs;
+    semaphoreNameSs << (const char *) "SemShMem_" << name;
+    std::string semaphoreName = semaphoreNameSs.str();
+    // event name
+    std::stringstream eventNameSs;
+    eventNameSs << (const char *) "EvtShMem_" << name;
+    std::string eventName = eventNameSs.str();
+
+    LOG_DEBUG("semaphore name = " << semaphoreName);
+    LOG_DEBUG("event name = " << eventName);
+
+    semaphore_ = CreateSemaphore(NULL, /* lInitialCount = */ 1, /* lMaximumCount = */ 1, semaphoreName.c_str());
+    if (semaphore_ == NULL) {
+        LPVOID lpMsgBuf;
+        DWORD dw = GetLastError();
+
+        FormatMessage(
+            /* flags = */ FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+            /* source = */ NULL,
+            /* messageId = */ dw,
+            /* languageId = */ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+            /* out buffer = */ (LPTSTR) &lpMsgBuf,
+            /* size = */ 0,
+            /* args = */ NULL
+            );
+
+        LOG_FATAL("cannot create semaphore protection of shared memory segment '" << name << "'"
+            << ". Error: " << GetLastError()
+            << ". Message: " << (const char *) lpMsgBuf
+            << ". Program will exit"
+            );
+        ::exit(-1);
+    }
+
+    // create the event - autoreset mode
+    event_ = CreateEvent(NULL, false, false, eventName.c_str());
+
+    // lock the semaphore and try to create the shared memory
+    lockMemory();
+    shMemHandle_ = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,	PAGE_READWRITE,	0, size, name);
+    if (shMemHandle_ == NULL) {
+        LOG_FATAL("cannot create shared memory segment '" << name << "'"
+            << ". Error: " << GetLastError()
+            << ". Program will exit"
+            );
+        ::exit(-1);
+    }
+
+    // Map the memory to a local pointer
+    shMem_ = MapViewOfFile(shMemHandle_, FILE_MAP_ALL_ACCESS, 0, 0, 0);
+    if (shMem_ == NULL) {
+        LOG_FATAL("cannot map the view of file of the shared memory segment '" << name << "'"
+            << ". Error: " << GetLastError()
+            << ". Program will exit"
+            );
+        ::exit(-1);
+    }
+
+    LOG_INFO("created Win32 shared memory '" << name << "'");
+
+    unlockMemory();
+
+#elif PACPUS_OS_UNIX
+
+    {
+        QString memoryName = QString(name);
+        memory_ = new QSharedMemory(memoryName);
+    }
+    if (!memory_) {
+        LOG_FATAL("out of memory: cannot create shared memory object");
+        exit(-1);
+    }
+
+    bool result = false;
+    LOG_DEBUG("trying to create a memory segment");
+    if (!memory_->create(size)) {
+        if (QSharedMemory::AlreadyExists == memory_->error()) {
+            LOG_DEBUG("trying to attach to an existing memory segment");
+            if (!memory_->attach()) {
+                LOG_ERROR("cannot attach to an existing shared memory segment '" << name << "'"
+                          << ". error code: " << memory_->error()
+                          << ". error message:" << memory_->errorString().toStdString()
+                          );
+            } else {
+                LOG_INFO("attached shared memory segment '" << name << "'");
+                int attachedMemorySize = memory_->size();
+                LOG_INFO("attached memory size = " << attachedMemorySize);
+                if (attachedMemorySize < size) {
+                    LOG_ERROR("attached memory is smaller than requested, unexpected behaviour possible");
+                    LOG_INFO("use system tools like 'ipcs' and 'ipcrm' to remove shared memory and re-run");
+                }
+                result = true;
+            }
+        } else {
+            LOG_ERROR("cannot create shared memory segment '" << name << "'"
+                      << ". error code: " << memory_->error()
+                      << ". error message:" << memory_->errorString().toStdString()
+                      );
+        }
+    } else {
+        LOG_INFO("created shared memory segment '" << name << "'");
+        result = true;
+    }
+
+    /////////////////////////////////////////
+    if (result) {
+        // create the equivalent Windows event (autoreset mode?)
+        QString eventName = "EvtShMem_" + QString(name);
+        LOG_DEBUG("creating event '" << eventName << "'...");
+        event_ = new QSystemSemaphore(eventName, 0, QSystemSemaphore::Create);
+        if (event_) {
+            LOG_DEBUG("created event '" << eventName << "'");
+        } else {
+            LOG_ERROR("cannot create event '" << eventName << "'"
+                      );
+        }
+
+        // get a pointer to the shared memory segment
+        shMem_ = memory_->data();
+    } else {
+        LOG_FATAL("cannot create shared memory segment '" << name << "'");
+        //throw MemoryCreationError();
+        exit(memory_->error());
+    }
+
+#else
+
+#error UNIMPLEMENTED for this operating system
+
+#endif
+}
+
+SharedMemory::~SharedMemory()
+{
+    LOG_TRACE("destructor");
+#if PACPUS_OS_WINDOWS
+    // free the semaphore
+    CloseHandle(semaphore_);
+    UnmapViewOfFile(shMem_);
+    CloseHandle(shMemHandle_);
+#elif PACPUS_OS_UNIX
+    // detach this process from the shared memory
+    memory_->detach();
+    // free shared memory
+    delete memory_;
+    // free event
+    delete event_;
+#endif
+}
+
+bool SharedMemory::wait(unsigned long timeout)
+{
+#if PACPUS_OS_WINDOWS
+    if (timeout == 0) {
+        timeout = INFINITE;
+    }
+
+    DWORD status = 0;
+    status = WaitForSingleObject(event_, timeout);
+
+    if (status == WAIT_OBJECT_0) {
+        return true;
+    } else {
+        return false;
+    }
+#elif PACPUS_OS_UNIX
+    (void) timeout; // unused
+    bool result = event_->acquire();
+    LOG_TRACE("event acquired: note that timeout doesn't work yet on linux platform");
+    return result;
+#endif
+}
+
+void* SharedMemory::read()
+{
+    void* shMem;
+#if PACPUS_OS_WINDOWS
+    lockMemory();
+#endif
+    shMem = shMem_;
+#if PACPUS_OS_WINDOWS
+    unlockMemory();
+#endif
+    return shMem;
+}
+
+void SharedMemory::read(void* dst, int size)
+{
+    lockMemory();
+    memcpy(dst, shMem_, size);
+    unlockMemory();
+}
+
+void* SharedMemory::getEventIdentifier()
+{
+#if PACPUS_OS_WINDOWS
+    return event_;
+#elif PACPUS_OS_UNIX
+    LOG_TRACE("no event identifier");
+    return NULL;
+#endif
+}
+
+void SharedMemory::write(void *data, int size, unsigned long offset)
+{
+    using std::hex;
+
+    LOG_TRACE("writing " << size << " bytes to shared memory at offset " << offset);
+#if PACPUS_OS_WINDOWS
+    lockMemory();
+    //unsigned long * dest = (unsigned long *)shMem_ + offset;
+    char * dest = (char *)shMem_ + offset;
+    //printf("adresses : shm : %x  dest : %x   offset : %x \n",shMem_, dest, offset);
+    memcpy(dest, data, size);
+    unlockMemory();
+    SetEvent(event_);
+#elif PACPUS_OS_UNIX
+    lockMemory();
+    uint32_t * dest = (uint32_t *) shMem_ + offset;
+
+    LOG_TRACE("adresses:"
+              << " shm = " << hex << shMem_
+              << " dst = " << hex << dest
+              << " src = " << hex << data
+              );
+
+    memcpy(dest, data, size);
+    unlockMemory();
+    event_->release();
+#endif
+}
+
+void SharedMemory::lockMemory()
+{
+#if PACPUS_OS_WINDOWS
+    WaitForSingleObject(semaphore_, INFINITE);
+#elif PACPUS_OS_UNIX
+    BOOST_ASSERT(memory_);
+    if (!memory_->lock()) {
+        LOG_ERROR("cannot lock memory '" << memory_->key().toStdString() << "'");
+    }
+#endif
+}
+
+void SharedMemory::unlockMemory()
+{
+#if PACPUS_OS_WINDOWS
+    ReleaseSemaphore(semaphore_, 1, NULL);
+#elif PACPUS_OS_UNIX
+    BOOST_ASSERT(memory_);
+    if (!memory_->unlock()) {
+        LOG_ERROR("cannot unlock memory '" << memory_->key().toStdString() << "'");
+    }
+#endif
+}
Index: tags/0.2.3/src/PacpusTools/src/Win32ShMem.cpp
===================================================================
--- tags/0.2.3/src/PacpusTools/src/Win32ShMem.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusTools/src/Win32ShMem.cpp	(revision 368)
@@ -0,0 +1,169 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+/// @author  Gerald Dherbomez <firstname.surname@utc.fr>
+/// @date    January, 2007
+// %pacpus:license}
+
+#include <Pacpus/PacpusTools/Win32ShMem.h>
+#include <Pacpus/kernel/Log.h>
+
+#include <sstream>
+#include <windows.h>
+
+DECLARE_STATIC_LOGGER("pacpus.core.Win32ShMem");
+
+using namespace pacpus;
+using namespace std;
+
+//////////////////////////////////////////////////////////////////////////
+/// Constructor
+Win32ShMem::Win32ShMem(const char * name, int size)
+{
+    // semaphore name
+    stringstream semaphoreNameSs;
+    semaphoreNameSs << (const char *) "SemShMem_" << name;
+    string semaphoreName = semaphoreNameSs.str();
+    // event name
+    stringstream eventNameSs;
+    eventNameSs << (const char *) "EvtShMem_" << name;
+    string eventName = eventNameSs.str();
+
+    LOG_DEBUG("semaphore name = " << semaphoreName);
+    LOG_DEBUG("event name = " << eventName);
+
+    semaphore_ = CreateSemaphore(NULL, /* lInitialCount = */ 1, /* lMaximumCount = */ 1, semaphoreName.c_str());
+    if (semaphore_ == NULL) {
+        LPVOID lpMsgBuf;
+        DWORD dw = GetLastError();
+
+        FormatMessage(
+            /* flags = */ FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+            /* source = */ NULL,
+            /* messageId = */ dw,
+            /* languageId = */ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+            /* out buffer = */ (LPTSTR) &lpMsgBuf,
+            /* size = */ 0,
+            /* args = */ NULL
+            );
+
+        LOG_FATAL("cannot create semaphore protection of shared memory segment '" << name << "'"
+            << ". Error: " << GetLastError()
+            << ". Message: " << (const char *) lpMsgBuf
+            << ". Program will exit"
+            ); 
+        ::exit(-1); 
+    }
+
+    // create the event - autoreset mode
+    event_ = CreateEvent(NULL, false, false, eventName.c_str()); 
+
+    // lock the semaphore and try to create the shared memory
+    lockMemory(); 
+    shMemHandle_ = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,	PAGE_READWRITE,	0, size, name);  
+    if (shMemHandle_ == NULL) {
+        LOG_FATAL("cannot create shared memory segment '" << name << "'"
+            << ". Error: " << GetLastError()
+            << ". Program will exit"
+            ); 
+        ::exit(-1);
+    }
+
+    // Map the memory to a local pointer
+    shMem_ = MapViewOfFile(shMemHandle_, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
+    if (shMem_ == NULL) {
+        LOG_FATAL("cannot map the view of file of the shared memory segment '" << name << "'"
+            << ". Error: " << GetLastError()
+            << ". Program will exit"
+            ); 
+        ::exit(-1);
+    }
+
+    LOG_INFO("created Win32 shared memory '" << name << "'"); 
+
+    unlockMemory(); 
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Destructor
+Win32ShMem::~Win32ShMem()
+{
+    // free the semaphore 
+    CloseHandle(semaphore_); 
+    UnmapViewOfFile(shMem_); 
+    CloseHandle(shMemHandle_); 
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Use this method to wait the incoming of new data
+/// you can specify a timeout in ms to avoid infinite blocking or 0 (infinite)
+/// @returns @b true if new data available before the timeout, @b false otherwise
+bool Win32ShMem::wait(unsigned long timeout /* = 0 */)
+{
+    if (timeout == 0) {
+        timeout = INFINITE; 
+    }
+
+    DWORD status = 0; 
+    status = WaitForSingleObject(event_, timeout); 
+
+    if (status == WAIT_OBJECT_0) {
+        return true; 
+    } else {
+        return false; 
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Use this method to get a pointer to data of the shared memory
+void * Win32ShMem::read()
+{
+    void * shMem; 
+    lockMemory(); 
+    shMem = shMem_; 
+    unlockMemory(); 
+    return shMem; 
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Use this method to get a pointer to data of the shared memory
+void Win32ShMem::read(void * mem, int size)
+{
+    lockMemory(); 
+    memcpy(mem,shMem_,size); 
+    unlockMemory(); 
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Return the event handle under Windows 
+void * Win32ShMem::getEventIdentifier()
+{
+    return event_; 
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Use this method to write data in shared memory. Offset is given in bytes
+void Win32ShMem::write(void *data, int size, unsigned long offset)
+{
+    lockMemory(); 
+    //unsigned long * dest = (unsigned long *)shMem_ + offset;
+    char * dest = (char *)shMem_ + offset;
+    //printf("adresses : shm : %x  dest : %x   offset : %x \n",shMem_, dest, offset); 
+    memcpy(dest, data, size);
+    unlockMemory();
+    SetEvent(event_); 
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Function that locks access to the shared memory
+void Win32ShMem::lockMemory()
+{
+    WaitForSingleObject(semaphore_, INFINITE); 
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// Function that unlocks access to the shared memory
+void Win32ShMem::unlockMemory()
+{
+    ReleaseSemaphore(semaphore_, 1, NULL); 
+}
Index: tags/0.2.3/src/PacpusTools/src/geodesie.cpp
===================================================================
--- tags/0.2.3/src/PacpusTools/src/geodesie.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusTools/src/geodesie.cpp	(revision 368)
@@ -0,0 +1,439 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+/// @author  Marek Kurdej <firstname.surname@utc.fr>
+/// @author  Jean Laneurit <firstname.surname@utc.fr>
+/// @date    April, 2010
+// %pacpus:license}
+
+#include <Pacpus/PacpusTools/geodesie.h>
+
+#include <fstream>
+#include <QMatrix4x4>
+#include <QVector3D>
+
+using ::boost::math::constants::pi;
+using ::boost::math::constants::half_pi;
+using ::std::abs;
+using ::std::atan;
+using ::std::exp;
+using ::std::ifstream;
+using ::std::ostream;
+using ::std::log;
+using ::std::sin;
+using ::std::string;
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4244)
+#endif //_MSC_VER
+
+namespace Geodesy
+{
+
+////////////////////////////////////////////////////////////////////////////////
+Matrice::Matrice(const Matrice& A)
+{
+    c0_l0 = A.c0_l0;
+    c1_l0 = A.c1_l0;
+    c2_l0 = A.c2_l0;
+    c0_l1 = A.c0_l1;
+    c1_l1 = A.c1_l1;
+    c2_l1 = A.c2_l1;
+    c0_l2 = A.c0_l2;
+    c1_l2 = A.c1_l2;
+    c2_l2 = A.c2_l2;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Matrice::Matrice()
+{
+    c0_l0 = 0.0;
+    c1_l0 = 0.0;
+    c2_l0 = 0.0;
+    c0_l1 = 0.0;
+    c1_l1 = 0.0;
+    c2_l1 = 0.0;
+    c0_l2 = 0.0;
+    c1_l2 = 0.0;
+    c2_l2 = 0.0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void Matrice::Apply(double v0, double v1, double v2, double& Mv0, double& Mv1, double& Mv2)
+{
+    Mv0 = c0_l0 * v0 + c1_l0 * v1 + c2_l0 * v2;
+    Mv1 = c0_l1 * v0 + c1_l1 * v1 + c2_l1 * v2;
+    Mv2 = c0_l2 * v0 + c1_l2 * v1 + c2_l2 * v2;
+}
+
+Matrice& Matrice::operator*=(Matrice const& other)
+{
+    // TODO: optimize
+    *this = ProdMat(*this, other);
+    return *this;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Matrice ProdMat(Matrice const& A, Matrice const& B)
+{
+    Matrice out;
+
+    out.c0_l0 = A.c0_l0 * B.c0_l0 + A.c1_l0 * B.c0_l1 + A.c2_l0 * B.c0_l2;
+    out.c1_l0 = A.c0_l0 * B.c1_l0 + A.c1_l0 * B.c1_l1 + A.c2_l0 * B.c1_l2;
+    out.c2_l0 = A.c0_l0 * B.c2_l0 + A.c1_l0 * B.c2_l1 + A.c2_l0 * B.c2_l2;
+
+    out.c0_l1 = A.c0_l1 * B.c0_l0 + A.c1_l1 * B.c0_l1 + A.c2_l1 * B.c0_l2;
+    out.c1_l1 = A.c0_l1 * B.c1_l0 + A.c1_l1 * B.c1_l1 + A.c2_l1 * B.c1_l2;
+    out.c2_l1 = A.c0_l1 * B.c2_l0 + A.c1_l1 * B.c2_l1 + A.c2_l1 * B.c2_l2;
+
+    out.c0_l2 = A.c0_l2 * B.c0_l0 + A.c1_l2 * B.c0_l1 + A.c2_l2 * B.c0_l2;
+    out.c1_l2 = A.c0_l2 * B.c1_l0 + A.c1_l2 * B.c1_l1 + A.c2_l2 * B.c1_l2;
+    out.c2_l2 = A.c0_l2 * B.c2_l0 + A.c1_l2 * B.c2_l1 + A.c2_l2 * B.c2_l2;
+    return out;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Matrice TransMat(Matrice const& A)
+{
+    Matrice out;
+    out.c0_l0 = A.c0_l0;
+    out.c1_l0 = A.c0_l1;
+    out.c2_l0 = A.c0_l2;
+    out.c0_l1 = A.c1_l0;
+    out.c1_l1 = A.c1_l1;
+    out.c2_l1 = A.c1_l2;
+    out.c0_l2 = A.c2_l0;
+    out.c1_l2 = A.c2_l1;
+    out.c2_l2 = A.c2_l2;
+    return out;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+ostream& operator<<(ostream& os, Matrice const& A)
+{
+    os << A.c0_l0 << "\t" << A.c1_l0 << "\t" << A.c2_l0 << "\n";
+    os << A.c0_l1 << "\t" << A.c1_l1 << "\t" << A.c2_l1 << "\n";
+    os << A.c0_l2 << "\t" << A.c1_l2 << "\t" << A.c2_l2 << "\n";
+    return os;
+}
+
+void Write(Matrice const& A, ostream& out)
+{
+    out << A;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Raf98::Raf98()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Raf98::~Raf98()
+{
+    m_dvalues.clear();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Raf98::Interpol(double longitude, double latitude, double* Hwgs84) const
+{
+    *Hwgs84 = 0.0;
+    if (m_dvalues.size() == 0) {
+        return false;
+    }
+    const double longitude_min = -5.5;
+    const double longitude_max = 8.5;
+    if (longitude < longitude_min) {
+        return false;
+    }
+    if (longitude > longitude_max) {
+        return false;
+    }
+    const double latitude_min = 42;
+    const double latitude_max = 51.5;
+    if (latitude < latitude_min) {
+        return false;
+    }
+    if (latitude > latitude_max) {
+        return false;
+    }
+    //conversion en position
+    double longPix = (longitude - longitude_min) * 30.;
+    double latPix = (latitude_max - latitude) * 40.;
+
+    double RestCol, RestLig;
+    double ColIni, LigIni;
+    RestCol = modf(longPix, &ColIni);
+    RestLig = modf(latPix, &LigIni);
+
+    double Zbd = (1.0 - RestCol) * (1.0 - RestLig) * LitGrille(ColIni, LigIni);
+    Zbd += RestCol * (1.0 - RestLig) * LitGrille(ColIni + 1, LigIni);
+    Zbd += (1.0 - RestCol) * RestLig * LitGrille(ColIni, LigIni + 1);
+    Zbd += RestCol * RestLig * LitGrille(ColIni + 1, LigIni + 1);
+    *Hwgs84 = Zbd;
+
+    return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+double Raf98::LitGrille(unsigned int c, unsigned int l) const
+{
+    const unsigned int w = 421;
+    //    const unsigned int h=381;
+    return m_dvalues.at(c + l * w);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Raf98::Load(const string& s)
+{
+    ifstream in(s.c_str());
+    unsigned int w = 421;
+    unsigned int h = 381;
+
+    m_dvalues.reserve(w * h);
+
+    char entete[1024]; //sur 3 lignes
+    in.getline(entete, 1023);
+    in.getline(entete, 1023);
+    in.getline(entete, 1023);
+
+    char bidon[1024];
+    double val;
+    for (unsigned int i = 0; i < h; ++i) {
+        for (unsigned int j = 0; j < 52; ++j) {
+            for (unsigned int k = 0; k < 8; ++k) {
+                in >> val;
+                m_dvalues.push_back(val);
+            }
+            in.getline(bidon, 1023);
+        }
+        for (unsigned int k = 0; k < 5; ++k) {
+            in >> val;
+            m_dvalues.push_back(val);
+        }
+        in.getline(bidon, 1023);
+        if (!in.good()) {
+            m_dvalues.clear();
+            return false;
+        }
+    }
+    return in.good();
+}
+
+} // namespace Geodesy
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////////////
+//ALGO0001
+double Geodesy::LatitueIsometrique(double latitude, double e)
+{
+    double li = log(tan(pi<double>() / 4. + latitude / 2.)) + e * log((1 - e * sin(latitude)) / (1 + e * sin(latitude))) / 2;
+    return li;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//ALGO0002
+double Geodesy::LatitueIsometrique2Lat(double latitude_iso, double e, double epsilon)
+{
+    double latitude_i = 2 * atan(exp(latitude_iso)) - half_pi<double>();
+    double latitude_ip1 = latitude_i + epsilon * 2;
+    while (abs(latitude_i - latitude_ip1) > epsilon) {
+        latitude_i = latitude_ip1;
+        latitude_ip1 = 2 * atan(
+                               exp(e * 0.5 * log(
+                                                 (1 + e * sin(latitude_i)) / (1 - e * sin(latitude_i))))
+                               * exp(latitude_iso)) - half_pi<double>();
+    }
+    return latitude_ip1;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void Geodesy::Geo2ProjLambert(
+    double lambda, double phi,
+    double n, double c, double e,
+    double lambdac, double xs, double ys,
+    double& X, double& Y)
+{
+    double lat_iso = LatitueIsometrique(phi, e);
+    X = xs + c * exp(-n * lat_iso) * sin(n * (lambda - lambdac));
+    Y = ys - c * exp(-n * lat_iso) * cos(n * (lambda - lambdac));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//ALGO0004
+void Geodesy::Proj2GeoLambert(
+    double X, double Y,
+    double n, double c, double e,
+    double lambdac, double xs, double ys,
+    double epsilon,
+    double& lambda, double& phi)
+{
+    double X_xs = X - xs;
+    double ys_Y = ys - Y;
+    double R = sqrt(X_xs * X_xs + ys_Y * ys_Y);
+    double gamma = atan(X_xs / ys_Y);
+    lambda = lambdac + gamma / n;
+    double lat_iso = -1 / n * log(fabs(R / c));
+    phi = LatitueIsometrique2Lat(lat_iso, e, epsilon);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+double Geodesy::ConvMerApp(double longitude)
+{
+    double phi0_Lambert93 = Deg2Rad(46.5);
+    double lambda0_Lambert93 = Deg2Rad(3.0);
+    double conv = -sin(phi0_Lambert93) * (longitude - lambda0_Lambert93);
+    return conv;
+}
+
+////////////////////////////////////////////////////////////////////
+void Geodesy::Geographique_2_Lambert93(const Raf98& raf98, double lambda, double phi, double he, Matrice in, double& E, double& N, double& h, Matrice& out)
+{
+    Matrice passage;
+    double conv = Geodesy::ConvMerApp(lambda);
+    double c_ = cos(conv);
+    double s_ = sin(conv);
+
+    passage.c0_l0 = c_;
+    passage.c0_l1 = s_;
+    passage.c0_l2 = 0.0;
+
+    passage.c1_l0 = -s_;
+    passage.c1_l1 = c_;
+    passage.c1_l2 = 0.0;
+
+    passage.c2_l0 = 0.0;
+    passage.c2_l1 = 0.0;
+    passage.c2_l2 = 1.0;
+
+    out = passage * in;
+    double diff_h;
+    raf98.Interpol(Rad2Deg(lambda), Rad2Deg(phi), &diff_h);
+    h = he - diff_h;
+
+    Geodesy::Geo2ProjLambert(
+        lambda, phi,
+        n_Lambert93, c_Lambert93, e_Lambert93,
+        lambda0_Lambert93, xs_Lambert93, ys_Lambert93,
+        E, N);
+}
+
+////////////////////////////////////////////////////////////////////////
+void Geodesy::Geographique_2_Lambert93(const Raf98& raf98, double lambda, double phi, double he, double& E, double& N, double& h)
+{
+    Geodesy::Geo2ProjLambert(
+        lambda, phi,
+        n_Lambert93, c_Lambert93, e_Lambert93,
+        lambda0_Lambert93, xs_Lambert93, ys_Lambert93,
+        E, N);
+
+    double diff_h;
+    raf98.Interpol(Rad2Deg(lambda), Rad2Deg(phi), &diff_h);
+    h = he - diff_h;
+}
+
+/// Converts Lambert93 coordinates (East, North, Height) into geographical coordinates in radians (Longitude = Rad2Deg(lambda), Latitude = Rad2Deg(phi), Height)
+void Geodesy::Lambert93_2_Geographique(const Raf98& raf98, double E, double N, double h, double& lambda, double& phi, double& he)
+{
+    Geodesy::Proj2GeoLambert(
+        E, N,
+        n_Lambert93, c_Lambert93, e_Lambert93,
+        lambda0_Lambert93, xs_Lambert93, ys_Lambert93,
+        0.0000000000000001,
+        lambda, phi);
+
+    double diff_h;
+    raf98.Interpol(Rad2Deg(lambda), Rad2Deg(phi), &diff_h);
+    he = h + diff_h;
+}
+
+////////////////////////////////////////////////////////////////////////
+void Geodesy::Lambert93_2_Geographique(const Raf98& raf98, double E, double N, double h, Matrice in, double& lambda, double& phi, double& he, Matrice& out)
+{
+    Geodesy::Proj2GeoLambert(
+        E, N,
+        n_Lambert93, c_Lambert93, e_Lambert93,
+        lambda0_Lambert93, xs_Lambert93, ys_Lambert93,
+        0.0000000000000001,
+        lambda, phi);
+
+    Matrice passage;
+    double conv = Geodesy::ConvMerApp(lambda);
+    double c_ = cos(conv);
+    double s_ = sin(conv);
+
+    passage.c0_l0 = c_;
+    passage.c0_l1 = -s_;
+    passage.c0_l2 = 0.0;
+
+    passage.c1_l0 = s_;
+    passage.c1_l1 = c_;
+    passage.c1_l2 = 0.0;
+
+    passage.c2_l0 = 0.0;
+    passage.c2_l1 = 0.0;
+    passage.c2_l2 = 1.0;
+
+    out = passage * in;
+
+    double diff_h;
+    raf98.Interpol(Rad2Deg(lambda), Rad2Deg(phi), &diff_h);
+    he = h + diff_h;
+}
+
+////////////////////////////////////////////////////////////////////////
+void Geodesy::Geographique_2_ECEF(double longitude, double latitude, double he, double& x, double& y, double& z)
+{
+    const double n = GRS_a / sqrt(1.0 - pow(GRS_e, 2) * pow(sin(latitude), 2));
+    x = (n + he) * cos(latitude) * cos(longitude);
+    y = (n + he) * cos(latitude) * sin(longitude);
+    z = (n * (1.0 - pow(GRS_e, 2)) + he) * sin(latitude);
+}
+
+////////////////////////////////////////////////////////////////////////
+void Geodesy::ECEF_2_ENU(double x, double y, double z, double& e, double& n, double& u, double lon0, double lat0, double he0)
+{
+    double slat = sin(lat0);
+    double clat = cos(lat0);
+    double slon = sin(lon0);
+    double clon = cos(lon0);
+
+    Matrice C;
+    C.c0_l0 = -slon;
+    C.c1_l0 = clon;
+
+    C.c0_l1 = -clon * slat;
+    C.c1_l1 = -slon * slat;
+    C.c2_l1 = clat;
+
+    C.c0_l2 = clon * clat;
+    C.c1_l2 = slon * clat;
+    C.c2_l2 = slat;
+
+    double x0, y0, z0;
+    Geographique_2_ECEF(lon0, lat0, he0, x0, y0, z0);
+
+    x -= x0;
+    y -= y0;
+    z -= z0;
+
+    C.Apply(x, y, z, e, n, u);
+}
+
+QMatrix4x4 Geodesy::yprenuToMatrix(QVector3D angle, QVector3D position)
+{
+    float c1 = cos(angle.x());
+    float c2 = cos(angle.y());
+    float c3 = cos(angle.z());
+
+    float s1 = sin(angle.x());
+    float s2 = sin(angle.y());
+    float s3 = sin(angle.z());
+
+    // Source : https://en.wikipedia.org/wiki/Euler_angles
+    return QMatrix4x4(c1 * c2, c1 * s2 * s3 - c3 * s1, s1 * s3 + c1 * c3 * s2, position.x(),
+                      c2 * s1, c1 * c3 + s1 * s2 * s3, c3 * s1 * s2 - c1 * s3, position.y(),
+                      -s2, c2 * s3, c2 * c3, position.z(),
+                      0, 0, 0, 1);
+}
Index: tags/0.2.3/src/PacpusTools/src/matrice.cpp
===================================================================
--- tags/0.2.3/src/PacpusTools/src/matrice.cpp	(revision 368)
+++ tags/0.2.3/src/PacpusTools/src/matrice.cpp	(revision 368)
@@ -0,0 +1,405 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+/// @author  Jean Laneurit <firstname.surname@utc.fr>
+/// @date    April, 2010
+// %pacpus:license}
+
+#include <Pacpus/PacpusTools/matrice.h>
+
+#include <cstdlib>
+#include <iostream>
+
+using ::std::cout;
+using ::std::endl;
+
+// Le constructeur :
+matrice::matrice()
+{
+    n = 0;
+    m = 0;
+}
+matrice::matrice(unsigned short int nl, unsigned short int nc)
+{
+    n = nl;
+    m = nc;
+    lignes = new ligne[n];
+    for (unsigned short int i=0; i<n; ++i) {
+        lignes[i] = new double[m];
+    }
+}
+
+void matrice::Alloue(unsigned short int nl, unsigned short int nc)
+{
+    n = nl;
+    m = nc;
+    lignes = new ligne[n];
+    for (unsigned short int i=0; i<n; ++i)
+        lignes[i] = new double[m];
+}
+
+matrice::matrice(unsigned short int nl, unsigned short int nc, t_m type)
+{
+    n = nl;
+    m = nc;
+    lignes = new ligne[n];
+    for (unsigned short int i=0; i<n; ++i)
+        lignes[i] = new double[m];
+
+    switch(type)
+    {
+    case ONES :
+    {
+        for (unsigned short int i=0; i<n; ++i) // Initialisation avec des 1
+            for (unsigned short int j=0; j<m; ++j)
+                lignes[i][j] = 1;
+        break;
+    }
+    case ZEROS :
+    {
+        for (unsigned short int i=0; i<n; ++i) // Initialisation avec des 0
+            for (unsigned short int j=0; j<m; ++j)
+                lignes[i][j] = 0;
+        break;
+    }
+    case IDENTITY :
+    {
+        if (n==m)
+        {
+            for (unsigned short int i=0; i<n; ++i)
+            { // Initialisation en matrice identit�
+                for (unsigned short int j=0; j<m; ++j)
+                    lignes[i][j] = 0;
+                lignes[i][i] = 1;
+            }
+        }
+        else
+        {
+            cout<<"Matrice identit� doit �tre carr�";
+            exit(0);
+        }
+        break;
+    }
+    }
+}
+
+// Le constructeur de copie :
+matrice::matrice(const matrice &source)
+{
+    m = source.m;
+    n = source.n;
+    lignes = new ligne[n];   // Alloue.
+    for (unsigned short int i=0; i<n; ++i)
+    {
+        lignes[i] = new double[m];
+        for (unsigned short int j=0; j<m; ++j)  // Copie.
+            lignes[i][j] = source.lignes[i][j];
+    }
+}
+
+// Le destructeur :
+matrice::~matrice(void)
+{
+    if (n!=0 && m!=0) {
+        for (unsigned short int i=0; i<n; ++i)
+            delete[] lignes[i];
+        delete[] lignes;
+    }
+}
+
+// L'op�rateur d'affectation :
+matrice &matrice::operator=(const matrice &source)
+{
+    if (&source != this)
+    {
+        if (source.n!=n || source.m!=m)   // V�rifie lesdimensions.
+        {
+            if (n!=0 && m!=0) {
+                for (unsigned short int i=0; i<n; ++i)
+                    delete[] lignes[i];
+                delete[] lignes;              // D�truit...
+            }
+            m = source.m;
+            n = source.n;
+            lignes = new ligne[n];        // et r�alloue.
+            for (unsigned short i=0; i<n; ++i) lignes[i] = new double[m];
+        }
+        for (unsigned short int i=0; i<n; ++i) // Copie.
+            for (unsigned short int j=0; j<m; ++j)
+                lignes[i][j] = source.lignes[i][j];
+    }
+    return *this;
+}
+
+matrice &matrice::operator=(double x) {
+    if (!n && !m) {
+        cout << " =double : taille matrice inconnue";
+        exit(0);
+    }
+    for (unsigned short int i=0; i<n; ++i) // Copie.
+        for (unsigned short int j=0; j<m; ++j)
+            lignes[i][j] = x;
+    return *this;
+}
+
+
+// operateur m1 += m2;
+matrice &matrice::operator+=(const matrice &source) {
+    if (&source != this)
+    {
+        if (source.n!=n || source.m!=m)   // V�rifie lesdimensions.
+        {
+            cout << "addition : dimensions matrice incompatibles\n";
+            exit(0);
+        }
+        for (unsigned short int i=0; i<n; ++i) // Addition
+            for (unsigned short int j=0; j<m; ++j)
+                lignes[i][j] =  lignes[i][j]+source.lignes[i][j];
+    }
+    return *this;
+}
+
+// operateur m1 -= m2;
+matrice &matrice::operator-=(const matrice &source) {
+    if (&source != this)
+    {
+        if (source.n!=n || source.m!=m)   // V�rifie lesdimensions.
+        {
+            cout << "soustraction : dimensions matrice incompatibles\n";
+            exit(0);
+        }
+        for (unsigned short int i=0; i<n; ++i) // Addition
+            for (unsigned short int j=0; j<m; ++j)
+                lignes[i][j] =lignes[i][j]-source.lignes[i][j];
+    }
+    return *this;
+}
+
+// Addition :
+matrice matrice::operator+(const matrice &m1) const
+{
+
+    if (m1.n!=n || m1.m!=m)   // V�rifie lesdimensions.
+    {
+        cout << "addition : dimensions matrice incompatibles\n";
+        exit(0);
+    }
+    matrice tmp(n,m);
+    for (unsigned short int i=0; i<n; i++)   // Double boucle.
+        for (unsigned short int j=0; j<m; j++)
+            tmp.lignes[i][j] = lignes[i][j]+m1.lignes[i][j];
+    return tmp;
+}
+
+// Soustraction :
+matrice matrice::operator-(const matrice &m1) const
+{  
+    if (m1.n!=n || m1.m!=m)   // V�rifie lesdimensions.
+    { 
+        cout << "soustraction : dimensions matrice incompatibles\n";
+        exit(0);
+    } 
+    matrice tmp(n,m);
+    for (unsigned short int i=0; i<n; i++)  // Double boucle.
+        for (unsigned short int j=0; j<m; j++)
+            tmp.lignes[i][j]=lignes[i][j]-m1.lignes[i][j];
+    return tmp;
+}
+
+// Multiplication :
+matrice matrice::operator*(const matrice &m1) const
+{  
+
+    if (m1.n!=m)   // V�rifie lesdimensions.
+    { 
+        cout << "multiplication : dimensions matrice incompatibles\n";
+        exit(0);
+    } 
+    matrice tmp(n,m1.m);
+    for (unsigned short int i=0; i<n; i++)  // Double boucle.
+        for (unsigned short int j=0; j<m1.m; j++)
+        {
+            tmp.lignes[i][j]=0.;               // Produit scalaire.
+            for (unsigned short int k=0; k<m; k++)
+                tmp.lignes[i][j] += lignes[i][k]*m1.lignes[k][j];
+        }
+    return tmp;
+}
+
+//Addition avec un scalaire 
+matrice &matrice::operator+=(double x) { 
+    for (unsigned short int i=0; i<n; i++)  // Double boucle.
+        for (unsigned short int j=0; j<m; j++)
+            lignes[i][j] += x;
+    return *this;
+}
+
+//soustraction avec un scalaire 
+matrice &matrice::operator-=(double x) {
+    for (unsigned short int i=0; i<n; i++)  // Double boucle.
+        for (unsigned short int j=0; j<m; j++)
+            lignes[i][j] -= x;
+    return *this;
+}
+
+//Addition matrice avec scalaire
+matrice matrice::operator+(double x)const{ 
+    matrice tmp(n,m);
+    for (unsigned short int i=0; i<n; i++)  // Double boucle.
+        for (unsigned short int j=0; j<m; j++)
+            tmp.lignes[i][j]=lignes[i][j]+x;
+    return tmp;
+}
+
+//Soustraction matrice avec scalaire
+matrice matrice::operator-(double x)const{
+    matrice tmp(n,m);
+    for (unsigned short int i=0; i<n; i++)  // Double boucle.
+        for (unsigned short int j=0; j<m; j++)
+            tmp.lignes[i][j] = lignes[i][j]-x;
+    return tmp;
+}
+
+//Produit matrice avec scalaire
+matrice matrice::operator*(double x)const{
+    matrice tmp(n,m);
+    for (unsigned short int i=0; i<n; i++)  // Double boucle.
+        for (unsigned short int j=0; j<m; j++)
+            tmp.lignes[i][j] = lignes[i][j]*x;
+    return tmp;
+}
+
+//Division matrice par un scalaire
+matrice matrice::operator/(double x)const{
+    matrice tmp(n,m);
+    for (unsigned short int i=0; i<n; i++)  // Double boucle.
+        for (unsigned short int j=0; j<m; j++)
+            tmp.lignes[i][j] = lignes[i][j]/x;
+    return tmp;
+}
+
+//Transpose
+matrice matrice::T()
+{  
+    matrice tmp(m,n);
+    for (unsigned short int i=0; i<n; i++)  // Double boucle.
+        for (unsigned short int j=0; j<m; j++)
+            tmp.lignes[j][i]=lignes[i][j];
+    return tmp;
+}
+
+//Inversion
+//#define SWAP(a,b) {float temp=(a);(a)=(b);(b)=temp;}
+#define ABS(x) ((x)<0 ? (-(x)) : (x))
+matrice matrice::I()
+{  
+    matrice tmp = *this ;
+    unsigned short int   *indxc,*indxr,*ipiv;
+    unsigned short int    i,j,k,l,ll,icol=0,irow=0;
+    double   big,dum,pivinv;
+
+    indxc = new unsigned short int[n+1];
+    indxr = new unsigned short int[n+1];
+    ipiv  = new unsigned short int[n+1];
+
+    for (j=1;j<=n;j++) ipiv[j]=0;
+    for (i=1;i<=n;i++) {
+        big=0.0;
+        for (j=1;j<=n;j++) {
+            if (ipiv[j] != 1) {
+                for (k=1;k<=n;k++) {
+                    if (ipiv[k] == 0) {
+                        if (ABS(tmp.lignes[j-1][k-1]) >= big) {
+                            big=ABS(tmp.lignes[j-1][k-1]) ;
+                            irow=j;
+                            icol=k;
+                        }
+                    } else if (ipiv[k] > 1) cout << "inversion : matrice singuli�re -type 1-";
+                }
+            }
+        }
+        ++(ipiv[icol]);
+        if (irow != icol) {
+            for (l=1;l<=n;l++) {
+                std::swap(tmp.lignes[irow-1][l-1], tmp.lignes[icol-1][l-1]);
+            }
+        }
+        indxr[i]=irow;
+        indxc[i]=icol;
+        if (tmp.lignes[icol-1][icol-1] == 0.0) cout << "inversion : matrice signuli�re -type 2-";
+        pivinv=1.0/tmp.lignes[icol-1][icol-1];
+        tmp.lignes[icol-1][icol-1]=1.0;
+        for (l=1;l<=n;l++) tmp.lignes[icol-1][l-1] *= pivinv;
+        for (ll=1;ll<=n;ll++) {
+            if (ll != icol) {
+                dum=tmp.lignes[ll-1][icol-1];
+                tmp.lignes[ll-1][icol-1]=0.0;
+                for (l=1;l<=n;l++) tmp.lignes[ll-1][l-1] -= tmp.lignes[icol-1][l-1]*dum;
+            }
+        }
+    }
+    for (l=n;l>=1;l--) {
+        if (indxr[l] != indxc[l]) {
+            for (k=1;k<=n;k++) {
+                std::swap(tmp.lignes[k-1][indxr[l]-1],tmp.lignes[k-1][indxc[l]-1]);
+            }
+        }
+    }
+    delete []ipiv ;
+    delete []indxr ;
+    delete []indxc ;
+    return tmp ;
+}
+//#undef SWAP
+#undef ABS
+
+// Op�rateur d'acc�s en �criture:
+double &matrice::operator()(unsigned short int i,unsigned short int j)
+{  
+    if ((i-1<0) || (j-1<0) || (i-1>n) || (j-1>m)) { // v�rifie les indices
+        cout << "�criture : indice incorrect " << i << "x" << j << '\n' ;
+        exit(0);
+    }
+    return lignes[i-1][j-1];
+} 
+
+double &matrice::operator()(unsigned short int i)
+{  
+    if (i-1<0 || i-1>n*m) {
+        cout << "lecture : indice incorrect" << i <<'\n' ;
+        exit(0);
+    }
+    return **(lignes+i-1);
+}
+
+// Op�rateur d'acc�s en lecture:
+double matrice::operator()(unsigned short int i, unsigned short int j) const
+{  
+    if ((i-1<0) || (j-1<0) || (i-1>n) || (j-1>m)) { // v�rifie les indices
+        cout << "lecture : indice incorrect" << i << "x" << j<< '\n' ;
+        exit(0);
+    }
+    return lignes[i-1][j-1];
+} 
+
+double matrice::operator()(unsigned short int i) const
+{  
+    if (i-1<0 || i-1>n*m) {
+        cout << "lecture : indice incorrect" << i <<'\n' ;
+        exit(0);
+    }
+    return **(lignes+i-1);
+}
+
+// Affiche la matrice
+void matrice::print(const char *nom) {
+    cout << "" << nom << " est une matrice[" << n << "x" << m << "]" << endl  ;
+
+    for (unsigned short int i=0; i<n; ++i) {
+        for (unsigned short int j=0; j<m; ++j) {
+            cout << lignes[i][j] <<'\t';
+        }
+        cout << endl;
+    }
+    cout << endl ;
+}
Index: tags/0.2.3/src/RoadTime/CMakeLists.txt
===================================================================
--- tags/0.2.3/src/RoadTime/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/src/RoadTime/CMakeLists.txt	(revision 368)
@@ -0,0 +1,42 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+project(ROAD_TIME)
+
+# ========================================
+# Compiler definitions
+# ========================================
+add_definitions(
+    -DROAD_TIME_EXPORTS
+)
+
+# ========================================
+# List of sources
+# ========================================
+set(
+    PROJECT_SRCS
+    ./src/road_time.c
+)
+
+# ========================================
+# Build a library
+# ========================================
+pacpus_add_library(
+    ${PROJECT_NAME} SHARED
+    ${PROJECT_SRCS}
+)
+
+# ========================================
+# Install
+# ========================================
+pacpus_install(${PROJECT_NAME})
+
+# ========================================
+# Folder
+# ========================================
+pacpus_folder(${PROJECT_NAME} "libraries")
Index: tags/0.2.3/src/RoadTime/src/road_time.c
===================================================================
--- tags/0.2.3/src/RoadTime/src/road_time.c	(revision 368)
+++ tags/0.2.3/src/RoadTime/src/road_time.c	(revision 368)
@@ -0,0 +1,190 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+
+#ifdef WIN32
+  #include <windows.h>
+#endif
+
+#include <Pacpus/kernel/road_time.h>
+
+#include <memory.h> 
+#include <sys/types.h>
+#include <sys/timeb.h>
+#include <malloc.h>
+
+
+
+#define SHMEMSIZE sizeof(struct Initialisation_Time) 
+ 
+static LPVOID lpvMem = NULL; // pointer to shared memory
+
+VOID SetSharedMem(struct Initialisation_Time * toto);
+VOID GetSharedMem(struct Initialisation_Time * toto);
+
+BOOL WINAPI DllMain( HANDLE hModule, 
+                       DWORD  ul_reason_for_call, 
+                       LPVOID lpReserved
+                     )
+{
+    HANDLE hMapObject = NULL;  // handle to file mapping
+    BOOL fInit, fIgnore; 
+    struct Initialisation_Time First_Launcher;
+    struct timeb timeptr;
+    LARGE_INTEGER tmp;
+
+    switch (ul_reason_for_call)
+    {
+        case DLL_THREAD_ATTACH:
+            break;
+        case DLL_PROCESS_ATTACH:
+            // Create a named file mapping object.
+            hMapObject = CreateFileMapping( 
+                INVALID_HANDLE_VALUE, // use paging file
+                NULL,                 // default security attributes
+                PAGE_READWRITE,       // read/write access
+                0,                    // size: high 32-bits
+                SHMEMSIZE,            // size: low 32-bits
+                "roadtimedllmemfilemap");     // name of map object
+            if (hMapObject == NULL) 
+                return FALSE; 
+ 
+            // The first process to attach initializes memory.
+ 
+            fInit = (GetLastError() != ERROR_ALREADY_EXISTS); 
+ 
+            // Get a pointer to the file-mapped shared memory.
+ 
+            lpvMem = MapViewOfFile( 
+                hMapObject,     // object to map view of
+                FILE_MAP_WRITE, // read/write access
+                0,              // high offset:  map from
+                0,              // low offset:   beginning
+                0);             // default: map entire file
+            if (lpvMem == NULL) 
+                return FALSE; 
+ 
+            // Initialize memory if this is the first process.
+            if (fInit) 
+                {
+                    memset(lpvMem, '\0', SHMEMSIZE); 
+                    
+                    ftime(&timeptr );
+                    First_Launcher.Real_Time=(road_time_t) timeptr.time * 1000000 +(road_time_t) timeptr.millitm * 1000;
+                    if (!QueryPerformanceFrequency(&tmp))
+                        {
+                            MessageBox(NULL,"No Multimedia Counter Available","DLL Message",MB_OK);
+                            First_Launcher.Multimedia_Counter_Frequency=(unsigned __int64) 0;
+                            First_Launcher.Multimedia_Counter=(unsigned __int64)0;
+                            First_Launcher.delta_t=First_Launcher.Real_Time;
+                            SetSharedMem(&First_Launcher);
+                            return FALSE;
+                        }    
+                    First_Launcher.Multimedia_Counter_Frequency=(unsigned __int64) tmp.QuadPart;
+                    if (!QueryPerformanceCounter(&tmp))
+                        {    
+                            MessageBox(NULL,"Couldn't Get the value of Multimedia Counter","DLL Message",MB_OK);
+                            First_Launcher.Multimedia_Counter_Frequency=(unsigned __int64) 0;
+                            First_Launcher.Multimedia_Counter=(unsigned __int64)0;
+                            First_Launcher.delta_t=First_Launcher.Real_Time;
+                            SetSharedMem(&First_Launcher);
+                            return FALSE;
+                        }
+                    First_Launcher.Multimedia_Counter=(unsigned __int64)tmp.QuadPart;
+                    First_Launcher.delta_t=First_Launcher.Real_Time-(road_time_t) (First_Launcher.Multimedia_Counter*1000000/First_Launcher.Multimedia_Counter_Frequency);
+                    //MessageBox(NULL,"You called Road_Time_2.DLL","DLL Message",MB_OK);
+                    SetSharedMem(&First_Launcher);
+
+
+                }
+            break;
+        case DLL_THREAD_DETACH:
+            break;
+        case DLL_PROCESS_DETACH:
+             // Unmap shared memory from the process's address space.
+             // In the case of the last process, Windwos automatically clean up the memory.
+             fIgnore = UnmapViewOfFile(lpvMem); 
+             // Close the process's handle to the file-mapping object.
+             fIgnore = CloseHandle(hMapObject); 
+            break;
+    }
+    return TRUE;
+}
+
+
+// SetSharedMem sets the contents of shared memory. 
+VOID SetSharedMem(struct Initialisation_Time * toto) 
+{ 
+    // Copy the null-terminated string into shared memory.
+ 
+    memcpy(lpvMem,toto,sizeof(struct Initialisation_Time));
+} 
+ 
+// GetSharedMem gets the contents of shared memory. 
+VOID GetSharedMem(struct Initialisation_Time * toto) 
+{ 
+    memcpy(toto,lpvMem,sizeof(struct Initialisation_Time));
+}
+
+
+// This is an example of an exported function.
+road_time_t ROAD_TIME_API road_time2(void)
+{
+    struct Initialisation_Time First_Launcher;
+    road_time_t reply;
+    LARGE_INTEGER tmp;
+    struct timeb timeptr;
+    
+    GetSharedMem(&First_Launcher);
+
+    if (!QueryPerformanceCounter(&tmp))
+        {    
+            MessageBox(NULL,"Couldn't Get the value of Multimedia Counter","DLL Message",MB_OK);
+            ftime(&timeptr );
+            reply=(road_time_t) timeptr.time * 1000000 +(road_time_t) timeptr.millitm * 1000;
+        }
+                    
+    else
+        {    
+            reply=(road_time_t) First_Launcher.Real_Time + (road_time_t) (((unsigned __int64) tmp.QuadPart - First_Launcher.Multimedia_Counter) * 1000000/First_Launcher.Multimedia_Counter_Frequency);
+        }
+    return(reply);
+
+}
+
+// This is an example of a second exported function.
+road_time_t ROAD_TIME_API road_time(void)
+{
+    struct Initialisation_Time First_Launcher;
+    road_time_t reply;
+    LARGE_INTEGER tmp;
+    struct timeb timeptr;
+    
+    GetSharedMem(&First_Launcher);
+    
+    if (!QueryPerformanceCounter(&tmp))
+        {    
+            MessageBox(NULL,"Couldn't Get the value of Multimedia Counter","DLL Message",MB_OK);
+            ftime(&timeptr );
+            reply=(road_time_t) timeptr.time * 1000000 +(road_time_t) timeptr.millitm * 1000;
+        }
+                    
+    else
+        {    
+            reply=First_Launcher.delta_t+(road_time_t) ((tmp.QuadPart*1000000)/First_Launcher.Multimedia_Counter_Frequency);
+            
+        }
+    return(reply);
+
+}
+
+// This is an example of a second exported function.
+struct Initialisation_Time ROAD_TIME_API road_time_init(void)
+{
+    struct Initialisation_Time First_Launcher;
+    
+    GetSharedMem(&First_Launcher);
+    return(First_Launcher);
+
+}
Index: tags/0.2.3/src/_NewComponent/CMakeLists.txt
===================================================================
--- tags/0.2.3/src/_NewComponent/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/src/_NewComponent/CMakeLists.txt	(revision 368)
@@ -0,0 +1,47 @@
+#################################################
+#   ___________    ____ ______  __ __  _____    #
+#   \____ \__  \ _/ ___\\____ \|  |  \/  ___/   #
+#   |  |_> > __ \\  \___|  |_> >  |  /\___ \    #
+#   |   __(____  /\___  >   __/|____//____  >   #
+#   |__|       \/     \/|__|              \/    #
+#                                               #
+#################################################
+
+project(PacpusNewComponent)
+cmake_minimum_required(VERSION 2.8)
+if(POLICY CMP0020)
+    cmake_policy(SET CMP0020  NEW) # for QT5.1 on windows / not work on linux
+endif()
+
+################################################################################
+set(PACPUS_COMPONENT_NAME "" CACHE STRING "name of the new component")
+
+if("${PACPUS_COMPONENT_NAME}" STREQUAL "")
+    message(FATAL_ERROR "You should set the PACPUS_COMPONENT_NAME variable")
+endif()
+
+################################################################################
+# set substitution variables
+string(TOUPPER "${PACPUS_COMPONENT_NAME}" PACPUS_COMPONENT_NAME_CAPS)
+if(WIN32)
+    set(USERNAME "$ENV{USERNAME}" CACHE STRING "username")
+else()
+    set(USERNAME "$ENV{USER}" CACHE STRING "username")
+endif()
+string(TIMESTAMP CURRENT_DATETIME "%Y-%m-%d %H:%M:%S")
+
+################################################################################
+# create directory for new files
+set(OUTPUT_DIR "../${PACPUS_COMPONENT_NAME}")
+file(MAKE_DIRECTORY "${OUTPUT_DIR}")
+
+# configure files
+configure_file("CMakeLists.txt.in" "${OUTPUT_DIR}/CMakeLists.txt" @ONLY)
+configure_file("NewComponent.h.in" "${OUTPUT_DIR}/${PACPUS_COMPONENT_NAME}.h" @ONLY)
+configure_file("NewComponent.cpp.in" "${OUTPUT_DIR}/${PACPUS_COMPONENT_NAME}.cpp" @ONLY)
+configure_file("NewComponentImpl.h.in" "${OUTPUT_DIR}/${PACPUS_COMPONENT_NAME}Impl.h" @ONLY)
+configure_file("NewComponentImpl.cpp.in" "${OUTPUT_DIR}/${PACPUS_COMPONENT_NAME}Impl.cpp" @ONLY)
+
+################################################################################
+message(STATUS "New component '${PACPUS_COMPONENT_NAME}' has been created.")
+message(STATUS "Please add line 'add_subdirectory(${PACPUS_COMPONENT_NAME})' to your main CMakeLists.txt file.")
Index: tags/0.2.3/src/_NewComponent/CMakeLists.txt.in
===================================================================
--- tags/0.2.3/src/_NewComponent/CMakeLists.txt.in	(revision 368)
+++ tags/0.2.3/src/_NewComponent/CMakeLists.txt.in	(revision 368)
@@ -0,0 +1,80 @@
+project(@PACPUS_COMPONENT_NAME@)
+
+set(${PROJECT_NAME}_VERSION_MAJOR 0)
+set(${PROJECT_NAME}_VERSION_MINOR 1)
+
+################################################################################
+create_export(EXPORT_HDR ${PROJECT_NAME})
+pacpus_plugin(PLUGIN_CPP PLUGIN_HDR ${PROJECT_NAME})
+
+################################################################################
+# DIRECTORIES
+include_directories(
+    ${PACPUSINCLUDE_DIRECTORY}
+    ${PROJECT_BINARY_DIR}
+    ${QT_INCLUDE_DIR}
+)
+
+link_directories(
+    #${PACPUS_LIB_DIR}
+)
+
+################################################################################
+# FILES
+set(HDRS
+    ${EXPORT_HDR}
+    @PACPUS_COMPONENT_NAME@.h
+    @PACPUS_COMPONENT_NAME@Impl.h
+)
+
+set(SRCS
+    ${PLUGIN_CPP}
+    @PACPUS_COMPONENT_NAME@.cpp
+    @PACPUS_COMPONENT_NAME@Impl.cpp
+)
+
+set(MOC_FILES
+    ${PLUGIN_HDR}
+    @PACPUS_COMPONENT_NAME@.h
+    @PACPUS_COMPONENT_NAME@Impl.h
+)
+
+set(UI_FILES
+)
+
+################################################################################
+# QT
+qt_wrap_cpp(MOC_SRCS
+    ${MOC_FILES}
+)
+qt_wrap_ui(UI_SRCS
+    ${UI_FILES}
+)
+
+################################################################################
+# BUILD and LINK
+pacpus_add_library(${PROJECT_NAME} SHARED
+    ${SRCS}
+    ${HDRS}
+    ${MOC_SRCS}
+    ${UI_SRCS}
+)
+
+# LIBS
+set(LIBS
+    ${PACPUS_LIBRARIES}
+    ${PACPUS_DEPENDENCIES_LIB}
+    ${QT_LIBRARIES}
+)
+
+# LINK
+target_link_libraries(${PROJECT_NAME} ${LIBS})
+
+################################################################################
+# FOLDERS
+pacpus_folder(${PROJECT_NAME} "components")
+
+################################################################################
+# INSTALL
+pacpus_install(${PROJECT_NAME})
+
Index: tags/0.2.3/src/_NewComponent/NewComponent.bat
===================================================================
--- tags/0.2.3/src/_NewComponent/NewComponent.bat	(revision 368)
+++ tags/0.2.3/src/_NewComponent/NewComponent.bat	(revision 368)
@@ -0,0 +1,4 @@
+@echo off
+:: Usage: NewComponent MyComponentName
+
+cmake -DPACPUS_COMPONENT_NAME:STRING=%1 .
Index: tags/0.2.3/src/_NewComponent/NewComponent.cpp.in
===================================================================
--- tags/0.2.3/src/_NewComponent/NewComponent.cpp.in	(revision 368)
+++ tags/0.2.3/src/_NewComponent/NewComponent.cpp.in	(revision 368)
@@ -0,0 +1,79 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+
+#include "@PACPUS_COMPONENT_NAME@.h"
+#include "@PACPUS_COMPONENT_NAME@Impl.h"
+
+#include <Pacpus/kernel/ComponentFactory.h>
+#include <Pacpus/kernel/Log.h>
+
+using namespace pacpus;
+using namespace std;
+
+DECLARE_STATIC_LOGGER("pacpus.@PACPUS_COMPONENT_NAME@");
+
+/// Constructs a static component factory
+static ComponentFactory<@PACPUS_COMPONENT_NAME@> sFactory("@PACPUS_COMPONENT_NAME@");
+
+//////////////////////////////////////////////////////////////////////////
+@PACPUS_COMPONENT_NAME@::@PACPUS_COMPONENT_NAME@(QString name)
+    : ComponentBase(name)
+{   
+    LOG_TRACE("constructor(" << name << ")");
+    
+    mImpl.reset(new Impl(this));
+    
+    //addParameters()
+    //("parameter-name", value<ParameterType>(&mImpl->mParameterVariable)->required(), "parameter description")
+    //("parameter-name", value<ParameterType>(&mImpl->mParameterVariable)->default_value(0), "parameter description")
+    //;
+}
+
+@PACPUS_COMPONENT_NAME@::~@PACPUS_COMPONENT_NAME@()
+{
+    LOG_TRACE("destructor");
+}
+
+//////////////////////////////////////////////////////////////////////////
+void @PACPUS_COMPONENT_NAME@::addInputs()
+{
+    // must inherit from QObject to use addInput
+    //addInput<InputType, @PACPUS_COMPONENT_NAME@>("input-name", &@PACPUS_COMPONENT_NAME@::processInput);
+}
+
+void @PACPUS_COMPONENT_NAME@::addOutputs()
+{
+    // must inherit from QObject to use addOutput
+    //addOutput<OutputType, @PACPUS_COMPONENT_NAME@>("output-name");
+}
+
+//////////////////////////////////////////////////////////////////////////
+void @PACPUS_COMPONENT_NAME@::startActivity()
+{
+    mImpl->start();
+}
+
+void @PACPUS_COMPONENT_NAME@::stopActivity()
+{
+    mImpl->stop();
+}
+
+//////////////////////////////////////////////////////////////////////////
+ComponentBase::COMPONENT_CONFIGURATION @PACPUS_COMPONENT_NAME@::configureComponent(XmlComponentConfig config)
+{
+	bool autoStart = false;	
+	if (config.getProperty("autoStart") != QString::null)
+		autoStart = config.getProperty("autoStart").toBool());
+		
+	if (autoStart)
+		this->startActivity();
+    return ComponentBase::CONFIGURED_OK;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//void @PACPUS_COMPONENT_NAME@::processInput(InputType const& input)
+//{
+//    mImpl->processInput(input);
+//}
Index: tags/0.2.3/src/_NewComponent/NewComponent.h.in
===================================================================
--- tags/0.2.3/src/_NewComponent/NewComponent.h.in	(revision 368)
+++ tags/0.2.3/src/_NewComponent/NewComponent.h.in	(revision 368)
@@ -0,0 +1,62 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @date created   @CURRENT_DATETIME@
+/// @author         @USERNAME@ <firstname.surname@utc.fr>
+/// @copyright      Copyright (c) UTC/CNRS Heudiasyc 2006 - 2014. All rights reserved.
+/// @version        $Id: $
+///
+/// @todo Brief description of @PACPUS_COMPONENT_NAME@.h.
+///
+/// @todo Detailed description of @PACPUS_COMPONENT_NAME@.h.
+
+#ifndef @PACPUS_COMPONENT_NAME_CAPS@_H
+#define @PACPUS_COMPONENT_NAME_CAPS@_H
+
+#include "@PACPUS_COMPONENT_NAME@Config.h"
+
+#include <Pacpus/kernel/ComponentBase.h>
+
+#include <boost/scoped_ptr.hpp>
+#include <QObject>
+
+namespace pacpus
+{
+
+class @PACPUS_COMPONENT_NAME_CAPS@_API @PACPUS_COMPONENT_NAME@
+    : public QObject
+    , public ComponentBase // must be after QObject
+{
+    Q_OBJECT
+
+public:
+    @PACPUS_COMPONENT_NAME@(QString name);
+    ~@PACPUS_COMPONENT_NAME@();
+
+    /// Starts the component
+    virtual void startActivity() /* override */;
+    /// Stops the component
+    virtual void stopActivity() /* override */;
+    /// Configures components
+    virtual ComponentBase::COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config) /* override */;
+
+//public Q_SLOTS:
+protected:
+    /// Adds component inputs
+    virtual void addInputs() /* override */;
+    /// Adds component outputs
+    virtual void addOutputs() /* override */;
+    
+private:
+    //void processInput(InputType const& input);
+
+private:
+    class Impl;
+    boost::scoped_ptr<Impl> mImpl;
+};
+
+} // namespace pacpus
+
+#endif // @PACPUS_COMPONENT_NAME_CAPS@_H
Index: tags/0.2.3/src/_NewComponent/NewComponent.sh
===================================================================
--- tags/0.2.3/src/_NewComponent/NewComponent.sh	(revision 368)
+++ tags/0.2.3/src/_NewComponent/NewComponent.sh	(revision 368)
@@ -0,0 +1,6 @@
+#!/bin/sh
+# Usage: NewComponent MyComponentName
+
+cmake -DPACPUS_COMPONENT_NAME:STRING=$1 .
+
+
Index: tags/0.2.3/src/_NewComponent/NewComponentImpl.cpp.in
===================================================================
--- tags/0.2.3/src/_NewComponent/NewComponentImpl.cpp.in	(revision 368)
+++ tags/0.2.3/src/_NewComponent/NewComponentImpl.cpp.in	(revision 368)
@@ -0,0 +1,42 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+
+#include "@PACPUS_COMPONENT_NAME@.h"
+#include "@PACPUS_COMPONENT_NAME@Impl.h"
+
+#include <Pacpus/kernel/Log.h>
+
+//using namespace boost;
+using namespace pacpus;
+//using namespace std;
+
+DECLARE_STATIC_LOGGER("pacpus.@PACPUS_COMPONENT_NAME@.Impl");
+
+//////////////////////////////////////////////////////////////////////////
+@PACPUS_COMPONENT_NAME@::Impl::Impl(@PACPUS_COMPONENT_NAME@* parent)
+    : mParent(parent)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////
+void @PACPUS_COMPONENT_NAME@::Impl::start()
+{
+}
+
+void @PACPUS_COMPONENT_NAME@::Impl::stop()
+{
+}
+
+//////////////////////////////////////////////////////////////////////////
+//void @PACPUS_COMPONENT_NAME@::Impl::outputData()
+//{
+//    OutputType data = generateData();
+//    checkedSend(mDataOutput, data);
+//}
+
+//////////////////////////////////////////////////////////////////////////
+//void @PACPUS_COMPONENT_NAME@::Impl::processInput(InputType const& input)
+//{
+//}
Index: tags/0.2.3/src/_NewComponent/NewComponentImpl.h.in
===================================================================
--- tags/0.2.3/src/_NewComponent/NewComponentImpl.h.in	(revision 368)
+++ tags/0.2.3/src/_NewComponent/NewComponentImpl.h.in	(revision 368)
@@ -0,0 +1,46 @@
+// %pacpus:license{
+// This file is part of the PACPUS framework distributed under the
+// CECILL-C License, Version 1.0.
+// %pacpus:license}
+/// @file
+/// @date created   @CURRENT_DATETIME@
+/// @author         @USERNAME@ <firstname.surname@utc.fr>
+/// @copyright      Copyright (c) UTC/CNRS Heudiasyc 2006 - 2014. All rights reserved.
+/// @version        $Id: $
+///
+/// @todo Brief description of @PACPUS_COMPONENT_NAME@Impl.h.
+///
+/// @todo Detailed description of @PACPUS_COMPONENT_NAME@Impl.h.
+
+#ifndef @PACPUS_COMPONENT_NAME_CAPS@IMPL_H
+#define @PACPUS_COMPONENT_NAME_CAPS@IMPL_H
+
+#include "@PACPUS_COMPONENT_NAME@.h"
+
+namespace pacpus
+{
+
+class @PACPUS_COMPONENT_NAME@::Impl
+    : public QObject
+{
+    Q_OBJECT
+
+public:
+    Impl(@PACPUS_COMPONENT_NAME@* parent);
+    
+    void start();
+    void stop();
+    //void processInput(InputType const& input);
+
+public Q_SLOTS:
+    //void outputData();
+
+private:
+
+private:
+    @PACPUS_COMPONENT_NAME@* mParent;
+};
+
+} // namespace pacpus
+
+#endif // @PACPUS_COMPONENT_NAME_CAPS@IMPL_H
Index: tags/0.2.3/src/dbcDecriptor/CMakeLists.txt
===================================================================
--- tags/0.2.3/src/dbcDecriptor/CMakeLists.txt	(revision 368)
+++ tags/0.2.3/src/dbcDecriptor/CMakeLists.txt	(revision 368)
@@ -0,0 +1,96 @@
+PROJECT(PacpusDBCDecriptor)
+################################################################################
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+
+# ========================================
+# Configure qt4
+# ========================================
+FIND_PACKAGE(Qt4 REQUIRED)
+IF(QT4_FOUND)
+	SET(QT_USE_QTGUI TRUE)
+	INCLUDE(${QT_USE_FILE})
+ELSE()
+	MESSAGE(ERROR " QT4 NEEDED")
+ENDIF()
+
+IF(WIN32)
+	LINK_LIBRARIES(${QT_QTMAIN_LIBRARY})
+	SET(GUI_TYPE WIN32)
+ENDIF(WIN32)
+
+# ========================================
+# Compiler definitions
+# ========================================
+ADD_DEFINITIONS(
+	${QT_DEFINITIONS}
+)
+
+# ========================================
+# Include directories
+# ========================================
+INCLUDE_DIRECTORIES(
+	${PROJECT_BINARY_DIR}
+	${QT_INCLUDE_DIR}
+)
+
+# ========================================
+# List of sources
+# ========================================
+SET(
+	PROJECT_SRCS
+	src/mainwindow.cpp
+	src/main.cpp
+	src/mainwindow.h
+	src/structure.h
+	../ico/heudiasycIco.rc
+)
+
+# ========================================
+# Files to MOC
+# ========================================
+SET(
+	FILES_TO_MOC
+	src/mainwindow.h
+)
+
+SET(
+	UI_FILES
+	src/mainwindow.ui    
+)
+
+# ========================================
+# Call MOC
+# ========================================
+QT4_WRAP_CPP(
+	PROJECT_MOC_SRCS
+	${FILES_TO_MOC}
+)
+
+QT4_WRAP_UI(
+	PROJECT_UI_SRCS
+	${UI_FILES}
+)
+
+# ========================================
+# Build an executable
+# ========================================
+pacpus_add_executable(
+	${PROJECT_NAME} 
+	${GUI_TYPE} 
+	${PROJECT_SRCS} 
+	${PROJECT_MOC_SRCS} 
+	${PROJECT_UI_SRCS}
+)
+
+# ========================================
+# Libraries
+# ========================================
+TARGET_LINK_LIBRARIES(
+	${PROJECT_NAME} 
+	${QT_LIBRARIES}
+)
+
+# ========================================
+# Install
+# ========================================
+pacpus_install(${PROJECT_NAME})
Index: tags/0.2.3/src/dbcDecriptor/src/main.cpp
===================================================================
--- tags/0.2.3/src/dbcDecriptor/src/main.cpp	(revision 368)
+++ tags/0.2.3/src/dbcDecriptor/src/main.cpp	(revision 368)
@@ -0,0 +1,11 @@
+#include "mainwindow.h"
+#include <QApplication>
+
+int main(int argc, char *argv[])
+{
+    QApplication a(argc, argv);
+    MainWindow w;
+    w.show();
+
+    return a.exec();
+}
Index: tags/0.2.3/src/dbcDecriptor/src/mainwindow.cpp
===================================================================
--- tags/0.2.3/src/dbcDecriptor/src/mainwindow.cpp	(revision 368)
+++ tags/0.2.3/src/dbcDecriptor/src/mainwindow.cpp	(revision 368)
@@ -0,0 +1,548 @@
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
+// DBC Decriptor                                                              //
+//                                                                            //
+// Made by Pierre Hudelaine                                                   //
+//                                                                            //
+// Contact: pierre.hudelaine@hds.utc.fr                                       //
+//                                                                            //
+// Translate a DBC file to Pacpus code                                        //
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
+
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+
+#include <QString>
+#include <QFileDialog>
+#include <QTextStream>
+#include <QDebug>
+#include <QDate>
+
+
+//----------------------------------------------------------------------------//
+// Constructor                                                                //
+//----------------------------------------------------------------------------//
+MainWindow::MainWindow(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::MainWindow)
+{
+    ui->setupUi(this);
+
+    connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT(openDBCFile()));
+    connect(ui->actionClose_all_files, SIGNAL(triggered()), this, SLOT(clearDBC()));
+    connect(ui->actionQuitter, SIGNAL(triggered()), this, SLOT(close()));
+    connect(ui->pushButton_open_file, SIGNAL(clicked()), this, SLOT(openDBCFile()));
+
+    ui->label_file_error->setText("");
+    ui->label_value_frame_id->setText("");
+    ui->label_value_frame_name->setText("");
+    ui->label_value_number_of_signals->setText("");
+    ui->label_value_total_frames->setText("0");
+    ui->label_value_total_signals->setText("0");
+    ui->lineEdit_output_path->setText(QApplication::applicationDirPath());
+}
+
+
+//----------------------------------------------------------------------------//
+// Destructor                                                                 //
+//----------------------------------------------------------------------------//
+MainWindow::~MainWindow()
+{
+    delete ui;
+}
+
+
+//----------------------------------------------------------------------------//
+// Open the DBC file                                                          //
+//----------------------------------------------------------------------------//
+void MainWindow::openDBCFile()
+{
+    clearDBC();
+
+    dbcFiles_.fileName = QFileDialog::getOpenFileName(this, "Open dbc file", "", "dbc files (*.dbc);;Text files (*.txt);;All files (*.*)");
+
+    QFile file(dbcFiles_.fileName);
+
+    if (!file.open(QIODevice::ReadOnly))
+        ui->label_file_error->setText("<font color=\"#C80000\">Can not open the file</font>");
+    else
+    {
+        QTextStream stream(&file);
+        dbcFiles_.content = stream.readAll().split('\n');
+
+        QStringList signalName;
+        bool frameFound = false;
+        StructFrame tmpFrame;
+        tmpFrame.frameID = 0;
+        tmpFrame.frameName = "";
+        tmpFrame.numberOfSignals = 0;
+
+        for (int i = 0; i < dbcFiles_.content.size(); i++)
+        {
+            if (frameFound)
+            {
+                // signalMnemo is the beginning if a line containing a signal information
+                if (dbcFiles_.content[i].startsWith(signalMnemo))
+                {
+                    tmpFrame.numberOfSignals++;
+                    getSignalParameters(dbcFiles_.content[i], &tmpFrame);
+                }
+                else
+                    frameFound = false;
+            }
+
+            // "BO_" is the beginning of a line containing a frame information and all signals are following
+            if (dbcFiles_.content[i].startsWith(signalInfoMnemo))
+            {
+                int numberOfSpace = 0, j = 0;
+                QString tmp;
+
+                frameFound = true;
+
+                // Get the ID of the frame
+                while(numberOfSpace != 2)
+                {
+                    if (dbcFiles_.content[i][j] == ' ')
+                        numberOfSpace++;
+                    if (numberOfSpace == 1)
+                        tmp.append(dbcFiles_.content[i][j]);
+                    j++;
+                }
+
+                tmpFrame.frameID = tmp.toInt();
+
+                tmp = "";
+
+                // Get the name of the frame
+                while(dbcFiles_.content[i][j] != ':')
+                {
+                    tmp.append(dbcFiles_.content[i][j]);
+                    j++;
+                }
+
+                tmpFrame.frameName = tmp;
+            }
+            else if (dbcFiles_.content[i].startsWith(commentMnemo))
+                findComment(i); // Get the comment at the end of the DBC file
+            else if (dbcFiles_.content[i].startsWith(valueInfoMnemo))                
+                findValueDescription(i); // Get the value descritpion at the end of the DBC file
+
+            // If a hole frame has been treated it's registered in the vector
+            if (tmpFrame.numberOfSignals != 0 && !frameFound)
+            {
+                dbcFiles_.canFrames.append(tmpFrame);
+                ui->label_value_total_frames->setText(QString().setNum(ui->label_value_total_frames->text().toInt() + 1));
+                ui->label_value_total_signals->setText(QString().setNum(ui->label_value_total_signals->text().toInt() + tmpFrame.numberOfSignals));
+                tmpFrame.frameID = 0;
+                tmpFrame.frameName = "";
+                tmpFrame.numberOfSignals = 0;
+                tmpFrame.signalsVector.clear();
+            }
+        }
+
+        // Frames are added in the list
+        for (int i = 0; i < dbcFiles_.canFrames.size(); i++)
+        {
+            if (dbcFiles_.canFrames[i].frameID >= 255)
+                signalName.append("0x" + QString().setNum(dbcFiles_.canFrames[i].frameID, 16).toUpper() + " " + dbcFiles_.canFrames[i].frameName);
+            else
+                signalName.append("0x0" + QString().setNum(dbcFiles_.canFrames[i].frameID, 16).toUpper() + " " + dbcFiles_.canFrames[i].frameName);
+        }
+
+        ui->listWidget_signals->addItems(signalName);
+        file.close();
+
+        //printAllFrames();
+    }
+}
+
+
+//----------------------------------------------------------------------------//
+// Print the parameters for a specific frame                                  //
+//----------------------------------------------------------------------------//
+void MainWindow::printFrame(int i, int j)
+{
+    qDebug() << dbcFiles_.canFrames[i].signalsVector[j].signalName << " "
+             << dbcFiles_.canFrames[i].signalsVector[j].startBit << " "
+             << dbcFiles_.canFrames[i].signalsVector[j].length << " "
+             << ((dbcFiles_.canFrames[i].signalsVector[j].order) ? "Motorola" : "Intel")
+             << " " << ((dbcFiles_.canFrames[i].signalsVector[j].valueType) ? "Signed" : "Unsigned")
+             << " " << dbcFiles_.canFrames[i].signalsVector[j].gain << " "
+             << dbcFiles_.canFrames[i].signalsVector[j].offset << " "
+             << dbcFiles_.canFrames[i].signalsVector[j].min << " "
+             << dbcFiles_.canFrames[i].signalsVector[j].max << " "
+             << ((dbcFiles_.canFrames[i].signalsVector[j].unit != "") ? dbcFiles_.canFrames[i].signalsVector[j].unit : "")
+             << dbcFiles_.canFrames[i].signalsVector[j].comment;
+}
+
+
+//----------------------------------------------------------------------------//
+// Print the parameters of all frames                                         //
+//----------------------------------------------------------------------------//
+void MainWindow::printAllFrames()
+{
+    for (int i = 0; i < dbcFiles_.canFrames.size(); i++)
+    {
+        for (int j = 0; j < dbcFiles_.canFrames[i].signalsVector.size(); j++)
+            printFrame(i, j);
+    }
+}
+
+
+//----------------------------------------------------------------------------//
+// Get the the signals informations in the DBC file                           //
+//----------------------------------------------------------------------------//
+void MainWindow::getSignalParameters(QString actualLine, StructFrame * actualCanFrame)
+{
+    StructSignal tmpSignal;
+
+    tmpSignal.order = true;
+    tmpSignal.gain = 0.0;
+    tmpSignal.length = 0;
+    tmpSignal.offset = 0.0;
+    tmpSignal.signalName = "";
+    tmpSignal.valueType = true;
+    tmpSignal.startBit = 0;
+    tmpSignal.unit = "";
+    tmpSignal.comment = "";
+    tmpSignal.description = "";
+
+    // Removing the untreated and unsued caracters
+    actualLine.remove('(');
+    actualLine.remove(')');
+    actualLine.remove('[');
+    actualLine.remove(']');
+    QStringList cutLine = actualLine.split(' ');
+
+    // Get the name
+    tmpSignal.signalName = cutLine.at(2);
+    cutLine = actualLine.split(" : ");
+
+    // Get the second part with the signal parameters for example : 63|8@0+ // 63 = startBit; 8 = length; 0 = Motorola order; + = Unsigned value
+    QStringList cutLineValue = cutLine.at(1).split(' ');
+    tmpSignal.startBit = cutLineValue.at(0).split('|').at(0).toInt();
+    tmpSignal.length = cutLineValue.at(0).split('|').at(1).split('@').at(0).toInt();
+    if (cutLineValue.at(0).split('|').at(1).split('@').at(1).at(0) == '1')
+        tmpSignal.order = false;
+    if (cutLineValue.at(0).split('|').at(1).split('@').at(1).at(1) == '+')
+        tmpSignal.valueType = false;
+
+    // Get the offset and the gain for example : (0.05,2) // 0.05 = gain; 2 = offset;
+    tmpSignal.gain = cutLineValue.at(1).split(',').at(0).toDouble();
+    tmpSignal.offset = cutLineValue.at(1).split(',').at(1).toDouble();
+
+    // Get the max and min for exemple : [-6.4|6.35] // -6.4 = max; 6.35 = max;
+    tmpSignal.min = cutLineValue.at(2).split('|').at(0).toDouble();
+    tmpSignal.max = cutLineValue.at(2).split('|').at(1).toDouble();
+
+    // Get the unit for example : "m/s" // m/s = unit
+    tmpSignal.unit = cutLineValue.at(3);
+    tmpSignal.unit.remove('"');
+
+    actualCanFrame->signalsVector.append(tmpSignal);
+}
+
+
+//----------------------------------------------------------------------------//
+// Find a comment and associate it to the signal                              //
+//----------------------------------------------------------------------------//
+void MainWindow::findComment(int k)
+{
+    for (int i = 0; i < dbcFiles_.canFrames.size(); i++)
+    {
+        for (int j = 0; j < dbcFiles_.canFrames[i].signalsVector.size(); j++)
+        {
+            if (dbcFiles_.content[k].contains(dbcFiles_.canFrames[i].signalsVector[j].signalName))
+            {
+                dbcFiles_.canFrames[i].signalsVector[j].comment = dbcFiles_.content[k].split('"').at(1);
+
+                while (dbcFiles_.content[k].at(dbcFiles_.content[k].size() - 2) != ';')
+                {
+                    k++;
+                    dbcFiles_.canFrames[i].signalsVector[j].comment += dbcFiles_.content[k];
+                }
+                return;
+            }
+        }
+    }
+}
+
+
+//----------------------------------------------------------------------------//
+// Find the value description and associate it to the signal                  //
+//----------------------------------------------------------------------------//
+void MainWindow::findValueDescription(int k)
+{
+    for (int i = 0; i < dbcFiles_.canFrames.size(); i++)
+    {
+        for (int j = 0; j < dbcFiles_.canFrames[i].signalsVector.size(); j++)
+        {
+            if (dbcFiles_.content[k].contains(dbcFiles_.canFrames[i].signalsVector[j].signalName))
+            {
+                dbcFiles_.canFrames[i].signalsVector[j].description = dbcFiles_.content[k].right(dbcFiles_.content[k].length() - (dbcFiles_.content[k].indexOf(dbcFiles_.canFrames[i].signalsVector[j].signalName) + dbcFiles_.canFrames[i].signalsVector[j].signalName.length()));
+                return;
+            }
+        }
+    }
+}
+
+
+//----------------------------------------------------------------------------//
+// Called from the HMI to clear the last information                          //
+//----------------------------------------------------------------------------//
+void MainWindow::clearDBC()
+{
+    dbcFiles_.canFrames.clear();
+    dbcFiles_.content.clear();
+    dbcFiles_.fileName = "";
+    ui->listWidget_signals->clear();
+
+    ui->label_file_error->setText("");
+    ui->label_value_frame_id->setText("");
+    ui->label_value_frame_name->setText("");
+    ui->label_value_number_of_signals->setText("");
+    ui->label_value_total_frames->setText("0");
+    ui->label_value_total_signals->setText("0");
+}
+
+
+//----------------------------------------------------------------------------//
+// Actualize the HMI with the last information                                //
+//----------------------------------------------------------------------------//
+void MainWindow::on_listWidget_signals_currentRowChanged(int currentRow)
+{
+    if (currentRow >= 0)
+    {
+        if (dbcFiles_.canFrames[currentRow].frameID >= 255)
+            ui->label_value_frame_id->setText("0x" + QString().setNum(dbcFiles_.canFrames[currentRow].frameID, 16).toUpper());
+        else
+            ui->label_value_frame_id->setText("0x0" + QString().setNum(dbcFiles_.canFrames[currentRow].frameID, 16).toUpper());
+
+        ui->label_value_frame_name->setText(dbcFiles_.canFrames[currentRow].frameName);
+        ui->label_value_number_of_signals->setText(QString().setNum(dbcFiles_.canFrames[currentRow].numberOfSignals));
+    }
+}
+
+
+//----------------------------------------------------------------------------//
+// Generate the c++ files from the dbc information previouly registered       //
+//----------------------------------------------------------------------------//
+void MainWindow::on_pushButton_generate_clicked()
+{
+    QDate date(QDate::currentDate());
+
+    // Creating the beginnig of the structure file
+    QString outputStructFile = templateStructFile;
+    outputStructFile.insert(outputStructFile.indexOf("created:") + 8, "    " + QString().setNum(date.year()) + "/" + QString().setNum(date.month()) + "/" + QString().setNum(date.day()));
+    outputStructFile.insert(outputStructFile.indexOf("#ifndef __STRUCTURECAN") + 22, ui->lineEdit_export_name->text().toUpper());
+    outputStructFile.insert(outputStructFile.indexOf("#define __STRUCTURECAN") + 22, ui->lineEdit_export_name->text().toUpper());
+
+    for (int i = 0; i < dbcFiles_.canFrames.size(); i++)
+    {
+        QString outputCPPFile = templateCPPFile;
+        QString outputHFile = templateHFile;
+
+        // Creating the beginning of each c++ files
+        outputCPPFile.insert(outputCPPFile.indexOf("created:") + 8, "    " + QString().setNum(date.year()) + "/" + QString().setNum(date.month()) + "/" + QString().setNum(date.day()));
+        outputCPPFile.insert(outputCPPFile.indexOf("#include \"CanFrame.h\"") + 18, dbcFiles_.canFrames[i].frameName);
+        outputCPPFile.insert(outputCPPFile.indexOf("void CanFrame") + 13, dbcFiles_.canFrames[i].frameName);
+
+        // Creating the beginning of each h files
+        outputHFile.insert(outputHFile.indexOf("created:") + 8, "    " + QString().setNum(date.year()) + "/" + QString().setNum(date.month()) + "/" + QString().setNum(date.day()));
+        outputHFile.insert(outputHFile.indexOf("#ifndef __CanFrame") + 18, dbcFiles_.canFrames[i].frameName);
+        outputHFile.insert(outputHFile.indexOf("#define __CanFrame") + 18, dbcFiles_.canFrames[i].frameName);
+        outputHFile.insert(outputHFile.indexOf("#include \"structureCan") + 22, ui->lineEdit_export_name->text());
+        outputHFile.insert(outputHFile.indexOf("class CAN") + 9, ui->lineEdit_export_name->text().toUpper());
+        outputHFile.insert(outputHFile.indexOf("_API CanFrame") + 13, dbcFiles_.canFrames[i].frameName);
+        outputHFile.insert(outputHFile.indexOf("CanFrame()") + 8, dbcFiles_.canFrames[i].frameName);
+        outputHFile.insert(outputHFile.indexOf("~CanFrame()") + 9, dbcFiles_.canFrames[i].frameName);
+        outputHFile.insert(outputHFile.indexOf("Struct data_;") + 6, dbcFiles_.canFrames[i].frameName);
+        outputHFile.insert(outputHFile.indexOf("return sizeof(Struct)") + 20, dbcFiles_.canFrames[i].frameName);
+
+        // Adding the structure of frames
+        outputStructFile.insert(outputStructFile.indexOf("#include \"Pacpus/kernel/road_time.h") + 36, "\n\ntypedef struct\n{\n} Struct" + dbcFiles_.canFrames[i].frameName + ";");
+
+        for (int j = 0; j < dbcFiles_.canFrames[i].signalsVector.size(); j++)
+        {
+            QString tmpCpp = "\n";
+
+            // If variables are bool
+            if (dbcFiles_.canFrames[i].signalsVector[j].length == 1)
+            {
+                tmpCpp.append("	data_." + dbcFiles_.canFrames[i].signalsVector[j].signalName + " = mDecodeToBool(d_.frame.data, " + QString().setNum(dbcFiles_.canFrames[i].signalsVector[j].startBit) + ");");
+                if (dbcFiles_.canFrames[i].signalsVector[j].description != "")
+                    outputStructFile.insert(outputStructFile.indexOf("} Struct" + dbcFiles_.canFrames[i].frameName), "	bool " + dbcFiles_.canFrames[i].signalsVector[j].signalName + "; /// " + dbcFiles_.canFrames[i].signalsVector[j].description + "\n");
+                else
+                    outputStructFile.insert(outputStructFile.indexOf("} Struct" + dbcFiles_.canFrames[i].frameName), "	bool " + dbcFiles_.canFrames[i].signalsVector[j].signalName + ";\n");
+            }
+            else
+            {
+                // If variables are Motorola or Intel
+                if (dbcFiles_.canFrames[i].signalsVector[j].order)
+                    tmpCpp.append("	if (mDecodeTo");
+                else
+                    tmpCpp.append("	if (iDecodeTo");
+
+                // If variables are signed...
+                if (dbcFiles_.canFrames[i].signalsVector[j].valueType)
+                {
+                    if (dbcFiles_.canFrames[i].signalsVector[j].length <= 8)
+                        tmpCpp.append("I8(&ctmp, ");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 16)
+                        tmpCpp.append("I16(&stmp, ");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 32)
+                        tmpCpp.append("I32(&ltmp, ");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 64)
+                        tmpCpp.append("I64(&lltmp, ");
+                }
+                else // ...Or not signed
+                {
+                    if (dbcFiles_.canFrames[i].signalsVector[j].length <= 8)
+                        tmpCpp.append("UI8(&uctmp, ");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 16)
+                        tmpCpp.append("UI16(&ustmp, ");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 32)
+                        tmpCpp.append("UI32(&ultmp, ");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 64)
+                        tmpCpp.append("UI64(&ulltmp, ");
+                }
+
+                // Code c++ added in the QString
+                tmpCpp.append("d_.frame.data, " + QString().setNum(dbcFiles_.canFrames[i].signalsVector[j].startBit) + ", " + QString().setNum(dbcFiles_.canFrames[i].signalsVector[j].length) + "))\n");
+                tmpCpp.append("		data_." + dbcFiles_.canFrames[i].signalsVector[j].signalName + " = ");
+
+                // Find the c++ type between double or integer
+                if (floor(dbcFiles_.canFrames[i].signalsVector[j].gain) == dbcFiles_.canFrames[i].signalsVector[j].gain)
+                {
+                    // If it's need a brace in c++
+                    if (dbcFiles_.canFrames[i].signalsVector[j].gain != 1 && dbcFiles_.canFrames[i].signalsVector[j].offset != 0)
+                        tmpCpp.append("(");
+
+                    // Define the type of the pointer which will store temporally the data
+                    if (!dbcFiles_.canFrames[i].signalsVector[j].valueType)
+                        tmpCpp.append("u");
+
+                    if (dbcFiles_.canFrames[i].signalsVector[j].length <= 8)
+                        tmpCpp.append("ctmp");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 16)
+                        tmpCpp.append("stmp");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 32)
+                        tmpCpp.append("ltmp");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 64)
+                        tmpCpp.append("lltmp");
+
+                    // Setting the gain and the offset
+                    if (dbcFiles_.canFrames[i].signalsVector[j].gain != 1 && dbcFiles_.canFrames[i].signalsVector[j].offset != 0)
+                        tmpCpp.append(" * " + QString().setNum(dbcFiles_.canFrames[i].signalsVector[j].gain) + ") + " + QString().setNum(dbcFiles_.canFrames[i].signalsVector[j].offset) + ";");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].gain != 1)
+                        tmpCpp.append(" * " + QString().setNum(dbcFiles_.canFrames[i].signalsVector[j].gain) + ";");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].offset != 0)
+                        tmpCpp.append(" + " + QString().setNum(dbcFiles_.canFrames[i].signalsVector[j].offset) + ";");
+                    else
+                        tmpCpp.append(";");
+
+                    // Adding the value in the structure
+                    QString tmp;
+
+                    // Find the c++ variable type /!\ May differ from the signal !!!!
+                    if (dbcFiles_.canFrames[i].signalsVector[j].offset < 0 && !dbcFiles_.canFrames[i].signalsVector[j].valueType)
+                        tmp.append("	int");
+                    else
+                        tmp.append("	uint");
+
+                    if (dbcFiles_.canFrames[i].signalsVector[j].length <= 8)
+                        tmp.append("8_t " + dbcFiles_.canFrames[i].signalsVector[j].signalName + ";");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 16)
+                        tmp.append("16_t " + dbcFiles_.canFrames[i].signalsVector[j].signalName + ";");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 32)
+                        tmp.append("32_t " + dbcFiles_.canFrames[i].signalsVector[j].signalName + ";");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 64)
+                        tmp.append("64_t " + dbcFiles_.canFrames[i].signalsVector[j].signalName + ";");
+
+                    if (dbcFiles_.canFrames[i].signalsVector[j].description != "")
+                        tmp.append(" /// " + dbcFiles_.canFrames[i].signalsVector[j].description);
+
+                    outputStructFile.insert(outputStructFile.indexOf("} Struct" + dbcFiles_.canFrames[i].frameName), tmp + "\n");
+                }
+                else
+                {
+                    tmpCpp.append("static_cast<double>(");
+
+                    if (dbcFiles_.canFrames[i].signalsVector[j].gain != 1 && dbcFiles_.canFrames[i].signalsVector[j].offset != 0)
+                        tmpCpp.append("(");
+
+                    if (!dbcFiles_.canFrames[i].signalsVector[j].valueType)
+                        tmpCpp.append("u");
+
+                    if (dbcFiles_.canFrames[i].signalsVector[j].length <= 8)
+                        tmpCpp.append("ctmp");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 16)
+                        tmpCpp.append("stmp");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 32)
+                        tmpCpp.append("ltmp");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].length <= 64)
+                        tmpCpp.append("lltmp");
+
+                    if (dbcFiles_.canFrames[i].signalsVector[j].gain != 1 && dbcFiles_.canFrames[i].signalsVector[j].offset != 0)
+                        tmpCpp.append(" * " + QString().setNum(dbcFiles_.canFrames[i].signalsVector[j].gain) + ") + " + QString().setNum(dbcFiles_.canFrames[i].signalsVector[j].offset) + ");");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].gain != 1)
+                        tmpCpp.append(" * " + QString().setNum(dbcFiles_.canFrames[i].signalsVector[j].gain) + ");");
+                    else if (dbcFiles_.canFrames[i].signalsVector[j].offset != 0)
+                        tmpCpp.append(" + " + QString().setNum(dbcFiles_.canFrames[i].signalsVector[j].offset) + ");");
+                    else
+                        tmpCpp.append(");");
+
+                    QString tmp = "";
+                    if (dbcFiles_.canFrames[i].signalsVector[j].description != "")
+                        tmp.append(" /// " + dbcFiles_.canFrames[i].signalsVector[j].description);
+
+                    outputStructFile.insert(outputStructFile.indexOf("} Struct" + dbcFiles_.canFrames[i].frameName), "	double " + dbcFiles_.canFrames[i].signalsVector[j].signalName + "; " + tmp + "\n");
+                }
+            }
+            if (dbcFiles_.canFrames[i].signalsVector[j].comment != "")
+                tmpCpp.append(" /*" + dbcFiles_.canFrames[i].signalsVector[j].comment + "*/");
+            outputCPPFile.insert(outputCPPFile.indexOf("unsigned char uctmp = 0") + 24, tmpCpp);
+        }
+        outputStructFile.insert(outputStructFile.indexOf("Struct" + dbcFiles_.canFrames[i].frameName + ";") + dbcFiles_.canFrames[i].frameName.size() + 7, "\n\ntypedef struct\n{\n	road_time_t time;\n	road_timerange_t timerange;\n	Struct" + dbcFiles_.canFrames[i].frameName + " d;\n} TimeStampedStruct" + dbcFiles_.canFrames[i].frameName + ";");
+
+        QFile canFrameCpp(ui->lineEdit_output_path->text() + "/CanFrame" + dbcFiles_.canFrames[i].frameName + ".cpp");
+        canFrameCpp.open(QIODevice::WriteOnly);
+        QTextStream cppOut(&canFrameCpp);
+        cppOut << outputCPPFile;
+        canFrameCpp.close();
+
+        QFile canFrameH(ui->lineEdit_output_path->text() + "/CanFrame" + dbcFiles_.canFrames[i].frameName + ".h");
+        canFrameH.open(QIODevice::WriteOnly);
+        QTextStream hOut(&canFrameH);
+        hOut << outputHFile;
+        canFrameH.close();
+    }
+
+    QFile struc(ui->lineEdit_output_path->text() + "/strucureCan" + ui->lineEdit_export_name->text() + ".h");
+    struc.open(QIODevice::WriteOnly);
+    QTextStream strucOut(&struc);
+    strucOut << outputStructFile;
+    struc.close();
+}
+
+
+//----------------------------------------------------------------------------//
+// Unlock the pushButton "Generate" when a string is registerer               //
+//----------------------------------------------------------------------------//
+void MainWindow::on_lineEdit_export_name_textChanged(const QString &arg1)
+{
+    if (arg1 == "")
+        ui->pushButton_generate->setEnabled(false);
+    else
+        ui->pushButton_generate->setEnabled(true);
+}
+
+
+//----------------------------------------------------------------------------//
+// Select the output directory                                                //
+//----------------------------------------------------------------------------//
+void MainWindow::on_pushButton_output_path_clicked()
+{
+    QString tmp = "";
+    if ((tmp = QFileDialog::getExistingDirectory(0, 0, ui->lineEdit_output_path->text())) != "")
+        ui->lineEdit_output_path->setText(tmp);
+}
Index: tags/0.2.3/src/dbcDecriptor/src/mainwindow.h
===================================================================
--- tags/0.2.3/src/dbcDecriptor/src/mainwindow.h	(revision 368)
+++ tags/0.2.3/src/dbcDecriptor/src/mainwindow.h	(revision 368)
@@ -0,0 +1,50 @@
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
+// DBC Decriptor                                                              //
+//                                                                            //
+// Made by Pierre Hudelaine                                                   //
+//                                                                            //
+// Contact: pierre.hudelaine@hds.utc.fr                                       //
+//                                                                            //
+// Translate a DBC file to Pacpus code                                        //
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+#include <QListWidgetItem>
+
+#include "structure.h"
+
+namespace Ui {
+class MainWindow;
+}
+
+class MainWindow : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    explicit MainWindow(QWidget *parent = 0);
+    ~MainWindow();
+
+private Q_SLOTS:
+    void openDBCFile();
+    void printFrame(int i, int j);
+    void printAllFrames();
+    void getSignalParameters(QString actualLine, StructFrame * actualCanFrame);
+    void clearDBC();
+    void findComment(int k);
+    void findValueDescription(int k);
+    void on_listWidget_signals_currentRowChanged(int currentRow);
+    void on_pushButton_generate_clicked();
+    void on_lineEdit_export_name_textChanged(const QString &arg1);
+
+    void on_pushButton_output_path_clicked();
+
+private:
+    Ui::MainWindow *ui;
+    StructDBCFile dbcFiles_;
+};
+
+#endif // MAINWINDOW_H
Index: tags/0.2.3/src/dbcDecriptor/src/mainwindow.ui
===================================================================
--- tags/0.2.3/src/dbcDecriptor/src/mainwindow.ui	(revision 368)
+++ tags/0.2.3/src/dbcDecriptor/src/mainwindow.ui	(revision 368)
@@ -0,0 +1,351 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>735</width>
+    <height>480</height>
+   </rect>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>735</width>
+    <height>480</height>
+   </size>
+  </property>
+  <property name="maximumSize">
+   <size>
+    <width>735</width>
+    <height>480</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>DBC Decriptor for Pacpus - by Pierre Hudelaine</string>
+  </property>
+  <property name="toolButtonStyle">
+   <enum>Qt::ToolButtonTextBesideIcon</enum>
+  </property>
+  <widget class="QWidget" name="centralWidget">
+   <widget class="QGroupBox" name="groupBox_frame">
+    <property name="geometry">
+     <rect>
+      <x>10</x>
+      <y>10</y>
+      <width>710</width>
+      <height>430</height>
+     </rect>
+    </property>
+    <property name="title">
+     <string>DBC file:</string>
+    </property>
+    <widget class="QListWidget" name="listWidget_signals">
+     <property name="geometry">
+      <rect>
+       <x>10</x>
+       <y>40</y>
+       <width>220</width>
+       <height>380</height>
+      </rect>
+     </property>
+     <property name="selectionMode">
+      <enum>QAbstractItemView::SingleSelection</enum>
+     </property>
+    </widget>
+    <widget class="QWidget" name="gridLayoutWidget">
+     <property name="geometry">
+      <rect>
+       <x>240</x>
+       <y>40</y>
+       <width>461</width>
+       <height>281</height>
+      </rect>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_frames_information">
+      <item row="6" column="1">
+       <widget class="QLabel" name="label_value_frame_name">
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QLabel" name="label_value_total_frames">
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item row="9" column="0">
+       <widget class="QLabel" name="label_export_name">
+        <property name="text">
+         <string>Export name:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="8" column="0">
+       <spacer name="verticalSpacer_2">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>20</width>
+          <height>40</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="4" column="0">
+       <spacer name="verticalSpacer_4">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>20</width>
+          <height>40</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="5" column="0">
+       <widget class="QLabel" name="label_frame_id">
+        <property name="text">
+         <string>Frame ID:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QLabel" name="label_total_signals">
+        <property name="text">
+         <string>Total signals:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="6" column="0">
+       <widget class="QLabel" name="label_frame_name">
+        <property name="text">
+         <string>Frame name:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="1">
+       <widget class="QLabel" name="label_value_total_signals">
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item row="9" column="1">
+       <widget class="QLineEdit" name="lineEdit_export_name">
+        <property name="inputMask">
+         <string/>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <spacer name="horizontalSpacer_2">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="4" column="1">
+       <spacer name="horizontalSpacer_3">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="1" column="0">
+       <spacer name="verticalSpacer">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>20</width>
+          <height>40</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="5" column="1">
+       <widget class="QLabel" name="label_value_frame_id">
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item row="7" column="1">
+       <widget class="QLabel" name="label_value_number_of_signals">
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item row="7" column="0">
+       <widget class="QLabel" name="label_number_of_signals">
+        <property name="text">
+         <string>Number of signals:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="label_total_frames">
+        <property name="text">
+         <string>Total frames:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="0">
+       <widget class="QPushButton" name="pushButton_open_file">
+        <property name="text">
+         <string>Open file</string>
+        </property>
+       </widget>
+      </item>
+      <item row="10" column="0">
+       <widget class="QPushButton" name="pushButton_output_path">
+        <property name="text">
+         <string>Output path:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="10" column="1">
+       <widget class="QLineEdit" name="lineEdit_output_path"/>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLabel" name="label_file_error">
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item row="8" column="1">
+       <spacer name="horizontalSpacer">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </widget>
+    <widget class="QLabel" name="label_frames_found">
+     <property name="geometry">
+      <rect>
+       <x>10</x>
+       <y>20</y>
+       <width>91</width>
+       <height>16</height>
+      </rect>
+     </property>
+     <property name="text">
+      <string>Frames found:</string>
+     </property>
+    </widget>
+    <widget class="QLabel" name="label_details">
+     <property name="geometry">
+      <rect>
+       <x>240</x>
+       <y>20</y>
+       <width>120</width>
+       <height>16</height>
+      </rect>
+     </property>
+     <property name="text">
+      <string>Details:</string>
+     </property>
+    </widget>
+    <widget class="QPushButton" name="pushButton_generate">
+     <property name="enabled">
+      <bool>false</bool>
+     </property>
+     <property name="geometry">
+      <rect>
+       <x>240</x>
+       <y>330</y>
+       <width>100</width>
+       <height>30</height>
+      </rect>
+     </property>
+     <property name="text">
+      <string>Generate</string>
+     </property>
+    </widget>
+   </widget>
+  </widget>
+  <widget class="QMenuBar" name="menuBar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>735</width>
+     <height>21</height>
+    </rect>
+   </property>
+   <widget class="QMenu" name="menuFiles">
+    <property name="title">
+     <string>Files</string>
+    </property>
+    <addaction name="actionOpen"/>
+    <addaction name="separator"/>
+    <addaction name="actionClose_all_files"/>
+    <addaction name="separator"/>
+    <addaction name="actionQuitter"/>
+   </widget>
+   <addaction name="menuFiles"/>
+  </widget>
+  <widget class="QStatusBar" name="statusBar"/>
+  <action name="actionOpen">
+   <property name="text">
+    <string>Open</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+O</string>
+   </property>
+  </action>
+  <action name="actionRecent_files">
+   <property name="text">
+    <string>Recent files</string>
+   </property>
+  </action>
+  <action name="actionClose_all_files">
+   <property name="text">
+    <string>Clear DBC</string>
+   </property>
+  </action>
+  <action name="actionQuitter">
+   <property name="text">
+    <string>Quitter</string>
+   </property>
+  </action>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>
Index: tags/0.2.3/src/dbcDecriptor/src/structure.h
===================================================================
--- tags/0.2.3/src/dbcDecriptor/src/structure.h	(revision 368)
+++ tags/0.2.3/src/dbcDecriptor/src/structure.h	(revision 368)
@@ -0,0 +1,152 @@
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
+// DBC Decriptor                                                              //
+//                                                                            //
+// Made by Pierre Hudelaine                                                   //
+//                                                                            //
+// Contact: pierre.hudelaine@hds.utc.fr                                       //
+//                                                                            //
+// Translate a DBC file to Pacpus code                                        //
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
+
+#ifndef STRUCTURE_H
+#define STRUCTURE_H
+
+
+/// Structure of a complete signal
+typedef struct {
+    QString signalName; /// Signal name
+    int     startBit;   /// Startbit of the signal
+    int     length;     /// Length of the signal
+    bool    order;      /// Encoding type; true bigEndian; false littleEndian
+    bool    valueType;  /// Signe type; true signed; false unsigned
+    double  gain;       /// Gain of the signal
+    double  offset;     /// Offset of the signal
+    double  max;        /// Max of the value
+    double  min;        /// Min of the value
+    QString unit;       /// Unit of the signal
+    QString comment;    /// Associate comment of the signal
+    QString description;/// Value description
+} StructSignal;
+
+
+/// Strucure of a complete frame
+typedef struct {
+    int numberOfSignals;    /// Number of signal per frame
+    int frameID;            /// Frame ID
+    QString frameName;      /// Frame name
+    QVector<StructSignal> signalsVector; /// Signals of the frame
+} StructFrame;
+
+
+/// Structure of a complete dbc file
+typedef struct {
+    QVector<StructFrame> canFrames; /// Frames of the file
+    QString              fileName;  /// Path to the dbc file
+    QStringList          content;   /// Content of the dbc file
+} StructDBCFile;
+
+
+/// define the mnemonique of each message to find
+#define signalMnemo " SG_"
+#define signalInfoMnemo "BO_"
+#define commentMnemo "CM_"
+#define valueInfoMnemo "VAL_"
+
+
+static const QString templateHFile =
+"/*******************************************************************************\n" \
+"//  created:\n" \
+"//\n" \
+"//  author:     Generated automatically with DBC decriptor\n" \
+"//              Copyright Heudiasyc UMR UTC/CNRS 7253\n" \
+"//\n" \
+"//  version:    $Id: $\n" \
+"//\n" \
+"//  purpose:\n" \
+"//\n" \
+"*******************************************************************************/\n" \
+"\n" \
+"#ifndef __CanFrame_h__\n" \
+"#define __CanFrame_h__\n" \
+"\n" \
+"#include \"CanGateway/CanFrameBase.h\"\n" \
+"#include \"structureCan.h\"\n" \
+"\n" \
+"namespace pacpus {\n" \
+"\n" \
+"class CAN_API CanFrame\n" \
+"       : public CanFrameBase\n" \
+"{\n" \
+"public:\n" \
+"    CanFrame() {}\n" \
+"    ~CanFrame() {}\n" \
+"    void decode();\n" \
+"    void * data() { return &data_; }\n" \
+"    int size() { return sizeof(Struct); }\n" \
+"\n" \
+"protected:\n" \
+"\n" \
+"private:\n" \
+"    Struct data_;\n" \
+"};\n" \
+"\n" \
+"}\n" \
+"\n" \
+"#endif;";
+
+static const QString templateCPPFile =
+"/*******************************************************************************\n" \
+"//  created:\n" \
+"//\n" \
+"//  author:     Generated automatically with DBC decriptor\n" \
+"//              Copyright Heudiasyc UMR UTC/CNRS 7253\n" \
+"//\n" \
+"//  version:    $Id: $\n" \
+"//\n" \
+"//  purpose:\n" \
+"//\n" \
+"*******************************************************************************/\n" \
+"\n" \
+"\n" \
+"#include \"CanFrame.h\"\n" \
+"#include <iostream>\n" \
+"\n" \
+"using namespace pacpus;\n" \
+"\n" \
+"void CanFrame::decode()\n" \
+"{\n" \
+"	long long lltmp = 0;\n" \
+"	unsigned long long ulltmp = 0;\n" \
+"	long ltmp = 0;\n" \
+"	unsigned long ultmp = 0;\n" \
+"	short stmp = 0;\n" \
+"	unsigned short ustmp = 0;\n" \
+"	char ctmp = 0;\n" \
+"	unsigned char uctmp = 0;\n" \
+"};";
+
+static const QString templateStructFile =
+"/*******************************************************************************\n" \
+"//  created:\n" \
+"//\n" \
+"//  author:     Generated automatically with DBC decriptor\n" \
+"//              Copyright Heudiasyc UMR UTC/CNRS 7253\n" \
+"//\n" \
+"//  version:    $Id: $\n" \
+"//\n" \
+"//  purpose:\n" \
+"//\n" \
+"*******************************************************************************/\n" \
+"\n" \
+"#ifndef __STRUCTURECAN_H__\n" \
+"#define __STRUCTURECAN_H__\n" \
+"\n" \
+"#include <cstddef>\n" \
+"\n" \
+"#include \"Pacpus/kernel/cstdint.h\"\n" \
+"#include \"Pacpus/kernel/road_time.h\"\n" \
+"\n" \
+"\n" \
+"#endif";
+
+#endif // STRUCTURE_H
Index: tags/0.2.3/src/ico/heudiasycIco.rc
===================================================================
--- tags/0.2.3/src/ico/heudiasycIco.rc	(revision 368)
+++ tags/0.2.3/src/ico/heudiasycIco.rc	(revision 368)
@@ -0,0 +1,1 @@
+IDI_ICON1               ICON    DISCARDABLE     "heudiasyc.ico"
