diff --git a/SerialPrograms/Source/GameConsole/ConsolePanel.h b/SerialPrograms/Source/GameConsole/ConsolePanel.h index f56a0f0de5..85a411a340 100644 --- a/SerialPrograms/Source/GameConsole/ConsolePanel.h +++ b/SerialPrograms/Source/GameConsole/ConsolePanel.h @@ -6,8 +6,8 @@ * */ -#ifndef PokemonAutomation_ConsoleInfra_ConsolePanel_H -#define PokemonAutomation_ConsoleInfra_ConsolePanel_H +#ifndef PokemonAutomation_GameConsole_ConsolePanel_H +#define PokemonAutomation_GameConsole_ConsolePanel_H #include "Common/Cpp/Options/BatchOption.h" #include "CommonFramework/Panels/PanelDescriptor.h" diff --git a/SerialPrograms/Source/GameConsole/ConsolePanelSession.h b/SerialPrograms/Source/GameConsole/ConsolePanelSession.h index cc70309c44..a56d037c63 100644 --- a/SerialPrograms/Source/GameConsole/ConsolePanelSession.h +++ b/SerialPrograms/Source/GameConsole/ConsolePanelSession.h @@ -4,8 +4,8 @@ * */ -#ifndef PokemonAutomation_ConsoleInfra_ConsolePanelSession_H -#define PokemonAutomation_ConsoleInfra_ConsolePanelSession_H +#ifndef PokemonAutomation_GameConsole_ConsolePanelSession_H +#define PokemonAutomation_GameConsole_ConsolePanelSession_H #include "CommonFramework/Panels/PanelSession.h" #include "ConsoleSystemSession.h" diff --git a/SerialPrograms/Source/GameConsole/ConsoleSystemOption.h b/SerialPrograms/Source/GameConsole/ConsoleSystemOption.h index 78f81ba261..8827cf8b6f 100644 --- a/SerialPrograms/Source/GameConsole/ConsoleSystemOption.h +++ b/SerialPrograms/Source/GameConsole/ConsoleSystemOption.h @@ -7,8 +7,8 @@ * */ -#ifndef PokemonAutomation_ConsoleInfra_ConsoleSystemOption_H -#define PokemonAutomation_ConsoleInfra_ConsoleSystemOption_H +#ifndef PokemonAutomation_GameConsole_ConsoleSystemOption_H +#define PokemonAutomation_GameConsole_ConsoleSystemOption_H #include "Common/Cpp/Containers/FixedLimitVector.h" #include "CommonFramework/AudioPipeline/AudioOption.h" diff --git a/SerialPrograms/Source/GameConsole/ConsoleSystemSession.h b/SerialPrograms/Source/GameConsole/ConsoleSystemSession.h index 082e9ae0c1..07860fd182 100644 --- a/SerialPrograms/Source/GameConsole/ConsoleSystemSession.h +++ b/SerialPrograms/Source/GameConsole/ConsoleSystemSession.h @@ -17,8 +17,8 @@ * */ -#ifndef PokemonAutomation_ConsoleInfra_ConsoleSystemSession_H -#define PokemonAutomation_ConsoleInfra_ConsoleSystemSession_H +#ifndef PokemonAutomation_GameConsole_ConsoleSystemSession_H +#define PokemonAutomation_GameConsole_ConsoleSystemSession_H #include "Common/Cpp/Logging/TaggedLogger.h" #include "Common/Cpp/UiWrapper.h" diff --git a/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.cpp b/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.cpp new file mode 100644 index 0000000000..e0f15e0e7d --- /dev/null +++ b/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.cpp @@ -0,0 +1,90 @@ +/* Multi-Console System Option + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#include "Common/Cpp/Json/JsonValue.h" +#include "Common/Cpp/Json/JsonArray.h" +#include "Common/Cpp/Json/JsonObject.h" +#include "Common/Cpp/Containers/FixedLimitVector.tpp" +#include "MultiConsoleSystemOption.h" + +namespace PokemonAutomation{ +namespace GameConsole{ + + + +MultiConsoleSystemOption::~MultiConsoleSystemOption(){ + +} +MultiConsoleSystemOption::MultiConsoleSystemOption( + size_t min_consoles, + size_t max_consoles, + size_t consoles, + std::function()> console_factory +) + : m_min_consoles(std::max(min_consoles, (size_t)1)) + , m_max_consoles(std::min(max_consoles, (size_t)MAX_CONSOLES)) + , m_active_consoles(0) + , m_consoles(m_max_consoles) +{ + for (size_t c = 0; c < m_max_consoles; c++){ + m_consoles.emplace_back(console_factory()); + } + consoles = std::max(consoles, m_min_consoles); + consoles = std::min(consoles, m_max_consoles); + m_active_consoles = consoles; +} +MultiConsoleSystemOption::MultiConsoleSystemOption( + size_t min_consoles, + size_t max_consoles, + const JsonValue& json, + std::function()> console_factory +) + : MultiConsoleSystemOption(min_consoles, max_consoles, 0, std::move(console_factory)) +{ + MultiConsoleSystemOption::load_json(json); +} + +JsonValue MultiConsoleSystemOption::to_json() const{ + JsonObject obj; + obj["ActiveDevices"] = m_active_consoles; + { + JsonArray array; + for (const auto& item : m_consoles){ + array.push_back(item->to_json()); + } + obj["DeviceList"] = std::move(array); + } + return obj; +} +void MultiConsoleSystemOption::load_json(const JsonValue& json){ + const JsonObject* obj = json.to_object(); + if (obj == nullptr){ + return; + } + obj->read_integer( + m_active_consoles, + "ActiveDevices", + m_min_consoles, + m_max_consoles + ); + { + const JsonArray* array = obj->get_array("DeviceList"); + if (array != nullptr){ + size_t c = 0; + size_t stop = std::min(m_max_consoles, array->size()); + for (; c < stop; c++){ + m_consoles[c]->load_json((*array)[c]); + } + m_active_consoles = c; + } + } +} + + + + +} +} diff --git a/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.h b/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.h new file mode 100644 index 0000000000..9ee72a72c3 --- /dev/null +++ b/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.h @@ -0,0 +1,66 @@ +/* Multi-Console System Option + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#ifndef PokemonAutomation_ConsoleInfra_MultiConsoleSystemOption_H +#define PokemonAutomation_ConsoleInfra_MultiConsoleSystemOption_H + +#include +#include "Common/Cpp/Containers/FixedLimitVector.h" +#include "ConsoleSystemOption.h" + +namespace PokemonAutomation{ +namespace GameConsole{ + + +class MultiConsoleSystemOption{ +public: + static const size_t MAX_CONSOLES = 4; + +public: + virtual ~MultiConsoleSystemOption(); + MultiConsoleSystemOption( + size_t min_consoles, + size_t max_consoles, + size_t consoles, + std::function()> console_factory + ); + MultiConsoleSystemOption( + size_t min_consoles, + size_t max_consoles, + const JsonValue& json, + std::function()> console_factory + ); + + void resize(size_t count){ + m_active_consoles = count; + } + +public: + size_t min_consoles() const{ return m_min_consoles; } + size_t max_consoles() const{ return m_max_consoles; } + + size_t active_consoles() const{ return m_active_consoles; } + ConsoleSystemOption& operator[](size_t index){ return *m_consoles[index]; } + + +public: + virtual JsonValue to_json() const; + virtual void load_json(const JsonValue& json); + + +private: + const size_t m_min_consoles; + const size_t m_max_consoles; + size_t m_active_consoles; + FixedLimitVector> m_consoles; +}; + + + + +} +} +#endif diff --git a/SerialPrograms/Source/GameConsole/Panels/BoxDraw.h b/SerialPrograms/Source/GameConsole/Panels/BoxDraw.h index b6ee161994..4744c31436 100644 --- a/SerialPrograms/Source/GameConsole/Panels/BoxDraw.h +++ b/SerialPrograms/Source/GameConsole/Panels/BoxDraw.h @@ -4,8 +4,8 @@ * */ -#ifndef PokemonAutomation_ConsoleInfra_BoxDraw_H -#define PokemonAutomation_ConsoleInfra_BoxDraw_H +#ifndef PokemonAutomation_GameConsole_BoxDraw_H +#define PokemonAutomation_GameConsole_BoxDraw_H #include "CommonFramework/Options/NestedBoxDrawOption.h" #include "GameConsole/ConsolePanel.h" diff --git a/SerialPrograms/Source/GameConsole/Panels/VirtualConsole.h b/SerialPrograms/Source/GameConsole/Panels/VirtualConsole.h index 406a71c429..010332000c 100644 --- a/SerialPrograms/Source/GameConsole/Panels/VirtualConsole.h +++ b/SerialPrograms/Source/GameConsole/Panels/VirtualConsole.h @@ -4,8 +4,8 @@ * */ -#ifndef PokemonAutomation_ConsoleInfra_VirtualConsole_H -#define PokemonAutomation_ConsoleInfra_VirtualConsole_H +#ifndef PokemonAutomation_GameConsole_VirtualConsole_H +#define PokemonAutomation_GameConsole_VirtualConsole_H #include "GameConsole/ConsolePanel.h" diff --git a/SerialPrograms/Source/GameConsole/UI/CommandRowWidget.h b/SerialPrograms/Source/GameConsole/UI/CommandRowWidget.h index ef7d7f52e2..becd2a8fc2 100644 --- a/SerialPrograms/Source/GameConsole/UI/CommandRowWidget.h +++ b/SerialPrograms/Source/GameConsole/UI/CommandRowWidget.h @@ -4,8 +4,8 @@ * */ -#ifndef PokemonAutomation_ConsoleInfra_CommandRowWidget_H -#define PokemonAutomation_ConsoleInfra_CommandRowWidget_H +#ifndef PokemonAutomation_GameConsole_CommandRowWidget_H +#define PokemonAutomation_GameConsole_CommandRowWidget_H #include #include diff --git a/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h b/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h index 8092ad0dd0..56671dfe71 100644 --- a/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h +++ b/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h @@ -4,8 +4,8 @@ * */ -#ifndef PokemonAutomation_ConsoleInfra_ConsolePanelWidget_H -#define PokemonAutomation_ConsoleInfra_ConsolePanelWidget_H +#ifndef PokemonAutomation_GameConsole_ConsolePanelWidget_H +#define PokemonAutomation_GameConsole_ConsolePanelWidget_H #include #include diff --git a/SerialPrograms/Source/GameConsole/UI/ConsoleSystemWidget.h b/SerialPrograms/Source/GameConsole/UI/ConsoleSystemWidget.h index 08faeed741..8c5aee905e 100644 --- a/SerialPrograms/Source/GameConsole/UI/ConsoleSystemWidget.h +++ b/SerialPrograms/Source/GameConsole/UI/ConsoleSystemWidget.h @@ -4,8 +4,8 @@ * */ -#ifndef PokemonAutomation_ConsoleInfra_ConsoleSystemWidget_H -#define PokemonAutomation_ConsoleInfra_ConsoleSystemWidget_H +#ifndef PokemonAutomation_GameConsole_ConsoleSystemWidget_H +#define PokemonAutomation_GameConsole_ConsoleSystemWidget_H #include #include diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.cpp b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.cpp index 274370e704..c1e2a7fcf0 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.cpp @@ -53,7 +53,7 @@ MultiSwitchProgramSession::MultiSwitchProgramSession(const MultiSwitchProgramDes , m_sanitizer("MultiSwitchProgramSession") { // WriteSpinLock lg(m_lock, PA_CURRENT_FUNCTION); - m_instance->update_active_consoles(m_system_option.count()); + m_instance->update_active_consoles(m_system_option.active_consoles()); m_system.add_listener(*this); } diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.cpp b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.cpp deleted file mode 100644 index 40d858bef0..0000000000 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* Multi-Switch System Option - * - * From: https://github.com/PokemonAutomation/ - * - */ - -#include "Common/Cpp/Json/JsonValue.h" -#include "Common/Cpp/Json/JsonArray.h" -#include "Common/Cpp/Json/JsonObject.h" -#include "Common/Cpp/Containers/FixedLimitVector.tpp" -#include "NintendoSwitch_MultiSwitchSystemOption.h" - -namespace PokemonAutomation{ -namespace NintendoSwitch{ - - -MultiSwitchSystemOption::MultiSwitchSystemOption( - size_t min_switches, - size_t max_switches, - size_t switches -) - : m_min_switches(std::max(min_switches, (size_t)1)) - , m_max_switches(std::min(max_switches, (size_t)MAX_SWITCHES)) - , m_active_switches(0) - , m_switches(m_max_switches) -{ - for (size_t c = 0; c < m_max_switches; c++){ - m_switches.emplace_back(); - } - switches = std::max(switches, m_min_switches); - switches = std::min(switches, m_max_switches); - m_active_switches = switches; -} -MultiSwitchSystemOption::MultiSwitchSystemOption( - size_t min_switches, - size_t max_switches, - const JsonValue& json -) - : m_min_switches(std::max(min_switches, (size_t)1)) - , m_max_switches(std::min(max_switches, (size_t)MAX_SWITCHES)) - , m_active_switches(0) -{ - for (size_t c = 0; c < m_max_switches; c++){ - m_switches.emplace_back(); - } - MultiSwitchSystemOption::load_json(json); -} -void MultiSwitchSystemOption::load_json(const JsonValue& json){ - const JsonObject* obj = json.to_object(); - if (obj == nullptr){ - return; - } - obj->read_integer(m_active_switches, "ActiveDevices", m_min_switches, m_max_switches); - const JsonArray* array = obj->get_array("DeviceList"); - if (array != nullptr){ - size_t c = 0; - size_t stop = std::min(m_max_switches, array->size()); - for (; c < stop; c++){ - m_switches[c].load_json((*array)[c]); - } - m_active_switches = c; - } -} -JsonValue MultiSwitchSystemOption::to_json() const{ - JsonObject obj; - obj["ActiveDevices"] = m_active_switches; - JsonArray array; - for (const auto& item : m_switches){ - array.push_back(item.to_json()); - } - obj["DeviceList"] = std::move(array); - return obj; -} -void MultiSwitchSystemOption::resize(size_t count){ - m_active_switches = count; -} - - - - - -} -} - - - - - diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h index 49177de96a..22e8bd84fd 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h @@ -13,51 +13,43 @@ #ifndef PokemonAutomationn_NintendoSwitch_MultiSwitchSystemOption_H #define PokemonAutomationn_NintendoSwitch_MultiSwitchSystemOption_H -#include "Common/Cpp/Containers/FixedLimitVector.h" +#include "GameConsole/MultiConsoleSystemOption.h" #include "NintendoSwitch_SwitchSystemOption.h" namespace PokemonAutomation{ namespace NintendoSwitch{ -class MultiSwitchSystemWidget; - -class MultiSwitchSystemOption{ -public: - static const size_t MAX_SWITCHES = 4; - +class MultiSwitchSystemOption final : public GameConsole::MultiConsoleSystemOption{ public: MultiSwitchSystemOption( - size_t min_switches, - size_t max_switches, - size_t switches - ); + size_t min_consoles, + size_t max_consoles, + size_t consoles + ) + : MultiConsoleSystemOption( + min_consoles, + max_consoles, + consoles, + []{ return std::make_unique(); } + ) + {} MultiSwitchSystemOption( - size_t min_switches, - size_t max_switches, + size_t min_consoles, + size_t max_consoles, const JsonValue& json - ); - void load_json(const JsonValue& json); - JsonValue to_json() const; - - void resize(size_t count); - -public: - size_t min_switches() const{ return m_min_switches; } - size_t max_switches() const{ return m_max_switches; } - - size_t count() const{ return m_active_switches; } - SwitchSystemOption& operator[](size_t index){ return m_switches[index]; } - - -private: - friend class MultiSwitchProgramSession; - friend class MultiSwitchSystemWidget; - - const size_t m_min_switches; - const size_t m_max_switches; - size_t m_active_switches; - FixedLimitVector m_switches; + ) + : MultiConsoleSystemOption( + min_consoles, + max_consoles, + json, + []{ return std::make_unique(); } + ) + {} + + SwitchSystemOption& operator[](size_t index){ + return static_cast(MultiConsoleSystemOption::operator[](index)); + } }; diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.cpp b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.cpp index 0cf457250a..9e3a952103 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.cpp @@ -49,9 +49,9 @@ MultiSwitchSystemSession::MultiSwitchSystemSession( , m_allow_commands_while_locked(allow_commands_while_locked) , m_program_id(program_id) , m_switch_count_locked(false) - , m_consoles(option.count()) + , m_consoles(option.active_consoles()) { - size_t count = option.count(); + size_t count = option.active_consoles(); for (size_t c = 0; c < count; c++){ m_consoles.emplace_back(option[c], allow_commands_while_locked, c, program_id); } @@ -88,13 +88,13 @@ bool MultiSwitchSystemSession::set_switch_count(size_t count){ -void MultiSwitchSystemSession::load_json(const JsonValue& json){ - m_option.load_json(json); - set_switch_count(m_option.count()); -} JsonValue MultiSwitchSystemSession::to_json() const{ return m_option.to_json(); } +void MultiSwitchSystemSession::load_json(const JsonValue& json){ + m_option.load_json(json); + set_switch_count(m_option.active_consoles()); +} diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.h b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.h index c1791a7ec7..6c16ccf8d8 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.h @@ -56,16 +56,17 @@ class MultiSwitchSystemSession{ // Returns true only on success. bool set_switch_count(size_t count); - size_t min_switches() const{ return m_option.min_switches(); } - size_t max_switches() const{ return m_option.max_switches(); } + size_t min_switches() const{ return m_option.min_consoles(); } + size_t max_switches() const{ return m_option.max_consoles(); } + public: // Note that these are not thread-safe with changing the # of switches. size_t count() const{ return m_consoles.size(); } SwitchSystemSession& operator[](size_t index){ return m_consoles[index]; } - void load_json(const JsonValue& json); JsonValue to_json() const; + void load_json(const JsonValue& json); private: diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchSystemWidget.cpp b/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchSystemWidget.cpp index ab93b0614e..4b791d1330 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchSystemWidget.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchSystemWidget.cpp @@ -152,13 +152,13 @@ void MultiSwitchSystemWidget::redraw_videos(size_t count){ vbox->addLayout(vrow1, 1); vrow1->setContentsMargins(0, 0, 0, 0); vrow1->addWidget(m_switches[2], 1); - if (m_switches.size() >= MultiSwitchSystemOption::MAX_SWITCHES){ + if (m_switches.size() >= MultiSwitchSystemOption::MAX_CONSOLES){ vrow1->addWidget(m_switches[3], 1); }else{ vrow1->addWidget(new QWidget(), 1); } } - static_assert(MultiSwitchSystemOption::MAX_SWITCHES <= 4, "Can't display more than 4 Switches."); + static_assert(MultiSwitchSystemOption::MAX_CONSOLES <= 4, "Can't display more than 4 Switches."); } void MultiSwitchSystemWidget::update_ui(ProgramState state){ diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h index 419ba10320..53624a5c70 100644 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h +++ b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h @@ -15,6 +15,8 @@ namespace PokemonAutomation{ namespace NintendoSwitch{ +class MultiSwitchSystemWidget; + class SwitchViewer_Descriptor : public PanelDescriptor{ public: diff --git a/SerialPrograms/cmake/SourceFiles.cmake b/SerialPrograms/cmake/SourceFiles.cmake index e6074b515c..81d82882fd 100644 --- a/SerialPrograms/cmake/SourceFiles.cmake +++ b/SerialPrograms/cmake/SourceFiles.cmake @@ -925,6 +925,8 @@ file(GLOB LIBRARY_SOURCES Source/GameConsole/ConsoleSystemOption.h Source/GameConsole/ConsoleSystemSession.cpp Source/GameConsole/ConsoleSystemSession.h + Source/GameConsole/MultiConsoleSystemOption.cpp + Source/GameConsole/MultiConsoleSystemOption.h Source/GameConsole/Panels/BoxDraw.cpp Source/GameConsole/Panels/BoxDraw.h Source/GameConsole/Panels/VirtualConsole.h @@ -1186,7 +1188,6 @@ file(GLOB LIBRARY_SOURCES Source/NintendoSwitch/DevPrograms/WaterfillTemplateMaker.h Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.cpp Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.h - Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.cpp Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.cpp Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.h