#include "../../../include/asset_mgr.hpp" #include "../../../include/shared.hpp" #include #include #include #include #include #include #include namespace BIOSInfo { using namespace JabyEngine; static constexpr auto TextOffset = Make::PositionI16(16, 16); using NameColorPair = pair; struct FontSlider { static constexpr auto MoveTimeout = static_cast(300_ms); static constexpr auto WaitTimeout = static_cast(1000_ms); int16_t count; int16_t max; int8_t delta; IntervalTimer wait_timer; static FontSlider create_for(const FontWriter::FontInfo& font_info, const char* str) { const auto max = static_cast((strlen(str)*font_info.get_kern_size().width) - GPU::Display::Width + (TextOffset.x << 1)); return FontSlider{ .count = 0, .max = max, .delta = static_cast(max < 0 ? 0 : font_info.get_kern_size().width/2), .wait_timer = IntervalTimer::create(FontSlider::MoveTimeout) }; } void advance() { if(this->wait_timer.is_expired()) { this->wait_timer.reset(); this->count += delta; if(this->count <= 0 || this->count >= this->max) { this->delta *= -1; this->wait_timer.set_interval(FontSlider::WaitTimeout); } else { this->wait_timer.set_interval(FontSlider::MoveTimeout); } } } }; static struct { using BIOSStringOffset = const char*const (BIOS::Version::*); const BIOSStringOffset bios_str_offset; const char*const display_str; FontSlider font_slider; } BIOSStringInfo[] = { {.bios_str_offset = &BIOS::Version::kernel_maker, .display_str = "Kernel-Maker"}, {.bios_str_offset = &BIOS::Version::version_str, .display_str = "Version"}, {.bios_str_offset = &BIOS::Version::gui_version, .display_str = "GUI-Version"}, {.bios_str_offset = &BIOS::Version::copyright, .display_str = "Copyright"}, }; static GPU::TILE::Linked border_tiles[2] = { Make::TILE(Make::AreaI16(0, 0, TextOffset.x, GPU::Display::Height - 32), GPU::Color24::Black()).linked(), Make::TILE(Make::AreaI16(GPU::Display::Width - TextOffset.x, 0, TextOffset.x, GPU::Display::Height - 32), GPU::Color24::Black()).linked() }; static NameColorPair bios_name; static FontSlider bios_name_slider; static NameColorPair get_bios_name() { switch(BIOS::version.type) { case BIOS::Version::Devboard: return {"DevBoard", GPU::Color24::Green()}; case BIOS::Version::PS1: return {"PS1", GPU::Color24::Red()}; case BIOS::Version::PS2: return {"PS2", GPU::Color24::Blue()}; case BIOS::Version::PS3: return {"PS3", GPU::Color24::Yellow()}; case BIOS::Version::PSCompatible: return {"Unkown PS compatible BIOS", GPU::Color24::Grey()}; case BIOS::Version::No$psx: return {"NO$PSX", GPU::Color24::Purple()}; case BIOS::Version::XEBRA: return {"XEBRA", GPU::Color24::Turquoise()}; default: return {"Unkown", GPU::Color24::White()}; } } static void setup() { bios_name = get_bios_name(); Shared::back_menu.reset(); for(auto& bios_str_info : BIOSStringInfo) { bios_str_info.font_slider = FontSlider::create_for(FontWriter::BIOSFont::Info, BIOS::version.*(bios_str_info.bios_str_offset)); } bios_name_slider = FontSlider::create_for(FontWriter::BIOSFont::Info, bios_name.first); border_tiles[0].concat(border_tiles[1]); } static bool update_or_exit() { static const auto move_cursor = [](JabyEngine::Cursor& cursor, int16_t dx, int16_t old_x) -> JabyEngine::Cursor& { cursor.pos.x = (old_x - dx); return cursor; }; Periphery::query_controller(); if(Shared::back_menu.update(Make::PositionI16(0, GPU::Display::Height - 32))) { return true; } auto cursor = FontWriter::update(TextOffset); FontWriter::bios_font_writer.write(cursor, "BIOS INFORMATION\n----------------\nDate (day/month/year):\n%i/%i/%i\n", BIOS::version.date.day, BIOS::version.date.month, BIOS::version.date.year); const auto old_pos_x = cursor.pos.x; for(auto& bios_str_info : BIOSStringInfo) { bios_str_info.font_slider.advance(); FontWriter::bios_font_writer.write(move_cursor(cursor, 0, old_pos_x), "%s:\n", bios_str_info.display_str); FontWriter::bios_font_writer.write(move_cursor(cursor, bios_str_info.font_slider.count, old_pos_x), "%s\n", BIOS::version.*(bios_str_info.bios_str_offset)); } FontWriter::bios_font_writer.write(move_cursor(cursor, 0, old_pos_x), "BIOS Type:\n"); FontWriter::bios_font_writer.write(move_cursor(cursor, bios_name_slider.count, old_pos_x), "%s\n", bios_name.second, bios_name.first); FontWriter::bios_font_writer.write(move_cursor(cursor, 0, old_pos_x), "----------------\n"); return false; } static void render() { Shared::back_menu.render(); FontWriter::bios_font_writer.render(); GPU::render(border_tiles[0]); } void main() { setup(); while(true) { if(update_or_exit()) { break; } GPU::swap_buffers_vsync(1); render(); } } }