diff --git a/firmware/application/apps/ui_settings.hpp b/firmware/application/apps/ui_settings.hpp index 2d90c830..431ae3ed 100644 --- a/firmware/application/apps/ui_settings.hpp +++ b/firmware/application/apps/ui_settings.hpp @@ -480,10 +480,12 @@ class SetEncoderDialView : public View { OptionsField field_encoder_dial_sensitivity{ {20 * 8, 3 * 16}, - 6, - {{"LOW", encoder_dial_sensitivity::DIAL_SENSITIVITY_LOW}, - {"NORMAL", encoder_dial_sensitivity::DIAL_SENSITIVITY_MEDIUM}, - {"HIGH", encoder_dial_sensitivity::DIAL_SENSITIVITY_HIGH}}}; + 7, + {{"LOWEST", encoder_dial_sensitivity::DIAL_SENSITIVITY_LOWEST}, + {"LOW", encoder_dial_sensitivity::DIAL_SENSITIVITY_LOW}, + {"NORMAL", encoder_dial_sensitivity::DIAL_SENSITIVITY_NORMAL}, + {"HIGH", encoder_dial_sensitivity::DIAL_SENSITIVITY_HIGH}, + {"HIGHEST", encoder_dial_sensitivity::DIAL_SENSITIVITY_HIGHEST}}}; Button button_save{ {2 * 8, 16 * 16, 12 * 8, 32}, diff --git a/firmware/application/hw/encoder.cpp b/firmware/application/hw/encoder.cpp index 0bb427c9..c77c8578 100644 --- a/firmware/application/hw/encoder.cpp +++ b/firmware/application/hw/encoder.cpp @@ -32,66 +32,24 @@ // 12 degrees of rotation. // // For each encoder "pulse" there are 4 state transitions, and we can choose -// between looking at all of them (high sensitivity), half of them (medium/default), -// or one quarter of them (low sensitivity). -static const int8_t transition_map[][16] = { - // Normal (Medium) Sensitivity -- default - { - 0, // 0000: noop - 0, // 0001: ccw start - 0, // 0010: cw start - 0, // 0011: rate - 1, // 0100: cw end - 0, // 0101: noop - 0, // 0110: rate - -1, // 0111: ccw end - -1, // 1000: ccw end - 0, // 1001: rate - 0, // 1010: noop - 1, // 1011: cw end - 0, // 1100: rate - 0, // 1101: cw start - 0, // 1110: ccw start - 0, // 1111: noop - }, - // Low Sensitivity - { - 0, // 0000: noop - 0, // 0001: ccw start - 0, // 0010: cw start - 0, // 0011: rate - 1, // 0100: cw end - 0, // 0101: noop - 0, // 0110: rate - 0, // 0111: ccw end - -1, // 1000: ccw end - 0, // 1001: rate - 0, // 1010: noop - 0, // 1011: cw end - 0, // 1100: rate - 0, // 1101: cw start - 0, // 1110: ccw start - 0, // 1111: noop - }, - // High Sensitivity - { - 0, // 0000: noop - -1, // 0001: ccw start - 1, // 0010: cw start - 0, // 0011: rate - 1, // 0100: cw end - 0, // 0101: noop - 0, // 0110: rate - -1, // 0111: ccw end - -1, // 1000: ccw end - 0, // 1001: rate - 0, // 1010: noop - 1, // 1011: cw end - 0, // 1100: rate - 1, // 1101: cw start - -1, // 1110: ccw start - 0, // 1111: noop - }, +// how many transitions are needed before movement is registered +static const int8_t transition_map[16] = { + 0, // 0000: noop + -1, // 0001: ccw start + 1, // 0010: cw start + 0, // 0011: rate + 1, // 0100: cw end + 0, // 0101: noop + 0, // 0110: rate + -1, // 0111: ccw end + -1, // 1000: ccw end + 0, // 1001: rate + 0, // 1010: noop + 1, // 1011: cw end + 0, // 1100: rate + 1, // 1101: cw start + -1, // 1110: ccw start + 0, // 1111: noop }; int_fast8_t Encoder::update( @@ -102,6 +60,13 @@ int_fast8_t Encoder::update( state <<= 1; state |= phase_1; - // dial sensitivity setting is stored in pmem - return transition_map[portapack::persistent_memory::config_encoder_dial_sensitivity()][state & 0xf]; + int_fast8_t retval = transition_map[state & 0xf]; + + transition_count += retval; + if (abs(transition_count) > portapack::persistent_memory::config_encoder_dial_sensitivity()) + transition_count = 0; + else + retval = 0; + + return retval; } diff --git a/firmware/application/hw/encoder.hpp b/firmware/application/hw/encoder.hpp index 3436e071..4990277c 100644 --- a/firmware/application/hw/encoder.hpp +++ b/firmware/application/hw/encoder.hpp @@ -32,6 +32,7 @@ class Encoder { private: uint_fast8_t state{0}; + int_fast8_t transition_count{0}; }; #endif /*__ENCODER_H__*/ diff --git a/firmware/common/portapack_persistent_memory.cpp b/firmware/common/portapack_persistent_memory.cpp index 530fe172..ad693355 100644 --- a/firmware/common/portapack_persistent_memory.cpp +++ b/firmware/common/portapack_persistent_memory.cpp @@ -363,6 +363,7 @@ void defaults() { set_config_backlight_timer(backlight_config_t{}); set_config_splash(true); + set_encoder_dial_sensitivity(DIAL_SENSITIVITY_NORMAL); // Default values for recon app. set_recon_autosave_freqs(false); diff --git a/firmware/common/portapack_persistent_memory.hpp b/firmware/common/portapack_persistent_memory.hpp index 43241cdc..29bca44c 100644 --- a/firmware/common/portapack_persistent_memory.hpp +++ b/firmware/common/portapack_persistent_memory.hpp @@ -107,9 +107,11 @@ struct backlight_config_t { }; enum encoder_dial_sensitivity { - DIAL_SENSITIVITY_MEDIUM = 0, - DIAL_SENSITIVITY_LOW = 1, - DIAL_SENSITIVITY_HIGH = 2, + DIAL_SENSITIVITY_HIGHEST = 0, + DIAL_SENSITIVITY_HIGH = 1, + DIAL_SENSITIVITY_NORMAL = 2, + DIAL_SENSITIVITY_LOW = 3, + DIAL_SENSITIVITY_LOWEST = 4, NUM_DIAL_SENSITIVITY };