less defines

This commit is contained in:
oarcher 2024-08-08 20:06:54 +02:00
parent 8f948599fa
commit 3120d0d43a
5 changed files with 53 additions and 59 deletions

View file

@ -197,17 +197,16 @@ async def to_code(config):
cg.add(var.add_init_at_command(cmd)) cg.add(var.add_init_at_command(cmd))
modem_model = config[CONF_MODEL] modem_model = config[CONF_MODEL]
cg.add_define("USE_MODEM_MODEL", modem_model) cg.add(var.set_model(modem_model))
cg.add_define(f"USE_MODEM_MODEL_{modem_model}")
if config[CONF_ENABLE_GNSS]: if config[CONF_ENABLE_GNSS]:
cg.add_define("USE_MODEM_GNSS")
cg.add(var.set_gnss_power_command(MODEM_MODELS_GNSS_POWER[modem_model])) cg.add(var.set_gnss_power_command(MODEM_MODELS_GNSS_POWER[modem_model]))
if power_spec := MODEM_MODELS_POWER.get(modem_model, None): if power_spec := MODEM_MODELS_POWER.get(modem_model, None):
cg.add_define("USE_MODEM_POWER") cg.add(var.set_power_ton(power_spec["ton"]))
for spec, value in power_spec.items(): cg.add(var.set_power_tonuart(power_spec["tonuart"]))
cg.add_define(f"USE_MODEM_POWER_{spec.upper()}", value) cg.add(var.set_power_toff(power_spec["toff"]))
cg.add(var.set_power_toffuart(power_spec["toffuart"]))
cg.add(var.set_apn(config[CONF_APN])) cg.add(var.set_apn(config[CONF_APN]))
@ -220,7 +219,6 @@ async def to_code(config):
if status_pin := config.get(CONF_STATUS_PIN, None): if status_pin := config.get(CONF_STATUS_PIN, None):
pin = await cg.gpio_pin_expression(status_pin) pin = await cg.gpio_pin_expression(status_pin)
cg.add(var.set_status_pin(pin)) cg.add(var.set_status_pin(pin))
cg.add_define("USE_MODEM_STATUS")
if power_pin := config.get(CONF_POWER_PIN, None): if power_pin := config.get(CONF_POWER_PIN, None):
pin = await cg.gpio_pin_expression(power_pin) pin = await cg.gpio_pin_expression(power_pin)

View file

@ -22,11 +22,6 @@
#include <iostream> #include <iostream>
#include <cmath> #include <cmath>
#ifndef USE_MODEM_MODEL
#define USE_MODEM_MODEL "GENERIC"
#define USE_MODEM_MODEL_GENERIC
#endif
#define ESPHL_ERROR_CHECK(err, message) \ #define ESPHL_ERROR_CHECK(err, message) \
if ((err) != ESP_OK) { \ if ((err) != ESP_OK) { \
ESP_LOGE(TAG, message ": (%d) %s", err, esp_err_to_name(err)); \ ESP_LOGE(TAG, message ": (%d) %s", err, esp_err_to_name(err)); \
@ -188,7 +183,7 @@ void ModemComponent::setup() {
} }
ESP_LOGCONFIG(TAG, "Config Modem:"); ESP_LOGCONFIG(TAG, "Config Modem:");
ESP_LOGCONFIG(TAG, " Model : %s", USE_MODEM_MODEL); ESP_LOGCONFIG(TAG, " Model : %s", this->model_.c_str());
ESP_LOGCONFIG(TAG, " APN : %s", this->apn_.c_str()); ESP_LOGCONFIG(TAG, " APN : %s", this->apn_.c_str());
ESP_LOGCONFIG(TAG, " PIN code : %s", (this->pin_code_.empty()) ? "No" : "Yes (not shown)"); ESP_LOGCONFIG(TAG, " PIN code : %s", (this->pin_code_.empty()) ? "No" : "Yes (not shown)");
ESP_LOGCONFIG(TAG, " Tx Pin : GPIO%u", this->tx_pin_->get_pin()); ESP_LOGCONFIG(TAG, " Tx Pin : GPIO%u", this->tx_pin_->get_pin());
@ -246,7 +241,6 @@ void ModemComponent::loop() {
return; return;
} }
#ifdef USE_MODEM_POWER
if (this->internal_state_.power_transition) { if (this->internal_state_.power_transition) {
watchdog::WatchdogManager wdt(30000); watchdog::WatchdogManager wdt(30000);
@ -254,11 +248,11 @@ void ModemComponent::loop() {
switch (this->internal_state_.power_state) { switch (this->internal_state_.power_state) {
case ModemPowerState::TON: case ModemPowerState::TON:
this->power_pin_->digital_write(false); this->power_pin_->digital_write(false);
delay(USE_MODEM_POWER_TON); delay(this->power_ton_);
this->power_pin_->digital_write(true); this->power_pin_->digital_write(true);
next_loop_millis = millis() + USE_MODEM_POWER_TONUART; // delay for next loop next_loop_millis = millis() + this->power_tonuart_; // delay for next loop
this->internal_state_.power_state = ModemPowerState::TONUART; this->internal_state_.power_state = ModemPowerState::TONUART;
ESP_LOGD(TAG, "Will check that the modem is on in %.1fs...", float(USE_MODEM_POWER_TONUART) / 1000); ESP_LOGD(TAG, "Will check that the modem is on in %.1fs...", float(this->power_tonuart_) / 1000);
break; break;
case ModemPowerState::TONUART: case ModemPowerState::TONUART:
this->internal_state_.power_transition = false; this->internal_state_.power_transition = false;
@ -274,11 +268,11 @@ void ModemComponent::loop() {
case ModemPowerState::TOFF: case ModemPowerState::TOFF:
delay(10); delay(10);
this->power_pin_->digital_write(false); this->power_pin_->digital_write(false);
delay(USE_MODEM_POWER_TOFF); delay(this->power_toff_);
this->power_pin_->digital_write(true); this->power_pin_->digital_write(true);
this->internal_state_.power_state = ModemPowerState::TOFFUART; this->internal_state_.power_state = ModemPowerState::TOFFUART;
ESP_LOGD(TAG, "Will check that the modem is off in %.1fs...", float(USE_MODEM_POWER_TOFFUART) / 1000); ESP_LOGD(TAG, "Will check that the modem is off in %.1fs...", float(this->power_toffuart_) / 1000);
next_loop_millis = millis() + USE_MODEM_POWER_TOFFUART; // delay for next loop next_loop_millis = millis() + this->power_toffuart_; // delay for next loop
break; break;
case ModemPowerState::TOFFUART: case ModemPowerState::TOFFUART:
this->internal_state_.power_transition = false; this->internal_state_.power_transition = false;
@ -296,7 +290,6 @@ void ModemComponent::loop() {
yield(); yield();
return; return;
} }
#endif // USE_MODEM_POWER
switch (this->component_state_) { switch (this->component_state_) {
case ModemComponentState::NOT_RESPONDING: case ModemComponentState::NOT_RESPONDING:
@ -477,19 +470,21 @@ void ModemComponent::modem_lazy_init_() {
} }
esp_modem_dce_config_t dce_config = ESP_MODEM_DCE_DEFAULT_CONFIG(this->apn_.c_str()); esp_modem_dce_config_t dce_config = ESP_MODEM_DCE_DEFAULT_CONFIG(this->apn_.c_str());
#if defined(USE_MODEM_MODEL_GENERIC) if (this->model_ == "GENERIC") {
this->dce = create_generic_dce(&dce_config, this->dte_, this->ppp_netif_); this->dce = create_generic_dce(&dce_config, this->dte_, this->ppp_netif_);
#elif defined(USE_MODEM_MODEL_BG96) } else if (this->model_ == "BG96") {
this->dce = create_BG96_dce(&dce_config, this->dte_, this->ppp_netif_); this->dce = create_BG96_dce(&dce_config, this->dte_, this->ppp_netif_);
#elif defined(USE_MODEM_MODEL_SIM800) } else if (this->model_ == "SIM800") {
this->dce = create_SIM800_dce(&dce_config, this->dte_, this->ppp_netif_); this->dce = create_SIM800_dce(&dce_config, this->dte_, this->ppp_netif_);
#elif defined(USE_MODEM_MODEL_SIM7000) } else if (this->model_ == "SIM7000") {
this->dce = create_SIM7000_dce(&dce_config, this->dte_, this->ppp_netif_); this->dce = create_SIM7000_dce(&dce_config, this->dte_, this->ppp_netif_);
#elif defined(USE_MODEM_MODEL_SIM7600) || defined(USE_MODEM_MODEL_SIM7670) } else if (this->model_ == "SIM7600" || this->model_ == "SIM7670") {
this->dce = create_SIM7600_dce(&dce_config, this->dte_, this->ppp_netif_); this->dce = create_SIM7600_dce(&dce_config, this->dte_, this->ppp_netif_);
#else } else {
#error Modem model not known ESP_LOGE(TAG, "Invalid model %s", this->model_.c_str());
#endif return;
}
// flow control not fully implemented, but kept here for future work // flow control not fully implemented, but kept here for future work
// if (dte_config.uart_config.flow_control == ESP_MODEM_FLOW_CONTROL_HW) { // if (dte_config.uart_config.flow_control == ESP_MODEM_FLOW_CONTROL_HW) {
// if (command_result::OK != this->dce->set_flow_control(2, 2)) { // if (command_result::OK != this->dce->set_flow_control(2, 2)) {
@ -708,23 +703,23 @@ void ModemComponent::ip_event_handler(void *arg, esp_event_base_t event_base, in
} }
void ModemComponent::poweron_() { void ModemComponent::poweron_() {
#ifdef USE_MODEM_POWER if (this->power_pin_) {
this->internal_state_.power_state = ModemPowerState::TON; this->internal_state_.power_state = ModemPowerState::TON;
this->internal_state_.power_transition = true; this->internal_state_.power_transition = true;
#else
if (this->modem_ready()) {
ESP_LOGV(TAG, "Modem is already ON");
} else { } else {
ESP_LOGW(TAG, "No 'power_pin' defined: Not able to poweron the modem"); if (this->modem_ready()) {
ESP_LOGV(TAG, "Modem is already ON");
} else {
ESP_LOGW(TAG, "No 'power_pin' defined: Not able to poweron the modem");
}
} }
#endif // USE_MODEM_POWER
} }
void ModemComponent::poweroff_() { void ModemComponent::poweroff_() {
#ifdef USE_MODEM_POWER if (this->power_pin_) {
this->internal_state_.power_state = ModemPowerState::TOFF; this->internal_state_.power_state = ModemPowerState::TOFF;
this->internal_state_.power_transition = true; this->internal_state_.power_transition = true;
#endif // USE_MODEM_POWER }
} }
void ModemComponent::dump_connect_params_() { void ModemComponent::dump_connect_params_() {

View file

@ -11,7 +11,6 @@
// esp_modem will use esphome logger (needed if other components include esphome/core/log.h) // esp_modem will use esphome logger (needed if other components include esphome/core/log.h)
// We need to do this because "cxx_include/esp_modem_api.hpp" is not a pure C++ header, and use logging. // We need to do this because "cxx_include/esp_modem_api.hpp" is not a pure C++ header, and use logging.
// FIXME: Find another workaround ?.
// error: using declarations in the global namespace in headers are prohibited // error: using declarations in the global namespace in headers are prohibited
// [google-global-names-in-headers,-warnings-as-errors] // [google-global-names-in-headers,-warnings-as-errors]
using esphome::esp_log_printf_; // NOLINT(google-global-names-in-headers): using esphome::esp_log_printf_; // NOLINT(google-global-names-in-headers):
@ -38,27 +37,31 @@ enum class ModemComponentState {
DISABLED, DISABLED,
}; };
#ifdef USE_MODEM_POWER
enum class ModemPowerState { enum class ModemPowerState {
TON, TON,
TONUART, TONUART,
TOFF, TOFF,
TOFFUART, TOFFUART,
}; };
#endif // USE_MODEM_POWER
class ModemComponent : public Component { class ModemComponent : public Component {
public: public:
void set_use_address(const std::string &use_address) { this->use_address_ = use_address; } void set_use_address(const std::string &use_address) { this->use_address_ = use_address; }
void set_rx_pin(InternalGPIOPin *rx_pin) { this->rx_pin_ = rx_pin; } void set_rx_pin(InternalGPIOPin *rx_pin) { this->rx_pin_ = rx_pin; }
void set_tx_pin(InternalGPIOPin *tx_pin) { this->tx_pin_ = tx_pin; } void set_tx_pin(InternalGPIOPin *tx_pin) { this->tx_pin_ = tx_pin; }
void set_model(const std::string model) { this->model_ = model; }
void set_power_pin(GPIOPin *power_pin) { this->power_pin_ = power_pin; } void set_power_pin(GPIOPin *power_pin) { this->power_pin_ = power_pin; }
void set_power_ton(int ton) { this->power_ton_ = ton; }
void set_power_tonuart(int tonuart) { this->power_tonuart_ = tonuart; }
void set_power_toff(int toff) { this->power_toff_ = toff; }
void set_power_toffuart(int toffuart) { this->power_toffuart_ = toffuart; }
void set_status_pin(GPIOPin *status_pin) { this->status_pin_ = status_pin; } void set_status_pin(GPIOPin *status_pin) { this->status_pin_ = status_pin; }
void set_username(const std::string &username) { this->username_ = username; } void set_username(const std::string &username) { this->username_ = username; }
void set_password(const std::string &password) { this->password_ = password; } void set_password(const std::string &password) { this->password_ = password; }
void set_pin_code(const std::string &pin_code) { this->pin_code_ = pin_code; } void set_pin_code(const std::string &pin_code) { this->pin_code_ = pin_code; }
void set_apn(const std::string &apn) { this->apn_ = apn; } void set_apn(const std::string &apn) { this->apn_ = apn; }
void set_gnss_power_command(const std::string &at_command) { this->gnss_power_command_ = at_command; } void set_gnss_power_command(const std::string &at_command) { this->gnss_power_command_ = at_command; }
std::string get_gnss_power_command() { return this->gnss_power_command_; }
void set_not_responding_cb(Trigger<> *not_responding_cb) { this->not_responding_cb_ = not_responding_cb; } void set_not_responding_cb(Trigger<> *not_responding_cb) { this->not_responding_cb_ = not_responding_cb; }
void enable_cmux() { this->cmux_ = true; } void enable_cmux() { this->cmux_ = true; }
void enable_debug(); void enable_debug();
@ -113,7 +116,12 @@ class ModemComponent : public Component {
// Attributes from yaml config // Attributes from yaml config
InternalGPIOPin *tx_pin_; InternalGPIOPin *tx_pin_;
InternalGPIOPin *rx_pin_; InternalGPIOPin *rx_pin_;
std::string model_;
GPIOPin *status_pin_{nullptr}; GPIOPin *status_pin_{nullptr};
int power_ton_;
int power_tonuart_;
int power_toff_;
int power_toffuart_;
GPIOPin *power_pin_{nullptr}; GPIOPin *power_pin_{nullptr};
std::string pin_code_; std::string pin_code_;
std::string username_; std::string username_;
@ -155,12 +163,10 @@ class ModemComponent : public Component {
uint32_t connect_begin; uint32_t connect_begin;
// guess power state // guess power state
bool powered_on{false}; bool powered_on{false};
#ifdef USE_MODEM_POWER
// Will be true when power transitionning // Will be true when power transitionning
bool power_transition{false}; bool power_transition{false};
// states for triggering on/off signals // states for triggering on/off signals
ModemPowerState power_state{ModemPowerState::TOFFUART}; ModemPowerState power_state{ModemPowerState::TOFFUART};
#endif // USE_MODEM_POWER
}; };
InternalState internal_state_; InternalState internal_state_;
}; };

View file

@ -40,7 +40,9 @@ void ModemSensor::update() {
if (modem::global_modem_component->dce && modem::global_modem_component->modem_ready()) { if (modem::global_modem_component->dce && modem::global_modem_component->modem_ready()) {
this->update_signal_sensors_(); this->update_signal_sensors_();
App.feed_wdt(); App.feed_wdt();
this->update_gnss_sensors_(); if (!modem::global_modem_component->get_gnss_power_command().empty()) {
this->update_gnss_sensors_();
}
} }
} }
@ -64,7 +66,6 @@ void ModemSensor::update_signal_sensors_() {
} }
} }
#ifdef USE_MODEM_GNSS
std::map<std::string, std::string> get_gnssinfo_tokens(const std::string &gnss_info, const std::string &module) { std::map<std::string, std::string> get_gnssinfo_tokens(const std::string &gnss_info, const std::string &module) {
// for 7670 (18 tokens): // for 7670 (18 tokens):
// +CGNSSINFO: 3,12,,04,00,48.6167297,N,4.5600739,W,060824,101218.00,75.7,0.000,234.10,2.52,1.88,1.68,08 // +CGNSSINFO: 3,12,,04,00,48.6167297,N,4.5600739,W,060824,101218.00,75.7,0.000,234.10,2.52,1.88,1.68,08
@ -233,8 +234,6 @@ void ModemSensor::update_gnss_sensors_() {
} }
} }
#endif // USE_MODEM_GNSS
} // namespace modem_sensor } // namespace modem_sensor
} // namespace esphome } // namespace esphome

View file

@ -20,14 +20,12 @@ class ModemSensor : public PollingComponent {
void set_rssi_sensor(sensor::Sensor *rssi_sensor) { this->rssi_sensor_ = rssi_sensor; } void set_rssi_sensor(sensor::Sensor *rssi_sensor) { this->rssi_sensor_ = rssi_sensor; }
void set_ber_sensor(sensor::Sensor *ber_sensor) { this->ber_sensor_ = ber_sensor; } void set_ber_sensor(sensor::Sensor *ber_sensor) { this->ber_sensor_ = ber_sensor; }
#ifdef USE_MODEM_GNSS
void set_latitude_sensor(sensor::Sensor *latitude_sensor) { this->gnss_latitude_sensor_ = latitude_sensor; } void set_latitude_sensor(sensor::Sensor *latitude_sensor) { this->gnss_latitude_sensor_ = latitude_sensor; }
void set_longitude_sensor(sensor::Sensor *longitude_sensor) { this->gnss_longitude_sensor_ = longitude_sensor; } void set_longitude_sensor(sensor::Sensor *longitude_sensor) { this->gnss_longitude_sensor_ = longitude_sensor; }
void set_altitude_sensor(sensor::Sensor *altitude_sensor) { this->gnss_altitude_sensor_ = altitude_sensor; } void set_altitude_sensor(sensor::Sensor *altitude_sensor) { this->gnss_altitude_sensor_ = altitude_sensor; }
void set_course_sensor(sensor::Sensor *course_sensor) { this->gnss_course_sensor_ = course_sensor; } void set_course_sensor(sensor::Sensor *course_sensor) { this->gnss_course_sensor_ = course_sensor; }
void set_speed_sensor(sensor::Sensor *speed_sensor) { this->gnss_speed_sensor_ = speed_sensor; } void set_speed_sensor(sensor::Sensor *speed_sensor) { this->gnss_speed_sensor_ = speed_sensor; }
void set_accuracy_sensor(sensor::Sensor *accuracy_sensor) { this->gnss_accuracy_sensor_ = accuracy_sensor; } void set_accuracy_sensor(sensor::Sensor *accuracy_sensor) { this->gnss_accuracy_sensor_ = accuracy_sensor; }
#endif // USE_MODEM_GNSS
// ========== INTERNAL METHODS ========== // ========== INTERNAL METHODS ==========
// (In most use cases you won't need these) // (In most use cases you won't need these)
@ -42,7 +40,6 @@ class ModemSensor : public PollingComponent {
sensor::Sensor *ber_sensor_{nullptr}; sensor::Sensor *ber_sensor_{nullptr};
void update_signal_sensors_(); void update_signal_sensors_();
#ifdef USE_MODEM_GNSS
sensor::Sensor *gnss_latitude_sensor_{nullptr}; sensor::Sensor *gnss_latitude_sensor_{nullptr};
sensor::Sensor *gnss_longitude_sensor_{nullptr}; sensor::Sensor *gnss_longitude_sensor_{nullptr};
sensor::Sensor *gnss_altitude_sensor_{nullptr}; sensor::Sensor *gnss_altitude_sensor_{nullptr};
@ -50,7 +47,6 @@ class ModemSensor : public PollingComponent {
sensor::Sensor *gnss_course_sensor_{nullptr}; sensor::Sensor *gnss_course_sensor_{nullptr};
sensor::Sensor *gnss_accuracy_sensor_{nullptr}; sensor::Sensor *gnss_accuracy_sensor_{nullptr};
void update_gnss_sensors_(); void update_gnss_sensors_();
#endif // USE_MODEM_GNSS
}; };
} // namespace modem_sensor } // namespace modem_sensor