From eeff886cc1da162de905c475c16c362b9da3dfc5 Mon Sep 17 00:00:00 2001 From: devdl11 Date: Sat, 9 Apr 2022 11:02:34 +0200 Subject: [PATCH] [bootloader > menus] Improvement --- bootloader/Makefile | 14 ++++++++++++ bootloader/boot.cpp | 27 +++--------------------- bootloader/interface.cpp | 2 +- bootloader/interface/menus/home/home.cpp | 10 ++++----- bootloader/interface/src/menu.cpp | 21 ++++++++++++------ bootloader/interface/src/menu.h | 5 +++-- bootloader/itoa.cpp | 2 +- bootloader/kernel_header.h | 1 + bootloader/usb_data.cpp | 4 ++-- bootloader/utility.cpp | 2 +- bootloader/utility.h | 8 ++++--- 11 files changed, 50 insertions(+), 46 deletions(-) diff --git a/bootloader/Makefile b/bootloader/Makefile index 56648ddba..ff7a5599a 100644 --- a/bootloader/Makefile +++ b/bootloader/Makefile @@ -19,6 +19,20 @@ bootloader_images = $(addprefix bootloader/, \ computer.png \ ) +bootloader_src += $(addprefix bootloader/interface/src/,\ + menu.cpp \ +) + +bootloader_src += $(addprefix bootloader/interface/menus/about/,\ + about.cpp \ +) + +bootloader_src += $(addprefix bootloader/interface/menus/home/,\ + home.cpp \ +) + + bootloader_src += $(ion_src) $(simple_kandinsky_src) $(liba_src) $(libaxx_src) $(bootloader_images) $(eval $(call depends_on_image,bootloader/interface.cpp,$(bootloader_images))) +$(eval $(call depends_on_image,bootloader/interface/menus/home/home.cpp,$(bootloader_images))) diff --git a/bootloader/boot.cpp b/bootloader/boot.cpp index 284acf8ad..765368b39 100644 --- a/bootloader/boot.cpp +++ b/bootloader/boot.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -51,31 +52,9 @@ void Boot::bootSlot(Bootloader::Slot s) { __attribute__((noreturn)) void Boot::boot() { assert(mode() != BootMode::Unknown); - bool isSlotA = Slot::A().kernelHeader()->isValid(); - bool isSlotB = Slot::B().kernelHeader()->isValid(); - bool isSlotKhi = Slot::Khi().kernelHeader()->isValid(); - - Interface::drawMenu(); - while (true) { - uint64_t scan = Ion::Keyboard::scan(); - if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::One) && isSlotA) { - Boot::bootSlot(Slot::A()); - } else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::Two) && isSlotKhi) { - Boot::bootSlot(Slot::Khi()); - } else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::Three) && isSlotB) { - Boot::bootSlot(Slot::B()); - } else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::Four)) { - installerMenu(); - } else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::Five)) { - aboutMenu(); - } - // else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::Six)) { - // Ion::Device::Reset::core(); - // } - else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::OnOff)) { - Ion::Power::standby(); // Force a core reset to exit - } + HomeMenu menu = HomeMenu(); + menu.open(true); } // Achievement unlocked: How Did We Get Here? diff --git a/bootloader/interface.cpp b/bootloader/interface.cpp index 3c64f4bce..7d54da274 100644 --- a/bootloader/interface.cpp +++ b/bootloader/interface.cpp @@ -290,7 +290,7 @@ void Interface::drawInstallerSelection() { ctx->drawString(Messages::installerText3, KDPoint(initPos, y), KDFont::SmallFont, KDColorBlack, KDColorWhite); } -void Interface::drawBLUpdate() { +void Interface::drawBootloaderUpdate() { Interface::drawHeader(); KDContext * ctx = KDIonContext::sharedContext(); int y = ImageStore::Computer->height() + (KDFont::LargeFont->glyphSize().height() + 10) + (KDFont::SmallFont->glyphSize().height() + 10); diff --git a/bootloader/interface/menus/home/home.cpp b/bootloader/interface/menus/home/home.cpp index df909d06f..ef367c8eb 100644 --- a/bootloader/interface/menus/home/home.cpp +++ b/bootloader/interface/menus/home/home.cpp @@ -54,9 +54,9 @@ const char * Bootloader::HomeMenu::slotB_text() { } void Bootloader::HomeMenu::setup() { - m_colomns[0] = Colomn(slotA_text(), Ion::Keyboard::Key::One, k_large_font, 10, false, &slotA_submenu); - m_colomns[1] = Colomn(slotKhi_text(), Ion::Keyboard::Key::Two, k_large_font, 10, false, &slotKhi_submenu); - m_colomns[2] = Colomn(slotB_text(), Ion::Keyboard::Key::Three, k_large_font, 10, false, &slotB_submenu); - m_colomns[3] = Colomn("4- installer", Ion::Keyboard::Key::Four, k_large_font, 10, false, &installer_submenu); - m_colomns[4] = Colomn("5- about", Ion::Keyboard::Key::Five, k_large_font, 10, false, &about_submenu); + m_colomns[0] = Colomn(slotA_text(), Ion::Keyboard::Key::One, k_small_font, 30, false, &slotA_submenu); + m_colomns[1] = Colomn(slotKhi_text(), Ion::Keyboard::Key::Two, k_small_font, 30, false, &slotKhi_submenu); + m_colomns[2] = Colomn(slotB_text(), Ion::Keyboard::Key::Three, k_small_font, 30, false, &slotB_submenu); + m_colomns[3] = Colomn("4- installer", Ion::Keyboard::Key::Four, k_small_font, 30, false, &installer_submenu); + m_colomns[4] = Colomn("5- about", Ion::Keyboard::Key::Five, k_small_font, 30, false, &about_submenu); } \ No newline at end of file diff --git a/bootloader/interface/src/menu.cpp b/bootloader/interface/src/menu.cpp index 09ccaa15a..6b197e4d1 100644 --- a/bootloader/interface/src/menu.cpp +++ b/bootloader/interface/src/menu.cpp @@ -4,13 +4,15 @@ #include #include -#include "computer.h" +#include + +const Ion::Keyboard::Key Bootloader::Menu::k_breaking_keys[]; void Bootloader::Menu::setup() { // Here we add the colomns to the menu. } -void Bootloader::Menu::open() { +void Bootloader::Menu::open(bool noreturn) { showMenu(); uint64_t scan = 0; @@ -19,16 +21,19 @@ void Bootloader::Menu::open() { while(!exit) { scan = Ion::Keyboard::scan(); exit = !handleKey(scan); + if (noreturn) { + exit = false; + } } } int Bootloader::Menu::calculateCenterX(const char * text, int fontWidth) { - return (k_screen.width() - fontWidth * strlen(text)) / 2; + return (getScreen().width() - fontWidth * strlen(text)) / 2; } void Bootloader::Menu::showMenu() { KDContext * ctx = KDIonContext::sharedContext(); - ctx->fillRect(k_screen, m_background); + ctx->fillRect(getScreen(), m_background); Interface::drawImage(ctx, ImageStore::Computer, 25); int y = ImageStore::Computer->height() + 25 + 10; int x = calculateCenterX(m_title, largeFontWidth()); @@ -45,7 +50,7 @@ void Bootloader::Menu::showMenu() { } if (m_bottom != nullptr) { - y = k_screen.height() - smallFontHeight() - 10; + y = getScreen().height() - smallFontHeight() - 10; x = calculateCenterX(m_bottom, smallFontWidth()); ctx->drawString(m_bottom, KDPoint(x, y), k_small_font, m_foreground, m_background); } @@ -57,7 +62,7 @@ bool Bootloader::Menu::handleKey(uint64_t key) { return false; } } - if (key == Ion::Keyboard::State(Ion::Keyboard::Key::Power)) { + if (key == Ion::Keyboard::State(Ion::Keyboard::Key::OnOff)) { Ion::Power::standby(); return false; } @@ -65,7 +70,9 @@ bool Bootloader::Menu::handleKey(uint64_t key) { if (colomn.isNull() || !colomn.isClickable()) { continue; } else { - colomn.didHandledEvent(key); + if (colomn.didHandledEvent(key)) { + redraw(); + } } } return true; diff --git a/bootloader/interface/src/menu.h b/bootloader/interface/src/menu.h index 9b9c5bf00..46cb56017 100644 --- a/bootloader/interface/src/menu.h +++ b/bootloader/interface/src/menu.h @@ -46,20 +46,21 @@ namespace Bootloader { bool (*m_callback)(); }; - void open(); + void open(bool noreturn = false); void redraw() { showMenu(); }; static int calculateCenterX(const char * text, int fontWidth); static constexpr const KDFont * k_small_font = KDFont::SmallFont; static constexpr const KDFont * k_large_font = KDFont::LargeFont; + + static const KDRect getScreen() { return KDRect(0, 0, 320, 240); }; private: static const int k_max_colomns = 5; static const int k_colomns_margin = 5; static constexpr Ion::Keyboard::Key k_breaking_keys[] = {Ion::Keyboard::Key::Back, Ion::Keyboard::Key::Home}; - static constexpr KDRect k_screen = KDRect(0, 0, 320, 240); int smallFontHeight() const { return k_small_font->glyphSize().height(); }; int largeFontHeight() const { return k_large_font->glyphSize().height(); }; diff --git a/bootloader/itoa.cpp b/bootloader/itoa.cpp index 7d712ebdd..8235e7b32 100644 --- a/bootloader/itoa.cpp +++ b/bootloader/itoa.cpp @@ -19,7 +19,7 @@ char* reverse(char *buffer, int i, int j) { } // Iterative function to implement `itoa()` function in C -char* Utility::itoa(int value, char* buffer, int base) { +char* Bootloader::Utility::itoa(int value, char* buffer, int base) { // invalid input if (base < 2 || base > 32) { return buffer; diff --git a/bootloader/kernel_header.h b/bootloader/kernel_header.h index 44963851d..ad7fbaf4b 100644 --- a/bootloader/kernel_header.h +++ b/bootloader/kernel_header.h @@ -2,6 +2,7 @@ #define BOOTLOADER_KERNEL_HEADER_H #include +#include namespace Bootloader { diff --git a/bootloader/usb_data.cpp b/bootloader/usb_data.cpp index 1074d7223..b161df94c 100644 --- a/bootloader/usb_data.cpp +++ b/bootloader/usb_data.cpp @@ -13,13 +13,13 @@ static char data[255]; const char * Bootloader::USBData::buildStringDescriptor(StringHeader header, uint32_t startAddress, uint32_t size) { strlcpy(data, header.getString(), sizeof(data)); - Utility::itoa((int32_t)startAddress, &data[strlen(header.getString())], 16); + Bootloader::Utility::itoa((int32_t)startAddress, &data[strlen(header.getString())], 16); data[strlen(header.getString()) + 8] = '/'; data[strlen(header.getString()) + 8 + 1] = '0'; data[strlen(header.getString()) + 8 + 2] = '1'; data[strlen(header.getString()) + 8 + 3] = '*'; data[strlen(header.getString()) + 8 + 4] = '0'; - Utility::itoa((int32_t)size/1024, &data[strlen(header.getString()) + 8 + 5], 10); + Bootloader::Utility::itoa((int32_t)size/1024, &data[strlen(header.getString()) + 8 + 5], 10); data[strlen(header.getString()) + 8 + 5 + 2] = 'K'; data[strlen(header.getString()) + 8 + 5 + 2 + 1] = 'g'; data[strlen(header.getString()) + 8 + 5 + 2 + 2] = '\0'; diff --git a/bootloader/utility.cpp b/bootloader/utility.cpp index d2bdc44a0..1329351e5 100644 --- a/bootloader/utility.cpp +++ b/bootloader/utility.cpp @@ -1,7 +1,7 @@ #include #include -int Utility::versionSum(const char * version, int length) { +int Bootloader::Utility::versionSum(const char * version, int length) { int sum = 0; for (int i = 0; i < length; i++) { sum += version[i] * (strlen(version) * 100 - i * 10); diff --git a/bootloader/utility.h b/bootloader/utility.h index 1d24f989a..bc8c03ca1 100644 --- a/bootloader/utility.h +++ b/bootloader/utility.h @@ -1,9 +1,11 @@ #ifndef _BOOTLOADER_ITOA_H_ #define _BOOTLOADER_ITOA_H_ -namespace Utility { - static char * itoa(int value, char * result, int base); - static int versionSum(const char * version, int length); +namespace Bootloader { + namespace Utility { + static char * itoa(int value, char * result, int base); + static int versionSum(const char * version, int length); + } } #endif