Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions SerialPrograms/Source/Controllers/ControllerDescriptor.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -39,6 +39,8 @@ class InterfaceType{
public:
virtual ~InterfaceType() = default;

virtual std::unique_ptr<ControllerDescriptor> make() const = 0;

// Construct a descriptor from a JSON config. (reloading saved controller settings)
virtual std::unique_ptr<ControllerDescriptor> make(const JsonValue& json) const = 0;

Expand All@@ -56,6 +58,9 @@ class InterfaceType{
template <typename DescriptorType>
class InterfaceType_t : public InterfaceType{
public:
virtual std::unique_ptr<ControllerDescriptor> make() const override{
return std::make_unique<DescriptorType>();
}
virtual std::unique_ptr<ControllerDescriptor> make(const JsonValue& json) const override{
std::unique_ptr<DescriptorType> ptr(new DescriptorType());
ptr->load_json(json);
Expand Down
11 changes: 11 additions & 0 deletions SerialPrograms/Source/Controllers/ControllerOption.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,6 +49,17 @@ ControllerOption::ControllerOption(bool default_enable_mode)
{}


void ControllerOption::set_interface(ControllerInterface interface_type){
m_sanitizer.check_scope();

m_descriptor_cache[m_descriptor->interface_type] = m_descriptor;
auto iter = m_descriptor_cache.find(interface_type);
if (iter != m_descriptor_cache.end()){
m_descriptor = iter->second;
}else{
m_descriptor = ALL_CONTROLLER_INTERFACES().find(interface_type)->second->make();
}
}
void ControllerOption::set_descriptor(std::shared_ptr<ControllerDescriptor> descriptor){
m_sanitizer.check_scope();

Expand Down
2 changes: 2 additions & 0 deletions SerialPrograms/Source/Controllers/ControllerOption.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,8 @@ class ControllerOption{
public:
ControllerOption(bool default_enable_mode);

void set_interface(ControllerInterface interface_type);

std::shared_ptr<ControllerDescriptor> descriptor() const{
return m_descriptor;
}
Expand Down
54 changes: 18 additions & 36 deletions SerialPrograms/Source/Controllers/ControllerSelectorWidget.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,12 +11,7 @@
#include "Common/Qt/NoWheelComboBox.h"
#include "CommonFramework/Panels/ConsoleSettingsStretch.h"
#include "Controllers/ControllerTypeStrings.h"
#include "NullController.h"
#include "ControllerSelectorWidget.h"
//#include "NintendoSwitch/NintendoSwitch_Settings.h"

#include "PABotBase2/SerialPABotBase2_SelectorWidget.h"
#include "NintendoSwitch/Controllers/SysbotBase/SysbotBase_SelectorWidget.h"

//#include <iostream>
//using std::cout;
Expand All@@ -40,6 +35,8 @@ ControllerSelectorWidget::ControllerSelectorWidget(
: QWidget(&parent)
, m_session(session)
{
// cout << "ControllerSelectorWidget()" << endl;

QHBoxLayout* layoutL = new QHBoxLayout(this);
layoutL->setContentsMargins(0, 0, 0, 0);

Expand DownExpand Up@@ -98,20 +95,13 @@ ControllerSelectorWidget::ControllerSelectorWidget(

// m_interface_dropdown->setHidden(true);

auto current = session.descriptor();
if (current == nullptr){
current = null_controller_descriptor();
session.set_device(std::move(current));
}
update_interface_dropdown(current->interface_type);
m_selector = &static_cast<UiComponentQtWidget&>(*current->make_ui_component(this)).widget();
m_dropdowns->addWidget(m_selector, 1);
refresh_selection();


m_dropdowns->addSpacing(5);
// m_dropdowns->addSpacing(5);
m_controllers_dropdown = new NoWheelCompactComboBox(this);
m_controllers_dropdown->setSizeAdjustPolicy(QComboBox::AdjustToContents);
m_dropdowns->addWidget(m_controllers_dropdown, 5);
// m_controllers_dropdown->setSizeAdjustPolicy(QComboBox::AdjustToContents);
m_dropdowns->addWidget(m_controllers_dropdown, 3);
refresh_controllers(session.controller_type(), session.available_controllers());

m_status_text = new QLabel(this);
Expand DownExpand Up@@ -155,7 +145,9 @@ ControllerSelectorWidget::ControllerSelectorWidget(
return;
}

refresh_selection(incoming);
m_session.set_interface(incoming);

refresh_selection();
}
);
connect(
Expand DownExpand Up@@ -228,30 +220,20 @@ void ControllerSelectorWidget::update_interface_dropdown(ControllerInterface int
// m_session.set_controller(ControllerType::None);
m_interface_dropdown->setCurrentIndex(-1);
}
void ControllerSelectorWidget::refresh_selection(ControllerInterface interface_type){
// cout << "refresh_selection(): " << CONTROLLER_INTERFACE_STRINGS.get_string(interface_type) << endl;

update_interface_dropdown(interface_type);
void ControllerSelectorWidget::refresh_selection(){
// cout << "refresh_selection()" << endl;

delete m_selector;
m_selector = nullptr;

// m_status_text->setText(QString::fromStdString(html_color_text("Not Connected", COLOR_RED)));

switch (interface_type){
case ControllerInterface::SerialPABotBase2:
m_selector = new SerialPABotBase::SerialPABotBase2_SelectorWidget(*this, m_session.descriptor().get());
break;

case ControllerInterface::TcpSysbotBase:
m_selector = new SysbotBase::TcpSysbotBase_SelectorWidget(*this, m_session.descriptor().get());
break;

default:;;
auto current = m_session.descriptor();
if (current == nullptr){
m_selector = new QWidget(this);
}else{
update_interface_dropdown(current->interface_type);
m_selector = &static_cast<UiComponentQtWidget&>(*current->make_ui_component(this)).widget();
m_dropdowns->insertWidget(1, m_selector, 1);
}

m_dropdowns->insertWidget(1, m_selector, 1);
}

void ControllerSelectorWidget::refresh_controllers(
Expand DownExpand Up@@ -283,7 +265,7 @@ void ControllerSelectorWidget::descriptor_changed(
){
// cout << "descriptor_changed()" << endl;
QMetaObject::invokeMethod(this, [=, this]{
refresh_selection(descriptor->interface_type);
refresh_selection();
refresh_controllers(ControllerType::None, {});
}, Qt::QueuedConnection);
}
Expand Down
4 changes: 2 additions & 2 deletions SerialPrograms/Source/Controllers/ControllerSelectorWidget.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,7 +20,7 @@ namespace PokemonAutomation{



class ControllerSelectorWidget
class ControllerSelectorWidget final
: public QWidget
, public UiComponentQtWidget
, private ControllerSession::Listener
Expand DownExpand Up@@ -53,7 +53,7 @@ class ControllerSelectorWidget

private:
void update_interface_dropdown(ControllerInterface interface_type);
void refresh_selection(ControllerInterface interface_type);
void refresh_selection();
void refresh_controllers(
ControllerType controller_type,
const std::vector<ControllerType>& available_controllers
Expand Down
39 changes: 39 additions & 0 deletions SerialPrograms/Source/Controllers/ControllerSession.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -206,6 +206,45 @@ void ControllerSession::make_controller(




bool ControllerSession::set_interface(ControllerInterface controller_interface){
std::shared_ptr<const ControllerDescriptor> device;
{
std::lock_guard<Mutex> lg0(m_reset_lock);

// Destroy the current connection+controller.
std::unique_ptr<AbstractController> controller;
std::unique_ptr<ControllerConnection> connection;
{
WriteSpinLock lg1(m_state_lock);
if (m_options_locked){
return false;
}
if (controller_interface == m_descriptor->interface_type){
return true;
}

// Move these out to indicate that we should no longer access them.
controller = std::move(m_controller);
connection = std::move(m_connection);

m_option.set_interface(controller_interface);
m_descriptor = m_option.descriptor();
}

// With the lock released, it is now safe to destroy them.
// We cannot destroy these under (m_state_lock) due to their asynchronous
// callbacks into this class which will also acquire the same lock.
controller.reset();
connection.reset();

make_controller({}, false);
}
// cout << "ControllerSession::set_interface() - signal"<< endl;
signal_descriptor_changed(device);
signal_status_text_changed(status_text());
return true;
}
bool ControllerSession::set_device(const std::shared_ptr<ControllerDescriptor>& device){
// cout << "ControllerSession::set_device() = " << device->display_name() << endl;
{
Expand Down
1 change: 1 addition & 0 deletions SerialPrograms/Source/Controllers/ControllerSession.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -90,6 +90,7 @@ class ControllerSession final


public:
bool set_interface(ControllerInterface controller_interface);
bool set_device(const std::shared_ptr<ControllerDescriptor>& device);
bool set_controller(ControllerType controller_type);

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,7 +15,7 @@ const EnumStringMap<ControllerInterface> CONTROLLER_INTERFACE_STRINGS{
// {ControllerInterface::SerialPABotBase, "Serial: PABotBase"},
{ControllerInterface::SerialPABotBase2, "Serial: PABotBase2"},
{ControllerInterface::TcpSysbotBase, "TCP: sys-botbase"},
{ControllerInterface::UsbSysbotBase, "USB: sys-botbase"},
// {ControllerInterface::UsbSysbotBase, "USB: sys-botbase"},
};

const EnumStringMap<ControllerType> CONTROLLER_TYPE_STRINGS{
Expand Down
2 changes: 1 addition & 1 deletion SerialPrograms/Source/Controllers/ControllerTypes.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,7 +16,7 @@ enum class ControllerInterface{
// SerialPABotBase,
SerialPABotBase2,
TcpSysbotBase,
UsbSysbotBase,
// UsbSysbotBase,
};

enum class ControllerPerformanceClass{
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -67,9 +67,10 @@ SerialPABotBase2_SelectorWidget::SerialPABotBase2_SelectorWidget(
{
SerialPortPoller::instance().begin_refresh_now();

// cout << "SerialPABotBase(): " << current << endl;
// cout << "SerialPABotBase(): " << current << endl;
this->setMaxVisibleItems(32);
this->setPlaceholderText("(invalid or still loading...)");
// this->setPlaceholderText("invalid/loading...");
// this->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

if (current == nullptr || current->interface_type != ControllerInterface::SerialPABotBase2){
std::shared_ptr<ControllerDescriptor> descriptor =
Expand Down