#ifndef SIMPLE_CXX_CLIENT_ESP_MODEM_DTE_HPP #define SIMPLE_CXX_CLIENT_ESP_MODEM_DTE_HPP #include #include #include #include #include #include #include "esp_err.h" #include "cxx_include/esp_modem_primitives.hpp" #include "cxx_include/esp_modem_terminal.hpp" #include "cxx_include/esp_modem_cmux.hpp" #include "cxx_include/esp_modem_types.hpp" const int DTE_BUFFER_SIZE = 1024; class DTE: public CommandableIf { public: explicit DTE(std::unique_ptr t); ~DTE() = default; // std::unique_ptr detach() { return std::move(term); } // void attach(std::unique_ptr t) { term = std::move(t); } // void set_line_cb(got_line f) { on_line_cb = std::move(f); } int write(uint8_t *data, size_t len) { return term->write(data, len); } int read(uint8_t **d, size_t len) { auto data_to_read = std::min(len, buffer_size); auto data = buffer.get(); auto actual_len = term->read(data, data_to_read); *d = data; return actual_len; } void set_data_cb(std::function f) { // on_data = std::move(f); term->set_data_cb(std::move(f)); } // std::shared_ptr get_buffer() { return buffer;} void start() { term->start(); } void data_mode_closed() { term->stop(); } void set_mode(modem_mode m) { term->start(); mode = m; if (m == modem_mode::DATA_MODE) { term->set_data_cb(on_data); } else if (m == modem_mode::CMUX_MODE) { setup_cmux(); } } command_result command(const std::string& command, got_line_cb got_line, uint32_t time_ms) override; // std::shared_ptr buffer; void send_cmux_command(uint8_t i, const std::string& command); private: Lock lock; // std::unique_ptr cmux; void setup_cmux(); // void send_sabm(size_t dlci); // CMUXHelper cmux; static const size_t GOT_LINE = BIT0; size_t buffer_size; size_t consumed; // std::shared_ptr> buffer; std::unique_ptr buffer; std::unique_ptr term; // got_line_cb on_line; modem_mode mode; signal_group signal; std::function on_data; }; #endif //SIMPLE_CXX_CLIENT_ESP_MODEM_DTE_HPP