From f22046ecccf6d7d4f5f371e791c08ab2c989029b Mon Sep 17 00:00:00 2001 From: Kyle Reed Date: Sun, 7 May 2023 13:01:43 -0700 Subject: [PATCH] Add "Auto" mode to FrequencyField (#959) * Add "Auto" mode to FrequencyField * Use exponential function instead of hyperbolic * Fix tabs * Back to hyperbolic, better feel --- .gitignore | 1 + firmware/application/apps/ui_sd_over_usb.hpp | 2 +- firmware/application/ui/ui_receiver.cpp | 17 ++++++++++++++++- firmware/application/ui/ui_receiver.hpp | 2 ++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c674d12d8..6cfee2022 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ /sdcard/FREQMAN/BHT* /sdcard/FREQMAN/R.TXT /sdcard/FREQMAN/XXX.TXT +/armbin # Compiled Object files *.slo diff --git a/firmware/application/apps/ui_sd_over_usb.hpp b/firmware/application/apps/ui_sd_over_usb.hpp index 9df6421ac..1801ce0d8 100644 --- a/firmware/application/apps/ui_sd_over_usb.hpp +++ b/firmware/application/apps/ui_sd_over_usb.hpp @@ -40,7 +40,7 @@ public: void focus() override; - std::string title() const override { return "Flash Utility"; }; + std::string title() const override { return "SD over USB"; }; private: NavigationView& nav_; diff --git a/firmware/application/ui/ui_receiver.cpp b/firmware/application/ui/ui_receiver.cpp index 4dc48e785..a05b743f0 100644 --- a/firmware/application/ui/ui_receiver.cpp +++ b/firmware/application/ui/ui_receiver.cpp @@ -87,7 +87,22 @@ bool FrequencyField::on_key(const ui::KeyEvent event) { } bool FrequencyField::on_encoder(const EncoderEvent delta) { - set_value(value() + (delta * step)); + if (step == 0) { // 'Auto' mode.' + auto ms = RTT2MS(halGetCounterValue()); + auto delta_ms = last_ms_ <= ms ? ms - last_ms_ : ms; + last_ms_ = ms; + + // The goal is to map 'scale' to a range of about 10 to 10M. + // The faster the encoder is rotated, the larger the step. + // Linear doesn't feel right. Hyperbolic felt better. + // To get these magic numbers, I graphed the function until the + // curve shape seemed about right then tested on device. + delta_ms = std::min(145ull, delta_ms) + 5; // Prevent DIV/0 + int64_t scale = 200'000'000 / (0.001'55 * pow(delta_ms, 5.45)) + 8; + set_value(value() + (delta * scale)); + } else { + set_value(value() + (delta * step)); + } return true; } diff --git a/firmware/application/ui/ui_receiver.hpp b/firmware/application/ui/ui_receiver.hpp index 80b4eda19..05e078d2f 100644 --- a/firmware/application/ui/ui_receiver.hpp +++ b/firmware/application/ui/ui_receiver.hpp @@ -63,6 +63,7 @@ private: const range_t range; rf::Frequency value_ { 0 }; rf::Frequency step { 25000 }; + uint64_t last_ms_ { 0 }; rf::Frequency clamp_value(rf::Frequency value); }; @@ -247,6 +248,7 @@ public: parent_pos, 5, { + { " Auto", 0 }, /* Faster == larger step. */ { " 10", 10 }, /* Fine tuning SSB voice pitch,in HF and QO-100 sat #669 */ { " 50", 50 }, /* added 50Hz/10Hz,but we do not increase GUI digit decimal */ { " 100", 100 },