Simplificando callback manager

This commit is contained in:
2025-06-26 23:35:33 -04:00
parent 8b20f4499d
commit cb0d31fb9e
10 changed files with 123 additions and 152 deletions

View File

@@ -1,4 +1,5 @@
add_executable(${PROJECT_NAME}) add_executable(${PROJECT_NAME}
)
target_sources( target_sources(
${PROJECT_NAME} ${PROJECT_NAME}
@@ -9,11 +10,11 @@ target_sources(
Graphics/Graphics.cpp Graphics/Graphics.cpp
Graphics/Graphics.h Graphics/Graphics.h
Graphics/Color.h Graphics/Color.h
Interpreter/MachineState.cpp
Interpreter/MachineState.h
Interpreter/Interpreter.cpp Interpreter/Interpreter.cpp
Interpreter/Interpreter.h Interpreter/Interpreter.h
Interpreter/Instruction.h Interpreter/Instruction.h
Interpreter/MachineState.cpp
Interpreter/MachineState.h
Interpreter/OpCode.h Interpreter/OpCode.h
UI/CallbackManager.cpp UI/CallbackManager.cpp
UI/CallbackManager.h UI/CallbackManager.h
@@ -21,6 +22,8 @@ target_sources(
UI/ControlPanel.h UI/ControlPanel.h
UI/Display.cpp UI/Display.cpp
UI/Display.h UI/Display.h
UI/RomInfo.cpp
UI/RomInfo.h
UI/UIManager.cpp UI/UIManager.cpp
UI/UIManager.h UI/UIManager.h
) )

View File

@@ -21,12 +21,13 @@ Machine::Machine() :
interpreter{std::make_unique<Interpreter>(this->machine_state)}, interpreter{std::make_unique<Interpreter>(this->machine_state)},
ui_manager{std::make_unique<UIManager>(this->graphics, this->machine_state, this->callback_manager)}, ui_manager{std::make_unique<UIManager>(this->graphics, this->machine_state, this->callback_manager)},
running{false}, running{false},
ips{700}, ips{60},
last_update_time{0}, last_update_time{0},
accumulator{0}, accumulator{0},
target_cycle_time{1.0 / this->ips} target_cycle_time{1.0 / this->ips}
{ {
this->register_callbacks(); this->register_callbacks();
this->callback_manager->trigger(this->callback_manager->ips_callback, this->ips);
} }
void Machine::iterate() void Machine::iterate()
@@ -69,34 +70,34 @@ void Machine::execute_interpreter()
void Machine::register_callbacks() void Machine::register_callbacks()
{ {
callback_manager->set_rom_load_callback(std::bind( callback_manager->rom_load_callback.push_back(std::bind(
&Machine::on_rom_load, &Machine::on_rom_load,
this, this,
std::placeholders::_1 std::placeholders::_1
)); ));
callback_manager->set_reset_callback(std::bind( callback_manager->reset_callback.push_back(std::bind(
&Machine::on_reset, &Machine::on_reset,
this this
)); ));
callback_manager->set_stop_callback(std::bind( callback_manager->stop_callback.push_back(std::bind(
&Machine::on_stop, &Machine::on_stop,
this this
)); ));
callback_manager->set_resume_callback(std::bind( callback_manager->resume_callback.push_back(std::bind(
&Machine::on_resume, &Machine::on_resume,
this this
)); ));
callback_manager->set_step_callback(std::bind( callback_manager->step_callback.push_back(std::bind(
&Machine::on_step, &Machine::on_step,
this, this,
std::placeholders::_1 std::placeholders::_1
)); ));
callback_manager->set_ips_callback(std::bind( callback_manager->ips_callback.push_back(std::bind(
&Machine::on_speed_change, &Machine::on_speed_change,
this, this,
std::placeholders::_1 std::placeholders::_1
)); ));
callback_manager->set_reload_callback(std::bind( callback_manager->reload_callback.push_back(std::bind(
&Machine::on_reload, &Machine::on_reload,
this this
)); ));
@@ -127,7 +128,7 @@ void Machine::on_rom_load(const std::string& path)
); );
this->rom = path; this->rom = path;
std::cout << "Cargado rom: " << path << std::endl; std::cout << "ROM Loaded: " << path << std::endl;
} }
void Machine::on_reset() const void Machine::on_reset() const

View File

@@ -1,95 +1,3 @@
#include "CallbackManager.h" #include "CallbackManager.h"
//----------------------------------------------------------------
// SET CALLBACKS
//----------------------------------------------------------------
void CallbackManager::set_rom_load_callback(const RomLoadCallback& callback)
{
this->rom_load_callback = callback;
}
void CallbackManager::set_reset_callback(const ResetCallback& callback)
{
this->reset_callback = callback;
}
void CallbackManager::set_resume_callback(const ResumeCallback& callback)
{
this->resume_callback = callback;
}
void CallbackManager::set_stop_callback(const StopCallback& callback)
{
this->stop_callback = callback;
}
void CallbackManager::set_step_callback(const StepCallback& callback)
{
this->step_callback = callback;
}
void CallbackManager::set_ips_callback(const IPSCallback& callback)
{
this->ips_callback = callback;
}
void CallbackManager::set_reload_callback(const ReloadCallback& callback)
{
this->reload_callback = callback;
}
//----------------------------------------------------------------
// TRIGGER CALLBACKS
//----------------------------------------------------------------
void CallbackManager::trigger_rom_load(const std::string& path)
{
if (this->rom_load_callback)
{
this->rom_load_callback(path);
}
}
void CallbackManager::trigger_reset()
{
if (this->reset_callback)
{
this->reset_callback();
}
}
void CallbackManager::trigger_resume()
{
if (this->resume_callback)
{
this->resume_callback();
}
}
void CallbackManager::trigger_stop()
{
if (this->stop_callback)
{
this->stop_callback();
}
}
void CallbackManager::trigger_step(int steps)
{
if (this->step_callback)
{
this->step_callback(steps);
}
}
void CallbackManager::trigger_ips(int speed)
{
if (this->ips_callback)
{
this->ips_callback(speed);
}
}
void CallbackManager::trigger_reload()
{
if (this->reload_callback) this->reload_callback();
}

View File

@@ -3,43 +3,26 @@
#include <functional> #include <functional>
#include <string> #include <string>
#include <vector>
struct CallbackManager struct CallbackManager
{ {
using RomLoadCallback = std::function<void(const std::string&)>; std::vector<std::function<void(const std::string&)>> rom_load_callback;
using ResetCallback = std::function<void()>; std::vector<std::function<void()>> reset_callback;
using ResumeCallback = std::function<void()>; std::vector<std::function<void()>> resume_callback;
using StopCallback = std::function<void()>; std::vector<std::function<void()>> stop_callback;
using StepCallback = std::function<void(int)>; std::vector<std::function<void(int)>> step_callback;
using IPSCallback = std::function<void(int)>; std::vector<std::function<void(int)>> ips_callback;
using ReloadCallback = std::function<void()>; std::vector<std::function<void()>> reload_callback;
void set_rom_load_callback(const RomLoadCallback& callback); template <typename Func, typename... Args>
void set_reset_callback(const ResetCallback& callback); void trigger(const std::vector<Func>& callbacks, Args&&... args)
void set_resume_callback(const ResumeCallback& callback); {
void set_stop_callback(const StopCallback& callback); for (const auto& callback : callbacks)
void set_step_callback(const StepCallback& callback); {
void set_ips_callback(const IPSCallback& callback); callback(std::forward<Args>(args)...);
void set_reload_callback(const ReloadCallback& callback); }
}
void trigger_rom_load(const std::string& path);
void trigger_reset();
void trigger_resume();
void trigger_stop();
void trigger_step(int);
void trigger_ips(int);
void trigger_reload();
private:
RomLoadCallback rom_load_callback;
ResetCallback reset_callback;
ResumeCallback resume_callback;
StopCallback stop_callback;
StepCallback step_callback;
IPSCallback ips_callback;
ReloadCallback reload_callback;
}; };
#endif //CALLBACKMANAGER_H #endif //CALLBACKMANAGER_H

View File

@@ -1,8 +1,10 @@
#include "ControlPanel.h" #include "ControlPanel.h"
#include <format> #include <format>
#include <iostream>
#include <ranges> #include <ranges>
#include "CallbackManager.h"
#include "imgui.h" #include "imgui.h"
@@ -14,6 +16,11 @@ ControlPanel::ControlPanel(
machine_state{std::move(machine_state)}, machine_state{std::move(machine_state)},
callback_manager{std::move(callback_manager)} callback_manager{std::move(callback_manager)}
{ {
this->callback_manager->ips_callback.push_back(std::bind(
&ControlPanel::initial_ips_load,
this,
std::placeholders::_1
));
} }
void ControlPanel::render() void ControlPanel::render()
@@ -34,11 +41,11 @@ void ControlPanel::render()
this->run = !run; this->run = !run;
if (this->run) if (this->run)
{ {
this->callback_manager->trigger_resume(); this->callback_manager->trigger(this->callback_manager->resume_callback);
} }
else else
{ {
this->callback_manager->trigger_stop(); this->callback_manager->trigger(this->callback_manager->stop_callback);
} }
} }
@@ -49,12 +56,12 @@ void ControlPanel::render()
if (ImGui::Button("Step One", full_width)) if (ImGui::Button("Step One", full_width))
{ {
this->callback_manager->trigger_step(1); this->callback_manager->trigger(this->callback_manager->step_callback, 1);
} }
if (ImGui::Button(std::format("Step +{}", steps).data(), full_width)) if (ImGui::Button(std::format("Step +{}", steps).data(), full_width))
{ {
this->callback_manager->trigger_step(steps); this->callback_manager->trigger(this->callback_manager->step_callback, steps);
} }
ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x);
@@ -72,17 +79,26 @@ void ControlPanel::render()
if (ImGui::Button("Reset", full_width)) if (ImGui::Button("Reset", full_width))
{ {
this->callback_manager->trigger_reset(); this->callback_manager->trigger(this->callback_manager->reset_callback);
} }
if (ImGui::Button("Reload ROM", full_width)) if (ImGui::Button("Reload ROM", full_width))
{ {
this->callback_manager->trigger_reload(); this->callback_manager->trigger(this->callback_manager->reload_callback);
} }
} }
if (starting_speed != this->ips) if (ips < 0)
{ {
this->callback_manager->trigger_ips(this->ips); ips = 0;
}
if (steps < 1)
{
steps = 1;
}
if (starting_speed != ips)
{
this->callback_manager->trigger(this->callback_manager->ips_callback, ips);
} }
ImGui::End(); ImGui::End();
@@ -115,5 +131,13 @@ void ControlPanel::on_callback_load_rom(void* self, const char* const* filelist,
return; return;
} }
control_panel->callback_manager->trigger_rom_load(filelist[0]); control_panel->callback_manager->trigger(
control_panel->callback_manager->rom_load_callback,
std::string(filelist[0])
);
}
void ControlPanel::initial_ips_load(int ips)
{
this->ips = ips;
} }

View File

@@ -15,9 +15,10 @@ class ControlPanel
bool run = false; bool run = false;
int steps = 1; int steps = 1;
int ips = 700; int ips = 0;
static SDLCALL void on_callback_load_rom(void* self, const char* const* filelist, int filter); static SDLCALL void on_callback_load_rom(void* self, const char* const* filelist, int filter);
void initial_ips_load(int ips);
public: public:
ControlPanel( ControlPanel(

20
src/UI/RomInfo.cpp Normal file
View File

@@ -0,0 +1,20 @@
#include "RomInfo.h"
#include "imgui.h"
RomInfo::RomInfo(
std::shared_ptr<Graphics> graphics,
std::shared_ptr<MachineState> machine_state,
std::shared_ptr<CallbackManager> callback_manager
) : graphics{std::move(graphics)},
machine_state{std::move(machine_state)},
callback_manager{std::move(callback_manager)}
{
}
void RomInfo::render()
{
if (ImGui::Begin("Chip-8 - ROM Info"))
{
}
}

26
src/UI/RomInfo.h Normal file
View File

@@ -0,0 +1,26 @@
#ifndef ROMINFO_H
#define ROMINFO_H
#include <memory>
#include "CallbackManager.h"
#include "../Graphics/Graphics.h"
#include "../Interpreter/MachineState.h"
class RomInfo
{
std::shared_ptr<Graphics> graphics;
std::shared_ptr<MachineState> machine_state;
std::shared_ptr<CallbackManager> callback_manager;
public:
RomInfo(
std::shared_ptr<Graphics> graphics,
std::shared_ptr<MachineState> machine_state,
std::shared_ptr<CallbackManager> callback_manager
);
void render();
};
#endif //ROMINFO_H

View File

@@ -1,5 +1,7 @@
#include "UIManager.h" #include "UIManager.h"
#include "RomInfo.h"
UIManager::UIManager( UIManager::UIManager(
std::shared_ptr<Graphics> graphics, std::shared_ptr<Graphics> graphics,
std::shared_ptr<MachineState> machine_state, std::shared_ptr<MachineState> machine_state,
@@ -8,8 +10,10 @@ UIManager::UIManager(
graphics{std::move(graphics)}, graphics{std::move(graphics)},
machine_state{std::move(machine_state)}, machine_state{std::move(machine_state)},
callback_manager{std::move(callback_manager)}, callback_manager{std::move(callback_manager)},
display{std::make_unique<Display>(this->graphics, this->machine_state)}, display{std::make_unique<Display>(this->graphics, this->machine_state)},
control_panel{std::make_unique<ControlPanel>(this->graphics, this->machine_state, this->callback_manager)} control_panel{std::make_unique<ControlPanel>(this->graphics, this->machine_state, this->callback_manager)},
rom_info{std::make_unique<RomInfo>(this->graphics, this->machine_state, this->callback_manager)}
{ {
} }
@@ -17,4 +21,4 @@ void UIManager::render()
{ {
this->display->render(); this->display->render();
this->control_panel->render(); this->control_panel->render();
} }

View File

@@ -5,6 +5,7 @@
#include "CallbackManager.h" #include "CallbackManager.h"
#include "ControlPanel.h" #include "ControlPanel.h"
#include "Display.h" #include "Display.h"
#include "RomInfo.h"
#include "../Graphics/Graphics.h" #include "../Graphics/Graphics.h"
class UIManager class UIManager
@@ -12,11 +13,11 @@ class UIManager
std::shared_ptr<Graphics> graphics; std::shared_ptr<Graphics> graphics;
std::shared_ptr<MachineState> machine_state; std::shared_ptr<MachineState> machine_state;
std::shared_ptr<CallbackManager> callback_manager; std::shared_ptr<CallbackManager> callback_manager;
public:
std::unique_ptr<Display> display; std::unique_ptr<Display> display;
std::unique_ptr<ControlPanel> control_panel; std::unique_ptr<ControlPanel> control_panel;
std::unique_ptr<RomInfo> rom_info;
public:
UIManager( UIManager(
std::shared_ptr<Graphics> graphics, std::shared_ptr<Graphics> graphics,
std::shared_ptr<MachineState> machine_state, std::shared_ptr<MachineState> machine_state,
@@ -26,4 +27,4 @@ public:
void render(); void render();
}; };
#endif //UIMANAGER_H #endif //UIMANAGER_H