diff --git a/.github/actions/build-app/action.yml b/.github/actions/build-app/action.yml index 173aea2..d726113 100644 --- a/.github/actions/build-app/action.yml +++ b/.github/actions/build-app/action.yml @@ -14,7 +14,7 @@ runs: - name: 'Build' uses: espressif/esp-idf-ci-action@v1 with: - esp_idf_version: v5.5 + esp_idf_version: v6.1 path: . # The export reset prevents an error when building other targets # The default environment variable is set to "esp32" by the GitHub Action diff --git a/Apps/Brainfuck/manifest.properties b/Apps/Brainfuck/manifest.properties index b80f1f4..d644782 100644 --- a/Apps/Brainfuck/manifest.properties +++ b/Apps/Brainfuck/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.brainfuck -version.name=0.12.0 -version.code=12 +version.name=0.13.0 +version.code=13 name=Brainfuck description=Brainfuck esoteric language interpreter app.0.id=tactility.brainfuck diff --git a/Apps/Breakout/manifest.properties b/Apps/Breakout/manifest.properties index c8a61d6..af3a902 100644 --- a/Apps/Breakout/manifest.properties +++ b/Apps/Breakout/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.breakout -version.name=0.15.0 -version.code=15 +version.name=0.16.0 +version.code=16 name=Breakout description=Classic brick-breaking arcade game app.0.id=tactility.breakout diff --git a/Apps/Calculator/manifest.properties b/Apps/Calculator/manifest.properties index 8fdbaae..6bc4af7 100644 --- a/Apps/Calculator/manifest.properties +++ b/Apps/Calculator/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.calculator -version.name=0.13.0 -version.code=13 +version.name=0.14.0 +version.code=14 name=Calculator app.0.id=tactility.calculator app.0.name=Calculator diff --git a/Apps/CoreUtils/manifest.properties b/Apps/CoreUtils/manifest.properties index feeb7a0..63d88cc 100644 --- a/Apps/CoreUtils/manifest.properties +++ b/Apps/CoreUtils/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=posix-x86_64,esp32s3 id=tactility.coreutils -version.name=0.2.0 -version.code=2 +version.name=0.3.0 +version.code=3 name=CoreUtils description=Commandline utilities app.0.id=tactility.coreutils.echo diff --git a/Apps/Diceware/main/Source/Diceware.cpp b/Apps/Diceware/main/Source/Diceware.cpp index 47ae366..8f4c00c 100644 --- a/Apps/Diceware/main/Source/Diceware.cpp +++ b/Apps/Diceware/main/Source/Diceware.cpp @@ -8,10 +8,10 @@ #include #include -constexpr char* TAG = "Diceware"; +static constexpr auto* TAG = "Diceware"; /** Must match manifest.properties' app.id */ -static constexpr const char* APP_ID = "tactility.diceware"; +static constexpr auto* APP_ID = "tactility.diceware"; static void skipNewlines(FILE* file, const int count) { char c; diff --git a/Apps/Diceware/manifest.properties b/Apps/Diceware/manifest.properties index 4e9903e..4e55f52 100644 --- a/Apps/Diceware/manifest.properties +++ b/Apps/Diceware/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.diceware -version.name=0.15.0 -version.code=15 +version.name=0.16.0 +version.code=16 name=Diceware description=Password generator app.0.id=tactility.diceware diff --git a/Apps/Doom/main/Source/DoomAudio.cpp b/Apps/Doom/main/Source/DoomAudio.cpp index 0673a29..c54a85d 100644 --- a/Apps/Doom/main/Source/DoomAudio.cpp +++ b/Apps/Doom/main/Source/DoomAudio.cpp @@ -382,15 +382,17 @@ void Sound_CacheSounds(sfxinfo_t* /*sounds*/, int /*num_sounds*/) {} // i_sound.c's I_BindSoundVariables() binds these as config variables under // FEATURE_SOUND, but they are normally defined by i_sdlsound.c / i_allegrosound.c, // neither of which is built here. -extern "C" int use_libsamplerate = 0; -extern "C" float libsamplerate_scale = 1.0f; +extern "C" { +int use_libsamplerate = 0; +float libsamplerate_scale = 1.0f; -extern "C" sound_module_t DG_sound_module = { +sound_module_t DG_sound_module = { soundDevices, 3, Sound_Init, Sound_Shutdown, Sound_GetSfxLumpNum, Sound_Update, Sound_UpdateSoundParams, Sound_StartSound, Sound_StopSound, Sound_SoundIsPlaying, Sound_CacheSounds }; +} void doomAudio_Init() { // i_oplmusic.c opens the OPL chip at snd_samplerate, and the mixer renders diff --git a/Apps/Doom/main/Source/DoomEsp.cpp b/Apps/Doom/main/Source/DoomEsp.cpp index 172cbe8..d8f76fd 100644 --- a/Apps/Doom/main/Source/DoomEsp.cpp +++ b/Apps/Doom/main/Source/DoomEsp.cpp @@ -74,7 +74,7 @@ static constexpr const char* APP_ID = "tactility.doom"; // to resolve the user data path degrades to M_SetConfigDir's own "no config // dir" handling rather than silently writing into the WAD folder, which is what // the old "/sdcard/doom" default did. -extern "C" char doomEsp_savedir[128] = ""; +extern "C" { char doomEsp_savedir[128] = ""; } // Doom's native render resolution (set via DOOMGENERIC_RESX/RESY) constexpr int DOOM_W = DOOMGENERIC_RESX; @@ -243,6 +243,8 @@ extern "C" void doom_draw_frame(const uint32_t* buffer) { .block_offset_x = 0, .block_offset_y = 0, .srm_cm = PPA_SRM_COLOR_MODE_RGB565, + .yuv_range = PPA_COLOR_RANGE_LIMIT, + .yuv_std = PPA_COLOR_CONV_STD_RGB_YUV_BT601, }, .out = { .buffer = outputBuffer, @@ -252,10 +254,20 @@ extern "C" void doom_draw_frame(const uint32_t* buffer) { .block_offset_x = 0, .block_offset_y = 0, .srm_cm = PPA_SRM_COLOR_MODE_RGB565, + .yuv_range = PPA_COLOR_RANGE_LIMIT, + .yuv_std = PPA_COLOR_CONV_STD_RGB_YUV_BT601, }, .rotation_angle = PPA_SRM_ROTATION_ANGLE_90, .scale_x = (float)scaledH / (float)DOOM_W, .scale_y = (float)scaledW / (float)DOOM_H, + .mirror_x = false, + .mirror_y = false, + .rgb_swap = false, + .byte_swap = false, + .alpha_update_mode = PPA_ALPHA_NO_CHANGE, + .alpha_fix_val = 0, + .mode = PPA_TRANS_MODE_BLOCKING, + .user_data = nullptr, }; ppa_do_scale_rotate_mirror(ppaClient, &srmConfig); @@ -485,7 +497,12 @@ void doomEsp_Run(Device* display) { } // 3. Register the PPA client - ppa_client_config_t ppaConfig = { .oper_type = PPA_OPERATION_SRM }; + ppa_client_config_t ppaConfig = { + .oper_type = PPA_OPERATION_SRM, + .max_pending_trans_num = 1, + .data_burst_length = PPA_DATA_BURST_LENGTH_128, + .flags = { .allow_pd = 0 }, + }; ESP_ERROR_CHECK(ppa_register_client(&ppaConfig, &ppaClient)); // 3b. Discover all keyboard devices (best-effort - Doom runs fine without them) diff --git a/Apps/Doom/main/doomgeneric/doomgeneric/doomtype.h b/Apps/Doom/main/doomgeneric/doomgeneric/doomtype.h index d279186..9b2bd52 100644 --- a/Apps/Doom/main/doomgeneric/doomgeneric/doomtype.h +++ b/Apps/Doom/main/doomgeneric/doomgeneric/doomtype.h @@ -80,7 +80,7 @@ typedef bool boolean; -#else +#elif !defined(__STDC_VERSION__) || __STDC_VERSION__ < 202311L typedef enum { @@ -89,6 +89,13 @@ typedef enum undef = 0xFFFFFFFF } boolean; +#else + +// C23 makes false/true reserved keywords, so this enum can no longer declare them as +// enumerator names. C23 already has a real bool, so alias boolean to it directly. +typedef bool boolean; +#define undef 0xFFFFFFFF + #endif typedef uint8_t byte; diff --git a/Apps/Doom/main/doomgeneric/doomgeneric/r_defs.h b/Apps/Doom/main/doomgeneric/doomgeneric/r_defs.h index a64ac84..d9014ca 100644 --- a/Apps/Doom/main/doomgeneric/doomgeneric/r_defs.h +++ b/Apps/Doom/main/doomgeneric/doomgeneric/r_defs.h @@ -392,7 +392,12 @@ typedef struct // If false use 0 for any position. // Note: as eight entries are available, // we might as well insert the same name eight times. - boolean rotate; + // Not `boolean`: R_InstallSpriteLump (r_things.c) needs a third state, distinct from both + // false and true, to detect "not yet installed" after this struct is memset(-1). A real + // (C23) 1-byte `bool` can only ever compare equal to 0 or 1 - reading back the memset(-1) + // sentinel through one triggers undefined behavior instead of correctly comparing unequal + // to both. + byte rotate; // Lump to use for view angles 0-7. short lump[8]; diff --git a/Apps/Doom/main/doomgeneric/doomgeneric/r_things.c b/Apps/Doom/main/doomgeneric/doomgeneric/r_things.c index 74e7369..30c0a8f 100644 --- a/Apps/Doom/main/doomgeneric/doomgeneric/r_things.c +++ b/Apps/Doom/main/doomgeneric/doomgeneric/r_things.c @@ -242,8 +242,8 @@ void R_InitSpriteDefs (char** namelist) { switch ((int)sprtemp[frame].rotate) { - case -1: // no rotations were found for that frame at all + case 0xff: I_Error ("R_InitSprites: No patches found " "for %s frame %c", spritename, frame+'A'); break; diff --git a/Apps/Doom/manifest.properties b/Apps/Doom/manifest.properties index 5c48198..1a6f4a5 100644 --- a/Apps/Doom/manifest.properties +++ b/Apps/Doom/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32p4 id=tactility.doom -version.name=0.6.0 -version.code=6 +version.name=0.7.0 +version.code=7 name=Doom description=Classic DOOM. Tab5 only, keyboard required to play. app.0.id=tactility.doom diff --git a/Apps/EpubReader/manifest.properties b/Apps/EpubReader/manifest.properties index a8a42f5..a8e2f45 100644 --- a/Apps/EpubReader/manifest.properties +++ b/Apps/EpubReader/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32s3,esp32p4 id=tactility.epubreader -version.name=0.12.0 -version.code=12 +version.name=0.13.0 +version.code=13 name=ePub Reader description=ePub and text file reader. Requires PSRAM! app.0.id=tactility.epubreader diff --git a/Apps/EspNowBridge/manifest.properties b/Apps/EspNowBridge/manifest.properties index e97b8a1..9e44b18 100644 --- a/Apps/EspNowBridge/manifest.properties +++ b/Apps/EspNowBridge/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32p4 id=tactility.espnowbridge -version.name=0.10.0 -version.code=10 +version.name=0.11.0 +version.code=11 name=ESP-NOW Bridge description=Companion app for updating P4 device C6 co-processor firmware to enable ESP-NOW bridge support. app.0.id=tactility.espnowbridge diff --git a/Apps/GPIO/main/CMakeLists.txt b/Apps/GPIO/main/CMakeLists.txt index 4389729..ff3fb52 100644 --- a/Apps/GPIO/main/CMakeLists.txt +++ b/Apps/GPIO/main/CMakeLists.txt @@ -1,4 +1,4 @@ include("$ENV{TACTILITY_SDK_PATH}/TactilitySDK.cmake") file(GLOB_RECURSE SOURCE_FILES Source/*.c*) -tactility_component_register(SRCS ${SOURCE_FILES} REQUIRES driver) +tactility_component_register(SRCS ${SOURCE_FILES}) diff --git a/Apps/GPIO/main/Source/Gpio.cpp b/Apps/GPIO/main/Source/Gpio.cpp index 463bd0c..45192f8 100644 --- a/Apps/GPIO/main/Source/Gpio.cpp +++ b/Apps/GPIO/main/Source/Gpio.cpp @@ -1,24 +1,32 @@ #include "Gpio.h" +#include #include #include #include -#include -#include +#include +#include +#include + +#include constexpr auto* TAG = "GPIO"; static void updatePinStates(Context* ctx) { // Update pin states - for (size_t i = 0; i < ctx->pinStates.size(); ++i) { - ctx->pinStates[i] = gpio_get_level((gpio_num_t)i); + for (uint32_t i = 0; i < ctx->pinCount; ++i) { + bool high = false; + if (ctx->gpioController != nullptr) { + gpio_controller_get_level(ctx->gpioController, (gpio_pin_t)i, &high); + } + ctx->pinStates[i] = high; } } static void updatePinWidgets(Context* ctx) { lvgl_lock(); - for (size_t j = 0; j < ctx->pinStates.size(); ++j) { + for (size_t j = 0; j < ctx->pinCount; ++j) { int level = ctx->pinStates[j]; lv_obj_t* label = ctx->pinWidgets[j]; void* label_user_data = lv_obj_get_user_data(label); @@ -26,9 +34,9 @@ static void updatePinWidgets(Context* ctx) { if (reinterpret_cast(level) != label_user_data) { lv_obj_set_user_data(label, reinterpret_cast(level)); if (level == 0) { - lv_obj_set_style_text_color(label, lv_color_make(20, 20, 20), LV_STATE_DEFAULT); + lv_obj_set_style_bg_color(label, lv_color_make(20, 20, 20), LV_STATE_DEFAULT); } else { - lv_obj_set_style_text_color(label, lv_color_make(0, 200, 0), LV_STATE_DEFAULT); + lv_obj_set_style_bg_color(label, lv_color_make(0, 200, 0), LV_STATE_DEFAULT); } } } @@ -59,16 +67,12 @@ static void gpioOnTimer(Context* ctx) { ctx->mutex.unlock(); } -// endregion Task - -static int getSquareSpacing(UiDensity density) { - if (density == LVGL_UI_DENSITY_COMPACT) { - return 0; - } else { - return 4; - } +static void gpioOnTimerCallback(void* context) { + gpioOnTimer(static_cast(context)); } +// endregion Task + void gpioCreateWidgets(lv_obj_t* parent, void* userData) { auto* ctx = static_cast(userData); @@ -96,36 +100,50 @@ void gpioCreateWidgets(lv_obj_t* parent, void* userData) { auto vertical_px = lv_display_get_vertical_resolution(display); bool is_landscape_display = horizontal_px > vertical_px; - constexpr auto block_width = 16; - auto ui_density = lvgl_get_ui_density(); - const auto square_spacing = getSquareSpacing(ui_density); - int32_t x_spacing = block_width + square_spacing; + auto block_size = lvgl_get_text_font_height(FONT_SIZE_DEFAULT); + auto lvgl_density = lvgl_get_ui_density(); + const int32_t square_spacing = (lvgl_density == LVGL_UI_DENSITY_COMPACT) ? 0 : 4; + int32_t x_spacing = block_size + square_spacing; uint8_t column = 0; const uint8_t column_limit = is_landscape_display ? 10 : 5; auto* row_wrapper = createGpioRowWrapper(centering_wrapper); lv_obj_align(row_wrapper, LV_ALIGN_TOP_MID, 0, 0); - ctx->mutex.lock(); + // Measure the widest number label ("00".."") once, so the status squares are + // offset far enough to never overlap it, regardless of the display's font/DPI. + const int32_t label_gap = (lvgl_density == LVGL_UI_DENSITY_COMPACT) ? 2 : (block_size / 2); + char max_label_text[8]; + snprintf(max_label_text, sizeof(max_label_text), "%02lu", static_cast(ctx->pinCount > 0 ? ctx->pinCount - 1 : 0)); + auto* measuring_label = lv_label_create(row_wrapper); + lv_label_set_text(measuring_label, max_label_text); + lv_obj_update_layout(measuring_label); + int32_t offset_from_left_label = lv_obj_get_width(measuring_label) + label_gap; + lv_obj_del(measuring_label); - ctx->pinStates.resize(GPIO_PIN_COUNT); - ctx->pinWidgets.resize(GPIO_PIN_COUNT); + ctx->mutex.lock(); - for (int i = 0; i < GPIO_PIN_COUNT; ++i) { - constexpr uint8_t offset_from_left_label = 4; + ctx->pinStates.reset(new uint8_t[ctx->pinCount]()); + ctx->pinWidgets.reset(new lv_obj_t*[ctx->pinCount]()); + for (uint32_t i = 0; i < ctx->pinCount; ++i) { // Add the GPIO number before the first item on a row if (column == 0) { auto* prefix = lv_label_create(row_wrapper); - lv_label_set_text_fmt(prefix, "%02d", i); + lv_label_set_text_fmt(prefix, "%02lu", static_cast(i)); } // Add a new GPIO status indicator - auto* status_label = lv_label_create(row_wrapper); - lv_obj_set_pos(status_label, (column+1) * x_spacing + offset_from_left_label, 0); - lv_label_set_text_fmt(status_label, "%s", LV_SYMBOL_STOP); - lv_obj_set_style_text_color(status_label, lv_color_make(20, 20, 20), LV_STATE_DEFAULT); - ctx->pinWidgets[i] = status_label; + auto* status_square = lv_obj_create(row_wrapper); + lv_obj_set_pos(status_square, column * x_spacing + offset_from_left_label, 0); + lv_obj_set_size(status_square, block_size, block_size); + lv_obj_set_style_pad_all(status_square, 0, LV_STATE_DEFAULT); + lv_obj_set_style_margin_all(status_square, 0, LV_STATE_DEFAULT); + lv_obj_set_style_border_width(status_square, 0, LV_STATE_DEFAULT); + lv_obj_set_style_radius(status_square, 0, LV_STATE_DEFAULT); + lv_obj_set_style_bg_color(status_square, lv_color_make(20, 20, 20), LV_STATE_DEFAULT); + lv_obj_set_style_bg_opa(status_square, LV_OPA_COVER, LV_STATE_DEFAULT); + ctx->pinWidgets[i] = status_square; ctx->pinStates[i] = false; column++; @@ -133,8 +151,8 @@ void gpioCreateWidgets(lv_obj_t* parent, void* userData) { if (column >= column_limit) { // Add the GPIO number after the last item on a row auto* postfix = lv_label_create(row_wrapper); - lv_label_set_text_fmt(postfix, "%02d", i); - lv_obj_set_pos(postfix, (column + 1) * x_spacing + offset_from_left_label, 0); + lv_label_set_text_fmt(postfix, "%02lu", static_cast(i)); + lv_obj_set_pos(postfix, column * x_spacing + offset_from_left_label + label_gap, 0); // Add a new row wrapper underneath the last one auto* new_row_wrapper = createGpioRowWrapper(centering_wrapper); @@ -149,17 +167,27 @@ void gpioCreateWidgets(lv_obj_t* parent, void* userData) { } void gpioInit(Context* ctx) { - ctx->timer = std::make_unique(tt::Timer::Type::Periodic, pdMS_TO_TICKS(100), [ctx] { - gpioOnTimer(ctx); - }); + if (device_get_first_active_by_type(&GPIO_CONTROLLER_TYPE, &ctx->gpioController) == ERROR_NONE) { + gpio_controller_get_pin_count(ctx->gpioController, &ctx->pinCount); + } else { + LOG_E(TAG, "No active GPIO controller found"); + } + + ctx->timer = timer_alloc(TIMER_TYPE_PERIODIC, pdMS_TO_TICKS(100), gpioOnTimerCallback, ctx); } void gpioTeardown(Context* ctx) { ctx->mutex.lock(); - if (ctx->timer) { - ctx->timer->stop(); + if (ctx->timer != nullptr) { + timer_stop(ctx->timer); + timer_free(ctx->timer); + ctx->timer = nullptr; + } + if (ctx->gpioController != nullptr) { + device_put(ctx->gpioController); + ctx->gpioController = nullptr; } - ctx->pinWidgets.clear(); - ctx->pinStates.clear(); + ctx->pinWidgets.reset(); + ctx->pinStates.reset(); ctx->mutex.unlock(); } diff --git a/Apps/GPIO/main/Source/Gpio.h b/Apps/GPIO/main/Source/Gpio.h index 68307fe..3ed3290 100644 --- a/Apps/GPIO/main/Source/Gpio.h +++ b/Apps/GPIO/main/Source/Gpio.h @@ -1,7 +1,9 @@ #pragma once #include -#include +#include + +#include #include #include @@ -14,11 +16,25 @@ struct Context { // gpioOnTimer()'s comment). uint32_t window = 0; - std::vector pinWidgets; - std::vector pinStates; + // The board's first active GPIO controller. Null if none is found (see gpioInit()). + struct Device* gpioController = nullptr; + uint32_t pinCount = 0; + + // unique_ptr, same reason as pinStates below. + std::unique_ptr pinWidgets; + // unique_ptr, not std::vector: this app links with -nostdlib (elf_loader.cmake), so + // libstdc++ itself is never linked in - any allocator-guard helper symbol a vector's + // destructor path needs (hit with both vector and vector on esp32p4) is + // unresolvable. new[]/delete[] need no such external symbols. Size is ctx->pinCount. + std::unique_ptr pinStates; // Constructed once in gpioInit(); needs ctx's address for its callback closure, so it can't // be a plain default member initializer (Context doesn't exist yet at that point in main()). - std::unique_ptr timer; + // Plain C timer (tactility/concurrent/timer.h), not tt::Timer: tt::Timer stores its callback as + // std::function, and this app links with -nostdlib (elf_loader.cmake) - libstdc++.a + // itself is never linked in, and the toolchain's libstdc++.a is not built with -fPIC anyway, so + // it cannot be linked into this -fPIC -shared ELF at all. timer_callback_t is a plain function + // pointer + void* context, needing no libstdc++ support. Freed explicitly in gpioTeardown(). + struct Timer* timer = nullptr; tt::RecursiveMutex mutex; }; diff --git a/Apps/GPIO/main/Source/main.cpp b/Apps/GPIO/main/Source/main.cpp index 3c79b28..937df94 100644 --- a/Apps/GPIO/main/Source/main.cpp +++ b/Apps/GPIO/main/Source/main.cpp @@ -25,7 +25,7 @@ int main(int argc, char* argv[]) { WindowId window = window_manager_create(app_instance_id, gpioCreateWidgets, &ctx); ctx.window = window; - ctx.timer->start(); + timer_start(ctx.timer); bool should_close = false; while (!should_close) { diff --git a/Apps/GPIO/manifest.properties b/Apps/GPIO/manifest.properties index 4bc0e27..fb55a2b 100644 --- a/Apps/GPIO/manifest.properties +++ b/Apps/GPIO/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.gpio -version.name=0.15.0 -version.code=15 +version.name=0.16.0 +version.code=16 name=GPIO description=Shows the live state of all GPIO pins app.0.id=tactility.gpio diff --git a/Apps/GraphicsDemo/manifest.properties b/Apps/GraphicsDemo/manifest.properties index e50cabe..a9c0fb6 100644 --- a/Apps/GraphicsDemo/manifest.properties +++ b/Apps/GraphicsDemo/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.graphicsdemo -version.name=0.13.0 -version.code=13 +version.name=0.14.0 +version.code=14 name=Graphics Demo app.0.id=tactility.graphicsdemo app.0.name=Graphics Demo diff --git a/Apps/HelloWorld/manifest.properties b/Apps/HelloWorld/manifest.properties index c3bbc94..86703b1 100644 --- a/Apps/HelloWorld/manifest.properties +++ b/Apps/HelloWorld/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4,posix-x86_64 id=tactility.helloworld -version.name=0.13.0 -version.code=13 +version.name=0.14.0 +version.code=14 name=Hello World app.0.id=tactility.helloworld app.0.name=Hello World diff --git a/Apps/M5UnitTest/manifest.properties b/Apps/M5UnitTest/manifest.properties index 12d7cfb..826731e 100644 --- a/Apps/M5UnitTest/manifest.properties +++ b/Apps/M5UnitTest/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32s3,esp32p4 id=tactility.m5unittest -version.name=0.11.0 -version.code=11 +version.name=0.12.0 +version.code=12 name=M5 Unit Test app.0.id=tactility.m5unittest app.0.name=M5 Unit Test diff --git a/Apps/Magic8Ball/manifest.properties b/Apps/Magic8Ball/manifest.properties index d7ed29e..0ec2a8c 100644 --- a/Apps/Magic8Ball/manifest.properties +++ b/Apps/Magic8Ball/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.magic8ball -version.name=0.12.0 -version.code=12 +version.name=0.13.0 +version.code=13 name=Magic 8-Ball app.0.id=tactility.magic8ball app.0.name=Magic 8-Ball diff --git a/Apps/MediaKeys/manifest.properties b/Apps/MediaKeys/manifest.properties index 08a00ad..5ad25fe 100644 --- a/Apps/MediaKeys/manifest.properties +++ b/Apps/MediaKeys/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32s3,esp32p4 id=tactility.mediakeys -version.name=0.13.0 -version.code=13 +version.name=0.14.0 +version.code=14 name=Media Keys description=Bluetooth media keys. Touch or Physical Keyboard control\nB - previous, P - play/pause, N - next, M - mute, D - volume down, U - volume up.\nQ or ESC to exit focus. app.0.id=tactility.mediakeys diff --git a/Apps/MystifyDemo/manifest.properties b/Apps/MystifyDemo/manifest.properties index 937b4dd..4940724 100644 --- a/Apps/MystifyDemo/manifest.properties +++ b/Apps/MystifyDemo/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.mystifydemo -version.name=0.14.0 -version.code=14 +version.name=0.15.0 +version.code=15 name=Mystify Demo description=A graphics demo that is inspired by a Windows 95 screensaver. app.0.id=tactility.mystifydemo diff --git a/Apps/SerialConsole/manifest.properties b/Apps/SerialConsole/manifest.properties index d5c1c67..6e09f89 100644 --- a/Apps/SerialConsole/manifest.properties +++ b/Apps/SerialConsole/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.serialconsole -version.name=0.15.0 -version.code=15 +version.name=0.16.0 +version.code=16 name=Serial Console app.0.id=tactility.serialconsole app.0.name=Serial Console diff --git a/Apps/Snake/manifest.properties b/Apps/Snake/manifest.properties index 326903e..dbc6834 100644 --- a/Apps/Snake/manifest.properties +++ b/Apps/Snake/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.snake -version.name=0.16.0 -version.code=16 +version.name=0.17.0 +version.code=17 name=Snake description=Classic Snake game app.0.id=tactility.snake diff --git a/Apps/TamaTac/manifest.properties b/Apps/TamaTac/manifest.properties index c79ace9..d7985d2 100644 --- a/Apps/TamaTac/manifest.properties +++ b/Apps/TamaTac/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.tamatac -version.name=0.11.0 -version.code=11 +version.name=0.12.0 +version.code=12 name=TamaTac description=Virtual pet inspired by Tamagotchi. Only runs on devices with PSRAM. app.0.id=tactility.tamatac diff --git a/Apps/TodoList/manifest.properties b/Apps/TodoList/manifest.properties index 0469ba6..a0c92b1 100644 --- a/Apps/TodoList/manifest.properties +++ b/Apps/TodoList/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.todolist -version.name=0.14.0 -version.code=14 +version.name=0.15.0 +version.code=15 name=Todo List description=Simple task list manager app.0.id=tactility.todolist diff --git a/Apps/TwoEleven/manifest.properties b/Apps/TwoEleven/manifest.properties index 5ffc099..7811a21 100644 --- a/Apps/TwoEleven/manifest.properties +++ b/Apps/TwoEleven/manifest.properties @@ -2,8 +2,8 @@ manifest.version=0.3 target.sdk=0.8.0-dev target.platforms=esp32,esp32s3,esp32c6,esp32p4 id=tactility.twoeleven -version.name=0.15.0 -version.code=15 +version.name=0.16.0 +version.code=16 name=2048 description=A fun, customizable 2048 sliding tile game for tactility!\nSlide tiles to combine numbers and reach 2048.\nChoose grid sizes: 3x3 (easy), 4x4 (classic), 5x5, or 6x6 (expert). app.0.id=tactility.twoeleven