Fix issues with api handling, use shared_ptr to clean up multiplexer structs

This commit is contained in:
Carl Philipp Klemm 2025-06-30 16:59:48 +02:00
parent 278db0b23f
commit d36d5e563a
4 changed files with 18 additions and 13 deletions

View file

@ -26,6 +26,7 @@ add_executable(eismultiplexer-qt
channelwidget.cpp channelwidget.cpp
channelwidget.h channelwidget.h
) )
target_compile_options(eismultiplexer-qt PUBLIC "-Wall")
# Link Qt Widgets # Link Qt Widgets
target_link_libraries(eismultiplexer-qt Qt6::Widgets eismultiplexer) target_link_libraries(eismultiplexer-qt Qt6::Widgets eismultiplexer)

View file

@ -56,18 +56,20 @@ void ChannelWidget::onChannelToggled(bool checked)
channel_t channelFlag = static_cast<channel_t>(1 << channelNumber); channel_t channelFlag = static_cast<channel_t>(1 << channelNumber);
if (checked) { if (checked) {
if (eismultiplexer_connect_channel(multiplexer, channelFlag) < 0) { if (eismultiplexer_connect_channel(multiplexer.get(), channelFlag) < 0) {
QMessageBox::warning(this, tr("Connection Failed"), QMessageBox::warning(this, tr("Connection Failed"),
tr("Failed to connect channel %1 on device %2").arg(channelNumber).arg(deviceSerial)); tr("Failed to connect channel %1 on device %2").arg(channelNumber).arg(deviceSerial));
qWarning() << "Failed to connect channel" << channelNumber << "on device" << deviceSerial; qWarning() << "Failed to connect channel" << channelNumber << "on device" << deviceSerial;
checkbox->blockSignals(true);
checkbox->setChecked(false); checkbox->setChecked(false);
setEnabled(false); // Gray out the widget setEnabled(false); // Gray out the widget
} }
} else { } else {
if (eismultiplexer_disconnect_channel(multiplexer, channelFlag) < 0) { if (eismultiplexer_disconnect_channel(multiplexer.get(), channelFlag) < 0) {
QMessageBox::warning(this, tr("Disconnection Failed"), QMessageBox::warning(this, tr("Disconnection Failed"),
tr("Failed to disconnect channel %1 on device %2").arg(channelNumber).arg(deviceSerial)); tr("Failed to disconnect channel %1 on device %2").arg(channelNumber).arg(deviceSerial));
qWarning() << "Failed to disconnect channel" << channelNumber << "on device" << deviceSerial; qWarning() << "Failed to disconnect channel" << channelNumber << "on device" << deviceSerial;
checkbox->blockSignals(true);
checkbox->setChecked(true); checkbox->setChecked(true);
setEnabled(false); // Gray out the widget setEnabled(false); // Gray out the widget
} }

View file

@ -1,6 +1,3 @@
#ifndef CHANNELWIDGET_H #ifndef CHANNELWIDGET_H
#define CHANNELWIDGET_H #define CHANNELWIDGET_H
@ -9,6 +6,7 @@
#include <QLabel> #include <QLabel>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <eismultiplexer.h> #include <eismultiplexer.h>
#include <memory>
class ChannelWidget : public QWidget class ChannelWidget : public QWidget
{ {
@ -32,7 +30,7 @@ private slots:
private: private:
uint16_t deviceSerial; uint16_t deviceSerial;
uint16_t channelNumber; uint16_t channelNumber;
struct eismultiplexer* multiplexer; std::shared_ptr<struct eismultiplexer> multiplexer;
QCheckBox* checkbox; QCheckBox* checkbox;
QLabel* label; QLabel* label;
}; };

View file

@ -1,9 +1,8 @@
#include "mainwindow.h" #include "mainwindow.h"
#include <QDebug> #include <QDebug>
#include <QMessageBox> #include <QMessageBox>
#include <eismultiplexer.h> #include <eismultiplexer.h>
#include <memory>
MainWindow::MainWindow(QWidget *parent) MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent)
@ -44,6 +43,9 @@ void MainWindow::setupUi()
setWindowTitle("EIS Multiplexer Controller"); setWindowTitle("EIS Multiplexer Controller");
} }
void MainWindow::onChannelAboutToBeTurnedOn(uint16_t deviceSerial, uint16_t channelNumber)
{}
void MainWindow::enumerateDevices() void MainWindow::enumerateDevices()
{ {
size_t count = 0; size_t count = 0;
@ -53,22 +55,24 @@ void MainWindow::enumerateDevices()
QMessageBox::warning(this, tr("No Devices Found"), QMessageBox::warning(this, tr("No Devices Found"),
tr("No EIS multiplexer devices were found. Please connect a device and try again.")); tr("No EIS multiplexer devices were found. Please connect a device and try again."));
qWarning() << "No EIS multiplexer devices found"; qWarning() << "No EIS multiplexer devices found";
close();
return; return;
} }
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
uint16_t serial = serials[i]; uint16_t serial = serials[i];
struct eismultiplexer multiplexer; std::shared_ptr<struct eismultiplexer> multiplexer(new struct eismultiplexer);
if (eismultiplexer_connect(&multiplexer, serial) == 0) { if (eismultiplexer_connect(multiplexer.get(), serial) >= 0) {
uint16_t channelCount = 0; uint16_t channelCount = 0;
if (eismultiplexer_get_channel_count(&multiplexer, &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++) { for (uint16_t channel = 0; channel < channelCount; channel++) {
ChannelWidget* widget = new ChannelWidget(serial, channel, &multiplexer); ChannelWidget* widget = new ChannelWidget(serial, channel, multiplexer.get());
qDebug()<<"Added widget from device "<<serial<<" channel "<<channel;
channelWidgets.push_back(widget); channelWidgets.push_back(widget);
scrollLayout->addWidget(widget); scrollLayout->addWidget(widget);
} }
} }
eismultiplexer_disconnect(&multiplexer);
} else { } else {
QMessageBox::warning(this, tr("Connection Failed"), QMessageBox::warning(this, tr("Connection Failed"),
tr("Failed to connect to device with serial %1").arg(serial)); tr("Failed to connect to device with serial %1").arg(serial));