diff --git a/bin/version.sh b/bin/version.sh index b918e13a1..1ff41ed0f 100644 --- a/bin/version.sh +++ b/bin/version.sh @@ -1,3 +1,3 @@ -export VERSION=0.7.5 \ No newline at end of file +export VERSION=0.7.6 \ No newline at end of file diff --git a/docs/software/TODO.md b/docs/software/TODO.md index 0c742665d..e01d525b4 100644 --- a/docs/software/TODO.md +++ b/docs/software/TODO.md @@ -1,11 +1,19 @@ # High priority - 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) - E22 bringup - encryption review findings writeup + - 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 @@ -60,6 +68,7 @@ Items after the first final candidate release. - add a watchdog timer - handle millis() rollover in GPS.getTime - otherwise we will break after 50 days - 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 diff --git a/src/configuration.h b/src/configuration.h index 3a6626cf3..a85ff5f5f 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -172,6 +172,13 @@ along with this program. If not, see . // This string must exactly match the case used in release file names or the android updater won't work #define HW_VENDOR "heltec" +// the default ESP32 Pin of 15 is the Oled SCL, set to 36 and 37 and works fine. +//Tested on Neo6m module. +#undef GPS_RX_PIN +#undef GPS_TX_PIN +#define GPS_RX_PIN 36 +#define GPS_TX_PIN 37 + #ifndef USE_JTAG // gpio15 is TDO for JTAG, so no I2C on this board while doing jtag #define I2C_SDA 4 // I2C pins for this board #define I2C_SCL 15 diff --git a/src/esp32/BluetoothUtil.cpp b/src/esp32/BluetoothUtil.cpp index 2833a7ede..8d6b5d7d3 100644 --- a/src/esp32/BluetoothUtil.cpp +++ b/src/esp32/BluetoothUtil.cpp @@ -8,7 +8,6 @@ SimpleAllocator btPool; - bool _BLEClientConnected = false; 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)); - 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 SerialNumberCharacteristic(BLEUUID((uint16_t) ESP_GATT_UUID_SERIAL_NUMBER_STR), // BLECharacteristic::PROPERTY_READ); @@ -106,7 +106,6 @@ BLEService *createDeviceInfomationService(BLEServer *server, std::string hwVendo return deviceInfoService; } - static BLECharacteristic *batteryLevelC; /** @@ -304,7 +303,11 @@ BLEServer *initBLE(StartBluetoothPinScreenCallback startBtPinScreen, StopBluetoo static BLESecurity security; // static to avoid allocs BLESecurity *pSecurity = &security; 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->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK); return pServer; diff --git a/src/esp32/main-esp32.cpp b/src/esp32/main-esp32.cpp index 2b4711d5e..45e2a1234 100644 --- a/src/esp32/main-esp32.cpp +++ b/src/esp32/main-esp32.cpp @@ -4,6 +4,7 @@ #include "configuration.h" #include "main.h" #include "power.h" +#include "sleep.h" #include "target_specific.h" bool bluetoothOn; @@ -154,6 +155,18 @@ void axp192Init() } #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() { uint32_t seed = esp_random(); @@ -165,6 +178,8 @@ void esp32Setup() DEBUG_MSG("Total PSRAM: %d\n", ESP.getPsramSize()); DEBUG_MSG("Free PSRAM: %d\n", ESP.getFreePsram()); + // enableModemSleep(); + #ifdef AXP192_SLAVE_ADDRESS axp192Init(); #endif diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp index 49cd0fe79..eebfb227e 100644 --- a/src/mesh/MeshService.cpp +++ b/src/mesh/MeshService.cpp @@ -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 (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 fromNum++; diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index e1ea45dd6..4e87ac773 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -30,7 +30,7 @@ DeviceState versions used to be defined in the .proto file but really only this #define here. */ -#define DEVICESTATE_CUR_VER 9 +#define DEVICESTATE_CUR_VER 10 #define DEVICESTATE_MIN_VER DEVICESTATE_CUR_VER #ifndef NO_ESP32 diff --git a/src/mesh/PacketHistory.cpp b/src/mesh/PacketHistory.cpp index 75005d408..3d1884ace 100644 --- a/src/mesh/PacketHistory.cpp +++ b/src/mesh/PacketHistory.cpp @@ -2,8 +2,6 @@ #include "configuration.h" #include "mesh-pb-constants.h" - - PacketHistory::PacketHistory() { 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.rxTimeMsec = now; 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; diff --git a/src/mesh/PhoneAPI.cpp b/src/mesh/PhoneAPI.cpp index ec071fa5f..59750d468 100644 --- a/src/mesh/PhoneAPI.cpp +++ b/src/mesh/PhoneAPI.cpp @@ -2,6 +2,7 @@ #include "MeshService.h" #include "NodeDB.h" #include "PowerFSM.h" +#include "RadioInterface.h" #include PhoneAPI::PhoneAPI() @@ -43,8 +44,7 @@ void PhoneAPI::handleToRadio(const uint8_t *buf, size_t bufLength) switch (toRadioScratch.which_variant) { case ToRadio_packet_tag: { 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, - p.decoded.which_payload, p.decoded.data.typ, bufLength); + printPacket("PACKET FROM PHONE", &p); service.handleToRadio(p); break; } diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 43d9a6696..4307b0a7d 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -24,6 +24,52 @@ separated by 2.16 MHz with respect to the adjacent channels. Channel zero starts // 1kb was too small #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() { assert(sizeof(PacketHeader) == 4 || sizeof(PacketHeader) == 16); // make sure the compiler did what we expected diff --git a/src/mesh/RadioInterface.h b/src/mesh/RadioInterface.h index 0617592ac..988034dbb 100644 --- a/src/mesh/RadioInterface.h +++ b/src/mesh/RadioInterface.h @@ -162,3 +162,6 @@ class SimRadio : public RadioInterface /// \return true if initialisation succeeded. virtual bool init() { return true; } }; + +/// Debug printing for packets +void printPacket(const char *prefix, const MeshPacket *p); \ No newline at end of file diff --git a/src/mesh/RadioLibInterface.cpp b/src/mesh/RadioLibInterface.cpp index 5239f8f60..8fb1ce781 100644 --- a/src/mesh/RadioLibInterface.cpp +++ b/src/mesh/RadioLibInterface.cpp @@ -114,8 +114,8 @@ bool RadioLibInterface::canSendImmediately() /// bluetooth comms code. If the txmit queue is empty it might return an error 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, - rxGood, rxBad); + printPacket("enqueuing for send", p); + DEBUG_MSG("txGood=%d,rxGood=%d,rxBad=%d\n", txGood, rxGood, rxBad); 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 @@ -237,7 +237,7 @@ void RadioLibInterface::completeSending() { if (sendingPacket) { 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 packetPool.release(sendingPacket); @@ -291,7 +291,7 @@ void RadioLibInterface::handleReceiveInterrupt() memcpy(mp->encrypted.bytes, payload, 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); } @@ -301,7 +301,7 @@ void RadioLibInterface::handleReceiveInterrupt() /** start an immediate transmit */ 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 size_t numbytes = beginSending(txp); diff --git a/src/mesh/ReliableRouter.cpp b/src/mesh/ReliableRouter.cpp index 3499c51b6..acec6b7f9 100644 --- a/src/mesh/ReliableRouter.cpp +++ b/src/mesh/ReliableRouter.cpp @@ -27,7 +27,7 @@ ErrorCode ReliableRouter::send(MeshPacket *p) bool ReliableRouter::shouldFilterReceived(const MeshPacket *p) { 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. // If this is the first time we saw this, cancel any retransmissions we have queued up and generate an internal ack for diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp index bbf03944f..444ccc7ad 100644 --- a/src/mesh/Router.cpp +++ b/src/mesh/Router.cpp @@ -150,8 +150,8 @@ ErrorCode Router::send(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); - // FIXME, update nodedb + DEBUG_MSG("FIXME-update-db Sniffing packet\n"); + // FIXME, update nodedb here for any packet that passes through us } bool Router::perhapsDecode(MeshPacket *p) @@ -202,7 +202,7 @@ void Router::handleReceived(MeshPacket *p) sniffReceived(p); 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); } } diff --git a/src/sleep.cpp b/src/sleep.cpp index 8cb0f6798..2dfee04fb 100644 --- a/src/sleep.cpp +++ b/src/sleep.cpp @@ -291,7 +291,7 @@ esp_sleep_wakeup_cause_t doLightSleep(uint64_t sleepMsec) // FIXME, use a more r } #endif -#if 0 + // 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 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; DEBUG_MSG("Sleep request result %x\n", esp_pm_configure(&config)); } -#endif + diff --git a/src/sleep.h b/src/sleep.h index 66eafa611..800100119 100644 --- a/src/sleep.h +++ b/src/sleep.h @@ -34,4 +34,6 @@ extern Observable preflightSleep; extern Observable notifySleep; /// Called to tell observers we are now entering (deep) sleep and you should prepare. Must return 0 -extern Observable notifyDeepSleep; \ No newline at end of file +extern Observable notifyDeepSleep; + +void enableModemSleep(); \ No newline at end of file