From 92d39b7c7c3fa4b261e85552707e069afcdf5462 Mon Sep 17 00:00:00 2001 From: hannesb Date: Thu, 27 Nov 2025 09:09:31 +0100 Subject: [PATCH 1/2] Low power XIAO MG24 example with BME280/BMP280 sensor, using encryption --- CHANGELOG | 5 + README.md | 1 + examples/XIAO_MG24/XIAO_MG24.ino | 447 ++++++++++++++++++++++ examples/XIAO_MG24/adc_mod.cpp | 627 +++++++++++++++++++++++++++++++ examples/XIAO_MG24/adc_mod.h | 213 +++++++++++ library.properties | 2 +- 6 files changed, 1294 insertions(+), 1 deletion(-) create mode 100644 examples/XIAO_MG24/XIAO_MG24.ino create mode 100644 examples/XIAO_MG24/adc_mod.cpp create mode 100644 examples/XIAO_MG24/adc_mod.h diff --git a/CHANGELOG b/CHANGELOG index 1f66b24..7febfc5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.3.0] + +### Added +- Low power XIAO MG24 example with BME280/BMP280 sensor, using encryption + ## [3.2.0] ## Added diff --git a/README.md b/README.md index 0f5f88e..369a09e 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ Refer to the directory `./examples` for specific library implementations. - NimBLE BLE Library [NimBLE.ino](./examples/NimBLE/NimBLE.ino) - ESP32 native IDF calls to use BLE 5 for long range and extended payload. [ESP32C6_ESP_BLE5_LongRange_Firebeetle2.ino](./examples/ESP32C6_ESP_BLE5_LongRange_Firebeetle2/ESP32C6_ESP_BLE5_LongRange_Firebeetle2.ino) - Encryption [NimBLE_Encryption.ino](./examples/NimBLE_Encryption/NimBLE_Encryption.ino) +- XIAO MG24 + BME280 temperature/pressure/humidity sensor using BLE Silabs protocol stack [XIAO_MG24.ino](./examples/XIAO_MG24/XIAO_MG24.ino) ## Usage diff --git a/examples/XIAO_MG24/XIAO_MG24.ino b/examples/XIAO_MG24/XIAO_MG24.ino new file mode 100644 index 0000000..5e774cb --- /dev/null +++ b/examples/XIAO_MG24/XIAO_MG24.ino @@ -0,0 +1,447 @@ +/* + A low power BtHome temperature/humidity/pressure sensor device with XIAO MG24 + Average current consumption is as low as 60µA! Can be even more reduced with longer sleep time. + Current during LowPower.sleep() is ~8µA including sensor (measured with BMP280, 3.3V version without level shifter). + Current during LowPower.deepSleep() would be less, but waking up from deep sleep needs a lot of energy. + So LowPower.sleep() is the better choice for this sensor with TIME_TO_SLEEP=15s. + At 60µA (with built on voltage divider), the sensor should run for more than 10 months on a 350mAh LiPo battery. + */ + +#ifndef ARDUINO_SILABS_STACK_BLE_SILABS + #error "This example is only compatible with the Silicon Labs BLE stack. Please select 'BLE (Silabs)' in 'Tools > Protocol stack'." +#endif + +#include +#include +#include +#include +// modified adc module to gain access to MG24 features like oversampling, gain or differential mode +#include "adc_mod.h" + +//----------------------------------------------------------------------------- +// Configuration switches + +#define CONF_EXTERNAL_ANTENNA 0 +#define CONF_USE_ENCRYPTION 1 +#define CONF_SERIAL_DBG 0 +#define CONF_BMP280 1 +#define CONF_BUILTIN_BATT_VOLTAGE 0 + +//----------------------------------------------------------------------------- +#if CONF_BMP280 +#include +#else +#include +#endif + +//----------------------------------------------------------------------------- +// Defines + +#define ADVERTISING_DURATION_MS 100 + +#define TIME_TO_SLEEP 15 /* Time to sleep (in seconds) */ +#define TIME_TO_SLEEP_LOW (30*60) /* Time to sleep when voltage is low (in seconds) */ + +#define LOW_VOLTAGE 3.5 /* Threshold for longer sleep time */ + +// I prefer not to transfer names +// When using encryption, space is limited +// BTHome will use part of MAC address for identification, that's fine for me +#define BTHOME_SHORT_NAME "" +#define BTHOME_COMPLETE_NAME "" + +#if !CONF_BUILTIN_BATT_VOLTAGE +#define BATT_PIN PC0 +#define R1 6.2e6f +#define R2 1.5e6f +#endif + +// XIAO MG24 pins +// on board antenna switch +#define RF_SW_PWR_PIN PB5 +#define RF_SW_SEL_PIN PB4 + +// on board Flash SPI_1 pins +#define CS1 PA6 // (21) +#define CLK1 PA0 // (17), D17 +#define MOSI1 PB0 // (15), D15 +#define MISO1 PB1 // (16), D16 + +// on board peripherals pins +#define VBAT_EN PD3 // (25) + +// Flash commands +#define READ_DATA 0x03 +#define WRITE_ENABLE 0x06 +#define PAGE_PROGRAM 0x02 +#define SECTOR_ERASE 0x20 + +//----------------------------------------------------------------------------- +// Global variables + +#if CONF_BMP280 +// Bosch BMP280 connected via I2C +Adafruit_BMP280 bmx; +#else +// Bosch BME280 connected via I2C +Adafruit_BME280 bmx; +#endif + +#if CONF_USE_ENCRYPTION +// Bind key: aab3147d9822c05fe14a0c3b77d68e55 +const uint8_t key[16] = { + 0xAA, 0xB3, 0x14, 0x7D, 0x98, 0x22, 0xC0, 0x5F, + 0xE1, 0x4A, 0x0C, 0x3B, 0x77, 0xD6, 0x8E, 0x55 +}; +bd_addr bleAddress; +#endif + +bool bleReady = false; + +BtHomeV2Device *pBtHomeV2Device; +uint32_t counter = 0; +float temperature = 0; +float airpressure = 0; +#if !CONF_BMP280 +float humidity = 0; +#endif +float voltage = 0; + +//----------------------------------------------------------------------------- + +void setup() +{ +#if CONF_SERIAL_DBG + //Initialize serial and wait for port to open: + Serial.begin(115200); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB + } +#endif + + // XIAO Settings + // On board flash + pinMode(CS1, OUTPUT); + pinMode(CLK1, OUTPUT); + pinMode(MOSI1, OUTPUT); + pinMode(MISO1, INPUT); + digitalWrite(CS1, HIGH); // CS1 HIGH + + // Flash Deep Power Down + writeEnable(); + digitalWrite(CS1, LOW); + sendSPI(0xB9); + digitalWrite(CS1, HIGH); + + // Disable JTAG debug interface, see ERF32xG24 reference manual page 903 + // reduces current while sleeping from 82µA to 7.6µA (!) + GPIO->DBGROUTEPEN = 0; + + // Switch on board LED on + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, LOW); + + if (!setup_bmx(true)) { +#if CONF_SERIAL_DBG + Serial.println("Could not find a valid BME280 sensor, check wiring!"); +#endif + } + + // Switch on board LED off + digitalWrite(LED_BUILTIN, HIGH); + + // Turn antenna switch supply off + pinMode(RF_SW_PWR_PIN, OUTPUT); + digitalWrite(RF_SW_PWR_PIN, LOW); + // Select chip antenna for now + pinMode(RF_SW_SEL_PIN, OUTPUT); + digitalWrite(RF_SW_SEL_PIN, LOW); + + // Output for supply voltage divider + pinMode(VBAT_EN, OUTPUT); + digitalWrite(VBAT_EN, LOW); + + // Wait until BLE subsystem is ready + while (!bleReady) { + LowPower.sleep(10); + } +#if CONF_USE_ENCRYPTION + pBtHomeV2Device = new BtHomeV2Device(BTHOME_SHORT_NAME, BTHOME_COMPLETE_NAME, false, key, bleAddress.addr); +#else + pBtHomeV2Device = new BtHomeV2Device(BTHOME_SHORT_NAME, BTHOME_COMPLETE_NAME, false); +#endif + ADC_MOD.set_read_resolution(16); +} + +//----------------------------------------------------------------------------- + +void loop(void) +{ + measurements(); + + activateAntenna(); + + prepareBtPacket1(); + ble_advertise(); + + prepareBtPacket2(); + ble_advertise(); + + deactivateAntenna(); + + if (voltage < LOW_VOLTAGE) { + LowPower.sleep(TIME_TO_SLEEP_LOW * 1000); + } else { + LowPower.sleep(TIME_TO_SLEEP * 1000); + } +} + +//----------------------------------------------------------------------------- +// Read BME280 and supply voltage + +void measurements(void) +{ + bmx.takeForcedMeasurement(); + temperature = bmx.readTemperature(); + // we want hPa, not mBar + airpressure = bmx.readPressure() * 0.01f; +#if !CONF_BMP280 + humidity = bmx.readHumidity(); +#endif + +#if CONF_BUILTIN_BATT_VOLTAGE + // activate on board voltage divider + digitalWrite(VBAT_EN, HIGH); + // wait a bit for voltage divider to settle + LowPower.sleep(10); + // read supply voltage, 1210mV reference, voltage divider by 2, gain 0.5, 16 bits resolution, 64x oversampling + // (1210mV reference is much more stable than 3V3 reference) + voltage = ADC_MOD.get_sample(PD4, PIN_NAME_NC, AR_INTERNAL1V2, iadcCfgAnalogGain0P5x, iadcCfgOsrHighSpeed64x) + * (4.0f * 0.001f * ADC_MOD.get_reference_voltage_mv() / ((1L << ADC_MOD.get_read_resolution()) - 1)); + // deactivate on board voltage divider + digitalWrite(VBAT_EN, LOW); +#else + // read supply voltage, 1210mV reference, voltage divider R1=6M2 R2=1M5, gain 1.0, 16 bits resolution, 64x oversampling + voltage = ADC_MOD.get_sample(BATT_PIN, PIN_NAME_NC, AR_INTERNAL1V2, iadcCfgAnalogGain1x, iadcCfgOsrHighSpeed64x) + * (0.001f * ADC_MOD.get_reference_voltage_mv() * (1.0f + R1/R2) / ((1L << ADC_MOD.get_read_resolution()) - 1)); +#endif + +#if CONF_SERIAL_DBG + Serial.print("Temperature = "); + Serial.print(temperature); + Serial.println(" *C"); + + Serial.print("Pressure = "); + Serial.print(airpressure); + Serial.println(" hPa"); + +#if !CONF_BMP280 + Serial.print("Humidity = "); + Serial.print(humidity); + Serial.println(" %"); +#endif + + Serial.print("Voltage = "); + Serial.print(voltage); + Serial.println(" V"); + + Serial.println("----------------------"); +#endif +} + +//----------------------------------------------------------------------------- +// BtHome Packet1 + +void prepareBtPacket1(void) +{ + pBtHomeV2Device->clearMeasurementData(); + // Available bytes when using encryption: 11, 23 otherwise + // Remaining bytes: 11 + counter += 1; + // Send a counter value to Home Assistant, can be use for i.e. packet loss statistics + pBtHomeV2Device->addCount_0_4294967295(counter); + // Remaining bytes: 6 + pBtHomeV2Device->addVoltage_0_to_65_resolution_0_001(voltage); + // Remaining bytes: 3 + pBtHomeV2Device->addTemperature_neg327_to_327_Resolution_0_01(temperature); + // Remaining bytes: 0 +} + +//----------------------------------------------------------------------------- +// BtHome Packet2 + +void prepareBtPacket2(void) +{ + pBtHomeV2Device->clearMeasurementData(); + // Available bytes when using encryption: 11, 23 otherwise +#if !CONF_BMP280 + // Remaining bytes: 11 + pBtHomeV2Device->addHumidityPercent_Resolution_0_01(humidity); +#endif + // Remaining bytes: 7 + pBtHomeV2Device->addPressureHpa(airpressure); + // Remaining bytes: 3 +} + +/**************************************************************************//** + * Starts BLE advertisement + * Initializes advertising if it's called for the first time + *****************************************************************************/ +void ble_advertise() +{ + // set up the buffer for the advertisement data + uint8_t advertisementData[MAX_ADVERTISEMENT_SIZE]; + uint8_t size = 0; + uint8_t advertising_set_handle = 0xff; + sl_status_t sc; + + // Switch on board LED on while advertising + digitalWrite(LED_BUILTIN, LOW); + + size = pBtHomeV2Device->getAdvertisementData(advertisementData); + + sc = sl_bt_advertiser_create_set(&advertising_set_handle); + app_assert_status(sc); + + // Set advertising interval to 20ms + sc = sl_bt_advertiser_set_timing( + advertising_set_handle, + 32, // minimum advertisement interval (milliseconds * 1.6) 32=20ms 80=50ms 160=100ms + 33, // maximum advertisement interval (milliseconds * 1.6) + 0, // advertisement duration, 0 = until stopped + 0); // maximum number of advertisement events, 0 = endless + app_assert_status(sc); + + // Generate data for advertising + sc = sl_bt_legacy_advertiser_set_data(advertising_set_handle, sl_bt_advertiser_advertising_data_packet, size, advertisementData); + app_assert_status(sc); + + // Start advertising and enable connections + sc = sl_bt_legacy_advertiser_start(advertising_set_handle, sl_bt_legacy_advertiser_non_connectable); + app_assert_status(sc); + +#if CONF_SERIAL_DBG + Serial.println("Raw advertising started!"); +#endif + LowPower.sleep(ADVERTISING_DURATION_MS); + + sc = sl_bt_advertiser_stop(advertising_set_handle); + app_assert_status(sc); + + sc = sl_bt_advertiser_delete_set(advertising_set_handle); + app_assert_status(sc); + +#if CONF_SERIAL_DBG + Serial.println("Raw advertising ended!"); +#endif + // Switch on board LED off + digitalWrite(LED_BUILTIN, HIGH); +} + +/**************************************************************************//** + * Bluetooth stack event handler + * Called when an event happens on BLE the stack + * + * @param[in] evt Event coming from the Bluetooth stack + *****************************************************************************/ +void sl_bt_on_event(sl_bt_msg_t *evt) +{ + sl_status_t sc = SL_STATUS_OK; + uint8_t bleAddressType; + + switch (SL_BT_MSG_ID(evt->header)) { + // This event is received when the BLE device has successfully booted + case sl_bt_evt_system_boot_id: + // Get BLE address and address type + sc = sl_bt_system_get_identity_address(&bleAddress, &bleAddressType); + app_assert_status(sc); + bleReady = true; + break; + + // Default event handler + default: +#if CONF_SERIAL_DBG + Serial.print("BLE event: "); + Serial.println(SL_BT_MSG_ID(evt->header)); +#endif + break; + } +} + +//----------------------------------------------------------------------------- +// Flash functions +void sendSPI(byte data) +{ + for (int i = 0; i < 8; i++) + { + digitalWrite(MOSI1, data & 0x80); + data <<= 1; + digitalWrite(CLK1, HIGH); + delayMicroseconds(1); + digitalWrite(CLK1, LOW); + delayMicroseconds(1); + } +} + +void writeEnable() +{ + digitalWrite(CS1, LOW); + sendSPI(WRITE_ENABLE); + digitalWrite(CS1, HIGH); +} + +//----------------------------------------------------------------------------- +// BME280/BMP280 functions + +bool setup_bmx(bool altAddress) +{ + +#if CONF_BMP280 + // default settings + // (you can also pass in a Wire library object like &Wire2) + bool bmxOk = bmx.begin(altAddress ? BMP280_ADDRESS_ALT : BMP280_ADDRESS); +#else + // default settings + // (you can also pass in a Wire library object like &Wire2) + bool bmxOk = bmx.begin(altAddress ? BME280_ADDRESS_ALTERNATE : BME280_ADDRESS); +#endif + if (!bmxOk) { + return false; + } +#if CONF_BMP280 + bmx.setSampling(Adafruit_BMP280::MODE_FORCED, /* Operating Mode. */ + Adafruit_BMP280::SAMPLING_X1, /* Temp. oversampling */ + Adafruit_BMP280::SAMPLING_X1, /* Pressure oversampling */ + Adafruit_BMP280::FILTER_OFF, /* Filtering. */ + Adafruit_BMP280::STANDBY_MS_1); /* Standby time. */ +#else + bmx.setSampling(Adafruit_BME280::MODE_FORCED, /* Operating Mode. */ + Adafruit_BME280::SAMPLING_X1, /* Temp. oversampling */ + Adafruit_BME280::SAMPLING_X1, /* Pressure oversampling */ + Adafruit_BME280::SAMPLING_X1, /* Humidity oversampling */ + Adafruit_BME280::FILTER_OFF, /* Filtering. */ + Adafruit_BME280::STANDBY_MS_0_5); /* Standby time. */ +#endif + return true; +} +//----------------------------------------------------------------------------- +// On board antenna + +void activateAntenna(void) +{ + // turn on supply for antenna switch + digitalWrite(RF_SW_PWR_PIN, HIGH); + // HIGH -> Use external antenna / LOW -> Use built-in chip antenna +#if CONF_EXTERNAL_ANTENNA + digitalWrite(RF_SW_SEL_PIN, HIGH); +#else + digitalWrite(RF_SW_SEL_PIN, LOW); +#endif +} + +void deactivateAntenna(void) +{ + // turn off supply for antenna switch + digitalWrite(RF_SW_SEL_PIN, LOW); // RFSW sel OFF + digitalWrite(RF_SW_PWR_PIN, LOW); // RFSW Power OFF +} diff --git a/examples/XIAO_MG24/adc_mod.cpp b/examples/XIAO_MG24/adc_mod.cpp new file mode 100644 index 0000000..e51f421 --- /dev/null +++ b/examples/XIAO_MG24/adc_mod.cpp @@ -0,0 +1,627 @@ +/* + * This file is part of the Silicon Labs Arduino Core + * + * The MIT License (MIT) + * + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "adc_mod.h" + +using namespace arduino; + +static bool dma_transfer_finished_cb(unsigned int channel, unsigned int sequenceNo, void *userParam); + +AdcClassMod::AdcClassMod() : + initialized_single(false), + initialized_scan(false), + paused_transfer(false), + current_adc_ppin(PD2), + current_adc_npin(PIN_NAME_NC), + current_adc_reference(AR_VDD), + current_read_resolution(12), + current_gain(iadcCfgAnalogGain1x), + current_osr(iadcCfgOsrHighSpeed2x), + user_onsampling_finished_callback(nullptr), + adc_mutex(nullptr) +{ + this->adc_mutex = xSemaphoreCreateMutexStatic(&this->adc_mutex_buf); + configASSERT(this->adc_mutex); +} + +void AdcClassMod::allocatePin(PinName pin) +{ + // Allocate the analog bus for ADC0 inputs + // Port C and D are handled together + // Even and odd pins on the same port have a different register value + bool pin_is_even = ((pin & 1) == 0); + if (pin >= PD0 || pin >= PC0) { + if (pin_is_even) { + GPIO->CDBUSALLOC |= GPIO_CDBUSALLOC_CDEVEN0_ADC0; + } else { + GPIO->CDBUSALLOC |= GPIO_CDBUSALLOC_CDODD0_ADC0; + } + } else if (pin >= PB0) { + if (pin_is_even) { + GPIO->BBUSALLOC |= GPIO_BBUSALLOC_BEVEN0_ADC0; + } else { + GPIO->BBUSALLOC |= GPIO_BBUSALLOC_BODD0_ADC0; + } + } else { + if (pin_is_even) { + GPIO->ABUSALLOC |= GPIO_ABUSALLOC_AEVEN0_ADC0; + } else { + GPIO->ABUSALLOC |= GPIO_ABUSALLOC_AODD0_ADC0; + } + } +} + +void AdcClassMod::init_single(PinName ppin, PinName npin, uint8_t reference, IADC_CfgAnalogGain_t gain, IADC_CfgOsrHighSpeed_t osr) +{ + if (ppin != PIN_NAME_NC) { + // Set up the positive ADC pin as an input + pinMode(ppin, INPUT); + } + if (npin != PIN_NAME_NC) { + // Set up the negative ADC pin as an input + pinMode(npin, INPUT); + } + + // Create ADC init structs with default values + IADC_Init_t init = IADC_INIT_DEFAULT; + IADC_AllConfigs_t all_configs = IADC_ALLCONFIGS_DEFAULT; + IADC_InitSingle_t init_single = IADC_INITSINGLE_DEFAULT; + IADC_SingleInput_t input = IADC_SINGLEINPUT_DEFAULT; + + // Enable IADC0, GPIO and PRS clock branches + CMU_ClockEnable(cmuClock_IADC0, true); + CMU_ClockEnable(cmuClock_GPIO, true); + CMU_ClockEnable(cmuClock_PRS, true); + + IADC_CfgReference_t sl_adc_reference; + uint32_t sl_adc_vref; + + // Set the voltage reference + if (!get_reference_info(reference, sl_adc_reference, sl_adc_vref)) { + return; + } + + all_configs.configs[0].reference = sl_adc_reference; + all_configs.configs[0].vRef = sl_adc_vref; + all_configs.configs[0].osrHighSpeed = osr; + all_configs.configs[0].analogGain = gain; + + // Reset the ADC + IADC_reset(IADC0); + + // Only configure the ADC if it is not already running + if (IADC0->CTRL == _IADC_CTRL_RESETVALUE) { + IADC_init(IADC0, &init, &all_configs); + } + + // Assign the input pin + if (ppin != PIN_NAME_NC) { + input.posInput = GPIO_to_ADC_ppin_map[ppin - PIN_NAME_MIN]; + } + if (npin != PIN_NAME_NC) { + input.negInput = GPIO_to_ADC_npin_map[npin - PIN_NAME_MIN]; + } + + init_single.alignment = iadcAlignRight16; + + // Initialize the ADC + IADC_initSingle(IADC0, &init_single, &input); + IADC_enableInt(IADC0, IADC_IEN_SINGLEDONE); + + if (ppin != PIN_NAME_NC) { + allocatePin(ppin); + } + if (npin != PIN_NAME_NC) { + allocatePin(npin); + } + + this->initialized_scan = false; + this->initialized_single = true; +} + +void AdcClassMod::init_scan(PinName pin, uint8_t reference) +{ + // Set up the ADC pin as an input + pinMode(pin, INPUT); + + // Create ADC init structs with default values + IADC_Init_t init = IADC_INIT_DEFAULT; + IADC_AllConfigs_t all_configs = IADC_ALLCONFIGS_DEFAULT; + IADC_InitScan_t init_scan = IADC_INITSCAN_DEFAULT; + + // Scan table structure + IADC_ScanTable_t scanTable = IADC_SCANTABLE_DEFAULT; + + // Enable IADC0, GPIO and PRS clock branches + CMU_ClockEnable(cmuClock_IADC0, true); + CMU_ClockEnable(cmuClock_GPIO, true); + CMU_ClockEnable(cmuClock_PRS, true); + + // Shutdown between conversions to reduce current + init.warmup = iadcWarmupNormal; + + // Set the HFSCLK prescale value here + init.srcClkPrescale = IADC_calcSrcClkPrescale(IADC0, 20000000, 0); + + IADC_CfgReference_t sl_adc_reference; + uint32_t sl_adc_vref; + + if (!get_reference_info(reference, sl_adc_reference, sl_adc_vref)) { + return; + } + + // Set the voltage reference + all_configs.configs[0].reference = sl_adc_reference; + all_configs.configs[0].vRef = sl_adc_vref; + all_configs.configs[0].osrHighSpeed = iadcCfgOsrHighSpeed2x; + all_configs.configs[0].analogGain = iadcCfgAnalogGain1x; + + /* + * CLK_SRC_ADC must be prescaled by some value greater than 1 to + * derive the intended CLK_ADC frequency. + * Based on the default 2x oversampling rate (OSRHS)... + * conversion time = ((4 * OSRHS) + 2) / fCLK_ADC + * ...which results in a maximum sampling rate of 833 ksps with the + * 2-clock input multiplexer switching time is included. + */ + all_configs.configs[0].adcClkPrescale = IADC_calcAdcClkPrescale(IADC0, + 10000000, + 0, + iadcCfgModeNormal, + init.srcClkPrescale); + + // Reset the ADC + IADC_reset(IADC0); + + // Only configure the ADC if it is not already running + if (IADC0->CTRL == _IADC_CTRL_RESETVALUE) { + IADC_init(IADC0, &init, &all_configs); + } + + // Assign the input pin + uint32_t pin_index = pin - PIN_NAME_MIN; + + // Trigger continuously once scan is started + init_scan.triggerAction = iadcTriggerActionContinuous; + // Set the SCANFIFODVL flag when scan FIFO holds 2 entries + // The interrupt associated with the SCANFIFODVL flag in the IADC_IF register is not used + init_scan.dataValidLevel = iadcFifoCfgDvl1; + // Enable DMA wake-up to save the results when the specified FIFO level is hit + init_scan.fifoDmaWakeup = true; + + scanTable.entries[0].posInput = GPIO_to_ADC_ppin_map[pin_index]; + scanTable.entries[0].includeInScan = true; + + // Initialize scan + IADC_initScan(IADC0, &init_scan, &scanTable); + IADC_enableInt(IADC0, IADC_IEN_SCANTABLEDONE); + + // Allocate the analog bus for ADC0 inputs + // Port C and D are handled together + // Even and odd pins on the same port have a different register value + bool pin_is_even = (pin % 2 == 0); + if (pin >= PD0 || pin >= PC0) { + if (pin_is_even) { + GPIO->CDBUSALLOC |= GPIO_CDBUSALLOC_CDEVEN0_ADC0; + } else { + GPIO->CDBUSALLOC |= GPIO_CDBUSALLOC_CDODD0_ADC0; + } + } else if (pin >= PB0) { + if (pin_is_even) { + GPIO->BBUSALLOC |= GPIO_BBUSALLOC_BEVEN0_ADC0; + } else { + GPIO->BBUSALLOC |= GPIO_BBUSALLOC_BODD0_ADC0; + } + } else { + if (pin_is_even) { + GPIO->ABUSALLOC |= GPIO_ABUSALLOC_AEVEN0_ADC0; + } else { + GPIO->ABUSALLOC |= GPIO_ABUSALLOC_AODD0_ADC0; + } + } + + this->initialized_single = false; + this->initialized_scan = true; +} + +sl_status_t AdcClassMod::init_dma(uint32_t *buffer, uint32_t size) +{ + sl_status_t status; + if (!this->initialized_scan) { + return SL_STATUS_NOT_INITIALIZED; + } + + // Initialize DMA with default parameters + DMADRV_Init(); + + // Allocate DMA channel + status = DMADRV_AllocateChannel(&this->dma_channel, NULL); + if (status != ECODE_EMDRV_DMADRV_OK) { + return SL_STATUS_FAIL; + } + + // Trigger LDMA transfer on IADC scan completion + LDMA_TransferCfg_t transferCfg = LDMA_TRANSFER_CFG_PERIPHERAL(ldmaPeripheralSignal_IADC0_IADC_SCAN); + + /* + * Set up a linked descriptor to save scan results to the + * user-specified buffer. By linking the descriptor to itself + * (the last argument is the relative jump in terms of the number of + * descriptors), transfers will run continuously. + */ + #pragma GCC diagnostic ignored "-Wmissing-field-initializers" + this->ldma_descriptor = (LDMA_Descriptor_t)LDMA_DESCRIPTOR_LINKREL_P2M_WORD(&(IADC0->SCANFIFODATA), buffer, size, 0); + + DMADRV_LdmaStartTransfer((int)this->dma_channel, &transferCfg, &this->ldma_descriptor, dma_transfer_finished_cb, NULL); + return SL_STATUS_OK; +} + +uint16_t AdcClassMod::get_sample(PinName ppin, PinName npin, uint8_t reference, IADC_CfgAnalogGain_t gain, IADC_CfgOsrHighSpeed_t osr) +{ + if (reference >= AR_MAX) { + return 0; + } + + xSemaphoreTake(this->adc_mutex, portMAX_DELAY); + + if (this->initialized_scan) { + this->scan_stop(); + } + + if (!this->initialized_single || (ppin != this->current_adc_ppin) || (npin != this->current_adc_npin) + || (reference != this->current_adc_reference) || (gain != this->current_gain) || (osr != this->current_osr)) + { + this->current_adc_ppin = ppin; + this->current_adc_npin = npin; + this->current_adc_reference = reference; + this->current_gain = gain; + this->current_osr = osr; + this->init_single(ppin, npin, reference, gain, osr); + } + // Clear single done interrupt + IADC_clearInt(IADC0, IADC_IF_SINGLEDONE); + + // Start conversion and wait for result + IADC_command(IADC0, iadcCmdStartSingle); + while (!(IADC_getInt(IADC0) & IADC_IF_SINGLEDONE)) { + yield(); + } + uint16_t result = IADC_readSingleData(IADC0); + + xSemaphoreGive(this->adc_mutex); + + // Apply the configured read resolution + result = result >> (this->max_read_resolution_bits - this->current_read_resolution); + + return result; +} + +void AdcClassMod::set_reference(uint8_t reference) +{ + if (reference >= AR_MAX || reference == this->current_adc_reference) { + return; + } + xSemaphoreTake(this->adc_mutex, portMAX_DELAY); + this->current_adc_reference = reference; + if (this->initialized_single) { + this->init_single(this->current_adc_ppin, this->current_adc_npin, this->current_adc_reference, this->current_gain, this->current_osr); + } else if (this->initialized_scan) { + this->init_scan(this->current_adc_ppin, this->current_adc_reference); + } + xSemaphoreGive(this->adc_mutex); +} + +void AdcClassMod::set_read_resolution(uint8_t resolution) +{ + if (resolution > this->max_read_resolution_bits) { + this->current_read_resolution = this->max_read_resolution_bits; + return; + } + this->current_read_resolution = resolution; +} + +uint8_t AdcClassMod::get_read_resolution(void) +{ + return this->current_read_resolution; +} + +void AdcClassMod::set_gain(IADC_CfgAnalogGain_t gain) +{ + if (gain == this->current_gain) { + return; + } + this->current_gain = gain; +} + +void AdcClassMod::set_oversampling(IADC_CfgOsrHighSpeed_t osr) +{ + if (osr == this->current_osr) { + return; + } + this->current_osr = osr; +} + +bool AdcClassMod::get_reference_info(uint8_t reference, IADC_CfgReference_t& sl_adc_reference, uint32_t& sl_adc_vref) +{ + // Set the voltage reference + switch (reference) { + case AR_INTERNAL1V2: + sl_adc_reference = iadcCfgReferenceInt1V2; + sl_adc_vref = 1210; + break; + + case AR_EXTERNAL_1V25: + sl_adc_reference = iadcCfgReferenceExt1V25; + sl_adc_vref = 1250; + break; + + case AR_VDD: + sl_adc_reference = iadcCfgReferenceVddx; + sl_adc_vref = 3300; + break; + + case AR_08VDD: + sl_adc_reference = iadcCfgReferenceVddX0P8Buf; + sl_adc_vref = 2640; + break; + + default: + return false; + } + return true; +} + +int16_t AdcClassMod::get_reference_voltage_mv(void) +{ + IADC_CfgReference_t sl_adc_reference; + uint32_t sl_adc_vref; + + if (!get_reference_info(this->current_adc_reference, sl_adc_reference, sl_adc_vref)) { + return -1; + } + return sl_adc_vref; +} + +sl_status_t AdcClassMod::scan_start(PinName pin, uint32_t *buffer, uint32_t size, void (*user_onsampling_finished_callback)()) +{ + sl_status_t status = SL_STATUS_FAIL; + xSemaphoreTake(this->adc_mutex, portMAX_DELAY); + + if ((!this->initialized_scan && !this->initialized_single) || (pin != this->current_adc_ppin)) { + // Initialize in scan mode + this->current_adc_ppin = pin; + this->user_onsampling_finished_callback = user_onsampling_finished_callback; + this->init_scan(this->current_adc_ppin, this->current_adc_reference); + status = this->init_dma(buffer, size); + } else if (this->initialized_scan && this->paused_transfer) { + // Resume DMA transfer if paused + status = DMADRV_ResumeTransfer(this->dma_channel); + this->paused_transfer = false; + } else if (this->initialized_single) { + // Initialize in scan mode if it was initialized in single mode + this->deinit(); + this->current_adc_ppin = pin; + this->user_onsampling_finished_callback = user_onsampling_finished_callback; + this->init_scan(this->current_adc_ppin, this->current_adc_reference); + status = this->init_dma(buffer, size); + } else { + xSemaphoreGive(this->adc_mutex); + return status; + } + + // Start the conversion and wait for results + IADC_command(IADC0, iadcCmdStartScan); + + xSemaphoreGive(this->adc_mutex); + return status; +} + +void AdcClassMod::scan_stop() +{ + // Pause sampling + DMADRV_PauseTransfer(this->dma_channel); + this->paused_transfer = true; +} + +void AdcClassMod::deinit() +{ + // Stop sampling + DMADRV_StopTransfer(this->dma_channel); + + // Free resources + DMADRV_FreeChannel(this->dma_channel); + + // Reset the ADC + IADC_reset(IADC0); + + this->initialized_scan = false; + this->initialized_single = false; + this->current_adc_ppin = PIN_NAME_NC; + this->current_adc_npin = PIN_NAME_NC; +} + +void AdcClassMod::handle_dma_finished_callback() +{ + if (!this->user_onsampling_finished_callback) { + return; + } + + this->user_onsampling_finished_callback(); +} + +bool dma_transfer_finished_cb(unsigned int channel, unsigned int sequenceNo, void *userParam) +{ + (void)channel; + (void)sequenceNo; + (void)userParam; + + ADC.handle_dma_finished_callback(); + return false; +} + +const IADC_PosInput_t AdcClassMod::GPIO_to_ADC_ppin_map[64] = { + // Port A + iadcPosInputPortAPin0, + iadcPosInputPortAPin1, + iadcPosInputPortAPin2, + iadcPosInputPortAPin3, + iadcPosInputPortAPin4, + iadcPosInputPortAPin5, + iadcPosInputPortAPin6, + iadcPosInputPortAPin7, + iadcPosInputPortAPin8, + iadcPosInputPortAPin9, + iadcPosInputPortAPin10, + iadcPosInputPortAPin11, + iadcPosInputPortAPin12, + iadcPosInputPortAPin13, + iadcPosInputPortAPin14, + iadcPosInputPortAPin15, + // Port B + iadcPosInputPortBPin0, + iadcPosInputPortBPin1, + iadcPosInputPortBPin2, + iadcPosInputPortBPin3, + iadcPosInputPortBPin4, + iadcPosInputPortBPin5, + iadcPosInputPortBPin6, + iadcPosInputPortBPin7, + iadcPosInputPortBPin8, + iadcPosInputPortBPin9, + iadcPosInputPortBPin10, + iadcPosInputPortBPin11, + iadcPosInputPortBPin12, + iadcPosInputPortBPin13, + iadcPosInputPortBPin14, + iadcPosInputPortBPin15, + // Port C + iadcPosInputPortCPin0, + iadcPosInputPortCPin1, + iadcPosInputPortCPin2, + iadcPosInputPortCPin3, + iadcPosInputPortCPin4, + iadcPosInputPortCPin5, + iadcPosInputPortCPin6, + iadcPosInputPortCPin7, + iadcPosInputPortCPin8, + iadcPosInputPortCPin9, + iadcPosInputPortCPin10, + iadcPosInputPortCPin11, + iadcPosInputPortCPin12, + iadcPosInputPortCPin13, + iadcPosInputPortCPin14, + iadcPosInputPortCPin15, + // Port D + iadcPosInputPortDPin0, + iadcPosInputPortDPin1, + iadcPosInputPortDPin2, + iadcPosInputPortDPin3, + iadcPosInputPortDPin4, + iadcPosInputPortDPin5, + iadcPosInputPortDPin6, + iadcPosInputPortDPin7, + iadcPosInputPortDPin8, + iadcPosInputPortDPin9, + iadcPosInputPortDPin10, + iadcPosInputPortDPin11, + iadcPosInputPortDPin12, + iadcPosInputPortDPin13, + iadcPosInputPortDPin14, + iadcPosInputPortDPin15 +}; + +const IADC_NegInput_t AdcClassMod::GPIO_to_ADC_npin_map[64] = { + // Port A + iadcNegInputPortAPin0, + iadcNegInputPortAPin1, + iadcNegInputPortAPin2, + iadcNegInputPortAPin3, + iadcNegInputPortAPin4, + iadcNegInputPortAPin5, + iadcNegInputPortAPin6, + iadcNegInputPortAPin7, + iadcNegInputPortAPin8, + iadcNegInputPortAPin9, + iadcNegInputPortAPin10, + iadcNegInputPortAPin11, + iadcNegInputPortAPin12, + iadcNegInputPortAPin13, + iadcNegInputPortAPin14, + iadcNegInputPortAPin15, + // Port B + iadcNegInputPortBPin0, + iadcNegInputPortBPin1, + iadcNegInputPortBPin2, + iadcNegInputPortBPin3, + iadcNegInputPortBPin4, + iadcNegInputPortBPin5, + iadcNegInputPortBPin6, + iadcNegInputPortBPin7, + iadcNegInputPortBPin8, + iadcNegInputPortBPin9, + iadcNegInputPortBPin10, + iadcNegInputPortBPin11, + iadcNegInputPortBPin12, + iadcNegInputPortBPin13, + iadcNegInputPortBPin14, + iadcNegInputPortBPin15, + // Port C + iadcNegInputPortCPin0, + iadcNegInputPortCPin1, + iadcNegInputPortCPin2, + iadcNegInputPortCPin3, + iadcNegInputPortCPin4, + iadcNegInputPortCPin5, + iadcNegInputPortCPin6, + iadcNegInputPortCPin7, + iadcNegInputPortCPin8, + iadcNegInputPortCPin9, + iadcNegInputPortCPin10, + iadcNegInputPortCPin11, + iadcNegInputPortCPin12, + iadcNegInputPortCPin13, + iadcNegInputPortCPin14, + iadcNegInputPortCPin15, + // Port D + iadcNegInputPortDPin0, + iadcNegInputPortDPin1, + iadcNegInputPortDPin2, + iadcNegInputPortDPin3, + iadcNegInputPortDPin4, + iadcNegInputPortDPin5, + iadcNegInputPortDPin6, + iadcNegInputPortDPin7, + iadcNegInputPortDPin8, + iadcNegInputPortDPin9, + iadcNegInputPortDPin10, + iadcNegInputPortDPin11, + iadcNegInputPortDPin12, + iadcNegInputPortDPin13, + iadcNegInputPortDPin14, + iadcNegInputPortDPin15 +}; + +arduino::AdcClassMod ADC_MOD; diff --git a/examples/XIAO_MG24/adc_mod.h b/examples/XIAO_MG24/adc_mod.h new file mode 100644 index 0000000..456db1f --- /dev/null +++ b/examples/XIAO_MG24/adc_mod.h @@ -0,0 +1,213 @@ +/* + * This file is part of the Silicon Labs Arduino Core + * + * The MIT License (MIT) + * + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "Arduino.h" +#include "pinDefinitions.h" + +#ifndef __ARDUINO_ADC_MOD_H +#define __ARDUINO_ADC_MOD_H + +#include +#include +#include "em_cmu.h" +#include "em_iadc.h" +#include "em_ldma.h" +#include "dmadrv.h" +#include "FreeRTOS.h" +#include "semphr.h" +#include "sl_status.h" +#include "adc.h" + +namespace arduino { +class AdcClassMod { +public: + + /***************************************************************************//** + * Constructor for AdcClassMod + ******************************************************************************/ + AdcClassMod(); + + /***************************************************************************//** + * Performs a single ADC measurement on the provided pin and returns the sample + * + * @param[in] ppin The pin number of the positive ADC input + * @param[in] npin The pin number of the negative ADC input (set to PIN_NAME_NC for non differential positive mode) + * @param[in] reference The selected voltage reference from 'analog_references' + * @param[in] gain The selected gain from 'IADC_CfgAnalogGain_t' + * @param[in] osr The selected oversampling rate from 'IADC_CfgOsrHighSpeed_t' + * + * @return the measured ADC sample + ******************************************************************************/ + uint16_t get_sample(PinName ppin, PinName npin = PIN_NAME_NC, uint8_t reference = AR_VDD, + IADC_CfgAnalogGain_t gain = iadcCfgAnalogGain1x, IADC_CfgOsrHighSpeed_t osr = iadcCfgOsrHighSpeed2x); + + /***************************************************************************//** + * Sets the ADC voltage reference + * + * @param[in] reference The selected voltage reference from 'analog_references' + ******************************************************************************/ + void set_reference(uint8_t reference); + + /***************************************************************************//** + * Sets the ADC read resolution + * + * @param[in] resolution The selected read resolution in bits + ******************************************************************************/ + void set_read_resolution(uint8_t resolution); + + /***************************************************************************//** + * Starts ADC in scan (continuous) mode + * + * @param[in] buffer The buffer where the sampled data is stored + * @param[in] size The size of the buffer + * @param[in] channel The number of the LDMA channel used + * + * @return Status of the scan init process + ******************************************************************************/ + sl_status_t scan_start(PinName pin, uint32_t *buffer, uint32_t size, void (*user_onsampling_finished_callback)()); + + /***************************************************************************//** + * Stops ADC scan + ******************************************************************************/ + void scan_stop(); + + /***************************************************************************//** + * De-initialize the ADC + ******************************************************************************/ + void deinit(); + + /***************************************************************************//** + * Callback handler for the DMA transfer + ******************************************************************************/ + void handle_dma_finished_callback(); + + // The maximum read resolution of the ADC + static const uint8_t max_read_resolution_bits = 16u; + + /***************************************************************************//** + * Sets the ADC gain factor + * + * @param[in] gain The selected gain from 'IADC_CfgAnalogGain_t' + ******************************************************************************/ + void set_gain(IADC_CfgAnalogGain_t gain); + + /***************************************************************************//** + * Sets the ADC oversampling rate + * + * @param[in] osr The selected oversampling rate from 'IADC_CfgOsrHighSpeed_t' + ******************************************************************************/ + void set_oversampling(IADC_CfgOsrHighSpeed_t osr); + + /***************************************************************************//** + * Gets the ADC read resolution + * + * @return The selected read resolution in bits + ******************************************************************************/ + uint8_t get_read_resolution(void); + + /***************************************************************************//** + * Gets the voltage of the selected voltage reference in milli volts + * + * @return Voltage on milli volts + ******************************************************************************/ + int16_t get_reference_voltage_mv(void); + +protected: + /***************************************************************************//** + * Initializes the ADC hardware as single shot + * + * @param[in] ppin The pin number of the positive ADC input + * @param[in] npin The pin number of the negative ADC input + * @param[in] reference The selected voltage reference from 'analog_references' + * @param[in] gain The selected gain from 'IADC_CfgAnalogGain_t' + * @param[in] osr The selected oversampling rate from 'IADC_CfgOsrHighSpeed_t' + ******************************************************************************/ + void init_single(PinName ppin, PinName npin, uint8_t reference, IADC_CfgAnalogGain_t gain, IADC_CfgOsrHighSpeed_t osr); + + /***************************************************************************//** + * Initializes the ADC hardware in scan (continuous) mode + * + * @param[in] pin The pin number of the ADC input + ******************************************************************************/ + void init_scan(PinName pin, uint8_t reference); + + /**************************************************************************//** + * Initializes the DMA hardware + * + * @param[in] buffer Pointer to the array where ADC results will be stored + * @param[in] size Size of the array + * @param[in] channel Channel to use for transfer + * + * @return Status of the DMA init process + *****************************************************************************/ + sl_status_t init_dma(uint32_t *buffer, uint32_t size); + + /**************************************************************************//** + * Get characteristics of voltage reference + * + * @param[in] reference The voltage reference from 'analog_references' + * @param[out] sl_adc_reference Value of reference mapped to 'IADC_CfgReference_t' + * @param[out] sl_adc_vref Voltage of reference + * + * @return Status of the DMA init process + *****************************************************************************/ + bool get_reference_info(uint8_t reference, IADC_CfgReference_t& sl_adc_reference, uint32_t& sl_adc_vref); + + /**************************************************************************//** + * Allocate the analog bus for ADC0 inputs + * + * @param[in] pin The pin number of the ADC input + *****************************************************************************/ + void allocatePin(PinName pin); + + bool initialized_single; + bool initialized_scan; + bool paused_transfer; + + PinName current_adc_ppin; + PinName current_adc_npin; + uint8_t current_adc_reference; + uint8_t current_read_resolution; + IADC_CfgAnalogGain_t current_gain; + IADC_CfgOsrHighSpeed_t current_osr; + + LDMA_Descriptor_t ldma_descriptor; + unsigned int dma_channel; + unsigned int dma_sequence_number; + + void (*user_onsampling_finished_callback)(void); + + static const IADC_PosInput_t GPIO_to_ADC_ppin_map[64]; + static const IADC_NegInput_t GPIO_to_ADC_npin_map[64]; + + SemaphoreHandle_t adc_mutex; + StaticSemaphore_t adc_mutex_buf; +}; +} // namespace arduino + +extern arduino::AdcClassMod ADC_MOD; + +#endif // __ARDUINO_ADC_MOD_H diff --git a/library.properties b/library.properties index f914d3c..89af08f 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=BTHomeV2-Arduino -version=3.2.0 +version=3.3.0 author=deeja maintainer=deeja sentence=BTHomeV2 advertisement data generator for Arduino. From 5593da2897f106ab1c86d88087a5b75466c18ce4 Mon Sep 17 00:00:00 2001 From: hannesb Date: Thu, 27 Nov 2025 14:10:09 +0100 Subject: [PATCH 2/2] Add XIAO_nrf54l15 example, patch BtHome code to be compatible with zephyr framework --- examples/XIAO_nrf54L15/.gitignore | 2 + examples/XIAO_nrf54L15/CMakeLists.txt | 21 ++ examples/XIAO_nrf54L15/Kconfig.sysbuild | 13 + examples/XIAO_nrf54L15/README.md | 28 ++ examples/XIAO_nrf54L15/assets/buildconfig.png | Bin 0 -> 70622 bytes examples/XIAO_nrf54L15/assets/hadashboard.png | Bin 0 -> 147621 bytes .../xiao_nrf54l15_nrf54l15_cpuapp.overlay | 77 +++++ examples/XIAO_nrf54L15/prj.conf | 61 ++++ examples/XIAO_nrf54L15/src/adc.c | 88 +++++ examples/XIAO_nrf54L15/src/adc.h | 33 ++ examples/XIAO_nrf54L15/src/bme280.c | 125 ++++++++ examples/XIAO_nrf54L15/src/bme280.h | 105 ++++++ examples/XIAO_nrf54L15/src/main.cpp | 302 ++++++++++++++++++ examples/XIAO_nrf54L15/src/wdt.c | 41 +++ examples/XIAO_nrf54L15/src/wdt.h | 33 ++ src/BaseDevice.cpp | 77 ++++- src/BaseDevice.h | 15 +- src/BtHomeV2Device.cpp | 194 +++++------ src/BtHomeV2Device.h | 11 +- src/data_types.h | 23 +- 20 files changed, 1132 insertions(+), 117 deletions(-) create mode 100644 examples/XIAO_nrf54L15/.gitignore create mode 100644 examples/XIAO_nrf54L15/CMakeLists.txt create mode 100644 examples/XIAO_nrf54L15/Kconfig.sysbuild create mode 100644 examples/XIAO_nrf54L15/README.md create mode 100644 examples/XIAO_nrf54L15/assets/buildconfig.png create mode 100644 examples/XIAO_nrf54L15/assets/hadashboard.png create mode 100644 examples/XIAO_nrf54L15/boards/xiao_nrf54l15_nrf54l15_cpuapp.overlay create mode 100644 examples/XIAO_nrf54L15/prj.conf create mode 100644 examples/XIAO_nrf54L15/src/adc.c create mode 100644 examples/XIAO_nrf54L15/src/adc.h create mode 100644 examples/XIAO_nrf54L15/src/bme280.c create mode 100644 examples/XIAO_nrf54L15/src/bme280.h create mode 100644 examples/XIAO_nrf54L15/src/main.cpp create mode 100644 examples/XIAO_nrf54L15/src/wdt.c create mode 100644 examples/XIAO_nrf54L15/src/wdt.h diff --git a/examples/XIAO_nrf54L15/.gitignore b/examples/XIAO_nrf54L15/.gitignore new file mode 100644 index 0000000..32a0e5c --- /dev/null +++ b/examples/XIAO_nrf54L15/.gitignore @@ -0,0 +1,2 @@ +# Build directories +build/ diff --git a/examples/XIAO_nrf54L15/CMakeLists.txt b/examples/XIAO_nrf54L15/CMakeLists.txt new file mode 100644 index 0000000..88a4aaa --- /dev/null +++ b/examples/XIAO_nrf54L15/CMakeLists.txt @@ -0,0 +1,21 @@ +# +# Copyright (c) 2018 Nordic Semiconductor +# +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause +# +cmake_minimum_required(VERSION 3.20.0) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(NONE) + +# NORDIC SDK APP START +target_sources(app PRIVATE src/main.cpp) +target_sources(app PRIVATE src/adc.c) +target_sources(app PRIVATE src/bme280.c) +target_sources(app PRIVATE src/wdt.c) +target_sources(app PRIVATE ../../src/BaseDevice.cpp) +target_sources(app PRIVATE ../../src/BtHomeV2Device.cpp) + +# NORDIC SDK APP END +zephyr_library_include_directories(.) + diff --git a/examples/XIAO_nrf54L15/Kconfig.sysbuild b/examples/XIAO_nrf54L15/Kconfig.sysbuild new file mode 100644 index 0000000..d561707 --- /dev/null +++ b/examples/XIAO_nrf54L15/Kconfig.sysbuild @@ -0,0 +1,13 @@ +# +# Copyright (c) 2023 Nordic Semiconductor +# +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause +# + +source "${ZEPHYR_BASE}/share/sysbuild/Kconfig" + +config NRF_DEFAULT_IPC_RADIO + default y + +config NETCORE_IPC_RADIO_BT_HCI_IPC + default y diff --git a/examples/XIAO_nrf54L15/README.md b/examples/XIAO_nrf54L15/README.md new file mode 100644 index 0000000..07d1a56 --- /dev/null +++ b/examples/XIAO_nrf54L15/README.md @@ -0,0 +1,28 @@ +# BTHomeV2 XIAO nrf54l15 example + +Requirements: +- Setup nRFConnect SDK as described here: https://wiki.seeedstudio.com/xiao_nrf54l15_sense_getting_started/ +- In Visual Studio Code, open folder examples/XIAO_nrf54L15 +- Select nrf Connect in Activity Bar +- Select 'Add build configuration' +- Choose Board target, Base configuration files and Base Devicetree overlays, perform 'Generate and Build' + +![Home Assistant Display](./assets/buildconfig.png) + +- Connect a BME280 or BMP280 breakout board (3V3 version prefered) with XIAO nrf54l15 using standard pins +- Connect XIAO nrf54l15 via USB +- Do a 'west flash' + +The sensor should show up in Home Assistant + +What to expect? + +![Home Assistant Display](./assets/hadashboard.png) + +These sensors are solar powered by small panels with 5V or 6V. The panel charges a supercap with 1.5F (54L15) or 5F (MG24). This is a perfect setup to measure the average power consumption (or average current): MG24 ~40µA, 54L15 ~10µA. + +Packet loss is calculated with the help of a counter which increments with every sent packet: +- Setup two HA helpers statistics with max age 1h +- one with count (=packets received per hour) +- the other with change (=packets sent per hour) +- Another helper (template) with formula 1 - received_per_hour/sent_per_hour gives the packet loss percentage \ No newline at end of file diff --git a/examples/XIAO_nrf54L15/assets/buildconfig.png b/examples/XIAO_nrf54L15/assets/buildconfig.png new file mode 100644 index 0000000000000000000000000000000000000000..dcdbb52ab0ed122946f67eb03fe2b51a10568538 GIT binary patch literal 70622 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�Mq1=q|F#3y}7-8#KU{{_tnqj{o?2)7Bc{e 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 literal 0 HcmV?d00001 diff --git a/examples/XIAO_nrf54L15/assets/hadashboard.png b/examples/XIAO_nrf54L15/assets/hadashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..35b811abc9032b7334c33cd0ca7f2fafc22fb147 GIT binary patch literal 147621 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≺fcF)u_C;ldQA}k!J0z+Mem_IHR{g+EhUI%Eyq7* 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 GKK>u*(az=o literal 0 HcmV?d00001 diff --git a/examples/XIAO_nrf54L15/boards/xiao_nrf54l15_nrf54l15_cpuapp.overlay b/examples/XIAO_nrf54L15/boards/xiao_nrf54l15_nrf54l15_cpuapp.overlay new file mode 100644 index 0000000..0136f89 --- /dev/null +++ b/examples/XIAO_nrf54L15/boards/xiao_nrf54l15_nrf54l15_cpuapp.overlay @@ -0,0 +1,77 @@ +/ { + zephyr,user { + io-channels = <&adc 0>, + <&adc 1>, + <&adc 2>, + <&adc 3>, + <&adc 4>, + <&adc 5>, + <&adc 6>, + <&adc 7>; + }; + bme280_pwr: bme280_pwr { + compatible = "regulator-fixed"; + regulator-name = "bme280_pwr"; + // GPIO D2 = P1.6 on the XIAO nRF54L15 + enable-gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>; + }; +}; + +&wdt31 { + status = "okay"; +}; + +dmic_dev: &pdm20 { + status = "okay"; +}; + +&vbat_pwr { + /delete-property/ regulator-boot-on; +}; + +&rfsw_pwr { + /delete-property/ regulator-boot-on; +}; + +&pdm_imu_pwr{ + /delete-property/ regulator-boot-on; +}; + +&temp { + status = "disabled"; +}; + +&adc { + channel@0 { + reg = <0>; + zephyr,gain = "ADC_GAIN_2"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = <0>; + zephyr,input-positive = ; + zephyr,input-negative = ; + zephyr,differential; + zephyr,resolution = <14>; + }; + + channel@7 { + reg = <7>; + zephyr,gain = "ADC_GAIN_1_4"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = <0>; + zephyr,resolution = <14>; + }; +}; + +&i2c22 { + bme280@76 { + compatible = "bosch,bme280"; + reg = <0x76>; + zephyr,deferred-init; + }; + zephyr,deferred-init; +}; + +/* Board alias often points xiao_serial -> &uart21; kill it to be safe. */ +&uart21 { + status = "disabled"; +}; diff --git a/examples/XIAO_nrf54L15/prj.conf b/examples/XIAO_nrf54L15/prj.conf new file mode 100644 index 0000000..f613e90 --- /dev/null +++ b/examples/XIAO_nrf54L15/prj.conf @@ -0,0 +1,61 @@ +# +# Copyright (c) 2018 Nordic Semiconductor +# +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause +# +CONFIG_PM_DEVICE=y + +# Bluetooth LE +# STEP 1 - Include the Bluetooth LE stack in your project +CONFIG_BT=y +CONFIG_BT_PERIPHERAL=y + +# STEP 2 - Set the Bluetooth LE device name +# CONFIG_BT_DEVICE_NAME="Nordic_Beacon" +CONFIG_BT_DEVICE_NAME="NB" + +CONFIG_ADC=y +CONFIG_I2C=y +CONFIG_SENSOR=y +CONFIG_SENSOR_ASYNC_API=y +CONFIG_REGULATOR=y +CONFIG_GPIO=y +CONFIG_BME280=y +CONFIG_BME280_MODE_FORCED=y +# CONFIG_PWM=y +CONFIG_WATCHDOG=y + +CONFIG_NRFX_POWER=y +CONFIG_POWEROFF=y +CONFIG_RETAINED_MEM=y +CONFIG_STATIC_INIT_GNU=y + +CONFIG_CPP=y +CONFIG_REQUIRES_FULL_LIBCPP=y +CONFIG_BT_EAD=y + +# ========================================================= +# Serial port and console configuration +# ========================================================= +CONFIG_SERIAL=n +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_CBPRINTF_FP_SUPPORT=y + +# ========================================================= +# Log and Debugging +# ========================================================= +CONFIG_LOG=y +CONFIG_PRINTK=y +CONFIG_LOG_PRINTK=n +CONFIG_LOG_MODE_IMMEDIATE=n +CONFIG_LOG_DEFAULT_LEVEL=3 + +# ========================================================= +# Memory and Stack +# ========================================================= +CONFIG_MAIN_STACK_SIZE=4096 +CONFIG_HEAP_MEM_POOL_SIZE=16384 +CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096 +# CONFIG_NEWLIB_LIBC=y +# CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y diff --git a/examples/XIAO_nrf54L15/src/adc.c b/examples/XIAO_nrf54L15/src/adc.c new file mode 100644 index 0000000..2b54e26 --- /dev/null +++ b/examples/XIAO_nrf54L15/src/adc.c @@ -0,0 +1,88 @@ + +/* + Wrapper for ADC + */ + +#include "adc.h" + +LOG_MODULE_REGISTER(SolarSensor54l15AnalogIO, LOG_LEVEL_INF); + +#define DT_SPEC_AND_COMMA(node_id, prop, idx) ADC_DT_SPEC_GET_BY_IDX(node_id, idx), + +/* Data of ADC io-channels specified in devicetree. */ +static const struct adc_dt_spec adc_channels[] = { + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, DT_SPEC_AND_COMMA) +}; + +/** + * + */ +int adcSetup(uint8_t channel) +{ + int err; + + LOG_INF("channel %d gain %d", channel, adc_channels[channel].channel_cfg.gain); + + /* Configure channels individually prior to sampling. */ + if (!adc_is_ready_dt(&adc_channels[channel])) { + LOG_ERR("ADC controller device %s not ready\n", adc_channels[channel].dev->name); + return -1; + } + + err = adc_channel_setup_dt(&adc_channels[channel]); + if (err < 0) { + LOG_ERR("Could not setup channel #%d (%d)\n", channel, err); + return -1; + } + + return 0; +} + +int adcRead(int32_t *pValMV, int32_t *pRaw, uint8_t channel) +{ + int err; + uint16_t buf; + + struct adc_sequence sequence = { + .buffer = &buf, + /* buffer size in bytes, not number of samples */ + .buffer_size = sizeof(buf), + }; + + (void)adc_sequence_init_dt(&adc_channels[channel], &sequence); + + err = adc_read_dt(&adc_channels[channel], &sequence); + if (err < 0) { + LOG_ERR("Could not read (%d)\n", err); + return err; + } + + /* + * If using differential mode, the 16 bit value + * in the ADC sample buffer should be a signed 2's + * complement value. + */ + int32_t raw; + if (adc_channels[channel].channel_cfg.differential) { + raw = (int32_t)((int16_t)buf); + } else { + raw = (int32_t)buf; + } + if (pRaw != NULL) { + *pRaw = raw; + } + uint32_t tmp = raw; + if (pValMV != NULL) { + err = adc_raw_to_millivolts_dt(&adc_channels[channel], &raw); + /* conversion to mV may not be supported, skip if not */ + if (err < 0) { + LOG_ERR(" value in mV not available\n"); + return err; + } + LOG_INF("channel %d voltage = %" PRId32 " mV raw = %d\n", channel, raw, tmp); + *pValMV = raw; + } else { + LOG_INF("channel %d raw = %d\n", channel, raw); + } + return 0; +} diff --git a/examples/XIAO_nrf54L15/src/adc.h b/examples/XIAO_nrf54L15/src/adc.h new file mode 100644 index 0000000..dbd8cdd --- /dev/null +++ b/examples/XIAO_nrf54L15/src/adc.h @@ -0,0 +1,33 @@ +#pragma once +/* + Wrapper for ADC + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Initialize given ADC channel + * + * @param channel index of ADC channel + * + * @retval 0 if initialization was successfull, negative value otherwise + */ +extern int adcSetup(uint8_t channel); +/** + * @brief Read value from ADC channel + * + * @param pValMV pointer to result in milli volts, may be NULL + * @param pRaw pointer to raw value, may be NULL + * + * @retval 0 if value could be read, negative value otherwise + */ +extern int adcRead(int32_t *pValMV, int32_t *pRaw, uint8_t channel); + +#ifdef __cplusplus +} +#endif diff --git a/examples/XIAO_nrf54L15/src/bme280.c b/examples/XIAO_nrf54L15/src/bme280.c new file mode 100644 index 0000000..76b9a77 --- /dev/null +++ b/examples/XIAO_nrf54L15/src/bme280.c @@ -0,0 +1,125 @@ + +/* + Wrapper for Bosch BME280/BMP280 + */ + +#include "bme280.h" + +LOG_MODULE_REGISTER(SolarSensor54l15bme280, LOG_LEVEL_INF); + +SENSOR_DT_READ_IODEV(iodev, DT_COMPAT_GET_ANY_STATUS_OKAY(bosch_bme280), + {SENSOR_CHAN_AMBIENT_TEMP, 0}, + {SENSOR_CHAN_HUMIDITY, 0}, + {SENSOR_CHAN_PRESS, 0}); + +RTIO_DEFINE(ctx, 1, 1); + +static const struct device *const bme280_dev = DEVICE_DT_GET_ANY(bosch_bme280); + +int bme280_init(void) +{ + int err = device_init(bme280_dev); + if (err) { + LOG_ERR("\nDevice %s init failed %d\n", bme280_dev->name, err); + return err; + } + err = pm_device_action_run(bme280_dev, PM_DEVICE_ACTION_SUSPEND); + if (err) { + LOG_ERR("\nDevice %s pm_device_action_run failed %d\n", bme280_dev->name, err); + return err; + } + return 0; +} + +int bme280_check_device(void) +{ + if (bme280_dev == NULL) { + /* No such node, or the node does not have status "okay". */ + LOG_ERR("\nError: no device found.\n"); + return -1; + } + if (!device_is_ready(bme280_dev)) { + LOG_ERR("Error: Device \"%s\" is not ready; " + "check the driver initialization logs for errors.\n", + bme280_dev->name); + return -2; + } + + LOG_INF("Found device \"%s\", getting sensor data\n", bme280_dev->name); + return 0; +} + +int bme280_chipId(void) +{ + if (bme280_dev != NULL && bme280_dev->state->initialized) { + const struct bme280_data *pData = (const struct bme280_data *)bme280_dev->data; + return pData->chip_id; + } + return BMX280_CHIP_ID_NA; +} + +int bme280_read(float *pTemp, float *pHum, float *pPress) +{ + int err; + uint8_t buf[128]; + + if (bme280_dev != NULL) { + err = pm_device_action_run(bme280_dev, PM_DEVICE_ACTION_RESUME); + if (err != 0) { + LOG_ERR("%s: pm_device_action_run() RESUME failed: %d\n", bme280_dev->name, err); + } + err = bme280_check_device(); + + if (err == 0) { + + // bme280_channel_get + err = sensor_read(&iodev, &ctx, buf, 128); + if (err != 0) { + LOG_ERR("%s: sensor_read() failed: %d\n", bme280_dev->name, err); + return err; + } + const struct sensor_decoder_api *decoder; + err = sensor_get_decoder(bme280_dev, &decoder); + + if (err != 0) { + LOG_ERR("%s: sensor_get_decode() failed: %d\n", bme280_dev->name, err); + return err; + } + + if (pTemp != NULL) { + uint32_t temp_fit = 0; + struct sensor_q31_data temp_data = {0}; + if (decoder->decode(buf, (struct sensor_chan_spec) {SENSOR_CHAN_AMBIENT_TEMP, 0}, &temp_fit, 1, &temp_data) > 0) + { + *pTemp = temp_data.readings[0].temperature*1.0f/32768.0f; + LOG_INF("temp: %.2f", (double)*pTemp); + } + } + + if (pPress != NULL) { + uint32_t press_fit = 0; + struct sensor_q31_data press_data = {0}; + if (decoder->decode(buf, (struct sensor_chan_spec) {SENSOR_CHAN_PRESS, 0}, &press_fit, 1, &press_data) > 0) + { + *pPress = press_data.readings[0].pressure*10.0f/256.0f; + LOG_INF("press: %.2f", (double)*pPress); + } + } + + if (pHum != NULL && bme280_chipId() == BME280_CHIP_ID) { + uint32_t hum_fit = 0; + struct sensor_q31_data hum_data = {0}; + if (decoder->decode(buf, (struct sensor_chan_spec) {SENSOR_CHAN_HUMIDITY, 0}, &hum_fit, 1, &hum_data) > 0) + { + *pHum = hum_data.readings[0].humidity*1.0f/1024.0f; + LOG_INF("hum: %.2f", (double)*pHum); + } + } + } + err = pm_device_action_run(bme280_dev, PM_DEVICE_ACTION_SUSPEND); + if (err != 0) { + LOG_ERR("%s: pm_device_action_run() SUSPEND failed: %d\n", bme280_dev->name, err); + } + } + return 0; +} \ No newline at end of file diff --git a/examples/XIAO_nrf54L15/src/bme280.h b/examples/XIAO_nrf54L15/src/bme280.h new file mode 100644 index 0000000..5d1b0c9 --- /dev/null +++ b/examples/XIAO_nrf54L15/src/bme280.h @@ -0,0 +1,105 @@ +#pragma once + +/* + Wrapper for Bosch BME280/BMP280 + */ + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define BMX280_CHIP_ID_NA 0x00 +#define BMP280_CHIP_ID_MP 0x58 +#define BME280_CHIP_ID 0x60 + +struct bme280_decoder_header { + uint64_t timestamp; +} __attribute__((__packed__)); + +struct bme280_reading { + /* Compensated values. */ + int32_t comp_temp; + uint32_t comp_press; + uint32_t comp_humidity; +}; + +struct bme280_encoded_data { + struct bme280_decoder_header header; + struct { + /** Set if `temp` has data */ + uint8_t has_temp: 1; + /** Set if `press` has data */ + uint8_t has_press: 1; + /** Set if `humidity` has data */ + uint8_t has_humidity: 1; + } __attribute__((__packed__)); + struct bme280_reading reading; +}; + +struct bme280_data { + /* Compensation parameters. */ + uint16_t dig_t1; + int16_t dig_t2; + int16_t dig_t3; + uint16_t dig_p1; + int16_t dig_p2; + int16_t dig_p3; + int16_t dig_p4; + int16_t dig_p5; + int16_t dig_p6; + int16_t dig_p7; + int16_t dig_p8; + int16_t dig_p9; + uint8_t dig_h1; + int16_t dig_h2; + uint8_t dig_h3; + int16_t dig_h4; + int16_t dig_h5; + int8_t dig_h6; + + /* Carryover between temperature and pressure/humidity compensation. */ + int32_t t_fine; + + uint8_t chip_id; + + struct bme280_reading reading; +}; + +/** + * @brief Initialize sensor + * + * @retval 0 if initialization was successfull, negative value otherwise + */ +extern int bme280_init(void); +/** + * @brief Check if sensor is ready + * + * @retval 0 if sensor is ready, negative value otherwise + */ +extern int bme280_check_device(void); +/** + * @brief Read values from sensor + * + * @param pTemp pointer to temperature value in °C, may be NULL + * @param pHum pointer to humidity value on %, may be NULL + * @param pPress pointer to pressure in hPa, may be NULL + * + * @retval 0 if sensor could be read, negative value otherwise + */ +extern int bme280_read(float *pTemp, float *pHum, float *pPress); +/** + * @brief Get chip ID + * + * @retval BMX280_CHIP_ID_NA: unknown device, BMP280_CHIP_ID_MP: BMP280, BME280_CHIP_ID: BME280 + */ +extern int bme280_chipId(void); + +#ifdef __cplusplus +} +#endif diff --git a/examples/XIAO_nrf54L15/src/main.cpp b/examples/XIAO_nrf54L15/src/main.cpp new file mode 100644 index 0000000..748314b --- /dev/null +++ b/examples/XIAO_nrf54L15/src/main.cpp @@ -0,0 +1,302 @@ +/* + A ultra low power Home Assistant/BtHome temperature/humidity/pressure sensor device with XIAO nrf54L15 + Average current consumption is as low as 12µA! Can be even more reduced with longer sleep time. + Current during LowPower.deepSleep() would be less, but waking up from deep sleep needs a lot of energy. + So LowPower.sleep() is the better choice for this sensor with TIME_TO_SLEEP=15s. + At 12µA, the sensor should run for more than 3 years on a 350mAh LiPo battery. + */ + +#include + +LOG_MODULE_REGISTER(SolarSensor54l15, LOG_LEVEL_INF); + +#define USE_EXT_ANT 0 +#define USE_BME280 1 +#define USE_ENCRYPTION 1 + +#define TIME_TO_SLEEP 15 +#define TIME_TO_SLEEP_LOW (60*5) + +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include "adc.h" +#include "bme280.h" +#include "wdt.h" +#include "../../src/BtHomeV2Device.h" +#include + +#if !DT_NODE_EXISTS(DT_PATH(zephyr_user)) || \ + !DT_NODE_HAS_PROP(DT_PATH(zephyr_user), io_channels) + #error "No suitable devicetree overlay specified" +#endif + +/****************************************** BTHOME KEY **********************************************/ +#if USE_ENCRYPTION +// 91CDEC4192407AEC3F6FCF04AAB6F7A4 +static const uint8_t bindKey[16] = { + 0x91, 0xCD, 0xEC, 0x41, 0x92, 0x40, 0x7A, 0xEC, + 0x3F, 0x6F, 0xCF, 0x04, 0xAA, 0xB6, 0xF7, 0xA4 +}; +#endif + +/****************************************** WDT **********************************************/ +#define WDT_MAX_WINDOW ((TIME_TO_SLEEP_LOW + 60)*1000) +#define WDT_MIN_WINDOW 0U +#define WDT_OPT WDT_OPT_PAUSE_HALTED_BY_DBG + +/****************************************** DEVICES **********************************************/ +static const struct device *const vbat_reg = DEVICE_DT_GET(DT_NODELABEL(vbat_pwr)); +static const struct device *const rfsw_pwr_reg = DEVICE_DT_GET(DT_NODELABEL(rfsw_pwr)); +#if USE_EXT_ANT +static const struct device *const rfsw_ctl_reg = DEVICE_DT_GET(DT_NODELABEL(rfsw_ctl)); +#endif +static const struct device *const i2c22_dev = DEVICE_DT_GET(DT_NODELABEL(i2c22)); +static const struct device *const i2c30_dev = DEVICE_DT_GET(DT_NODELABEL(i2c30)); +static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios); + +/****************************************** BLINK_CODE **********************************************/ +void blinkCode(int code) +{ + while(true) { + for (int i = 0; i < code; i++) { + gpio_pin_set_dt(&led, 0); + k_sleep(K_MSEC(100)); + gpio_pin_set_dt(&led, 1); + k_sleep(K_MSEC(300)); + } + k_sleep(K_MSEC(1000)); + } +} + +/****************************************** ADVERTISING **********************************************/ +#define ADV_PARAM BT_LE_ADV_PARAM(BT_LE_ADV_OPT_USE_IDENTITY, \ + 32, \ + 33, NULL) + +/****************************************** BTHome Header **********************************************/ +static struct bt_data ad[] = { + BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR), // 3 bytes { len 0x02 type 0x01 data 0x06 } + BT_DATA(BT_DATA_SVC_DATA16, NULL, 0) +}; + +int advertize(BtHomeV2Device *pDev) +{ + uint8_t advertisementData[MAX_ADVERTISEMENT_SIZE]; + uint8_t size = pDev->getAdvertisementData(advertisementData); + // skip first 5 bytes, already in ad struct: + // 1 length=(2) + // 2 BT_DATA_FLAGS + // 3 BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR + // 4 length=X + // 5 BT_DATA_SVC_DATA16 + ad[1].data_len = size - 5; + ad[1].data = &advertisementData[5]; + + /* Start advertising for 5+95ms */ + int err = bt_le_adv_start(ADV_PARAM, ad, ARRAY_SIZE(ad), NULL, 0); + if (err) { + LOG_ERR("Advertising failed to start (err %d)\n", err); + return 0; + } + /* Flash led for 5ms */ + err = gpio_pin_set_dt(&led, 0); + if (err < 0) { + LOG_ERR("gpio_pin_set_dt failed (err %d)\n", err); + } + k_sleep(K_MSEC(5)); + err = gpio_pin_set_dt(&led, 1); + if (err < 0) { + LOG_ERR("gpio_pin_set_dt failed (err %d)\n", err); + } + k_sleep(K_MSEC(95)); + err = bt_le_adv_stop(); + if (err) { + LOG_ERR("Advertising failed to stop (err %d)\n", err); + return -1; + } + return 0; +} + +/****************************************** MAIN **********************************************/ + +int main(void) +{ + int err; + uint32_t counter = 0; + + LOG_INF("Starting BTHome sensor template\n"); + + // Initialize watchdog + int32_t wdt_channel_id = init_wdt(WDT_MIN_WINDOW, WDT_MAX_WINDOW, WDT_OPT); + if (wdt_channel_id < 0) { + return 0; + } + + err = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE); + if (err < 0) { + LOG_ERR("LED GPIO configure failed %d\n", err); + return 0; + } + err = gpio_pin_set_dt(&led, 0); + if (err < 0) { + LOG_ERR("gpio_pin_set_dt failed (err %d)\n", err); + } + // Suspend i2c30: save 145µA while sleeping + err = pm_device_action_run(i2c30_dev, PM_DEVICE_ACTION_SUSPEND); + if (err) { + LOG_ERR("Suspend %s failed %d\n", i2c30_dev->name, err); + } + if (!gpio_is_ready_dt(&led)) { + LOG_ERR("LED GPIO not ready\n"); + return 0; + } + // ADC channel 0 for solar current + err = adcSetup(0); + if (err < 0) { + return 0; + } + // ADC channel 7 for battery voltage + err = adcSetup(7); + if (err < 0) { + return 0; + } + err = device_init(i2c22_dev); + if (err) { + LOG_ERR("\nDevice %s init failed %d\n", i2c22_dev->name, err); + return 0; + } +#if USE_BME280 + int err_bme280 = bme280_init(); + if (err_bme280) { + blinkCode(2); + return err_bme280; + } +#endif + err = pm_device_action_run(i2c22_dev, PM_DEVICE_ACTION_SUSPEND); + if (err) { + LOG_ERR("Suspend %s failed %d\n", i2c22_dev->name, err); + } +#if USE_EXT_ANT + regulator_disable(rfsw_ctl_reg); +#endif + + /* Initialize the Bluetooth Subsystem */ + err = bt_enable(NULL); + if (err) { + LOG_ERR("Bluetooth init failed (err %d)\n", err); + return 0; + } + LOG_INF("Bluetooth initialized\n"); + +#if USE_ENCRYPTION + bt_le_oob oob; + bt_le_oob_get_local(BT_ID_DEFAULT, &oob); + // Leave short and complete name empty, device will be identified by MAC address + BtHomeV2Device dev("", "", false, bindKey, oob.addr.a.val); +#else + BtHomeV2Device dev("", "", true); +#endif + + while(1) { + feed_wdt(wdt_channel_id); + +#if USE_BME280 + err = pm_device_action_run(i2c22_dev, PM_DEVICE_ACTION_RESUME); + if (err != 0) { + LOG_ERR("%s: pm_device_action_run() RESUME failed: %d\n", i2c22_dev->name, err); + } + float temp = 0, hum = 0, press = 0; + err = bme280_read(&temp, &hum, &press); + if (err != 0) { + return err; + } + // Suspend i2c22: save 100µA while sleeping + err = pm_device_action_run(i2c22_dev, PM_DEVICE_ACTION_SUSPEND); + if (err != 0) { + LOG_ERR("%s: pm_device_action_run() SUSPEND failed: %d\n", i2c22_dev->name, err); + } +#endif + int32_t val_mv; + regulator_enable(vbat_reg); + // Wait 5ms for voltage divider to settle + k_sleep(K_MSEC(5)); + // Read battery voltage on channel 7 (pin AIN7/P1.14) + adcRead(&val_mv, NULL, 7); + // Disable battery voltage divider switch supply: save 250µA while sleeping + regulator_disable(vbat_reg); + // Voltage divider divides by 2 + val_mv *= 2; + + int32_t raw; + // Read solar current on channel 0 (differential mode, pins AIN0/P1.04 and AIN1/P1.05) + adcRead(NULL, &raw, 0); + // shunt 10R, 14bits resolution, internal reference (0.9V), gain 2, oversampling 8 + int32_t current_ua = raw*90000/16383; + + counter++; + + // Enable antenna switch supply + regulator_enable(rfsw_pwr_reg); + + // Collect data for advertising packet 1 + dev.resetMeasurement(); + + // Available bytes with encryption: 11, else 23 + // 11 + if (!dev.addCount_0_4294967295(counter)) { + LOG_ERR("addCount_0_4294967295 failed"); + } + // 6 + if (!dev.addVoltage_0_to_65_resolution_0_001(val_mv*0.001f)) { + LOG_ERR("addVoltage_0_to_65_resolution_0_001 failed"); + } + // 3 + if (!dev.addTemperature_neg327_to_327_Resolution_0_01(temp)) { + LOG_ERR("addTemperature_neg327_to_327_Resolution_0_01 failed"); + } + // 0 + // Advertize packet 1 + advertize(&dev); + + // Collect data for advertising packet 2 + dev.resetMeasurement(); + // 11 + if (bme280_chipId() == BME280_CHIP_ID) { + if (!dev.addHumidityPercent_Resolution_0_01(hum)) { + LOG_ERR("addHumidityPercent_Resolution_0_01 failed"); + } + } + // 7 + if (!dev.addCurrentAmps_neg32_to_32_Resolution_0_001(current_ua*0.001f)) { + LOG_ERR("addCurrentAmps_neg32_to_32_Resolution_0_001 failed"); + } + // 4 + if (!dev.addPressureHpa(press)) { + LOG_ERR("addPressureHpa failed"); + } + // 0 + // Advertize packet 2 + advertize(&dev); + + // Disable antenna switch supply: save 67µA while sleeping + regulator_disable(rfsw_pwr_reg); + if (val_mv < 3500) { + k_sleep(K_MSEC(TIME_TO_SLEEP_LOW*1000)); + } else { + k_sleep(K_MSEC(TIME_TO_SLEEP*1000)); + } + } + return 0; +} \ No newline at end of file diff --git a/examples/XIAO_nrf54L15/src/wdt.c b/examples/XIAO_nrf54L15/src/wdt.c new file mode 100644 index 0000000..6f517fc --- /dev/null +++ b/examples/XIAO_nrf54L15/src/wdt.c @@ -0,0 +1,41 @@ + +/* + Wrapper for watchdog timer + */ + +#include "wdt.h" + +LOG_MODULE_REGISTER(SolarSensor54l15wdt, LOG_LEVEL_INF); + +static const struct device *const wdt = DEVICE_DT_GET(DT_ALIAS(watchdog0)); + +int init_wdt(int32_t minWindow, int32_t maxWindow, int32_t options) +{ + if (!device_is_ready(wdt)) { + LOG_ERR("%s: device not ready.\n", wdt->name); + return -1; + } + struct wdt_timeout_cfg wdt_config = { + /* Reset SoC when watchdog timer expires. */ + .flags = WDT_FLAG_RESET_SOC, + /* Expire watchdog after max window */ + .window.min = minWindow, + .window.max = maxWindow, + }; + int wdt_channel_id = wdt_install_timeout(wdt, &wdt_config); + if (wdt_channel_id < 0) { + LOG_ERR("Watchdog install error\n"); + return -2; + } + int err = wdt_setup(wdt, options); + if (err < 0) { + LOG_ERR("Watchdog setup error\n"); + return -3; + } + return wdt_channel_id; +} + +void feed_wdt(int32_t wdt_channel_id) +{ + wdt_feed(wdt, wdt_channel_id); +} \ No newline at end of file diff --git a/examples/XIAO_nrf54L15/src/wdt.h b/examples/XIAO_nrf54L15/src/wdt.h new file mode 100644 index 0000000..d24f546 --- /dev/null +++ b/examples/XIAO_nrf54L15/src/wdt.h @@ -0,0 +1,33 @@ +#pragma once + +/* + Wrapper for watchdog timer + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Initialize watchdog timer + * + * @param minWindow Lower limit of watchdog feed timeout in milliseconds + * @param maxWindow Upper limit of watchdog feed timeout in milliseconds + * @param options configuration options (see WDT_OPT) + * + * @retval channel id if initialization was successfull, negative value otherwise + */ +extern int init_wdt(int32_t minWindow, int32_t maxWindow, int32_t options); +/** + * @brief Feed watchdog timer + * + * @param wdt_channel_id id returned by init_wdt + */ +extern void feed_wdt(int32_t wdt_channel_id); + +#ifdef __cplusplus +} +#endif diff --git a/src/BaseDevice.cpp b/src/BaseDevice.cpp index ab6ef68..255f545 100644 --- a/src/BaseDevice.cpp +++ b/src/BaseDevice.cpp @@ -1,6 +1,21 @@ + +#ifdef __ZEPHYR__ +#include +#include +#include +#include +// strnlen not available in ZEPHYR?!? +#define strnlen(s, n) strlen(s) +#else #include "Arduino.h" +#endif + #include "BaseDevice.h" +#ifdef __ZEPHYR__ +LOG_MODULE_REGISTER(BaseDevice, LOG_LEVEL_INF); +#endif + /// @brief /// @param shortName - Short name of the device - sent when space is limited. Max 12 characters. /// @param completeName - Full name of the device - sent when space is available. @@ -27,8 +42,10 @@ BaseDevice::BaseDevice(const char *shortName, const char *completeName, bool isT memcpy(bindKey, key, sizeof(uint8_t) * BIND_KEY_LEN); memcpy(_macAddress, macAddress, BLE_MAC_ADDRESS_LENGTH); +#ifndef __ZEPHYR__ mbedtls_ccm_init(&this->_encryptCTX); mbedtls_ccm_setkey(&this->_encryptCTX, MBEDTLS_CIPHER_ID_AES, bindKey, ENCRYPTION_KEY_LENGTH * 8); +#endif } /// @brief Clear the measurement data. @@ -38,6 +55,17 @@ void BaseDevice::resetMeasurement() _sensorData.clear(); } +/// @brief Return the number of remaining bytes in the sensor data packet for the given size. +/// @details The sensor data packet has a maximum length defined by MEASUREMENT_MAX_LEN. +/// @return Returns the number of remaining bytes. +uint8_t BaseDevice::remainingBytes() +{ + // the index is at the next entry point, so there is one byte extra + static const uint8_t CURRENT_BYTE = 1; + + return (MAX_MEASUREMENT_SIZE - _sensorDataIdx) + CURRENT_BYTE - (_useEncryption ? ENCRYPTION_ADDITIONAL_BYTES : 0); +} + /// @brief Check that there is enough space in the sensor data packet for the given size. /// @details The sensor data packet has a maximum length defined by MEASUREMENT_MAX_LEN. /// @param size @@ -49,11 +77,7 @@ bool BaseDevice::hasEnoughSpace(BtHomeState sensor) bool BaseDevice::hasEnoughSpace(uint8_t size) { - // the index is at the next entry point, so there is one byte extra - static const uint8_t CURRENT_BYTE = 1; - - int remainingBytes = (MAX_MEASUREMENT_SIZE - _sensorDataIdx) + CURRENT_BYTE - (_useEncryption ? ENCRYPTION_ADDITIONAL_BYTES : 0); - return remainingBytes >= size; + return BaseDevice::remainingBytes() >= size; } /// @brief Add a state or step value to the sensor data packet. @@ -104,7 +128,7 @@ bool BaseDevice::addInteger(BtHomeType sensor, T value) { return false; } - auto scaledValue = static_cast(static_cast(value) / sensor.scale); + auto scaledValue = static_cast(static_cast(value) / static_cast(sensor.scale)); return pushBytes(scaledValue, sensor); } @@ -121,7 +145,11 @@ bool BaseDevice::addFloat(BtHomeType sensor, float value) float factor = sensor.scale; float scaledValue = value / factor; - return pushBytes(static_cast(scaledValue), sensor); + if (sensor.signed_value) { + return pushBytes(static_cast(scaledValue), sensor); + } else { + return pushBytes(static_cast(scaledValue), sensor); + } } bool BaseDevice::pushBytes(uint64_t value2, BtHomeState sensor) @@ -131,7 +159,7 @@ bool BaseDevice::pushBytes(uint64_t value2, BtHomeState sensor) for (uint8_t i = 0; i < sensor.byteCount; i++) { - vector.push_back(static_cast((value2 >> (8 * i)) & 0xff)); + vector.push_back(static_cast((value2 >> (8 * i)) & 0xff)); } _sensorData.push_back(vector); @@ -196,8 +224,13 @@ size_t BaseDevice::getAdvertisementData(uint8_t buffer[MAX_ADVERTISEMENT_SIZE]) if (_useEncryption) { +#ifdef __ZEPHYR__ + // encryptionTag will be appended to ciphertext + uint8_t ciphertext[MAX_ADVERTISEMENT_SIZE + MIC_LEN]; +#else uint8_t ciphertext[MAX_ADVERTISEMENT_SIZE]; uint8_t encryptionTag[MIC_LEN]; +#endif uint8_t nonce[NONCE_LEN]; uint8_t *countPtr = (uint8_t *)(&this->_counter); @@ -212,12 +245,16 @@ size_t BaseDevice::getAdvertisementData(uint8_t buffer[MAX_ADVERTISEMENT_SIZE]) nonce[8] = FLAG_VERSION | FLAG_ENCRYPT; memcpy(&nonce[9], countPtr, MIC_LEN); +#ifdef __ZEPHYR__ + // encryptionTag will be appended to ciphertext + bt_ccm_encrypt(bindKey, nonce, sortedBytes, sortedBytesLength, NULL, 0, ciphertext, MIC_LEN); +#else mbedtls_ccm_encrypt_and_tag(&_encryptCTX, sortedBytesLength, nonce, NONCE_LEN, 0, 0, - &sortedBytes[0], &ciphertext[0], encryptionTag, + &sortedBytes[0], &ciphertext[0], encryptionTag, MIC_LEN); - +#endif for (uint8_t i = 0; i < _sensorDataIdx; i++) - { + { serviceData[serviceDataIndex++] = ciphertext[i]; } // writeCounter @@ -225,12 +262,18 @@ size_t BaseDevice::getAdvertisementData(uint8_t buffer[MAX_ADVERTISEMENT_SIZE]) serviceData[serviceDataIndex++] = nonce[10]; serviceData[serviceDataIndex++] = nonce[11]; serviceData[serviceDataIndex++] = nonce[12]; - this->_counter++; + this->_counter++; // writeMIC +#ifdef __ZEPHYR__ + for (uint8_t i = 0; i < 4; i++) { + serviceData[serviceDataIndex++] = ciphertext[_sensorDataIdx + i]; + } +#else serviceData[serviceDataIndex++] = encryptionTag[0]; serviceData[serviceDataIndex++] = encryptionTag[1]; serviceData[serviceDataIndex++] = encryptionTag[2]; serviceData[serviceDataIndex++] = encryptionTag[3]; +#endif } else { @@ -245,7 +288,7 @@ size_t BaseDevice::getAdvertisementData(uint8_t buffer[MAX_ADVERTISEMENT_SIZE]) buffer[bufferDataIndex++] = FLAG1; buffer[bufferDataIndex++] = FLAG2; buffer[bufferDataIndex++] = FLAG3; - byte sd_length = serviceDataIndex; // Generate the length of the Service Data + uint8_t sd_length = serviceDataIndex; // Generate the length of the Service Data buffer[bufferDataIndex++] = sd_length; // Add the length of the Service Data for (size_t i = 0; i < serviceDataIndex; i++) @@ -259,7 +302,8 @@ size_t BaseDevice::getAdvertisementData(uint8_t buffer[MAX_ADVERTISEMENT_SIZE]) // prefer long name size_t completeNameLength = strnlen(_completeName, MAX_LENGTH_COMPLETE_NAME); bool canFitLongName = bufferDataIndex + completeNameLength + TYPE_INDICATOR_SIZE + CURRENT_BYTE <= MAX_ADVERTISEMENT_SIZE; - if (canFitLongName) + // Don't try to append an empty completeName + if (canFitLongName && completeNameLength > 0) { buffer[bufferDataIndex++] = completeNameLength + TYPE_INDICATOR_SIZE; buffer[bufferDataIndex++] = COMPLETE_NAME; @@ -269,7 +313,8 @@ size_t BaseDevice::getAdvertisementData(uint8_t buffer[MAX_ADVERTISEMENT_SIZE]) size_t shortNameLength = strnlen(_shortName, MAX_LENGTH_SHORT_NAME); bool canFitShortName = bufferDataIndex + TYPE_INDICATOR_SIZE + shortNameLength + CURRENT_BYTE <= MAX_ADVERTISEMENT_SIZE; - if (canFitShortName) + // Don't try to append an empty shortName + if (canFitShortName && shortNameLength > 0) { buffer[bufferDataIndex++] = shortNameLength + TYPE_INDICATOR_SIZE; buffer[bufferDataIndex++] = SHORT_NAME; // 0x08 for short name @@ -298,4 +343,4 @@ size_t BaseDevice::getMeasurementByteArray(uint8_t sortedBytes[MAX_ADVERTISEMENT } } return idx; -} +} \ No newline at end of file diff --git a/src/BaseDevice.h b/src/BaseDevice.h index ea2e083..6ae3417 100644 --- a/src/BaseDevice.h +++ b/src/BaseDevice.h @@ -1,7 +1,15 @@ +#ifndef BT_HOME_BASE_DEVICE_H +#define BT_HOME_BASE_DEVICE_H + #include "definitions.h" +#ifndef __ZEPHYR__ #include -#include +#endif +#include "data_types.h" +#ifndef __ZEPHYR__ #include "mbedtls/ccm.h" +#endif + static const size_t MAX_ADVERTISEMENT_SIZE = 31; static const size_t HEADER_SIZE = 9; static const size_t MAX_MEASUREMENT_SIZE = MAX_ADVERTISEMENT_SIZE - HEADER_SIZE; @@ -28,6 +36,7 @@ class BaseDevice bool addSignedInteger(BtHomeType sensor, int64_t value); bool addFloat(BtHomeType sensor, float value); bool addRaw(uint8_t sensor, uint8_t *value, uint8_t size); + uint8_t remainingBytes(); private: bool pushBytes(uint64_t value2, BtHomeState sensor); @@ -42,8 +51,12 @@ class BaseDevice bool _triggerDevice = false; bool _useEncryption = false; uint32_t _counter = 1; +#ifndef __ZEPHYR__ mbedtls_ccm_context _encryptCTX; +#endif uint8_t _macAddress[BLE_MAC_ADDRESS_LENGTH]; uint8_t bindKey[BIND_KEY_LEN]; size_t getMeasurementByteArray(uint8_t sortedBytes[MAX_ADVERTISEMENT_SIZE]); }; + +#endif // BT_HOME_BASE_DEVICE_H \ No newline at end of file diff --git a/src/BtHomeV2Device.cpp b/src/BtHomeV2Device.cpp index 42e10a3..24812d6 100644 --- a/src/BtHomeV2Device.cpp +++ b/src/BtHomeV2Device.cpp @@ -1,8 +1,12 @@ +#ifdef __ZEPHYR__ +#include +#endif + #include "BtHomeV2Device.h" void BtHomeV2Device::clearMeasurementData() { - return _baseDevice.resetMeasurement(); + return BaseDevice::resetMeasurement(); } /// @brief Builds an outgoing wrapper for the current measurement data. @@ -10,452 +14,452 @@ void BtHomeV2Device::clearMeasurementData() /// @return size_t BtHomeV2Device::getAdvertisementData(uint8_t buffer[MAX_ADVERTISEMENT_SIZE]) { - return _baseDevice.getAdvertisementData(buffer); + return BaseDevice::getAdvertisementData(buffer); } -BtHomeV2Device::BtHomeV2Device(const char *shortName, const char *completeName, bool isTriggerDevice) : _baseDevice(shortName, completeName, isTriggerDevice) // Initialize with default device name and trigger-based device flag +BtHomeV2Device::BtHomeV2Device(const char *shortName, const char *completeName, bool isTriggerDevice) : BaseDevice(shortName, completeName, isTriggerDevice) // Initialize with default device name and trigger-based device flag { } -BtHomeV2Device::BtHomeV2Device(const char *shortName, const char *completeName, bool isTriggerBased, uint8_t const* const key, const uint8_t macAddress[BLE_MAC_ADDRESS_LENGTH], uint32_t counter) : _baseDevice(shortName, completeName, isTriggerBased, key, macAddress, counter){ +BtHomeV2Device::BtHomeV2Device(const char *shortName, const char *completeName, bool isTriggerDevice, uint8_t const* const key, const uint8_t macAddress[BLE_MAC_ADDRESS_LENGTH], uint32_t counter) : BaseDevice(shortName, completeName, isTriggerDevice, key, macAddress, counter){ } + bool BtHomeV2Device::addDeviceTypeId(uint16_t deviceTypeId) { - return _baseDevice.addUnsignedInteger(device_type_ID, deviceTypeId); + return BaseDevice::addUnsignedInteger(device_type_ID, deviceTypeId); } bool BtHomeV2Device::addPacketId(uint8_t packetId) { - return _baseDevice.addUnsignedInteger(packet_id, packetId); + return BaseDevice::addUnsignedInteger(packet_id, packetId); } bool BtHomeV2Device::addFirmwareVersion3(uint8_t major, uint8_t minor, uint8_t patch) { uint32_t fwVersion = major << 16 | minor << 8 | patch; - return _baseDevice.addUnsignedInteger(firmware_3_bytes, fwVersion); + return BaseDevice::addUnsignedInteger(firmware_3_bytes, fwVersion); } bool BtHomeV2Device::addFirmwareVersion4(uint8_t major, uint8_t minor, uint8_t patch, uint8_t build) { uint32_t fwVersion = major << 24 | minor << 16 | patch << 8 | build; - return _baseDevice.addUnsignedInteger(firmware_4_bytes, fwVersion); + return BaseDevice::addUnsignedInteger(firmware_4_bytes, fwVersion); } bool BtHomeV2Device::addTemperature_neg44_to_44_Resolution_0_35(float degreesCelsius) { - return _baseDevice.addFloat(temperature_int8_scale_0_35, degreesCelsius); + return BaseDevice::addFloat(temperature_int8_scale_0_35, degreesCelsius); } bool BtHomeV2Device::addTemperature_neg127_to_127_Resolution_1(int8_t degreesCelsius) { - return _baseDevice.addFloat(temperature_int8, degreesCelsius); + return BaseDevice::addFloat(temperature_int8, degreesCelsius); } bool BtHomeV2Device::addTemperature_neg3276_to_3276_Resolution_0_1(float degreesCelsius) { - return _baseDevice.addFloat(temperature_int16_scale_0_1, degreesCelsius); + return BaseDevice::addFloat(temperature_int16_scale_0_1, degreesCelsius); } bool BtHomeV2Device::addTemperature_neg327_to_327_Resolution_0_01(float degreesCelsius) { - return _baseDevice.addFloat(temperature_int16_scale_0_01, degreesCelsius); + return BaseDevice::addFloat(temperature_int16_scale_0_01, degreesCelsius); } bool BtHomeV2Device::addDistanceMetres(float metres) { - return _baseDevice.addFloat(distance_metre, metres); + return BaseDevice::addFloat(distance_metre, metres); } bool BtHomeV2Device::addDistanceMillimetres(uint16_t millimetres) { - return _baseDevice.addUnsignedInteger(distance_millimetre, millimetres); + return BaseDevice::addUnsignedInteger(distance_millimetre, millimetres); } bool BtHomeV2Device::addCount_0_4294967295(uint32_t count) { - return _baseDevice.addUnsignedInteger(count_uint32, count); + return BaseDevice::addUnsignedInteger(count_uint32, count); } bool BtHomeV2Device::addCount_0_255(uint8_t count) { - Serial.print("Adding count 0-255: "); - Serial.println(count); - return _baseDevice.addUnsignedInteger(count_uint8, count); + return BaseDevice::addUnsignedInteger(count_uint8, count); } bool BtHomeV2Device::addCount_0_65535(uint16_t count) { - return _baseDevice.addUnsignedInteger(count_uint16, count); + return BaseDevice::addUnsignedInteger(count_uint16, count); } bool BtHomeV2Device::addCount_neg128_127(int8_t count) { - return _baseDevice.addSignedInteger(count_int8, static_cast(count)); + return BaseDevice::addSignedInteger(count_int8, static_cast(count)); } bool BtHomeV2Device::addCount_neg32768_32767(int16_t count) { - return _baseDevice.addSignedInteger(count_int16, static_cast(count)); + return BaseDevice::addSignedInteger(count_int16, static_cast(count)); } bool BtHomeV2Device::addCount_neg2147483648_2147483647(int32_t count) { - return _baseDevice.addSignedInteger(count_int32, static_cast(count)); + return BaseDevice::addSignedInteger(count_int32, static_cast(count)); } bool BtHomeV2Device::addHumidityPercent_Resolution_0_01(float humidityPercent) { - return _baseDevice.addFloat(humidity_uint16, humidityPercent); + return BaseDevice::addFloat(humidity_uint16, humidityPercent); } bool BtHomeV2Device::addHumidityPercent_Resolution_1(uint8_t humidityPercent) { - return _baseDevice.addFloat(humidity_uint8, humidityPercent); + return BaseDevice::addFloat(humidity_uint8, humidityPercent); } bool BtHomeV2Device::addText(const char text[]) { - return _baseDevice.addRaw(0x53, (uint8_t *)text, strlen(text)); + return BaseDevice::addRaw(0x53, (uint8_t *)text, strlen(text)); } bool BtHomeV2Device::addTime(uint32_t secondsSinceEpoch) { - return _baseDevice.addUnsignedInteger(timestamp, secondsSinceEpoch); + return BaseDevice::addUnsignedInteger(timestamp, secondsSinceEpoch); } bool BtHomeV2Device::addRaw(uint8_t *bytes, uint8_t size) { - return _baseDevice.addRaw(0x54, bytes, size); + return BaseDevice::addRaw(0x54, bytes, size); } bool BtHomeV2Device::addBatteryPercentage(uint8_t batteryPercentage) { - return _baseDevice.addUnsignedInteger(battery_percentage, batteryPercentage); + return BaseDevice::addUnsignedInteger(battery_percentage, batteryPercentage); } bool BtHomeV2Device::setBatteryState(BATTERY_STATE batteryState) { - return _baseDevice.addState(battery_state, batteryState); + return BaseDevice::addState(battery_state, batteryState); } bool BtHomeV2Device::setBatteryChargingState(Battery_Charging_Sensor_Status batteryChargingState) { - return _baseDevice.addState(battery_charging, batteryChargingState); + return BaseDevice::addState(battery_charging, batteryChargingState); } bool BtHomeV2Device::setCarbonMonoxideState(Carbon_Monoxide_Sensor_Status carbonMonoxideState) { - return _baseDevice.addState(carbon_monoxide, carbonMonoxideState); + return BaseDevice::addState(carbon_monoxide, carbonMonoxideState); } bool BtHomeV2Device::setColdState(Cold_Sensor_Status coldState) { - return _baseDevice.addState(cold, coldState); + return BaseDevice::addState(cold, coldState); } bool BtHomeV2Device::setConnectivityState(Connectivity_Sensor_Status connectivityState) { - return _baseDevice.addState(connectivity, connectivityState); + return BaseDevice::addState(connectivity, connectivityState); } bool BtHomeV2Device::setDoorState(Door_Sensor_Status doorState) { - return _baseDevice.addState(door, doorState); + return BaseDevice::addState(door, doorState); } bool BtHomeV2Device::setGarageDoorState(Garage_Door_Sensor_Status garageDoorState) { - return _baseDevice.addState(garage_door, garageDoorState); + return BaseDevice::addState(garage_door, garageDoorState); } bool BtHomeV2Device::setGasState(Gas_Sensor_Status gasState) { - return _baseDevice.addState(gas, gasState); + return BaseDevice::addState(gas, gasState); } bool BtHomeV2Device::setGenericState(Generic_Sensor_Status genericState) { - return _baseDevice.addState(generic_boolean, genericState); + return BaseDevice::addState(generic_boolean, genericState); } bool BtHomeV2Device::setHeatState(Heat_Sensor_Status heatState) { - return _baseDevice.addState(heat, heatState); + return BaseDevice::addState(heat, heatState); } bool BtHomeV2Device::setLightState(Light_Sensor_Status lightState) { - return _baseDevice.addState(light, lightState); + return BaseDevice::addState(light, lightState); } bool BtHomeV2Device::setLockState(Lock_Sensor_Status lockState) { - return _baseDevice.addState(lock, lockState); + return BaseDevice::addState(lock, lockState); } bool BtHomeV2Device::setMoistureState(Moisture_Sensor_Status moistureState) { - return _baseDevice.addState(moisture, moistureState); + return BaseDevice::addState(moisture, moistureState); } bool BtHomeV2Device::setMotionState(Motion_Sensor_Status motionState) { - return _baseDevice.addState(motion, motionState); + return BaseDevice::addState(motion, motionState); } bool BtHomeV2Device::setMovingState(Moving_Sensor_Status movingState) { - return _baseDevice.addState(moving, movingState); + return BaseDevice::addState(moving, movingState); } bool BtHomeV2Device::setOccupancyState(Occupancy_Sensor_Status occupancyState) { - return _baseDevice.addState(occupancy, occupancyState); + return BaseDevice::addState(occupancy, occupancyState); } bool BtHomeV2Device::setOpeningState(Opening_Sensor_Status openingState) { - return _baseDevice.addState(opening, openingState); + return BaseDevice::addState(opening, openingState); } bool BtHomeV2Device::setPlugState(Plug_Sensor_Status plugState) { - return _baseDevice.addState(plug, plugState); + return BaseDevice::addState(plug, plugState); } bool BtHomeV2Device::setPowerState(Power_Sensor_Status powerState) { - return _baseDevice.addState(power, powerState); + return BaseDevice::addState(power, powerState); } bool BtHomeV2Device::setPresenceState(Presence_Sensor_Status presenceState) { - return _baseDevice.addState(presence, presenceState); + return BaseDevice::addState(presence, presenceState); } bool BtHomeV2Device::setProblemState(Problem_Sensor_Status problemState) { - return _baseDevice.addState(problem, problemState); + return BaseDevice::addState(problem, problemState); } bool BtHomeV2Device::setRunningState(Running_Sensor_Status runningState) { - return _baseDevice.addState(running, runningState); + return BaseDevice::addState(running, runningState); } bool BtHomeV2Device::setSafetyState(Safety_Sensor_Status safetyState) { - return _baseDevice.addState(safety, safetyState); + return BaseDevice::addState(safety, safetyState); } bool BtHomeV2Device::setSmokeState(Smoke_Sensor_Status smokeState) { - return _baseDevice.addState(smoke, smokeState); + return BaseDevice::addState(smoke, smokeState); } bool BtHomeV2Device::setSoundState(Sound_Sensor_Status soundState) { - return _baseDevice.addState(sound, soundState); + return BaseDevice::addState(sound, soundState); } bool BtHomeV2Device::setTamperState(Tamper_Sensor_Status tamperState) { - return _baseDevice.addState(tamper, tamperState); + return BaseDevice::addState(tamper, tamperState); } bool BtHomeV2Device::setVibrationState(Vibration_Sensor_Status vibrationState) { - return _baseDevice.addState(vibration, vibrationState); + return BaseDevice::addState(vibration, vibrationState); } bool BtHomeV2Device::setWindowState(Window_Sensor_Status windowState) { - return _baseDevice.addState(window, windowState); + return BaseDevice::addState(window, windowState); } bool BtHomeV2Device::setButtonEvent(Button_Event_Status buttonEvent) { - return _baseDevice.addState(button, buttonEvent); + return BaseDevice::addState(button, buttonEvent); } bool BtHomeV2Device::setDimmerEvent(Dimmer_Event_Status dimmerEvent, uint8_t steps) { - return _baseDevice.addState(dimmer, dimmerEvent, steps); + return BaseDevice::addState(dimmer, dimmerEvent, steps); } bool BtHomeV2Device::addAccelerationMs2(float value) { - return _baseDevice.addFloat(acceleration, value); + return BaseDevice::addFloat(acceleration, value); } bool BtHomeV2Device::addChannel(uint8_t value) { - return _baseDevice.addUnsignedInteger(channel, value); + return BaseDevice::addUnsignedInteger(channel, value); } bool BtHomeV2Device::addCo2Ppm(uint16_t value) { - return _baseDevice.addUnsignedInteger(co2, value); + return BaseDevice::addUnsignedInteger(co2, value); } bool BtHomeV2Device::addConductivityMicrosecondsPerCm(float value) { - return _baseDevice.addFloat(conductivity, value); + return BaseDevice::addFloat(conductivity, value); } bool BtHomeV2Device::addCurrentAmps_neg32_to_32_Resolution_0_001(float value) { - return _baseDevice.addFloat(current_int16, value); + return BaseDevice::addFloat(current_int16, value); } bool BtHomeV2Device::addCurrentAmps_0_65_Resolution_0_001(float value) { - return _baseDevice.addFloat(current_uint16, value); + return BaseDevice::addFloat(current_uint16, value); } bool BtHomeV2Device::addDewPointDegreesCelsius(float value) { - return _baseDevice.addFloat(dewpoint, value); + return BaseDevice::addFloat(dewpoint, value); } bool BtHomeV2Device::addDirectionDegrees(float value) { - return _baseDevice.addFloat(direction, value); + return BaseDevice::addFloat(direction, value); } bool BtHomeV2Device::addDurationSeconds(float value) { - return _baseDevice.addFloat(duration_uint24, value); + return BaseDevice::addFloat(duration_uint24, value); } bool BtHomeV2Device::addEnergyKwh_0_to_16777(float value) { - return _baseDevice.addFloat(energy_uint24, value); + return BaseDevice::addFloat(energy_uint24, value); } bool BtHomeV2Device::addEnergyKwh_0_to_4294967(float value) { - return _baseDevice.addFloat(energy_uint32, value); + return BaseDevice::addFloat(energy_uint32, value); } bool BtHomeV2Device::addGasM3_0_to_16777(float value) { - return _baseDevice.addFloat(gas_uint24, value); + return BaseDevice::addFloat(gas_uint24, value); } bool BtHomeV2Device::addGasM3_0_to_4294967(float value) { - return _baseDevice.addFloat(gas_uint32, value); + return BaseDevice::addFloat(gas_uint32, value); } bool BtHomeV2Device::addGyroscopeDegreeSeconds(float value) { - return _baseDevice.addFloat(gyroscope, value); + return BaseDevice::addFloat(gyroscope, value); } bool BtHomeV2Device::addIlluminanceLux(float value) { - return _baseDevice.addFloat(illuminance, value); + return BaseDevice::addFloat(illuminance, value); } bool BtHomeV2Device::addMassKg(float value) { - return _baseDevice.addFloat(mass_kg, value); + return BaseDevice::addFloat(mass_kg, value); } bool BtHomeV2Device::addMassLb(float value) { - return _baseDevice.addFloat(mass_lb, value); + return BaseDevice::addFloat(mass_lb, value); } bool BtHomeV2Device::addMoisturePercent_Resolution_1(uint8_t value) { - return _baseDevice.addUnsignedInteger(moisture_uint8, value); + return BaseDevice::addUnsignedInteger(moisture_uint8, value); } bool BtHomeV2Device::addMoisturePercent_Resolution_0_01(float value) { - return _baseDevice.addFloat(moisture_uint16, value); + return BaseDevice::addFloat(moisture_uint16, value); } bool BtHomeV2Device::addPm2_5UgM3(uint16_t value) { - return _baseDevice.addUnsignedInteger(pm2_5, value); + return BaseDevice::addUnsignedInteger(pm2_5, value); } bool BtHomeV2Device::addPm10UgM3(uint16_t value) { - return _baseDevice.addUnsignedInteger(pm10, value); + return BaseDevice::addUnsignedInteger(pm10, value); } bool BtHomeV2Device::addPower_neg21474836_to_21474836_resolution_0_01(float value) { - return _baseDevice.addFloat(power_int32, value); + return BaseDevice::addFloat(power_int32, value); } bool BtHomeV2Device::addPower_0_to_167772_resolution_0_01(float value) { - return _baseDevice.addFloat(power_uint24, value); + return BaseDevice::addFloat(power_uint24, value); } bool BtHomeV2Device::addPrecipitationMm(float value) { - return _baseDevice.addFloat(precipitation, value); + return BaseDevice::addFloat(precipitation, value); } bool BtHomeV2Device::addPressureHpa(float value) { - return _baseDevice.addFloat(pressure, value); + return BaseDevice::addFloat(pressure, value); } bool BtHomeV2Device::addRotationDegrees(float value) { - return _baseDevice.addFloat(rotation, value); + return BaseDevice::addFloat(rotation, value); } bool BtHomeV2Device::addSpeedMs(float value) { - return _baseDevice.addFloat(speed, value); + return BaseDevice::addFloat(speed, value); } bool BtHomeV2Device::addTvocUgm3(uint16_t value) { - return _baseDevice.addUnsignedInteger(tvoc, value); + return BaseDevice::addUnsignedInteger(tvoc, value); } bool BtHomeV2Device::addVoltage_0_to_6550_resolution_0_1(float value) { - return _baseDevice.addFloat(voltage_0_1, value); + return BaseDevice::addFloat(voltage_0_1, value); } bool BtHomeV2Device::addVoltage_0_to_65_resolution_0_001(float value) { - return _baseDevice.addFloat(voltage_0_001, value); + return BaseDevice::addFloat(voltage_0_001, value); } bool BtHomeV2Device::addVolumeLitres_0_to_6555_resolution_0_1(float value) { - return _baseDevice.addFloat(volume_uint16_scale_0_1, value); + return BaseDevice::addFloat(volume_uint16_scale_0_1, value); } bool BtHomeV2Device::addVolumeLitres_0_to_65550_resolution_1(uint16_t value) { - return _baseDevice.addUnsignedInteger(volume_uint16_scale_1, value); + return BaseDevice::addUnsignedInteger(volume_uint16_scale_1, value); } bool BtHomeV2Device::addVolumeLitres_0_to_4294967_resolution_0_001(float value) { - return _baseDevice.addFloat(volume_uint32, value); + return BaseDevice::addFloat(volume_uint32, value); } bool BtHomeV2Device::addVolumeStorageLitres(float value) { - return _baseDevice.addFloat(volume_storage, value); + return BaseDevice::addFloat(volume_storage, value); } bool BtHomeV2Device::addVolumeFlowRateM3hr(float value) { - return _baseDevice.addFloat(volume_flow_rate, value); + return BaseDevice::addFloat(volume_flow_rate, value); } bool BtHomeV2Device::addUvIndex(float value) { - return _baseDevice.addFloat(UV_index, value); + return BaseDevice::addFloat(UV_index, value); } bool BtHomeV2Device::addWaterLitres(float value) { - return _baseDevice.addFloat(water_litre, value); + return BaseDevice::addFloat(water_litre, value); } + diff --git a/src/BtHomeV2Device.h b/src/BtHomeV2Device.h index 80be747..72a47bb 100644 --- a/src/BtHomeV2Device.h +++ b/src/BtHomeV2Device.h @@ -3,7 +3,9 @@ // https://bthome.io/format/ +#ifndef __ZEPHYR__ #include +#endif #include "BaseDevice.h" /** @@ -18,7 +20,7 @@ enum BATTERY_STATE BATTERY_STATE_LOW = 1 }; -class BtHomeV2Device +class BtHomeV2Device : public BaseDevice { public: /// @brief @@ -199,8 +201,9 @@ class BtHomeV2Device bool addWaterLitres(float value); -private: - BaseDevice _baseDevice; +// Don't use GNU style inheritance, use C++ standard instead +// private: +// BaseDevice _baseDevice; }; -#endif // BT_HOME_H +#endif // BT_HOME_H \ No newline at end of file diff --git a/src/data_types.h b/src/data_types.h index 5efd078..7101901 100644 --- a/src/data_types.h +++ b/src/data_types.h @@ -2,20 +2,41 @@ #define BT_HOME_DATA_TYPES_H #pragma once + +#ifdef __ZEPHYR__ +#include +#include +#else #include +#endif + #include // You can use struct inheritance in C++ to inherit properties. // For example, BtHomeType can inherit from BtHomeState if you want to reuse the 'id' field: +#ifdef __ZEPHYR__ +class BtHomeState +#else struct BtHomeState +#endif { +#ifdef __ZEPHYR__ +public: +#endif uint8_t id; uint8_t byteCount; }; +#ifdef __ZEPHYR__ +class BtHomeType : public BtHomeState +#else struct BtHomeType : public BtHomeState +#endif { +#ifdef __ZEPHYR__ +public: +#endif float scale; // Multiplier to apply before serializing bool signed_value; // true if value is signed, false if unsigned @@ -318,4 +339,4 @@ enum Window_Sensor_Status Window_Sensor_Status_Open = 1 }; -#endif // BT_HOME_DATA_TYPES_H +#endif // BT_HOME_DATA_TYPES_H \ No newline at end of file