Files
esp-protocols/docs/esp_modem/en/development.rst

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

204 lines
6.8 KiB
ReStructuredText
Raw Normal View History

Development
===========
This chapter covers development mode, build system, and workflow for ESP-MODEM library developers.
Development Mode
----------------
ESP-MODEM supports two different modes for handling AT command definitions, each optimized for different use cases.
Production Mode (Default)
~~~~~~~~~~~~~~~~~~~~~~~~~~
Production mode uses pre-generated headers and sources from the ``command/`` directory. This mode is ideal for:
- **Application development** using existing AT commands
- **Better IDE navigation** and code completion
- **Faster compilation times** with stable, tested implementations
- **End users** who don't need to modify the core library
Development Mode
~~~~~~~~~~~~~~~~
Development mode uses in-place macro expansion from the ``generate/`` directory. This mode is designed for:
- **ESP-MODEM library developers** contributing to the core library
- **Modifying core AT command definitions** in ``esp_modem_command_declare.inc``
- **Debugging command implementations** at the source level
- **Working directly with command source definitions**
To enable development mode:
.. code-block:: bash
idf.py menuconfig
# Navigate to: Component config → ESP-MODEM
# Enable: "Use development mode"
Or set the configuration directly:
.. code-block:: bash
idf.py -D CONFIG_ESP_MODEM_ENABLE_DEVELOPMENT_MODE=y build
.. note::
Development mode requires C preprocessor expansion at compile time, which may result in longer compilation times and larger binary sizes.
When to Use Development Mode
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Use Development Mode when:**
- Contributing to the ESP-MODEM library itself
- Modifying core AT command definitions in ``esp_modem_command_declare.inc``
- Debugging issues in the command library
- Adding new commands to the core library for all users
**Use Production Mode when:**
- Developing applications with ESP-MODEM
- Adding support for new modem modules (see :ref:`customization`)
- Creating custom commands for specific projects
- General application development
Build System
------------
The ESP-MODEM build system automatically handles the differences between production and development modes:
- **Production mode**: Uses pre-generated sources from ``command/`` directory
- **Development mode**: Uses macro expansion from ``generate/`` directory
The build system selects the appropriate source directory based on the ``CONFIG_ESP_MODEM_ENABLE_DEVELOPMENT_MODE`` configuration.
Directory Structure
~~~~~~~~~~~~~~~~~~~
ESP-MODEM uses two parallel directory structures:
**``generate/`` Directory (Development Mode)**
Contains source files with macro definitions that get expanded at compile time:
- ``generate/include/esp_modem_command_declare.inc`` - Core AT command definitions
- ``generate/include/cxx_include/`` - C++ header templates
- ``generate/src/`` - Source file templates
**``command/`` Directory (Production Mode)**
Contains pre-generated, expanded source files:
- ``command/include/esp_modem_api.h`` - Generated C API
- ``command/include/cxx_include/`` - Generated C++ headers
- ``command/src/`` - Generated source files
Code Generation
~~~~~~~~~~~~~~~
ESP-MODEM uses a sophisticated code generation system to create the pre-generated sources. The ``generate.sh`` script:
- Processes AT command definitions from ``esp_modem_command_declare.inc``
- Uses C preprocessor metaprogramming to expand command prototypes
- Generates both C and C++ API headers
- Formats the generated code for consistency
Generate Script Usage
~~~~~~~~~~~~~~~~~~~~~
The ``generate.sh`` script is located in ``components/esp_modem/scripts/`` and can be used to:
**Generate all default files:**
.. code-block:: bash
./scripts/generate.sh
**Generate specific files:**
.. code-block:: bash
./scripts/generate.sh generate/include/cxx_include/esp_modem_command_library.hpp
**Generate files for documentation:**
.. code-block:: bash
./scripts/generate.sh ../../docs/esp_modem/generate/dce.rst
The script automatically:
- Determines the correct compiler (clang/clang++) based on file extension
- Expands macros using C preprocessor
- Formats generated code with astyle
- Handles different file types (.hpp, .cpp, .h, .rst)
Developer Workflow
------------------
Adding New AT Commands
~~~~~~~~~~~~~~~~~~~~~~
To add new AT commands to the core ESP-MODEM library:
1. **Enable development mode** in your project
2. **Edit** ``components/esp_modem/generate/include/esp_modem_command_declare.inc``
3. **Add your command definition** using the ``ESP_MODEM_DECLARE_DCE_COMMAND`` macro:
.. code-block:: c
/**
* @brief Your new command description
* @param[in] param1 Description of parameter 1
* @param[out] param2 Description of parameter 2
* @return OK, FAIL or TIMEOUT
*/
ESP_MODEM_DECLARE_DCE_COMMAND(your_new_command, command_result,
STR_IN(param1), INT_OUT(param2))
4. **Test your changes** in development mode
5. **Generate production files** using ``generate.sh``
6. **Test in production mode** to ensure compatibility
7. **Submit your changes** with appropriate tests
Command Definition Macros
~~~~~~~~~~~~~~~~~~~~~~~~~~
ESP-MODEM provides several macros for defining commands:
- ``ESP_MODEM_DECLARE_DCE_COMMAND`` - Standard command declaration
- ``STR_IN(param)`` - String input parameter
- ``STR_OUT(param)`` - String output parameter
- ``INT_IN(param)`` - Integer input parameter
- ``INT_OUT(param)`` - Integer output parameter
Testing and Validation
~~~~~~~~~~~~~~~~~~~~~~
When developing ESP-MODEM library changes:
1. **Test in both modes** - Ensure your changes work in both development and production modes
2. **Run existing tests** - Verify you don't break existing functionality
3. **Test with multiple modules** - Ensure compatibility across different modem modules
4. **Validate generated code** - Check that generated files are correct and properly formatted
5. **Update documentation** - Add documentation for new commands or features
CI/CD Integration
~~~~~~~~~~~~~~~~~
The ESP-MODEM project includes automated testing that:
- **Validates generated files** - Ensures generated sources are up-to-date
- **Tests both modes** - Runs tests in both development and production modes
- **Checks formatting** - Validates code formatting and style
- **Builds examples** - Ensures examples work with changes
Best Practices
--------------
**For Library Developers:**
- Use development mode when modifying core library files
- Test changes in both production and development modes
- Follow the existing code generation patterns
- Update documentation when adding new commands
- Include appropriate tests for new functionality
**For Contributors:**
- Submit changes that work in both modes
- Include appropriate tests
- Update relevant documentation
- Consider backward compatibility
- Follow the existing coding style and patterns