From 624d453b9ddaf75b1c61fa4a9ce494f4055dc303 Mon Sep 17 00:00:00 2001 From: Adam Wonak Date: Sat, 21 Feb 2026 10:33:48 -0800 Subject: [PATCH] add rotate display --- firmware/Euclidean/Euclidean.ino | 8 ++++++++ firmware/Euclidean/app_state.h | 1 + firmware/Euclidean/display.h | 11 ++++++++--- firmware/Euclidean/save_state.cpp | 4 +++- firmware/Euclidean/save_state.h | 1 + firmware/Gravity/Gravity.ino | 8 ++++++++ firmware/Gravity/app_state.h | 1 + firmware/Gravity/display.h | 11 ++++++++--- firmware/Gravity/save_state.cpp | 4 +++- firmware/Gravity/save_state.h | 1 + 10 files changed, 42 insertions(+), 8 deletions(-) diff --git a/firmware/Euclidean/Euclidean.ino b/firmware/Euclidean/Euclidean.ino index 02ad5d3..6a497e2 100644 --- a/firmware/Euclidean/Euclidean.ino +++ b/firmware/Euclidean/Euclidean.ino @@ -231,6 +231,10 @@ void HandleEncoderPressed() { app.encoder_reversed = app.selected_sub_param == 1; gravity.encoder.SetReverseDirection(app.encoder_reversed); } + if (app.selected_param == PARAM_MAIN_ROTATE_DISP) { + app.rotate_display = app.selected_sub_param == 1; + gravity.display.setFlipMode(app.rotate_display ? 1 : 0); + } if (app.selected_param == PARAM_MAIN_SAVE_DATA) { if (app.selected_sub_param < StateManager::MAX_SAVE_SLOTS) { app.selected_save_slot = app.selected_sub_param; @@ -335,6 +339,9 @@ void editMainParameter(int val) { case PARAM_MAIN_ENCODER_DIR: updateSelection(app.selected_sub_param, val, 2); break; + case PARAM_MAIN_ROTATE_DISP: + updateSelection(app.selected_sub_param, val, 2); + break; case PARAM_MAIN_SAVE_DATA: case PARAM_MAIN_LOAD_DATA: updateSelection(app.selected_sub_param, val, @@ -393,6 +400,7 @@ void InitGravity(AppState &app) { gravity.clock.SetTempo(app.tempo); gravity.clock.SetSource(app.selected_source); gravity.encoder.SetReverseDirection(app.encoder_reversed); + gravity.display.setFlipMode(app.rotate_display ? 1 : 0); } void ResetOutputs() { diff --git a/firmware/Euclidean/app_state.h b/firmware/Euclidean/app_state.h index 7327bfd..c8b45c0 100644 --- a/firmware/Euclidean/app_state.h +++ b/firmware/Euclidean/app_state.h @@ -31,6 +31,7 @@ struct AppState { byte cv_reset = 0; bool editing_param = false; bool encoder_reversed = false; + bool rotate_display = false; bool refresh_screen = true; }; diff --git a/firmware/Euclidean/display.h b/firmware/Euclidean/display.h index 9a8666b..3752f60 100644 --- a/firmware/Euclidean/display.h +++ b/firmware/Euclidean/display.h @@ -132,6 +132,7 @@ enum ParamsMainPage : uint8_t { PARAM_MAIN_SOURCE, PARAM_MAIN_PULSE, PARAM_MAIN_ENCODER_DIR, + PARAM_MAIN_ROTATE_DISP, PARAM_MAIN_SAVE_DATA, PARAM_MAIN_LOAD_DATA, PARAM_MAIN_RESET_STATE, @@ -328,6 +329,10 @@ void DisplayMainPage() { mainText = F("DIR"); subText = app.selected_sub_param == 0 ? F("DEFAULT") : F("REVERSED"); break; + case PARAM_MAIN_ROTATE_DISP: + mainText = F("DISP"); + subText = app.selected_sub_param == 0 ? F("DEFAULT") : F("ROTATED"); + break; case PARAM_MAIN_SAVE_DATA: case PARAM_MAIN_LOAD_DATA: if (app.selected_sub_param == StateManager::MAX_SAVE_SLOTS) { @@ -369,9 +374,9 @@ void DisplayMainPage() { // Draw Main Page menu items String menu_items[PARAM_MAIN_LAST] = { - F("TEMPO"), F("CLK RUN"), F("CLK RESET"), F("SOURCE"), - F("PULSE OUT"), F("ENCODER DIR"), F("SAVE"), F("LOAD"), - F("RESET"), F("ERASE")}; + F("TEMPO"), F("RUN"), F("RST"), F("SOURCE"), + F("PULSE OUT"), F("ENCODER DIR"), F("ROTATE DISP"), F("SAVE"), + F("LOAD"), F("RESET"), F("ERASE")}; drawMenuItems(menu_items, PARAM_MAIN_LAST); } diff --git a/firmware/Euclidean/save_state.cpp b/firmware/Euclidean/save_state.cpp index b5bb936..8045206 100644 --- a/firmware/Euclidean/save_state.cpp +++ b/firmware/Euclidean/save_state.cpp @@ -18,7 +18,7 @@ // Define the constants for the current firmware. const char StateManager::SKETCH_NAME[] = "ALT EUCLIDEAN"; const char StateManager::SEMANTIC_VERSION[] = - "V2.0.0BETA3"; // NOTE: This should match the version in the + "V2.0.0BETA4"; // NOTE: This should match the version in the // library.properties file. // Number of available save slots. @@ -213,6 +213,7 @@ void StateManager::_saveMetadata(const AppState &app) { // Global user settings current_meta.selected_save_slot = app.selected_save_slot; current_meta.encoder_reversed = app.encoder_reversed; + current_meta.rotate_display = app.rotate_display; EEPROM.put(METADATA_START_ADDR, current_meta); interrupts(); @@ -224,5 +225,6 @@ void StateManager::_loadMetadata(AppState &app) { EEPROM.get(METADATA_START_ADDR, metadata); app.selected_save_slot = metadata.selected_save_slot; app.encoder_reversed = metadata.encoder_reversed; + app.rotate_display = metadata.rotate_display; interrupts(); } \ No newline at end of file diff --git a/firmware/Euclidean/save_state.h b/firmware/Euclidean/save_state.h index 7a27487..d2b9548 100644 --- a/firmware/Euclidean/save_state.h +++ b/firmware/Euclidean/save_state.h @@ -57,6 +57,7 @@ public: // Additional global/hardware settings byte selected_save_slot; bool encoder_reversed; + bool rotate_display; }; struct ChannelState { byte base_clock_mod_index; diff --git a/firmware/Gravity/Gravity.ino b/firmware/Gravity/Gravity.ino index 33f7ea6..31b5805 100644 --- a/firmware/Gravity/Gravity.ino +++ b/firmware/Gravity/Gravity.ino @@ -231,6 +231,10 @@ void HandleEncoderPressed() { app.encoder_reversed = app.selected_sub_param == 1; gravity.encoder.SetReverseDirection(app.encoder_reversed); } + if (app.selected_param == PARAM_MAIN_ROTATE_DISP) { + app.rotate_display = app.selected_sub_param == 1; + gravity.display.setFlipMode(app.rotate_display ? 1 : 0); + } if (app.selected_param == PARAM_MAIN_SAVE_DATA) { if (app.selected_sub_param < StateManager::MAX_SAVE_SLOTS) { app.selected_save_slot = app.selected_sub_param; @@ -335,6 +339,9 @@ void editMainParameter(int val) { case PARAM_MAIN_ENCODER_DIR: updateSelection(app.selected_sub_param, val, 2); break; + case PARAM_MAIN_ROTATE_DISP: + updateSelection(app.selected_sub_param, val, 2); + break; case PARAM_MAIN_SAVE_DATA: case PARAM_MAIN_LOAD_DATA: updateSelection(app.selected_sub_param, val, @@ -399,6 +406,7 @@ void InitGravity(AppState &app) { gravity.clock.SetTempo(app.tempo); gravity.clock.SetSource(app.selected_source); gravity.encoder.SetReverseDirection(app.encoder_reversed); + gravity.display.setFlipMode(app.rotate_display ? 1 : 0); } void ResetOutputs() { diff --git a/firmware/Gravity/app_state.h b/firmware/Gravity/app_state.h index f559c0e..a62ca00 100644 --- a/firmware/Gravity/app_state.h +++ b/firmware/Gravity/app_state.h @@ -31,6 +31,7 @@ struct AppState { Clock::Pulse selected_pulse = Clock::PULSE_PPQN_24; bool editing_param = false; bool encoder_reversed = false; + bool rotate_display = false; bool refresh_screen = true; }; diff --git a/firmware/Gravity/display.h b/firmware/Gravity/display.h index 975478a..47147ea 100644 --- a/firmware/Gravity/display.h +++ b/firmware/Gravity/display.h @@ -132,6 +132,7 @@ enum ParamsMainPage : uint8_t { PARAM_MAIN_RESET, PARAM_MAIN_PULSE, PARAM_MAIN_ENCODER_DIR, + PARAM_MAIN_ROTATE_DISP, PARAM_MAIN_SAVE_DATA, PARAM_MAIN_LOAD_DATA, PARAM_MAIN_RESET_STATE, @@ -347,6 +348,10 @@ void DisplayMainPage() { mainText = F("DIR"); subText = app.selected_sub_param == 0 ? F("DEFAULT") : F("REVERSED"); break; + case PARAM_MAIN_ROTATE_DISP: + mainText = F("DISP"); + subText = app.selected_sub_param == 0 ? F("DEFAULT") : F("ROTATED"); + break; case PARAM_MAIN_SAVE_DATA: case PARAM_MAIN_LOAD_DATA: if (app.selected_sub_param == StateManager::MAX_SAVE_SLOTS) { @@ -388,9 +393,9 @@ void DisplayMainPage() { // Draw Main Page menu items String menu_items[PARAM_MAIN_LAST] = { - F("TEMPO"), F("SOURCE"), F("CLK RUN"), - F("CLK RESET"), F("PULSE OUT"), F("ENCODER DIR"), - F("SAVE"), F("LOAD"), F("ERASE")}; + F("TEMPO"), F("RUN"), F("RST"), F("SOURCE"), + F("PULSE OUT"), F("ENCODER DIR"), F("ROTATE DISP"), F("SAVE"), + F("LOAD"), F("RESET"), F("ERASE")}; drawMenuItems(menu_items, PARAM_MAIN_LAST); } diff --git a/firmware/Gravity/save_state.cpp b/firmware/Gravity/save_state.cpp index 65781c2..d51b89a 100644 --- a/firmware/Gravity/save_state.cpp +++ b/firmware/Gravity/save_state.cpp @@ -18,7 +18,7 @@ // Define the constants for the current firmware. const char StateManager::SKETCH_NAME[] = "ALT GRAVITY"; const char StateManager::SEMANTIC_VERSION[] = - "V2.0.0BETA4"; // NOTE: This should match the version in the + "V2.0.0BETA5"; // NOTE: This should match the version in the // library.properties file. // Number of available save slots. @@ -215,6 +215,7 @@ void StateManager::_saveMetadata(const AppState &app) { // Global user settings current_meta.selected_save_slot = app.selected_save_slot; current_meta.encoder_reversed = app.encoder_reversed; + current_meta.rotate_display = app.rotate_display; EEPROM.put(METADATA_START_ADDR, current_meta); interrupts(); @@ -226,5 +227,6 @@ void StateManager::_loadMetadata(AppState &app) { EEPROM.get(METADATA_START_ADDR, metadata); app.selected_save_slot = metadata.selected_save_slot; app.encoder_reversed = metadata.encoder_reversed; + app.rotate_display = metadata.rotate_display; interrupts(); } \ No newline at end of file diff --git a/firmware/Gravity/save_state.h b/firmware/Gravity/save_state.h index 7bdf85e..b61d389 100644 --- a/firmware/Gravity/save_state.h +++ b/firmware/Gravity/save_state.h @@ -57,6 +57,7 @@ public: // Additional global/hardware settings byte selected_save_slot; bool encoder_reversed; + bool rotate_display; }; struct ChannelState { byte base_clock_mod_index;