From 41960b1e9ff151cef1c6efdcb8a3e7cbd9a708bc Mon Sep 17 00:00:00 2001 From: frysee Date: Thu, 9 Jul 2026 11:57:32 +0200 Subject: [PATCH 1/3] feat: Trimui Brick Pro support (tg4040) --- skeleton/BOOT/common/updater | 4 ++-- skeleton/BOOT/trimui/app/runtrimui.sh | 2 +- skeleton/EXTRAS/Tools/tg5040/Files.pak/launch.sh | 3 ++- skeleton/SYSTEM/tg5040/dbg/launch.sh | 2 ++ skeleton/SYSTEM/tg5040/paks/MinUI.pak/launch.sh | 2 ++ workspace/all/bootlogo/bootlogo.c | 2 +- workspace/all/common/api.c | 2 +- workspace/all/ledcontrol/ledcontrol.c | 4 ++-- workspace/all/settings/settings.cpp | 7 ++++++- workspace/tg5040/install/boot.sh | 4 +++- workspace/tg5040/libmsettings/msettings.c | 2 +- workspace/tg5040/platform/platform.c | 8 ++++---- workspace/tg5050/install/boot.sh | 2 +- 13 files changed, 28 insertions(+), 16 deletions(-) diff --git a/skeleton/BOOT/common/updater b/skeleton/BOOT/common/updater index b60bf4233..db8357a7d 100755 --- a/skeleton/BOOT/common/updater +++ b/skeleton/BOOT/common/updater @@ -14,8 +14,8 @@ case $INFO in *"SStar"*) PLATFORM="miyoomini" ;; -*"TG5040"*|*"TG3040"*) - PLATFORM="tg5040" # Trimui Smart Pro or Brick +*"TG5040"*|*"TG3040"*|*"TG4040"*) + PLATFORM="tg5040" # Trimui Smart Pro, Brick, Brick Pro ;; *"TG5050"*) PLATFORM="tg5050" # Trimui Smart Pro S diff --git a/skeleton/BOOT/trimui/app/runtrimui.sh b/skeleton/BOOT/trimui/app/runtrimui.sh index 0cc88374e..e5e71d188 100755 --- a/skeleton/BOOT/trimui/app/runtrimui.sh +++ b/skeleton/BOOT/trimui/app/runtrimui.sh @@ -1,6 +1,6 @@ #!/bin/sh -# becomes /usr/trimui/bin/runtrimui.sh on tg5040/tg3040/tg5050 +# becomes /usr/trimui/bin/runtrimui.sh on tg5040/tg3040/tg5050/tg4040 #wait for SDCARD mounted echo before mount `cat /proc/uptime` >> /tmp/nextui_boottime diff --git a/skeleton/EXTRAS/Tools/tg5040/Files.pak/launch.sh b/skeleton/EXTRAS/Tools/tg5040/Files.pak/launch.sh index 2209d74bd..78f367c44 100755 --- a/skeleton/EXTRAS/Tools/tg5040/Files.pak/launch.sh +++ b/skeleton/EXTRAS/Tools/tg5040/Files.pak/launch.sh @@ -3,7 +3,8 @@ cd $(dirname "$0") HOME="$SDCARD_PATH" -if [ "$DEVICE" = "brick" ]; then +# brick and brickpro +if [ "$DEVICE" = "brick" ] || [ "$DEVICE" = "brickpro" ]; then CFG="tg3040.cfg" else CFG="tg5040.cfg" diff --git a/skeleton/SYSTEM/tg5040/dbg/launch.sh b/skeleton/SYSTEM/tg5040/dbg/launch.sh index 1c9096d49..a60566d1b 100755 --- a/skeleton/SYSTEM/tg5040/dbg/launch.sh +++ b/skeleton/SYSTEM/tg5040/dbg/launch.sh @@ -16,6 +16,8 @@ export DATETIME_PATH="$SHARED_USERDATA_PATH/datetime.txt" export TRIMUI_MODEL=`strings /usr/trimui/bin/MainUI | grep ^Trimui` if [ "$TRIMUI_MODEL" = "Trimui Brick" ]; then export DEVICE="brick" +elif [ "$TRIMUI_MODEL" = "Trimui Brick Pro" ]; then + export DEVICE="brickpro" fi export IS_NEXT="yes" diff --git a/skeleton/SYSTEM/tg5040/paks/MinUI.pak/launch.sh b/skeleton/SYSTEM/tg5040/paks/MinUI.pak/launch.sh index 0aad231b8..e4a585713 100755 --- a/skeleton/SYSTEM/tg5040/paks/MinUI.pak/launch.sh +++ b/skeleton/SYSTEM/tg5040/paks/MinUI.pak/launch.sh @@ -51,6 +51,8 @@ mkdir -p "$SHARED_USERDATA_PATH/.minui" export TRIMUI_MODEL=`strings /usr/trimui/bin/MainUI | grep ^Trimui` if [ "$TRIMUI_MODEL" = "Trimui Brick" ]; then export DEVICE="brick" +elif [ "$TRIMUI_MODEL" = "Trimui Brick Pro" ]; then + export DEVICE="brickpro" else export DEVICE="smartpro" fi diff --git a/workspace/all/bootlogo/bootlogo.c b/workspace/all/bootlogo/bootlogo.c index d1201dc50..c9c2913a3 100644 --- a/workspace/all/bootlogo/bootlogo.c +++ b/workspace/all/bootlogo/bootlogo.c @@ -38,7 +38,7 @@ int loadImages() // This needs to get a bit more flexible down the line, but for now we either expect the files // in the pak root directory or in the "brick" subfolder. char basepath[MAX_PATH]; - if(exactMatch("brick", device)) { + if(exactMatch("brick", device) || exactMatch("brickpro", device)) { snprintf(basepath, sizeof(basepath), "%s/Bootlogo.pak/brick/", TOOLS_PATH); } else { diff --git a/workspace/all/common/api.c b/workspace/all/common/api.c index dfa12b094..46e96d915 100644 --- a/workspace/all/common/api.c +++ b/workspace/all/common/api.c @@ -4514,7 +4514,7 @@ void LEDS_updateLeds(bool indicator_only) int lightsize = 3; char *device = getenv("DEVICE"); - int is_brick = exactMatch("brick", device); + int is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); if (is_brick) lightsize = 4; if(!lights) diff --git a/workspace/all/ledcontrol/ledcontrol.c b/workspace/all/ledcontrol/ledcontrol.c index 0452703f1..9d22f0229 100644 --- a/workspace/all/ledcontrol/ledcontrol.c +++ b/workspace/all/ledcontrol/ledcontrol.c @@ -33,7 +33,7 @@ void save_settings() { LOG_debug("saving settings plat\n"); char diskfilename[256]; char* device = getenv("DEVICE"); - int is_brick = exactMatch("brick", device); + int is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); int maxlights = 4; // TODO: this shouldnt be in shared userdata if(is_brick) { @@ -214,7 +214,7 @@ void handle_light_input(LightSettings *light, SDL_Event *event, int selected_set int main(int argc, char *argv[]) { char* device = getenv("DEVICE"); - int is_brick = exactMatch("brick", device); + int is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); InitSettings(); PWR_setCPUSpeed(CPU_SPEED_AUTO); diff --git a/workspace/all/settings/settings.cpp b/workspace/all/settings/settings.cpp index b8d8d3824..4a7612ffd 100644 --- a/workspace/all/settings/settings.cpp +++ b/workspace/all/settings/settings.cpp @@ -245,6 +245,7 @@ namespace { enum Model { UnknownModel, Brick, + BrickPro, SmartPro, SmartProS, Flip @@ -264,6 +265,10 @@ namespace { m_vendor = Trimui; m_model = Brick; m_platform = tg5040; + } else if(exactMatch("brickpro", device)) { + m_vendor = Trimui; + m_model = BrickPro; + m_platform = tg5040; } else if(exactMatch("smartpro", device)) { m_vendor = Trimui; m_model = SmartPro; @@ -309,7 +314,7 @@ namespace { } bool hasAnalogSticks() const { - return m_model == SmartPro || m_model == SmartProS; + return m_model == SmartPro || m_model == SmartProS || m_model == BrickPro; } bool hasWifi() const { diff --git a/workspace/tg5040/install/boot.sh b/workspace/tg5040/install/boot.sh index a4d22d5e9..4b979fb0e 100755 --- a/workspace/tg5040/install/boot.sh +++ b/workspace/tg5040/install/boot.sh @@ -13,6 +13,8 @@ export PATH=/usr/trimui/bin:$PATH TRIMUI_MODEL=`strings /usr/trimui/bin/MainUI | grep ^Trimui` if [ "$TRIMUI_MODEL" = "Trimui Brick" ]; then DEVICE="brick" +elif [ "$TRIMUI_MODEL" = "Trimui Brick Pro" ]; then + DEVICE="brickpro" fi # only show splash if either UPDATE_PATH or pakz files exist @@ -35,7 +37,7 @@ fi if [ "$SHOW_SPLASH" = "yes" ] ; then cd $(dirname "$0")/$PLATFORM - if [ "$DEVICE" = "brick" ]; then + if [ "$DEVICE" = "brick" ] || [ "$DEVICE" = "brickpro" ]; then ./show2.elf --mode=daemon --image="$LOGO_PATH" --text="Installing..." --logoheight=144 --fontsize=32 --progress=-1 & else ./show2.elf --mode=daemon --image="$LOGO_PATH" --text="Installing..." --logoheight=128 --progress=-1 & diff --git a/workspace/tg5040/libmsettings/msettings.c b/workspace/tg5040/libmsettings/msettings.c index 6ec93eefd..72b210e1c 100644 --- a/workspace/tg5040/libmsettings/msettings.c +++ b/workspace/tg5040/libmsettings/msettings.c @@ -330,7 +330,7 @@ static void applyDisplayCalDefaultsForDevice(Settings *target) { void InitSettings(void) { char* device = getenv("DEVICE"); - is_brick = exactMatch("brick", device); + is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); is_smartpro = exactMatch("smartpro", device); sprintf(SettingsPath, "%s/msettings.bin", getenv("USERDATA_PATH")); diff --git a/workspace/tg5040/platform/platform.c b/workspace/tg5040/platform/platform.c index 6c975993f..98ec12b9c 100644 --- a/workspace/tg5040/platform/platform.c +++ b/workspace/tg5040/platform/platform.c @@ -28,14 +28,14 @@ int is_brick = 0; void PLAT_initPlatform(void) { // TODO: replace with something that doesnt bleed out of tg5040 scope char *device = getenv("DEVICE"); - is_brick = exactMatch("brick", device); + is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); } static SDL_Joystick **joysticks = NULL; static int num_joysticks = 0; void PLAT_initInput(void) { char* device = getenv("DEVICE"); - is_brick = exactMatch("brick", device); + is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) LOG_error("Failed initializing joysticks: %s\n", SDL_GetError()); num_joysticks = SDL_NumJoysticks(); @@ -374,7 +374,7 @@ ConnectionStrength PLAT_connectionStrength(void) { void PLAT_initDefaultLeds() { char* device = getenv("DEVICE"); - is_brick = exactMatch("brick", device); + is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); if(is_brick) { lightsDefault[0] = (LightSettings) { "FN 1 key", @@ -480,7 +480,7 @@ void PLAT_initDefaultLeds() { void PLAT_initLeds(LightSettings *lights) { char* device = getenv("DEVICE"); - is_brick = exactMatch("brick", device); + is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); PLAT_initDefaultLeds(); FILE *file; diff --git a/workspace/tg5050/install/boot.sh b/workspace/tg5050/install/boot.sh index ec7bb03b1..1224e54f6 100755 --- a/workspace/tg5050/install/boot.sh +++ b/workspace/tg5050/install/boot.sh @@ -35,7 +35,7 @@ fi if [ "$SHOW_SPLASH" = "yes" ] ; then cd $(dirname "$0")/$PLATFORM - if [ "$DEVICE" = "brick" ]; then + if [ "$DEVICE" = "brick" ] || [ "$DEVICE" = "brickpro" ]; then ./show2.elf --mode=daemon --image="$LOGO_PATH" --text="Installing..." --logoheight=144 --fontsize=32 --progress=-1 & else ./show2.elf --mode=daemon --image="$LOGO_PATH" --text="Installing..." --logoheight=128 --progress=-1 & From 5dece08b948c019a6721ca27be263b36ed97daff Mon Sep 17 00:00:00 2001 From: frysee Date: Fri, 10 Jul 2026 16:29:31 +0200 Subject: [PATCH 2/3] fix: RGB LEDs --- .../Tools/tg5040/LedControl.pak/launch.sh | 8 + .../LedControl.pak/ledsettings_brickpro.txt | 50 ++++++ workspace/all/common/api.c | 8 +- workspace/all/common/displaycal.h | 14 +- workspace/all/ledcontrol/ledcontrol.c | 37 ++-- workspace/tg5040/libmsettings/msettings.c | 22 ++- workspace/tg5040/platform/platform.c | 159 +++++------------- workspace/tg5040/platform/platform.h | 21 +-- 8 files changed, 175 insertions(+), 144 deletions(-) create mode 100644 skeleton/EXTRAS/Tools/tg5040/LedControl.pak/ledsettings_brickpro.txt diff --git a/skeleton/EXTRAS/Tools/tg5040/LedControl.pak/launch.sh b/skeleton/EXTRAS/Tools/tg5040/LedControl.pak/launch.sh index 3bc5423d6..06dffbccd 100644 --- a/skeleton/EXTRAS/Tools/tg5040/LedControl.pak/launch.sh +++ b/skeleton/EXTRAS/Tools/tg5040/LedControl.pak/launch.sh @@ -28,4 +28,12 @@ else echo "File already exists in TARGET_PATH" >> launch.log fi +TARGET_PATH="/mnt/SDCARD/.userdata/shared/ledsettings_brickpro.txt" +if [ ! -f "$TARGET_PATH" ]; then + cp ./ledsettings_brickpro.txt /mnt/SDCARD/.userdata/shared/ledsettings_brickpro.txt >> launch.log + echo "File copied to $TARGET_PATH" >> launch.log +else + echo "File already exists in $TARGET_PATH" >> launch.log +fi + ./ledcontrol.elf > ledcontrol.log 2>&1 diff --git a/skeleton/EXTRAS/Tools/tg5040/LedControl.pak/ledsettings_brickpro.txt b/skeleton/EXTRAS/Tools/tg5040/LedControl.pak/ledsettings_brickpro.txt new file mode 100644 index 000000000..b2d30193b --- /dev/null +++ b/skeleton/EXTRAS/Tools/tg5040/LedControl.pak/ledsettings_brickpro.txt @@ -0,0 +1,50 @@ +[f1] +effect=4 +color1=0x440044 +color2=0x440044 +speed=1000 +brightness=100 +trigger=1 +filename=f1 +inbrightness=100 + +[f2] +effect=4 +color1=0x440044 +color2=0x440044 +speed=1000 +brightness=100 +trigger=1 +filename=f2 +inbrightness=100 + +[m] +effect=4 +color1=0x440044 +color2=0x440044 +speed=1000 +brightness=100 +trigger=1 +filename=m +inbrightness=100 + +[lr] +effect=4 +color1=0x440044 +color2=0x440044 +speed=1000 +brightness=100 +trigger=1 +filename=lr +inbrightness=100 + +[rear] +effect=4 +color1=0x440044 +color2=0x440044 +speed=1000 +brightness=100 +trigger=1 +filename=rear +inbrightness=100 + diff --git a/workspace/all/common/api.c b/workspace/all/common/api.c index 46e96d915..6cc6d2117 100644 --- a/workspace/all/common/api.c +++ b/workspace/all/common/api.c @@ -4512,11 +4512,11 @@ void LEDS_updateLeds(bool indicator_only) return; } - int lightsize = 3; char *device = getenv("DEVICE"); - int is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); - if (is_brick) - lightsize = 4; + int lightsize = exactMatch("brick", device) ? 4 + : exactMatch("brickpro", device) ? 5 + : 3; // smartpro, smartpro s + if(!lights) { LOG_error("LEDS_updateLeds called but lights is NULL\n"); diff --git a/workspace/all/common/displaycal.h b/workspace/all/common/displaycal.h index 8a0a65e3f..a3b2f935d 100644 --- a/workspace/all/common/displaycal.h +++ b/workspace/all/common/displaycal.h @@ -46,10 +46,19 @@ static const struct DisplayCalDefaults DisplayCalDefaults_SmartPro = { DISPLAYCAL_SMARTPRO_DEFAULT_BLUE_GAIN }; +// TrimUI Brick Pro, TODO +static const struct DisplayCalDefaults DisplayCalDefaults_BrickPro = { + DISPLAYCAL_BRICK_DEFAULT_ENABLED, + DISPLAYCAL_BRICK_DEFAULT_RED_GAIN, + DISPLAYCAL_BRICK_DEFAULT_GREEN_GAIN, + DISPLAYCAL_BRICK_DEFAULT_BLUE_GAIN +}; + enum DisplayCalPreset { DISPLAYCAL_PRESET_DEFAULT = 0, DISPLAYCAL_PRESET_BRICK, - DISPLAYCAL_PRESET_SMARTPRO + DISPLAYCAL_PRESET_SMARTPRO, + DISPLAYCAL_PRESET_BRICKPRO, }; static inline DisplayCalDefaults DisplayCal_getDefaultSettings(enum DisplayCalPreset preset) { @@ -59,6 +68,9 @@ static inline DisplayCalDefaults DisplayCal_getDefaultSettings(enum DisplayCalPr if(preset == DISPLAYCAL_PRESET_BRICK) { return DisplayCalDefaults_Brick; } + if(preset == DISPLAYCAL_PRESET_BRICKPRO) { + return DisplayCalDefaults_BrickPro; + } // Default preset DisplayCalDefaults defaults = { DISPLAYCAL_DEFAULT_ENABLED, diff --git a/workspace/all/ledcontrol/ledcontrol.c b/workspace/all/ledcontrol/ledcontrol.c index 9d22f0229..e22ecbe7f 100644 --- a/workspace/all/ledcontrol/ledcontrol.c +++ b/workspace/all/ledcontrol/ledcontrol.c @@ -11,7 +11,7 @@ #define NUM_MAIN_OPTIONS 5 #define MAX_NAME_LEN 255 -const char *lightnames[4]; +const char *lightnames[5]; #define NROF_TRIGGERS 14 const char *triggernames[] = { "B", "A", "Y", "X", "L", "R", "FN1", "FN2", "MENU", "SELECT", "START", "ALL", "LR", "DPAD"}; @@ -33,14 +33,17 @@ void save_settings() { LOG_debug("saving settings plat\n"); char diskfilename[256]; char* device = getenv("DEVICE"); - int is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); - int maxlights = 4; + int maxlights = 3; // TODO: this shouldnt be in shared userdata - if(is_brick) { + if(exactMatch("brick", device)) { + maxlights = 4; snprintf(diskfilename, sizeof(diskfilename), SHARED_USERDATA_PATH "/ledsettings_brick.txt"); } + else if (exactMatch("brickpro", device)) { + maxlights = 5; + snprintf(diskfilename, sizeof(diskfilename), SHARED_USERDATA_PATH "/ledsettings_brickpro.txt"); + } else { - maxlights = 3; snprintf(diskfilename, sizeof(diskfilename), SHARED_USERDATA_PATH "/ledsettings.txt"); } @@ -214,14 +217,23 @@ void handle_light_input(LightSettings *light, SDL_Event *event, int selected_set int main(int argc, char *argv[]) { char* device = getenv("DEVICE"); - int is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); InitSettings(); PWR_setCPUSpeed(CPU_SPEED_AUTO); - if (is_brick) { + int numOfLights = 3; + int combinedBrightness = 1; + if (exactMatch("brick", device)) { const char *brick_names[] = {"F1 key", "F2 key", "Top bar", "L&R triggers"}; memcpy(lightnames, brick_names, sizeof(brick_names)); // Copy values + numOfLights = 4; + combinedBrightness = 0; + } + else if (exactMatch("brickpro", device)) { + const char *brickpro_names[] = {"F1 key", "F2 key", "Top bar", "Joysticks", "Triggers"}; + memcpy(lightnames, brickpro_names, sizeof(brickpro_names)); // Copy values + numOfLights = 5; + combinedBrightness = 0; } else { const char *default_names[] = {"Joystick L","Joystick R", "Logo"}; memcpy(lightnames, default_names, sizeof(default_names)); // Copy values @@ -264,9 +276,6 @@ int main(int argc, char *argv[]) dirty = 1; had_bt = has_bt; - int numOfLights = 3; - if(is_brick) numOfLights = 4; - if (PAD_justPressed(BTN_B)) { quit = 1; } @@ -321,12 +330,12 @@ int main(int argc, char *argv[]) // const char *settings_labels[6] = {"Effect", "Color", "Color2", "Speed", "Brightness", "Trigger"}; // this stuff is really not multiplatform at all, need to figure out a way so its not so TrimUI specific const char *settings_labels[5]; // Define array with correct size - if (is_brick) { - const char *brick_labels[] = {"Effect", "Color", "Speed", "Brightness", "Info brightness"}; - memcpy(settings_labels, brick_labels, sizeof(brick_labels)); // Copy values - } else { + if (combinedBrightness) { const char *non_brick_labels[] = {"Effect", "Color", "Speed", "Brightness (All Leds)", "Info brightness (All Leds)"}; memcpy(settings_labels, non_brick_labels, sizeof(non_brick_labels)); // Copy values + } else { + const char *brick_labels[] = {"Effect", "Color", "Speed", "Brightness", "Info brightness"}; + memcpy(settings_labels, brick_labels, sizeof(brick_labels)); // Copy values } int settings_values[5] = { lightsDefault[selected_light].effect, diff --git a/workspace/tg5040/libmsettings/msettings.c b/workspace/tg5040/libmsettings/msettings.c index 72b210e1c..62b0f8ab9 100644 --- a/workspace/tg5040/libmsettings/msettings.c +++ b/workspace/tg5040/libmsettings/msettings.c @@ -315,11 +315,13 @@ int peekVersion(const char *filename) { } static int is_brick = 0; +static int is_brickpro = 0; static int is_smartpro = 0; static void applyDisplayCalDefaultsForDevice(Settings *target) { DisplayCalDefaults defaults = DisplayCal_getDefaultSettings( - is_brick ? DISPLAYCAL_PRESET_BRICK + is_brick ? DISPLAYCAL_PRESET_BRICK + : is_brickpro ? DISPLAYCAL_PRESET_BRICK : is_smartpro ? DISPLAYCAL_PRESET_SMARTPRO : DISPLAYCAL_PRESET_DEFAULT); target->displaycal_enabled = defaults.enabled; @@ -330,7 +332,8 @@ static void applyDisplayCalDefaultsForDevice(Settings *target) { void InitSettings(void) { char* device = getenv("DEVICE"); - is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); + is_brick = exactMatch("brick", device); + is_brickpro = exactMatch("brickpro", device); is_smartpro = exactMatch("smartpro", device); sprintf(SettingsPath, "%s/msettings.bin", getenv("USERDATA_PATH")); @@ -1066,6 +1069,21 @@ int scaleBrightness(int value) { case 10: raw=255; break; // 64 } } + else if (is_brickpro) { + switch (value) { + case 0: raw=1; break; // 0 + case 1: raw=8; break; // 8 + case 2: raw=16; break; // 8 + case 3: raw=32; break; // 16 + case 4: raw=48; break; // 16 + case 5: raw=72; break; // 24 + case 6: raw=96; break; // 24 + case 7: raw=128; break; // 32 + case 8: raw=160; break; // 32 + case 9: raw=192; break; // 32 + case 10: raw=255; break; // 64 + } + } else { switch (value) { case 0: raw=4; break; // 0 diff --git a/workspace/tg5040/platform/platform.c b/workspace/tg5040/platform/platform.c index 98ec12b9c..1b24c40aa 100644 --- a/workspace/tg5040/platform/platform.c +++ b/workspace/tg5040/platform/platform.c @@ -25,17 +25,18 @@ #include int is_brick = 0; +int is_brickpro = 0; void PLAT_initPlatform(void) { // TODO: replace with something that doesnt bleed out of tg5040 scope char *device = getenv("DEVICE"); - is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); + is_brick = exactMatch("brick", device); + is_brickpro = exactMatch("brickpro", device); } static SDL_Joystick **joysticks = NULL; static int num_joysticks = 0; void PLAT_initInput(void) { - char* device = getenv("DEVICE"); - is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); + PLAT_initPlatform(); if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) LOG_error("Failed initializing joysticks: %s\n", SDL_GetError()); num_joysticks = SDL_NumJoysticks(); @@ -190,7 +191,7 @@ void PLAT_getBatteryStatusFine(int *is_charging, int *charge) void PLAT_enableBacklight(int enable) { if (enable) { - if (is_brick) SetRawBrightness(8); + if (is_brick || is_brickpro) SetRawBrightness(8); SetBrightness(GetBrightness()); } else { @@ -373,120 +374,39 @@ ConnectionStrength PLAT_connectionStrength(void) { } void PLAT_initDefaultLeds() { - char* device = getenv("DEVICE"); - is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); - if(is_brick) { - lightsDefault[0] = (LightSettings) { - "FN 1 key", - "f1", - 4, - 1000, - 100, - 0xFFFFFF, - 0xFFFFFF, - 0, - {}, - 1, - 100, - 0 - }; - lightsDefault[1] = (LightSettings) { - "FN 2 key", - "f2", - 4, - 1000, - 100, - 0xFFFFFF, - 0xFFFFFF, - 0, - {}, - 1, - 100, - 0 - }; - lightsDefault[2] = (LightSettings) { - "Topbar", - "m", - 4, - 1000, - 100, - 0xFFFFFF, - 0xFFFFFF, - 0, - {}, - 1, - 100, - 0 - }; - lightsDefault[3] = (LightSettings) { - "L/R triggers", - "lr", - 4, - 1000, - 100, - 0xFFFFFF, - 0xFFFFFF, - 0, - {}, - 1, - 100, - 0 - }; -} else { - lightsDefault[0] = (LightSettings) { - "Joystick L", - "l", - 4, - 1000, - 100, - 0xFFFFFF, - 0xFFFFFF, - 0, - {}, - 1, - 100, - 0 - }; - lightsDefault[1] = (LightSettings) { - "Joystick R", - "r", - 4, - 1000, - 100, - 0xFFFFFF, - 0xFFFFFF, - 0, - {}, - 1, - 100, - 0 - }; - lightsDefault[2] = (LightSettings) { - "Logo", - "m", - 4, - 1000, - 100, - 0xFFFFFF, - 0xFFFFFF, - 0, - {}, - 1, - 100, - 0 - }; -} + PLAT_initPlatform(); + if(is_brickpro) { + lightsDefault[0] = (LightSettings) {"FN 1 key","f1",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + lightsDefault[1] = (LightSettings) {"FN 2 key","f2",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + lightsDefault[2] = (LightSettings) {"Topbar","m",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + lightsDefault[3] = (LightSettings) {"Joysticks L/R","lr",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + //lightsDefault[4] = (LightSettings) {"Joystick L","l",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + //lightsDefault[5] = (LightSettings) {"Joystick R","r",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + lightsDefault[4] = (LightSettings) {"Triggers L/R","rear",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + } + else if(is_brick) { + lightsDefault[0] = (LightSettings) {"FN 1 key","f1",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + lightsDefault[1] = (LightSettings) {"FN 2 key","f2",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + lightsDefault[2] = (LightSettings) {"Topbar","m",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + lightsDefault[3] = (LightSettings) {"L/R triggers","lr",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + //lightsDefault[3] = (LightSettings) {"L trigger","l",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + //lightsDefault[3] = (LightSettings) {"R trigger","r",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + } else { + lightsDefault[0] = (LightSettings) {"Joystick L","l",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + lightsDefault[1] = (LightSettings) {"Joystick R","r",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + lightsDefault[2] = (LightSettings) {"Logo","m",4,1000,100,0xFFFFFF,0xFFFFFF,0,{},1,100,0}; + } } void PLAT_initLeds(LightSettings *lights) { - char* device = getenv("DEVICE"); - is_brick = exactMatch("brick", device) || exactMatch("brickpro", device); - PLAT_initDefaultLeds(); FILE *file; if(is_brick) { file = PLAT_OpenSettings("ledsettings_brick.txt"); } + else if(is_brickpro) { + file = PLAT_OpenSettings("ledsettings_brickpro.txt"); + } else { file = PLAT_OpenSettings("ledsettings.txt"); } @@ -572,16 +492,29 @@ void PLAT_initLeds(LightSettings *lights) } } +// Brick: Brightness for "m" (top bar) +// Brick Pro: Brightness for "m" (top bar)? +// Smart Pro/S: Global brightness for all #define LED_PATH1 "/sys/class/led_anim/max_scale" +// Brick: Brightness for "lr" (triggers) +// Brick Pro: Brightness for "lr" (joysticks)? +// Smart Pro/S: n/a #define LED_PATH2 "/sys/class/led_anim/max_scale_lr" -#define LED_PATH3 "/sys/class/led_anim/max_scale_f1f2" +// Brick: Brightness for "f1f2" (buttons) +// Brick Pro: Brightness for "f1f2" (buttons)? +// Smart Pro/S: n/a +#define LED_PATH3 "/sys/class/led_anim/max_scale_f1f2" +// Brick: n/a +// Brick Pro: Brightness for "rear" (triggers) +// Smart Pro/S: n/a +#define LED_PATH4 "/sys/class/led_anim/max_scale_rear" void PLAT_setLedInbrightness(LightSettings *led) { char filepath[256]; FILE *file; // first set brightness - if(is_brick) { + if(is_brick || is_brickpro) { if (strcmp(led->filename, "m") == 0) { snprintf(filepath, sizeof(filepath), LED_PATH1); } else if (strcmp(led->filename, "f1") == 0) { @@ -607,7 +540,7 @@ void PLAT_setLedBrightness(LightSettings *led) char filepath[256]; FILE *file; // first set brightness - if(is_brick) { + if(is_brick || is_brickpro) { if (strcmp(led->filename, "m") == 0) { snprintf(filepath, sizeof(filepath), "/sys/class/led_anim/max_scale"); } else if (strcmp(led->filename, "f1") == 0) { diff --git a/workspace/tg5040/platform/platform.h b/workspace/tg5040/platform/platform.h index 6e2ef67ed..c8e4d9153 100644 --- a/workspace/tg5040/platform/platform.h +++ b/workspace/tg5040/platform/platform.h @@ -12,6 +12,7 @@ /////////////////////////////// extern int is_brick; +extern int is_brickpro; /////////////////////////////// @@ -89,13 +90,13 @@ extern int is_brick; #define JOY_R1 5 #define JOY_L2 JOY_NA #define JOY_R2 JOY_NA -#define JOY_L3 (is_brick?9:JOY_NA) -#define JOY_R3 (is_brick?10:JOY_NA) +#define JOY_L3 (is_brick||is_brickpro?9:JOY_NA) +#define JOY_R3 (is_brick||is_brickpro?10:JOY_NA) #define JOY_MENU 8 #define JOY_POWER 102 -#define JOY_PLUS (is_brick?14:128) -#define JOY_MINUS (is_brick?13:129) +#define JOY_PLUS (is_brick||is_brickpro?14:128) +#define JOY_MINUS (is_brick||is_brickpro?13:129) /////////////////////////////// @@ -120,9 +121,9 @@ extern int is_brick; /////////////////////////////// -#define FIXED_SCALE (is_brick?3:2) -#define FIXED_WIDTH (is_brick?1024:1280) -#define FIXED_HEIGHT (is_brick?768:720) +#define FIXED_SCALE (is_brick||is_brickpro?3:2) +#define FIXED_WIDTH (is_brick||is_brickpro?1024:1280) +#define FIXED_HEIGHT (is_brick||is_brickpro?768:720) #define FIXED_BPP 2 #define FIXED_DEPTH (FIXED_BPP * 8) #define FIXED_PITCH (FIXED_WIDTH * FIXED_BPP) @@ -130,9 +131,9 @@ extern int is_brick; /////////////////////////////// -#define MAIN_ROW_COUNT (is_brick ? 7 : 10) -#define QUICK_SWITCHER_COUNT (is_brick ? 3 : 4) -#define PADDING (is_brick ? 5 : 10) +#define MAIN_ROW_COUNT (is_brick||is_brickpro ? 7 : 10) +#define QUICK_SWITCHER_COUNT (is_brick||is_brickpro ? 3 : 4) +#define PADDING (is_brick||is_brickpro ? 5 : 10) /////////////////////////////// From 2798b3947960ce77fefdcd9ff6331b202c287f5c Mon Sep 17 00:00:00 2001 From: frysee Date: Fri, 10 Jul 2026 17:36:35 +0200 Subject: [PATCH 3/3] fix: input mapping for F1/F2 --- workspace/all/common/api.c | 26 ++++++++++++++++--- workspace/all/common/defines.h | 4 +++ workspace/all/minput/minput.c | 36 +++++++++++++++++++-------- workspace/desktop/platform/platform.h | 16 ++++++++---- workspace/tg5040/platform/platform.h | 7 ++++++ workspace/tg5050/platform/platform.h | 6 +++++ 6 files changed, 77 insertions(+), 18 deletions(-) diff --git a/workspace/all/common/api.c b/workspace/all/common/api.c index 6cc6d2117..aa79c766f 100644 --- a/workspace/all/common/api.c +++ b/workspace/all/common/api.c @@ -3327,7 +3327,7 @@ FALLBACK_IMPLEMENTATION void PLAT_pollInput(void) { uint8_t code = event.key.keysym.scancode; pressed = event.type == SDL_KEYDOWN; - // LOG_info("key event: %i (%i)\n", code,pressed); + LOG_info("key event: %i (%i)\n", code,pressed); if (code == CODE_UP) { btn = BTN_DPAD_UP; @@ -3403,6 +3403,11 @@ FALLBACK_IMPLEMENTATION void PLAT_pollInput(void) btn = BTN_L3; id = BTN_ID_L3; } + else if (code == CODE_L4) + { + btn = BTN_L4; + id = BTN_ID_L4; + } else if (code == CODE_R1) { btn = BTN_R1; @@ -3418,6 +3423,11 @@ FALLBACK_IMPLEMENTATION void PLAT_pollInput(void) btn = BTN_R3; id = BTN_ID_R3; } + else if (code == CODE_R4) + { + btn = BTN_R4; + id = BTN_ID_R4; + } else if (code == CODE_PLUS) { btn = BTN_PLUS; @@ -3443,7 +3453,7 @@ FALLBACK_IMPLEMENTATION void PLAT_pollInput(void) { uint8_t joy = event.jbutton.button; pressed = event.type == SDL_JOYBUTTONDOWN; - // LOG_info("joy event: %i (%i)\n", joy,pressed); + LOG_info("joy event: %i (%i)\n", joy,pressed); if (joy == JOY_UP) { btn = BTN_DPAD_UP; @@ -3524,6 +3534,11 @@ FALLBACK_IMPLEMENTATION void PLAT_pollInput(void) btn = BTN_L3; id = BTN_ID_L3; } + else if (joy == JOY_L4) + { + btn = BTN_L4; + id = BTN_ID_L4; + } else if (joy == JOY_R1) { btn = BTN_R1; @@ -3539,6 +3554,11 @@ FALLBACK_IMPLEMENTATION void PLAT_pollInput(void) btn = BTN_R3; id = BTN_ID_R3; } + else if (joy == JOY_R4) + { + btn = BTN_R4; + id = BTN_ID_R4; + } else if (joy == JOY_PLUS) { btn = BTN_PLUS; @@ -3559,7 +3579,7 @@ FALLBACK_IMPLEMENTATION void PLAT_pollInput(void) { int hats[4] = {-1, -1, -1, -1}; // -1=no change,0=up,1=down,2=left,3=right btn_ids int hat = event.jhat.value; - // LOG_info("hat event: %i\n", hat); + LOG_info("hat event: %i\n", hat); // TODO: safe to assume hats will always be the primary dpad? // TODO: this is literally a bitmask, make it one (oh, except there's 3 states...) switch (hat) diff --git a/workspace/all/common/defines.h b/workspace/all/common/defines.h index ba5bf08f0..1390cf1b0 100644 --- a/workspace/all/common/defines.h +++ b/workspace/all/common/defines.h @@ -180,6 +180,8 @@ enum { BTN_ID_R2, BTN_ID_L3, BTN_ID_R3, + BTN_ID_L4, + BTN_ID_R4, BTN_ID_MENU, BTN_ID_PLUS, BTN_ID_MINUS, @@ -211,6 +213,8 @@ enum { BTN_R2 = 1 << BTN_ID_R2, BTN_L3 = 1 << BTN_ID_L3, BTN_R3 = 1 << BTN_ID_R3, + BTN_L4 = 1 << BTN_ID_L4, + BTN_R4 = 1 << BTN_ID_R4, BTN_MENU = 1 << BTN_ID_MENU, BTN_PLUS = 1 << BTN_ID_PLUS, BTN_MINUS = 1 << BTN_ID_MINUS, diff --git a/workspace/all/minput/minput.c b/workspace/all/minput/minput.c index 8c06fef5b..f611ab478 100644 --- a/workspace/all/minput/minput.c +++ b/workspace/all/minput/minput.c @@ -54,9 +54,9 @@ int main(int argc , char* argv[]) { int has_R2 = (BUTTON_R2!=BUTTON_NA || CODE_R2!=CODE_NA || JOY_R2!=JOY_NA || AXIS_R2!=AXIS_NA); int has_L3 = (BUTTON_L3!=BUTTON_NA || CODE_L3!=CODE_NA || JOY_L3!=JOY_NA); int has_R3 = (BUTTON_R3!=BUTTON_NA || CODE_R3!=CODE_NA || JOY_R3!=JOY_NA); - int has_LS = (AXIS_LX!=AXIS_NA); - int has_RS = (AXIS_RX!=AXIS_NA); - + int has_L4 = (BUTTON_L4!=BUTTON_NA || CODE_L4!=CODE_NA || JOY_L4!=JOY_NA); + int has_R4 = (BUTTON_R4!=BUTTON_NA || CODE_R4!=CODE_NA || JOY_R4!=JOY_NA); + int has_volume = (BUTTON_PLUS!=BUTTON_NA || CODE_PLUS!=CODE_NA || JOY_PLUS!=JOY_NA); int has_power = HAS_POWER_BUTTON; int has_menu = HAS_MENU_BUTTON; @@ -96,11 +96,19 @@ int main(int argc , char* argv[]) { ox = w; if (has_L2) w += getButtonWidth("L2") + SCALE1(BUTTON_MARGIN); - if (!has_L2) x += SCALE1(PILL_SIZE); + if (has_L4) w += getButtonWidth("L4") + SCALE1(BUTTON_MARGIN); + if (!has_L2 && !has_L4) x += SCALE1(PILL_SIZE); GFX_blitPillColor(ASSET_WHITE_PILL, screen, &(SDL_Rect){x, y, w}, THEME_COLOR3, RGB_WHITE); - blitButton("L1", screen, PAD_isPressed(BTN_L1), x+SCALE1(BUTTON_MARGIN), y+SCALE1(BUTTON_MARGIN),0); - if (has_L2) blitButton("L2", screen, PAD_isPressed(BTN_L2), x+ox, y+SCALE1(BUTTON_MARGIN),0); + blitButton("L1", screen, PAD_isPressed(BTN_L1), x + SCALE1(BUTTON_MARGIN), y+SCALE1(BUTTON_MARGIN),0); + if (has_L2) { + x += ox; + blitButton("L2", screen, PAD_isPressed(BTN_L2), x, y+SCALE1(BUTTON_MARGIN),0); + } + if (has_L4) { + x += ox - SCALE1(BUTTON_MARGIN); + blitButton("L4", screen, PAD_isPressed(BTN_L4), x, y+SCALE1(BUTTON_MARGIN),0); + } } // R group @@ -114,14 +122,22 @@ int main(int argc , char* argv[]) { ox = w; if (has_R2) w += getButtonWidth("R2") + SCALE1(BUTTON_MARGIN); + if (has_R4) w += getButtonWidth("R4") + SCALE1(BUTTON_MARGIN); x = FIXED_WIDTH - w - SCALE1(BUTTON_MARGIN + PADDING); - if (!has_R2) x -= SCALE1(PILL_SIZE); - + if (!has_R2 && !has_R4) x -= SCALE1(PILL_SIZE); + GFX_blitPillColor(ASSET_WHITE_PILL, screen, &(SDL_Rect){x,y,w}, THEME_COLOR3, RGB_WHITE); - blitButton(has_R2?"R2":"R1", screen, PAD_isPressed(has_R2?BTN_R2:BTN_R1), x+SCALE1(BUTTON_MARGIN), y+SCALE1(BUTTON_MARGIN),0); - if (has_R2) blitButton("R1", screen, PAD_isPressed(BTN_R1), x+ox, y+SCALE1(BUTTON_MARGIN),0); + if(has_R4) { + x+= SCALE1(BUTTON_MARGIN); + blitButton("R4", screen, PAD_isPressed(BTN_R4), x, y+SCALE1(BUTTON_MARGIN),0); + } + if(has_R2) { + x+= ox - SCALE1(BUTTON_MARGIN); + blitButton("R2", screen, PAD_isPressed(BTN_R2), x, y+SCALE1(BUTTON_MARGIN),0); + } + blitButton("R1", screen, PAD_isPressed(BTN_R1), x+ox - SCALE1(BUTTON_MARGIN), y+SCALE1(BUTTON_MARGIN),0); } // DPAD group diff --git a/workspace/desktop/platform/platform.h b/workspace/desktop/platform/platform.h index 20a752df2..62ab6ec1d 100644 --- a/workspace/desktop/platform/platform.h +++ b/workspace/desktop/platform/platform.h @@ -28,6 +28,8 @@ #define BUTTON_R2 BUTTON_NA #define BUTTON_L3 BUTTON_NA #define BUTTON_R3 BUTTON_NA +#define BUTTON_L4 BUTTON_NA +#define BUTTON_R4 BUTTON_NA #define BUTTON_MENU BUTTON_NA #define BUTTON_MENU_ALT BUTTON_NA @@ -53,11 +55,13 @@ #define CODE_Y 20 // Q #define CODE_L1 43 // Tab -#define CODE_R1 CODE_NA -#define CODE_L2 CODE_NA -#define CODE_R2 CODE_NA -#define CODE_L3 CODE_NA -#define CODE_R3 CODE_NA +#define CODE_R1 5 +#define CODE_L2 6 +#define CODE_R2 7 +#define CODE_L3 8 +#define CODE_R3 9 +#define CODE_L4 10 +#define CODE_R4 11 #define CODE_MENU 44 // Space #define CODE_POWER 42 // Backspace @@ -87,6 +91,8 @@ #define JOY_R2 JOY_NA #define JOY_L3 JOY_NA #define JOY_R3 JOY_NA +#define JOY_L4 JOY_NA +#define JOY_R4 JOY_NA #define JOY_MENU JOY_NA #define JOY_POWER JOY_NA diff --git a/workspace/tg5040/platform/platform.h b/workspace/tg5040/platform/platform.h index c8e4d9153..2ac9d7a4d 100644 --- a/workspace/tg5040/platform/platform.h +++ b/workspace/tg5040/platform/platform.h @@ -35,6 +35,8 @@ extern int is_brickpro; #define BUTTON_R2 BUTTON_NA #define BUTTON_L3 BUTTON_NA #define BUTTON_R3 BUTTON_NA +#define BUTTON_L4 BUTTON_NA +#define BUTTON_R4 BUTTON_NA #define BUTTON_MENU BUTTON_NA #define BUTTON_MENU_ALT BUTTON_NA @@ -63,6 +65,8 @@ extern int is_brickpro; #define CODE_R2 CODE_NA #define CODE_L3 CODE_NA #define CODE_R3 CODE_NA +#define CODE_L4 CODE_NA +#define CODE_R4 CODE_NA #define CODE_MENU CODE_NA #define CODE_POWER 102 @@ -92,8 +96,11 @@ extern int is_brickpro; #define JOY_R2 JOY_NA #define JOY_L3 (is_brick||is_brickpro?9:JOY_NA) #define JOY_R3 (is_brick||is_brickpro?10:JOY_NA) +#define JOY_L4 (is_brickpro?11:JOY_NA) +#define JOY_R4 (is_brickpro?12:JOY_NA) #define JOY_MENU 8 +#define JOY_MENU_ALT (is_brickpro?15:JOY_NA) #define JOY_POWER 102 #define JOY_PLUS (is_brick||is_brickpro?14:128) #define JOY_MINUS (is_brick||is_brickpro?13:129) diff --git a/workspace/tg5050/platform/platform.h b/workspace/tg5050/platform/platform.h index 7613920ab..908006f81 100644 --- a/workspace/tg5050/platform/platform.h +++ b/workspace/tg5050/platform/platform.h @@ -30,6 +30,8 @@ #define BUTTON_R2 BUTTON_NA #define BUTTON_L3 BUTTON_NA #define BUTTON_R3 BUTTON_NA +#define BUTTON_L4 BUTTON_NA +#define BUTTON_R4 BUTTON_NA #define BUTTON_MENU BUTTON_NA #define BUTTON_MENU_ALT BUTTON_NA @@ -58,6 +60,8 @@ #define CODE_R2 CODE_NA #define CODE_L3 CODE_NA #define CODE_R3 CODE_NA +#define CODE_L4 CODE_NA +#define CODE_R4 CODE_NA #define CODE_MENU CODE_NA #define CODE_MENU_ALT 13 @@ -88,6 +92,8 @@ #define JOY_R2 JOY_NA #define JOY_L3 9 #define JOY_R3 10 +#define JOY_L4 JOY_NA +#define JOY_R4 JOY_NA #define JOY_MENU 8 #define JOY_POWER 102