mirror of
https://github.com/esphome/esphome.git
synced 2025-10-31 23:21:54 +00:00
revmoe arduino
This commit is contained in:
@@ -1,24 +0,0 @@
|
|||||||
import esphome.codegen as cg
|
|
||||||
import esphome.config_validation as cv
|
|
||||||
from esphome.const import (
|
|
||||||
CONF_ID,
|
|
||||||
)
|
|
||||||
|
|
||||||
dfu_ns = cg.esphome_ns.namespace("beacon")
|
|
||||||
Beacon = dfu_ns.class_("Beacon", cg.Component)
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.All(
|
|
||||||
cv.Schema(
|
|
||||||
{
|
|
||||||
cv.GenerateID(): cv.declare_id(Beacon),
|
|
||||||
}
|
|
||||||
).extend(cv.COMPONENT_SCHEMA),
|
|
||||||
cv.only_on_nrf52,
|
|
||||||
# TODO implement
|
|
||||||
cv.only_with_arduino,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
async def to_code(config):
|
|
||||||
var = cg.new_Pvariable(config[CONF_ID])
|
|
||||||
await cg.register_component(var, config)
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
#include "beacon.h"
|
|
||||||
#include <bluefruit.h>
|
|
||||||
|
|
||||||
// Beacon uses the Manufacturer Specific Data field in the advertising packet,
|
|
||||||
// which means you must provide a valid Manufacturer ID. Update
|
|
||||||
// the field below to an appropriate value. For a list of valid IDs see:
|
|
||||||
// https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers
|
|
||||||
// - 0x004C is Apple
|
|
||||||
// - 0x0822 is Adafruit
|
|
||||||
// - 0x0059 is Nordic
|
|
||||||
// For testing with this sketch, you can use nRF Beacon app
|
|
||||||
// - on Android you may need change the MANUFACTURER_ID to Nordic
|
|
||||||
// - on iOS you may need to change the MANUFACTURER_ID to Apple.
|
|
||||||
// You will also need to "Add Other Beacon, then enter Major, Minor that you set in the sketch
|
|
||||||
#define MANUFACTURER_ID 0x0059
|
|
||||||
|
|
||||||
// "nRF Connect" app can be used to detect beacon
|
|
||||||
const uint8_t BEACON_UUID[16] = {0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78,
|
|
||||||
0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xef, 0xf0};
|
|
||||||
|
|
||||||
// A valid Beacon packet consists of the following information:
|
|
||||||
// UUID, Major, Minor, RSSI @ 1M
|
|
||||||
BLEBeacon ble_beacon(BEACON_UUID, 1, 2, -54);
|
|
||||||
|
|
||||||
void start_adv() {
|
|
||||||
// Advertising packet
|
|
||||||
// Set the beacon payload using the BLEBeacon class populated
|
|
||||||
// earlier in this example
|
|
||||||
Bluefruit.Advertising.setBeacon(ble_beacon);
|
|
||||||
|
|
||||||
// Secondary Scan Response packet (optional)
|
|
||||||
// Since there is no room for 'Name' in Advertising packet
|
|
||||||
Bluefruit.ScanResponse.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
* - Enable auto advertising if disconnected
|
|
||||||
* - Timeout for fast mode is 30 seconds
|
|
||||||
* - Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
*
|
|
||||||
* Apple Beacon specs
|
|
||||||
* - Type: Non-connectable, scannable, undirected
|
|
||||||
* - Fixed interval: 100 ms -> fast = slow = 100 ms
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.setType(BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED);
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(160, 160); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace esphome {
|
|
||||||
namespace beacon {
|
|
||||||
|
|
||||||
void Beacon::loop() {}
|
|
||||||
|
|
||||||
void Beacon::setup() {
|
|
||||||
Bluefruit.begin();
|
|
||||||
|
|
||||||
// off Blue LED for lowest power consumption
|
|
||||||
Bluefruit.autoConnLed(false);
|
|
||||||
Bluefruit.setTxPower(0); // Check bluefruit.h for supported values
|
|
||||||
Bluefruit.setName("ESPHome");
|
|
||||||
|
|
||||||
// Manufacturer ID is required for Manufacturer Specific Data
|
|
||||||
ble_beacon.setManufacturer(MANUFACTURER_ID);
|
|
||||||
|
|
||||||
// Setup the advertising packet
|
|
||||||
start_adv();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace beacon
|
|
||||||
} // namespace esphome
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "esphome/core/component.h"
|
|
||||||
|
|
||||||
namespace esphome {
|
|
||||||
namespace beacon {
|
|
||||||
class Beacon : public Component {
|
|
||||||
void loop() override;
|
|
||||||
void setup() override;
|
|
||||||
};
|
|
||||||
} // namespace beacon
|
|
||||||
} // namespace esphome
|
|
||||||
@@ -16,7 +16,6 @@ from esphome.const import (
|
|||||||
CONF_WAKEUP_PIN,
|
CONF_WAKEUP_PIN,
|
||||||
PLATFORM_ESP32,
|
PLATFORM_ESP32,
|
||||||
PLATFORM_ESP8266,
|
PLATFORM_ESP8266,
|
||||||
PLATFORM_NRF52,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
from esphome.components.esp32 import get_esp32_variant
|
from esphome.components.esp32 import get_esp32_variant
|
||||||
@@ -199,7 +198,7 @@ CONFIG_SCHEMA = cv.All(
|
|||||||
cv.Optional(CONF_TOUCH_WAKEUP): cv.All(cv.only_on_esp32, cv.boolean),
|
cv.Optional(CONF_TOUCH_WAKEUP): cv.All(cv.only_on_esp32, cv.boolean),
|
||||||
}
|
}
|
||||||
).extend(cv.COMPONENT_SCHEMA),
|
).extend(cv.COMPONENT_SCHEMA),
|
||||||
cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_NRF52]),
|
cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266]),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
#if defined(USE_NRF52) && defined(USE_ARDUINO)
|
|
||||||
#include "deep_sleep_backend_nrf52.h"
|
|
||||||
#include "nrf_power.h"
|
|
||||||
#include <cassert>
|
|
||||||
#include "Adafruit_TinyUSB.h"
|
|
||||||
#include "esphome/core/log.h"
|
|
||||||
|
|
||||||
namespace esphome {
|
|
||||||
namespace deep_sleep {
|
|
||||||
|
|
||||||
#define DFU_MAGIC_SKIP 0x6d
|
|
||||||
|
|
||||||
static const char *const TAG = "deep_sleep.nrf52";
|
|
||||||
|
|
||||||
void Nrf52DeepSleepBackend::begin_sleep(const optional<uint64_t> &sleep_duration) {
|
|
||||||
// RTC works only during System On
|
|
||||||
if (sleep_duration.has_value()) {
|
|
||||||
// TinyUSBDevice.detach();
|
|
||||||
// TODO deinit USB
|
|
||||||
// TOOD and the rest of peripherals
|
|
||||||
uint32_t start_time = millis();
|
|
||||||
portSUPPRESS_TICKS_AND_SLEEP(ms2tick(*sleep_duration / 1000));
|
|
||||||
last_sleep_duration_ = millis() - start_time;
|
|
||||||
// TinyUSBDevice.attach();
|
|
||||||
} else {
|
|
||||||
NRF_POWER->GPREGRET = DFU_MAGIC_SKIP;
|
|
||||||
// Enter System OFF.
|
|
||||||
#ifdef SOFTDEVICE_PRESENT
|
|
||||||
uint8_t sd_en = 0;
|
|
||||||
(void) sd_softdevice_is_enabled(&sd_en);
|
|
||||||
if (sd_en) {
|
|
||||||
uint32_t ret_code = sd_power_system_off();
|
|
||||||
assert((ret_code == NRF_SUCCESS) || (ret_code == NRF_ERROR_SOFTDEVICE_NOT_ENABLED));
|
|
||||||
}
|
|
||||||
#endif // SOFTDEVICE_PRESENT
|
|
||||||
nrf_power_system_off(NRF_POWER);
|
|
||||||
// it should never reach here...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Nrf52DeepSleepBackend::dump_config() {
|
|
||||||
if (last_sleep_duration_.has_value()) {
|
|
||||||
ESP_LOGD(TAG, "Last sleep duration: %lu ms", *last_sleep_duration_);
|
|
||||||
} else {
|
|
||||||
ESP_LOGD(TAG, "Last sleep duration: unknown");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace deep_sleep
|
|
||||||
} // namespace esphome
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#if defined(USE_NRF52) && defined(USE_ARDUINO)
|
|
||||||
|
|
||||||
#include "esphome/core/optional.h"
|
|
||||||
#include "Arduino.h"
|
|
||||||
|
|
||||||
namespace esphome {
|
|
||||||
namespace deep_sleep {
|
|
||||||
|
|
||||||
class Nrf52DeepSleepBackend {
|
|
||||||
public:
|
|
||||||
void begin_sleep(const optional<uint64_t> &sleep_duration);
|
|
||||||
void dump_config();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
optional<uint32_t> last_sleep_duration_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace deep_sleep
|
|
||||||
} // namespace esphome
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -7,10 +7,6 @@
|
|||||||
#include <Esp.h>
|
#include <Esp.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_NRF52
|
|
||||||
#include "deep_sleep_backend_nrf52.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace deep_sleep {
|
namespace deep_sleep {
|
||||||
|
|
||||||
@@ -37,8 +33,10 @@ optional<uint32_t> DeepSleepComponent::get_run_duration_() const {
|
|||||||
return this->run_duration_;
|
return this->run_duration_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeepSleepComponent::setup_deep_sleep_() {
|
void DeepSleepComponent::setup() {
|
||||||
this->next_enter_deep_sleep_ = false;
|
ESP_LOGCONFIG(TAG, "Setting up Deep Sleep...");
|
||||||
|
global_has_deep_sleep = true;
|
||||||
|
|
||||||
const optional<uint32_t> run_duration = get_run_duration_();
|
const optional<uint32_t> run_duration = get_run_duration_();
|
||||||
if (run_duration.has_value()) {
|
if (run_duration.has_value()) {
|
||||||
ESP_LOGI(TAG, "Scheduling Deep Sleep to start in %" PRIu32 " ms", *run_duration);
|
ESP_LOGI(TAG, "Scheduling Deep Sleep to start in %" PRIu32 " ms", *run_duration);
|
||||||
@@ -47,14 +45,6 @@ void DeepSleepComponent::setup_deep_sleep_() {
|
|||||||
ESP_LOGD(TAG, "Not scheduling Deep Sleep, as no run duration is configured.");
|
ESP_LOGD(TAG, "Not scheduling Deep Sleep, as no run duration is configured.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeepSleepComponent::setup() {
|
|
||||||
ESP_LOGCONFIG(TAG, "Setting up Deep Sleep...");
|
|
||||||
global_has_deep_sleep = true;
|
|
||||||
|
|
||||||
setup_deep_sleep_();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeepSleepComponent::dump_config() {
|
void DeepSleepComponent::dump_config() {
|
||||||
ESP_LOGCONFIG(TAG, "Setting up Deep Sleep...");
|
ESP_LOGCONFIG(TAG, "Setting up Deep Sleep...");
|
||||||
if (this->sleep_duration_.has_value()) {
|
if (this->sleep_duration_.has_value()) {
|
||||||
@@ -75,9 +65,6 @@ void DeepSleepComponent::dump_config() {
|
|||||||
ESP_LOGCONFIG(TAG, " GPIO Wakeup Run Duration: %" PRIu32 " ms", this->wakeup_cause_to_run_duration_->gpio_cause);
|
ESP_LOGCONFIG(TAG, " GPIO Wakeup Run Duration: %" PRIu32 " ms", this->wakeup_cause_to_run_duration_->gpio_cause);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(USE_NRF52) && defined(USE_ARDUINO)
|
|
||||||
backend_.dump_config();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
void DeepSleepComponent::loop() {
|
void DeepSleepComponent::loop() {
|
||||||
if (this->next_enter_deep_sleep_)
|
if (this->next_enter_deep_sleep_)
|
||||||
@@ -152,7 +139,7 @@ void DeepSleepComponent::begin_sleep(bool manual) {
|
|||||||
esp_sleep_enable_touchpad_wakeup();
|
esp_sleep_enable_touchpad_wakeup();
|
||||||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
|
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
|
||||||
}
|
}
|
||||||
#endif // USE_ESP32_VARIANT_ESP32C3
|
#endif
|
||||||
#ifdef USE_ESP32_VARIANT_ESP32C3
|
#ifdef USE_ESP32_VARIANT_ESP32C3
|
||||||
if (this->sleep_duration_.has_value())
|
if (this->sleep_duration_.has_value())
|
||||||
esp_sleep_enable_timer_wakeup(*this->sleep_duration_);
|
esp_sleep_enable_timer_wakeup(*this->sleep_duration_);
|
||||||
@@ -164,17 +151,13 @@ void DeepSleepComponent::begin_sleep(bool manual) {
|
|||||||
esp_deep_sleep_enable_gpio_wakeup(1 << this->wakeup_pin_->get_pin(),
|
esp_deep_sleep_enable_gpio_wakeup(1 << this->wakeup_pin_->get_pin(),
|
||||||
static_cast<esp_deepsleep_gpio_wake_up_mode_t>(level));
|
static_cast<esp_deepsleep_gpio_wake_up_mode_t>(level));
|
||||||
}
|
}
|
||||||
#endif // USE_ESP32_VARIANT_ESP32C3
|
#endif
|
||||||
esp_deep_sleep_start();
|
esp_deep_sleep_start();
|
||||||
#endif // USE_ESP32
|
#endif
|
||||||
|
|
||||||
#ifdef USE_ESP8266
|
#ifdef USE_ESP8266
|
||||||
ESP.deepSleep(*this->sleep_duration_); // NOLINT(readability-static-accessed-through-instance)
|
ESP.deepSleep(*this->sleep_duration_); // NOLINT(readability-static-accessed-through-instance)
|
||||||
#endif
|
#endif
|
||||||
#if defined(USE_NRF52) && defined(USE_ARDUINO)
|
|
||||||
backend_.begin_sleep(this->sleep_duration_);
|
|
||||||
setup_deep_sleep_();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
float DeepSleepComponent::get_setup_priority() const { return setup_priority::LATE; }
|
float DeepSleepComponent::get_setup_priority() const { return setup_priority::LATE; }
|
||||||
void DeepSleepComponent::prevent_deep_sleep() { this->prevent_ = true; }
|
void DeepSleepComponent::prevent_deep_sleep() { this->prevent_ = true; }
|
||||||
|
|||||||
@@ -14,10 +14,6 @@
|
|||||||
#include "esphome/core/time.h"
|
#include "esphome/core/time.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_NRF52
|
|
||||||
#include "deep_sleep_backend_nrf52.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
@@ -110,8 +106,6 @@ class DeepSleepComponent : public Component {
|
|||||||
// duration before entering deep sleep.
|
// duration before entering deep sleep.
|
||||||
optional<uint32_t> get_run_duration_() const;
|
optional<uint32_t> get_run_duration_() const;
|
||||||
|
|
||||||
void setup_deep_sleep_();
|
|
||||||
|
|
||||||
optional<uint64_t> sleep_duration_;
|
optional<uint64_t> sleep_duration_;
|
||||||
#ifdef USE_ESP32
|
#ifdef USE_ESP32
|
||||||
InternalGPIOPin *wakeup_pin_;
|
InternalGPIOPin *wakeup_pin_;
|
||||||
@@ -123,9 +117,6 @@ class DeepSleepComponent : public Component {
|
|||||||
optional<uint32_t> run_duration_;
|
optional<uint32_t> run_duration_;
|
||||||
bool next_enter_deep_sleep_{false};
|
bool next_enter_deep_sleep_{false};
|
||||||
bool prevent_{false};
|
bool prevent_{false};
|
||||||
#if defined(USE_NRF52) && defined(USE_ARDUINO)
|
|
||||||
Nrf52DeepSleepBackend backend_;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern bool global_has_deep_sleep; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
extern bool global_has_deep_sleep; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
||||||
|
|||||||
Reference in New Issue
Block a user