From a1aa6ecdbf0497a847fd801a5af65096b0e6c465 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 13 Dec 2015 21:28:39 -0800 Subject: [PATCH] Eliminate per-device Views and RegisterWidgets, virtual methods. Nice code size improvement, despite supporting three device register sets instead of just one. --- firmware/application/ui_debug.cpp | 17 +++++-- firmware/application/ui_debug.hpp | 85 ++++++++----------------------- 2 files changed, 35 insertions(+), 67 deletions(-) diff --git a/firmware/application/ui_debug.cpp b/firmware/application/ui_debug.cpp index 4c35b489d..a07bea91c 100644 --- a/firmware/application/ui_debug.cpp +++ b/firmware/application/ui_debug.cpp @@ -93,7 +93,7 @@ void RegistersWidget::draw_values( static_cast((i / config.registers_per_row) * row_height) }; - const auto value = read(i); + const auto value = reader(i); const auto text = to_string_hex(value, config.value_length); painter.draw_string( @@ -111,9 +111,18 @@ DebugMenuView::DebugMenuView(NavigationView& nav) { { "Memory", [&nav](){ nav.push(new DebugMemoryView { nav }); } }, { "Radio State", [&nav](){ nav.push(new NotImplementedView { nav }); } }, { "SD Card", [&nav](){ nav.push(new NotImplementedView { nav }); } }, - { "RFFC5072", [&nav](){ nav.push(new DebugRFFC5072View { nav }); } }, - { "MAX2837", [&nav](){ nav.push(new DebugMAX2837View { nav }); } }, - { "Si5351C", [&nav](){ nav.push(new DebugSi5351CView { nav }); } }, + { "RFFC5072", [&nav](){ nav.push(new RegistersView { + nav, "RFFC5072", { 31, 2, 4, 4 }, + [](const size_t register_number) { return radio::first_if.read(register_number); } + }); } }, + { "MAX2837", [&nav](){ nav.push(new RegistersView { + nav, "MAX2837", { 32, 2, 3, 4 }, + [](const size_t register_number) { return radio::second_if.read(register_number); } + }); } }, + { "Si5351C", [&nav](){ nav.push(new RegistersView { + nav, "Si5351C", { 96, 2, 2, 8 }, + [](const size_t register_number) { return portapack::clock_generator.read_register(register_number); } + }); } }, { "WM8731", [&nav](){ nav.push(new NotImplementedView { nav }); } }, } }); on_left = [&nav](){ nav.pop(); }; diff --git a/firmware/application/ui_debug.hpp b/firmware/application/ui_debug.hpp index 3b7624d66..420f3162a 100644 --- a/firmware/application/ui_debug.hpp +++ b/firmware/application/ui_debug.hpp @@ -32,6 +32,9 @@ #include "max2837.hpp" #include "portapack.hpp" +#include +#include + namespace ui { class DebugMemoryView : public View { @@ -80,7 +83,6 @@ private: }; struct RegistersWidgetConfig { - const char* const name; size_t registers_count; size_t legend_length; size_t value_length; @@ -109,26 +111,22 @@ struct RegistersWidgetConfig { class RegistersWidget : public Widget { public: - constexpr RegistersWidget( - Rect parent_rect, - const RegistersWidgetConfig& config - ) : Widget { parent_rect }, - config(config) + RegistersWidget( + RegistersWidgetConfig&& config, + std::function&& reader + ) : Widget { }, + config(std::move(config)), + reader(std::move(reader)) { } - std::string name() const { - return config.name; - } - - virtual uint32_t read(const size_t register_number) = 0; - void update(); void paint(Painter& painter) override; private: const RegistersWidgetConfig config; + const std::function reader; static constexpr Dim row_height = 16; @@ -136,62 +134,29 @@ private: void draw_values(Painter& painter); }; -class DebugRFFC5072RegistersWidget : public RegistersWidget { -public: - constexpr DebugRFFC5072RegistersWidget( - Rect parent_rect - ) : RegistersWidget { parent_rect, { "RFFC5072", 31, 2, 4, 4 } } - { - } - - uint32_t read(const size_t register_number) override { - return radio::first_if.read(register_number); - } -}; - -class DebugMAX2837RegistersWidget : public RegistersWidget { -public: - constexpr DebugMAX2837RegistersWidget( - Rect parent_rect - ) : RegistersWidget { parent_rect, { "MAX2837", 32, 2, 3, 4 } } - { - } - - uint32_t read(const size_t register_number) override { - return radio::second_if.read(register_number); - } -}; - -class DebugSi5351CRegistersWidget : public RegistersWidget { -public: - constexpr DebugSi5351CRegistersWidget( - Rect parent_rect - ) : RegistersWidget { parent_rect, { "Si5351C", 96, 2, 2, 8 } } - { - } - - uint32_t read(const size_t register_number) override { - return portapack::clock_generator.read_register(register_number); - } -}; - -template class RegistersView : public View { public: - RegistersView(NavigationView& nav) { + RegistersView( + NavigationView& nav, + const std::string& title, + RegistersWidgetConfig&& config, + std::function&& reader + ) : registers_widget { std::move(config), std::move(reader) } + { add_children({ { &text_title, - &widget_registers, + ®isters_widget, &button_update, &button_done, } }); button_update.on_select = [this](Button&){ - this->widget_registers.update(); + this->registers_widget.update(); }; button_done.on_select = [&nav](Button&){ nav.pop(); }; - const auto title = widget_registers.name(); + registers_widget.set_parent_rect({ 0, 48, 240, 192 }); + text_title.set_parent_rect({ static_cast((240 - title.size() * 8) / 2), 16, static_cast(title.size() * 8), 16 @@ -206,9 +171,7 @@ public: private: Text text_title; - RegistersWidget widget_registers { - { 0, 48, 240, 192 } - }; + RegistersWidget registers_widget; Button button_update { { 16, 256, 96, 24 }, @@ -221,10 +184,6 @@ private: }; }; -using DebugRFFC5072View = RegistersView; -using DebugMAX2837View = RegistersView; -using DebugSi5351CView = RegistersView; - class DebugMenuView : public MenuView { public: DebugMenuView(NavigationView& nav);