From de03dc88f470ffd3cdbee2256e56c1dd26170a14 Mon Sep 17 00:00:00 2001 From: geeksville Date: Sat, 1 Feb 2020 16:14:34 -0800 Subject: [PATCH] bt to mesh code is written --- lib/BluetoothOTA/src/BluetoothUtil.cpp | 5 - lib/BluetoothOTA/src/MeshBluetoothService.h | 5 - .../src => src}/MeshBluetoothService.cpp | 4 + src/MeshBluetoothService.h | 6 + src/MeshRadio.cpp | 1 - src/main.ino | 317 ++++++++++-------- 6 files changed, 185 insertions(+), 153 deletions(-) delete mode 100644 lib/BluetoothOTA/src/MeshBluetoothService.h rename {lib/BluetoothOTA/src => src}/MeshBluetoothService.cpp (99%) create mode 100644 src/MeshBluetoothService.h diff --git a/lib/BluetoothOTA/src/BluetoothUtil.cpp b/lib/BluetoothOTA/src/BluetoothUtil.cpp index ccc7c447..07fad53c 100644 --- a/lib/BluetoothOTA/src/BluetoothUtil.cpp +++ b/lib/BluetoothOTA/src/BluetoothUtil.cpp @@ -1,6 +1,5 @@ #include "BluetoothUtil.h" #include "BluetoothSoftwareUpdate.h" -#include "MeshBluetoothService.h" #include #include #include @@ -122,14 +121,10 @@ BLEServer *initBLE(std::string deviceName) { BLEService *pUpdate = createUpdateService(pServer); // We need to advertise this so our android ble scan operation can see it pServer->getAdvertising()->addServiceUUID(pUpdate->getUUID()); - BLEService *pMesh = createMeshBluetoothService(pServer); // We need to advertise this so our android ble scan operation can see it - pServer->getAdvertising()->addServiceUUID(pMesh->getUUID()); - // start all our services (do this after creating all of them) pDevInfo->start(); pBattery->start(); pUpdate->start(); - pMesh->start(); // Start advertising pServer->getAdvertising()->start(); diff --git a/lib/BluetoothOTA/src/MeshBluetoothService.h b/lib/BluetoothOTA/src/MeshBluetoothService.h deleted file mode 100644 index f8854176..00000000 --- a/lib/BluetoothOTA/src/MeshBluetoothService.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include - -BLEService *createMeshBluetoothService(BLEServer* server); \ No newline at end of file diff --git a/lib/BluetoothOTA/src/MeshBluetoothService.cpp b/src/MeshBluetoothService.cpp similarity index 99% rename from lib/BluetoothOTA/src/MeshBluetoothService.cpp rename to src/MeshBluetoothService.cpp index 27149943..a82c7b39 100644 --- a/lib/BluetoothOTA/src/MeshBluetoothService.cpp +++ b/src/MeshBluetoothService.cpp @@ -205,3 +205,7 @@ BLEService *createMeshBluetoothService(BLEServer *server) return service; } + + + + diff --git a/src/MeshBluetoothService.h b/src/MeshBluetoothService.h new file mode 100644 index 00000000..117b1e9f --- /dev/null +++ b/src/MeshBluetoothService.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +BLEService *createMeshBluetoothService(BLEServer* server); + diff --git a/src/MeshRadio.cpp b/src/MeshRadio.cpp index 27fbe680..bc0520ad 100644 --- a/src/MeshRadio.cpp +++ b/src/MeshRadio.cpp @@ -84,7 +84,6 @@ void mesh_init() { } } - int16_t packetnum = 0; // packet counter, we increment per xmission void mesh_loop() diff --git a/src/main.ino b/src/main.ino index a573ebe1..378e4cc2 100644 --- a/src/main.ino +++ b/src/main.ino @@ -26,6 +26,7 @@ #include #include #include "BluetoothUtil.h" +#include "MeshBluetoothService.h" #include "MeshRadio.h" #ifdef T_BEAM_V10 @@ -50,47 +51,49 @@ esp_sleep_source_t wakeCause; // the reason we booted this time void doDeepSleep(uint64_t msecToWake) { - Serial.printf("Entering deep sleep for %llu seconds\n", msecToWake / 1000); + Serial.printf("Entering deep sleep for %llu seconds\n", msecToWake / 1000); - // not using wifi yet, but once we are this is needed to shutoff the radio hw - // esp_wifi_stop(); + // not using wifi yet, but once we are this is needed to shutoff the radio hw + // esp_wifi_stop(); - screen_off(); // datasheet says this will draw only 10ua - - // FIXME, shutdown radio headinterups before powering off device - - #ifdef T_BEAM_V10 - if(axp192_found) { - // turn on after initial testing with real hardware - axp.setPowerOutPut(AXP192_LDO2, AXP202_OFF); // LORA radio - axp.setPowerOutPut(AXP192_LDO3, AXP202_OFF); // GPS main power - } - #endif + screen_off(); // datasheet says this will draw only 10ua - // FIXME - use an external 10k pulldown so we can leave the RTC peripherals powered off - // until then we need the following lines - esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); + // FIXME, shutdown radio headinterups before powering off device -#ifdef BUTTON_PIN - // Only GPIOs which are have RTC functionality can be used in this bit map: 0,2,4,12-15,25-27,32-39. - uint64_t gpioMask = (1ULL << BUTTON_PIN); - - // FIXME change polarity so we can wake on ANY_HIGH instead - that would allow us to use all three buttons (instead of just the first) - gpio_pullup_en((gpio_num_t) BUTTON_PIN); - - esp_sleep_enable_ext1_wakeup(gpioMask, ESP_EXT1_WAKEUP_ALL_LOW); +#ifdef T_BEAM_V10 + if (axp192_found) + { + // turn on after initial testing with real hardware + axp.setPowerOutPut(AXP192_LDO2, AXP202_OFF); // LORA radio + axp.setPowerOutPut(AXP192_LDO3, AXP202_OFF); // GPS main power + } #endif - esp_sleep_enable_timer_wakeup(msecToWake * 1000ULL); // call expects usecs - esp_deep_sleep_start(); // TBD mA sleep current (battery) + // FIXME - use an external 10k pulldown so we can leave the RTC peripherals powered off + // until then we need the following lines + esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); + +#ifdef BUTTON_PIN + // Only GPIOs which are have RTC functionality can be used in this bit map: 0,2,4,12-15,25-27,32-39. + uint64_t gpioMask = (1ULL << BUTTON_PIN); + + // FIXME change polarity so we can wake on ANY_HIGH instead - that would allow us to use all three buttons (instead of just the first) + gpio_pullup_en((gpio_num_t)BUTTON_PIN); + + esp_sleep_enable_ext1_wakeup(gpioMask, ESP_EXT1_WAKEUP_ALL_LOW); +#endif + + esp_sleep_enable_timer_wakeup(msecToWake * 1000ULL); // call expects usecs + esp_deep_sleep_start(); // TBD mA sleep current (battery) } - -void sleep() { +void sleep() +{ #if SLEEP_BETWEEN_MESSAGES // If the user has a screen, tell them we are about to sleep - if(ssd1306_found) { + if (ssd1306_found) + { // Show the going to sleep message on the screen char buffer[20]; snprintf(buffer, sizeof(buffer), "Sleeping in %3.1fs\n", (MESSAGE_TO_SLEEP_DELAY / 1000.0)); @@ -101,7 +104,7 @@ void sleep() { // Turn off screen screen_off(); - } + } // We sleep for the interval between messages minus the current millis // this way we distribute the messages evenly every SEND_INTERVAL millis @@ -111,43 +114,48 @@ void sleep() { #endif } - void scanI2Cdevice(void) { - byte err, addr; - int nDevices = 0; - for (addr = 1; addr < 127; addr++) { - Wire.beginTransmission(addr); - err = Wire.endTransmission(); - if (err == 0) { - Serial.print("I2C device found at address 0x"); - if (addr < 16) - Serial.print("0"); - Serial.print(addr, HEX); - Serial.println(" !"); - nDevices++; + byte err, addr; + int nDevices = 0; + for (addr = 1; addr < 127; addr++) + { + Wire.beginTransmission(addr); + err = Wire.endTransmission(); + if (err == 0) + { + Serial.print("I2C device found at address 0x"); + if (addr < 16) + Serial.print("0"); + Serial.print(addr, HEX); + Serial.println(" !"); + nDevices++; - if (addr == SSD1306_ADDRESS) { - ssd1306_found = true; - Serial.println("ssd1306 display found"); - } - #ifdef T_BEAM_V10 - if (addr == AXP192_SLAVE_ADDRESS) { - axp192_found = true; - Serial.println("axp192 PMU found"); - } - #endif - } else if (err == 4) { - Serial.print("Unknow error at address 0x"); - if (addr < 16) - Serial.print("0"); - Serial.println(addr, HEX); - } + if (addr == SSD1306_ADDRESS) + { + ssd1306_found = true; + Serial.println("ssd1306 display found"); + } +#ifdef T_BEAM_V10 + if (addr == AXP192_SLAVE_ADDRESS) + { + axp192_found = true; + Serial.println("axp192 PMU found"); + } +#endif } - if (nDevices == 0) - Serial.println("No I2C devices found\n"); - else - Serial.println("done\n"); + else if (err == 4) + { + Serial.print("Unknow error at address 0x"); + if (addr < 16) + Serial.print("0"); + Serial.println(addr, HEX); + } + } + if (nDevices == 0) + Serial.println("No I2C devices found\n"); + else + Serial.println("done\n"); } /** @@ -161,61 +169,70 @@ void scanI2Cdevice(void) LDO2 200mA -> LORA LDO3 200mA -> GPS */ -void axp192Init() { - #ifdef T_BEAM_V10 - if (axp192_found) { - if (!axp.begin(Wire, AXP192_SLAVE_ADDRESS)) { - Serial.println("AXP192 Begin PASS"); - } else { - Serial.println("AXP192 Begin FAIL"); - } - // axp.setChgLEDMode(LED_BLINK_4HZ); - Serial.printf("DCDC1: %s\n", axp.isDCDC1Enable() ? "ENABLE" : "DISABLE"); - Serial.printf("DCDC2: %s\n", axp.isDCDC2Enable() ? "ENABLE" : "DISABLE"); - Serial.printf("LDO2: %s\n", axp.isLDO2Enable() ? "ENABLE" : "DISABLE"); - Serial.printf("LDO3: %s\n", axp.isLDO3Enable() ? "ENABLE" : "DISABLE"); - Serial.printf("DCDC3: %s\n", axp.isDCDC3Enable() ? "ENABLE" : "DISABLE"); - Serial.printf("Exten: %s\n", axp.isExtenEnable() ? "ENABLE" : "DISABLE"); - Serial.println("----------------------------------------"); - - axp.setPowerOutPut(AXP192_LDO2, AXP202_ON); // LORA radio - axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); // GPS main power - axp.setPowerOutPut(AXP192_DCDC2, AXP202_ON); - axp.setPowerOutPut(AXP192_EXTEN, AXP202_ON); - axp.setPowerOutPut(AXP192_DCDC1, AXP202_ON); - axp.setDCDC1Voltage(3300); // for the OLED power - - Serial.printf("DCDC1: %s\n", axp.isDCDC1Enable() ? "ENABLE" : "DISABLE"); - Serial.printf("DCDC2: %s\n", axp.isDCDC2Enable() ? "ENABLE" : "DISABLE"); - Serial.printf("LDO2: %s\n", axp.isLDO2Enable() ? "ENABLE" : "DISABLE"); - Serial.printf("LDO3: %s\n", axp.isLDO3Enable() ? "ENABLE" : "DISABLE"); - Serial.printf("DCDC3: %s\n", axp.isDCDC3Enable() ? "ENABLE" : "DISABLE"); - Serial.printf("Exten: %s\n", axp.isExtenEnable() ? "ENABLE" : "DISABLE"); - - pinMode(PMU_IRQ, INPUT_PULLUP); - attachInterrupt(PMU_IRQ, [] { - pmu_irq = true; - }, FALLING); - - axp.adc1Enable(AXP202_BATT_CUR_ADC1, 1); - axp.enableIRQ(AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ | AXP202_BATT_REMOVED_IRQ | AXP202_BATT_CONNECT_IRQ, 1); - axp.clearIRQ(); - - if (axp.isChargeing()) { - baChStatus = "Charging"; - } - } else { - Serial.println("AXP192 not found"); +void axp192Init() +{ +#ifdef T_BEAM_V10 + if (axp192_found) + { + if (!axp.begin(Wire, AXP192_SLAVE_ADDRESS)) + { + Serial.println("AXP192 Begin PASS"); } - #endif + else + { + Serial.println("AXP192 Begin FAIL"); + } + // axp.setChgLEDMode(LED_BLINK_4HZ); + Serial.printf("DCDC1: %s\n", axp.isDCDC1Enable() ? "ENABLE" : "DISABLE"); + Serial.printf("DCDC2: %s\n", axp.isDCDC2Enable() ? "ENABLE" : "DISABLE"); + Serial.printf("LDO2: %s\n", axp.isLDO2Enable() ? "ENABLE" : "DISABLE"); + Serial.printf("LDO3: %s\n", axp.isLDO3Enable() ? "ENABLE" : "DISABLE"); + Serial.printf("DCDC3: %s\n", axp.isDCDC3Enable() ? "ENABLE" : "DISABLE"); + Serial.printf("Exten: %s\n", axp.isExtenEnable() ? "ENABLE" : "DISABLE"); + Serial.println("----------------------------------------"); + + axp.setPowerOutPut(AXP192_LDO2, AXP202_ON); // LORA radio + axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); // GPS main power + axp.setPowerOutPut(AXP192_DCDC2, AXP202_ON); + axp.setPowerOutPut(AXP192_EXTEN, AXP202_ON); + axp.setPowerOutPut(AXP192_DCDC1, AXP202_ON); + axp.setDCDC1Voltage(3300); // for the OLED power + + Serial.printf("DCDC1: %s\n", axp.isDCDC1Enable() ? "ENABLE" : "DISABLE"); + Serial.printf("DCDC2: %s\n", axp.isDCDC2Enable() ? "ENABLE" : "DISABLE"); + Serial.printf("LDO2: %s\n", axp.isLDO2Enable() ? "ENABLE" : "DISABLE"); + Serial.printf("LDO3: %s\n", axp.isLDO3Enable() ? "ENABLE" : "DISABLE"); + Serial.printf("DCDC3: %s\n", axp.isDCDC3Enable() ? "ENABLE" : "DISABLE"); + Serial.printf("Exten: %s\n", axp.isExtenEnable() ? "ENABLE" : "DISABLE"); + + pinMode(PMU_IRQ, INPUT_PULLUP); + attachInterrupt(PMU_IRQ, [] { + pmu_irq = true; + }, + FALLING); + + axp.adc1Enable(AXP202_BATT_CUR_ADC1, 1); + axp.enableIRQ(AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ | AXP202_BATT_REMOVED_IRQ | AXP202_BATT_CONNECT_IRQ, 1); + axp.clearIRQ(); + + if (axp.isChargeing()) + { + baChStatus = "Charging"; + } + } + else + { + Serial.println("AXP192 not found"); + } +#endif } - // Perform power on init that we do on each wake from deep sleep -void initDeepSleep() { - bootCount++; - wakeCause = esp_sleep_get_wakeup_cause(); - /* +void initDeepSleep() +{ + bootCount++; + wakeCause = esp_sleep_get_wakeup_cause(); + /* Not using yet because we are using wake on all buttons being low wakeButtons = esp_sleep_get_ext1_wakeup_status(); // If one of these buttons is set it was the reason we woke @@ -223,14 +240,15 @@ void initDeepSleep() { wakeButtons = ((uint64_t)1) << buttons.gpios[0]; */ - Serial.printf("booted, wake cause %d (boot count %d)\n", wakeCause, bootCount); + Serial.printf("booted, wake cause %d (boot count %d)\n", wakeCause, bootCount); } -void setup() { - // Debug - #ifdef DEBUG_PORT +void setup() +{ +// Debug +#ifdef DEBUG_PORT DEBUG_PORT.begin(SERIAL_BAUD); - #endif +#endif initDeepSleep(); // delay(1000); FIXME - remove @@ -238,12 +256,12 @@ void setup() { #ifdef VEXT_ENABLE pinMode(VEXT_ENABLE, OUTPUT); digitalWrite(VEXT_ENABLE, 0); // turn on the display power -#endif +#endif #ifdef RESET_OLED pinMode(RESET_OLED, OUTPUT); digitalWrite(RESET_OLED, 1); -#endif +#endif Wire.begin(I2C_SDA, I2C_SCL); scanI2Cdevice(); @@ -264,10 +282,10 @@ void setup() { DEBUG_MSG(APP_NAME " " APP_VERSION "\n"); // Don't init display if we don't have one or we are waking headless due to a timer event - if(wakeCause == ESP_SLEEP_WAKEUP_TIMER) + if (wakeCause == ESP_SLEEP_WAKEUP_TIMER) ssd1306_found = false; // forget we even have the hardware - if(ssd1306_found) + if (ssd1306_found) screen_setup(); // Init GPS @@ -275,24 +293,28 @@ void setup() { // Show logo on first boot after removing battery //if (bootCount == 0) { - screen_print(APP_NAME " " APP_VERSION, 0, 0); - screen_show_logo(); - screen_update(); - delay(LOGO_DELAY); + screen_print(APP_NAME " " APP_VERSION, 0, 0); + screen_show_logo(); + screen_update(); + delay(LOGO_DELAY); //} - initBLE("KHBT Test"); // FIXME, use a real name based on the macaddr - mesh_init(); + BLEServer *serve = initBLE("KHBT Test"); // FIXME, use a real name based on the macaddr + BLEService *bts = createMeshBluetoothService(serve); + bts->start(); + serve->getAdvertising()->addServiceUUID(bts->getUUID()); } -void loop() { +void loop() +{ gps_loop(); screen_loop(); mesh_loop(); loopBLE(); - if(packetSent) { + if (packetSent) + { packetSent = false; sleep(); } @@ -301,16 +323,21 @@ void loop() { // if user presses button for more than 3 secs, discard our network prefs and reboot (FIXME, use a debounce lib instead of this boilerplate) static bool wasPressed = false; static uint32_t minPressMs; // what tick should we call this press long enough - if(!digitalRead(BUTTON_PIN)) { - if(!wasPressed) { // just started a new press + if (!digitalRead(BUTTON_PIN)) + { + if (!wasPressed) + { // just started a new press Serial.println("pressing"); wasPressed = true; minPressMs = millis() + 3000; - } - } else if(wasPressed) { + } + } + else if (wasPressed) + { // we just did a release wasPressed = false; - if(millis() > minPressMs) { + if (millis() > minPressMs) + { // held long enough screen_print("Erasing prefs"); delay(5000); // Give some time to read the screen @@ -322,18 +349,24 @@ void loop() { // Send every SEND_INTERVAL millis static uint32_t last = 0; static bool first = true; - if (0 == last || millis() - last > SEND_INTERVAL) { - if (false) { + if (0 == last || millis() - last > SEND_INTERVAL) + { + if (false) + { last = millis(); first = false; Serial.println("TRANSMITTED"); - } else { - if (first) { + } + else + { + if (first) + { screen_print("Waiting GPS lock\n"); first = false; } #ifdef GPS_WAIT_FOR_LOCK - if (millis() > GPS_WAIT_FOR_LOCK) { + if (millis() > GPS_WAIT_FOR_LOCK) + { sleep(); } #endif