Commit 9c6b32e786599adc932880eba5406682c28d45f0
Committed by
David Gräff
1 parent
dcd2a3c4
Move all control command structs back to controlstructs. Move control functional…
…ity from usb device into hantekdsocontrol. Remove fixed HANTEK_CHANNELS definitions. We allow an arbitray number of channels, depending on the device.
Showing
24 changed files
with
300 additions
and
336 deletions
openhantek/src/hantekdso/controlsettings.cpp
| 1 | #include "controlsettings.h" | 1 | #include "controlsettings.h" |
| 2 | +#include "hantekprotocol/definitions.h" | ||
| 2 | 3 | ||
| 3 | namespace Dso { | 4 | namespace Dso { |
| 4 | 5 | ||
| @@ -7,13 +8,12 @@ ControlSettings::ControlSettings(ControlSamplerateLimits* limits, size_t channel | @@ -7,13 +8,12 @@ ControlSettings::ControlSettings(ControlSamplerateLimits* limits, size_t channel | ||
| 7 | samplerate.limits = limits; | 8 | samplerate.limits = limits; |
| 8 | trigger.level.resize(channelCount); | 9 | trigger.level.resize(channelCount); |
| 9 | voltage.resize(channelCount); | 10 | voltage.resize(channelCount); |
| 10 | - for (ChannelID channel = 0; channel < channelCount; ++channel) { | ||
| 11 | - trigger.level[channel] = 0.0; | ||
| 12 | - voltage[channel].gain = 0; | ||
| 13 | - voltage[channel].offset = 0.0; | ||
| 14 | - voltage[channel].offsetReal = 0.0; | ||
| 15 | - voltage[channel].used = false; | ||
| 16 | - } | 11 | + offsetLimit = new Hantek::OffsetsPerGainStep[channelCount]; |
| 12 | +} | ||
| 13 | + | ||
| 14 | +ControlSettings::~ControlSettings() | ||
| 15 | +{ | ||
| 16 | + delete [] offsetLimit; | ||
| 17 | } | 17 | } |
| 18 | 18 | ||
| 19 | } | 19 | } |
openhantek/src/hantekdso/controlsettings.h
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | -#include "controlspecification.h" | ||
| 4 | #include "enums.h" | 3 | #include "enums.h" |
| 4 | +#include "hantekprotocol/types.h" | ||
| 5 | + | ||
| 6 | +namespace Hantek { | ||
| 7 | +struct OffsetsPerGainStep; | ||
| 8 | +} | ||
| 5 | 9 | ||
| 6 | namespace Dso { | 10 | namespace Dso { |
| 7 | 11 | ||
| 8 | struct ControlSamplerateLimits; | 12 | struct ControlSamplerateLimits; |
| 9 | 13 | ||
| 10 | -////////////////////////////////////////////////////////////////////////////// | ||
| 11 | -/// \struct ControlSettingsSamplerateTarget hantek/control.h | ||
| 12 | /// \brief Stores the target samplerate settings of the device. | 14 | /// \brief Stores the target samplerate settings of the device. |
| 13 | struct ControlSettingsSamplerateTarget { | 15 | struct ControlSettingsSamplerateTarget { |
| 14 | double samplerate; ///< The target samplerate set via setSamplerate | 16 | double samplerate; ///< The target samplerate set via setSamplerate |
| @@ -16,8 +18,6 @@ struct ControlSettingsSamplerateTarget { | @@ -16,8 +18,6 @@ struct ControlSettingsSamplerateTarget { | ||
| 16 | enum SamplerrateSet { Duration, Samplerrate } samplerateSet; | 18 | enum SamplerrateSet { Duration, Samplerrate } samplerateSet; |
| 17 | }; | 19 | }; |
| 18 | 20 | ||
| 19 | -////////////////////////////////////////////////////////////////////////////// | ||
| 20 | -/// \struct ControlSettingsSamplerate hantek/control.h | ||
| 21 | /// \brief Stores the current samplerate settings of the device. | 21 | /// \brief Stores the current samplerate settings of the device. |
| 22 | struct ControlSettingsSamplerate { | 22 | struct ControlSettingsSamplerate { |
| 23 | ControlSettingsSamplerateTarget target; ///< The target samplerate values | 23 | ControlSettingsSamplerateTarget target; ///< The target samplerate values |
| @@ -26,39 +26,35 @@ struct ControlSettingsSamplerate { | @@ -26,39 +26,35 @@ struct ControlSettingsSamplerate { | ||
| 26 | double current = 1e8; ///< The current samplerate | 26 | double current = 1e8; ///< The current samplerate |
| 27 | }; | 27 | }; |
| 28 | 28 | ||
| 29 | -////////////////////////////////////////////////////////////////////////////// | ||
| 30 | -/// \struct ControlSettingsTrigger hantek/control.h | ||
| 31 | /// \brief Stores the current trigger settings of the device. | 29 | /// \brief Stores the current trigger settings of the device. |
| 32 | struct ControlSettingsTrigger { | 30 | struct ControlSettingsTrigger { |
| 33 | - std::vector<double> level; ///< The trigger level for each channel in V | ||
| 34 | - double position = 0.0; ///< The current pretrigger position | ||
| 35 | - unsigned int point = 0; ///< The trigger position in Hantek coding | 31 | + std::vector<double> level; ///< The trigger level for each channel in V |
| 32 | + double position = 0.0; ///< The current pretrigger position | ||
| 33 | + unsigned int point = 0; ///< The trigger position in Hantek coding | ||
| 36 | Dso::TriggerMode mode = Dso::TriggerMode::HARDWARE_SOFTWARE; ///< The trigger mode | 34 | Dso::TriggerMode mode = Dso::TriggerMode::HARDWARE_SOFTWARE; ///< The trigger mode |
| 37 | - Dso::Slope slope = Dso::Slope::Positive; ///< The trigger slope | ||
| 38 | - bool special = false; ///< true, if the trigger source is special | ||
| 39 | - unsigned int source = 0; ///< The trigger source | 35 | + Dso::Slope slope = Dso::Slope::Positive; ///< The trigger slope |
| 36 | + bool special = false; ///< true, if the trigger source is special | ||
| 37 | + unsigned int source = 0; ///< The trigger source | ||
| 40 | }; | 38 | }; |
| 41 | 39 | ||
| 42 | -////////////////////////////////////////////////////////////////////////////// | ||
| 43 | -/// \struct ControlSettingsVoltage hantek/control.h | ||
| 44 | /// \brief Stores the current amplification settings of the device. | 40 | /// \brief Stores the current amplification settings of the device. |
| 45 | struct ControlSettingsVoltage { | 41 | struct ControlSettingsVoltage { |
| 46 | - double offset; ///< The screen offset for each channel | ||
| 47 | - double offsetReal; ///< The real offset for each channel (Due to quantization) | ||
| 48 | - unsigned gain; ///< The gain id | ||
| 49 | - bool used; ///< true, if the channel is used | 42 | + double offset = 0.0; ///< The screen offset for each channel |
| 43 | + double offsetReal = 0.0; ///< The real offset for each channel (Due to quantization) | ||
| 44 | + unsigned gain = 0; ///< The gain id | ||
| 45 | + bool used = false; ///< true, if the channel is used | ||
| 50 | }; | 46 | }; |
| 51 | 47 | ||
| 52 | -////////////////////////////////////////////////////////////////////////////// | ||
| 53 | -/// \struct ControlSettings hantek/control.h | ||
| 54 | /// \brief Stores the current settings of the device. | 48 | /// \brief Stores the current settings of the device. |
| 55 | struct ControlSettings { | 49 | struct ControlSettings { |
| 56 | ControlSettings(ControlSamplerateLimits *limits, size_t channelCount); | 50 | ControlSettings(ControlSamplerateLimits *limits, size_t channelCount); |
| 51 | + ~ControlSettings(); | ||
| 57 | ControlSettingsSamplerate samplerate; ///< The samplerate settings | 52 | ControlSettingsSamplerate samplerate; ///< The samplerate settings |
| 58 | std::vector<ControlSettingsVoltage> voltage; ///< The amplification settings | 53 | std::vector<ControlSettingsVoltage> voltage; ///< The amplification settings |
| 59 | ControlSettingsTrigger trigger; ///< The trigger settings | 54 | ControlSettingsTrigger trigger; ///< The trigger settings |
| 60 | RecordLengthID recordLengthId = 1; ///< The id in the record length array | 55 | RecordLengthID recordLengthId = 1; ///< The id in the record length array |
| 61 | unsigned usedChannels = 0; ///< Number of activated channels | 56 | unsigned usedChannels = 0; ///< Number of activated channels |
| 62 | unsigned swSampleMargin = 2000; ///< Software trigger, sample margin | 57 | unsigned swSampleMargin = 2000; ///< Software trigger, sample margin |
| 58 | + Hantek::OffsetsPerGainStep *offsetLimit; ///< Calibration data for the channel offsets | ||
| 63 | }; | 59 | }; |
| 64 | } | 60 | } |
openhantek/src/hantekdso/controlspecification.cpp
0 → 100644
openhantek/src/hantekdso/controlspecification.h
| @@ -4,8 +4,7 @@ | @@ -4,8 +4,7 @@ | ||
| 4 | 4 | ||
| 5 | #include "enums.h" | 5 | #include "enums.h" |
| 6 | #include "hantekprotocol/bulkcode.h" | 6 | #include "hantekprotocol/bulkcode.h" |
| 7 | -#include "hantekprotocol/controlcode.h" | ||
| 8 | -#include "hantekprotocol/controlvalue.h" | 7 | +#include "hantekprotocol/controlStructs.h" |
| 9 | #include "hantekprotocol/definitions.h" | 8 | #include "hantekprotocol/definitions.h" |
| 10 | #include <QList> | 9 | #include <QList> |
| 11 | 10 | ||
| @@ -13,22 +12,6 @@ namespace Dso { | @@ -13,22 +12,6 @@ namespace Dso { | ||
| 13 | 12 | ||
| 14 | using namespace Hantek; | 13 | using namespace Hantek; |
| 15 | 14 | ||
| 16 | -/// \brief Stores the bulk command codes used for this device. | ||
| 17 | -struct ControlSpecificationCommandsBulk { | ||
| 18 | - BulkCode setChannels = BulkCode::INVALID; ///< Command for setting used channels | ||
| 19 | - BulkCode setSamplerate = BulkCode::INVALID; ///< Command for samplerate settings | ||
| 20 | - BulkCode setGain = BulkCode::SETGAIN; ///< Command for gain settings (Usually in combination with | ||
| 21 | - /// CONTROL_SETRELAYS) | ||
| 22 | - BulkCode setRecordLength = BulkCode::INVALID; ///< Command for buffer settings | ||
| 23 | - BulkCode setTrigger = BulkCode::INVALID; ///< Command for trigger settings | ||
| 24 | - BulkCode setPretrigger = BulkCode::INVALID; ///< Command for pretrigger settings | ||
| 25 | -}; | ||
| 26 | - | ||
| 27 | -/// \brief Stores the command codes used for this device. | ||
| 28 | -struct ControlSpecificationCommands { | ||
| 29 | - ControlSpecificationCommandsBulk bulk; ///< The used bulk commands | ||
| 30 | -}; | ||
| 31 | - | ||
| 32 | /// \brief Stores the samplerate limits for calculations. | 15 | /// \brief Stores the samplerate limits for calculations. |
| 33 | struct ControlSamplerateLimits { | 16 | struct ControlSamplerateLimits { |
| 34 | double base; ///< The base for sample rate calculations | 17 | double base; ///< The base for sample rate calculations |
| @@ -62,32 +45,47 @@ struct SpecialTriggerChannel { | @@ -62,32 +45,47 @@ struct SpecialTriggerChannel { | ||
| 62 | 45 | ||
| 63 | /// \brief Stores the specifications of the currently connected device. | 46 | /// \brief Stores the specifications of the currently connected device. |
| 64 | struct ControlSpecification { | 47 | struct ControlSpecification { |
| 65 | - ChannelID channels = HANTEK_CHANNELS; | 48 | + ControlSpecification(unsigned channels); |
| 49 | + const ChannelID channels; | ||
| 66 | 50 | ||
| 67 | // Interface | 51 | // Interface |
| 68 | - ControlSpecificationCommands command; ///< The commands for this device | 52 | + BulkCode cmdSetChannels = BulkCode::INVALID; ///< Command for setting used channels |
| 53 | + BulkCode cmdSetSamplerate = BulkCode::INVALID; ///< Command for samplerate settings | ||
| 54 | + BulkCode cmdSetRecordLength = BulkCode::INVALID; ///< Command for buffer settings | ||
| 55 | + BulkCode cmdSetTrigger = BulkCode::INVALID; ///< Command for trigger settings | ||
| 56 | + BulkCode cmdSetPretrigger = BulkCode::INVALID; ///< Command for pretrigger settings | ||
| 57 | + BulkCode cmdForceTrigger = BulkCode::FORCETRIGGER; ///< Command for forcing a trigger event | ||
| 58 | + BulkCode cmdCaptureStart = BulkCode::STARTSAMPLING; ///< Command for starting the sampling | ||
| 59 | + BulkCode cmdTriggerEnabled = BulkCode::ENABLETRIGGER; ///< Command for enabling the trigger | ||
| 60 | + BulkCode cmdGetData = BulkCode::GETDATA; ///< Command for retrieve sample data | ||
| 61 | + BulkCode cmdGetCaptureState = BulkCode::GETCAPTURESTATE; ///< Command for retrieve the capture state | ||
| 62 | + BulkCode cmdSetGain = BulkCode::SETGAIN; ///< Command for setting the gain | ||
| 63 | + | ||
| 64 | + ControlBeginCommand beginCommandControl; | ||
| 65 | + ControlGetLimits cmdGetLimits; | ||
| 69 | 66 | ||
| 70 | // Limits | 67 | // Limits |
| 71 | ControlSpecificationSamplerate samplerate; ///< The samplerate specifications | 68 | ControlSpecificationSamplerate samplerate; ///< The samplerate specifications |
| 72 | std::vector<RecordLengthID> bufferDividers; ///< Samplerate dividers for record lengths | 69 | std::vector<RecordLengthID> bufferDividers; ///< Samplerate dividers for record lengths |
| 73 | unsigned char sampleSize; ///< Number of bits per sample | 70 | unsigned char sampleSize; ///< Number of bits per sample |
| 74 | 71 | ||
| 72 | + /// For devices that support only fixed sample rates (isFixedSamplerateDevice=true) | ||
| 73 | + std::vector<FixedSampleRate> fixedSampleRates; | ||
| 74 | + | ||
| 75 | // Calibration | 75 | // Calibration |
| 76 | + | ||
| 76 | /// The sample values at the top of the screen | 77 | /// The sample values at the top of the screen |
| 77 | - std::vector<unsigned short> voltageLimit[HANTEK_CHANNELS]; | ||
| 78 | - /// Calibration data for the channel offsets | ||
| 79 | - OffsetsPerGainStep offsetLimit[HANTEK_CHANNELS]; | 78 | + typedef std::vector<unsigned short> VoltageLimit; |
| 79 | + std::vector<VoltageLimit> voltageLimit; // Per channel | ||
| 80 | 80 | ||
| 81 | /// Gain levels | 81 | /// Gain levels |
| 82 | std::vector<ControlSpecificationGainLevel> gain; | 82 | std::vector<ControlSpecificationGainLevel> gain; |
| 83 | 83 | ||
| 84 | - /// For devices that support only fixed sample rates (isFixedSamplerateDevice=true) | ||
| 85 | - std::vector<FixedSampleRate> fixedSampleRates; | ||
| 86 | - | 84 | + // Features |
| 87 | std::vector<SpecialTriggerChannel> specialTriggerChannels; | 85 | std::vector<SpecialTriggerChannel> specialTriggerChannels; |
| 88 | std::vector<Coupling> couplings = {Dso::Coupling::DC, Dso::Coupling::AC}; | 86 | std::vector<Coupling> couplings = {Dso::Coupling::DC, Dso::Coupling::AC}; |
| 89 | - std::vector<TriggerMode> triggerModes = {TriggerMode::HARDWARE_SOFTWARE, TriggerMode::WAIT_FORCE, TriggerMode::SINGLE}; | ||
| 90 | - | 87 | + std::vector<TriggerMode> triggerModes = {TriggerMode::HARDWARE_SOFTWARE, TriggerMode::WAIT_FORCE, |
| 88 | + TriggerMode::SINGLE}; | ||
| 91 | bool isFixedSamplerateDevice = false; | 89 | bool isFixedSamplerateDevice = false; |
| 92 | bool isSoftwareTriggerDevice = false; | 90 | bool isSoftwareTriggerDevice = false; |
| 93 | bool useControlNoBulk = false; | 91 | bool useControlNoBulk = false; |
openhantek/src/hantekdso/enums.cpp
| @@ -4,5 +4,4 @@ namespace Dso { | @@ -4,5 +4,4 @@ namespace Dso { | ||
| 4 | Enum<Dso::TriggerMode, Dso::TriggerMode::HARDWARE_SOFTWARE, Dso::TriggerMode::SINGLE> TriggerModeEnum; | 4 | Enum<Dso::TriggerMode, Dso::TriggerMode::HARDWARE_SOFTWARE, Dso::TriggerMode::SINGLE> TriggerModeEnum; |
| 5 | Enum<Dso::Slope, Dso::Slope::Positive, Dso::Slope::Negative> SlopeEnum; | 5 | Enum<Dso::Slope, Dso::Slope::Positive, Dso::Slope::Negative> SlopeEnum; |
| 6 | Enum<Dso::GraphFormat, Dso::GraphFormat::TY, Dso::GraphFormat::XY> GraphFormatEnum; | 6 | Enum<Dso::GraphFormat, Dso::GraphFormat::TY, Dso::GraphFormat::XY> GraphFormatEnum; |
| 7 | - Enum<Dso::ChannelMode, Dso::ChannelMode::Voltage, Dso::ChannelMode::Spectrum> ChannelModeEnum; | ||
| 8 | } | 7 | } |
openhantek/src/hantekdso/enums.h
| @@ -9,8 +9,6 @@ enum class ChannelMode { | @@ -9,8 +9,6 @@ enum class ChannelMode { | ||
| 9 | Voltage, ///< Standard voltage view | 9 | Voltage, ///< Standard voltage view |
| 10 | Spectrum ///< Spectrum view | 10 | Spectrum ///< Spectrum view |
| 11 | }; | 11 | }; |
| 12 | -constexpr int ChannelModes = 2; | ||
| 13 | -extern Enum<Dso::ChannelMode, Dso::ChannelMode::Voltage, Dso::ChannelMode::Spectrum> ChannelModeEnum; | ||
| 14 | 12 | ||
| 15 | /// \enum GraphFormat | 13 | /// \enum GraphFormat |
| 16 | /// \brief The possible viewing formats for the graphs on the scope. | 14 | /// \brief The possible viewing formats for the graphs on the scope. |
openhantek/src/hantekdso/hantekdsocontrol.cpp
| @@ -49,7 +49,7 @@ void HantekDsoControl::stopSampling() { | @@ -49,7 +49,7 @@ void HantekDsoControl::stopSampling() { | ||
| 49 | emit samplingStopped(); | 49 | emit samplingStopped(); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | -USBDevice *HantekDsoControl::getDevice() { return device; } | 52 | +const USBDevice *HantekDsoControl::getDevice() const { return device; } |
| 53 | 53 | ||
| 54 | const DSOsamples &HantekDsoControl::getLastSamples() { return result; } | 54 | const DSOsamples &HantekDsoControl::getLastSamples() { return result; } |
| 55 | 55 | ||
| @@ -58,9 +58,7 @@ HantekDsoControl::HantekDsoControl(USBDevice *device) | @@ -58,9 +58,7 @@ HantekDsoControl::HantekDsoControl(USBDevice *device) | ||
| 58 | controlsettings(&(specification.samplerate.single), specification.channels) { | 58 | controlsettings(&(specification.samplerate.single), specification.channels) { |
| 59 | if (device == nullptr) throw new std::runtime_error("No usb device for HantekDsoControl"); | 59 | if (device == nullptr) throw new std::runtime_error("No usb device for HantekDsoControl"); |
| 60 | 60 | ||
| 61 | - if (specification.useControlNoBulk) { | ||
| 62 | - device->setEnableBulkTransfer(false); | ||
| 63 | - } | 61 | + qRegisterMetaType<DSOsamples *>(); |
| 64 | 62 | ||
| 65 | if (specification.fixedUSBinLength) | 63 | if (specification.fixedUSBinLength) |
| 66 | device->overwriteInPacketLength(specification.fixedUSBinLength); | 64 | device->overwriteInPacketLength(specification.fixedUSBinLength); |
| @@ -84,6 +82,17 @@ HantekDsoControl::~HantekDsoControl() { | @@ -84,6 +82,17 @@ HantekDsoControl::~HantekDsoControl() { | ||
| 84 | } | 82 | } |
| 85 | } | 83 | } |
| 86 | 84 | ||
| 85 | +int HantekDsoControl::bulkCommand(const DataArray<unsigned char> *command, int attempts) const { | ||
| 86 | + if (specification.useControlNoBulk) return LIBUSB_SUCCESS; | ||
| 87 | + | ||
| 88 | + // Send BeginCommand control command | ||
| 89 | + int errorCode = device->controlWrite(&specification.beginCommandControl); | ||
| 90 | + if (errorCode < 0) return errorCode; | ||
| 91 | + | ||
| 92 | + // Send bulk command | ||
| 93 | + return device->bulkWrite(command->data(), command->getSize(), attempts); | ||
| 94 | +} | ||
| 95 | + | ||
| 87 | unsigned HantekDsoControl::getChannelCount() { return specification.channels; } | 96 | unsigned HantekDsoControl::getChannelCount() { return specification.channels; } |
| 88 | 97 | ||
| 89 | const ControlSettings *HantekDsoControl::getDeviceSettings() const { return &controlsettings; } | 98 | const ControlSettings *HantekDsoControl::getDeviceSettings() const { return &controlsettings; } |
| @@ -107,7 +116,7 @@ void HantekDsoControl::updateInterval() { | @@ -107,7 +116,7 @@ void HantekDsoControl::updateInterval() { | ||
| 107 | // Check the current oscilloscope state everytime 25% of the time the buffer | 116 | // Check the current oscilloscope state everytime 25% of the time the buffer |
| 108 | // should be refilled | 117 | // should be refilled |
| 109 | if (isRollMode()) | 118 | if (isRollMode()) |
| 110 | - cycleTime = (int)((double)device->getPacketSize() / (isFastRate() ? 1 : specification.channels) / | 119 | + cycleTime = (int)((double)getPacketSize() / (isFastRate() ? 1 : specification.channels) / |
| 111 | controlsettings.samplerate.current * 250); | 120 | controlsettings.samplerate.current * 250); |
| 112 | else | 121 | else |
| 113 | cycleTime = (int)((double)getRecordLength() / controlsettings.samplerate.current * 250); | 122 | cycleTime = (int)((double)getRecordLength() / controlsettings.samplerate.current * 250); |
| @@ -130,16 +139,16 @@ unsigned HantekDsoControl::getRecordLength() const { | @@ -130,16 +139,16 @@ unsigned HantekDsoControl::getRecordLength() const { | ||
| 130 | 139 | ||
| 131 | Dso::ErrorCode HantekDsoControl::retrieveChannelLevelData() { | 140 | Dso::ErrorCode HantekDsoControl::retrieveChannelLevelData() { |
| 132 | // Get channel level data | 141 | // Get channel level data |
| 133 | - ControlGetLimits c(2); | ||
| 134 | - int errorCode = | ||
| 135 | - device->controlRead(&c); | 142 | + int errorCode = device->controlRead(&specification.cmdGetLimits); |
| 136 | if (errorCode < 0) { | 143 | if (errorCode < 0) { |
| 137 | qWarning() << tr("Couldn't get channel level data from oscilloscope"); | 144 | qWarning() << tr("Couldn't get channel level data from oscilloscope"); |
| 138 | emit statusMessage(tr("Couldn't get channel level data from oscilloscope"), 0); | 145 | emit statusMessage(tr("Couldn't get channel level data from oscilloscope"), 0); |
| 139 | emit communicationError(); | 146 | emit communicationError(); |
| 140 | return Dso::ErrorCode::CONNECTION; | 147 | return Dso::ErrorCode::CONNECTION; |
| 141 | } | 148 | } |
| 142 | - memcpy(specification.offsetLimit,c.offsetLimit,sizeof(specification.offsetLimit)); | 149 | + |
| 150 | + memcpy(controlsettings.offsetLimit, specification.cmdGetLimits.offsetLimit, | ||
| 151 | + sizeof(OffsetsPerGainStep)*specification.channels); | ||
| 143 | 152 | ||
| 144 | return Dso::ErrorCode::NONE; | 153 | return Dso::ErrorCode::NONE; |
| 145 | } | 154 | } |
| @@ -159,14 +168,14 @@ std::pair<int, unsigned> HantekDsoControl::getCaptureState() const { | @@ -159,14 +168,14 @@ std::pair<int, unsigned> HantekDsoControl::getCaptureState() const { | ||
| 159 | 168 | ||
| 160 | if (!specification.supportsCaptureState) return std::make_pair(CAPTURE_READY, 0); | 169 | if (!specification.supportsCaptureState) return std::make_pair(CAPTURE_READY, 0); |
| 161 | 170 | ||
| 162 | - errorCode = device->bulkCommand(getCommand(BulkCode::GETCAPTURESTATE), 1); | 171 | + errorCode = bulkCommand(getCommand(BulkCode::GETCAPTURESTATE), 1); |
| 163 | if (errorCode < 0) { | 172 | if (errorCode < 0) { |
| 164 | qWarning() << "Getting capture state failed: " << libUsbErrorString(errorCode); | 173 | qWarning() << "Getting capture state failed: " << libUsbErrorString(errorCode); |
| 165 | return std::make_pair(CAPTURE_ERROR, 0); | 174 | return std::make_pair(CAPTURE_ERROR, 0); |
| 166 | } | 175 | } |
| 167 | 176 | ||
| 168 | BulkResponseGetCaptureState response; | 177 | BulkResponseGetCaptureState response; |
| 169 | - errorCode = device->bulkRead(response.data(), response.getSize()); | 178 | + errorCode = device->bulkRead(&response); |
| 170 | if (errorCode < 0) { | 179 | if (errorCode < 0) { |
| 171 | qWarning() << "Getting capture state failed: " << libUsbErrorString(errorCode); | 180 | qWarning() << "Getting capture state failed: " << libUsbErrorString(errorCode); |
| 172 | return std::make_pair(CAPTURE_ERROR, 0); | 181 | return std::make_pair(CAPTURE_ERROR, 0); |
| @@ -179,7 +188,7 @@ std::vector<unsigned char> HantekDsoControl::getSamples(unsigned &previousSample | @@ -179,7 +188,7 @@ std::vector<unsigned char> HantekDsoControl::getSamples(unsigned &previousSample | ||
| 179 | int errorCode; | 188 | int errorCode; |
| 180 | if (!specification.useControlNoBulk) { | 189 | if (!specification.useControlNoBulk) { |
| 181 | // Request data | 190 | // Request data |
| 182 | - errorCode = device->bulkCommand(getCommand(BulkCode::GETDATA), 1); | 191 | + errorCode = bulkCommand(getCommand(BulkCode::GETDATA), 1); |
| 183 | } else { | 192 | } else { |
| 184 | errorCode = device->controlWrite(getCommand(ControlCode::CONTROL_ACQUIIRE_HARD_DATA)); | 193 | errorCode = device->controlWrite(getCommand(ControlCode::CONTROL_ACQUIIRE_HARD_DATA)); |
| 185 | } | 194 | } |
| @@ -345,7 +354,7 @@ double HantekDsoControl::getBestSamplerate(double samplerate, bool fastRate, boo | @@ -345,7 +354,7 @@ double HantekDsoControl::getBestSamplerate(double samplerate, bool fastRate, boo | ||
| 345 | bestDownsampler = 0.0; | 354 | bestDownsampler = 0.0; |
| 346 | bestSamplerate = limits->max / specification.bufferDividers[controlsettings.recordLengthId]; | 355 | bestSamplerate = limits->max / specification.bufferDividers[controlsettings.recordLengthId]; |
| 347 | } else { | 356 | } else { |
| 348 | - switch (specification.command.bulk.setSamplerate) { | 357 | + switch (specification.cmdSetSamplerate) { |
| 349 | case BulkCode::SETTRIGGERANDSAMPLERATE: | 358 | case BulkCode::SETTRIGGERANDSAMPLERATE: |
| 350 | // DSO-2090 supports the downsampling factors 1, 2, 4 and 5 using | 359 | // DSO-2090 supports the downsampling factors 1, 2, 4 and 5 using |
| 351 | // valueFast or all even values above using valueSlow | 360 | // valueFast or all even values above using valueSlow |
| @@ -410,7 +419,7 @@ double HantekDsoControl::getBestSamplerate(double samplerate, bool fastRate, boo | @@ -410,7 +419,7 @@ double HantekDsoControl::getBestSamplerate(double samplerate, bool fastRate, boo | ||
| 410 | unsigned HantekDsoControl::getSampleCount() const { | 419 | unsigned HantekDsoControl::getSampleCount() const { |
| 411 | if (isRollMode()) { | 420 | if (isRollMode()) { |
| 412 | // TODO handle libusb error | 421 | // TODO handle libusb error |
| 413 | - return device->getPacketSize(); | 422 | + return getPacketSize(); |
| 414 | } else { | 423 | } else { |
| 415 | if (isFastRate()) | 424 | if (isFastRate()) |
| 416 | return getRecordLength(); | 425 | return getRecordLength(); |
| @@ -422,20 +431,20 @@ unsigned HantekDsoControl::getSampleCount() const { | @@ -422,20 +431,20 @@ unsigned HantekDsoControl::getSampleCount() const { | ||
| 422 | unsigned HantekDsoControl::updateRecordLength(RecordLengthID index) { | 431 | unsigned HantekDsoControl::updateRecordLength(RecordLengthID index) { |
| 423 | if (index >= controlsettings.samplerate.limits->recordLengths.size()) return 0; | 432 | if (index >= controlsettings.samplerate.limits->recordLengths.size()) return 0; |
| 424 | 433 | ||
| 425 | - switch (specification.command.bulk.setRecordLength) { | 434 | + switch (specification.cmdSetRecordLength) { |
| 426 | case BulkCode::SETTRIGGERANDSAMPLERATE: | 435 | case BulkCode::SETTRIGGERANDSAMPLERATE: |
| 427 | modifyCommand<BulkSetTriggerAndSamplerate>(BulkCode::SETTRIGGERANDSAMPLERATE)->setRecordLength(index); | 436 | modifyCommand<BulkSetTriggerAndSamplerate>(BulkCode::SETTRIGGERANDSAMPLERATE)->setRecordLength(index); |
| 428 | break; | 437 | break; |
| 429 | 438 | ||
| 430 | case BulkCode::DSETBUFFER: | 439 | case BulkCode::DSETBUFFER: |
| 431 | - if (specification.command.bulk.setPretrigger == BulkCode::FSETBUFFER) { | 440 | + if (specification.cmdSetPretrigger == BulkCode::FSETBUFFER) { |
| 432 | modifyCommand<BulkSetRecordLength2250>(BulkCode::DSETBUFFER)->setRecordLength(index); | 441 | modifyCommand<BulkSetRecordLength2250>(BulkCode::DSETBUFFER)->setRecordLength(index); |
| 433 | } else { | 442 | } else { |
| 434 | // SetBuffer5200 bulk command for record length | 443 | // SetBuffer5200 bulk command for record length |
| 435 | BulkSetBuffer5200 *commandSetBuffer5200 = modifyCommand<BulkSetBuffer5200>(BulkCode::DSETBUFFER); | 444 | BulkSetBuffer5200 *commandSetBuffer5200 = modifyCommand<BulkSetBuffer5200>(BulkCode::DSETBUFFER); |
| 436 | 445 | ||
| 437 | - commandSetBuffer5200->setUsedPre(DTriggerPositionUsed::DTRIGGERPOSITION_ON); | ||
| 438 | - commandSetBuffer5200->setUsedPost(DTriggerPositionUsed::DTRIGGERPOSITION_ON); | 446 | + commandSetBuffer5200->setUsedPre(DTriggerPositionUsed::ON); |
| 447 | + commandSetBuffer5200->setUsedPost(DTriggerPositionUsed::ON); | ||
| 439 | commandSetBuffer5200->setRecordLength(index); | 448 | commandSetBuffer5200->setRecordLength(index); |
| 440 | } | 449 | } |
| 441 | 450 | ||
| @@ -466,7 +475,7 @@ unsigned HantekDsoControl::updateSamplerate(unsigned downsampler, bool fastRate) | @@ -466,7 +475,7 @@ unsigned HantekDsoControl::updateSamplerate(unsigned downsampler, bool fastRate) | ||
| 466 | ControlSamplerateLimits *limits = fastRate ? &specification.samplerate.multi : &specification.samplerate.single; | 475 | ControlSamplerateLimits *limits = fastRate ? &specification.samplerate.multi : &specification.samplerate.single; |
| 467 | 476 | ||
| 468 | // Set the calculated samplerate | 477 | // Set the calculated samplerate |
| 469 | - switch (specification.command.bulk.setSamplerate) { | 478 | + switch (specification.cmdSetSamplerate) { |
| 470 | case BulkCode::SETTRIGGERANDSAMPLERATE: { | 479 | case BulkCode::SETTRIGGERANDSAMPLERATE: { |
| 471 | short int downsamplerValue = 0; | 480 | short int downsamplerValue = 0; |
| 472 | unsigned char samplerateId = 0; | 481 | unsigned char samplerateId = 0; |
| @@ -720,14 +729,14 @@ Dso::ErrorCode HantekDsoControl::setChannelUsed(ChannelID channel, bool used) { | @@ -720,14 +729,14 @@ Dso::ErrorCode HantekDsoControl::setChannelUsed(ChannelID channel, bool used) { | ||
| 720 | usedChannels = UsedChannels::USED_CH1CH2; | 729 | usedChannels = UsedChannels::USED_CH1CH2; |
| 721 | } else { | 730 | } else { |
| 722 | // DSO-2250 uses a different value for channel 2 | 731 | // DSO-2250 uses a different value for channel 2 |
| 723 | - if (specification.command.bulk.setChannels == BulkCode::BSETCHANNELS) | 732 | + if (specification.cmdSetChannels == BulkCode::BSETCHANNELS) |
| 724 | usedChannels = UsedChannels::BUSED_CH2; | 733 | usedChannels = UsedChannels::BUSED_CH2; |
| 725 | else | 734 | else |
| 726 | usedChannels = UsedChannels::USED_CH2; | 735 | usedChannels = UsedChannels::USED_CH2; |
| 727 | } | 736 | } |
| 728 | } | 737 | } |
| 729 | 738 | ||
| 730 | - switch (specification.command.bulk.setChannels) { | 739 | + switch (specification.cmdSetChannels) { |
| 731 | case BulkCode::SETTRIGGERANDSAMPLERATE: { | 740 | case BulkCode::SETTRIGGERANDSAMPLERATE: { |
| 732 | // SetTriggerAndSamplerate bulk command for trigger source | 741 | // SetTriggerAndSamplerate bulk command for trigger source |
| 733 | modifyCommand<BulkSetTriggerAndSamplerate>(BulkCode::SETTRIGGERANDSAMPLERATE) | 742 | modifyCommand<BulkSetTriggerAndSamplerate>(BulkCode::SETTRIGGERANDSAMPLERATE) |
| @@ -813,7 +822,7 @@ Dso::ErrorCode HantekDsoControl::setOffset(ChannelID channel, const double offse | @@ -813,7 +822,7 @@ Dso::ErrorCode HantekDsoControl::setOffset(ChannelID channel, const double offse | ||
| 813 | if (channel >= specification.channels) return Dso::ErrorCode::PARAMETER; | 822 | if (channel >= specification.channels) return Dso::ErrorCode::PARAMETER; |
| 814 | 823 | ||
| 815 | if (specification.supportsOffset) { | 824 | if (specification.supportsOffset) { |
| 816 | - Offset &channelOffLimit = specification.offsetLimit[channel].step[controlsettings.voltage[channel].gain]; | 825 | + Offset &channelOffLimit = controlsettings.offsetLimit[channel].step[controlsettings.voltage[channel].gain]; |
| 817 | // Calculate the offset value | 826 | // Calculate the offset value |
| 818 | // The range is given by the calibration data (convert from big endian) | 827 | // The range is given by the calibration data (convert from big endian) |
| 819 | unsigned short int minimum = ((unsigned short int)*((unsigned char *)&(channelOffLimit.start)) << 8) + | 828 | unsigned short int minimum = ((unsigned short int)*((unsigned char *)&(channelOffLimit.start)) << 8) + |
| @@ -851,7 +860,7 @@ Dso::ErrorCode HantekDsoControl::setTriggerSource(bool special, unsigned id) { | @@ -851,7 +860,7 @@ Dso::ErrorCode HantekDsoControl::setTriggerSource(bool special, unsigned id) { | ||
| 851 | 860 | ||
| 852 | int hardwareID = special ? specification.specialTriggerChannels[id].hardwareID : (int)id; | 861 | int hardwareID = special ? specification.specialTriggerChannels[id].hardwareID : (int)id; |
| 853 | 862 | ||
| 854 | - switch (specification.command.bulk.setTrigger) { | 863 | + switch (specification.cmdSetTrigger) { |
| 855 | case BulkCode::SETTRIGGERANDSAMPLERATE: | 864 | case BulkCode::SETTRIGGERANDSAMPLERATE: |
| 856 | // SetTriggerAndSamplerate bulk command for trigger source | 865 | // SetTriggerAndSamplerate bulk command for trigger source |
| 857 | modifyCommand<BulkSetTriggerAndSamplerate>(BulkCode::SETTRIGGERANDSAMPLERATE)->setTriggerSource(1 - hardwareID); | 866 | modifyCommand<BulkSetTriggerAndSamplerate>(BulkCode::SETTRIGGERANDSAMPLERATE)->setTriggerSource(1 - hardwareID); |
| @@ -898,7 +907,7 @@ Dso::ErrorCode HantekDsoControl::setTriggerLevel(ChannelID channel, double level | @@ -898,7 +907,7 @@ Dso::ErrorCode HantekDsoControl::setTriggerLevel(ChannelID channel, double level | ||
| 898 | // Calculate the trigger level value | 907 | // Calculate the trigger level value |
| 899 | unsigned short minimum, maximum; | 908 | unsigned short minimum, maximum; |
| 900 | if (specification.sampleSize > 8) { | 909 | if (specification.sampleSize > 8) { |
| 901 | - Offset &offsetLimit = specification.offsetLimit[channel].step[controlsettings.voltage[channel].gain]; | 910 | + Offset &offsetLimit = controlsettings.offsetLimit[channel].step[controlsettings.voltage[channel].gain]; |
| 902 | // The range is the same as used for the offsets for 10 bit models | 911 | // The range is the same as used for the offsets for 10 bit models |
| 903 | minimum = ((unsigned short)*((unsigned char *)&(offsetLimit.start)) << 8) + | 912 | minimum = ((unsigned short)*((unsigned char *)&(offsetLimit.start)) << 8) + |
| 904 | *((unsigned char *)&(offsetLimit.start) + 1); | 913 | *((unsigned char *)&(offsetLimit.start) + 1); |
| @@ -931,7 +940,7 @@ Dso::ErrorCode HantekDsoControl::setTriggerLevel(ChannelID channel, double level | @@ -931,7 +940,7 @@ Dso::ErrorCode HantekDsoControl::setTriggerLevel(ChannelID channel, double level | ||
| 931 | Dso::ErrorCode HantekDsoControl::setTriggerSlope(Dso::Slope slope) { | 940 | Dso::ErrorCode HantekDsoControl::setTriggerSlope(Dso::Slope slope) { |
| 932 | if (!device->isConnected()) return Dso::ErrorCode::CONNECTION; | 941 | if (!device->isConnected()) return Dso::ErrorCode::CONNECTION; |
| 933 | 942 | ||
| 934 | - switch (specification.command.bulk.setTrigger) { | 943 | + switch (specification.cmdSetTrigger) { |
| 935 | case BulkCode::SETTRIGGERANDSAMPLERATE: { | 944 | case BulkCode::SETTRIGGERANDSAMPLERATE: { |
| 936 | // SetTriggerAndSamplerate bulk command for trigger slope | 945 | // SetTriggerAndSamplerate bulk command for trigger slope |
| 937 | modifyCommand<BulkSetTriggerAndSamplerate>(BulkCode::SETTRIGGERANDSAMPLERATE)->setTriggerSlope((uint8_t)slope); | 946 | modifyCommand<BulkSetTriggerAndSamplerate>(BulkCode::SETTRIGGERANDSAMPLERATE)->setTriggerSlope((uint8_t)slope); |
| @@ -966,7 +975,7 @@ Dso::ErrorCode HantekDsoControl::setPretriggerPosition(double position) { | @@ -966,7 +975,7 @@ Dso::ErrorCode HantekDsoControl::setPretriggerPosition(double position) { | ||
| 966 | // Fast rate mode uses both channels | 975 | // Fast rate mode uses both channels |
| 967 | if (isFastRate()) positionSamples /= specification.channels; | 976 | if (isFastRate()) positionSamples /= specification.channels; |
| 968 | 977 | ||
| 969 | - switch (specification.command.bulk.setPretrigger) { | 978 | + switch (specification.cmdSetPretrigger) { |
| 970 | case BulkCode::SETTRIGGERANDSAMPLERATE: { | 979 | case BulkCode::SETTRIGGERANDSAMPLERATE: { |
| 971 | // Calculate the position value (Start point depending on record length) | 980 | // Calculate the position value (Start point depending on record length) |
| 972 | unsigned triggerPosition = isRollMode() ? 0x1 : 0x7ffff - recordLength + (unsigned)positionSamples; | 981 | unsigned triggerPosition = isRollMode() ? 0x1 : 0x7ffff - recordLength + (unsigned)positionSamples; |
| @@ -1057,21 +1066,21 @@ void HantekDsoControl::run() { | @@ -1057,21 +1066,21 @@ void HantekDsoControl::run() { | ||
| 1057 | int errorCode = 0; | 1066 | int errorCode = 0; |
| 1058 | 1067 | ||
| 1059 | // Send all pending bulk commands | 1068 | // Send all pending bulk commands |
| 1060 | - BulkCommand *bulkCommand = firstBulkCommand; | ||
| 1061 | - while (bulkCommand) { | ||
| 1062 | - if (bulkCommand->pending) { | 1069 | + BulkCommand *command = firstBulkCommand; |
| 1070 | + while (command) { | ||
| 1071 | + if (command->pending) { | ||
| 1063 | timestampDebug( | 1072 | timestampDebug( |
| 1064 | - QString("Sending bulk command:%1").arg(hexDump(bulkCommand->data(), bulkCommand->getSize()))); | 1073 | + QString("Sending bulk command:%1").arg(hexDump(command->data(), command->getSize()))); |
| 1065 | 1074 | ||
| 1066 | - errorCode = device->bulkCommand(bulkCommand); | 1075 | + errorCode = bulkCommand(command); |
| 1067 | if (errorCode < 0) { | 1076 | if (errorCode < 0) { |
| 1068 | qWarning() << "Sending bulk command failed: " << libUsbErrorString(errorCode); | 1077 | qWarning() << "Sending bulk command failed: " << libUsbErrorString(errorCode); |
| 1069 | emit communicationError(); | 1078 | emit communicationError(); |
| 1070 | return; | 1079 | return; |
| 1071 | } else | 1080 | } else |
| 1072 | - bulkCommand->pending = false; | 1081 | + command->pending = false; |
| 1073 | } | 1082 | } |
| 1074 | - bulkCommand = bulkCommand->next; | 1083 | + command = command->next; |
| 1075 | } | 1084 | } |
| 1076 | 1085 | ||
| 1077 | // Send all pending control commands | 1086 | // Send all pending control commands |
| @@ -1079,8 +1088,8 @@ void HantekDsoControl::run() { | @@ -1079,8 +1088,8 @@ void HantekDsoControl::run() { | ||
| 1079 | while (controlCommand) { | 1088 | while (controlCommand) { |
| 1080 | if (controlCommand->pending) { | 1089 | if (controlCommand->pending) { |
| 1081 | timestampDebug(QString("Sending control command %1:%2") | 1090 | timestampDebug(QString("Sending control command %1:%2") |
| 1082 | - .arg(QString::number(control[cIndex], 16), | ||
| 1083 | - hexDump(this->control[control]->data(), this->control[control]->getSize()))); | 1091 | + .arg(QString::number(controlCommand->code, 16), |
| 1092 | + hexDump(controlCommand->data(), controlCommand->getSize()))); | ||
| 1084 | 1093 | ||
| 1085 | errorCode = device->controlWrite(controlCommand); | 1094 | errorCode = device->controlWrite(controlCommand); |
| 1086 | if (errorCode < 0) { | 1095 | if (errorCode < 0) { |
| @@ -1114,7 +1123,7 @@ void HantekDsoControl::run() { | @@ -1114,7 +1123,7 @@ void HantekDsoControl::run() { | ||
| 1114 | // Sampling hasn't started, update the expected sample count | 1123 | // Sampling hasn't started, update the expected sample count |
| 1115 | expectedSampleCount = this->getSampleCount(); | 1124 | expectedSampleCount = this->getSampleCount(); |
| 1116 | 1125 | ||
| 1117 | - errorCode = device->bulkCommand(getCommand(BulkCode::STARTSAMPLING)); | 1126 | + errorCode = bulkCommand(getCommand(BulkCode::STARTSAMPLING)); |
| 1118 | if (errorCode < 0) { | 1127 | if (errorCode < 0) { |
| 1119 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { | 1128 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { |
| 1120 | emit communicationError(); | 1129 | emit communicationError(); |
| @@ -1130,7 +1139,7 @@ void HantekDsoControl::run() { | @@ -1130,7 +1139,7 @@ void HantekDsoControl::run() { | ||
| 1130 | break; | 1139 | break; |
| 1131 | 1140 | ||
| 1132 | case RollState::ENABLETRIGGER: | 1141 | case RollState::ENABLETRIGGER: |
| 1133 | - errorCode = device->bulkCommand(getCommand(BulkCode::ENABLETRIGGER)); | 1142 | + errorCode = bulkCommand(getCommand(BulkCode::ENABLETRIGGER)); |
| 1134 | if (errorCode < 0) { | 1143 | if (errorCode < 0) { |
| 1135 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { | 1144 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { |
| 1136 | emit communicationError(); | 1145 | emit communicationError(); |
| @@ -1144,7 +1153,7 @@ void HantekDsoControl::run() { | @@ -1144,7 +1153,7 @@ void HantekDsoControl::run() { | ||
| 1144 | break; | 1153 | break; |
| 1145 | 1154 | ||
| 1146 | case RollState::FORCETRIGGER: | 1155 | case RollState::FORCETRIGGER: |
| 1147 | - errorCode = device->bulkCommand(getCommand(BulkCode::FORCETRIGGER)); | 1156 | + errorCode = bulkCommand(getCommand(BulkCode::FORCETRIGGER)); |
| 1148 | if (errorCode < 0) { | 1157 | if (errorCode < 0) { |
| 1149 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { | 1158 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { |
| 1150 | emit communicationError(); | 1159 | emit communicationError(); |
| @@ -1161,7 +1170,7 @@ void HantekDsoControl::run() { | @@ -1161,7 +1170,7 @@ void HantekDsoControl::run() { | ||
| 1161 | std::vector<unsigned char> rawData = this->getSamples(expectedSampleCount); | 1170 | std::vector<unsigned char> rawData = this->getSamples(expectedSampleCount); |
| 1162 | if (this->_samplingStarted) { | 1171 | if (this->_samplingStarted) { |
| 1163 | convertRawDataToSamples(rawData); | 1172 | convertRawDataToSamples(rawData); |
| 1164 | - emit samplesAvailable(); | 1173 | + emit samplesAvailable(&result); |
| 1165 | } | 1174 | } |
| 1166 | } | 1175 | } |
| 1167 | 1176 | ||
| @@ -1202,7 +1211,7 @@ void HantekDsoControl::run() { | @@ -1202,7 +1211,7 @@ void HantekDsoControl::run() { | ||
| 1202 | std::vector<unsigned char> rawData = this->getSamples(expectedSampleCount); | 1211 | std::vector<unsigned char> rawData = this->getSamples(expectedSampleCount); |
| 1203 | if (this->_samplingStarted) { | 1212 | if (this->_samplingStarted) { |
| 1204 | convertRawDataToSamples(rawData); | 1213 | convertRawDataToSamples(rawData); |
| 1205 | - emit samplesAvailable(); | 1214 | + emit samplesAvailable(&result); |
| 1206 | } | 1215 | } |
| 1207 | } | 1216 | } |
| 1208 | 1217 | ||
| @@ -1216,10 +1225,16 @@ void HantekDsoControl::run() { | @@ -1216,10 +1225,16 @@ void HantekDsoControl::run() { | ||
| 1216 | // Start next capture if necessary by leaving out the break statement | 1225 | // Start next capture if necessary by leaving out the break statement |
| 1217 | 1226 | ||
| 1218 | if (!this->sampling) break; | 1227 | if (!this->sampling) break; |
| 1219 | -#if __has_cpp_attribute(fallthrough) // Make compiler happy | ||
| 1220 | - else | ||
| 1221 | - [[fallthrough]]; | 1228 | +#if __has_cpp_attribute(clang::fallthrough) |
| 1229 | +#define FALLTHROUGH [[clang::fallthrough]]; | ||
| 1230 | +#elif __has_cpp_attribute(fallthrough) | ||
| 1231 | +#define FALLTHROUGH [[fallthrough]]; | ||
| 1232 | +#else | ||
| 1233 | +#define FALLTHROUGH | ||
| 1222 | #endif | 1234 | #endif |
| 1235 | + else { | ||
| 1236 | + FALLTHROUGH | ||
| 1237 | + } | ||
| 1223 | case CAPTURE_WAITING: | 1238 | case CAPTURE_WAITING: |
| 1224 | // Sampling hasn't started, update the expected sample count | 1239 | // Sampling hasn't started, update the expected sample count |
| 1225 | expectedSampleCount = this->getSampleCount(); | 1240 | expectedSampleCount = this->getSampleCount(); |
| @@ -1230,7 +1245,7 @@ void HantekDsoControl::run() { | @@ -1230,7 +1245,7 @@ void HantekDsoControl::run() { | ||
| 1230 | if (this->cycleCounter == this->startCycle && !isRollMode()) { | 1245 | if (this->cycleCounter == this->startCycle && !isRollMode()) { |
| 1231 | // Buffer refilled completely since start of sampling, enable the | 1246 | // Buffer refilled completely since start of sampling, enable the |
| 1232 | // trigger now | 1247 | // trigger now |
| 1233 | - errorCode = device->bulkCommand(getCommand(BulkCode::ENABLETRIGGER)); | 1248 | + errorCode = bulkCommand(getCommand(BulkCode::ENABLETRIGGER)); |
| 1234 | if (errorCode < 0) { | 1249 | if (errorCode < 0) { |
| 1235 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { | 1250 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { |
| 1236 | emit communicationError(); | 1251 | emit communicationError(); |
| @@ -1243,7 +1258,7 @@ void HantekDsoControl::run() { | @@ -1243,7 +1258,7 @@ void HantekDsoControl::run() { | ||
| 1243 | } else if (cycleCounter >= 8 + this->startCycle && | 1258 | } else if (cycleCounter >= 8 + this->startCycle && |
| 1244 | controlsettings.trigger.mode == Dso::TriggerMode::WAIT_FORCE) { | 1259 | controlsettings.trigger.mode == Dso::TriggerMode::WAIT_FORCE) { |
| 1245 | // Force triggering | 1260 | // Force triggering |
| 1246 | - errorCode = device->bulkCommand(getCommand(BulkCode::FORCETRIGGER)); | 1261 | + errorCode = bulkCommand(getCommand(BulkCode::FORCETRIGGER)); |
| 1247 | if (errorCode < 0) { | 1262 | if (errorCode < 0) { |
| 1248 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { | 1263 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { |
| 1249 | emit communicationError(); | 1264 | emit communicationError(); |
| @@ -1259,7 +1274,7 @@ void HantekDsoControl::run() { | @@ -1259,7 +1274,7 @@ void HantekDsoControl::run() { | ||
| 1259 | } | 1274 | } |
| 1260 | 1275 | ||
| 1261 | // Start capturing | 1276 | // Start capturing |
| 1262 | - errorCode = device->bulkCommand(getCommand(BulkCode::STARTSAMPLING)); | 1277 | + errorCode = bulkCommand(getCommand(BulkCode::STARTSAMPLING)); |
| 1263 | if (errorCode < 0) { | 1278 | if (errorCode < 0) { |
| 1264 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { | 1279 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) { |
| 1265 | emit communicationError(); | 1280 | emit communicationError(); |
| @@ -1290,3 +1305,27 @@ void HantekDsoControl::run() { | @@ -1290,3 +1305,27 @@ void HantekDsoControl::run() { | ||
| 1290 | QTimer::singleShot(cycleTime, this, SLOT(run())); | 1305 | QTimer::singleShot(cycleTime, this, SLOT(run())); |
| 1291 | #endif | 1306 | #endif |
| 1292 | } | 1307 | } |
| 1308 | + | ||
| 1309 | + | ||
| 1310 | +int HantekDsoControl::getConnectionSpeed() const { | ||
| 1311 | + int errorCode; | ||
| 1312 | + ControlGetSpeed response; | ||
| 1313 | + errorCode = device->controlRead(&response); | ||
| 1314 | + if (errorCode < 0) return errorCode; | ||
| 1315 | + | ||
| 1316 | + return response.getSpeed(); | ||
| 1317 | +} | ||
| 1318 | + | ||
| 1319 | +int HantekDsoControl::getPacketSize() const { | ||
| 1320 | + const int s = getConnectionSpeed(); | ||
| 1321 | + if (s == CONNECTION_FULLSPEED) | ||
| 1322 | + return 64; | ||
| 1323 | + else if (s == CONNECTION_HIGHSPEED) | ||
| 1324 | + return 512; | ||
| 1325 | + else if (s > CONNECTION_HIGHSPEED) { | ||
| 1326 | + qWarning() << "Unknown USB speed. Please correct source code in USBDevice::getPacketSize()"; | ||
| 1327 | + throw new std::runtime_error("Unknown USB speed"); | ||
| 1328 | + } else if (s < 0) | ||
| 1329 | + return s; | ||
| 1330 | + return 0; | ||
| 1331 | +} |
openhantek/src/hantekdso/hantekdsocontrol.h
| @@ -5,16 +5,16 @@ | @@ -5,16 +5,16 @@ | ||
| 5 | #define NOMINMAX // disable windows.h min/max global methods | 5 | #define NOMINMAX // disable windows.h min/max global methods |
| 6 | #include <limits> | 6 | #include <limits> |
| 7 | 7 | ||
| 8 | -#include "errorcodes.h" | 8 | +#include "controlsettings.h" |
| 9 | +#include "controlspecification.h" | ||
| 9 | #include "dsosamples.h" | 10 | #include "dsosamples.h" |
| 11 | +#include "errorcodes.h" | ||
| 10 | #include "states.h" | 12 | #include "states.h" |
| 11 | -#include "controlspecification.h" | ||
| 12 | -#include "controlsettings.h" | ||
| 13 | #include "utils/printutils.h" | 13 | #include "utils/printutils.h" |
| 14 | 14 | ||
| 15 | -#include "hantekprotocol/definitions.h" | ||
| 16 | #include "hantekprotocol/bulkStructs.h" | 15 | #include "hantekprotocol/bulkStructs.h" |
| 17 | #include "hantekprotocol/controlStructs.h" | 16 | #include "hantekprotocol/controlStructs.h" |
| 17 | +#include "hantekprotocol/definitions.h" | ||
| 18 | 18 | ||
| 19 | #include <vector> | 19 | #include <vector> |
| 20 | 20 | ||
| @@ -71,7 +71,15 @@ class HantekDsoControl : public QObject { | @@ -71,7 +71,15 @@ class HantekDsoControl : public QObject { | ||
| 71 | double getMaxSamplerate(); | 71 | double getMaxSamplerate(); |
| 72 | 72 | ||
| 73 | /// Return the associated usb device. | 73 | /// Return the associated usb device. |
| 74 | - USBDevice *getDevice(); | 74 | + const USBDevice *getDevice() const; |
| 75 | + | ||
| 76 | + /// \brief Gets the speed of the connection. | ||
| 77 | + /// \return The ::ConnectionSpeed of the USB connection. | ||
| 78 | + int getConnectionSpeed() const; | ||
| 79 | + | ||
| 80 | + /// \brief Gets the maximum size of one packet transmitted via bulk transfer. | ||
| 81 | + /// \return The maximum packet size in bytes, negative libusb error code on error. | ||
| 82 | + int getPacketSize() const; | ||
| 75 | 83 | ||
| 76 | /// Return the last sample set | 84 | /// Return the last sample set |
| 77 | const DSOsamples &getLastSamples(); | 85 | const DSOsamples &getLastSamples(); |
| @@ -89,19 +97,20 @@ class HantekDsoControl : public QObject { | @@ -89,19 +97,20 @@ class HantekDsoControl : public QObject { | ||
| 89 | /// \return See ::Dso::ErrorCode. | 97 | /// \return See ::Dso::ErrorCode. |
| 90 | Dso::ErrorCode stringCommand(const QString &commandString); | 98 | Dso::ErrorCode stringCommand(const QString &commandString); |
| 91 | 99 | ||
| 92 | - void addCommand(BulkCommand* newCommand, bool pending = true); | ||
| 93 | - template<class T> T* modifyCommand(Hantek::BulkCode code) { | 100 | + void addCommand(BulkCommand *newCommand, bool pending = true); |
| 101 | + template <class T> T *modifyCommand(Hantek::BulkCode code) { | ||
| 94 | command[(uint8_t)code]->pending = true; | 102 | command[(uint8_t)code]->pending = true; |
| 95 | - return static_cast<T*>(command[(uint8_t)code]); | 103 | + return static_cast<T *>(command[(uint8_t)code]); |
| 96 | } | 104 | } |
| 97 | - const BulkCommand* getCommand(Hantek::BulkCode code) const; | 105 | + const BulkCommand *getCommand(Hantek::BulkCode code) const; |
| 98 | 106 | ||
| 99 | - void addCommand(ControlCommand* newCommand, bool pending = true); | ||
| 100 | - template<class T> T* modifyCommand(Hantek::ControlCode code) { | 107 | + void addCommand(ControlCommand *newCommand, bool pending = true); |
| 108 | + template <class T> T *modifyCommand(Hantek::ControlCode code) { | ||
| 101 | control[(uint8_t)code]->pending = true; | 109 | control[(uint8_t)code]->pending = true; |
| 102 | - return static_cast<T*>(control[(uint8_t)code]); | 110 | + return static_cast<T *>(control[(uint8_t)code]); |
| 103 | } | 111 | } |
| 104 | - const ControlCommand* getCommand(Hantek::ControlCode code) const; | 112 | + const ControlCommand *getCommand(Hantek::ControlCode code) const; |
| 113 | + | ||
| 105 | private: | 114 | private: |
| 106 | bool isRollMode() const; | 115 | bool isRollMode() const; |
| 107 | bool isFastRate() const; | 116 | bool isFastRate() const; |
| @@ -164,9 +173,9 @@ class HantekDsoControl : public QObject { | @@ -164,9 +173,9 @@ class HantekDsoControl : public QObject { | ||
| 164 | private: | 173 | private: |
| 165 | /// Pointers to bulk/control commands | 174 | /// Pointers to bulk/control commands |
| 166 | BulkCommand *command[255] = {0}; | 175 | BulkCommand *command[255] = {0}; |
| 167 | - BulkCommand* firstBulkCommand = nullptr; | 176 | + BulkCommand *firstBulkCommand = nullptr; |
| 168 | ControlCommand *control[255] = {0}; | 177 | ControlCommand *control[255] = {0}; |
| 169 | - ControlCommand* firstControlCommand = nullptr; | 178 | + ControlCommand *firstControlCommand = nullptr; |
| 170 | 179 | ||
| 171 | // Communication with device | 180 | // Communication with device |
| 172 | USBDevice *device; ///< The USB device for the oscilloscope | 181 | USBDevice *device; ///< The USB device for the oscilloscope |
| @@ -190,6 +199,12 @@ class HantekDsoControl : public QObject { | @@ -190,6 +199,12 @@ class HantekDsoControl : public QObject { | ||
| 190 | int startCycle = 0; | 199 | int startCycle = 0; |
| 191 | int cycleTime = 0; | 200 | int cycleTime = 0; |
| 192 | 201 | ||
| 202 | + /// \brief Send a bulk command to the oscilloscope. | ||
| 203 | + /// \param command The command, that should be sent. | ||
| 204 | + /// \param attempts The number of attempts, that are done on timeouts. | ||
| 205 | + /// \return Number of sent bytes on success, libusb error code on error. | ||
| 206 | + int bulkCommand(const DataArray<unsigned char> *command, int attempts = HANTEK_ATTEMPTS) const; | ||
| 207 | + | ||
| 193 | public slots: | 208 | public slots: |
| 194 | void startSampling(); | 209 | void startSampling(); |
| 195 | void stopSampling(); | 210 | void stopSampling(); |
| @@ -258,7 +273,7 @@ class HantekDsoControl : public QObject { | @@ -258,7 +273,7 @@ class HantekDsoControl : public QObject { | ||
| 258 | void samplingStarted(); ///< The oscilloscope started sampling/waiting for trigger | 273 | void samplingStarted(); ///< The oscilloscope started sampling/waiting for trigger |
| 259 | void samplingStopped(); ///< The oscilloscope stopped sampling/waiting for trigger | 274 | void samplingStopped(); ///< The oscilloscope stopped sampling/waiting for trigger |
| 260 | void statusMessage(const QString &message, int timeout); ///< Status message about the oscilloscope | 275 | void statusMessage(const QString &message, int timeout); ///< Status message about the oscilloscope |
| 261 | - void samplesAvailable(); ///< New sample data is available | 276 | + void samplesAvailable(const DSOsamples *samples); ///< New sample data is available |
| 262 | 277 | ||
| 263 | void availableRecordLengthsChanged(const std::vector<unsigned> &recordLengths); ///< The available record | 278 | void availableRecordLengthsChanged(const std::vector<unsigned> &recordLengths); ///< The available record |
| 264 | /// lengths, empty list for | 279 | /// lengths, empty list for |
| @@ -271,3 +286,5 @@ class HantekDsoControl : public QObject { | @@ -271,3 +286,5 @@ class HantekDsoControl : public QObject { | ||
| 271 | 286 | ||
| 272 | void communicationError() const; | 287 | void communicationError() const; |
| 273 | }; | 288 | }; |
| 289 | + | ||
| 290 | +Q_DECLARE_METATYPE(DSOsamples *) |
openhantek/src/hantekdso/models/modelDSO2090.cpp
| @@ -5,12 +5,13 @@ | @@ -5,12 +5,13 @@ | ||
| 5 | 5 | ||
| 6 | using namespace Hantek; | 6 | using namespace Hantek; |
| 7 | 7 | ||
| 8 | -ModelDSO2090::ModelDSO2090() : DSOModel(ID, 0x04b5, 0x2090, 0x04b4, 0x2090, "dso2090x86", "DSO-2090", Dso::ControlSpecification()) { | ||
| 9 | - specification.command.bulk.setRecordLength = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 10 | - specification.command.bulk.setChannels = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 11 | - specification.command.bulk.setSamplerate = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 12 | - specification.command.bulk.setTrigger = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 13 | - specification.command.bulk.setPretrigger = BulkCode::SETTRIGGERANDSAMPLERATE; | 8 | +ModelDSO2090::ModelDSO2090() : DSOModel(ID, 0x04b5, 0x2090, 0x04b4, 0x2090, "dso2090x86", "DSO-2090", |
| 9 | + Dso::ControlSpecification(2)) { | ||
| 10 | + specification.cmdSetRecordLength = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 11 | + specification.cmdSetChannels = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 12 | + specification.cmdSetSamplerate = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 13 | + specification.cmdSetTrigger = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 14 | + specification.cmdSetPretrigger = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 14 | 15 | ||
| 15 | specification.samplerate.single.base = 50e6; | 16 | specification.samplerate.single.base = 50e6; |
| 16 | specification.samplerate.single.max = 50e6; | 17 | specification.samplerate.single.max = 50e6; |
openhantek/src/hantekdso/models/modelDSO2150.cpp
| @@ -5,12 +5,13 @@ | @@ -5,12 +5,13 @@ | ||
| 5 | 5 | ||
| 6 | using namespace Hantek; | 6 | using namespace Hantek; |
| 7 | 7 | ||
| 8 | -ModelDSO2150::ModelDSO2150() : DSOModel(ID, 0x04b5, 0x2150, 0x04b4, 0x2150, "dso2150x86", "DSO-2150", Dso::ControlSpecification()) { | ||
| 9 | - specification.command.bulk.setRecordLength = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 10 | - specification.command.bulk.setChannels = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 11 | - specification.command.bulk.setSamplerate = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 12 | - specification.command.bulk.setTrigger = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 13 | - specification.command.bulk.setPretrigger = BulkCode::SETTRIGGERANDSAMPLERATE; | 8 | +ModelDSO2150::ModelDSO2150() : DSOModel(ID, 0x04b5, 0x2150, 0x04b4, 0x2150, "dso2150x86", "DSO-2150", |
| 9 | + Dso::ControlSpecification(2)) { | ||
| 10 | + specification.cmdSetRecordLength = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 11 | + specification.cmdSetChannels = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 12 | + specification.cmdSetSamplerate = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 13 | + specification.cmdSetTrigger = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 14 | + specification.cmdSetPretrigger = BulkCode::SETTRIGGERANDSAMPLERATE; | ||
| 14 | 15 | ||
| 15 | specification.samplerate.single.base = 50e6; | 16 | specification.samplerate.single.base = 50e6; |
| 16 | specification.samplerate.single.max = 75e6; | 17 | specification.samplerate.single.max = 75e6; |
openhantek/src/hantekdso/models/modelDSO2250.cpp
| @@ -5,12 +5,13 @@ | @@ -5,12 +5,13 @@ | ||
| 5 | 5 | ||
| 6 | using namespace Hantek; | 6 | using namespace Hantek; |
| 7 | 7 | ||
| 8 | -ModelDSO2250::ModelDSO2250() : DSOModel(ID, 0x04b5, 0x2250, 0x04b4, 0x2250, "dso2250x86", "DSO-2250", Dso::ControlSpecification()) { | ||
| 9 | - specification.command.bulk.setRecordLength = BulkCode::DSETBUFFER; | ||
| 10 | - specification.command.bulk.setChannels = BulkCode::BSETCHANNELS; | ||
| 11 | - specification.command.bulk.setSamplerate = BulkCode::ESETTRIGGERORSAMPLERATE; | ||
| 12 | - specification.command.bulk.setTrigger = BulkCode::CSETTRIGGERORSAMPLERATE; | ||
| 13 | - specification.command.bulk.setPretrigger = BulkCode::FSETBUFFER; | 8 | +ModelDSO2250::ModelDSO2250() : DSOModel(ID, 0x04b5, 0x2250, 0x04b4, 0x2250, "dso2250x86", "DSO-2250", |
| 9 | + Dso::ControlSpecification(2)) { | ||
| 10 | + specification.cmdSetRecordLength = BulkCode::DSETBUFFER; | ||
| 11 | + specification.cmdSetChannels = BulkCode::BSETCHANNELS; | ||
| 12 | + specification.cmdSetSamplerate = BulkCode::ESETTRIGGERORSAMPLERATE; | ||
| 13 | + specification.cmdSetTrigger = BulkCode::CSETTRIGGERORSAMPLERATE; | ||
| 14 | + specification.cmdSetPretrigger = BulkCode::FSETBUFFER; | ||
| 14 | 15 | ||
| 15 | specification.samplerate.single.base = 100e6; | 16 | specification.samplerate.single.base = 100e6; |
| 16 | specification.samplerate.single.max = 100e6; | 17 | specification.samplerate.single.max = 100e6; |
openhantek/src/hantekdso/models/modelDSO5200.cpp
| @@ -5,12 +5,13 @@ | @@ -5,12 +5,13 @@ | ||
| 5 | 5 | ||
| 6 | using namespace Hantek; | 6 | using namespace Hantek; |
| 7 | 7 | ||
| 8 | -ModelDSO5200::ModelDSO5200() : DSOModel(ID, 0x04b5, 0x5200, 0x04b4, 0x5200, "dso5200x86", "DSO-5200", Dso::ControlSpecification()) { | ||
| 9 | - specification.command.bulk.setRecordLength = BulkCode::DSETBUFFER; | ||
| 10 | - specification.command.bulk.setChannels = BulkCode::ESETTRIGGERORSAMPLERATE; | ||
| 11 | - specification.command.bulk.setSamplerate = BulkCode::CSETTRIGGERORSAMPLERATE; | ||
| 12 | - specification.command.bulk.setTrigger = BulkCode::ESETTRIGGERORSAMPLERATE; | ||
| 13 | - specification.command.bulk.setPretrigger = BulkCode::ESETTRIGGERORSAMPLERATE; | 8 | +ModelDSO5200::ModelDSO5200() : DSOModel(ID, 0x04b5, 0x5200, 0x04b4, 0x5200, "dso5200x86", "DSO-5200", |
| 9 | + Dso::ControlSpecification(2)) { | ||
| 10 | + specification.cmdSetRecordLength = BulkCode::DSETBUFFER; | ||
| 11 | + specification.cmdSetChannels = BulkCode::ESETTRIGGERORSAMPLERATE; | ||
| 12 | + specification.cmdSetSamplerate = BulkCode::CSETTRIGGERORSAMPLERATE; | ||
| 13 | + specification.cmdSetTrigger = BulkCode::ESETTRIGGERORSAMPLERATE; | ||
| 14 | + specification.cmdSetPretrigger = BulkCode::ESETTRIGGERORSAMPLERATE; | ||
| 14 | 15 | ||
| 15 | specification.samplerate.single.base = 100e6; | 16 | specification.samplerate.single.base = 100e6; |
| 16 | specification.samplerate.single.max = 125e6; | 17 | specification.samplerate.single.max = 125e6; |
openhantek/src/hantekdso/models/modelDSO6022.cpp
| @@ -5,7 +5,8 @@ | @@ -5,7 +5,8 @@ | ||
| 5 | 5 | ||
| 6 | using namespace Hantek; | 6 | using namespace Hantek; |
| 7 | 7 | ||
| 8 | -ModelDSO6022BE::ModelDSO6022BE() : DSOModel(ID, 0x04b5, 0x6022, 0x04b4, 0x6022, "dso6022be", "DSO-6022BE", Dso::ControlSpecification()) { | 8 | +ModelDSO6022BE::ModelDSO6022BE() : DSOModel(ID, 0x04b5, 0x6022, 0x04b4, 0x6022, "dso6022be", "DSO-6022BE", |
| 9 | + Dso::ControlSpecification(2)) { | ||
| 9 | // 6022xx do not support any bulk commands | 10 | // 6022xx do not support any bulk commands |
| 10 | specification.useControlNoBulk = true; | 11 | specification.useControlNoBulk = true; |
| 11 | specification.isSoftwareTriggerDevice = true; | 12 | specification.isSoftwareTriggerDevice = true; |
openhantek/src/hantekprotocol/bulkStructs.h
| @@ -7,6 +7,7 @@ | @@ -7,6 +7,7 @@ | ||
| 7 | 7 | ||
| 8 | #include <QString> | 8 | #include <QString> |
| 9 | 9 | ||
| 10 | +#include "types.h" | ||
| 10 | #include "definitions.h" | 11 | #include "definitions.h" |
| 11 | #include "states.h" | 12 | #include "states.h" |
| 12 | #include "usb/bulkcommand.h" | 13 | #include "usb/bulkcommand.h" |
| @@ -190,8 +191,8 @@ class BulkSetRecordLength2250 : public BulkCommand { | @@ -190,8 +191,8 @@ class BulkSetRecordLength2250 : public BulkCommand { | ||
| 190 | class BulkSetBuffer5200 : public BulkCommand { | 191 | class BulkSetBuffer5200 : public BulkCommand { |
| 191 | public: | 192 | public: |
| 192 | BulkSetBuffer5200(); | 193 | BulkSetBuffer5200(); |
| 193 | - BulkSetBuffer5200(uint16_t triggerPositionPre, uint16_t triggerPositionPost, DTriggerPositionUsed usedPre = DTriggerPositionUsed::DTRIGGERPOSITION_OFF, | ||
| 194 | - DTriggerPositionUsed usedPost = DTriggerPositionUsed::DTRIGGERPOSITION_OFF, uint8_t recordLength = 0); | 194 | + BulkSetBuffer5200(uint16_t triggerPositionPre, uint16_t triggerPositionPost, DTriggerPositionUsed usedPre = DTriggerPositionUsed::OFF, |
| 195 | + DTriggerPositionUsed usedPost = DTriggerPositionUsed::OFF, uint8_t recordLength = 0); | ||
| 195 | 196 | ||
| 196 | uint16_t getTriggerPositionPre(); | 197 | uint16_t getTriggerPositionPre(); |
| 197 | void setTriggerPositionPre(uint16_t value); | 198 | void setTriggerPositionPre(uint16_t value); |
openhantek/src/hantekprotocol/controlStructs.cpp
| @@ -4,12 +4,24 @@ | @@ -4,12 +4,24 @@ | ||
| 4 | 4 | ||
| 5 | #include "controlStructs.h" | 5 | #include "controlStructs.h" |
| 6 | #include "controlvalue.h" | 6 | #include "controlvalue.h" |
| 7 | +#include "definitions.h" | ||
| 7 | 8 | ||
| 8 | namespace Hantek { | 9 | namespace Hantek { |
| 9 | 10 | ||
| 11 | +ControlBeginCommand::ControlBeginCommand(BulkIndex index) | ||
| 12 | + : ControlCommand(Hantek::ControlCode::CONTROL_BEGINCOMMAND, 10) { | ||
| 13 | + array[0] = 0x0f; | ||
| 14 | + array[1] = (uint8_t)index; | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | +ControlGetSpeed::ControlGetSpeed() : ControlCommand(Hantek::ControlCode::CONTROL_GETSPEED, 10) {} | ||
| 18 | + | ||
| 19 | +ConnectionSpeed ControlGetSpeed::getSpeed() { return (ConnectionSpeed)this->array[0]; } | ||
| 20 | + | ||
| 10 | ControlSetOffset::ControlSetOffset() : ControlCommand(ControlCode::CONTROL_SETOFFSET, 17) {} | 21 | ControlSetOffset::ControlSetOffset() : ControlCommand(ControlCode::CONTROL_SETOFFSET, 17) {} |
| 11 | 22 | ||
| 12 | -ControlSetOffset::ControlSetOffset(uint16_t channel1, uint16_t channel2, uint16_t trigger) : ControlCommand(ControlCode::CONTROL_SETOFFSET, 17) { | 23 | +ControlSetOffset::ControlSetOffset(uint16_t channel1, uint16_t channel2, uint16_t trigger) |
| 24 | + : ControlCommand(ControlCode::CONTROL_SETOFFSET, 17) { | ||
| 13 | this->setChannel(0, channel1); | 25 | this->setChannel(0, channel1); |
| 14 | this->setChannel(1, channel2); | 26 | this->setChannel(1, channel2); |
| 15 | this->setTrigger(trigger); | 27 | this->setTrigger(trigger); |
| @@ -41,7 +53,7 @@ void ControlSetOffset::setTrigger(uint16_t level) { | @@ -41,7 +53,7 @@ void ControlSetOffset::setTrigger(uint16_t level) { | ||
| 41 | 53 | ||
| 42 | ControlSetRelays::ControlSetRelays(bool ch1Below1V, bool ch1Below100mV, bool ch1CouplingDC, bool ch2Below1V, | 54 | ControlSetRelays::ControlSetRelays(bool ch1Below1V, bool ch1Below100mV, bool ch1CouplingDC, bool ch2Below1V, |
| 43 | bool ch2Below100mV, bool ch2CouplingDC, bool triggerExt) | 55 | bool ch2Below100mV, bool ch2CouplingDC, bool triggerExt) |
| 44 | - : ControlCommand(ControlCode::CONTROL_SETRELAYS,17) { | 56 | + : ControlCommand(ControlCode::CONTROL_SETRELAYS, 17) { |
| 45 | this->setBelow1V(0, ch1Below1V); | 57 | this->setBelow1V(0, ch1Below1V); |
| 46 | this->setBelow100mV(0, ch1Below100mV); | 58 | this->setBelow100mV(0, ch1Below100mV); |
| 47 | this->setCoupling(0, ch1CouplingDC); | 59 | this->setCoupling(0, ch1CouplingDC); |
| @@ -97,27 +109,31 @@ bool ControlSetRelays::getTrigger() { return (this->array[7] & 0x01) == 0x00; } | @@ -97,27 +109,31 @@ bool ControlSetRelays::getTrigger() { return (this->array[7] & 0x01) == 0x00; } | ||
| 97 | 109 | ||
| 98 | void ControlSetRelays::setTrigger(bool ext) { this->array[7] = ext ? 0xfe : 0x01; } | 110 | void ControlSetRelays::setTrigger(bool ext) { this->array[7] = ext ? 0xfe : 0x01; } |
| 99 | 111 | ||
| 100 | -ControlSetVoltDIV_CH1::ControlSetVoltDIV_CH1() : ControlCommand(ControlCode::CONTROL_SETVOLTDIV_CH1,1) { this->setDiv(5); } | 112 | +ControlSetVoltDIV_CH1::ControlSetVoltDIV_CH1() : ControlCommand(ControlCode::CONTROL_SETVOLTDIV_CH1, 1) { |
| 113 | + this->setDiv(5); | ||
| 114 | +} | ||
| 101 | 115 | ||
| 102 | void ControlSetVoltDIV_CH1::setDiv(uint8_t val) { this->array[0] = val; } | 116 | void ControlSetVoltDIV_CH1::setDiv(uint8_t val) { this->array[0] = val; } |
| 103 | 117 | ||
| 104 | -ControlSetVoltDIV_CH2::ControlSetVoltDIV_CH2() : ControlCommand(ControlCode::CONTROL_SETVOLTDIV_CH2,1) { this->setDiv(5); } | 118 | +ControlSetVoltDIV_CH2::ControlSetVoltDIV_CH2() : ControlCommand(ControlCode::CONTROL_SETVOLTDIV_CH2, 1) { |
| 119 | + this->setDiv(5); | ||
| 120 | +} | ||
| 105 | 121 | ||
| 106 | void ControlSetVoltDIV_CH2::setDiv(uint8_t val) { this->array[0] = val; } | 122 | void ControlSetVoltDIV_CH2::setDiv(uint8_t val) { this->array[0] = val; } |
| 107 | 123 | ||
| 108 | -ControlSetTimeDIV::ControlSetTimeDIV() : ControlCommand(ControlCode::CONTROL_SETTIMEDIV,1) { this->setDiv(1); } | 124 | +ControlSetTimeDIV::ControlSetTimeDIV() : ControlCommand(ControlCode::CONTROL_SETTIMEDIV, 1) { this->setDiv(1); } |
| 109 | 125 | ||
| 110 | void ControlSetTimeDIV::setDiv(uint8_t val) { this->array[0] = val; } | 126 | void ControlSetTimeDIV::setDiv(uint8_t val) { this->array[0] = val; } |
| 111 | 127 | ||
| 112 | -ControlAcquireHardData::ControlAcquireHardData() : ControlCommand(ControlCode::CONTROL_ACQUIIRE_HARD_DATA,1) { this->array[0] = 0x01; } | 128 | +ControlAcquireHardData::ControlAcquireHardData() : ControlCommand(ControlCode::CONTROL_ACQUIIRE_HARD_DATA, 1) { |
| 129 | + this->array[0] = 0x01; | ||
| 130 | +} | ||
| 113 | 131 | ||
| 114 | -ControlGetLimits::ControlGetLimits(unsigned channels) : ControlCommand(ControlCode::CONTROL_VALUE,1), offsetLimit(new OffsetsPerGainStep[channels]) { | 132 | +ControlGetLimits::ControlGetLimits(unsigned channels) |
| 133 | + : ControlCommand(ControlCode::CONTROL_VALUE, 1), offsetLimit(new OffsetsPerGainStep[channels]) { | ||
| 115 | value = (uint8_t)ControlValue::VALUE_OFFSETLIMITS; | 134 | value = (uint8_t)ControlValue::VALUE_OFFSETLIMITS; |
| 116 | array[0] = 0x01; | 135 | array[0] = 0x01; |
| 117 | } | 136 | } |
| 118 | 137 | ||
| 119 | -ControlGetLimits::~ControlGetLimits() | ||
| 120 | -{ | ||
| 121 | - delete [] offsetLimit; | ||
| 122 | -} | 138 | +ControlGetLimits::~ControlGetLimits() { delete[] offsetLimit; } |
| 123 | } | 139 | } |
openhantek/src/hantekprotocol/controlStructs.h
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | -#include "definitions.h" | 3 | +#include "types.h" |
| 4 | #include "usb/usbdevicedefinitions.h" | 4 | #include "usb/usbdevicedefinitions.h" |
| 5 | #include "usb/controlcommand.h" | 5 | #include "usb/controlcommand.h" |
| 6 | #include "controlcode.h" | 6 | #include "controlcode.h" |
| 7 | 7 | ||
| 8 | namespace Hantek { | 8 | namespace Hantek { |
| 9 | +struct OffsetsPerGainStep; | ||
| 10 | + | ||
| 11 | +/// \enum BulkIndex | ||
| 12 | +/// \brief Can be set by CONTROL_BEGINCOMMAND, maybe it allows multiple commands | ||
| 13 | +/// at the same time? | ||
| 14 | +enum BulkIndex { | ||
| 15 | + COMMANDINDEX_0 = 0x03, ///< Used most of the time | ||
| 16 | + COMMANDINDEX_1 = 0x0a, | ||
| 17 | + COMMANDINDEX_2 = 0x09, | ||
| 18 | + COMMANDINDEX_3 = 0x01, ///< Used for ::BulkCode::SETTRIGGERANDSAMPLERATE sometimes | ||
| 19 | + COMMANDINDEX_4 = 0x02, | ||
| 20 | + COMMANDINDEX_5 = 0x08 | ||
| 21 | +}; | ||
| 22 | + | ||
| 23 | +/// \class ControlBeginCommand | ||
| 24 | +class ControlBeginCommand : public ControlCommand { | ||
| 25 | + public: | ||
| 26 | + /// \brief Sets the command index to the given value. | ||
| 27 | + /// \param index The CommandIndex for the command. | ||
| 28 | + ControlBeginCommand(BulkIndex index = COMMANDINDEX_0); | ||
| 29 | +}; | ||
| 30 | + | ||
| 31 | +/// \brief The CONTROL_GETSPEED parser. | ||
| 32 | +class ControlGetSpeed : public ControlCommand { | ||
| 33 | + public: | ||
| 34 | + ControlGetSpeed(); | ||
| 35 | + /// \brief Gets the speed of the connection. | ||
| 36 | + /// \return The speed level of the USB connection. | ||
| 37 | + ConnectionSpeed getSpeed(); | ||
| 38 | +}; | ||
| 9 | 39 | ||
| 10 | struct ControlSetOffset : public ControlCommand { | 40 | struct ControlSetOffset : public ControlCommand { |
| 11 | ControlSetOffset(); | 41 | ControlSetOffset(); |
openhantek/src/hantekprotocol/definitions.h
| @@ -7,10 +7,6 @@ | @@ -7,10 +7,6 @@ | ||
| 7 | #include <stdint.h> | 7 | #include <stdint.h> |
| 8 | 8 | ||
| 9 | #define HANTEK_GAIN_STEPS 9 | 9 | #define HANTEK_GAIN_STEPS 9 |
| 10 | -#define HANTEK_CHANNELS 2 ///< Number of physical channels | ||
| 11 | - | ||
| 12 | -typedef unsigned RecordLengthID; | ||
| 13 | -typedef unsigned ChannelID; | ||
| 14 | 10 | ||
| 15 | namespace Hantek { | 11 | namespace Hantek { |
| 16 | /// \enum UsedChannels | 12 | /// \enum UsedChannels |
| @@ -31,8 +27,8 @@ enum class UsedChannels : uint8_t { | @@ -31,8 +27,8 @@ enum class UsedChannels : uint8_t { | ||
| 31 | /// \enum DTriggerPositionUsed hantek/types.h | 27 | /// \enum DTriggerPositionUsed hantek/types.h |
| 32 | /// \brief The trigger position states for the 0x0d command. | 28 | /// \brief The trigger position states for the 0x0d command. |
| 33 | enum class DTriggerPositionUsed: uint8_t { | 29 | enum class DTriggerPositionUsed: uint8_t { |
| 34 | - DTRIGGERPOSITION_OFF = 0, ///< Used for Roll mode | ||
| 35 | - DTRIGGERPOSITION_ON = 7 ///< Used for normal operation | 30 | + OFF = 0, ///< Used for Roll mode |
| 31 | + ON = 7 ///< Used for normal operation | ||
| 36 | }; | 32 | }; |
| 37 | 33 | ||
| 38 | #pragma pack(push, 1) | 34 | #pragma pack(push, 1) |
openhantek/src/hantekprotocol/types.h
0 → 100644
openhantek/src/usb/controlbegin.cpp deleted
openhantek/src/usb/controlbegin.h deleted
| 1 | - | ||
| 2 | -// SPDX-License-Identifier: GPL-2.0+ | ||
| 3 | - | ||
| 4 | -#pragma once | ||
| 5 | -#include "controlcommand.h" | ||
| 6 | -#include <inttypes.h> | ||
| 7 | - | ||
| 8 | -/// \enum BulkIndex | ||
| 9 | -/// \brief Can be set by CONTROL_BEGINCOMMAND, maybe it allows multiple commands | ||
| 10 | -/// at the same time? | ||
| 11 | -enum BulkIndex { | ||
| 12 | - COMMANDINDEX_0 = 0x03, ///< Used most of the time | ||
| 13 | - COMMANDINDEX_1 = 0x0a, | ||
| 14 | - COMMANDINDEX_2 = 0x09, | ||
| 15 | - COMMANDINDEX_3 = 0x01, ///< Used for ::BulkCode::SETTRIGGERANDSAMPLERATE sometimes | ||
| 16 | - COMMANDINDEX_4 = 0x02, | ||
| 17 | - COMMANDINDEX_5 = 0x08 | ||
| 18 | -}; | ||
| 19 | - | ||
| 20 | -/// \class ControlBeginCommand | ||
| 21 | -class ControlBeginCommand : public ControlCommand { | ||
| 22 | - public: | ||
| 23 | - /// \brief Sets the command index to the given value. | ||
| 24 | - /// \param index The CommandIndex for the command. | ||
| 25 | - ControlBeginCommand(BulkIndex index = COMMANDINDEX_0); | ||
| 26 | -}; |
openhantek/src/usb/controlgetspeed.cpp deleted
openhantek/src/usb/controlgetspeed.h deleted
| 1 | -// SPDX-License-Identifier: GPL-2.0+ | ||
| 2 | - | ||
| 3 | -#pragma once | ||
| 4 | -#include "controlcommand.h" | ||
| 5 | -#include "usbdevicedefinitions.h" | ||
| 6 | - | ||
| 7 | -/// \brief The CONTROL_GETSPEED parser. | ||
| 8 | -class ControlGetSpeed : public ControlCommand { | ||
| 9 | - public: | ||
| 10 | - ControlGetSpeed(); | ||
| 11 | - /// \brief Gets the speed of the connection. | ||
| 12 | - /// \return The speed level of the USB connection. | ||
| 13 | - ConnectionSpeed getSpeed(); | ||
| 14 | -}; |
openhantek/src/usb/usbdevice.cpp
| @@ -6,20 +6,19 @@ | @@ -6,20 +6,19 @@ | ||
| 6 | 6 | ||
| 7 | #include "usbdevice.h" | 7 | #include "usbdevice.h" |
| 8 | 8 | ||
| 9 | -#include "hantekprotocol/controlStructs.h" | ||
| 10 | #include "hantekprotocol/bulkStructs.h" | 9 | #include "hantekprotocol/bulkStructs.h" |
| 11 | -#include "controlgetspeed.h" | 10 | +#include "hantekprotocol/controlStructs.h" |
| 12 | #include "models.h" | 11 | #include "models.h" |
| 13 | #include "utils/printutils.h" | 12 | #include "utils/printutils.h" |
| 14 | 13 | ||
| 15 | UniqueUSBid USBDevice::computeUSBdeviceID(libusb_device *device) { | 14 | UniqueUSBid USBDevice::computeUSBdeviceID(libusb_device *device) { |
| 16 | - UniqueUSBid v=0; | ||
| 17 | - libusb_get_port_numbers(device, (uint8_t*)&v, sizeof(v)); | 15 | + UniqueUSBid v = 0; |
| 16 | + libusb_get_port_numbers(device, (uint8_t *)&v, sizeof(v)); | ||
| 18 | return v; | 17 | return v; |
| 19 | } | 18 | } |
| 20 | 19 | ||
| 21 | -USBDevice::USBDevice(DSOModel *model, libusb_device *device, unsigned findIteration) : | ||
| 22 | - model(model), device(device), findIteration(findIteration), uniqueUSBdeviceID(computeUSBdeviceID(device)) { | 20 | +USBDevice::USBDevice(DSOModel *model, libusb_device *device, unsigned findIteration) |
| 21 | + : model(model), device(device), findIteration(findIteration), uniqueUSBdeviceID(computeUSBdeviceID(device)) { | ||
| 23 | libusb_ref_device(device); | 22 | libusb_ref_device(device); |
| 24 | libusb_get_device_descriptor(device, &descriptor); | 23 | libusb_get_device_descriptor(device, &descriptor); |
| 25 | } | 24 | } |
| @@ -115,15 +114,9 @@ bool USBDevice::needsFirmware() { | @@ -115,15 +114,9 @@ bool USBDevice::needsFirmware() { | ||
| 115 | return this->descriptor.idProduct != model->productID || this->descriptor.idVendor != model->vendorID; | 114 | return this->descriptor.idProduct != model->productID || this->descriptor.idVendor != model->vendorID; |
| 116 | } | 115 | } |
| 117 | 116 | ||
| 118 | -void USBDevice::setFindIteration(unsigned iteration) | ||
| 119 | -{ | ||
| 120 | - findIteration = iteration; | ||
| 121 | -} | 117 | +void USBDevice::setFindIteration(unsigned iteration) { findIteration = iteration; } |
| 122 | 118 | ||
| 123 | -unsigned USBDevice::getFindIteration() const | ||
| 124 | -{ | ||
| 125 | - return findIteration; | ||
| 126 | -} | 119 | +unsigned USBDevice::getFindIteration() const { return findIteration; } |
| 127 | 120 | ||
| 128 | int USBDevice::bulkTransfer(unsigned char endpoint, const unsigned char *data, unsigned int length, int attempts, | 121 | int USBDevice::bulkTransfer(unsigned char endpoint, const unsigned char *data, unsigned int length, int attempts, |
| 129 | unsigned int timeout) { | 122 | unsigned int timeout) { |
| @@ -132,7 +125,8 @@ int USBDevice::bulkTransfer(unsigned char endpoint, const unsigned char *data, u | @@ -132,7 +125,8 @@ int USBDevice::bulkTransfer(unsigned char endpoint, const unsigned char *data, u | ||
| 132 | int errorCode = LIBUSB_ERROR_TIMEOUT; | 125 | int errorCode = LIBUSB_ERROR_TIMEOUT; |
| 133 | int transferred = 0; | 126 | int transferred = 0; |
| 134 | for (int attempt = 0; (attempt < attempts || attempts == -1) && errorCode == LIBUSB_ERROR_TIMEOUT; ++attempt) | 127 | for (int attempt = 0; (attempt < attempts || attempts == -1) && errorCode == LIBUSB_ERROR_TIMEOUT; ++attempt) |
| 135 | - errorCode = libusb_bulk_transfer(this->handle, endpoint, (unsigned char*) data, (int)length, &transferred, timeout); | 128 | + errorCode = |
| 129 | + libusb_bulk_transfer(this->handle, endpoint, (unsigned char *)data, (int)length, &transferred, timeout); | ||
| 136 | 130 | ||
| 137 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) disconnectFromDevice(); | 131 | if (errorCode == LIBUSB_ERROR_NO_DEVICE) disconnectFromDevice(); |
| 138 | if (errorCode < 0) | 132 | if (errorCode < 0) |
| @@ -142,55 +136,27 @@ int USBDevice::bulkTransfer(unsigned char endpoint, const unsigned char *data, u | @@ -142,55 +136,27 @@ int USBDevice::bulkTransfer(unsigned char endpoint, const unsigned char *data, u | ||
| 142 | } | 136 | } |
| 143 | 137 | ||
| 144 | int USBDevice::bulkWrite(const unsigned char *data, unsigned int length, int attempts) { | 138 | int USBDevice::bulkWrite(const unsigned char *data, unsigned int length, int attempts) { |
| 145 | - if (!this->handle) return LIBUSB_ERROR_NO_DEVICE; | ||
| 146 | - | ||
| 147 | - int errorCode = this->getConnectionSpeed(); | ||
| 148 | - if (errorCode < 0) return errorCode; | ||
| 149 | - | ||
| 150 | - return this->bulkTransfer(HANTEK_EP_OUT, data, length, attempts); | 139 | + return bulkTransfer(HANTEK_EP_OUT, data, length, attempts); |
| 151 | } | 140 | } |
| 152 | 141 | ||
| 153 | -int USBDevice::bulkRead(unsigned char *data, unsigned int length, int attempts) { | ||
| 154 | - if (!this->handle) return LIBUSB_ERROR_NO_DEVICE; | ||
| 155 | - | ||
| 156 | - int errorCode = this->getConnectionSpeed(); | ||
| 157 | - if (errorCode < 0) return errorCode; | ||
| 158 | - | ||
| 159 | - return this->bulkTransfer(HANTEK_EP_IN, data, length, attempts); | ||
| 160 | -} | ||
| 161 | - | ||
| 162 | -int USBDevice::bulkCommand(const DataArray<unsigned char> *command, int attempts) { | ||
| 163 | - if (!this->handle) return LIBUSB_ERROR_NO_DEVICE; | ||
| 164 | - | ||
| 165 | - if (!allowBulkTransfer) return LIBUSB_SUCCESS; | ||
| 166 | - | ||
| 167 | - // Send BeginCommand control command | ||
| 168 | - int errorCode = this->controlWrite(&beginCommandControl); | ||
| 169 | - if (errorCode < 0) return errorCode; | ||
| 170 | - | ||
| 171 | - // Send bulk command | ||
| 172 | - return this->bulkWrite(command->data(), command->getSize(), attempts); | 142 | +int USBDevice::bulkRead(const DataArray<unsigned char> *command, int attempts) { |
| 143 | + return bulkTransfer(HANTEK_EP_IN, command->data(), command->getSize(), attempts); | ||
| 173 | } | 144 | } |
| 174 | 145 | ||
| 175 | int USBDevice::bulkReadMulti(unsigned char *data, unsigned length, int attempts) { | 146 | int USBDevice::bulkReadMulti(unsigned char *data, unsigned length, int attempts) { |
| 176 | if (!this->handle) return LIBUSB_ERROR_NO_DEVICE; | 147 | if (!this->handle) return LIBUSB_ERROR_NO_DEVICE; |
| 177 | 148 | ||
| 178 | - int errorCode = 0; | ||
| 179 | - | ||
| 180 | - errorCode = this->getConnectionSpeed(); | ||
| 181 | - if (errorCode < 0) return errorCode; | ||
| 182 | - | ||
| 183 | - errorCode = this->inPacketLength; | 149 | + int errorCode = this->inPacketLength; |
| 184 | unsigned int packet, received = 0; | 150 | unsigned int packet, received = 0; |
| 185 | for (packet = 0; received < length && errorCode == this->inPacketLength; ++packet) { | 151 | for (packet = 0; received < length && errorCode == this->inPacketLength; ++packet) { |
| 186 | errorCode = this->bulkTransfer(HANTEK_EP_IN, data + packet * this->inPacketLength, | 152 | errorCode = this->bulkTransfer(HANTEK_EP_IN, data + packet * this->inPacketLength, |
| 187 | qMin(length - received, (unsigned int)this->inPacketLength), attempts, | 153 | qMin(length - received, (unsigned int)this->inPacketLength), attempts, |
| 188 | HANTEK_TIMEOUT_MULTI); | 154 | HANTEK_TIMEOUT_MULTI); |
| 189 | - if (errorCode > 0) received += errorCode; | 155 | + if (errorCode > 0) received += (unsigned)errorCode; |
| 190 | } | 156 | } |
| 191 | 157 | ||
| 192 | if (received > 0) | 158 | if (received > 0) |
| 193 | - return received; | 159 | + return (int)received; |
| 194 | else | 160 | else |
| 195 | return errorCode; | 161 | return errorCode; |
| 196 | } | 162 | } |
| @@ -207,51 +173,23 @@ int USBDevice::controlTransfer(unsigned char type, unsigned char request, unsign | @@ -207,51 +173,23 @@ int USBDevice::controlTransfer(unsigned char type, unsigned char request, unsign | ||
| 207 | return errorCode; | 173 | return errorCode; |
| 208 | } | 174 | } |
| 209 | 175 | ||
| 210 | -int USBDevice::controlWrite(const ControlCommand* command) { | 176 | +int USBDevice::controlWrite(const ControlCommand *command) { |
| 211 | if (!this->handle) return LIBUSB_ERROR_NO_DEVICE; | 177 | if (!this->handle) return LIBUSB_ERROR_NO_DEVICE; |
| 212 | - // std::cout << "control" << (int)request << " l:"<<length<<" d:"<<(int)data[0] << std::endl; | ||
| 213 | - return this->controlTransfer(LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, | ||
| 214 | - (uint8_t)command->code, command->data(), command->getSize(), command->value, 0, HANTEK_ATTEMPTS); | 178 | + return controlTransfer(LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, (uint8_t)command->code, command->data(), |
| 179 | + command->getSize(), command->value, 0, HANTEK_ATTEMPTS); | ||
| 215 | } | 180 | } |
| 216 | 181 | ||
| 217 | int USBDevice::controlRead(const ControlCommand *command) { | 182 | int USBDevice::controlRead(const ControlCommand *command) { |
| 218 | if (!this->handle) return LIBUSB_ERROR_NO_DEVICE; | 183 | if (!this->handle) return LIBUSB_ERROR_NO_DEVICE; |
| 219 | 184 | ||
| 220 | - return this->controlTransfer(LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN, | ||
| 221 | - (uint8_t)command->code, command->data(), command->getSize(), command->value, 0, HANTEK_ATTEMPTS); | ||
| 222 | -} | ||
| 223 | - | ||
| 224 | -int USBDevice::getConnectionSpeed() { | ||
| 225 | - int errorCode; | ||
| 226 | - ControlGetSpeed response; | ||
| 227 | - errorCode = this->controlRead(&response); | ||
| 228 | - if (errorCode < 0) return errorCode; | ||
| 229 | - | ||
| 230 | - return response.getSpeed(); | ||
| 231 | -} | ||
| 232 | - | ||
| 233 | -int USBDevice::getPacketSize() { | ||
| 234 | - const int s = this->getConnectionSpeed(); | ||
| 235 | - if (s == CONNECTION_FULLSPEED) | ||
| 236 | - return 64; | ||
| 237 | - else if (s == CONNECTION_HIGHSPEED) | ||
| 238 | - return 512; | ||
| 239 | - else if (s > CONNECTION_HIGHSPEED) { | ||
| 240 | - std::cerr << "Unknown USB speed. Please correct source code in USBDevice::getPacketSize()" << std::endl; | ||
| 241 | - throw new std::runtime_error("Unknown USB speed"); | ||
| 242 | - } else if (s<0) return s; | ||
| 243 | - return 0; | 185 | + return controlTransfer(LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN, (uint8_t)command->code, command->data(), |
| 186 | + command->getSize(), command->value, 0, HANTEK_ATTEMPTS); | ||
| 244 | } | 187 | } |
| 245 | 188 | ||
| 246 | libusb_device *USBDevice::getRawDevice() const { return device; } | 189 | libusb_device *USBDevice::getRawDevice() const { return device; } |
| 247 | 190 | ||
| 248 | -unsigned long USBDevice::getUniqueUSBDeviceID() const | ||
| 249 | -{ | ||
| 250 | - return uniqueUSBdeviceID; | ||
| 251 | -} | ||
| 252 | - | ||
| 253 | -const DSOModel* USBDevice::getModel() const { return model; } | 191 | +unsigned long USBDevice::getUniqueUSBDeviceID() const { return uniqueUSBdeviceID; } |
| 254 | 192 | ||
| 255 | -void USBDevice::setEnableBulkTransfer(bool enable) { allowBulkTransfer = enable; } | 193 | +const DSOModel *USBDevice::getModel() const { return model; } |
| 256 | 194 | ||
| 257 | void USBDevice::overwriteInPacketLength(int len) { inPacketLength = len; } | 195 | void USBDevice::overwriteInPacketLength(int len) { inPacketLength = len; } |
openhantek/src/usb/usbdevice.h
| @@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
| 8 | #include <memory> | 8 | #include <memory> |
| 9 | 9 | ||
| 10 | #include "usbdevicedefinitions.h" | 10 | #include "usbdevicedefinitions.h" |
| 11 | -#include "controlbegin.h" | 11 | +#include "dataarray.h" |
| 12 | 12 | ||
| 13 | class DSOModel; | 13 | class DSOModel; |
| 14 | class ControlCommand; | 14 | class ControlCommand; |
| @@ -65,13 +65,7 @@ class USBDevice : public QObject { | @@ -65,13 +65,7 @@ class USBDevice : public QObject { | ||
| 65 | /// \param length The length of the packet. | 65 | /// \param length The length of the packet. |
| 66 | /// \param attempts The number of attempts, that are done on timeouts. | 66 | /// \param attempts The number of attempts, that are done on timeouts. |
| 67 | /// \return Number of received bytes on success, libusb error code on error. | 67 | /// \return Number of received bytes on success, libusb error code on error. |
| 68 | - int bulkRead(unsigned char *data, unsigned int length, int attempts = HANTEK_ATTEMPTS); | ||
| 69 | - | ||
| 70 | - /// \brief Send a bulk command to the oscilloscope. | ||
| 71 | - /// \param command The command, that should be sent. | ||
| 72 | - /// \param attempts The number of attempts, that are done on timeouts. | ||
| 73 | - /// \return Number of sent bytes on success, libusb error code on error. | ||
| 74 | - int bulkCommand(const DataArray<unsigned char> *command, int attempts = HANTEK_ATTEMPTS); | 68 | + int bulkRead(const DataArray<unsigned char> *command, int attempts = HANTEK_ATTEMPTS); |
| 75 | 69 | ||
| 76 | /// \brief Multi packet bulk read from the oscilloscope. | 70 | /// \brief Multi packet bulk read from the oscilloscope. |
| 77 | /// \param data Buffer for the sent/recieved data. | 71 | /// \param data Buffer for the sent/recieved data. |
| @@ -93,33 +87,15 @@ class USBDevice : public QObject { | @@ -93,33 +87,15 @@ class USBDevice : public QObject { | ||
| 93 | int index, int attempts = HANTEK_ATTEMPTS); | 87 | int index, int attempts = HANTEK_ATTEMPTS); |
| 94 | 88 | ||
| 95 | /// \brief Control write to the oscilloscope. | 89 | /// \brief Control write to the oscilloscope. |
| 96 | - /// \param request The request field of the packet. | ||
| 97 | - /// \param data Buffer for the sent/recieved data. | ||
| 98 | - /// \param length The length field of the packet. | ||
| 99 | - /// \param value The value field of the packet. | ||
| 100 | - /// \param index The index field of the packet. | ||
| 101 | - /// \param attempts The number of attempts, that are done on timeouts. | 90 | + /// \param command Buffer for the sent/recieved data. |
| 102 | /// \return Number of sent bytes on success, libusb error code on error. | 91 | /// \return Number of sent bytes on success, libusb error code on error. |
| 103 | int controlWrite(const ControlCommand *command); | 92 | int controlWrite(const ControlCommand *command); |
| 104 | 93 | ||
| 105 | /// \brief Control read to the oscilloscope. | 94 | /// \brief Control read to the oscilloscope. |
| 106 | - /// \param request The request field of the packet. | ||
| 107 | - /// \param data Buffer for the sent/recieved data. | ||
| 108 | - /// \param length The length field of the packet. | ||
| 109 | - /// \param value The value field of the packet. | ||
| 110 | - /// \param index The index field of the packet. | ||
| 111 | - /// \param attempts The number of attempts, that are done on timeouts. | 95 | + /// \param command Buffer for the sent/recieved data. |
| 112 | /// \return Number of received bytes on success, libusb error code on error. | 96 | /// \return Number of received bytes on success, libusb error code on error. |
| 113 | int controlRead(const ControlCommand *command); | 97 | int controlRead(const ControlCommand *command); |
| 114 | 98 | ||
| 115 | - /// \brief Gets the speed of the connection. | ||
| 116 | - /// \return The ::ConnectionSpeed of the USB connection. | ||
| 117 | - int getConnectionSpeed(); | ||
| 118 | - | ||
| 119 | - /// \brief Gets the maximum size of one packet transmitted via bulk transfer. | ||
| 120 | - /// \return The maximum packet size in bytes, negative libusb error code on error. | ||
| 121 | - int getPacketSize(); | ||
| 122 | - | ||
| 123 | /** | 99 | /** |
| 124 | * @return Returns the raw libusb device | 100 | * @return Returns the raw libusb device |
| 125 | */ | 101 | */ |
| @@ -141,13 +117,11 @@ class USBDevice : public QObject { | @@ -141,13 +117,11 @@ class USBDevice : public QObject { | ||
| 141 | /// \brief Get the oscilloscope model. | 117 | /// \brief Get the oscilloscope model. |
| 142 | /// \return The ::Model of the connected Hantek DSO. | 118 | /// \return The ::Model of the connected Hantek DSO. |
| 143 | const DSOModel *getModel() const; | 119 | const DSOModel *getModel() const; |
| 144 | - void setEnableBulkTransfer(bool enable); | ||
| 145 | void overwriteInPacketLength(int len); | 120 | void overwriteInPacketLength(int len); |
| 146 | protected: | 121 | protected: |
| 147 | int claimInterface(const libusb_interface_descriptor *interfaceDescriptor, int endpointOut, int endPointIn); | 122 | int claimInterface(const libusb_interface_descriptor *interfaceDescriptor, int endpointOut, int endPointIn); |
| 148 | 123 | ||
| 149 | - // Command buffers | ||
| 150 | - ControlBeginCommand beginCommandControl; | 124 | + // Device model data |
| 151 | DSOModel* model; | 125 | DSOModel* model; |
| 152 | 126 | ||
| 153 | // Libusb specific variables | 127 | // Libusb specific variables |
| @@ -159,7 +133,6 @@ class USBDevice : public QObject { | @@ -159,7 +133,6 @@ class USBDevice : public QObject { | ||
| 159 | int interface; | 133 | int interface; |
| 160 | int outPacketLength; ///< Packet length for the OUT endpoint | 134 | int outPacketLength; ///< Packet length for the OUT endpoint |
| 161 | int inPacketLength; ///< Packet length for the IN endpoint | 135 | int inPacketLength; ///< Packet length for the IN endpoint |
| 162 | - bool allowBulkTransfer = true; | ||
| 163 | signals: | 136 | signals: |
| 164 | void deviceDisconnected(); ///< The device has been disconnected | 137 | void deviceDisconnected(); ///< The device has been disconnected |
| 165 | }; | 138 | }; |