Add support for reading state

This commit is contained in:
Carl Philipp Klemm 2025-10-14 12:59:55 +02:00
parent 1eac3f6a83
commit 4c2a4790c0
12 changed files with 163 additions and 103 deletions

View file

@ -1,4 +1,3 @@
#include <eismultiplexer.h>
#include <QMessageBox>
#include <QMessageBox>
#include <set>
@ -19,7 +18,6 @@ MainWindow::MainWindow(QWidget *parent):
isFileModified(false)
{
ui->setupUi(this);
enumerateDevices();
codeEditor.setAutoIndentation(true);
codeEditor.setAutoParentheses(true);
@ -55,6 +53,8 @@ MainWindow::MainWindow(QWidget *parent):
connect(ui->pushButtonRun, &QPushButton::clicked, this, &MainWindow::runScript);
connect(ui->pushButtonStop, &QPushButton::clicked, this, &MainWindow::stopScript);
connect(&pythonRunner, &PythonRunner::scriptFinished, this, &MainWindow::stopScript);
enumerateDevices();
generateExample();
}
MainWindow::~MainWindow()
@ -62,6 +62,30 @@ MainWindow::~MainWindow()
delete ui;
}
void MainWindow::readState()
{
for (auto& multiplexer : multiplexers) {
channel_t channelstate = eismultiplexer_get_connected(multiplexer.second.get());
for (auto& channel : channels) {
for(size_t i = 0; i < 16; ++i) {
channel_t mask = static_cast<channel_t>(1 << i);
channel->onOtherChannelStateChanged(multiplexer.first, i, channelstate & mask);
}
}
int triggerCount = eismultiplexer_get_trigger_count(multiplexer.second.get());
for(int i = 0; i < triggerCount; ++i) {
bool level;
trigger_state_t state;
int ret = eismultiplexer_get_trigger_state(multiplexer.second.get(), i, &state, &level);
if (ret < 0) {
for (auto& trigger : triggers)
trigger->updateSate(multiplexer.first, i, state);
}
}
}
}
void MainWindow::updateStatus()
{
if (!currentFilePath.isEmpty()) {
@ -150,6 +174,9 @@ void MainWindow::enumerateDevices()
{
size_t count = 0;
uint16_t* serials = eismultiplexer_list_available_devices(&count);
if (ui->scrollArea->layout())
delete ui->scrollArea->layout();
QVBoxLayout* channelLayout = new QVBoxLayout(ui->scrollArea);
if (!serials || count == 0)
{
@ -168,6 +195,7 @@ void MainWindow::enumerateDevices()
int ret = eismultiplexer_connect(multiplexer.get(), serial);
if (ret == 0)
{
multiplexers.push_back({serial, multiplexer});
uint16_t channelCount = 0;
qDebug()<<"Adding channels from device "<<serial;
if (eismultiplexer_get_channel_count(multiplexer.get(), &channelCount) >= 0)
@ -177,7 +205,7 @@ void MainWindow::enumerateDevices()
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());
channelLayout->addWidget(widget.get());
}
}
@ -191,7 +219,7 @@ void MainWindow::enumerateDevices()
std::shared_ptr<TriggerWidget> triggerWidget(new TriggerWidget(serial, trigger, multiplexer));
qDebug()<<"Added trigger widget from device "<<serial<<" trigger "<<trigger;
triggers.push_back(triggerWidget);
ui->channelLayout->addWidget(triggerWidget.get());
channelLayout->addWidget(triggerWidget.get());
}
}
}
@ -202,7 +230,8 @@ void MainWindow::enumerateDevices()
qWarning()<<"Failed to connect to device with serial"<<serial<<"eismultiplexer_connect returned"<<ret;
}
}
ui->channelLayout->addStretch();
channelLayout->addStretch();
// Second pass: populate gang combos and connect signals for channels
for (const auto& widget : channels) {
@ -226,10 +255,11 @@ void MainWindow::enumerateDevices()
}
}
readState();
ui->statusbar->showMessage("Ready");
free(serials);
generateExample();
}
void MainWindow::runScript() {
@ -239,14 +269,25 @@ void MainWindow::runScript() {
ui->pushButtonStop->setEnabled(true);
codeEditor.setEnabled(false);
ui->scrollArea->setEnabled(false);
disconnectDevices();
}
void MainWindow::stopScript() {
pythonRunner.stopScript();
channels.clear();
triggers.clear();
ui->pushButtonRun->setEnabled(true);
ui->pushButtonStop->setEnabled(false);
codeEditor.setEnabled(true);
ui->scrollArea->setEnabled(true);
enumerateDevices();
}
void MainWindow::disconnectDevices()
{
for(auto& multiplexer : multiplexers)
eismultiplexer_disconnect(multiplexer.second.get());
multiplexers.clear();
}
void MainWindow::generateExample()