mirror of
https://github.com/Threnklyn/esphome-dev.git
synced 2026-05-29 17:28:28 +02:00
a62b6548d2
Apparently play()/stop() etc. are not meant to be called directly by users of the class and if they're called directly that would not give the expected result for the classes that have an empty play(). Make all methods except play_complex, stop_comples and is_running protected. While there also make RemoteTransmitterActionBase::encode protected.
93 lines
2.3 KiB
C++
93 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include "esphome/core/component.h"
|
|
#include "esphome/components/uart/uart.h"
|
|
#include "esphome/core/automation.h"
|
|
|
|
namespace esphome {
|
|
namespace sim800l {
|
|
|
|
const uint8_t SIM800L_READ_BUFFER_LENGTH = 255;
|
|
|
|
enum State {
|
|
STATE_IDLE = 0,
|
|
STATE_INIT,
|
|
STATE_CHECK_AT,
|
|
STATE_CREG,
|
|
STATE_CREGWAIT,
|
|
STATE_CSQ,
|
|
STATE_CSQ_RESPONSE,
|
|
STATE_IDLEWAIT,
|
|
STATE_SENDINGSMS1,
|
|
STATE_SENDINGSMS2,
|
|
STATE_SENDINGSMS3,
|
|
STATE_CHECK_SMS,
|
|
STATE_PARSE_SMS,
|
|
STATE_PARSE_SMS_RESPONSE,
|
|
STATE_RECEIVESMS,
|
|
STATE_READSMS,
|
|
STATE_RECEIVEDSMS,
|
|
STATE_DELETEDSMS,
|
|
STATE_DISABLE_ECHO,
|
|
STATE_PARSE_SMS_OK
|
|
};
|
|
|
|
class Sim800LComponent : public uart::UARTDevice, public PollingComponent {
|
|
public:
|
|
/// Retrieve the latest sensor values. This operation takes approximately 16ms.
|
|
void update() override;
|
|
void loop() override;
|
|
void dump_config() override;
|
|
void add_on_sms_received_callback(std::function<void(std::string, std::string)> callback) {
|
|
this->callback_.add(std::move(callback));
|
|
}
|
|
void send_sms(std::string recipient, std::string message);
|
|
|
|
protected:
|
|
void send_cmd_(std::string);
|
|
void parse_cmd_(std::string);
|
|
|
|
std::string sender_;
|
|
char read_buffer_[SIM800L_READ_BUFFER_LENGTH];
|
|
size_t read_pos_{0};
|
|
uint8_t parse_index_{0};
|
|
uint8_t watch_dog_{0};
|
|
bool expect_ack_{false};
|
|
sim800l::State state_{STATE_IDLE};
|
|
bool registered_{false};
|
|
int rssi_{0};
|
|
|
|
std::string recipient_;
|
|
std::string outgoing_message_;
|
|
bool send_pending_;
|
|
|
|
CallbackManager<void(std::string, std::string)> callback_;
|
|
};
|
|
|
|
class Sim800LReceivedMessageTrigger : public Trigger<std::string, std::string> {
|
|
public:
|
|
explicit Sim800LReceivedMessageTrigger(Sim800LComponent *parent) {
|
|
parent->add_on_sms_received_callback(
|
|
[this](std::string message, std::string sender) { this->trigger(message, sender); });
|
|
}
|
|
};
|
|
|
|
template<typename... Ts> class Sim800LSendSmsAction : public Action<Ts...> {
|
|
public:
|
|
Sim800LSendSmsAction(Sim800LComponent *parent) : parent_(parent) {}
|
|
TEMPLATABLE_VALUE(std::string, recipient)
|
|
TEMPLATABLE_VALUE(std::string, message)
|
|
|
|
protected:
|
|
void play_(Ts... x) {
|
|
auto recipient = this->recipient_.value(x...);
|
|
auto message = this->message_.value(x...);
|
|
this->parent_->send_sms(recipient, message);
|
|
}
|
|
|
|
Sim800LComponent *parent_;
|
|
};
|
|
|
|
} // namespace sim800l
|
|
} // namespace esphome
|