Commit dfda706a6e3419cc1308b3c89dcb7852806fa0e4

Authored by oliverhaag
1 parent bff9d5ae

First DSO-2250 support attempt

openhantek/ChangeLog
... ... @@ -143,3 +143,7 @@
143 143 2012-09-01 Oliver Haag <oliver.haag@gmail.com>
144 144 * Updated documentation with first DSO-2250 details
145 145 * General documentation improvements
  146 +
  147 +2012-09-01 Oliver Haag <oliver.haag@gmail.com>
  148 +* First attempt to add DSO-2250 support
  149 +* More documentation updates
... ...
openhantek/src/dataanalyzer.cpp
... ... @@ -45,7 +45,7 @@
45 45 DataAnalyzer::DataAnalyzer(DsoSettings *settings, QObject *parent) : QThread(parent) {
46 46 this->settings = settings;
47 47  
48   - this->lastBufferSize = 0;
  48 + this->lastRecordLength = 0;
49 49 this->lastWindow = (Dso::WindowFunction) -1;
50 50 this->window = 0;
51 51  
... ... @@ -189,33 +189,33 @@ void DataAnalyzer::run() {
189 189 for(int channel = 0; channel < this->analyzedData.count(); channel++) {
190 190 if(this->analyzedData[channel]->samples.voltage.sample) {
191 191 // Calculate new window
192   - if(this->lastWindow != this->settings->scope.spectrumWindow || this->lastBufferSize != this->analyzedData[channel]->samples.voltage.count) {
193   - if(this->lastBufferSize != this->analyzedData[channel]->samples.voltage.count) {
194   - this->lastBufferSize = this->analyzedData[channel]->samples.voltage.count;
  192 + if(this->lastWindow != this->settings->scope.spectrumWindow || this->lastRecordLength != this->analyzedData[channel]->samples.voltage.count) {
  193 + if(this->lastRecordLength != this->analyzedData[channel]->samples.voltage.count) {
  194 + this->lastRecordLength = this->analyzedData[channel]->samples.voltage.count;
195 195  
196 196 if(this->window)
197 197 fftw_free(this->window);
198   - this->window = (double *) fftw_malloc(sizeof(double) * this->lastBufferSize);
  198 + this->window = (double *) fftw_malloc(sizeof(double) * this->lastRecordLength);
199 199 }
200 200  
201   - unsigned int windowEnd = this->lastBufferSize - 1;
  201 + unsigned int windowEnd = this->lastRecordLength - 1;
202 202 this->lastWindow = this->settings->scope.spectrumWindow;
203 203  
204 204 switch(this->settings->scope.spectrumWindow) {
205 205 case Dso::WINDOW_HAMMING:
206   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  206 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
207 207 *(this->window + windowPosition) = 0.54 - 0.46 * cos(2.0 * M_PI * windowPosition / windowEnd);
208 208 break;
209 209 case Dso::WINDOW_HANN:
210   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  210 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
211 211 *(this->window + windowPosition) = 0.5 * (1.0 - cos(2.0 * M_PI * windowPosition / windowEnd));
212 212 break;
213 213 case Dso::WINDOW_COSINE:
214   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  214 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
215 215 *(this->window + windowPosition) = sin(M_PI * windowPosition / windowEnd);
216 216 break;
217 217 case Dso::WINDOW_LANCZOS:
218   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++) {
  218 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++) {
219 219 double sincParameter = (2.0 * windowPosition / windowEnd - 1.0) * M_PI;
220 220 if(sincParameter == 0)
221 221 *(this->window + windowPosition) = 1;
... ... @@ -224,55 +224,55 @@ void DataAnalyzer::run() {
224 224 }
225 225 break;
226 226 case Dso::WINDOW_BARTLETT:
227   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  227 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
228 228 *(this->window + windowPosition) = 2.0 / windowEnd * (windowEnd / 2 - abs(windowPosition - windowEnd / 2));
229 229 break;
230 230 case Dso::WINDOW_TRIANGULAR:
231   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
232   - *(this->window + windowPosition) = 2.0 / this->lastBufferSize * (this->lastBufferSize / 2 - abs(windowPosition - windowEnd / 2));
  231 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
  232 + *(this->window + windowPosition) = 2.0 / this->lastRecordLength * (this->lastRecordLength / 2 - abs(windowPosition - windowEnd / 2));
233 233 break;
234 234 case Dso::WINDOW_GAUSS:
235 235 {
236 236 double sigma = 0.4;
237   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  237 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
238 238 *(this->window + windowPosition) = exp(-0.5 * pow(((windowPosition - windowEnd / 2) / (sigma * windowEnd / 2)), 2));
239 239 }
240 240 break;
241 241 case Dso::WINDOW_BARTLETTHANN:
242   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  242 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
243 243 *(this->window + windowPosition) = 0.62 - 0.48 * abs(windowPosition / windowEnd - 0.5) - 0.38 * cos(2.0 * M_PI * windowPosition / windowEnd);
244 244 break;
245 245 case Dso::WINDOW_BLACKMAN:
246 246 {
247 247 double alpha = 0.16;
248   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  248 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
249 249 *(this->window + windowPosition) = (1 - alpha) / 2 - 0.5 * cos(2.0 * M_PI * windowPosition / windowEnd) + alpha / 2 * cos(4.0 * M_PI * windowPosition / windowEnd);
250 250 }
251 251 break;
252 252 //case WINDOW_KAISER:
253 253 // TODO
254 254 //double alpha = 3.0;
255   - //for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  255 + //for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
256 256 //*(this->window + windowPosition) = ;
257 257 //break;
258 258 case Dso::WINDOW_NUTTALL:
259   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  259 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
260 260 *(this->window + windowPosition) = 0.355768 - 0.487396 * cos(2 * M_PI * windowPosition / windowEnd) + 0.144232 * cos(4 * M_PI * windowPosition / windowEnd) - 0.012604 * cos(6 * M_PI * windowPosition / windowEnd);
261 261 break;
262 262 case Dso::WINDOW_BLACKMANHARRIS:
263   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  263 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
264 264 *(this->window + windowPosition) = 0.35875 - 0.48829 * cos(2 * M_PI * windowPosition / windowEnd) + 0.14128 * cos(4 * M_PI * windowPosition / windowEnd) - 0.01168 * cos(6 * M_PI * windowPosition / windowEnd);
265 265 break;
266 266 case Dso::WINDOW_BLACKMANNUTTALL:
267   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  267 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
268 268 *(this->window + windowPosition) = 0.3635819 - 0.4891775 * cos(2 * M_PI * windowPosition / windowEnd) + 0.1365995 * cos(4 * M_PI * windowPosition / windowEnd) - 0.0106411 * cos(6 * M_PI * windowPosition / windowEnd);
269 269 break;
270 270 case Dso::WINDOW_FLATTOP:
271   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  271 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
272 272 *(this->window + windowPosition) = 1.0 - 1.93 * cos(2 * M_PI * windowPosition / windowEnd) + 1.29 * cos(4 * M_PI * windowPosition / windowEnd) - 0.388 * cos(6 * M_PI * windowPosition / windowEnd) + 0.032 * cos(8 * M_PI * windowPosition / windowEnd);
273 273 break;
274 274 default: // Dso::WINDOW_RECTANGULAR
275   - for(unsigned int windowPosition = 0; windowPosition < this->lastBufferSize; windowPosition++)
  275 + for(unsigned int windowPosition = 0; windowPosition < this->lastRecordLength; windowPosition++)
276 276 *(this->window + windowPosition) = 1.0;
277 277 }
278 278 }
... ... @@ -297,7 +297,7 @@ void DataAnalyzer::run() {
297 297 windowedValues[position] = this->window[position] * this->analyzedData[channel]->samples.voltage.sample[position];
298 298  
299 299 // Do discrete real to half-complex transformation
300   - /// \todo Check if buffer size is multiple of 2
  300 + /// \todo Check if record length is multiple of 2
301 301 /// \todo Reuse plan and use FFTW_MEASURE to get fastest algorithm
302 302 fftw_plan fftPlan = fftw_plan_r2r_1d(this->analyzedData[channel]->samples.voltage.count, windowedValues, this->analyzedData[channel]->samples.spectrum.sample, FFTW_R2HC, FFTW_ESTIMATE);
303 303 fftw_execute(fftPlan);
... ...
openhantek/src/dataanalyzer.h
... ... @@ -89,8 +89,8 @@ class DataAnalyzer : public QThread {
89 89 QList<AnalyzedData *> analyzedData; ///< The analyzed data for each channel
90 90 QMutex *analyzedDataMutex; ///< A mutex for the analyzed data of all channels
91 91  
92   - unsigned long int lastBufferSize; ///< The buffer size of the previously analyzed data
93   - unsigned long int maxSamples; ///< The maximum buffer size of the analyzed data
  92 + unsigned long int lastRecordLength; ///< The record length of the previously analyzed data
  93 + unsigned long int maxSamples; ///< The maximum record length of the analyzed data
94 94 Dso::WindowFunction lastWindow; ///< The previously used dft window function
95 95 double *window; ///< The array for the dft window factors
96 96  
... ...
openhantek/src/dso.h
... ... @@ -38,6 +38,16 @@
38 38 /// \brief All DSO specific things for different modes and so on.
39 39 namespace Dso {
40 40 //////////////////////////////////////////////////////////////////////////////
  41 + /// \enum ErrorCode hantek/control.h
  42 + /// \brief The return codes for device control methods.
  43 + enum ErrorCode {
  44 + ERROR_NONE = 0, ///< Successful operation
  45 + ERROR_CONNECTION = -1, ///< Device not connected or communication error
  46 + ERROR_UNSUPPORTED = -2, ///< Not supported by this device
  47 + ERROR_PARAMETER = -3 ///< Parameter out of range
  48 + };
  49 +
  50 + //////////////////////////////////////////////////////////////////////////////
41 51 /// \enum ChannelMode dso.h
42 52 /// \brief The channel display modes.
43 53 enum ChannelMode {
... ...
openhantek/src/dsocontrol.h
... ... @@ -72,13 +72,13 @@ class DsoControl : public QThread {
72 72 virtual void stopSampling();
73 73  
74 74 virtual unsigned long int setSamplerate(unsigned long int samplerate) = 0; ///< Set the samplerate that should be met
75   - virtual unsigned long int setBufferSize(unsigned long int size) = 0; ///< Set the needed buffer size
  75 + virtual unsigned long int setRecordLength(unsigned long int size) = 0; ///< Set the required record length
76 76  
77 77 virtual int setTriggerMode(Dso::TriggerMode mode) = 0; ///< Set the trigger mode
78 78 virtual int setTriggerSource(bool special, unsigned int id) = 0; ///< Set the trigger source
79 79 virtual double setTriggerLevel(unsigned int channel, double level) = 0; ///< Set the trigger level for a channel
80 80 virtual int setTriggerSlope(Dso::Slope slope) = 0; ///< Set the slope that causes triggering
81   - virtual double setTriggerPosition(double position) = 0; ///< Set the pretrigger position (0.0 = left, 1.0 = right side)
  81 + virtual double setPretriggerPosition(double position) = 0; ///< Set the pretrigger position (0.0 = left, 1.0 = right side)
82 82  
83 83 virtual int setChannelUsed(unsigned int channel, bool used) = 0; ///< Enable/disable a channel
84 84 virtual int setCoupling(unsigned int channel, Dso::Coupling coupling) = 0; ///< Set the coupling for a channel
... ...
openhantek/src/dsowidget.cpp
... ... @@ -114,12 +114,12 @@ DsoWidget::DsoWidget(DsoSettings *settings, DataAnalyzer *dataAnalyzer, QWidget
114 114 // The table for the settings
115 115 this->settingsTriggerLabel = new QLabel();
116 116 this->settingsTriggerLabel->setMinimumWidth(160);
117   - this->settingsBufferLabel = new QLabel();
118   - this->settingsBufferLabel->setAlignment(Qt::AlignRight);
119   - this->settingsBufferLabel->setPalette(palette);
120   - this->settingsRateLabel = new QLabel();
121   - this->settingsRateLabel->setAlignment(Qt::AlignRight);
122   - this->settingsRateLabel->setPalette(palette);
  117 + this->settingsRecordLengthLabel = new QLabel();
  118 + this->settingsRecordLengthLabel->setAlignment(Qt::AlignRight);
  119 + this->settingsRecordLengthLabel->setPalette(palette);
  120 + this->settingsSamplerateLabel = new QLabel();
  121 + this->settingsSamplerateLabel->setAlignment(Qt::AlignRight);
  122 + this->settingsSamplerateLabel->setPalette(palette);
123 123 this->settingsTimebaseLabel = new QLabel();
124 124 this->settingsTimebaseLabel->setAlignment(Qt::AlignRight);
125 125 this->settingsTimebaseLabel->setPalette(palette);
... ... @@ -128,8 +128,8 @@ DsoWidget::DsoWidget(DsoSettings *settings, DataAnalyzer *dataAnalyzer, QWidget
128 128 this->settingsFrequencybaseLabel->setPalette(palette);
129 129 this->settingsLayout = new QHBoxLayout();
130 130 this->settingsLayout->addWidget(this->settingsTriggerLabel);
131   - this->settingsLayout->addWidget(this->settingsBufferLabel, 1);
132   - this->settingsLayout->addWidget(this->settingsRateLabel, 1);
  131 + this->settingsLayout->addWidget(this->settingsRecordLengthLabel, 1);
  132 + this->settingsLayout->addWidget(this->settingsSamplerateLabel, 1);
133 133 this->settingsLayout->addWidget(this->settingsTimebaseLabel, 1);
134 134 this->settingsLayout->addWidget(this->settingsFrequencybaseLabel, 1);
135 135  
... ... @@ -225,7 +225,7 @@ DsoWidget::DsoWidget(DsoSettings *settings, DataAnalyzer *dataAnalyzer, QWidget
225 225  
226 226 // Apply settings and update measured values
227 227 this->updateTriggerDetails();
228   - this->updateBufferSize(this->settings->scope.horizontal.samples);
  228 + this->updateRecordLength(this->settings->scope.horizontal.samples);
229 229 this->updateFrequencybase();
230 230 this->updateTimebase();
231 231 this->updateZoom(this->settings->view.zoom);
... ... @@ -246,7 +246,7 @@ DsoWidget::DsoWidget(DsoSettings *settings, DataAnalyzer *dataAnalyzer, QWidget
246 246  
247 247 // Connect other signals
248 248 this->connect(this->dataAnalyzer, SIGNAL(analyzed(unsigned int)), this, SLOT(dataAnalyzed()));
249   - this->connect(this->dataAnalyzer, SIGNAL(analyzed(unsigned int)), this, SLOT(updateBufferSize(unsigned int)));
  249 + this->connect(this->dataAnalyzer, SIGNAL(analyzed(unsigned int)), this, SLOT(updateRecordLength(unsigned int)));
250 250 }
251 251  
252 252 /// \brief Stops the oscilloscope thread and the timer.
... ... @@ -332,7 +332,7 @@ void DsoWidget::updateFrequencybase() {
332 332  
333 333 /// \brief Updates the samplerate field after changing the samplerate.
334 334 void DsoWidget::updateSamplerate() {
335   - this->settingsRateLabel->setText(Helper::valueToString(this->settings->scope.horizontal.samplerate, Helper::UNIT_SAMPLES) + tr("/s"));
  335 + this->settingsSamplerateLabel->setText(Helper::valueToString(this->settings->scope.horizontal.samplerate, Helper::UNIT_SAMPLES) + tr("/s"));
336 336 }
337 337  
338 338 /// \brief Handles timebaseChanged signal from the horizontal dock.
... ... @@ -424,9 +424,9 @@ void DsoWidget::updateVoltageUsed(unsigned int channel, bool used) {
424 424 this->updateVoltageDetails(channel);
425 425 }
426 426  
427   -/// \brief Change the buffer size.
428   -void DsoWidget::updateBufferSize(unsigned int size) {
429   - this->settingsBufferLabel->setText(tr("%1 S").arg(size));
  427 +/// \brief Change the record length.
  428 +void DsoWidget::updateRecordLength(unsigned int size) {
  429 + this->settingsRecordLengthLabel->setText(tr("%1 S").arg(size));
430 430 }
431 431  
432 432 /// \brief Export the oscilloscope screen to a file.
... ...
openhantek/src/dsowidget.h
... ... @@ -69,8 +69,8 @@ class DsoWidget : public QWidget {
69 69  
70 70 QHBoxLayout *settingsLayout; ///< The table for the settings info
71 71 QLabel *settingsTriggerLabel; ///< The trigger details
72   - QLabel *settingsBufferLabel; ///< The buffer size
73   - QLabel *settingsRateLabel; ///< The samplerate
  72 + QLabel *settingsRecordLengthLabel; ///< The record length
  73 + QLabel *settingsSamplerateLabel; ///< The samplerate
74 74 QLabel *settingsTimebaseLabel; ///< The timebase of the main scope
75 75 QLabel *settingsFrequencybaseLabel; ///< The frequencybase of the main scope
76 76  
... ... @@ -116,7 +116,7 @@ class DsoWidget : public QWidget {
116 116 void updateVoltageUsed(unsigned int channel, bool used);
117 117  
118 118 // Menus
119   - void updateBufferSize(unsigned int size);
  119 + void updateRecordLength(unsigned int size);
120 120  
121 121 // Export
122 122 bool exportAs();
... ...
openhantek/src/hantek/control.cpp
... ... @@ -42,11 +42,12 @@ namespace Hantek {
42 42 /// \param parent The parent widget.
43 43 Control::Control(QObject *parent) : DsoControl(parent) {
44 44 // Use DSO-2090 specification as default
45   - this->specification.command.bulk.setBuffer = BULK_SETTRIGGERANDSAMPLERATE;
  45 + this->specification.command.bulk.setRecordLength = BULK_SETTRIGGERANDSAMPLERATE;
46 46 this->specification.command.bulk.setFilter = BULK_SETFILTER;
47 47 this->specification.command.bulk.setGain = BULK_SETGAIN;
48 48 this->specification.command.bulk.setSamplerate = BULK_SETTRIGGERANDSAMPLERATE;
49 49 this->specification.command.bulk.setTrigger = BULK_SETTRIGGERANDSAMPLERATE;
  50 + this->specification.command.bulk.setPretrigger = BULK_SETTRIGGERANDSAMPLERATE;
50 51 this->specification.command.control.setOffset = CONTROL_SETOFFSET;
51 52 this->specification.command.control.setRelays = CONTROL_SETRELAYS;
52 53 this->specification.command.values.offsetLimits = VALUE_OFFSETLIMITS;
... ... @@ -65,7 +66,7 @@ namespace Hantek {
65 66 }
66 67  
67 68 // Set settings to default values
68   - this->settings.bufferSizeId = 0;
  69 + this->settings.recordLengthId = 0;
69 70 this->settings.samplerate.limits = &(this->specification.samplerate.single);
70 71 this->settings.samplerate.downsampling = 1;
71 72 this->settings.trigger.position = 0;
... ... @@ -76,23 +77,11 @@ namespace Hantek {
76 77 // Special trigger sources
77 78 this->specialTriggerSources << tr("EXT") << tr("EXT/10");
78 79  
79   - // Transmission-ready bulk commands
80   - this->command[BULK_SETFILTER] = new BulkSetFilter();
81   - this->command[BULK_SETTRIGGERANDSAMPLERATE] = new BulkSetTriggerAndSamplerate();
82   - this->command[BULK_FORCETRIGGER] = new BulkForceTrigger();
83   - this->command[BULK_STARTSAMPLING] = new BulkCaptureStart();
84   - this->command[BULK_ENABLETRIGGER] = new BulkTriggerEnabled();
85   - this->command[BULK_GETDATA] = new BulkGetData();
86   - this->command[BULK_GETCAPTURESTATE] = new BulkGetCaptureState();
87   - this->command[BULK_SETGAIN] = new BulkSetGain();
88   - this->command[BULK_SETLOGICALDATA] = new BulkSetLogicalData();
89   - this->command[BULK_GETLOGICALDATA] = new BulkGetLogicalData();
90   - this->command[BULK_SETSAMPLERATE5200] = new BulkSetSamplerate5200();
91   - this->command[BULK_SETBUFFER5200] = new BulkSetBuffer5200();
92   - this->command[BULK_SETTRIGGER5200] = new BulkSetTrigger5200();
93   -
94   - for(int command = 0; command < BULK_COUNT; command++)
  80 + // Instantiate bulk command later, some are not the same for all models
  81 + for(int command = 0; command < BULK_COUNT; ++command) {
  82 + this->command[command] = 0;
95 83 this->commandPending[command] = false;
  84 + }
96 85  
97 86 // Transmission-ready control commands
98 87 this->control[CONTROLINDEX_SETOFFSET] = new ControlSetOffset();
... ... @@ -118,6 +107,12 @@ namespace Hantek {
118 107 /// \brief Disconnects the device.
119 108 Control::~Control() {
120 109 this->device->disconnect();
  110 +
  111 + // Clean up commands
  112 + for(int command = 0; command < BULK_COUNT; ++command) {
  113 + if(this->command[command])
  114 + delete this->command[command];
  115 + }
121 116 }
122 117  
123 118 /// \brief Gets the physical channel count for this oscilloscope.
... ... @@ -186,7 +181,7 @@ namespace Hantek {
186 181  
187 182 // Check the current oscilloscope state everytime 25% of the time the buffer should be refilled
188 183 // Not more often than every 10 ms though
189   - int cycleTime = qMax((unsigned long int) (this->specification.bufferSizes[this->settings.bufferSizeId] / this->settings.samplerate.current * 250), (long unsigned int) 10);
  184 + int cycleTime = qMax((unsigned long int) (this->specification.recordLengths[this->settings.recordLengthId] / this->settings.samplerate.current * 250), (long unsigned int) 10);
190 185 this->msleep(cycleTime);
191 186  
192 187 if(!this->sampling) {
... ... @@ -296,7 +291,7 @@ namespace Hantek {
296 291 }
297 292  
298 293 /// \brief Gets the current state.
299   - /// \return The current CaptureState of the oscilloscope.
  294 + /// \return The current CaptureState of the oscilloscope, libusb error code on error.
300 295 int Control::getCaptureState() {
301 296 int errorCode;
302 297  
... ... @@ -325,7 +320,7 @@ namespace Hantek {
325 320 return errorCode;
326 321  
327 322 // Save raw data to temporary buffer
328   - unsigned int dataCount = this->specification.bufferSizes[this->settings.bufferSizeId] * HANTEK_CHANNELS;
  323 + unsigned int dataCount = this->specification.recordLengths[this->settings.recordLengthId] * HANTEK_CHANNELS;
329 324 unsigned int dataLength = dataCount;
330 325 bool using10Bits = false;
331 326 if(this->device->getModel() == MODEL_DSO5200 || this->device->getModel() == MODEL_DSO5200A) {
... ... @@ -350,16 +345,28 @@ namespace Hantek {
350 345 this->samplesMutex.lock();
351 346  
352 347 // Get oscilloscope settings
353   - bool fastRate;
354   - UsedChannels usedChannels;
355   - if(this->specification.command.bulk.setTrigger == BULK_SETTRIGGERANDSAMPLERATE) {
356   - fastRate = ((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->getFastRate();
357   - usedChannels = (UsedChannels) ((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->getUsedChannels();
358   - }
359   - else {
360   - fastRate = ((BulkSetTrigger5200 *) this->command[BULK_SETTRIGGER5200])->getFastRate();
361   - usedChannels = (UsedChannels) ((BulkSetTrigger5200 *) this->command[BULK_SETTRIGGER5200])->getUsedChannels();
  348 + bool fastRate = false;
  349 + UsedChannels usedChannels = USED_NONE;
  350 + switch(this->specification.command.bulk.setTrigger) {
  351 + case BULK_SETTRIGGERANDSAMPLERATE:
  352 + fastRate = ((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->getFastRate();
  353 + usedChannels = (UsedChannels) ((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->getUsedChannels();
  354 + break;
  355 +
  356 + case BULK_CSETTRIGGERORSAMPLERATE:
  357 + fastRate = ((BulkSetTrigger5200 *) this->command[BULK_ESETTRIGGERORSAMPLERATE])->getFastRate();
  358 + usedChannels = (UsedChannels) ((BulkSetTrigger5200 *) this->command[BULK_ESETTRIGGERORSAMPLERATE])->getUsedChannels();
  359 + break;
  360 +
  361 + case BULK_ESETTRIGGERORSAMPLERATE:
  362 + fastRate = ((BulkSetTrigger5200 *) this->command[BULK_ESETTRIGGERORSAMPLERATE])->getFastRate();
  363 + usedChannels = (UsedChannels) ((BulkSetTrigger5200 *) this->command[BULK_ESETTRIGGERORSAMPLERATE])->getUsedChannels();
  364 + break;
  365 +
  366 + default:
  367 + break;
362 368 }
  369 +
363 370 // Convert channel data
364 371 if(fastRate) {
365 372 // Fast rate mode, one channel is using all buffers
... ... @@ -462,50 +469,64 @@ namespace Hantek {
462 469 }
463 470  
464 471 /// \brief Sets the size of the sample buffer without updating dependencies.
465   - /// \param size The buffer size that should be met (S).
466   - /// \return The buffer size that has been set, 0 on error.
467   - unsigned long int Control::updateBufferSize(unsigned long int size) {
468   - // Get the buffer size supporting the highest samplerate while meeting the requirement
  472 + /// \param size The record length that should be met (S).
  473 + /// \return The record length that has been set, 0 on error.
  474 + unsigned long int Control::updateRecordLength(unsigned long int size) {
  475 + // Get the record length supporting the highest samplerate while meeting the requirement
469 476 int bestSizeId = -1;
470   - for(int sizeId = 0; sizeId < this->specification.bufferSizes.count(); sizeId++) {
471   - if(this->specification.bufferSizes[sizeId] >= size) {
  477 + for(int sizeId = 0; sizeId < this->specification.recordLengths.count(); sizeId++) {
  478 + if(this->specification.recordLengths[sizeId] >= size) {
472 479 // We meet the size-requirement, check if we provide the highest possible samplerate
473   - if(bestSizeId == -1 || this->specification.bufferSizes[bestSizeId] < size || this->specification.bufferDividers[sizeId] < this->specification.bufferDividers[bestSizeId])
  480 + if(bestSizeId == -1 || this->specification.recordLengths[bestSizeId] < size || this->specification.bufferDividers[sizeId] < this->specification.bufferDividers[bestSizeId])
474 481 bestSizeId = sizeId;
475 482 }
476 483 else {
477 484 // We don't meet the size-requirement, but maybe we're still the one coming closest
478   - if(bestSizeId == -1 || this->specification.bufferSizes[sizeId] > this->specification.bufferSizes[bestSizeId])
  485 + if(bestSizeId == -1 || this->specification.recordLengths[sizeId] > this->specification.recordLengths[bestSizeId])
479 486 bestSizeId = sizeId;
480 487 }
481 488 }
482 489  
483   - switch(this->specification.command.bulk.setBuffer) {
  490 + switch(this->specification.command.bulk.setRecordLength) {
484 491 case BULK_SETTRIGGERANDSAMPLERATE:
485   - // SetTriggerAndSamplerate bulk command for buffer size
486   - ((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->setBufferSize(bestSizeId);
  492 + // SetTriggerAndSamplerate bulk command for record length
  493 + ((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->setRecordLength(bestSizeId);
487 494 this->commandPending[BULK_SETTRIGGERANDSAMPLERATE] = true;
488 495  
489 496 break;
490 497  
491   - case BULK_SETBUFFER5200: {
492   - // SetBuffer5200 bulk command for buffer size
493   - BulkSetBuffer5200 *commandSetBuffer5200 = (BulkSetBuffer5200 *) this->command[BULK_SETBUFFER5200];
494   - commandSetBuffer5200->setUsedPre(DTRIGGERPOSITION_ON);
495   - commandSetBuffer5200->setUsedPost(DTRIGGERPOSITION_ON);
496   - commandSetBuffer5200->setBufferSize(bestSizeId);
497   - this->commandPending[BULK_SETBUFFER5200] = true;
498   -
  498 + case BULK_DSETBUFFER:
  499 + if(this->specification.command.bulk.setPretrigger == BULK_FSETBUFFER) {
  500 + // Pointers to needed commands
  501 + BulkSetRecordLength2250 *commandSetRecordLength2250 = (BulkSetRecordLength2250 *) this->command[BULK_DSETBUFFER];
  502 + BulkSetBuffer2250 *commandSetBuffer2250 = (BulkSetBuffer2250 *) this->command[BULK_FSETBUFFER];
  503 +
  504 + commandSetRecordLength2250->setRecordLength(bestSizeId);
  505 + commandSetBuffer2250->setUsedPre(FTRIGGERPOSITION_ON);
  506 + commandSetBuffer2250->setUsedPost(FTRIGGERPOSITION_ON);
  507 + commandSetBuffer2250->setLargeBuffer(bestSizeId == RECORDLENGTHID_LARGE);
  508 + commandSetBuffer2250->setSlowBuffer(bestSizeId != RECORDLENGTHID_SMALL);
  509 +
  510 + this->commandPending[BULK_DSETBUFFER] = true;
  511 + this->commandPending[BULK_FSETBUFFER] = true;
  512 + }
  513 + else {
  514 + // SetBuffer5200 bulk command for record length
  515 + BulkSetBuffer5200 *commandSetBuffer5200 = (BulkSetBuffer5200 *) this->command[BULK_DSETBUFFER];
  516 + commandSetBuffer5200->setUsedPre(DTRIGGERPOSITION_ON);
  517 + commandSetBuffer5200->setUsedPost(DTRIGGERPOSITION_ON);
  518 + commandSetBuffer5200->setRecordLength(bestSizeId);
  519 + this->commandPending[BULK_DSETBUFFER] = true;
  520 + }
499 521 break;
500   - }
501 522  
502 523 default:
503 524 return 0;
504 525 }
505 526  
506   - this->settings.bufferSizeId = bestSizeId;
  527 + this->settings.recordLengthId = bestSizeId;
507 528  
508   - return this->specification.bufferSizes[this->settings.bufferSizeId];
  529 + return this->specification.recordLengths[this->settings.recordLengthId];
509 530 }
510 531  
511 532 /// \brief Try to connect to the oscilloscope.
... ... @@ -516,28 +537,26 @@ namespace Hantek {
516 537 if(!this->device->isConnected())
517 538 return;
518 539  
519   - // Initialize the commands used on the DSO-2090 as pending
520   - this->commandPending[BULK_SETFILTER] = true;
521   - this->commandPending[BULK_SETTRIGGERANDSAMPLERATE] = true;
522   - this->commandPending[BULK_FORCETRIGGER] = false;
523   - this->commandPending[BULK_STARTSAMPLING] = false;
524   - this->commandPending[BULK_ENABLETRIGGER] = false;
525   - this->commandPending[BULK_GETDATA] = false;
526   - this->commandPending[BULK_GETCAPTURESTATE] = false;
527   - this->commandPending[BULK_SETGAIN] = true;
528   - this->commandPending[BULK_SETLOGICALDATA] = false;
529   - this->commandPending[BULK_GETLOGICALDATA] = false;
530   - this->commandPending[BULK_UNKNOWN_0A] = false;
531   - this->commandPending[BULK_UNKNOWN_0B] = false;
532   - this->commandPending[BULK_SETSAMPLERATE5200] = false;
533   - this->commandPending[BULK_SETBUFFER5200] = false;
534   - this->commandPending[BULK_SETTRIGGER5200] = false;
  540 + // Clean up commands and their pending state
  541 + for(int command = 0; command < BULK_COUNT; ++command) {
  542 + if(this->command[command])
  543 + delete this->command[command];
  544 + this->commandPending[command] = false;
  545 + }
  546 + // Instantiate the commands needed for all models
  547 + this->command[BULK_FORCETRIGGER] = new BulkForceTrigger();
  548 + this->command[BULK_STARTSAMPLING] = new BulkCaptureStart();
  549 + this->command[BULK_ENABLETRIGGER] = new BulkTriggerEnabled();
  550 + this->command[BULK_GETDATA] = new BulkGetData();
  551 + this->command[BULK_GETCAPTURESTATE] = new BulkGetCaptureState();
  552 + this->command[BULK_SETGAIN] = new BulkSetGain();
535 553 // Initialize the command versions to the ones used on the DSO-2090
536   - this->specification.command.bulk.setBuffer = BULK_SETTRIGGERANDSAMPLERATE;
  554 + this->specification.command.bulk.setRecordLength = BULK_SETTRIGGERANDSAMPLERATE;
537 555 this->specification.command.bulk.setFilter = BULK_SETFILTER;
538 556 this->specification.command.bulk.setGain = BULK_SETGAIN;
539 557 this->specification.command.bulk.setSamplerate = BULK_SETTRIGGERANDSAMPLERATE;
540 558 this->specification.command.bulk.setTrigger = BULK_SETTRIGGERANDSAMPLERATE;
  559 + this->specification.command.bulk.setPretrigger = BULK_SETTRIGGERANDSAMPLERATE;
541 560 this->specification.command.control.setOffset = CONTROL_SETOFFSET;
542 561 this->specification.command.control.setRelays = CONTROL_SETRELAYS;
543 562 this->specification.command.values.offsetLimits = VALUE_OFFSETLIMITS;
... ... @@ -550,23 +569,50 @@ namespace Hantek {
550 569 unsupported = true;
551 570  
552 571 case MODEL_DSO2090:
553   - // Keep the defaults we've set before
  572 + // Instantiate additional commands for the DSO-2090
  573 + this->command[BULK_SETFILTER] = new BulkSetFilter();
  574 + this->command[BULK_SETTRIGGERANDSAMPLERATE] = new BulkSetTriggerAndSamplerate();
  575 + // Initialize those as pending
  576 + this->commandPending[BULK_SETFILTER] = true;
  577 + this->commandPending[BULK_SETTRIGGERANDSAMPLERATE] = true;
554 578 break;
555 579  
556 580 case MODEL_DSO2250:
  581 + // Instantiate additional commands for the DSO-2250
  582 + this->command[BULK_BSETFILTER] = new BulkSetFilter2250();
  583 + this->command[BULK_CSETTRIGGERORSAMPLERATE] = new BulkSetTrigger2250();
  584 + this->command[BULK_DSETBUFFER] = new BulkSetRecordLength2250();
  585 + this->command[BULK_ESETTRIGGERORSAMPLERATE] = new BulkSetSamplerate2250();
  586 + this->specification.command.bulk.setRecordLength = BULK_DSETBUFFER;
  587 + this->specification.command.bulk.setFilter = BULK_BSETFILTER;
  588 + this->specification.command.bulk.setSamplerate = BULK_ESETTRIGGERORSAMPLERATE;
  589 + this->specification.command.bulk.setTrigger = BULK_CSETTRIGGERORSAMPLERATE;
  590 + this->specification.command.bulk.setPretrigger = BULK_FSETBUFFER;
  591 +
  592 + this->commandPending[BULK_BSETFILTER] = true;
  593 + this->commandPending[BULK_CSETTRIGGERORSAMPLERATE] = true;
  594 + this->commandPending[BULK_DSETBUFFER] = true;
  595 + this->commandPending[BULK_ESETTRIGGERORSAMPLERATE] = true;
  596 +
  597 + break;
  598 +
557 599 case MODEL_DSO5200A:
558 600 unsupported = true;
559 601  
560 602 case MODEL_DSO5200:
561   - this->specification.command.bulk.setBuffer = BULK_SETBUFFER5200;
562   - this->specification.command.bulk.setSamplerate = BULK_SETSAMPLERATE5200;
563   - this->specification.command.bulk.setTrigger = BULK_SETTRIGGER5200;
564   - this->specification.command.values.voltageLimits = VALUE_VOLTAGELIMITS;
  603 + // Instantiate additional commands for the DSO-5200
  604 + this->command[BULK_CSETTRIGGERORSAMPLERATE] = new BulkSetSamplerate5200();
  605 + this->command[BULK_DSETBUFFER] = new BulkSetBuffer5200();
  606 + this->command[BULK_ESETTRIGGERORSAMPLERATE] = new BulkSetTrigger5200();
  607 + this->specification.command.bulk.setRecordLength = BULK_DSETBUFFER;
  608 + this->specification.command.bulk.setSamplerate = BULK_CSETTRIGGERORSAMPLERATE;
  609 + this->specification.command.bulk.setTrigger = BULK_ESETTRIGGERORSAMPLERATE;
  610 + this->specification.command.bulk.setPretrigger = BULK_ESETTRIGGERORSAMPLERATE;
  611 + //this->specification.command.values.voltageLimits = VALUE_ETSCORRECTION;
565 612  
566   - this->commandPending[BULK_SETTRIGGERANDSAMPLERATE] = false;
567   - this->commandPending[BULK_SETSAMPLERATE5200] = true;
568   - this->commandPending[BULK_SETBUFFER5200] = true;
569   - this->commandPending[BULK_SETTRIGGER5200] = true;
  613 + this->commandPending[BULK_CSETTRIGGERORSAMPLERATE] = true;
  614 + this->commandPending[BULK_DSETBUFFER] = true;
  615 + this->commandPending[BULK_ESETTRIGGERORSAMPLERATE] = true;
570 616  
571 617 break;
572 618  
... ... @@ -582,15 +628,14 @@ namespace Hantek {
582 628 for(int control = 0; control < CONTROLINDEX_COUNT; control++)
583 629 this->controlPending[control] = true;
584 630  
585   - // Maximum possible samplerate for a single channel and dividers for buffer sizes
  631 + // Maximum possible samplerate for a single channel and dividers for record lengths
586 632 this->specification.bufferDividers.clear();
587   - this->specification.bufferSizes.clear();
  633 + this->specification.recordLengths.clear();
588 634 this->specification.gainSteps.clear();
589 635 for(int channel = 0; channel < HANTEK_CHANNELS; channel++)
590 636 this->specification.voltageLimit[channel].clear();
591 637  
592 638 switch(this->device->getModel()) {
593   - case MODEL_DSO2250:
594 639 case MODEL_DSO5200:
595 640 case MODEL_DSO5200A:
596 641 this->specification.samplerate.single.base = 100e6;
... ... @@ -598,7 +643,7 @@ namespace Hantek {
598 643 this->specification.samplerate.multi.base = 200e6;
599 644 this->specification.samplerate.multi.max = 250e6;
600 645 this->specification.bufferDividers << 1000 << 1 << 2;
601   - this->specification.bufferSizes << ULONG_MAX << 10240 << 14336;
  646 + this->specification.recordLengths << ULONG_MAX << 10240 << 14336;
602 647 this->specification.gainSteps
603 648 << 0.16 << 0.40 << 0.80 << 1.60 << 4.00 << 8.0 << 16.0 << 40.0 << 80.0;
604 649 /// \todo Use calibration data to get the DSO-5200(A) sample ranges
... ... @@ -609,13 +654,29 @@ namespace Hantek {
609 654 << 1 << 0 << 0 << 1 << 0 << 0 << 1 << 0 << 0;
610 655 break;
611 656  
  657 + case MODEL_DSO2250:
  658 + this->specification.samplerate.single.base = 200e6;
  659 + this->specification.samplerate.single.max = 125e6;
  660 + this->specification.samplerate.multi.base = 200e6;
  661 + this->specification.samplerate.multi.max = 250e6;
  662 + this->specification.bufferDividers << 1000 << 1 << 2;
  663 + this->specification.recordLengths << ULONG_MAX << 10240 << 524288;
  664 + this->specification.gainSteps
  665 + << 0.08 << 0.16 << 0.40 << 0.80 << 1.60 << 4.00 << 8.0 << 16.0 << 40.0;
  666 + for(int channel = 0; channel < HANTEK_CHANNELS; channel++)
  667 + this->specification.voltageLimit[channel]
  668 + << 255 << 255 << 255 << 255 << 255 << 255 << 255 << 255 << 255;
  669 + this->specification.gainIndex
  670 + << 0 << 1 << 2 << 0 << 1 << 2 << 0 << 1 << 2;
  671 + break;
  672 +
612 673 case MODEL_DSO2150:
613 674 this->specification.samplerate.single.base = 50e6;
614 675 this->specification.samplerate.single.max = 75e6;
615 676 this->specification.samplerate.multi.base = 100e6;
616 677 this->specification.samplerate.multi.max = 150e6;
617 678 this->specification.bufferDividers << 1000 << 1 << 2;
618   - this->specification.bufferSizes << ULONG_MAX << 10240 << 32768;
  679 + this->specification.recordLengths << ULONG_MAX << 10240 << 32768;
619 680 this->specification.gainSteps
620 681 << 0.08 << 0.16 << 0.40 << 0.80 << 1.60 << 4.00 << 8.0 << 16.0 << 40.0;
621 682 for(int channel = 0; channel < HANTEK_CHANNELS; channel++)
... ... @@ -631,7 +692,7 @@ namespace Hantek {
631 692 this->specification.samplerate.multi.base = 100e6;
632 693 this->specification.samplerate.multi.max = 100e6;
633 694 this->specification.bufferDividers << 1000 << 1 << 2;
634   - this->specification.bufferSizes << ULONG_MAX << 10240 << 32768;
  695 + this->specification.recordLengths << ULONG_MAX << 10240 << 32768;
635 696 this->specification.gainSteps
636 697 << 0.08 << 0.16 << 0.40 << 0.80 << 1.60 << 4.00 << 8.0 << 16.0 << 40.0;
637 698 for(int channel = 0; channel < HANTEK_CHANNELS; channel++)
... ... @@ -656,23 +717,23 @@ namespace Hantek {
656 717 }
657 718  
658 719 /// \brief Sets the size of the oscilloscopes sample buffer.
659   - /// \param size The buffer size that should be met (S).
660   - /// \return The buffer size that has been set.
661   - unsigned long int Control::setBufferSize(unsigned long int size) {
  720 + /// \param size The record length that should be met (S).
  721 + /// \return The record length that has been set, 0 on error.
  722 + unsigned long int Control::setRecordLength(unsigned long int size) {
662 723 if(!this->device->isConnected())
663 724 return 0;
664 725  
665   - this->updateBufferSize(size);
  726 + this->updateRecordLength(size);
666 727  
667   - this->setTriggerPosition(this->settings.trigger.position);
  728 + this->setPretriggerPosition(this->settings.trigger.position);
668 729 this->setSamplerate();
669 730  
670   - return this->specification.bufferSizes[this->settings.bufferSizeId];
  731 + return this->specification.recordLengths[this->settings.recordLengthId];
671 732 }
672 733  
673 734 /// \brief Sets the samplerate of the oscilloscope.
674 735 /// \param samplerate The samplerate that should be met (S/s).
675   - /// \return The samplerate that has been set.
  736 + /// \return The samplerate that has been set, 0 on error.
676 737 unsigned long int Control::setSamplerate(unsigned long int samplerate) {
677 738 if(!this->device->isConnected())
678 739 return 0;
... ... @@ -693,24 +754,24 @@ namespace Hantek {
693 754 }
694 755  
695 756 // Get downsampling factor that would provide the requested rate
696   - this->settings.samplerate.downsampling = this->settings.samplerate.limits->base / this->specification.bufferDividers[this->settings.bufferSizeId] / samplerate;
  757 + this->settings.samplerate.downsampling = this->settings.samplerate.limits->base / this->specification.bufferDividers[this->settings.recordLengthId] / samplerate;
697 758 // A downsampling factor of zero will result in the maximum rate
698 759 if(this->settings.samplerate.downsampling)
699   - this->settings.samplerate.current = this->settings.samplerate.limits->base / this->specification.bufferDividers[this->settings.bufferSizeId] / this->settings.samplerate.downsampling;
  760 + this->settings.samplerate.current = this->settings.samplerate.limits->base / this->specification.bufferDividers[this->settings.recordLengthId] / this->settings.samplerate.downsampling;
700 761 else
701   - this->settings.samplerate.current = this->settings.samplerate.limits->max / this->specification.bufferDividers[this->settings.bufferSizeId];
  762 + this->settings.samplerate.current = this->settings.samplerate.limits->max / this->specification.bufferDividers[this->settings.recordLengthId];
702 763  
703 764 // Maybe normal mode would be sufficient or even better than fast rate mode
704 765 if(fastRate) {
705 766 // Don't set the downsampling factor to zero (maximum rate) if we could use fast rate mode anyway
706   - unsigned long int slowDownsampling = qMax(this->specification.samplerate.single.base / this->specification.bufferDividers[this->settings.bufferSizeId] / samplerate, (long unsigned int) 1);
  767 + unsigned long int slowDownsampling = qMax(this->specification.samplerate.single.base / this->specification.bufferDividers[this->settings.recordLengthId] / samplerate, (long unsigned int) 1);
707 768  
708 769 // Use normal mode if we need valueSlow or it would meet the rate at least as exactly as fast rate mode
709   - if(this->settings.samplerate.downsampling > 4 || (qAbs((double) this->specification.samplerate.single.base / this->specification.bufferDividers[this->settings.bufferSizeId] / slowDownsampling - samplerate) <= qAbs(this->settings.samplerate.current - samplerate))) {
  770 + if(this->settings.samplerate.downsampling > 4 || (qAbs((double) this->specification.samplerate.single.base / this->specification.bufferDividers[this->settings.recordLengthId] / slowDownsampling - samplerate) <= qAbs(this->settings.samplerate.current - samplerate))) {
710 771 fastRate = false;
711 772 this->settings.samplerate.limits = &(this->specification.samplerate.single);
712 773 this->settings.samplerate.downsampling = slowDownsampling;
713   - this->settings.samplerate.current = this->specification.samplerate.single.base / this->specification.bufferDividers[this->settings.bufferSizeId] / this->settings.samplerate.downsampling;
  774 + this->settings.samplerate.current = this->specification.samplerate.single.base / this->specification.bufferDividers[this->settings.recordLengthId] / this->settings.samplerate.downsampling;
714 775 }
715 776 }
716 777  
... ... @@ -735,10 +796,11 @@ namespace Hantek {
735 796  
736 797 break;
737 798 }
738   - case BULK_SETSAMPLERATE5200: {
  799 + case BULK_CSETTRIGGERORSAMPLERATE: {
739 800 // Pointers to needed commands
740   - BulkSetSamplerate5200 *commandSetSamplerate5200 = (BulkSetSamplerate5200 *) this->command[BULK_SETSAMPLERATE5200];
741   - BulkSetTrigger5200 *commandSetTrigger5200 = (BulkSetTrigger5200 *) this->command[BULK_SETTRIGGER5200];
  801 + BulkSetSamplerate5200 *commandSetSamplerate5200 = (BulkSetSamplerate5200 *) this->command[BULK_CSETTRIGGERORSAMPLERATE];
  802 + BulkSetTrigger5200 *commandSetTrigger5200 = (BulkSetTrigger5200 *) this->command[BULK_ESETTRIGGERORSAMPLERATE];
  803 +
742 804 // Store samplerate fast value
743 805 commandSetSamplerate5200->setSamplerateFast(4 - valueFast);
744 806 // Store samplerate slow value (two's complement)
... ... @@ -746,8 +808,23 @@ namespace Hantek {
746 808 // Set fast rate when used
747 809 commandSetTrigger5200->setFastRate(fastRate);
748 810  
749   - this->commandPending[BULK_SETSAMPLERATE5200] = true;
750   - this->commandPending[BULK_SETTRIGGER5200] = true;
  811 + this->commandPending[BULK_CSETTRIGGERORSAMPLERATE] = true;
  812 + this->commandPending[BULK_ESETTRIGGERORSAMPLERATE] = true;
  813 +
  814 + break;
  815 + }
  816 + case BULK_ESETTRIGGERORSAMPLERATE: {
  817 + // Pointers to needed commands
  818 + BulkSetSamplerate2250 *commandSetSamplerate2250 = (BulkSetSamplerate2250 *) this->command[BULK_ESETTRIGGERORSAMPLERATE];
  819 +
  820 + // Store samplerate fast value
  821 + commandSetSamplerate2250->setSamplerateFast(4 - valueFast);
  822 + // Store samplerate slow value (two's complement)
  823 + commandSetSamplerate2250->setSamplerateSlow(valueSlow == 0 ? 0 : 0xffff - valueSlow);
  824 + // Set fast rate when used
  825 + commandSetSamplerate2250->setFastRate(fastRate);
  826 +
  827 + this->commandPending[BULK_ESETTRIGGERORSAMPLERATE] = true;
751 828  
752 829 break;
753 830 }
... ... @@ -755,81 +832,102 @@ namespace Hantek {
755 832 return 0;
756 833 }
757 834  
758   - this->updateBufferSize(this->specification.bufferSizes[this->settings.bufferSizeId]);
759   - this->setTriggerPosition(this->settings.trigger.position);
  835 + this->updateRecordLength(this->specification.recordLengths[this->settings.recordLengthId]);
  836 + this->setPretriggerPosition(this->settings.trigger.position);
760 837 return this->settings.samplerate.current;
761 838 }
762 839  
763 840 /// \brief Enables/disables filtering of the given channel.
764 841 /// \param channel The channel that should be set.
765 842 /// \param used true if the channel should be sampled.
766   - /// \return 0 on success, -1 on invalid channel.
  843 + /// \return See ::Dso::ErrorCode.
767 844 int Control::setChannelUsed(unsigned int channel, bool used) {
768 845 if(!this->device->isConnected())
769   - return -2;
  846 + return Dso::ERROR_CONNECTION;
770 847  
771 848 if(channel >= HANTEK_CHANNELS)
772   - return -1;
773   -
774   - // SetFilter bulk command for channel filter (used has to be inverted!)
775   - BulkSetFilter *commandSetFilter = (BulkSetFilter *) this->command[BULK_SETFILTER];
776   - commandSetFilter->setChannel(channel, !used);
777   - this->commandPending[BULK_SETFILTER] = true;
  849 + return Dso::ERROR_PARAMETER;
778 850  
779 851 unsigned char usedChannels = USED_CH1;
780   - if(!commandSetFilter->getChannel(1)) {
781   - if(commandSetFilter->getChannel(0))
782   - usedChannels = USED_CH2;
783   - else
784   - usedChannels = USED_CH1CH2;
785   - }
786 852  
787   - switch(this->specification.command.bulk.setTrigger) {
788   - case BULK_SETTRIGGER5200: {
789   - // SetTrigger5200s bulk command for trigger source
790   - ((BulkSetTrigger5200 *) this->command[BULK_SETTRIGGER5200])->setUsedChannels(usedChannels);
791   - this->commandPending[BULK_SETTRIGGER5200] = true;
  853 + switch(this->specification.command.bulk.setFilter) {
  854 + case BULK_SETFILTER: {
  855 + // SetFilter bulk command for channel filter (used has to be inverted!)
  856 + BulkSetFilter *commandSetFilter = (BulkSetFilter *) this->command[BULK_SETFILTER];
  857 + commandSetFilter->setChannel(channel, !used);
  858 + this->commandPending[BULK_SETFILTER] = true;
  859 +
  860 + if(!commandSetFilter->getChannel(1)) {
  861 + if(commandSetFilter->getChannel(0))
  862 + usedChannels = USED_CH2;
  863 + else
  864 + usedChannels = USED_CH1CH2;
  865 + }
  866 +
792 867 break;
793 868 }
794   - default: {
795   - // SetTriggerAndSamplerate bulk command for trigger source
796   - ((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->setUsedChannels(usedChannels);
797   - this->commandPending[BULK_SETTRIGGERANDSAMPLERATE] = true;
  869 + case BULK_BSETFILTER: {
  870 + // SetFilter2250 bulk command for channel filter (used has to be inverted!)
  871 + BulkSetFilter2250 *commandSetFilter2250 = (BulkSetFilter2250 *) this->command[BULK_BSETFILTER];
  872 + commandSetFilter2250->setChannel(channel, !used);
  873 + this->commandPending[BULK_BSETFILTER] = true;
  874 +
798 875 break;
799 876 }
  877 + default:
  878 + return Dso::ERROR_UNSUPPORTED;
800 879 }
801 880  
802   - return 0;
  881 + if(this->specification.command.bulk.setTrigger == BULK_SETTRIGGERANDSAMPLERATE || this->specification.command.bulk.setTrigger == BULK_ESETTRIGGERORSAMPLERATE) {
  882 + switch(this->specification.command.bulk.setTrigger) {
  883 + case BULK_SETTRIGGERANDSAMPLERATE: {
  884 + // SetTriggerAndSamplerate bulk command for trigger source
  885 + ((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->setUsedChannels(usedChannels);
  886 + this->commandPending[BULK_SETTRIGGERANDSAMPLERATE] = true;
  887 + break;
  888 + }
  889 + case BULK_ESETTRIGGERORSAMPLERATE: {
  890 + // SetTrigger5200s bulk command for trigger source
  891 + ((BulkSetTrigger5200 *) this->command[BULK_ESETTRIGGERORSAMPLERATE])->setUsedChannels(usedChannels);
  892 + this->commandPending[BULK_ESETTRIGGERORSAMPLERATE] = true;
  893 + break;
  894 + }
  895 + default:
  896 + break;
  897 + }
  898 + }
  899 +
  900 + return Dso::ERROR_NONE;
803 901 }
804 902  
805 903 /// \brief Set the coupling for the given channel.
806 904 /// \param channel The channel that should be set.
807 905 /// \param coupling The new coupling for the channel.
808   - /// \return 0 on success, -1 on invalid channel.
  906 + /// \return See ::Dso::ErrorCode.
809 907 int Control::setCoupling(unsigned int channel, Dso::Coupling coupling) {
810 908 if(!this->device->isConnected())
811   - return -2;
  909 + return Dso::ERROR_CONNECTION;
812 910  
813 911 if(channel >= HANTEK_CHANNELS)
814   - return -1;
  912 + return Dso::ERROR_PARAMETER;
815 913  
816 914 // SetRelays control command for coupling relays
817 915 ((ControlSetRelays *) this->control[CONTROLINDEX_SETRELAYS])->setCoupling(channel, coupling != Dso::COUPLING_AC);
818 916 this->controlPending[CONTROLINDEX_SETRELAYS] = true;
819 917  
820   - return 0;
  918 + return Dso::ERROR_NONE;
821 919 }
822 920  
823 921 /// \brief Sets the gain for the given channel.
824 922 /// \param channel The channel that should be set.
825 923 /// \param gain The gain that should be met (V/div).
826   - /// \return The gain that has been set, -1 on invalid channel.
  924 + /// \return The gain that has been set, ::Dso::ErrorCode on error.
827 925 double Control::setGain(unsigned int channel, double gain) {
828 926 if(!this->device->isConnected())
829   - return -2;
  927 + return Dso::ERROR_CONNECTION;
830 928  
831 929 if(channel >= HANTEK_CHANNELS)
832   - return -1;
  930 + return Dso::ERROR_PARAMETER;
833 931  
834 932 // Find lowest gain voltage thats at least as high as the requested
835 933 int gainId;
... ... @@ -857,13 +955,13 @@ namespace Hantek {
857 955 /// \brief Set the offset for the given channel.
858 956 /// \param channel The channel that should be set.
859 957 /// \param offset The new offset value (0.0 - 1.0).
860   - /// \return The offset that has been set, -1.0 on invalid channel.
  958 + /// \return The offset that has been set, ::Dso::ErrorCode on error.
861 959 double Control::setOffset(unsigned int channel, double offset) {
862 960 if(!this->device->isConnected())
863   - return -2;
  961 + return Dso::ERROR_CONNECTION;
864 962  
865 963 if(channel >= HANTEK_CHANNELS)
866   - return -1;
  964 + return Dso::ERROR_PARAMETER;
867 965  
868 966 // Calculate the offset value
869 967 // The range is given by the calibration data (convert from big endian)
... ... @@ -885,28 +983,28 @@ namespace Hantek {
885 983 }
886 984  
887 985 /// \brief Set the trigger mode.
888   - /// \return 0 on success, -1 on invalid mode.
  986 + /// \return See ::Dso::ErrorCode.
889 987 int Control::setTriggerMode(Dso::TriggerMode mode) {
890 988 if(!this->device->isConnected())
891   - return -2;
  989 + return Dso::ERROR_CONNECTION;
892 990  
893 991 if(mode < Dso::TRIGGERMODE_AUTO || mode > Dso::TRIGGERMODE_SINGLE)
894   - return -1;
  992 + return Dso::ERROR_PARAMETER;
895 993  
896 994 this->settings.trigger.mode = mode;
897   - return 0;
  995 + return Dso::ERROR_NONE;
898 996 }
899 997  
900 998 /// \brief Set the trigger source.
901 999 /// \param special true for a special channel (EXT, ...) as trigger source.
902 1000 /// \param id The number of the channel, that should be used as trigger.
903   - /// \return 0 on success, -1 on invalid channel.
  1001 + /// \return See ::Dso::ErrorCode.
904 1002 int Control::setTriggerSource(bool special, unsigned int id) {
905 1003 if(!this->device->isConnected())
906   - return -2;
  1004 + return Dso::ERROR_CONNECTION;
907 1005  
908 1006 if((!special && id >= HANTEK_CHANNELS) || (special && id >= HANTEK_SPECIAL_CHANNELS))
909   - return -1;
  1007 + return Dso::ERROR_PARAMETER;
910 1008  
911 1009 // Generate trigger source value that will be transmitted
912 1010 int sourceValue;
... ... @@ -916,17 +1014,26 @@ namespace Hantek {
916 1014 sourceValue = TRIGGER_CH1 - id;
917 1015  
918 1016 switch(this->specification.command.bulk.setTrigger) {
919   - case BULK_SETTRIGGER5200:
920   - // SetTrigger5200 bulk command for trigger source
921   - ((BulkSetTrigger5200 *) this->command[BULK_SETTRIGGER5200])->setTriggerSource(sourceValue);
922   - this->commandPending[BULK_SETTRIGGER5200] = true;
923   - break;
924   -
925   - default:
  1017 + case BULK_SETTRIGGERANDSAMPLERATE:
926 1018 // SetTriggerAndSamplerate bulk command for trigger source
927 1019 ((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->setTriggerSource(sourceValue);
928 1020 this->commandPending[BULK_SETTRIGGERANDSAMPLERATE] = true;
929 1021 break;
  1022 +
  1023 + case BULK_CSETTRIGGERORSAMPLERATE:
  1024 + // SetTrigger2250 bulk command for trigger source
  1025 + ((BulkSetTrigger2250 *) this->command[BULK_CSETTRIGGERORSAMPLERATE])->setTriggerSource(sourceValue);
  1026 + this->commandPending[BULK_CSETTRIGGERORSAMPLERATE] = true;
  1027 + break;
  1028 +
  1029 + case BULK_ESETTRIGGERORSAMPLERATE:
  1030 + // SetTrigger5200 bulk command for trigger source
  1031 + ((BulkSetTrigger5200 *) this->command[BULK_ESETTRIGGERORSAMPLERATE])->setTriggerSource(sourceValue);
  1032 + this->commandPending[BULK_ESETTRIGGERORSAMPLERATE] = true;
  1033 + break;
  1034 +
  1035 + default:
  1036 + return Dso::ERROR_UNSUPPORTED;
930 1037 }
931 1038  
932 1039 // SetRelays control command for external trigger relay
... ... @@ -945,19 +1052,19 @@ namespace Hantek {
945 1052 else
946 1053 this->setTriggerLevel(id, this->settings.trigger.level[id]);
947 1054  
948   - return 0;
  1055 + return Dso::ERROR_NONE;
949 1056 }
950 1057  
951 1058 /// \brief Set the trigger level.
952 1059 /// \param channel The channel that should be set.
953 1060 /// \param level The new trigger level (V).
954   - /// \return The trigger level that has been set, -1.0 on invalid channel.
  1061 + /// \return The trigger level that has been set, ::Dso::ErrorCode on error.
955 1062 double Control::setTriggerLevel(unsigned int channel, double level) {
956 1063 if(!this->device->isConnected())
957   - return -2;
  1064 + return Dso::ERROR_CONNECTION;
958 1065  
959 1066 if(channel >= HANTEK_CHANNELS)
960   - return -1.0;
  1067 + return Dso::ERROR_PARAMETER;
961 1068  
962 1069 // Calculate the trigger level value
963 1070 unsigned short int minimum, maximum;
... ... @@ -994,22 +1101,16 @@ namespace Hantek {
994 1101  
995 1102 /// \brief Set the trigger slope.
996 1103 /// \param slope The Slope that should cause a trigger.
997   - /// \return 0 on success, -1 on invalid slope.
  1104 + /// \return See ::Dso::ErrorCode.
998 1105 int Control::setTriggerSlope(Dso::Slope slope) {
999 1106 if(!this->device->isConnected())
1000   - return -2;
  1107 + return Dso::ERROR_CONNECTION;
1001 1108  
1002 1109 if(slope != Dso::SLOPE_NEGATIVE && slope != Dso::SLOPE_POSITIVE)
1003   - return -1;
  1110 + return Dso::ERROR_PARAMETER;
1004 1111  
1005 1112 switch(this->specification.command.bulk.setTrigger) {
1006   - case BULK_SETTRIGGER5200: {
1007   - // SetTrigger5200 bulk command for trigger slope
1008   - ((BulkSetTrigger5200 *) this->command[BULK_SETTRIGGER5200])->setTriggerSlope(slope);
1009   - this->commandPending[BULK_SETTRIGGER5200] = true;
1010   - break;
1011   - }
1012   - default: {
  1113 + case BULK_SETTRIGGERANDSAMPLERATE: {
1013 1114 // SetTriggerAndSamplerate bulk command for trigger slope
1014 1115 BulkSetTriggerAndSamplerate *commandSetTriggerAndSamplerate = (BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE];
1015 1116  
... ... @@ -1017,54 +1118,87 @@ namespace Hantek {
1017 1118 this->commandPending[BULK_SETTRIGGERANDSAMPLERATE] = true;
1018 1119 break;
1019 1120 }
  1121 + case BULK_CSETTRIGGERORSAMPLERATE: {
  1122 + // SetTrigger2250 bulk command for trigger slope
  1123 + ((BulkSetTrigger2250 *) this->command[BULK_CSETTRIGGERORSAMPLERATE])->setTriggerSlope(slope);
  1124 + this->commandPending[BULK_CSETTRIGGERORSAMPLERATE] = true;
  1125 + break;
  1126 + }
  1127 + case BULK_ESETTRIGGERORSAMPLERATE: {
  1128 + // SetTrigger5200 bulk command for trigger slope
  1129 + ((BulkSetTrigger5200 *) this->command[BULK_ESETTRIGGERORSAMPLERATE])->setTriggerSlope(slope);
  1130 + this->commandPending[BULK_ESETTRIGGERORSAMPLERATE] = true;
  1131 + break;
  1132 + }
  1133 + default:
  1134 + return Dso::ERROR_UNSUPPORTED;
1020 1135 }
1021 1136  
1022 1137 this->settings.trigger.slope = slope;
1023   - return 0;
  1138 + return Dso::ERROR_NONE;
1024 1139 }
1025 1140  
1026 1141 /// \brief Set the trigger position.
1027 1142 /// \param position The new trigger position (in s).
1028 1143 /// \return The trigger position that has been set.
1029   - double Control::setTriggerPosition(double position) {
  1144 + double Control::setPretriggerPosition(double position) {
1030 1145 if(!this->device->isConnected())
1031 1146 return -2;
1032 1147  
1033 1148 // All trigger positions are measured in samples
1034 1149 unsigned long int positionSamples = position * this->settings.samplerate.current;
1035 1150  
1036   - switch(this->specification.command.bulk.setTrigger) {
1037   - case BULK_SETTRIGGER5200: {
  1151 + switch(this->specification.command.bulk.setPretrigger) {
  1152 + case BULK_SETTRIGGERANDSAMPLERATE: {
1038 1153 // Fast rate mode uses both channels
1039   - if(((BulkSetTrigger5200 *) this->command[BULK_SETTRIGGER5200])->getFastRate())
  1154 + if(((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->getFastRate())
  1155 + positionSamples /= HANTEK_CHANNELS;
  1156 +
  1157 + // Calculate the position value (Start point depending on record length)
  1158 + unsigned long int position = 0x7ffff - this->specification.recordLengths[this->settings.recordLengthId] + positionSamples;
  1159 +
  1160 + // SetTriggerAndSamplerate bulk command for trigger position
  1161 + ((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->setTriggerPosition(position);
  1162 + this->commandPending[BULK_SETTRIGGERANDSAMPLERATE] = true;
  1163 +
  1164 + break;
  1165 + }
  1166 + case BULK_FSETBUFFER: {
  1167 + // Fast rate mode uses both channels
  1168 + if(((BulkSetSamplerate2250 *) this->command[BULK_ESETTRIGGERORSAMPLERATE])->getFastRate())
1040 1169 positionSamples /= HANTEK_CHANNELS;
1041 1170  
1042 1171 // Calculate the position values (Inverse, maximum is 0xffff)
1043   - unsigned short int positionPre = 0xffff - this->specification.bufferSizes[this->settings.bufferSizeId] + positionSamples;
  1172 + unsigned short int positionPre = 0xffff - this->specification.recordLengths[this->settings.recordLengthId] + positionSamples;
1044 1173 unsigned short int positionPost = 0xffff - positionSamples;
1045 1174  
1046   - // SetBuffer5200 bulk command for trigger position
1047   - BulkSetBuffer5200 *commandSetBuffer5200 = (BulkSetBuffer5200 *) this->command[BULK_SETBUFFER5200];
1048   - commandSetBuffer5200->setTriggerPositionPre(positionPre);
1049   - commandSetBuffer5200->setTriggerPositionPost(positionPost);
1050   - this->commandPending[BULK_SETBUFFER5200] = true;
  1175 + // SetBuffer2250 bulk command for trigger position
  1176 + BulkSetBuffer2250 *commandSetBuffer2250 = (BulkSetBuffer2250 *) this->command[BULK_FSETBUFFER];
  1177 + commandSetBuffer2250->setTriggerPositionPre(positionPre);
  1178 + commandSetBuffer2250->setTriggerPositionPost(positionPost);
  1179 + this->commandPending[BULK_FSETBUFFER] = true;
1051 1180  
1052 1181 break;
1053 1182 }
1054   - default: {
  1183 + case BULK_ESETTRIGGERORSAMPLERATE: {
1055 1184 // Fast rate mode uses both channels
1056   - if(((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->getFastRate())
  1185 + if(((BulkSetTrigger5200 *) this->command[BULK_ESETTRIGGERORSAMPLERATE])->getFastRate())
1057 1186 positionSamples /= HANTEK_CHANNELS;
1058 1187  
1059   - // Calculate the position value (Start point depending on buffer size)
1060   - unsigned long int position = 0x7ffff - this->specification.bufferSizes[this->settings.bufferSizeId] + positionSamples;
  1188 + // Calculate the position values (Inverse, maximum is 0xffff)
  1189 + unsigned short int positionPre = 0xffff - this->specification.recordLengths[this->settings.recordLengthId] + positionSamples;
  1190 + unsigned short int positionPost = 0xffff - positionSamples;
1061 1191  
1062   - // SetTriggerAndSamplerate bulk command for trigger position
1063   - ((BulkSetTriggerAndSamplerate *) this->command[BULK_SETTRIGGERANDSAMPLERATE])->setTriggerPosition(position);
1064   - this->commandPending[BULK_SETTRIGGERANDSAMPLERATE] = true;
  1192 + // SetBuffer5200 bulk command for trigger position
  1193 + BulkSetBuffer5200 *commandSetBuffer5200 = (BulkSetBuffer5200 *) this->command[BULK_DSETBUFFER];
  1194 + commandSetBuffer5200->setTriggerPositionPre(positionPre);
  1195 + commandSetBuffer5200->setTriggerPositionPost(positionPost);
  1196 + this->commandPending[BULK_DSETBUFFER] = true;
1065 1197  
1066 1198 break;
1067 1199 }
  1200 + default:
  1201 + return Dso::ERROR_UNSUPPORTED;
1068 1202 }
1069 1203  
1070 1204 this->settings.trigger.position = position;
... ... @@ -1073,11 +1207,19 @@ namespace Hantek {
1073 1207  
1074 1208 #ifdef DEBUG
1075 1209 /// \brief Sends bulk/control commands directly.
  1210 + /// <p>
  1211 + /// <b>Syntax:</b><br />
  1212 + /// <br />
  1213 + /// Bulk command:
  1214 + /// <pre>send bulk [<em>hex data</em>]</pre>
  1215 + /// %Control command:
  1216 + /// <pre>send control [<em>hex code</em>] [<em>hex data</em>]</pre>
  1217 + /// </p>
1076 1218 /// \param command The command as string (Has to be parsed).
1077   - /// \return 0 on success, -1 on unknown command, -2 on syntax error.
  1219 + /// \return See ::Dso::ErrorCode.
1078 1220 int Control::stringCommand(QString command) {
1079 1221 if(!this->device->isConnected())
1080   - return -3;
  1222 + return Dso::ERROR_CONNECTION;
1081 1223  
1082 1224 QStringList commandParts = command.split(' ', QString::SkipEmptyParts);
1083 1225  
... ... @@ -1091,17 +1233,14 @@ namespace Hantek {
1091 1233 // Read command code (First byte)
1092 1234 Helper::hexParse(data, &commandCode, 1);
1093 1235 if(commandCode > BULK_COUNT)
1094   - return -2;
  1236 + return Dso::ERROR_UNSUPPORTED;
1095 1237  
1096 1238 // Update bulk command and mark as pending
1097 1239 Helper::hexParse(data, this->command[commandCode]->data(), this->command[commandCode]->getSize());
1098 1240 this->commandPending[commandCode] = true;
1099   - return 0;
  1241 + return Dso::ERROR_NONE;
1100 1242 }
1101 1243 else if(commandParts[1] == "control") {
1102   - if(commandParts.count() <= 1)
1103   - return -2;
1104   -
1105 1244 // Get control code from third part
1106 1245 unsigned char controlCode = commandParts[2].toUShort();
1107 1246 int control;
... ... @@ -1110,20 +1249,26 @@ namespace Hantek {
1110 1249 break;
1111 1250 }
1112 1251 if(control >= CONTROLINDEX_COUNT)
1113   - return -2;
  1252 + return Dso::ERROR_UNSUPPORTED;
1114 1253  
1115 1254 QString data = command.section(' ', 3, -1, QString::SectionSkipEmpty);
1116 1255  
1117 1256 // Update control command and mark as pending
1118 1257 Helper::hexParse(data, this->control[control]->data(), this->control[control]->getSize());
1119 1258 this->controlPending[control] = true;
1120   - return 0;
  1259 + return Dso::ERROR_NONE;
1121 1260 }
1122 1261 }
  1262 + else {
  1263 + return Dso::ERROR_PARAMETER;
  1264 + }
1123 1265 }
1124 1266 }
  1267 + else {
  1268 + return Dso::ERROR_PARAMETER;
  1269 + }
1125 1270  
1126   - return -1;
  1271 + return Dso::ERROR_UNSUPPORTED;
1127 1272 }
1128 1273 #endif
1129 1274 }
... ...
openhantek/src/hantek/control.h
... ... @@ -59,8 +59,9 @@ namespace Hantek {
59 59 BulkCode setFilter; ///< Command for setting used channels
60 60 BulkCode setSamplerate; ///< Command for samplerate settings
61 61 BulkCode setGain; ///< Command for gain settings (Usually in combination with CONTROL_SETRELAYS)
62   - BulkCode setBuffer; ///< Command for buffer settings
  62 + BulkCode setRecordLength; ///< Command for buffer settings
63 63 BulkCode setTrigger; ///< Command for trigger settings
  64 + BulkCode setPretrigger; ///< Command for pretrigger settings
64 65 };
65 66  
66 67 //////////////////////////////////////////////////////////////////////////////
... ... @@ -113,8 +114,8 @@ namespace Hantek {
113 114  
114 115 // Limits
115 116 ControlSpecificationSamplerate samplerate; ///< The samplerate specifications
116   - QList<unsigned long int> bufferSizes; ///< Available buffer sizes, ULONG_MAX means rolling
117   - QList<unsigned long int> bufferDividers; ///< Samplerate dividers for buffer sizes
  117 + QList<unsigned long int> recordLengths; ///< Available record lengths, ULONG_MAX means rolling
  118 + QList<unsigned long int> bufferDividers; ///< Samplerate dividers for record lengths
118 119 QList<double> gainSteps; ///< Available voltage steps in V/screenheight
119 120  
120 121 // Calibration
... ... @@ -166,7 +167,7 @@ namespace Hantek {
166 167 ControlSettingsSamplerate samplerate; ///< The samplerate settings
167 168 ControlSettingsVoltage voltage[HANTEK_CHANNELS]; ///< The amplification settings
168 169 ControlSettingsTrigger trigger; ///< The trigger settings
169   - unsigned int bufferSizeId; ///< The id in the buffer size array
  170 + unsigned int recordLengthId; ///< The id in the record length array
170 171 unsigned short int usedChannels; ///< Number of activated channels
171 172 };
172 173  
... ... @@ -188,7 +189,7 @@ namespace Hantek {
188 189 unsigned short int calculateTriggerPoint(unsigned short int value);
189 190 int getCaptureState();
190 191 int getSamples(bool process);
191   - unsigned long int updateBufferSize(unsigned long int size);
  192 + unsigned long int updateRecordLength(unsigned long int size);
192 193  
193 194 // Communication with device
194 195 Device *device; ///< The USB device for the oscilloscope
... ... @@ -212,7 +213,7 @@ namespace Hantek {
212 213 virtual void connectDevice();
213 214  
214 215 unsigned long int setSamplerate(unsigned long int samplerate = 0);
215   - unsigned long int setBufferSize(unsigned long int size);
  216 + unsigned long int setRecordLength(unsigned long int size);
216 217  
217 218 int setChannelUsed(unsigned int channel, bool used);
218 219 int setCoupling(unsigned int channel, Dso::Coupling coupling);
... ... @@ -223,7 +224,7 @@ namespace Hantek {
223 224 int setTriggerSource(bool special, unsigned int id);
224 225 double setTriggerLevel(unsigned int channel, double level);
225 226 int setTriggerSlope(Dso::Slope slope);
226   - double setTriggerPosition(double position);
  227 + double setPretriggerPosition(double position);
227 228  
228 229 #ifdef DEBUG
229 230 int stringCommand(QString command);
... ...
openhantek/src/hantek/types.cpp
... ... @@ -104,16 +104,16 @@ namespace Hantek {
104 104 /// \param samplerateSlow The SamplerateSlow value.
105 105 /// \param triggerPosition The trigger position value.
106 106 /// \param triggerSource The trigger source id (Tsr1).
107   - /// \param bufferSize The buffer size id (Tsr1).
  107 + /// \param recordLength The record length id (Tsr1).
108 108 /// \param samplerateFast The samplerateFast value (Tsr1).
109 109 /// \param usedChannels The enabled channels (Tsr2).
110 110 /// \param fastRate The fastRate state (Tsr2).
111 111 /// \param triggerSlope The triggerSlope value (Tsr2).
112   - BulkSetTriggerAndSamplerate::BulkSetTriggerAndSamplerate(unsigned short int samplerateSlow, unsigned long int triggerPosition, unsigned char triggerSource, unsigned char bufferSize, unsigned char samplerateFast, unsigned char usedChannels, bool fastRate, unsigned char triggerSlope) : Helper::DataArray<unsigned char>(12) {
  112 + BulkSetTriggerAndSamplerate::BulkSetTriggerAndSamplerate(unsigned short int samplerateSlow, unsigned long int triggerPosition, unsigned char triggerSource, unsigned char recordLength, unsigned char samplerateFast, unsigned char usedChannels, bool fastRate, unsigned char triggerSlope) : Helper::DataArray<unsigned char>(12) {
113 113 this->init();
114 114  
115 115 this->setTriggerSource(triggerSource);
116   - this->setBufferSize(bufferSize);
  116 + this->setRecordLength(recordLength);
117 117 this->setSamplerateFast(samplerateFast);
118 118 this->setUsedChannels(usedChannels);
119 119 this->setFastRate(fastRate);
... ... @@ -134,16 +134,16 @@ namespace Hantek {
134 134 ((Tsr1Bits *) &(this->array[2]))->triggerSource = value;
135 135 }
136 136  
137   - /// \brief Get the bufferSize value in Tsr1Bits.
138   - /// \return The ::BufferSizeId value.
139   - unsigned char BulkSetTriggerAndSamplerate::getBufferSize() {
140   - return ((Tsr1Bits *) &(this->array[2]))->bufferSize;
  137 + /// \brief Get the recordLength value in Tsr1Bits.
  138 + /// \return The ::RecordLengthId value.
  139 + unsigned char BulkSetTriggerAndSamplerate::getRecordLength() {
  140 + return ((Tsr1Bits *) &(this->array[2]))->recordLength;
141 141 }
142 142  
143   - /// \brief Set the bufferSize in Tsr1Bits to the given value.
144   - /// \param value The new ::BufferSizeId value.
145   - void BulkSetTriggerAndSamplerate::setBufferSize(unsigned char value) {
146   - ((Tsr1Bits *) &(this->array[2]))->bufferSize = value;
  143 + /// \brief Set the recordLength in Tsr1Bits to the given value.
  144 + /// \param value The new ::RecordLengthId value.
  145 + void BulkSetTriggerAndSamplerate::setRecordLength(unsigned char value) {
  146 + ((Tsr1Bits *) &(this->array[2]))->recordLength = value;
147 147 }
148 148  
149 149 /// \brief Get the samplerateFast value in Tsr1Bits.
... ... @@ -376,190 +376,94 @@ namespace Hantek {
376 376  
377 377  
378 378 //////////////////////////////////////////////////////////////////////////////
379   - // class BulkGetSpeed
380   - /// \brief Initializes the array.
381   - ControlGetSpeed::ControlGetSpeed() : Helper::DataArray<unsigned char>(10) {
382   - }
383   -
384   - /// \brief Gets the speed of the connection.
385   - /// \return The speed level of the USB connection.
386   - ConnectionSpeed ControlGetSpeed::getSpeed() {
387   - return (ConnectionSpeed) this->array[0];
  379 + // class BulkSetFilter2250
  380 + /// \brief Sets the data array to needed values.
  381 + BulkSetFilter2250::BulkSetFilter2250() : Helper::DataArray<unsigned char>(4) {
  382 + this->init();
388 383 }
389 384  
390   -
391   - //////////////////////////////////////////////////////////////////////////////
392   - // class BulkBeginCommand
393   - /// \brief Sets the command index to the given value.
394   - /// \param index The CommandIndex for the command.
395   - ControlBeginCommand::ControlBeginCommand(BulkIndex index) : Helper::DataArray<unsigned char>(10) {
  385 + /// \brief Sets the used channels.
  386 + /// \param channel1 true if channel 1 is filtered.
  387 + /// \param channel2 true if channel 2 is filtered.
  388 + BulkSetFilter2250::BulkSetFilter2250(bool channel1, bool channel2) : Helper::DataArray<unsigned char>(4) {
396 389 this->init();
397 390  
398   - this->setIndex(index);
399   - }
400   -
401   - /// \brief Gets the command index.
402   - /// \return The CommandIndex for the command.
403   - BulkIndex ControlBeginCommand::getIndex() {
404   - return (BulkIndex) this->array[1];
405   - }
406   -
407   - /// \brief Sets the command index to the given value.
408   - /// \param index The new CommandIndex for the command.
409   - void ControlBeginCommand::setIndex(BulkIndex index) {
410   - memset(&(this->array[1]), (unsigned char) index, 3);
411   - }
412   -
413   - /// \brief Initialize the array to the needed values.
414   - void ControlBeginCommand::init() {
415   - this->array[0] = 0x0f;
416   - }
417   -
418   -
419   - //////////////////////////////////////////////////////////////////////////////
420   - // class BulkSetOffset
421   - /// \brief Sets the data array to the default values.
422   - ControlSetOffset::ControlSetOffset() : Helper::DataArray<unsigned char>(17) {
423   - }
424   -
425   - /// \brief Sets the offsets to the given values.
426   - /// \param channel1 The offset for channel 1.
427   - /// \param channel2 The offset for channel 2.
428   - /// \param trigger The offset for ext. trigger.
429   - ControlSetOffset::ControlSetOffset(unsigned short int channel1, unsigned short int channel2, unsigned short int trigger) : Helper::DataArray<unsigned char>(17) {
430 391 this->setChannel(0, channel1);
431 392 this->setChannel(1, channel2);
432   - this->setTrigger(trigger);
433 393 }
434 394  
435   - /// \brief Get the offset for the given channel.
436   - /// \param channel The channel whose offset should be returned.
437   - /// \return The channel offset value.
438   - unsigned short int ControlSetOffset::getChannel(unsigned int channel) {
  395 + /// \brief Gets the filtering state of one channel.
  396 + /// \param channel The channel whose filtering state should be returned.
  397 + /// \return The filtering state of the channel.
  398 + bool BulkSetFilter2250::getChannel(unsigned int channel) {
  399 + FilterBits *filterBits = (FilterBits *) &(this->array[2]);
439 400 if(channel == 0)
440   - return ((this->array[0] & 0x0f) << 8) | this->array[1];
  401 + return filterBits->channel1 == 1;
441 402 else
442   - return ((this->array[2] & 0x0f) << 8) | this->array[3];
  403 + return filterBits->channel2 == 1;
443 404 }
444 405  
445   - /// \brief Set the offset for the given channel.
  406 + /// \brief Enables/disables filtering of one channel.
446 407 /// \param channel The channel that should be set.
447   - /// \param offset The new channel offset value.
448   - void ControlSetOffset::setChannel(unsigned int channel, unsigned short int offset) {
449   - if(channel == 0) {
450   - this->array[0] = (unsigned char) (offset >> 8);
451   - this->array[1] = (unsigned char) offset;
452   - }
453   - else {
454   - this->array[2] = (unsigned char) (offset >> 8);
455   - this->array[3] = (unsigned char) offset;
456   - }
457   - }
458   -
459   - /// \brief Get the trigger level.
460   - /// \return The trigger level value.
461   - unsigned short int ControlSetOffset::getTrigger() {
462   - return ((this->array[4] & 0x0f) << 8) | this->array[5];
  408 + /// \param filtered true if the channel should be filtered.
  409 + void BulkSetFilter2250::setChannel(unsigned int channel, bool filtered) {
  410 + FilterBits *filterBits = (FilterBits *) &(this->array[2]);
  411 + if(channel == 0)
  412 + filterBits->channel1 = filtered ? 1 : 0;
  413 + else
  414 + filterBits->channel2 = filtered ? 1 : 0;
463 415 }
464 416  
465   - /// \brief Set the trigger level.
466   - /// \param level The new trigger level value.
467   - void ControlSetOffset::setTrigger(unsigned short int level) {
468   - this->array[4] = (unsigned char) (level >> 8);
469   - this->array[5] = (unsigned char) level;
  417 + /// \brief Initialize the array to the needed values.
  418 + void BulkSetFilter2250::init() {
  419 + this->array[0] = BULK_BSETFILTER;
470 420 }
471 421  
472 422  
473 423 //////////////////////////////////////////////////////////////////////////////
474   - // class BulkSetRelays
475   - /// \brief Sets all relay states.
476   - /// \param ch1Below1V Sets the state of the Channel 1 below 1 V relay.
477   - /// \param ch1Below100mV Sets the state of the Channel 1 below 100 mV relay.
478   - /// \param ch1CouplingDC Sets the state of the Channel 1 coupling relay.
479   - /// \param ch2Below1V Sets the state of the Channel 2 below 1 V relay.
480   - /// \param ch2Below100mV Sets the state of the Channel 2 below 100 mV relay.
481   - /// \param ch2CouplingDC Sets the state of the Channel 2 coupling relay.
482   - /// \param triggerExt Sets the state of the external trigger relay.
483   - ControlSetRelays::ControlSetRelays(bool ch1Below1V, bool ch1Below100mV, bool ch1CouplingDC, bool ch2Below1V, bool ch2Below100mV, bool ch2CouplingDC, bool triggerExt) : Helper::DataArray<unsigned char>(17) {
484   - this->setBelow1V(0, ch1Below1V);
485   - this->setBelow100mV(0, ch1Below100mV);
486   - this->setCoupling(0, ch1CouplingDC);
487   - this->setBelow1V(1, ch2Below1V);
488   - this->setBelow100mV(1, ch2Below100mV);
489   - this->setCoupling(1, ch2CouplingDC);
490   - this->setTrigger(triggerExt);
491   - }
492   -
493   - /// \brief Get the below 1 V relay state for the given channel.
494   - /// \param channel The channel whose relay state should be returned.
495   - /// \return true, if the gain of the channel is below 1 V.
496   - bool ControlSetRelays::getBelow1V(unsigned int channel) {
497   - if(channel == 0)
498   - return (this->array[1] & 0x04) == 0x00;
499   - else
500   - return (this->array[4] & 0x20) == 0x00;
501   - }
502   -
503   - /// \brief Set the below 1 V relay for the given channel.
504   - /// \param channel The channel that should be set.
505   - /// \param below true, if the gain of the channel should be below 1 V.
506   - void ControlSetRelays::setBelow1V(unsigned int channel, bool below) {
507   - if(channel == 0)
508   - this->array[1] = below ? 0xfb : 0x04;
509   - else
510   - this->array[4] = below ? 0xdf : 0x20;
  424 + // class BulkSetTrigger2250
  425 + /// \brief Sets the data array to needed values.
  426 + BulkSetTrigger2250::BulkSetTrigger2250() : Helper::DataArray<unsigned char>(8) {
  427 + this->init();
511 428 }
512 429  
513   - /// \brief Get the below 1 V relay state for the given channel.
514   - /// \param channel The channel whose relay state should be returned.
515   - /// \return true, if the gain of the channel is below 1 V.
516   - bool ControlSetRelays::getBelow100mV(unsigned int channel) {
517   - if(channel == 0)
518   - return (this->array[2] & 0x08) == 0x00;
519   - else
520   - return (this->array[5] & 0x40) == 0x00;
  430 + /// \brief Sets the used channels.
  431 + /// \param triggerSource The trigger source id (CTriggerBits).
  432 + /// \param triggerSlope The triggerSlope value (CTriggerBits).
  433 + BulkSetTrigger2250::BulkSetTrigger2250(unsigned char triggerSource, unsigned char triggerSlope) : Helper::DataArray<unsigned char>(8) {
  434 + this->init();
  435 +
  436 + this->setTriggerSource(triggerSource);
  437 + this->setTriggerSlope(triggerSlope);
521 438 }
522   -
523   - /// \brief Set the below 100 mV relay for the given channel.
524   - /// \param channel The channel that should be set.
525   - /// \param below true, if the gain of the channel should be below 100 mV.
526   - void ControlSetRelays::setBelow100mV(unsigned int channel, bool below) {
527   - if(channel == 0)
528   - this->array[2] = below ? 0xf7 : 0x08;
529   - else
530   - this->array[5] = below ? 0xbf : 0x40;
  439 +
  440 + /// \brief Get the triggerSource value in CTriggerBits.
  441 + /// \return The triggerSource value.
  442 + unsigned char BulkSetTrigger2250::getTriggerSource() {
  443 + return ((CTriggerBits *) &(this->array[2]))->triggerSource;
531 444 }
532 445  
533   - /// \brief Get the coupling relay state for the given channel.
534   - /// \param channel The channel whose relay state should be returned.
535   - /// \return true, if the coupling of the channel is DC.
536   - bool ControlSetRelays::getCoupling(unsigned int channel) {
537   - if(channel == 0)
538   - return (this->array[3] & 0x02) == 0x00;
539   - else
540   - return (this->array[6] & 0x10) == 0x00;
  446 + /// \brief Set the triggerSource in CTriggerBits to the given value.
  447 + /// \param value The new triggerSource value.
  448 + void BulkSetTrigger2250::setTriggerSource(unsigned char value) {
  449 + ((CTriggerBits *) &(this->array[2]))->triggerSource = value;
541 450 }
542 451  
543   - /// \brief Set the coupling relay for the given channel.
544   - /// \param channel The channel that should be set.
545   - /// \param dc true, if the coupling of the channel should be DC.
546   - void ControlSetRelays::setCoupling(unsigned int channel, bool dc) {
547   - if(channel == 0)
548   - this->array[3] = dc ? 0xfd : 0x02;
549   - else
550   - this->array[6] = dc ? 0xef : 0x10;
  452 + /// \brief Get the triggerSlope value in CTriggerBits.
  453 + /// \return The triggerSlope value.
  454 + unsigned char BulkSetTrigger2250::getTriggerSlope() {
  455 + return ((CTriggerBits *) &(this->array[2]))->triggerSlope;
551 456 }
552 457  
553   - /// \brief Get the external trigger relay state.
554   - /// \return true, if the trigger is external (EXT-Connector).
555   - bool ControlSetRelays::getTrigger() {
556   - return (this->array[7] & 0x01) == 0x00;
  458 + /// \brief Set the triggerSlope in CTriggerBits to the given value.
  459 + /// \param slope The new triggerSlope value.
  460 + void BulkSetTrigger2250::setTriggerSlope(unsigned char slope) {
  461 + ((CTriggerBits *) &(this->array[2]))->triggerSlope = slope;
557 462 }
558   -
559   - /// \brief Set the external trigger relay.
560   - /// \param ext true, if the trigger should be external (EXT-Connector).
561   - void ControlSetRelays::setTrigger(bool ext) {
562   - this->array[7] = ext ? 0xfe : 0x01;
  463 +
  464 + /// \brief Initialize the array to the needed values.
  465 + void BulkSetTrigger2250::init() {
  466 + this->array[0] = BULK_CSETTRIGGERORSAMPLERATE;
563 467 }
564 468  
565 469  
... ... @@ -607,7 +511,40 @@ namespace Hantek {
607 511  
608 512 /// \brief Initialize the array to the needed values.
609 513 void BulkSetSamplerate5200::init() {
610   - this->array[0] = BULK_SETSAMPLERATE5200;
  514 + this->array[0] = BULK_CSETTRIGGERORSAMPLERATE;
  515 + }
  516 +
  517 +
  518 + //////////////////////////////////////////////////////////////////////////////
  519 + // class BulkSetBuffer2250
  520 + /// \brief Sets the data array to the default values.
  521 + BulkSetRecordLength2250::BulkSetRecordLength2250() : Helper::DataArray<unsigned char>(4) {
  522 + this->init();
  523 + }
  524 +
  525 + /// \brief Sets the data bytes to the specified values.
  526 + /// \param recordLength The ::RecordLengthId value.
  527 + BulkSetRecordLength2250::BulkSetRecordLength2250(unsigned char recordLength) : Helper::DataArray<unsigned char>(4) {
  528 + this->init();
  529 +
  530 + this->setRecordLength(recordLength);
  531 + }
  532 +
  533 + /// \brief Get the ::RecordLengthId value.
  534 + /// \return The ::RecordLengthId value.
  535 + unsigned char BulkSetRecordLength2250::getRecordLength() {
  536 + return this->array[2];
  537 + }
  538 +
  539 + /// \brief Set the ::RecordLengthId to the given value.
  540 + /// \param value The new ::RecordLengthId value.
  541 + void BulkSetRecordLength2250::setRecordLength(unsigned char value) {
  542 + this->array[2] = value;
  543 + }
  544 +
  545 + /// \brief Initialize the array to the needed values.
  546 + void BulkSetRecordLength2250::init() {
  547 + this->array[0] = BULK_DSETBUFFER;
611 548 }
612 549  
613 550  
... ... @@ -623,15 +560,15 @@ namespace Hantek {
623 560 /// \param triggerPositionPost The TriggerPositionPost value.
624 561 /// \param usedPre The TriggerPositionUsedPre value.
625 562 /// \param usedPost The TriggerPositionUsedPost value.
626   - /// \param bufferSize The ::BufferSizeId value.
627   - BulkSetBuffer5200::BulkSetBuffer5200(unsigned short int triggerPositionPre, unsigned short int triggerPositionPost, unsigned char usedPre, unsigned char usedPost, unsigned char bufferSize) : Helper::DataArray<unsigned char>(10) {
  563 + /// \param recordLength The ::RecordLengthId value.
  564 + BulkSetBuffer5200::BulkSetBuffer5200(unsigned short int triggerPositionPre, unsigned short int triggerPositionPost, unsigned char usedPre, unsigned char usedPost, unsigned char recordLength) : Helper::DataArray<unsigned char>(10) {
628 565 this->init();
629 566  
630 567 this->setTriggerPositionPre(triggerPositionPre);
631 568 this->setTriggerPositionPost(triggerPositionPost);
632 569 this->setUsedPre(usedPre);
633 570 this->setUsedPost(usedPost);
634   - this->setBufferSize(bufferSize);
  571 + this->setRecordLength(recordLength);
635 572 }
636 573  
637 574 /// \brief Get the TriggerPositionPre value.
... ... @@ -684,27 +621,89 @@ namespace Hantek {
684 621 ((DBufferBits *) &(this->array[8]))->triggerPositionUsed = value;
685 622 }
686 623  
687   - /// \brief Get the bufferSize value in DBufferBits.
688   - /// \return The ::BufferSizeId value.
689   - unsigned char BulkSetBuffer5200::getBufferSize() {
690   - return ((DBufferBits *) &(this->array[8]))->bufferSize;
  624 + /// \brief Get the recordLength value in DBufferBits.
  625 + /// \return The ::RecordLengthId value.
  626 + unsigned char BulkSetBuffer5200::getRecordLength() {
  627 + return ((DBufferBits *) &(this->array[8]))->recordLength;
691 628 }
692 629  
693   - /// \brief Set the bufferSize in DBufferBits to the given value.
694   - /// \param value The new ::BufferSizeId value.
695   - void BulkSetBuffer5200::setBufferSize(unsigned char value) {
696   - ((DBufferBits *) &(this->array[8]))->bufferSize = value;
  630 + /// \brief Set the recordLength in DBufferBits to the given value.
  631 + /// \param value The new ::RecordLengthId value.
  632 + void BulkSetBuffer5200::setRecordLength(unsigned char value) {
  633 + ((DBufferBits *) &(this->array[8]))->recordLength = value;
697 634 }
698 635  
699 636 /// \brief Initialize the array to the needed values.
700 637 void BulkSetBuffer5200::init() {
701   - this->array[0] = BULK_SETBUFFER5200;
  638 + this->array[0] = BULK_DSETBUFFER;
702 639 this->array[5] = 0xff;
703 640 this->array[9] = 0xff;
704 641 }
705 642  
706 643  
707 644 //////////////////////////////////////////////////////////////////////////////
  645 + // class BulkSetSamplerate2250
  646 + /// \brief Sets the data array to the default values.
  647 + BulkSetSamplerate2250::BulkSetSamplerate2250() : Helper::DataArray<unsigned char>(8) {
  648 + this->init();
  649 + }
  650 +
  651 + /// \brief Sets the data bytes to the specified values.
  652 + /// \param fastRate The fastRate state (ESamplerateBits).
  653 + /// \param samplerateFast The SamplerateFast value (ESamplerateBits).
  654 + /// \param samplerateSlow The SamplerateSlow value.
  655 + BulkSetSamplerate2250::BulkSetSamplerate2250(bool fastRate, unsigned char samplerateFast, unsigned short int samplerateSlow) : Helper::DataArray<unsigned char>(8) {
  656 + this->init();
  657 +
  658 + this->setFastRate(fastRate);
  659 + this->setSamplerateFast(samplerateFast);
  660 + this->setSamplerateSlow(samplerateSlow);
  661 + }
  662 +
  663 + /// \brief Get the fastRate state in ESamplerateBits.
  664 + /// \return The fastRate state.
  665 + bool BulkSetSamplerate2250::getFastRate() {
  666 + return ((ESamplerateBits *) &(this->array[2]))->fastRate == 1;
  667 + }
  668 +
  669 + /// \brief Set the fastRate in ESamplerateBits to the given state.
  670 + /// \param fastRate The new fastRate state.
  671 + void BulkSetSamplerate2250::setFastRate(bool fastRate) {
  672 + ((ESamplerateBits *) &(this->array[2]))->fastRate = fastRate ? 1 : 0;
  673 + }
  674 +
  675 + /// \brief Get the samplerateFast value in ESamplerateBits.
  676 + /// \return The samplerateFast value in ESamplerateBits.
  677 + unsigned char BulkSetSamplerate2250::getSamplerateFast() {
  678 + return ((ESamplerateBits *) &(this->array[2]))->samplerateFast;
  679 + }
  680 +
  681 + /// \brief Set the samplerateFast in ESamplerateBits to the given value.
  682 + /// \param value The new samplerateFast value.
  683 + void BulkSetSamplerate2250::setSamplerateFast(unsigned char value) {
  684 + ((ESamplerateBits *) &(this->array[2]))->samplerateFast = value;
  685 + }
  686 +
  687 + /// \brief Get the SamplerateSlow value.
  688 + /// \return The SamplerateSlow value.
  689 + unsigned short int BulkSetSamplerate2250::getSamplerateSlow() {
  690 + return (unsigned short int) this->array[4] | ((unsigned short int) this->array[5] << 8);
  691 + }
  692 +
  693 + /// \brief Set the SamplerateSlow to the given value.
  694 + /// \param samplerate The new SamplerateSlow value.
  695 + void BulkSetSamplerate2250::setSamplerateSlow(unsigned short int samplerate) {
  696 + this->array[4] = (unsigned char) samplerate;
  697 + this->array[5] = (unsigned char) (samplerate >> 8);
  698 + }
  699 +
  700 + /// \brief Initialize the array to the needed values.
  701 + void BulkSetSamplerate2250::init() {
  702 + this->array[0] = BULK_ESETTRIGGERORSAMPLERATE;
  703 + }
  704 +
  705 +
  706 + //////////////////////////////////////////////////////////////////////////////
708 707 // class BulkSetTrigger5200
709 708 /// \brief Sets the data array to the default values.
710 709 BulkSetTrigger5200::BulkSetTrigger5200() : Helper::DataArray<unsigned char>(8) {
... ... @@ -789,7 +788,301 @@ namespace Hantek {
789 788  
790 789 /// \brief Initialize the array to the needed values.
791 790 void BulkSetTrigger5200::init() {
792   - this->array[0] = BULK_SETTRIGGER5200;
  791 + this->array[0] = BULK_ESETTRIGGERORSAMPLERATE;
793 792 this->array[4] = 0x02;
794 793 }
  794 +
  795 +
  796 + //////////////////////////////////////////////////////////////////////////////
  797 + /// \class BulkSetBuffer2250 hantek/types.h
  798 + /// \brief The DSO-2250 BULK_FSETBUFFER builder.
  799 + /// \brief Sets the data array to the default values.
  800 + BulkSetBuffer2250::BulkSetBuffer2250() : Helper::DataArray<unsigned char>(10) {
  801 + this->init();
  802 + }
  803 +
  804 + /// \brief Sets the data bytes to the specified values.
  805 + /// \param triggerPositionPre The TriggerPositionPre value.
  806 + /// \param triggerPositionPost The TriggerPositionPost value.
  807 + /// \param usedPre The TriggerPositionUsedPre value.
  808 + /// \param usedPost The TriggerPositionUsedPost value.
  809 + /// \param largeBuffer The largeBuffer state.
  810 + /// \param slowBuffer The slowBuffer state.
  811 + BulkSetBuffer2250::BulkSetBuffer2250(unsigned short int triggerPositionPre, unsigned short int triggerPositionPost, unsigned char usedPre, unsigned char usedPost, bool largeBuffer, bool slowBuffer) : Helper::DataArray<unsigned char>(10) {
  812 + this->init();
  813 +
  814 + this->setTriggerPositionPre(triggerPositionPre);
  815 + this->setTriggerPositionPost(triggerPositionPost);
  816 + this->setUsedPre(usedPre);
  817 + this->setUsedPost(usedPost);
  818 + this->setLargeBuffer(largeBuffer);
  819 + this->setSlowBuffer(slowBuffer);
  820 + }
  821 +
  822 + /// \brief Get the TriggerPositionPre value.
  823 + /// \return The TriggerPositionPre value.
  824 + unsigned short int BulkSetBuffer2250::getTriggerPositionPre() {
  825 + return (unsigned short int) this->array[2] | ((unsigned short int) this->array[3] << 8);
  826 + }
  827 +
  828 + /// \brief Set the TriggerPositionPre to the given value.
  829 + /// \param position The new TriggerPositionPre value.
  830 + void BulkSetBuffer2250::setTriggerPositionPre(unsigned short int position) {
  831 + this->array[2] = (unsigned char) position;
  832 + this->array[3] = (unsigned char) (position >> 8);
  833 + }
  834 +
  835 + /// \brief Get the TriggerPositionPost value.
  836 + /// \return The TriggerPositionPost value.
  837 + unsigned short int BulkSetBuffer2250::getTriggerPositionPost() {
  838 + return (unsigned short int) this->array[6] | ((unsigned short int) this->array[7] << 8);
  839 + }
  840 +
  841 + /// \brief Set the TriggerPositionPost to the given value.
  842 + /// \param position The new TriggerPositionPost value.
  843 + void BulkSetBuffer2250::setTriggerPositionPost(unsigned short int position) {
  844 + this->array[6] = (unsigned char) position;
  845 + this->array[7] = (unsigned char) (position >> 8);
  846 + }
  847 +
  848 + /// \brief Get the TriggerPositionUsedPre value.
  849 + /// \return The ::DTriggerPositionUsed value for the pre position.
  850 + unsigned char BulkSetBuffer2250::getUsedPre() {
  851 + return ((FBuffer1Bits *) &(this->array[4]))->triggerPositionUsed;
  852 + }
  853 +
  854 + /// \brief Set the TriggerPositionUsedPre to the given value.
  855 + /// \param value The new ::DTriggerPositionUsed value for the pre position.
  856 + void BulkSetBuffer2250::setUsedPre(unsigned char value) {
  857 + ((FBuffer1Bits *) &(this->array[4]))->triggerPositionUsed = value;
  858 + }
  859 +
  860 + /// \brief Get the TriggerPositionUsedPost value.
  861 + /// \return The ::DTriggerPositionUsed value for the post position.
  862 + unsigned char BulkSetBuffer2250::getUsedPost() {
  863 + return ((FBuffer1Bits *) &(this->array[8]))->triggerPositionUsed;
  864 + }
  865 +
  866 + /// \brief Set the TriggerPositionUsedPost to the given value.
  867 + /// \param value The new ::DTriggerPositionUsed value for the post position.
  868 + void BulkSetBuffer2250::setUsedPost(unsigned char value) {
  869 + ((FBuffer1Bits *) &(this->array[8]))->triggerPositionUsed = value;
  870 + }
  871 +
  872 + /// \brief Get the largeBuffer state in FBuffer1Bits.
  873 + /// \return The largeBuffer state.
  874 + bool BulkSetBuffer2250::getLargeBuffer() {
  875 + return ((FBuffer1Bits *) &(this->array[2]))->largeBuffer == 0;
  876 + }
  877 +
  878 + /// \brief Set the largeBuffer in FBuffer1Bits to the given state.
  879 + /// \param largeBuffer The new largeBuffer state.
  880 + void BulkSetBuffer2250::setLargeBuffer(bool largeBuffer) {
  881 + ((FBuffer1Bits *) &(this->array[2]))->largeBuffer = largeBuffer ? 0 : 1;
  882 + }
  883 +
  884 + /// \brief Get the slowBuffer state in FBuffer2Bits.
  885 + /// \return The slowBuffer state.
  886 + bool BulkSetBuffer2250::getSlowBuffer() {
  887 + return ((FBuffer2Bits *) &(this->array[2]))->slowBuffer == 1;
  888 + }
  889 +
  890 + /// \brief Set the slowBuffer in FBuffer2Bits to the given state.
  891 + /// \param slowBuffer The new slowBuffer state.
  892 + void BulkSetBuffer2250::setSlowBuffer(bool slowBuffer) {
  893 + ((FBuffer2Bits *) &(this->array[2]))->slowBuffer = slowBuffer ? 1 : 0;
  894 + }
  895 +
  896 + /// \brief Initialize the array to the needed values.
  897 + void BulkSetBuffer2250::init() {
  898 + this->array[0] = BULK_FSETBUFFER;
  899 + }
  900 +
  901 +
  902 + //////////////////////////////////////////////////////////////////////////////
  903 + // class ControlGetSpeed
  904 + /// \brief Initializes the array.
  905 + ControlGetSpeed::ControlGetSpeed() : Helper::DataArray<unsigned char>(10) {
  906 + }
  907 +
  908 + /// \brief Gets the speed of the connection.
  909 + /// \return The speed level of the USB connection.
  910 + ConnectionSpeed ControlGetSpeed::getSpeed() {
  911 + return (ConnectionSpeed) this->array[0];
  912 + }
  913 +
  914 +
  915 + //////////////////////////////////////////////////////////////////////////////
  916 + // class ControlBeginCommand
  917 + /// \brief Sets the command index to the given value.
  918 + /// \param index The CommandIndex for the command.
  919 + ControlBeginCommand::ControlBeginCommand(BulkIndex index) : Helper::DataArray<unsigned char>(10) {
  920 + this->init();
  921 +
  922 + this->setIndex(index);
  923 + }
  924 +
  925 + /// \brief Gets the command index.
  926 + /// \return The CommandIndex for the command.
  927 + BulkIndex ControlBeginCommand::getIndex() {
  928 + return (BulkIndex) this->array[1];
  929 + }
  930 +
  931 + /// \brief Sets the command index to the given value.
  932 + /// \param index The new CommandIndex for the command.
  933 + void ControlBeginCommand::setIndex(BulkIndex index) {
  934 + memset(&(this->array[1]), (unsigned char) index, 3);
  935 + }
  936 +
  937 + /// \brief Initialize the array to the needed values.
  938 + void ControlBeginCommand::init() {
  939 + this->array[0] = 0x0f;
  940 + }
  941 +
  942 +
  943 + //////////////////////////////////////////////////////////////////////////////
  944 + // class ControlSetOffset
  945 + /// \brief Sets the data array to the default values.
  946 + ControlSetOffset::ControlSetOffset() : Helper::DataArray<unsigned char>(17) {
  947 + }
  948 +
  949 + /// \brief Sets the offsets to the given values.
  950 + /// \param channel1 The offset for channel 1.
  951 + /// \param channel2 The offset for channel 2.
  952 + /// \param trigger The offset for ext. trigger.
  953 + ControlSetOffset::ControlSetOffset(unsigned short int channel1, unsigned short int channel2, unsigned short int trigger) : Helper::DataArray<unsigned char>(17) {
  954 + this->setChannel(0, channel1);
  955 + this->setChannel(1, channel2);
  956 + this->setTrigger(trigger);
  957 + }
  958 +
  959 + /// \brief Get the offset for the given channel.
  960 + /// \param channel The channel whose offset should be returned.
  961 + /// \return The channel offset value.
  962 + unsigned short int ControlSetOffset::getChannel(unsigned int channel) {
  963 + if(channel == 0)
  964 + return ((this->array[0] & 0x0f) << 8) | this->array[1];
  965 + else
  966 + return ((this->array[2] & 0x0f) << 8) | this->array[3];
  967 + }
  968 +
  969 + /// \brief Set the offset for the given channel.
  970 + /// \param channel The channel that should be set.
  971 + /// \param offset The new channel offset value.
  972 + void ControlSetOffset::setChannel(unsigned int channel, unsigned short int offset) {
  973 + if(channel == 0) {
  974 + this->array[0] = (unsigned char) (offset >> 8);
  975 + this->array[1] = (unsigned char) offset;
  976 + }
  977 + else {
  978 + this->array[2] = (unsigned char) (offset >> 8);
  979 + this->array[3] = (unsigned char) offset;
  980 + }
  981 + }
  982 +
  983 + /// \brief Get the trigger level.
  984 + /// \return The trigger level value.
  985 + unsigned short int ControlSetOffset::getTrigger() {
  986 + return ((this->array[4] & 0x0f) << 8) | this->array[5];
  987 + }
  988 +
  989 + /// \brief Set the trigger level.
  990 + /// \param level The new trigger level value.
  991 + void ControlSetOffset::setTrigger(unsigned short int level) {
  992 + this->array[4] = (unsigned char) (level >> 8);
  993 + this->array[5] = (unsigned char) level;
  994 + }
  995 +
  996 +
  997 + //////////////////////////////////////////////////////////////////////////////
  998 + // class ControlSetRelays
  999 + /// \brief Sets all relay states.
  1000 + /// \param ch1Below1V Sets the state of the Channel 1 below 1 V relay.
  1001 + /// \param ch1Below100mV Sets the state of the Channel 1 below 100 mV relay.
  1002 + /// \param ch1CouplingDC Sets the state of the Channel 1 coupling relay.
  1003 + /// \param ch2Below1V Sets the state of the Channel 2 below 1 V relay.
  1004 + /// \param ch2Below100mV Sets the state of the Channel 2 below 100 mV relay.
  1005 + /// \param ch2CouplingDC Sets the state of the Channel 2 coupling relay.
  1006 + /// \param triggerExt Sets the state of the external trigger relay.
  1007 + ControlSetRelays::ControlSetRelays(bool ch1Below1V, bool ch1Below100mV, bool ch1CouplingDC, bool ch2Below1V, bool ch2Below100mV, bool ch2CouplingDC, bool triggerExt) : Helper::DataArray<unsigned char>(17) {
  1008 + this->setBelow1V(0, ch1Below1V);
  1009 + this->setBelow100mV(0, ch1Below100mV);
  1010 + this->setCoupling(0, ch1CouplingDC);
  1011 + this->setBelow1V(1, ch2Below1V);
  1012 + this->setBelow100mV(1, ch2Below100mV);
  1013 + this->setCoupling(1, ch2CouplingDC);
  1014 + this->setTrigger(triggerExt);
  1015 + }
  1016 +
  1017 + /// \brief Get the below 1 V relay state for the given channel.
  1018 + /// \param channel The channel whose relay state should be returned.
  1019 + /// \return true, if the gain of the channel is below 1 V.
  1020 + bool ControlSetRelays::getBelow1V(unsigned int channel) {
  1021 + if(channel == 0)
  1022 + return (this->array[1] & 0x04) == 0x00;
  1023 + else
  1024 + return (this->array[4] & 0x20) == 0x00;
  1025 + }
  1026 +
  1027 + /// \brief Set the below 1 V relay for the given channel.
  1028 + /// \param channel The channel that should be set.
  1029 + /// \param below true, if the gain of the channel should be below 1 V.
  1030 + void ControlSetRelays::setBelow1V(unsigned int channel, bool below) {
  1031 + if(channel == 0)
  1032 + this->array[1] = below ? 0xfb : 0x04;
  1033 + else
  1034 + this->array[4] = below ? 0xdf : 0x20;
  1035 + }
  1036 +
  1037 + /// \brief Get the below 1 V relay state for the given channel.
  1038 + /// \param channel The channel whose relay state should be returned.
  1039 + /// \return true, if the gain of the channel is below 1 V.
  1040 + bool ControlSetRelays::getBelow100mV(unsigned int channel) {
  1041 + if(channel == 0)
  1042 + return (this->array[2] & 0x08) == 0x00;
  1043 + else
  1044 + return (this->array[5] & 0x40) == 0x00;
  1045 + }
  1046 +
  1047 + /// \brief Set the below 100 mV relay for the given channel.
  1048 + /// \param channel The channel that should be set.
  1049 + /// \param below true, if the gain of the channel should be below 100 mV.
  1050 + void ControlSetRelays::setBelow100mV(unsigned int channel, bool below) {
  1051 + if(channel == 0)
  1052 + this->array[2] = below ? 0xf7 : 0x08;
  1053 + else
  1054 + this->array[5] = below ? 0xbf : 0x40;
  1055 + }
  1056 +
  1057 + /// \brief Get the coupling relay state for the given channel.
  1058 + /// \param channel The channel whose relay state should be returned.
  1059 + /// \return true, if the coupling of the channel is DC.
  1060 + bool ControlSetRelays::getCoupling(unsigned int channel) {
  1061 + if(channel == 0)
  1062 + return (this->array[3] & 0x02) == 0x00;
  1063 + else
  1064 + return (this->array[6] & 0x10) == 0x00;
  1065 + }
  1066 +
  1067 + /// \brief Set the coupling relay for the given channel.
  1068 + /// \param channel The channel that should be set.
  1069 + /// \param dc true, if the coupling of the channel should be DC.
  1070 + void ControlSetRelays::setCoupling(unsigned int channel, bool dc) {
  1071 + if(channel == 0)
  1072 + this->array[3] = dc ? 0xfd : 0x02;
  1073 + else
  1074 + this->array[6] = dc ? 0xef : 0x10;
  1075 + }
  1076 +
  1077 + /// \brief Get the external trigger relay state.
  1078 + /// \return true, if the trigger is external (EXT-Connector).
  1079 + bool ControlSetRelays::getTrigger() {
  1080 + return (this->array[7] & 0x01) == 0x00;
  1081 + }
  1082 +
  1083 + /// \brief Set the external trigger relay.
  1084 + /// \param ext true, if the trigger should be external (EXT-Connector).
  1085 + void ControlSetRelays::setTrigger(bool ext) {
  1086 + this->array[7] = ext ? 0xfe : 0x01;
  1087 + }
795 1088 }
... ...
openhantek/src/hantek/types.h
... ... @@ -51,7 +51,7 @@ namespace Hantek {
51 51 /// \brief All supported bulk commands.
52 52 /// Indicies given in square brackets specify byte numbers in little endian format.
53 53 enum BulkCode {
54   - /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A]</em>
  54 + /// BulkSetFilter [<em>::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO5200, ::MODEL_DSO5200A</em>]
55 55 /// <p>
56 56 /// This command sets channel and trigger filter:
57 57 /// <table>
... ... @@ -70,7 +70,7 @@ namespace Hantek {
70 70 /// <p><br /></p>
71 71 BULK_SETFILTER,
72 72  
73   - /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150]</em>
  73 + /// BulkSetTriggerAndSamplerate [<em>::MODEL_DSO2090, ::MODEL_DSO2150</em>]
74 74 /// <p>
75 75 /// This command sets trigger and timebase:
76 76 /// <table>
... ... @@ -99,7 +99,7 @@ namespace Hantek {
99 99 /// Without using fast rate mode, the samplerate is:<br />
100 100 /// <i>Samplerate = SamplerateMax / (1comp(SamplerateSlow) * 2 + Tsr1Bits.samplerateFast)</i><br />
101 101 /// SamplerateMax is 50 MHz for the DSO-2090.<br />
102   - /// When using fast rate mode the resulting samplerate is twice (For DSO-2150 three times) as fast, when using the large buffer it is half as fast. When Tsr1Bits.bufferSize is 0 (Roll mode) the sampling rate is divided by 1000. Setting Tsr1Bits.samplerateFast to 0 doesn't work, the result will be the same as Tsr1Bits.samplerateFast = 1. SamplerateSlow can't be used together with fast rate mode, the result is always the the same as SlowValue = 0.
  102 + /// When using fast rate mode the resulting samplerate is twice (For DSO-2150 three times) as fast, when using the large buffer it is half as fast. When Tsr1Bits.recordLength is 0 (Roll mode) the sampling rate is divided by 1000. Setting Tsr1Bits.samplerateFast to 0 doesn't work, the result will be the same as Tsr1Bits.samplerateFast = 1. SamplerateSlow can't be used together with fast rate mode, the result is always the the same as SlowValue = 0.
103 103 /// </p>
104 104 /// <p>
105 105 /// The TriggerPosition sets the position of the pretrigger in samples. The left side (0 %) is 0x77660 when using the small buffer and 0x78000 when using the large buffer.
... ... @@ -107,7 +107,7 @@ namespace Hantek {
107 107 /// <p><br /></p>
108 108 BULK_SETTRIGGERANDSAMPLERATE,
109 109  
110   - /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A]</em>
  110 + /// BulkForceTrigger [<em>::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A</em>]
111 111 /// <p>
112 112 /// This command forces triggering:
113 113 /// <table>
... ... @@ -120,7 +120,7 @@ namespace Hantek {
120 120 /// <p><br /></p>
121 121 BULK_FORCETRIGGER,
122 122  
123   - /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A]</em>
  123 + /// BulkCaptureStart [<em>::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A</em>]
124 124 /// <p>
125 125 /// This command starts to capture data:
126 126 /// <table>
... ... @@ -133,7 +133,7 @@ namespace Hantek {
133 133 /// <p><br /></p>
134 134 BULK_STARTSAMPLING,
135 135  
136   - /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A]</em>
  136 + /// BulkTriggerEnabled [<em>::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A</em>]
137 137 /// <p>
138 138 /// This command sets the trigger:
139 139 /// <table>
... ... @@ -146,7 +146,7 @@ namespace Hantek {
146 146 /// <p><br /></p>
147 147 BULK_ENABLETRIGGER,
148 148  
149   - /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A]</em>
  149 + /// BulkGetData [<em>::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A</em>]
150 150 /// <p>
151 151 /// This command reads data from the hardware:
152 152 /// <table>
... ... @@ -194,7 +194,7 @@ namespace Hantek {
194 194 /// <p><br /></p>
195 195 BULK_GETDATA,
196 196  
197   - /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A]</em>
  197 + /// BulkGetCaptureState [<em>::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A</em>]
198 198 /// <p>
199 199 /// This command checks the capture state:
200 200 /// <table>
... ... @@ -219,7 +219,7 @@ namespace Hantek {
219 219 /// <p><br /></p>
220 220 BULK_GETCAPTURESTATE,
221 221  
222   - /// <em>[::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A]</em>
  222 + /// BulkSetGain [<em>::MODEL_DSO2090, ::MODEL_DSO2150, ::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A</em>]
223 223 /// <p>
224 224 /// This command sets the gain:
225 225 /// <table>
... ... @@ -239,9 +239,9 @@ namespace Hantek {
239 239 /// <p><br /></p>
240 240 BULK_SETGAIN,
241 241  
242   - /// <em>[]</em>
  242 + /// BulkSetLogicalData [<em></em>]
243 243 /// <p>
244   - /// This command sets the logical data (Not used in official Hantek software):
  244 + /// This command sets the logical data (Not used in official %Hantek software):
245 245 /// <table>
246 246 /// <tr>
247 247 /// <td>0x08</td>
... ... @@ -258,9 +258,9 @@ namespace Hantek {
258 258 /// <p><br /></p>
259 259 BULK_SETLOGICALDATA,
260 260  
261   - /// <em>[::MODEL_DSO2250]</em>
  261 + /// BulkGetLogicalData [<em></em>]
262 262 /// <p>
263   - /// This command reads the logical data (Not used in official Hantek software):
  263 + /// This command reads the logical data (Not used in official %Hantek software):
264 264 /// <table>
265 265 /// <tr>
266 266 /// <td>0x09</td>
... ... @@ -280,7 +280,7 @@ namespace Hantek {
280 280 /// <p><br /></p>
281 281 BULK_GETLOGICALDATA,
282 282  
283   - /// <em>[]</em>
  283 + /// [<em></em>]
284 284 /// <p>
285 285 /// This command isn't used for any supported model:
286 286 /// <table>
... ... @@ -291,24 +291,41 @@ namespace Hantek {
291 291 /// </table>
292 292 /// </p>
293 293 /// <p><br /></p>
294   - BULK_UNKNOWN_0A,
  294 + BULK_AUNKNOWN,
295 295  
296   - /// <em>[::MODEL_DSO2250]</em>
  296 + /// BulkSetFilter2250 [<em>::MODEL_DSO2250</em>]
297 297 /// <p>
298   - /// This command is used for the DSO-2250:
  298 + /// This command sets the activated channels for the DSO-2250:
299 299 /// <table>
300 300 /// <tr>
301 301 /// <td>0x0b</td>
302 302 /// <td>0x00</td>
303   - /// <td>(unknown)</td>
  303 + /// <td>::UsedChannels</td>
304 304 /// <td>0x00</td>
305 305 /// </tr>
306 306 /// </table>
307 307 /// </p>
308 308 /// <p><br /></p>
309   - BULK_UNKNOWN_0B,
  309 + BULK_BSETFILTER,
310 310  
311   - /// <em>[::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A]</em>
  311 + /// BulkSetTrigger2250 [<em>::MODEL_DSO2250</em>]
  312 + /// <p>
  313 + /// This command sets the trigger source for the DSO-2250:
  314 + /// <table>
  315 + /// <tr>
  316 + /// <td>0x0c</td>
  317 + /// <td>0x0f</td>
  318 + /// <td>CTriggerBits</td>
  319 + /// <td>0x00</td>
  320 + /// <td>0x02</td>
  321 + /// <td>0x00</td>
  322 + /// <td>0x00</td>
  323 + /// <td>0x00</td>
  324 + /// </tr>
  325 + /// </table>
  326 + /// </p>
  327 + /// <p><br /></p>
  328 + /// BulkSetSamplerate5200 [<em>::MODEL_DSO5200, ::MODEL_DSO5200A</em>]
312 329 /// <p>
313 330 /// This command sets the sampling rate for the DSO-5200:
314 331 /// <table>
... ... @@ -325,14 +342,27 @@ namespace Hantek {
325 342 /// <p>
326 343 /// The values are similar to the ones used with ::BULK_SETTRIGGERANDSAMPLERATE. The formula is a bit different here:<br />
327 344 /// <i>Samplerate = SamplerateMax / (2comp(SamplerateSlow) * 2 + 4 - SamplerateFast)</i><br />
328   - /// SamplerateMax is 100 MS/s for the DSO-5200 in default configuration and 250 MS/s in fast rate mode though, the modifications regarding buffer size are the the same that apply for the DSO-2090.
  345 + /// SamplerateMax is 100 MS/s for the DSO-5200 in default configuration and 250 MS/s in fast rate mode though, the modifications regarding record length are the the same that apply for the DSO-2090.
329 346 /// </p>
330 347 /// <p><br /></p>
331   - BULK_SETSAMPLERATE5200,
332   -
333   - /// <em>[::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A]</em>
  348 + BULK_CSETTRIGGERORSAMPLERATE,
  349 +
  350 + /// BulkSetRecordLength2250 [<em>::MODEL_DSO2250</em>]
  351 + /// <p>
  352 + /// This command sets the record length for the DSO-2250:
  353 + /// <table>
  354 + /// <tr>
  355 + /// <td>0x0d</td>
  356 + /// <td>0x00</td>
  357 + /// <td>::RecordLengthId</td>
  358 + /// <td>0x00</td>
  359 + /// </tr>
  360 + /// </table>
  361 + /// </p>
  362 + /// <p><br /></p>
  363 + /// BulkSetBuffer5200 [<em>::MODEL_DSO5200, ::MODEL_DSO5200A</em>]
334 364 /// <p>
335   - /// This command sets the trigger position and buffer size for the DSO-5200:
  365 + /// This command sets the trigger position and record length for the DSO-5200:
336 366 /// <table>
337 367 /// <tr>
338 368 /// <td>0x0d</td>
... ... @@ -356,18 +386,40 @@ namespace Hantek {
356 386 /// The TriggerPositionPre and TriggerPositionPost values set the pretrigger position. Both values have a range from 0xd7ff (0xc7ff for 14 kiS buffer) to 0xfffe. On the left side (0 %) the TriggerPositionPre value is minimal, on the right side (100 %) it is maximal. The TriggerPositionPost value is maximal for 0 % and minimal for 100%.
357 387 /// </p>
358 388 /// <p><br /></p>
359   - BULK_SETBUFFER5200,
  389 + BULK_DSETBUFFER,
360 390  
361   - /// <em>[::MODEL_DSO2250, ::MODEL_DSO5200, ::MODEL_DSO5200A]</em>
  391 + /// BulkSetSamplerate2250 [<em>::MODEL_DSO2250</em>]
  392 + /// <p>
  393 + /// This command sets the samplerate:
  394 + /// <table>
  395 + /// <tr>
  396 + /// <td>0x0e</td>
  397 + /// <td>0x00</td>
  398 + /// <td>ESamplerateBits</td>
  399 + /// <td>0x00</td>
  400 + /// <td>SamplerateSlow[0]</td>
  401 + /// <td>SamplerateSlow[1]</td>
  402 + /// <td>0x00</td>
  403 + /// <td>0x00</td>
  404 + /// </tr>
  405 + /// </table>
  406 + /// </p>
362 407 /// <p>
363   - /// This command sets the channel and trigger settings for the DSO-5200:
  408 + /// The values are similar to the ones used with ::BULK_SETTRIGGERANDSAMPLERATE. The formula is a bit different here:<br />
  409 + /// <i>Samplerate = SamplerateMax / (2comp(SamplerateSlow) * 2 + ESamplerateBits.samplerateFast)</i><br />
  410 + /// SamplerateMax is 100 MS/s for the DSO-2250 in default configuration and 250 MS/s in fast rate mode though, the modifications regarding record length are the the same that apply for the DSO-2090.
  411 + /// </p>
  412 + /// <p><br /></p>
  413 + /// BulkSetTrigger5200 [<em>::MODEL_DSO5200, ::MODEL_DSO5200A</em>]
  414 + /// <p>
  415 + /// This command sets the channel and trigger settings:
364 416 /// <table>
365 417 /// <tr>
366 418 /// <td>0x0e</td>
367 419 /// <td>0x00</td>
368 420 /// <td>ETsrBits</td>
369 421 /// <td>0x00</td>
370   - /// <td>Unknown (0x02)</td>
  422 + /// <td>0x00</td>
371 423 /// <td>0x00</td>
372 424 /// <td>0x00</td>
373 425 /// <td>0x00</td>
... ... @@ -375,34 +427,37 @@ namespace Hantek {
375 427 /// </table>
376 428 /// </p>
377 429 /// <p><br /></p>
378   - BULK_SETTRIGGER5200,
  430 + BULK_ESETTRIGGERORSAMPLERATE,
379 431  
380   - /// <em>[::MODEL_DSO2250]</em>
  432 + /// BulkSetBuffer2250 [<em>::MODEL_DSO2250</em>]
381 433 /// <p>
382   - /// This command is used for the DSO-2250:
  434 + /// This command sets the trigger position and buffer configuration for the DSO-2250:
383 435 /// <table>
384 436 /// <tr>
385 437 /// <td>0x0f</td>
386 438 /// <td>0x00</td>
387   - /// <td>(unknown)</td>
388   - /// <td>(unknown)</td>
389   - /// <td>(unknown)</td>
390   - /// <td>(unknown)</td>
  439 + /// <td>TriggerPositionPre[0]</td>
  440 + /// <td>TriggerPositionPre[1]</td>
  441 + /// <td>FBuffer1Bits</td>
  442 + /// <td>0x00</td>
391 443 /// </tr>
392 444 /// </table>
393 445 /// <table>
394 446 /// <tr>
395   - /// <td>(unknown)</td>
396   - /// <td>(unknown)</td>
397   - /// <td>(unknown)</td>
398   - /// <td>(unknown)</td>
399   - /// <td>(unknown)</td>
400   - /// <td>(unknown)</td>
  447 + /// <td>TriggerPositionPost[0]</td>
  448 + /// <td>TriggerPositionPost[1]</td>
  449 + /// <td>FBuffer1Bits</td>
  450 + /// <td>0x00</td>
  451 + /// <td>FBuffer2Bits</td>
  452 + /// <td>0x00</td>
401 453 /// </tr>
402 454 /// </table>
403 455 /// </p>
  456 + /// <p>
  457 + /// The TriggerPositionPre and TriggerPositionPost values set the pretrigger position. Both values have a range from 0xd7ff (0xc7ff for 14 kiS buffer) to 0xfffe. On the left side (0 %) the TriggerPositionPre value is minimal, on the right side (100 %) it is maximal. The TriggerPositionPost value is maximal for 0 % and minimal for 100%.
  458 + /// </p>
404 459 /// <p><br /></p>
405   - BULK_UNKNOWN_0F,
  460 + BULK_FSETBUFFER,
406 461  
407 462 BULK_COUNT
408 463 };
... ... @@ -556,14 +611,14 @@ namespace Hantek {
556 611 /// Value 0x60 is the calibration data for the fast rate mode on the DSO-2250, DSO-5200 and DSO-5200A. It's used to correct the level differences between the two merged channels to avoid deterministic noise.
557 612 /// </p>
558 613 /// <p><br /></p>
559   - VALUE_CALIBRATIONDATA = 0x60,
  614 + VALUE_FASTRATECALIBRATION = 0x60,
560 615  
561 616 /// <em>[::MODEL_DSO5200, ::MODEL_DSO5200A]</em>
562 617 /// <p>
563 618 /// Value 0x70 contains correction values for the ETS functionality of the DSO-5200 and DSO-5200A.
564 619 /// </p>
565 620 /// <p><br /></p>
566   - VALUE_VOLTAGELIMITS = 0x70
  621 + VALUE_ETSCORRECTION = 0x70
567 622 };
568 623  
569 624 //////////////////////////////////////////////////////////////////////////////
... ... @@ -591,8 +646,10 @@ namespace Hantek {
591 646 /// \enum UsedChannels hantek/types.h
592 647 /// \brief The enabled channels.
593 648 enum UsedChannels {
594   - USED_CH1, USED_CH2,
595   - USED_CH1CH2
  649 + USED_CH1, ///< Only channel 1 is activated
  650 + USED_CH2, ///< Only channel 2 is activated
  651 + USED_CH1CH2, ///< Channel 1 and 2 are both activated
  652 + USED_NONE ///< No channels are activated
596 653 };
597 654  
598 655 //////////////////////////////////////////////////////////////////////////////
... ... @@ -605,21 +662,12 @@ namespace Hantek {
605 662 };
606 663  
607 664 //////////////////////////////////////////////////////////////////////////////
608   - /// \enum BufferSize hantek/types.h
609   - /// \brief The size of the sample buffer.
610   - enum BufferSize {
611   - BUFFER_SMALL = 10240,
612   - BUFFER_LARGE5200 = 14336,
613   - BUFFER_LARGE = 32768
614   - };
615   -
616   - //////////////////////////////////////////////////////////////////////////////
617   - /// \enum BufferSizeId hantek/types.h
  665 + /// \enum RecordLengthId hantek/types.h
618 666 /// \brief The size id for CommandSetTriggerAndSamplerate.
619   - enum BufferSizeId {
620   - BUFFERID_ROLL = 0, ///< Used for the roll mode
621   - BUFFERID_SMALL, ///< The standard buffer with 10240 samples
622   - BUFFERID_LARGE ///< The large buffer, 32768 samples (14336 for DSO-5200)
  667 + enum RecordLengthId {
  668 + RECORDLENGTHID_ROLL = 0, ///< Used for the roll mode
  669 + RECORDLENGTHID_SMALL, ///< The standard buffer with 10240 samples
  670 + RECORDLENGTHID_LARGE ///< The large buffer, 32768 samples (14336 for DSO-5200)
623 671 };
624 672  
625 673 //////////////////////////////////////////////////////////////////////////////
... ... @@ -662,6 +710,14 @@ namespace Hantek {
662 710 };
663 711  
664 712 //////////////////////////////////////////////////////////////////////////////
  713 + /// \enum FTriggerPositionUsed hantek/types.h
  714 + /// \brief The trigger position states for the 0x0f command.
  715 + enum FTriggerPositionUsed {
  716 + FTRIGGERPOSITION_OFF = 0, ///< Used for Roll mode
  717 + FTRIGGERPOSITION_ON = 3 ///< Used for normal operation
  718 + };
  719 +
  720 + //////////////////////////////////////////////////////////////////////////////
665 721 /// \struct FilterBits hantek/types.h
666 722 /// \brief The bits for BULK_SETFILTER.
667 723 struct FilterBits {
... ... @@ -685,7 +741,7 @@ namespace Hantek {
685 741 /// \brief Trigger and samplerate bits (Byte 1).
686 742 struct Tsr1Bits {
687 743 unsigned char triggerSource:2; ///< The trigger source, see Hantek::TriggerSource
688   - unsigned char bufferSize:3; ///< See ::BufferSizeId
  744 + unsigned char recordLength:3; ///< See ::RecordLengthId
689 745 unsigned char samplerateFast:3; ///< samplerate value for fast sampling rates
690 746 };
691 747  
... ... @@ -700,17 +756,35 @@ namespace Hantek {
700 756 };
701 757  
702 758 //////////////////////////////////////////////////////////////////////////////
  759 + /// \struct CTriggerBits hantek/types.h
  760 + /// \brief Trigger bits for 0x0c command.
  761 + struct CTriggerBits {
  762 + unsigned char triggerSource:2; ///< The trigger source, see Hantek::TriggerSource
  763 + unsigned char triggerSlope:1; ///< The trigger slope, see Dso::Slope
  764 + unsigned char reserved:5; ///< Unused bits
  765 + };
  766 +
  767 + //////////////////////////////////////////////////////////////////////////////
703 768 /// \struct DBufferBits hantek/types.h
704 769 /// \brief Buffer mode bits for 0x0d command.
705 770 struct DBufferBits {
706 771 unsigned char triggerPositionUsed:3; ///< See ::DTriggerPositionUsed
707   - unsigned char bufferSize:3; ///< See ::BufferSizeId
  772 + unsigned char recordLength:3; ///< See ::RecordLengthId
708 773 unsigned char reserved:2; ///< Unused bits
709 774 };
710 775  
711 776 //////////////////////////////////////////////////////////////////////////////
  777 + /// \struct ESamplerateBits hantek/types.h
  778 + /// \brief Samplerate bits for DSO-2250 0x0e command.
  779 + struct ESamplerateBits {
  780 + unsigned char fastRate:1; ///< false, if one channels uses all buffers
  781 + unsigned char samplerateFast:3; ///< samplerate value for fast sampling rates
  782 + unsigned char reserved:4; ///< Unused bits
  783 + };
  784 +
  785 + //////////////////////////////////////////////////////////////////////////////
712 786 /// \struct ETsrBits hantek/types.h
713   - /// \brief Trigger and samplerate bits for 0x0e command.
  787 + /// \brief Trigger and samplerate bits for DSO-5200/DSO-5200A 0x0e command.
714 788 struct ETsrBits {
715 789 unsigned char fastRate:1; ///< false, if one channels uses all buffers
716 790 unsigned char usedChannels:2; ///< Used channels, see Hantek::UsedChannels
... ... @@ -720,6 +794,23 @@ namespace Hantek {
720 794 };
721 795  
722 796 //////////////////////////////////////////////////////////////////////////////
  797 + /// \struct FBuffer1Bits hantek/types.h
  798 + /// \brief Buffer mode bits for 0x0f command (Byte 1).
  799 + struct FBuffer1Bits {
  800 + unsigned char triggerPositionUsed:2; ///< See ::DTriggerPositionUsed
  801 + unsigned char largeBuffer:1; ///< false, if ::RecordLengthId is ::RECORDLENGTHID_LARGE
  802 + unsigned char reserved:5; ///< Unused bits
  803 + };
  804 +
  805 + //////////////////////////////////////////////////////////////////////////////
  806 + /// \struct FBuffer2Bits hantek/types.h
  807 + /// \brief Buffer mode bits for 0x0f command (Byte 2).
  808 + struct FBuffer2Bits {
  809 + unsigned char reserved:7; ///< Unused bits
  810 + unsigned char slowBuffer:1; ///< false, if ::RecordLengthId is ::RECORDLENGTHID_SMALL
  811 + };
  812 +
  813 + //////////////////////////////////////////////////////////////////////////////
723 814 /// \class BulkSetFilter hantek/types.h
724 815 /// \brief The BULK_SETFILTER builder.
725 816 class BulkSetFilter : public Helper::DataArray<unsigned char> {
... ... @@ -742,12 +833,12 @@ namespace Hantek {
742 833 class BulkSetTriggerAndSamplerate : public Helper::DataArray<unsigned char> {
743 834 public:
744 835 BulkSetTriggerAndSamplerate();
745   - BulkSetTriggerAndSamplerate(unsigned short int samplerateSlow, unsigned long int triggerPosition, unsigned char triggerSource = 0, unsigned char bufferSize = 0, unsigned char samplerateFast = 0, unsigned char usedChannels = 0, bool fastRate = false, unsigned char triggerSlope = 0);
  836 + BulkSetTriggerAndSamplerate(unsigned short int samplerateSlow, unsigned long int triggerPosition, unsigned char triggerSource = 0, unsigned char recordLength = 0, unsigned char samplerateFast = 0, unsigned char usedChannels = 0, bool fastRate = false, unsigned char triggerSlope = 0);
746 837  
747 838 unsigned char getTriggerSource();
748 839 void setTriggerSource(unsigned char value);
749   - unsigned char getBufferSize();
750   - void setBufferSize(unsigned char value);
  840 + unsigned char getRecordLength();
  841 + void setRecordLength(unsigned char value);
751 842 unsigned char getSamplerateFast();
752 843 void setSamplerateFast(unsigned char value);
753 844 unsigned char getUsedChannels();
... ... @@ -855,8 +946,40 @@ namespace Hantek {
855 946 };
856 947  
857 948 //////////////////////////////////////////////////////////////////////////////
  949 + /// \class BulkSetFilter2250 hantek/types.h
  950 + /// \brief The DSO-5200/DSO-5200A BULK_BSETFILTER builder.
  951 + class BulkSetFilter2250 : public Helper::DataArray<unsigned char> {
  952 + public:
  953 + BulkSetFilter2250();
  954 + BulkSetFilter2250(bool channel1, bool channel2);
  955 +
  956 + bool getChannel(unsigned int channel);
  957 + void setChannel(unsigned int channel, bool filtered);
  958 +
  959 + private:
  960 + void init();
  961 + };
  962 +
  963 + //////////////////////////////////////////////////////////////////////////////
  964 + /// \class BulkSetTrigger2250 hantek/types.h
  965 + /// \brief The DSO-2250 BULK_CSETTRIGGERORSAMPLERATE builder.
  966 + class BulkSetTrigger2250 : public Helper::DataArray<unsigned char> {
  967 + public:
  968 + BulkSetTrigger2250();
  969 + BulkSetTrigger2250(unsigned char triggerSource, unsigned char triggerSlope);
  970 +
  971 + unsigned char getTriggerSource();
  972 + void setTriggerSource(unsigned char value);
  973 + unsigned char getTriggerSlope();
  974 + void setTriggerSlope(unsigned char slope);
  975 +
  976 + private:
  977 + void init();
  978 + };
  979 +
  980 + //////////////////////////////////////////////////////////////////////////////
858 981 /// \class BulkSetSamplerate5200 hantek/types.h
859   - /// \brief The BULK_SETSAMPLERATE5200 builder.
  982 + /// \brief The DSO-5200/DSO-5200A BULK_CSETTRIGGERORSAMPLERATE builder.
860 983 class BulkSetSamplerate5200 : public Helper::DataArray<unsigned char> {
861 984 public:
862 985 BulkSetSamplerate5200();
... ... @@ -872,12 +995,27 @@ namespace Hantek {
872 995 };
873 996  
874 997 //////////////////////////////////////////////////////////////////////////////
  998 + /// \class BulkSetRecordLength2250 hantek/types.h
  999 + /// \brief The DSO-2250 BULK_DSETBUFFER builder.
  1000 + class BulkSetRecordLength2250 : public Helper::DataArray<unsigned char> {
  1001 + public:
  1002 + BulkSetRecordLength2250();
  1003 + BulkSetRecordLength2250(unsigned char recordLength);
  1004 +
  1005 + unsigned char getRecordLength();
  1006 + void setRecordLength(unsigned char value);
  1007 +
  1008 + private:
  1009 + void init();
  1010 + };
  1011 +
  1012 + //////////////////////////////////////////////////////////////////////////////
875 1013 /// \class BulkSetBuffer5200 hantek/types.h
876   - /// \brief The BULK_SETBUFFER5200 builder.
  1014 + /// \brief The DSO-5200/DSO-5200A BULK_DSETBUFFER builder.
877 1015 class BulkSetBuffer5200 : public Helper::DataArray<unsigned char> {
878 1016 public:
879 1017 BulkSetBuffer5200();
880   - BulkSetBuffer5200(unsigned short int triggerPositionPre, unsigned short int triggerPositionPost, unsigned char usedPre = 0, unsigned char usedPost = 0, unsigned char bufferSize = 0);
  1018 + BulkSetBuffer5200(unsigned short int triggerPositionPre, unsigned short int triggerPositionPost, unsigned char usedPre = 0, unsigned char usedPost = 0, unsigned char recordLength = 0);
881 1019  
882 1020 unsigned short int getTriggerPositionPre();
883 1021 void setTriggerPositionPre(unsigned short int value);
... ... @@ -887,8 +1025,27 @@ namespace Hantek {
887 1025 void setUsedPre(unsigned char value);
888 1026 unsigned char getUsedPost();
889 1027 void setUsedPost(unsigned char value);
890   - unsigned char getBufferSize();
891   - void setBufferSize(unsigned char value);
  1028 + unsigned char getRecordLength();
  1029 + void setRecordLength(unsigned char value);
  1030 +
  1031 + private:
  1032 + void init();
  1033 + };
  1034 +
  1035 + //////////////////////////////////////////////////////////////////////////////
  1036 + /// \class BulkSetSamplerate2250 hantek/types.h
  1037 + /// \brief The DSO-2250 BULK_ESETTRIGGERORSAMPLERATE builder.
  1038 + class BulkSetSamplerate2250 : public Helper::DataArray<unsigned char> {
  1039 + public:
  1040 + BulkSetSamplerate2250();
  1041 + BulkSetSamplerate2250(bool fastRate, unsigned char samplerateFast = 0, unsigned short int samplerateSlow = 0);
  1042 +
  1043 + bool getFastRate();
  1044 + void setFastRate(bool fastRate);
  1045 + unsigned char getSamplerateFast();
  1046 + void setSamplerateFast(unsigned char value);
  1047 + unsigned short int getSamplerateSlow();
  1048 + void setSamplerateSlow(unsigned short int samplerate);
892 1049  
893 1050 private:
894 1051 void init();
... ... @@ -896,7 +1053,7 @@ namespace Hantek {
896 1053  
897 1054 //////////////////////////////////////////////////////////////////////////////
898 1055 /// \class BulkSetTrigger5200 hantek/types.h
899   - /// \brief The BULK_SETTRIGGER5200 builder.
  1056 + /// \brief The DSO-5200/DSO-5200A BULK_ESETTRIGGERORSAMPLERATE builder.
900 1057 class BulkSetTrigger5200 : public Helper::DataArray<unsigned char> {
901 1058 public:
902 1059 BulkSetTrigger5200();
... ... @@ -918,6 +1075,31 @@ namespace Hantek {
918 1075 };
919 1076  
920 1077 //////////////////////////////////////////////////////////////////////////////
  1078 + /// \class BulkSetBuffer2250 hantek/types.h
  1079 + /// \brief The DSO-2250 BULK_FSETBUFFER builder.
  1080 + class BulkSetBuffer2250 : public Helper::DataArray<unsigned char> {
  1081 + public:
  1082 + BulkSetBuffer2250();
  1083 + BulkSetBuffer2250(unsigned short int triggerPositionPre, unsigned short int triggerPositionPost, unsigned char usedPre = 0, unsigned char usedPost = 0, bool largeBuffer = false, bool slowBuffer = false);
  1084 +
  1085 + unsigned short int getTriggerPositionPre();
  1086 + void setTriggerPositionPre(unsigned short int value);
  1087 + unsigned short int getTriggerPositionPost();
  1088 + void setTriggerPositionPost(unsigned short int value);
  1089 + unsigned char getUsedPre();
  1090 + void setUsedPre(unsigned char value);
  1091 + unsigned char getUsedPost();
  1092 + void setUsedPost(unsigned char value);
  1093 + bool getLargeBuffer();
  1094 + void setLargeBuffer(bool largeBuffer);
  1095 + bool getSlowBuffer();
  1096 + void setSlowBuffer(bool slowBuffer);
  1097 +
  1098 + private:
  1099 + void init();
  1100 + };
  1101 +
  1102 + //////////////////////////////////////////////////////////////////////////////
921 1103 /// \class ControlGetSpeed hantek/types.h
922 1104 /// \brief The CONTROL_GETSPEED parser.
923 1105 class ControlGetSpeed : public Helper::DataArray<unsigned char> {
... ...
openhantek/src/openhantek.cpp
... ... @@ -140,10 +140,10 @@ OpenHantekMainWindow::OpenHantekMainWindow(QWidget *parent, Qt::WindowFlags flag
140 140 this->dsoControl->setTriggerLevel(channel, this->settings->scope.voltage[channel].trigger);
141 141 }
142 142 this->updateUsed(this->settings->scope.physicalChannels);
143   - this->dsoControl->setBufferSize(this->settings->scope.horizontal.samples);
  143 + this->dsoControl->setRecordLength(this->settings->scope.horizontal.samples);
144 144 this->updateTimebase();
145 145 this->dsoControl->setTriggerMode(this->settings->scope.trigger.mode);
146   - this->dsoControl->setTriggerPosition(this->settings->scope.trigger.position * this->settings->scope.horizontal.timebase * DIVS_TIME);
  146 + this->dsoControl->setPretriggerPosition(this->settings->scope.trigger.position * this->settings->scope.horizontal.timebase * DIVS_TIME);
147 147 this->dsoControl->setTriggerSlope(this->settings->scope.trigger.slope);
148 148 this->dsoControl->setTriggerSource(this->settings->scope.trigger.special, this->settings->scope.trigger.source);
149 149  
... ... @@ -203,20 +203,20 @@ void OpenHantekMainWindow::createActions() {
203 203 this->startStopAction->setShortcut(tr("Space"));
204 204 this->stopped();
205 205  
206   - this->bufferSizeActionGroup = new QActionGroup(this);
207   - connect(this->bufferSizeActionGroup, SIGNAL(selected(QAction *)), this, SLOT(bufferSizeSelected(QAction *)));
  206 + this->recordLengthActionGroup = new QActionGroup(this);
  207 + connect(this->recordLengthActionGroup, SIGNAL(selected(QAction *)), this, SLOT(recordLengthSelected(QAction *)));
208 208  
209   - this->bufferSizeSmallAction = new QAction(tr("&Small"), this);
210   - this->bufferSizeSmallAction->setActionGroup(this->bufferSizeActionGroup);
211   - this->bufferSizeSmallAction->setCheckable(true);
212   - this->bufferSizeSmallAction->setChecked(this->settings->scope.horizontal.samples == Hantek::BUFFER_SMALL);
213   - this->bufferSizeSmallAction->setStatusTip(tr("10240 Samples"));
  209 + this->recordLengthSmallAction = new QAction(tr("&Small"), this);
  210 + this->recordLengthSmallAction->setActionGroup(this->recordLengthActionGroup);
  211 + this->recordLengthSmallAction->setCheckable(true);
  212 + this->recordLengthSmallAction->setChecked(this->settings->scope.horizontal.samples == 10240);
  213 + this->recordLengthSmallAction->setStatusTip(tr("10240 Samples"));
214 214  
215   - this->bufferSizeLargeAction = new QAction(tr("&Large"), this);
216   - this->bufferSizeLargeAction->setActionGroup(this->bufferSizeActionGroup);
217   - this->bufferSizeLargeAction->setCheckable(true);
218   - this->bufferSizeLargeAction->setChecked(this->settings->scope.horizontal.samples == Hantek::BUFFER_LARGE);
219   - this->bufferSizeLargeAction->setStatusTip(tr("32768 Samples"));
  215 + this->recordLengthLargeAction = new QAction(tr("&Large"), this);
  216 + this->recordLengthLargeAction->setActionGroup(this->recordLengthActionGroup);
  217 + this->recordLengthLargeAction->setCheckable(true);
  218 + this->recordLengthLargeAction->setChecked(this->settings->scope.horizontal.samples != 10240);
  219 + this->recordLengthLargeAction->setStatusTip(tr("32768 Samples"));
220 220  
221 221 this->digitalPhosphorAction = new QAction(QIcon(":actions/digitalphosphor.png"), tr("Digital &phosphor"), this);
222 222 this->digitalPhosphorAction->setCheckable(true);
... ... @@ -279,9 +279,9 @@ void OpenHantekMainWindow::createMenus() {
279 279 this->oscilloscopeMenu->addAction(this->commandAction);
280 280 #endif
281 281 this->oscilloscopeMenu->addSeparator();
282   - this->bufferSizeMenu = this->oscilloscopeMenu->addMenu(tr("&Buffer size"));
283   - this->bufferSizeMenu->addAction(this->bufferSizeSmallAction);
284   - this->bufferSizeMenu->addAction(this->bufferSizeLargeAction);
  282 + this->recordLengthMenu = this->oscilloscopeMenu->addMenu(tr("&Record length"));
  283 + this->recordLengthMenu->addAction(this->recordLengthSmallAction);
  284 + this->recordLengthMenu->addAction(this->recordLengthLargeAction);
285 285  
286 286 this->menuBar()->addSeparator();
287 287  
... ... @@ -598,11 +598,11 @@ void OpenHantekMainWindow::updateSettings() {
598 598 }
599 599 }
600 600  
601   -/// \brief Apply new buffer size to settings.
602   -/// \param action The selected buffer size menu item.
603   -void OpenHantekMainWindow::bufferSizeSelected(QAction *action) {
604   - this->settings->scope.horizontal.samples = (action == this->bufferSizeSmallAction) ? Hantek::BUFFER_SMALL : Hantek::BUFFER_LARGE;
605   - this->dsoControl->setBufferSize(this->settings->scope.horizontal.samples);
  601 +/// \brief Apply new record length to settings.
  602 +/// \param action The selected record length menu item.
  603 +void OpenHantekMainWindow::recordLengthSelected(QAction *action) {
  604 + this->settings->scope.horizontal.samples = (action == this->recordLengthSmallAction) ? 10240 : 32768;
  605 + this->dsoControl->setRecordLength(this->settings->scope.horizontal.samples);
606 606 }
607 607  
608 608 /// \brief Sets the offset of the oscilloscope for the given channel.
... ... @@ -620,7 +620,7 @@ void OpenHantekMainWindow::updateTimebase() {
620 620 this->dsoWidget->updateSamplerate();
621 621  
622 622 // The trigger position should be kept at the same place but the timebase has changed
623   - this->dsoControl->setTriggerPosition(this->settings->scope.trigger.position * this->settings->scope.horizontal.timebase * DIVS_TIME);
  623 + this->dsoControl->setPretriggerPosition(this->settings->scope.trigger.position * this->settings->scope.horizontal.timebase * DIVS_TIME);
624 624 }
625 625  
626 626 /// \brief Sets the state of the given oscilloscope channel.
... ...
openhantek/src/openhantek.h
... ... @@ -81,8 +81,8 @@ class OpenHantekMainWindow : public QMainWindow {
81 81  
82 82 QAction *configAction;
83 83 QAction *startStopAction;
84   - QActionGroup *bufferSizeActionGroup;
85   - QAction *bufferSizeSmallAction, *bufferSizeLargeAction;
  84 + QActionGroup *recordLengthActionGroup;
  85 + QAction *recordLengthSmallAction, *recordLengthLargeAction;
86 86 QAction *digitalPhosphorAction, *zoomAction;
87 87  
88 88 QAction *aboutAction, *aboutQtAction;
... ... @@ -94,7 +94,7 @@ class OpenHantekMainWindow : public QMainWindow {
94 94 // Menus
95 95 QMenu *fileMenu;
96 96 QMenu *viewMenu, *dockMenu, *toolbarMenu;
97   - QMenu *oscilloscopeMenu, *bufferSizeMenu;
  97 + QMenu *oscilloscopeMenu, *recordLengthMenu;
98 98 QMenu *helpMenu;
99 99  
100 100 // Toolbars
... ... @@ -143,7 +143,7 @@ class OpenHantekMainWindow : public QMainWindow {
143 143 void applySettings();
144 144 void updateSettings();
145 145  
146   - void bufferSizeSelected(QAction *action);
  146 + void recordLengthSelected(QAction *action);
147 147 void updateOffset(unsigned int channel);
148 148 void updateTimebase();
149 149 void updateUsed(unsigned int channel);
... ...