Skip to content

[ENH] Signal Generator Plugin #919

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

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/applications/mne_scan/plugins/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@ add_subdirectory(fiffsimulator)
add_subdirectory(ftbuffer)
add_subdirectory(babymeg)
add_subdirectory(natus)
add_subdirectory(signalgen)

# Algorithm Plugin
add_subdirectory(rtcmne)
79 changes: 79 additions & 0 deletions src/applications/mne_scan/plugins/signalgen/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
cmake_minimum_required(VERSION 3.14)
project(scan_signalgen LANGUAGES CXX)

#Handle qt uic, moc, rrc automatically
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Widgets Network Concurrent)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Widgets Network Concurrent)

set(SOURCES
signalgen_global.cpp
FormFiles/signalgensetupwidget.cpp
signalgen.cpp
)

set(HEADERS
signalgen_global.h
FormFiles/signalgensetupwidget.h
signalgen.h
)

set(RESOURCES
)

set(FILE_TO_UPDATE signalgen_global.cpp)

set(SOURCE_PATHS ${SOURCES})
list(TRANSFORM SOURCE_PATHS PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/")
set_source_files_properties(${FILE_TO_UPDATE} PROPERTIES OBJECT_DEPENDS "${SOURCE_PATHS}")

add_library(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${RESOURCES})

set(FFTW_LIBS "")

if(USE_FFTW)
if (WIN32)
set(FFTW_LIBS
${FFTW_DIR_LIBS}/libfftw3-3.dll
${FFTW_DIR_LIBS}/libfftw3f-3.dll
${FFTW_DIR_LIBS}/libfftwf3l-3.dll
)
target_include_directories(${PROJECT_NAME} PRIVATE ${FFTW_DIR_INCLUDE})
elseif(UNIX AND NOT APPLE)
set(FFTW_LIBS ${FFTW_DIR_LIBS}/lib/libfftw3.so)
target_include_directories(${PROJECT_NAME} PRIVATE ${FFTW_DIR_INCLUDE}/api)
endif()
endif()

target_include_directories(${PROJECT_NAME} PUBLIC ../)

target_link_libraries(${PROJECT_NAME} PRIVATE
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Concurrent
eigen
mne_disp
mne_utils
mne_fiff
mne_fs
mne_mne
mne_fwd
mne_inverse
mne_rtprocessing
mne_connectivity
mne_events
mne_communication
scDisp
scShared
scMeas
${FFTW_LIBS})

target_compile_definitions(${PROJECT_NAME} PRIVATE SCAN_signalgen_PLUGIN MNE_GIT_HASH_SHORT="${MNE_GIT_HASH_SHORT}" MNE_GIT_HASH_LONG="${MNE_GIT_HASH_LONG}")

if(NOT BUILD_SHARED_LIBS)
target_compile_definitions(${PROJECT_NAME} PRIVATE STATICBUILD QT_STATICPLUGIN)
endif()
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#include "signalgensetupwidget.h"
#include "ui_signalgensetupwidget.h"

SignalGenSetupWidget::SignalGenSetupWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SignalGenSetupWidget)
{
ui->setupUi(this);

connect(ui->nchannels_spinBox, QOverload<int>::of(&QSpinBox::valueChanged),
this, &SignalGenSetupWidget::numChannelsChanged, Qt::UniqueConnection);

connect(ui->samplefreq_spinBox, QOverload<int>::of(&QSpinBox::valueChanged),
this, &SignalGenSetupWidget::sampleFreqChanged, Qt::UniqueConnection);

connect(ui->blockpersecond_spinBox, QOverload<int>::of(&QSpinBox::valueChanged),
this, &SignalGenSetupWidget::blocksPerSecondChanged, Qt::UniqueConnection);

connect(ui->checkBox_random, &QCheckBox::stateChanged,
[this](int state){if(state == Qt::Checked) this->emit modeChanged(SIGNALGENPLUGIN::SignalGen::Mode::Noise); this->updateUiState();});

connect(ui->checkBox_wave, &QCheckBox::stateChanged,
[this](int state){if(state == Qt::Checked) this->emit modeChanged(SIGNALGENPLUGIN::SignalGen::Mode::Wave); this->updateUiState();});

connect(ui->checkBox_zero, &QCheckBox::stateChanged,
[this](int state){if(state == Qt::Checked) this->emit modeChanged(SIGNALGENPLUGIN::SignalGen::Mode::Zero); this->updateUiState();});

connect(ui->spinBox_gen_frq, QOverload<int>::of(&QSpinBox::valueChanged),
this, &SignalGenSetupWidget::genFreqChanged, Qt::UniqueConnection);

updateUiState();
}

SignalGenSetupWidget::~SignalGenSetupWidget()
{
delete ui;
}

void SignalGenSetupWidget::defineChannelSettings(int min, int max, int def)
{
ui->nchannels_spinBox->setMinimum(min);
ui->nchannels_spinBox->setMaximum(max);
ui->nchannels_spinBox->setValue(def);
}

void SignalGenSetupWidget::defineSampleFreqSettings(int min, int max, int def)
{
ui->samplefreq_spinBox->setMinimum(min);
ui->samplefreq_spinBox->setMaximum(max);
ui->samplefreq_spinBox->setValue(def);
}

void SignalGenSetupWidget::defineBlockSettings(int min, int max, int def)
{
ui->blockpersecond_spinBox->setMinimum(min);
ui->blockpersecond_spinBox->setMaximum(max);
ui->blockpersecond_spinBox->setValue(def);
}

void SignalGenSetupWidget::defineGeneratedFreqSettings(int min, int max, int def)
{
ui->spinBox_gen_frq->setMinimum(min);
ui->spinBox_gen_frq->setMaximum(max);
ui->spinBox_gen_frq->setValue(def);
}

void SignalGenSetupWidget::defineMode(SIGNALGENPLUGIN::SignalGen::Mode mode)
{
switch (mode){
case SIGNALGENPLUGIN::SignalGen::Mode::Noise:
{
ui->checkBox_random->setChecked(true);
break;
}
case SIGNALGENPLUGIN::SignalGen::Mode::Wave:
{
ui->checkBox_wave->setChecked(true);
break;
}
case SIGNALGENPLUGIN::SignalGen::Mode::Zero:
{
ui->checkBox_zero->setChecked(true);
break;
}
}

updateUiState();
}


void SignalGenSetupWidget::updateUiState()
{
if(ui->checkBox_wave->isChecked()){
ui->label_gen_freq->show();
ui->spinBox_gen_frq->show();
} else {
ui->label_gen_freq->hide();
ui->spinBox_gen_frq->hide();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#ifndef SIGNALGENSETUPWIDGET_H
#define SIGNALGENSETUPWIDGET_H

#include <QWidget>

#include "../signalgen.h"

namespace Ui {
class SignalGenSetupWidget;
}

class SignalGenSetupWidget : public QWidget
{
Q_OBJECT

public:
explicit SignalGenSetupWidget(QWidget *parent = nullptr);
~SignalGenSetupWidget();

void defineChannelSettings(int min, int max, int def);
void defineSampleFreqSettings(int min, int max, int def);
void defineBlockSettings(int min, int max, int def);
void defineGeneratedFreqSettings(int min, int max, int def);
void defineMode(SIGNALGENPLUGIN::SignalGen::Mode mode);

signals:
void numChannelsChanged(int numChannels);
void sampleFreqChanged(int sampleFreq);
void blocksPerSecondChanged(int blocksPerSecond);
void genFreqChanged(int genFreq);
void modeChanged(SIGNALGENPLUGIN::SignalGen::Mode mode);
private:

void updateUiState();

Ui::SignalGenSetupWidget *ui;
};

#endif // SIGNALGENSETUPWIDGET_H
Loading