From 239e160c0819044fca1f12d35cc829164ffa20ba Mon Sep 17 00:00:00 2001 From: Aaron Cuevas Lopez <aacuelo@teleco.upv.es> Date: Fri, 6 Mar 2015 20:14:13 +0100 Subject: [PATCH] Fix impedance measure crash with 2132 16ch headstage --- .../Processors/DataThreads/RHD2000Thread.cpp | 32 +++++++++++++------ Source/Processors/DataThreads/RHD2000Thread.h | 4 ++- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Source/Processors/DataThreads/RHD2000Thread.cpp b/Source/Processors/DataThreads/RHD2000Thread.cpp index 74d710d4b..ac27090a2 100644 --- a/Source/Processors/DataThreads/RHD2000Thread.cpp +++ b/Source/Processors/DataThreads/RHD2000Thread.cpp @@ -715,7 +715,7 @@ void RHD2000Thread::setNumChannels(int hsNum, int numChannels) headstagesArray[hsNum]->setHalfChannels(true); else headstagesArray[hsNum]->setHalfChannels(false); - numChannelsPerDataStream.set(hsNum, numChannels); + numChannelsPerDataStream.set(headstagesArray[hsNum]->getStreamIndex(0), numChannels); } } @@ -1027,7 +1027,7 @@ bool RHD2000Thread::enableHeadstage(int hsNum, bool enabled, int nStr, int strCh if (enabled) { headstagesArray[hsNum]->setNumStreams(nStr); - headstagesArray[hsNum]->setChannelsPerStream(strChans); + headstagesArray[hsNum]->setChannelsPerStream(strChans,enabledStreams.size()); enabledStreams.add(headstagesArray[hsNum]->getDataStream(0)); numChannelsPerDataStream.add(strChans); if (nStr > 1) @@ -1710,6 +1710,7 @@ void RHD2000Thread::runImpedanceTest(ImpedanceData* data) RHDHeadstage::RHDHeadstage(Rhd2000EvalBoard::BoardDataSource stream) : numStreams(0), channelsPerStream(32), dataStream(stream), halfChannels(false) { + streamIndex = -1; } RHDHeadstage::~RHDHeadstage() @@ -1721,9 +1722,15 @@ void RHDHeadstage::setNumStreams(int num) numStreams = num; } -void RHDHeadstage::setChannelsPerStream(int nchan) +void RHDHeadstage::setChannelsPerStream(int nchan, int index) { channelsPerStream = nchan; + streamIndex = index; +} + +int RHDHeadstage::getStreamIndex(int index) +{ + return streamIndex + index; } int RHDHeadstage::getNumChannels() @@ -2027,6 +2034,8 @@ void RHDImpedanceMeasure::runImpedanceMeasurement() int numdataStreams = board->evalBoard->getNumEnabledDataStreams(); bool rhd2164ChipPresent = false; + int chOffset; + Array<int> enabledStreams; for (stream = 0; stream < MAX_NUM_DATA_STREAMS; ++stream) { @@ -2221,7 +2230,12 @@ void RHDImpedanceMeasure::runImpedanceMeasurement() for (stream = 0; stream < board->evalBoard->getNumEnabledDataStreams(); ++stream) { - for (channel = 0; channel < 32; ++channel) + if ((board->chipId[stream] == CHIP_ID_RHD2132) && (board->numChannelsPerDataStream[stream] == 16)) + chOffset = RHD2132_16CH_OFFSET; + else + chOffset = 0; + + for (channel = 0; channel < board->numChannelsPerDataStream[stream]; ++channel) { if (1) { @@ -2229,7 +2243,7 @@ void RHDImpedanceMeasure::runImpedanceMeasurement() for (capRange = 0; capRange < 3; ++capRange) { // Find the measured amplitude that is closest to bestAmplitude on a logarithmic scale - distance = abs(log(measuredMagnitude[stream][channel][capRange] / bestAmplitude)); + distance = abs(log(measuredMagnitude[stream][channel+chOffset][capRange] / bestAmplitude)); if (distance < minDistance) { bestAmplitudeIndex = capRange; @@ -2253,12 +2267,12 @@ void RHDImpedanceMeasure::runImpedanceMeasurement() current = TWO_PI * actualImpedanceFreq * dacVoltageAmplitude * Cseries; // Calculate impedance magnitude from calculated current and measured voltage. - impedanceMagnitude = 1.0e-6 * (measuredMagnitude[stream][channel][bestAmplitudeIndex] / current) * + impedanceMagnitude = 1.0e-6 * (measuredMagnitude[stream][channel + chOffset][bestAmplitudeIndex] / current) * (18.0 * relativeFreq * relativeFreq + 1.0); // Calculate impedance phase, with small correction factor accounting for the // 3-command SPI pipeline delay. - impedancePhase = measuredPhase[stream][channel][bestAmplitudeIndex] + (360.0 * (3.0 / period)); + impedancePhase = measuredPhase[stream][channel + chOffset][bestAmplitudeIndex] + (360.0 * (3.0 / period)); // Factor out on-chip parasitic capacitance from impedance measurement. factorOutParallelCapacitance(impedanceMagnitude, impedancePhase, actualImpedanceFreq, @@ -2270,12 +2284,12 @@ void RHDImpedanceMeasure::runImpedanceMeasurement() board->boardSampleRate); data->streams.add(enabledStreams[stream]); - data->channels.add(channel); + data->channels.add(channel + chOffset); data->magnitudes.add(impedanceMagnitude); data->phases.add(impedancePhase); if (impedanceMagnitude > 1000000) - cout << "stream " << stream << " channel " << 1 + channel << " magnitude: " << String(impedanceMagnitude / 1e6, 2) << " mOhm , phase : " << impedancePhase << endl; + cout << "stream " << stream << " channel " << 1 + channel << " magnitude: " << String(impedanceMagnitude / 1e6, 2) << " MOhm , phase : " << impedancePhase << endl; else cout << "stream " << stream << " channel " << 1 + channel << " magnitude: " << String(impedanceMagnitude / 1e3, 2) << " kOhm , phase : " << impedancePhase << endl; diff --git a/Source/Processors/DataThreads/RHD2000Thread.h b/Source/Processors/DataThreads/RHD2000Thread.h index ad02e086a..cc00de97b 100644 --- a/Source/Processors/DataThreads/RHD2000Thread.h +++ b/Source/Processors/DataThreads/RHD2000Thread.h @@ -210,7 +210,8 @@ public: RHDHeadstage(Rhd2000EvalBoard::BoardDataSource stream); ~RHDHeadstage(); void setNumStreams(int num); - void setChannelsPerStream(int nchan); + void setChannelsPerStream(int nchan, int index); + int getStreamIndex(int index); int getNumChannels(); int getNumStreams(); void setHalfChannels(bool half); //mainly used for de 16ch rhd2132 board @@ -219,6 +220,7 @@ public: bool isPlugged(); private: Rhd2000EvalBoard::BoardDataSource dataStream; + int streamIndex; int numStreams; int channelsPerStream; bool halfChannels; -- GitLab