diff --git a/SharedState.cpp b/SharedState.cpp index 4a529f4..6a5f898 100644 --- a/SharedState.cpp +++ b/SharedState.cpp @@ -13,6 +13,7 @@ volatile bool sequenceChangeScheduled = false; volatile bool needsPanic = false; UIState currentState = UI_MENU_MAIN; +bool protectedMode = false; // Menus MenuItem menuItems[] = { @@ -37,48 +38,57 @@ MenuItem menuItems[] = { { "Theme 7", MENU_ID_THEME_7, false, false, 1 }, { "Setup", MENU_ID_GROUP_SETUP, true, false, 0 }, { "Channel", MENU_ID_CHANNEL, false, false, 1 }, + { "Protected", MENU_ID_PROTECTED_MODE, false, false, 1 }, { "Reset", MENU_ID_RESET, false, false, 1 }, { "Patches", MENU_ID_GROUP_PATCHES, true, false, 0 }, { "Bank 1", MENU_ID_BANK_1, true, false, 1 }, - { "Save 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 0), false, false, 2 }, - { "Load 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 1), false, false, 2 }, - { "Save 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 2), false, false, 2 }, - { "Load 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 3), false, false, 2 }, - { "Save 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 4), false, false, 2 }, - { "Load 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 5), false, false, 2 }, - { "Save 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 6), false, false, 2 }, - { "Load 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 7), false, false, 2 }, + { "Load 1.1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 0), false, false, 2 }, + { "Load 1.2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 1), false, false, 2 }, + { "Load 1.3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 2), false, false, 2 }, + { "Load 1.4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 3), false, false, 2 }, + { "Save 1.1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 4), false, false, 2 }, + { "Save 1.2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 5), false, false, 2 }, + { "Save 1.3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 6), false, false, 2 }, + { "Save 1.4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 7), false, false, 2 }, { "Bank 2", MENU_ID_BANK_2, true, false, 1 }, - { "Save 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 8), false, false, 2 }, - { "Load 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 9), false, false, 2 }, - { "Save 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 10), false, false, 2 }, - { "Load 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 11), false, false, 2 }, - { "Save 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 12), false, false, 2 }, - { "Load 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 13), false, false, 2 }, - { "Save 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 14), false, false, 2 }, - { "Load 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 15), false, false, 2 }, + { "Load 2.1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 8), false, false, 2 }, + { "Load 2.2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 9), false, false, 2 }, + { "Load 2.3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 10), false, false, 2 }, + { "Load 2.4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 11), false, false, 2 }, + { "Save 2.1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 12), false, false, 2 }, + { "Save 2.2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 13), false, false, 2 }, + { "Save 2.3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 14), false, false, 2 }, + { "Save 2.4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 15), false, false, 2 }, { "Bank 3", MENU_ID_BANK_3, true, false, 1 }, - { "Save 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 16), false, false, 2 }, - { "Load 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 17), false, false, 2 }, - { "Save 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 18), false, false, 2 }, - { "Load 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 19), false, false, 2 }, - { "Save 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 20), false, false, 2 }, - { "Load 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 21), false, false, 2 }, - { "Save 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 22), false, false, 2 }, - { "Load 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 23), false, false, 2 }, + { "Load 3.1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 16), false, false, 2 }, + { "Load 3.2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 17), false, false, 2 }, + { "Load 3.3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 18), false, false, 2 }, + { "Load 3.4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 19), false, false, 2 }, + { "Save 3.1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 20), false, false, 2 }, + { "Save 3.2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 21), false, false, 2 }, + { "Save 3.3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 22), false, false, 2 }, + { "Save 3.4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 23), false, false, 2 }, { "Bank 4", MENU_ID_BANK_4, true, false, 1 }, - { "Save 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 24), false, false, 2 }, - { "Load 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 25), false, false, 2 }, - { "Save 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 26), false, false, 2 }, - { "Load 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 27), false, false, 2 }, - { "Save 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 28), false, false, 2 }, - { "Load 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 29), false, false, 2 }, - { "Save 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 30), false, false, 2 }, - { "Load 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 31), false, false, 2 } + { "Load 4.1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 24), false, false, 2 }, + { "Load 4.2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 25), false, false, 2 }, + { "Load 4.3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 26), false, false, 2 }, + { "Load 4.4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 27), false, false, 2 }, + { "Save 4.1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 28), false, false, 2 }, + { "Save 4.2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 29), false, false, 2 }, + { "Save 4.3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 30), false, false, 2 }, + { "Save 4.4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 31), false, false, 2 } }; extern const int menuItemsCount = sizeof(menuItems) / sizeof(MenuItem); bool isItemVisible(int index) { + if (protectedMode) { + MenuItemID id = menuItems[index].id; + if (id >= MENU_ID_PATCH_ACTIONS_START) { + int offset = id - MENU_ID_PATCH_ACTIONS_START; + if ((offset % 8) >= 4) return false; // Save options are the last 4 in the block of 8 + } + } + if (menuItems[index].indentLevel == 0) return true; for (int i = index - 1; i >= 0; i--) { if (menuItems[i].indentLevel < menuItems[index].indentLevel) { diff --git a/SharedState.h b/SharedState.h index e15e8d0..1f914d7 100644 --- a/SharedState.h +++ b/SharedState.h @@ -38,6 +38,7 @@ enum MenuItemID { MENU_ID_GROUP_SETUP, MENU_ID_CHANNEL, + MENU_ID_PROTECTED_MODE, MENU_ID_RESET, MENU_ID_GROUP_PATCHES, @@ -84,6 +85,7 @@ extern volatile int songRepeatsRemaining; extern volatile int nextSongRepeats; extern volatile bool songModeNeedsNext; extern volatile bool isPlaying; +extern bool protectedMode; extern volatile int tempo; extern volatile unsigned long lastClockTime; extern volatile int clockCount; diff --git a/UIManager.cpp b/UIManager.cpp index 8f4c047..cc869a4 100644 --- a/UIManager.cpp +++ b/UIManager.cpp @@ -270,6 +270,7 @@ void UIManager::drawMenu(int selection, UIState currentState, int midiChannel, i else if (id == MENU_ID_MUTE) { display.print(F(": ")); display.print(trackMute[randomizeTrack] ? F("YES") : F("NO")); } else if (id == MENU_ID_FLAVOUR) { display.print(F(": ")); display.print(flavourName); } else if (id == MENU_ID_MUTATION) { display.print(F(": ")); display.print(mutationEnabled ? F("ON") : F("OFF")); } + else if (id == MENU_ID_PROTECTED_MODE) { display.print(F(": ")); display.print(protectedMode ? F("ON") : F("OFF")); } if (id >= MENU_ID_THEME_1 && id <= MENU_ID_THEME_7) { int themeIdx = id - MENU_ID_THEME_1 + 1; diff --git a/UIThread.cpp b/UIThread.cpp index 044bd87..681e947 100644 --- a/UIThread.cpp +++ b/UIThread.cpp @@ -105,7 +105,7 @@ static void savePatch(int bank, int slot) { EEPROM.put(addr, mutes); addr += sizeof(mutes); midi.unlock(); EEPROM.commit(); - ui.showMessage("PATCH SAVED!"); + ui.showMessage("SAVED!"); } static void loadPatch(int bank, int slot) { @@ -136,7 +136,7 @@ static void loadPatch(int bank, int slot) { memcpy(sequence, local_sequence, sizeof(local_sequence)); } midi.unlock(); - ui.showMessage("PATCH LOADED!"); + ui.showMessage("LOADED!"); } void factoryReset() { @@ -349,6 +349,7 @@ static void handleInput() { case MENU_ID_MUTATION: mutationEnabled = !mutationEnabled; break; case MENU_ID_CHANNEL: currentState = UI_SETUP_CHANNEL_EDIT; break; + case MENU_ID_PROTECTED_MODE: protectedMode = !protectedMode; break; case MENU_ID_RESET: factoryReset(); break; default: @@ -368,8 +369,9 @@ static void handleInput() { if (menuItems[menuSelection].id >= MENU_ID_PATCH_ACTIONS_START) { int offset = menuItems[menuSelection].id - MENU_ID_PATCH_ACTIONS_START; int bank = offset / 8; - int slot = (offset % 8) / 2; - bool isSave = (offset % 2) == 0; + int sub = offset % 8; + bool isSave = sub >= 4; + int slot = sub % 4; if (isSave) savePatch(bank, slot); else loadPatch(bank, slot); break;