Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

protocols: initial implementation for bitfocus modules interop #1650

Merged
merged 11 commits into from
Jan 4, 2025
11 changes: 11 additions & 0 deletions src/lib/score/model/tree/TreeNode.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,17 @@ class TreeNode : public DataType
child.visit(f);
}
}

template <typename Fun>
void visit_post(Fun f) const noexcept(noexcept(f(std::declval<TreeNode>())))
{
for(const auto& child : m_children)
{
child.visit_post(f);
}

f(*this);
}
};

// True if gramps is a parent, grand-parent, etc. of node.
Expand Down
17 changes: 10 additions & 7 deletions src/plugins/score-lib-device/Device/Protocol/DeviceInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -951,7 +951,7 @@ void OwningDeviceInterface::releaseDevice()
{
DeviceInterface::disconnect();
deviceChanged(m_dev.get(), nullptr);
m_dev.release();
// FIXME instead it should just be shared_ptrs in player m_dev.release();
}

void OwningDeviceInterface::disconnect()
Expand Down Expand Up @@ -1040,14 +1040,18 @@ void DeviceInterface::addressRemoved(const ossia::net::parameter_base& addr)
void releaseDevice(
ossia::net::network_context& ctx, std::unique_ptr<ossia::net::device_base> dd)
{
if(dd)
releaseDevice(ctx, std::shared_ptr(std::move(dd)));
}

void releaseDevice(
ossia::net::network_context& ctx, std::shared_ptr<ossia::net::device_base> shared_dd)
{
if(shared_dd)
{
auto shared_dd = std::shared_ptr(std::move(dd));
auto strand = boost::asio::make_strand(ctx.context);
boost::asio::dispatch(strand, [dev = shared_dd] { dev->get_protocol().stop(); });

std::future<void> wait1
= boost::asio::dispatch(strand, boost::asio::use_future);
std::future<void> wait1 = boost::asio::dispatch(strand, boost::asio::use_future);
if(auto res = wait1.wait_for(std::chrono::seconds(1));
res != std::future_status::ready)
{
Expand All @@ -1056,8 +1060,7 @@ void releaseDevice(

boost::asio::dispatch(strand, [d = std::move(shared_dd)]() mutable { d.reset(); });

std::future<void> wait2
= boost::asio::dispatch(strand, boost::asio::use_future);
std::future<void> wait2 = boost::asio::dispatch(strand, boost::asio::use_future);
if(auto res = wait2.wait_for(std::chrono::seconds(1));
res != std::future_status::ready)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ class SCORE_LIB_DEVICE_EXPORT OwningDeviceInterface : public DeviceInterface

ossia::net::device_base* getDevice() const final override { return m_dev.get(); }

std::unique_ptr<ossia::net::device_base> m_dev;
std::shared_ptr<ossia::net::device_base> m_dev;
bool m_owned{true};
};

Expand All @@ -216,4 +216,7 @@ findNodeFromPath(const QStringList& path, ossia::net::device_base& dev);
SCORE_LIB_DEVICE_EXPORT
void releaseDevice(
ossia::net::network_context& ctx, std::unique_ptr<ossia::net::device_base> dev);
SCORE_LIB_DEVICE_EXPORT
void releaseDevice(
ossia::net::network_context& ctx, std::shared_ptr<ossia::net::device_base> dev);
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ class SCORE_LIB_DEVICE_EXPORT DeviceEnumerator : public QObject
E_SIGNAL(SCORE_LIB_DEVICE_EXPORT, deviceAdded, n, s)
void deviceRemoved(const QString& s)
E_SIGNAL(SCORE_LIB_DEVICE_EXPORT, deviceRemoved, s)

void sort() E_SIGNAL(SCORE_LIB_DEVICE_EXPORT, sort)
};

using DeviceEnumerators = std::vector<std::pair<QString, Device::DeviceEnumerator*>>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ DeviceEditDialog::DeviceEditDialog(
, m_protocolWidget{nullptr}
, m_index{-1}
{
setObjectName("DeviceEditDialog");

const auto& skin = score::Skin::instance();
const QColor textHeaderColor = QColor("#D5D5D5");
Expand Down Expand Up @@ -107,36 +108,36 @@ DeviceEditDialog::DeviceEditDialog(

// Column 3: Settings
auto column3 = new QWidget;
auto column3_layout = new score::MarginLess<QVBoxLayout>{column3};
auto column3_layout = m_column3Layout = new score::MarginLess<QVBoxLayout>{column3};
m_protocolNameLabel = new QLabel{tr("Settings"), this};
setHeaderTextFormat(m_protocolNameLabel);
column3_layout->addWidget(m_protocolNameLabel);
m_protocolNameLabel->setAlignment(Qt::AlignTop);
m_protocolNameLabel->setAlignment(Qt::AlignHCenter);
m_main = new QWidget{this};
m_settingsFormLayout = new QFormLayout;
m_settingsFormLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
m_main->setLayout(m_settingsFormLayout);
column3_layout->addWidget(m_main);
// m_main = new QWidget{this};
// m_settingsFormLayout = new QFormLayout;
// m_settingsFormLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
// m_main->setLayout(m_settingsFormLayout);
// column3_layout->addWidget(m_main, 255, Qt::AlignTop);

m_invalidLabel = new QLabel{
tr("Cannot add device.\n Try changing the name to make it unique, \nor "
"check that the ports aren't already used")};
m_invalidLabel->setAlignment(Qt::AlignRight);
m_invalidLabel->setAlignment(Qt::AlignRight | Qt::AlignBottom);
m_invalidLabel->setTextFormat(Qt::PlainText);

m_buttonBox = new QDialogButtonBox(Qt::Horizontal, this);
m_helpButton = m_buttonBox->addButton(tr("Help"), QDialogButtonBox::HelpRole);
m_okButton = m_buttonBox->addButton(tr("Add"), QDialogButtonBox::AcceptRole);
m_buttonBox->addButton(QDialogButtonBox::Cancel);
column3_layout->addStretch(1);
column3_layout->addWidget(m_invalidLabel);
column3_layout->addWidget(m_buttonBox);
//column3_layout->addStretch(1);
column3_layout->addWidget(m_invalidLabel, 1, Qt::AlignBottom);
column3_layout->addWidget(m_buttonBox, 1, Qt::AlignBottom);
column3->setLayout(column3_layout);
m_splitter->addWidget(column3);

m_devices->setMinimumWidth(40);
m_main->setMinimumWidth(100);
// m_main->setMinimumWidth(100);

m_splitter->setCollapsible(0, false);
m_splitter->setCollapsible(1, false);
Expand Down Expand Up @@ -285,6 +286,7 @@ void DeviceEditDialog::selectedProtocolChanged()
{
SCORE_ASSERT(m_index < m_previousSettings.count());
m_previousSettings[m_index] = m_protocolWidget->getSettings();
m_column3Layout->removeWidget(m_protocolWidget);
delete m_protocolWidget;
m_protocolWidget = nullptr;
}
Expand Down Expand Up @@ -339,6 +341,9 @@ void DeviceEditDialog::selectedProtocolChanged()

connect(e.get(), &Device::DeviceEnumerator::deviceAdded, this, addItem);
connect(e.get(), &Device::DeviceEnumerator::deviceRemoved, this, rmItem);
connect(e.get(), &Device::DeviceEnumerator::sort, this, [cat] {
cat->sortChildren(0, Qt::SortOrder::AscendingOrder);
});
e->enumerate(addItem);
}
}
Expand All @@ -358,10 +363,10 @@ void DeviceEditDialog::selectedProtocolChanged()
m_protocolWidget, &Device::ProtocolSettingsWidget::changed, this,
&DeviceEditDialog::updateValidity);

m_settingsFormLayout->insertRow(0, m_protocolWidget);
m_column3Layout->insertWidget(1, m_protocolWidget);

QSizePolicy pol{QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding};
pol.setVerticalStretch(1);
pol.setVerticalStretch(255);
m_protocolWidget->setSizePolicy(pol);
m_protocolWidget->setMinimumHeight(200);
this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
Expand Down Expand Up @@ -415,7 +420,7 @@ void DeviceEditDialog::setSettings(const Device::DeviceSettings& settings)
void DeviceEditDialog::setAcceptEnabled(bool st)
{
m_okButton->setEnabled(st);
m_invalidLabel->setVisible(!st);
m_invalidLabel->setVisible(!st && this->m_protocolWidget);
}

void DeviceEditDialog::setBrowserEnabled(bool st)
Expand All @@ -432,12 +437,6 @@ void DeviceEditDialog::setBrowserEnabled(bool st)
m_devices = nullptr;
delete m_devicesLabel;
m_devicesLabel = nullptr;

auto this_lay = this->layout();
this_lay->removeWidget(m_main);
delete this_lay;
auto lay = m_main->layout();
this->setLayout(lay);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class QFormLayout;
class QWidget;
class QListWidget;
class QTreeWidget;
class QVBoxLayout;
class QLabel;
class QDialogButtonBox;

Expand Down Expand Up @@ -74,11 +75,12 @@ class SCORE_PLUGIN_DEVICEEXPLORER_EXPORT DeviceEditDialog final : public QDialog
QPushButton* m_helpButton{};
QTreeWidget* m_protocols{};
QTreeWidget* m_devices{};
QWidget* m_main{};
// QWidget* m_main{};
QLabel* m_protocolsLabel{};
QLabel* m_devicesLabel{};
Device::ProtocolSettingsWidget* m_protocolWidget{};
QFormLayout* m_settingsFormLayout{};
// QFormLayout* m_settingsFormLayout{};
QVBoxLayout* m_column3Layout{};
QList<Device::DeviceSettings> m_previousSettings;
QLabel* m_invalidLabel{};
QLabel* m_protocolNameLabel{};
Expand Down
28 changes: 28 additions & 0 deletions src/plugins/score-plugin-protocols/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,25 @@ set(EVDEV_SRCS
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Evdev/EvdevSpecificSettingsSerialization.cpp"
)

set(BITFOCUS_HDRS
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusContext.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusEnumerator.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusDevice.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusProtocolFactory.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusProtocolSettingsWidget.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusSpecificSettings.hpp"
)

set(BITFOCUS_SRCS
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusContext.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusEnumerator.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusDevice.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusProtocolFactory.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusProtocolSettingsWidget.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusSpecificSettingsSerialization.cpp"
)



set(MAPPER_SRCS
"${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Mapper/MapperDevice.hpp"
Expand Down Expand Up @@ -378,6 +397,15 @@ if(LINUX)
list(APPEND SCORE_FEATURES_LIST protocol_evdev)
endif()

target_sources(${PROJECT_NAME} PRIVATE ${BITFOCUS_HDRS} ${BITFOCUS_SRCS})
if(WIN32)
target_sources(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusContext.win32.cpp")
else()
target_sources(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/Protocols/Bitfocus/BitfocusContext.unix.cpp")
endif()
target_compile_definitions(${PROJECT_NAME} PRIVATE OSSIA_PROTOCOL_BITFOCUS)
list(APPEND SCORE_FEATURES_LIST protocol_bitfocus)

target_link_libraries(${PROJECT_NAME}
PUBLIC
${QT_PREFIX}::Core ${QT_PREFIX}::Widgets ${QT_PREFIX}::Network
Expand Down
Loading
Loading