diff --git a/.forgejo/workflows/push.yaml b/.forgejo/workflows/push.yaml index 02458ae..5121d24 100644 --- a/.forgejo/workflows/push.yaml +++ b/.forgejo/workflows/push.yaml @@ -1,4 +1,4 @@ -name: "BTClock CI" +name: 'BTClock CI' on: push: @@ -22,7 +22,7 @@ jobs: with: node-version: lts/* cache: yarn - cache-dependency-path: "**/yarn.lock" + cache-dependency-path: '**/yarn.lock' - uses: actions/cache@v4 with: path: | @@ -34,8 +34,8 @@ jobs: key: ${{ runner.os }}-pio - uses: actions/setup-python@v5 with: - python-version: "3.9" - cache: "pip" + python-version: '3.9' + cache: 'pip' - name: Get current date id: dateAndTime shell: bash @@ -48,7 +48,7 @@ jobs: run: mkdir -p junit-reports && pio test -e native_test_only --junit-output-path junit-reports/ - name: Build BTClock firmware shell: bash - run: pio run + run: pio run - name: Build BTClock filesystem shell: bash run: pio run --target buildfs @@ -81,9 +81,9 @@ jobs: version: esp32s3 epd_variant: [213epd, 29epd] exclude: - - chip: { name: btclock_rev_b, version: esp32s3 } + - chip: {name: btclock_rev_b, version: esp32s3} epd_variant: 29epd - - chip: { name: btclock_v8, version: esp32s3 } + - chip: {name: btclock_v8, version: esp32s3} epd_variant: 29epd steps: - uses: https://code.forgejo.org/forgejo/download-artifact@v4 @@ -93,10 +93,9 @@ jobs: - name: Install esptools.py run: pip install --upgrade esptool - name: Create merged firmware binary - shell: bash run: | - mkdir -p ${{ matrix.chip.name }}_${{ matrix.epd_variant }} if [ "${{ matrix.chip.name }}" == "btclock_v8" ]; then + mkdir -p ${{ matrix.chip.name }}_${{ matrix.epd_variant }} && \ esptool.py --chip ${{ matrix.chip.version }} merge_bin \ -o ${{ matrix.chip.name }}_${{ matrix.epd_variant }}/${{ matrix.chip.name }}_${{ matrix.epd_variant }}.bin \ --flash_mode dio \ @@ -106,19 +105,10 @@ jobs: 0x8000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/partitions.bin \ 0xe000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/ota_data_initial.bin \ 0x10000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/firmware.bin \ - 0xDF0000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/littlefs_16MB.bin - elif [ "${{ matrix.chip.name }}" == "btclock_rev_b" ]; then - esptool.py --chip ${{ matrix.chip.version }} merge_bin \ - -o ${{ matrix.chip.name }}_${{ matrix.epd_variant }}/${{ matrix.chip.name }}_${{ matrix.epd_variant }}.bin \ - --flash_mode dio \ - --flash_freq 80m \ - --flash_size 8MB \ - 0x0000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/bootloader.bin \ - 0x8000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/partitions.bin \ - 0xe000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/ota_data_initial.bin \ - 0x10000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/firmware.bin \ - 0x6F0000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/littlefs_8MB.bin; + 0x810000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/littlefs.bin; else + # Original command for other cases + mkdir -p ${{ matrix.chip.name }}_${{ matrix.epd_variant }} && \ esptool.py --chip ${{ matrix.chip.version }} merge_bin \ -o ${{ matrix.chip.name }}_${{ matrix.epd_variant }}/${{ matrix.chip.name }}_${{ matrix.epd_variant }}.bin \ --flash_mode dio \ @@ -126,23 +116,19 @@ jobs: 0x8000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/partitions.bin \ 0xe000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/ota_data_initial.bin \ 0x10000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/firmware.bin \ - 0x380000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/littlefs_4MB.bin + 0x370000 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/littlefs.bin # Adjust the offset for littlefs or other files as needed for the original case fi - name: Create checksum for firmware - shell: bash run: shasum -a 256 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/firmware.bin | awk '{print $1}' > ${{ matrix.chip.name }}_${{ matrix.epd_variant }}/${{ matrix.chip.name }}_${{ matrix.epd_variant }}_firmware.bin.sha256 - name: Create checksum for merged binary - shell: bash run: shasum -a 256 ${{ matrix.chip.name }}_${{ matrix.epd_variant }}/${{ matrix.chip.name }}_${{ matrix.epd_variant }}.bin | awk '{print $1}' > ${{ matrix.chip.name }}_${{ matrix.epd_variant }}/${{ matrix.chip.name }}_${{ matrix.epd_variant }}.bin.sha256 - name: Create checksum for littlefs partition - shell: bash - run: | - fs_file=$(find .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }} -name "littlefs*.bin") - shasum -a 256 "$fs_file" | awk '{print $1}' > "${fs_file}.sha256" + run: shasum -a 256 .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/littlefs.bin | awk '{print $1}' > ${{ matrix.chip.name }}_${{ matrix.epd_variant }}/littlefs.bin.sha256 + - name: Copy all artifacts to output folder run: cp .pio/build/${{ matrix.chip.name }}_${{ matrix.epd_variant }}/*.bin .pio/boot_app0.bin ${{ matrix.chip.name }}_${{ matrix.epd_variant }} @@ -175,13 +161,13 @@ jobs: - name: Create release uses: https://code.forgejo.org/actions/forgejo-release@v2.4.0 with: - url: "https://git.btclock.dev" - repo: "${{ github.repository }}" + url: 'https://git.btclock.dev' + repo: '${{ github.repository }}' direction: upload - tag: "${{ github.ref_name }}" - sha: "${{ github.sha }}" + tag: '${{ github.ref_name }}' + sha: '${{ github.sha }}' release-dir: release token: ${{ secrets.TOKEN }} override: ${{ github.ref_type != 'tag' && github.ref_name != 'main' }} prerelease: ${{ github.ref_type != 'tag' && github.ref_name != 'main' }} - release-notes-assistant: false + release-notes-assistant: false \ No newline at end of file diff --git a/partition.csv b/partition.csv index eedbf5b..80714ea 100644 --- a/partition.csv +++ b/partition.csv @@ -3,5 +3,5 @@ nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, app0, app, ota_0, 0x10000, 0x1b8000, app1, app, ota_1, , 0x1b8000, -spiffs, data, spiffs, , 0x66C00, -coredump, data, coredump,, 0x10000, +spiffs, data, spiffs, , 0x66800, +coredump, data, coredump,, 0x10000, \ No newline at end of file diff --git a/partition_16mb.csv b/partition_16mb.csv index 7e58611..e26e145 100644 --- a/partition_16mb.csv +++ b/partition_16mb.csv @@ -1,7 +1,7 @@ # Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x5000, -otadata, data, ota, 0xe000, 0x2000, -app0, app, ota_0, 0x10000, 0x6F0000, -app1, app, ota_1, , 0x6F0000, -spiffs, data, spiffs, , 0x200000, -coredump, data, coredump,, 0x10000, \ No newline at end of file +nvs, data, nvs, 36K, 20K, +otadata, data, ota, 56K, 8K, +app0, app, ota_0, 64K, 4096K, +app1, app, ota_1, , 4096K, +spiffs, data, spiffs, , 410K, +coredump, data, coredump,, 64K, diff --git a/partition_8mb.csv b/partition_8mb.csv index e0584ae..a418ea9 100644 --- a/partition_8mb.csv +++ b/partition_8mb.csv @@ -1,7 +1,7 @@ # Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x5000, -otadata, data, ota, 0xe000, 0x2000, -app0, app, ota_0, 0x10000, 0x370000, -app1, app, ota_1, , 0x370000, -spiffs, data, spiffs, , 0xCD000, -coredump, data, coredump,, 0x10000, +nvs, data, nvs, 36K, 20K, +otadata, data, ota, 56K, 8K, +app0, app, ota_0, 64K, 2048K, +app1, app, ota_1, , 2048K, +spiffs, data, spiffs, , 410K, +coredump, data, coredump,, 64K, diff --git a/platformio.ini b/platformio.ini index 125ad96..61c342c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -20,9 +20,8 @@ framework = arduino, espidf monitor_speed = 115200 monitor_filters = esp32_exception_decoder, colorize board_build.filesystem = littlefs -extra_scripts = pre:scripts/pre_script.py, post:scripts/extra_script.py -board_build.embed_files = - x509_crt_bundle +extra_scripts = post:scripts/extra_script.py +board_build.embed_files = x509_crt_bundle build_flags = !python scripts/git_rev.py -DLAST_BUILD_TIME=$UNIX_TIME @@ -36,13 +35,14 @@ lib_deps = https://github.com/joltwallet/esp_littlefs.git bblanchon/ArduinoJson@^7.2.1 mathieucarbou/ESPAsyncWebServer @ 3.3.23 - robtillaart/MCP23017@^0.8.0 + adafruit/Adafruit BusIO@^1.16.2 + adafruit/Adafruit MCP23017 Arduino Library@^2.3.2 adafruit/Adafruit NeoPixel@^1.12.3 - https://github.com/dsbaars/universal_pin#feature/mcp23017_rt + https://github.com/dsbaars/universal_pin https://github.com/dsbaars/GxEPD2#universal_pin https://github.com/tzapu/WiFiManager.git#v2.0.17 rblb/Nostrduino@1.2.8 - + [env:lolin_s3_mini] extends = btclock_base board = lolin_s3_mini @@ -64,7 +64,7 @@ build_unflags = [env:btclock_rev_b] extends = btclock_base board = btclock_rev_b -board_build.partitions = partition_8mb.csv +board_build.partitions = partition.csv build_flags = ${btclock_base.build_flags} -D MCP_INT_PIN=8 diff --git a/scripts/extra_script.py b/scripts/extra_script.py index 8451978..d7e4b31 100644 --- a/scripts/extra_script.py +++ b/scripts/extra_script.py @@ -5,9 +5,6 @@ from shutil import copyfileobj, rmtree from pathlib import Path import subprocess - - - revision = ( subprocess.check_output(["git", "rev-parse", "HEAD"]) .strip() @@ -46,15 +43,5 @@ def before_buildfs(source, target, env): output_directory = 'data/build_gz' process_directory(input_directory, output_directory) -flash_size = env.BoardConfig().get("upload.flash_size", "4MB") -fs_image_name = f"littlefs_{flash_size}" -env.Replace(ESP32_FS_IMAGE_NAME=fs_image_name) -env.Replace(ESP8266_FS_IMAGE_NAME=fs_image_name) - os.environ["PUBLIC_BASE_URL"] = "" -fs_name = env.get("ESP32_FS_IMAGE_NAME", "littlefs.bin") -# Or alternatively: -# fs_name = env.get("FSTOOLNAME", "littlefs.bin") - -# Use the variable in the pre-action -env.AddPreAction(f"$BUILD_DIR/{fs_name}.bin", before_buildfs) +env.AddPreAction("$BUILD_DIR/littlefs.bin", before_buildfs) diff --git a/scripts/pre_script.py b/scripts/pre_script.py deleted file mode 100644 index 45d6bea..0000000 --- a/scripts/pre_script.py +++ /dev/null @@ -1,7 +0,0 @@ -Import("env") - -flash_size = env.BoardConfig().get("upload.flash_size", "4MB") -fs_image_name = f"littlefs_{flash_size}" -env.Replace(ESP32_FS_IMAGE_NAME=fs_image_name) -env.Replace(ESP8266_FS_IMAGE_NAME=fs_image_name) - diff --git a/src/lib/button_handler.cpp b/src/lib/button_handler.cpp index 72f1eaa..437090d 100644 --- a/src/lib/button_handler.cpp +++ b/src/lib/button_handler.cpp @@ -5,15 +5,15 @@ const TickType_t debounceDelay = pdMS_TO_TICKS(50); TickType_t lastDebounceTime = 0; #ifdef IS_BTCLOCK_V8 -#define BTN_1 256 -#define BTN_2 512 -#define BTN_3 1024 -#define BTN_4 2048 +#define BTN_1 0 +#define BTN_2 1 +#define BTN_3 2 +#define BTN_4 3 #else -#define BTN_1 2048 -#define BTN_2 1024 -#define BTN_3 512 -#define BTN_4 256 +#define BTN_1 3 +#define BTN_2 2 +#define BTN_3 1 +#define BTN_4 0 #endif void buttonTask(void *parameter) { @@ -22,12 +22,11 @@ void buttonTask(void *parameter) { std::lock_guard lock(mcpMutex); TickType_t currentTime = xTaskGetTickCount(); - if ((currentTime - lastDebounceTime) >= debounceDelay) { lastDebounceTime = currentTime; if (!digitalRead(MCP_INT_PIN)) { - uint pin = mcp1.getInterruptFlagRegister(); + uint pin = mcp1.getLastInterruptPin(); switch (pin) { case BTN_1: @@ -44,12 +43,12 @@ void buttonTask(void *parameter) { break; } } - mcp1.getInterruptCaptureRegister(); + mcp1.clearInterrupts(); } else { } // Very ugly, but for some reason this is necessary while (!digitalRead(MCP_INT_PIN)) { - mcp1.getInterruptCaptureRegister(); + mcp1.clearInterrupts(); } } } diff --git a/src/lib/config.cpp b/src/lib/config.cpp index 2f5e062..29f74e2 100644 --- a/src/lib/config.cpp +++ b/src/lib/config.cpp @@ -2,12 +2,10 @@ #define MAX_ATTEMPTS_WIFI_CONNECTION 20 -// zlib_turbo zt; - Preferences preferences; -MCP23017 mcp1(0x20); +Adafruit_MCP23X17 mcp1; #ifdef IS_BTCLOCK_V8 -MCP23017 mcp2(0x21); +Adafruit_MCP23X17 mcp2; #endif #ifdef HAS_FRONTLIGHT @@ -37,7 +35,7 @@ void setup() } { std::lock_guard lockMcp(mcpMutex); - if (mcp1.read1(3) == LOW) + if (mcp1.digitalRead(3) == LOW) { preferences.putBool("wifiConfigured", false); preferences.remove("txPower"); @@ -48,7 +46,7 @@ void setup() } { - if (mcp1.read1(0) == LOW) + if (mcp1.digitalRead(0) == LOW) { // Then loop forever to prevent anything else from writing to the screen while (true) @@ -56,7 +54,7 @@ void setup() delay(1000); } } - else if (mcp1.read1(1) == LOW) + else if (mcp1.digitalRead(1) == LOW) { preferences.clear(); queueLedEffect(LED_EFFECT_WIFI_ERASE_SETTINGS); @@ -68,7 +66,6 @@ void setup() } setupWifi(); - // loadIcons(); setupWebserver(); @@ -114,7 +111,6 @@ void setup() #endif forceFullRefresh(); - } void setupWifi() @@ -141,7 +137,7 @@ void setupWifi() bool buttonPress = false; { std::lock_guard lockMcp(mcpMutex); - buttonPress = (mcp1.read1(2) == LOW); + buttonPress = (mcp1.digitalRead(2) == LOW); } { @@ -522,7 +518,7 @@ void setupHardware() Wire.begin(I2C_SDA_PIN, I2C_SCK_PIN, 400000); - if (!mcp1.begin()) + if (!mcp1.begin_I2C(0x20)) { Serial.println(F("Error MCP23017 1")); @@ -532,20 +528,17 @@ void setupHardware() else { pinMode(MCP_INT_PIN, INPUT_PULLUP); -// mcp1.setupInterrupts(false, false, LOW); - mcp1.enableControlRegister(MCP23x17_IOCR_ODR); - - mcp1.mirrorInterrupts(true); + mcp1.setupInterrupts(false, false, LOW); for (int i = 0; i < 4; i++) { - mcp1.pinMode1(i, INPUT_PULLUP); - mcp1.enableInterrupt(i, LOW); + mcp1.pinMode(i, INPUT_PULLUP); + mcp1.setupInterruptPin(i, LOW); } #ifndef IS_BTCLOCK_V8 for (int i = 8; i <= 14; i++) { - mcp1.pinMode1(i, OUTPUT); + mcp1.pinMode(i, OUTPUT); } #endif } @@ -556,7 +549,7 @@ void setupHardware() #endif #ifdef IS_BTCLOCK_V8 - if (!mcp2.begin()) + if (!mcp2.begin_I2C(0x21)) { Serial.println(F("Error MCP23017 2")); @@ -808,19 +801,4 @@ const char* getFirmwareFilename() { } else { return ""; } -} - -// void loadIcons() { -// size_t ocean_logo_size = 886; - -// int iUncompSize = zt.gzip_info((uint8_t *)epd_compress_bitaxe, ocean_logo_size); -// Serial.printf("uncompressed size = %d\n", iUncompSize); - -// uint8_t *pUncompressed; -// pUncompressed = (uint8_t *)malloc(iUncompSize+4); -// int rc = zt.gunzip((uint8_t *)epd_compress_bitaxe, ocean_logo_size, pUncompressed); - -// if (rc == ZT_SUCCESS) { -// Serial.println("Decode success"); -// } -// } \ No newline at end of file +} \ No newline at end of file diff --git a/src/lib/config.hpp b/src/lib/config.hpp index a0153f5..c648c9c 100644 --- a/src/lib/config.hpp +++ b/src/lib/config.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include #include @@ -84,6 +84,4 @@ void addScreenMapping(int value, const char* name); int findScreenIndexByValue(int value); String replaceAmbiguousChars(String input); -const char* getFirmwareFilename(); - -// void loadIcons(); \ No newline at end of file +const char* getFirmwareFilename(); \ No newline at end of file diff --git a/src/lib/epd.cpp b/src/lib/epd.cpp index 5281087..92a6d6f 100644 --- a/src/lib/epd.cpp +++ b/src/lib/epd.cpp @@ -191,7 +191,7 @@ void setupDisplays() } // Hold lower button to enable "storage mode" (prevents burn-in of ePaper displays) - if (mcp1.read1(0) == LOW) + if (mcp1.digitalRead(0) == LOW) { setFgColor(GxEPD_BLACK); setBgColor(GxEPD_WHITE); @@ -620,19 +620,10 @@ void renderIcon(const uint dispNum, const String &text, bool partial) iconIndex = 6; } - - - displays[dispNum].drawInvertedBitmap(0,0, epd_icons_allArray[iconIndex], 122, 250, getFgColor()); - -// displays[dispNum].drawInvertedBitmap(0,0, getOceanIcon(), 122, 250, getFgColor()); - - } - - void renderQr(const uint dispNum, const String &text, bool partial) { #ifdef USE_QR diff --git a/src/lib/epd.hpp b/src/lib/epd.hpp index 1194cf1..749f940 100644 --- a/src/lib/epd.hpp +++ b/src/lib/epd.hpp @@ -4,7 +4,6 @@ #include #include - #include #include #include diff --git a/src/lib/shared.cpp b/src/lib/shared.cpp index 3422ff8..20bf6d4 100644 --- a/src/lib/shared.cpp +++ b/src/lib/shared.cpp @@ -143,12 +143,4 @@ String calculateSHA256(WiFiClient *stream, size_t contentLength) { } return result; -} - -// uint8_t* getOceanIcon() { -// zlib_turbo zt; -// int iUncompSize = zt.gzip_info((uint8_t *)ocean_logo_comp, ocean_logo_size); -// uint8_t *pUncompressed; -// pUncompressed = (uint8_t *)malloc(iUncompSize+4); -// zt.gunzip((uint8_t *)ocean_logo_comp, ocean_logo_size, pUncompressed); -// } \ No newline at end of file +} \ No newline at end of file diff --git a/src/lib/shared.hpp b/src/lib/shared.hpp index 22e40b2..9a080bd 100644 --- a/src/lib/shared.hpp +++ b/src/lib/shared.hpp @@ -1,7 +1,6 @@ #pragma once -#include "MCP23017.h" -// #include +#include #include #include #include @@ -18,9 +17,9 @@ #include "defaults.hpp" -extern MCP23017 mcp1; +extern Adafruit_MCP23X17 mcp1; #ifdef IS_BTCLOCK_V8 -extern MCP23017 mcp2; +extern Adafruit_MCP23X17 mcp2; #endif extern Preferences preferences; extern std::mutex mcpMutex; @@ -77,12 +76,7 @@ const int usPerMinute = 60 * usPerSecond; extern const char *isrg_root_x1cert; extern const uint8_t rootca_crt_bundle_start[] asm("_binary_x509_crt_bundle_start"); -// extern const uint8_t ocean_logo_comp[] asm("_binary_ocean_gz_start"); -// extern const uint8_t ocean_logo_comp_end[] asm("_binary_ocean_gz_end"); -// uint8_t* getOceanIcon(); - -// const size_t ocean_logo_size = ocean_logo_comp_end - ocean_logo_comp; const PROGMEM char UPDATE_FIRMWARE = U_FLASH; const PROGMEM char UPDATE_WEBUI = U_SPIFFS;