Added detection if multiple packs found
This commit is contained in:
@@ -521,8 +521,11 @@ int perform_installation(omninx_variant_t pack_variant, install_mode_t mode) {
|
||||
if (res != FR_OK) return res;
|
||||
|
||||
install_check_and_clear_screen_if_needed();
|
||||
// Remove staging directory
|
||||
// Remove staging directory (installed pack)
|
||||
res = cleanup_staging_directory(pack_variant);
|
||||
if (res != FR_OK) return res;
|
||||
// Remove other detected install directories (Standard/Light/OC) that were on SD
|
||||
res = cleanup_other_staging_directories(pack_variant);
|
||||
return res;
|
||||
} else {
|
||||
// Clean mode: backup, wipe, restore, install
|
||||
@@ -557,8 +560,11 @@ int perform_installation(omninx_variant_t pack_variant, install_mode_t mode) {
|
||||
if (res != FR_OK) return res;
|
||||
|
||||
install_check_and_clear_screen_if_needed();
|
||||
// Remove staging directory
|
||||
// Remove staging directory (installed pack)
|
||||
res = cleanup_staging_directory(pack_variant);
|
||||
if (res != FR_OK) return res;
|
||||
// Remove other detected install directories (Standard/Light/OC) that were on SD
|
||||
res = cleanup_other_staging_directories(pack_variant);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,8 @@ int perform_installation(omninx_variant_t pack_variant, install_mode_t mode);
|
||||
int update_mode_cleanup(omninx_variant_t variant);
|
||||
int update_mode_install(omninx_variant_t variant);
|
||||
int cleanup_staging_directory(omninx_variant_t pack_variant);
|
||||
// Remove other OmniNX staging directories (Standard/Light/OC) that exist, except the one just installed
|
||||
int cleanup_other_staging_directories(omninx_variant_t installed_variant);
|
||||
|
||||
// Clean install operations (install_clean.c)
|
||||
int clean_mode_backup(void);
|
||||
|
||||
@@ -9,20 +9,27 @@
|
||||
#include "deletion_lists_clean.h"
|
||||
#include "fs.h"
|
||||
#include "gfx.h"
|
||||
#include "version.h"
|
||||
#include <libs/fatfs/ff.h>
|
||||
#include <string.h>
|
||||
|
||||
#undef COLOR_CYAN
|
||||
#undef COLOR_WHITE
|
||||
#undef COLOR_GREEN
|
||||
#undef COLOR_RED
|
||||
#undef COLOR_YELLOW
|
||||
#undef COLOR_ORANGE
|
||||
#define COLOR_CYAN 0xFF00FFFF
|
||||
#define COLOR_WHITE 0xFFFFFFFF
|
||||
#define COLOR_GREEN 0xFF00FF00
|
||||
#define COLOR_RED 0xFFFF0000
|
||||
#define COLOR_YELLOW 0xFFFFDD00
|
||||
#define COLOR_ORANGE 0xFF00A5FF
|
||||
|
||||
#define set_color install_set_color
|
||||
#define check_and_clear_screen_if_needed install_check_and_clear_screen_if_needed
|
||||
#define path_exists install_path_exists
|
||||
#define count_directory_items install_count_directory_items
|
||||
|
||||
// Clean mode: Backup user data
|
||||
int clean_mode_backup(void) {
|
||||
@@ -109,3 +116,55 @@ int clean_mode_restore(void) {
|
||||
int clean_mode_install(omninx_variant_t variant) {
|
||||
return update_mode_install(variant);
|
||||
}
|
||||
|
||||
// Remove other staging directories (OmniNX Standard/Light/OC) that exist on SD
|
||||
int cleanup_other_staging_directories(omninx_variant_t installed_variant) {
|
||||
static const omninx_variant_t all_variants[] = { VARIANT_STANDARD, VARIANT_LIGHT, VARIANT_OC };
|
||||
const int n = sizeof(all_variants) / sizeof(all_variants[0]);
|
||||
int last_res = FR_OK;
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
omninx_variant_t v = all_variants[i];
|
||||
if (v == installed_variant)
|
||||
continue;
|
||||
const char *staging = get_staging_path(v);
|
||||
if (!staging || !path_exists(staging))
|
||||
continue;
|
||||
|
||||
check_and_clear_screen_if_needed();
|
||||
set_color(COLOR_YELLOW);
|
||||
gfx_printf("\nEntferne weiteren Installationsordner...\n");
|
||||
set_color(COLOR_WHITE);
|
||||
|
||||
int total = count_directory_items(staging);
|
||||
u32 start_x, start_y;
|
||||
gfx_con_getpos(&start_x, &start_y);
|
||||
|
||||
const char *folder_name = strrchr(staging, '/');
|
||||
if (folder_name) folder_name++;
|
||||
else folder_name = staging;
|
||||
|
||||
set_color(COLOR_CYAN);
|
||||
gfx_printf(" Loesche: %s [ 0%%] (0/%d)", folder_name, total);
|
||||
set_color(COLOR_WHITE);
|
||||
|
||||
int deleted = 0;
|
||||
int last_percent = -1;
|
||||
int res = folder_delete_progress_recursive(staging, &deleted, total, start_x, start_y, folder_name, &last_percent);
|
||||
|
||||
gfx_con_setpos(start_x, start_y);
|
||||
if (res == FR_OK) {
|
||||
set_color(COLOR_GREEN);
|
||||
gfx_printf(" Loesche: %s [100%%] (%d/%d) - Fertig!\n", folder_name, deleted, total);
|
||||
set_color(COLOR_WHITE);
|
||||
} else {
|
||||
set_color(COLOR_ORANGE);
|
||||
gfx_printf(" Loesche: %s - Fehlgeschlagen!\n", folder_name);
|
||||
gfx_printf(" [WARN] Ordner konnte nicht entfernt werden (err=%d)\n", res);
|
||||
set_color(COLOR_WHITE);
|
||||
}
|
||||
last_res = res;
|
||||
}
|
||||
|
||||
return last_res;
|
||||
}
|
||||
|
||||
@@ -74,7 +74,9 @@ volatile nyx_storage_t *nyx_str = (nyx_storage_t *)NYX_STORAGE_ADDR;
|
||||
static void *coreboot_addr;
|
||||
static int total_errors = 0;
|
||||
|
||||
// Use BDK colors (already defined in types.h)
|
||||
// Use BDK colors (CYAN/WHITE overridden for consistency; GREEN/YELLOW from types.h)
|
||||
#undef COLOR_CYAN
|
||||
#undef COLOR_WHITE
|
||||
#define COLOR_CYAN 0xFF00FFFF
|
||||
#define COLOR_WHITE 0xFFFFFFFF
|
||||
|
||||
@@ -215,10 +217,11 @@ void ipl_main(void) {
|
||||
// Detect current OmniNX installation
|
||||
omninx_status_t current = detect_omninx_installation();
|
||||
|
||||
// Detect which pack variant is on SD card
|
||||
omninx_variant_t pack_variant = detect_pack_variant();
|
||||
// Detect which pack variant(s) are on SD card
|
||||
omninx_variant_t variants_present[3];
|
||||
int num_variants = detect_present_variants(variants_present, 3);
|
||||
|
||||
if (pack_variant == VARIANT_NONE) {
|
||||
if (num_variants == 0) {
|
||||
set_color(COLOR_RED);
|
||||
gfx_printf("FEHLER: Kein OmniNX-Paket auf der SD-Karte gefunden!\n");
|
||||
gfx_printf("Erwartet wird eines der folgenden:\n");
|
||||
@@ -283,6 +286,93 @@ void ipl_main(void) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If multiple variants present, show selection menu; otherwise use the single one
|
||||
omninx_variant_t pack_variant;
|
||||
if (num_variants == 1) {
|
||||
pack_variant = variants_present[0];
|
||||
} else {
|
||||
// Initialize joycons for menu input
|
||||
jc_init_hw();
|
||||
while (btn_read() & BTN_POWER) { msleep(50); }
|
||||
|
||||
// Selection menu (TegraExplorer-style: draw once, then only redraw changed lines)
|
||||
int selected = 0;
|
||||
int prev_selected = 0;
|
||||
bool confirmed = false;
|
||||
|
||||
// Draw menu once and remember start position of variant lines
|
||||
gfx_clear_grey(0x1B);
|
||||
gfx_con_setpos(0, 0);
|
||||
print_header();
|
||||
set_color(COLOR_YELLOW);
|
||||
gfx_printf("Mehrere OmniNX-Pakete gefunden.\n");
|
||||
gfx_printf("Waehle die zu installierende Variante:\n\n");
|
||||
set_color(COLOR_WHITE);
|
||||
u32 menu_x, menu_variant_start_y;
|
||||
gfx_con_getpos(&menu_x, &menu_variant_start_y);
|
||||
for (int i = 0; i < num_variants; i++) {
|
||||
if (i == selected) {
|
||||
set_color(COLOR_GREEN);
|
||||
gfx_printf(" > %s\n", get_variant_name(variants_present[i]));
|
||||
set_color(COLOR_WHITE);
|
||||
} else {
|
||||
gfx_printf(" %s\n", get_variant_name(variants_present[i]));
|
||||
}
|
||||
}
|
||||
gfx_printf("\n");
|
||||
set_color(COLOR_CYAN);
|
||||
gfx_printf("D-Pad / Vol+/-: Auswahl | A oder Power: Bestaetigen\n");
|
||||
set_color(COLOR_WHITE);
|
||||
|
||||
// Edge detection: only move on press (not while held)
|
||||
bool prev_up = false, prev_down = false;
|
||||
|
||||
while (!confirmed) {
|
||||
// On selection change: redraw only the two affected lines (no full clear)
|
||||
if (selected != prev_selected) {
|
||||
gfx_con_setpos(menu_x, menu_variant_start_y + (u32)prev_selected * 16);
|
||||
set_color(COLOR_WHITE);
|
||||
gfx_printf(" %s\n", get_variant_name(variants_present[prev_selected]));
|
||||
gfx_con_setpos(menu_x, menu_variant_start_y + (u32)selected * 16);
|
||||
set_color(COLOR_GREEN);
|
||||
gfx_printf(" > %s\n", get_variant_name(variants_present[selected]));
|
||||
set_color(COLOR_WHITE);
|
||||
prev_selected = selected;
|
||||
}
|
||||
|
||||
jc_gamepad_rpt_t *jc = joycon_poll();
|
||||
u8 btn = btn_read();
|
||||
|
||||
// D-pad or Vol+ / Vol- for selection (Vol+ = up, Vol- = down)
|
||||
bool cur_up = false, cur_down = false;
|
||||
if (jc) {
|
||||
cur_up = (jc->up != 0) && !jc->down;
|
||||
cur_down = (jc->down != 0) && !jc->up;
|
||||
}
|
||||
if (btn & BTN_VOL_UP) cur_up = true;
|
||||
if (btn & BTN_VOL_DOWN) cur_down = true;
|
||||
|
||||
if (cur_up && !prev_up)
|
||||
selected = (selected - 1 + num_variants) % num_variants;
|
||||
else if (cur_down && !prev_down)
|
||||
selected = (selected + 1) % num_variants;
|
||||
else if (jc && jc->a)
|
||||
confirmed = true;
|
||||
prev_up = cur_up;
|
||||
prev_down = cur_down;
|
||||
|
||||
if (btn & BTN_POWER) {
|
||||
confirmed = true;
|
||||
}
|
||||
|
||||
msleep(50);
|
||||
}
|
||||
|
||||
pack_variant = variants_present[selected];
|
||||
gfx_clear_grey(0x1B);
|
||||
print_header();
|
||||
}
|
||||
|
||||
// Determine installation mode
|
||||
install_mode_t mode = current.is_installed ? INSTALL_MODE_UPDATE : INSTALL_MODE_CLEAN;
|
||||
|
||||
|
||||
@@ -156,6 +156,20 @@ omninx_variant_t detect_pack_variant(void) {
|
||||
return VARIANT_NONE;
|
||||
}
|
||||
|
||||
// Detect all pack variants present on SD card; returns count, fills out_variants[]
|
||||
int detect_present_variants(omninx_variant_t *out_variants, int max_count) {
|
||||
int count = 0;
|
||||
if (max_count <= 0 || !out_variants)
|
||||
return 0;
|
||||
if (file_exists(STAGING_STANDARD) && count < max_count)
|
||||
out_variants[count++] = VARIANT_STANDARD;
|
||||
if (file_exists(STAGING_LIGHT) && count < max_count)
|
||||
out_variants[count++] = VARIANT_LIGHT;
|
||||
if (file_exists(STAGING_OC) && count < max_count)
|
||||
out_variants[count++] = VARIANT_OC;
|
||||
return count;
|
||||
}
|
||||
|
||||
// Get human-readable variant name
|
||||
const char* get_variant_name(omninx_variant_t variant) {
|
||||
switch (variant) {
|
||||
|
||||
@@ -23,9 +23,12 @@ typedef struct {
|
||||
// Detect current OmniNX installation status
|
||||
omninx_status_t detect_omninx_installation(void);
|
||||
|
||||
// Detect which pack variant is present on SD card
|
||||
// Detect which pack variant is present on SD card (first found in fixed order)
|
||||
omninx_variant_t detect_pack_variant(void);
|
||||
|
||||
// Detect all pack variants present on SD card; returns count, fills out_variants[] (max max_count)
|
||||
int detect_present_variants(omninx_variant_t *out_variants, int max_count);
|
||||
|
||||
// Get human-readable variant name
|
||||
const char* get_variant_name(omninx_variant_t variant);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user