mirror of
https://github.com/meshtastic/firmware.git
synced 2025-08-05 05:04:46 +00:00
Merge branch 'master' into tft-gui-work
This commit is contained in:
commit
d973d309d5
@ -7,13 +7,6 @@
|
|||||||
"cpu": "cortex-m4",
|
"cpu": "cortex-m4",
|
||||||
"extra_flags": "-DARDUINO_WIO_WM1110 -DNRF52840_XXAA",
|
"extra_flags": "-DARDUINO_WIO_WM1110 -DNRF52840_XXAA",
|
||||||
"f_cpu": "64000000L",
|
"f_cpu": "64000000L",
|
||||||
"hwids": [
|
|
||||||
["0x239A", "0x8029"],
|
|
||||||
["0x239A", "0x0029"],
|
|
||||||
["0x239A", "0x002A"],
|
|
||||||
["0x239A", "0x802A"]
|
|
||||||
],
|
|
||||||
"usb_product": "WIO-BOOT",
|
|
||||||
"mcu": "nrf52840",
|
"mcu": "nrf52840",
|
||||||
"variant": "Seeed_WIO_WM1110",
|
"variant": "Seeed_WIO_WM1110",
|
||||||
"bsp": {
|
"bsp": {
|
||||||
|
3
extra_scripts/README.md
Normal file
3
extra_scripts/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# extra_scripts
|
||||||
|
|
||||||
|
This directory contains special [scripts](https://docs.platformio.org/en/latest/scripting/index.html) that are used to modify the platformio environment in rare cases.
|
20
extra_scripts/disable_adafruit_usb.py
Normal file
20
extra_scripts/disable_adafruit_usb.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# trunk-ignore-all(flake8/F821)
|
||||||
|
# trunk-ignore-all(ruff/F821)
|
||||||
|
|
||||||
|
Import("env")
|
||||||
|
|
||||||
|
# NOTE: This is not currently used, but can serve as an example on how to write extra_scripts
|
||||||
|
|
||||||
|
print("Current CLI targets", COMMAND_LINE_TARGETS)
|
||||||
|
print("Current Build targets", BUILD_TARGETS)
|
||||||
|
print("CPP defs", env.get("CPPDEFINES"))
|
||||||
|
|
||||||
|
# Adafruit.py in the platformio build tree is a bit naive and always enables their USB stack for building. We don't want this.
|
||||||
|
# So come in after that python script has run and disable it. This hack avoids us having to fork that big project and send in a PR
|
||||||
|
# which might not be accepted. -@geeksville
|
||||||
|
|
||||||
|
env["CPPDEFINES"].remove("USBCON")
|
||||||
|
env["CPPDEFINES"].remove("USE_TINYUSB")
|
||||||
|
|
||||||
|
# Custom actions when building program/firmware
|
||||||
|
# env.AddPreAction("buildprog", callback...)
|
@ -10,4 +10,6 @@ const uint8_t TORADIO_UUID_16[16u] = {0xe7, 0x01, 0x44, 0x12, 0x66, 0x78, 0xdd,
|
|||||||
const uint8_t FROMRADIO_UUID_16[16u] = {0x02, 0x00, 0x12, 0xac, 0x42, 0x02, 0x78, 0xb8,
|
const uint8_t FROMRADIO_UUID_16[16u] = {0x02, 0x00, 0x12, 0xac, 0x42, 0x02, 0x78, 0xb8,
|
||||||
0xed, 0x11, 0x93, 0x49, 0x9e, 0xe6, 0x55, 0x2c};
|
0xed, 0x11, 0x93, 0x49, 0x9e, 0xe6, 0x55, 0x2c};
|
||||||
const uint8_t FROMNUM_UUID_16[16u] = {0x53, 0x44, 0xe3, 0x47, 0x75, 0xaa, 0x70, 0xa6,
|
const uint8_t FROMNUM_UUID_16[16u] = {0x53, 0x44, 0xe3, 0x47, 0x75, 0xaa, 0x70, 0xa6,
|
||||||
0x66, 0x4f, 0x00, 0xa8, 0x8c, 0xa1, 0x9d, 0xed};
|
0x66, 0x4f, 0x00, 0xa8, 0x8c, 0xa1, 0x9d, 0xed};
|
||||||
|
const uint8_t LOGRADIO_UUID_16[16u] = {0xe2, 0xf2, 0x1e, 0xbe, 0xc5, 0x15, 0xcf, 0xaa,
|
||||||
|
0x6b, 0x43, 0xfa, 0x78, 0x38, 0xd2, 0x6f, 0x6c};
|
@ -11,10 +11,11 @@
|
|||||||
#define TORADIO_UUID "f75c76d2-129e-4dad-a1dd-7866124401e7"
|
#define TORADIO_UUID "f75c76d2-129e-4dad-a1dd-7866124401e7"
|
||||||
#define FROMRADIO_UUID "2c55e69e-4993-11ed-b878-0242ac120002"
|
#define FROMRADIO_UUID "2c55e69e-4993-11ed-b878-0242ac120002"
|
||||||
#define FROMNUM_UUID "ed9da18c-a800-4f66-a670-aa7547e34453"
|
#define FROMNUM_UUID "ed9da18c-a800-4f66-a670-aa7547e34453"
|
||||||
|
#define LOGRADIO_UUID "6c6fd238-78fa-436b-aacf-15c5be1ef2e2"
|
||||||
|
|
||||||
// NRF52 wants these constants as byte arrays
|
// NRF52 wants these constants as byte arrays
|
||||||
// Generated here https://yupana-engineering.com/online-uuid-to-c-array-converter - but in REVERSE BYTE ORDER
|
// Generated here https://yupana-engineering.com/online-uuid-to-c-array-converter - but in REVERSE BYTE ORDER
|
||||||
extern const uint8_t MESH_SERVICE_UUID_16[], TORADIO_UUID_16[16u], FROMRADIO_UUID_16[], FROMNUM_UUID_16[];
|
extern const uint8_t MESH_SERVICE_UUID_16[], TORADIO_UUID_16[16u], FROMRADIO_UUID_16[], FROMNUM_UUID_16[], LOGRADIO_UUID_16[];
|
||||||
|
|
||||||
/// Given a level between 0-100, update the BLE attribute
|
/// Given a level between 0-100, update the BLE attribute
|
||||||
void updateBatteryLevel(uint8_t level);
|
void updateBatteryLevel(uint8_t level);
|
||||||
@ -27,4 +28,5 @@ class BluetoothApi
|
|||||||
virtual void clearBonds();
|
virtual void clearBonds();
|
||||||
virtual bool isConnected();
|
virtual bool isConnected();
|
||||||
virtual int getRssi() = 0;
|
virtual int getRssi() = 0;
|
||||||
|
virtual void sendLog(const char *logMessage);
|
||||||
};
|
};
|
@ -3,6 +3,7 @@
|
|||||||
#include "RTC.h"
|
#include "RTC.h"
|
||||||
#include "concurrency/OSThread.h"
|
#include "concurrency/OSThread.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
|
#include "main.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@ -166,9 +167,43 @@ size_t RedirectablePrint::log(const char *logLevel, const char *format, ...)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
va_end(arg);
|
|
||||||
|
|
||||||
isContinuationMessage = !hasNewline;
|
isContinuationMessage = !hasNewline;
|
||||||
|
|
||||||
|
if (config.bluetooth.device_logging_enabled) {
|
||||||
|
bool isBleConnected = false;
|
||||||
|
#ifdef ARCH_ESP32
|
||||||
|
isBleConnected = nimbleBluetooth && nimbleBluetooth->isActive() && nimbleBluetooth->isConnected();
|
||||||
|
#elif defined(ARCH_NRF52)
|
||||||
|
isBleConnected = nrf52Bluetooth != nullptr && nrf52Bluetooth->isConnected();
|
||||||
|
#endif
|
||||||
|
if (isBleConnected) {
|
||||||
|
char *message;
|
||||||
|
size_t initialLen;
|
||||||
|
size_t len;
|
||||||
|
initialLen = strlen(format);
|
||||||
|
message = new char[initialLen + 1];
|
||||||
|
len = vsnprintf(message, initialLen + 1, format, arg);
|
||||||
|
if (len > initialLen) {
|
||||||
|
delete[] message;
|
||||||
|
message = new char[len + 1];
|
||||||
|
vsnprintf(message, len + 1, format, arg);
|
||||||
|
}
|
||||||
|
auto thread = concurrency::OSThread::currentThread;
|
||||||
|
#ifdef ARCH_ESP32
|
||||||
|
if (thread)
|
||||||
|
nimbleBluetooth->sendLog(mt_sprintf("%s | [%s] %s", logLevel, thread->ThreadName.c_str(), message).c_str());
|
||||||
|
else
|
||||||
|
nimbleBluetooth->sendLog(mt_sprintf("%s | %s", logLevel, message).c_str());
|
||||||
|
#elif defined(ARCH_NRF52)
|
||||||
|
if (thread)
|
||||||
|
nrf52Bluetooth->sendLog(mt_sprintf("%s | [%s] %s", logLevel, thread->ThreadName.c_str(), message).c_str());
|
||||||
|
else
|
||||||
|
nrf52Bluetooth->sendLog(mt_sprintf("%s | %s", logLevel, message).c_str());
|
||||||
|
#endif
|
||||||
|
delete[] message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
va_end(arg);
|
||||||
#ifdef HAS_FREE_RTOS
|
#ifdef HAS_FREE_RTOS
|
||||||
xSemaphoreGive(inDebugPrint);
|
xSemaphoreGive(inDebugPrint);
|
||||||
#else
|
#else
|
||||||
|
@ -75,11 +75,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Regulatory overrides for producing regional builds
|
// Regulatory overrides
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
// Define if region should override user saved region
|
// Override user saved region, for producing region-locked builds
|
||||||
// #define LORA_REGIONCODE meshtastic_Config_LoRaConfig_RegionCode_SG_923
|
// #define REGULATORY_LORA_REGIONCODE meshtastic_Config_LoRaConfig_RegionCode_SG_923
|
||||||
|
|
||||||
|
// Total system gain in dBm to subtract from Tx power to remain within regulatory ERP limit for non-licensed operators
|
||||||
|
// This value should be set in variant.h and is PA gain + antenna gain (if system ships with an antenna)
|
||||||
|
#ifndef REGULATORY_GAIN_LORA
|
||||||
|
#define REGULATORY_GAIN_LORA 0
|
||||||
|
#endif
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Feature toggles
|
// Feature toggles
|
||||||
|
@ -49,7 +49,6 @@ NimbleBluetooth *nimbleBluetooth = nullptr;
|
|||||||
#ifdef ARCH_NRF52
|
#ifdef ARCH_NRF52
|
||||||
#include "NRF52Bluetooth.h"
|
#include "NRF52Bluetooth.h"
|
||||||
NRF52Bluetooth *nrf52Bluetooth = nullptr;
|
NRF52Bluetooth *nrf52Bluetooth = nullptr;
|
||||||
;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_WIFI
|
#if HAS_WIFI
|
||||||
@ -188,7 +187,7 @@ const char *getDeviceName()
|
|||||||
static char name[20];
|
static char name[20];
|
||||||
snprintf(name, sizeof(name), "%02x%02x", dmac[4], dmac[5]);
|
snprintf(name, sizeof(name), "%02x%02x", dmac[4], dmac[5]);
|
||||||
// if the shortname exists and is NOT the new default of ab3c, use it for BLE name.
|
// if the shortname exists and is NOT the new default of ab3c, use it for BLE name.
|
||||||
if ((owner.short_name != NULL) && (strcmp(owner.short_name, name) != 0)) {
|
if (strcmp(owner.short_name, name) != 0) {
|
||||||
snprintf(name, sizeof(name), "%s_%02x%02x", owner.short_name, dmac[4], dmac[5]);
|
snprintf(name, sizeof(name), "%s_%02x%02x", owner.short_name, dmac[4], dmac[5]);
|
||||||
} else {
|
} else {
|
||||||
snprintf(name, sizeof(name), "Meshtastic_%02x%02x", dmac[4], dmac[5]);
|
snprintf(name, sizeof(name), "Meshtastic_%02x%02x", dmac[4], dmac[5]);
|
||||||
|
@ -141,11 +141,6 @@ NodeDB::NodeDB()
|
|||||||
if (channelFileCRC != crc32Buffer(&channelFile, sizeof(channelFile)))
|
if (channelFileCRC != crc32Buffer(&channelFile, sizeof(channelFile)))
|
||||||
saveWhat |= SEGMENT_CHANNELS;
|
saveWhat |= SEGMENT_CHANNELS;
|
||||||
|
|
||||||
if (!devicestate.node_remote_hardware_pins) {
|
|
||||||
meshtastic_NodeRemoteHardwarePin empty[12] = {meshtastic_RemoteHardwarePin_init_default};
|
|
||||||
memcpy(devicestate.node_remote_hardware_pins, empty, sizeof(empty));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.position.gps_enabled) {
|
if (config.position.gps_enabled) {
|
||||||
config.position.gps_mode = meshtastic_Config_PositionConfig_GpsMode_ENABLED;
|
config.position.gps_mode = meshtastic_Config_PositionConfig_GpsMode_ENABLED;
|
||||||
config.position.gps_enabled = 0;
|
config.position.gps_enabled = 0;
|
||||||
|
@ -154,8 +154,8 @@ static uint8_t bytes[MAX_RHPACKETLEN];
|
|||||||
void initRegion()
|
void initRegion()
|
||||||
{
|
{
|
||||||
const RegionInfo *r = regions;
|
const RegionInfo *r = regions;
|
||||||
#ifdef LORA_REGIONCODE
|
#ifdef REGULATORY_LORA_REGIONCODE
|
||||||
for (; r->code != meshtastic_Config_LoRaConfig_RegionCode_UNSET && r->code != LORA_REGIONCODE; r++)
|
for (; r->code != meshtastic_Config_LoRaConfig_RegionCode_UNSET && r->code != REGULATORY_LORA_REGIONCODE; r++)
|
||||||
;
|
;
|
||||||
LOG_INFO("Wanted region %d, regulatory override to %s\n", config.lora.region, r->name);
|
LOG_INFO("Wanted region %d, regulatory override to %s\n", config.lora.region, r->name);
|
||||||
#else
|
#else
|
||||||
@ -478,8 +478,8 @@ void RadioInterface::applyModemConfig()
|
|||||||
|
|
||||||
power = loraConfig.tx_power;
|
power = loraConfig.tx_power;
|
||||||
|
|
||||||
if ((power == 0) || ((power > myRegion->powerLimit) && !devicestate.owner.is_licensed))
|
if ((power == 0) || ((power + REGULATORY_GAIN_LORA > myRegion->powerLimit) && !devicestate.owner.is_licensed))
|
||||||
power = myRegion->powerLimit;
|
power = myRegion->powerLimit - REGULATORY_GAIN_LORA;
|
||||||
|
|
||||||
if (power == 0)
|
if (power == 0)
|
||||||
power = 17; // Default to this power level if we don't have a valid regional power limit (powerLimit of myRegion defaults
|
power = 17; // Default to this power level if we don't have a valid regional power limit (powerLimit of myRegion defaults
|
||||||
|
@ -299,8 +299,8 @@ void AdminModule::handleGetModuleConfigResponse(const meshtastic_MeshPacket &mp,
|
|||||||
{
|
{
|
||||||
// Skip if it's disabled or no pins are exposed
|
// Skip if it's disabled or no pins are exposed
|
||||||
if (!r->get_module_config_response.payload_variant.remote_hardware.enabled ||
|
if (!r->get_module_config_response.payload_variant.remote_hardware.enabled ||
|
||||||
!r->get_module_config_response.payload_variant.remote_hardware.available_pins) {
|
r->get_module_config_response.payload_variant.remote_hardware.available_pins_count == 0) {
|
||||||
LOG_DEBUG("Remote hardware module disabled or no vailable_pins. Skipping...\n");
|
LOG_DEBUG("Remote hardware module disabled or no available_pins. Skipping...\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (uint8_t i = 0; i < devicestate.node_remote_hardware_pins_count; i++) {
|
for (uint8_t i = 0; i < devicestate.node_remote_hardware_pins_count; i++) {
|
||||||
|
@ -482,7 +482,12 @@ void MQTT::onSend(const meshtastic_MeshPacket &mp, const meshtastic_MeshPacket &
|
|||||||
|
|
||||||
auto &ch = channels.getByIndex(chIndex);
|
auto &ch = channels.getByIndex(chIndex);
|
||||||
|
|
||||||
if (&mp_decoded.decoded && strcmp(moduleConfig.mqtt.address, default_mqtt_address) == 0 &&
|
if (mp_decoded.which_payload_variant != meshtastic_MeshPacket_decoded_tag) {
|
||||||
|
LOG_CRIT("MQTT::onSend(): mp_decoded isn't actually decoded\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(moduleConfig.mqtt.address, default_mqtt_address) == 0 &&
|
||||||
(mp_decoded.decoded.portnum == meshtastic_PortNum_RANGE_TEST_APP ||
|
(mp_decoded.decoded.portnum == meshtastic_PortNum_RANGE_TEST_APP ||
|
||||||
mp_decoded.decoded.portnum == meshtastic_PortNum_DETECTION_SENSOR_APP)) {
|
mp_decoded.decoded.portnum == meshtastic_PortNum_DETECTION_SENSOR_APP)) {
|
||||||
LOG_DEBUG("MQTT onSend - Ignoring range test or detection sensor message on public mqtt\n");
|
LOG_DEBUG("MQTT onSend - Ignoring range test or detection sensor message on public mqtt\n");
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
NimBLECharacteristic *fromNumCharacteristic;
|
NimBLECharacteristic *fromNumCharacteristic;
|
||||||
NimBLECharacteristic *BatteryCharacteristic;
|
NimBLECharacteristic *BatteryCharacteristic;
|
||||||
|
NimBLECharacteristic *logRadioCharacteristic;
|
||||||
NimBLEServer *bleServer;
|
NimBLEServer *bleServer;
|
||||||
|
|
||||||
static bool passkeyShowing;
|
static bool passkeyShowing;
|
||||||
@ -58,7 +59,6 @@ class NimbleBluetoothFromRadioCallback : public NimBLECharacteristicCallbacks
|
|||||||
{
|
{
|
||||||
virtual void onRead(NimBLECharacteristic *pCharacteristic)
|
virtual void onRead(NimBLECharacteristic *pCharacteristic)
|
||||||
{
|
{
|
||||||
LOG_INFO("From Radio onread\n");
|
|
||||||
uint8_t fromRadioBytes[meshtastic_FromRadio_size];
|
uint8_t fromRadioBytes[meshtastic_FromRadio_size];
|
||||||
size_t numBytes = bluetoothPhoneAPI->getFromRadio(fromRadioBytes);
|
size_t numBytes = bluetoothPhoneAPI->getFromRadio(fromRadioBytes);
|
||||||
|
|
||||||
@ -180,6 +180,7 @@ void NimbleBluetooth::setupService()
|
|||||||
ToRadioCharacteristic = bleService->createCharacteristic(TORADIO_UUID, NIMBLE_PROPERTY::WRITE);
|
ToRadioCharacteristic = bleService->createCharacteristic(TORADIO_UUID, NIMBLE_PROPERTY::WRITE);
|
||||||
FromRadioCharacteristic = bleService->createCharacteristic(FROMRADIO_UUID, NIMBLE_PROPERTY::READ);
|
FromRadioCharacteristic = bleService->createCharacteristic(FROMRADIO_UUID, NIMBLE_PROPERTY::READ);
|
||||||
fromNumCharacteristic = bleService->createCharacteristic(FROMNUM_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ);
|
fromNumCharacteristic = bleService->createCharacteristic(FROMNUM_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ);
|
||||||
|
logRadioCharacteristic = bleService->createCharacteristic(LOGRADIO_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ);
|
||||||
} else {
|
} else {
|
||||||
ToRadioCharacteristic = bleService->createCharacteristic(
|
ToRadioCharacteristic = bleService->createCharacteristic(
|
||||||
TORADIO_UUID, NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_AUTHEN | NIMBLE_PROPERTY::WRITE_ENC);
|
TORADIO_UUID, NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_AUTHEN | NIMBLE_PROPERTY::WRITE_ENC);
|
||||||
@ -188,6 +189,9 @@ void NimbleBluetooth::setupService()
|
|||||||
fromNumCharacteristic =
|
fromNumCharacteristic =
|
||||||
bleService->createCharacteristic(FROMNUM_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ |
|
bleService->createCharacteristic(FROMNUM_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ |
|
||||||
NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC);
|
NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC);
|
||||||
|
logRadioCharacteristic =
|
||||||
|
bleService->createCharacteristic(LOGRADIO_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ |
|
||||||
|
NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC);
|
||||||
}
|
}
|
||||||
bluetoothPhoneAPI = new BluetoothPhoneAPI();
|
bluetoothPhoneAPI = new BluetoothPhoneAPI();
|
||||||
|
|
||||||
@ -236,6 +240,14 @@ void NimbleBluetooth::clearBonds()
|
|||||||
NimBLEDevice::deleteAllBonds();
|
NimBLEDevice::deleteAllBonds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NimbleBluetooth::sendLog(const char *logMessage)
|
||||||
|
{
|
||||||
|
if (!bleServer || !isConnected() || strlen(logMessage) > 512) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logRadioCharacteristic->notify((uint8_t *)logMessage, strlen(logMessage));
|
||||||
|
}
|
||||||
|
|
||||||
void clearNVS()
|
void clearNVS()
|
||||||
{
|
{
|
||||||
NimBLEDevice::deleteAllBonds();
|
NimBLEDevice::deleteAllBonds();
|
||||||
|
@ -11,6 +11,7 @@ class NimbleBluetooth : BluetoothApi
|
|||||||
bool isActive();
|
bool isActive();
|
||||||
bool isConnected();
|
bool isConnected();
|
||||||
int getRssi();
|
int getRssi();
|
||||||
|
void sendLog(const char *logMessage);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setupService();
|
void setupService();
|
||||||
|
@ -7,16 +7,16 @@
|
|||||||
#include "mesh/mesh-pb-constants.h"
|
#include "mesh/mesh-pb-constants.h"
|
||||||
#include <bluefruit.h>
|
#include <bluefruit.h>
|
||||||
#include <utility/bonding.h>
|
#include <utility/bonding.h>
|
||||||
|
|
||||||
static BLEService meshBleService = BLEService(BLEUuid(MESH_SERVICE_UUID_16));
|
static BLEService meshBleService = BLEService(BLEUuid(MESH_SERVICE_UUID_16));
|
||||||
static BLECharacteristic fromNum = BLECharacteristic(BLEUuid(FROMNUM_UUID_16));
|
static BLECharacteristic fromNum = BLECharacteristic(BLEUuid(FROMNUM_UUID_16));
|
||||||
static BLECharacteristic fromRadio = BLECharacteristic(BLEUuid(FROMRADIO_UUID_16));
|
static BLECharacteristic fromRadio = BLECharacteristic(BLEUuid(FROMRADIO_UUID_16));
|
||||||
static BLECharacteristic toRadio = BLECharacteristic(BLEUuid(TORADIO_UUID_16));
|
static BLECharacteristic toRadio = BLECharacteristic(BLEUuid(TORADIO_UUID_16));
|
||||||
|
static BLECharacteristic logRadio = BLECharacteristic(BLEUuid(LOGRADIO_UUID_16));
|
||||||
|
|
||||||
static BLEDis bledis; // DIS (Device Information Service) helper class instance
|
static BLEDis bledis; // DIS (Device Information Service) helper class instance
|
||||||
static BLEBas blebas; // BAS (Battery Service) helper class instance
|
static BLEBas blebas; // BAS (Battery Service) helper class instance
|
||||||
static BLEDfu bledfu; // DFU software update helper service
|
|
||||||
|
|
||||||
|
static BLEDfu bledfu; // DFU software update helper service
|
||||||
// This scratch buffer is used for various bluetooth reads/writes - but it is safe because only one bt operation can be in
|
// This scratch buffer is used for various bluetooth reads/writes - but it is safe because only one bt operation can be in
|
||||||
// process at once
|
// process at once
|
||||||
// static uint8_t trBytes[_max(_max(_max(_max(ToRadio_size, RadioConfig_size), User_size), MyNodeInfo_size), FromRadio_size)];
|
// static uint8_t trBytes[_max(_max(_max(_max(ToRadio_size, RadioConfig_size), User_size), MyNodeInfo_size), FromRadio_size)];
|
||||||
@ -50,16 +50,14 @@ static BluetoothPhoneAPI *bluetoothPhoneAPI;
|
|||||||
|
|
||||||
void onConnect(uint16_t conn_handle)
|
void onConnect(uint16_t conn_handle)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Get the reference to current connection
|
// Get the reference to current connection
|
||||||
BLEConnection *connection = Bluefruit.Connection(conn_handle);
|
BLEConnection *connection = Bluefruit.Connection(conn_handle);
|
||||||
connectionHandle = conn_handle;
|
connectionHandle = conn_handle;
|
||||||
|
|
||||||
char central_name[32] = {0};
|
char central_name[32] = {0};
|
||||||
connection->getPeerName(central_name, sizeof(central_name));
|
connection->getPeerName(central_name, sizeof(central_name));
|
||||||
|
|
||||||
LOG_INFO("BLE Connected to %s\n", central_name);
|
LOG_INFO("BLE Connected to %s\n", central_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback invoked when a connection is dropped
|
* Callback invoked when a connection is dropped
|
||||||
* @param conn_handle connection where this event happens
|
* @param conn_handle connection where this event happens
|
||||||
@ -70,15 +68,13 @@ void onDisconnect(uint16_t conn_handle, uint8_t reason)
|
|||||||
// FIXME - we currently assume only one active connection
|
// FIXME - we currently assume only one active connection
|
||||||
LOG_INFO("BLE Disconnected, reason = 0x%x\n", reason);
|
LOG_INFO("BLE Disconnected, reason = 0x%x\n", reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onCccd(uint16_t conn_hdl, BLECharacteristic *chr, uint16_t cccd_value)
|
void onCccd(uint16_t conn_hdl, BLECharacteristic *chr, uint16_t cccd_value)
|
||||||
{
|
{
|
||||||
// Display the raw request packet
|
// Display the raw request packet
|
||||||
LOG_INFO("CCCD Updated: %u\n", cccd_value);
|
LOG_INFO("CCCD Updated: %u\n", cccd_value);
|
||||||
|
|
||||||
// Check the characteristic this CCCD update is associated with in case
|
// Check the characteristic this CCCD update is associated with in case
|
||||||
// this handler is used for multiple CCCD records.
|
// this handler is used for multiple CCCD records.
|
||||||
if (chr->uuid == fromNum.uuid) {
|
if (chr->uuid == fromNum.uuid || chr->uuid == logRadio.uuid) {
|
||||||
if (chr->notifyEnabled(conn_hdl)) {
|
if (chr->notifyEnabled(conn_hdl)) {
|
||||||
LOG_INFO("fromNum 'Notify' enabled\n");
|
LOG_INFO("fromNum 'Notify' enabled\n");
|
||||||
} else {
|
} else {
|
||||||
@ -86,21 +82,17 @@ void onCccd(uint16_t conn_hdl, BLECharacteristic *chr, uint16_t cccd_value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void startAdv(void)
|
void startAdv(void)
|
||||||
{
|
{
|
||||||
// Advertising packet
|
// Advertising packet
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
||||||
|
|
||||||
// IncludeService UUID
|
// IncludeService UUID
|
||||||
// Bluefruit.ScanResponse.addService(meshBleService);
|
// Bluefruit.ScanResponse.addService(meshBleService);
|
||||||
Bluefruit.ScanResponse.addTxPower();
|
Bluefruit.ScanResponse.addTxPower();
|
||||||
Bluefruit.ScanResponse.addName();
|
Bluefruit.ScanResponse.addName();
|
||||||
|
|
||||||
// Include Name
|
// Include Name
|
||||||
// Bluefruit.Advertising.addName();
|
// Bluefruit.Advertising.addName();
|
||||||
Bluefruit.Advertising.addService(meshBleService);
|
Bluefruit.Advertising.addService(meshBleService);
|
||||||
|
|
||||||
/* Start Advertising
|
/* Start Advertising
|
||||||
* - Enable auto advertising if disconnected
|
* - Enable auto advertising if disconnected
|
||||||
* - Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
* - Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
||||||
@ -115,7 +107,6 @@ void startAdv(void)
|
|||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds. FIXME, we should stop advertising after X
|
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds. FIXME, we should stop advertising after X
|
||||||
}
|
}
|
||||||
|
|
||||||
// Just ack that the caller is allowed to read
|
// Just ack that the caller is allowed to read
|
||||||
static void authorizeRead(uint16_t conn_hdl)
|
static void authorizeRead(uint16_t conn_hdl)
|
||||||
{
|
{
|
||||||
@ -123,7 +114,6 @@ static void authorizeRead(uint16_t conn_hdl)
|
|||||||
reply.params.write.gatt_status = BLE_GATT_STATUS_SUCCESS;
|
reply.params.write.gatt_status = BLE_GATT_STATUS_SUCCESS;
|
||||||
sd_ble_gatts_rw_authorize_reply(conn_hdl, &reply);
|
sd_ble_gatts_rw_authorize_reply(conn_hdl, &reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* client is starting read, pull the bytes from our API class
|
* client is starting read, pull the bytes from our API class
|
||||||
*/
|
*/
|
||||||
@ -132,7 +122,6 @@ void onFromRadioAuthorize(uint16_t conn_hdl, BLECharacteristic *chr, ble_gatts_e
|
|||||||
if (request->offset == 0) {
|
if (request->offset == 0) {
|
||||||
// If the read is long, we will get multiple authorize invocations - we only populate data on the first
|
// If the read is long, we will get multiple authorize invocations - we only populate data on the first
|
||||||
size_t numBytes = bluetoothPhoneAPI->getFromRadio(fromRadioBytes);
|
size_t numBytes = bluetoothPhoneAPI->getFromRadio(fromRadioBytes);
|
||||||
|
|
||||||
// Someone is going to read our value as soon as this callback returns. So fill it with the next message in the queue
|
// Someone is going to read our value as soon as this callback returns. So fill it with the next message in the queue
|
||||||
// or make empty if the queue is empty
|
// or make empty if the queue is empty
|
||||||
fromRadio.write(fromRadioBytes, numBytes);
|
fromRadio.write(fromRadioBytes, numBytes);
|
||||||
@ -141,37 +130,22 @@ void onFromRadioAuthorize(uint16_t conn_hdl, BLECharacteristic *chr, ble_gatts_e
|
|||||||
}
|
}
|
||||||
authorizeRead(conn_hdl);
|
authorizeRead(conn_hdl);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onToRadioWrite(uint16_t conn_hdl, BLECharacteristic *chr, uint8_t *data, uint16_t len)
|
void onToRadioWrite(uint16_t conn_hdl, BLECharacteristic *chr, uint8_t *data, uint16_t len)
|
||||||
{
|
{
|
||||||
LOG_INFO("toRadioWriteCb data %p, len %u\n", data, len);
|
LOG_INFO("toRadioWriteCb data %p, len %u\n", data, len);
|
||||||
|
|
||||||
bluetoothPhoneAPI->handleToRadio(data, len);
|
bluetoothPhoneAPI->handleToRadio(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* client is starting read, pull the bytes from our API class
|
|
||||||
*/
|
|
||||||
void onFromNumAuthorize(uint16_t conn_hdl, BLECharacteristic *chr, ble_gatts_evt_read_t *request)
|
|
||||||
{
|
|
||||||
LOG_INFO("fromNumAuthorizeCb\n");
|
|
||||||
|
|
||||||
authorizeRead(conn_hdl);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupMeshService(void)
|
void setupMeshService(void)
|
||||||
{
|
{
|
||||||
bluetoothPhoneAPI = new BluetoothPhoneAPI();
|
bluetoothPhoneAPI = new BluetoothPhoneAPI();
|
||||||
|
|
||||||
meshBleService.begin();
|
meshBleService.begin();
|
||||||
|
|
||||||
// Note: You must call .begin() on the BLEService before calling .begin() on
|
// Note: You must call .begin() on the BLEService before calling .begin() on
|
||||||
// any characteristic(s) within that service definition.. Calling .begin() on
|
// any characteristic(s) within that service definition.. Calling .begin() on
|
||||||
// a BLECharacteristic will cause it to be added to the last BLEService that
|
// a BLECharacteristic will cause it to be added to the last BLEService that
|
||||||
// was 'begin()'ed!
|
// was 'begin()'ed!
|
||||||
auto secMode =
|
auto secMode =
|
||||||
config.bluetooth.mode == meshtastic_Config_BluetoothConfig_PairingMode_NO_PIN ? SECMODE_OPEN : SECMODE_ENC_NO_MITM;
|
config.bluetooth.mode == meshtastic_Config_BluetoothConfig_PairingMode_NO_PIN ? SECMODE_OPEN : SECMODE_ENC_NO_MITM;
|
||||||
|
|
||||||
fromNum.setProperties(CHR_PROPS_NOTIFY | CHR_PROPS_READ);
|
fromNum.setProperties(CHR_PROPS_NOTIFY | CHR_PROPS_READ);
|
||||||
fromNum.setPermission(secMode, SECMODE_NO_ACCESS); // FIXME, secure this!!!
|
fromNum.setPermission(secMode, SECMODE_NO_ACCESS); // FIXME, secure this!!!
|
||||||
fromNum.setFixedLen(
|
fromNum.setFixedLen(
|
||||||
@ -201,10 +175,15 @@ void setupMeshService(void)
|
|||||||
// We don't call this callback via the adafruit queue, because we can safely run in the BLE context
|
// We don't call this callback via the adafruit queue, because we can safely run in the BLE context
|
||||||
toRadio.setWriteCallback(onToRadioWrite, false);
|
toRadio.setWriteCallback(onToRadioWrite, false);
|
||||||
toRadio.begin();
|
toRadio.begin();
|
||||||
|
|
||||||
|
logRadio.setProperties(CHR_PROPS_NOTIFY | CHR_PROPS_READ);
|
||||||
|
logRadio.setPermission(secMode, SECMODE_NO_ACCESS);
|
||||||
|
logRadio.setMaxLen(512);
|
||||||
|
logRadio.setCccdWriteCallback(onCccd);
|
||||||
|
logRadio.write32(0);
|
||||||
|
logRadio.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t configuredPasskey;
|
static uint32_t configuredPasskey;
|
||||||
|
|
||||||
void NRF52Bluetooth::shutdown()
|
void NRF52Bluetooth::shutdown()
|
||||||
{
|
{
|
||||||
// Shutdown bluetooth for minimum power draw
|
// Shutdown bluetooth for minimum power draw
|
||||||
@ -214,29 +193,23 @@ void NRF52Bluetooth::shutdown()
|
|||||||
}
|
}
|
||||||
Bluefruit.Advertising.stop();
|
Bluefruit.Advertising.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NRF52Bluetooth::startDisabled()
|
void NRF52Bluetooth::startDisabled()
|
||||||
{
|
{
|
||||||
// Setup Bluetooth
|
// Setup Bluetooth
|
||||||
nrf52Bluetooth->setup();
|
nrf52Bluetooth->setup();
|
||||||
|
|
||||||
// Shutdown bluetooth for minimum power draw
|
// Shutdown bluetooth for minimum power draw
|
||||||
Bluefruit.Advertising.stop();
|
Bluefruit.Advertising.stop();
|
||||||
Bluefruit.setTxPower(-40); // Minimum power
|
Bluefruit.setTxPower(-40); // Minimum power
|
||||||
|
|
||||||
LOG_INFO("Disabling NRF52 Bluetooth. (Workaround: tx power min, advertising stopped)\n");
|
LOG_INFO("Disabling NRF52 Bluetooth. (Workaround: tx power min, advertising stopped)\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NRF52Bluetooth::isConnected()
|
bool NRF52Bluetooth::isConnected()
|
||||||
{
|
{
|
||||||
return Bluefruit.connected(connectionHandle);
|
return Bluefruit.connected(connectionHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
int NRF52Bluetooth::getRssi()
|
int NRF52Bluetooth::getRssi()
|
||||||
{
|
{
|
||||||
return 0; // FIXME figure out where to source this
|
return 0; // FIXME figure out where to source this
|
||||||
}
|
}
|
||||||
|
|
||||||
void NRF52Bluetooth::setup()
|
void NRF52Bluetooth::setup()
|
||||||
{
|
{
|
||||||
// Initialise the Bluefruit module
|
// Initialise the Bluefruit module
|
||||||
@ -244,12 +217,10 @@ void NRF52Bluetooth::setup()
|
|||||||
Bluefruit.autoConnLed(false);
|
Bluefruit.autoConnLed(false);
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
||||||
Bluefruit.begin();
|
Bluefruit.begin();
|
||||||
|
|
||||||
// Clear existing data.
|
// Clear existing data.
|
||||||
Bluefruit.Advertising.stop();
|
Bluefruit.Advertising.stop();
|
||||||
Bluefruit.Advertising.clearData();
|
Bluefruit.Advertising.clearData();
|
||||||
Bluefruit.ScanResponse.clearData();
|
Bluefruit.ScanResponse.clearData();
|
||||||
|
|
||||||
if (config.bluetooth.mode != meshtastic_Config_BluetoothConfig_PairingMode_NO_PIN) {
|
if (config.bluetooth.mode != meshtastic_Config_BluetoothConfig_PairingMode_NO_PIN) {
|
||||||
configuredPasskey = config.bluetooth.mode == meshtastic_Config_BluetoothConfig_PairingMode_FIXED_PIN
|
configuredPasskey = config.bluetooth.mode == meshtastic_Config_BluetoothConfig_PairingMode_FIXED_PIN
|
||||||
? config.bluetooth.fixed_pin
|
? config.bluetooth.fixed_pin
|
||||||
@ -268,37 +239,29 @@ void NRF52Bluetooth::setup()
|
|||||||
}
|
}
|
||||||
// Set the advertised device name (keep it short!)
|
// Set the advertised device name (keep it short!)
|
||||||
Bluefruit.setName(getDeviceName());
|
Bluefruit.setName(getDeviceName());
|
||||||
|
|
||||||
// Set the connect/disconnect callback handlers
|
// Set the connect/disconnect callback handlers
|
||||||
Bluefruit.Periph.setConnectCallback(onConnect);
|
Bluefruit.Periph.setConnectCallback(onConnect);
|
||||||
Bluefruit.Periph.setDisconnectCallback(onDisconnect);
|
Bluefruit.Periph.setDisconnectCallback(onDisconnect);
|
||||||
|
|
||||||
bledfu.setPermission(SECMODE_ENC_WITH_MITM, SECMODE_ENC_WITH_MITM);
|
bledfu.setPermission(SECMODE_ENC_WITH_MITM, SECMODE_ENC_WITH_MITM);
|
||||||
bledfu.begin(); // Install the DFU helper
|
bledfu.begin(); // Install the DFU helper
|
||||||
|
|
||||||
// Configure and Start the Device Information Service
|
// Configure and Start the Device Information Service
|
||||||
LOG_INFO("Configuring the Device Information Service\n");
|
LOG_INFO("Configuring the Device Information Service\n");
|
||||||
bledis.setModel(optstr(HW_VERSION));
|
bledis.setModel(optstr(HW_VERSION));
|
||||||
bledis.setFirmwareRev(optstr(APP_VERSION));
|
bledis.setFirmwareRev(optstr(APP_VERSION));
|
||||||
bledis.begin();
|
bledis.begin();
|
||||||
|
|
||||||
// Start the BLE Battery Service and set it to 100%
|
// Start the BLE Battery Service and set it to 100%
|
||||||
LOG_INFO("Configuring the Battery Service\n");
|
LOG_INFO("Configuring the Battery Service\n");
|
||||||
blebas.begin();
|
blebas.begin();
|
||||||
blebas.write(0); // Unknown battery level for now
|
blebas.write(0); // Unknown battery level for now
|
||||||
|
|
||||||
// Setup the Heart Rate Monitor service using
|
// Setup the Heart Rate Monitor service using
|
||||||
// BLEService and BLECharacteristic classes
|
// BLEService and BLECharacteristic classes
|
||||||
LOG_INFO("Configuring the Mesh bluetooth service\n");
|
LOG_INFO("Configuring the Mesh bluetooth service\n");
|
||||||
setupMeshService();
|
setupMeshService();
|
||||||
|
|
||||||
// Setup the advertising packet(s)
|
// Setup the advertising packet(s)
|
||||||
LOG_INFO("Setting up the advertising payload(s)\n");
|
LOG_INFO("Setting up the advertising payload(s)\n");
|
||||||
startAdv();
|
startAdv();
|
||||||
|
|
||||||
LOG_INFO("Advertising\n");
|
LOG_INFO("Advertising\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void NRF52Bluetooth::resumeAdvertising()
|
void NRF52Bluetooth::resumeAdvertising()
|
||||||
{
|
{
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
Bluefruit.Advertising.restartOnDisconnect(true);
|
||||||
@ -306,34 +269,28 @@ void NRF52Bluetooth::resumeAdvertising()
|
|||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
||||||
Bluefruit.Advertising.start(0);
|
Bluefruit.Advertising.start(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Given a level between 0-100, update the BLE attribute
|
/// Given a level between 0-100, update the BLE attribute
|
||||||
void updateBatteryLevel(uint8_t level)
|
void updateBatteryLevel(uint8_t level)
|
||||||
{
|
{
|
||||||
blebas.write(level);
|
blebas.write(level);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NRF52Bluetooth::clearBonds()
|
void NRF52Bluetooth::clearBonds()
|
||||||
{
|
{
|
||||||
LOG_INFO("Clearing bluetooth bonds!\n");
|
LOG_INFO("Clearing bluetooth bonds!\n");
|
||||||
bond_print_list(BLE_GAP_ROLE_PERIPH);
|
bond_print_list(BLE_GAP_ROLE_PERIPH);
|
||||||
bond_print_list(BLE_GAP_ROLE_CENTRAL);
|
bond_print_list(BLE_GAP_ROLE_CENTRAL);
|
||||||
|
|
||||||
Bluefruit.Periph.clearBonds();
|
Bluefruit.Periph.clearBonds();
|
||||||
Bluefruit.Central.clearBonds();
|
Bluefruit.Central.clearBonds();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NRF52Bluetooth::onConnectionSecured(uint16_t conn_handle)
|
void NRF52Bluetooth::onConnectionSecured(uint16_t conn_handle)
|
||||||
{
|
{
|
||||||
LOG_INFO("BLE connection secured\n");
|
LOG_INFO("BLE connection secured\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NRF52Bluetooth::onPairingPasskey(uint16_t conn_handle, uint8_t const passkey[6], bool match_request)
|
bool NRF52Bluetooth::onPairingPasskey(uint16_t conn_handle, uint8_t const passkey[6], bool match_request)
|
||||||
{
|
{
|
||||||
LOG_INFO("BLE pairing process started with passkey %.3s %.3s\n", passkey, passkey + 3);
|
LOG_INFO("BLE pairing process started with passkey %.3s %.3s\n", passkey, passkey + 3);
|
||||||
powerFSM.trigger(EVENT_BLUETOOTH_PAIR);
|
powerFSM.trigger(EVENT_BLUETOOTH_PAIR);
|
||||||
screen->startBluetoothPinScreen(configuredPasskey);
|
screen->startBluetoothPinScreen(configuredPasskey);
|
||||||
|
|
||||||
if (match_request) {
|
if (match_request) {
|
||||||
uint32_t start_time = millis();
|
uint32_t start_time = millis();
|
||||||
while (millis() < start_time + 30000) {
|
while (millis() < start_time + 30000) {
|
||||||
@ -344,13 +301,18 @@ bool NRF52Bluetooth::onPairingPasskey(uint16_t conn_handle, uint8_t const passke
|
|||||||
LOG_INFO("BLE passkey pairing: match_request=%i\n", match_request);
|
LOG_INFO("BLE passkey pairing: match_request=%i\n", match_request);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NRF52Bluetooth::onPairingCompleted(uint16_t conn_handle, uint8_t auth_status)
|
void NRF52Bluetooth::onPairingCompleted(uint16_t conn_handle, uint8_t auth_status)
|
||||||
{
|
{
|
||||||
if (auth_status == BLE_GAP_SEC_STATUS_SUCCESS)
|
if (auth_status == BLE_GAP_SEC_STATUS_SUCCESS)
|
||||||
LOG_INFO("BLE pairing success\n");
|
LOG_INFO("BLE pairing success\n");
|
||||||
else
|
else
|
||||||
LOG_INFO("BLE pairing failed\n");
|
LOG_INFO("BLE pairing failed\n");
|
||||||
|
|
||||||
screen->stopBluetoothPinScreen();
|
screen->stopBluetoothPinScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NRF52Bluetooth::sendLog(const char *logMessage)
|
||||||
|
{
|
||||||
|
if (!isConnected() || strlen(logMessage) > 512)
|
||||||
|
return;
|
||||||
|
logRadio.notify(logMessage);
|
||||||
}
|
}
|
@ -13,10 +13,10 @@ class NRF52Bluetooth : BluetoothApi
|
|||||||
void clearBonds();
|
void clearBonds();
|
||||||
bool isConnected();
|
bool isConnected();
|
||||||
int getRssi();
|
int getRssi();
|
||||||
|
void sendLog(const char *logMessage);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void onConnectionSecured(uint16_t conn_handle);
|
static void onConnectionSecured(uint16_t conn_handle);
|
||||||
void convertToUint8(uint8_t target[4], uint32_t source);
|
|
||||||
static bool onPairingPasskey(uint16_t conn_handle, uint8_t const passkey[6], bool match_request);
|
static bool onPairingPasskey(uint16_t conn_handle, uint8_t const passkey[6], bool match_request);
|
||||||
static void onPairingCompleted(uint16_t conn_handle, uint8_t auth_status);
|
static void onPairingCompleted(uint16_t conn_handle, uint8_t auth_status);
|
||||||
};
|
};
|
@ -1,7 +1,7 @@
|
|||||||
[env:heltec-wireless-tracker]
|
[env:heltec-wireless-tracker]
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = heltec_wireless_tracker
|
board = heltec_wireless_tracker
|
||||||
upload_protocol = esp-builtin
|
upload_protocol = esptool
|
||||||
|
|
||||||
build_flags =
|
build_flags =
|
||||||
${esp32s3_base.build_flags} -I variants/heltec_wireless_tracker
|
${esp32s3_base.build_flags} -I variants/heltec_wireless_tracker
|
||||||
@ -11,4 +11,4 @@ build_flags =
|
|||||||
|
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32s3_base.lib_deps}
|
${esp32s3_base.lib_deps}
|
||||||
lovyan03/LovyanGFX@^1.1.8
|
lovyan03/LovyanGFX@^1.1.8
|
||||||
|
@ -2,6 +2,10 @@
|
|||||||
[env:wio-sdk-wm1110]
|
[env:wio-sdk-wm1110]
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = wio-sdk-wm1110
|
board = wio-sdk-wm1110
|
||||||
|
|
||||||
|
# Remove adafruit USB serial from the build (it is incompatible with using the ch340 serial chip on this board)
|
||||||
|
build_unflags = ${nrf52840_base:build_unflags} -DUSBCON -DUSE_TINYUSB
|
||||||
|
|
||||||
board_level = extra
|
board_level = extra
|
||||||
; platform = https://github.com/maxgerhardt/platform-nordicnrf52#cac6fcf943a41accd2aeb4f3659ae297a73f422e
|
; platform = https://github.com/maxgerhardt/platform-nordicnrf52#cac6fcf943a41accd2aeb4f3659ae297a73f422e
|
||||||
build_flags = ${nrf52840_base.build_flags} -Ivariants/wio-sdk-wm1110 -DWIO_WM1110
|
build_flags = ${nrf52840_base.build_flags} -Ivariants/wio-sdk-wm1110 -DWIO_WM1110
|
||||||
@ -12,4 +16,4 @@ lib_deps =
|
|||||||
${nrf52840_base.lib_deps}
|
${nrf52840_base.lib_deps}
|
||||||
debug_tool = jlink
|
debug_tool = jlink
|
||||||
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
||||||
upload_protocol = jlink
|
upload_protocol = jlink
|
||||||
|
@ -31,6 +31,13 @@
|
|||||||
|
|
||||||
#include "WVariant.h"
|
#include "WVariant.h"
|
||||||
|
|
||||||
|
#ifdef USE_TINYUSB
|
||||||
|
#error TinyUSB must be disabled by platformio before using this variant
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// We use the hardware serial port for the serial console
|
||||||
|
#define Serial Serial1
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif // __cplusplus
|
#endif // __cplusplus
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = xiao_ble_sense
|
board = xiao_ble_sense
|
||||||
board_level = extra
|
board_level = extra
|
||||||
build_flags = ${nrf52840_base.build_flags} -Ivariants/xiao_ble -Ivariants/xiao_ble/softdevice -Ivariants/xiao_ble/softdevice/nrf52 -D EBYTE_E22 -DPRIVATE_HW
|
build_flags = ${nrf52840_base.build_flags} -Ivariants/xiao_ble -Ivariants/xiao_ble/softdevice -Ivariants/xiao_ble/softdevice/nrf52 -D EBYTE_E22 -DEBYTE_E22_900M30S -DPRIVATE_HW
|
||||||
-L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard"
|
-L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard"
|
||||||
board_build.ldscript = variants/xiao_ble/nrf52840_s140_v7.ld
|
board_build.ldscript = variants/xiao_ble/nrf52840_s140_v7.ld
|
||||||
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/xiao_ble>
|
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/xiao_ble>
|
||||||
|
@ -142,6 +142,16 @@ static const uint8_t SCK = PIN_SPI_SCK;
|
|||||||
// (which is the default for the sx1262interface code)
|
// (which is the default for the sx1262interface code)
|
||||||
#define SX126X_DIO2_AS_RF_SWITCH
|
#define SX126X_DIO2_AS_RF_SWITCH
|
||||||
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
||||||
|
#ifdef EBYTE_E22_900M30S
|
||||||
|
// 10dB PA gain and 30dB rated output; based on PA output table from Ebyte Robin <sales06@ebyte.com>
|
||||||
|
#define REGULATORY_GAIN_LORA 10
|
||||||
|
#define SX126X_MAX_POWER 20
|
||||||
|
#endif
|
||||||
|
#ifdef EBYTE_E22_900M33S
|
||||||
|
// 25dB PA gain and 33dB rated output; based on TX Power Curve from E22-900M33S_UserManual_EN_v1.0.pdf
|
||||||
|
#define REGULATORY_GAIN_LORA 25
|
||||||
|
#define SX126X_MAX_POWER 8
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user