Commit ab85a488ac1ee1a73d46d89779a71017a830ca9e

Authored by David Graeff
Committed by David Gräff
1 parent eaf29e59

Introduce ModelRegistry as singleton. Supersedes the global list variable of sup…

…ported models. A new model now only needs a h/cpp file and of course missing protocol commands
docs/adddevice.md
@@ -18,10 +18,18 @@ If your device needs other or slighly altered packets, you would need to modify @@ -18,10 +18,18 @@ If your device needs other or slighly altered packets, you would need to modify
18 ## Add your model information 18 ## Add your model information
19 You will only need to touch files within `openhantek/src/hantekdso/models`. 19 You will only need to touch files within `openhantek/src/hantekdso/models`.
20 20
21 -Create a new class with your model name and inherit from `DSOModel`. Add an instance of your new class  
22 -to the `supportedModels` list in `models.cpp`. 21 +1. Create a new class with your model name and inherit from `DSOModel`:
23 22
24 -The following code shows the constructor of `DSOModel` that needs to be supplied with model specific data: 23 +``` c++
  24 +struct ModelDSO2090 : public DSOModel {
  25 + static const int ID = 0x2090; // Freely chooseable but unique id
  26 + ModelDSO2090();
  27 + void applyRequirements(HantekDsoControl* dsoControl) const override;
  28 +};
  29 +```
  30 +
  31 +2. Implement the constructor of your class, where you need to supply the constructor of `DSOModel` with
  32 + some information. The `DSOModel` constructor looks like this:
25 33
26 ``` c++ 34 ``` c++
27 DSOModel(int ID, long vendorID, long productID, long vendorIDnoFirmware, long productIDnoFirmware, 35 DSOModel(int ID, long vendorID, long productID, long vendorIDnoFirmware, long productIDnoFirmware,
@@ -35,7 +43,7 @@ DSOModel(int ID, long vendorID, long productID, long vendorIDnoFirmware, long pr @@ -35,7 +43,7 @@ DSOModel(int ID, long vendorID, long productID, long vendorIDnoFirmware, long pr
35 (remember that we used `devicename-firmware.hex` and `devicename-loader.hex`). 43 (remember that we used `devicename-firmware.hex` and `devicename-loader.hex`).
36 * The last parameter is the user visible name of the device. 44 * The last parameter is the user visible name of the device.
37 45
38 -Add your device specific constants via the `specification` field, for instance: 46 +3. Add your device specific constants via the `specification` field, for instance:
39 47
40 ``` c++ 48 ``` c++
41 specification.samplerate.single.base = 50e6; 49 specification.samplerate.single.base = 50e6;
@@ -48,7 +56,7 @@ Add your device specific constants via the `specification` field, for instance: @@ -48,7 +56,7 @@ Add your device specific constants via the `specification` field, for instance:
48 specification.samplerate.multi.recordLengths = {UINT_MAX, 20480, 65536}; 56 specification.samplerate.multi.recordLengths = {UINT_MAX, 20480, 65536};
49 ``` 57 ```
50 58
51 -The actual commands that are send, need to be defined as well, for instance: 59 +4. The actual commands that are send, need to be defined as well, for instance:
52 60
53 ``` c++ 61 ``` c++
54 specification.command.control.setOffset = CONTROL_SETOFFSET; 62 specification.command.control.setOffset = CONTROL_SETOFFSET;
@@ -61,4 +69,9 @@ The actual commands that are send, need to be defined as well, for instance: @@ -61,4 +69,9 @@ The actual commands that are send, need to be defined as well, for instance:
61 specification.command.bulk.setPretrigger = BulkCode::SETTRIGGERANDSAMPLERATE; 69 specification.command.bulk.setPretrigger = BulkCode::SETTRIGGERANDSAMPLERATE;
62 ``` 70 ```
63 71
  72 +5. Add an instance of your class to the cpp file. The `DSOModel` constructor will register
  73 + your new model automatically to the ModelRegistry:
64 74
  75 +```
  76 +static ModelDSO2090 modelInstance;
  77 +```
openhantek/src/hantekdso/controlspecification.h
@@ -59,7 +59,7 @@ struct ControlSpecification { @@ -59,7 +59,7 @@ struct ControlSpecification {
59 BulkCode cmdTriggerEnabled = BulkCode::ENABLETRIGGER; ///< Command for enabling the trigger 59 BulkCode cmdTriggerEnabled = BulkCode::ENABLETRIGGER; ///< Command for enabling the trigger
60 BulkCode cmdGetData = BulkCode::GETDATA; ///< Command for retrieve sample data 60 BulkCode cmdGetData = BulkCode::GETDATA; ///< Command for retrieve sample data
61 BulkCode cmdGetCaptureState = BulkCode::GETCAPTURESTATE; ///< Command for retrieve the capture state 61 BulkCode cmdGetCaptureState = BulkCode::GETCAPTURESTATE; ///< Command for retrieve the capture state
62 - BulkCode cmdSetGain = BulkCode::SETGAIN; ///< Command for setting the gain 62 + BulkCode cmdSetGain = BulkCode::SETGAIN; ///< Command for setting the gain
63 63
64 ControlBeginCommand beginCommandControl; 64 ControlBeginCommand beginCommandControl;
65 ControlGetLimits cmdGetLimits; 65 ControlGetLimits cmdGetLimits;
openhantek/src/hantekdso/dsomodel.cpp
@@ -2,8 +2,11 @@ @@ -2,8 +2,11 @@
2 // SPDX-License-Identifier: GPL-2.0+ 2 // SPDX-License-Identifier: GPL-2.0+
3 3
4 #include "dsomodel.h" 4 #include "dsomodel.h"
  5 +#include "modelregistry.h"
5 6
6 DSOModel::DSOModel(int id, long vendorID, long productID, long vendorIDnoFirmware, 7 DSOModel::DSOModel(int id, long vendorID, long productID, long vendorIDnoFirmware,
7 long productIDnoFirmware, const std::string &firmwareToken, const std::string &name, const Dso::ControlSpecification &specification) 8 long productIDnoFirmware, const std::string &firmwareToken, const std::string &name, const Dso::ControlSpecification &specification)
8 : ID(id), vendorID(vendorID), productID(productID), vendorIDnoFirmware(vendorIDnoFirmware), 9 : ID(id), vendorID(vendorID), productID(productID), vendorIDnoFirmware(vendorIDnoFirmware),
9 - productIDnoFirmware(productIDnoFirmware), firmwareToken(firmwareToken), name(name), specification(specification) {} 10 + productIDnoFirmware(productIDnoFirmware), firmwareToken(firmwareToken), name(name), specification(specification) {
  11 + ModelRegistry::get()->add(this);
  12 +}
openhantek/src/hantekdso/modelregistry.cpp 0 → 100644
  1 +// SPDX-License-Identifier: GPL-2.0+
  2 +
  3 +#include "modelregistry.h"
  4 +
  5 +ModelRegistry *ModelRegistry::instance = new ModelRegistry();
  6 +
  7 +ModelRegistry *ModelRegistry::get() { return instance; }
  8 +
  9 +void ModelRegistry::add(DSOModel *model) { supportedModels.push_back(model); }
  10 +
  11 +const std::list<DSOModel *> ModelRegistry::models() const { return supportedModels; }
openhantek/src/hantekdso/modelregistry.h 0 → 100644
  1 +
  2 +// SPDX-License-Identifier: GPL-2.0+
  3 +
  4 +#pragma once
  5 +
  6 +#include "dsomodel.h"
  7 +
  8 +class ModelRegistry {
  9 +public:
  10 + static ModelRegistry *get();
  11 + void add(DSOModel* model);
  12 + const std::list<DSOModel*> models() const;
  13 +private:
  14 + static ModelRegistry* instance;
  15 + std::list<DSOModel*> supportedModels;
  16 +};
openhantek/src/hantekdso/models.h deleted
1 -  
2 -// SPDX-License-Identifier: GPL-2.0+  
3 -  
4 -#pragma once  
5 -  
6 -#include "dsomodel.h"  
7 -  
8 -extern std::list<DSOModel*> supportedModels;  
openhantek/src/hantekdso/models/modelDSO2090.cpp
@@ -5,6 +5,9 @@ @@ -5,6 +5,9 @@
5 5
6 using namespace Hantek; 6 using namespace Hantek;
7 7
  8 +static ModelDSO2090 modelInstance;
  9 +static ModelDSO2090A modelInstance2;
  10 +
8 ModelDSO2090::ModelDSO2090() : DSOModel(ID, 0x04b5, 0x2090, 0x04b4, 0x2090, "dso2090x86", "DSO-2090", 11 ModelDSO2090::ModelDSO2090() : DSOModel(ID, 0x04b5, 0x2090, 0x04b4, 0x2090, "dso2090x86", "DSO-2090",
9 Dso::ControlSpecification(2)) { 12 Dso::ControlSpecification(2)) {
10 specification.cmdSetRecordLength = BulkCode::SETTRIGGERANDSAMPLERATE; 13 specification.cmdSetRecordLength = BulkCode::SETTRIGGERANDSAMPLERATE;
openhantek/src/hantekdso/models/modelDSO2150.cpp
@@ -5,6 +5,8 @@ @@ -5,6 +5,8 @@
5 5
6 using namespace Hantek; 6 using namespace Hantek;
7 7
  8 +static ModelDSO2150 modelInstance;
  9 +
8 ModelDSO2150::ModelDSO2150() : DSOModel(ID, 0x04b5, 0x2150, 0x04b4, 0x2150, "dso2150x86", "DSO-2150", 10 ModelDSO2150::ModelDSO2150() : DSOModel(ID, 0x04b5, 0x2150, 0x04b4, 0x2150, "dso2150x86", "DSO-2150",
9 Dso::ControlSpecification(2)) { 11 Dso::ControlSpecification(2)) {
10 specification.cmdSetRecordLength = BulkCode::SETTRIGGERANDSAMPLERATE; 12 specification.cmdSetRecordLength = BulkCode::SETTRIGGERANDSAMPLERATE;
openhantek/src/hantekdso/models/modelDSO2250.cpp
@@ -5,6 +5,8 @@ @@ -5,6 +5,8 @@
5 5
6 using namespace Hantek; 6 using namespace Hantek;
7 7
  8 +static ModelDSO2250 modelInstance;
  9 +
8 ModelDSO2250::ModelDSO2250() : DSOModel(ID, 0x04b5, 0x2250, 0x04b4, 0x2250, "dso2250x86", "DSO-2250", 10 ModelDSO2250::ModelDSO2250() : DSOModel(ID, 0x04b5, 0x2250, 0x04b4, 0x2250, "dso2250x86", "DSO-2250",
9 Dso::ControlSpecification(2)) { 11 Dso::ControlSpecification(2)) {
10 specification.cmdSetRecordLength = BulkCode::DSETBUFFER; 12 specification.cmdSetRecordLength = BulkCode::DSETBUFFER;
openhantek/src/hantekdso/models/modelDSO5200.cpp
@@ -5,6 +5,9 @@ @@ -5,6 +5,9 @@
5 5
6 using namespace Hantek; 6 using namespace Hantek;
7 7
  8 +static ModelDSO5200 modelInstance;
  9 +static ModelDSO5200A modelInstance2;
  10 +
8 ModelDSO5200::ModelDSO5200() : DSOModel(ID, 0x04b5, 0x5200, 0x04b4, 0x5200, "dso5200x86", "DSO-5200", 11 ModelDSO5200::ModelDSO5200() : DSOModel(ID, 0x04b5, 0x5200, 0x04b4, 0x5200, "dso5200x86", "DSO-5200",
9 Dso::ControlSpecification(2)) { 12 Dso::ControlSpecification(2)) {
10 specification.cmdSetRecordLength = BulkCode::DSETBUFFER; 13 specification.cmdSetRecordLength = BulkCode::DSETBUFFER;
openhantek/src/hantekdso/models/modelDSO6022.cpp
@@ -5,6 +5,9 @@ @@ -5,6 +5,9 @@
5 5
6 using namespace Hantek; 6 using namespace Hantek;
7 7
  8 +static ModelDSO6022BE modelInstance;
  9 +static ModelDSO6022BL modelInstance2;
  10 +
8 ModelDSO6022BE::ModelDSO6022BE() : DSOModel(ID, 0x04b5, 0x6022, 0x04b4, 0x6022, "dso6022be", "DSO-6022BE", 11 ModelDSO6022BE::ModelDSO6022BE() : DSOModel(ID, 0x04b5, 0x6022, 0x04b4, 0x6022, "dso6022be", "DSO-6022BE",
9 Dso::ControlSpecification(2)) { 12 Dso::ControlSpecification(2)) {
10 // 6022xx do not support any bulk commands 13 // 6022xx do not support any bulk commands
openhantek/src/hantekdso/models/models.cpp deleted
1 -// SPDX-License-Identifier: GPL-2.0+  
2 -  
3 -#include "models.h"  
4 -#include "modelDSO2090.h"  
5 -#include "modelDSO2150.h"  
6 -#include "modelDSO2250.h"  
7 -#include "modelDSO5200.h"  
8 -#include "modelDSO6022.h"  
9 -  
10 -std::list<DSOModel*> supportedModels =  
11 - std::list<DSOModel*>({new ModelDSO2090(), new ModelDSO2090A(), new ModelDSO2150(),  
12 - new ModelDSO2250(), new ModelDSO5200(), new ModelDSO5200A(),  
13 - new ModelDSO6022BE(), new ModelDSO6022BL()});  
openhantek/src/selectdevice/newdevicemodelfromexisting.cpp
1 #include "newdevicemodelfromexisting.h" 1 #include "newdevicemodelfromexisting.h"
2 2
3 #include "dsomodel.h" 3 #include "dsomodel.h"
4 -#include "models.h" 4 +#include "modelregistry.h"
5 #include "rawdeviceslistmodel.h" 5 #include "rawdeviceslistmodel.h"
6 6
7 #include <QDebug> 7 #include <QDebug>
@@ -21,7 +21,7 @@ NewDeviceModelFromExisting::NewDeviceModelFromExisting(QWidget *parent) : @@ -21,7 +21,7 @@ NewDeviceModelFromExisting::NewDeviceModelFromExisting(QWidget *parent) :
21 ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); 21 ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
22 22
23 QStringList supportedModelsList; 23 QStringList supportedModelsList;
24 - for (const DSOModel* model: supportedModels) { 24 + for (const DSOModel* model: ModelRegistry::get()->models()) {
25 supportedModelsList.append(QString::fromStdString(model->name)); 25 supportedModelsList.append(QString::fromStdString(model->name));
26 } 26 }
27 27
openhantek/src/selectdevice/selectsupporteddevice.cpp
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 #include "devicelistentry.h" 12 #include "devicelistentry.h"
13 #include "deviceslistmodel.h" 13 #include "deviceslistmodel.h"
14 #include "newdevicemodelfromexisting.h" 14 #include "newdevicemodelfromexisting.h"
15 -#include "models.h" 15 +#include "modelregistry.h"
16 16
17 SelectSupportedDevice::SelectSupportedDevice(QWidget *parent) : 17 SelectSupportedDevice::SelectSupportedDevice(QWidget *parent) :
18 QDialog(parent), 18 QDialog(parent),
@@ -114,7 +114,7 @@ void SelectSupportedDevice::showLibUSBFailedDialogModel(int error) @@ -114,7 +114,7 @@ void SelectSupportedDevice::showLibUSBFailedDialogModel(int error)
114 void SelectSupportedDevice::updateSupportedDevices() 114 void SelectSupportedDevice::updateSupportedDevices()
115 { 115 {
116 QString devices; 116 QString devices;
117 - for (const DSOModel* model: supportedModels) { 117 + for (const DSOModel* model: ModelRegistry::get()->models()) {
118 devices.append(QString::fromStdString(model->name)).append(" "); 118 devices.append(QString::fromStdString(model->name)).append(" ");
119 } 119 }
120 ui->labelSupportedDevices->setText(devices); 120 ui->labelSupportedDevices->setText(devices);
openhantek/src/usb/finddevices.cpp
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 #include "utils/printutils.h" 12 #include "utils/printutils.h"
13 #include <libusb-1.0/libusb.h> 13 #include <libusb-1.0/libusb.h>
14 14
15 -#include "models.h" 15 +#include "modelregistry.h"
16 16
17 FindDevices::FindDevices(libusb_context *context) : context(context) {} 17 FindDevices::FindDevices(libusb_context *context) : context(context) {}
18 18
@@ -40,7 +40,7 @@ int FindDevices::updateDeviceList() { @@ -40,7 +40,7 @@ int FindDevices::updateDeviceList() {
40 continue; 40 continue;
41 } 41 }
42 42
43 - for (DSOModel* model : supportedModels) { 43 + for (DSOModel* model : ModelRegistry::get()->models()) {
44 // Check VID and PID for firmware flashed devices 44 // Check VID and PID for firmware flashed devices
45 bool supported = descriptor.idVendor == model->vendorID && descriptor.idProduct == model->productID; 45 bool supported = descriptor.idVendor == model->vendorID && descriptor.idProduct == model->productID;
46 // Devices without firmware have different VID/PIDs 46 // Devices without firmware have different VID/PIDs
openhantek/src/usb/usbdevice.cpp
@@ -6,9 +6,9 @@ @@ -6,9 +6,9 @@
6 6
7 #include "usbdevice.h" 7 #include "usbdevice.h"
8 8
  9 +#include "hantekdso/dsomodel.h"
9 #include "hantekprotocol/bulkStructs.h" 10 #include "hantekprotocol/bulkStructs.h"
10 #include "hantekprotocol/controlStructs.h" 11 #include "hantekprotocol/controlStructs.h"
11 -#include "models.h"  
12 #include "utils/printutils.h" 12 #include "utils/printutils.h"
13 13
14 UniqueUSBid USBDevice::computeUSBdeviceID(libusb_device *device) { 14 UniqueUSBid USBDevice::computeUSBdeviceID(libusb_device *device) {