New Logger
Add NTCtrl Base to UI7
This commit is contained in:
tobid7 2024-06-12 19:03:41 +02:00
parent ddf06eb18e
commit 1271b9fa9a
14 changed files with 141 additions and 138 deletions

View File

@ -28,7 +28,6 @@
#include <renderd7/Net.hpp>
#include <renderd7/Overlays.hpp>
#include <renderd7/Sound.hpp>
#include <renderd7/StealConsole.hpp>
#include <renderd7/Timer.hpp>
#include <renderd7/UI7.hpp>
#include <renderd7/global_db.hpp>

View File

@ -35,15 +35,19 @@ class LoggerBase {
/// @brief Init the Logger
/// @param filename name[_date_time.txt]
void Init(const std::string& name, bool fileless = false);
/// @brief Write a String to the File
/// @brief Write a String
/// @param debug_text string
void Write(const std::string& debug_text);
/// @param lvl Logger LVL 0 = ERR, 1 =WARNING, >=2= Default
void Write(const std::string& debug_text, int lvl = 2);
void SetLvl(int lvl) { writelvl = lvl; }
const std::vector<std::string>& Lines();
private:
/// \param filename the name of the logfile
std::string filename;
std::string log_path;
std::ofstream _log;
int writelvl = 1; // Only log errors/Warnings
std::vector<std::string> lines;
};
} // namespace RenderD7

View File

@ -30,9 +30,9 @@ namespace RenderD7 {
class SpriteSheetAnimation : public RenderD7::Sprite {
public:
/// @brief Constructor
SpriteSheetAnimation();
SpriteSheetAnimation() = default;
/// @brief Deconstructor
~SpriteSheetAnimation();
~SpriteSheetAnimation() = default;
RD7_SMART_CTOR(SpriteSheetAnimation);
/// @brief Setup an Animation
/// @param sheet Input Spritesheet

View File

@ -1,39 +0,0 @@
/**
* This file is part of RenderD7
* Copyright (C) 2021-2024 NPI-D7, tobid7
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <sstream>
#include <string>
namespace RenderD7 {
/// @brief StealConsole Class
class StealConsole {
public:
/// @brief Constructor
StealConsole();
/// @brief Deconstructor
~StealConsole();
/// @brief The Stolen Stdout
/// @return Stdout as string
std::string GetStdout();
private:
/// @param stolen_stdout Stolen Stdout
std::stringstream stolen_stdout;
};
} // namespace RenderD7

View File

@ -22,7 +22,7 @@
#include <renderd7/global_db.hpp>
#include <renderd7/renderd7.hpp>
#define CFGVER "0"
#define CFGVER "1"
#define THEMEVER "0"
#ifndef V_RD7BTIME
@ -76,6 +76,9 @@ extern bool rd7i_amdt;
extern void* rd7i_soc_buf;
extern bool rd7i_is_am_init;
extern RenderD7::Theme::Ref rd7i_active_theme;
extern bool rd7i_lggrf;
// Use function for protection
RenderD7::LoggerBase::Ref _rd7i_logger();
RenderD7::Net::Error rd7i_soc_init();
void rd7i_soc_deinit();

View File

@ -37,7 +37,7 @@
#include <renderd7/Color.hpp>
#include <renderd7/FunctionTrace.hpp>
#include <renderd7/Hardware.hpp>
#include <renderd7/Log2.hpp>
#include <renderd7/Logger.hpp>
#include <renderd7/Memory.hpp>
#include <renderd7/Overlays.hpp>
#include <renderd7/Ovl.hpp>
@ -107,6 +107,7 @@ class RSettings : public RenderD7::Scene {
ROVERLAYS, // Overlay Settings
RFTRACE, // FTRace Menu
RUI7, // UI7 Menu
RLOGS, // Logs
};
/// @param shared_request Defines requests from Draw to Logic

View File

@ -19,7 +19,7 @@
#include <filesystem>
#include <fstream>
#include <memory>
#include <renderd7/Log2.hpp>
#include <renderd7/Logger.hpp>
#include <renderd7/Time.hpp>
#include <renderd7/renderd7.hpp>
@ -46,9 +46,9 @@ void LoggerBase::Init(const std::string& name, bool fileless) {
this->Write("RenderD7 Log\n\n");
}
void LoggerBase::Write(const std::string& debug_text) {
void LoggerBase::Write(const std::string& debug_text, int lvl) {
std::string msg = "[" + RenderD7::GetTimeStr() + "]: " + debug_text;
if (this->_log.is_open()) {
if (this->_log.is_open() && lvl <= writelvl) {
this->_log << msg << std::endl;
}
while (msg.find_first_of('\n') != 0) {
@ -57,4 +57,6 @@ void LoggerBase::Write(const std::string& debug_text) {
}
lines.push_back(msg);
}
const std::vector<std::string>& LoggerBase::Lines() { return this->lines; }
} // namespace RenderD7

View File

@ -17,13 +17,18 @@
*/
#include <renderd7/Sheet.hpp>
#include <renderd7/internal_db.hpp>
Result RenderD7::Sheet::Load(const std::string& path) {
this->spritesheet = C2D_SpriteSheetLoad(path.c_str());
if (!this->spritesheet) {
_rd7i_logger()->Write("Failed to Load Spritesheet from: " + path, 0);
}
return 0;
}
void RenderD7::Sheet::Free() {
if (!this->spritesheet) return;
C2D_SpriteSheetFree(this->spritesheet);
this->spritesheet = nullptr;
}

View File

@ -50,7 +50,7 @@ Sound::Sound(const string &path, int channel, bool toloop) {
std::fstream fp(path, std::ios::in | std::ios::binary);
if (!fp.is_open()) {
printf("Could not open the WAV file: %s\n", path.c_str());
_rd7i_logger()->Write("Could not open WAV: " + path, 0);
return;
}
@ -59,7 +59,7 @@ Sound::Sound(const string &path, int channel, bool toloop) {
size_t read = fp.tellg();
if (read != sizeof(wavHeader)) {
// Short read.
printf("WAV file header is too short: %s\n", path.c_str());
_rd7i_logger()->Write("WAV Header is too short", 0);
fp.close();
return;
}
@ -68,7 +68,7 @@ Sound::Sound(const string &path, int channel, bool toloop) {
static const char RIFF_magic[4] = {'R', 'I', 'F', 'F'};
if (memcmp(wavHeader.magic, RIFF_magic, sizeof(wavHeader.magic)) != 0) {
// Incorrect magic number.
printf("Wrong file format.\n");
_rd7i_logger()->Write("Wrong Fileformat", 0);
fp.close();
return;
}
@ -77,7 +77,7 @@ Sound::Sound(const string &path, int channel, bool toloop) {
(wavHeader.channels != 1 && wavHeader.channels != 2) ||
(wavHeader.bits_per_sample != 8 && wavHeader.bits_per_sample != 16)) {
// Unsupported WAV file.
printf("Corrupted wav file.\n");
_rd7i_logger()->Write("File is invalid", 0);
fp.close();
return;
}

View File

@ -18,13 +18,6 @@
#include <renderd7/SpriteAnimation.hpp>
RenderD7::SpriteSheetAnimation::SpriteSheetAnimation() {
//
}
RenderD7::SpriteSheetAnimation::~SpriteSheetAnimation() {
//
}
void RenderD7::SpriteSheetAnimation::Setup(RenderD7::Sheet::Ref sheet,
size_t imagecount, size_t startimage,
float frame_begin,

View File

@ -1,42 +0,0 @@
/**
* This file is part of RenderD7
* Copyright (C) 2021-2024 NPI-D7, tobid7
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <iostream>
#include <renderd7/StealConsole.hpp>
namespace RenderD7 {
StealConsole::StealConsole() {
std::streambuf *old = std::cout.rdbuf(this->stolen_stdout.rdbuf());
if (old) {
// To prevent from unused error
}
}
StealConsole::~StealConsole() {
// Do Nothing Here
}
std::string StealConsole::GetStdout() {
if (this->stolen_stdout.str().length() < 400) {
return this->stolen_stdout.str();
} else {
return this->stolen_stdout.str().substr(stolen_stdout.str().length() - 400);
}
return "";
}
} // namespace RenderD7

View File

@ -83,6 +83,33 @@ struct UI7ID {
bool has_title;
};
// Non Touch Control
struct NTCtrl {
// 0x0 = Obj
// 0x1 = Selector
// 0x2 = fill obj
std::vector<unsigned char> grid;
std::vector<unsigned char> cgrid;
int hz = 0; // Horizontal maximum obj
int vt = 0; // Vertical maximum Obj
int chz = 0; // current hz
int selection = 0;
void AddObj() {
chz++;
if (chz > hz) hz = chz;
grid.push_back(0x0);
}
void NewRow() {
chz = 0;
vt++;
}
void Clear() {
cgrid = grid;
grid.clear();
}
RD7_SMART_CTOR(NTCtrl)
};
using DrawCmdType = int;
enum DrawCmdType_ {
DrawCmdType_Skip,
@ -314,6 +341,7 @@ struct UI7Menu {
float tbh; // TabBar Height
bool show_scroolbar = true; // Show Scrollbar
bool has_touch = false; // To Disable touch on Top Screen
NTCtrl::Ref ctrl; // NonTouchControl
// SubMenu
std::string submenu;
@ -378,6 +406,7 @@ bool UI7CtxBeginMenu(const std::string &lb) {
if (ui7_ctx->menus.find(id.ID()) == ui7_ctx->menus.end())
ui7_ctx->menus.insert(std::make_pair(id.ID(), UI7Menu::New()));
ui7_ctx->cm = ui7_ctx->menus[id.ID()];
if (!ui7_ctx->cm->ctrl) ui7_ctx->cm->ctrl = NTCtrl::New();
ui7_ctx->cm->menuid = id;
ui7_ctx->cm->cursor = R7Vec2(0, 0);
ui7_ctx->cm->has_touch = !RenderD7::R2()->GetCurrentScreen();
@ -394,27 +423,31 @@ void UI7CtxEndMenu() {
RenderD7::Ftrace::ScopedTrace tr("ui7", "EndMenu");
// Draw Scrollbar
if (ui7_ctx->cm->enable_scrolling) {
int sw = (RenderD7::R2()->GetCurrentScreen() ? 400 : 320);
int tsp = 5 + ui7_ctx->cm->tbh;
int szs = 240 - tsp - 5;
int lszs = 20; // Lowest Slider size
float slider_h = (szs - 4) * (static_cast<float>(szs - 4) /
static_cast<float>(ui7_ctx->cm->msr.y));
int slider_rh = d7min(d7max(slider_h, (float)lszs), (float)(szs - 4));
int slider_pos = d7min(
static_cast<float>(tsp + szs - slider_rh - 4),
d7max(
static_cast<float>(tsp),
static_cast<float>(tsp) +
static_cast<float>(
(szs) * (static_cast<float>(ui7_ctx->cm->scrolling_offset) /
static_cast<float>(ui7_ctx->cm->msr.y)))));
int slider_w = 4;
ui7_ctx->cm->front->AddRectangle(R7Vec2(sw - 12, tsp),
R7Vec2(slider_w * 2, szs), RD7Color_List0);
ui7_ctx->cm->front->AddRectangle(R7Vec2(sw - 10, slider_pos + 2),
R7Vec2(slider_w, slider_h),
RD7Color_Selector);
ui7_ctx->cm->show_scroolbar = (ui7_ctx->cm->ms.y < 235 ? false : true);
if (ui7_ctx->cm->show_scroolbar) {
int sw = (RenderD7::R2()->GetCurrentScreen() ? 400 : 320);
int tsp = 5 + ui7_ctx->cm->tbh;
int szs = 240 - tsp - 5;
int lszs = 20; // Lowest Slider size
float slider_h = (szs - 4) * (static_cast<float>(szs - 4) /
static_cast<float>(ui7_ctx->cm->msr.y));
int slider_rh = d7min(d7max(slider_h, (float)lszs), (float)(szs - 4));
int slider_pos = d7min(
static_cast<float>(tsp + szs - slider_rh - 4),
d7max(static_cast<float>(tsp),
static_cast<float>(tsp) +
static_cast<float>(
(szs) *
(static_cast<float>(ui7_ctx->cm->scrolling_offset) /
static_cast<float>(ui7_ctx->cm->msr.y)))));
int slider_w = 4;
ui7_ctx->cm->front->AddRectangle(
R7Vec2(sw - 12, tsp), R7Vec2(slider_w * 2, szs), RD7Color_List0);
ui7_ctx->cm->front->AddRectangle(R7Vec2(sw - 10, slider_pos + 2),
R7Vec2(slider_w, slider_h),
RD7Color_Selector);
}
}
ui7_ctx->active_menus.push_back(ui7_ctx->cm);
ui7_ctx->cm = nullptr;
@ -469,6 +502,7 @@ void Update() {
it->background->Process();
it->main->Process();
it->front->Process();
it->ctrl->Clear();
}
ui7_ctx->fdl->Process();
ui7_ctx->active_menus.clear();
@ -502,6 +536,7 @@ bool Button(const std::string &label, R7Vec2 size) {
R7Vec2 pos = GetCursorPos();
UI7CtxCursorMove(size);
ui7_ctx->cm->ctrl->AddObj();
if (ui7_ctx->cm->enable_scrolling) {
R7Vec2 pb = pos;
@ -540,6 +575,7 @@ void Checkbox(const std::string &label, bool &c) {
R7Vec2 pos = GetCursorPos();
UI7CtxCursorMove(inp);
ui7_ctx->cm->ctrl->AddObj();
if (ui7_ctx->cm->enable_scrolling) {
R7Vec2 pb = pos;
@ -577,6 +613,7 @@ void Label(const std::string &label, RD7TextFlags flags) {
auto upos = pos;
// Remove some y offset cause texts have some offset
UI7CtxCursorMove(textdim - R7Vec2(0, 4));
ui7_ctx->cm->ctrl->AddObj();
if (ui7_ctx->cm->enable_scrolling) {
R7Vec2 pb = pos;
@ -605,6 +642,7 @@ void Progressbar(float value) {
if (ui7_ctx->cm->show_scroolbar && ui7_ctx->cm->enable_scrolling)
size.x -= 16;
UI7CtxCursorMove(size);
ui7_ctx->cm->ctrl->AddObj();
if (ui7_ctx->cm->enable_scrolling) {
R7Vec2 pb = pos;
@ -628,6 +666,7 @@ void Image(RenderD7::Image::Ref img) {
if (!UI7CtxValidate()) return;
R7Vec2 pos = GetCursorPos();
UI7CtxCursorMove(R7Vec2(img->GetSize().x, img->GetSize().y));
ui7_ctx->cm->ctrl->AddObj();
if (ui7_ctx->cm->enable_scrolling) {
R7Vec2 pb = pos;
@ -652,6 +691,7 @@ void BrowserList(const std::vector<std::string> &entrys, int &selection,
size.x = (RenderD7::R2()->GetCurrentScreen() ? 400 : 320) - (pos.x * 2);
if (size.y == 0) size.y = (max_entrys * 15);
UI7CtxCursorMove(size);
ui7_ctx->cm->ctrl->AddObj();
int selindex = (selection < max_entrys ? selection : (max_entrys - 1));
for (int i = 0; i < max_entrys; i++) {
@ -696,6 +736,7 @@ void InputText(const std::string &label, std::string &text,
R7Vec2 pos = GetCursorPos();
UI7CtxCursorMove(inp);
ui7_ctx->cm->ctrl->AddObj();
if (ui7_ctx->cm->enable_scrolling) {
R7Vec2 pb = pos;
@ -892,6 +933,7 @@ void ColorSelector(const std::string &label, unsigned int &color) {
R7Vec2 pos = GetCursorPos();
UI7CtxCursorMove(inp);
ui7_ctx->cm->ctrl->AddObj();
if (ui7_ctx->cm->enable_scrolling) {
R7Vec2 pb = pos;
@ -1103,6 +1145,7 @@ void RestoreCursor() {
void SameLine() {
if (!UI7CtxValidate()) return;
if (!UI7CtxInMenu()) return;
ui7_ctx->cm->ctrl->NewRow();
ui7_ctx->cm->cursor = ui7_ctx->cm->slc;
}

View File

@ -24,6 +24,7 @@
#include <string.h>
#include <unistd.h>
#include <renderd7/Error.hpp>
#include <renderd7/FileSystem.hpp>
#include <renderd7/external/json.hpp>
#include <renderd7/internal_db.hpp>
@ -74,6 +75,16 @@ bool rd7i_amdt = false;
void *rd7i_soc_buf = nullptr;
bool rd7i_is_am_init = false;
RenderD7::Theme::Ref rd7i_active_theme;
RenderD7::LoggerBase::Ref rd7i_logger;
bool rd7i_lggrf = false;
RenderD7::LoggerBase::Ref _rd7i_logger() {
if (!rd7i_logger) {
RenderD7::Error(
"You're trying to use a RenderD7 Func without Init RenderD7!");
}
return rd7i_logger;
}
/// Global ///
// Outdated HidApi (HidV2Patched)

View File

@ -33,8 +33,8 @@
#include <random>
RenderD7::R2Base::Ref rd7i_render2;
RenderD7::LoggerBase::Ref rd7i_logger;
RenderD7::LoggerBase::Ref rd7i_glogger;
extern RenderD7::LoggerBase::Ref rd7i_logger;
static void RD7i_ExitHook() {
C2D_TextBufDelete(rd7i_text_buffer);
@ -182,14 +182,12 @@ void rd7i_init_config() {
rd7i_config.clear();
rd7i_config["info"]["version"] = CFGVER;
rd7i_config["info"]["renderd7ver"] = RENDERD7VSTRING;
rd7i_config["settings"]["doscreentimeout"] = 0;
rd7i_config["settings"]["forcetimeoutLB"] = true;
rd7i_config["settings"]["renderer"] = "c3d_c2d";
rd7i_config["metrik-settings"]["enableoverlay"] = false;
rd7i_config["metrik-settings"]["show"] = false;
rd7i_config["metrik-settings"]["Screen"] = true;
rd7i_config["metrik-settings"]["txtColor"] = "#ffffffff";
rd7i_config["metrik-settings"]["Color"] = "#aa000000";
rd7i_config["metrik-settings"]["txtSize"] = 0.7f;
rd7i_config["metrik-settings"]["Text"] = "#ffffffff";
rd7i_config["metrik-settings"]["Bg"] = "#aa000000";
rd7i_config["metrik-settings"]["Size"] = 0.7f;
rd7i_config["internal_logger"]["nowritetxt"] = true;
std::fstream cfg_wrt(rd7i_config_path + "/config.rc7", std::ios::out);
cfg_wrt << rd7i_config.dump(4);
cfg_wrt.close();
@ -198,9 +196,10 @@ void rd7i_init_config() {
cfg_ldr >> rd7i_config;
cfg_ldr.close();
rd7i_metrikd = rd7i_config["metrik-settings"]["enableoverlay"].get<bool>();
rd7i_mt_txtSize = rd7i_config["metrik-settings"]["txtSize"].get<float>();
rd7i_metrikd = rd7i_config["metrik-settings"]["show"].get<bool>();
rd7i_mt_txtSize = rd7i_config["metrik-settings"]["Size"].get<float>();
rd7i_mt_screen = rd7i_config["metrik-settings"]["Screen"].get<bool>();
rd7i_lggrf = rd7i_config["internal_logger"]["nowritetxt"].get<bool>();
if (rd7i_metrikd)
RenderD7::AddOvl(std::make_unique<RenderD7::Ovl_Metrik>(
@ -363,7 +362,6 @@ Result RenderD7::Init::Main(std::string app_name) {
RenderD7::Ftrace::ScopedTrace st("rd7-core", f2s(Init::Main));
rd7i_app_name = app_name;
rd7i_logger = LoggerBase::New();
rd7i_logger->Init("renderd7", true);
rd7i_glogger = LoggerBase::New();
gfxInitDefault();
@ -380,6 +378,9 @@ Result RenderD7::Init::Main(std::string app_name) {
atexit(aptExit);
romfsInit();
rd7i_init_config();
_rd7i_logger()->Init("renderd7", rd7i_lggrf);
rd7i_active_theme = Theme::New();
rd7i_active_theme->Default();
@ -414,7 +415,6 @@ Result RenderD7::Init::Main(std::string app_name) {
rd7i_last_tm = svcGetSystemTick();
if (rd7_do_splash) PushSplash();
rd7i_init_config();
rd7i_init_input();
rd7i_init_theme();
UI7::Init();
@ -427,13 +427,15 @@ Result RenderD7::Init::Minimal(std::string app_name) {
RenderD7::Ftrace::ScopedTrace st("rd7-core", f2s(Init::Minimal));
rd7i_app_name = app_name;
rd7i_logger = LoggerBase::New();
rd7i_logger->Init("renderd7", true);
rd7i_glogger = LoggerBase::New();
gfxInitDefault();
atexit(gfxExit);
romfsInit();
rd7i_init_config();
_rd7i_logger()->Init("renderd7", rd7i_lggrf);
rd7i_active_theme = Theme::New();
rd7i_active_theme->Default();
@ -473,7 +475,6 @@ Result RenderD7::Init::Minimal(std::string app_name) {
svcGetSystemInfo(&citracheck, 0x20000, 0);
rd7i_is_citra = citracheck ? true : false;
rd7i_init_config();
rd7i_init_input();
rd7i_init_theme();
UI7::Init();
@ -612,6 +613,11 @@ void RenderD7::RSettings::Draw(void) const {
if (UI7::Button("ThemeEditor")) {
RenderD7::LoadThemeEditor();
}
if (UI7::Button("Logs")) {
shared_request[0x00000001] = RLOGS;
}
UI7::SameLine();
UI7::Checkbox("No File", rd7i_lggrf);
if (UI7::Button("Back")) {
shared_request[0x00000002] = 1U;
}
@ -800,6 +806,21 @@ void RenderD7::RSettings::Draw(void) const {
}
UI7::EndMenu();
}
} else if (m_state == RLOGS) {
RenderD7::R2()->OnScreen(R2Screen_Top);
if (UI7::BeginMenu("RenderD7 -> Logs")) {
UI7::SetCursorPos(R7Vec2(395, 2));
UI7::Label(RENDERD7VSTRING, RD7TextFlags_AlignRight);
UI7::RestoreCursor();
UI7::EndMenu();
}
RenderD7::R2()->OnScreen(R2Screen_Bottom);
if (UI7::BeginMenu("Press \uE001 to go back!", R7Vec2(),
UI7MenuFlags_Scrolling)) {
for (auto &it : rd7i_logger->Lines()) UI7::Label(it);
UI7::EndMenu();
}
}
}
@ -813,6 +834,7 @@ void RenderD7::RSettings::Logic() {
std::fstream cfg_wrt(rd7i_config_path + "/config.rc7", std::ios::out);
rd7i_config["metrik-settings"]["enableoverlay"] = rd7i_metrikd;
rd7i_config["metrik-settings"]["Screen"] = rd7i_mt_screen;
rd7i_config["internal_logger"]["nowritetxt"] = rd7i_lggrf;
cfg_wrt << rd7i_config.dump(4);
cfg_wrt.close();
rd7i_settings = false;
@ -843,6 +865,7 @@ void RenderD7::RSettings::Logic() {
std::fstream cfg_wrt(rd7i_config_path + "/config.rc7", std::ios::out);
rd7i_config["metrik-settings"]["enableoverlay"] = rd7i_metrikd;
rd7i_config["metrik-settings"]["Screen"] = rd7i_mt_screen;
rd7i_config["internal_logger"]["nowritetxt"] = rd7i_lggrf;
cfg_wrt << rd7i_config.dump(4);
cfg_wrt.close();
rd7i_settings = false;
@ -862,7 +885,7 @@ void RenderD7::RSettings::Logic() {
m_state = RSETTINGS;
}
}
if (m_state == RIDB) {
if (m_state == RIDB || m_state == RLOGS) {
if (d7_hDown & KEY_B) {
m_state = RSETTINGS;
}