Initial commit with basic EIS Multiplexer Qt application

This commit is contained in:
openhands 2025-06-30 13:57:13 +00:00
commit b137a11c4b
6 changed files with 240 additions and 0 deletions

30
CMakeLists.txt Normal file
View file

@ -0,0 +1,30 @@
cmake_minimum_required(VERSION 3.14)
# Set the project name
project(eismultiplexer-qt)
# Set C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Find Qt6
find_package(Qt6 REQUIRED COMPONENTS Widgets)
# Add the libeismultiplexer library
add_subdirectory(../libeismultiplexer)
# Add the application executable
add_executable(eismultiplexer-qt
main.cpp
mainwindow.cpp
mainwindow.h
channelwidget.cpp
channelwidget.h
)
# Link Qt Widgets
target_link_libraries(eismultiplexer-qt Qt6::Widgets eismultiplexer)
# Include directories
target_include_directories(eismultiplexer-qt PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

49
channelwidget.cpp Normal file
View file

@ -0,0 +1,49 @@
#include "channelwidget.h"
#include <QDebug>
ChannelWidget::ChannelWidget(uint16_t deviceSerial, uint16_t channelNumber, struct eismultiplexer* multiplexer,
QWidget *parent)
: QWidget(parent), deviceSerial(deviceSerial), channelNumber(channelNumber), multiplexer(multiplexer)
{
// Create layout
QHBoxLayout* layout = new QHBoxLayout(this);
// Create label with device serial and channel number
label = new QLabel(QString("Device %1, Channel %2").arg(deviceSerial).arg(channelNumber), this);
layout->addWidget(label);
// Create checkbox
checkbox = new QCheckBox(this);
layout->addWidget(checkbox);
// Connect checkbox signal
connect(checkbox, &QCheckBox::toggled, this, &ChannelWidget::onChannelToggled);
// Set layout
setLayout(layout);
}
ChannelWidget::~ChannelWidget()
{
// Nothing to clean up
}
void ChannelWidget::onChannelToggled(bool checked)
{
channel_t channelFlag = static_cast<channel_t>(1 << channelNumber);
if (checked) {
if (eismultiplexer_connect_channel(multiplexer, channelFlag) < 0) {
qWarning() << "Failed to connect channel" << channelNumber << "on device" << deviceSerial;
checkbox->setChecked(false);
}
} else {
if (eismultiplexer_disconnect_channel(multiplexer, channelFlag) < 0) {
qWarning() << "Failed to disconnect channel" << channelNumber << "on device" << deviceSerial;
checkbox->setChecked(true);
}
}
}

35
channelwidget.h Normal file
View file

@ -0,0 +1,35 @@
#ifndef CHANNELWIDGET_H
#define CHANNELWIDGET_H
#include <QWidget>
#include <QCheckBox>
#include <QLabel>
#include <QHBoxLayout>
#include <eismultiplexer.h>
class ChannelWidget : public QWidget
{
Q_OBJECT
public:
ChannelWidget(uint16_t deviceSerial, uint16_t channelNumber, struct eismultiplexer* multiplexer,
QWidget *parent = nullptr);
~ChannelWidget();
private slots:
void onChannelToggled(bool checked);
private:
uint16_t deviceSerial;
uint16_t channelNumber;
struct eismultiplexer* multiplexer;
QCheckBox* checkbox;
QLabel* label;
};
#endif // CHANNELWIDGET_H

11
main.cpp Normal file
View file

@ -0,0 +1,11 @@
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}

76
mainwindow.cpp Normal file
View file

@ -0,0 +1,76 @@
#include "mainwindow.h"
#include <QDebug>
#include <eismultiplexer.h>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setupUi();
enumerateDevices();
}
MainWindow::~MainWindow()
{
// Clean up all channel widgets
for (auto widget : channelWidgets) {
delete widget;
}
}
void MainWindow::setupUi()
{
// Create central widget and main layout
centralWidget = new QWidget(this);
mainLayout = new QVBoxLayout(centralWidget);
// Create scroll area
scrollArea = new QScrollArea(this);
scrollContent = new QWidget();
scrollLayout = new QVBoxLayout(scrollContent);
// Set up scroll area properties
scrollArea->setWidget(scrollContent);
scrollArea->setWidgetResizable(true);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// Add scroll area to main layout
mainLayout->addWidget(scrollArea);
// Set central widget
setCentralWidget(centralWidget);
setWindowTitle("EIS Multiplexer Controller");
}
void MainWindow::enumerateDevices()
{
size_t count = 0;
uint16_t* serials = eismultiplexer_list_available_devices(&count);
if (!serials) {
qWarning() << "No EIS multiplexer devices found";
return;
}
for (size_t i = 0; i < count; i++) {
uint16_t serial = serials[i];
struct eismultiplexer multiplexer;
if (eismultiplexer_connect(&multiplexer, serial) == 0) {
uint16_t channelCount = 0;
if (eismultiplexer_get_channel_count(&multiplexer, &channelCount) == 0) {
for (uint16_t channel = 0; channel < channelCount; channel++) {
ChannelWidget* widget = new ChannelWidget(serial, channel, &multiplexer);
channelWidgets.push_back(widget);
scrollLayout->addWidget(widget);
}
}
eismultiplexer_disconnect(&multiplexer);
} else {
qWarning() << "Failed to connect to device with serial" << serial;
}
}
free(serials);
}

39
mainwindow.h Normal file
View file

@ -0,0 +1,39 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QScrollArea>
#include <QVBoxLayout>
#include <QWidget>
#include <vector>
#include "channelwidget.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
void enumerateDevices();
void setupUi();
QWidget *centralWidget;
QVBoxLayout *mainLayout;
QScrollArea *scrollArea;
QWidget *scrollContent;
QVBoxLayout *scrollLayout;
std::vector<ChannelWidget*> channelWidgets;
};
#endif // MAINWINDOW_H