mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-11-25 11:49:34 +01:00
204 lines
6.8 KiB
ReStructuredText
204 lines
6.8 KiB
ReStructuredText
|
|
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
|