mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-26 01:52:48 +00:00
commit
0e9ed1e82f
@ -1,3 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
export VERSION=0.7.5
|
export VERSION=0.7.6
|
@ -1,11 +1,19 @@
|
|||||||
# High priority
|
# High priority
|
||||||
|
|
||||||
- why is the net so chatty now?
|
- why is the net so chatty now?
|
||||||
- do a release
|
- modem sleep should work if we lower serial rate to 115kb?
|
||||||
- device wakes, turns BLE on and phone doesn't notice (while phone was sitting in auto-connect)
|
- device wakes, turns BLE on and phone doesn't notice (while phone was sitting in auto-connect)
|
||||||
- E22 bringup
|
- E22 bringup
|
||||||
- encryption review findings writeup
|
- encryption review findings writeup
|
||||||
|
|
||||||
- turn on modem-sleep mode - https://github.com/espressif/arduino-esp32/issues/1142#issuecomment-512428852
|
- turn on modem-sleep mode - https://github.com/espressif/arduino-esp32/issues/1142#issuecomment-512428852
|
||||||
|
last EDF release in arduino is: https://github.com/espressif/arduino-esp32/commit/1977370e6fc069e93ffd8818798fbfda27ae7d99
|
||||||
|
IDF release/v3.3 46b12a560
|
||||||
|
IDF release/v3.3 367c3c09c
|
||||||
|
https://docs.espressif.com/projects/esp-idf/en/release-v3.3/get-started/linux-setup.html
|
||||||
|
kevinh@kevin-server:~/development/meshtastic/esp32-arduino-lib-builder$ python /home/kevinh/development/meshtastic/esp32-arduino-lib-builder/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dout --flash_freq 40m --flash_size detect 0x1000 /home/kevinh/development/meshtastic/esp32-arduino-lib-builder/build/bootloader/bootloader.bin
|
||||||
|
cp -a out/tools/sdk/* components/arduino/tools/sdk
|
||||||
|
cp -ar components/arduino/* ~/.platformio/packages/framework-arduinoespressif32@src-fba9d33740f719f712e9f8b07da6ea13/
|
||||||
|
|
||||||
# Medium priority
|
# Medium priority
|
||||||
|
|
||||||
@ -60,6 +68,7 @@ Items after the first final candidate release.
|
|||||||
- add a watchdog timer
|
- add a watchdog timer
|
||||||
- handle millis() rollover in GPS.getTime - otherwise we will break after 50 days
|
- handle millis() rollover in GPS.getTime - otherwise we will break after 50 days
|
||||||
- report esp32 device code bugs back to the mothership via android
|
- report esp32 device code bugs back to the mothership via android
|
||||||
|
- change BLE bonding to something more secure. see comment by pSecurity->setAuthenticationMode(ESP_LE_AUTH_BOND)
|
||||||
|
|
||||||
# Spinoff project ideas
|
# Spinoff project ideas
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
SimpleAllocator btPool;
|
SimpleAllocator btPool;
|
||||||
|
|
||||||
|
|
||||||
bool _BLEClientConnected = false;
|
bool _BLEClientConnected = false;
|
||||||
|
|
||||||
class MyServerCallbacks : public BLEServerCallbacks
|
class MyServerCallbacks : public BLEServerCallbacks
|
||||||
@ -67,7 +66,8 @@ BLEService *createDeviceInfomationService(BLEServer *server, std::string hwVendo
|
|||||||
{
|
{
|
||||||
BLEService *deviceInfoService = server->createService(BLEUUID((uint16_t)ESP_GATT_UUID_DEVICE_INFO_SVC));
|
BLEService *deviceInfoService = server->createService(BLEUUID((uint16_t)ESP_GATT_UUID_DEVICE_INFO_SVC));
|
||||||
|
|
||||||
BLECharacteristic *swC = new BLECharacteristic(BLEUUID((uint16_t)ESP_GATT_UUID_SW_VERSION_STR), BLECharacteristic::PROPERTY_READ);
|
BLECharacteristic *swC =
|
||||||
|
new BLECharacteristic(BLEUUID((uint16_t)ESP_GATT_UUID_SW_VERSION_STR), BLECharacteristic::PROPERTY_READ);
|
||||||
BLECharacteristic *mfC = new BLECharacteristic(BLEUUID((uint16_t)ESP_GATT_UUID_MANU_NAME), BLECharacteristic::PROPERTY_READ);
|
BLECharacteristic *mfC = new BLECharacteristic(BLEUUID((uint16_t)ESP_GATT_UUID_MANU_NAME), BLECharacteristic::PROPERTY_READ);
|
||||||
// BLECharacteristic SerialNumberCharacteristic(BLEUUID((uint16_t) ESP_GATT_UUID_SERIAL_NUMBER_STR),
|
// BLECharacteristic SerialNumberCharacteristic(BLEUUID((uint16_t) ESP_GATT_UUID_SERIAL_NUMBER_STR),
|
||||||
// BLECharacteristic::PROPERTY_READ);
|
// BLECharacteristic::PROPERTY_READ);
|
||||||
@ -106,7 +106,6 @@ BLEService *createDeviceInfomationService(BLEServer *server, std::string hwVendo
|
|||||||
return deviceInfoService;
|
return deviceInfoService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static BLECharacteristic *batteryLevelC;
|
static BLECharacteristic *batteryLevelC;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -304,7 +303,11 @@ BLEServer *initBLE(StartBluetoothPinScreenCallback startBtPinScreen, StopBluetoo
|
|||||||
static BLESecurity security; // static to avoid allocs
|
static BLESecurity security; // static to avoid allocs
|
||||||
BLESecurity *pSecurity = &security;
|
BLESecurity *pSecurity = &security;
|
||||||
pSecurity->setCapability(ESP_IO_CAP_OUT);
|
pSecurity->setCapability(ESP_IO_CAP_OUT);
|
||||||
|
|
||||||
|
// FIXME - really should be ESP_LE_AUTH_REQ_SC_BOND but it seems there is a bug right now causing that bonding info to be lost
|
||||||
|
// occasionally?
|
||||||
pSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_BOND);
|
pSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_BOND);
|
||||||
|
|
||||||
pSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK);
|
pSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK);
|
||||||
|
|
||||||
return pServer;
|
return pServer;
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
|
#include "sleep.h"
|
||||||
#include "target_specific.h"
|
#include "target_specific.h"
|
||||||
|
|
||||||
bool bluetoothOn;
|
bool bluetoothOn;
|
||||||
@ -154,6 +155,18 @@ void axp192Init()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
static void printBLEinfo() {
|
||||||
|
int dev_num = esp_ble_get_bond_device_num();
|
||||||
|
|
||||||
|
esp_ble_bond_dev_t *dev_list = (esp_ble_bond_dev_t *)malloc(sizeof(esp_ble_bond_dev_t) * dev_num);
|
||||||
|
esp_ble_get_bond_device_list(&dev_num, dev_list);
|
||||||
|
for (int i = 0; i < dev_num; i++) {
|
||||||
|
// esp_ble_remove_bond_device(dev_list[i].bd_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
} */
|
||||||
|
|
||||||
void esp32Setup()
|
void esp32Setup()
|
||||||
{
|
{
|
||||||
uint32_t seed = esp_random();
|
uint32_t seed = esp_random();
|
||||||
@ -165,6 +178,8 @@ void esp32Setup()
|
|||||||
DEBUG_MSG("Total PSRAM: %d\n", ESP.getPsramSize());
|
DEBUG_MSG("Total PSRAM: %d\n", ESP.getPsramSize());
|
||||||
DEBUG_MSG("Free PSRAM: %d\n", ESP.getFreePsram());
|
DEBUG_MSG("Free PSRAM: %d\n", ESP.getFreePsram());
|
||||||
|
|
||||||
|
// enableModemSleep();
|
||||||
|
|
||||||
#ifdef AXP192_SLAVE_ADDRESS
|
#ifdef AXP192_SLAVE_ADDRESS
|
||||||
axp192Init();
|
axp192Init();
|
||||||
#endif
|
#endif
|
||||||
|
@ -160,7 +160,7 @@ int MeshService::handleFromRadio(const MeshPacket *mp)
|
|||||||
|
|
||||||
// If we veto a received User packet, we don't put it into the DB or forward it to the phone (to prevent confusing it)
|
// If we veto a received User packet, we don't put it into the DB or forward it to the phone (to prevent confusing it)
|
||||||
if (mp) {
|
if (mp) {
|
||||||
DEBUG_MSG("Forwarding to phone, from=0x%x, rx_time=%u\n", mp->from, mp->rx_time);
|
printPacket("Forwarding to phone", mp);
|
||||||
nodeDB.updateFrom(*mp); // update our DB state based off sniffing every RX packet from the radio
|
nodeDB.updateFrom(*mp); // update our DB state based off sniffing every RX packet from the radio
|
||||||
|
|
||||||
fromNum++;
|
fromNum++;
|
||||||
|
@ -30,7 +30,7 @@ DeviceState versions used to be defined in the .proto file but really only this
|
|||||||
#define here.
|
#define here.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DEVICESTATE_CUR_VER 9
|
#define DEVICESTATE_CUR_VER 10
|
||||||
#define DEVICESTATE_MIN_VER DEVICESTATE_CUR_VER
|
#define DEVICESTATE_MIN_VER DEVICESTATE_CUR_VER
|
||||||
|
|
||||||
#ifndef NO_ESP32
|
#ifndef NO_ESP32
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "mesh-pb-constants.h"
|
#include "mesh-pb-constants.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PacketHistory::PacketHistory()
|
PacketHistory::PacketHistory()
|
||||||
{
|
{
|
||||||
recentPackets.reserve(MAX_NUM_NODES); // Prealloc the worst case # of records - to prevent heap fragmentation
|
recentPackets.reserve(MAX_NUM_NODES); // Prealloc the worst case # of records - to prevent heap fragmentation
|
||||||
@ -48,7 +46,7 @@ bool PacketHistory::wasSeenRecently(const MeshPacket *p, bool withUpdate)
|
|||||||
r.sender = p->from;
|
r.sender = p->from;
|
||||||
r.rxTimeMsec = now;
|
r.rxTimeMsec = now;
|
||||||
recentPackets.push_back(r);
|
recentPackets.push_back(r);
|
||||||
DEBUG_MSG("Adding packet record for fr=0x%x,to=0x%x,id=%d\n", p->from, p->to, p->id);
|
printPacket("Adding packet record", p);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "MeshService.h"
|
#include "MeshService.h"
|
||||||
#include "NodeDB.h"
|
#include "NodeDB.h"
|
||||||
#include "PowerFSM.h"
|
#include "PowerFSM.h"
|
||||||
|
#include "RadioInterface.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
PhoneAPI::PhoneAPI()
|
PhoneAPI::PhoneAPI()
|
||||||
@ -43,8 +44,7 @@ void PhoneAPI::handleToRadio(const uint8_t *buf, size_t bufLength)
|
|||||||
switch (toRadioScratch.which_variant) {
|
switch (toRadioScratch.which_variant) {
|
||||||
case ToRadio_packet_tag: {
|
case ToRadio_packet_tag: {
|
||||||
MeshPacket &p = toRadioScratch.variant.packet;
|
MeshPacket &p = toRadioScratch.variant.packet;
|
||||||
DEBUG_MSG("PACKET FROM PHONE: id=%d, to=%x, want_ack=%d, which1=%d, which2=%d, typ=%d, buflen=%d\n", p.id, p.to, p.want_ack, p.which_payload,
|
printPacket("PACKET FROM PHONE", &p);
|
||||||
p.decoded.which_payload, p.decoded.data.typ, bufLength);
|
|
||||||
service.handleToRadio(p);
|
service.handleToRadio(p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,52 @@ separated by 2.16 MHz with respect to the adjacent channels. Channel zero starts
|
|||||||
// 1kb was too small
|
// 1kb was too small
|
||||||
#define RADIO_STACK_SIZE 4096
|
#define RADIO_STACK_SIZE 4096
|
||||||
|
|
||||||
|
void printPacket(const char *prefix, const MeshPacket *p)
|
||||||
|
{
|
||||||
|
DEBUG_MSG("%s (id=0x%08x Fr0x%02x To0x%02x, WantAck%d, HopLim%d", prefix, p->id, p->from & 0xff, p->to & 0xff, p->want_ack,
|
||||||
|
p->hop_limit);
|
||||||
|
if (p->which_payload == MeshPacket_decoded_tag) {
|
||||||
|
auto &s = p->decoded;
|
||||||
|
switch (s.which_payload) {
|
||||||
|
case SubPacket_data_tag:
|
||||||
|
DEBUG_MSG(" Payload:Data");
|
||||||
|
break;
|
||||||
|
case SubPacket_position_tag:
|
||||||
|
DEBUG_MSG(" Payload:Position");
|
||||||
|
break;
|
||||||
|
case SubPacket_user_tag:
|
||||||
|
DEBUG_MSG(" Payload:User");
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
DEBUG_MSG(" Payload:None");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
DEBUG_MSG(" Payload:%d", s.which_payload);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (s.want_response)
|
||||||
|
DEBUG_MSG(" WANTRESP");
|
||||||
|
|
||||||
|
if (s.source != 0)
|
||||||
|
DEBUG_MSG(" source=%08x", s.source);
|
||||||
|
|
||||||
|
if (s.dest != 0)
|
||||||
|
DEBUG_MSG(" dest=%08x", s.dest);
|
||||||
|
|
||||||
|
if (s.which_ack == SubPacket_success_id_tag)
|
||||||
|
DEBUG_MSG(" successId=%08x", s.ack.success_id);
|
||||||
|
else if (s.which_ack == SubPacket_fail_id_tag)
|
||||||
|
DEBUG_MSG(" failId=%08x", s.ack.fail_id);
|
||||||
|
} else {
|
||||||
|
DEBUG_MSG(" encrypted");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p->rx_time != 0) {
|
||||||
|
DEBUG_MSG(" rxtime=%u", p->rx_time);
|
||||||
|
}
|
||||||
|
DEBUG_MSG(")\n");
|
||||||
|
}
|
||||||
|
|
||||||
RadioInterface::RadioInterface()
|
RadioInterface::RadioInterface()
|
||||||
{
|
{
|
||||||
assert(sizeof(PacketHeader) == 4 || sizeof(PacketHeader) == 16); // make sure the compiler did what we expected
|
assert(sizeof(PacketHeader) == 4 || sizeof(PacketHeader) == 16); // make sure the compiler did what we expected
|
||||||
|
@ -162,3 +162,6 @@ class SimRadio : public RadioInterface
|
|||||||
/// \return true if initialisation succeeded.
|
/// \return true if initialisation succeeded.
|
||||||
virtual bool init() { return true; }
|
virtual bool init() { return true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Debug printing for packets
|
||||||
|
void printPacket(const char *prefix, const MeshPacket *p);
|
@ -114,8 +114,8 @@ bool RadioLibInterface::canSendImmediately()
|
|||||||
/// bluetooth comms code. If the txmit queue is empty it might return an error
|
/// bluetooth comms code. If the txmit queue is empty it might return an error
|
||||||
ErrorCode RadioLibInterface::send(MeshPacket *p)
|
ErrorCode RadioLibInterface::send(MeshPacket *p)
|
||||||
{
|
{
|
||||||
DEBUG_MSG("enqueuing for send on mesh fr=0x%x,to=0x%x,id=%d (txGood=%d,rxGood=%d,rxBad=%d)\n", p->from, p->to, p->id, txGood,
|
printPacket("enqueuing for send", p);
|
||||||
rxGood, rxBad);
|
DEBUG_MSG("txGood=%d,rxGood=%d,rxBad=%d\n", txGood, rxGood, rxBad);
|
||||||
ErrorCode res = txQueue.enqueue(p, 0) ? ERRNO_OK : ERRNO_UNKNOWN;
|
ErrorCode res = txQueue.enqueue(p, 0) ? ERRNO_OK : ERRNO_UNKNOWN;
|
||||||
|
|
||||||
if (res != ERRNO_OK) { // we weren't able to queue it, so we must drop it to prevent leaks
|
if (res != ERRNO_OK) { // we weren't able to queue it, so we must drop it to prevent leaks
|
||||||
@ -237,7 +237,7 @@ void RadioLibInterface::completeSending()
|
|||||||
{
|
{
|
||||||
if (sendingPacket) {
|
if (sendingPacket) {
|
||||||
txGood++;
|
txGood++;
|
||||||
DEBUG_MSG("Completed sending to=0x%x, id=%u\n", sendingPacket->to, sendingPacket->id);
|
printPacket("Completed sending", sendingPacket);
|
||||||
|
|
||||||
// We are done sending that packet, release it
|
// We are done sending that packet, release it
|
||||||
packetPool.release(sendingPacket);
|
packetPool.release(sendingPacket);
|
||||||
@ -291,7 +291,7 @@ void RadioLibInterface::handleReceiveInterrupt()
|
|||||||
memcpy(mp->encrypted.bytes, payload, payloadLen);
|
memcpy(mp->encrypted.bytes, payload, payloadLen);
|
||||||
mp->encrypted.size = payloadLen;
|
mp->encrypted.size = payloadLen;
|
||||||
|
|
||||||
DEBUG_MSG("Lora RX interrupt from=0x%x, id=%u\n", mp->from, mp->id);
|
printPacket("Lora RX", mp);
|
||||||
|
|
||||||
deliverToReceiver(mp);
|
deliverToReceiver(mp);
|
||||||
}
|
}
|
||||||
@ -301,7 +301,7 @@ void RadioLibInterface::handleReceiveInterrupt()
|
|||||||
/** start an immediate transmit */
|
/** start an immediate transmit */
|
||||||
void RadioLibInterface::startSend(MeshPacket *txp)
|
void RadioLibInterface::startSend(MeshPacket *txp)
|
||||||
{
|
{
|
||||||
DEBUG_MSG("Starting low level send from=0x%x, to=0x%x, id=%u, want_ack=%d\n", txp->from, txp->to, txp->id, txp->want_ack);
|
printPacket("Starting low level send", txp);
|
||||||
setStandby(); // Cancel any already in process receives
|
setStandby(); // Cancel any already in process receives
|
||||||
|
|
||||||
size_t numbytes = beginSending(txp);
|
size_t numbytes = beginSending(txp);
|
||||||
|
@ -27,7 +27,7 @@ ErrorCode ReliableRouter::send(MeshPacket *p)
|
|||||||
bool ReliableRouter::shouldFilterReceived(const MeshPacket *p)
|
bool ReliableRouter::shouldFilterReceived(const MeshPacket *p)
|
||||||
{
|
{
|
||||||
if (p->to == NODENUM_BROADCAST && p->from == getNodeNum()) {
|
if (p->to == NODENUM_BROADCAST && p->from == getNodeNum()) {
|
||||||
DEBUG_MSG("Received someone rebroadcasting for us fr=0x%x,to=0x%x,id=%d\n", p->from, p->to, p->id);
|
printPacket("Rx someone rebroadcasting for us", p);
|
||||||
|
|
||||||
// We are seeing someone rebroadcast one of our broadcast attempts.
|
// We are seeing someone rebroadcast one of our broadcast attempts.
|
||||||
// If this is the first time we saw this, cancel any retransmissions we have queued up and generate an internal ack for
|
// If this is the first time we saw this, cancel any retransmissions we have queued up and generate an internal ack for
|
||||||
|
@ -150,8 +150,8 @@ ErrorCode Router::send(MeshPacket *p)
|
|||||||
*/
|
*/
|
||||||
void Router::sniffReceived(const MeshPacket *p)
|
void Router::sniffReceived(const MeshPacket *p)
|
||||||
{
|
{
|
||||||
DEBUG_MSG("FIXME-update-db Sniffing packet fr=0x%x,to=0x%x,id=%d\n", p->from, p->to, p->id);
|
DEBUG_MSG("FIXME-update-db Sniffing packet\n");
|
||||||
// FIXME, update nodedb
|
// FIXME, update nodedb here for any packet that passes through us
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Router::perhapsDecode(MeshPacket *p)
|
bool Router::perhapsDecode(MeshPacket *p)
|
||||||
@ -202,7 +202,7 @@ void Router::handleReceived(MeshPacket *p)
|
|||||||
sniffReceived(p);
|
sniffReceived(p);
|
||||||
|
|
||||||
if (p->to == NODENUM_BROADCAST || p->to == getNodeNum()) {
|
if (p->to == NODENUM_BROADCAST || p->to == getNodeNum()) {
|
||||||
DEBUG_MSG("Notifying observers of received packet fr=0x%x,to=0x%x,id=%d\n", p->from, p->to, p->id);
|
printPacket("Delivering rx packet", p);
|
||||||
notifyPacketReceived.notifyObservers(p);
|
notifyPacketReceived.notifyObservers(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -291,7 +291,7 @@ esp_sleep_wakeup_cause_t doLightSleep(uint64_t sleepMsec) // FIXME, use a more r
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
|
||||||
// not legal on the stock android ESP build
|
// not legal on the stock android ESP build
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -306,8 +306,8 @@ void enableModemSleep()
|
|||||||
static esp_pm_config_esp32_t config; // filled with zeros because bss
|
static esp_pm_config_esp32_t config; // filled with zeros because bss
|
||||||
|
|
||||||
config.max_freq_mhz = CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ;
|
config.max_freq_mhz = CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ;
|
||||||
config.min_freq_mhz = 10; // 10Mhz is minimum recommended
|
config.min_freq_mhz = 20; // 10Mhz is minimum recommended
|
||||||
config.light_sleep_enable = false;
|
config.light_sleep_enable = false;
|
||||||
DEBUG_MSG("Sleep request result %x\n", esp_pm_configure(&config));
|
DEBUG_MSG("Sleep request result %x\n", esp_pm_configure(&config));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
@ -35,3 +35,5 @@ extern Observable<void *> notifySleep;
|
|||||||
|
|
||||||
/// Called to tell observers we are now entering (deep) sleep and you should prepare. Must return 0
|
/// Called to tell observers we are now entering (deep) sleep and you should prepare. Must return 0
|
||||||
extern Observable<void *> notifyDeepSleep;
|
extern Observable<void *> notifyDeepSleep;
|
||||||
|
|
||||||
|
void enableModemSleep();
|
Loading…
Reference in New Issue
Block a user