<spanid="dce-factory"></span><h2>Custom instantiation with DCE factory<aclass="headerlink"href="#custom-instantiation-with-dce-factory"title="Permalink to this heading">¶</a></h2>
<p>It is possible to create a modem handle in many different ways:</p>
<ulclass="simple">
<li><p>Build a DCE on top a generic module, user defined module or build the module only (in case the application will only use AT command interface)</p></li>
<li><p>Create the DCE as a shared, unique or a vanilla pointer</p></li>
<li><p>Create a generic DCE or a templated DCE_T of a specific module (this could be one of the supported modules or a user defined module)</p></li>
</ul>
<p>All the functionality is provided by the DCE factory</p>
<spanid="_CPPv39ModemType"></span><spanid="_CPPv29ModemType"></span><spanclass="target"id="group___e_s_p___m_o_d_e_m___d_c_e___f_a_c_t_o_r_y_1ga34f5bd407ce186b43f44b5c8cfbf2fd9"></span><spanclass="k"><spanclass="pre">enum</span></span><spanclass="w"></span><spanclass="k"><spanclass="pre">class</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">ModemType</span></span></span><aclass="headerlink"href="#_CPPv49ModemType"title="Permalink to this definition">¶</a><br/></dt>
<dd><p>Specific modem choice when creating by the <aclass="reference internal"href="#classesp__modem_1_1dce__factory_1_1_factory"><spanclass="std std-ref">Factory</span></a>. </p>
<spanid="_CPPv3N9ModemType13GenericModuleE"></span><spanid="_CPPv2N9ModemType13GenericModuleE"></span><spanclass="target"id="group___e_s_p___m_o_d_e_m___d_c_e___f_a_c_t_o_r_y_1gga34f5bd407ce186b43f44b5c8cfbf2fd9aa8bf3237121049ad32b6caa9e888a248"></span><spanclass="k"><spanclass="pre">enumerator</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">GenericModule</span></span></span><aclass="headerlink"href="#_CPPv4N9ModemType13GenericModuleE"title="Permalink to this definition">¶</a><br/></dt>
<dd><p>Default generic module with the most common commands </p>
<spanid="_CPPv3N9ModemType7SIM7600E"></span><spanid="_CPPv2N9ModemType7SIM7600E"></span><spanclass="target"id="group___e_s_p___m_o_d_e_m___d_c_e___f_a_c_t_o_r_y_1gga34f5bd407ce186b43f44b5c8cfbf2fd9aa0e5dcb06d41510dde0b20f2e59e75a2"></span><spanclass="k"><spanclass="pre">enumerator</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">SIM7600</span></span></span><aclass="headerlink"href="#_CPPv4N9ModemType7SIM7600E"title="Permalink to this definition">¶</a><br/></dt>
<dd><p>Derived from the <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_generic_module"><spanclass="std std-ref">GenericModule</span></a>, specifics applied to <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_s_i_m7600"><spanclass="std std-ref">SIM7600</span></a> model </p>
<spanid="_CPPv3N9ModemType7SIM7070E"></span><spanid="_CPPv2N9ModemType7SIM7070E"></span><spanclass="target"id="group___e_s_p___m_o_d_e_m___d_c_e___f_a_c_t_o_r_y_1gga34f5bd407ce186b43f44b5c8cfbf2fd9a17612eb64619563fb0b5c35d046d419d"></span><spanclass="k"><spanclass="pre">enumerator</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">SIM7070</span></span></span><aclass="headerlink"href="#_CPPv4N9ModemType7SIM7070E"title="Permalink to this definition">¶</a><br/></dt>
<dd><p>Derived from the <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_generic_module"><spanclass="std std-ref">GenericModule</span></a>, specifics applied to <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_s_i_m7070"><spanclass="std std-ref">SIM7070</span></a> model </p>
<spanid="_CPPv3N9ModemType7SIM7000E"></span><spanid="_CPPv2N9ModemType7SIM7000E"></span><spanclass="target"id="group___e_s_p___m_o_d_e_m___d_c_e___f_a_c_t_o_r_y_1gga34f5bd407ce186b43f44b5c8cfbf2fd9a719215eb78ae5f264bb9af70af9aedaa"></span><spanclass="k"><spanclass="pre">enumerator</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">SIM7000</span></span></span><aclass="headerlink"href="#_CPPv4N9ModemType7SIM7000E"title="Permalink to this definition">¶</a><br/></dt>
<dd><p>Derived from the <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_generic_module"><spanclass="std std-ref">GenericModule</span></a>, specifics applied to <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_s_i_m7000"><spanclass="std std-ref">SIM7000</span></a> model </p>
<spanid="_CPPv3N9ModemType4BG96E"></span><spanid="_CPPv2N9ModemType4BG96E"></span><spanclass="target"id="group___e_s_p___m_o_d_e_m___d_c_e___f_a_c_t_o_r_y_1gga34f5bd407ce186b43f44b5c8cfbf2fd9a80e1af61101ed94123673230a16bdbe0"></span><spanclass="k"><spanclass="pre">enumerator</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">BG96</span></span></span><aclass="headerlink"href="#_CPPv4N9ModemType4BG96E"title="Permalink to this definition">¶</a><br/></dt>
<dd><p>Derived from the <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_generic_module"><spanclass="std std-ref">GenericModule</span></a>, specifics applied to BG69 model </p>
<spanid="_CPPv3N9ModemType6SIM800E"></span><spanid="_CPPv2N9ModemType6SIM800E"></span><spanclass="target"id="group___e_s_p___m_o_d_e_m___d_c_e___f_a_c_t_o_r_y_1gga34f5bd407ce186b43f44b5c8cfbf2fd9a6705b747abfe5514ac06e14ef95ebc44"></span><spanclass="k"><spanclass="pre">enumerator</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">SIM800</span></span></span><aclass="headerlink"href="#_CPPv4N9ModemType6SIM800E"title="Permalink to this definition">¶</a><br/></dt>
<dd><p>Derived from the <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_generic_module"><spanclass="std std-ref">GenericModule</span></a> with specifics applied to <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_s_i_m800"><spanclass="std std-ref">SIM800</span></a> model </p>
<spanid="_CPPv3N9esp_modem11dce_factory13FactoryHelperE"></span><spanid="_CPPv2N9esp_modem11dce_factory13FactoryHelperE"></span><spanid="esp_modem::dce_factory::FactoryHelper"></span><spanclass="target"id="classesp__modem_1_1dce__factory_1_1_factory_helper"></span><spanclass="k"><spanclass="pre">class</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">FactoryHelper</span></span></span><aclass="headerlink"href="#_CPPv4N9esp_modem11dce_factory13FactoryHelperE"title="Permalink to this definition">¶</a><br/></dt>
<spanid="_CPPv3I0EN9esp_modem11dce_factory7CreatorE"></span><spanid="_CPPv2I0EN9esp_modem11dce_factory7CreatorE"></span><spanclass="k"><spanclass="pre">template</span></span><spanclass="p"><spanclass="pre"><</span></span><spanclass="k"><spanclass="pre">typename</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">T_Module</span></span></span><spanclass="p"><spanclass="pre">></span></span><br/><spanclass="target"id="classesp__modem_1_1dce__factory_1_1_creator"></span><spanclass="k"><spanclass="pre">class</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">Creator</span></span></span><aclass="headerlink"href="#_CPPv4I0EN9esp_modem11dce_factory7CreatorE"title="Permalink to this definition">¶</a><br/></dt>
<p><aclass="reference internal"href="#classesp__modem_1_1dce__factory_1_1_creator"><spanclass="std std-ref">Creator</span></a> class for building a DCE_T<Module> in a specific way, either from a Module object or by default from the <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_t_e"><spanclass="std std-ref">DTE</span></a> and netif. </p>
<spanid="_CPPv3N9esp_modem11dce_factory7FactoryE"></span><spanid="_CPPv2N9esp_modem11dce_factory7FactoryE"></span><spanid="esp_modem::dce_factory::Factory"></span><spanclass="target"id="classesp__modem_1_1dce__factory_1_1_factory"></span><spanclass="k"><spanclass="pre">class</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">Factory</span></span></span><aclass="headerlink"href="#_CPPv4N9esp_modem11dce_factory7FactoryE"title="Permalink to this definition">¶</a><br/></dt>
<p><aclass="reference internal"href="#classesp__modem_1_1dce__factory_1_1_factory"><spanclass="std std-ref">Factory</span></a> class for creating virtual <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e"><spanclass="std std-ref">DCE</span></a> objects based on the configuration of the supplied module. This could also be used to create a custom module or a DCE_T<module>, provided user app derives from this factory. </p>
<spanid="_CPPv3IDpEN9esp_modem11dce_factory7Factory12build_uniqueEPK6configDpRR4Args"></span><spanid="_CPPv2IDpEN9esp_modem11dce_factory7Factory12build_uniqueEPK6configDpRR4Args"></span><spanclass="k"><spanclass="pre">template</span></span><spanclass="p"><spanclass="pre"><</span></span><spanclass="k"><spanclass="pre">typename</span></span><spanclass="w"></span><spanclass="p"><spanclass="pre">...</span></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">Args</span></span></span><spanclass="p"><spanclass="pre">></span></span><br/><spanclass="target"id="classesp__modem_1_1dce__factory_1_1_factory_1a5fd0210522a31e645f28c0b0f23ffb67"></span><spanclass="k"><spanclass="pre">inline</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">std</span></span><spanclass="p"><spanclass="pre">::</span></span><spanclass="n"><spanclass="pre">unique_ptr</span></span><spanclass="p"><spanclass="pre"><</span></span><aclass="reference internal"href="internal_docs.html#_CPPv4N9esp_modem3DCEE"title="esp_modem::DCE"><spanclass="n"><spanclass="pre">DCE</span></span></a><spanclass="p"><spanclass="pre">></span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">build_unique</span></span></span><spanclass="sig-paren">(</span><spanclass="k"><spanclass="pre">const</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">config</span></span><spanclass="w"></span><spanclass="p"><spanclass="pre">*</span></span><spanclass="n sig-param"><spanclass="pre">cfg</span></span>, <aclass="reference internal"href="#_CPPv4IDpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args"title="esp_modem::dce_factory::Factory::build_unique::Args"><spanclass="n"><spanclass="pre">Args</span></span></a><spanclass="p"><spanclass="pre">&</span></span><spanclass="p"><spanclass="pre">&</span></span><spanclass="p"><spanclass="pre">...</span></span><spanclass="w"></span><spanclass="n sig-param"><spanclass="pre">args</span></span><spanclass="sig-paren">)</span><aclass="headerlink"href="#_CPPv4IDpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args"title="Permalink to this definition">¶</a><br/></dt>
<dd><p>Create a default unique_ptr <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e"><spanclass="std std-ref">DCE</span></a> generically, with the chosen module derived from the <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_generic_module"><spanclass="std std-ref">GenericModule</span></a>. </p>
<ddclass="field-odd"><p><strong>Args</strong>– Arguments to the builder, i.e. constructor of <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e___t"><spanclass="std std-ref">esp_modem::DCE_T</span></a> class </p>
<li><p><strong>args</strong>– typically a <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_t_e"><spanclass="std std-ref">DTE</span></a> object and a netif handle for PPP network </p></li>
<ddclass="field-odd"><p>unique_ptr <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e"><spanclass="std std-ref">DCE</span></a> of the created <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e"><spanclass="std std-ref">DCE</span></a> on success </p>
<spanid="_CPPv3I0DpEN9esp_modem11dce_factory7Factory12build_uniqueEPK6configDpRR4Args"></span><spanid="_CPPv2I0DpEN9esp_modem11dce_factory7Factory12build_uniqueEPK6configDpRR4Args"></span><spanclass="k"><spanclass="pre">template</span></span><spanclass="p"><spanclass="pre"><</span></span><spanclass="k"><spanclass="pre">typename</span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">T_Module</span></span></span><spanclass="p"><spanclass="pre">,</span></span><spanclass="w"></span><spanclass="k"><spanclass="pre">typename</span></span><spanclass="w"></span><spanclass="p"><spanclass="pre">...</span></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">Args</span></span></span><spanclass="p"><spanclass="pre">></span></span><br/><spanclass="target"id="classesp__modem_1_1dce__factory_1_1_factory_1a2a4686de666658fb89a8d80ce2935bf2"></span><spanclass="k"><spanclass="pre">static</span></span><spanclass="w"></span><spanclass="k"><spanclass="pre">inline</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">std</span></span><spanclass="p"><spanclass="pre">::</span></span><spanclass="n"><spanclass="pre">unique_ptr</span></span><spanclass="p"><spanclass="pre"><</span></span><aclass="reference internal"href="internal_docs.html#_CPPv4N9esp_modem3DCEE"title="esp_modem::DCE"><spanclass="n"><spanclass="pre">DCE</span></span></a><spanclass="p"><spanclass="pre">></span></span><spanclass="w"></span><spanclass="sig-name descname"><spanclass="n"><spanclass="pre">build_unique</span></span></span><spanclass="sig-paren">(</span><spanclass="k"><spanclass="pre">const</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">config</span></span><spanclass="w"></span><spanclass="p"><spanclass="pre">*</span></span><spanclass="n sig-param"><spanclass="pre">cfg</span></span>, <aclass="reference internal"href="#_CPPv4I0DpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args"title="esp_modem::dce_factory::Factory::build_unique::Args"><spanclass="n"><spanclass="pre">Args</span></span></a><spanclass="p"><spanclass="pre">&</span></span><spanclass="p"><spanclass="pre">&</span></span><spanclass="p"><spanclass="pre">...</span></span><spanclass="w"></span><spanclass="n sig-param"><spanclass="pre">args</span></span><spanclass="sig-paren">)</span><aclass="headerlink"href="#_CPPv4I0DpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args"title="Permalink to this definition">¶</a><br/></dt>
<dd><p>Create a default unique_ptr <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e"><spanclass="std std-ref">DCE</span></a> in a specific way (from the module) </p>
<li><p><strong>Module</strong>– Specific Module used in this <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e"><spanclass="std std-ref">DCE</span></a></p></li>
<li><p><strong>Args</strong>– Arguments to the builder, i.e. constructor of <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e___t"><spanclass="std std-ref">esp_modem::DCE_T</span></a> class </p></li>
<li><p><strong>args</strong>– typically a <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_t_e"><spanclass="std std-ref">DTE</span></a> object and a netif handle for PPP network </p></li>
<ddclass="field-odd"><p>unique_ptr <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e"><spanclass="std std-ref">DCE</span></a> of the created <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e"><spanclass="std std-ref">DCE</span></a> on success </p>
<li><p><strong>Module</strong>– Specific Module used in this <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e"><spanclass="std std-ref">DCE</span></a></p></li>
<li><p><strong>Args</strong>– Arguments to the builder, i.e. constructor of <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e___t"><spanclass="std std-ref">esp_modem::DCE_T</span></a> class </p></li>
<li><p><strong>args</strong>– typically a <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_t_e"><spanclass="std std-ref">DTE</span></a> object and a netif handle for PPP network </p></li>
<ddclass="field-odd"><p><aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e"><spanclass="std std-ref">DCE</span></a> pointer the created <aclass="reference internal"href="internal_docs.html#classesp__modem_1_1_d_c_e"><spanclass="std std-ref">DCE</span></a> on success </p>
<p>Creating a custom module is necessary if the application needs to use a specific device that is not supported
and their commands differ from any of the supported devices. In this case it is recommended to define a new class
representing this specific device and derive from the <aclass="reference internal"href="internal_docs.html#_CPPv4N9esp_modem13GenericModuleE"title="esp_modem::GenericModule"><codeclass="xref cpp cpp-class docutils literal notranslate"><spanclass="pre">esp_modem::GenericModule</span></code></a>. In order to instantiate
the appropriate DCE of this module, application could use <aclass="reference internal"href="#dce-factory"><spanclass="std std-ref">the DCE factory</span></a>, and build the DCE with
the specific module, using <aclass="reference internal"href="#_CPPv4I0DpEN9esp_modem11dce_factory7Factory5buildEP3DCEPK6configDpRR4Args"title="esp_modem::dce_factory::Factory::build"><codeclass="xref cpp cpp-func docutils literal notranslate"><spanclass="pre">esp_modem::dce_factory::Factory::build()</span></code></a>.</p>
<p>Please refer to the implementation of the existing modules.</p>
<p>Please note that the <codeclass="docutils literal notranslate"><spanclass="pre">modem_console</span></code> example defines a trivial custom modem DCE which overrides one command,
<p>In order to connect to a device using an unsupported interface (e.g. SPI or I2C), it is necessary to implement
a custom DTE object and supply it into <aclass="reference internal"href="#dce-factory"><spanclass="std std-ref">the DCE factory</span></a>. The DCE is typically created in two steps:</p>
<ulclass="simple">
<li><p>Define and create the corresponding terminal, which communicates on the custom interface. This terminal should support basic IO methods defined in <aclass="reference internal"href="internal_docs.html#_CPPv4N9esp_modem8TerminalE"title="esp_modem::Terminal"><codeclass="xref cpp cpp-class docutils literal notranslate"><spanclass="pre">esp_modem::Terminal</span></code></a> and derive from it.</p></li>
<li><p>Create the DTE which uses the custom Terminal</p></li>
</ul>
<p>Please refer to the implementation of the existing UART DTE.</p>