mirror of
https://github.com/esphome/esphome.git
synced 2025-03-27 04:58:15 +00:00
99 lines
2.6 KiB
C++
99 lines
2.6 KiB
C++
#include "midea_dongle.h"
|
|
#include "esphome/core/log.h"
|
|
#include "esphome/core/helpers.h"
|
|
|
|
namespace esphome {
|
|
namespace midea_dongle {
|
|
|
|
static const char *const TAG = "midea_dongle";
|
|
|
|
void MideaDongle::loop() {
|
|
while (this->available()) {
|
|
const uint8_t rx = this->read();
|
|
if (this->idx_ <= OFFSET_LENGTH) {
|
|
if (this->idx_ == OFFSET_LENGTH) {
|
|
if (rx <= OFFSET_BODY || rx >= sizeof(this->buf_)) {
|
|
this->reset_();
|
|
continue;
|
|
}
|
|
this->cnt_ = rx;
|
|
} else if (rx != SYNC_BYTE) {
|
|
continue;
|
|
}
|
|
}
|
|
this->buf_[this->idx_++] = rx;
|
|
if (--this->cnt_)
|
|
continue;
|
|
this->reset_();
|
|
const BaseFrame frame(this->buf_);
|
|
ESP_LOGD(TAG, "RX: %s", frame.to_string().c_str());
|
|
if (!frame.is_valid()) {
|
|
ESP_LOGW(TAG, "RX: frame check failed!");
|
|
continue;
|
|
}
|
|
if (frame.get_type() == QUERY_NETWORK) {
|
|
this->notify_.set_type(QUERY_NETWORK);
|
|
this->need_notify_ = true;
|
|
continue;
|
|
}
|
|
if (this->appliance_ != nullptr)
|
|
this->appliance_->on_frame(frame);
|
|
}
|
|
}
|
|
|
|
void MideaDongle::update() {
|
|
const bool is_conn = WiFi.isConnected();
|
|
uint8_t wifi_strength = 0;
|
|
if (!this->rssi_timer_) {
|
|
if (is_conn)
|
|
wifi_strength = 4;
|
|
} else if (is_conn) {
|
|
if (--this->rssi_timer_) {
|
|
wifi_strength = this->notify_.get_signal_strength();
|
|
} else {
|
|
this->rssi_timer_ = 60;
|
|
const int32_t dbm = WiFi.RSSI();
|
|
if (dbm > -63)
|
|
wifi_strength = 4;
|
|
else if (dbm > -75)
|
|
wifi_strength = 3;
|
|
else if (dbm > -88)
|
|
wifi_strength = 2;
|
|
else if (dbm > -100)
|
|
wifi_strength = 1;
|
|
}
|
|
} else {
|
|
this->rssi_timer_ = 1;
|
|
}
|
|
if (this->notify_.is_connected() != is_conn) {
|
|
this->notify_.set_connected(is_conn);
|
|
this->need_notify_ = true;
|
|
}
|
|
if (this->notify_.get_signal_strength() != wifi_strength) {
|
|
this->notify_.set_signal_strength(wifi_strength);
|
|
this->need_notify_ = true;
|
|
}
|
|
if (!--this->notify_timer_) {
|
|
this->notify_.set_type(NETWORK_NOTIFY);
|
|
this->need_notify_ = true;
|
|
}
|
|
if (this->need_notify_) {
|
|
ESP_LOGD(TAG, "TX: notify WiFi STA %s, signal strength %d", is_conn ? "connected" : "not connected", wifi_strength);
|
|
this->need_notify_ = false;
|
|
this->notify_timer_ = 600;
|
|
this->notify_.finalize();
|
|
this->write_frame(this->notify_);
|
|
return;
|
|
}
|
|
if (this->appliance_ != nullptr)
|
|
this->appliance_->on_update();
|
|
}
|
|
|
|
void MideaDongle::write_frame(const Frame &frame) {
|
|
this->write_array(frame.data(), frame.size());
|
|
ESP_LOGD(TAG, "TX: %s", frame.to_string().c_str());
|
|
}
|
|
|
|
} // namespace midea_dongle
|
|
} // namespace esphome
|