Commit 997a01ec72e12d346296981268020be654fbb5b6
Committed by
David Gräff
1 parent
db4f8ba0
Clean up signess. Fix crashes in the software trigger code (glgenerator). Remove…
… headers where they are not used anymore (defines.h for instance)
Showing
43 changed files
with
171 additions
and
176 deletions
openhantek/CMakeLists.txt
| @@ -14,7 +14,7 @@ endif() | @@ -14,7 +14,7 @@ endif() | ||
| 14 | 14 | ||
| 15 | # include directories | 15 | # include directories |
| 16 | set(CMAKE_INCLUDE_CURRENT_DIR ON) | 16 | set(CMAKE_INCLUDE_CURRENT_DIR ON) |
| 17 | -include_directories(src/ src/hantekprotocol src/hantekdso src/widgets src/docks src/configdialog) | 17 | +include_directories(src/ src/hantekdso src/widgets src/docks src/configdialog) |
| 18 | 18 | ||
| 19 | # collect sources and other files | 19 | # collect sources and other files |
| 20 | file(GLOB_RECURSE SRC "src/*.cpp") | 20 | file(GLOB_RECURSE SRC "src/*.cpp") |
openhantek/src/analyse/dataanalyzer.h
| @@ -9,7 +9,6 @@ | @@ -9,7 +9,6 @@ | ||
| 9 | #include <memory> | 9 | #include <memory> |
| 10 | 10 | ||
| 11 | #include "dataanalyzerresult.h" | 11 | #include "dataanalyzerresult.h" |
| 12 | -#include "definitions.h" | ||
| 13 | #include "dsosamples.h" | 12 | #include "dsosamples.h" |
| 14 | #include "utils/printutils.h" | 13 | #include "utils/printutils.h" |
| 15 | #include "enums.h" | 14 | #include "enums.h" |
openhantek/src/analyse/dataanalyzerresult.cpp
| @@ -9,14 +9,14 @@ DataAnalyzerResult::DataAnalyzerResult(unsigned int channelCount) { analyzedData | @@ -9,14 +9,14 @@ DataAnalyzerResult::DataAnalyzerResult(unsigned int channelCount) { analyzedData | ||
| 9 | /// \brief Returns the analyzed data. | 9 | /// \brief Returns the analyzed data. |
| 10 | /// \param channel Channel, whose data should be returned. | 10 | /// \param channel Channel, whose data should be returned. |
| 11 | /// \return Analyzed data as AnalyzedData struct. | 11 | /// \return Analyzed data as AnalyzedData struct. |
| 12 | -const DataChannel *DataAnalyzerResult::data(int channel) const { | ||
| 13 | - if (channel >= (int)this->analyzedData.size()) return 0; | 12 | +const DataChannel *DataAnalyzerResult::data(unsigned channel) const { |
| 13 | + if (channel >= this->analyzedData.size()) return 0; | ||
| 14 | 14 | ||
| 15 | return &this->analyzedData[(size_t)channel]; | 15 | return &this->analyzedData[(size_t)channel]; |
| 16 | } | 16 | } |
| 17 | 17 | ||
| 18 | -DataChannel *DataAnalyzerResult::modifyData(int channel) { | ||
| 19 | - if (channel >= (int)this->analyzedData.size()) | 18 | +DataChannel *DataAnalyzerResult::modifyData(unsigned channel) { |
| 19 | + if (channel >= this->analyzedData.size()) | ||
| 20 | throw new std::runtime_error("If you modfiy the DataAnalyzerResult, you " | 20 | throw new std::runtime_error("If you modfiy the DataAnalyzerResult, you " |
| 21 | "need to set the channels first!"); | 21 | "need to set the channels first!"); |
| 22 | 22 |
openhantek/src/analyse/dataanalyzerresult.h
| @@ -25,8 +25,8 @@ struct DataChannel { | @@ -25,8 +25,8 @@ struct DataChannel { | ||
| 25 | class DataAnalyzerResult { | 25 | class DataAnalyzerResult { |
| 26 | public: | 26 | public: |
| 27 | DataAnalyzerResult(unsigned int channelCount); | 27 | DataAnalyzerResult(unsigned int channelCount); |
| 28 | - const DataChannel *data(int channel) const; | ||
| 29 | - DataChannel *modifyData(int channel); | 28 | + const DataChannel *data(unsigned channel) const; |
| 29 | + DataChannel *modifyData(unsigned channel); | ||
| 30 | unsigned int sampleCount() const; | 30 | unsigned int sampleCount() const; |
| 31 | unsigned int channelCount() const; | 31 | unsigned int channelCount() const; |
| 32 | 32 |
openhantek/src/configdialog/DsoConfigAnalysisPage.h
openhantek/src/configdialog/DsoConfigColorsPage.h
openhantek/src/configdialog/DsoConfigFilesPage.h
openhantek/src/configdialog/DsoConfigScopePage.h
openhantek/src/docks/HorizontalDock.h
openhantek/src/docks/SpectrumDock.h
openhantek/src/docks/TriggerDock.h
openhantek/src/docks/VoltageDock.h
openhantek/src/docks/dockwindows.cpp
| @@ -10,7 +10,6 @@ | @@ -10,7 +10,6 @@ | ||
| 10 | 10 | ||
| 11 | #include "analyse/enums.h" | 11 | #include "analyse/enums.h" |
| 12 | #include "hantekdso/enums.h" | 12 | #include "hantekdso/enums.h" |
| 13 | -#include "definitions.h" | ||
| 14 | #include "dockwindows.h" | 13 | #include "dockwindows.h" |
| 15 | 14 | ||
| 16 | void SetupDockWidget(QDockWidget *dockWindow, QWidget *dockWidget, QLayout *layout) { | 15 | void SetupDockWidget(QDockWidget *dockWindow, QWidget *dockWidget, QLayout *layout) { |
openhantek/src/exporter.cpp
| @@ -18,7 +18,6 @@ | @@ -18,7 +18,6 @@ | ||
| 18 | #include "exporter.h" | 18 | #include "exporter.h" |
| 19 | 19 | ||
| 20 | #include "analyse/dataanalyzerresult.h" | 20 | #include "analyse/dataanalyzerresult.h" |
| 21 | -#include "definitions.h" | ||
| 22 | #include "glgenerator.h" | 21 | #include "glgenerator.h" |
| 23 | #include "settings.h" | 22 | #include "settings.h" |
| 24 | #include "utils/dsoStrings.h" | 23 | #include "utils/dsoStrings.h" |
openhantek/src/glgenerator.cpp
| @@ -121,9 +121,9 @@ GlGenerator::PrePostStartTriggerSamples GlGenerator::computeSoftwareTriggerTY(co | @@ -121,9 +121,9 @@ GlGenerator::PrePostStartTriggerSamples GlGenerator::computeSoftwareTriggerTY(co | ||
| 121 | result->data(channel)->voltage.sample.empty()) | 121 | result->data(channel)->voltage.sample.empty()) |
| 122 | return PrePostStartTriggerSamples(preTrigSamples, postTrigSamples, swTriggerStart); | 122 | return PrePostStartTriggerSamples(preTrigSamples, postTrigSamples, swTriggerStart); |
| 123 | 123 | ||
| 124 | - double value; | 124 | + const std::vector<double>& samples = result->data(channel)->voltage.sample; |
| 125 | double level = settings->voltage[channel].trigger; | 125 | double level = settings->voltage[channel].trigger; |
| 126 | - unsigned int sampleCount = result->data(channel)->voltage.sample.size(); | 126 | + size_t sampleCount = samples.size(); |
| 127 | double timeDisplay = settings->horizontal.timebase * 10; | 127 | double timeDisplay = settings->horizontal.timebase * 10; |
| 128 | double samplesDisplay = timeDisplay * settings->horizontal.samplerate; | 128 | double samplesDisplay = timeDisplay * settings->horizontal.samplerate; |
| 129 | if (samplesDisplay >= sampleCount) { | 129 | if (samplesDisplay >= sampleCount) { |
| @@ -137,29 +137,29 @@ GlGenerator::PrePostStartTriggerSamples GlGenerator::computeSoftwareTriggerTY(co | @@ -137,29 +137,29 @@ GlGenerator::PrePostStartTriggerSamples GlGenerator::computeSoftwareTriggerTY(co | ||
| 137 | "picture. Decrease sample rate")); | 137 | "picture. Decrease sample rate")); |
| 138 | return PrePostStartTriggerSamples(preTrigSamples, postTrigSamples, swTriggerStart); | 138 | return PrePostStartTriggerSamples(preTrigSamples, postTrigSamples, swTriggerStart); |
| 139 | } | 139 | } |
| 140 | - preTrigSamples = (settings->trigger.position * samplesDisplay); | ||
| 141 | - postTrigSamples = sampleCount - (samplesDisplay - preTrigSamples); | 140 | + preTrigSamples = (unsigned)(settings->trigger.position * samplesDisplay); |
| 141 | + postTrigSamples = (unsigned)sampleCount - ((unsigned)samplesDisplay - preTrigSamples); | ||
| 142 | 142 | ||
| 143 | const int threshold = 7; | 143 | const int threshold = 7; |
| 144 | double prev; | 144 | double prev; |
| 145 | - bool (*opcmp)(int,int,int); | ||
| 146 | - bool (*smplcmp)(int,int); | 145 | + bool (*opcmp)(double,double,double); |
| 146 | + bool (*smplcmp)(double,double); | ||
| 147 | if (settings->trigger.slope == Dso::SLOPE_POSITIVE) { | 147 | if (settings->trigger.slope == Dso::SLOPE_POSITIVE) { |
| 148 | prev = INT_MAX; | 148 | prev = INT_MAX; |
| 149 | - opcmp = [](int value, int level, int prev) { return value > level && prev <= level;}; | ||
| 150 | - smplcmp = [](int sampleK, int value) { return sampleK >= value;}; | 149 | + opcmp = [](double value, double level, double prev) { return value > level && prev <= level;}; |
| 150 | + smplcmp = [](double sampleK, double value) { return sampleK >= value;}; | ||
| 151 | } else { | 151 | } else { |
| 152 | prev = INT_MIN; | 152 | prev = INT_MIN; |
| 153 | - opcmp = [](int value, int level, int prev) { return value > level && prev <= level;}; | ||
| 154 | - smplcmp = [](int sampleK, int value) { return sampleK < value;}; | 153 | + opcmp = [](double value, double level, double prev) { return value < level && prev >= level;}; |
| 154 | + smplcmp = [](double sampleK, double value) { return sampleK < value;}; | ||
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | for (unsigned int i = preTrigSamples; i < postTrigSamples; i++) { | 157 | for (unsigned int i = preTrigSamples; i < postTrigSamples; i++) { |
| 158 | - value = result->data(channel)->voltage.sample[i]; | 158 | + double value = samples[i]; |
| 159 | if (opcmp(value, level, prev)) { | 159 | if (opcmp(value, level, prev)) { |
| 160 | int rising = 0; | 160 | int rising = 0; |
| 161 | for (unsigned int k = i + 1; k < i + 11 && k < sampleCount; k++) { | 161 | for (unsigned int k = i + 1; k < i + 11 && k < sampleCount; k++) { |
| 162 | - if (smplcmp(result->data(channel)->voltage.sample[k], value)) { rising++; } | 162 | + if (smplcmp(samples[k], value)) { rising++; } |
| 163 | } | 163 | } |
| 164 | if (rising > threshold) { | 164 | if (rising > threshold) { |
| 165 | swTriggerStart = i; | 165 | swTriggerStart = i; |
| @@ -170,13 +170,26 @@ GlGenerator::PrePostStartTriggerSamples GlGenerator::computeSoftwareTriggerTY(co | @@ -170,13 +170,26 @@ GlGenerator::PrePostStartTriggerSamples GlGenerator::computeSoftwareTriggerTY(co | ||
| 170 | } | 170 | } |
| 171 | if (swTriggerStart == 0) { | 171 | if (swTriggerStart == 0) { |
| 172 | timestampDebug(QString("Trigger not asserted. Data ignored")); | 172 | timestampDebug(QString("Trigger not asserted. Data ignored")); |
| 173 | + preTrigSamples = 0; // preTrigSamples may never be greater than swTriggerStart | ||
| 173 | } | 174 | } |
| 174 | return PrePostStartTriggerSamples(preTrigSamples, postTrigSamples, swTriggerStart); | 175 | return PrePostStartTriggerSamples(preTrigSamples, postTrigSamples, swTriggerStart); |
| 175 | } | 176 | } |
| 176 | 177 | ||
| 178 | +const SampleValues& GlGenerator::useSamplesOf(int mode, unsigned channel, const DataAnalyzerResult *result) const | ||
| 179 | +{ | ||
| 180 | + static SampleValues emptyDefault; | ||
| 181 | + if (mode == Dso::CHANNELMODE_VOLTAGE) { | ||
| 182 | + if (!settings->voltage[channel].used || !result->data(channel)) return emptyDefault; | ||
| 183 | + return result->data(channel)->voltage; | ||
| 184 | + } else { | ||
| 185 | + if (!settings->spectrum[channel].used || !result->data(channel)) return emptyDefault; | ||
| 186 | + return result->data(channel)->spectrum; | ||
| 187 | + } | ||
| 188 | +} | ||
| 189 | + | ||
| 177 | void GlGenerator::generateGraphs(const DataAnalyzerResult *result) { | 190 | void GlGenerator::generateGraphs(const DataAnalyzerResult *result) { |
| 178 | 191 | ||
| 179 | - int digitalPhosphorDepth = view->digitalPhosphor ? view->digitalPhosphorDepth : 1; | 192 | + unsigned digitalPhosphorDepth = view->digitalPhosphor ? view->digitalPhosphorDepth : 1; |
| 180 | 193 | ||
| 181 | // Handle all digital phosphor related list manipulations | 194 | // Handle all digital phosphor related list manipulations |
| 182 | for (int mode = Dso::CHANNELMODE_VOLTAGE; mode < Dso::CHANNELMODE_COUNT; ++mode) { | 195 | for (int mode = Dso::CHANNELMODE_VOLTAGE; mode < Dso::CHANNELMODE_COUNT; ++mode) { |
| @@ -197,105 +210,106 @@ void GlGenerator::generateGraphs(const DataAnalyzerResult *result) { | @@ -197,105 +210,106 @@ void GlGenerator::generateGraphs(const DataAnalyzerResult *result) { | ||
| 197 | 210 | ||
| 198 | ready = true; | 211 | ready = true; |
| 199 | 212 | ||
| 200 | - unsigned preTrigSamples; | ||
| 201 | - unsigned postTrigSamples; | ||
| 202 | - unsigned swTriggerStart; | 213 | + unsigned preTrigSamples=0; |
| 214 | + unsigned postTrigSamples=0; | ||
| 215 | + unsigned swTriggerStart=0; | ||
| 203 | switch (settings->horizontal.format) { | 216 | switch (settings->horizontal.format) { |
| 204 | case Dso::GRAPHFORMAT_TY: | 217 | case Dso::GRAPHFORMAT_TY: |
| 205 | std::tie(preTrigSamples, postTrigSamples, swTriggerStart) = computeSoftwareTriggerTY(result); | 218 | std::tie(preTrigSamples, postTrigSamples, swTriggerStart) = computeSoftwareTriggerTY(result); |
| 206 | 219 | ||
| 207 | // Add graphs for channels | 220 | // Add graphs for channels |
| 208 | for (int mode = Dso::CHANNELMODE_VOLTAGE; mode < Dso::CHANNELMODE_COUNT; ++mode) { | 221 | for (int mode = Dso::CHANNELMODE_VOLTAGE; mode < Dso::CHANNELMODE_COUNT; ++mode) { |
| 209 | - for (int channel = 0; channel < (int)settings->voltage.size(); ++channel) { | 222 | + DrawLinesWithHistoryPerChannel& dPerChannel = vaChannel[mode]; |
| 223 | + for (unsigned channel = 0; channel < settings->voltage.size(); ++channel) { | ||
| 224 | + DrawLinesWithHistory& withHistory = dPerChannel[channel]; | ||
| 225 | + const SampleValues& samples = useSamplesOf(mode, channel, result); | ||
| 226 | + | ||
| 210 | // Check if this channel is used and available at the data analyzer | 227 | // Check if this channel is used and available at the data analyzer |
| 211 | - if (((mode == Dso::CHANNELMODE_VOLTAGE) ? settings->voltage[channel].used | ||
| 212 | - : settings->spectrum[channel].used) && | ||
| 213 | - result->data(channel) && !result->data(channel)->voltage.sample.empty()) { | ||
| 214 | - // Check if the sample count has changed | ||
| 215 | - size_t sampleCount = (mode == Dso::CHANNELMODE_VOLTAGE) | ||
| 216 | - ? result->data(channel)->voltage.sample.size() | ||
| 217 | - : result->data(channel)->spectrum.sample.size(); | ||
| 218 | - if (mode == Dso::CHANNELMODE_VOLTAGE) sampleCount -= (swTriggerStart - preTrigSamples); | ||
| 219 | - size_t neededSize = sampleCount * 2; | 228 | + if (samples.sample.empty()) { |
| 229 | + // Delete all vector arrays | ||
| 230 | + for (unsigned index = 0; index < digitalPhosphorDepth; ++index) | ||
| 231 | + withHistory[index].clear(); | ||
| 232 | + continue; | ||
| 233 | + } | ||
| 234 | + // Check if the sample count has changed | ||
| 235 | + size_t sampleCount = samples.sample.size(); | ||
| 236 | + if (sampleCount>9000) { | ||
| 237 | + throw new std::runtime_error(""); | ||
| 238 | + } | ||
| 239 | + if (mode == Dso::CHANNELMODE_VOLTAGE) | ||
| 240 | + sampleCount -= (swTriggerStart - preTrigSamples); | ||
| 241 | + size_t neededSize = sampleCount * 2; | ||
| 220 | 242 | ||
| 221 | #if 0 | 243 | #if 0 |
| 222 | - for(unsigned int index = 0; index < digitalPhosphorDepth; ++index) { | ||
| 223 | - if(vaChannel[mode][channel][index].size() != neededSize) | ||
| 224 | - vaChannel[mode][channel][index].clear(); // Something was changed, drop old traces | ||
| 225 | - } | 244 | + for(unsigned int index = 0; index < digitalPhosphorDepth; ++index) { |
| 245 | + if(vaChannel[mode][channel][index].size() != neededSize) | ||
| 246 | + vaChannel[mode][channel][index].clear(); // Something was changed, drop old traces | ||
| 247 | + } | ||
| 226 | #endif | 248 | #endif |
| 227 | 249 | ||
| 228 | - // Set size directly to avoid reallocations | ||
| 229 | - vaChannel[mode][(size_t)channel].front().resize(neededSize); | ||
| 230 | - | ||
| 231 | - // Iterator to data for direct access | ||
| 232 | - std::vector<GLfloat>::iterator glIterator = vaChannel[mode][(size_t)channel].front().begin(); | ||
| 233 | - | ||
| 234 | - // What's the horizontal distance between sampling points? | ||
| 235 | - double horizontalFactor; | ||
| 236 | - if (mode == Dso::CHANNELMODE_VOLTAGE) | ||
| 237 | - horizontalFactor = result->data(channel)->voltage.interval / settings->horizontal.timebase; | ||
| 238 | - else | ||
| 239 | - horizontalFactor = | ||
| 240 | - result->data(channel)->spectrum.interval / settings->horizontal.frequencybase; | ||
| 241 | - | ||
| 242 | - // Fill vector array | ||
| 243 | - if (mode == Dso::CHANNELMODE_VOLTAGE) { | ||
| 244 | - std::vector<double>::const_iterator dataIterator = | ||
| 245 | - result->data(channel)->voltage.sample.begin(); | ||
| 246 | - const double gain = settings->voltage[channel].gain; | ||
| 247 | - const double offset = settings->voltage[channel].offset; | ||
| 248 | - const double invert = settings->voltage[channel].inverted ? -1.0 : 1.0; | ||
| 249 | - | ||
| 250 | - std::advance(dataIterator, swTriggerStart - preTrigSamples); | ||
| 251 | - | ||
| 252 | - for (unsigned int position = 0; position < sampleCount; ++position) { | ||
| 253 | - *(glIterator++) = position * horizontalFactor - DIVS_TIME / 2; | ||
| 254 | - *(glIterator++) = *(dataIterator++) / gain * invert + offset; | ||
| 255 | - } | ||
| 256 | - } else { | ||
| 257 | - std::vector<double>::const_iterator dataIterator = | ||
| 258 | - result->data(channel)->spectrum.sample.begin(); | ||
| 259 | - const double magnitude = settings->spectrum[channel].magnitude; | ||
| 260 | - const double offset = settings->spectrum[channel].offset; | ||
| 261 | - | ||
| 262 | - for (unsigned int position = 0; position < sampleCount; ++position) { | ||
| 263 | - *(glIterator++) = position * horizontalFactor - DIVS_TIME / 2; | ||
| 264 | - *(glIterator++) = *(dataIterator++) / magnitude + offset; | ||
| 265 | - } | 250 | + // Set size directly to avoid reallocations |
| 251 | + withHistory.front().resize(neededSize); | ||
| 252 | + | ||
| 253 | + // Iterator to data for direct access | ||
| 254 | + DrawLines::iterator glIterator = withHistory.front().begin(); | ||
| 255 | + | ||
| 256 | + // What's the horizontal distance between sampling points? | ||
| 257 | + float horizontalFactor; | ||
| 258 | + if (mode == Dso::CHANNELMODE_VOLTAGE) | ||
| 259 | + horizontalFactor = (float)(samples.interval / settings->horizontal.timebase); | ||
| 260 | + else | ||
| 261 | + horizontalFactor = (float)(samples.interval / settings->horizontal.frequencybase); | ||
| 262 | + | ||
| 263 | + // Fill vector array | ||
| 264 | + if (mode == Dso::CHANNELMODE_VOLTAGE) { | ||
| 265 | + std::vector<double>::const_iterator dataIterator = samples.sample.begin(); | ||
| 266 | + const float gain = (float) settings->voltage[channel].gain; | ||
| 267 | + const float offset = (float) settings->voltage[channel].offset; | ||
| 268 | + const float invert = settings->voltage[channel].inverted ? -1.0f : 1.0f; | ||
| 269 | + | ||
| 270 | + std::advance(dataIterator, swTriggerStart - preTrigSamples); | ||
| 271 | + | ||
| 272 | + for (unsigned int position = 0; position < sampleCount; ++position) { | ||
| 273 | + *(glIterator++) = position * horizontalFactor - DIVS_TIME / 2; | ||
| 274 | + *(glIterator++) = (float)*(dataIterator++) / gain * invert + offset; | ||
| 266 | } | 275 | } |
| 267 | } else { | 276 | } else { |
| 268 | - // Delete all vector arrays | ||
| 269 | - for (unsigned index = 0; index < (unsigned)digitalPhosphorDepth; ++index) | ||
| 270 | - vaChannel[mode][channel][index].clear(); | 277 | + std::vector<double>::const_iterator dataIterator = samples.sample.begin(); |
| 278 | + const float magnitude = (float)settings->spectrum[channel].magnitude; | ||
| 279 | + const float offset = (float)settings->spectrum[channel].offset; | ||
| 280 | + | ||
| 281 | + for (unsigned int position = 0; position < sampleCount; ++position) { | ||
| 282 | + *(glIterator++) = position * horizontalFactor - DIVS_TIME / 2; | ||
| 283 | + *(glIterator++) = (float)*(dataIterator++) / magnitude + offset; | ||
| 284 | + } | ||
| 271 | } | 285 | } |
| 272 | } | 286 | } |
| 273 | } | 287 | } |
| 274 | break; | 288 | break; |
| 275 | 289 | ||
| 276 | case Dso::GRAPHFORMAT_XY: | 290 | case Dso::GRAPHFORMAT_XY: |
| 277 | - for (int channel = 0; channel < settings->voltage.size(); ++channel) { | 291 | + for (unsigned channel = 0; channel < settings->voltage.size(); ++channel) { |
| 278 | // For even channel numbers check if this channel is used and this and the | 292 | // For even channel numbers check if this channel is used and this and the |
| 279 | // following channel are available at the data analyzer | 293 | // following channel are available at the data analyzer |
| 280 | if (channel % 2 == 0 && channel + 1 < settings->voltage.size() && settings->voltage[channel].used && | 294 | if (channel % 2 == 0 && channel + 1 < settings->voltage.size() && settings->voltage[channel].used && |
| 281 | result->data(channel) && !result->data(channel)->voltage.sample.empty() && result->data(channel + 1) && | 295 | result->data(channel) && !result->data(channel)->voltage.sample.empty() && result->data(channel + 1) && |
| 282 | !result->data(channel + 1)->voltage.sample.empty()) { | 296 | !result->data(channel + 1)->voltage.sample.empty()) { |
| 283 | // Check if the sample count has changed | 297 | // Check if the sample count has changed |
| 284 | - const unsigned sampleCount = qMin(result->data(channel)->voltage.sample.size(), | 298 | + const size_t sampleCount = std::min(result->data(channel)->voltage.sample.size(), |
| 285 | result->data(channel + 1)->voltage.sample.size()); | 299 | result->data(channel + 1)->voltage.sample.size()); |
| 286 | - const unsigned neededSize = sampleCount * 2; | ||
| 287 | - for (unsigned index = 0; index < (unsigned)digitalPhosphorDepth; ++index) { | ||
| 288 | - if (vaChannel[Dso::CHANNELMODE_VOLTAGE][(size_t)channel][index].size() != neededSize) | ||
| 289 | - vaChannel[Dso::CHANNELMODE_VOLTAGE][(size_t)channel][index] | ||
| 290 | - .clear(); // Something was changed, drop old traces | 300 | + const size_t neededSize = sampleCount * 2; |
| 301 | + DrawLinesWithHistory& withHistory = vaChannel[Dso::CHANNELMODE_VOLTAGE][(size_t)channel]; | ||
| 302 | + for (unsigned index = 0; index < digitalPhosphorDepth; ++index) { | ||
| 303 | + if (withHistory[index].size() != neededSize) | ||
| 304 | + withHistory[index].clear(); // Something was changed, drop old traces | ||
| 291 | } | 305 | } |
| 292 | 306 | ||
| 293 | // Set size directly to avoid reallocations | 307 | // Set size directly to avoid reallocations |
| 294 | - vaChannel[Dso::CHANNELMODE_VOLTAGE][(size_t)channel].front().resize(neededSize); | 308 | + DrawLines& drawLines = withHistory.front(); |
| 309 | + drawLines.resize(neededSize); | ||
| 295 | 310 | ||
| 296 | // Iterator to data for direct access | 311 | // Iterator to data for direct access |
| 297 | - std::vector<GLfloat>::iterator glIterator = | ||
| 298 | - vaChannel[Dso::CHANNELMODE_VOLTAGE][channel].front().begin(); | 312 | + std::vector<GLfloat>::iterator glIterator = drawLines.begin(); |
| 299 | 313 | ||
| 300 | // Fill vector array | 314 | // Fill vector array |
| 301 | unsigned int xChannel = channel; | 315 | unsigned int xChannel = channel; |
| @@ -310,8 +324,8 @@ void GlGenerator::generateGraphs(const DataAnalyzerResult *result) { | @@ -310,8 +324,8 @@ void GlGenerator::generateGraphs(const DataAnalyzerResult *result) { | ||
| 310 | const double yInvert = settings->voltage[yChannel].inverted ? -1.0 : 1.0; | 324 | const double yInvert = settings->voltage[yChannel].inverted ? -1.0 : 1.0; |
| 311 | 325 | ||
| 312 | for (unsigned int position = 0; position < sampleCount; ++position) { | 326 | for (unsigned int position = 0; position < sampleCount; ++position) { |
| 313 | - *(glIterator++) = *(xIterator++) / xGain * xInvert + xOffset; | ||
| 314 | - *(glIterator++) = *(yIterator++) / yGain * yInvert + yOffset; | 327 | + *(glIterator++) = (GLfloat)( *(xIterator++) / xGain * xInvert + xOffset); |
| 328 | + *(glIterator++) = (GLfloat)( *(yIterator++) / yGain * yInvert + yOffset); | ||
| 315 | } | 329 | } |
| 316 | } else { | 330 | } else { |
| 317 | // Delete all vector arrays | 331 | // Delete all vector arrays |
openhantek/src/glgenerator.h
| @@ -41,6 +41,8 @@ class GlGenerator : public QObject { | @@ -41,6 +41,8 @@ class GlGenerator : public QObject { | ||
| 41 | DsoSettingsView *view; | 41 | DsoSettingsView *view; |
| 42 | std::vector<GLfloat> vaGrid[3]; | 42 | std::vector<GLfloat> vaGrid[3]; |
| 43 | bool ready = false; | 43 | bool ready = false; |
| 44 | + | ||
| 45 | + const SampleValues &useSamplesOf(int mode, unsigned channel, const DataAnalyzerResult *result) const; | ||
| 44 | signals: | 46 | signals: |
| 45 | void graphsGenerated(); ///< The graphs are ready to be drawn | 47 | void graphsGenerated(); ///< The graphs are ready to be drawn |
| 46 | }; | 48 | }; |
openhantek/src/glscope.h
| @@ -13,8 +13,6 @@ using GL_WIDGET_CLASS = QOpenGLWidget; | @@ -13,8 +13,6 @@ using GL_WIDGET_CLASS = QOpenGLWidget; | ||
| 13 | using GL_WIDGET_CLASS = QGLWidget; | 13 | using GL_WIDGET_CLASS = QGLWidget; |
| 14 | #endif | 14 | #endif |
| 15 | 15 | ||
| 16 | -#include "definitions.h" | ||
| 17 | - | ||
| 18 | class GlGenerator; | 16 | class GlGenerator; |
| 19 | class DsoSettings; | 17 | class DsoSettings; |
| 20 | 18 |
openhantek/src/hantekdso/controlsettings.cpp
| 1 | #include "controlsettings.h" | 1 | #include "controlsettings.h" |
| 2 | -#include "definitions.h" | ||
| 3 | 2 | ||
| 4 | namespace Hantek { | 3 | namespace Hantek { |
| 5 | 4 | ||
| 6 | -ControlSettings::ControlSettings(ControlSamplerateLimits* limits) | 5 | +ControlSettings::ControlSettings(ControlSamplerateLimits* limits, size_t channelCount) |
| 7 | { | 6 | { |
| 8 | samplerate.limits = limits; | 7 | samplerate.limits = limits; |
| 9 | - trigger.level.resize(HANTEK_CHANNELS); | ||
| 10 | - voltage.resize(HANTEK_CHANNELS); | ||
| 11 | - for (unsigned channel = 0; channel < HANTEK_CHANNELS; ++channel) { | 8 | + trigger.level.resize(channelCount); |
| 9 | + voltage.resize(channelCount); | ||
| 10 | + for (unsigned channel = 0; channel < channelCount; ++channel) { | ||
| 12 | trigger.level[channel] = 0.0; | 11 | trigger.level[channel] = 0.0; |
| 13 | voltage[channel].gain = 0; | 12 | voltage[channel].gain = 0; |
| 14 | voltage[channel].offset = 0.0; | 13 | voltage[channel].offset = 0.0; |
openhantek/src/hantekdso/controlsettings.h
| @@ -52,12 +52,12 @@ struct ControlSettingsVoltage { | @@ -52,12 +52,12 @@ struct ControlSettingsVoltage { | ||
| 52 | /// \struct ControlSettings hantek/control.h | 52 | /// \struct ControlSettings hantek/control.h |
| 53 | /// \brief Stores the current settings of the device. | 53 | /// \brief Stores the current settings of the device. |
| 54 | struct ControlSettings { | 54 | struct ControlSettings { |
| 55 | - ControlSettings(ControlSamplerateLimits *limits); | 55 | + ControlSettings(ControlSamplerateLimits *limits, size_t channelCount); |
| 56 | ControlSettingsSamplerate samplerate; ///< The samplerate settings | 56 | ControlSettingsSamplerate samplerate; ///< The samplerate settings |
| 57 | std::vector<ControlSettingsVoltage> voltage; ///< The amplification settings | 57 | std::vector<ControlSettingsVoltage> voltage; ///< The amplification settings |
| 58 | ControlSettingsTrigger trigger; ///< The trigger settings | 58 | ControlSettingsTrigger trigger; ///< The trigger settings |
| 59 | - unsigned int recordLengthId = 1; ///< The id in the record length array | ||
| 60 | - unsigned short int usedChannels = 0; ///< Number of activated channels | 59 | + unsigned recordLengthId = 1; ///< The id in the record length array |
| 60 | + unsigned usedChannels = 0; ///< Number of activated channels | ||
| 61 | }; | 61 | }; |
| 62 | 62 | ||
| 63 | } | 63 | } |
openhantek/src/hantekdso/controlspecification.cpp deleted
openhantek/src/hantekdso/controlspecification.h
| @@ -2,10 +2,10 @@ | @@ -2,10 +2,10 @@ | ||
| 2 | 2 | ||
| 3 | #pragma once | 3 | #pragma once |
| 4 | 4 | ||
| 5 | -#include "controlvalue.h" | ||
| 6 | -#include "bulkcode.h" | ||
| 7 | -#include "controlcode.h" | ||
| 8 | -#include "definitions.h" | 5 | +#include "hantekprotocol/controlvalue.h" |
| 6 | +#include "hantekprotocol/bulkcode.h" | ||
| 7 | +#include "hantekprotocol/controlcode.h" | ||
| 8 | +#include "hantekprotocol/definitions.h" | ||
| 9 | #include <QList> | 9 | #include <QList> |
| 10 | 10 | ||
| 11 | namespace Hantek { | 11 | namespace Hantek { |
| @@ -71,7 +71,6 @@ struct ControlSpecificationSamplerate { | @@ -71,7 +71,6 @@ struct ControlSpecificationSamplerate { | ||
| 71 | /// \struct ControlSpecification hantek/control.h | 71 | /// \struct ControlSpecification hantek/control.h |
| 72 | /// \brief Stores the specifications of the currently connected device. | 72 | /// \brief Stores the specifications of the currently connected device. |
| 73 | struct ControlSpecification { | 73 | struct ControlSpecification { |
| 74 | - ControlSpecification() noexcept; | ||
| 75 | // Interface | 74 | // Interface |
| 76 | ControlSpecificationCommands command; ///< The commands for this device | 75 | ControlSpecificationCommands command; ///< The commands for this device |
| 77 | 76 |
openhantek/src/hantekdso/hantekdsocontrol.cpp
| @@ -12,7 +12,8 @@ | @@ -12,7 +12,8 @@ | ||
| 12 | #include <QTimer> | 12 | #include <QTimer> |
| 13 | 13 | ||
| 14 | #include "hantekdsocontrol.h" | 14 | #include "hantekdsocontrol.h" |
| 15 | - | 15 | +#include "hantekprotocol/bulkStructs.h" |
| 16 | +#include "hantekprotocol/controlStructs.h" | ||
| 16 | #include "models/modelDSO6022.h" | 17 | #include "models/modelDSO6022.h" |
| 17 | #include "usb/usbdevice.h" | 18 | #include "usb/usbdevice.h" |
| 18 | #include "utils/printutils.h" | 19 | #include "utils/printutils.h" |
| @@ -54,7 +55,7 @@ USBDevice *HantekDsoControl::getDevice() { return device; } | @@ -54,7 +55,7 @@ USBDevice *HantekDsoControl::getDevice() { return device; } | ||
| 54 | const DSOsamples &HantekDsoControl::getLastSamples() { return result; } | 55 | const DSOsamples &HantekDsoControl::getLastSamples() { return result; } |
| 55 | 56 | ||
| 56 | HantekDsoControl::HantekDsoControl(USBDevice *device) : device(device), | 57 | HantekDsoControl::HantekDsoControl(USBDevice *device) : device(device), |
| 57 | - specification(device->getModel()->specification), controlsettings(&(specification.samplerate.single)) { | 58 | + specification(device->getModel()->specification), controlsettings(&(specification.samplerate.single), HANTEK_CHANNELS) { |
| 58 | if (device == nullptr) throw new std::runtime_error("No usb device for HantekDsoControl"); | 59 | if (device == nullptr) throw new std::runtime_error("No usb device for HantekDsoControl"); |
| 59 | 60 | ||
| 60 | // Transmission-ready control commands | 61 | // Transmission-ready control commands |
| @@ -123,7 +124,7 @@ bool HantekDsoControl::isFastRate() const { | @@ -123,7 +124,7 @@ bool HantekDsoControl::isFastRate() const { | ||
| 123 | return controlsettings.samplerate.limits == &specification.samplerate.multi; | 124 | return controlsettings.samplerate.limits == &specification.samplerate.multi; |
| 124 | } | 125 | } |
| 125 | 126 | ||
| 126 | -int HantekDsoControl::getRecordLength() const { | 127 | +unsigned HantekDsoControl::getRecordLength() const { |
| 127 | return controlsettings.samplerate.limits->recordLengths[controlsettings.recordLengthId]; | 128 | return controlsettings.samplerate.limits->recordLengths[controlsettings.recordLengthId]; |
| 128 | } | 129 | } |
| 129 | 130 | ||
| @@ -238,7 +239,7 @@ void HantekDsoControl::convertRawDataToSamples(const std::vector<unsigned char> | @@ -238,7 +239,7 @@ void HantekDsoControl::convertRawDataToSamples(const std::vector<unsigned char> | ||
| 238 | // Resize sample vector | 239 | // Resize sample vector |
| 239 | result.data[channel].resize(totalSampleCount); | 240 | result.data[channel].resize(totalSampleCount); |
| 240 | 241 | ||
| 241 | - const int gainID = (int)controlsettings.voltage[channel].gain; | 242 | + const unsigned gainID = controlsettings.voltage[channel].gain; |
| 242 | const unsigned short limit = specification.voltageLimit[channel][gainID]; | 243 | const unsigned short limit = specification.voltageLimit[channel][gainID]; |
| 243 | const double offset = controlsettings.voltage[channel].offsetReal; | 244 | const double offset = controlsettings.voltage[channel].offsetReal; |
| 244 | const double gainStep = specification.gainSteps[gainID]; | 245 | const double gainStep = specification.gainSteps[gainID]; |
| @@ -271,7 +272,7 @@ void HantekDsoControl::convertRawDataToSamples(const std::vector<unsigned char> | @@ -271,7 +272,7 @@ void HantekDsoControl::convertRawDataToSamples(const std::vector<unsigned char> | ||
| 271 | for (unsigned channel = 0; channel < HANTEK_CHANNELS; ++channel) { | 272 | for (unsigned channel = 0; channel < HANTEK_CHANNELS; ++channel) { |
| 272 | result.data[channel].resize(totalSampleCount / HANTEK_CHANNELS); | 273 | result.data[channel].resize(totalSampleCount / HANTEK_CHANNELS); |
| 273 | 274 | ||
| 274 | - const int gainID = controlsettings.voltage[channel].gain; | 275 | + const unsigned gainID = controlsettings.voltage[channel].gain; |
| 275 | const unsigned short limit = specification.voltageLimit[channel][gainID]; | 276 | const unsigned short limit = specification.voltageLimit[channel][gainID]; |
| 276 | const double offset = controlsettings.voltage[channel].offsetReal; | 277 | const double offset = controlsettings.voltage[channel].offsetReal; |
| 277 | const double gainStep = specification.gainSteps[gainID]; | 278 | const double gainStep = specification.gainSteps[gainID]; |
| @@ -335,8 +336,7 @@ double HantekDsoControl::getBestSamplerate(double samplerate, bool fastRate, boo | @@ -335,8 +336,7 @@ double HantekDsoControl::getBestSamplerate(double samplerate, bool fastRate, boo | ||
| 335 | limits = &(specification.samplerate.single); | 336 | limits = &(specification.samplerate.single); |
| 336 | 337 | ||
| 337 | // Get downsampling factor that would provide the requested rate | 338 | // Get downsampling factor that would provide the requested rate |
| 338 | - double bestDownsampler = | ||
| 339 | - (double)limits->base / specification.bufferDividers[controlsettings.recordLengthId] / samplerate; | 339 | + double bestDownsampler = limits->base / specification.bufferDividers[controlsettings.recordLengthId] / samplerate; |
| 340 | // Base samplerate sufficient, or is the maximum better? | 340 | // Base samplerate sufficient, or is the maximum better? |
| 341 | if (bestDownsampler < 1.0 && | 341 | if (bestDownsampler < 1.0 && |
| 342 | (samplerate <= limits->max / specification.bufferDividers[controlsettings.recordLengthId] || !maximum)) { | 342 | (samplerate <= limits->max / specification.bufferDividers[controlsettings.recordLengthId] || !maximum)) { |
| @@ -407,6 +407,7 @@ double HantekDsoControl::getBestSamplerate(double samplerate, bool fastRate, boo | @@ -407,6 +407,7 @@ double HantekDsoControl::getBestSamplerate(double samplerate, bool fastRate, boo | ||
| 407 | 407 | ||
| 408 | unsigned HantekDsoControl::getSampleCount() const { | 408 | unsigned HantekDsoControl::getSampleCount() const { |
| 409 | if (isRollMode()) { | 409 | if (isRollMode()) { |
| 410 | + // TODO handle libusb error | ||
| 410 | return device->getPacketSize(); | 411 | return device->getPacketSize(); |
| 411 | } else { | 412 | } else { |
| 412 | if (isFastRate()) | 413 | if (isFastRate()) |
| @@ -716,7 +717,7 @@ Dso::ErrorCode HantekDsoControl::setRecordTime(double duration) { | @@ -716,7 +717,7 @@ Dso::ErrorCode HantekDsoControl::setRecordTime(double duration) { | ||
| 716 | // Better add some margin for our SW trigger | 717 | // Better add some margin for our SW trigger |
| 717 | unsigned sampleMargin = 2000; | 718 | unsigned sampleMargin = 2000; |
| 718 | unsigned sampleCount = 10240; | 719 | unsigned sampleCount = 10240; |
| 719 | - int bestId = 0; | 720 | + unsigned bestId = 0; |
| 720 | unsigned sampleId; | 721 | unsigned sampleId; |
| 721 | for (sampleId = 0; sampleId < specification.sampleSteps.size(); ++sampleId) { | 722 | for (sampleId = 0; sampleId < specification.sampleSteps.size(); ++sampleId) { |
| 722 | if (specification.sampleSteps[sampleId] * duration < (sampleCount - sampleMargin)) bestId = sampleId; | 723 | if (specification.sampleSteps[sampleId] * duration < (sampleCount - sampleMargin)) bestId = sampleId; |
| @@ -746,8 +747,8 @@ Dso::ErrorCode HantekDsoControl::setChannelUsed(unsigned channel, bool used) { | @@ -746,8 +747,8 @@ Dso::ErrorCode HantekDsoControl::setChannelUsed(unsigned channel, bool used) { | ||
| 746 | // Update settings | 747 | // Update settings |
| 747 | controlsettings.voltage[channel].used = used; | 748 | controlsettings.voltage[channel].used = used; |
| 748 | unsigned channelCount = 0; | 749 | unsigned channelCount = 0; |
| 749 | - for (int channelCounter = 0; channelCounter < HANTEK_CHANNELS; ++channelCounter) { | ||
| 750 | - if (controlsettings.voltage[channelCounter].used) ++channelCount; | 750 | + for (unsigned c = 0; c < HANTEK_CHANNELS; ++c) { |
| 751 | + if (controlsettings.voltage[c].used) ++channelCount; | ||
| 751 | } | 752 | } |
| 752 | 753 | ||
| 753 | // Calculate the UsedChannels field for the command | 754 | // Calculate the UsedChannels field for the command |
| @@ -974,9 +975,9 @@ Dso::ErrorCode HantekDsoControl::setTriggerLevel(unsigned channel, double level) | @@ -974,9 +975,9 @@ Dso::ErrorCode HantekDsoControl::setTriggerLevel(unsigned channel, double level) | ||
| 974 | if (specification.sampleSize > 8) { | 975 | if (specification.sampleSize > 8) { |
| 975 | Offset& offsetLimit = specification.offsetLimit[channel].step[controlsettings.voltage[channel].gain]; | 976 | Offset& offsetLimit = specification.offsetLimit[channel].step[controlsettings.voltage[channel].gain]; |
| 976 | // The range is the same as used for the offsets for 10 bit models | 977 | // The range is the same as used for the offsets for 10 bit models |
| 977 | - minimum = ((unsigned short int)*((unsigned char *)&(offsetLimit.start)) << 8) + | 978 | + minimum = ((unsigned short)*((unsigned char *)&(offsetLimit.start)) << 8) + |
| 978 | *((unsigned char *)&(offsetLimit.start) + 1); | 979 | *((unsigned char *)&(offsetLimit.start) + 1); |
| 979 | - maximum = ((unsigned short int)*((unsigned char *)&(offsetLimit.end)) << 8) + | 980 | + maximum = ((unsigned short)*((unsigned char *)&(offsetLimit.end)) << 8) + |
| 980 | *((unsigned char *)&(offsetLimit.end) + 1); | 981 | *((unsigned char *)&(offsetLimit.end) + 1); |
| 981 | } else { | 982 | } else { |
| 982 | // It's from 0x00 to 0xfd for the 8 bit models | 983 | // It's from 0x00 to 0xfd for the 8 bit models |
| @@ -1047,7 +1048,7 @@ Dso::ErrorCode HantekDsoControl::setPretriggerPosition(double position) { | @@ -1047,7 +1048,7 @@ Dso::ErrorCode HantekDsoControl::setPretriggerPosition(double position) { | ||
| 1047 | if (!device->isConnected()) return Dso::ErrorCode::CONNECTION; | 1048 | if (!device->isConnected()) return Dso::ErrorCode::CONNECTION; |
| 1048 | 1049 | ||
| 1049 | // All trigger positions are measured in samples | 1050 | // All trigger positions are measured in samples |
| 1050 | - unsigned positionSamples = position * controlsettings.samplerate.current; | 1051 | + double positionSamples = position * controlsettings.samplerate.current; |
| 1051 | unsigned recordLength = getRecordLength(); | 1052 | unsigned recordLength = getRecordLength(); |
| 1052 | // Fast rate mode uses both channels | 1053 | // Fast rate mode uses both channels |
| 1053 | if (controlsettings.samplerate.limits == &specification.samplerate.multi) positionSamples /= HANTEK_CHANNELS; | 1054 | if (controlsettings.samplerate.limits == &specification.samplerate.multi) positionSamples /= HANTEK_CHANNELS; |
| @@ -1055,7 +1056,7 @@ Dso::ErrorCode HantekDsoControl::setPretriggerPosition(double position) { | @@ -1055,7 +1056,7 @@ Dso::ErrorCode HantekDsoControl::setPretriggerPosition(double position) { | ||
| 1055 | switch (specification.command.bulk.setPretrigger) { | 1056 | switch (specification.command.bulk.setPretrigger) { |
| 1056 | case BULK_SETTRIGGERANDSAMPLERATE: { | 1057 | case BULK_SETTRIGGERANDSAMPLERATE: { |
| 1057 | // Calculate the position value (Start point depending on record length) | 1058 | // Calculate the position value (Start point depending on record length) |
| 1058 | - unsigned position = isRollMode() ? 0x1 : 0x7ffff - recordLength + positionSamples; | 1059 | + unsigned position = isRollMode() ? 0x1 : 0x7ffff - recordLength + (unsigned)positionSamples; |
| 1059 | 1060 | ||
| 1060 | // SetTriggerAndSamplerate bulk command for trigger position | 1061 | // SetTriggerAndSamplerate bulk command for trigger position |
| 1061 | static_cast<BulkSetTriggerAndSamplerate *>(command[BULK_SETTRIGGERANDSAMPLERATE])->setTriggerPosition(position); | 1062 | static_cast<BulkSetTriggerAndSamplerate *>(command[BULK_SETTRIGGERANDSAMPLERATE])->setTriggerPosition(position); |
| @@ -1065,8 +1066,8 @@ Dso::ErrorCode HantekDsoControl::setPretriggerPosition(double position) { | @@ -1065,8 +1066,8 @@ Dso::ErrorCode HantekDsoControl::setPretriggerPosition(double position) { | ||
| 1065 | } | 1066 | } |
| 1066 | case BULK_FSETBUFFER: { | 1067 | case BULK_FSETBUFFER: { |
| 1067 | // Calculate the position values (Inverse, maximum is 0x7ffff) | 1068 | // Calculate the position values (Inverse, maximum is 0x7ffff) |
| 1068 | - unsigned positionPre = 0x7ffff - recordLength + positionSamples; | ||
| 1069 | - unsigned positionPost = 0x7ffff - positionSamples; | 1069 | + unsigned positionPre = 0x7ffff - recordLength + (unsigned)positionSamples; |
| 1070 | + unsigned positionPost = 0x7ffff - (unsigned)positionSamples; | ||
| 1070 | 1071 | ||
| 1071 | // SetBuffer2250 bulk command for trigger position | 1072 | // SetBuffer2250 bulk command for trigger position |
| 1072 | BulkSetBuffer2250 *commandSetBuffer2250 = static_cast<BulkSetBuffer2250 *>(command[BULK_FSETBUFFER]); | 1073 | BulkSetBuffer2250 *commandSetBuffer2250 = static_cast<BulkSetBuffer2250 *>(command[BULK_FSETBUFFER]); |
| @@ -1078,13 +1079,13 @@ Dso::ErrorCode HantekDsoControl::setPretriggerPosition(double position) { | @@ -1078,13 +1079,13 @@ Dso::ErrorCode HantekDsoControl::setPretriggerPosition(double position) { | ||
| 1078 | } | 1079 | } |
| 1079 | case BULK_ESETTRIGGERORSAMPLERATE: { | 1080 | case BULK_ESETTRIGGERORSAMPLERATE: { |
| 1080 | // Calculate the position values (Inverse, maximum is 0xffff) | 1081 | // Calculate the position values (Inverse, maximum is 0xffff) |
| 1081 | - unsigned short int positionPre = 0xffff - recordLength + positionSamples; | ||
| 1082 | - unsigned short int positionPost = 0xffff - positionSamples; | 1082 | + unsigned positionPre = 0xffff - recordLength + (unsigned)positionSamples; |
| 1083 | + unsigned positionPost = 0xffff - (unsigned)positionSamples; | ||
| 1083 | 1084 | ||
| 1084 | // SetBuffer5200 bulk command for trigger position | 1085 | // SetBuffer5200 bulk command for trigger position |
| 1085 | BulkSetBuffer5200 *commandSetBuffer5200 = static_cast<BulkSetBuffer5200 *>(command[BULK_DSETBUFFER]); | 1086 | BulkSetBuffer5200 *commandSetBuffer5200 = static_cast<BulkSetBuffer5200 *>(command[BULK_DSETBUFFER]); |
| 1086 | - commandSetBuffer5200->setTriggerPositionPre(positionPre); | ||
| 1087 | - commandSetBuffer5200->setTriggerPositionPost(positionPost); | 1087 | + commandSetBuffer5200->setTriggerPositionPre((unsigned short)positionPre); |
| 1088 | + commandSetBuffer5200->setTriggerPositionPost((unsigned short)positionPost); | ||
| 1088 | commandPending[BULK_DSETBUFFER] = true; | 1089 | commandPending[BULK_DSETBUFFER] = true; |
| 1089 | 1090 | ||
| 1090 | break; | 1091 | break; |
| @@ -1297,7 +1298,7 @@ void HantekDsoControl::run() { | @@ -1297,7 +1298,7 @@ void HantekDsoControl::run() { | ||
| 1297 | this->_samplingStarted = false; | 1298 | this->_samplingStarted = false; |
| 1298 | 1299 | ||
| 1299 | // Start next capture if necessary by leaving out the break statement | 1300 | // Start next capture if necessary by leaving out the break statement |
| 1300 | - if (!this->sampling) break; | 1301 | + if (!this->sampling) break; else [[fallthrough]]; |
| 1301 | 1302 | ||
| 1302 | case CAPTURE_WAITING: | 1303 | case CAPTURE_WAITING: |
| 1303 | // Sampling hasn't started, update the expected sample count | 1304 | // Sampling hasn't started, update the expected sample count |
| @@ -1351,7 +1352,7 @@ void HantekDsoControl::run() { | @@ -1351,7 +1352,7 @@ void HantekDsoControl::run() { | ||
| 1351 | 1352 | ||
| 1352 | this->_samplingStarted = true; | 1353 | this->_samplingStarted = true; |
| 1353 | this->cycleCounter = 0; | 1354 | this->cycleCounter = 0; |
| 1354 | - this->startCycle = controlsettings.trigger.position * 1000 / cycleTime + 1; | 1355 | + this->startCycle = int(controlsettings.trigger.position * 1000.0 / cycleTime + 1.0); |
| 1355 | this->lastTriggerMode = controlsettings.trigger.mode; | 1356 | this->lastTriggerMode = controlsettings.trigger.mode; |
| 1356 | break; | 1357 | break; |
| 1357 | 1358 |
openhantek/src/hantekdso/hantekdsocontrol.h
| @@ -3,8 +3,6 @@ | @@ -3,8 +3,6 @@ | ||
| 3 | #pragma once | 3 | #pragma once |
| 4 | 4 | ||
| 5 | #include "errorcodes.h" | 5 | #include "errorcodes.h" |
| 6 | -#include "bulkStructs.h" | ||
| 7 | -#include "controlStructs.h" | ||
| 8 | #include "dsosamples.h" | 6 | #include "dsosamples.h" |
| 9 | #include "states.h" | 7 | #include "states.h" |
| 10 | #include "controlspecification.h" | 8 | #include "controlspecification.h" |
| @@ -88,7 +86,7 @@ class HantekDsoControl : public QObject { | @@ -88,7 +86,7 @@ class HantekDsoControl : public QObject { | ||
| 88 | private: | 86 | private: |
| 89 | bool isRollMode() const; | 87 | bool isRollMode() const; |
| 90 | bool isFastRate() const; | 88 | bool isFastRate() const; |
| 91 | - int getRecordLength() const; | 89 | + unsigned getRecordLength() const; |
| 92 | 90 | ||
| 93 | Dso::ErrorCode retrieveChannelLevelData(); | 91 | Dso::ErrorCode retrieveChannelLevelData(); |
| 94 | 92 |
openhantek/src/hantekdso/models/modelDSO2090.cpp
openhantek/src/hantekdso/models/modelDSO2090.h
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | #include "dsomodel.h" | 3 | #include "dsomodel.h" |
| 4 | -#include "hantekdsocontrol.h" | ||
| 5 | -#include "bulkStructs.h" | ||
| 6 | 4 | ||
| 5 | +class HantekDsoControl; | ||
| 7 | using namespace Hantek; | 6 | using namespace Hantek; |
| 8 | 7 | ||
| 9 | struct ModelDSO2090 : public DSOModel { | 8 | struct ModelDSO2090 : public DSOModel { |
openhantek/src/hantekdso/models/modelDSO2150.cpp
openhantek/src/hantekdso/models/modelDSO2150.h
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | #include "dsomodel.h" | 3 | #include "dsomodel.h" |
| 4 | -#include "hantekdsocontrol.h" | ||
| 5 | -#include "bulkStructs.h" | ||
| 6 | 4 | ||
| 5 | +class HantekDsoControl; | ||
| 7 | using namespace Hantek; | 6 | using namespace Hantek; |
| 8 | 7 | ||
| 9 | struct ModelDSO2150 : public DSOModel { | 8 | struct ModelDSO2150 : public DSOModel { |
openhantek/src/hantekdso/models/modelDSO2250.cpp
openhantek/src/hantekdso/models/modelDSO2250.h
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | #include "dsomodel.h" | 3 | #include "dsomodel.h" |
| 4 | -#include "hantekdsocontrol.h" | ||
| 5 | -#include "bulkStructs.h" | ||
| 6 | 4 | ||
| 5 | +class HantekDsoControl; | ||
| 7 | using namespace Hantek; | 6 | using namespace Hantek; |
| 8 | 7 | ||
| 9 | struct ModelDSO2250 : public DSOModel { | 8 | struct ModelDSO2250 : public DSOModel { |
openhantek/src/hantekdso/models/modelDSO5200.cpp
openhantek/src/hantekdso/models/modelDSO5200.h
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | #include "dsomodel.h" | 3 | #include "dsomodel.h" |
| 4 | -#include "hantekdsocontrol.h" | ||
| 5 | -#include "bulkStructs.h" | ||
| 6 | 4 | ||
| 5 | +class HantekDsoControl; | ||
| 7 | using namespace Hantek; | 6 | using namespace Hantek; |
| 8 | 7 | ||
| 9 | struct ModelDSO5200 : public DSOModel { | 8 | struct ModelDSO5200 : public DSOModel { |
openhantek/src/hantekdso/models/modelDSO6022.cpp
openhantek/src/hantekdso/models/modelDSO6022.h
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | #include "dsomodel.h" | 3 | #include "dsomodel.h" |
| 4 | -#include "hantekdsocontrol.h" | ||
| 5 | -#include "usb/usbdevice.h" | ||
| 6 | -#include "controlindexes.h" | ||
| 7 | 4 | ||
| 5 | +class HantekDsoControl; | ||
| 8 | using namespace Hantek; | 6 | using namespace Hantek; |
| 9 | 7 | ||
| 10 | struct ModelDSO6022BE : public DSOModel { | 8 | struct ModelDSO6022BE : public DSOModel { |
openhantek/src/hantekprotocol/controlcode.h
| @@ -6,7 +6,7 @@ | @@ -6,7 +6,7 @@ | ||
| 6 | /// \brief All supported control commands. | 6 | /// \brief All supported control commands. |
| 7 | enum ControlCode { | 7 | enum ControlCode { |
| 8 | /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, | 8 | /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, |
| 9 | - /// ::MODEL_DSO5200A]</em> | 9 | + /// ::MODEL_DSO5200A, MODEL_DSO6022]</em> |
| 10 | /// <p> | 10 | /// <p> |
| 11 | /// The 0xa2 control read/write command gives access to a ::ControlValue. | 11 | /// The 0xa2 control read/write command gives access to a ::ControlValue. |
| 12 | /// </p> | 12 | /// </p> |
| @@ -14,7 +14,7 @@ enum ControlCode { | @@ -14,7 +14,7 @@ enum ControlCode { | ||
| 14 | CONTROL_VALUE = 0xa2, | 14 | CONTROL_VALUE = 0xa2, |
| 15 | 15 | ||
| 16 | /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, | 16 | /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, |
| 17 | - /// ::MODEL_DSO5200A]</em> | 17 | + /// ::MODEL_DSO5200A, MODEL_DSO6022]</em> |
| 18 | /// <p> | 18 | /// <p> |
| 19 | /// The 0xb2 control read command gets the speed level of the USB | 19 | /// The 0xb2 control read command gets the speed level of the USB |
| 20 | /// connection: | 20 | /// connection: |
| @@ -132,9 +132,13 @@ enum ControlCode { | @@ -132,9 +132,13 @@ enum ControlCode { | ||
| 132 | /// <p><br /></p> | 132 | /// <p><br /></p> |
| 133 | CONTROL_SETRELAYS = 0xb5, | 133 | CONTROL_SETRELAYS = 0xb5, |
| 134 | 134 | ||
| 135 | + /// CH1 voltage div setting (6022BE/BL) | ||
| 135 | CONTROL_SETVOLTDIV_CH1 = 0xe0, | 136 | CONTROL_SETVOLTDIV_CH1 = 0xe0, |
| 137 | + /// CH2 voltage div setting (6022BE/BL) | ||
| 136 | CONTROL_SETVOLTDIV_CH2 = 0xe1, | 138 | CONTROL_SETVOLTDIV_CH2 = 0xe1, |
| 139 | + /// Time divisor setting (6022BE/BL) | ||
| 137 | CONTROL_SETTIMEDIV = 0xe2, | 140 | CONTROL_SETTIMEDIV = 0xe2, |
| 141 | + /// Request sample data (6022BE/BL) | ||
| 138 | CONTROL_ACQUIIRE_HARD_DATA = 0xe3 | 142 | CONTROL_ACQUIIRE_HARD_DATA = 0xe3 |
| 139 | }; | 143 | }; |
| 140 | 144 |
openhantek/src/scopesettings.h
openhantek/src/settings.cpp
openhantek/src/usb/finddevices.h
openhantek/src/usb/usbdevice.cpp
| @@ -7,7 +7,6 @@ | @@ -7,7 +7,6 @@ | ||
| 7 | #include "usbdevice.h" | 7 | #include "usbdevice.h" |
| 8 | 8 | ||
| 9 | #include "controlgetspeed.h" | 9 | #include "controlgetspeed.h" |
| 10 | -#include "controlcode.h" | ||
| 11 | #include "models.h" | 10 | #include "models.h" |
| 12 | #include "utils/printutils.h" | 11 | #include "utils/printutils.h" |
| 13 | 12 | ||
| @@ -280,7 +279,7 @@ int USBDevice::getConnectionSpeed() { | @@ -280,7 +279,7 @@ int USBDevice::getConnectionSpeed() { | ||
| 280 | } | 279 | } |
| 281 | 280 | ||
| 282 | /// \brief Gets the maximum size of one packet transmitted via bulk transfer. | 281 | /// \brief Gets the maximum size of one packet transmitted via bulk transfer. |
| 283 | -/// \return The maximum packet size in bytes, -1 on error. | 282 | +/// \return The maximum packet size in bytes, negative libusb error code on error. |
| 284 | int USBDevice::getPacketSize() { | 283 | int USBDevice::getPacketSize() { |
| 285 | const int s = this->getConnectionSpeed(); | 284 | const int s = this->getConnectionSpeed(); |
| 286 | if (s == CONNECTION_FULLSPEED) | 285 | if (s == CONNECTION_FULLSPEED) |
| @@ -290,8 +289,8 @@ int USBDevice::getPacketSize() { | @@ -290,8 +289,8 @@ int USBDevice::getPacketSize() { | ||
| 290 | else if (s > CONNECTION_HIGHSPEED) { | 289 | else if (s > CONNECTION_HIGHSPEED) { |
| 291 | std::cerr << "Unknown USB speed. Please correct source code in USBDevice::getPacketSize()" << std::endl; | 290 | std::cerr << "Unknown USB speed. Please correct source code in USBDevice::getPacketSize()" << std::endl; |
| 292 | throw new std::runtime_error("Unknown USB speed"); | 291 | throw new std::runtime_error("Unknown USB speed"); |
| 293 | - } | ||
| 294 | - return -1; | 292 | + } else if (s<0) return s; |
| 293 | + return 0; | ||
| 295 | } | 294 | } |
| 296 | 295 | ||
| 297 | libusb_device *USBDevice::getRawDevice() const { return device; } | 296 | libusb_device *USBDevice::getRawDevice() const { return device; } |
openhantek/src/usb/usbdevice.h
| @@ -9,7 +9,6 @@ | @@ -9,7 +9,6 @@ | ||
| 9 | 9 | ||
| 10 | #include "usbdevicedefinitions.h" | 10 | #include "usbdevicedefinitions.h" |
| 11 | #include "controlbegin.h" | 11 | #include "controlbegin.h" |
| 12 | -#include "definitions.h" | ||
| 13 | #include "utils/dataarray.h" | 12 | #include "utils/dataarray.h" |
| 14 | 13 | ||
| 15 | class DSOModel; | 14 | class DSOModel; |
openhantek/src/utils/dsoStrings.h
| @@ -4,7 +4,6 @@ | @@ -4,7 +4,6 @@ | ||
| 4 | #include <QString> | 4 | #include <QString> |
| 5 | #include "analyse/enums.h" | 5 | #include "analyse/enums.h" |
| 6 | #include "hantekdso/enums.h" | 6 | #include "hantekdso/enums.h" |
| 7 | -#include "definitions.h" | ||
| 8 | 7 | ||
| 9 | #define MARKER_COUNT 2 ///< Number of markers | 8 | #define MARKER_COUNT 2 ///< Number of markers |
| 10 | 9 |
openhantek/src/utils/printutils.h
| @@ -48,7 +48,7 @@ unsigned int hexParse(const QString dump, unsigned char *data, unsigned int leng | @@ -48,7 +48,7 @@ unsigned int hexParse(const QString dump, unsigned char *data, unsigned int leng | ||
| 48 | /// \brief Print debug information with timestamp. | 48 | /// \brief Print debug information with timestamp. |
| 49 | /// \param text Text that will be output via qDebug. | 49 | /// \param text Text that will be output via qDebug. |
| 50 | #ifdef DEBUG | 50 | #ifdef DEBUG |
| 51 | -inline void timestampDebug(QString text) { | 51 | +inline void timestampDebug(const QString& text) { |
| 52 | qDebug("%s: %s", QTime::currentTime().toString("hh:mm:ss.zzz").toLatin1().constData(), text.toLatin1().constData()); | 52 | qDebug("%s: %s", QTime::currentTime().toString("hh:mm:ss.zzz").toLatin1().constData(), text.toLatin1().constData()); |
| 53 | } | 53 | } |
| 54 | #else | 54 | #else |
openhantek/src/viewconstants.h
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | -#define DIVS_TIME 10.0 ///< Number of horizontal screen divs | ||
| 4 | -#define DIVS_VOLTAGE 8.0 ///< Number of vertical screen divs | 3 | +#define DIVS_TIME 10.0f ///< Number of horizontal screen divs |
| 4 | +#define DIVS_VOLTAGE 8.0f ///< Number of vertical screen divs | ||
| 5 | #define DIVS_SUB 5 ///< Number of sub-divisions per div | 5 | #define DIVS_SUB 5 ///< Number of sub-divisions per div |
openhantek/src/viewsettings.h
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | -#include "definitions.h" | ||
| 4 | #include <QColor> | 3 | #include <QColor> |
| 5 | #include <QObject> | 4 | #include <QObject> |
| 6 | #include <QPoint> | 5 | #include <QPoint> |
| @@ -43,7 +42,7 @@ struct DsoSettingsView { | @@ -43,7 +42,7 @@ struct DsoSettingsView { | ||
| 43 | std::vector<QColor>()}; | 42 | std::vector<QColor>()}; |
| 44 | bool antialiasing = true; ///< Antialiasing for the graphs | 43 | bool antialiasing = true; ///< Antialiasing for the graphs |
| 45 | bool digitalPhosphor = false; ///< true slowly fades out the previous graphs | 44 | bool digitalPhosphor = false; ///< true slowly fades out the previous graphs |
| 46 | - int digitalPhosphorDepth = 8; ///< Number of channels shown at one time | 45 | + unsigned digitalPhosphorDepth = 8; ///< Number of channels shown at one time |
| 47 | Dso::InterpolationMode interpolation = Dso::INTERPOLATION_LINEAR; ///< Interpolation mode for the graph | 46 | Dso::InterpolationMode interpolation = Dso::INTERPOLATION_LINEAR; ///< Interpolation mode for the graph |
| 48 | bool screenColorImages = false; ///< true exports images with screen colors | 47 | bool screenColorImages = false; ///< true exports images with screen colors |
| 49 | bool zoom = false; ///< true if the magnified scope is enabled | 48 | bool zoom = false; ///< true if the magnified scope is enabled |