Merge pull request #1201 from fschrempf/nrf52-board-deduplication
NRF52 Board Code Deduplication
This commit is contained in:
@@ -1,6 +1,39 @@
|
|||||||
#if defined(NRF52_PLATFORM)
|
#if defined(NRF52_PLATFORM)
|
||||||
#include "NRF52Board.h"
|
#include "NRF52Board.h"
|
||||||
|
|
||||||
|
#include <bluefruit.h>
|
||||||
|
|
||||||
|
static BLEDfu bledfu;
|
||||||
|
|
||||||
|
static void connect_callback(uint16_t conn_handle) {
|
||||||
|
(void)conn_handle;
|
||||||
|
MESH_DEBUG_PRINTLN("BLE client connected");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
||||||
|
(void)conn_handle;
|
||||||
|
(void)reason;
|
||||||
|
|
||||||
|
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
||||||
|
}
|
||||||
|
|
||||||
|
void NRF52Board::begin() {
|
||||||
|
startup_reason = BD_STARTUP_NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NRF52BoardDCDC::begin() {
|
||||||
|
NRF52Board::begin();
|
||||||
|
|
||||||
|
// Enable DC/DC converter for improved power efficiency
|
||||||
|
uint8_t sd_enabled = 0;
|
||||||
|
sd_softdevice_is_enabled(&sd_enabled);
|
||||||
|
if (sd_enabled) {
|
||||||
|
sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
|
||||||
|
} else {
|
||||||
|
NRF_POWER->DCDCEN = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Temperature from NRF52 MCU
|
// Temperature from NRF52 MCU
|
||||||
float NRF52Board::getMCUTemperature() {
|
float NRF52Board::getMCUTemperature() {
|
||||||
NRF_TEMP->TASKS_START = 1; // Start temperature measurement
|
NRF_TEMP->TASKS_START = 1; // Start temperature measurement
|
||||||
@@ -20,4 +53,52 @@ float NRF52Board::getMCUTemperature() {
|
|||||||
|
|
||||||
return temp * 0.25f; // Convert to *C
|
return temp * 0.25f; // Convert to *C
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NRF52BoardOTA::startOTAUpdate(const char *id, char reply[]) {
|
||||||
|
// Config the peripheral connection with maximum bandwidth
|
||||||
|
// more SRAM required by SoftDevice
|
||||||
|
// Note: All config***() function must be called before begin()
|
||||||
|
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
||||||
|
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
||||||
|
|
||||||
|
Bluefruit.begin(1, 0);
|
||||||
|
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
||||||
|
Bluefruit.setTxPower(4);
|
||||||
|
// Set the BLE device name
|
||||||
|
Bluefruit.setName(ota_name);
|
||||||
|
|
||||||
|
Bluefruit.Periph.setConnectCallback(connect_callback);
|
||||||
|
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
||||||
|
|
||||||
|
// To be consistent OTA DFU should be added first if it exists
|
||||||
|
bledfu.begin();
|
||||||
|
|
||||||
|
// Set up and start advertising
|
||||||
|
// Advertising packet
|
||||||
|
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
||||||
|
Bluefruit.Advertising.addTxPower();
|
||||||
|
Bluefruit.Advertising.addName();
|
||||||
|
|
||||||
|
/* Start Advertising
|
||||||
|
- Enable auto advertising if disconnected
|
||||||
|
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
||||||
|
- Timeout for fast mode is 30 seconds
|
||||||
|
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
||||||
|
|
||||||
|
For recommended advertising interval
|
||||||
|
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
||||||
|
*/
|
||||||
|
Bluefruit.Advertising.restartOnDisconnect(true);
|
||||||
|
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
||||||
|
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
||||||
|
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
||||||
|
|
||||||
|
uint8_t mac_addr[6];
|
||||||
|
memset(mac_addr, 0, sizeof(mac_addr));
|
||||||
|
Bluefruit.getAddr(mac_addr);
|
||||||
|
sprintf(reply, "OK - mac: %02X:%02X:%02X:%02X:%02X:%02X", mac_addr[5], mac_addr[4], mac_addr[3],
|
||||||
|
mac_addr[2], mac_addr[1], mac_addr[0]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -6,7 +6,34 @@
|
|||||||
#if defined(NRF52_PLATFORM)
|
#if defined(NRF52_PLATFORM)
|
||||||
|
|
||||||
class NRF52Board : public mesh::MainBoard {
|
class NRF52Board : public mesh::MainBoard {
|
||||||
|
protected:
|
||||||
|
uint8_t startup_reason;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
float getMCUTemperature() override;
|
virtual void begin();
|
||||||
|
virtual uint8_t getStartupReason() const override { return startup_reason; }
|
||||||
|
virtual float getMCUTemperature() override;
|
||||||
|
virtual void reboot() override { NVIC_SystemReset(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The NRF52 has an internal DC/DC regulator that allows increased efficiency
|
||||||
|
* compared to the LDO regulator. For being able to use it, the module/board
|
||||||
|
* needs to have the required inductors and and capacitors populated. If the
|
||||||
|
* hardware requirements are met, this subclass can be used to enable the DC/DC
|
||||||
|
* regulator.
|
||||||
|
*/
|
||||||
|
class NRF52BoardDCDC : virtual public NRF52Board {
|
||||||
|
public:
|
||||||
|
virtual void begin() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class NRF52BoardOTA : virtual public NRF52Board {
|
||||||
|
private:
|
||||||
|
char *ota_name;
|
||||||
|
|
||||||
|
public:
|
||||||
|
NRF52BoardOTA(char *name) : ota_name(name) {}
|
||||||
|
virtual bool startOTAUpdate(const char *id, char reply[]) override;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@@ -1,28 +1,10 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "MeshSolarBoard.h"
|
|
||||||
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
#include "MeshSolarBoard.h"
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle)
|
|
||||||
{
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason)
|
|
||||||
{
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void MeshSolarBoard::begin() {
|
void MeshSolarBoard::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
|
|
||||||
meshSolarStart();
|
meshSolarStart();
|
||||||
|
|
||||||
@@ -32,46 +14,3 @@ void MeshSolarBoard::begin() {
|
|||||||
|
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MeshSolarBoard::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("MESH_SOLAR_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -20,14 +20,10 @@
|
|||||||
#define SX126X_DIO2_AS_RF_SWITCH true
|
#define SX126X_DIO2_AS_RF_SWITCH true
|
||||||
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
||||||
|
|
||||||
|
class MeshSolarBoard : public NRF52BoardOTA {
|
||||||
class MeshSolarBoard : public NRF52Board {
|
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
MeshSolarBoard() : NRF52BoardOTA("MESH_SOLAR_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
return meshSolarGetBattVoltage();
|
return meshSolarGetBattVoltage();
|
||||||
@@ -36,10 +32,4 @@ public:
|
|||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "Heltec Mesh Solar";
|
return "Heltec Mesh Solar";
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,25 +2,9 @@
|
|||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include <bluefruit.h>
|
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void T114Board::begin() {
|
void T114Board::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
NRF_POWER->DCDCEN = 1;
|
NRF_POWER->DCDCEN = 1;
|
||||||
|
|
||||||
pinMode(PIN_VBAT_READ, INPUT);
|
pinMode(PIN_VBAT_READ, INPUT);
|
||||||
@@ -39,47 +23,4 @@ void T114Board::begin() {
|
|||||||
pinMode(SX126X_POWER_EN, OUTPUT);
|
pinMode(SX126X_POWER_EN, OUTPUT);
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
}
|
||||||
|
|
||||||
bool T114Board::startOTAUpdate(const char *id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("T114_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@@ -9,13 +9,10 @@
|
|||||||
#define PIN_BAT_CTL 6
|
#define PIN_BAT_CTL 6
|
||||||
#define MV_LSB (3000.0F / 4096.0F) // 12-bit ADC with 3.0V input range
|
#define MV_LSB (3000.0F / 4096.0F) // 12-bit ADC with 3.0V input range
|
||||||
|
|
||||||
class T114Board : public NRF52Board {
|
class T114Board : public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
T114Board() : NRF52BoardOTA("T114_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
#if defined(P_LORA_TX_LED)
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
@@ -44,10 +41,6 @@ public:
|
|||||||
return "Heltec T114";
|
return "Heltec T114";
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
#ifdef LED_PIN
|
#ifdef LED_PIN
|
||||||
digitalWrite(LED_PIN, HIGH);
|
digitalWrite(LED_PIN, HIGH);
|
||||||
@@ -58,6 +51,4 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,27 +2,11 @@
|
|||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include <bluefruit.h>
|
|
||||||
|
|
||||||
#include "IkokaNrf52Board.h"
|
#include "IkokaNrf52Board.h"
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void IkokaNrf52Board::begin() {
|
void IkokaNrf52Board::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
|
|
||||||
// ensure we have pull ups on the screen i2c, this isn't always available
|
// ensure we have pull ups on the screen i2c, this isn't always available
|
||||||
// in hardware and it should only be 20k ohms. Disable the pullups if we
|
// in hardware and it should only be 20k ohms. Disable the pullups if we
|
||||||
@@ -53,48 +37,4 @@ void IkokaNrf52Board::begin() {
|
|||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IkokaNrf52Board::startOTAUpdate(const char *id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("XIAO_NRF52_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,17 +1,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <MeshCore.h>
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
#include <MeshCore.h>
|
||||||
|
#include <helpers/NRF52Board.h>
|
||||||
|
|
||||||
#ifdef IKOKA_NRF52
|
#ifdef IKOKA_NRF52
|
||||||
|
|
||||||
class IkokaNrf52Board : public mesh::MainBoard {
|
class IkokaNrf52Board : public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
IkokaNrf52Board() : NRF52BoardOTA("XIAO_NRF52_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
#if defined(P_LORA_TX_LED)
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
@@ -41,12 +39,6 @@ public:
|
|||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "Ikoka Handheld E22 30dBm (Xiao_nrf52)";
|
return "Ikoka Handheld E22 30dBm (Xiao_nrf52)";
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,28 +1,12 @@
|
|||||||
#ifdef XIAO_NRF52
|
#ifdef XIAO_NRF52
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "IkokaNanoNRFBoard.h"
|
|
||||||
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
#include "IkokaNanoNRFBoard.h"
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void IkokaNanoNRFBoard::begin() {
|
void IkokaNanoNRFBoard::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
|
|
||||||
pinMode(PIN_VBAT, INPUT);
|
pinMode(PIN_VBAT, INPUT);
|
||||||
pinMode(VBAT_ENABLE, OUTPUT);
|
pinMode(VBAT_ENABLE, OUTPUT);
|
||||||
@@ -48,47 +32,4 @@ void IkokaNanoNRFBoard::begin() {
|
|||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IkokaNanoNRFBoard::startOTAUpdate(const char *id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("XIAO_NRF52_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -6,13 +6,10 @@
|
|||||||
|
|
||||||
#ifdef XIAO_NRF52
|
#ifdef XIAO_NRF52
|
||||||
|
|
||||||
class IkokaNanoNRFBoard : public NRF52Board {
|
class IkokaNanoNRFBoard : public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
IkokaNanoNRFBoard() : NRF52BoardOTA("XIAO_NRF52_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
#if defined(P_LORA_TX_LED)
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
@@ -50,12 +47,6 @@ public:
|
|||||||
const char *getManufacturerName() const override {
|
const char *getManufacturerName() const override {
|
||||||
return MANUFACTURER_STRING;
|
return MANUFACTURER_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool startOTAUpdate(const char *id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,28 +1,12 @@
|
|||||||
#ifdef XIAO_NRF52
|
#ifdef XIAO_NRF52
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "IkokaStickNRFBoard.h"
|
|
||||||
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
#include "IkokaStickNRFBoard.h"
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void IkokaStickNRFBoard::begin() {
|
void IkokaStickNRFBoard::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
|
|
||||||
pinMode(PIN_VBAT, INPUT);
|
pinMode(PIN_VBAT, INPUT);
|
||||||
pinMode(VBAT_ENABLE, OUTPUT);
|
pinMode(VBAT_ENABLE, OUTPUT);
|
||||||
@@ -48,47 +32,4 @@ void IkokaStickNRFBoard::begin() {
|
|||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IkokaStickNRFBoard::startOTAUpdate(const char *id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("XIAO_NRF52_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -6,13 +6,10 @@
|
|||||||
|
|
||||||
#ifdef XIAO_NRF52
|
#ifdef XIAO_NRF52
|
||||||
|
|
||||||
class IkokaStickNRFBoard : public NRF52Board {
|
class IkokaStickNRFBoard : public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
IkokaStickNRFBoard() : NRF52BoardOTA("XIAO_NRF52_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
#if defined(P_LORA_TX_LED)
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
@@ -50,12 +47,6 @@ public:
|
|||||||
const char *getManufacturerName() const override {
|
const char *getManufacturerName() const override {
|
||||||
return MANUFACTURER_STRING;
|
return MANUFACTURER_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool startOTAUpdate(const char *id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,14 +1,10 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "KeepteenLT1Board.h"
|
|
||||||
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
#include "KeepteenLT1Board.h"
|
||||||
|
|
||||||
void KeepteenLT1Board::begin() {
|
void KeepteenLT1Board::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
btn_prev_state = HIGH;
|
btn_prev_state = HIGH;
|
||||||
|
|
||||||
pinMode(PIN_VBAT_READ, INPUT);
|
pinMode(PIN_VBAT_READ, INPUT);
|
||||||
@@ -18,58 +14,4 @@ void KeepteenLT1Board::begin() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool KeepteenLT1Board::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("KeepteenLT1_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@@ -4,16 +4,14 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
|
||||||
class KeepteenLT1Board : public NRF52Board {
|
class KeepteenLT1Board : public NRF52BoardOTA {
|
||||||
protected:
|
protected:
|
||||||
uint8_t startup_reason;
|
|
||||||
uint8_t btn_prev_state;
|
uint8_t btn_prev_state;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
KeepteenLT1Board() : NRF52BoardOTA("KeepteenLT1_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#define BATTERY_SAMPLES 8
|
#define BATTERY_SAMPLES 8
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
@@ -40,13 +38,7 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,28 +1,12 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
#include "TechoBoard.h"
|
#include "TechoBoard.h"
|
||||||
|
|
||||||
#ifdef LILYGO_TECHO
|
#ifdef LILYGO_TECHO
|
||||||
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void TechoBoard::begin() {
|
void TechoBoard::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
|
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
|
|
||||||
@@ -44,47 +28,4 @@ uint16_t TechoBoard::getBattMilliVolts() {
|
|||||||
// divider into account (providing the actual LIPO voltage)
|
// divider into account (providing the actual LIPO voltage)
|
||||||
return (uint16_t)((float)adcvalue * REAL_VBAT_MV_PER_LSB);
|
return (uint16_t)((float)adcvalue * REAL_VBAT_MV_PER_LSB);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TechoBoard::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("TECHO_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,19 +13,11 @@
|
|||||||
#define PIN_VBAT_READ (4)
|
#define PIN_VBAT_READ (4)
|
||||||
#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
|
#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
|
||||||
|
|
||||||
class TechoBoard : public NRF52Board {
|
class TechoBoard : public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
TechoBoard() : NRF52BoardOTA("TECHO_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
|
|
||||||
uint8_t getStartupReason() const override {
|
|
||||||
return startup_reason;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "LilyGo T-Echo";
|
return "LilyGo T-Echo";
|
||||||
@@ -49,8 +41,4 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,28 +1,12 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
#include "TechoBoard.h"
|
#include "TechoBoard.h"
|
||||||
|
|
||||||
#ifdef LILYGO_TECHO
|
#ifdef LILYGO_TECHO
|
||||||
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void TechoBoard::begin() {
|
void TechoBoard::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
|
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
|
|
||||||
@@ -44,47 +28,4 @@ uint16_t TechoBoard::getBattMilliVolts() {
|
|||||||
// divider into account (providing the actual LIPO voltage)
|
// divider into account (providing the actual LIPO voltage)
|
||||||
return (uint16_t)((float)adcvalue * REAL_VBAT_MV_PER_LSB);
|
return (uint16_t)((float)adcvalue * REAL_VBAT_MV_PER_LSB);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TechoBoard::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("TECHO_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,19 +13,11 @@
|
|||||||
#define PIN_VBAT_READ (4)
|
#define PIN_VBAT_READ (4)
|
||||||
#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
|
#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
|
||||||
|
|
||||||
class TechoBoard : public NRF52Board {
|
class TechoBoard : public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
TechoBoard() : NRF52BoardOTA("TECHO_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
|
|
||||||
uint8_t getStartupReason() const override {
|
|
||||||
return startup_reason;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "LilyGo T-Echo";
|
return "LilyGo T-Echo";
|
||||||
@@ -49,8 +41,4 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,72 +1,12 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "MeshPocket.h"
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
#include "MeshPocket.h"
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle)
|
|
||||||
{
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason)
|
|
||||||
{
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void HeltecMeshPocket::begin() {
|
void HeltecMeshPocket::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
pinMode(PIN_VBAT_READ, INPUT);
|
pinMode(PIN_VBAT_READ, INPUT);
|
||||||
|
|
||||||
pinMode(PIN_USER_BTN, INPUT);
|
pinMode(PIN_USER_BTN, INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HeltecMeshPocket::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("MESH_POCKET_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -9,15 +9,10 @@
|
|||||||
#define PIN_BAT_CTL 34
|
#define PIN_BAT_CTL 34
|
||||||
#define MV_LSB (3000.0F / 4096.0F) // 12-bit ADC with 3.0V input range
|
#define MV_LSB (3000.0F / 4096.0F) // 12-bit ADC with 3.0V input range
|
||||||
|
|
||||||
class HeltecMeshPocket : public NRF52Board {
|
class HeltecMeshPocket : public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
HeltecMeshPocket() : NRF52BoardOTA("MESH_POCKET_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
int adcvalue = 0;
|
int adcvalue = 0;
|
||||||
@@ -38,13 +33,7 @@ public:
|
|||||||
return "Heltec MeshPocket";
|
return "Heltec MeshPocket";
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "MinewsemiME25LS01Board.h"
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
#include <bluefruit.h>
|
#include "MinewsemiME25LS01Board.h"
|
||||||
|
|
||||||
void MinewsemiME25LS01Board::begin() {
|
void MinewsemiME25LS01Board::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
btn_prev_state = HIGH;
|
btn_prev_state = HIGH;
|
||||||
|
|
||||||
pinMode(PIN_VBAT_READ, INPUT);
|
pinMode(PIN_VBAT_READ, INPUT);
|
||||||
@@ -28,62 +26,4 @@ void MinewsemiME25LS01Board::begin() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool MinewsemiME25LS01Board::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("Minewsemi_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
@@ -20,13 +20,12 @@
|
|||||||
#define PIN_VBAT_READ BATTERY_PIN
|
#define PIN_VBAT_READ BATTERY_PIN
|
||||||
#define ADC_MULTIPLIER (1.815f) // dependent on voltage divider resistors. TODO: more accurate battery tracking
|
#define ADC_MULTIPLIER (1.815f) // dependent on voltage divider resistors. TODO: more accurate battery tracking
|
||||||
|
|
||||||
|
class MinewsemiME25LS01Board : public NRF52BoardOTA {
|
||||||
class MinewsemiME25LS01Board : public NRF52Board {
|
|
||||||
protected:
|
protected:
|
||||||
uint8_t startup_reason;
|
|
||||||
uint8_t btn_prev_state;
|
uint8_t btn_prev_state;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
MinewsemiME25LS01Board() : NRF52BoardOTA("Minewsemi_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
#define BATTERY_SAMPLES 8
|
#define BATTERY_SAMPLES 8
|
||||||
@@ -42,8 +41,6 @@ public:
|
|||||||
return (ADC_MULTIPLIER * raw);
|
return (ADC_MULTIPLIER * raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "Minewsemi";
|
return "Minewsemi";
|
||||||
}
|
}
|
||||||
@@ -79,11 +76,4 @@ public:
|
|||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
@@ -24,8 +24,7 @@ static void disconnect_callback(uint16_t conn_handle, uint8_t reason)
|
|||||||
|
|
||||||
void NanoG2Ultra::begin()
|
void NanoG2Ultra::begin()
|
||||||
{
|
{
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
|
|
||||||
// set user button
|
// set user button
|
||||||
pinMode(PIN_BUTTON1, INPUT);
|
pinMode(PIN_BUTTON1, INPUT);
|
||||||
|
|||||||
@@ -36,20 +36,13 @@
|
|||||||
#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
|
#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
|
||||||
|
|
||||||
class NanoG2Ultra : public NRF52Board {
|
class NanoG2Ultra : public NRF52Board {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void begin();
|
void begin();
|
||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
bool startOTAUpdate(const char *id, char reply[]) override;
|
bool startOTAUpdate(const char *id, char reply[]) override;
|
||||||
|
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
const char *getManufacturerName() const override { return "Nano G2 Ultra"; }
|
const char *getManufacturerName() const override { return "Nano G2 Ultra"; }
|
||||||
|
|
||||||
void reboot() override { NVIC_SystemReset(); }
|
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
// put GPS chip to sleep
|
// put GPS chip to sleep
|
||||||
digitalWrite(PIN_GPS_STANDBY, LOW);
|
digitalWrite(PIN_GPS_STANDBY, LOW);
|
||||||
|
|||||||
@@ -1,14 +1,10 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "PromicroBoard.h"
|
|
||||||
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
#include "PromicroBoard.h"
|
||||||
|
|
||||||
void PromicroBoard::begin() {
|
void PromicroBoard::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
btn_prev_state = HIGH;
|
btn_prev_state = HIGH;
|
||||||
|
|
||||||
pinMode(PIN_VBAT_READ, INPUT);
|
pinMode(PIN_VBAT_READ, INPUT);
|
||||||
@@ -26,58 +22,4 @@ void PromicroBoard::begin() {
|
|||||||
pinMode(SX126X_POWER_EN, OUTPUT);
|
pinMode(SX126X_POWER_EN, OUTPUT);
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
}
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PromicroBoard::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("ProMicro_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@@ -20,17 +20,15 @@
|
|||||||
#define PIN_VBAT_READ 17
|
#define PIN_VBAT_READ 17
|
||||||
#define ADC_MULTIPLIER (1.815f) // dependent on voltage divider resistors. TODO: more accurate battery tracking
|
#define ADC_MULTIPLIER (1.815f) // dependent on voltage divider resistors. TODO: more accurate battery tracking
|
||||||
|
|
||||||
class PromicroBoard : public NRF52Board {
|
class PromicroBoard : public NRF52BoardOTA {
|
||||||
protected:
|
protected:
|
||||||
uint8_t startup_reason;
|
|
||||||
uint8_t btn_prev_state;
|
uint8_t btn_prev_state;
|
||||||
float adc_mult = ADC_MULTIPLIER;
|
float adc_mult = ADC_MULTIPLIER;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
PromicroBoard() : NRF52BoardOTA("ProMicro_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#define BATTERY_SAMPLES 8
|
#define BATTERY_SAMPLES 8
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
@@ -75,13 +73,7 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,26 +1,10 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "RAK4631Board.h"
|
|
||||||
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
#include "RAK4631Board.h"
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void RAK4631Board::begin() {
|
void RAK4631Board::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52BoardDCDC::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
pinMode(PIN_VBAT_READ, INPUT);
|
pinMode(PIN_VBAT_READ, INPUT);
|
||||||
#ifdef PIN_USER_BTN
|
#ifdef PIN_USER_BTN
|
||||||
pinMode(PIN_USER_BTN, INPUT_PULLUP);
|
pinMode(PIN_USER_BTN, INPUT_PULLUP);
|
||||||
@@ -39,52 +23,4 @@ void RAK4631Board::begin() {
|
|||||||
pinMode(SX126X_POWER_EN, OUTPUT);
|
pinMode(SX126X_POWER_EN, OUTPUT);
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RAK4631Board::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("RAK4631_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
uint8_t mac_addr[6];
|
|
||||||
memset(mac_addr, 0, sizeof(mac_addr));
|
|
||||||
Bluefruit.getAddr(mac_addr);
|
|
||||||
sprintf(reply, "OK - mac: %02X:%02X:%02X:%02X:%02X:%02X",
|
|
||||||
mac_addr[5], mac_addr[4], mac_addr[3], mac_addr[2], mac_addr[1], mac_addr[0]);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@@ -29,13 +29,10 @@
|
|||||||
#define PIN_VBAT_READ 5
|
#define PIN_VBAT_READ 5
|
||||||
#define ADC_MULTIPLIER (3 * 1.73 * 1.187 * 1000)
|
#define ADC_MULTIPLIER (3 * 1.73 * 1.187 * 1000)
|
||||||
|
|
||||||
class RAK4631Board : public NRF52Board {
|
class RAK4631Board : public NRF52BoardDCDC, public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
RAK4631Board() : NRF52BoardOTA("RAK4631_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#define BATTERY_SAMPLES 8
|
#define BATTERY_SAMPLES 8
|
||||||
|
|
||||||
@@ -54,10 +51,4 @@ public:
|
|||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "RAK 4631";
|
return "RAK 4631";
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,35 +1,10 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "RAKWismeshTagBoard.h"
|
|
||||||
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
#include "RAKWismeshTagBoard.h"
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void RAKWismeshTagBoard::begin() {
|
void RAKWismeshTagBoard::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52BoardDCDC::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
|
|
||||||
// Enable DC/DC converter for improved power efficiency
|
|
||||||
uint8_t sd_enabled = 0;
|
|
||||||
sd_softdevice_is_enabled(&sd_enabled);
|
|
||||||
if (sd_enabled) {
|
|
||||||
sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
|
|
||||||
} else {
|
|
||||||
NRF_POWER->DCDCEN = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pinMode(PIN_VBAT_READ, INPUT);
|
pinMode(PIN_VBAT_READ, INPUT);
|
||||||
pinMode(PIN_USER_BTN, INPUT_PULLUP);
|
pinMode(PIN_USER_BTN, INPUT_PULLUP);
|
||||||
@@ -40,52 +15,4 @@ void RAKWismeshTagBoard::begin() {
|
|||||||
pinMode(SX126X_POWER_EN, OUTPUT);
|
pinMode(SX126X_POWER_EN, OUTPUT);
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RAKWismeshTagBoard::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("WISMESHTAG_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
uint8_t mac_addr[6];
|
|
||||||
memset(mac_addr, 0, sizeof(mac_addr));
|
|
||||||
Bluefruit.getAddr(mac_addr);
|
|
||||||
sprintf(reply, "OK - mac: %02X:%02X:%02X:%02X:%02X:%02X",
|
|
||||||
mac_addr[5], mac_addr[4], mac_addr[3], mac_addr[2], mac_addr[1], mac_addr[0]);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@@ -8,13 +8,10 @@
|
|||||||
#define PIN_VBAT_READ 5
|
#define PIN_VBAT_READ 5
|
||||||
#define ADC_MULTIPLIER (3 * 1.73 * 1.187 * 1000)
|
#define ADC_MULTIPLIER (3 * 1.73 * 1.187 * 1000)
|
||||||
|
|
||||||
class RAKWismeshTagBoard : public NRF52Board {
|
class RAKWismeshTagBoard : public NRF52BoardDCDC, public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
RAKWismeshTagBoard() : NRF52BoardOTA("WISMESHTAG_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED) && defined(LED_STATE_ON)
|
#if defined(P_LORA_TX_LED) && defined(LED_STATE_ON)
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
@@ -43,12 +40,6 @@ public:
|
|||||||
return "RAK WisMesh Tag";
|
return "RAK WisMesh Tag";
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
#ifdef BUZZER_EN
|
#ifdef BUZZER_EN
|
||||||
digitalWrite(BUZZER_EN, LOW);
|
digitalWrite(BUZZER_EN, LOW);
|
||||||
|
|||||||
@@ -1,26 +1,10 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "SenseCapSolarBoard.h"
|
|
||||||
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
#include "SenseCapSolarBoard.h"
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void SenseCapSolarBoard::begin() {
|
void SenseCapSolarBoard::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
|
|
||||||
#if defined(PIN_WIRE_SDA) && defined(PIN_WIRE_SCL)
|
#if defined(PIN_WIRE_SDA) && defined(PIN_WIRE_SCL)
|
||||||
Wire.setPins(PIN_WIRE_SDA, PIN_WIRE_SCL);
|
Wire.setPins(PIN_WIRE_SDA, PIN_WIRE_SCL);
|
||||||
@@ -34,48 +18,4 @@ void SenseCapSolarBoard::begin() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SenseCapSolarBoard::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("SENSECAP_SOLAR_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@@ -4,13 +4,10 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
|
||||||
class SenseCapSolarBoard : public NRF52Board {
|
class SenseCapSolarBoard : public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
SenseCapSolarBoard() : NRF52BoardOTA("SENSECAP_SOLAR_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
#if defined(P_LORA_TX_LED)
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
@@ -34,10 +31,4 @@ public:
|
|||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "Seeed SenseCap Solar";
|
return "Seeed SenseCap Solar";
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,23 +1,12 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "T1000eBoard.h"
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
#include <bluefruit.h>
|
#include "T1000eBoard.h"
|
||||||
|
|
||||||
void T1000eBoard::begin() {
|
void T1000eBoard::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52BoardDCDC::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
btn_prev_state = HIGH;
|
btn_prev_state = HIGH;
|
||||||
|
|
||||||
// Enable DC/DC converter for improved power efficiency
|
|
||||||
uint8_t sd_enabled = 0;
|
|
||||||
sd_softdevice_is_enabled(&sd_enabled);
|
|
||||||
if (sd_enabled) {
|
|
||||||
sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
|
|
||||||
} else {
|
|
||||||
NRF_POWER->DCDCEN = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BUTTON_PIN
|
#ifdef BUTTON_PIN
|
||||||
pinMode(BATTERY_PIN, INPUT);
|
pinMode(BATTERY_PIN, INPUT);
|
||||||
pinMode(BUTTON_PIN, INPUT);
|
pinMode(BUTTON_PIN, INPUT);
|
||||||
@@ -31,64 +20,4 @@ void T1000eBoard::begin() {
|
|||||||
Wire.begin();
|
Wire.begin();
|
||||||
|
|
||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static BLEDfu bledfu;
|
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool TrackerT1000eBoard::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("T1000E_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -4,9 +4,8 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
|
||||||
class T1000eBoard : public NRF52Board {
|
class T1000eBoard : public NRF52BoardDCDC {
|
||||||
protected:
|
protected:
|
||||||
uint8_t startup_reason;
|
|
||||||
uint8_t btn_prev_state;
|
uint8_t btn_prev_state;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -34,8 +33,6 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "Seeed Tracker T1000-e";
|
return "Seeed Tracker T1000-e";
|
||||||
}
|
}
|
||||||
@@ -93,9 +90,5 @@ public:
|
|||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
// bool startOTAUpdate(const char* id, char reply[]) override;
|
// bool startOTAUpdate(const char* id, char reply[]) override;
|
||||||
};
|
};
|
||||||
@@ -1,28 +1,12 @@
|
|||||||
#include "ThinkNodeM1Board.h"
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
#include "ThinkNodeM1Board.h"
|
||||||
|
|
||||||
#ifdef THINKNODE_M1
|
#ifdef THINKNODE_M1
|
||||||
|
|
||||||
#include <Wire.h>
|
|
||||||
#include <bluefruit.h>
|
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ThinkNodeM1Board::begin() {
|
void ThinkNodeM1Board::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52Board::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
|
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
|
|
||||||
@@ -49,47 +33,4 @@ uint16_t ThinkNodeM1Board::getBattMilliVolts() {
|
|||||||
// divider into account (providing the actual LIPO voltage)
|
// divider into account (providing the actual LIPO voltage)
|
||||||
return (uint16_t)((float)adcvalue * REAL_VBAT_MV_PER_LSB);
|
return (uint16_t)((float)adcvalue * REAL_VBAT_MV_PER_LSB);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ThinkNodeM1Board::startOTAUpdate(const char *id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("THINKNODE_M1_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,19 +13,11 @@
|
|||||||
#define PIN_VBAT_READ (4)
|
#define PIN_VBAT_READ (4)
|
||||||
#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
|
#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
|
||||||
|
|
||||||
class ThinkNodeM1Board : public NRF52Board {
|
class ThinkNodeM1Board : public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
ThinkNodeM1Board() : NRF52BoardOTA("THINKNODE_M1_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
|
|
||||||
uint8_t getStartupReason() const override {
|
|
||||||
return startup_reason;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
#if defined(P_LORA_TX_LED)
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
@@ -40,10 +32,6 @@ public:
|
|||||||
return "Elecrow ThinkNode-M1";
|
return "Elecrow ThinkNode-M1";
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
|
|
||||||
// turn off all leds, sd_power_system_off will not do this for us
|
// turn off all leds, sd_power_system_off will not do this for us
|
||||||
|
|||||||
@@ -1,37 +1,12 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "WioTrackerL1Board.h"
|
|
||||||
|
|
||||||
#include <bluefruit.h>
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
#include "WioTrackerL1Board.h"
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void WioTrackerL1Board::begin() {
|
void WioTrackerL1Board::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52BoardDCDC::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
btn_prev_state = HIGH;
|
btn_prev_state = HIGH;
|
||||||
|
|
||||||
// Enable DC/DC converter for improved power efficiency
|
|
||||||
uint8_t sd_enabled = 0;
|
|
||||||
sd_softdevice_is_enabled(&sd_enabled);
|
|
||||||
if (sd_enabled) {
|
|
||||||
sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
|
|
||||||
} else {
|
|
||||||
NRF_POWER->DCDCEN = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pinMode(PIN_VBAT_READ, INPUT); // VBAT ADC input
|
pinMode(PIN_VBAT_READ, INPUT); // VBAT ADC input
|
||||||
// Set all button pins to INPUT_PULLUP
|
// Set all button pins to INPUT_PULLUP
|
||||||
pinMode(PIN_BUTTON1, INPUT_PULLUP);
|
pinMode(PIN_BUTTON1, INPUT_PULLUP);
|
||||||
@@ -55,51 +30,3 @@ void WioTrackerL1Board::begin() {
|
|||||||
|
|
||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WioTrackerL1Board::startOTAUpdate(const char* id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("WioTrackerL1 OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
uint8_t mac_addr[6];
|
|
||||||
memset(mac_addr, 0, sizeof(mac_addr));
|
|
||||||
Bluefruit.getAddr(mac_addr);
|
|
||||||
sprintf(reply, "OK - mac: %02X:%02X:%02X:%02X:%02X:%02X",
|
|
||||||
mac_addr[5], mac_addr[4], mac_addr[3], mac_addr[2], mac_addr[1], mac_addr[0]);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,14 +4,13 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
|
||||||
class WioTrackerL1Board : public NRF52Board {
|
class WioTrackerL1Board : public NRF52BoardDCDC, public NRF52BoardOTA {
|
||||||
protected:
|
protected:
|
||||||
uint8_t startup_reason;
|
|
||||||
uint8_t btn_prev_state;
|
uint8_t btn_prev_state;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
WioTrackerL1Board() : NRF52BoardOTA("WioTrackerL1 OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
#if defined(P_LORA_TX_LED)
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
@@ -35,13 +34,7 @@ public:
|
|||||||
return "Seeed Wio Tracker L1";
|
return "Seeed Wio Tracker L1";
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -21,16 +21,7 @@ static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WioWM1110Board::begin() {
|
void WioWM1110Board::begin() {
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
NRF52BoardDCDC::begin();
|
||||||
|
|
||||||
// Enable DC/DC converter for improved power efficiency
|
|
||||||
uint8_t sd_enabled = 0;
|
|
||||||
sd_softdevice_is_enabled(&sd_enabled);
|
|
||||||
if (sd_enabled) {
|
|
||||||
sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
|
|
||||||
} else {
|
|
||||||
NRF_POWER->DCDCEN = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pinMode(BATTERY_PIN, INPUT);
|
pinMode(BATTERY_PIN, INPUT);
|
||||||
pinMode(LED_GREEN, OUTPUT);
|
pinMode(LED_GREEN, OUTPUT);
|
||||||
|
|||||||
@@ -11,13 +11,9 @@
|
|||||||
#endif
|
#endif
|
||||||
#define Serial Serial1
|
#define Serial Serial1
|
||||||
|
|
||||||
class WioWM1110Board : public NRF52Board {
|
class WioWM1110Board : public NRF52BoardDCDC {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#if defined(LED_GREEN)
|
#if defined(LED_GREEN)
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
@@ -41,10 +37,6 @@ public:
|
|||||||
return "Seeed Wio WM1110";
|
return "Seeed Wio WM1110";
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
bool startOTAUpdate(const char* id, char reply[]) override;
|
||||||
|
|
||||||
void enableSensorPower(bool enable) {
|
void enableSensorPower(bool enable) {
|
||||||
|
|||||||
@@ -2,36 +2,11 @@
|
|||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include <bluefruit.h>
|
|
||||||
|
|
||||||
#include "XiaoNrf52Board.h"
|
#include "XiaoNrf52Board.h"
|
||||||
|
|
||||||
static BLEDfu bledfu;
|
|
||||||
|
|
||||||
static void connect_callback(uint16_t conn_handle) {
|
|
||||||
(void)conn_handle;
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
|
|
||||||
(void)conn_handle;
|
|
||||||
(void)reason;
|
|
||||||
|
|
||||||
MESH_DEBUG_PRINTLN("BLE client disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void XiaoNrf52Board::begin() {
|
void XiaoNrf52Board::begin() {
|
||||||
// for future use, sub-classes SHOULD call this from their begin()
|
NRF52BoardDCDC::begin();
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
|
||||||
|
|
||||||
// Enable DC/DC converter for improved power efficiency
|
|
||||||
uint8_t sd_enabled = 0;
|
|
||||||
sd_softdevice_is_enabled(&sd_enabled);
|
|
||||||
if (sd_enabled) {
|
|
||||||
sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
|
|
||||||
} else {
|
|
||||||
NRF_POWER->DCDCEN = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pinMode(PIN_VBAT, INPUT);
|
pinMode(PIN_VBAT, INPUT);
|
||||||
pinMode(VBAT_ENABLE, OUTPUT);
|
pinMode(VBAT_ENABLE, OUTPUT);
|
||||||
@@ -57,48 +32,4 @@ void XiaoNrf52Board::begin() {
|
|||||||
delay(10); // give sx1262 some time to power up
|
delay(10); // give sx1262 some time to power up
|
||||||
}
|
}
|
||||||
|
|
||||||
bool XiaoNrf52Board::startOTAUpdate(const char *id, char reply[]) {
|
|
||||||
// Config the peripheral connection with maximum bandwidth
|
|
||||||
// more SRAM required by SoftDevice
|
|
||||||
// Note: All config***() function must be called before begin()
|
|
||||||
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
|
|
||||||
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
|
|
||||||
|
|
||||||
Bluefruit.begin(1, 0);
|
|
||||||
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
|
|
||||||
Bluefruit.setTxPower(4);
|
|
||||||
// Set the BLE device name
|
|
||||||
Bluefruit.setName("XIAO_NRF52_OTA");
|
|
||||||
|
|
||||||
Bluefruit.Periph.setConnectCallback(connect_callback);
|
|
||||||
Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
|
|
||||||
|
|
||||||
// To be consistent OTA DFU should be added first if it exists
|
|
||||||
bledfu.begin();
|
|
||||||
|
|
||||||
// Set up and start advertising
|
|
||||||
// Advertising packet
|
|
||||||
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
|
|
||||||
Bluefruit.Advertising.addTxPower();
|
|
||||||
Bluefruit.Advertising.addName();
|
|
||||||
|
|
||||||
/* Start Advertising
|
|
||||||
- Enable auto advertising if disconnected
|
|
||||||
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
|
|
||||||
- Timeout for fast mode is 30 seconds
|
|
||||||
- Start(timeout) with timeout = 0 will advertise forever (until connected)
|
|
||||||
|
|
||||||
For recommended advertising interval
|
|
||||||
https://developer.apple.com/library/content/qa/qa1931/_index.html
|
|
||||||
*/
|
|
||||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
|
||||||
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
|
|
||||||
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
|
|
||||||
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
|
|
||||||
|
|
||||||
strcpy(reply, "OK - started");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -6,13 +6,10 @@
|
|||||||
|
|
||||||
#ifdef XIAO_NRF52
|
#ifdef XIAO_NRF52
|
||||||
|
|
||||||
class XiaoNrf52Board : public NRF52Board {
|
class XiaoNrf52Board : public NRF52BoardDCDC, public NRF52BoardOTA {
|
||||||
protected:
|
|
||||||
uint8_t startup_reason;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
XiaoNrf52Board() : NRF52BoardOTA("XIAO_NRF52_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
#if defined(P_LORA_TX_LED)
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
@@ -43,10 +40,6 @@ public:
|
|||||||
return "Seeed Xiao-nrf52";
|
return "Seeed Xiao-nrf52";
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot() override {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
// set led on and wait for button release before poweroff
|
// set led on and wait for button release before poweroff
|
||||||
digitalWrite(PIN_LED, LOW);
|
digitalWrite(PIN_LED, LOW);
|
||||||
@@ -64,8 +57,6 @@ public:
|
|||||||
|
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Reference in New Issue
Block a user