Commit 0636ab1cbd6a0eded7cd38162535e5f2dcba87b1
1 parent
35299cfe
Fixed DSO-2090 pretrigger bug and improved timing of sampling routine
Showing
2 changed files
with
37 additions
and
29 deletions
openhantek/ChangeLog
| @@ -106,3 +106,11 @@ | @@ -106,3 +106,11 @@ | ||
| 106 | 2010-12-13 Oliver Haag <oliver.haag@gmail.com> | 106 | 2010-12-13 Oliver Haag <oliver.haag@gmail.com> |
| 107 | * Triggermode Auto working correctly now | 107 | * Triggermode Auto working correctly now |
| 108 | * Improved frequency detection routine | 108 | * Improved frequency detection routine |
| 109 | + | ||
| 110 | +2011-01-22 Oliver Haag <oliver.haag@gmail.com> | ||
| 111 | +* Storing positions of docking windows and toolbars in settings now | ||
| 112 | +* Added submenu to show/hide docking windows and toolbars to the View menu | ||
| 113 | + | ||
| 114 | +2011-01-22 Oliver Haag <oliver.haag@gmail.com> | ||
| 115 | +* Fixed bug with wrong pretrigger position when using a DSO-2090 | ||
| 116 | +* Improved timing of the Hantek DSO sampling routine |
openhantek/src/hantek/control.cpp
| @@ -115,7 +115,7 @@ namespace Hantek { | @@ -115,7 +115,7 @@ namespace Hantek { | ||
| 115 | 115 | ||
| 116 | /// \brief Handles all USB things until the device gets disconnected. | 116 | /// \brief Handles all USB things until the device gets disconnected. |
| 117 | void Control::run() { | 117 | void Control::run() { |
| 118 | - int errorCode, waitCounter = 0; | 118 | + int errorCode, cycleCounter = 0, startCycle = 0; |
| 119 | 119 | ||
| 120 | // The control loop is running until the device is disconnected | 120 | // The control loop is running until the device is disconnected |
| 121 | int captureState = CAPTURE_WAITING; | 121 | int captureState = CAPTURE_WAITING; |
| @@ -171,9 +171,10 @@ namespace Hantek { | @@ -171,9 +171,10 @@ namespace Hantek { | ||
| 171 | if(captureState == LIBUSB_ERROR_NO_DEVICE) | 171 | if(captureState == LIBUSB_ERROR_NO_DEVICE) |
| 172 | break; | 172 | break; |
| 173 | 173 | ||
| 174 | - // Check the current oscilloscope state every 50 ms | ||
| 175 | - /// \todo Maybe the time interval could be improved... | ||
| 176 | - this->msleep(50); | 174 | + // Check the current oscilloscope state everytime 25% of the buffer should be refilled |
| 175 | + // Not more often than every 10 ms though | ||
| 176 | + int cycleTime = qMax(this->samplerateDivider * this->bufferSize * 250 / this->samplerateMax, (long unsigned int) 10); | ||
| 177 | + this->msleep(cycleTime); | ||
| 177 | 178 | ||
| 178 | if(!this->sampling) { | 179 | if(!this->sampling) { |
| 179 | samplingStarted = false; | 180 | samplingStarted = false; |
| @@ -209,21 +210,31 @@ namespace Hantek { | @@ -209,21 +210,31 @@ namespace Hantek { | ||
| 209 | 210 | ||
| 210 | case CAPTURE_WAITING: | 211 | case CAPTURE_WAITING: |
| 211 | if(samplingStarted && lastTriggerMode == this->triggerMode) { | 212 | if(samplingStarted && lastTriggerMode == this->triggerMode) { |
| 212 | - waitCounter++; | 213 | + cycleCounter++; |
| 213 | 214 | ||
| 214 | - if(this->triggerMode == Dso::TRIGGERMODE_AUTO) { | ||
| 215 | - if(waitCounter > (double) this->samplerateDivider / this->samplerateMax * this->bufferSize * 20 + 2) { | ||
| 216 | - // Force triggering | ||
| 217 | - errorCode = this->device->bulkCommand(this->command[COMMAND_FORCETRIGGER]); | 215 | + if(cycleCounter == startCycle) { |
| 216 | + // Buffer refilled completely since start of sampling, enable the trigger now | ||
| 217 | + errorCode = this->device->bulkCommand(this->command[COMMAND_ENABLETRIGGER]); | ||
| 218 | + if(errorCode < 0) { | ||
| 218 | if(errorCode == LIBUSB_ERROR_NO_DEVICE) | 219 | if(errorCode == LIBUSB_ERROR_NO_DEVICE) |
| 219 | captureState = LIBUSB_ERROR_NO_DEVICE; | 220 | captureState = LIBUSB_ERROR_NO_DEVICE; |
| 221 | + break; | ||
| 222 | + } | ||
| 223 | + #ifdef DEBUG | ||
| 224 | + qDebug("Enabling trigger"); | ||
| 225 | + #endif | ||
| 226 | + } | ||
| 227 | + else if(cycleCounter >= 8 + startCycle && this->triggerMode == Dso::TRIGGERMODE_AUTO) { | ||
| 228 | + // Force triggering | ||
| 229 | + errorCode = this->device->bulkCommand(this->command[COMMAND_FORCETRIGGER]); | ||
| 230 | + if(errorCode == LIBUSB_ERROR_NO_DEVICE) | ||
| 231 | + captureState = LIBUSB_ERROR_NO_DEVICE; | ||
| 220 | #ifdef DEBUG | 232 | #ifdef DEBUG |
| 221 | qDebug("Forcing trigger"); | 233 | qDebug("Forcing trigger"); |
| 222 | #endif | 234 | #endif |
| 223 | - } | ||
| 224 | } | 235 | } |
| 225 | 236 | ||
| 226 | - if(waitCounter < 80) | 237 | + if(cycleCounter < 50 || cycleCounter < 4000 / cycleTime) |
| 227 | break; | 238 | break; |
| 228 | } | 239 | } |
| 229 | 240 | ||
| @@ -238,19 +249,9 @@ namespace Hantek { | @@ -238,19 +249,9 @@ namespace Hantek { | ||
| 238 | qDebug("Starting to capture"); | 249 | qDebug("Starting to capture"); |
| 239 | #endif | 250 | #endif |
| 240 | 251 | ||
| 241 | - // Enable trigger | ||
| 242 | - errorCode = this->device->bulkCommand(this->command[COMMAND_ENABLETRIGGER]); | ||
| 243 | - if(errorCode < 0) { | ||
| 244 | - if(errorCode == LIBUSB_ERROR_NO_DEVICE) | ||
| 245 | - captureState = LIBUSB_ERROR_NO_DEVICE; | ||
| 246 | - break; | ||
| 247 | - } | ||
| 248 | -#ifdef DEBUG | ||
| 249 | - qDebug("Enabling trigger"); | ||
| 250 | -#endif | ||
| 251 | - | ||
| 252 | samplingStarted = true; | 252 | samplingStarted = true; |
| 253 | - waitCounter = 0; | 253 | + cycleCounter = 0; |
| 254 | + startCycle = this->triggerPosition * 1000 / cycleTime + 1; | ||
| 254 | lastTriggerMode = this->triggerMode; | 255 | lastTriggerMode = this->triggerMode; |
| 255 | break; | 256 | break; |
| 256 | 257 | ||
| @@ -373,7 +374,7 @@ namespace Hantek { | @@ -373,7 +374,7 @@ namespace Hantek { | ||
| 373 | } | 374 | } |
| 374 | 375 | ||
| 375 | // Convert data from the oscilloscope and write it into the sample buffer | 376 | // Convert data from the oscilloscope and write it into the sample buffer |
| 376 | - unsigned int bufferPosition = this->triggerPoint * 2; | 377 | + unsigned int bufferPosition = (this->triggerPoint + 1) * 2; |
| 377 | if(using10Bits) { | 378 | if(using10Bits) { |
| 378 | // Additional 2 most significant bits after the normal data | 379 | // Additional 2 most significant bits after the normal data |
| 379 | unsigned int extraBitsPosition; // Track the position of the extra bits in the additional byte | 380 | unsigned int extraBitsPosition; // Track the position of the extra bits in the additional byte |
| @@ -412,7 +413,7 @@ namespace Hantek { | @@ -412,7 +413,7 @@ namespace Hantek { | ||
| 412 | } | 413 | } |
| 413 | 414 | ||
| 414 | // Convert data from the oscilloscope and write it into the sample buffer | 415 | // Convert data from the oscilloscope and write it into the sample buffer |
| 415 | - unsigned int bufferPosition = this->triggerPoint * 2; | 416 | + unsigned int bufferPosition = (this->triggerPoint + 1) * 2; |
| 416 | if(using10Bits) { | 417 | if(using10Bits) { |
| 417 | // Additional 2 most significant bits after the normal data | 418 | // Additional 2 most significant bits after the normal data |
| 418 | for(unsigned int realPosition = 0; realPosition < channelDataCount; realPosition++, bufferPosition += 2) { | 419 | for(unsigned int realPosition = 0; realPosition < channelDataCount; realPosition++, bufferPosition += 2) { |
| @@ -665,7 +666,6 @@ namespace Hantek { | @@ -665,7 +666,6 @@ namespace Hantek { | ||
| 665 | 666 | ||
| 666 | this->updateBufferSize(this->bufferSize); | 667 | this->updateBufferSize(this->bufferSize); |
| 667 | this->setTriggerPosition(this->triggerPosition); | 668 | this->setTriggerPosition(this->triggerPosition); |
| 668 | - this->setTriggerSlope(this->triggerSlope); | ||
| 669 | return this->samplerateMax / this->samplerateDivider; | 669 | return this->samplerateMax / this->samplerateDivider; |
| 670 | } | 670 | } |
| 671 | 671 | ||
| @@ -955,7 +955,7 @@ namespace Hantek { | @@ -955,7 +955,7 @@ namespace Hantek { | ||
| 955 | // SetTriggerAndSamplerate bulk command for trigger slope | 955 | // SetTriggerAndSamplerate bulk command for trigger slope |
| 956 | CommandSetTriggerAndSamplerate *commandSetTriggerAndSamplerate = (CommandSetTriggerAndSamplerate *) this->command[COMMAND_SETTRIGGERANDSAMPLERATE]; | 956 | CommandSetTriggerAndSamplerate *commandSetTriggerAndSamplerate = (CommandSetTriggerAndSamplerate *) this->command[COMMAND_SETTRIGGERANDSAMPLERATE]; |
| 957 | 957 | ||
| 958 | - commandSetTriggerAndSamplerate->setTriggerSlope((/*this->bufferSize != BUFFER_SMALL ||*/ commandSetTriggerAndSamplerate->getSamplerateFast() % 2 == 0) ? slope : Dso::SLOPE_NEGATIVE - slope); | 958 | + commandSetTriggerAndSamplerate->setTriggerSlope(slope); |
| 959 | this->commandPending[COMMAND_SETTRIGGERANDSAMPLERATE] = true; | 959 | this->commandPending[COMMAND_SETTRIGGERANDSAMPLERATE] = true; |
| 960 | break; | 960 | break; |
| 961 | } | 961 | } |
| @@ -988,10 +988,10 @@ namespace Hantek { | @@ -988,10 +988,10 @@ namespace Hantek { | ||
| 988 | positionSamples /= HANTEK_CHANNELS; | 988 | positionSamples /= HANTEK_CHANNELS; |
| 989 | 989 | ||
| 990 | // Calculate the position value (Start point depending on buffer size) | 990 | // Calculate the position value (Start point depending on buffer size) |
| 991 | - unsigned long int positionStart = (this->bufferSize == BUFFER_SMALL) ? 0x77660 : 0x78000; | 991 | + unsigned long int position = 0x7ffff - this->bufferSize + positionSamples; |
| 992 | 992 | ||
| 993 | // SetTriggerAndSamplerate bulk command for trigger position | 993 | // SetTriggerAndSamplerate bulk command for trigger position |
| 994 | - ((CommandSetTriggerAndSamplerate *) this->command[COMMAND_SETTRIGGERANDSAMPLERATE])->setTriggerPosition(positionStart + positionSamples); | 994 | + ((CommandSetTriggerAndSamplerate *) this->command[COMMAND_SETTRIGGERANDSAMPLERATE])->setTriggerPosition(position); |
| 995 | this->commandPending[COMMAND_SETTRIGGERANDSAMPLERATE] = true; | 995 | this->commandPending[COMMAND_SETTRIGGERANDSAMPLERATE] = true; |
| 996 | 996 | ||
| 997 | break; | 997 | break; |