Commit 555f66d0 authored by Laurent Claustre's avatar Laurent Claustre

Merge branch 'improve-plugin-doc' into 'master'

Revamping the documentation.

See merge request !98
parents 1cc656ba 6aabf77a
Pipeline #6520 passed with stages
in 14 minutes and 46 seconds
# LImA
Lima ( **L** ibrary for **Im** age **A** cquisition) is a project for the unified control of 2D detectors. The aim is to clearly separate hardware specific code from common software configuration and features, like setting standard acquisition parameters (exposure time, external trigger), file saving and image processing.
Lima is a C++ library which can be used with many different cameras. The library also comes with a [Python](http://python.org) binding and provides a [PyTango](http://pytango.readthedocs.io/en/stable/) device server for remote control.
## Documentation
The documentation is available [here](http://lima-doc.readthedocs.io/). Thank you to the people running Read the Docs for such an excellent service.
The source for the documentation is in the `docs` folder. Here are the instructions to built and read it locally. The documentation is built with [Doxygen](http://www.doxygen.org/) and [Sphinx](http://www.sphinx-doc.org). The sphinx template is from [ReadtheDocs](https://docs.readthedocs.io). [Breathe](https://breathe.readthedocs.io) provides a bridge between the Sphinx and Doxygen documentation systems.
pip install --user sphinx sphinx-autobuild sphinx_rtd_theme breathe recommonmark
apt-get doxygen
cd docs
doxygen common.dox
doxygen control.dox
doxygen hardware.dox
make html
The html documentation is generated in `docs/.build/html`.
......@@ -2,9 +2,15 @@ LIMA Release Notes
This is the release notes of LIMA, the library for image acquisition.
You can find information releated to new features and bug fixes. The notes are ordered by branch and release number.
You can find information related to new features and bug fixes. The notes are ordered by branch and release number.
The notes are prefixed with a category name for core, subsystems image/saving/processlib/..., camera names andor/andor3/basler..., windows, applications tango python/tango c++/spec and third-party submodules sps/processlib/...
Stable branch core-1.8
----------------------
Revamp the build system to use CMake, a cross-platform family of tools designed to build, test and package software.
Bug Fixes
Stable branch core-1.7
----------------------
......
......@@ -35,12 +35,10 @@ enum AlignDir {
};
LIMACORE_API std::ostream& operator <<(std::ostream& os, AlignDir align_dir);
/**@brief ImageType is the depth of detectors images
* - Bpp8 means 8 bits unsigned
* - Bpp8S means 8 bits signed....
*/
/// The depth of detectors images
enum ImageType {
Bpp8, Bpp8S, Bpp10, Bpp10S, Bpp12, Bpp12S, Bpp14, Bpp14S,
Bpp8, Bpp8S, Bpp10, Bpp10S, Bpp12, Bpp12S, Bpp14, Bpp14S,
Bpp16, Bpp16S, Bpp32, Bpp32S, Bpp32F, Bpp1, Bpp4, Bpp6, Bpp24, Bpp24S
};
......@@ -54,10 +52,17 @@ enum AcqMode {
LIMACORE_API std::ostream& operator <<(std::ostream& os, AcqMode acq_mode);
LIMACORE_API const char* convert_2_string(AcqMode mode);
LIMACORE_API void convert_from_string(const std::string&,AcqMode&);
/// Triggering mode
enum TrigMode {
IntTrig,IntTrigMult,
ExtTrigSingle, ExtTrigMult,
ExtGate, ExtStartStop, ExtTrigReadout,
IntTrig, //!< Internal software triggering
IntTrigMult, //!< Internal multiple software triggering (one prepareAcq, multiple startAcq)
ExtTrigSingle,
ExtTrigMult,
ExtGate, //!< External signal controls start and stop for each frame
ExtStartStop, //!< One external start signal to start acquisition of one frame and one external signal to stop it
ExtTrigReadout,
};
typedef std::vector<TrigMode> TrigModeList;
......@@ -80,15 +85,21 @@ typedef std::vector<ShutterMode> ShutterModeList;
LIMACORE_API std::ostream& operator <<(std::ostream& os, ShutterMode shutter_mode);
LIMACORE_API const char* convert_2_string(ShutterMode);
LIMACORE_API void convert_from_string(const std::string&,ShutterMode&);
/// The global acquisition status
enum AcqStatus {
AcqReady, AcqRunning, AcqFault, AcqConfig
AcqReady, //!< Acquisition is Ready
AcqRunning, //!< Acquisition is Running
AcqFault, //!< An error occured
AcqConfig //!< Configuring the camera
};
LIMACORE_API std::ostream& operator <<(std::ostream& os, AcqStatus acq_status);
/// Compound bit flags specifying the current detector status
enum DetStatus {
DetIdle = 0x00,
DetFault = 0x01,
DetFault = 0x01,
DetWaitForTrigger = 0x02,
DetShutterOpen = 0x04,
DetExposure = 0x08,
......
......@@ -32,6 +32,8 @@
namespace lima
{
/// Control image accumulation settings
class LIMACORE_API CtAccumulation
{
DEB_CLASS_NAMESPC(DebModControl,"Accumulation","Control");
......
......@@ -33,10 +33,11 @@
#include "lima/CtConfig.h"
#include "lima/Debug.h"
namespace lima
{
class LIMACORE_API CtAcquisition
namespace lima
{
/// This class control the acquisition of images given a hardware
/// interface.
class LIMACORE_API CtAcquisition
{
DEB_CLASS_NAMESPC(DebModControl,"Acquisition","Control");
friend class CtControl;
......
......@@ -46,6 +46,7 @@ namespace lima {
CtAccumulation* m_ct_accumulation;
};
/// Controls buffer settings such as number of buffers, binning and rotation
class LIMACORE_API CtBuffer
{
DEB_CLASS_NAMESPC(DebModControl,"Buffer","Control");
......
......@@ -33,7 +33,7 @@
#include "processlib/LinkTask.h"
namespace lima
namespace lima
{
class CtAcquisition;
......@@ -53,16 +53,8 @@ namespace lima
#endif
class SoftOpInternalMgr;
class SoftOpExternalMgr;
/** @brief Main client class.
*
* With this class you have access to all LImA advance feature:
* - Saving (CtSaving)
* - Image control (CtImage)
* - Acquisition control (CtAcquisition)
* - Accumulation (CtAccumulation)
* - Video (CtVideo)
* - Software operation (SoftOpExternalMgr)
*/
/// Main client class which should be instantiated by the users in their acquisition software.
class LIMACORE_API CtControl {
DEB_CLASS_NAMESPC(DebModControl,"Control","Control");
......@@ -95,9 +87,9 @@ namespace lima
};
class LIMACORE_API ImageStatusCallback
class LIMACORE_API ImageStatusCallback
{
DEB_CLASS_NAMESPC(DebModControl,"Control::ImageStatusCallback",
DEB_CLASS_NAMESPC(DebModControl,"Control::ImageStatusCallback",
"Control");
public:
enum RatePolicy {
......@@ -125,7 +117,7 @@ namespace lima
ProcessingOverun,
CameraError,
EventOther}; /* @todo convert to typedef Event::Code */
enum CameraErrorCode {NoCameraError}; /* @todo fix this */
struct LIMACORE_API Status
......@@ -170,29 +162,39 @@ namespace lima
CtConfig* config();
#endif
SoftOpExternalMgr* externalOperation();
HwInterface* hwInterface();
#else //unix
#else //WIN32
/// \{
/// \name Advanced control accessors
/// Returns a pointer to the acquisition control
CtAcquisition* acquisition() { return m_ct_acq; }
/// Returns a pointer to the saving control
CtSaving* saving() { return m_ct_saving; }
#ifdef WITH_SPS_IMAGE
CtSpsImage* display() { return m_ct_sps_image; }
#endif
/// Returns a pointer to the image control
CtImage* image() { return m_ct_image; }
/// Returns a pointer to the buffer control
CtBuffer* buffer() { return m_ct_buffer; }
/// Returns a pointer to the accumulation control
CtAccumulation* accumulation() { return m_ct_accumulation; }
/// Returns a pointer to the video control
CtVideo* video() { return m_ct_video;}
/// Returns a pointer to the shutter control
CtShutter* shutter() { return m_ct_shutter; }
/// Returns a pointer to the event control
CtEvent* event() { return m_ct_event; }
#ifdef WITH_CONFIG
/// Returns a pointer to the config control
CtConfig* config() { return m_ct_config; }
#endif
/// \}
SoftOpExternalMgr* externalOperation() {return m_op_ext;}
HwInterface* hwInterface() {return m_hw;}
#endif
#endif //WIN32
void setApplyPolicy(ApplyPolicy policy);
void getApplyPolicy(ApplyPolicy &policy) const;
......@@ -251,7 +253,7 @@ namespace lima
HwInterface *m_hw;
mutable Cond m_cond;
mutable Status m_status;
CtSaving *m_ct_saving;
#ifdef WITH_SPS_IMAGE
CtSpsImage *m_ct_sps_image;
......@@ -318,7 +320,7 @@ namespace lima
return os;
}
inline std::ostream& operator<<(std::ostream &os,
const CtControl::ErrorCode &err_code)
{
......@@ -340,7 +342,7 @@ namespace lima
}
return os << desc;
}
inline std::ostream& operator<<(std::ostream &os,
const CtControl::Status &status)
{
......@@ -352,7 +354,7 @@ namespace lima
return os;
}
inline bool operator <(const CtControl::ImageStatus& a,
inline bool operator <(const CtControl::ImageStatus& a,
const CtControl::ImageStatus& b)
{
return ((a.LastImageAcquired < b.LastImageAcquired) ||
......@@ -362,7 +364,7 @@ namespace lima
(a.LastCounterReady < b.LastCounterReady));
}
inline bool operator ==(const CtControl::ImageStatus& a,
inline bool operator ==(const CtControl::ImageStatus& a,
const CtControl::ImageStatus& b)
{
return ((a.LastImageAcquired == b.LastImageAcquired) &&
......@@ -372,19 +374,19 @@ namespace lima
(a.LastCounterReady == b.LastCounterReady));
}
inline bool operator <=(const CtControl::ImageStatus& a,
inline bool operator <=(const CtControl::ImageStatus& a,
const CtControl::ImageStatus& b)
{
return (a < b) || (a == b);
}
inline bool operator >(const CtControl::ImageStatus& a,
inline bool operator >(const CtControl::ImageStatus& a,
const CtControl::ImageStatus& b)
{
return !(a <= b);
}
inline bool operator >=(const CtControl::ImageStatus& a,
inline bool operator >=(const CtControl::ImageStatus& a,
const CtControl::ImageStatus& b)
{
return !(a < b);
......
......@@ -130,7 +130,7 @@ class LIMACORE_API CtMaxImageSizeCB : public HwMaxImageSizeCallback
CtImage *m_ct;
};
/// Control image processing settings such as ROI, binning and rotation
class LIMACORE_API CtImage {
friend class CtControl;
DEB_CLASS_NAMESPC(DebModControl,"Image","Control");
......
......@@ -46,13 +46,8 @@ namespace lima {
typedef std::vector<_BufferHelper*> ZBufferType;
typedef std::map<int,ZBufferType*> dataId2ZBufferType;
/** @brief Saving management
*
* With this class you manage the image saving in different format
*/
class LIMACORE_API CtSaving
/// Control saving settings such as file format and mode
class LIMACORE_API CtSaving
{
DEB_CLASS_NAMESPC(DebModControl,"Saving","Control");
......@@ -162,6 +157,8 @@ namespace lima {
void getHardwareFormat(std::string &format) const;
// --- saving modes
///{
/// \name Saving modes
void setSavingMode(SavingMode mode);
void getSavingMode(SavingMode& mode) const;
......@@ -177,6 +174,8 @@ namespace lima {
void setManagedMode(ManagedMode mode);
void getManagedMode(ManagedMode &mode) const;
///}
// --- common headers
void resetCommonHeader();
......
......@@ -33,6 +33,7 @@
namespace lima {
/// Control shutter settings such as open and close time
class LIMACORE_API CtShutter
{
friend class CtControl;
......
This diff is collapsed.
......@@ -3,11 +3,37 @@
Build and Install
-----------------
Two methods are provided to build Lima from source.
Install binary packages
^^^^^^^^^^^^^^^^^^^^^^^
We provide Conda_ binary packages for some cameras. This is, by far, the easiest way to get started with LImA! For instance:
::
conda install --channel esrf-bcu lima-camera-basler
would install a fully loaded LImA and all its dependencies with the Basler camera plugin and SDK. The camera comes as a python module but is also C++ development package that includes header files and `CMake package config <https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html>`_ files.
If you need the Tango device server for the camera, run:
::
conda install --channel esrf-bcu lima-camera-basler-tango
.. note:: The runtime libraries of the camera's SDK are provided as well but some cameras requires drivers or specific setups than needs to be installed manually.
Build from source
^^^^^^^^^^^^^^^^^
First, you need to :ref:`get_source`. Two methods are provided to build LImA from source:
- using our install script that aims to hide the complexity of CMake_;
- using CMake_ directly for developers who are already acquainted with the tool and need the extra flexibility.
Using scripts
^^^^^^^^^^^^^
The ``install`` scripts will run cmake, compile and install.
"""""""""""""
The ``install`` scripts will run CMake_ to compile and/or install.
It accepts input arguments (see below) but it also uses a configuration file ``scripts/config.txt``. Feel free to update this file for setting a permanent configuration for your own installation.
......@@ -53,31 +79,31 @@ Options are ``<camera-name> <saving-format> python pytango-server``:
``pytango-server`` will install the PyTango_ server
For example, to install the basler camera, use the TIFF output format, the python binding and the TANGO server, one would run:
For example, to install the Basler camera, use the TIFF output format, the python binding and the TANGO server, one would run:
.. code-block:: bash
$ sudo install.sh --git --install-prefix=./install --install-python-prefix=./install/python tiff basler python pytango-server
Using CMake
^^^^^^^^^^^
"""""""""""
Install first the project submodules:
.. code-block:: bash
git submodule init third-party/Processlib
git submodule init camera/basler
git submodule init applications/tango/python
git submodule update
git submodule init third-party/Processlib
git submodule init camera/basler
git submodule init applications/tango/python
git submodule update
Run ``cmake`` in the build directory:
.. code-block:: bash
mkdir build
cd build
cmake ..
mkdir build
cd build
cmake ..
[-G "Visual Studio 15 2017 Win64" | -G "Visual Studio 15 2017" | -G "Unix Makefiles"]
[-DCMAKE_INSTALL_PREFIX=<desired installation path>]
[-DPYTHON_SITE_PACKAGES_DIR=<desired python installation path>]
......@@ -96,23 +122,29 @@ Then compile and install:
Environment Setup
^^^^^^^^^^^^^^^^^
If you have changed the default destination path for both libraries and python modules you should update your environment variables.
.. warning::
If you are using Conda_, we advice against setting any environment variables that might affect the Conda environment (e.g. ``PATH``, ``PYTHONPATH``)as this one of the most common source of troubles.
If the install path for libraries and python modules are not the default, you need to update your environment variables as follow:
For Linux:
.. code-block:: bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<my-new-install-dir>/Lima/lib
export PYTHONPATH=$PYTHONPATH:<my-new-install-dir>
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<my-custom-install-dir>/Lima/lib
export PYTHONPATH=$PYTHONPATH:<my-custom-install-dir>
For Windows:
.. code-block:: bash
set PATH=%PATH%;<my-new-install-dir>\Lima\lib
set PYTHONPATH=%PYTHONPATH%;<my-new-install-dir>
set PATH=%PATH%;<my-custom-install-dir>\Lima\lib
set PYTHONPATH=%PYTHONPATH%;<my-custom-install-dir>
or update the system wide variables ``PATH`` for the libraries and ``PYTHONPATH`` for python.
.. _CMake: https://cmake.org
.. _Conda: https://conda.io
.. _PyTango: http://github.com/tango-cs/pytango
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -11,7 +11,7 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys, os, subprocess
import sys, os, subprocess, re
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
......@@ -24,7 +24,7 @@ read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True'
# -- RunDoxygen first thing ------------------------------------------------
if read_the_docs_build:
subprocess.call('doxygen control.dox; doxygen hardware.dox', shell=True)
subprocess.call('doxygen common.dox; doxygen control.dox; doxygen hardware.dox', shell=True)
# -- General configuration -----------------------------------------------------
......@@ -56,9 +56,9 @@ copyright = u'2016, Lima Team'
# built documents.
#
# The short X.Y version.
version = '1.7'
version = re.sub('^v', '', os.popen('git describe').read().strip())
# The full version, including alpha/beta/rc tags.
release = '1.7.2'
release = version
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
......@@ -98,7 +98,7 @@ pygments_style = 'sphinx'
#modindex_common_prefix = []
# Tell breathe about the projects
breathe_projects = { "control": ".doxygen/control/", "hardware": ".doxygen/hardware/" }
breathe_projects = { "common": ".doxygen/common/", "control": ".doxygen/control/", "hardware": ".doxygen/hardware/" }
breathe_default_project = "control"
breathe_domain_by_extension = {"h" : "cpp"}
......
C++ API
=======
Unfortunately very limited documentation is available from the source doc...
Unfortunately very limited documentation is available from the source but that should improve over time.
User API
--------
In this section we cover the classes that defines the user interface.
Hello, Lima!
````````````
^^^^^^^^^^^^
Let's start with a simple example of an image acquisition function using the simulator camera.
Let's get started with a simple example of an image acquisition function using the simulator camera.
.. code-block:: c++
// A camera instance
// A camera instance and its hardware interface
Simulator::Camera simu;
// A hardware interface and the control object
Simulator::Interface hw(simu);
// The control object
CtControl ct = CtControl(&hw);
// Get the saving control and set some properties
......@@ -32,16 +37,16 @@ Let's start with a simple example of an image acquisition function using the sim
CtImage *image = ct.image();
image->setBin(bin);
// Get the acquistion control and set some properties
// Get the acquisition control and set some properties
CtAcquisition *acq = ct.acquisition();
acq->setAcqMode(Single);
acq->setAcqExpoTime(expo);
acq->setAcqNbFrames(nframe);
// Prepare acquistion (transfer properties to the camera)
// Prepare acquisition (transfer properties to the camera)
ct.prepareAcq();
// Start acquistion
// Start acquisition
ct.startAcq();
std::cout << "SIMUTEST: acq started" << std::endl;
......@@ -81,23 +86,65 @@ Let's start with a simple example of an image acquisition function using the sim
std::cout << "SIMUTEST: acq stopped" << std::endl;
Main interfaces
```````````````
Control Interfaces
^^^^^^^^^^^^^^^^^^
The control interface is the high level interface that lets your run an acquisition.
The control interface is the high level interface that controls an acquisition.
.. doxygenclass:: lima::CtControl
:project: control
:members:
Acquisition Interface
"""""""""""""""""""""
.. doxygenclass:: lima::CtAcquisition
:project: control
:members:
.. doxygenclass:: lima::HwFrameCallback
:project: hardware
Saving Interface
""""""""""""""""
.. doxygenclass:: lima::CtSaving
:project: control
:members:
Image Interface
"""""""""""""""
.. doxygenclass:: lima::CtImage
:project: control
:members:
Shutter Interface
"""""""""""""""""
.. doxygenclass:: lima::CtShutter
:project: control
:members:
Buffer Interface
""""""""""""""""
.. doxygenclass:: lima::CtBuffer
:project: control
:members:
Statuses
^^^^^^^^
.. doxygenenum:: lima::AcqStatus
:project: common
.. doxygenenum:: lima::DetStatus
:project: common
Camera Plugin API
-----------------
Hardware Interface
^^^^^^^^^^^^^^^^^^
The Hardware Interface is the low level interface that must be implemented by detector plugins.
.. doxygenclass:: lima::HwInterface
......@@ -105,7 +152,7 @@ The Hardware Interface is the low level interface that must be implemented by de
:members:
Capabilities interfaces
```````````````````````
^^^^^^^^^^^^^^^^^^^^^^^
.. doxygenclass:: lima::HwDetInfoCtrlObj
:project: hardware
......@@ -119,8 +166,15 @@ Capabilities interfaces
:project: hardware
:members:
Callbacks
^^^^^^^^^
.. doxygenclass:: lima::HwFrameCallback
:project: hardware
:members:
Implementations Helpers
```````````````````````
^^^^^^^^^^^^^^^^^^^^^^^
.. doxygenclass:: lima::SoftBufferCtrlObj
:project: hardware
......
.. _getit:
.. _get_source:
Get the Software
----------------
As Lima is not packaged yet, the only way for now is to retrieve the source from Github. You may either get the source tarball from the releases or using ``git``.
Get the Source
--------------
As Lima is not packaged yet, the only way for now is to retrieve the source from Github. You may either get the source tarball from the releases or use Git_.
For both Linux and Windows we recommend to use the git tools:
Recent version of Git_ are provided by Conda, so if you already have Conda, you may want to install it in your base environment:
.. code-block:: bash
conda install git
Else, for both Linux and Windows, we recommend to use the git tools:
- For Linux, install Git_ package if your linux distribution did not.
- For Windows, get and install Git_ first from the download section. Then use the git-bash tool with linux-like commands.
......@@ -35,20 +41,19 @@ In addition (but optional) you can get the **TANGO** python device servers, so u
.. code-block:: bash
git submodule init application/tango/python
git submodule init applications/tango/python
git submodule update
Need a Specific Version?
^^^^^^^^^^^^^^^^^^^^^^^^
For a Specific Version
^^^^^^^^^^^^^^^^^^^^^^
Stable versions of lima are tracked via Git branches and Git tags. So you can retrieve any particular version using git tools.
Please refer to the release notes document `release notes`_ , for more information of the latest release and tags.
For instance if you want to get version 1.7.1 of Lima core, do:
For instance if you want to get version 1.8.0 of Lima core, do:
.. code-block:: bash
git checkout core-1.7.1
git checkout v1.8.0
git submodule init
git submodule update
......
.. Lima documentation master file, created by
.. LImA documentation master file, created by
sphinx-quickstart on Fri Feb 18 10:19:02 2011.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
====================================
LIMA : Library for Image Acquisition
LImA : Library for Image Acquisition
====================================
Lima ( **L** ibrary for **Im** age **A** cquisition) is a project for the unified control of 2D detectors. The aim is to clearly separate hardware specific code from common software configuration and features, like setting standard acquisition parameters (exposure time, external trigger), file saving and image processing.
LImA (stands for **L** ibrary for **Im** age **A** cquisition) is a project for the unified control of 2D detectors. It is used in production in `ESRF Beamlines <https://www.esrf.eu/about/synchrotron-science/beamline>`_ and in other places.
Lima is a C++ library which can be used for many different cameras. The library is also available for Python_ and it provides a PyTango_ server for remote control.
The architecture of the library aims at clearly separating hardware specific code from common software configuration and features, like setting standard acquisition parameters (exposure time, external trigger), file saving and image processing.
The documentation is also available in `pdf`_ and `epub`_ format.
LImA is a C++ library but the library also comes with a Python_ binding. A PyTango_ device server for remote control is provided as well.
If you want to be in touch with the LIMA community, please send an email to lima@esrf.fr. You may also want to subscribe to our mailing list by sending a message to sympa@esrf.fr with `subscribe lima` as subject.
We provide Conda binary package for Windows and Linux for some cameras. Check out our `Conda channel <https://anaconda.org/esrf-bcu>`_.
There is no binary package for lima yet but Lima is a very active project and many developments are ongoing and available from `GitHub <https://github.com/esrf-bliss/Lima>`_. However you can find stable version releases through git branches and tags on `Github releases <https://github.com/esrf-bliss/Lima/releases>`_.
LImA is a very active project and many developments are ongoing and available from `GitHub <https://github.com/esrf-bliss/LImA>`_. You can find stable version releases through git branches and tags on `Github releases <https://github.com/esrf-bliss/LImA/releases>`_.
For the latest changes, refers to the :download:`Release Notes <../ReleaseNotes.txt>` (Also available under the Git repository master branch as ReleaseNotes.txt text file).
If you want to get in touch with the LIMA community, please send an email to lima@esrf.fr. You may also want to subscribe to our mailing list by sending a message to `sympa@esrf.fr <mailto:sympa@esrf.fr?subject=subscribe%20lima>`_ with ``subscribe lima`` as subject.
For the latest changes, refers to the :download:`Release Notes <../ReleaseNotes.txt>`.
Note that this documentation is also available in `pdf`_ and `epub`_ format.
.. _compilation:
......@@ -27,15 +31,16 @@ For the latest changes, refers to the :download:`Release Notes <../ReleaseNotes.
:caption: Installation
requirements
getit
build_install
install_tango_device_server
.. toctree::
:maxdepth: 2
:caption: How to contribute
:caption: Getting Started
howto_contribute
user/overview
user/concepts
user/tutorial
.. toctree::
:maxdepth: 2
......@@ -53,20 +58,22 @@ For the latest changes, refers to the :download:`Release Notes <../ReleaseNotes.
.. toctree::