diff --git a/bin/build-all.sh b/bin/build-all.sh index 9f0888f0..a13bfffc 100755 --- a/bin/build-all.sh +++ b/bin/build-all.sh @@ -87,8 +87,12 @@ platformio lib update do_boards "$BOARDS_ESP32" "false" do_boards "$BOARDS_NRF52" "true" +echo "Building SPIFFS for ESP32 targets" +pio run --environment tbeam -t buildfs +cp .pio/build/tbeam/spiffs.bin $OUTDIR/bins/universal/spiffs-$VERSION.bin + # keep the bins in archive also -cp $OUTDIR/bins/firmware* $OUTDIR/elfs/firmware* $OUTDIR/bins/universal/firmware* $OUTDIR/elfs/universal/firmware* $ARCHIVEDIR +cp $OUTDIR/bins/firmware* $OUTDIR/bins/universal/spiffs* $OUTDIR/elfs/firmware* $OUTDIR/bins/universal/firmware* $OUTDIR/elfs/universal/firmware* $ARCHIVEDIR echo Updating android bins $OUTDIR/forandroid rm -rf $OUTDIR/forandroid diff --git a/docs/software/device-api.md b/docs/software/device-api.md index 031b586a..cdf9e136 100644 --- a/docs/software/device-api.md +++ b/docs/software/device-api.md @@ -111,6 +111,7 @@ Characteristics | e272ebac-d463-4b98-bc84-5cc1a39ee517 | write | data, variable sized, recommended 512 bytes, write one for each block of file | | 4826129c-c22a-43a3-b066-ce8f0d5bacc6 | write | crc32, write last - writing this will complete the OTA operation, now you can read result | | 5e134862-7411-4424-ac4a-210937432c77 | read,notify | result code, readable but will notify when the OTA operation completes | +| 5e134862-7411-4424-ac4a-210937432c67 | write | sets the region for programming, currently only 0 (app) or 100 (spiffs) are defined, if not set app is assumed | | GATT_UUID_SW_VERSION_STR/0x2a28 | read | We also implement these standard GATT entries because SW update probably needs them: | | GATT_UUID_MANU_NAME/0x2a29 | read | | | GATT_UUID_HW_VERSION_STR/0x2a27 | read | | diff --git a/src/esp32/BluetoothSoftwareUpdate.cpp b/src/esp32/BluetoothSoftwareUpdate.cpp index 12e30d1c..03e156b0 100644 --- a/src/esp32/BluetoothSoftwareUpdate.cpp +++ b/src/esp32/BluetoothSoftwareUpdate.cpp @@ -6,6 +6,7 @@ #include "RadioLibInterface.h" #include "configuration.h" #include "nimble/BluetoothUtil.h" +#include "NodeDB.h" #include #include @@ -16,6 +17,8 @@ static CRC32 crc; static uint32_t rebootAtMsec = 0; // If not zero we will reboot at this time (used to reboot shortly after the update completes) static uint32_t updateExpectedSize, updateActualSize; +static uint8_t update_result; +static uint8_t update_region; static concurrency::Lock *updateLock; @@ -32,8 +35,8 @@ int update_size_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble_ crc.reset(); if (Update.isRunning()) Update.abort(); - bool canBegin = Update.begin(updateExpectedSize); - DEBUG_MSG("Setting update size %u, result %d\n", updateExpectedSize, canBegin); + bool canBegin = Update.begin(updateExpectedSize, update_region); + DEBUG_MSG("Setting region %d update size %u, result %d\n", update_region, updateExpectedSize, canBegin); if (!canBegin) { // Indicate failure by forcing the size to 0 (client will read it back) updateExpectedSize = 0; @@ -72,13 +75,11 @@ int update_data_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble_ crc.update(data, len); Update.write(data, len); updateActualSize += len; - powerFSM.trigger(EVENT_CONTACT_FROM_PHONE); + powerFSM.trigger(EVENT_CONTACT_FROM_PHONE); return 0; } -static uint8_t update_result; - /// Handle writes to crc32 int update_crc32_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { @@ -100,8 +101,14 @@ int update_crc32_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble result = 0xe0; // FIXME, use real error codes } else { if (Update.end()) { - DEBUG_MSG("OTA done, rebooting in 5 seconds!\n"); - rebootAtMsec = millis() + 5000; + if (update_region == U_SPIFFS) { + DEBUG_MSG("SPIFFS updated!\n"); + nodeDB.saveToDisk(); // Since we just wiped spiffs, we need to save our current state + } + else { + DEBUG_MSG("Appload updated, rebooting in 5 seconds!\n"); + rebootAtMsec = millis() + 5000; + } } else { DEBUG_MSG("Error Occurred. Error #: %d\n", Update.getError()); } @@ -125,6 +132,11 @@ int update_result_callback(uint16_t conn_handle, uint16_t attr_handle, struct bl return chr_readwrite8(&update_result, sizeof(update_result), ctxt); } +int update_region_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) +{ + return chr_readwrite8(&update_region, sizeof(update_region), ctxt); +} + void bluetoothRebootCheck() { if (rebootAtMsec && millis() > rebootAtMsec) { diff --git a/src/esp32/BluetoothSoftwareUpdate.h b/src/esp32/BluetoothSoftwareUpdate.h index c7a412d6..f5e1a1de 100644 --- a/src/esp32/BluetoothSoftwareUpdate.h +++ b/src/esp32/BluetoothSoftwareUpdate.h @@ -14,10 +14,11 @@ int update_size_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble_ int update_data_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg); int update_result_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg); int update_crc32_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg); +int update_region_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg); extern const struct ble_gatt_svc_def gatt_update_svcs[]; -extern const ble_uuid128_t update_result_uuid; +extern const ble_uuid128_t update_result_uuid, update_region_uuid; extern int16_t updateResultHandle; diff --git a/src/esp32/NimbleSoftwareUpdate.c b/src/esp32/NimbleSoftwareUpdate.c index e02cd4a9..956fdf53 100644 --- a/src/esp32/NimbleSoftwareUpdate.c +++ b/src/esp32/NimbleSoftwareUpdate.c @@ -23,6 +23,10 @@ const ble_uuid128_t update_crc32_uuid = const ble_uuid128_t update_result_uuid = BLE_UUID128_INIT(0x77, 0x2c, 0x43, 0x37, 0x09, 0x21, 0x4a, 0xac, 0x24, 0x44, 0x11, 0x74, 0x62, 0x48, 0x13, 0x5e); +// "5e134862-7411-4424-ac4a-210937432c67" write +const ble_uuid128_t update_region_uuid = + BLE_UUID128_INIT(0x67, 0x2c, 0x43, 0x37, 0x09, 0x21, 0x4a, 0xac, 0x24, 0x44, 0x11, 0x74, 0x62, 0x48, 0x13, 0x5e); + const struct ble_gatt_svc_def gatt_update_svcs[] = { { /*** Service: Security test. */ @@ -47,9 +51,14 @@ const struct ble_gatt_svc_def gatt_update_svcs[] = { }, { .uuid = &update_result_uuid.u, - .access_cb = update_size_callback, + .access_cb = update_result_callback, .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_READ_AUTHEN | BLE_GATT_CHR_F_NOTIFY, }, + { + .uuid = &update_region_uuid.u, + .access_cb = update_region_callback, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_WRITE_AUTHEN, + }, { 0, /* No more characteristics in this service. */ }},