Support windows
This commit is contained in:
parent
9e0d7a5d9d
commit
5c5efb5029
|
@ -1,36 +1,50 @@
|
|||
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
|
||||
# Set the project name
|
||||
project(eismultiplexer-qt)
|
||||
project(eismuliplexer-qt)
|
||||
|
||||
set(CMAKE_PROJECT_VERSION_MAJOR 0)
|
||||
set(CMAKE_PROJECT_VERSION_MINOR 9)
|
||||
set(CMAKE_PROJECT_VERSION_PATCH 0)
|
||||
|
||||
add_compile_definitions(VERSION_MAJOR=${CMAKE_PROJECT_VERSION_MAJOR})
|
||||
add_compile_definitions(VERSION_MINOR=${CMAKE_PROJECT_VERSION_MINOR})
|
||||
add_compile_definitions(VERSION_PATCH=${CMAKE_PROJECT_VERSION_PATCH})
|
||||
|
||||
if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
|
||||
message(FATAL_ERROR "Windows builds have to be cross compiled on UNIX")
|
||||
endif()
|
||||
|
||||
message("Platform " ${CMAKE_SYSTEM_NAME})
|
||||
if(WIN32)
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/release-win.sh ${CMAKE_CURRENT_BINARY_DIR}/release.sh @ONLY)
|
||||
add_custom_target(package
|
||||
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/release.sh
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
COMMENT "Createing release archive"
|
||||
VERBATIM)
|
||||
endif(WIN32)
|
||||
|
||||
# Set C++ standard
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
# Find Qt6
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(EISMULIPLEXER REQUIRED eismuliplexer)
|
||||
find_package(Qt6 REQUIRED COMPONENTS Widgets)
|
||||
find_package(Qt6 REQUIRED COMPONENTS Core)
|
||||
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
|
||||
# Include the libeismultiplexer library
|
||||
include_directories(/workspace/libeismultiplexer)
|
||||
link_directories(/workspace/libeismultiplexer/build)
|
||||
|
||||
# Add the application executable
|
||||
add_executable(eismultiplexer-qt
|
||||
add_executable(${PROJECT_NAME}
|
||||
main.cpp
|
||||
channelwidget.cpp
|
||||
channelwidget.h
|
||||
mainwindow.h
|
||||
mainwindow.cpp
|
||||
mainwindow.ui
|
||||
multiplexer.h
|
||||
multiplexer.cpp
|
||||
)
|
||||
target_compile_options(eismultiplexer-qt PUBLIC "-Wall")
|
||||
|
||||
# Link Qt Widgets
|
||||
target_link_libraries(eismultiplexer-qt Qt6::Widgets eismultiplexer)
|
||||
|
||||
# Include directories
|
||||
target_include_directories(eismultiplexer-qt PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
target_compile_options(${PROJECT_NAME} PUBLIC "-Wall")
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Widgets Qt6::Core ${EISMULIPLEXER_LIBRARIES})
|
||||
#target_include_directories(${PROJECT_NAME} PUBLIC ${EISMULIPLEXER_INCLUDE_DIRS})
|
||||
|
|
|
@ -2,89 +2,96 @@
|
|||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
|
||||
ChannelWidget::ChannelWidget(uint16_t deviceSerial, uint16_t channelNumber, std::shared_ptr<struct eismultiplexer> multiplexer,
|
||||
ChannelWidget::ChannelWidget(uint16_t deviceSerial, uint16_t channelNumber,
|
||||
std::shared_ptr<struct eismultiplexer> multiplexer,
|
||||
QWidget *parent)
|
||||
:
|
||||
QWidget(parent),
|
||||
deviceSerial(deviceSerial),
|
||||
channelNumber(channelNumber),
|
||||
multiplexer(multiplexer),
|
||||
checkbox("Enable"),
|
||||
devicelabel(QString::asprintf("Device %04u", deviceSerial)),
|
||||
channellabel(QString::asprintf("Channel %u", channelNumber)),
|
||||
ganglabel("Ganged:")
|
||||
:
|
||||
QWidget(parent),
|
||||
deviceSerial(deviceSerial),
|
||||
channelNumber(channelNumber),
|
||||
multiplexer(multiplexer),
|
||||
checkbox("Enable"),
|
||||
devicelabel(QString::asprintf("Device %04u", deviceSerial)),
|
||||
channellabel(QString::asprintf("Channel %u", channelNumber)),
|
||||
ganglabel("Ganged:")
|
||||
{
|
||||
hlayout.addLayout(&labellayout);
|
||||
vlayout.addLayout(&hlayout);
|
||||
hlayout.addLayout(&labellayout);
|
||||
vlayout.addLayout(&hlayout);
|
||||
|
||||
labellayout.addWidget(&devicelabel);
|
||||
labellayout.addWidget(&channellabel);
|
||||
labellayout.addWidget(&devicelabel);
|
||||
labellayout.addWidget(&channellabel);
|
||||
|
||||
line.setGeometry(QRect(320, 150, 118, 3));
|
||||
line.setFrameShape(QFrame::HLine);
|
||||
line.setFrameShadow(QFrame::Sunken);
|
||||
vlayout.addWidget(&line);
|
||||
line.setGeometry(QRect(320, 150, 118, 3));
|
||||
line.setFrameShape(QFrame::HLine);
|
||||
line.setFrameShadow(QFrame::Sunken);
|
||||
vlayout.addWidget(&line);
|
||||
|
||||
gangcombo.addItem("Unganged");
|
||||
gangcombo.addItem("Unganged");
|
||||
|
||||
hlayout.addStretch();
|
||||
hlayout.addWidget(&ganglabel);
|
||||
hlayout.addWidget(&gangcombo);
|
||||
hlayout.addWidget(&checkbox);
|
||||
connect(&checkbox, &QCheckBox::toggled, this, &ChannelWidget::onChannelToggled);
|
||||
hlayout.addStretch();
|
||||
hlayout.addWidget(&ganglabel);
|
||||
hlayout.addWidget(&gangcombo);
|
||||
hlayout.addWidget(&checkbox);
|
||||
connect(&checkbox, &QCheckBox::toggled, this, &ChannelWidget::onChannelToggled);
|
||||
|
||||
setFixedHeight(96);
|
||||
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
|
||||
setFixedHeight(96);
|
||||
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
|
||||
|
||||
setLayout(&vlayout);
|
||||
setLayout(&vlayout);
|
||||
}
|
||||
|
||||
ChannelWidget::~ChannelWidget()
|
||||
{
|
||||
// Nothing to clean up
|
||||
// Nothing to clean up
|
||||
}
|
||||
|
||||
uint16_t ChannelWidget::getDeviceSerial() const
|
||||
{
|
||||
return deviceSerial;
|
||||
return deviceSerial;
|
||||
}
|
||||
|
||||
uint16_t ChannelWidget::getChannelNumber() const
|
||||
{
|
||||
return channelNumber;
|
||||
return channelNumber;
|
||||
}
|
||||
|
||||
bool ChannelWidget::isChecked() const
|
||||
{
|
||||
return checkbox.isChecked();
|
||||
return checkbox.isChecked();
|
||||
}
|
||||
|
||||
void ChannelWidget::onChannelToggled(bool checked)
|
||||
{
|
||||
if (checked) {
|
||||
// Emit signal before actually turning on the channel
|
||||
emit channelAboutToBeTurnedOn(deviceSerial, channelNumber);
|
||||
}
|
||||
if (checked)
|
||||
{
|
||||
// Emit signal before actually turning on the channel
|
||||
emit channelAboutToBeTurnedOn(deviceSerial, channelNumber);
|
||||
}
|
||||
|
||||
channel_t channelFlag = static_cast<channel_t>(1 << channelNumber);
|
||||
if (checked) {
|
||||
if (eismultiplexer_connect_channel(multiplexer.get(), channelFlag) < 0) {
|
||||
QMessageBox::warning(this, tr("Connection Failed"),
|
||||
tr("Failed to connect channel %1 on device %2").arg(channelNumber).arg(deviceSerial));
|
||||
qWarning() << "Failed to connect channel" << channelNumber << "on device" << deviceSerial;
|
||||
checkbox.blockSignals(true);
|
||||
checkbox.setChecked(false);
|
||||
setEnabled(false); // Gray out the widget
|
||||
}
|
||||
} else {
|
||||
if (eismultiplexer_disconnect_channel(multiplexer.get(), channelFlag) < 0) {
|
||||
QMessageBox::warning(this, tr("Disconnection Failed"),
|
||||
tr("Failed to disconnect channel %1 on device %2").arg(channelNumber).arg(deviceSerial));
|
||||
qWarning() << "Failed to disconnect channel" << channelNumber << "on device" << deviceSerial;
|
||||
checkbox.blockSignals(true);
|
||||
checkbox.setChecked(true);
|
||||
setEnabled(false); // Gray out the widget
|
||||
}
|
||||
}
|
||||
channel_t channelFlag = static_cast<channel_t>(1 << channelNumber);
|
||||
if (checked)
|
||||
{
|
||||
if (eismultiplexer_connect_channel(multiplexer.get(), channelFlag) < 0)
|
||||
{
|
||||
QMessageBox::warning(this, tr("Connection Failed"),
|
||||
tr("Failed to connect channel %1 on device %2").arg(channelNumber).arg(deviceSerial));
|
||||
qWarning() << "Failed to connect channel" << channelNumber << "on device" << deviceSerial;
|
||||
checkbox.blockSignals(true);
|
||||
checkbox.setChecked(false);
|
||||
setEnabled(false); // Gray out the widget
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (eismultiplexer_disconnect_channel(multiplexer.get(), channelFlag) < 0)
|
||||
{
|
||||
QMessageBox::warning(this, tr("Disconnection Failed"),
|
||||
tr("Failed to disconnect channel %1 on device %2").arg(channelNumber).arg(deviceSerial));
|
||||
qWarning() << "Failed to disconnect channel" << channelNumber << "on device" << deviceSerial;
|
||||
checkbox.blockSignals(true);
|
||||
checkbox.setChecked(true);
|
||||
setEnabled(false); // Gray out the widget
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,36 +11,37 @@
|
|||
|
||||
class ChannelWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ChannelWidget(uint16_t deviceSerial, uint16_t channelNumber, std::shared_ptr<struct eismultiplexer> multiplexer,
|
||||
QWidget *parent = nullptr);
|
||||
~ChannelWidget() override;
|
||||
explicit ChannelWidget(uint16_t deviceSerial, uint16_t channelNumber,
|
||||
std::shared_ptr<struct eismultiplexer> multiplexer,
|
||||
QWidget *parent = nullptr);
|
||||
~ChannelWidget() override;
|
||||
|
||||
uint16_t getDeviceSerial() const;
|
||||
uint16_t getChannelNumber() const;
|
||||
bool isChecked() const;
|
||||
uint16_t getDeviceSerial() const;
|
||||
uint16_t getChannelNumber() const;
|
||||
bool isChecked() const;
|
||||
|
||||
signals:
|
||||
void channelAboutToBeTurnedOn(uint16_t deviceSerial, uint16_t channelNumber);
|
||||
void channelAboutToBeTurnedOn(uint16_t deviceSerial, uint16_t channelNumber);
|
||||
|
||||
private slots:
|
||||
void onChannelToggled(bool checked);
|
||||
void onChannelToggled(bool checked);
|
||||
|
||||
private:
|
||||
uint16_t deviceSerial;
|
||||
uint16_t channelNumber;
|
||||
std::shared_ptr<struct eismultiplexer> multiplexer;
|
||||
QCheckBox checkbox;
|
||||
QLabel devicelabel;
|
||||
QLabel channellabel;
|
||||
QLabel ganglabel;
|
||||
QComboBox gangcombo;
|
||||
QFrame line;
|
||||
QVBoxLayout vlayout;
|
||||
QHBoxLayout hlayout;
|
||||
QVBoxLayout labellayout;
|
||||
uint16_t deviceSerial;
|
||||
uint16_t channelNumber;
|
||||
std::shared_ptr<struct eismultiplexer> multiplexer;
|
||||
QCheckBox checkbox;
|
||||
QLabel devicelabel;
|
||||
QLabel channellabel;
|
||||
QLabel ganglabel;
|
||||
QComboBox gangcombo;
|
||||
QFrame line;
|
||||
QVBoxLayout vlayout;
|
||||
QHBoxLayout hlayout;
|
||||
QVBoxLayout labellayout;
|
||||
};
|
||||
|
||||
#endif // CHANNELWIDGET_H
|
||||
|
|
8
main.cpp
8
main.cpp
|
@ -3,8 +3,8 @@
|
|||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
MainWindow window;
|
||||
window.show();
|
||||
return app.exec();
|
||||
QApplication app(argc, argv);
|
||||
MainWindow window;
|
||||
window.show();
|
||||
return app.exec();
|
||||
}
|
||||
|
|
|
@ -4,55 +4,65 @@
|
|||
#include "ui_mainwindow.h"
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent)
|
||||
: QMainWindow(parent)
|
||||
, ui(new Ui::MainWindow)
|
||||
: QMainWindow(parent)
|
||||
, ui(new Ui::MainWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
enumerateDevices();
|
||||
ui->setupUi(this);
|
||||
enumerateDevices();
|
||||
|
||||
connect(ui->actionQuit, &QAction::triggered, this, [this](){close();});
|
||||
connect(ui->actionQuit, &QAction::triggered, this, [this]()
|
||||
{
|
||||
close();
|
||||
});
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
delete ui;
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void MainWindow::enumerateDevices()
|
||||
{
|
||||
size_t count = 0;
|
||||
uint16_t* serials = eismultiplexer_list_available_devices(&count);
|
||||
size_t count = 0;
|
||||
uint16_t* serials = eismultiplexer_list_available_devices(&count);
|
||||
|
||||
if (!serials || count == 0) {
|
||||
QMessageBox::warning(this, tr("No Devices Found"),
|
||||
tr("No EIS multiplexer devices were found. Please connect a device and try again."));
|
||||
qWarning() << "No EIS multiplexer devices found";
|
||||
close();
|
||||
return;
|
||||
}
|
||||
if (!serials || count == 0)
|
||||
{
|
||||
QMessageBox::warning(nullptr, tr("No Devices Found"),
|
||||
tr("No EIS multiplexer devices were found. Please connect a device and try again."));
|
||||
qWarning() << "No EIS multiplexer devices found";
|
||||
exit(0);
|
||||
return;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
uint16_t serial = serials[i];
|
||||
std::shared_ptr<struct eismultiplexer> multiplexer(new struct eismultiplexer);
|
||||
if (eismultiplexer_connect(multiplexer.get(), serial) >= 0) {
|
||||
uint16_t channelCount = 0;
|
||||
qDebug()<<"Adding channels from device "<<serial;
|
||||
if (eismultiplexer_get_channel_count(multiplexer.get(), &channelCount) >= 0) {
|
||||
for (uint16_t channel = 0; channel < channelCount; channel++) {
|
||||
std::shared_ptr<ChannelWidget> widget(new ChannelWidget(serial, channel, multiplexer));
|
||||
qDebug()<<"Added widget from device "<<serial<<" channel "<<channel;
|
||||
channels.push_back(widget);
|
||||
ui->channelLayout->addWidget(widget.get());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
QMessageBox::warning(this, tr("Connection Failed"),
|
||||
tr("Failed to connect to device with serial %1").arg(serial));
|
||||
qWarning() << "Failed to connect to device with serial" << serial;
|
||||
}
|
||||
ui->channelLayout->addStretch();
|
||||
}
|
||||
ui->statusbar->showMessage("Ready");
|
||||
for (size_t i = 0; i < count; i++)
|
||||
{
|
||||
uint16_t serial = serials[i];
|
||||
std::shared_ptr<struct eismultiplexer> multiplexer(new struct eismultiplexer);
|
||||
if (eismultiplexer_connect(multiplexer.get(), serial) >= 0)
|
||||
{
|
||||
uint16_t channelCount = 0;
|
||||
qDebug()<<"Adding channels from device "<<serial;
|
||||
if (eismultiplexer_get_channel_count(multiplexer.get(), &channelCount) >= 0)
|
||||
{
|
||||
for (uint16_t channel = 0; channel < channelCount; channel++)
|
||||
{
|
||||
std::shared_ptr<ChannelWidget> widget(new ChannelWidget(serial, channel, multiplexer));
|
||||
qDebug()<<"Added widget from device "<<serial<<" channel "<<channel;
|
||||
channels.push_back(widget);
|
||||
ui->channelLayout->addWidget(widget.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::warning(this, tr("Connection Failed"),
|
||||
tr("Failed to connect to device with serial %1").arg(serial));
|
||||
qWarning() << "Failed to connect to device with serial" << serial;
|
||||
}
|
||||
ui->channelLayout->addStretch();
|
||||
}
|
||||
ui->statusbar->showMessage("Ready");
|
||||
|
||||
free(serials);
|
||||
free(serials);
|
||||
}
|
||||
|
|
17
mainwindow.h
17
mainwindow.h
|
@ -6,25 +6,26 @@
|
|||
|
||||
#include "channelwidget.h"
|
||||
|
||||
namespace Ui {
|
||||
namespace Ui
|
||||
{
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
std::vector<std::shared_ptr<ChannelWidget>> channels;
|
||||
Ui::MainWindow *ui;
|
||||
Q_OBJECT
|
||||
std::vector<std::shared_ptr<ChannelWidget>> channels;
|
||||
Ui::MainWindow *ui;
|
||||
|
||||
signals:
|
||||
void channelStateChanged(uint16_t device, uint16_t channel);
|
||||
void channelStateChanged(uint16_t device, uint16_t channel);
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = nullptr);
|
||||
~MainWindow();
|
||||
explicit MainWindow(QWidget *parent = nullptr);
|
||||
~MainWindow();
|
||||
|
||||
private:
|
||||
void enumerateDevices();
|
||||
void enumerateDevices();
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
|
|
16
multiplexer.cpp
Normal file
16
multiplexer.cpp
Normal file
|
@ -0,0 +1,16 @@
|
|||
#include "multiplexer.h"
|
||||
|
||||
Multiplexer::Multiplexer(QObject *parent)
|
||||
: QObject{parent}
|
||||
{}
|
||||
|
||||
Multiplexer::~Multiplexer()
|
||||
{
|
||||
for(auto& multiplexer : multiplexers)
|
||||
eismultiplexer_disconnect(multiplexer.get());
|
||||
}
|
||||
|
||||
void Multiplexer::probe()
|
||||
{
|
||||
|
||||
}
|
22
multiplexer.h
Normal file
22
multiplexer.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
#ifndef MULTIPLEXER_H
|
||||
#define MULTIPLEXER_H
|
||||
|
||||
#include <QObject>
|
||||
#include "eismultiplexer.h"
|
||||
|
||||
class Multiplexer : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
std::vector<std::shared_ptr<struct eismultiplexer>> multiplexers;
|
||||
std::vector<channel_t> channelStates;
|
||||
|
||||
public:
|
||||
explicit Multiplexer(QObject *parent = nullptr);
|
||||
~Multiplexer();
|
||||
void probe();
|
||||
|
||||
signals:
|
||||
void foundDevice(std::shared_ptr<struct eismultiplexer>);
|
||||
};
|
||||
|
||||
#endif // MULTIPLEXER_H
|
Loading…
Reference in a new issue