From 94e5c21f77eadf6950e991402328bc5149bd02cd Mon Sep 17 00:00:00 2001 From: Jan-Henrik Bruhn Date: Wed, 5 Feb 2020 01:29:23 +0100 Subject: [PATCH] Menu Item Implementation fixes, rendering improvements, implement menu scrolling --- midi2cv/menu/menu.cc | 14 +++++--------- midi2cv/menu/menu_items.h | 5 ++++- midi2cv/midi2cv.cc | 30 ++++++++++-------------------- midi2cv/ui.cc | 35 ++++++++++++++++++++++++++++++----- 4 files changed, 49 insertions(+), 35 deletions(-) diff --git a/midi2cv/menu/menu.cc b/midi2cv/menu/menu.cc index 12787fb..537b025 100644 --- a/midi2cv/menu/menu.cc +++ b/midi2cv/menu/menu.cc @@ -2,7 +2,7 @@ #include #include -#define MENU_ITEM_HEIGHT 8 +#define MENU_ITEM_HEIGHT 12 void Menu::render(u8g2_t* u8g2_, uint8_t xStart, uint8_t yStart, uint8_t width, uint8_t height) { @@ -12,7 +12,7 @@ void Menu::render(u8g2_t* u8g2_, uint8_t xStart, uint8_t yStart, uint8_t width, uint8_t maxVisibleItems = height / MENU_ITEM_HEIGHT; uint8_t itemsToRender = std::min(maxVisibleItems, uint8_t(this->itemCount - currentScrollStart)); - + u8g2_SetFont(u8g2_, u8g2_font_6x12_tf); for (uint8_t i = 0; i < itemsToRender; i++) { bool selected = this->selectedItem == (i + this->currentScrollStart); uint8_t yPosition = yStart + i * MENU_ITEM_HEIGHT; @@ -26,10 +26,10 @@ void Menu::render(u8g2_t* u8g2_, uint8_t xStart, uint8_t yStart, uint8_t width, } u8g2_SetDrawColor(u8g2_, !selected ? 1 : 0); - u8g2_DrawStr(u8g2_, xStart + 0, yPosition + MENU_ITEM_HEIGHT, item->get_label()); + u8g2_DrawStr(u8g2_, xStart + 2, yPosition + MENU_ITEM_HEIGHT - 4, item->get_label()); uint8_t valueStringWidth = u8g2_GetStrWidth(u8g2_, item->get_string_representation()); - u8g2_DrawStr(u8g2_, xStart + width - valueStringWidth, yPosition + MENU_ITEM_HEIGHT, item->get_string_representation()); + u8g2_DrawStr(u8g2_, xStart + width - valueStringWidth - 2, yPosition + MENU_ITEM_HEIGHT - 4, item->get_string_representation()); } } @@ -52,14 +52,10 @@ void Menu::down() { uint8_t maxVisibleItems = height / MENU_ITEM_HEIGHT; if (this->selectedItem < this->itemCount - 1) { - if (this->selectedItem - this->currentScrollStart == maxVisibleItems - 1) { + if (this->selectedItem - this->currentScrollStart == maxVisibleItems - 2 && this->itemCount - this->currentScrollStart > maxVisibleItems) { this->currentScrollStart++; } this->selectedItem++; - - if (this->selectedItem >= this->itemCount - 1 - maxVisibleItems) { // last item - this->currentScrollStart = this->itemCount - 1 - maxVisibleItems; - } } } diff --git a/midi2cv/menu/menu_items.h b/midi2cv/menu/menu_items.h index 76ace14..193bc89 100644 --- a/midi2cv/menu/menu_items.h +++ b/midi2cv/menu/menu_items.h @@ -94,7 +94,10 @@ class UIntMenuItem : public NumberMenuItem { public: UIntMenuItem(const char* _label, uint32_t _initialValue, uint32_t _minimumValue, uint32_t _maximumValue, uint32_t _step) - : NumberMenuItem(_label, _initialValue, _minimumValue, _maximumValue, _step) {}; + : NumberMenuItem(_label, _initialValue, _minimumValue, _maximumValue, _step) + { + this->set_value(_initialValue); + }; }; class IntMenuItem : public NumberMenuItem { diff --git a/midi2cv/midi2cv.cc b/midi2cv/midi2cv.cc index 4f0c1f8..1326544 100644 --- a/midi2cv/midi2cv.cc +++ b/midi2cv/midi2cv.cc @@ -3,8 +3,8 @@ #include "drivers/display.h" #include "drivers/encoder.h" #include "drivers/gpio.h" -#include "menu/menu_items.h" #include "menu/menu.h" +#include "menu/menu_items.h" #include "part.h" #include "stmlib/system/system_clock.h" #include "ui.h" @@ -18,12 +18,6 @@ Encoder encoder; UI ui; Part part[PART_COUNT]; -UIntMenuItem item("peda", 0, 0, 42, 1); -FloatMenuItem item2("peda", 0, 0, 42, 1); -FloatMenuItem item3("peda", 0, 0, 42, 1); -Menu menu; - - // Default interrupt handlers. extern "C" { void NMI_Handler() {} @@ -68,8 +62,12 @@ void TIM2_IRQHandler(void) // this will get called with 8kHz (foof) // which still is a lot (60fps would be enough tbh) - - ui.Flush(); + static uint8_t count = 0; + count++; + if (count % (192 * 2) == 0) { + ui.Flush(); + count = 0; + } // write audiodac1 // write audiodac2 @@ -82,7 +80,7 @@ void InitTimers(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitTypeDef timer_init; - timer_init.TIM_Period = F_CPU / (8000) - 1; // 192 kHz, 48kHz for each audio DAC + timer_init.TIM_Period = F_CPU / (48000 * 4) - 1; timer_init.TIM_Prescaler = 0; timer_init.TIM_ClockDivision = TIM_CKD_DIV1; timer_init.TIM_CounterMode = TIM_CounterMode_Up; @@ -113,9 +111,9 @@ void Init(void) system_clock.Init(); SysTick_Config(F_CPU / 8000); - IWDG_Enable(); + + //IWDG_Enable(); gpio.Init(); - // asm("bkpt #0"); display.Init(); encoder.Init(); ui.Init(); @@ -126,14 +124,6 @@ int main(void) { Init(); - menu.add_item(&item); - menu.add_item(&item2); - menu.add_item(&item3); - menu.render(0, 0, 0, 0, 0); - - item.increase(); - item2.increase(); - item3.increase(); while (1) { // In this loop we do things that dont depend on any timing, but that have to be done. // you should not write on spi here because that should happen in the TIM2 interrupt diff --git a/midi2cv/ui.cc b/midi2cv/ui.cc index 383ecfe..975df37 100644 --- a/midi2cv/ui.cc +++ b/midi2cv/ui.cc @@ -1,6 +1,8 @@ #include "ui.h" #include "drivers/display.h" #include "midi2cv/drivers/encoder.h" +#include "midi2cv/menu/menu.h" +#include "midi2cv/menu/menu_items.h" #include "part.h" #include "stmlib/utils/random.h" #include @@ -11,9 +13,26 @@ using namespace stmlib; const char part_names[4][2] = { "A", "B", "C", "D" }; +Menu menu(128, 64); +UIntMenuItem item1("wolfgang", 0, 0, 100, 1); +UIntMenuItem item2("joerg", 0, 0, 100, 1); +UIntMenuItem item3("ralle", 0, 0, 100, 1); +UIntMenuItem item4("ralle1", 0, 0, 100, 1); +UIntMenuItem item5("ralle2", 0, 0, 100, 1); +UIntMenuItem item6("ralle3", 0, 0, 100, 1); +UIntMenuItem item7("ralle4", 0, 0, 100, 1); + void UI::Init() { input_queue.Init(); + + menu.add_item((AbstractMenuItem*)&item1); + menu.add_item((AbstractMenuItem*)&item2); + menu.add_item((AbstractMenuItem*)&item3); + menu.add_item((AbstractMenuItem*)&item4); + menu.add_item((AbstractMenuItem*)&item5); + menu.add_item((AbstractMenuItem*)&item6); + menu.add_item((AbstractMenuItem*)&item7); } void UI::Poll() @@ -25,7 +44,8 @@ void UI::Poll() } } -void UI::Draw() { +void UI::Draw() +{ u8g2_ClearBuffer(display.u8g2()); switch (current_menu) { @@ -33,8 +53,9 @@ void UI::Draw() { case MENU_PART_2: case MENU_PART_3: case MENU_PART_4: - DrawHeader(); - DrawPartMenu(current_menu); + //DrawHeader(); + //DrawPartMenu(current_menu); + menu.render(display.u8g2(), 0, 0, 128, 64); break; default: @@ -89,7 +110,7 @@ bool UI::DoEvents() refresh_display = true; } - if(refresh_display) { + if (refresh_display) { input_queue.Touch(); Draw(); } @@ -107,5 +128,9 @@ void UI::OnLongClick() void UI::OnIncrement(Event& e) { - current_menu = (Menu_t) (((uint32_t)current_menu + e.data) % MENU_COUNT); + if (e.data > 0) + menu.down(); + else + menu.up(); + //current_menu = (Menu_t) (((uint32_t)current_menu + e.data) % MENU_COUNT); }