diff --git a/firmware/application/apps/ui_settings.hpp b/firmware/application/apps/ui_settings.hpp index 431ae3ed9..a9b7ddca7 100644 --- a/firmware/application/apps/ui_settings.hpp +++ b/firmware/application/apps/ui_settings.hpp @@ -480,12 +480,10 @@ class SetEncoderDialView : public View { OptionsField field_encoder_dial_sensitivity{ {20 * 8, 3 * 16}, - 7, - {{"LOWEST", encoder_dial_sensitivity::DIAL_SENSITIVITY_LOWEST}, - {"LOW", encoder_dial_sensitivity::DIAL_SENSITIVITY_LOW}, + 6, + {{"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}}}; + {"HIGH", encoder_dial_sensitivity::DIAL_SENSITIVITY_HIGH}}}; 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 c77c85782..0bb427c94 100644 --- a/firmware/application/hw/encoder.cpp +++ b/firmware/application/hw/encoder.cpp @@ -32,24 +32,66 @@ // 12 degrees of rotation. // // For each encoder "pulse" there are 4 state transitions, and we can choose -// 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 +// 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 + }, }; int_fast8_t Encoder::update( @@ -60,13 +102,6 @@ int_fast8_t Encoder::update( state <<= 1; state |= phase_1; - 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; + // dial sensitivity setting is stored in pmem + return transition_map[portapack::persistent_memory::config_encoder_dial_sensitivity()][state & 0xf]; } diff --git a/firmware/application/hw/encoder.hpp b/firmware/application/hw/encoder.hpp index 4990277c4..3436e071d 100644 --- a/firmware/application/hw/encoder.hpp +++ b/firmware/application/hw/encoder.hpp @@ -32,7 +32,6 @@ 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 7fae31886..6bbaba51c 100644 --- a/firmware/common/portapack_persistent_memory.cpp +++ b/firmware/common/portapack_persistent_memory.cpp @@ -80,7 +80,7 @@ constexpr clkout_freq_range_t clkout_freq_range{10, 60000}; constexpr uint16_t clkout_freq_reset_value{10000}; enum data_structure_version_enum : uint32_t { - VERSION_CURRENT = 0x10000004, + VERSION_CURRENT = 0x10000005, }; static const uint32_t TOUCH_CALIBRATION_MAGIC = 0x074af82f; diff --git a/firmware/common/portapack_persistent_memory.hpp b/firmware/common/portapack_persistent_memory.hpp index 29bca44c7..2bbf7751e 100644 --- a/firmware/common/portapack_persistent_memory.hpp +++ b/firmware/common/portapack_persistent_memory.hpp @@ -107,11 +107,9 @@ struct backlight_config_t { }; enum encoder_dial_sensitivity { - DIAL_SENSITIVITY_HIGHEST = 0, - DIAL_SENSITIVITY_HIGH = 1, - DIAL_SENSITIVITY_NORMAL = 2, - DIAL_SENSITIVITY_LOW = 3, - DIAL_SENSITIVITY_LOWEST = 4, + DIAL_SENSITIVITY_NORMAL = 0, + DIAL_SENSITIVITY_LOW = 1, + DIAL_SENSITIVITY_HIGH = 2, NUM_DIAL_SENSITIVITY };