44 const QMap<QString, std::shared_ptr<BrainSurface>> &surfaces)
47 qDebug() <<
"RtSensorStreamManager: Real-time sensor streaming already active";
53 qWarning() <<
"RtSensorStreamManager: Cannot start sensor streaming — no evoked data loaded";
58 std::shared_ptr<Eigen::MatrixXf> mappingMat;
62 if (
modality == QStringLiteral(
"MEG")) {
66 }
else if (
modality == QStringLiteral(
"EEG")) {
71 qWarning() <<
"RtSensorStreamManager: Unknown modality:" <<
modality;
75 if (!mappingMat || mappingMat->rows() == 0 || pick.size() == 0) {
76 qWarning() <<
"RtSensorStreamManager: Mapping matrix not built for" <<
modality
77 <<
"— call loadSensorField() first";
81 if (surfaceKey.isEmpty() || !surfaces.contains(surfaceKey)) {
82 qWarning() <<
"RtSensorStreamManager: Target surface not found for" <<
modality
83 <<
"streaming (key:" << surfaceKey <<
")";
91 m_controller = std::make_unique<RtSensorDataController>(
this);
97 m_controller->setMappingMatrix(mappingMat);
100 m_controller->setColormapType(fieldMapper.
colormap());
103 double sFreq = 1000.0;
106 if (dt > 0) sFreq = 1.0 / dt;
108 m_controller->setSFreq(sFreq);
111 const int nTimePoints =
static_cast<int>(fieldMapper.
evoked().times.size());
112 qDebug() <<
"RtSensorStreamManager: Feeding" << nTimePoints <<
modality
113 <<
"sensor time points into real-time queue";
114 m_controller->clearData();
116 for (
int t = 0; t < nTimePoints; ++t) {
117 Eigen::VectorXf meas(pick.size());
118 for (
int i = 0; i < pick.size(); ++i) {
119 meas(i) =
static_cast<float>(fieldMapper.
evoked().data(pick(i), t));
121 m_controller->addData(meas);
125 m_controller->setStreamingState(
true);
126 m_isStreaming =
true;
128 qDebug() <<
"RtSensorStreamManager: Real-time sensor streaming started for" <<
modality;
136 if (!m_isStreaming)
return;
139 m_controller->setStreamingState(
false);
141 m_isStreaming =
false;
142 qDebug() <<
"RtSensorStreamManager: Real-time sensor streaming stopped";
150 m_controller->addData(data);
158 m_controller->setTimeInterval(msec);
166 m_controller->setLoopState(enabled);
174 m_controller->setNumberAverages(numAvr);
182 m_controller->setColormapType(name);
Renderable cortical / BEM mesh with interleaved vertex attributes and Qt-RHI buffer management.
Real-time MEG / EEG sensor streaming controller that orchestrates the data and field-mapping workers.
Manager that wires real-time sensor data into the scene: owns the data controller,...
Builds the dense sensor-to-surface mapping matrix and the iso-contour overlay for MEG / EEG evoked da...
void pushData(const Eigen::VectorXf &data)
void setLooping(bool enabled)
RtSensorStreamManager(QObject *parent=nullptr)
void setInterval(int msec)
void setColormap(const QString &name)
bool startStreaming(const QString &modality, const SensorFieldMapper &fieldMapper, const QMap< QString, std::shared_ptr< BrainSurface > > &surfaces)
~RtSensorStreamManager() override
void setAverages(int numAvr)
void colorsAvailable(const QString &surfaceKey, const QVector< uint32_t > &colors)
Sensor-to-surface field mapper that interpolates MEG/EEG measurements onto cortical meshes and genera...
const QString & colormap() const
const QString & megSurfaceKey() const
std::shared_ptr< Eigen::MatrixXf > megMapping() const
const FIFFLIB::FiffEvoked & evoked() const
const QString & eegSurfaceKey() const
const Eigen::VectorXi & megPick() const
const Eigen::VectorXi & eegPick() const
std::shared_ptr< Eigen::MatrixXf > eegMapping() const
void newSensorColorsAvailable(const QString &surfaceKey, const QVector< uint32_t > &colors)