mirror of
https://github.com/pelgraine/Meck.git
synced 2026-05-04 20:42:41 +02:00
The startOTAUpdate() is the same for all NRF52 boards. Use a common implementation for all boards that currently have a specific implementation. The following boards currently have an empty startOTAUpdate() for whatever reasons and therefore are not inheriting NRF52BoardOTA to keep the same state: Nano G2 Ultra, Seeed SenseCAP T1000-E, Wio WM1110. Signed-off-by: Frieder Schrempf <frieder@fris.de>
105 lines
3.1 KiB
C++
105 lines
3.1 KiB
C++
#if defined(NRF52_PLATFORM)
|
|
#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
|
|
float NRF52Board::getMCUTemperature() {
|
|
NRF_TEMP->TASKS_START = 1; // Start temperature measurement
|
|
|
|
long startTime = millis();
|
|
while (NRF_TEMP->EVENTS_DATARDY == 0) { // Wait for completion. Should complete in 50us
|
|
if(millis() - startTime > 5) { // To wait 5ms just in case
|
|
NRF_TEMP->TASKS_STOP = 1;
|
|
return NAN;
|
|
}
|
|
}
|
|
|
|
NRF_TEMP->EVENTS_DATARDY = 0; // Clear event flag
|
|
|
|
int32_t temp = NRF_TEMP->TEMP; // In 0.25 *C units
|
|
NRF_TEMP->TASKS_STOP = 1;
|
|
|
|
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
|