1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-29 22:24:26 +00:00

revmoe arduino

This commit is contained in:
Tomasz Duda
2024-02-16 00:14:32 +01:00
parent b4f9c84677
commit 82c7f39021
8 changed files with 8 additions and 216 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -16,7 +16,6 @@ from esphome.const import (
CONF_WAKEUP_PIN,
PLATFORM_ESP32,
PLATFORM_ESP8266,
PLATFORM_NRF52,
)
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),
}
).extend(cv.COMPONENT_SCHEMA),
cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_NRF52]),
cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266]),
)

View File

@@ -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

View File

@@ -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

View File

@@ -7,10 +7,6 @@
#include <Esp.h>
#endif
#ifdef USE_NRF52
#include "deep_sleep_backend_nrf52.h"
#endif
namespace esphome {
namespace deep_sleep {
@@ -37,8 +33,10 @@ optional<uint32_t> DeepSleepComponent::get_run_duration_() const {
return this->run_duration_;
}
void DeepSleepComponent::setup_deep_sleep_() {
this->next_enter_deep_sleep_ = false;
void DeepSleepComponent::setup() {
ESP_LOGCONFIG(TAG, "Setting up Deep Sleep...");
global_has_deep_sleep = true;
const optional<uint32_t> run_duration = get_run_duration_();
if (run_duration.has_value()) {
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.");
}
}
void DeepSleepComponent::setup() {
ESP_LOGCONFIG(TAG, "Setting up Deep Sleep...");
global_has_deep_sleep = true;
setup_deep_sleep_();
}
void DeepSleepComponent::dump_config() {
ESP_LOGCONFIG(TAG, "Setting up Deep Sleep...");
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);
}
#endif
#if defined(USE_NRF52) && defined(USE_ARDUINO)
backend_.dump_config();
#endif
}
void DeepSleepComponent::loop() {
if (this->next_enter_deep_sleep_)
@@ -152,7 +139,7 @@ void DeepSleepComponent::begin_sleep(bool manual) {
esp_sleep_enable_touchpad_wakeup();
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
}
#endif // USE_ESP32_VARIANT_ESP32C3
#endif
#ifdef USE_ESP32_VARIANT_ESP32C3
if (this->sleep_duration_.has_value())
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(),
static_cast<esp_deepsleep_gpio_wake_up_mode_t>(level));
}
#endif // USE_ESP32_VARIANT_ESP32C3
#endif
esp_deep_sleep_start();
#endif // USE_ESP32
#endif
#ifdef USE_ESP8266
ESP.deepSleep(*this->sleep_duration_); // NOLINT(readability-static-accessed-through-instance)
#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; }
void DeepSleepComponent::prevent_deep_sleep() { this->prevent_ = true; }

View File

@@ -14,10 +14,6 @@
#include "esphome/core/time.h"
#endif
#ifdef USE_NRF52
#include "deep_sleep_backend_nrf52.h"
#endif
#include <cinttypes>
namespace esphome {
@@ -110,8 +106,6 @@ class DeepSleepComponent : public Component {
// duration before entering deep sleep.
optional<uint32_t> get_run_duration_() const;
void setup_deep_sleep_();
optional<uint64_t> sleep_duration_;
#ifdef USE_ESP32
InternalGPIOPin *wakeup_pin_;
@@ -123,9 +117,6 @@ class DeepSleepComponent : public Component {
optional<uint32_t> run_duration_;
bool next_enter_deep_sleep_{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)