Commit 5f0cf293449863ee04f134715784d8a26c113b14

Authored by oliverhaag
1 parent 9ba93c86

Some more Hantek::Control redesign

openhantek/ChangeLog
@@ -131,5 +131,8 @@ @@ -131,5 +131,8 @@
131 * Redesign of Hantek::Control to make it easier to add support for new models 131 * Redesign of Hantek::Control to make it easier to add support for new models
132 * Removed buggy destructor from GlGenerator, proper cleanup still missing 132 * Removed buggy destructor from GlGenerator, proper cleanup still missing
133 133
134 -2011-11-16 Oliver Haag <oliver.haag@gmail.com> 134 +2011-11-27 Oliver Haag <oliver.haag@gmail.com>
135 * Bugfix: Copy-paste in Hantek::Control::setOffset, thanks to tinosnitso 135 * Bugfix: Copy-paste in Hantek::Control::setOffset, thanks to tinosnitso
  136 +
  137 +2011-12-02 Oliver Haag <oliver.haag@gmail.com>
  138 +* Moved values needed to control gain into lists, initialized in connectDevice
openhantek/src/hantek/control.cpp
@@ -52,16 +52,13 @@ namespace Hantek { @@ -52,16 +52,13 @@ namespace Hantek {
52 this->specification.command.values.offsetLimits = VALUE_OFFSETLIMITS; 52 this->specification.command.values.offsetLimits = VALUE_OFFSETLIMITS;
53 this->specification.command.values.voltageLimits = (ControlValue) -1; 53 this->specification.command.values.voltageLimits = (ControlValue) -1;
54 54
55 - this->specification.gainSteps << 0.08 << 0.16 << 0.40 << 0.80 << 1.60  
56 - << 4.00 << 8.0 << 16.0 << 40.0;  
57 -  
58 this->specification.samplerate.single.base = 50e6; 55 this->specification.samplerate.single.base = 50e6;
59 this->specification.samplerate.single.max = 50e6; 56 this->specification.samplerate.single.max = 50e6;
60 this->specification.samplerate.multi.base = 100e6; 57 this->specification.samplerate.multi.base = 100e6;
61 this->specification.samplerate.multi.max = 100e6; 58 this->specification.samplerate.multi.max = 100e6;
62 59
63 for(unsigned int channel = 0; channel < HANTEK_CHANNELS; channel++) { 60 for(unsigned int channel = 0; channel < HANTEK_CHANNELS; channel++) {
64 - for(unsigned int gainId = 0; gainId < GAIN_COUNT; gainId++) { 61 + for(unsigned int gainId = 0; gainId < 9; gainId++) {
65 this->specification.offsetLimit[channel][gainId][OFFSET_START] = 0x0000; 62 this->specification.offsetLimit[channel][gainId][OFFSET_START] = 0x0000;
66 this->specification.offsetLimit[channel][gainId][OFFSET_END] = 0xffff; 63 this->specification.offsetLimit[channel][gainId][OFFSET_END] = 0xffff;
67 } 64 }
@@ -589,6 +586,9 @@ namespace Hantek { @@ -589,6 +586,9 @@ namespace Hantek {
589 // Maximum possible samplerate for a single channel and dividers for buffer sizes 586 // Maximum possible samplerate for a single channel and dividers for buffer sizes
590 this->specification.bufferDividers.clear(); 587 this->specification.bufferDividers.clear();
591 this->specification.bufferSizes.clear(); 588 this->specification.bufferSizes.clear();
  589 + this->specification.gainSteps.clear();
  590 + for(int channel = 0; channel < HANTEK_CHANNELS; channel++)
  591 + this->specification.voltageLimit[channel].clear();
592 592
593 switch(this->device->getModel()) { 593 switch(this->device->getModel()) {
594 case MODEL_DSO2250: 594 case MODEL_DSO2250:
@@ -600,6 +600,14 @@ namespace Hantek { @@ -600,6 +600,14 @@ namespace Hantek {
600 this->specification.samplerate.multi.max = 250e6; 600 this->specification.samplerate.multi.max = 250e6;
601 this->specification.bufferDividers << 1000 << 1 << 2; 601 this->specification.bufferDividers << 1000 << 1 << 2;
602 this->specification.bufferSizes << ULONG_MAX << 10240 << 14336; 602 this->specification.bufferSizes << ULONG_MAX << 10240 << 14336;
  603 + this->specification.gainSteps
  604 + << 0.16 << 0.40 << 0.80 << 1.60 << 4.00 << 8.0 << 16.0 << 40.0 << 80.0;
  605 + /// \todo Use calibration data to get the DSO-5200(A) sample ranges
  606 + for(int channel = 0; channel < HANTEK_CHANNELS; channel++)
  607 + this->specification.voltageLimit[channel]
  608 + << 368 << 454 << 908 << 368 << 454 << 908 << 368 << 454 << 908;
  609 + this->specification.gainIndex
  610 + << 1 << 0 << 0 << 1 << 0 << 0 << 1 << 0 << 0;
603 break; 611 break;
604 612
605 case MODEL_DSO2150: 613 case MODEL_DSO2150:
@@ -609,6 +617,13 @@ namespace Hantek { @@ -609,6 +617,13 @@ namespace Hantek {
609 this->specification.samplerate.multi.max = 150e6; 617 this->specification.samplerate.multi.max = 150e6;
610 this->specification.bufferDividers << 1000 << 1 << 2; 618 this->specification.bufferDividers << 1000 << 1 << 2;
611 this->specification.bufferSizes << ULONG_MAX << 10240 << 32768; 619 this->specification.bufferSizes << ULONG_MAX << 10240 << 32768;
  620 + this->specification.gainSteps
  621 + << 0.08 << 0.16 << 0.40 << 0.80 << 1.60 << 4.00 << 8.0 << 16.0 << 40.0;
  622 + for(int channel = 0; channel < HANTEK_CHANNELS; channel++)
  623 + this->specification.voltageLimit[channel]
  624 + << 255 << 255 << 255 << 255 << 255 << 255 << 255 << 255 << 255;
  625 + this->specification.gainIndex
  626 + << 0 << 1 << 2 << 0 << 1 << 2 << 0 << 1 << 2;
612 break; 627 break;
613 628
614 default: 629 default:
@@ -618,6 +633,13 @@ namespace Hantek { @@ -618,6 +633,13 @@ namespace Hantek {
618 this->specification.samplerate.multi.max = 100e6; 633 this->specification.samplerate.multi.max = 100e6;
619 this->specification.bufferDividers << 1000 << 1 << 2; 634 this->specification.bufferDividers << 1000 << 1 << 2;
620 this->specification.bufferSizes << ULONG_MAX << 10240 << 32768; 635 this->specification.bufferSizes << ULONG_MAX << 10240 << 32768;
  636 + this->specification.gainSteps
  637 + << 0.08 << 0.16 << 0.40 << 0.80 << 1.60 << 4.00 << 8.0 << 16.0 << 40.0;
  638 + for(int channel = 0; channel < HANTEK_CHANNELS; channel++)
  639 + this->specification.voltageLimit[channel]
  640 + << 255 << 255 << 255 << 255 << 255 << 255 << 255 << 255 << 255;
  641 + this->specification.gainIndex
  642 + << 0 << 1 << 2 << 0 << 1 << 2 << 0 << 1 << 2;
621 break; 643 break;
622 } 644 }
623 this->settings.samplerate.limits = &(this->specification.samplerate.single); 645 this->settings.samplerate.limits = &(this->specification.samplerate.single);
@@ -812,64 +834,21 @@ namespace Hantek { @@ -812,64 +834,21 @@ namespace Hantek {
812 834
813 // Find lowest gain voltage thats at least as high as the requested 835 // Find lowest gain voltage thats at least as high as the requested
814 int gainId; 836 int gainId;
815 - for(gainId = 0; gainId < GAIN_COUNT - 1; gainId++) 837 + for(gainId = 0; gainId < this->specification.gainSteps.count() - 1; gainId++)
816 if(this->specification.gainSteps[gainId] >= gain) 838 if(this->specification.gainSteps[gainId] >= gain)
817 break; 839 break;
818 840
819 - // Get the voltage scaler id and it's sample range for this gain  
820 - int scalerId;  
821 - switch(this->device->getModel()) {  
822 - case MODEL_DSO5200:  
823 - case MODEL_DSO5200A:  
824 - /// \todo Use calibration data to get the DSO-5200(A) sample ranges  
825 - if(gainId == GAIN_10MV) {  
826 - scalerId = 1;  
827 - this->specification.voltageLimit[channel][gainId] = 184;  
828 - }  
829 - else {  
830 - switch(gainId % 3) {  
831 - case 1:  
832 - scalerId = 1;  
833 - this->specification.voltageLimit[channel][gainId] = 368;  
834 - break;  
835 - case 2:  
836 - scalerId = 0;  
837 - this->specification.voltageLimit[channel][gainId] = 454;  
838 - break;  
839 - default:  
840 - scalerId = 0;  
841 - this->specification.voltageLimit[channel][gainId] = 908;  
842 - break;  
843 - }  
844 - }  
845 - break;  
846 -  
847 - default:  
848 - scalerId = gainId % 3;  
849 - this->specification.voltageLimit[channel][gainId] = 0xff;  
850 - break;  
851 - }  
852 -  
853 // SetGain bulk command for gain 841 // SetGain bulk command for gain
854 - ((BulkSetGain *) this->command[BULK_SETGAIN])->setGain(channel, scalerId); 842 + ((BulkSetGain *) this->command[BULK_SETGAIN])->setGain(channel, this->specification.gainIndex[gainId]);
855 this->commandPending[BULK_SETGAIN] = true; 843 this->commandPending[BULK_SETGAIN] = true;
856 844
857 // SetRelays control command for gain relays 845 // SetRelays control command for gain relays
858 ControlSetRelays *controlSetRelays = (ControlSetRelays *) this->control[CONTROLINDEX_SETRELAYS]; 846 ControlSetRelays *controlSetRelays = (ControlSetRelays *) this->control[CONTROLINDEX_SETRELAYS];
859 - switch(this->device->getModel()) {  
860 - case MODEL_DSO5200:  
861 - case MODEL_DSO5200A:  
862 - controlSetRelays->setBelow1V(channel, gainId <= GAIN_1V);  
863 - controlSetRelays->setBelow100mV(channel, gainId <= GAIN_100MV);  
864 - break;  
865 - default:  
866 - controlSetRelays->setBelow1V(channel, gainId < GAIN_1V);  
867 - controlSetRelays->setBelow100mV(channel, gainId < GAIN_100MV);  
868 - break;  
869 - } 847 + controlSetRelays->setBelow1V(channel, gainId < 3);
  848 + controlSetRelays->setBelow100mV(channel, gainId < 6);
870 this->controlPending[CONTROLINDEX_SETRELAYS] = true; 849 this->controlPending[CONTROLINDEX_SETRELAYS] = true;
871 850
872 - this->settings.voltage[channel].gain = (Gain) gainId; 851 + this->settings.voltage[channel].gain = gainId;
873 852
874 this->setOffset(channel, this->settings.voltage[channel].offset); 853 this->setOffset(channel, this->settings.voltage[channel].offset);
875 854
@@ -988,7 +967,7 @@ namespace Hantek { @@ -988,7 +967,7 @@ namespace Hantek {
988 case MODEL_DSO5200A: 967 case MODEL_DSO5200A:
989 // The range is the same as used for the offsets for 10 bit models 968 // The range is the same as used for the offsets for 10 bit models
990 minimum = ((unsigned short int) *((unsigned char *) &(this->specification.offsetLimit[channel][this->settings.voltage[channel].gain][OFFSET_START])) << 8) + *((unsigned char *) &(this->specification.offsetLimit[channel][this->settings.voltage[channel].gain][OFFSET_START]) + 1); 969 minimum = ((unsigned short int) *((unsigned char *) &(this->specification.offsetLimit[channel][this->settings.voltage[channel].gain][OFFSET_START])) << 8) + *((unsigned char *) &(this->specification.offsetLimit[channel][this->settings.voltage[channel].gain][OFFSET_START]) + 1);
991 - maximum = ((unsigned short int) *((unsigned char *) &(this->specification.offsetLimit[channel][this->settings.voltage[channel].gain][OFFSET_START])) << 8) + *((unsigned char *) &(this->specification.offsetLimit[channel][this->settings.voltage[channel].gain][OFFSET_END]) + 1); 970 + maximum = ((unsigned short int) *((unsigned char *) &(this->specification.offsetLimit[channel][this->settings.voltage[channel].gain][OFFSET_END])) << 8) + *((unsigned char *) &(this->specification.offsetLimit[channel][this->settings.voltage[channel].gain][OFFSET_END]) + 1);
992 break; 971 break;
993 972
994 default: 973 default:
openhantek/src/hantek/control.h
@@ -119,9 +119,11 @@ namespace Hantek { @@ -119,9 +119,11 @@ namespace Hantek {
119 119
120 // Calibration 120 // Calibration
121 /// The sample values at the top of the screen 121 /// The sample values at the top of the screen
122 - unsigned short int voltageLimit[HANTEK_CHANNELS][GAIN_COUNT];  
123 - /// Calibration data for the channel offsets  
124 - unsigned short int offsetLimit[HANTEK_CHANNELS][GAIN_COUNT][OFFSET_COUNT]; 122 + QList<unsigned short int> voltageLimit[HANTEK_CHANNELS];
  123 + /// The index of the selected gain on the hardware
  124 + QList<unsigned char> gainIndex;
  125 + /// Calibration data for the channel offsets \todo Should probably be a QList too
  126 + unsigned short int offsetLimit[HANTEK_CHANNELS][9][OFFSET_COUNT];
125 }; 127 };
126 128
127 ////////////////////////////////////////////////////////////////////////////// 129 //////////////////////////////////////////////////////////////////////////////
@@ -151,7 +153,7 @@ namespace Hantek { @@ -151,7 +153,7 @@ namespace Hantek {
151 /// \struct ControlSettingsSamplerate hantek/control.h 153 /// \struct ControlSettingsSamplerate hantek/control.h
152 /// \brief Stores the current amplification settings of the device. 154 /// \brief Stores the current amplification settings of the device.
153 struct ControlSettingsVoltage { 155 struct ControlSettingsVoltage {
154 - Gain gain; ///< The gain id 156 + unsigned int gain; ///< The gain id
155 double offset; ///< The screen offset for each channel 157 double offset; ///< The screen offset for each channel
156 double offsetReal; ///< The real offset for each channel (Due to quantization) 158 double offsetReal; ///< The real offset for each channel (Due to quantization)
157 bool used; ///< true, if the channel is used 159 bool used; ///< true, if the channel is used
openhantek/src/hantek/types.h
@@ -500,29 +500,6 @@ namespace Hantek { @@ -500,29 +500,6 @@ namespace Hantek {
500 }; 500 };
501 501
502 ////////////////////////////////////////////////////////////////////////////// 502 //////////////////////////////////////////////////////////////////////////////
503 - /// \enum Samplerate hantek/types.h  
504 - /// \brief The different samplerates supported by Hantek DSOs.  
505 - enum Samplerate {  
506 - SAMPLERATE_100MS,  
507 - SAMPLERATE_50MS, SAMPLERATE_25MS, SAMPLERATE_10MS,  
508 - SAMPLERATE_5MS, SAMPLERATE_2_5MS, SAMPLERATE_1MS,  
509 - SAMPLERATE_500KS, SAMPLERATE_250KS, SAMPLERATE_100KS,  
510 - SAMPLERATE_50KS, SAMPLERATE_25KS, SAMPLERATE_10KS,  
511 - SAMPLERATE_5KS, SAMPLERATE_2_5KS, SAMPLERATE_1KS,  
512 - SAMPLERATE_COUNT  
513 - };  
514 -  
515 - //////////////////////////////////////////////////////////////////////////////  
516 - /// \enum Gain hantek/types.h  
517 - /// \brief The different gain steps supported by Hantek DSOs.  
518 - enum Gain {  
519 - GAIN_10MV, GAIN_20MV, GAIN_50MV,  
520 - GAIN_100MV, GAIN_200MV, GAIN_500MV,  
521 - GAIN_1V, GAIN_2V, GAIN_5V,  
522 - GAIN_COUNT  
523 - };  
524 -  
525 - //////////////////////////////////////////////////////////////////////////////  
526 /// \enum UsedChannels hantek/types.h 503 /// \enum UsedChannels hantek/types.h
527 /// \brief The enabled channels. 504 /// \brief The enabled channels.
528 enum UsedChannels { 505 enum UsedChannels {