diff --git a/README.md b/README.md index 29d49ac..ce7939f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ derived from his post: http://www.ping.net.au/20140126_cuSDR64src.tar.gz This is originally cuSDR written by Hermann, DL3HVH https://plus.google.com/107168125384405552048/posts -I added local sound and up'd the number of receivers to 16. +I added local sound and up'd the number of receivers to 20. Using the Hermes-Lite (with some minor protocol changes) I can do 16 rcvrs @ 96Khz and 9 @ 192Khz: @@ -17,3 +17,4 @@ the Hermes-Lite rtl supports. I have only compiled and used this on linux. +To make for Hermes-Lite edit Makefile and add -DHL diff --git a/Source/bin/settings.ini b/Source/bin/settings.ini index 54ff995..4f27d6d 100644 --- a/Source/bin/settings.ini +++ b/Source/bin/settings.ini @@ -1,6 +1,7 @@ [General] cudaSDR%20BETA%20=v0.3.2.13 -saved=Monday 29 June 2015 17:11:50 +cudaSDR%20BETA%20=v0.3.2.13+ +saved=Friday 29 December 2017 10:07:10 [ChirpWSPR] chirpAmplitude=75 @@ -21,7 +22,7 @@ bypassAll=off hpf13MHz=off hpf13MHzHi=18168000 hpf13MHzLo=14000000 -hpf1_5MHz=off +hpf1_5MHz=on hpf1_5MHzHi=5500000 hpf1_5MHzLo=1500000 hpf20MHz=off @@ -51,22 +52,26 @@ lpf60_40mLo=5330000 lpf6m=off lpf6mHi=54000000 lpf6mLo=50000000 -lpf80m=off +lpf80m=on lpf80mHi=4000000 lpf80mLo=3500000 manual=off +state10cm=33 state10m=33 state125cm=33 state12m=33 +state13cm=33 state15m=33 state160m=33 state17m=33 state20m=33 state2200m=33 +state23cm=33 state2m=33 state30m=33 state33cm=33 state40m=33 +state5cm=33 state60m=33 state630m=33 state6m=33 @@ -93,10 +98,10 @@ waterfall=#f69206 [graphics] dBmDistScaleMax=100 dBmDistScaleMin=-20 -sMeterHoldTime=10000 +sMeterHoldTime=2000 [hpsdr] -alex=false +alex=true checkfw=false excalibur=false hardware=1 @@ -109,47 +114,57 @@ pennylane=false audio_port=15000 hpsdr_local_ipAddress=192.168.1.1 listen_port=11000 -metis_port=47122 -server_ipAddress=192.168.1.1 +metis_port=49359 +server_ipAddress=192.168.15.1 server_port=52685 socketBufferSize=32 [penny] OCenabled=off +rxState10cm=0 rxState10m=0 rxState125cm=0 rxState12m=0 +rxState13cm=0 rxState15m=0 rxState160m=0 rxState17m=0 rxState20m=0 rxState2200m=0 +rxState23cm=0 rxState2m=0 rxState30m=0 rxState33cm=0 rxState40m=0 +rxState5cm=0 rxState60m=0 rxState630m=0 rxState6m=0 rxState70cm=0 rxState80m=0 +rxStateGen=0 +txState10cm=0 txState10m=0 txState125cm=0 txState12m=0 +txState13cm=0 txState15m=0 txState160m=0 txState17m=0 txState20m=0 txState2200m=0 +txState23cm=0 txState2m=0 txState30m=0 txState33cm=0 txState40m=0 +txState5cm=0 txState60m=0 txState630m=0 txState6m=0 txState70cm=0 txState80m=0 +txStateGen=0 [receiver0] agcAttacktime=1 @@ -161,130 +176,155 @@ agcLines=on agcMaximumGain=120 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=31 +audioVolume=34 averaging=on -averagingCnt=9 -centerFrequency=7191938 +averagingCnt=5 +centerFrequency=3716500 clickVFO=on -dBmPanScaleMax10m=-18 +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-30 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 -dBmPanScaleMax15m=-17 -dBmPanScaleMax160m=-4 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-21 +dBmPanScaleMax160m=-14 dBmPanScaleMax17m=-10 -dBmPanScaleMax20m=-22 +dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-74 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-34 -dBmPanScaleMaxGen=-54 -dBmPanScaleMin10m=-128 +dBmPanScaleMax80m=-15 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-140 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 -dBmPanScaleMin15m=-114 -dBmPanScaleMin160m=-74 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-131 +dBmPanScaleMin160m=-124 dBmPanScaleMin17m=-120 -dBmPanScaleMin20m=-84 +dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 -dBmPanScaleMin30m=-104 +dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-130 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-90 -dBmPanScaleMinGen=-110 +dBmPanScaleMin80m=-125 +dBmPanScaleMinGen=-120 dspCore=qtdsp -dspMode10m=USB +dspMode10cm=LSB +dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB -dspMode15m=USB +dspMode13cm=LSB +dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB -dspMode20m=USB +dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB dspModeGen=LSB +fftAuto=off filterHi=-150 filterLo=-3050 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off -lastCenterFrequency10m=28908896 +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28676442 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 -lastCenterFrequency15m=21213461 -lastCenterFrequency160m=1901555 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21083828 +lastCenterFrequency160m=1810000 lastCenterFrequency17m=18068000 -lastCenterFrequency20m=14141881 +lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 -lastCenterFrequency30m=10112146 +lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 -lastCenterFrequency40m=7191938 -lastCenterFrequency60m=5399971 -lastCenterFrequency630m=477624 -lastCenterFrequency6m=50995823 +lastCenterFrequency40m=7080048 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 -lastCenterFrequency80m=3799975 -lastCenterFrequencyGen=3909142 -lastVfoFrequency10m=28825000 +lastCenterFrequency80m=3716500 +lastCenterFrequencyGen=1375098 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28676442 lastVfoFrequency125cm=222000000 -lastVfoFrequency12m=24923770 -lastVfoFrequency15m=21005700 -lastVfoFrequency160m=1828000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21066300 +lastVfoFrequency160m=1810000 lastVfoFrequency17m=18068000 -lastVfoFrequency20m=14056500 +lastVfoFrequency20m=14035300 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10119000 +lastVfoFrequency30m=10100000 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7192000 -lastVfoFrequency60m=5399417 +lastVfoFrequency40m=7025700 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 -lastVfoFrequency6m=50990500 +lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 -lastVfoFrequency80m=3799983 -lastVfoFrequencyGen=3924000 -mouseWheelFreqStep=500 +lastVfoFrequency80m=3740100 +lastVfoFrequencyGen=13959500 +mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=7192000 +vfoFrequency=3740100 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -295,134 +335,159 @@ agcDecaytime=250 agcFixedGain=30 agcGain=100 agcHangTime=100 -agcLines=off -agcMaximumGain=120 +agcLines=on +agcMaximumGain=84 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=25 +audioVolume=40 averaging=on averagingCnt=5 -centerFrequency=10014453 +centerFrequency=28000000 clickVFO=on -dBmPanScaleMax10m=-10 +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-53 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 -dBmPanScaleMax15m=0 -dBmPanScaleMax160m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 -dBmPanScaleMax20m=-9 +dBmPanScaleMax20m=-34 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 -dBmPanScaleMax30m=-31 +dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-36 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 -dBmPanScaleMaxGen=-19 -dBmPanScaleMin10m=-120 +dBmPanScaleMax80m=-44 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-163 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 -dBmPanScaleMin15m=-89 -dBmPanScaleMin160m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 -dBmPanScaleMin20m=-100 +dBmPanScaleMin20m=-144 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 -dBmPanScaleMin30m=-122 +dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-127 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 -dBmPanScaleMinGen=-110 +dBmPanScaleMin80m=-154 +dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB -dspMode15m=USB +dspMode13cm=LSB +dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB -dspMode20m=LSB +dspMode20m=USB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB -dspMode80m=USB +dspMode80m=LSB dspModeGen=LSB +fftAuto=off filterHi=-150 filterLo=-3050 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off -lastCenterFrequency10m=28000158 +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 -lastCenterFrequency15m=21000158 -lastCenterFrequency160m=1810196 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 -lastCenterFrequency20m=14232965 +lastCenterFrequency20m=14209365 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 -lastCenterFrequency30m=10149614 +lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 -lastCenterFrequency40m=7149614 -lastCenterFrequency60m=5406760 +lastCenterFrequency40m=7119976 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 -lastCenterFrequency80m=3799728 -lastCenterFrequencyGen=10014453 -lastVfoFrequency10m=28999770 +lastCenterFrequency80m=3673284 +lastCenterFrequencyGen=7201153 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 -lastVfoFrequency15m=21001023 -lastVfoFrequency160m=1810000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 -lastVfoFrequency20m=14000000 +lastVfoFrequency20m=14255000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10139000 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7139000 -lastVfoFrequency60m=5407160 +lastVfoFrequency40m=7067900 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 -lastVfoFrequency80m=3799728 -lastVfoFrequencyGen=10000000 -mouseWheelFreqStep=1000 +lastVfoFrequency80m=3680200 +lastVfoFrequencyGen=27958000 +mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=10000000 +vfoFrequency=28000000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -434,133 +499,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=120 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=10 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=7253801 +centerFrequency=7000000 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-20 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 +dBmPanScaleMax80m=-19 dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-130 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 +dBmPanScaleMin80m=-129 dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB -filterHi=-150 -filterLo=-3050 +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 -lastCenterFrequency40m=7199047 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 lastCenterFrequency80m=3672000 -lastCenterFrequencyGen=7253801 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1810000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10100000 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7199047 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 lastVfoFrequency80m=3672000 -lastVfoFrequencyGen=7253801 +lastVfoFrequencyGen=10051000 mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=7253801 +vfoFrequency=7000000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -572,133 +662,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=120 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=10 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=14072792 +centerFrequency=7000000 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-11 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 +dBmPanScaleMax80m=-19 dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-121 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 +dBmPanScaleMin80m=-129 dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB -filterHi=-150 -filterLo=-3050 +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 -lastCenterFrequency20m=14072792 +lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 lastCenterFrequency80m=3672000 lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1810000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 -lastVfoFrequency20m=14072792 +lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10100000 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 lastVfoFrequency80m=3672000 -lastVfoFrequencyGen=1800000 +lastVfoFrequencyGen=10051000 mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=14072792 +vfoFrequency=7000000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -710,133 +825,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=91 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=56 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=7151649 +centerFrequency=7000000 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-25 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 +dBmPanScaleMax80m=-19 dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-135 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 +dBmPanScaleMin80m=-129 dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB -filterHi=-150 -filterLo=-3050 +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 -lastCenterFrequency40m=7151649 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 lastCenterFrequency80m=3672000 lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1810000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10100000 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7157020 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 lastVfoFrequency80m=3672000 -lastVfoFrequencyGen=1800000 -mouseWheelFreqStep=10 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=7157020 +vfoFrequency=7000000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -848,133 +988,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=120 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=10 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=21000000 +centerFrequency=1810234 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-15 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 +dBmPanScaleMax80m=-16 dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-125 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 +dBmPanScaleMin80m=-126 dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB +dspModeGen=USB +fftAuto=off filterHi=-150 filterLo=-3050 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 lastCenterFrequency80m=3672000 lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 -lastVfoFrequency15m=21025800 -lastVfoFrequency160m=1810000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10100000 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7000000 +lastVfoFrequency40m=7016900 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 lastVfoFrequency80m=3672000 -lastVfoFrequencyGen=1800000 +lastVfoFrequencyGen=10051000 mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=21025800 +vfoFrequency=1864900 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -986,133 +1151,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=120 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=10 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=14268526 +centerFrequency=14000000 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 +dBmPanScaleMax80m=-19 dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 +dBmPanScaleMin80m=-129 dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB -filterHi=-150 -filterLo=-3050 -framesPerSecond=25 +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 +framesPerSecond=15 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 -lastCenterFrequency20m=14268526 +lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 -lastCenterFrequency30m=10100000 +lastCenterFrequency30m=10146080 lastCenterFrequency33cm=902000000 -lastCenterFrequency40m=7000000 +lastCenterFrequency40m=7069888 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 lastCenterFrequency80m=3672000 -lastCenterFrequencyGen=1800000 +lastCenterFrequencyGen=10158368 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1810000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 -lastVfoFrequency20m=14268526 +lastVfoFrequency20m=14043000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10100000 +lastVfoFrequency30m=10145300 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7000000 +lastVfoFrequency40m=7085972 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 lastVfoFrequency80m=3672000 -lastVfoFrequencyGen=1800000 +lastVfoFrequencyGen=10165268 mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=14268526 +vfoFrequency=14043000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -1127,130 +1317,807 @@ agcLines=on agcMaximumGain=120 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=56 +audioVolume=50 averaging=on averagingCnt=5 -centerFrequency=899952 +centerFrequency=1618512 clickVFO=on -dBmPanScaleMax10m=-10 +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-26 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 -dBmPanScaleMax20m=-10 +dBmPanScaleMax20m=-12 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-20 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 -dBmPanScaleMax6m=-10 +dBmPanScaleMax6m=-5 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 -dBmPanScaleMaxGen=-10 -dBmPanScaleMin10m=-120 +dBmPanScaleMax80m=-9 +dBmPanScaleMaxGen=-3 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-136 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 -dBmPanScaleMin20m=-120 +dBmPanScaleMin20m=-122 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-130 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 -dBmPanScaleMin6m=-120 +dBmPanScaleMin6m=-115 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 -dBmPanScaleMinGen=-120 +dBmPanScaleMin80m=-119 +dBmPanScaleMinGen=-113 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB -dspMode6m=LSB +dspMode6m=USB dspMode70cm=LSB dspMode80m=LSB dspModeGen=AM +fftAuto=off filterHi=4000 filterLo=-4000 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3680316 +lastCenterFrequencyGen=1618512 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10109800 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50062200 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3678000 +lastVfoFrequencyGen=1590900 +mouseWheelFreqStep=100 +panLocked=off +panMode=FILLEDLINE +vfoFrequency=1590900 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver16] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 lastCenterFrequency80m=3672000 -lastCenterFrequencyGen=899952 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1810000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10100000 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 lastVfoFrequency80m=3672000 -lastVfoFrequencyGen=899952 -mouseWheelFreqStep=1000000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=899952 +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver17] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=FILLEDLINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver18] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=FILLEDLINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver19] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=FILLEDLINE +vfoFrequency=14000000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -1262,133 +2129,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=120 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=27 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=1591296 +centerFrequency=10100000 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 -dBmPanScaleMax15m=0 -dBmPanScaleMax160m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 -dBmPanScaleMax20m=-22 +dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-11 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-53 -dBmPanScaleMaxGen=-62 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 -dBmPanScaleMin15m=-109 -dBmPanScaleMin160m=-120 -dBmPanScaleMin17m=-100 -dBmPanScaleMin20m=-131 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-89 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-131 -dBmPanScaleMinGen=-140 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB -filterHi=-150 -filterLo=-3050 +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 -lastCenterFrequency12m=24891024 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1965264 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 -lastCenterFrequency20m=14258266 +lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 -lastCenterFrequency30m=10108302 +lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 -lastCenterFrequency630m=475328 +lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 -lastCenterFrequency80m=3799678 -lastCenterFrequencyGen=1591296 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 -lastVfoFrequency12m=24891024 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1979460 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 -lastVfoFrequency20m=14282804 +lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10102279 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 -lastVfoFrequency630m=472224 +lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 -lastVfoFrequency80m=3799678 -lastVfoFrequencyGen=1611668 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=1611668 +vfoFrequency=10117200 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -1400,133 +2292,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=120 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=50 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=15000160 +centerFrequency=7067548 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 -dBmPanScaleMax20m=-57 +dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 -dBmPanScaleMax30m=-37 +dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-31 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 +dBmPanScaleMax80m=-11 dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 -dBmPanScaleMin20m=-136 +dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 -dBmPanScaleMin30m=-147 +dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-122 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 -dBmPanScaleMinGen=-101 +dBmPanScaleMin80m=-121 +dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB -filterHi=-150 -filterLo=-3050 +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 -lastCenterFrequency17m=18068208 -lastCenterFrequency20m=14000160 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 -lastCenterFrequency40m=7000000 +lastCenterFrequency40m=7067548 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 lastCenterFrequency80m=3672000 -lastCenterFrequencyGen=15000160 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1810000 -lastVfoFrequency17m=18103800 -lastVfoFrequency20m=14017828 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10101540 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7000000 +lastVfoFrequency40m=7067548 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 lastVfoFrequency80m=3672000 -lastVfoFrequencyGen=15017828 +lastVfoFrequencyGen=10051000 mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=15017828 +vfoFrequency=7067548 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -1538,133 +2455,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=120 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=43 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=15014483 +centerFrequency=7000000 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 -dBmPanScaleMax15m=-19 -dBmPanScaleMax160m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 -dBmPanScaleMax20m=-29 +dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 -dBmPanScaleMax30m=-25 +dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-2 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 -dBmPanScaleMaxGen=-29 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 -dBmPanScaleMin15m=-109 -dBmPanScaleMin160m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 -dBmPanScaleMin20m=-118 +dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 -dBmPanScaleMin30m=-115 +dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-91 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 -dBmPanScaleMinGen=-118 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB +dspModeGen=USB +fftAuto=off filterHi=-150 filterLo=-3050 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 -lastCenterFrequency40m=7156815 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 -lastCenterFrequency80m=3672000 -lastCenterFrequencyGen=15014483 +lastCenterFrequency80m=3702062 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1810000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10100000 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7178741 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 -lastVfoFrequency80m=3672000 -lastVfoFrequencyGen=15047293 -mouseWheelFreqStep=1 +lastVfoFrequency80m=3750100 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=15047293 +vfoFrequency=7000000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -1676,133 +2618,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=120 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=25 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=1599540 +centerFrequency=7000000 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 -dBmPanScaleMax20m=-28 +dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-53 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 -dBmPanScaleMaxGen=-40 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 -dBmPanScaleMin20m=-110 +dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-135 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 -dBmPanScaleMinGen=-122 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB -filterHi=-150 -filterLo=-3050 +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1894564 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 -lastCenterFrequency30m=10120916 +lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 -lastCenterFrequency6m=53994564 +lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 lastCenterFrequency80m=3672000 -lastCenterFrequencyGen=1599540 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1898300 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 -lastVfoFrequency20m=14000756 +lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10121756 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7000756 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 -lastVfoFrequency6m=53998300 +lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 lastVfoFrequency80m=3672000 -lastVfoFrequencyGen=1594683 +lastVfoFrequencyGen=10051000 mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=1594683 +vfoFrequency=7000000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -1814,133 +2781,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=120 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=10 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=14992688 +centerFrequency=7000000 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 -dBmPanScaleMax20m=-23 +dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-33 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-35 -dBmPanScaleMaxGen=-17 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 -dBmPanScaleMin20m=-112 +dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-122 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-124 -dBmPanScaleMinGen=-106 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB -filterHi=-150 -filterLo=-3050 +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off -lastCenterFrequency10m=28074490 +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 -lastCenterFrequency80m=3567030 -lastCenterFrequencyGen=14992688 -lastVfoFrequency10m=28074490 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1810000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 -lastVfoFrequency20m=14012300 +lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10100000 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 -lastVfoFrequency80m=3580100 -lastVfoFrequencyGen=15004988 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=15004988 +vfoFrequency=7000000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -1952,133 +2944,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=83 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=33 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=10000000 +centerFrequency=7000000 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 -dBmPanScaleMax20m=-33 +dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-37 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=0 -dBmPanScaleMaxGen=-29 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 -dBmPanScaleMin20m=-103 +dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-127 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-110 -dBmPanScaleMinGen=-119 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=AM -filterHi=-150 -filterLo=-3050 +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 -lastCenterFrequency20m=14075076 +lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 -lastCenterFrequency40m=7159744 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 -lastCenterFrequency80m=3799201 -lastCenterFrequencyGen=10000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1810000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 -lastVfoFrequency20m=14084870 +lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10100000 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7137860 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 -lastVfoFrequency80m=3799201 -lastVfoFrequencyGen=9979830 -mouseWheelFreqStep=10 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=9979830 +vfoFrequency=7000000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -2090,133 +3107,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=117 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=10 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=7024472 +centerFrequency=7000000 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 dBmPanScaleMax20m=-10 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-20 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 +dBmPanScaleMax80m=-19 dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 dBmPanScaleMin20m=-120 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-130 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 +dBmPanScaleMin80m=-129 dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB -filterHi=-150 -filterLo=-3050 +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 -lastCenterFrequency40m=7024472 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 lastCenterFrequency80m=3672000 lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1810000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10100000 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7024472 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 lastVfoFrequency80m=3672000 -lastVfoFrequencyGen=1800000 +lastVfoFrequencyGen=10051000 mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=7024472 +vfoFrequency=7000000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -2228,133 +3270,158 @@ agcFixedGain=30 agcGain=100 agcHangTime=100 agcLines=on -agcMaximumGain=120 +agcMaximumGain=74 agcMode=MED agcSlope=0 +attenuator10cm=off attenuator10m=off attenuator125cm=off attenuator12m=off +attenuator13cm=off attenuator15m=off attenuator160m=off attenuator17m=off attenuator20m=off attenuator2200m=off +attenuator23cm=off attenuator2m=off attenuator30m=off attenuator33cm=off attenuator40m=off +attenuator5cm=off attenuator60m=off attenuator630m=off attenuator6m=off attenuator70cm=off attenuator80m=off attenuatorGen=off -audioVolume=10 +audioVolume=23 averaging=on averagingCnt=5 -centerFrequency=7062964 +centerFrequency=7000000 clickVFO=on +dBmPanScaleMax10cm=-10 dBmPanScaleMax10m=-10 dBmPanScaleMax125cm=-10 dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 dBmPanScaleMax15m=-10 -dBmPanScaleMax160m=-10 +dBmPanScaleMax160m=-19 dBmPanScaleMax17m=-10 -dBmPanScaleMax20m=-10 +dBmPanScaleMax20m=-45 dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 dBmPanScaleMax2m=-10 dBmPanScaleMax30m=-10 dBmPanScaleMax33cm=-10 -dBmPanScaleMax40m=-19 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 dBmPanScaleMax60m=-10 dBmPanScaleMax630m=-10 dBmPanScaleMax6m=-10 dBmPanScaleMax70cm=-10 -dBmPanScaleMax80m=-10 +dBmPanScaleMax80m=-19 dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 dBmPanScaleMin10m=-120 dBmPanScaleMin125cm=-120 dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 dBmPanScaleMin15m=-120 -dBmPanScaleMin160m=-120 +dBmPanScaleMin160m=-129 dBmPanScaleMin17m=-120 -dBmPanScaleMin20m=-120 +dBmPanScaleMin20m=-155 dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 dBmPanScaleMin2m=-120 dBmPanScaleMin30m=-120 dBmPanScaleMin33cm=-120 -dBmPanScaleMin40m=-129 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 dBmPanScaleMin60m=-120 dBmPanScaleMin630m=-120 dBmPanScaleMin6m=-120 dBmPanScaleMin70cm=-120 -dBmPanScaleMin80m=-120 +dBmPanScaleMin80m=-129 dBmPanScaleMinGen=-120 dspCore=qtdsp +dspMode10cm=LSB dspMode10m=LSB dspMode125cm=LSB dspMode12m=LSB +dspMode13cm=LSB dspMode15m=LSB dspMode160m=LSB dspMode17m=LSB dspMode20m=LSB dspMode2200m=LSB +dspMode23cm=LSB dspMode2m=LSB dspMode30m=LSB dspMode33cm=LSB dspMode40m=LSB +dspMode5cm=LSB dspMode60m=LSB dspMode630m=LSB dspMode6m=LSB dspMode70cm=LSB dspMode80m=LSB -dspModeGen=LSB -filterHi=-150 -filterLo=-3050 +dspModeGen=USB +fftAuto=off +filterHi=3050 +filterLo=150 framesPerSecond=25 freqRulerPosition=5 grid=on hairCross=off +lastCenterFrequency10cm=902000000 lastCenterFrequency10m=28000000 lastCenterFrequency125cm=222000000 lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 lastCenterFrequency15m=21000000 -lastCenterFrequency160m=1810000 +lastCenterFrequency160m=1810234 lastCenterFrequency17m=18068000 lastCenterFrequency20m=14000000 lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 lastCenterFrequency2m=144000000 lastCenterFrequency30m=10100000 lastCenterFrequency33cm=902000000 -lastCenterFrequency40m=7062964 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 lastCenterFrequency60m=5260000 lastCenterFrequency630m=472000 lastCenterFrequency6m=50000000 lastCenterFrequency70cm=420000000 lastCenterFrequency80m=3672000 lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 lastVfoFrequency10m=28000000 lastVfoFrequency125cm=222000000 lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 lastVfoFrequency15m=21000000 -lastVfoFrequency160m=1810000 +lastVfoFrequency160m=1864900 lastVfoFrequency17m=18068000 lastVfoFrequency20m=14000000 lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 lastVfoFrequency2m=144000000 -lastVfoFrequency30m=10100000 +lastVfoFrequency30m=10117200 lastVfoFrequency33cm=902000000 -lastVfoFrequency40m=7062964 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 lastVfoFrequency60m=5260000 lastVfoFrequency630m=472000 lastVfoFrequency6m=50000000 lastVfoFrequency70cm=420000000 lastVfoFrequency80m=3672000 -lastVfoFrequencyGen=1800000 +lastVfoFrequencyGen=10051000 mouseWheelFreqStep=100 panLocked=off panMode=FILLEDLINE -vfoFrequency=7062964 +vfoFrequency=7000000 waterfallMode=ENHANCED waterfallOffsetHi=20 waterfallOffsetLo=-5 @@ -2366,18 +3433,18 @@ class=0 dither=off mic_source=penelope mode=sdr -random=on -sample_rate=96000 +random=off +sample_rate=192000 timing=0 [user] -callSign=N1GP +callSign=Your Call sign [wideband] averaging=on averagingCnt=5 -dBmWideBandScaleMax=-33 -dBmWideBandScaleMin=-163 +dBmWideBandScaleMax=-42 +dBmWideBandScaleMin=-152 panMode=LINE widebandData=on widebandDisplay=on diff --git a/Source/bin/settings.ini.worked b/Source/bin/settings.ini.worked new file mode 100644 index 0000000..b4f77b3 --- /dev/null +++ b/Source/bin/settings.ini.worked @@ -0,0 +1,3434 @@ +[General] +cudaSDR%20BETA%20=v0.3.2.13 +saved=Monday 18 December 2017 13:52:09 + +[ChirpWSPR] +chirpAmplitude=75 +chirpBufferDurationUs=10000000 +chirpBufferLength=4096 +chirpChannels=1 +chirpFilterLowerFrequency=500 +chirpFilterUpperFrequency=2500 +chirpSamplingFrequency=48000 +lowerChirpFrequency=500 +upperChirpFrequency=2500 + +[alex] +amp6m=off +amp6mHi=54000000 +amp6mLo=50000000 +bypassAll=off +hpf13MHz=off +hpf13MHzHi=18168000 +hpf13MHzLo=14000000 +hpf1_5MHz=on +hpf1_5MHzHi=5500000 +hpf1_5MHzLo=1500000 +hpf20MHz=off +hpf20MHzHi=29700000 +hpf20MHzLo=21000000 +hpf6_5MHz=off +hpf6_5MHzHi=7300000 +hpf6_5MHzLo=7000000 +hpf9_5MHz=off +hpf9_5MHzHi=10150000 +hpf9_5MHzLo=10100000 +lpf12_10m=off +lpf12_10mHi=29700000 +lpf12_10mLo=24890000 +lpf160m=off +lpf160mHi=2000000 +lpf160mLo=1800000 +lpf17_15m=off +lpf17_15mHi=21450000 +lpf17_15mLo=18068000 +lpf30_20m=off +lpf30_20mHi=14350000 +lpf30_20mLo=10100000 +lpf60_40m=off +lpf60_40mHi=7300000 +lpf60_40mLo=5330000 +lpf6m=off +lpf6mHi=54000000 +lpf6mLo=50000000 +lpf80m=on +lpf80mHi=4000000 +lpf80mLo=3500000 +manual=off +state10cm=33 +state10m=33 +state125cm=33 +state12m=33 +state13cm=33 +state15m=33 +state160m=33 +state17m=33 +state20m=33 +state2200m=33 +state23cm=33 +state2m=33 +state30m=33 +state33cm=33 +state40m=33 +state5cm=33 +state60m=33 +state630m=33 +state6m=33 +state70cm=33 +state80m=33 +stateGen=33 + +[colors] +distanceLine=#f61b2d +distanceLineFilled=#e81d56 +gridLine=#076060 +panBackground=#664508 +panCenterLine=#f60713 +panLine=#f6a44c +panLineFilled=#f69f07 +panSolidBottom=#666008 +panSolidTop=#e6f6cc +panWideBandFilled=#89ac3e +panWideBandLine=#496f07 +panWideBandSolidBottom=#e8861d +panWideBandSolidTop=#ec2610 +waterfall=#f69206 + +[graphics] +dBmDistScaleMax=100 +dBmDistScaleMin=-20 +sMeterHoldTime=2000 + +[hpsdr] +alex=true +checkfw=false +excalibur=false +hardware=1 +interface=hermes +mercury=true +penelope=false +pennylane=false + +[network] +audio_port=15000 +hpsdr_local_ipAddress=10.38.181.181 +listen_port=11000 +metis_port=59412 +server_ipAddress=10.38.181.181 +server_port=52685 +socketBufferSize=32 + +[penny] +OCenabled=off +rxState10cm=0 +rxState10m=0 +rxState125cm=0 +rxState12m=0 +rxState13cm=0 +rxState15m=0 +rxState160m=0 +rxState17m=0 +rxState20m=0 +rxState2200m=0 +rxState23cm=0 +rxState2m=0 +rxState30m=0 +rxState33cm=0 +rxState40m=0 +rxState5cm=0 +rxState60m=0 +rxState630m=0 +rxState6m=0 +rxState70cm=0 +rxState80m=0 +rxStateGen=0 +txState10cm=0 +txState10m=0 +txState125cm=0 +txState12m=0 +txState13cm=0 +txState15m=0 +txState160m=0 +txState17m=0 +txState20m=0 +txState2200m=0 +txState23cm=0 +txState2m=0 +txState30m=0 +txState33cm=0 +txState40m=0 +txState5cm=0 +txState60m=0 +txState630m=0 +txState6m=0 +txState70cm=0 +txState80m=0 +txStateGen=0 + +[receiver0] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=75 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=43 +averaging=on +averagingCnt=5 +centerFrequency=7180048 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-14 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-11 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-124 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-121 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=LSB +filterHi=-150 +filterLo=-3050 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810000 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7180048 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3726504 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1810000 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10100000 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7192501 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3581900 +lastVfoFrequencyGen=7250800 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=7250800 +waterfallMode=SIMPLE +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver1] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver10] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver11] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver12] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver13] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver14] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver15] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver16] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver17] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver18] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver19] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver2] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver3] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver4] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver5] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver6] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver7] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver8] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver9] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=74 +agcMode=MED +agcSlope=0 +attenuator10cm=off +attenuator10m=off +attenuator125cm=off +attenuator12m=off +attenuator13cm=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator23cm=off +attenuator2m=off +attenuator30m=off +attenuator33cm=off +attenuator40m=off +attenuator5cm=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator70cm=off +attenuator80m=off +attenuatorGen=off +audioVolume=23 +averaging=on +averagingCnt=5 +centerFrequency=14000000 +clickVFO=on +dBmPanScaleMax10cm=-10 +dBmPanScaleMax10m=-10 +dBmPanScaleMax125cm=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax13cm=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-19 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-10 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax23cm=-10 +dBmPanScaleMax2m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax33cm=-10 +dBmPanScaleMax40m=-10 +dBmPanScaleMax5cm=-10 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax70cm=-10 +dBmPanScaleMax80m=-19 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10cm=-120 +dBmPanScaleMin10m=-120 +dBmPanScaleMin125cm=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin13cm=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-129 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-120 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin23cm=-120 +dBmPanScaleMin2m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin33cm=-120 +dBmPanScaleMin40m=-120 +dBmPanScaleMin5cm=-120 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin70cm=-120 +dBmPanScaleMin80m=-129 +dBmPanScaleMinGen=-120 +dspCore=qtdsp +dspMode10cm=LSB +dspMode10m=LSB +dspMode125cm=LSB +dspMode12m=LSB +dspMode13cm=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode23cm=LSB +dspMode2m=LSB +dspMode30m=LSB +dspMode33cm=LSB +dspMode40m=LSB +dspMode5cm=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode70cm=LSB +dspMode80m=LSB +dspModeGen=USB +filterHi=3050 +filterLo=150 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10cm=902000000 +lastCenterFrequency10m=28000000 +lastCenterFrequency125cm=222000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency13cm=902000000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810234 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency23cm=902000000 +lastCenterFrequency2m=144000000 +lastCenterFrequency30m=10100000 +lastCenterFrequency33cm=902000000 +lastCenterFrequency40m=7000000 +lastCenterFrequency5cm=902000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency70cm=420000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1800000 +lastVfoFrequency10cm=902000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency125cm=222000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency13cm=902000000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1864900 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency23cm=902000000 +lastVfoFrequency2m=144000000 +lastVfoFrequency30m=10117200 +lastVfoFrequency33cm=902000000 +lastVfoFrequency40m=7000000 +lastVfoFrequency5cm=902000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency70cm=420000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=10051000 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=14000000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[server] +10mhzsource=mercury +122_88mhzsource=mercury +class=0 +dither=off +mic_source=penelope +mode=sdr +random=off +sample_rate=192000 +timing=0 + +[user] +callSign=Your Call sign + +[wideband] +averaging=on +averagingCnt=5 +dBmWideBandScaleMax=-10 +dBmWideBandScaleMin=-140 +panMode=LINE +widebandData=on +widebandDisplay=on + +[window] +minimumGroupBoxWidth=230 +minimumWidgetWidth=235 +multiRxView=0 diff --git a/Source/bin/windowsSettings.ini b/Source/bin/windowsSettings.ini index 5604795..36bff54 100644 --- a/Source/bin/windowsSettings.ini +++ b/Source/bin/windowsSettings.ini @@ -1,3 +1,3 @@ [General] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x1\0\0\0\0\0l\0\0\0\x64\0\0\x4\xfb\0\0\x3\x66\0\0\0v\0\0\0\x90\0\0\x4\xf1\0\0\x3\\\0\0\0\0\0\0) -windowState=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\x1\0\0\0\xf5\0\0\x2\x11\xfc\x2\0\0\0\x5\xfb\0\0\0\x12\0R\0\x61\0\x64\0i\0o\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\xfb\0\0\0\x14\0S\0\x65\0r\0v\0\x65\0r\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\xfb\0\0\0\x12\0H\0P\0S\0\x44\0R\0\x43\0t\0r\0l\x1\0\0\0\xa5\0\0\x2\x11\0\0\x2\x11\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0h\0i\0r\0p\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\xfb\0\0\0\x16\0\x44\0i\0s\0p\0l\0\x61\0y\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\0\0\x3\x84\0\0\x2\x11\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x3\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x18\0\x44\0i\0s\0p\0l\0\x61\0y\0P\0\x61\0n\0\x65\0l\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x16\0M\0\x61\0i\0n\0\x42\0u\0t\0t\0o\0n\0s\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x2\0\0\0\0\x3\x97\0\0\0\x33\0\0\f(\0\0\x6\x1\0\0\x3\x97\0\0\0X\0\0\f(\0\0\x6\x1\0\0\0\0\0\0\0\0\xf\0) +windowState=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\x1\0\0\0\xf5\0\0\x4\xdc\xfc\x2\0\0\0\x5\xfb\0\0\0\x12\0R\0\x61\0\x64\0i\0o\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\xfb\0\0\0\x14\0S\0\x65\0r\0v\0\x65\0r\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\xfb\0\0\0\x12\0H\0P\0S\0\x44\0R\0\x43\0t\0r\0l\x1\0\0\0\xb3\0\0\x4\xdc\0\0\x4\xdc\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0h\0i\0r\0p\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\xfb\0\0\0\x16\0\x44\0i\0s\0p\0l\0\x61\0y\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\0\0\a\x97\0\0\x4\xdc\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0U\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x18\0\x44\0i\0s\0p\0l\0\x61\0y\0P\0\x61\0n\0\x65\0l\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x16\0M\0\x61\0i\0n\0\x42\0u\0t\0t\0o\0n\0s\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0) diff --git a/Source/src/DataEngine/cusdr_dataEngine.cpp b/Source/src/DataEngine/cusdr_dataEngine.cpp index d027aa2..c134e14 100644 --- a/Source/src/DataEngine/cusdr_dataEngine.cpp +++ b/Source/src/DataEngine/cusdr_dataEngine.cpp @@ -1,2845 +1,2845 @@ -/** -* @file cusdr_dataEngine.cpp -* @brief cuSDR data engine class -* @author Hermann von Hasseln, DL3HVH -* @version 0.1 -* @date 2011-02-02 -*/ - -/* - * - * Copyright 2010 Hermann von Hasseln, DL3HVH - * - * using original C code by John Melton, G0ORX/N6LYT and Dave McQuate, WA8YWQ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License version 2 as - * published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -//#define TESTING - -#define LOG_DATA_ENGINE -// use DATA_ENGINE_DEBUG -#define LOG_DATA_PROCESSOR -// use DATA_PROCESSOR_DEBUG -#define LOG_AUDIO_PROCESSOR -// use AUDIO_PROCESSOR -#define LOG_WIDEBAND_PROCESSOR -// use WIDEBAND_PROCESSOR_DEBUG - -#include "cusdr_dataEngine.h" - +/** +* @file cusdr_dataEngine.cpp +* @brief cuSDR data engine class +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-02 +*/ -/*! - \class DataEngine - \brief The DataEngine class implements the main SDR functionality. -*/ -/*! - \brief Implements interfaces to the HPSDR hardware and various Server and DSP functionality. - - set up HW interfaces to Metis or other resp. - - initializes Metis. - - set up parameters for HPSDR hardware. - - implements the data receiver thread. - - implements the data processor thread. - - implements the wide band data processor thread. - - implements the audio receiver thread. - - implements the audio processor thread. - - implements the interface to the Chirp WSPR decoding functionality. -*/ +/* + * + * Copyright 2010 Hermann von Hasseln, DL3HVH + * + * using original C code by John Melton, G0ORX/N6LYT and Dave McQuate, WA8YWQ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +//#define TESTING + +#define LOG_DATA_ENGINE +// use DATA_ENGINE_DEBUG +#define LOG_DATA_PROCESSOR +// use DATA_PROCESSOR_DEBUG +#define LOG_AUDIO_PROCESSOR +// use AUDIO_PROCESSOR +#define LOG_WIDEBAND_PROCESSOR +// use WIDEBAND_PROCESSOR_DEBUG + +#include "cusdr_dataEngine.h" + + +/*! + \class DataEngine + \brief The DataEngine class implements the main SDR functionality. +*/ +/*! + \brief Implements interfaces to the HPSDR hardware and various Server and DSP functionality. + - set up HW interfaces to Metis or other resp. + - initializes Metis. + - set up parameters for HPSDR hardware. + - implements the data receiver thread. + - implements the data processor thread. + - implements the wide band data processor thread. + - implements the audio receiver thread. + - implements the audio processor thread. + - implements the interface to the Chirp WSPR decoding functionality. +*/ static int firstTimeRxInit; -DataEngine::DataEngine(QObject *parent) - : QObject(parent) - , set(Settings::instance()) - , m_serverMode(set->getCurrentServerMode()) - , m_hwInterface(set->getHWInterface()) - , m_dataEngineState(QSDR::DataEngineDown) - , m_meterType(SIGNAL_STRENGTH) - , m_restart(false) - , m_networkDeviceRunning(false) - , m_soundFileLoaded(false) - , m_chirpInititalized(false) - , m_discoveryThreadRunning(false) - , m_dataIOThreadRunning(false) - , m_chirpDataProcThreadRunning(false) - , m_dataProcThreadRunning(false) - , m_audioRcvrThreadRunning(false) - , m_audioInProcThreadRunning(false) - , m_audioOutProcThreadRunning(false) - , m_frequencyChange(false) - //, m_wbSpectrumAveraging(set->getSpectrumAveraging()) - //, m_wbSpectrumAveraging(true) - , m_hamBandChanged(true) - , m_chirpThreadStopped(true) - , m_hpsdrDevices(0) - , m_configure(10) - , m_timeout(5000) - , m_remainingTime(0) - , m_RxFrequencyChange(0) - , m_forwardPower(0) - , m_rxSamples(0) - , m_chirpSamples(0) - , m_spectrumSize(set->getSpectrumSize()) - , m_sendState(0) - , m_sMeterCalibrationOffset(0.0f)//(35.0f) -{ - qRegisterMetaType(); - - this->setObjectName(QString::fromUtf8("dataEngine")); - - m_clientConnected = false; - - //currentRx = 0; - m_discoverer = 0; - m_dataIO = 0; - m_dataProcessor = 0; - m_wbDataProcessor = 0; - m_audioReceiver = 0; - m_audioOutProcessor = 0; - m_chirpProcessor = 0; - //m_wbAverager = 0; - - set->setMercuryVersion(0); - set->setPenelopeVersion(0); - set->setPennyLaneVersion(0); - set->setMetisVersion(0); - set->setHermesVersion(0); - - io.metisFW = 0; - io.hermesFW = 0; - io.mercuryFW = 0; - - //m_audioBuffer.resize(0); - //m_audiobuf.resize(IO_BUFFER_SIZE); - - initAudioEngine(); - setupConnections(); - - // test - /*audioringbuffer.reserve(3); - - audioringbuffer.append(1); - audioringbuffer.append(2); - audioringbuffer.append(3); - - for (int i = 0; i < audioringbuffer.size(); ++i) { - qDebug() << audioringbuffer.at(i); - } - - audioringbuffer.append(4); - audioringbuffer.append(5); - - for (int i = 0; i < audioringbuffer.size(); ++i) { - qDebug() << audioringbuffer.at(i); - }*/ - - m_message = "audio sample = %1"; - m_counter = 0; -} - -DataEngine::~DataEngine() { -} - -void DataEngine::initAudioEngine() { - m_audioEngine = new AudioEngine(); - //m_audioEngine->setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, m_dataEngineState); -} - -void DataEngine::setupConnections() { - - CHECKED_CONNECT( - set, - SIGNAL(systemStateChanged( - QObject *, - QSDR::_Error, - QSDR::_HWInterfaceMode, - QSDR::_ServerMode, - QSDR::_DataEngineState)), - this, - SLOT(systemStateChanged( - QObject *, - QSDR::_Error, - QSDR::_HWInterfaceMode, - QSDR::_ServerMode, - QSDR::_DataEngineState))); - - CHECKED_CONNECT( - set, - SIGNAL(rxListChanged(QList)), - this, - SLOT(rxListChanged(QList))); - - CHECKED_CONNECT( - set, - SIGNAL(numberOfRXChanged(QObject *, int)), - this, - SLOT(setNumberOfRx(QObject *, int))); - - CHECKED_CONNECT( - set, - SIGNAL(currentReceiverChanged(QObject *,int)), - this, - SLOT(setCurrentReceiver(QObject *, int))); - - CHECKED_CONNECT( - set, - SIGNAL(hamBandChanged(QObject *, int, bool, HamBand)), - this, - SLOT(setHamBand(QObject *, int, bool, HamBand))); - - CHECKED_CONNECT( - set, - SIGNAL(sampleRateChanged(QObject *, int)), - this, - SLOT(setSampleRate(QObject *, int))); - - CHECKED_CONNECT( - set, - SIGNAL(mercuryAttenuatorChanged(QObject *, HamBand, int)), - this, - SLOT(setMercuryAttenuator(QObject *, HamBand, int))); - -// CHECKED_CONNECT( -// set, -// SIGNAL(mercuryAttenuatorsChanged(QObject *, QList)), -// this, -// SLOT(setMercuryAttenuators(QObject *, QList))); - - CHECKED_CONNECT( - set, - SIGNAL(ditherChanged(QObject *, int)), - this, - SLOT(setDither(QObject *, int))); - - CHECKED_CONNECT( - set, - SIGNAL(randomChanged(QObject *, int)), - this, - SLOT(setRandom(QObject *, int))); - - CHECKED_CONNECT( - set, - SIGNAL(src10MhzChanged(QObject *, int)), - this, - SLOT(set10MhzSource(QObject *, int))); - - CHECKED_CONNECT( - set, - SIGNAL(src122_88MhzChanged(QObject *, int)), - this, - SLOT(set122_88MhzSource(QObject *, int))); - - CHECKED_CONNECT( - set, - SIGNAL(micSourceChanged(QObject *, int)), - this, - SLOT(setMicSource(QObject *, int))); - - CHECKED_CONNECT( - set, - SIGNAL(classChanged(QObject *, int)), - this, - SLOT(setMercuryClass(QObject *, int))); - - CHECKED_CONNECT( - set, - SIGNAL(timingChanged(QObject *, int)), - this, - SLOT(setMercuryTiming(QObject *, int))); - - CHECKED_CONNECT( - set, - SIGNAL(clientDisconnectedEvent(int)), - this, - SLOT(setClientDisconnected(int))); - - CHECKED_CONNECT( - set, - SIGNAL(clientNoConnectedChanged(QObject*, int)), - this, - SLOT(setClientConnected(QObject*, int))); - - CHECKED_CONNECT( - set, - SIGNAL(rxConnectedStatusChanged(QObject*, int, bool)), - this, - SLOT(setRxConnectedStatus(QObject*, int, bool))); - - CHECKED_CONNECT( - set, - SIGNAL(audioRxChanged(QObject*, int)), - this, - SLOT(setAudioReceiver(QObject*, int))); - - CHECKED_CONNECT( - set, - SIGNAL(framesPerSecondChanged(QObject*, int, int)), - this, - SLOT(setFramesPerSecond(QObject*, int, int))); - - CHECKED_CONNECT( - set, - SIGNAL(searchMetisSignal()), - this, - SLOT(searchHpsdrNetworkDevices())); - - /*CHECKED_CONNECT( - set, - SIGNAL(spectrumAveragingChanged(QObject*, int, bool)), - this, - SLOT(setWbSpectrumAveraging(QObject*, int, bool)));*/ - - CHECKED_CONNECT( - set, - SIGNAL(networkDeviceNumberChanged(int)), - this, - SLOT(setHPSDRDeviceNumber(int))); - -// CHECKED_CONNECT( -// set, -// SIGNAL(alexConfigurationChanged(const QList &)), -// this, -// SLOT(setAlexConfiguration(const QList &))); - - CHECKED_CONNECT( - set, - SIGNAL(alexConfigurationChanged(quint16)), - this, - SLOT(setAlexConfiguration(quint16))); - - CHECKED_CONNECT( - set, - SIGNAL(alexStateChanged(HamBand, const QList &)), - this, - SLOT(setAlexStates(HamBand, const QList &))); - - CHECKED_CONNECT( - set, - SIGNAL(pennyOCEnabledChanged(bool)), - this, - SLOT(setPennyOCEnabled(bool))); - - CHECKED_CONNECT( - set, - SIGNAL(rxJ6PinsChanged(const QList &)), - this, - SLOT(setRxJ6Pins(const QList &))); - - CHECKED_CONNECT( - set, - SIGNAL(txJ6PinsChanged(const QList &)), - this, - SLOT(setTxJ6Pins(const QList &))); - - CHECKED_CONNECT( - m_audioEngine, - SIGNAL(formatChanged(QObject *, const QAudioFormat )), - set, - SLOT(setAudioFormat(QObject *, const QAudioFormat ))); - - CHECKED_CONNECT( - m_audioEngine, - SIGNAL(formatChanged(QObject *, const QAudioFormat )), - this, - SLOT(setAudioFileFormat(QObject *, const QAudioFormat ))); - - CHECKED_CONNECT( - m_audioEngine, - SIGNAL(playPositionChanged(QObject *, qint64)), - set, - SLOT(setAudioPosition(QObject *, qint64))); - - CHECKED_CONNECT( - m_audioEngine, - SIGNAL(playPositionChanged(QObject *, qint64)), - this, - SLOT(setAudioFilePosition(QObject *, qint64))); - - CHECKED_CONNECT( - m_audioEngine, - SIGNAL(bufferChanged(QObject *, qint64, qint64, const QByteArray)), - set, - SLOT(setAudioBuffer(QObject *, qint64, qint64, const QByteArray))); - - CHECKED_CONNECT( - m_audioEngine, - SIGNAL(bufferChanged(QObject *, qint64, qint64, const QByteArray)), - this, - SLOT(setAudioFileBuffer(QObject *, qint64, qint64, const QByteArray))); - - CHECKED_CONNECT( - m_audioEngine, - SIGNAL(audiofileBufferChanged(const QList)), - this, - SLOT(setAudioFileBuffer(const QList))); -} - -//******************************************************** -// start/stop data engine -bool DataEngine::startDataEngineWithoutConnection() { - - DATA_ENGINE_DEBUG << "no HPSDR-HW interface"; - - if (io.inputBuffer.length() > 0) { - - initReceivers(1); - if (!m_dataIO) createDataIO(); - if (!m_dataProcessor) createDataProcessor(); - - // data receiver thread - if (!startDataIO(QThread::NormalPriority)) { - - setSystemState(QSDR::DataReceiverThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - return false; - } - - switch (m_serverMode) { - - case QSDR::SDRMode: - case QSDR::ChirpWSPR: - case QSDR::NoServerMode: - case QSDR::DemoMode: - return false; - - case QSDR::ChirpWSPRFile: - - if (!m_chirpInititalized) createChirpDataProcessor(); - - m_chirpProcessor->generateLocalChirp(); - - if (!startChirpDataProcessor(QThread::NormalPriority)) { - - setSystemState(QSDR::ChirpDataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - return false; - } - - m_chirpDspEngine = new QDSPEngine(this, 0, 2*BUFFER_SIZE); - - cpxIn.resize(2*BUFFER_SIZE); - cpxOut.resize(2*BUFFER_SIZE); - - RX.at(0)->setConnectedStatus(true); - set->setRxList(RX); - - m_rxSamples = 0; - m_chirpSamples = 0; - - break; - } - - // IQ data processing thread - if (!startDataProcessor(QThread::NormalPriority)) { - - setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - return false; - } - setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineUp); - return true; - } - else { - - DATA_ENGINE_DEBUG << "no data available - data file loaded?"; - return false; - } -} - -bool DataEngine::findHPSDRDevices() { - - if (!m_discoverer) createDiscoverer(); - - // HPSDR network IO thread - if (!startDiscoverer(QThread::NormalPriority)) { - - io.networkIOMutex.lock(); - DATA_ENGINE_DEBUG << "HPSDR device discovery thread could not be started."; - io.networkIOMutex.unlock(); - return false; - } - - io.networkIOMutex.lock(); - DATA_ENGINE_DEBUG << "HPSDR network device detection...please wait."; - set->setSystemMessage("HPSDR network device detection...please wait", 0); - io.devicefound.wait(&io.networkIOMutex); - - m_hpsdrDevices = set->getHpsdrNetworkDevices(); - if (m_hpsdrDevices == 0) { - - io.networkIOMutex.unlock(); - stopDiscoverer(); - DATA_ENGINE_DEBUG << "no device found. HPSDR hardware powered? Network connection established?"; - set->setSystemMessage("no device found. HPSDR hardware powered? Network connection established?", 10000); - - setSystemState(QSDR::HwIOError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - } - else { - - emit clearSystemMessageEvent(); - if (m_hpsdrDevices > 1) - set->showNetworkIODialog(); - - QList metisList = set->getMetisCardsList(); - DATA_ENGINE_DEBUG << "found " << metisList.count() << " network device(s)"; - - for (int i = 0; i < metisList.count(); i++) { - - DATA_ENGINE_DEBUG << "Device " - << i << " @ " - << qPrintable(metisList.at(i).ip_address.toString()) - //<< " [" << qPrintable((char *) &metisList.at(i).mac_address) << "]"; - << " [" << metisList.at(i).mac_address << "]"; - } - - io.hpsdrDeviceIPAddress = set->getCurrentMetisCard().ip_address; - io.hpsdrDeviceName = set->getCurrentMetisCard().boardName; - DATA_ENGINE_DEBUG << "using HPSDR network device at " << qPrintable(io.hpsdrDeviceIPAddress.toString()); - - //Sleep(100); - SleeperThread::msleep(100); - - // stop the discovery thread - io.networkIOMutex.unlock(); - stopDiscoverer(); - - if (getFirmwareVersions()) return true; - return false; - } - - return false; -} - -bool DataEngine::getFirmwareVersions() { - - m_fwCount = 0; - - // init receivers - int rcvrs = set->getNumberOfReceivers(); +DataEngine::DataEngine(QObject *parent) + : QObject(parent) + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_dataEngineState(QSDR::DataEngineDown) + , m_meterType(SIGNAL_STRENGTH) + , m_restart(false) + , m_networkDeviceRunning(false) + , m_soundFileLoaded(false) + , m_chirpInititalized(false) + , m_discoveryThreadRunning(false) + , m_dataIOThreadRunning(false) + , m_chirpDataProcThreadRunning(false) + , m_dataProcThreadRunning(false) + , m_audioRcvrThreadRunning(false) + , m_audioInProcThreadRunning(false) + , m_audioOutProcThreadRunning(false) + , m_frequencyChange(false) + //, m_wbSpectrumAveraging(set->getSpectrumAveraging()) + //, m_wbSpectrumAveraging(true) + , m_hamBandChanged(true) + , m_chirpThreadStopped(true) + , m_hpsdrDevices(0) + , m_configure(10) + , m_timeout(5000) + , m_remainingTime(0) + , m_RxFrequencyChange(0) + , m_forwardPower(0) + , m_rxSamples(0) + , m_chirpSamples(0) + , m_spectrumSize(set->getSpectrumSize()) + , m_sendState(0) + , m_sMeterCalibrationOffset(0.0f)//(35.0f) +{ + qRegisterMetaType(); + + this->setObjectName(QString::fromUtf8("dataEngine")); + + m_clientConnected = false; + + //currentRx = 0; + m_discoverer = 0; + m_dataIO = 0; + m_dataProcessor = 0; + m_wbDataProcessor = 0; + m_audioReceiver = 0; + m_audioOutProcessor = 0; + m_chirpProcessor = 0; + //m_wbAverager = 0; + + set->setMercuryVersion(0); + set->setPenelopeVersion(0); + set->setPennyLaneVersion(0); + set->setMetisVersion(0); + set->setHermesVersion(0); + + io.metisFW = 0; + io.hermesFW = 0; + io.mercuryFW = 0; + + //m_audioBuffer.resize(0); + //m_audiobuf.resize(IO_BUFFER_SIZE); + + initAudioEngine(); + setupConnections(); + + // test + /*audioringbuffer.reserve(3); + + audioringbuffer.append(1); + audioringbuffer.append(2); + audioringbuffer.append(3); + + for (int i = 0; i < audioringbuffer.size(); ++i) { + qDebug() << audioringbuffer.at(i); + } + + audioringbuffer.append(4); + audioringbuffer.append(5); + + for (int i = 0; i < audioringbuffer.size(); ++i) { + qDebug() << audioringbuffer.at(i); + }*/ + + m_message = "audio sample = %1"; + m_counter = 0; +} + +DataEngine::~DataEngine() { +} + +void DataEngine::initAudioEngine() { + m_audioEngine = new AudioEngine(); + //m_audioEngine->setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, m_dataEngineState); +} + +void DataEngine::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(rxListChanged(QList)), + this, + SLOT(rxListChanged(QList))); + + CHECKED_CONNECT( + set, + SIGNAL(numberOfRXChanged(QObject *, int)), + this, + SLOT(setNumberOfRx(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(currentReceiverChanged(QObject *,int)), + this, + SLOT(setCurrentReceiver(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(hamBandChanged(QObject *, int, bool, HamBand)), + this, + SLOT(setHamBand(QObject *, int, bool, HamBand))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(setSampleRate(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(mercuryAttenuatorChanged(QObject *, HamBand, int)), + this, + SLOT(setMercuryAttenuator(QObject *, HamBand, int))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(mercuryAttenuatorsChanged(QObject *, QList)), +// this, +// SLOT(setMercuryAttenuators(QObject *, QList))); + + CHECKED_CONNECT( + set, + SIGNAL(ditherChanged(QObject *, int)), + this, + SLOT(setDither(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(randomChanged(QObject *, int)), + this, + SLOT(setRandom(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(src10MhzChanged(QObject *, int)), + this, + SLOT(set10MhzSource(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(src122_88MhzChanged(QObject *, int)), + this, + SLOT(set122_88MhzSource(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(micSourceChanged(QObject *, int)), + this, + SLOT(setMicSource(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(classChanged(QObject *, int)), + this, + SLOT(setMercuryClass(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(timingChanged(QObject *, int)), + this, + SLOT(setMercuryTiming(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(clientDisconnectedEvent(int)), + this, + SLOT(setClientDisconnected(int))); + + CHECKED_CONNECT( + set, + SIGNAL(clientNoConnectedChanged(QObject*, int)), + this, + SLOT(setClientConnected(QObject*, int))); + + CHECKED_CONNECT( + set, + SIGNAL(rxConnectedStatusChanged(QObject*, int, bool)), + this, + SLOT(setRxConnectedStatus(QObject*, int, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(audioRxChanged(QObject*, int)), + this, + SLOT(setAudioReceiver(QObject*, int))); + + CHECKED_CONNECT( + set, + SIGNAL(framesPerSecondChanged(QObject*, int, int)), + this, + SLOT(setFramesPerSecond(QObject*, int, int))); + + CHECKED_CONNECT( + set, + SIGNAL(searchMetisSignal()), + this, + SLOT(searchHpsdrNetworkDevices())); + + /*CHECKED_CONNECT( + set, + SIGNAL(spectrumAveragingChanged(QObject*, int, bool)), + this, + SLOT(setWbSpectrumAveraging(QObject*, int, bool)));*/ + + CHECKED_CONNECT( + set, + SIGNAL(networkDeviceNumberChanged(int)), + this, + SLOT(setHPSDRDeviceNumber(int))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(alexConfigurationChanged(const QList &)), +// this, +// SLOT(setAlexConfiguration(const QList &))); + + CHECKED_CONNECT( + set, + SIGNAL(alexConfigurationChanged(quint16)), + this, + SLOT(setAlexConfiguration(quint16))); + + CHECKED_CONNECT( + set, + SIGNAL(alexStateChanged(HamBand, const QList &)), + this, + SLOT(setAlexStates(HamBand, const QList &))); + + CHECKED_CONNECT( + set, + SIGNAL(pennyOCEnabledChanged(bool)), + this, + SLOT(setPennyOCEnabled(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(rxJ6PinsChanged(const QList &)), + this, + SLOT(setRxJ6Pins(const QList &))); + + CHECKED_CONNECT( + set, + SIGNAL(txJ6PinsChanged(const QList &)), + this, + SLOT(setTxJ6Pins(const QList &))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(formatChanged(QObject *, const QAudioFormat )), + set, + SLOT(setAudioFormat(QObject *, const QAudioFormat ))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(formatChanged(QObject *, const QAudioFormat )), + this, + SLOT(setAudioFileFormat(QObject *, const QAudioFormat ))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(playPositionChanged(QObject *, qint64)), + set, + SLOT(setAudioPosition(QObject *, qint64))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(playPositionChanged(QObject *, qint64)), + this, + SLOT(setAudioFilePosition(QObject *, qint64))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(bufferChanged(QObject *, qint64, qint64, const QByteArray)), + set, + SLOT(setAudioBuffer(QObject *, qint64, qint64, const QByteArray))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(bufferChanged(QObject *, qint64, qint64, const QByteArray)), + this, + SLOT(setAudioFileBuffer(QObject *, qint64, qint64, const QByteArray))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(audiofileBufferChanged(const QList)), + this, + SLOT(setAudioFileBuffer(const QList))); +} + +//******************************************************** +// start/stop data engine +bool DataEngine::startDataEngineWithoutConnection() { + + DATA_ENGINE_DEBUG << "no HPSDR-HW interface"; + + if (io.inputBuffer.length() > 0) { + + initReceivers(1); + if (!m_dataIO) createDataIO(); + if (!m_dataProcessor) createDataProcessor(); + + // data receiver thread + if (!startDataIO(QThread::NormalPriority)) { + + setSystemState(QSDR::DataReceiverThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } + + switch (m_serverMode) { + + case QSDR::SDRMode: + case QSDR::ChirpWSPR: + case QSDR::NoServerMode: + case QSDR::DemoMode: + return false; + + case QSDR::ChirpWSPRFile: + + if (!m_chirpInititalized) createChirpDataProcessor(); + + m_chirpProcessor->generateLocalChirp(); + + if (!startChirpDataProcessor(QThread::NormalPriority)) { + + setSystemState(QSDR::ChirpDataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } + + m_chirpDspEngine = new QDSPEngine(this, 0, 2*BUFFER_SIZE); + + cpxIn.resize(2*BUFFER_SIZE); + cpxOut.resize(2*BUFFER_SIZE); + + RX.at(0)->setConnectedStatus(true); + set->setRxList(RX); + + m_rxSamples = 0; + m_chirpSamples = 0; + + break; + } + + // IQ data processing thread + if (!startDataProcessor(QThread::NormalPriority)) { + + setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } + setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineUp); + return true; + } + else { + + DATA_ENGINE_DEBUG << "no data available - data file loaded?"; + return false; + } +} + +bool DataEngine::findHPSDRDevices() { + + if (!m_discoverer) createDiscoverer(); + + // HPSDR network IO thread + if (!startDiscoverer(QThread::NormalPriority)) { + + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "HPSDR device discovery thread could not be started."; + io.networkIOMutex.unlock(); + return false; + } + + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "HPSDR network device detection...please wait."; + set->setSystemMessage("HPSDR network device detection...please wait", 0); + io.devicefound.wait(&io.networkIOMutex); + + m_hpsdrDevices = set->getHpsdrNetworkDevices(); + if (m_hpsdrDevices == 0) { + + io.networkIOMutex.unlock(); + stopDiscoverer(); + DATA_ENGINE_DEBUG << "no device found. HPSDR hardware powered? Network connection established?"; + set->setSystemMessage("no device found. HPSDR hardware powered? Network connection established?", 10000); + + setSystemState(QSDR::HwIOError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + } + else { + + emit clearSystemMessageEvent(); + if (m_hpsdrDevices > 1) + set->showNetworkIODialog(); + + QList metisList = set->getMetisCardsList(); + DATA_ENGINE_DEBUG << "found " << metisList.count() << " network device(s)"; + + for (int i = 0; i < metisList.count(); i++) { + + DATA_ENGINE_DEBUG << "Device " + << i << " @ " + << qPrintable(metisList.at(i).ip_address.toString()) + //<< " [" << qPrintable((char *) &metisList.at(i).mac_address) << "]"; + << " [" << metisList.at(i).mac_address << "]"; + } + + io.hpsdrDeviceIPAddress = set->getCurrentMetisCard().ip_address; + io.hpsdrDeviceName = set->getCurrentMetisCard().boardName; + DATA_ENGINE_DEBUG << "using HPSDR network device at " << qPrintable(io.hpsdrDeviceIPAddress.toString()); + + //Sleep(100); + SleeperThread::msleep(100); + + // stop the discovery thread + io.networkIOMutex.unlock(); + stopDiscoverer(); + + if (getFirmwareVersions()) return true; + return false; + } + + return false; +} + +bool DataEngine::getFirmwareVersions() { + + m_fwCount = 0; + + // init receivers + int rcvrs = set->getNumberOfReceivers(); firstTimeRxInit = rcvrs; - - QString str = "Initializing %1 receiver(s)...please wait"; - set->setSystemMessage(str.arg(set->getNumberOfReceivers()), rcvrs * 500); - - if (!initReceivers(rcvrs)) return false; - - - if (!m_dataIO) createDataIO(); - - if (!m_dataProcessor) createDataProcessor(); - - switch (m_serverMode) { - - case QSDR::SDRMode: - - for (int i = 0; i < set->getNumberOfReceivers(); i++) { - - RX.at(i)->setConnectedStatus(true); - } - setTimeStamp(this, false); - break; - - default: - - DATA_ENGINE_DEBUG << "no valid server mode"; - setSystemState(QSDR::ServerModeError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - - return false; - } - - set->setRxList(RX); - connectDSPSlots(); - - for (int i = 0; i < set->getNumberOfReceivers(); i++) - RX.at(i)->setAudioVolume(this, i, 0.0f); - - // IQ data processing thread - if (!startDataProcessor(QThread::NormalPriority)) { - - DATA_ENGINE_DEBUG << "data processor thread could not be started."; - return false; - } - - // data IO thread - if (!startDataIO(QThread::NormalPriority)) {// ::NormalPriority)) { - - DATA_ENGINE_DEBUG << "data IO thread could not be started."; - return false; - } - - //setSampleRate(this, set->getSampleRate()); - SleeperThread::msleep(100); - - // pre-conditioning - for (int i = 0; i < io.receivers; i++) - m_dataIO->sendInitFramesToNetworkDevice(i); - - if (m_serverMode == QSDR::SDRMode) - m_dataIO->networkDeviceStartStop(0x01); // 0x01 for starting Metis without wide band data - - m_networkDeviceRunning = true; - setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineUp); - SleeperThread::msleep(300); - - io.metisFW = set->getMetisVersion(); - io.mercuryFW = set->getMercuryVersion(); - io.penelopeFW = set->getPenelopeVersion(); - io.pennylaneFW = set->getPennyLaneVersion(); - io.hermesFW = set->getHermesVersion(); - - // if we have 4096 * 16 bit = 8 * 1024 raw consecutive ADC samples, m_wbBuffers = 8 - // we have 16384 * 16 bit = 32 * 1024 raw consecutive ADC samples, m_wbBuffers = 32 - int wbBuffers = 0; - if (io.mercuryFW > 32 || io.hermesFW > 11) - wbBuffers = BIGWIDEBANDSIZE / 512; - else - wbBuffers = SMALLWIDEBANDSIZE / 512; - - set->setWidebandBuffers(this, wbBuffers); - - if (set->getFirmwareVersionCheck()) - return checkFirmwareVersions(); - else - return true; -} - -// credits go to George Byrkit, K9TRV: the older FW checkings are shamelessly taken from the KISS Konsole! -bool DataEngine::checkFirmwareVersions() { - - if (io.metisFW != 0 && io.hpsdrDeviceName == "Hermes") { - - stop(); - - QString msg = "Metis selected, but Hermes found!"; - set->showWarningDialog(msg); - return false; - } - - if (io.hermesFW != 0 && io.hpsdrDeviceName == "Metis") { - - stop(); - - QString msg = "Hermes selected, but Metis found!"; - set->showWarningDialog(msg); - return false; - } - - if (io.penelopeFW == 0 && (set->getPenelopePresence() || set->getPennyLanePresence())) { - - stop(); - - QString msg = "Penelope or Pennylane selected, but firmware version = 0 !"; - set->showWarningDialog(msg); - return false; - } - - if (io.mercuryFW < 27 && set->getNumberOfReceivers() > 4 && io.hpsdrDeviceName == "Metis") { - - stop(); - - QString msg = "Mercury FW must be V2.7 or higher!"; - set->showWarningDialog(msg); - return false; - } - - if (io.hpsdrDeviceName == "Metis") { - - QString msg; - switch (io.metisFW) { - - case 13: - if (((set->getPenelopePresence() || set->getPennyLanePresence()) && - (io.penelopeFW == 13 || io.pennylaneFW == 13)) || - io.mercuryFW != 29) - { - stop(); - - msg = "Penny[Lane] FW Version V1.3 and Mercury FW V2.7 requires Metis FW V1.3!"; - set->showWarningDialog(msg); - return false; - } - break; - - case 14: - if (((set->getPenelopePresence() || set->getPennyLanePresence()) && - (io.penelopeFW == 14 || io.pennylaneFW == 14)) || - io.mercuryFW != 29) - { - stop(); - - msg = "Penny[Lane] FW Version V1.4 and Mercury FW V2.7 requires Metis FW V1.4!"; - set->showWarningDialog(msg); - return false; - } - break; - - case 15: - - if (((set->getPenelopePresence() || set->getPennyLanePresence()) && - (io.penelopeFW == 15 || io.pennylaneFW == 15)) || - io.mercuryFW != 30) - { - stop(); - - msg = "Penny[Lane] FW Version V1.5 and Mercury FW V3.0 requires Metis FW V1.5!"; - set->showWarningDialog(msg); - return false; - } - break; - - case 16: - - if (((set->getPenelopePresence() || set->getPennyLanePresence()) && - (io.penelopeFW == 16 || io.pennylaneFW == 16)) || - io.mercuryFW != 31) - { - stop(); - - msg = "Penny[Lane] FW Version V1.6 and Mercury FW V3.1 requires Metis FW V1.6!"; - set->showWarningDialog(msg); - return false; - } - break; - - case 17: - case 18: - - if (((set->getPenelopePresence() || set->getPennyLanePresence()) && - (io.penelopeFW == 17 || io.pennylaneFW == 17)) || - io.mercuryFW != 32) - { - stop(); - - msg = "Penny[Lane] FW Version V1.7 and Mercury FW V3.2 requires Metis FW V1.7 or V1.8!"; - set->showWarningDialog(msg); - return false; - } - break; - - case 19: - case 20: - - stop(); - - msg = "Metis FW V1.9 or V2.0 have some problems - please upgrade to Metis V2.1!"; - set->showWarningDialog(msg); - return false; - break; - - case 21: - - if ((set->getPenelopePresence() && io.penelopeFW != 17) || - (set->getPennyLanePresence() && io.pennylaneFW != 17)|| - io.mercuryFW != 33) - { - stop(); - - msg = "Penny[Lane] FW Version V1.7 and Mercury FW V3.3 required for Metis FW V2.1!"; - set->showWarningDialog(msg); - return false; - } - break; - -// case 22: -// -// if ((set->getPenelopePresence() && m_penelopeFW != 17) || -// (set->getPennyLanePresence() && m_pennylaneFW != 17)|| -// m_mercuryFW != 33) -// { -// stop(); -// -// msg = "Penny[Lane] FW Version V1.7 and Mercury FW V3.3 required for Metis FW >= V2.1!"; -// set->showWarningDialog(msg); -// return false; -// } -// break; - - case 26: - - if ((set->getPenelopePresence() && io.penelopeFW != 18) || - (set->getPennyLanePresence() && io.pennylaneFW != 18)|| - io.mercuryFW != 34) - { - stop(); - - msg = "Penny[Lane] FW Version V1.8 and Mercury FW V3.4 required for Metis FW V2.6!"; - set->showWarningDialog(msg); - return false; - } - break; - - default: - - //stop(); - - msg = "Not a standard Metis FW version !"; - set->showWarningDialog(msg); - //return false; - return true; - } - } - - if (io.mercuryFW < 33 && set->getNumberOfReceivers() > 4 && io.hpsdrDeviceName == "Metis") { - - stop(); - - QString msg = "Mercury FW < V3.3 has only 4 receivers!"; - set->showWarningDialog(msg); - return false; - } - - if (io.hermesFW < 18 && set->getNumberOfReceivers() > 2 && io.hpsdrDeviceName == "Hermes") { - - stop(); - - QString msg = "Hermes FW < V1.8 has only 2 receivers!"; - set->showWarningDialog(msg); - return false; - } - - return true; -} - -bool DataEngine::start() { - - m_fwCount = 0; - m_sendState = 0; - - int rcvrs = set->getNumberOfReceivers(); - if (!initReceivers(rcvrs)) return false; - - if (!m_dataIO) createDataIO(); - - if (!m_dataProcessor) createDataProcessor(); - - if (m_serverMode == QSDR::SDRMode && !m_wbDataProcessor) - createWideBandDataProcessor(); - - if ((m_serverMode == QSDR::ChirpWSPR) && !m_chirpProcessor) - createChirpDataProcessor(); - - switch (m_serverMode) { - - //case QSDR::ExternalDSP: - - /* - //CHECKED_CONNECT( - // set, - // SIGNAL(frequencyChanged(QObject*, bool, int, long)), - // this, - // SLOT(setFrequency(QObject*, bool, int, long))); - - //if (!m_audioProcessorRunning) { - - // //if (!m_audioProcessor) createAudioProcessor(); - // if (!m_audioReceiver) createAudioReceiver(); - - // m_audioInProcThread->start(); - // if (m_audioInProcThread->isRunning()) { - // - // m_audioInProcThreadRunning = true; - // DATA_ENGINE_DEBUG << "Audio processor process started."; - // } - // else { - - // m_audioInProcThreadRunning = false; - // setSystemState( - // QSDR::AudioThreadError, - // m_hwInterface, - // m_serverMode, - // QSDR::DataEngineDown); - // return false; - // } - // - // io.audio_rx = 0; - // io.clientList.append(0); - - // m_audioProcessorRunning = true; - // setSystemState( - // QSDR::NoError, - // m_hwInterface, - // m_serverMode, - // QSDR::DataEngineUp); - //} - */ - //return false; - - case QSDR::SDRMode: - - setTimeStamp(this, false); - break; - - case QSDR::ChirpWSPR: - //case QSDR::ChirpWSPRFile: - - // turn time stamping on - setTimeStamp(this, true); - - if (!startChirpDataProcessor(QThread::NormalPriority)) { - - DATA_ENGINE_DEBUG << "data processor thread could not be started."; - return false; - } - - //RX.at(0)->setConnectedStatus(true); - - CHECKED_CONNECT( - set, - SIGNAL(ctrFrequencyChanged(QObject *, int, int, long)), - this, - SLOT(setFrequency(QObject *, int, int, long))); - - break; - - default: - - DATA_ENGINE_DEBUG << "no valid server mode"; - - setSystemState(QSDR::ServerModeError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - return false; - } // end switch (m_serverMode) - - set->setRxList(RX); - connectDSPSlots(); - - for (int i = 0; i < rcvrs; i++) { - - RX.at(i)->setConnectedStatus(true); - RX.at(i)->setAudioVolume(this, i, RX.at(i)->getAudioVolume()); - setFrequency(this, true, i, set->getCtrFrequencies().at(i)); - - //CHECKED_CONNECT( - // RX.at(i), - // SIGNAL(outputBufferSignal(int, const CPX &)), - // this, //m_dataProcessor, - // SLOT(setOutputBuffer(int, const CPX &))); - - CHECKED_CONNECT( - RX.at(i), - SIGNAL(outputBufferSignal(int, const CPX &)), - m_dataProcessor, - SLOT(setOutputBuffer(int, const CPX &))); - - m_dspThreadList.at(i)->start(QThread::NormalPriority);//QThread::TimeCriticalPriority); - - if (m_dspThreadList.at(i)->isRunning()) { - - //m_dataProcThreadRunning = true; - io.networkIOMutex.lock(); - DATA_ENGINE_DEBUG << "receiver processor thread started for Rx " << i; - io.networkIOMutex.unlock(); - } - else { - - //m_dataProcThreadRunning = false; - //setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - return false; - } - } - - if (m_serverMode != QSDR::ChirpWSPR && !startWideBandDataProcessor(QThread::NormalPriority)) { - - DATA_ENGINE_DEBUG << "wide band data processor thread could not be started."; - return false; - } - - // data IO thread -// if (!startDataIO(QThread::HighPriority)) {// ::NormalPriority)) { -// -// DATA_ENGINE_DEBUG << "data receiver thread could not be started."; -// return false; -// } - - // IQ data processing thread - if (!startDataProcessor(QThread::NormalPriority)) { - - DATA_ENGINE_DEBUG << "data processor thread could not be started."; - return false; - } - - // data IO thread - if (!startDataIO(QThread::NormalPriority)) {// ::NormalPriority::HighPriority)) { - - DATA_ENGINE_DEBUG << "data IO thread could not be started."; - return false; - } - - // start Sync,ADC and S-Meter timers - //m_SyncChangedTime.start(); - //m_ADCChangedTime.start(); - //m_smeterTime.start(); - - // start the "frames-per-second" timer for all receivers - for (int i = 0; i < rcvrs; i++) - RX.at(i)->highResTimer->start(); - - // just give them a little time.. - SleeperThread::msleep(100); - - // pre-conditioning + + QString str = "Initializing %1 receiver(s)...please wait"; + set->setSystemMessage(str.arg(set->getNumberOfReceivers()), rcvrs * 500); + + if (!initReceivers(rcvrs)) return false; + + + if (!m_dataIO) createDataIO(); + + if (!m_dataProcessor) createDataProcessor(); + + switch (m_serverMode) { + + case QSDR::SDRMode: + + for (int i = 0; i < set->getNumberOfReceivers(); i++) { + + RX.at(i)->setConnectedStatus(true); + } + setTimeStamp(this, false); + break; + + default: + + DATA_ENGINE_DEBUG << "no valid server mode"; + setSystemState(QSDR::ServerModeError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + + return false; + } + + set->setRxList(RX); + connectDSPSlots(); + + for (int i = 0; i < set->getNumberOfReceivers(); i++) + RX.at(i)->setAudioVolume(this, i, 0.0f); + + // IQ data processing thread + if (!startDataProcessor(QThread::NormalPriority)) { + + DATA_ENGINE_DEBUG << "data processor thread could not be started."; + return false; + } + + // data IO thread + if (!startDataIO(QThread::NormalPriority)) {// ::NormalPriority)) { + + DATA_ENGINE_DEBUG << "data IO thread could not be started."; + return false; + } + + //setSampleRate(this, set->getSampleRate()); + SleeperThread::msleep(100); + + // pre-conditioning for (int i = 0; i < io.receivers; i++) - m_dataIO->sendInitFramesToNetworkDevice(i); - - if (m_serverMode == QSDR::SDRMode && set->getWidebandData()) - m_dataIO->networkDeviceStartStop(0x03); // 0x03 for starting the device with wide band data - else - m_dataIO->networkDeviceStartStop(0x01); // 0x01 for starting the device without wide band data - - m_networkDeviceRunning = true; - - setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineUp); - set->setSystemMessage("System running", 4000); - - DATA_ENGINE_DEBUG << "Data Engine thread: " << this->thread(); - - return true; -} - -void DataEngine::stop() { - - if (m_dataEngineState == QSDR::DataEngineUp) { - - switch (m_hwInterface) { - - case QSDR::Metis: - case QSDR::Hermes: - - // turn time stamping off - setTimeStamp(this, false); - - // stop the device - m_dataIO->networkDeviceStartStop(0); - m_networkDeviceRunning = false; - DATA_ENGINE_DEBUG << "HPSDR device stopped"; - - // stop the threads - //SleeperThread::msleep(100); - stopDataIO(); - SleeperThread::msleep(100); - stopDataProcessor(); - //stopChirpDataProcessor(); - if (m_wbDataProcessor) - stopWideBandDataProcessor(); - - // clear device list - SleeperThread::msleep(100); - set->clearMetisCardList(); - DATA_ENGINE_DEBUG << "device cards list cleared."; - break; - - case QSDR::NoInterfaceMode: - - stopDataIO(); - - DATA_ENGINE_DEBUG << "data queue count: " << io.data_queue.count(); - DATA_ENGINE_DEBUG << "chirp queue count: " << io.chirp_queue.count(); - - stopDataProcessor(); - stopChirpDataProcessor(); - } - - while (!io.au_queue.isEmpty()) - io.au_queue.dequeue(); - - // clear receiver thread list - foreach (QThread* thread, m_dspThreadList) { - - thread->quit(); - thread->wait(); - } - qDeleteAll(m_dspThreadList.begin(), m_dspThreadList.end()); - m_dspThreadList.clear(); - - // clear receiver list - foreach (Receiver *rx, RX) { - - rx->stop(); - rx->setConnectedStatus(false); - disconnectDSPSlots(); - - disconnect( - rx, - SIGNAL(spectrumBufferChanged(int, const qVectorFloat&)), - set, - SLOT(setSpectrumBuffer(int, const qVectorFloat&))); - - disconnect( - rx, - SIGNAL(sMeterValueChanged(int, float)), - set, - SLOT(setSMeterValue(int, float))); - - /*disconnect( - rx, - SIGNAL(outputBufferSignal(int, const CPX &)), - this, - SLOT(setOutputBuffer(int, const CPX &)));*/ - - /*disconnect( - rx, - SIGNAL(outputBufferSignal(int, const CPX &)), - m_dataProcessor, - SLOT(setOutputBuffer(int, const CPX &)));*/ - - //rx->deleteDSPInterface(); - //DATA_ENGINE_DEBUG << "DSP core deleted."; - } - qDeleteAll(RX.begin(), RX.end()); - RX.clear(); - set->setRxList(RX); - DATA_ENGINE_DEBUG << "receiver threads deleted, receivers deleted, receiver & thread list cleared."; - set->setSystemMessage("Data engine shut down.", 4000); - - setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - } - - m_rxSamples = 0; - m_chirpSamples = 0; - m_restart = true; - m_found = 0; - m_hpsdrDevices = 0; - - set->setMercuryVersion(0); - set->setPenelopeVersion(0); - set->setMetisVersion(0); - set->setHermesVersion(0); - - //set->setPeakHold(false); - //set->resetWidebandSpectrumBuffer(); - - /*disconnect( - set, - SIGNAL(ctrFrequencyChanged(QObject*, int, int, long)), - this, - SLOT(setFrequency(QObject*, int, int, long)));*/ - - DATA_ENGINE_DEBUG << "shut down done."; -} - -bool DataEngine::initDataEngine() { - -#ifdef TESTING - qDebug() << "************************** TESTING MODUS ***********************************"; - return start(); -#endif - - if (m_hwInterface == QSDR::NoInterfaceMode) { - - return startDataEngineWithoutConnection(); - } - else { - - if (findHPSDRDevices()) { - - if (io.mercuryFW > 0 || io.hermesFW > 0) { - - stop(); - DATA_ENGINE_DEBUG << "got firmware versions:"; - DATA_ENGINE_DEBUG << " Metis firmware: " << io.metisFW; - DATA_ENGINE_DEBUG << " Mercury firmware: " << io.mercuryFW; - DATA_ENGINE_DEBUG << " Penelope firmware: " << io.penelopeFW; - DATA_ENGINE_DEBUG << " Pennylane firmware: " << io.pennylaneFW; - DATA_ENGINE_DEBUG << " Hermes firmware: " << io.hermesFW; - DATA_ENGINE_DEBUG << "stopping and restarting data engine."; - - return start(); - } - else { - - DATA_ENGINE_DEBUG << "did not get firmware versions!"; - setSystemState(QSDR::FirmwareError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - } - } - } - return false; -} - -bool DataEngine::initReceivers(int rcvrs) { - - for (int i = 0; i < rcvrs; i++) { - - Receiver *rx = new Receiver(i); - - // init the DSP core - DATA_ENGINE_DEBUG << "trying to init a DSP core for rx " << i; - - if (rx->initDSPInterface()) { - - DATA_ENGINE_DEBUG << "init DSP core for rx " << i << " successful !"; - - rx->setConnectedStatus(false); - rx->setServerMode(m_serverMode); - - // create dsp thread - QThreadEx* thread = new QThreadEx(); - rx->moveToThread(thread); - - //CHECKED_CONNECT(this, SIGNAL(doDSP()), rx, SLOT(dspProcessing())); - - CHECKED_CONNECT( - rx, - SIGNAL(spectrumBufferChanged(int, const qVectorFloat&)), - set, - SLOT(setSpectrumBuffer(int, const qVectorFloat&))); - - CHECKED_CONNECT( - rx, - SIGNAL(sMeterValueChanged(int, float)), - set, - SLOT(setSMeterValue(int, float))); - - /*CHECKED_CONNECT( - rx, - SIGNAL(outputBufferSignal(int, const CPX &)), - m_dataProcessor, - SLOT(setOutputBuffer(int, const CPX &)));*/ - - m_dspThreadList.append(thread); - RX.append(rx); - } - else { - - return false; - } - } - - set->setRxList(RX); - - m_txFrame = 0; - - io.currentReceiver = 0; - io.receivers = rcvrs; - - io.timing = 0; - m_configure = io.receivers + 1; - - // init cc Rc parameters - io.ccRx.devices.mercuryFWVersion = 0; - io.ccRx.devices.penelopeFWVersion = 0; - io.ccRx.devices.pennylaneFWVersion = 0; - io.ccRx.devices.hermesFWVersion = 0; - io.ccRx.devices.metisFWVersion = 0; - - io.ccRx.ptt = false; - io.ccRx.dash = false; - io.ccRx.dot = false; - io.ccRx.lt2208 = false; - io.ccRx.ain1 = 0; - io.ccRx.ain2 = 0; - io.ccRx.ain3 = 0; - io.ccRx.ain4 = 0; - io.ccRx.ain5 = 0; - io.ccRx.ain6 = 0; - io.ccRx.hermesI01 = false; - io.ccRx.hermesI02 = false; - io.ccRx.hermesI03 = false; - io.ccRx.hermesI04 = false; - io.ccRx.mercury1_LT2208 = false; - io.ccRx.mercury2_LT2208 = false; - io.ccRx.mercury3_LT2208 = false; - io.ccRx.mercury4_LT2208 = false; - - // init cc Tx parameters - io.ccTx.currentBand = RX.at(0)->getHamBand(); - io.ccTx.mercuryAttenuators = RX.at(0)->getMercuryAttenuators(); - io.ccTx.mercuryAttenuator = RX.at(0)->getMercuryAttenuators().at(io.ccTx.currentBand); - io.ccTx.dither = set->getMercuryDither(); - io.ccTx.random = set->getMercuryRandom(); - io.ccTx.duplex = 1; - io.ccTx.mox = false; - io.ccTx.ptt = false; - io.ccTx.alexStates = set->getAlexStates(); - io.ccTx.vnaMode = false; - io.ccTx.alexConfig = set->getAlexConfig(); - io.ccTx.timeStamp = 0; - io.ccTx.commonMercuryFrequencies = 0; - io.ccTx.pennyOCenabled = set->getPennyOCEnabled(); - io.ccTx.rxJ6pinList = set->getRxJ6Pins(); - io.ccTx.txJ6pinList = set->getTxJ6Pins(); - - setAlexConfiguration(io.ccTx.alexConfig); - - io.rxClass = set->getRxClass(); - io.mic_gain = 0.26F; - io.rx_freq_change = -1; - io.tx_freq_change = -1; - io.clients = 0; - io.sendIQ_toggle = true; - io.rcveIQ_toggle = false; - io.alexForwardVolts = 0.0; - io.alexReverseVolts = 0.0; - io.alexForwardPower = 0.0; - io.alexReversePower = 0.0; - io.penelopeForwardVolts = 0.0; - io.penelopeForwardPower = 0.0; - io.ain3Volts = 0.0; - io.ain4Volts = 0.0; - io.supplyVolts = 0.0f; - - - //***************************** - // C&C bytes - for (int i = 0; i < 5; i++) { - - io.control_in[i] = 0x00; - io.control_out[i] = 0x00; - } - - // C0 - // 0 0 0 0 0 0 0 0 - // | - // +------------ MOX (1 = active, 0 = inactive) - - io.control_out[0] |= MOX_DISABLED; - - // set C1 - // - // 0 0 0 0 0 0 0 0 - // | | | | | | | | - // | | | | | | + +------------ Speed (00 = 48kHz, 01 = 96kHz, 10 = 192kHz) - // | | | | + +---------------- 10MHz Ref. (00 = Atlas/Excalibur, 01 = Penelope, 10 = Mercury)* - // | | | +-------------------- 122.88MHz source (0 = Penelope, 1 = Mercury)* - // | + +---------------------- Config (00 = nil, 01 = Penelope, 10 = Mercury, 11 = both)* - // +-------------------------- Mic source (0 = Janus, 1 = Penelope)* - - // Bits 1,0 - setSampleRate(this, set->getSampleRate()); - - // Bits 7,..,2 - setHPSDRConfig(); - - io.control_out[1] &= 0x03; // 0 0 0 0 0 0 1 1 - io.control_out[1] |= io.ccTx.clockByte; - - // set C2 - // - // 0 0 0 0 0 0 0 0 - // | | | - // | | +------------ Mode (1 = Class E, 0 = All other modes) - // +---------- +-------------- Open Collector Outputs on Penelope or Hermes (bit 6..bit 0) - - io.control_out[2] = io.control_out[2] & 0xFE; // 1 1 1 1 1 1 1 0 - io.control_out[2] = io.control_out[2] | io.rxClass; - - // set C3 - // - // 0 0 0 0 0 0 0 0 - // | | | | | | | | - // | | | | | | + +------------ Alex Attenuator (00 = 0dB, 01 = 10dB, 10 = 20dB, 11 = 30dB) - // | | | | | +---------------- Preamp On/Off (0 = Off, 1 = On) - // | | | | +------------------ LT2208 Dither (0 = Off, 1 = On) - // | | | + ------------------- LT2208 Random (0= Off, 1 = On) - // | + + --------------------- Alex Rx Antenna (00 = none, 01 = Rx1, 10 = Rx2, 11 = XV) - // + ------------------------- Alex Rx out (0 = off, 1 = on). Set if Alex Rx Antenna > 00. - - io.control_out[3] = io.control_out[3] & 0xFB; // 1 1 1 1 1 0 1 1 - io.control_out[3] = io.control_out[3] | (io.ccTx.mercuryAttenuator << 2); - - io.control_out[3] = io.control_out[3] & 0xF7; // 1 1 1 1 0 1 1 1 - io.control_out[3] = io.control_out[3] | (io.ccTx.dither << 3); - - io.control_out[3] = io.control_out[3] & 0xEF; // 1 1 1 0 1 1 1 1 - io.control_out[3] = io.control_out[3] | (io.ccTx.random << 4); - - // set C4 - // - // 0 0 0 0 0 0 0 0 - // | | | | | | | | - // | | | | | | + + ----------- Alex Tx relay (00 = Tx1, 01= Tx2, 10 = Tx3) - // | | | | | + --------------- Duplex (0 = off, 1 = on) - // + + + + +------------------ Number of Receivers (00000 = 1, 11111 = 32) + m_dataIO->sendInitFramesToNetworkDevice(i); + + if (m_serverMode == QSDR::SDRMode) + m_dataIO->networkDeviceStartStop(0x01); // 0x01 for starting Metis without wide band data + + m_networkDeviceRunning = true; + setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineUp); + SleeperThread::msleep(300); + + io.metisFW = set->getMetisVersion(); + io.mercuryFW = set->getMercuryVersion(); + io.penelopeFW = set->getPenelopeVersion(); + io.pennylaneFW = set->getPennyLaneVersion(); + io.hermesFW = set->getHermesVersion(); + + // if we have 4096 * 16 bit = 8 * 1024 raw consecutive ADC samples, m_wbBuffers = 8 + // we have 16384 * 16 bit = 32 * 1024 raw consecutive ADC samples, m_wbBuffers = 32 + int wbBuffers = 0; + if (io.mercuryFW > 32 || io.hermesFW > 11) + wbBuffers = BIGWIDEBANDSIZE / 512; + else + wbBuffers = SMALLWIDEBANDSIZE / 512; + + set->setWidebandBuffers(this, wbBuffers); + + if (set->getFirmwareVersionCheck()) + return checkFirmwareVersions(); + else + return true; +} + +// credits go to George Byrkit, K9TRV: the older FW checkings are shamelessly taken from the KISS Konsole! +bool DataEngine::checkFirmwareVersions() { + + if (io.metisFW != 0 && io.hpsdrDeviceName == "Hermes") { + + stop(); + + QString msg = "Metis selected, but Hermes found!"; + set->showWarningDialog(msg); + return false; + } + + if (io.hermesFW != 0 && io.hpsdrDeviceName == "Metis") { + + stop(); + + QString msg = "Hermes selected, but Metis found!"; + set->showWarningDialog(msg); + return false; + } + + if (io.penelopeFW == 0 && (set->getPenelopePresence() || set->getPennyLanePresence())) { + + stop(); + + QString msg = "Penelope or Pennylane selected, but firmware version = 0 !"; + set->showWarningDialog(msg); + return false; + } + + if (io.mercuryFW < 27 && set->getNumberOfReceivers() > 4 && io.hpsdrDeviceName == "Metis") { + + stop(); + + QString msg = "Mercury FW must be V2.7 or higher!"; + set->showWarningDialog(msg); + return false; + } + + if (io.hpsdrDeviceName == "Metis") { + + QString msg; + switch (io.metisFW) { + + case 13: + if (((set->getPenelopePresence() || set->getPennyLanePresence()) && + (io.penelopeFW == 13 || io.pennylaneFW == 13)) || + io.mercuryFW != 29) + { + stop(); + + msg = "Penny[Lane] FW Version V1.3 and Mercury FW V2.7 requires Metis FW V1.3!"; + set->showWarningDialog(msg); + return false; + } + break; + + case 14: + if (((set->getPenelopePresence() || set->getPennyLanePresence()) && + (io.penelopeFW == 14 || io.pennylaneFW == 14)) || + io.mercuryFW != 29) + { + stop(); + + msg = "Penny[Lane] FW Version V1.4 and Mercury FW V2.7 requires Metis FW V1.4!"; + set->showWarningDialog(msg); + return false; + } + break; + + case 15: + + if (((set->getPenelopePresence() || set->getPennyLanePresence()) && + (io.penelopeFW == 15 || io.pennylaneFW == 15)) || + io.mercuryFW != 30) + { + stop(); + + msg = "Penny[Lane] FW Version V1.5 and Mercury FW V3.0 requires Metis FW V1.5!"; + set->showWarningDialog(msg); + return false; + } + break; + + case 16: + + if (((set->getPenelopePresence() || set->getPennyLanePresence()) && + (io.penelopeFW == 16 || io.pennylaneFW == 16)) || + io.mercuryFW != 31) + { + stop(); + + msg = "Penny[Lane] FW Version V1.6 and Mercury FW V3.1 requires Metis FW V1.6!"; + set->showWarningDialog(msg); + return false; + } + break; + + case 17: + case 18: + + if (((set->getPenelopePresence() || set->getPennyLanePresence()) && + (io.penelopeFW == 17 || io.pennylaneFW == 17)) || + io.mercuryFW != 32) + { + stop(); + + msg = "Penny[Lane] FW Version V1.7 and Mercury FW V3.2 requires Metis FW V1.7 or V1.8!"; + set->showWarningDialog(msg); + return false; + } + break; + + case 19: + case 20: + + stop(); + + msg = "Metis FW V1.9 or V2.0 have some problems - please upgrade to Metis V2.1!"; + set->showWarningDialog(msg); + return false; + break; + + case 21: + + if ((set->getPenelopePresence() && io.penelopeFW != 17) || + (set->getPennyLanePresence() && io.pennylaneFW != 17)|| + io.mercuryFW != 33) + { + stop(); + + msg = "Penny[Lane] FW Version V1.7 and Mercury FW V3.3 required for Metis FW V2.1!"; + set->showWarningDialog(msg); + return false; + } + break; + +// case 22: +// +// if ((set->getPenelopePresence() && m_penelopeFW != 17) || +// (set->getPennyLanePresence() && m_pennylaneFW != 17)|| +// m_mercuryFW != 33) +// { +// stop(); +// +// msg = "Penny[Lane] FW Version V1.7 and Mercury FW V3.3 required for Metis FW >= V2.1!"; +// set->showWarningDialog(msg); +// return false; +// } +// break; + + case 26: + + if ((set->getPenelopePresence() && io.penelopeFW != 18) || + (set->getPennyLanePresence() && io.pennylaneFW != 18)|| + io.mercuryFW != 34) + { + stop(); + + msg = "Penny[Lane] FW Version V1.8 and Mercury FW V3.4 required for Metis FW V2.6!"; + set->showWarningDialog(msg); + return false; + } + break; + + default: + + //stop(); + + msg = "Not a standard Metis FW version !"; + set->showWarningDialog(msg); + //return false; + return true; + } + } + + if (io.mercuryFW < 33 && set->getNumberOfReceivers() > 4 && io.hpsdrDeviceName == "Metis") { + + stop(); + + QString msg = "Mercury FW < V3.3 has only 4 receivers!"; + set->showWarningDialog(msg); + return false; + } + + if (io.hermesFW < 18 && set->getNumberOfReceivers() > 2 && io.hpsdrDeviceName == "Hermes") { + + stop(); + + QString msg = "Hermes FW < V1.8 has only 2 receivers!"; + set->showWarningDialog(msg); + return false; + } + + return true; +} + +bool DataEngine::start() { + + m_fwCount = 0; + m_sendState = 0; + + int rcvrs = set->getNumberOfReceivers(); + if (!initReceivers(rcvrs)) return false; + + if (!m_dataIO) createDataIO(); + + if (!m_dataProcessor) createDataProcessor(); + + if (m_serverMode == QSDR::SDRMode && !m_wbDataProcessor) + createWideBandDataProcessor(); + + if ((m_serverMode == QSDR::ChirpWSPR) && !m_chirpProcessor) + createChirpDataProcessor(); + + switch (m_serverMode) { + + //case QSDR::ExternalDSP: + + /* + //CHECKED_CONNECT( + // set, + // SIGNAL(frequencyChanged(QObject*, bool, int, long)), + // this, + // SLOT(setFrequency(QObject*, bool, int, long))); + + //if (!m_audioProcessorRunning) { + + // //if (!m_audioProcessor) createAudioProcessor(); + // if (!m_audioReceiver) createAudioReceiver(); + + // m_audioInProcThread->start(); + // if (m_audioInProcThread->isRunning()) { + // + // m_audioInProcThreadRunning = true; + // DATA_ENGINE_DEBUG << "Audio processor process started."; + // } + // else { + + // m_audioInProcThreadRunning = false; + // setSystemState( + // QSDR::AudioThreadError, + // m_hwInterface, + // m_serverMode, + // QSDR::DataEngineDown); + // return false; + // } + // + // io.audio_rx = 0; + // io.clientList.append(0); + + // m_audioProcessorRunning = true; + // setSystemState( + // QSDR::NoError, + // m_hwInterface, + // m_serverMode, + // QSDR::DataEngineUp); + //} + */ + //return false; + + case QSDR::SDRMode: + + setTimeStamp(this, false); + break; + + case QSDR::ChirpWSPR: + //case QSDR::ChirpWSPRFile: + + // turn time stamping on + setTimeStamp(this, true); + + if (!startChirpDataProcessor(QThread::NormalPriority)) { + + DATA_ENGINE_DEBUG << "data processor thread could not be started."; + return false; + } + + //RX.at(0)->setConnectedStatus(true); + + CHECKED_CONNECT( + set, + SIGNAL(ctrFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(setFrequency(QObject *, int, int, long))); + + break; + + default: + + DATA_ENGINE_DEBUG << "no valid server mode"; + + setSystemState(QSDR::ServerModeError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } // end switch (m_serverMode) + + set->setRxList(RX); + connectDSPSlots(); + + for (int i = 0; i < rcvrs; i++) { + + RX.at(i)->setConnectedStatus(true); + RX.at(i)->setAudioVolume(this, i, RX.at(i)->getAudioVolume()); + setFrequency(this, true, i, set->getCtrFrequencies().at(i)); + + //CHECKED_CONNECT( + // RX.at(i), + // SIGNAL(outputBufferSignal(int, const CPX &)), + // this, //m_dataProcessor, + // SLOT(setOutputBuffer(int, const CPX &))); + + CHECKED_CONNECT( + RX.at(i), + SIGNAL(outputBufferSignal(int, const CPX &)), + m_dataProcessor, + SLOT(setOutputBuffer(int, const CPX &))); + + m_dspThreadList.at(i)->start(QThread::NormalPriority);//QThread::TimeCriticalPriority); + + if (m_dspThreadList.at(i)->isRunning()) { + + //m_dataProcThreadRunning = true; + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "receiver processor thread started for Rx " << i; + io.networkIOMutex.unlock(); + } + else { + + //m_dataProcThreadRunning = false; + //setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } + } + + if (m_serverMode != QSDR::ChirpWSPR && !startWideBandDataProcessor(QThread::NormalPriority)) { + + DATA_ENGINE_DEBUG << "wide band data processor thread could not be started."; + return false; + } + + // data IO thread +// if (!startDataIO(QThread::HighPriority)) {// ::NormalPriority)) { +// +// DATA_ENGINE_DEBUG << "data receiver thread could not be started."; +// return false; +// } + + // IQ data processing thread + if (!startDataProcessor(QThread::NormalPriority)) { + + DATA_ENGINE_DEBUG << "data processor thread could not be started."; + return false; + } + + // data IO thread + if (!startDataIO(QThread::NormalPriority)) {// ::NormalPriority::HighPriority)) { + + DATA_ENGINE_DEBUG << "data IO thread could not be started."; + return false; + } + + // start Sync,ADC and S-Meter timers + //m_SyncChangedTime.start(); + //m_ADCChangedTime.start(); + //m_smeterTime.start(); + + // start the "frames-per-second" timer for all receivers + for (int i = 0; i < rcvrs; i++) + RX.at(i)->highResTimer->start(); + + // just give them a little time.. + SleeperThread::msleep(100); + + // pre-conditioning + for (int i = 0; i < io.receivers; i++) + m_dataIO->sendInitFramesToNetworkDevice(i); + + if (m_serverMode == QSDR::SDRMode && set->getWidebandData()) + m_dataIO->networkDeviceStartStop(0x03); // 0x03 for starting the device with wide band data + else + m_dataIO->networkDeviceStartStop(0x01); // 0x01 for starting the device without wide band data + + m_networkDeviceRunning = true; + + setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineUp); + set->setSystemMessage("System running", 4000); + + DATA_ENGINE_DEBUG << "Data Engine thread: " << this->thread(); + + return true; +} + +void DataEngine::stop() { + + if (m_dataEngineState == QSDR::DataEngineUp) { + + switch (m_hwInterface) { + + case QSDR::Metis: + case QSDR::Hermes: + + // turn time stamping off + setTimeStamp(this, false); + + // stop the device + m_dataIO->networkDeviceStartStop(0); + m_networkDeviceRunning = false; + DATA_ENGINE_DEBUG << "HPSDR device stopped"; + + // stop the threads + //SleeperThread::msleep(100); + stopDataIO(); + SleeperThread::msleep(100); + stopDataProcessor(); + //stopChirpDataProcessor(); + if (m_wbDataProcessor) + stopWideBandDataProcessor(); + + // clear device list + SleeperThread::msleep(100); + set->clearMetisCardList(); + DATA_ENGINE_DEBUG << "device cards list cleared."; + break; + + case QSDR::NoInterfaceMode: + + stopDataIO(); + + DATA_ENGINE_DEBUG << "data queue count: " << io.data_queue.count(); + DATA_ENGINE_DEBUG << "chirp queue count: " << io.chirp_queue.count(); + + stopDataProcessor(); + stopChirpDataProcessor(); + } + + while (!io.au_queue.isEmpty()) + io.au_queue.dequeue(); + + // clear receiver thread list + foreach (QThread* thread, m_dspThreadList) { + + thread->quit(); + thread->wait(); + } + qDeleteAll(m_dspThreadList.begin(), m_dspThreadList.end()); + m_dspThreadList.clear(); + + // clear receiver list + foreach (Receiver *rx, RX) { + + rx->stop(); + rx->setConnectedStatus(false); + disconnectDSPSlots(); + + disconnect( + rx, + SIGNAL(spectrumBufferChanged(int, const qVectorFloat&)), + set, + SLOT(setSpectrumBuffer(int, const qVectorFloat&))); + + disconnect( + rx, + SIGNAL(sMeterValueChanged(int, float)), + set, + SLOT(setSMeterValue(int, float))); + + /*disconnect( + rx, + SIGNAL(outputBufferSignal(int, const CPX &)), + this, + SLOT(setOutputBuffer(int, const CPX &)));*/ + + /*disconnect( + rx, + SIGNAL(outputBufferSignal(int, const CPX &)), + m_dataProcessor, + SLOT(setOutputBuffer(int, const CPX &)));*/ + + //rx->deleteDSPInterface(); + //DATA_ENGINE_DEBUG << "DSP core deleted."; + } + qDeleteAll(RX.begin(), RX.end()); + RX.clear(); + set->setRxList(RX); + DATA_ENGINE_DEBUG << "receiver threads deleted, receivers deleted, receiver & thread list cleared."; + set->setSystemMessage("Data engine shut down.", 4000); + + setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + } + + m_rxSamples = 0; + m_chirpSamples = 0; + m_restart = true; + m_found = 0; + m_hpsdrDevices = 0; + + set->setMercuryVersion(0); + set->setPenelopeVersion(0); + set->setMetisVersion(0); + set->setHermesVersion(0); + + //set->setPeakHold(false); + //set->resetWidebandSpectrumBuffer(); + + /*disconnect( + set, + SIGNAL(ctrFrequencyChanged(QObject*, int, int, long)), + this, + SLOT(setFrequency(QObject*, int, int, long)));*/ + + DATA_ENGINE_DEBUG << "shut down done."; +} + +bool DataEngine::initDataEngine() { + +#ifdef TESTING + qDebug() << "************************** TESTING MODUS ***********************************"; + return start(); +#endif + + if (m_hwInterface == QSDR::NoInterfaceMode) { + + return startDataEngineWithoutConnection(); + } + else { + + if (findHPSDRDevices()) { + + if (io.mercuryFW > 0 || io.hermesFW > 0) { + + stop(); + DATA_ENGINE_DEBUG << "got firmware versions:"; + DATA_ENGINE_DEBUG << " Metis firmware: " << io.metisFW; + DATA_ENGINE_DEBUG << " Mercury firmware: " << io.mercuryFW; + DATA_ENGINE_DEBUG << " Penelope firmware: " << io.penelopeFW; + DATA_ENGINE_DEBUG << " Pennylane firmware: " << io.pennylaneFW; + DATA_ENGINE_DEBUG << " Hermes firmware: " << io.hermesFW; + DATA_ENGINE_DEBUG << "stopping and restarting data engine."; + + return start(); + } + else { + + DATA_ENGINE_DEBUG << "did not get firmware versions!"; + setSystemState(QSDR::FirmwareError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + } + } + } + return false; +} + +bool DataEngine::initReceivers(int rcvrs) { + + for (int i = 0; i < rcvrs; i++) { + + Receiver *rx = new Receiver(i); + + // init the DSP core + DATA_ENGINE_DEBUG << "trying to init a DSP core for rx " << i; + + if (rx->initDSPInterface()) { + + DATA_ENGINE_DEBUG << "init DSP core for rx " << i << " successful !"; + + rx->setConnectedStatus(false); + rx->setServerMode(m_serverMode); + + // create dsp thread + QThreadEx* thread = new QThreadEx(); + rx->moveToThread(thread); + + //CHECKED_CONNECT(this, SIGNAL(doDSP()), rx, SLOT(dspProcessing())); + + CHECKED_CONNECT( + rx, + SIGNAL(spectrumBufferChanged(int, const qVectorFloat&)), + set, + SLOT(setSpectrumBuffer(int, const qVectorFloat&))); + + CHECKED_CONNECT( + rx, + SIGNAL(sMeterValueChanged(int, float)), + set, + SLOT(setSMeterValue(int, float))); + + /*CHECKED_CONNECT( + rx, + SIGNAL(outputBufferSignal(int, const CPX &)), + m_dataProcessor, + SLOT(setOutputBuffer(int, const CPX &)));*/ + + m_dspThreadList.append(thread); + RX.append(rx); + } + else { + + return false; + } + } + + set->setRxList(RX); + + m_txFrame = 0; + + io.currentReceiver = 0; + io.receivers = rcvrs; + + io.timing = 0; + m_configure = io.receivers + 1; + + // init cc Rc parameters + io.ccRx.devices.mercuryFWVersion = 0; + io.ccRx.devices.penelopeFWVersion = 0; + io.ccRx.devices.pennylaneFWVersion = 0; + io.ccRx.devices.hermesFWVersion = 0; + io.ccRx.devices.metisFWVersion = 0; + + io.ccRx.ptt = false; + io.ccRx.dash = false; + io.ccRx.dot = false; + io.ccRx.lt2208 = false; + io.ccRx.ain1 = 0; + io.ccRx.ain2 = 0; + io.ccRx.ain3 = 0; + io.ccRx.ain4 = 0; + io.ccRx.ain5 = 0; + io.ccRx.ain6 = 0; + io.ccRx.hermesI01 = false; + io.ccRx.hermesI02 = false; + io.ccRx.hermesI03 = false; + io.ccRx.hermesI04 = false; + io.ccRx.mercury1_LT2208 = false; + io.ccRx.mercury2_LT2208 = false; + io.ccRx.mercury3_LT2208 = false; + io.ccRx.mercury4_LT2208 = false; + + // init cc Tx parameters + io.ccTx.currentBand = RX.at(0)->getHamBand(); + io.ccTx.mercuryAttenuators = RX.at(0)->getMercuryAttenuators(); + io.ccTx.mercuryAttenuator = RX.at(0)->getMercuryAttenuators().at(io.ccTx.currentBand); + io.ccTx.dither = set->getMercuryDither(); + io.ccTx.random = set->getMercuryRandom(); + io.ccTx.duplex = 1; + io.ccTx.mox = false; + io.ccTx.ptt = false; + io.ccTx.alexStates = set->getAlexStates(); + io.ccTx.vnaMode = false; + io.ccTx.alexConfig = set->getAlexConfig(); + io.ccTx.timeStamp = 0; + io.ccTx.commonMercuryFrequencies = 0; + io.ccTx.pennyOCenabled = set->getPennyOCEnabled(); + io.ccTx.rxJ6pinList = set->getRxJ6Pins(); + io.ccTx.txJ6pinList = set->getTxJ6Pins(); + + setAlexConfiguration(io.ccTx.alexConfig); + + io.rxClass = set->getRxClass(); + io.mic_gain = 0.26F; + io.rx_freq_change = -1; + io.tx_freq_change = -1; + io.clients = 0; + io.sendIQ_toggle = true; + io.rcveIQ_toggle = false; + io.alexForwardVolts = 0.0; + io.alexReverseVolts = 0.0; + io.alexForwardPower = 0.0; + io.alexReversePower = 0.0; + io.penelopeForwardVolts = 0.0; + io.penelopeForwardPower = 0.0; + io.ain3Volts = 0.0; + io.ain4Volts = 0.0; + io.supplyVolts = 0.0f; + + + //***************************** + // C&C bytes + for (int i = 0; i < 5; i++) { + + io.control_in[i] = 0x00; + io.control_out[i] = 0x00; + } + + // C0 + // 0 0 0 0 0 0 0 0 + // | + // +------------ MOX (1 = active, 0 = inactive) + + io.control_out[0] |= MOX_DISABLED; + + // set C1 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + +------------ Speed (00 = 48kHz, 01 = 96kHz, 10 = 192kHz) + // | | | | + +---------------- 10MHz Ref. (00 = Atlas/Excalibur, 01 = Penelope, 10 = Mercury)* + // | | | +-------------------- 122.88MHz source (0 = Penelope, 1 = Mercury)* + // | + +---------------------- Config (00 = nil, 01 = Penelope, 10 = Mercury, 11 = both)* + // +-------------------------- Mic source (0 = Janus, 1 = Penelope)* + + // Bits 1,0 + setSampleRate(this, set->getSampleRate()); + + // Bits 7,..,2 + setHPSDRConfig(); + + io.control_out[1] &= 0x03; // 0 0 0 0 0 0 1 1 + io.control_out[1] |= io.ccTx.clockByte; + + // set C2 + // + // 0 0 0 0 0 0 0 0 + // | | | + // | | +------------ Mode (1 = Class E, 0 = All other modes) + // +---------- +-------------- Open Collector Outputs on Penelope or Hermes (bit 6..bit 0) + + io.control_out[2] = io.control_out[2] & 0xFE; // 1 1 1 1 1 1 1 0 + io.control_out[2] = io.control_out[2] | io.rxClass; + + // set C3 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + +------------ Alex Attenuator (00 = 0dB, 01 = 10dB, 10 = 20dB, 11 = 30dB) + // | | | | | +---------------- Preamp On/Off (0 = Off, 1 = On) + // | | | | +------------------ LT2208 Dither (0 = Off, 1 = On) + // | | | + ------------------- LT2208 Random (0= Off, 1 = On) + // | + + --------------------- Alex Rx Antenna (00 = none, 01 = Rx1, 10 = Rx2, 11 = XV) + // + ------------------------- Alex Rx out (0 = off, 1 = on). Set if Alex Rx Antenna > 00. + + io.control_out[3] = io.control_out[3] & 0xFB; // 1 1 1 1 1 0 1 1 + io.control_out[3] = io.control_out[3] | (io.ccTx.mercuryAttenuator << 2); + + io.control_out[3] = io.control_out[3] & 0xF7; // 1 1 1 1 0 1 1 1 + io.control_out[3] = io.control_out[3] | (io.ccTx.dither << 3); + + io.control_out[3] = io.control_out[3] & 0xEF; // 1 1 1 0 1 1 1 1 + io.control_out[3] = io.control_out[3] | (io.ccTx.random << 4); + + // set C4 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + + ----------- Alex Tx relay (00 = Tx1, 01= Tx2, 10 = Tx3) + // | | | | | + --------------- Duplex (0 = off, 1 = on) + // + + + + +------------------ Number of Receivers (00000 = 1, 11111 = 32) //RRK removed 4HL - // | +------------------------ Time stamp - 1PPS on LSB of Mic data (0 = off, 1 = on) - // +-------------------------- Common Mercury Frequency (0 = independent frequencies to Mercury - // Boards, 1 = same frequency to all Mercury boards) - - io.control_out[4] &= 0x07; // 1 1 0 0 0 1 1 1 - io.control_out[4] = (io.ccTx.duplex << 2) | ((io.receivers - 1) << 3); - - return true; -} - -void DataEngine::setHPSDRConfig() { - - io.ccTx.clockByte = 0x0; - - // C1 - // 0 0 0 0 0 0 0 0 - // | | | | | | | | - // | | | | | | + +------------ Speed (00 = 48kHz, 01 = 96kHz, 10 = 192kHz) - // | | | | + +---------------- 10MHz Ref. (00 = Atlas/Excalibur, 01 = Penelope, 10 = Mercury)* - // | | | +-------------------- 122.88MHz source (0 = Penelope, 1 = Mercury)* - // | + +---------------------- Config (00 = nil, 01 = Penelope, 10 = Mercury, 11 = both)* - // +-------------------------- Mic source (0 = Janus, 1 = Penelope)* - // - // * Ignored by Hermes - - if ( - (set->getPenelopePresence() || set->getPennyLanePresence()) && - ((set->get10MHzSource() == 0) || set->getExcaliburPresence()) - ) - { - - io.ccTx.clockByte = MIC_SOURCE_PENELOPE | MERCURY_PRESENT | PENELOPE_PRESENT | MERCURY_122_88MHZ_SOURCE | ATLAS_10MHZ_SOURCE; - } - else if ((set->getPenelopePresence() || set->getPennyLanePresence()) && (set->get10MHzSource() == 1)) { - - io.ccTx.clockByte = MIC_SOURCE_PENELOPE | MERCURY_PRESENT | PENELOPE_PRESENT | MERCURY_122_88MHZ_SOURCE | PENELOPE_10MHZ_SOURCE; - } - else if ((set->getPenelopePresence() || set->getPennyLanePresence()) && (set->get10MHzSource() == 2)) { - - io.ccTx.clockByte = MIC_SOURCE_PENELOPE | MERCURY_PRESENT | PENELOPE_PRESENT | MERCURY_122_88MHZ_SOURCE | MERCURY_10MHZ_SOURCE; - } - else if ((set->get10MHzSource() == 0) || set->getExcaliburPresence()) { - - io.ccTx.clockByte = MERCURY_PRESENT | MERCURY_122_88MHZ_SOURCE | ATLAS_10MHZ_SOURCE; - } - else { - - io.ccTx.clockByte = MERCURY_PRESENT | MERCURY_122_88MHZ_SOURCE | MERCURY_10MHZ_SOURCE; - } -} - -void DataEngine::connectDSPSlots() { - - CHECKED_CONNECT( - set, - SIGNAL(ctrFrequencyChanged(QObject *, int, int, long)), - this, - SLOT(setFrequency(QObject *, int, int, long))); -} - -void DataEngine::disconnectDSPSlots() { - - disconnect( - set, - SIGNAL(ctrFrequencyChanged(QObject *, int, int, long)), - this, - SLOT(setFrequency(QObject *, int, int, long))); -} - -//******************************************************** -// create, start/stop HPSDR device network IO - -void DataEngine::createDiscoverer() { - - m_discoverer = new Discoverer(&io); - - m_discoveryThread = new QThreadEx(); - m_discoverer->moveToThread(m_discoveryThread); - - m_discoverer->connect( - m_discoveryThread, - SIGNAL(started()), - SLOT(initHPSDRDevice())); -} - -bool DataEngine::startDiscoverer(QThread::Priority prio) { - - m_discoveryThread->start(prio); - - if (m_discoveryThread->isRunning()) { - - m_discoveryThreadRunning = true; - io.networkIOMutex.lock(); - qDebug() << ""; - DATA_ENGINE_DEBUG << "HPSDR device discovery thread started."; - io.networkIOMutex.unlock(); - - return true; - } - else { - - m_discoveryThreadRunning = false; - return false; - } -} - -void DataEngine::stopDiscoverer() { - - if (m_discoveryThread->isRunning()) { - - m_discoveryThread->quit(); - m_discoveryThread->wait(1000); - delete m_discoveryThread; - delete m_discoverer; - m_discoverer = 0; - - m_discoveryThreadRunning = false; - - DATA_ENGINE_DEBUG << "HPSDR discovery thread stopped and deleted."; - } - else - DATA_ENGINE_DEBUG << "HPSDR discovery thread wasn't started."; -} - -//******************************************************** -// create, start/stop data receiver - -void DataEngine::createDataIO() { - - m_dataIO = new DataIO(&io); - - switch (m_serverMode) { - - //case QSDR::ExternalDSP: - // break; - - //case QSDR::InternalDSP: - case QSDR::SDRMode: - - io.networkIOMutex.lock(); - DATA_ENGINE_DEBUG << "configured for " - << qPrintable(QString::number(set->getNumberOfReceivers())) - << " receiver(s) at " - << qPrintable(QString::number(set->getSampleRate()/1000)) - << " kHz sample rate"; - io.networkIOMutex.unlock(); -// sendMessage( -// m_message.arg( -// QString::number(set->getNumberOfReceivers()), -// QString::number(set->getSampleRate()/1000))); - break; - - case QSDR::ChirpWSPR: - case QSDR::ChirpWSPRFile: - break; - - case QSDR::NoServerMode: - case QSDR::DemoMode: - break; - } - - m_dataIOThread = new QThreadEx(); - m_dataIO->moveToThread(m_dataIOThread); - - switch (m_hwInterface) { - - case QSDR::NoInterfaceMode: - - m_dataIO->connect( - m_dataIOThread, - SIGNAL(started()), - SLOT(readData())); - break; - - case QSDR::Metis: - case QSDR::Hermes: - - m_dataIO->connect( - m_dataIOThread, - SIGNAL(started()), - SLOT(initDataReceiverSocket())); - break; - } -} - -bool DataEngine::startDataIO(QThread::Priority prio) { - - m_dataIOThread->start(prio); - - if (m_dataIOThread->isRunning()) { - - m_dataIOThreadRunning = true; - io.networkIOMutex.lock(); - DATA_ENGINE_DEBUG << "data IO thread started."; - io.networkIOMutex.unlock(); - - return true; - } - else { - - m_dataIOThreadRunning = false; - setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - return false; - } -} - -void DataEngine::stopDataIO() { - - if (m_dataIOThread->isRunning()) { - - m_dataIO->stop(); - m_dataIOThread->quit(); - - while (!m_dataIOThread->isFinished()) { - - DATA_ENGINE_DEBUG << "data IO thread not yet finished..."; - if (m_dataIOThread->wait(100)) break; - } - m_dataIOThreadRunning = false; - - delete m_dataIOThread; - delete m_dataIO; - m_dataIO = 0; - - if (m_serverMode == QSDR::ChirpWSPRFile) { - - while (!io.chirp_queue.isEmpty()) - io.chirp_queue.dequeue(); - } - - DATA_ENGINE_DEBUG << "data IO thread deleted."; - } - else - DATA_ENGINE_DEBUG << "data IO thread wasn't started."; -} - -//******************************************************** -// create, start/stop data processor - -void DataEngine::createDataProcessor() { - - m_dataProcessor = new DataProcessor(this, m_serverMode, m_hwInterface); - sendSocket = new QUdpSocket(); - - CHECKED_CONNECT( - sendSocket, - SIGNAL(error(QAbstractSocket::SocketError)), - m_dataProcessor, - SLOT(displayDataProcessorSocketError(QAbstractSocket::SocketError))); - - switch (m_serverMode) { - - // The signal iqDataReady is generated by the function - // processInputBuffer when a block of input data are - // decoded. - - case QSDR::SDRMode: - case QSDR::ChirpWSPR: - case QSDR::ChirpWSPRFile: - - /*connect( - this, - SIGNAL(iqDataReady(int)), - SLOT(dttSPDspProcessing(int)), - Qt::DirectConnection);*/ - - break; - - case QSDR::NoServerMode: - case QSDR::DemoMode: - break; - - /* - case QSDR::ExternalDSP: - - CHECKED_CONNECT_OPT( - this, - SIGNAL(iqDataReady(int)), - m_dataProcessor, - SLOT(externalDspProcessing(int)), - Qt::DirectConnection); - - break; - - case QSDR::ChirpWSPR: - case QSDR::ChirpWSPRFile: - break; - */ - } - - m_dataProcThread = new QThreadEx(); - m_dataProcessor->moveToThread(m_dataProcThread); - sendSocket->moveToThread(m_dataProcThread); - - switch (m_hwInterface) { - - case QSDR::NoInterfaceMode: - m_dataProcessor->connect( - m_dataProcThread, - SIGNAL(started()), - SLOT(processData())); - break; - - case QSDR::Metis: - case QSDR::Hermes: - m_dataProcessor->connect( - m_dataProcThread, - SIGNAL(started()), - SLOT(processDeviceData())); - - break; - } - - //m_dataProcessor->connect(m_dataProcThread, SIGNAL(started()), SLOT(initDataProcessorSocket())); -} - -bool DataEngine::startDataProcessor(QThread::Priority prio) { - - m_dataProcThread->start(prio); - - if (m_dataProcThread->isRunning()) { - - m_dataProcThreadRunning = true; - io.networkIOMutex.lock(); - DATA_ENGINE_DEBUG << "data processor thread started."; - io.networkIOMutex.unlock(); - - return true; - } - else { - - m_dataProcThreadRunning = false; - setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - return false; - } -} - -void DataEngine::stopDataProcessor() { - - if (m_dataProcThread->isRunning()) { - - m_dataProcessor->stop(); - - if (m_serverMode == QSDR::SDRMode || m_serverMode == QSDR::ChirpWSPR) { - - if (io.iq_queue.isEmpty()) { - io.iq_queue.enqueue(QByteArray(BUFFER_SIZE, 0x0)); - } - } - else if (m_serverMode == QSDR::ChirpWSPRFile) { - - if (io.data_queue.isEmpty()) { - - QList buf; - for (int i = 0; i < 128; i++) buf << 0.0f; - io.data_queue.enqueue(buf); - } - } - - m_dataProcThread->quit(); - m_dataProcThread->wait(); - delete m_dataProcThread; - delete m_dataProcessor; - m_dataProcessor = 0; - - if (m_serverMode == QSDR::SDRMode || m_serverMode == QSDR::ChirpWSPR) { - - while (!io.iq_queue.isEmpty()) - io.iq_queue.dequeue(); - - DATA_ENGINE_DEBUG << "iq_queue empty."; - } - else if (m_serverMode == QSDR::ChirpWSPRFile) { - - while (!io.data_queue.isEmpty()) - io.data_queue.dequeue(); - - DATA_ENGINE_DEBUG << "data_queue empty."; - chirpData.clear(); - } - - m_dataProcThreadRunning = false; - - DATA_ENGINE_DEBUG << "data processor thread deleted."; - } - else - DATA_ENGINE_DEBUG << "data processor thread wasn't started."; -} - -//******************************************************** -// create, start/stop audio out processor - -void DataEngine::createAudioOutProcessor() { - - m_audioOutProcessor = new AudioOutProcessor(this, m_serverMode); - - switch (m_serverMode) { - - //case QSDR::ExternalDSP: - // break; - - case QSDR::SDRMode: - - /*connect( - this, - SIGNAL(iqDataReady(int)), - SLOT(dttSPDspProcessing(int)), - Qt::DirectConnection);*/ - - break; - - case QSDR::NoServerMode: - case QSDR::DemoMode: - break; - - default: - break; - } - - m_audioOutProcThread = new QThreadEx(); - m_audioOutProcessor->moveToThread(m_audioOutProcThread); - - switch (m_hwInterface) { - - case QSDR::NoInterfaceMode: - /*m_audioOutProcessor->connect( - m_audioOutProcThread, - SIGNAL(started()), - SLOT(processData()));*/ - break; - - case QSDR::Metis: - case QSDR::Hermes: - /*m_audioOutProcessor->connect( - m_audioOutProcThread, - SIGNAL(started()), - SLOT(processDeviceData()));*/ - break; - } -} - -void DataEngine::startAudioOutProcessor(QThread::Priority prio) { - - Q_UNUSED (prio) -} - -void DataEngine::stopAudioOutProcessor() { -} - -//******************************************************** -// create, start/stop winde band data processor - -void DataEngine::createWideBandDataProcessor() { - - int size; - - if (io.mercuryFW > 32 || io.hermesFW > 11) - size = BIGWIDEBANDSIZE; - else - size = SMALLWIDEBANDSIZE; - - m_wbDataProcessor = new WideBandDataProcessor(&io, m_serverMode, size); - - m_wbDataProcThread = new QThreadEx(); - m_wbDataProcessor->moveToThread(m_wbDataProcThread); - m_wbDataProcessor->connect( - m_wbDataProcThread, - SIGNAL(started()), - SLOT(processWideBandData())); - - CHECKED_CONNECT( - set, - SIGNAL(spectrumAveragingChanged(QObject*, int, bool)), - m_wbDataProcessor, - SLOT(setWbSpectrumAveraging(QObject*, int, bool))); - - CHECKED_CONNECT( - m_wbDataProcessor, - SIGNAL(wbSpectrumBufferChanged(const qVectorFloat&)), - set, - SLOT(setWidebandSpectrumBuffer(const qVectorFloat&))); -} - -bool DataEngine::startWideBandDataProcessor(QThread::Priority prio) { - - m_wbDataProcThread->start(prio);//(QThread::TimeCriticalPriority);//(QThread::HighPriority);//(QThread::LowPriority); - - if (m_wbDataProcThread->isRunning()) { - - m_wbDataRcvrThreadRunning = true; - io.networkIOMutex.lock(); - DATA_ENGINE_DEBUG << "wide band data processor thread started."; - io.networkIOMutex.unlock(); - - return true; - } - else { - - m_wbDataRcvrThreadRunning = false; - setSystemState(QSDR::WideBandDataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - return false; - } -} - -void DataEngine::stopWideBandDataProcessor() { - - if (m_wbDataProcThread->isRunning()) { - - m_wbDataProcessor->stop(); - if (io.wb_queue.isEmpty()) - io.wb_queue.enqueue(m_datagram); - - m_wbDataProcThread->quit(); - m_wbDataProcThread->wait(); - delete m_wbDataProcThread; - delete m_wbDataProcessor; - m_wbDataProcessor = 0; - - m_wbDataRcvrThreadRunning = false; - - DATA_ENGINE_DEBUG << "wide band data processor thread deleted."; - } - else - DATA_ENGINE_DEBUG << "wide band data processor thread wasn't started."; -} - -//******************************************************** -// create, start/stop chirp processor -void DataEngine::createChirpDataProcessor() { - - m_chirpProcessor = new ChirpProcessor(&io); - DATA_ENGINE_DEBUG << "chirp decoder initialized"; - - CHECKED_CONNECT_OPT( - m_audioEngine, - SIGNAL(chirpSignalChanged()), - m_chirpProcessor, - SLOT(generateLocalChirp()), - Qt::DirectConnection); - - m_audioEngine->reset(); - if (m_audioEngine->generateSweptTone()) - DATA_ENGINE_DEBUG << "audio chirp signal initialized"; - else - DATA_ENGINE_DEBUG << "audio chirp signal initialization failed"; - - - m_chirpDataProcThread = new QThreadEx(); - m_chirpProcessor->moveToThread(m_chirpDataProcThread); - m_chirpProcessor->connect( - m_chirpDataProcThread, - SIGNAL(started()), - m_chirpProcessor, - SLOT(processChirpData())); - - m_chirpInititalized = true; -} - -bool DataEngine::startChirpDataProcessor(QThread::Priority prio) { - - m_chirpDataProcThread->start(prio);//(QThread::TimeCriticalPriority);//(QThread::HighPriority);//(QThread::LowPriority); - - if (m_chirpDataProcThread->isRunning()) { - - m_chirpDataProcThreadRunning = true; - io.networkIOMutex.lock(); - DATA_ENGINE_DEBUG << "chirp data processor thread started."; - io.networkIOMutex.unlock(); - - return true; - } - else { - - m_chirpDataProcThreadRunning = false; - setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); - return false; - } -} - -void DataEngine::stopChirpDataProcessor() { - - if (m_chirpInititalized) { - - m_chirpProcessor->stop(); - if (io.chirp_queue.isEmpty()) { - - QList buf; - for (int i = 0; i < 128; i++) buf << 0.0f; - io.chirp_queue.enqueue(buf); - } - - m_chirpDataProcThread->quit(); - m_chirpDataProcThread->wait(); - delete m_chirpDataProcThread; - delete m_chirpProcessor; - m_chirpProcessor = 0; - - if (m_hwInterface == QSDR::NoInterfaceMode) { - - //freeCPX(io.cpxIn); - //freeCPX(io.cpxOut); - delete m_chirpDspEngine; - - while (!io.chirp_queue.isEmpty()) - io.chirp_queue.dequeue(); - - DATA_ENGINE_DEBUG << "io.cpxIn, io.cpxOut, fft deleted, io.chirp_queue empty."; - } - - m_chirpInititalized = false; - - DATA_ENGINE_DEBUG << "chirp data processor thread deleted."; - } - else - DATA_ENGINE_DEBUG << "chirp data processor thread wasn't started."; -} - -//******************************************************** -// create, start/stop audio receiver - -void DataEngine::createAudioReceiver() { - - m_audioReceiver = new AudioReceiver(&io); - - CHECKED_CONNECT( - m_audioReceiver, - SIGNAL(rcveIQEvent(QObject *, int)), - this, - SLOT(setRcveIQSignal(QObject *, int))); - - CHECKED_CONNECT( - m_audioReceiver, - SIGNAL(clientConnectedEvent(bool)), - this, - SLOT(setClientConnected(bool))); - - - m_AudioRcvrThread = new QThreadEx(); - m_audioReceiver->moveToThread(m_AudioRcvrThread); - - m_audioReceiver->connect( - m_AudioRcvrThread, - SIGNAL(started()), - SLOT(initClient())); -} - - -void DataEngine::processFileBuffer(const QList buffer) { - - - int topsize = 2*BUFFER_SIZE - 1; - //float specMax = -100.0f; - //float specMin = 0.0f; - - Q_ASSERT(buffer.length() == 128); - - for (int i = 0; i < 64; i++) { - - cpxIn[i + m_rxSamples].re = buffer.at(2*i); - cpxIn[i + m_rxSamples].im = buffer.at(2*i+1); - - chirpData << buffer.at(2*i); - chirpData << buffer.at(2*i+1); - - m_chirpSamples++; - if (m_chirpSamples == io.samplerate) { - - io.chirp_queue.enqueue(chirpData); - chirpData.clear(); - m_chirpSamples = 0; - } - } - m_rxSamples += 64; - - if (m_rxSamples == 2*BUFFER_SIZE) { - - m_chirpDspEngine->fft->DoFFTWForward(cpxIn, cpxOut, 2*BUFFER_SIZE); - - // reorder the spectrum buffer - for (int i = 0; i < BUFFER_SIZE; i++) { - - m_spectrumBuffer[topsize - i] = - (float)(10.0 * log10(MagCPX(cpxOut[i+BUFFER_SIZE]) + 1.5E-45)); - m_spectrumBuffer[BUFFER_SIZE - i] = - (float)(10.0 * log10(MagCPX(cpxOut[i]) + 1.5E-45)); - } - - /*float specMean = 0.0f; - for (int i = BUFFER_SIZE+20; i < BUFFER_SIZE+105; i++) { - - specMean += m_spectrumBuffer[i]; - if (m_spectrumBuffer[i] > specMax) specMax = m_spectrumBuffer[i]; - if (m_spectrumBuffer[i] < specMin) specMin = m_spectrumBuffer[i]; - }*/ - //specMean *= 1.0f/BUFFER_SIZE; - //DATA_PROCESSOR_DEBUG << "pan min" << specMin << "max" << specMax << "mean" << specMean; - - SleeperThread::usleep(42667); - - //emit spectrumBufferChanged(m_spectrumBuffer); - //set->setSpectrumBuffer(m_spectrumBuffer); - //set->setSpectrumBuffer(0, m_spectrumBuffer); - - m_rxSamples = 0; - } -} - - -//***************************************************************************** -// - -void DataEngine::systemStateChanged( - QObject *sender, - QSDR::_Error err, - QSDR::_HWInterfaceMode hwmode, - QSDR::_ServerMode mode, - QSDR::_DataEngineState state) -{ - Q_UNUSED (sender) - Q_UNUSED (err) - - io.mutex.lock(); - if (m_hwInterface != hwmode) - m_hwInterface = hwmode; - - if (m_serverMode != mode) - m_serverMode = mode; - - if (m_dataEngineState != state) - m_dataEngineState = state; - - io.mutex.unlock(); -} - -void DataEngine::setSystemState( - QSDR::_Error err, - QSDR::_HWInterfaceMode hwmode, - QSDR::_ServerMode statemode, - QSDR::_DataEngineState enginestate) -{ - io.networkIOMutex.lock(); - set->setSystemState(this, err, hwmode, statemode, enginestate); - io.networkIOMutex.unlock(); -} - -float DataEngine::getFilterSizeCalibrationOffset() { - - //int size=1024; // dspBufferSize - float i = log10((qreal) BUFFER_SIZE); - return 3.0f*(11.0f - i); -} - -void DataEngine::searchHpsdrNetworkDevices() { - - if (!m_discoverer) createDiscoverer(); - - // HPSDR network IO thread - if (!startDiscoverer(QThread::NormalPriority)) { - - DATA_ENGINE_DEBUG << "HPSDR network discovery thread could not be started."; - return; - } - - io.networkIOMutex.lock(); - io.devicefound.wait(&io.networkIOMutex); - - //m_discoverer->findHPSDRDevices(); - - // stop the discovery thread - io.networkIOMutex.unlock(); - stopDiscoverer(); -} - -void DataEngine::setHPSDRDeviceNumber(int value) { - - m_hpsdrDevices = value; -} - -void DataEngine::rxListChanged(QList list) { - - io.mutex.lock(); - RX = list; - io.mutex.unlock(); -} - -void DataEngine::setCurrentReceiver(QObject *sender, int rx) { - - Q_UNUSED(sender) - - io.mutex.lock(); - io.currentReceiver = rx; - io.mutex.unlock(); -} - -void DataEngine::setFramesPerSecond(QObject *sender, int rx, int value) { - - Q_UNUSED(sender) - Q_UNUSED(rx) - Q_UNUSED(value) - - /*io.mutex.lock(); - if (m_fpsList.length() > 0) - m_fpsList[rx] = (int)(1000000.0/value); - io.mutex.unlock();*/ -} - -void DataEngine::setSampleRate(QObject *sender, int value) { - - Q_UNUSED(sender) - - io.mutex.lock(); - switch (value) { - - case 48000: - io.samplerate = value; - io.speed = 0; - io.outputMultiplier = 1; - break; - - case 96000: - io.samplerate = value; - io.speed = 1; - io.outputMultiplier = 2; - break; - - case 192000: - io.samplerate = value; - io.speed = 2; - io.outputMultiplier = 4; - break; - - case 384000: - io.samplerate = value; - io.speed = 3; - io.outputMultiplier = 8; - break; - - default: - DATA_ENGINE_DEBUG << "invalid sample rate !\n"; - stop(); - break; - } - - io.mutex.unlock(); - - emit outMultiplierEvent(io.outputMultiplier); -} - -void DataEngine::setMercuryAttenuator(QObject *sender, HamBand band, int value) { - - Q_UNUSED(sender) - Q_UNUSED(band) - - io.mutex.lock(); - io.ccTx.mercuryAttenuator = value; - io.mutex.unlock(); -} - -void DataEngine::setMercuryAttenuators(QObject *sender, QList attn) { - - Q_UNUSED(sender) - - io.mutex.lock(); - io.ccTx.mercuryAttenuators = attn; - io.mutex.unlock(); -} - -void DataEngine::setDither(QObject *sender, int value) { - - Q_UNUSED(sender) - - io.mutex.lock(); - io.ccTx.dither = value; - io.mutex.unlock(); -} - -void DataEngine::setRandom(QObject *sender, int value) { - - Q_UNUSED(sender) - - io.mutex.lock(); - io.ccTx.random = value; - io.mutex.unlock(); -} - -void DataEngine::set10MhzSource(QObject *sender, int source) { - - Q_UNUSED(sender) - - io.mutex.lock(); - io.control_out[1] = io.control_out[1] & 0xF3; - io.control_out[1] = io.control_out[1] | (source << 2); - io.mutex.unlock(); -} - -void DataEngine::set122_88MhzSource(QObject *sender, int source) { - - Q_UNUSED(sender) - - io.mutex.lock(); - io.control_out[1] = io.control_out[1] & 0xEF; - io.control_out[1] = io.control_out[1] | (source << 4); - io.mutex.unlock(); -} - -void DataEngine::setMicSource(QObject *sender, int source) { - - Q_UNUSED(sender) - - io.mutex.lock(); - io.control_out[1] = io.control_out[1] & 0x7F; - io.control_out[1] = io.control_out[1] | (source << 7); - io.mutex.unlock(); -} - -void DataEngine::setMercuryClass(QObject *sender, int value) { - - Q_UNUSED(sender) - - io.mutex.lock(); - io.rxClass = value; - io.mutex.unlock(); -} - -void DataEngine::setMercuryTiming(QObject *sender, int value) { - - Q_UNUSED(sender) - - io.mutex.lock(); - io.timing = value; - io.mutex.unlock(); -} - -void DataEngine::setAlexConfiguration(quint16 conf) { - - io.mutex.lock(); - io.ccTx.alexConfig = conf; - DATA_ENGINE_DEBUG << "Alex Configuration = " << io.ccTx.alexConfig; - io.mutex.unlock(); -} - -void DataEngine::setAlexStates(HamBand band, const QList &states) { - - Q_UNUSED (band) - - io.mutex.lock(); - io.ccTx.alexStates = states; - DATA_ENGINE_DEBUG << "Alex States = " << io.ccTx.alexStates; - io.mutex.unlock(); -} - -void DataEngine::setPennyOCEnabled(bool value) { - - io.mutex.lock(); - io.ccTx.pennyOCenabled = value; - io.mutex.unlock(); -} - -void DataEngine::setRxJ6Pins(const QList &list) { - - io.mutex.lock(); - io.ccTx.rxJ6pinList = list; - io.mutex.unlock(); - -} - -void DataEngine::setTxJ6Pins(const QList &list) { - - io.mutex.lock(); - io.ccTx.txJ6pinList = list; - io.mutex.unlock(); -} - -void DataEngine::setRcveIQSignal(QObject *sender, int value) { - - emit rcveIQEvent(sender, value); -} - -void DataEngine::setPenelopeVersion(QObject *sender, int version) { - - emit penelopeVersionInfoEvent(sender, version); -} - -void DataEngine::setHwIOVersion(QObject *sender, int version) { - - emit hwIOVersionInfoEvent(sender, version); -} - -void DataEngine::setNumberOfRx(QObject *sender, int value) { - - Q_UNUSED(sender) - - if (io.receivers == value) return; - - io.mutex.lock(); - io.receivers = value; - io.mutex.unlock(); - //io.control_out[4] &= 0xc7; - //io.control_out[4] |= (value - 1) << 3; - - DATA_ENGINE_DEBUG << "number of receivers set to " << QString::number(value); -} - -void DataEngine::setTimeStamp(QObject *sender, bool value) { - - Q_UNUSED(sender) - - if (io.timeStamp == value) return; - - io.mutex.lock(); - io.timeStamp = value; - io.mutex.unlock(); - //io.control_out[4] &= 0xc7; - //RRK io.control_out[4] |= value << 6; - - if (value) - DATA_ENGINE_DEBUG << "set time stamp on"; - else - DATA_ENGINE_DEBUG << "set time stamp off"; -} - -void DataEngine::setRxSocketState(int rx, const char* prop, QString str) { - - RX[rx]->setProperty(prop, str); - set->setRxList(RX); -} - -void DataEngine::setRxPeerAddress(int rx, QHostAddress address) { - - RX[rx]->setPeerAddress(address); - set->setRxList(RX); -} - -void DataEngine::setRx(int rx) { - - io.mutex.lock(); - RX[rx]->setReceiver(rx); - set->setRxList(RX); - io.mutex.unlock(); -} - -void DataEngine::setRxClient(int rx, int client) { - - io.mutex.lock(); - RX[rx]->setClient(client); - set->setRxList(RX); - io.mutex.unlock(); -} - -void DataEngine::setClientConnected(QObject* sender, int rx) { - - Q_UNUSED(sender) - - if (!io.clientList.contains(rx)) { - - io.clientList.append(rx); - io.audio_rx = rx; - - m_AudioRcvrThread->quit(); - m_AudioRcvrThread->wait(); - m_AudioRcvrThread->start(); - } - else { - - io.sendIQ_toggle = true; - io.rcveIQ_toggle = false; - m_AudioRcvrThread->start(); - } -} - -void DataEngine::setClientConnected(bool value) { - - m_clientConnected = value; -} - -void DataEngine::setClientDisconnected(int client) { - - Q_UNUSED(client) - /*if (m_clientConnected) { - - m_AudioRcvrThread->quit(); - m_AudioRcvrThread->wait(); - if (!m_AudioRcvrThread->isRunning()) - DATA_ENGINE_DEBUG << "audio receiver thread stopped."; - - m_clientConnected = false; - } - sync_toggle = true; - adc_toggle = false;*/ -} - -//void DataEngine::setAudioInProcessorRunning(bool value) { -// -// //m_audioInProcessorRunning = value; -//} - -void DataEngine::setAudioReceiver(QObject *sender, int rx) { - - Q_UNUSED(sender) - - io.mutex.lock(); - emit audioRxEvent(rx); - io.mutex.unlock(); -} - -void DataEngine::setIQPort(int rx, int port) { - - io.mutex.lock(); - RX[rx]->setIQPort(port); - set->setRxList(RX); - io.mutex.unlock(); -} - -void DataEngine::setRxConnectedStatus(QObject* sender, int rx, bool value) { - - Q_UNUSED(sender) - - io.mutex.lock(); - RX[rx]->setConnectedStatus(value); - set->setRxList(RX); - io.mutex.unlock(); -} - -void DataEngine::setHamBand(QObject *sender, int rx, bool byBtn, HamBand band) { - - Q_UNUSED(sender) - Q_UNUSED(rx) - Q_UNUSED(byBtn) - - io.mutex.lock(); - io.ccTx.currentBand = band; - io.mutex.unlock(); -} - -void DataEngine::setFrequency(QObject* sender, int mode, int rx, long frequency) { - - Q_UNUSED (sender) - Q_UNUSED (mode) - - //RX[rx]->setFrequency(frequency); - RX[rx]->setCtrFrequency(frequency); - io.rx_freq_change = rx; - io.tx_freq_change = rx; -} - -void DataEngine::loadWavFile(const QString &fileName) { - - if (m_audioEngine->loadFile(fileName)) - m_soundFileLoaded = true; - else - m_soundFileLoaded = false; -} - -void DataEngine::suspend() { - - m_audioEngine->suspend(); -} - -void DataEngine::startPlayback() { - - m_audioEngine->startPlayback(); -} - -void DataEngine::showSettingsDialog() { - - m_audioEngine->showSettingsDialog(); -} - -void DataEngine::setAudioFileFormat(QObject *sender, const QAudioFormat &format) { - - Q_UNUSED (sender) - Q_UNUSED (format) -} - -void DataEngine::setAudioFilePosition(QObject *sender, qint64 position) { - - Q_UNUSED (sender) - Q_UNUSED (position) -} - -void DataEngine::setAudioFileBuffer(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer) { - - Q_UNUSED (sender) - - m_audioFileBufferPosition = position; - m_audioFileBufferLength = length; - m_audioFileBuffer = buffer; - - //DATA_ENGINE_DEBUG << "audio file length" << m_audioFileBufferLength; -} - -void DataEngine::setAudioFileBuffer(const QList &buffer) { - - io.inputBuffer = buffer; - - /*for (int i = 0; i < buffer.length(); i++) { - - DATA_ENGINE_DEBUG << "i" << i << "audioBuffer" << io.inputBuffer.at(i); - }*/ -} - -// ********************************************************************* -// Data processor - -DataProcessor::DataProcessor( - DataEngine *de, - QSDR::_ServerMode serverMode, - QSDR::_HWInterfaceMode hwMode) - : QObject() - , de(de) - , set(Settings::instance()) - , m_dataProcessorSocket(0) - , m_serverMode(serverMode) - , m_hwInterface(hwMode) - , m_socketConnected(false) - , m_setNetworkDeviceHeader(true) - , m_chirpGateBit(true) - , m_chirpBit(false) - , m_chirpStart(false) - , m_bytes(0) - , m_offset(0) - , m_length(0) - , m_rxSamples(0) - , m_chirpSamples(0) - , m_chirpStartSample(0) - , m_idx(IO_HEADER_SIZE) - , m_sendState(0) - , m_stopped(false) -{ - m_IQSequence = 0L; - m_sequenceHi = 0L; - - m_IQDatagram.resize(0); - - m_SyncChangedTime.start(); - m_ADCChangedTime.start(); - - m_fwCount = 0; - - m_sendSequence = 0L; - m_oldSendSequence = 0L; - - m_deviceSendDataSignature.resize(4); - m_deviceSendDataSignature[0] = (char)0xEF; - m_deviceSendDataSignature[1] = (char)0xFE; - m_deviceSendDataSignature[2] = (char)0x01; - m_deviceSendDataSignature[3] = (char)0x02; - - //socket = new QUdpSocket(); - m_deviceAddress = set->getCurrentMetisCard().ip_address; -} - -DataProcessor::~DataProcessor() { -} - -void DataProcessor::stop() { - - m_stopped = true; -} - -void DataProcessor::initDataProcessorSocket() { - - m_dataProcessorSocket = new QUdpSocket(); - - /*m_dataProcessorSocket->bind(QHostAddress(set->getHPSDRDeviceLocalAddr()), - 23000, - QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress); - - int newBufferSize = 64 * 1024; - - if (::setsockopt(m_dataProcessorSocket->socketDescriptor(), SOL_SOCKET, - SO_RCVBUF, (char *)&newBufferSize, sizeof(newBufferSize)) == -1) { - - DATA_ENGINE_DEBUG << "initDataProcessorSocket error setting m_dataProcessorSocket buffer size."; - }*/ - - //m_dataProcessorSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1); - //m_dataProcessorSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); - - CHECKED_CONNECT( - m_dataProcessorSocket, - SIGNAL(error(QAbstractSocket::SocketError)), - this, - SLOT(displayDataProcessorSocketError(QAbstractSocket::SocketError))); -} - -void DataProcessor::displayDataProcessorSocketError(QAbstractSocket::SocketError error) { - - DATA_PROCESSOR_DEBUG << "data processor socket error: " << error; -} - -void DataProcessor::processDeviceData() { - - //if (m_serverMode == QSDR::ExternalDSP) - // initDataProcessorSocket(); - - DATA_PROCESSOR_DEBUG << "Data Processor thread: " << this->thread(); - forever { - - //m_dataEngine->processInputBuffer(m_dataEngine->io.iq_queue.dequeue()); - QByteArray buf = de->io.iq_queue.dequeue(); - //de->processInputBuffer(buf.left(BUFFER_SIZE/2)); - //de->processInputBuffer(buf.right(BUFFER_SIZE/2)); - - processInputBuffer(buf.left(BUFFER_SIZE/2)); - processInputBuffer(buf.right(BUFFER_SIZE/2)); - - if (de->io.iq_queue.isFull()) { - DATA_PROCESSOR_DEBUG << "IQ queue full!"; - } - - QMutexLocker locker(&m_mutex); - if (m_stopped) { - m_stopped = false; - break; - } - } - -// if (m_serverMode == QSDR::ExternalDSP) { -// -// disconnect(this); -// m_dataProcessorSocket->close(); -// delete m_dataProcessorSocket; -// m_dataProcessorSocket = NULL; -// -// m_socketConnected = false; -// } -} - -void DataProcessor::processData() { - - forever { - - de->processFileBuffer(de->io.data_queue.dequeue()); - - m_mutex.lock(); - if (m_stopped) { - m_stopped = false; - m_mutex.unlock(); - break; - } - m_mutex.unlock(); - } -} - -void DataProcessor::externalDspProcessing(int rx) { - - // keep UDP packets < 512 bytes - // 8 bytes sequency number, 2 bytes offset, 2 bytes length, 500 bytes data - - if (!m_socketConnected) { - - m_dataProcessorSocket->connectToHost(de->RX[rx]->getPeerAddress(), de->RX[rx]->getIQPort()); - -#if defined(Q_OS_WIN32) - //int newBufferSize = 64 * 1024; - int newBufferSize = 16 * 1024; - - if (::setsockopt(m_dataProcessorSocket->socketDescriptor(), SOL_SOCKET, - SO_RCVBUF, (char *)&newBufferSize, sizeof(newBufferSize)) == -1) { - - DATA_PROCESSOR_DEBUG << "externalDspProcessing error setting m_dataProcessorSocket buffer size."; - } -#endif - - m_socketConnected = true; - } - -#ifndef __linux__ - m_sequenceHi = 0L; -#endif - - /*QUdpSocket socket; - CHECKED_CONNECT(&socket, - SIGNAL(error(QAbstractSocket::SocketError)), - this, - SLOT(displayDataProcessorSocketError(QAbstractSocket::SocketError)));*/ - - m_offset = 0; - //m_IQDatagram.append(reinterpret_cast(&m_dataEngine->rxList[rx]->input_buffer), sizeof(m_dataEngine->rxList[rx]->input_buffer)); - m_IQDatagram.append(reinterpret_cast(&de->RX[rx]->inBuf), sizeof(de->RX[rx]->inBuf)); - - m_IQDatagram.append(reinterpret_cast(&de->RX[rx]->inBuf), sizeof(de->RX[rx]->inBuf)); - - while (m_offset < m_IQDatagram.size()) { - - m_length = m_IQDatagram.size() - m_offset; - - if (m_length > 500) - m_length = 500; - - QByteArray datagram; - datagram += QByteArray(reinterpret_cast(&m_IQSequence), sizeof(m_IQSequence)); - datagram += QByteArray(reinterpret_cast(&m_sequenceHi), sizeof(m_sequenceHi)); - datagram += QByteArray(reinterpret_cast(&m_offset), sizeof(m_offset)); - datagram += QByteArray(reinterpret_cast(&m_length), sizeof(m_length)); - datagram += m_IQDatagram.mid(m_offset, m_length); - - if (m_dataProcessorSocket->write(datagram) < 0) - /*if (m_dataProcessorSocket->writeDatagram(datagram, - m_dataEngine->rxList[rx]->getPeerAddress(), - m_dataEngine->rxList[rx]->getIQPort()) < 0)*/ - //if (socket.writeDatagram(datagram, - // m_dataEngine->rxList[rx]->getPeerAddress(), - // m_dataEngine->rxList[rx]->getIQPort()) < 0) - { - if (!de->io.sendIQ_toggle) { // toggles the sendIQ signal - - de->set->setSendIQ(2); - de->io.sendIQ_toggle = true; - } - - DATA_ENGINE_DEBUG << "externalDspProcessing error sending data to client:" - << m_dataProcessorSocket->errorString(); - } - else { - - //socket.flush(); - if (de->io.sendIQ_toggle) { // toggles the sendIQ signal - - de->set->setSendIQ(1); - de->io.sendIQ_toggle = false; - } - } - m_offset += m_length; - } - m_IQDatagram.resize(0); - m_IQSequence++; -} - -void DataProcessor::externalDspProcessingBig(int rx) { - - m_IQDatagram.append(reinterpret_cast(&de->RX[rx]->in), sizeof(de->RX[rx]->in)); - - if (m_dataProcessorSocket->writeDatagram(m_IQDatagram.data(), - m_IQDatagram.size(), - de->RX[rx]->getPeerAddress(), - de->RX[rx]->getIQPort()) < 0) - - { - if (!de->io.sendIQ_toggle) { // toggles the sendIQ signal - - de->set->setSendIQ(2); - de->io.sendIQ_toggle = true; - } - - DATA_PROCESSOR_DEBUG << "error sending data to client:" << m_dataProcessorSocket->errorString(); - } - else { - - m_dataProcessorSocket->flush(); - if (de->io.sendIQ_toggle) { // toggles the sendIQ signal - - de->set->setSendIQ(1); - de->io.sendIQ_toggle = false; - } - } - m_IQDatagram.resize(0); -} - -void DataProcessor::processInputBuffer(const QByteArray &buffer) { - - //DATA_PROCESSOR_DEBUG << "processInputBuffer: " << this->thread(); - int s = 0; - - if (buffer.at(s++) == SYNC && buffer.at(s++) == SYNC && buffer.at(s++) == SYNC) - { - // extract C&C bytes - decodeCCBytes(buffer.mid(3, 5)); - s += 5; - - switch (de->io.receivers) - { - case 1: m_maxSamples = 512-0; break; - case 2: m_maxSamples = 512-0; break; - case 3: m_maxSamples = 512-4; break; - case 4: m_maxSamples = 512-10; break; - case 5: m_maxSamples = 512-24; break; - case 6: m_maxSamples = 512-10; break; - case 7: m_maxSamples = 512-20; break; - case 8: m_maxSamples = 512-4; break; + // | +------------------------ Time stamp - 1PPS on LSB of Mic data (0 = off, 1 = on) + // +-------------------------- Common Mercury Frequency (0 = independent frequencies to Mercury + // Boards, 1 = same frequency to all Mercury boards) + + io.control_out[4] &= 0x07; // 1 1 0 0 0 1 1 1 + io.control_out[4] = (io.ccTx.duplex << 2) | ((io.receivers - 1) << 3); + + return true; +} + +void DataEngine::setHPSDRConfig() { + + io.ccTx.clockByte = 0x0; + + // C1 + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + +------------ Speed (00 = 48kHz, 01 = 96kHz, 10 = 192kHz) + // | | | | + +---------------- 10MHz Ref. (00 = Atlas/Excalibur, 01 = Penelope, 10 = Mercury)* + // | | | +-------------------- 122.88MHz source (0 = Penelope, 1 = Mercury)* + // | + +---------------------- Config (00 = nil, 01 = Penelope, 10 = Mercury, 11 = both)* + // +-------------------------- Mic source (0 = Janus, 1 = Penelope)* + // + // * Ignored by Hermes + + if ( + (set->getPenelopePresence() || set->getPennyLanePresence()) && + ((set->get10MHzSource() == 0) || set->getExcaliburPresence()) + ) + { + + io.ccTx.clockByte = MIC_SOURCE_PENELOPE | MERCURY_PRESENT | PENELOPE_PRESENT | MERCURY_122_88MHZ_SOURCE | ATLAS_10MHZ_SOURCE; + } + else if ((set->getPenelopePresence() || set->getPennyLanePresence()) && (set->get10MHzSource() == 1)) { + + io.ccTx.clockByte = MIC_SOURCE_PENELOPE | MERCURY_PRESENT | PENELOPE_PRESENT | MERCURY_122_88MHZ_SOURCE | PENELOPE_10MHZ_SOURCE; + } + else if ((set->getPenelopePresence() || set->getPennyLanePresence()) && (set->get10MHzSource() == 2)) { + + io.ccTx.clockByte = MIC_SOURCE_PENELOPE | MERCURY_PRESENT | PENELOPE_PRESENT | MERCURY_122_88MHZ_SOURCE | MERCURY_10MHZ_SOURCE; + } + else if ((set->get10MHzSource() == 0) || set->getExcaliburPresence()) { + + io.ccTx.clockByte = MERCURY_PRESENT | MERCURY_122_88MHZ_SOURCE | ATLAS_10MHZ_SOURCE; + } + else { + + io.ccTx.clockByte = MERCURY_PRESENT | MERCURY_122_88MHZ_SOURCE | MERCURY_10MHZ_SOURCE; + } +} + +void DataEngine::connectDSPSlots() { + + CHECKED_CONNECT( + set, + SIGNAL(ctrFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(setFrequency(QObject *, int, int, long))); +} + +void DataEngine::disconnectDSPSlots() { + + disconnect( + set, + SIGNAL(ctrFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(setFrequency(QObject *, int, int, long))); +} + +//******************************************************** +// create, start/stop HPSDR device network IO + +void DataEngine::createDiscoverer() { + + m_discoverer = new Discoverer(&io); + + m_discoveryThread = new QThreadEx(); + m_discoverer->moveToThread(m_discoveryThread); + + m_discoverer->connect( + m_discoveryThread, + SIGNAL(started()), + SLOT(initHPSDRDevice())); +} + +bool DataEngine::startDiscoverer(QThread::Priority prio) { + + m_discoveryThread->start(prio); + + if (m_discoveryThread->isRunning()) { + + m_discoveryThreadRunning = true; + io.networkIOMutex.lock(); + qDebug() << ""; + DATA_ENGINE_DEBUG << "HPSDR device discovery thread started."; + io.networkIOMutex.unlock(); + + return true; + } + else { + + m_discoveryThreadRunning = false; + return false; + } +} + +void DataEngine::stopDiscoverer() { + + if (m_discoveryThread->isRunning()) { + + m_discoveryThread->quit(); + m_discoveryThread->wait(1000); + delete m_discoveryThread; + delete m_discoverer; + m_discoverer = 0; + + m_discoveryThreadRunning = false; + + DATA_ENGINE_DEBUG << "HPSDR discovery thread stopped and deleted."; + } + else + DATA_ENGINE_DEBUG << "HPSDR discovery thread wasn't started."; +} + +//******************************************************** +// create, start/stop data receiver + +void DataEngine::createDataIO() { + + m_dataIO = new DataIO(&io); + + switch (m_serverMode) { + + //case QSDR::ExternalDSP: + // break; + + //case QSDR::InternalDSP: + case QSDR::SDRMode: + + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "configured for " + << qPrintable(QString::number(set->getNumberOfReceivers())) + << " receiver(s) at " + << qPrintable(QString::number(set->getSampleRate()/1000)) + << " kHz sample rate"; + io.networkIOMutex.unlock(); +// sendMessage( +// m_message.arg( +// QString::number(set->getNumberOfReceivers()), +// QString::number(set->getSampleRate()/1000))); + break; + + case QSDR::ChirpWSPR: + case QSDR::ChirpWSPRFile: + break; + + case QSDR::NoServerMode: + case QSDR::DemoMode: + break; + } + + m_dataIOThread = new QThreadEx(); + m_dataIO->moveToThread(m_dataIOThread); + + switch (m_hwInterface) { + + case QSDR::NoInterfaceMode: + + m_dataIO->connect( + m_dataIOThread, + SIGNAL(started()), + SLOT(readData())); + break; + + case QSDR::Metis: + case QSDR::Hermes: + + m_dataIO->connect( + m_dataIOThread, + SIGNAL(started()), + SLOT(initDataReceiverSocket())); + break; + } +} + +bool DataEngine::startDataIO(QThread::Priority prio) { + + m_dataIOThread->start(prio); + + if (m_dataIOThread->isRunning()) { + + m_dataIOThreadRunning = true; + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "data IO thread started."; + io.networkIOMutex.unlock(); + + return true; + } + else { + + m_dataIOThreadRunning = false; + setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } +} + +void DataEngine::stopDataIO() { + + if (m_dataIOThread->isRunning()) { + + m_dataIO->stop(); + m_dataIOThread->quit(); + + while (!m_dataIOThread->isFinished()) { + + DATA_ENGINE_DEBUG << "data IO thread not yet finished..."; + if (m_dataIOThread->wait(100)) break; + } + m_dataIOThreadRunning = false; + + delete m_dataIOThread; + delete m_dataIO; + m_dataIO = 0; + + if (m_serverMode == QSDR::ChirpWSPRFile) { + + while (!io.chirp_queue.isEmpty()) + io.chirp_queue.dequeue(); + } + + DATA_ENGINE_DEBUG << "data IO thread deleted."; + } + else + DATA_ENGINE_DEBUG << "data IO thread wasn't started."; +} + +//******************************************************** +// create, start/stop data processor + +void DataEngine::createDataProcessor() { + + m_dataProcessor = new DataProcessor(this, m_serverMode, m_hwInterface); + sendSocket = new QUdpSocket(); + + CHECKED_CONNECT( + sendSocket, + SIGNAL(error(QAbstractSocket::SocketError)), + m_dataProcessor, + SLOT(displayDataProcessorSocketError(QAbstractSocket::SocketError))); + + switch (m_serverMode) { + + // The signal iqDataReady is generated by the function + // processInputBuffer when a block of input data are + // decoded. + + case QSDR::SDRMode: + case QSDR::ChirpWSPR: + case QSDR::ChirpWSPRFile: + + /*connect( + this, + SIGNAL(iqDataReady(int)), + SLOT(dttSPDspProcessing(int)), + Qt::DirectConnection);*/ + + break; + + case QSDR::NoServerMode: + case QSDR::DemoMode: + break; + + /* + case QSDR::ExternalDSP: + + CHECKED_CONNECT_OPT( + this, + SIGNAL(iqDataReady(int)), + m_dataProcessor, + SLOT(externalDspProcessing(int)), + Qt::DirectConnection); + + break; + + case QSDR::ChirpWSPR: + case QSDR::ChirpWSPRFile: + break; + */ + } + + m_dataProcThread = new QThreadEx(); + m_dataProcessor->moveToThread(m_dataProcThread); + sendSocket->moveToThread(m_dataProcThread); + + switch (m_hwInterface) { + + case QSDR::NoInterfaceMode: + m_dataProcessor->connect( + m_dataProcThread, + SIGNAL(started()), + SLOT(processData())); + break; + + case QSDR::Metis: + case QSDR::Hermes: + m_dataProcessor->connect( + m_dataProcThread, + SIGNAL(started()), + SLOT(processDeviceData())); + + break; + } + + //m_dataProcessor->connect(m_dataProcThread, SIGNAL(started()), SLOT(initDataProcessorSocket())); +} + +bool DataEngine::startDataProcessor(QThread::Priority prio) { + + m_dataProcThread->start(prio); + + if (m_dataProcThread->isRunning()) { + + m_dataProcThreadRunning = true; + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "data processor thread started."; + io.networkIOMutex.unlock(); + + return true; + } + else { + + m_dataProcThreadRunning = false; + setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } +} + +void DataEngine::stopDataProcessor() { + + if (m_dataProcThread->isRunning()) { + + m_dataProcessor->stop(); + + if (m_serverMode == QSDR::SDRMode || m_serverMode == QSDR::ChirpWSPR) { + + if (io.iq_queue.isEmpty()) { + io.iq_queue.enqueue(QByteArray(BUFFER_SIZE, 0x0)); + } + } + else if (m_serverMode == QSDR::ChirpWSPRFile) { + + if (io.data_queue.isEmpty()) { + + QList buf; + for (int i = 0; i < 128; i++) buf << 0.0f; + io.data_queue.enqueue(buf); + } + } + + m_dataProcThread->quit(); + m_dataProcThread->wait(); + delete m_dataProcThread; + delete m_dataProcessor; + m_dataProcessor = 0; + + if (m_serverMode == QSDR::SDRMode || m_serverMode == QSDR::ChirpWSPR) { + + while (!io.iq_queue.isEmpty()) + io.iq_queue.dequeue(); + + DATA_ENGINE_DEBUG << "iq_queue empty."; + } + else if (m_serverMode == QSDR::ChirpWSPRFile) { + + while (!io.data_queue.isEmpty()) + io.data_queue.dequeue(); + + DATA_ENGINE_DEBUG << "data_queue empty."; + chirpData.clear(); + } + + m_dataProcThreadRunning = false; + + DATA_ENGINE_DEBUG << "data processor thread deleted."; + } + else + DATA_ENGINE_DEBUG << "data processor thread wasn't started."; +} + +//******************************************************** +// create, start/stop audio out processor + +void DataEngine::createAudioOutProcessor() { + + m_audioOutProcessor = new AudioOutProcessor(this, m_serverMode); + + switch (m_serverMode) { + + //case QSDR::ExternalDSP: + // break; + + case QSDR::SDRMode: + + /*connect( + this, + SIGNAL(iqDataReady(int)), + SLOT(dttSPDspProcessing(int)), + Qt::DirectConnection);*/ + + break; + + case QSDR::NoServerMode: + case QSDR::DemoMode: + break; + + default: + break; + } + + m_audioOutProcThread = new QThreadEx(); + m_audioOutProcessor->moveToThread(m_audioOutProcThread); + + switch (m_hwInterface) { + + case QSDR::NoInterfaceMode: + /*m_audioOutProcessor->connect( + m_audioOutProcThread, + SIGNAL(started()), + SLOT(processData()));*/ + break; + + case QSDR::Metis: + case QSDR::Hermes: + /*m_audioOutProcessor->connect( + m_audioOutProcThread, + SIGNAL(started()), + SLOT(processDeviceData()));*/ + break; + } +} + +void DataEngine::startAudioOutProcessor(QThread::Priority prio) { + + Q_UNUSED (prio) +} + +void DataEngine::stopAudioOutProcessor() { +} + +//******************************************************** +// create, start/stop winde band data processor + +void DataEngine::createWideBandDataProcessor() { + + int size; + + if (io.mercuryFW > 32 || io.hermesFW > 11) + size = BIGWIDEBANDSIZE; + else + size = SMALLWIDEBANDSIZE; + + m_wbDataProcessor = new WideBandDataProcessor(&io, m_serverMode, size); + + m_wbDataProcThread = new QThreadEx(); + m_wbDataProcessor->moveToThread(m_wbDataProcThread); + m_wbDataProcessor->connect( + m_wbDataProcThread, + SIGNAL(started()), + SLOT(processWideBandData())); + + CHECKED_CONNECT( + set, + SIGNAL(spectrumAveragingChanged(QObject*, int, bool)), + m_wbDataProcessor, + SLOT(setWbSpectrumAveraging(QObject*, int, bool))); + + CHECKED_CONNECT( + m_wbDataProcessor, + SIGNAL(wbSpectrumBufferChanged(const qVectorFloat&)), + set, + SLOT(setWidebandSpectrumBuffer(const qVectorFloat&))); +} + +bool DataEngine::startWideBandDataProcessor(QThread::Priority prio) { + + m_wbDataProcThread->start(prio);//(QThread::TimeCriticalPriority);//(QThread::HighPriority);//(QThread::LowPriority); + + if (m_wbDataProcThread->isRunning()) { + + m_wbDataRcvrThreadRunning = true; + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "wide band data processor thread started."; + io.networkIOMutex.unlock(); + + return true; + } + else { + + m_wbDataRcvrThreadRunning = false; + setSystemState(QSDR::WideBandDataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } +} + +void DataEngine::stopWideBandDataProcessor() { + + if (m_wbDataProcThread->isRunning()) { + + m_wbDataProcessor->stop(); + if (io.wb_queue.isEmpty()) + io.wb_queue.enqueue(m_datagram); + + m_wbDataProcThread->quit(); + m_wbDataProcThread->wait(); + delete m_wbDataProcThread; + delete m_wbDataProcessor; + m_wbDataProcessor = 0; + + m_wbDataRcvrThreadRunning = false; + + DATA_ENGINE_DEBUG << "wide band data processor thread deleted."; + } + else + DATA_ENGINE_DEBUG << "wide band data processor thread wasn't started."; +} + +//******************************************************** +// create, start/stop chirp processor +void DataEngine::createChirpDataProcessor() { + + m_chirpProcessor = new ChirpProcessor(&io); + DATA_ENGINE_DEBUG << "chirp decoder initialized"; + + CHECKED_CONNECT_OPT( + m_audioEngine, + SIGNAL(chirpSignalChanged()), + m_chirpProcessor, + SLOT(generateLocalChirp()), + Qt::DirectConnection); + + m_audioEngine->reset(); + if (m_audioEngine->generateSweptTone()) + DATA_ENGINE_DEBUG << "audio chirp signal initialized"; + else + DATA_ENGINE_DEBUG << "audio chirp signal initialization failed"; + + + m_chirpDataProcThread = new QThreadEx(); + m_chirpProcessor->moveToThread(m_chirpDataProcThread); + m_chirpProcessor->connect( + m_chirpDataProcThread, + SIGNAL(started()), + m_chirpProcessor, + SLOT(processChirpData())); + + m_chirpInititalized = true; +} + +bool DataEngine::startChirpDataProcessor(QThread::Priority prio) { + + m_chirpDataProcThread->start(prio);//(QThread::TimeCriticalPriority);//(QThread::HighPriority);//(QThread::LowPriority); + + if (m_chirpDataProcThread->isRunning()) { + + m_chirpDataProcThreadRunning = true; + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "chirp data processor thread started."; + io.networkIOMutex.unlock(); + + return true; + } + else { + + m_chirpDataProcThreadRunning = false; + setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } +} + +void DataEngine::stopChirpDataProcessor() { + + if (m_chirpInititalized) { + + m_chirpProcessor->stop(); + if (io.chirp_queue.isEmpty()) { + + QList buf; + for (int i = 0; i < 128; i++) buf << 0.0f; + io.chirp_queue.enqueue(buf); + } + + m_chirpDataProcThread->quit(); + m_chirpDataProcThread->wait(); + delete m_chirpDataProcThread; + delete m_chirpProcessor; + m_chirpProcessor = 0; + + if (m_hwInterface == QSDR::NoInterfaceMode) { + + //freeCPX(io.cpxIn); + //freeCPX(io.cpxOut); + delete m_chirpDspEngine; + + while (!io.chirp_queue.isEmpty()) + io.chirp_queue.dequeue(); + + DATA_ENGINE_DEBUG << "io.cpxIn, io.cpxOut, fft deleted, io.chirp_queue empty."; + } + + m_chirpInititalized = false; + + DATA_ENGINE_DEBUG << "chirp data processor thread deleted."; + } + else + DATA_ENGINE_DEBUG << "chirp data processor thread wasn't started."; +} + +//******************************************************** +// create, start/stop audio receiver + +void DataEngine::createAudioReceiver() { + + m_audioReceiver = new AudioReceiver(&io); + + CHECKED_CONNECT( + m_audioReceiver, + SIGNAL(rcveIQEvent(QObject *, int)), + this, + SLOT(setRcveIQSignal(QObject *, int))); + + CHECKED_CONNECT( + m_audioReceiver, + SIGNAL(clientConnectedEvent(bool)), + this, + SLOT(setClientConnected(bool))); + + + m_AudioRcvrThread = new QThreadEx(); + m_audioReceiver->moveToThread(m_AudioRcvrThread); + + m_audioReceiver->connect( + m_AudioRcvrThread, + SIGNAL(started()), + SLOT(initClient())); +} + + +void DataEngine::processFileBuffer(const QList buffer) { + + + int topsize = 2*BUFFER_SIZE - 1; + //float specMax = -100.0f; + //float specMin = 0.0f; + + Q_ASSERT(buffer.length() == 128); + + for (int i = 0; i < 64; i++) { + + cpxIn[i + m_rxSamples].re = buffer.at(2*i); + cpxIn[i + m_rxSamples].im = buffer.at(2*i+1); + + chirpData << buffer.at(2*i); + chirpData << buffer.at(2*i+1); + + m_chirpSamples++; + if (m_chirpSamples == io.samplerate) { + + io.chirp_queue.enqueue(chirpData); + chirpData.clear(); + m_chirpSamples = 0; + } + } + m_rxSamples += 64; + + if (m_rxSamples == 2*BUFFER_SIZE) { + + m_chirpDspEngine->fft->DoFFTWForward(cpxIn, cpxOut, 2*BUFFER_SIZE); + + // reorder the spectrum buffer + for (int i = 0; i < BUFFER_SIZE; i++) { + + m_spectrumBuffer[topsize - i] = + (float)(10.0 * log10(MagCPX(cpxOut[i+BUFFER_SIZE]) + 1.5E-45)); + m_spectrumBuffer[BUFFER_SIZE - i] = + (float)(10.0 * log10(MagCPX(cpxOut[i]) + 1.5E-45)); + } + + /*float specMean = 0.0f; + for (int i = BUFFER_SIZE+20; i < BUFFER_SIZE+105; i++) { + + specMean += m_spectrumBuffer[i]; + if (m_spectrumBuffer[i] > specMax) specMax = m_spectrumBuffer[i]; + if (m_spectrumBuffer[i] < specMin) specMin = m_spectrumBuffer[i]; + }*/ + //specMean *= 1.0f/BUFFER_SIZE; + //DATA_PROCESSOR_DEBUG << "pan min" << specMin << "max" << specMax << "mean" << specMean; + + SleeperThread::usleep(42667); + + //emit spectrumBufferChanged(m_spectrumBuffer); + //set->setSpectrumBuffer(m_spectrumBuffer); + //set->setSpectrumBuffer(0, m_spectrumBuffer); + + m_rxSamples = 0; + } +} + + +//***************************************************************************** +// + +void DataEngine::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + + io.mutex.lock(); + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + if (m_serverMode != mode) + m_serverMode = mode; + + if (m_dataEngineState != state) + m_dataEngineState = state; + + io.mutex.unlock(); +} + +void DataEngine::setSystemState( + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode statemode, + QSDR::_DataEngineState enginestate) +{ + io.networkIOMutex.lock(); + set->setSystemState(this, err, hwmode, statemode, enginestate); + io.networkIOMutex.unlock(); +} + +float DataEngine::getFilterSizeCalibrationOffset() { + + //int size=1024; // dspBufferSize + float i = log10((qreal) BUFFER_SIZE); + return 3.0f*(11.0f - i); +} + +void DataEngine::searchHpsdrNetworkDevices() { + + if (!m_discoverer) createDiscoverer(); + + // HPSDR network IO thread + if (!startDiscoverer(QThread::NormalPriority)) { + + DATA_ENGINE_DEBUG << "HPSDR network discovery thread could not be started."; + return; + } + + io.networkIOMutex.lock(); + io.devicefound.wait(&io.networkIOMutex); + + //m_discoverer->findHPSDRDevices(); + + // stop the discovery thread + io.networkIOMutex.unlock(); + stopDiscoverer(); +} + +void DataEngine::setHPSDRDeviceNumber(int value) { + + m_hpsdrDevices = value; +} + +void DataEngine::rxListChanged(QList list) { + + io.mutex.lock(); + RX = list; + io.mutex.unlock(); +} + +void DataEngine::setCurrentReceiver(QObject *sender, int rx) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.currentReceiver = rx; + io.mutex.unlock(); +} + +void DataEngine::setFramesPerSecond(QObject *sender, int rx, int value) { + + Q_UNUSED(sender) + Q_UNUSED(rx) + Q_UNUSED(value) + + /*io.mutex.lock(); + if (m_fpsList.length() > 0) + m_fpsList[rx] = (int)(1000000.0/value); + io.mutex.unlock();*/ +} + +void DataEngine::setSampleRate(QObject *sender, int value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + switch (value) { + + case 48000: + io.samplerate = value; + io.speed = 0; + io.outputMultiplier = 1; + break; + + case 96000: + io.samplerate = value; + io.speed = 1; + io.outputMultiplier = 2; + break; + + case 192000: + io.samplerate = value; + io.speed = 2; + io.outputMultiplier = 4; + break; + + case 384000: + io.samplerate = value; + io.speed = 3; + io.outputMultiplier = 8; + break; + + default: + DATA_ENGINE_DEBUG << "invalid sample rate !\n"; + stop(); + break; + } + + io.mutex.unlock(); + + emit outMultiplierEvent(io.outputMultiplier); +} + +void DataEngine::setMercuryAttenuator(QObject *sender, HamBand band, int value) { + + Q_UNUSED(sender) + Q_UNUSED(band) + + io.mutex.lock(); + io.ccTx.mercuryAttenuator = value; + io.mutex.unlock(); +} + +void DataEngine::setMercuryAttenuators(QObject *sender, QList attn) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.ccTx.mercuryAttenuators = attn; + io.mutex.unlock(); +} + +void DataEngine::setDither(QObject *sender, int value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.ccTx.dither = value; + io.mutex.unlock(); +} + +void DataEngine::setRandom(QObject *sender, int value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.ccTx.random = value; + io.mutex.unlock(); +} + +void DataEngine::set10MhzSource(QObject *sender, int source) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.control_out[1] = io.control_out[1] & 0xF3; + io.control_out[1] = io.control_out[1] | (source << 2); + io.mutex.unlock(); +} + +void DataEngine::set122_88MhzSource(QObject *sender, int source) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.control_out[1] = io.control_out[1] & 0xEF; + io.control_out[1] = io.control_out[1] | (source << 4); + io.mutex.unlock(); +} + +void DataEngine::setMicSource(QObject *sender, int source) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.control_out[1] = io.control_out[1] & 0x7F; + io.control_out[1] = io.control_out[1] | (source << 7); + io.mutex.unlock(); +} + +void DataEngine::setMercuryClass(QObject *sender, int value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.rxClass = value; + io.mutex.unlock(); +} + +void DataEngine::setMercuryTiming(QObject *sender, int value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.timing = value; + io.mutex.unlock(); +} + +void DataEngine::setAlexConfiguration(quint16 conf) { + + io.mutex.lock(); + io.ccTx.alexConfig = conf; + DATA_ENGINE_DEBUG << "Alex Configuration = " << io.ccTx.alexConfig; + io.mutex.unlock(); +} + +void DataEngine::setAlexStates(HamBand band, const QList &states) { + + Q_UNUSED (band) + + io.mutex.lock(); + io.ccTx.alexStates = states; + DATA_ENGINE_DEBUG << "Alex States = " << io.ccTx.alexStates; + io.mutex.unlock(); +} + +void DataEngine::setPennyOCEnabled(bool value) { + + io.mutex.lock(); + io.ccTx.pennyOCenabled = value; + io.mutex.unlock(); +} + +void DataEngine::setRxJ6Pins(const QList &list) { + + io.mutex.lock(); + io.ccTx.rxJ6pinList = list; + io.mutex.unlock(); + +} + +void DataEngine::setTxJ6Pins(const QList &list) { + + io.mutex.lock(); + io.ccTx.txJ6pinList = list; + io.mutex.unlock(); +} + +void DataEngine::setRcveIQSignal(QObject *sender, int value) { + + emit rcveIQEvent(sender, value); +} + +void DataEngine::setPenelopeVersion(QObject *sender, int version) { + + emit penelopeVersionInfoEvent(sender, version); +} + +void DataEngine::setHwIOVersion(QObject *sender, int version) { + + emit hwIOVersionInfoEvent(sender, version); +} + +void DataEngine::setNumberOfRx(QObject *sender, int value) { + + Q_UNUSED(sender) + + if (io.receivers == value) return; + + io.mutex.lock(); + io.receivers = value; + io.mutex.unlock(); + //io.control_out[4] &= 0xc7; + //io.control_out[4] |= (value - 1) << 3; + + DATA_ENGINE_DEBUG << "number of receivers set to " << QString::number(value); +} + +void DataEngine::setTimeStamp(QObject *sender, bool value) { + + Q_UNUSED(sender) + + if (io.timeStamp == value) return; + + io.mutex.lock(); + io.timeStamp = value; + io.mutex.unlock(); + //io.control_out[4] &= 0xc7; + //RRK io.control_out[4] |= value << 6; + + if (value) + DATA_ENGINE_DEBUG << "set time stamp on"; + else + DATA_ENGINE_DEBUG << "set time stamp off"; +} + +void DataEngine::setRxSocketState(int rx, const char* prop, QString str) { + + RX[rx]->setProperty(prop, str); + set->setRxList(RX); +} + +void DataEngine::setRxPeerAddress(int rx, QHostAddress address) { + + RX[rx]->setPeerAddress(address); + set->setRxList(RX); +} + +void DataEngine::setRx(int rx) { + + io.mutex.lock(); + RX[rx]->setReceiver(rx); + set->setRxList(RX); + io.mutex.unlock(); +} + +void DataEngine::setRxClient(int rx, int client) { + + io.mutex.lock(); + RX[rx]->setClient(client); + set->setRxList(RX); + io.mutex.unlock(); +} + +void DataEngine::setClientConnected(QObject* sender, int rx) { + + Q_UNUSED(sender) + + if (!io.clientList.contains(rx)) { + + io.clientList.append(rx); + io.audio_rx = rx; + + m_AudioRcvrThread->quit(); + m_AudioRcvrThread->wait(); + m_AudioRcvrThread->start(); + } + else { + + io.sendIQ_toggle = true; + io.rcveIQ_toggle = false; + m_AudioRcvrThread->start(); + } +} + +void DataEngine::setClientConnected(bool value) { + + m_clientConnected = value; +} + +void DataEngine::setClientDisconnected(int client) { + + Q_UNUSED(client) + /*if (m_clientConnected) { + + m_AudioRcvrThread->quit(); + m_AudioRcvrThread->wait(); + if (!m_AudioRcvrThread->isRunning()) + DATA_ENGINE_DEBUG << "audio receiver thread stopped."; + + m_clientConnected = false; + } + sync_toggle = true; + adc_toggle = false;*/ +} + +//void DataEngine::setAudioInProcessorRunning(bool value) { +// +// //m_audioInProcessorRunning = value; +//} + +void DataEngine::setAudioReceiver(QObject *sender, int rx) { + + Q_UNUSED(sender) + + io.mutex.lock(); + emit audioRxEvent(rx); + io.mutex.unlock(); +} + +void DataEngine::setIQPort(int rx, int port) { + + io.mutex.lock(); + RX[rx]->setIQPort(port); + set->setRxList(RX); + io.mutex.unlock(); +} + +void DataEngine::setRxConnectedStatus(QObject* sender, int rx, bool value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + RX[rx]->setConnectedStatus(value); + set->setRxList(RX); + io.mutex.unlock(); +} + +void DataEngine::setHamBand(QObject *sender, int rx, bool byBtn, HamBand band) { + + Q_UNUSED(sender) + Q_UNUSED(rx) + Q_UNUSED(byBtn) + + io.mutex.lock(); + io.ccTx.currentBand = band; + io.mutex.unlock(); +} + +void DataEngine::setFrequency(QObject* sender, int mode, int rx, long frequency) { + + Q_UNUSED (sender) + Q_UNUSED (mode) + + //RX[rx]->setFrequency(frequency); + RX[rx]->setCtrFrequency(frequency); + io.rx_freq_change = rx; + io.tx_freq_change = rx; +} + +void DataEngine::loadWavFile(const QString &fileName) { + + if (m_audioEngine->loadFile(fileName)) + m_soundFileLoaded = true; + else + m_soundFileLoaded = false; +} + +void DataEngine::suspend() { + + m_audioEngine->suspend(); +} + +void DataEngine::startPlayback() { + + m_audioEngine->startPlayback(); +} + +void DataEngine::showSettingsDialog() { + + m_audioEngine->showSettingsDialog(); +} + +void DataEngine::setAudioFileFormat(QObject *sender, const QAudioFormat &format) { + + Q_UNUSED (sender) + Q_UNUSED (format) +} + +void DataEngine::setAudioFilePosition(QObject *sender, qint64 position) { + + Q_UNUSED (sender) + Q_UNUSED (position) +} + +void DataEngine::setAudioFileBuffer(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer) { + + Q_UNUSED (sender) + + m_audioFileBufferPosition = position; + m_audioFileBufferLength = length; + m_audioFileBuffer = buffer; + + //DATA_ENGINE_DEBUG << "audio file length" << m_audioFileBufferLength; +} + +void DataEngine::setAudioFileBuffer(const QList &buffer) { + + io.inputBuffer = buffer; + + /*for (int i = 0; i < buffer.length(); i++) { + + DATA_ENGINE_DEBUG << "i" << i << "audioBuffer" << io.inputBuffer.at(i); + }*/ +} + +// ********************************************************************* +// Data processor + +DataProcessor::DataProcessor( + DataEngine *de, + QSDR::_ServerMode serverMode, + QSDR::_HWInterfaceMode hwMode) + : QObject() + , de(de) + , set(Settings::instance()) + , m_dataProcessorSocket(0) + , m_serverMode(serverMode) + , m_hwInterface(hwMode) + , m_socketConnected(false) + , m_setNetworkDeviceHeader(true) + , m_chirpGateBit(true) + , m_chirpBit(false) + , m_chirpStart(false) + , m_bytes(0) + , m_offset(0) + , m_length(0) + , m_rxSamples(0) + , m_chirpSamples(0) + , m_chirpStartSample(0) + , m_idx(IO_HEADER_SIZE) + , m_sendState(0) + , m_stopped(false) +{ + m_IQSequence = 0L; + m_sequenceHi = 0L; + + m_IQDatagram.resize(0); + + m_SyncChangedTime.start(); + m_ADCChangedTime.start(); + + m_fwCount = 0; + + m_sendSequence = 0L; + m_oldSendSequence = 0L; + + m_deviceSendDataSignature.resize(4); + m_deviceSendDataSignature[0] = (char)0xEF; + m_deviceSendDataSignature[1] = (char)0xFE; + m_deviceSendDataSignature[2] = (char)0x01; + m_deviceSendDataSignature[3] = (char)0x02; + + //socket = new QUdpSocket(); + m_deviceAddress = set->getCurrentMetisCard().ip_address; +} + +DataProcessor::~DataProcessor() { +} + +void DataProcessor::stop() { + + m_stopped = true; +} + +void DataProcessor::initDataProcessorSocket() { + + m_dataProcessorSocket = new QUdpSocket(); + + /*m_dataProcessorSocket->bind(QHostAddress(set->getHPSDRDeviceLocalAddr()), + 23000, + QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress); + + int newBufferSize = 64 * 1024; + + if (::setsockopt(m_dataProcessorSocket->socketDescriptor(), SOL_SOCKET, + SO_RCVBUF, (char *)&newBufferSize, sizeof(newBufferSize)) == -1) { + + DATA_ENGINE_DEBUG << "initDataProcessorSocket error setting m_dataProcessorSocket buffer size."; + }*/ + + //m_dataProcessorSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1); + //m_dataProcessorSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); + + CHECKED_CONNECT( + m_dataProcessorSocket, + SIGNAL(error(QAbstractSocket::SocketError)), + this, + SLOT(displayDataProcessorSocketError(QAbstractSocket::SocketError))); +} + +void DataProcessor::displayDataProcessorSocketError(QAbstractSocket::SocketError error) { + + DATA_PROCESSOR_DEBUG << "data processor socket error: " << error; +} + +void DataProcessor::processDeviceData() { + + //if (m_serverMode == QSDR::ExternalDSP) + // initDataProcessorSocket(); + + DATA_PROCESSOR_DEBUG << "Data Processor thread: " << this->thread(); + forever { + + //m_dataEngine->processInputBuffer(m_dataEngine->io.iq_queue.dequeue()); + QByteArray buf = de->io.iq_queue.dequeue(); + //de->processInputBuffer(buf.left(BUFFER_SIZE/2)); + //de->processInputBuffer(buf.right(BUFFER_SIZE/2)); + + processInputBuffer(buf.left(BUFFER_SIZE/2)); + processInputBuffer(buf.right(BUFFER_SIZE/2)); + + if (de->io.iq_queue.isFull()) { + DATA_PROCESSOR_DEBUG << "IQ queue full!"; + } + + QMutexLocker locker(&m_mutex); + if (m_stopped) { + m_stopped = false; + break; + } + } + +// if (m_serverMode == QSDR::ExternalDSP) { +// +// disconnect(this); +// m_dataProcessorSocket->close(); +// delete m_dataProcessorSocket; +// m_dataProcessorSocket = NULL; +// +// m_socketConnected = false; +// } +} + +void DataProcessor::processData() { + + forever { + + de->processFileBuffer(de->io.data_queue.dequeue()); + + m_mutex.lock(); + if (m_stopped) { + m_stopped = false; + m_mutex.unlock(); + break; + } + m_mutex.unlock(); + } +} + +void DataProcessor::externalDspProcessing(int rx) { + + // keep UDP packets < 512 bytes + // 8 bytes sequency number, 2 bytes offset, 2 bytes length, 500 bytes data + + if (!m_socketConnected) { + + m_dataProcessorSocket->connectToHost(de->RX[rx]->getPeerAddress(), de->RX[rx]->getIQPort()); + +#if defined(Q_OS_WIN32) + //int newBufferSize = 64 * 1024; + int newBufferSize = 16 * 1024; + + if (::setsockopt(m_dataProcessorSocket->socketDescriptor(), SOL_SOCKET, + SO_RCVBUF, (char *)&newBufferSize, sizeof(newBufferSize)) == -1) { + + DATA_PROCESSOR_DEBUG << "externalDspProcessing error setting m_dataProcessorSocket buffer size."; + } +#endif + + m_socketConnected = true; + } + +#ifndef __linux__ + m_sequenceHi = 0L; +#endif + + /*QUdpSocket socket; + CHECKED_CONNECT(&socket, + SIGNAL(error(QAbstractSocket::SocketError)), + this, + SLOT(displayDataProcessorSocketError(QAbstractSocket::SocketError)));*/ + + m_offset = 0; + //m_IQDatagram.append(reinterpret_cast(&m_dataEngine->rxList[rx]->input_buffer), sizeof(m_dataEngine->rxList[rx]->input_buffer)); + m_IQDatagram.append(reinterpret_cast(&de->RX[rx]->inBuf), sizeof(de->RX[rx]->inBuf)); + + m_IQDatagram.append(reinterpret_cast(&de->RX[rx]->inBuf), sizeof(de->RX[rx]->inBuf)); + + while (m_offset < m_IQDatagram.size()) { + + m_length = m_IQDatagram.size() - m_offset; + + if (m_length > 500) + m_length = 500; + + QByteArray datagram; + datagram += QByteArray(reinterpret_cast(&m_IQSequence), sizeof(m_IQSequence)); + datagram += QByteArray(reinterpret_cast(&m_sequenceHi), sizeof(m_sequenceHi)); + datagram += QByteArray(reinterpret_cast(&m_offset), sizeof(m_offset)); + datagram += QByteArray(reinterpret_cast(&m_length), sizeof(m_length)); + datagram += m_IQDatagram.mid(m_offset, m_length); + + if (m_dataProcessorSocket->write(datagram) < 0) + /*if (m_dataProcessorSocket->writeDatagram(datagram, + m_dataEngine->rxList[rx]->getPeerAddress(), + m_dataEngine->rxList[rx]->getIQPort()) < 0)*/ + //if (socket.writeDatagram(datagram, + // m_dataEngine->rxList[rx]->getPeerAddress(), + // m_dataEngine->rxList[rx]->getIQPort()) < 0) + { + if (!de->io.sendIQ_toggle) { // toggles the sendIQ signal + + de->set->setSendIQ(2); + de->io.sendIQ_toggle = true; + } + + DATA_ENGINE_DEBUG << "externalDspProcessing error sending data to client:" + << m_dataProcessorSocket->errorString(); + } + else { + + //socket.flush(); + if (de->io.sendIQ_toggle) { // toggles the sendIQ signal + + de->set->setSendIQ(1); + de->io.sendIQ_toggle = false; + } + } + m_offset += m_length; + } + m_IQDatagram.resize(0); + m_IQSequence++; +} + +void DataProcessor::externalDspProcessingBig(int rx) { + + m_IQDatagram.append(reinterpret_cast(&de->RX[rx]->in), sizeof(de->RX[rx]->in)); + + if (m_dataProcessorSocket->writeDatagram(m_IQDatagram.data(), + m_IQDatagram.size(), + de->RX[rx]->getPeerAddress(), + de->RX[rx]->getIQPort()) < 0) + + { + if (!de->io.sendIQ_toggle) { // toggles the sendIQ signal + + de->set->setSendIQ(2); + de->io.sendIQ_toggle = true; + } + + DATA_PROCESSOR_DEBUG << "error sending data to client:" << m_dataProcessorSocket->errorString(); + } + else { + + m_dataProcessorSocket->flush(); + if (de->io.sendIQ_toggle) { // toggles the sendIQ signal + + de->set->setSendIQ(1); + de->io.sendIQ_toggle = false; + } + } + m_IQDatagram.resize(0); +} + +void DataProcessor::processInputBuffer(const QByteArray &buffer) { + + //DATA_PROCESSOR_DEBUG << "processInputBuffer: " << this->thread(); + int s = 0; + + if (buffer.at(s++) == SYNC && buffer.at(s++) == SYNC && buffer.at(s++) == SYNC) + { + // extract C&C bytes + decodeCCBytes(buffer.mid(3, 5)); + s += 5; + + switch (de->io.receivers) + { + case 1: m_maxSamples = 512-0; break; + case 2: m_maxSamples = 512-0; break; + case 3: m_maxSamples = 512-4; break; + case 4: m_maxSamples = 512-10; break; + case 5: m_maxSamples = 512-24; break; + case 6: m_maxSamples = 512-10; break; + case 7: m_maxSamples = 512-20; break; + case 8: m_maxSamples = 512-4; break; case 9: m_maxSamples = 512-0; break; case 10: m_maxSamples = 512-8; break; case 11: m_maxSamples = 512-28; break; @@ -2848,941 +2848,948 @@ void DataProcessor::processInputBuffer(const QByteArray &buffer) { case 14: m_maxSamples = 512-74; break; case 15: m_maxSamples = 512-44; break; case 16: m_maxSamples = 512-14; break; - } - - // extract the samples - while (s < m_maxSamples) - { - // extract each of the receivers - for (int r = 0; r < de->io.receivers; r++) - { - m_leftSample = (int)(( signed char) buffer.at(s++)) << 16; - m_leftSample += (int)((unsigned char) buffer.at(s++)) << 8; - m_leftSample += (int)((unsigned char) buffer.at(s++)); - m_rightSample = (int)(( signed char) buffer.at(s++)) << 16; - m_rightSample += (int)((unsigned char) buffer.at(s++)) << 8; - m_rightSample += (int)((unsigned char) buffer.at(s++)); - - m_lsample = (float)(m_leftSample / 8388607.0f); - m_rsample = (float)(m_rightSample / 8388607.0f); - - /*if (m_serverMode == QSDR::ChirpWSPR && - m_chirpInititalized && - m_chirpSamples < io.samplerate) - { - chirpData << m_lsample; - chirpData << m_rsample; - }*/ - - if (de->RX.at(r)->qtdsp) { - - de->RX[r]->inBuf[m_rxSamples].re = m_lsample; // 24 bit sample - de->RX[r]->inBuf[m_rxSamples].im = m_rsample; // 24 bit sample - } - } - - m_micSample = (int)((signed char) buffer.at(s++)) << 8; - - // extract chirp signal time stamp - //m_chirpBit = (buffer.at(s) & 0x01);// == 0x01; - - m_micSample += (int)((unsigned char) buffer.at(s++)); - m_micSample_float = (float) m_micSample / 32767.0f * de->io.mic_gain; // 16 bit sample - - // add to buffer - de->io.mic_left_buffer[m_rxSamples] = m_micSample_float; - de->io.mic_right_buffer[m_rxSamples] = 0.0f; - - ////m_chirpSamples++; - - //if (m_serverMode == QSDR::ChirpWSPR && m_chirpInititalized) - //{ - // if (m_chirpBit) - // { - // if (m_chirpGateBit) - // { - // // we've found the rising edge of the GPS 1PPS signal, so we set the samples - // // counter back to zero in order to have a simple and precise synchronisation - // // with the local chirp. - // io.networkIOMutex.lock(); - // DATA_ENGINE_DEBUG << "GPS 1 PPS"; - // io.networkIOMutex.unlock(); - - // // remove the last sample (real and imag) and enqueue the buffer - // chirpData.removeLast(); - // chirpData.removeLast(); - // io.chirp_queue.enqueue(chirpData); - - // // empty the buffer and add the last sample, which is the starting point of the chirp - // m_chirpSamples = 0; - // chirpData.clear(); - - // chirpData << m_lsample; - // chirpData << m_rsample; - - // m_chirpStart = true; - // m_chirpStartSample = m_rxSamples; - // m_chirpGateBit = false; - // } - // } - // else - // m_chirpGateBit = true; - //} - m_rxSamples++; - m_chirpSamples++; - - // when we have enough rx samples we start the DSP processing. - if (m_rxSamples == BUFFER_SIZE) { - - for (int r = 0; r < de->io.receivers; r++) { - - if (de->RX.at(r)->qtdsp) { - - QMetaObject::invokeMethod(de->RX.at(r), "dspProcessing", Qt::DirectConnection);// Qt::QueuedConnection); - } - } - m_rxSamples = 0; - } - } - } - else { - - if (m_SyncChangedTime.elapsed() > 10) { - - set->setProtocolSync(2); - m_SyncChangedTime.restart(); - } - } -} - -void DataProcessor::decodeCCBytes(const QByteArray &buffer) { - - de->io.ccRx.ptt = (bool)((buffer.at(0) & 0x01) == 0x01); - de->io.ccRx.dash = (bool)((buffer.at(0) & 0x02) == 0x02); - de->io.ccRx.dot = (bool)((buffer.at(0) & 0x04) == 0x04); - de->io.ccRx.lt2208 = (bool)((buffer.at(1) & 0x01) == 0x01); - - de->io.ccRx.roundRobin = (uchar)(buffer.at(0) >> 3); - - switch (de->io.ccRx.roundRobin) // cycle through C0 - { - case 0: - - if (de->io.ccRx.lt2208) // check ADC signal - { - if (m_ADCChangedTime.elapsed() > 50) - { - set->setADCOverflow(2); - m_ADCChangedTime.restart(); - } - } - - //qDebug() << "CC: " << io.ccRx.roundRobin; - if (m_hwInterface == QSDR::Hermes) - { - de->io.ccRx.hermesI01 = (bool)((buffer.at(1) & 0x02) == 0x02); - de->io.ccRx.hermesI02 = (bool)((buffer.at(1) & 0x04) == 0x04); - de->io.ccRx.hermesI03 = (bool)((buffer.at(1) & 0x08) == 0x08); - de->io.ccRx.hermesI04 = (bool)((buffer.at(1) & 0x10) == 0x10); - //qDebug() << "Hermes IO 1: " << io.ccRx.hermesI01 - // << "2: " << io.ccRx.hermesI02 - // << "3: " << io.ccRx.hermesI03 - // << "4: " << io.ccRx.hermesI04; - } - - if (m_fwCount < 100) - { - if (m_hwInterface == QSDR::Metis) - { - if (de->io.ccRx.devices.mercuryFWVersion != buffer.at(2)) - { - de->io.ccRx.devices.mercuryFWVersion = buffer.at(2); - set->setMercuryVersion(de->io.ccRx.devices.mercuryFWVersion); - de->io.networkIOMutex.lock(); - DATA_PROCESSOR_DEBUG << "Mercury firmware version: " << qPrintable(QString::number(buffer.at(2))); - de->io.networkIOMutex.unlock(); - } - - if (de->io.ccRx.devices.penelopeFWVersion != buffer.at(3)) - { - de->io.ccRx.devices.penelopeFWVersion = buffer.at(3); - de->io.ccRx.devices.pennylaneFWVersion = buffer.at(3); - set->setPenelopeVersion(de->io.ccRx.devices.penelopeFWVersion); - set->setPennyLaneVersion(de->io.ccRx.devices.penelopeFWVersion); - de->io.networkIOMutex.lock(); - DATA_PROCESSOR_DEBUG << "Penelope/Pennylane firmware version: " << qPrintable(QString::number(buffer.at(3))); - de->io.networkIOMutex.unlock(); - } - - if (de->io.ccRx.devices.metisFWVersion != buffer.at(4)) - { - de->io.ccRx.devices.metisFWVersion = buffer.at(4); - set->setMetisVersion(de->io.ccRx.devices.metisFWVersion); - de->io.networkIOMutex.lock(); - DATA_PROCESSOR_DEBUG << "Metis firmware version: " << qPrintable(QString::number(buffer.at(4))); - de->io.networkIOMutex.unlock(); - } - } - else if (set->getHWInterface() == QSDR::Hermes) { - - if (de->io.ccRx.devices.hermesFWVersion != buffer.at(4)) { - - de->io.ccRx.devices.hermesFWVersion = buffer.at(4); - set->setHermesVersion(de->io.ccRx.devices.hermesFWVersion); - de->io.networkIOMutex.lock(); - DATA_ENGINE_DEBUG << "Hermes firmware version: " << qPrintable(QString::number(buffer.at(4))); - de->io.networkIOMutex.unlock(); - } - } - m_fwCount++; - } - break; - - case 1: - - //qDebug() << "CC: " << io.ccRx.roundRobin; - // forward power - if (set->getPenelopePresence() || (m_hwInterface == QSDR::Hermes)) { // || set->getPennyLanePresence() - - de->io.ccRx.ain5 = (quint16)((quint16)(buffer.at(1) << 8) + (quint16)buffer.at(2)); - - de->io.penelopeForwardVolts = (qreal)(3.3 * (qreal)de->io.ccRx.ain5 / 4095.0); - de->io.penelopeForwardPower = (qreal)(de->io.penelopeForwardVolts * de->io.penelopeForwardVolts / 0.09); - } - //qDebug() << "penelopeForwardVolts: " << io.penelopeForwardVolts << "penelopeForwardPower" << io.penelopeForwardPower; - - if (set->getAlexPresence()) { //|| set->getApolloPresence()) { - - de->io.ccRx.ain1 = (quint16)((quint16)(buffer.at(3) << 8) + (quint16)buffer.at(4)); - - de->io.alexForwardVolts = (qreal)(3.3 * (qreal)de->io.ccRx.ain1 / 4095.0); - de->io.alexForwardPower = (qreal)(de->io.alexForwardVolts * de->io.alexForwardVolts / 0.09); - } - //qDebug() << "alexForwardVolts: " << io.alexForwardVolts << "alexForwardPower" << io.alexForwardPower; - break; - - case 2: - - //qDebug() << "CC: " << io.ccRx.roundRobin; - // reverse power - if (set->getAlexPresence()) { //|| set->getApolloPresence()) { - - de->io.ccRx.ain2 = (quint16)((quint16)(buffer.at(1) << 8) + (quint16)buffer.at(2)); - - de->io.alexReverseVolts = (qreal)(3.3 * (qreal)de->io.ccRx.ain2 / 4095.0); - de->io.alexReversePower = (qreal)(de->io.alexReverseVolts * de->io.alexReverseVolts / 0.09); - } - //qDebug() << "alexReverseVolts: " << io.alexReverseVolts << "alexReversePower" << io.alexReversePower; - - if (set->getPenelopePresence() || (m_hwInterface == QSDR::Hermes)) { // || set->getPennyLanePresence() { - - de->io.ccRx.ain3 = (quint16)((quint16)(buffer.at(3) << 8) + (quint16)buffer.at(4)); - de->io.ain3Volts = (qreal)(3.3 * (double)de->io.ccRx.ain3 / 4095.0); - } - //qDebug() << "ain3Volts: " << io.ain3Volts; - break; - - case 3: - - //qDebug() << "CC: " << io.ccRx.roundRobin; - - if (set->getPenelopePresence() || (m_hwInterface == QSDR::Hermes)) { // || set->getPennyLanePresence() { - - de->io.ccRx.ain4 = (quint16)((quint16)(buffer.at(1) << 8) + (quint16)buffer.at(2)); - de->io.ccRx.ain6 = (quint16)((quint16)(buffer.at(3) << 8) + (quint16)buffer.at(4)); - - de->io.ain4Volts = (qreal)(3.3 * (qreal)de->io.ccRx.ain4 / 4095.0); - - if (set->getHWInterface() == QSDR::Hermes) // read supply volts applied to board - de->io.supplyVolts = (qreal)((qreal)de->io.ccRx.ain6 / 186.0f); - } - //qDebug() << "ain4Volts: " << io.ain4Volts << "supplyVolts" << io.supplyVolts; - break; - - //case 4: - - // more than 1 Mercury module (currently not usable) - //qDebug() << "CC: " << io.ccRx.roundRobin; - //switch (io.receivers) { - - // case 1: - // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); - // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208; - // break; - - // case 2: - // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); - // io.ccRx.mercury2_LT2208 = (bool)((buffer.at(2) & 0x02) == 0x02); - // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208 << "mercury2_LT2208" << io.ccRx.mercury2_LT2208; - // break; - - // case 3: - // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); - // io.ccRx.mercury2_LT2208 = (bool)((buffer.at(2) & 0x02) == 0x02); - // io.ccRx.mercury3_LT2208 = (bool)((buffer.at(3) & 0x02) == 0x02); - // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208 << "mercury2_LT2208" << io.ccRx.mercury2_LT2208; - // //qDebug() << "mercury3_LT2208: " << io.ccRx.mercury3_LT2208; - // break; - - // case 4: - // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); - // io.ccRx.mercury2_LT2208 = (bool)((buffer.at(2) & 0x02) == 0x02); - // io.ccRx.mercury3_LT2208 = (bool)((buffer.at(3) & 0x02) == 0x02); - // io.ccRx.mercury4_LT2208 = (bool)((buffer.at(4) & 0x02) == 0x02); - // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208 << "mercury2_LT2208" << io.ccRx.mercury2_LT2208; - // //qDebug() << "mercury3_LT2208: " << io.ccRx.mercury3_LT2208 << "mercury4_LT2208" << io.ccRx.mercury4_LT2208; - // break; - //} - //break; - } // end switch cycle through C0 -} - -void DataProcessor::setOutputBuffer(int rx, const CPX &buffer) { - - if (rx == de->io.currentReceiver) { - processOutputBuffer(buffer); - } -} - -void DataProcessor::processOutputBuffer(const CPX &buffer) { - - //DATA_PROCESSOR_DEBUG << "processOutputBuffer: " << this->thread(); - - qint16 leftRXSample; - qint16 rightRXSample; - qint16 leftTXSample; - qint16 rightTXSample; - - // process the output - for (int j = 0; j < BUFFER_SIZE; j += de->io.outputMultiplier) { - - leftRXSample = (qint16)(buffer.at(j).re * 32767.0f); - rightRXSample = (qint16)(buffer.at(j).im * 32767.0f); - - leftTXSample = 0; - rightTXSample = 0; - - de->io.output_buffer[m_idx++] = leftRXSample >> 8; - de->io.output_buffer[m_idx++] = leftRXSample; - de->io.output_buffer[m_idx++] = rightRXSample >> 8; - de->io.output_buffer[m_idx++] = rightRXSample; - de->io.output_buffer[m_idx++] = leftTXSample >> 8; - de->io.output_buffer[m_idx++] = leftTXSample; - de->io.output_buffer[m_idx++] = rightTXSample >> 8; - de->io.output_buffer[m_idx++] = rightTXSample; - - if (m_idx == IO_BUFFER_SIZE) { - - //if (de->m_audioBuffer.length() == 1024) { - - // //m_audioEngine->setAudioBuffer(this, m_audioBuffer); - // de->m_audioBuffer.resize(0); - //} - // set the C&C bytes - encodeCCBytes(); - - switch (m_hwInterface) { - - case QSDR::Metis: - case QSDR::Hermes: - - de->io.audioDatagram.resize(IO_BUFFER_SIZE); - de->io.audioDatagram = QByteArray::fromRawData((const char *)&de->io.output_buffer, IO_BUFFER_SIZE); - - //if (m_dataIOThreadRunning) { - // de->m_dataIO->writeData(); - //} - - de->m_dataIO->sendAudio(de->io.output_buffer); //RRK - - writeData(); - break; - - case QSDR::NoInterfaceMode: - break; - } - m_idx = IO_HEADER_SIZE; - } - } -} - -void DataProcessor::encodeCCBytes() { - - de->io.output_buffer[0] = SYNC; - de->io.output_buffer[1] = SYNC; - de->io.output_buffer[2] = SYNC; - - de->io.mutex.lock(); - switch (m_sendState) { - - case 0: - - uchar rxAnt; - uchar rxOut; - uchar ant; - - de->io.control_out[0] = 0x0; // C0 - de->io.control_out[1] = 0x0; // C1 - de->io.control_out[2] = 0x0; // C2 - de->io.control_out[3] = 0x0; // C3 - de->io.control_out[4] = 0x0; // C4 - - // C0 - // 0 0 0 0 0 0 0 0 - // | - // +------------ MOX (1 = active, 0 = inactive) - - // set C1 - // - // 0 0 0 0 0 0 0 0 - // | | | | | | | | - // | | | | | | + +------------ Speed (00 = 48kHz, 01 = 96kHz, 10 = 192kHz) - // | | | | + +---------------- 10MHz Ref. (00 = Atlas/Excalibur, 01 = Penelope, 10 = Mercury)* - // | | | +-------------------- 122.88MHz source (0 = Penelope, 1 = Mercury)* - // | + +---------------------- Config (00 = nil, 01 = Penelope, 10 = Mercury, 11 = both)* - // +-------------------------- Mic source (0 = Janus, 1 = Penelope)* - // - // * Ignored by Hermes - - de->io.control_out[1] |= de->io.speed; // sample rate - - de->io.control_out[1] &= 0x03; // 0 0 0 0 0 0 1 1 - de->io.control_out[1] |= de->io.ccTx.clockByte; - - // set C2 - // - // 0 0 0 0 0 0 0 0 - // | | | - // | | +------------ Mode (1 = Class E, 0 = All other modes) - // +---------- +-------------- Open Collector Outputs on Penelope or Hermes (bit 6...bit 0) - - de->io.control_out[2] = de->io.rxClass; - - if (de->io.ccTx.pennyOCenabled) { - - de->io.control_out[2] &= 0x1; // 0 0 0 0 0 0 0 1 - - if (de->io.ccTx.currentBand != (HamBand) gen) { - - if (de->io.ccTx.mox || de->io.ccTx.ptt) - de->io.control_out[2] |= (de->io.ccTx.txJ6pinList.at(de->io.ccTx.currentBand) >> 1) << 1; - else - de->io.control_out[2] |= (de->io.ccTx.rxJ6pinList.at(de->io.ccTx.currentBand) >> 1) << 1; - } - } - - - // set C3 - // - // 0 0 0 0 0 0 0 0 - // | | | | | | | | - // | | | | | | + +------------ Alex Attenuator (00 = 0dB, 01 = 10dB, 10 = 20dB, 11 = 30dB) - // | | | | | +---------------- Preamp On/Off (0 = Off, 1 = On) - // | | | | +------------------ LT2208 Dither (0 = Off, 1 = On) - // | | | + ------------------- LT2208 Random (0= Off, 1 = On) - // | + + --------------------- Alex Rx Antenna (00 = none, 01 = Rx1, 10 = Rx2, 11 = XV) - // + ------------------------- Alex Rx out (0 = off, 1 = on). Set if Alex Rx Antenna > 00. - - - rxAnt = 0x07 & (de->io.ccTx.alexStates.at(de->io.ccTx.currentBand) >> 2); - rxOut = (rxAnt > 0) ? 1 : 0; - - de->io.control_out[3] = (de->io.ccTx.alexStates.at(de->io.ccTx.currentBand) >> 7); - - de->io.control_out[3] &= 0xFB; // 1 1 1 1 1 0 1 1 - de->io.control_out[3] |= (de->io.ccTx.mercuryAttenuator << 2); - - de->io.control_out[3] &= 0xF7; // 1 1 1 1 0 1 1 1 - de->io.control_out[3] |= (de->io.ccTx.dither << 3); - - de->io.control_out[3] &= 0xEF; // 1 1 1 0 1 1 1 1 - de->io.control_out[3] |= (de->io.ccTx.random << 4); - - de->io.control_out[3] &= 0x9F; // 1 0 0 1 1 1 1 1 - de->io.control_out[3] |= rxAnt << 5; - - de->io.control_out[3] &= 0x7F; // 0 1 1 1 1 1 1 1 - de->io.control_out[3] |= rxOut << 7; - - // set C4 - // - // 0 0 0 0 0 0 0 0 - // | | | | | | | | - // | | | | | | + + ----------- Alex Tx relay (00 = Tx1, 01= Tx2, 10 = Tx3) - // | | | | | + --------------- Duplex (0 = off, 1 = on) + case 17: m_maxSamples = 512-88; break; + case 18: m_maxSamples = 512-64; break; + case 19: m_maxSamples = 512-40; break; + case 20: m_maxSamples = 512-16; break; + } + + // extract the samples + while (s < m_maxSamples) + { + // extract each of the receivers + for (int r = 0; r < de->io.receivers; r++) + { + m_leftSample = (int)(( signed char) buffer.at(s++)) << 16; + m_leftSample += (int)((unsigned char) buffer.at(s++)) << 8; + m_leftSample += (int)((unsigned char) buffer.at(s++)); + m_rightSample = (int)(( signed char) buffer.at(s++)) << 16; + m_rightSample += (int)((unsigned char) buffer.at(s++)) << 8; + m_rightSample += (int)((unsigned char) buffer.at(s++)); + + m_lsample = (float)(m_leftSample / 8388607.0f); + m_rsample = (float)(m_rightSample / 8388607.0f); + + /*if (m_serverMode == QSDR::ChirpWSPR && + m_chirpInititalized && + m_chirpSamples < io.samplerate) + { + chirpData << m_lsample; + chirpData << m_rsample; + }*/ + + if (de->RX.at(r)->qtdsp) { + + de->RX[r]->inBuf[m_rxSamples].re = m_lsample; // 24 bit sample + de->RX[r]->inBuf[m_rxSamples].im = m_rsample; // 24 bit sample + } + } + + m_micSample = (int)((signed char) buffer.at(s++)) << 8; + + // extract chirp signal time stamp + //m_chirpBit = (buffer.at(s) & 0x01);// == 0x01; + + m_micSample += (int)((unsigned char) buffer.at(s++)); + m_micSample_float = (float) m_micSample / 32767.0f * de->io.mic_gain; // 16 bit sample + + // add to buffer + de->io.mic_left_buffer[m_rxSamples] = m_micSample_float; + de->io.mic_right_buffer[m_rxSamples] = 0.0f; + + ////m_chirpSamples++; + + //if (m_serverMode == QSDR::ChirpWSPR && m_chirpInititalized) + //{ + // if (m_chirpBit) + // { + // if (m_chirpGateBit) + // { + // // we've found the rising edge of the GPS 1PPS signal, so we set the samples + // // counter back to zero in order to have a simple and precise synchronisation + // // with the local chirp. + // io.networkIOMutex.lock(); + // DATA_ENGINE_DEBUG << "GPS 1 PPS"; + // io.networkIOMutex.unlock(); + + // // remove the last sample (real and imag) and enqueue the buffer + // chirpData.removeLast(); + // chirpData.removeLast(); + // io.chirp_queue.enqueue(chirpData); + + // // empty the buffer and add the last sample, which is the starting point of the chirp + // m_chirpSamples = 0; + // chirpData.clear(); + + // chirpData << m_lsample; + // chirpData << m_rsample; + + // m_chirpStart = true; + // m_chirpStartSample = m_rxSamples; + // m_chirpGateBit = false; + // } + // } + // else + // m_chirpGateBit = true; + //} + m_rxSamples++; + m_chirpSamples++; + + // when we have enough rx samples we start the DSP processing. + if (m_rxSamples == BUFFER_SIZE) { + + for (int r = 0; r < de->io.receivers; r++) { + + if (de->RX.at(r)->qtdsp) { + + QMetaObject::invokeMethod(de->RX.at(r), "dspProcessing", Qt::DirectConnection);// Qt::QueuedConnection); + } + } + m_rxSamples = 0; + } + } + } + else { + + if (m_SyncChangedTime.elapsed() > 10) { + + set->setProtocolSync(2); + m_SyncChangedTime.restart(); + } + } +} + +void DataProcessor::decodeCCBytes(const QByteArray &buffer) { + + de->io.ccRx.ptt = (bool)((buffer.at(0) & 0x01) == 0x01); + de->io.ccRx.dash = (bool)((buffer.at(0) & 0x02) == 0x02); + de->io.ccRx.dot = (bool)((buffer.at(0) & 0x04) == 0x04); + de->io.ccRx.lt2208 = (bool)((buffer.at(1) & 0x01) == 0x01); + + de->io.ccRx.roundRobin = (uchar)(buffer.at(0) >> 3); + + switch (de->io.ccRx.roundRobin) // cycle through C0 + { + case 0: + + if (de->io.ccRx.lt2208) // check ADC signal + { + if (m_ADCChangedTime.elapsed() > 50) + { + set->setADCOverflow(2); + m_ADCChangedTime.restart(); + } + } + + //qDebug() << "CC: " << io.ccRx.roundRobin; + if (m_hwInterface == QSDR::Hermes) + { + de->io.ccRx.hermesI01 = (bool)((buffer.at(1) & 0x02) == 0x02); + de->io.ccRx.hermesI02 = (bool)((buffer.at(1) & 0x04) == 0x04); + de->io.ccRx.hermesI03 = (bool)((buffer.at(1) & 0x08) == 0x08); + de->io.ccRx.hermesI04 = (bool)((buffer.at(1) & 0x10) == 0x10); + //qDebug() << "Hermes IO 1: " << io.ccRx.hermesI01 + // << "2: " << io.ccRx.hermesI02 + // << "3: " << io.ccRx.hermesI03 + // << "4: " << io.ccRx.hermesI04; + } + + if (m_fwCount < 100) + { + if (m_hwInterface == QSDR::Metis) + { + if (de->io.ccRx.devices.mercuryFWVersion != buffer.at(2)) + { + de->io.ccRx.devices.mercuryFWVersion = buffer.at(2); + set->setMercuryVersion(de->io.ccRx.devices.mercuryFWVersion); + de->io.networkIOMutex.lock(); + DATA_PROCESSOR_DEBUG << "Mercury firmware version: " << qPrintable(QString::number(buffer.at(2))); + de->io.networkIOMutex.unlock(); + } + + if (de->io.ccRx.devices.penelopeFWVersion != buffer.at(3)) + { + de->io.ccRx.devices.penelopeFWVersion = buffer.at(3); + de->io.ccRx.devices.pennylaneFWVersion = buffer.at(3); + set->setPenelopeVersion(de->io.ccRx.devices.penelopeFWVersion); + set->setPennyLaneVersion(de->io.ccRx.devices.penelopeFWVersion); + de->io.networkIOMutex.lock(); + DATA_PROCESSOR_DEBUG << "Penelope/Pennylane firmware version: " << qPrintable(QString::number(buffer.at(3))); + de->io.networkIOMutex.unlock(); + } + + if (de->io.ccRx.devices.metisFWVersion != buffer.at(4)) + { + de->io.ccRx.devices.metisFWVersion = buffer.at(4); + set->setMetisVersion(de->io.ccRx.devices.metisFWVersion); + de->io.networkIOMutex.lock(); + DATA_PROCESSOR_DEBUG << "Metis firmware version: " << qPrintable(QString::number(buffer.at(4))); + de->io.networkIOMutex.unlock(); + } + } + else if (set->getHWInterface() == QSDR::Hermes) { + + if (de->io.ccRx.devices.hermesFWVersion != buffer.at(4)) { + + de->io.ccRx.devices.hermesFWVersion = buffer.at(4); + set->setHermesVersion(de->io.ccRx.devices.hermesFWVersion); + de->io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "Hermes firmware version: " << qPrintable(QString::number(buffer.at(4))); + de->io.networkIOMutex.unlock(); + } + } + m_fwCount++; + } + break; + + case 1: + + //qDebug() << "CC: " << io.ccRx.roundRobin; + // forward power + if (set->getPenelopePresence() || (m_hwInterface == QSDR::Hermes)) { // || set->getPennyLanePresence() + + de->io.ccRx.ain5 = (quint16)((quint16)(buffer.at(1) << 8) + (quint16)buffer.at(2)); + + de->io.penelopeForwardVolts = (qreal)(3.3 * (qreal)de->io.ccRx.ain5 / 4095.0); + de->io.penelopeForwardPower = (qreal)(de->io.penelopeForwardVolts * de->io.penelopeForwardVolts / 0.09); + } + //qDebug() << "penelopeForwardVolts: " << io.penelopeForwardVolts << "penelopeForwardPower" << io.penelopeForwardPower; + + if (set->getAlexPresence()) { //|| set->getApolloPresence()) { + + de->io.ccRx.ain1 = (quint16)((quint16)(buffer.at(3) << 8) + (quint16)buffer.at(4)); + + de->io.alexForwardVolts = (qreal)(3.3 * (qreal)de->io.ccRx.ain1 / 4095.0); + de->io.alexForwardPower = (qreal)(de->io.alexForwardVolts * de->io.alexForwardVolts / 0.09); + } + //qDebug() << "alexForwardVolts: " << io.alexForwardVolts << "alexForwardPower" << io.alexForwardPower; + break; + + case 2: + + //qDebug() << "CC: " << io.ccRx.roundRobin; + // reverse power + if (set->getAlexPresence()) { //|| set->getApolloPresence()) { + + de->io.ccRx.ain2 = (quint16)((quint16)(buffer.at(1) << 8) + (quint16)buffer.at(2)); + + de->io.alexReverseVolts = (qreal)(3.3 * (qreal)de->io.ccRx.ain2 / 4095.0); + de->io.alexReversePower = (qreal)(de->io.alexReverseVolts * de->io.alexReverseVolts / 0.09); + } + //qDebug() << "alexReverseVolts: " << io.alexReverseVolts << "alexReversePower" << io.alexReversePower; + + if (set->getPenelopePresence() || (m_hwInterface == QSDR::Hermes)) { // || set->getPennyLanePresence() { + + de->io.ccRx.ain3 = (quint16)((quint16)(buffer.at(3) << 8) + (quint16)buffer.at(4)); + de->io.ain3Volts = (qreal)(3.3 * (double)de->io.ccRx.ain3 / 4095.0); + } + //qDebug() << "ain3Volts: " << io.ain3Volts; + break; + + case 3: + + //qDebug() << "CC: " << io.ccRx.roundRobin; + + if (set->getPenelopePresence() || (m_hwInterface == QSDR::Hermes)) { // || set->getPennyLanePresence() { + + de->io.ccRx.ain4 = (quint16)((quint16)(buffer.at(1) << 8) + (quint16)buffer.at(2)); + de->io.ccRx.ain6 = (quint16)((quint16)(buffer.at(3) << 8) + (quint16)buffer.at(4)); + + de->io.ain4Volts = (qreal)(3.3 * (qreal)de->io.ccRx.ain4 / 4095.0); + + if (set->getHWInterface() == QSDR::Hermes) // read supply volts applied to board + de->io.supplyVolts = (qreal)((qreal)de->io.ccRx.ain6 / 186.0f); + } + //qDebug() << "ain4Volts: " << io.ain4Volts << "supplyVolts" << io.supplyVolts; + break; + + //case 4: + + // more than 1 Mercury module (currently not usable) + //qDebug() << "CC: " << io.ccRx.roundRobin; + //switch (io.receivers) { + + // case 1: + // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); + // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208; + // break; + + // case 2: + // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); + // io.ccRx.mercury2_LT2208 = (bool)((buffer.at(2) & 0x02) == 0x02); + // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208 << "mercury2_LT2208" << io.ccRx.mercury2_LT2208; + // break; + + // case 3: + // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); + // io.ccRx.mercury2_LT2208 = (bool)((buffer.at(2) & 0x02) == 0x02); + // io.ccRx.mercury3_LT2208 = (bool)((buffer.at(3) & 0x02) == 0x02); + // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208 << "mercury2_LT2208" << io.ccRx.mercury2_LT2208; + // //qDebug() << "mercury3_LT2208: " << io.ccRx.mercury3_LT2208; + // break; + + // case 4: + // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); + // io.ccRx.mercury2_LT2208 = (bool)((buffer.at(2) & 0x02) == 0x02); + // io.ccRx.mercury3_LT2208 = (bool)((buffer.at(3) & 0x02) == 0x02); + // io.ccRx.mercury4_LT2208 = (bool)((buffer.at(4) & 0x02) == 0x02); + // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208 << "mercury2_LT2208" << io.ccRx.mercury2_LT2208; + // //qDebug() << "mercury3_LT2208: " << io.ccRx.mercury3_LT2208 << "mercury4_LT2208" << io.ccRx.mercury4_LT2208; + // break; + //} + //break; + } // end switch cycle through C0 +} + +void DataProcessor::setOutputBuffer(int rx, const CPX &buffer) { + + if (rx == de->io.currentReceiver) { + processOutputBuffer(buffer); + } +} + +void DataProcessor::processOutputBuffer(const CPX &buffer) { + + //DATA_PROCESSOR_DEBUG << "processOutputBuffer: " << this->thread(); + + qint16 leftRXSample; + qint16 rightRXSample; + qint16 leftTXSample; + qint16 rightTXSample; + + // process the output + for (int j = 0; j < BUFFER_SIZE; j += de->io.outputMultiplier) { + + leftRXSample = (qint16)(buffer.at(j).re * 32767.0f); + rightRXSample = (qint16)(buffer.at(j).im * 32767.0f); + + leftTXSample = 0; + rightTXSample = 0; + + de->io.output_buffer[m_idx++] = leftRXSample >> 8; + de->io.output_buffer[m_idx++] = leftRXSample; + de->io.output_buffer[m_idx++] = rightRXSample >> 8; + de->io.output_buffer[m_idx++] = rightRXSample; + de->io.output_buffer[m_idx++] = leftTXSample >> 8; + de->io.output_buffer[m_idx++] = leftTXSample; + de->io.output_buffer[m_idx++] = rightTXSample >> 8; + de->io.output_buffer[m_idx++] = rightTXSample; + + if (m_idx == IO_BUFFER_SIZE) { + + //if (de->m_audioBuffer.length() == 1024) { + + // //m_audioEngine->setAudioBuffer(this, m_audioBuffer); + // de->m_audioBuffer.resize(0); + //} + // set the C&C bytes + encodeCCBytes(); + + switch (m_hwInterface) { + + case QSDR::Metis: + case QSDR::Hermes: + + de->io.audioDatagram.resize(IO_BUFFER_SIZE); + de->io.audioDatagram = QByteArray::fromRawData((const char *)&de->io.output_buffer, IO_BUFFER_SIZE); + + //if (m_dataIOThreadRunning) { + // de->m_dataIO->writeData(); + //} + + de->m_dataIO->sendAudio(de->io.output_buffer); //RRK + + writeData(); + break; + + case QSDR::NoInterfaceMode: + break; + } + m_idx = IO_HEADER_SIZE; + } + } +} + +void DataProcessor::encodeCCBytes() { + + de->io.output_buffer[0] = SYNC; + de->io.output_buffer[1] = SYNC; + de->io.output_buffer[2] = SYNC; + + de->io.mutex.lock(); + switch (m_sendState) { + + case 0: + + uchar rxAnt; + uchar rxOut; + uchar ant; + + de->io.control_out[0] = 0x0; // C0 + de->io.control_out[1] = 0x0; // C1 + de->io.control_out[2] = 0x0; // C2 + de->io.control_out[3] = 0x0; // C3 + de->io.control_out[4] = 0x0; // C4 + + // C0 + // 0 0 0 0 0 0 0 0 + // | + // +------------ MOX (1 = active, 0 = inactive) + + // set C1 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + +------------ Speed (00 = 48kHz, 01 = 96kHz, 10 = 192kHz) + // | | | | + +---------------- 10MHz Ref. (00 = Atlas/Excalibur, 01 = Penelope, 10 = Mercury)* + // | | | +-------------------- 122.88MHz source (0 = Penelope, 1 = Mercury)* + // | + +---------------------- Config (00 = nil, 01 = Penelope, 10 = Mercury, 11 = both)* + // +-------------------------- Mic source (0 = Janus, 1 = Penelope)* + // + // * Ignored by Hermes + + de->io.control_out[1] |= de->io.speed; // sample rate + + de->io.control_out[1] &= 0x03; // 0 0 0 0 0 0 1 1 + de->io.control_out[1] |= de->io.ccTx.clockByte; + + // set C2 + // + // 0 0 0 0 0 0 0 0 + // | | | + // | | +------------ Mode (1 = Class E, 0 = All other modes) + // +---------- +-------------- Open Collector Outputs on Penelope or Hermes (bit 6...bit 0) + + de->io.control_out[2] = de->io.rxClass; + + if (de->io.ccTx.pennyOCenabled) { + + de->io.control_out[2] &= 0x1; // 0 0 0 0 0 0 0 1 + + if (de->io.ccTx.currentBand != (HamBand) gen) { + + if (de->io.ccTx.mox || de->io.ccTx.ptt) + de->io.control_out[2] |= (de->io.ccTx.txJ6pinList.at(de->io.ccTx.currentBand) >> 1) << 1; + else + de->io.control_out[2] |= (de->io.ccTx.rxJ6pinList.at(de->io.ccTx.currentBand) >> 1) << 1; + } + } + + + // set C3 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + +------------ Alex Attenuator (00 = 0dB, 01 = 10dB, 10 = 20dB, 11 = 30dB) + // | | | | | +---------------- Preamp On/Off (0 = Off, 1 = On) + // | | | | +------------------ LT2208 Dither (0 = Off, 1 = On) + // | | | + ------------------- LT2208 Random (0= Off, 1 = On) + // | + + --------------------- Alex Rx Antenna (00 = none, 01 = Rx1, 10 = Rx2, 11 = XV) + // + ------------------------- Alex Rx out (0 = off, 1 = on). Set if Alex Rx Antenna > 00. + + + rxAnt = 0x07 & (de->io.ccTx.alexStates.at(de->io.ccTx.currentBand) >> 2); + rxOut = (rxAnt > 0) ? 1 : 0; + + de->io.control_out[3] = (de->io.ccTx.alexStates.at(de->io.ccTx.currentBand) >> 7); + + de->io.control_out[3] &= 0xFB; // 1 1 1 1 1 0 1 1 + de->io.control_out[3] |= (de->io.ccTx.mercuryAttenuator << 2); + + de->io.control_out[3] &= 0xF7; // 1 1 1 1 0 1 1 1 + de->io.control_out[3] |= (de->io.ccTx.dither << 3); + + de->io.control_out[3] &= 0xEF; // 1 1 1 0 1 1 1 1 + de->io.control_out[3] |= (de->io.ccTx.random << 4); + + de->io.control_out[3] &= 0x9F; // 1 0 0 1 1 1 1 1 + de->io.control_out[3] |= rxAnt << 5; + + de->io.control_out[3] &= 0x7F; // 0 1 1 1 1 1 1 1 + de->io.control_out[3] |= rxOut << 7; + + // set C4 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + + ----------- Alex Tx relay (00 = Tx1, 01= Tx2, 10 = Tx3) + // | | | | | + --------------- Duplex (0 = off, 1 = on) // + + + + +------------------ Number of Receivers (000 = 1, 11111 = 32) //RRK removed 4HL - // | +------------------------ Time stamp - 1PPS on LSB of Mic data (0 = off, 1 = on) - // +-------------------------- Common Mercury Frequency (0 = independent frequencies to Mercury - // Boards, 1 = same frequency to all Mercury boards) - - if (de->io.ccTx.mox || de->io.ccTx.ptt) - ant = (de->io.ccTx.alexStates.at(de->io.ccTx.currentBand) >> 5); - else - ant = de->io.ccTx.alexStates.at(de->io.ccTx.currentBand); - - de->io.control_out[4] |= (ant != 0) ? ant-1 : ant; - - de->io.control_out[4] &= 0xFB; // 1 1 1 1 1 0 1 1 - de->io.control_out[4] |= de->io.ccTx.duplex << 2; - + // | +------------------------ Time stamp - 1PPS on LSB of Mic data (0 = off, 1 = on) + // +-------------------------- Common Mercury Frequency (0 = independent frequencies to Mercury + // Boards, 1 = same frequency to all Mercury boards) + + if (de->io.ccTx.mox || de->io.ccTx.ptt) + ant = (de->io.ccTx.alexStates.at(de->io.ccTx.currentBand) >> 5); + else + ant = de->io.ccTx.alexStates.at(de->io.ccTx.currentBand); + + de->io.control_out[4] |= (ant != 0) ? ant-1 : ant; + + de->io.control_out[4] &= 0xFB; // 1 1 1 1 1 0 1 1 + de->io.control_out[4] |= de->io.ccTx.duplex << 2; + de->io.control_out[4] &= 0x07; // 0 0 0 0 0 1 1 1 - de->io.control_out[4] |= (de->io.receivers - 1) << 3; - + de->io.control_out[4] |= (de->io.receivers - 1) << 3; + //RRK removed 4HL //de->io.control_out[4] &= 0xBF; // 1 0 1 1 1 1 1 1 //de->io.control_out[4] |= de->io.ccTx.timeStamp << 6; - + //de->io.control_out[4] &= 0x7F; // 0 1 1 1 1 1 1 1 //de->io.control_out[4] |= de->io.ccTx.commonMercuryFrequencies << 7; - - // fill the out buffer with the C&C bytes - for (int i = 0; i < 5; i++) - de->io.output_buffer[i+3] = de->io.control_out[i]; - - m_sendState = 1; - break; - - case 1: - - // C0 - // 0 0 0 0 0 0 1 x C1, C2, C3, C4 NCO Frequency in Hz for Transmitter, Apollo ATU - // (32 bit binary representation - MSB in C1) - - de->io.output_buffer[3] = 0x2; // C0 - - if (de->io.tx_freq_change >= 0) { - - de->io.output_buffer[4] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency() >> 24; - de->io.output_buffer[5] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency() >> 16; - de->io.output_buffer[6] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency() >> 8; - de->io.output_buffer[7] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency(); - - de->io.tx_freq_change = -1; - } - - m_sendState = de->io.ccTx.duplex ? 2 : 3; - break; - - case 2: - - // C0 = 0 0 0 0 0 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver_1 - // C0 = 0 0 0 0 0 1 1 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _2 - // C0 = 0 0 0 0 1 0 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _3 - // C0 = 0 0 0 0 1 0 1 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _4 - // C0 = 0 0 0 0 1 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _5 - // C0 = 0 0 0 0 1 1 1 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _6 - // C0 = 0 0 0 1 0 0 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _7 + + // fill the out buffer with the C&C bytes + for (int i = 0; i < 5; i++) + de->io.output_buffer[i+3] = de->io.control_out[i]; + + m_sendState = 1; + break; + + case 1: + + // C0 + // 0 0 0 0 0 0 1 x C1, C2, C3, C4 NCO Frequency in Hz for Transmitter, Apollo ATU + // (32 bit binary representation - MSB in C1) + + de->io.output_buffer[3] = 0x2; // C0 + + if (de->io.tx_freq_change >= 0) { + + de->io.output_buffer[4] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency() >> 24; + de->io.output_buffer[5] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency() >> 16; + de->io.output_buffer[6] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency() >> 8; + de->io.output_buffer[7] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency(); + + de->io.tx_freq_change = -1; + } + + m_sendState = de->io.ccTx.duplex ? 2 : 3; + break; + + case 2: + + // C0 = 0 0 0 0 0 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver_1 + // C0 = 0 0 0 0 0 1 1 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _2 + // C0 = 0 0 0 0 1 0 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _3 + // C0 = 0 0 0 0 1 0 1 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _4 + // C0 = 0 0 0 0 1 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _5 + // C0 = 0 0 0 0 1 1 1 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _6 + // C0 = 0 0 0 1 0 0 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _7 // C0 = 0 0 1 0 0 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _8 // Was 0 0 0 1 0 0 1 x // C0 = 0 0 1 1 0 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _16 - + // C0 = 0 0 1 1 0 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _16 + // RRK, workaround for gige timing bug, make sure all rx freq's are sent on init. if (firstTimeRxInit) { firstTimeRxInit -= 1; de->io.rx_freq_change = firstTimeRxInit; } - if (de->io.rx_freq_change >= 0) { - + if (de->io.rx_freq_change >= 0) { + de->io.output_buffer[3] = (de->io.rx_freq_change < 7) ? (de->io.rx_freq_change + 2) << 1 : (de->io.rx_freq_change + 11) << 1; //RRK removed 4HL de->io.output_buffer[3] = (de->io.rx_freq_change + 2) << 1; - de->io.output_buffer[4] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency() >> 24; - de->io.output_buffer[5] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency() >> 16; - de->io.output_buffer[6] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency() >> 8; - de->io.output_buffer[7] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency(); - - de->io.rx_freq_change = -1; - } - - m_sendState = 3; - break; - - case 3: - - de->io.control_out[0] = 0x12; // 0 0 0 1 0 0 1 0 - de->io.control_out[1] = 0x0; // C1 - de->io.control_out[2] = 0x0; // C2 - de->io.control_out[3] = 0x0; // C3 - de->io.control_out[4] = 0x0; // C4 - - // C1 - // 0 0 0 0 0 0 0 0 - // | | - // +-------------+------------ Hermes/PennyLane Drive Level (0-255) (ignored by Penelope) - - - // C2 - // 0 0 0 0 0 0 0 0 - // | | | | | | | | - // | | | | | | | +------------ Hermes/Metis Penelope Mic boost (0 = 0dB, 1 = 20dB) - // | | | | | | +-------------- Metis/Penelope or PennyLane Mic/Line-in (0 = mic, 1 = Line-in) - // | | | | | +---------------- Hermes - Enable/disable Apollo filter (0 = disable, 1 = enable) - // | | | | +------------------ Hermes - Enable/disable Apollo tuner (0 = disable, 1 = enable) - // | | | +-------------------- Hermes - Apollo auto tune (0 = end, 1 = start) - // | | +---------------------- Hermes - select filter board (0 = Alex, 1 = Apollo) - // | +------------------------ Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) - // +-------------------------- VNA mode (0 = off, 1 = on) - - // Alex configuration: - // - // manual 0 - - de->io.control_out[2] &= 0xBF; // 1 0 1 1 1 1 1 1 - de->io.control_out[2] |= (de->io.ccTx.alexConfig & 0x01) << 6; - - // C3 - // 0 0 0 0 0 0 0 0 - // | | | | | | | - // | | | | | | +------------ Alex - select 13MHz HPF (0 = disable, 1 = enable)* - // | | | | | +-------------- Alex - select 20MHz HPF (0 = disable, 1 = enable)* - // | | | | +---------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* - // | | | +------------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* - // | | +-------------------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* - // | +---------------------- Alex - Bypass all HPFs (0 = disable, 1 = enable)* - // +------------------------ Alex - 6M low noise amplifier (0 = disable, 1 = enable)* - // - // *Only valid when Alex - manual HPF/LPF filter select is enabled - - de->io.control_out[3] &= 0xFE; // 1 1 1 1 1 1 1 0 - // HPF 13 MHz: 1 0 0 0 0 0 0 - de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x40) >> 6; - - de->io.control_out[3] &= 0xFD; // 1 1 1 1 1 1 0 1 - // HPF 20 MHz: 1 0 0 0 0 0 0 0 - de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x80) >> 6; - - de->io.control_out[3] &= 0xFB; // 1 1 1 1 1 0 1 1 - // HPF 9.5 MHz: 1 0 0 0 0 0 - de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x20) >> 3; - - de->io.control_out[3] &= 0xF7; // 1 1 1 1 0 1 1 1 - // HPF 6.5 MHz: 1 0 0 0 0 - de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x10) >> 1; - - de->io.control_out[3] &= 0xEF; // 1 1 1 0 1 1 1 1 - // HPF 1.5 MHz: 1 0 0 0 - de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x08) << 1; - - de->io.control_out[3] &= 0xDF; // 1 1 0 1 1 1 1 1 - // bypass all: 1 0 - de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x02) << 4; - - de->io.control_out[3] &= 0xBF; // 1 0 1 1 1 1 1 1 - // 6m BPF/LNA: 1 0 0 - de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x04) << 4; - - de->io.control_out[3] &= 0x7F; // 0 1 1 1 1 1 1 1 - de->io.control_out[3] |= ((int)de->io.ccTx.vnaMode) << 7; - - // C4 - // 0 0 0 0 0 0 0 0 - // | | | | | | | - // | | | | | | +------------ Alex - select 30/20m LPF (0 = disable, 1 = enable)* - // | | | | | +-------------- Alex - select 60/40m LPF (0 = disable, 1 = enable)* - // | | | | +---------------- Alex - select 80m LPF (0 = disable, 1 = enable)* - // | | | +------------------ Alex - select 160m LPF (0 = disable, 1 = enable)* - // | | +-------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* - // | +---------------------- Alex - select 12/10m LPF (0 = disable, 1 = enable)* - // +------------------------ Alex - select 17/15m LPF (0 = disable, 1 = enable)* - // - // *Only valid when Alex - manual HPF/LPF filter select is enabled - - de->io.control_out[4] &= 0xFE; // 1 1 1 1 1 1 1 0 - // LPF 30/20m: 1 0 0 0 0 0 0 0 0 0 0 0 - de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x800) >> 11; - - de->io.control_out[4] &= 0xFD; // 1 1 1 1 1 1 0 1 - // LPF 60/40m: 1 0 0 0 0 0 0 0 0 0 0 - de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x400) >> 9; - - de->io.control_out[4] &= 0xFB; // 1 1 1 1 1 0 1 1 - // LPF 80m: 1 0 0 0 0 0 0 0 0 0 - de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x200) >> 7; - - de->io.control_out[4] &= 0xF7; // 1 1 1 1 0 1 1 1 - // LPF 160m: 1 0 0 0 0 0 0 0 0 - de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x100) >> 5; - - de->io.control_out[4] &= 0xEF; // 1 1 1 0 1 1 1 1 - // LPF 6m: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x4000) >> 10; - - de->io.control_out[4] &= 0xDF; // 1 1 0 1 1 1 1 1 - // LPF 12/10m : 1 0 0 0 0 0 0 0 0 0 0 0 0 0 - de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x2000) >> 8; - - de->io.control_out[4] &= 0xBF; // 1 0 1 1 1 1 1 1 - // LPF 17/15m: 1 0 0 0 0 0 0 0 0 0 0 0 0 - de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x1000) >> 6; - - // fill the out buffer with the C&C bytes - for (int i = 0; i < 5; i++) - de->io.output_buffer[i+3] = de->io.control_out[i]; - - // round finished - m_sendState = 0; - break; - } - de->io.mutex.unlock(); - - - /*switch (m_hwInterface) { - - case QSDR::Metis: - case QSDR::Hermes: - - io.audioDatagram.resize(IO_BUFFER_SIZE); - io.audioDatagram = QByteArray::fromRawData((const char *)&io.output_buffer, IO_BUFFER_SIZE); - - if (m_dataIOThreadRunning) { - m_dataIO->writeData(); - } - break; - - case QSDR::NoInterfaceMode: - break; - }*/ -} - -void DataProcessor::writeData() { - - if (m_setNetworkDeviceHeader) { - - m_outDatagram.resize(0); - m_outDatagram += m_deviceSendDataSignature; - - QByteArray seq(reinterpret_cast(&m_sendSequence), sizeof(m_sendSequence)); - - m_outDatagram += seq; - m_outDatagram += de->io.audioDatagram; - - m_sendSequence++; - m_setNetworkDeviceHeader = false; - } - else { - - //QUdpSocket socket; - //DATA_PROCESSOR_DEBUG << "writeData: " << this->thread(); - m_outDatagram += de->io.audioDatagram; - - if (de->sendSocket->writeDatagram(m_outDatagram, m_deviceAddress, DEVICE_PORT) < 0) { - DATA_PROCESSOR_DEBUG << "error sending data to device: " << de->sendSocket->errorString(); - } - - //if (m_sendSequence%100 == 0) - // DATAIO_DEBUG << m_sendSequence; - - if (m_sendSequence != m_oldSendSequence + 1) { - DATA_PROCESSOR_DEBUG << "output sequence error: old = " << m_oldSendSequence << "; new =" << m_sendSequence; - } - - m_oldSendSequence = m_sendSequence; - m_setNetworkDeviceHeader = true; - } -} - - -// ********************************************************************* -// Audio out processor - -AudioOutProcessor::AudioOutProcessor(DataEngine *de, QSDR::_ServerMode serverMode) - : QObject() - , m_dataEngine(de) - , m_serverMode(serverMode) - , m_stopped(false) -{ - m_IQDatagram.resize(0); -} - -AudioOutProcessor::~AudioOutProcessor() { -} - -void AudioOutProcessor::stop() { - - m_stopped = true; -} - -void AudioOutProcessor::processDeviceData() { - - forever { - - //m_dataEngine->processInputBuffer(m_dataEngine->io.iq_queue.dequeue()); - //DATA_ENGINE_DEBUG << "IQ queue length:" << m_dataEngine->io.iq_queue.count(); - //DATA_ENGINE_DEBUG << "iq_queue length:" << m_dataEngine->io.iq_queue.dequeue().length(); - - m_mutex.lock(); - if (m_stopped) { - m_stopped = false; - m_mutex.unlock(); - break; - } - m_mutex.unlock(); - } -} - -void AudioOutProcessor::processData() { - - forever { - - //m_dataEngine->processFileBuffer(m_dataEngine->io.data_queue.dequeue()); - - m_mutex.lock(); - if (m_stopped) { - m_stopped = false; - m_mutex.unlock(); - break; - } - m_mutex.unlock(); - } -} - - -// ********************************************************************* -// Wide band data processor - -WideBandDataProcessor::WideBandDataProcessor(THPSDRParameter *ioData, QSDR::_ServerMode serverMode, int size) - : QObject() - , io(ioData) - , set(Settings::instance()) - , m_serverMode(serverMode) - , m_size(size) - , m_bytes(0) - , m_wbSpectrumAveraging(true) - , m_stopped(false) -{ - m_WBDatagram.resize(0); - - switch (m_serverMode) { - - case QSDR::SDRMode: - - wbFFT = new QFFT(m_size); - - cpxWBIn.resize(m_size); - cpxWBOut.resize(m_size); - - io->wbWindow.resize(m_size); - io->wbWindow.fill(0.0f); - - QFilter::MakeWindow(12, m_size, (float *)io->wbWindow.data()); // 12 = BLACKMANHARRIS_WINDOW - - wbAverager = new DualModeAverager(-1, m_size/2); - - break; - - //case QSDR::ExternalDSP: - case QSDR::ChirpWSPR: - case QSDR::ChirpWSPRFile: - break; - - case QSDR::NoServerMode: - case QSDR::DemoMode: - break; - } -} - -WideBandDataProcessor::~WideBandDataProcessor() { - - delete wbFFT; - - if (wbAverager) { - - delete wbAverager; - } - - cpxWBIn.clear(); - cpxWBOut.clear(); -} - -void WideBandDataProcessor::stop() { - - //mutex.lock(); - m_stopped = true; - //mutex.unlock(); -} - -void WideBandDataProcessor::processWideBandData() { - - forever { - - processWideBandInputBuffer(io->wb_queue.dequeue()); - - m_mutex.lock(); - if (m_stopped) { - m_stopped = false; - m_mutex.unlock(); - break; - } - m_mutex.unlock(); - } -} - -void WideBandDataProcessor::processWideBandInputBuffer(const QByteArray &buffer) { - - int size; - - //if (m_mercuryFW > 32 || m_hermesFW > 16) - if (io->mercuryFW > 32 || io->hermesFW > 11) - size = 2 * BIGWIDEBANDSIZE; - else - size = 2 * SMALLWIDEBANDSIZE; - - qint64 length = buffer.length(); - if (buffer.length() != size) { - - WIDEBAND_PROCESSOR_DEBUG << "wrong wide band buffer length: " << length; - return; - } - - int s; - float sample; - float norm = 1.0f / (4 * size); - - for (int i = 0; i < length; i += 2) { - - s = (int)((qint8 ) buffer.at(i+1)) << 8; - s += (int)((quint8) buffer.at(i)); - sample = (float)(s * norm); - - cpxWBIn[i/2].re = sample * io->wbWindow.at(i/2); - cpxWBIn[i/2].im = sample * io->wbWindow.at(i/2); - } - - wbFFT->DoFFTWForward(cpxWBIn, cpxWBOut, size/2); - - // averaging - QVector specBuf(size/4); - - m_mutex.lock(); - if (m_wbSpectrumAveraging) { - - for (int i = 0; i < size/4; i++) - specBuf[i] = (float)(10.0 * log10(MagCPX(cpxWBOut.at(i)) + 1.5E-45)); - - wbAverager->ProcessDBAverager(specBuf, specBuf); - m_mutex.unlock(); - } - else { - - for (int i = 0; i < size/4; i++) - specBuf[i] = (float)(10.0 * log10(MagCPX(cpxWBOut.at(i)) + 1.5E-45)); - - m_mutex.unlock(); - } - - //set->setWidebandSpectrumBuffer(specBuf); - emit wbSpectrumBufferChanged(specBuf); -} - -void WideBandDataProcessor::setWbSpectrumAveraging(QObject* sender, int rx, bool value) { - - Q_UNUSED (sender) - - if (rx != -1) return; - - m_mutex.lock(); - m_wbSpectrumAveraging = value; - m_mutex.unlock(); -} + de->io.output_buffer[4] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency() >> 24; + de->io.output_buffer[5] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency() >> 16; + de->io.output_buffer[6] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency() >> 8; + de->io.output_buffer[7] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency(); + + de->io.rx_freq_change = -1; + } + + m_sendState = 3; + break; + + case 3: + + de->io.control_out[0] = 0x12; // 0 0 0 1 0 0 1 0 + de->io.control_out[1] = 0x0; // C1 + de->io.control_out[2] = 0x0; // C2 + de->io.control_out[3] = 0x0; // C3 + de->io.control_out[4] = 0x0; // C4 + + // C1 + // 0 0 0 0 0 0 0 0 + // | | + // +-------------+------------ Hermes/PennyLane Drive Level (0-255) (ignored by Penelope) + + + // C2 + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | | +------------ Hermes/Metis Penelope Mic boost (0 = 0dB, 1 = 20dB) + // | | | | | | +-------------- Metis/Penelope or PennyLane Mic/Line-in (0 = mic, 1 = Line-in) + // | | | | | +---------------- Hermes - Enable/disable Apollo filter (0 = disable, 1 = enable) + // | | | | +------------------ Hermes - Enable/disable Apollo tuner (0 = disable, 1 = enable) + // | | | +-------------------- Hermes - Apollo auto tune (0 = end, 1 = start) + // | | +---------------------- Hermes - select filter board (0 = Alex, 1 = Apollo) + // | +------------------------ Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) + // +-------------------------- VNA mode (0 = off, 1 = on) + + // Alex configuration: + // + // manual 0 + + de->io.control_out[2] &= 0xBF; // 1 0 1 1 1 1 1 1 + de->io.control_out[2] |= (de->io.ccTx.alexConfig & 0x01) << 6; + + // C3 + // 0 0 0 0 0 0 0 0 + // | | | | | | | + // | | | | | | +------------ Alex - select 13MHz HPF (0 = disable, 1 = enable)* + // | | | | | +-------------- Alex - select 20MHz HPF (0 = disable, 1 = enable)* + // | | | | +---------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* + // | | | +------------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* + // | | +-------------------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* + // | +---------------------- Alex - Bypass all HPFs (0 = disable, 1 = enable)* + // +------------------------ Alex - 6M low noise amplifier (0 = disable, 1 = enable)* + // + // *Only valid when Alex - manual HPF/LPF filter select is enabled + + de->io.control_out[3] &= 0xFE; // 1 1 1 1 1 1 1 0 + // HPF 13 MHz: 1 0 0 0 0 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x40) >> 6; + + de->io.control_out[3] &= 0xFD; // 1 1 1 1 1 1 0 1 + // HPF 20 MHz: 1 0 0 0 0 0 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x80) >> 6; + + de->io.control_out[3] &= 0xFB; // 1 1 1 1 1 0 1 1 + // HPF 9.5 MHz: 1 0 0 0 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x20) >> 3; + + de->io.control_out[3] &= 0xF7; // 1 1 1 1 0 1 1 1 + // HPF 6.5 MHz: 1 0 0 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x10) >> 1; + + de->io.control_out[3] &= 0xEF; // 1 1 1 0 1 1 1 1 + // HPF 1.5 MHz: 1 0 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x08) << 1; + + de->io.control_out[3] &= 0xDF; // 1 1 0 1 1 1 1 1 + // bypass all: 1 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x02) << 4; + + de->io.control_out[3] &= 0xBF; // 1 0 1 1 1 1 1 1 + // 6m BPF/LNA: 1 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x04) << 4; + + de->io.control_out[3] &= 0x7F; // 0 1 1 1 1 1 1 1 + de->io.control_out[3] |= ((int)de->io.ccTx.vnaMode) << 7; + + // C4 + // 0 0 0 0 0 0 0 0 + // | | | | | | | + // | | | | | | +------------ Alex - select 30/20m LPF (0 = disable, 1 = enable)* + // | | | | | +-------------- Alex - select 60/40m LPF (0 = disable, 1 = enable)* + // | | | | +---------------- Alex - select 80m LPF (0 = disable, 1 = enable)* + // | | | +------------------ Alex - select 160m LPF (0 = disable, 1 = enable)* + // | | +-------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* + // | +---------------------- Alex - select 12/10m LPF (0 = disable, 1 = enable)* + // +------------------------ Alex - select 17/15m LPF (0 = disable, 1 = enable)* + // + // *Only valid when Alex - manual HPF/LPF filter select is enabled + + de->io.control_out[4] &= 0xFE; // 1 1 1 1 1 1 1 0 + // LPF 30/20m: 1 0 0 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x800) >> 11; + + de->io.control_out[4] &= 0xFD; // 1 1 1 1 1 1 0 1 + // LPF 60/40m: 1 0 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x400) >> 9; + + de->io.control_out[4] &= 0xFB; // 1 1 1 1 1 0 1 1 + // LPF 80m: 1 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x200) >> 7; + + de->io.control_out[4] &= 0xF7; // 1 1 1 1 0 1 1 1 + // LPF 160m: 1 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x100) >> 5; + + de->io.control_out[4] &= 0xEF; // 1 1 1 0 1 1 1 1 + // LPF 6m: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x4000) >> 10; + + de->io.control_out[4] &= 0xDF; // 1 1 0 1 1 1 1 1 + // LPF 12/10m : 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x2000) >> 8; + + de->io.control_out[4] &= 0xBF; // 1 0 1 1 1 1 1 1 + // LPF 17/15m: 1 0 0 0 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x1000) >> 6; + + // fill the out buffer with the C&C bytes + for (int i = 0; i < 5; i++) + de->io.output_buffer[i+3] = de->io.control_out[i]; + + // round finished + m_sendState = 0; + break; + } + de->io.mutex.unlock(); + + + /*switch (m_hwInterface) { + + case QSDR::Metis: + case QSDR::Hermes: + + io.audioDatagram.resize(IO_BUFFER_SIZE); + io.audioDatagram = QByteArray::fromRawData((const char *)&io.output_buffer, IO_BUFFER_SIZE); + + if (m_dataIOThreadRunning) { + m_dataIO->writeData(); + } + break; + + case QSDR::NoInterfaceMode: + break; + }*/ +} + +void DataProcessor::writeData() { + + if (m_setNetworkDeviceHeader) { + + //RRK updated for 4byte int and network order + quint32 outseq = qFromBigEndian(m_sendSequence); + m_outDatagram.resize(0); + m_outDatagram += m_deviceSendDataSignature; + + QByteArray seq(reinterpret_cast(&outseq), sizeof(outseq)); + + m_outDatagram += seq; + m_outDatagram += de->io.audioDatagram; + + m_sendSequence++; + m_setNetworkDeviceHeader = false; + } + else { + + //QUdpSocket socket; + //DATA_PROCESSOR_DEBUG << "writeData: " << this->thread(); + m_outDatagram += de->io.audioDatagram; + + if (de->sendSocket->writeDatagram(m_outDatagram, m_deviceAddress, DEVICE_PORT) < 0) { + DATA_PROCESSOR_DEBUG << "error sending data to device: " << de->sendSocket->errorString(); + } + + //if (m_sendSequence%100 == 0) + // DATAIO_DEBUG << m_sendSequence; + + if (m_sendSequence != m_oldSendSequence + 1) { + DATA_PROCESSOR_DEBUG << "output sequence error: old = " << m_oldSendSequence << "; new =" << m_sendSequence; + } + + m_oldSendSequence = m_sendSequence; + m_setNetworkDeviceHeader = true; + } +} + + +// ********************************************************************* +// Audio out processor + +AudioOutProcessor::AudioOutProcessor(DataEngine *de, QSDR::_ServerMode serverMode) + : QObject() + , m_dataEngine(de) + , m_serverMode(serverMode) + , m_stopped(false) +{ + m_IQDatagram.resize(0); +} + +AudioOutProcessor::~AudioOutProcessor() { +} + +void AudioOutProcessor::stop() { + + m_stopped = true; +} + +void AudioOutProcessor::processDeviceData() { + + forever { + + //m_dataEngine->processInputBuffer(m_dataEngine->io.iq_queue.dequeue()); + //DATA_ENGINE_DEBUG << "IQ queue length:" << m_dataEngine->io.iq_queue.count(); + //DATA_ENGINE_DEBUG << "iq_queue length:" << m_dataEngine->io.iq_queue.dequeue().length(); + + m_mutex.lock(); + if (m_stopped) { + m_stopped = false; + m_mutex.unlock(); + break; + } + m_mutex.unlock(); + } +} + +void AudioOutProcessor::processData() { + + forever { + + //m_dataEngine->processFileBuffer(m_dataEngine->io.data_queue.dequeue()); + + m_mutex.lock(); + if (m_stopped) { + m_stopped = false; + m_mutex.unlock(); + break; + } + m_mutex.unlock(); + } +} + + +// ********************************************************************* +// Wide band data processor + +WideBandDataProcessor::WideBandDataProcessor(THPSDRParameter *ioData, QSDR::_ServerMode serverMode, int size) + : QObject() + , io(ioData) + , set(Settings::instance()) + , m_serverMode(serverMode) + , m_size(size) + , m_bytes(0) + , m_wbSpectrumAveraging(true) + , m_stopped(false) +{ + m_WBDatagram.resize(0); + + switch (m_serverMode) { + + case QSDR::SDRMode: + + wbFFT = new QFFT(m_size); + + cpxWBIn.resize(m_size); + cpxWBOut.resize(m_size); + + io->wbWindow.resize(m_size); + io->wbWindow.fill(0.0f); + + QFilter::MakeWindow(12, m_size, (float *)io->wbWindow.data()); // 12 = BLACKMANHARRIS_WINDOW + + wbAverager = new DualModeAverager(-1, m_size/2); + + break; + + //case QSDR::ExternalDSP: + case QSDR::ChirpWSPR: + case QSDR::ChirpWSPRFile: + break; + + case QSDR::NoServerMode: + case QSDR::DemoMode: + break; + } +} + +WideBandDataProcessor::~WideBandDataProcessor() { + + delete wbFFT; + + if (wbAverager) { + + delete wbAverager; + } + + cpxWBIn.clear(); + cpxWBOut.clear(); +} + +void WideBandDataProcessor::stop() { + + //mutex.lock(); + m_stopped = true; + //mutex.unlock(); +} + +void WideBandDataProcessor::processWideBandData() { + + forever { + + processWideBandInputBuffer(io->wb_queue.dequeue()); + + m_mutex.lock(); + if (m_stopped) { + m_stopped = false; + m_mutex.unlock(); + break; + } + m_mutex.unlock(); + } +} + +void WideBandDataProcessor::processWideBandInputBuffer(const QByteArray &buffer) { + + int size; + + //if (m_mercuryFW > 32 || m_hermesFW > 16) + if (io->mercuryFW > 32 || io->hermesFW > 11) + size = 2 * BIGWIDEBANDSIZE; + else + size = 2 * SMALLWIDEBANDSIZE; + + qint64 length = buffer.length(); + if (buffer.length() != size) { + + WIDEBAND_PROCESSOR_DEBUG << "wrong wide band buffer length: " << length; + return; + } + + int s; + float sample; + float norm = 1.0f / (4 * size); + + for (int i = 0; i < length; i += 2) { + + s = (int)((qint8 ) buffer.at(i+1)) << 8; + s += (int)((quint8) buffer.at(i)); + sample = (float)(s * norm); + + cpxWBIn[i/2].re = sample * io->wbWindow.at(i/2); + cpxWBIn[i/2].im = sample * io->wbWindow.at(i/2); + } + + wbFFT->DoFFTWForward(cpxWBIn, cpxWBOut, size/2); + + // averaging + QVector specBuf(size/4); + + m_mutex.lock(); + if (m_wbSpectrumAveraging) { + + for (int i = 0; i < size/4; i++) + specBuf[i] = (float)(10.0 * log10(MagCPX(cpxWBOut.at(i)) + 1.5E-45)); + + wbAverager->ProcessDBAverager(specBuf, specBuf); + m_mutex.unlock(); + } + else { + + for (int i = 0; i < size/4; i++) + specBuf[i] = (float)(10.0 * log10(MagCPX(cpxWBOut.at(i)) + 1.5E-45)); + + m_mutex.unlock(); + } + + //set->setWidebandSpectrumBuffer(specBuf); + emit wbSpectrumBufferChanged(specBuf); +} + +void WideBandDataProcessor::setWbSpectrumAveraging(QObject* sender, int rx, bool value) { + + Q_UNUSED (sender) + + if (rx != -1) return; + + m_mutex.lock(); + m_wbSpectrumAveraging = value; + m_mutex.unlock(); +} diff --git a/Source/src/DataEngine/cusdr_dataEngine.h b/Source/src/DataEngine/cusdr_dataEngine.h index a1a7298..770a8fa 100644 --- a/Source/src/DataEngine/cusdr_dataEngine.h +++ b/Source/src/DataEngine/cusdr_dataEngine.h @@ -420,8 +420,10 @@ private: unsigned short m_offset; unsigned short m_length; - long m_sendSequence; - long m_oldSendSequence; +//RRK long m_sendSequence; +//RRK long m_oldSendSequence; + quint32 m_sendSequence; + quint32 m_oldSendSequence; volatile bool m_stopped; diff --git a/Source/src/DataEngine/cusdr_dataIO.cpp b/Source/src/DataEngine/cusdr_dataIO.cpp index 61e4ebf..29119a3 100644 --- a/Source/src/DataEngine/cusdr_dataIO.cpp +++ b/Source/src/DataEngine/cusdr_dataIO.cpp @@ -120,6 +120,7 @@ void DataIO::stop() { io->networkIOMutex.unlock(); if(m_pSoundCardOut) { + SleeperThread::msleep(100); m_pSoundCardOut->Stop(); delete m_pSoundCardOut; } diff --git a/Source/src/DataEngine/cusdr_discoverer.cpp b/Source/src/DataEngine/cusdr_discoverer.cpp index 3177281..1e205e1 100644 --- a/Source/src/DataEngine/cusdr_discoverer.cpp +++ b/Source/src/DataEngine/cusdr_discoverer.cpp @@ -1,271 +1,302 @@ -/** -* @file cusdr_discoverer.cpp -* @brief HPSDR device discoverer class -* @author Hermann von Hasseln, DL3HVH -* @version 0.1 -* @date 2012-05-19 -*/ - -/* - * - * Copyright 2012 Hermann von Hasseln, DL3HVH - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License version 2 as - * published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#define LOG_DISCOVERER - -#include "cusdr_discoverer.h" -#include "Util/cusdr_buttons.h" - - -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include - +/** +* @file cusdr_discoverer.cpp +* @brief HPSDR device discoverer class +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-05-19 +*/ - -//#define btn_height 18 -//#define btn_width 74 - -Discoverer::Discoverer(THPSDRParameter *ioData) - : QObject() - , set(Settings::instance()) - , io(ioData) -{ - m_deviceCards = set->getMetisCardsList(); -} - -Discoverer::~Discoverer() { -} - -void Discoverer::initHPSDRDevice() { - - m_searchTime.start(); - - int deviceNo = 0; - while (deviceNo == 0) { - - deviceNo = findHPSDRDevices(); - - if (deviceNo > 1) { - - set->setHPSDRDeviceNumber(deviceNo); - break; - } - - if (deviceNo > 0) { - - set->setHPSDRDeviceNumber(deviceNo); - break; - } - - if (m_searchTime.elapsed() > 1000) { - - set->setHPSDRDeviceNumber(0); - break; - } - - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "no device found - trying again..."; - io->networkIOMutex.unlock(); - } - - io->networkIOMutex.lock(); - io->devicefound.wakeAll(); - io->networkIOMutex.unlock(); -} - -int Discoverer::findHPSDRDevices() { - - int devicesFound = 0; - - m_findDatagram.resize(63); - m_findDatagram[0] = (char)0xEF; - m_findDatagram[1] = (char)0xFE; - m_findDatagram[2] = (char)0x02; - for (int i = 3; i < 63; i++) - m_findDatagram[i] = (char)0x00; - - QUdpSocket socket; - - CHECKED_CONNECT( - &socket, - SIGNAL(error(QAbstractSocket::SocketError)), - this, - SLOT(displayDiscoverySocketError(QAbstractSocket::SocketError))); - - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "using " << qPrintable(QHostAddress(set->getHPSDRDeviceLocalAddr()).toString()) << " for discovery."; - io->networkIOMutex.unlock(); - - // clear comboBox entries in the network dialogue - set->clearNetworkIOComboBoxEntry(); - -#if defined(Q_OS_WIN32) - - if (socket.bind( - QHostAddress(set->getHPSDRDeviceLocalAddr()), 0, - QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress)) - //QUdpSocket::ReuseAddressHint)) - { - set->setMetisPort(this, socket.localPort()); - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "discovery_socket bound successfully to port " << socket.localPort(); - io->networkIOMutex.unlock(); - } - else { - - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "discovery_socket bind failed."; - io->networkIOMutex.unlock(); - - socket.close(); - return 0; - } -#elif defined(Q_OS_LINUX) - - if (socket.bind( - QHostAddress(set->getHPSDRDeviceLocalAddr()), - QUdpSocket::DefaultForPlatform)) - { - CHECKED_CONNECT( - &socket, - SIGNAL(error(QAbstractSocket::SocketError)), - this, - SLOT(displayDiscoverySocketError(QAbstractSocket::SocketError))); - - set->setMetisPort(this, socket.localPort()); - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "discovery_socket bound successfully to port " << socket.localPort(); - io->networkIOMutex.unlock(); - } - else { - - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "discovery_socket bind failed."; - io->networkIOMutex.unlock(); - - socket.close(); - return 0; - } -#endif - - if (socket.writeDatagram(m_findDatagram, QHostAddress::Broadcast, DEVICE_PORT) == 63) { - - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "discovery data sent."; - io->networkIOMutex.unlock(); - } - else { - - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "discovery data not sent."; - io->networkIOMutex.unlock(); - } - - - // wait a little - //SleeperThread::msleep(30); - SleeperThread::msleep(500); - - while (socket.hasPendingDatagrams()) { - - TNetworkDevicecard mc; - quint16 port; - - m_deviceDatagram.resize(socket.pendingDatagramSize()); - socket.readDatagram(m_deviceDatagram.data(), m_deviceDatagram.size(), &mc.ip_address, &port); - - if (m_deviceDatagram[0] == (char)0xEF && m_deviceDatagram[1] == (char)0xFE) { - - if (m_deviceDatagram[2] == (char)0x02) { - - sprintf(mc.mac_address, "%02X:%02X:%02X:%02X:%02X:%02X", - m_deviceDatagram[3] & 0xFF, m_deviceDatagram[4] & 0xFF, m_deviceDatagram[5] & 0xFF, - m_deviceDatagram[6] & 0xFF, m_deviceDatagram[7] & 0xFF, m_deviceDatagram[8] & 0xFF); - - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "Device found at " << qPrintable(mc.ip_address.toString()) << ":" << port << "; Mac addr: [" << mc.mac_address << "]"; - DISCOVERER_DEBUG << "Device code version: " << qPrintable(QString::number(m_deviceDatagram.at(9), 16)); - io->networkIOMutex.unlock(); - - int no = m_deviceDatagram.at(10); - QString str; - if (no == 0) - str = "Metis"; - else if (no == 1) - str = "Hermes"; - else if (no == 2) - str = "Griffin"; - else if (no == 4) - str = "Angelia"; - - mc.boardID = no; - mc.boardName = str; - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "Device board ID: " << no; - DISCOVERER_DEBUG << "Device is: " << qPrintable(str); - io->networkIOMutex.unlock(); - - m_deviceCards.append(mc); - - str += " ("; - str += mc.ip_address.toString(); - str += ")"; - - set->addNetworkIOComboBoxEntry(str); - devicesFound++; - } - else if (m_deviceDatagram[2] == (char)0x03) { - - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "Device already sending data!"; - io->networkIOMutex.unlock(); - } - } - - } - set->setMetisCardList(m_deviceCards); - - if (devicesFound == 1) { - - set->setCurrentHPSDRDevice(m_deviceCards.at(0)); - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "Device selected: " << qPrintable(m_deviceCards.at(0).ip_address.toString()); - io->networkIOMutex.unlock(); - } - - socket.close(); - return devicesFound; -} - -void Discoverer::displayDiscoverySocketError(QAbstractSocket::SocketError error) { - - io->networkIOMutex.lock(); - DISCOVERER_DEBUG << "discovery socket error: " << error; - io->networkIOMutex.unlock(); -} - -void Discoverer::clear() { - - //m_metisDeviceComboBox->clear(); - m_deviceCards.clear(); -} +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_DISCOVERER + +#include "cusdr_discoverer.h" +#include "Util/cusdr_buttons.h" + + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include + + + +//#define btn_height 18 +//#define btn_width 74 + +Discoverer::Discoverer(THPSDRParameter *ioData) + : QObject() + , set(Settings::instance()) + , io(ioData) +{ + m_deviceCards = set->getMetisCardsList(); +} + +Discoverer::~Discoverer() { +} + +TNetworkDevicecard mc; + +void Discoverer::initHPSDRDevice() { + + m_searchTime.start(); + + int deviceNo = 0; + while (deviceNo == 0) { + + deviceNo = findHPSDRDevices(); + + if (deviceNo > 1) { + + set->setHPSDRDeviceNumber(deviceNo); + break; + } + + if (deviceNo > 0) { + + set->setHPSDRDeviceNumber(deviceNo); + break; + } + + if (m_searchTime.elapsed() > 1000) { + + set->setHPSDRDeviceNumber(0); + break; + } + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "no device found - trying again..."; + io->networkIOMutex.unlock(); + } + + io->networkIOMutex.lock(); + io->devicefound.wakeAll(); + io->networkIOMutex.unlock(); +} + +int Discoverer::findHPSDRDevices() { + + int devicesFound = 0; + + m_findDatagram.resize(63); + m_findDatagram[0] = (char)0xEF; + m_findDatagram[1] = (char)0xFE; + m_findDatagram[2] = (char)0x02; + for (int i = 3; i < 63; i++) + m_findDatagram[i] = (char)0x00; + + QUdpSocket socket; + + CHECKED_CONNECT( + &socket, + SIGNAL(error(QAbstractSocket::SocketError)), + this, + SLOT(displayDiscoverySocketError(QAbstractSocket::SocketError))); + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "using " << qPrintable(QHostAddress(set->getHPSDRDeviceLocalAddr()).toString()) << " for discovery."; + io->networkIOMutex.unlock(); + + // clear comboBox entries in the network dialogue + set->clearNetworkIOComboBoxEntry(); + +#if defined(Q_OS_WIN32) + + if (socket.bind( + QHostAddress(set->getHPSDRDeviceLocalAddr()), 0, + QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress)) + //QUdpSocket::ReuseAddressHint)) + { + set->setMetisPort(this, socket.localPort()); + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery_socket bound successfully to port " << socket.localPort(); + io->networkIOMutex.unlock(); + } + else { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery_socket bind failed."; + io->networkIOMutex.unlock(); + + socket.close(); + return 0; + } +#elif defined(Q_OS_LINUX) + + if (socket.bind( + QHostAddress(set->getHPSDRDeviceLocalAddr()), + QUdpSocket::DefaultForPlatform)) + { + CHECKED_CONNECT( + &socket, + SIGNAL(error(QAbstractSocket::SocketError)), + this, + SLOT(displayDiscoverySocketError(QAbstractSocket::SocketError))); + + set->setMetisPort(this, socket.localPort()); + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery_socket bound successfully to port " << socket.localPort(); + io->networkIOMutex.unlock(); + } + else { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery_socket bind failed."; + io->networkIOMutex.unlock(); + + socket.close(); + return 0; + } +#endif + + if (socket.writeDatagram(m_findDatagram, QHostAddress::Broadcast, DEVICE_PORT) == 63) { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery data sent."; + io->networkIOMutex.unlock(); + } + else { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery data not sent."; + io->networkIOMutex.unlock(); + } + + + // wait a little + //SleeperThread::msleep(30); + SleeperThread::msleep(500); + + while (socket.hasPendingDatagrams()) { + + quint16 port; + + m_deviceDatagram.resize(socket.pendingDatagramSize()); + socket.readDatagram(m_deviceDatagram.data(), m_deviceDatagram.size(), &mc.ip_address, &port); + + if (m_deviceDatagram[0] == (char)0xEF && m_deviceDatagram[1] == (char)0xFE) { + + if (m_deviceDatagram[2] == (char)0x02) { + + sprintf(mc.mac_address, "%02X:%02X:%02X:%02X:%02X:%02X", + m_deviceDatagram[3] & 0xFF, m_deviceDatagram[4] & 0xFF, m_deviceDatagram[5] & 0xFF, + m_deviceDatagram[6] & 0xFF, m_deviceDatagram[7] & 0xFF, m_deviceDatagram[8] & 0xFF); + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "Device found at " << qPrintable(mc.ip_address.toString()) << ":" << port << "; Mac addr: [" << mc.mac_address << "]"; + DISCOVERER_DEBUG << "Device code version: " << qPrintable(QString::number(m_deviceDatagram.at(9), 16)); + io->networkIOMutex.unlock(); + + int no = m_deviceDatagram.at(10); + QString str; + if (no == 0) + str = "Metis"; + else if (no == 1) + str = "Hermes"; + else if (no == 2) + str = "Griffin"; + else if (no == 4) + str = "Angelia"; + else if (no == 5) + str = "Orion"; + else if (no == 6) { + str = "Hermes-Lite"; + } + + mc.boardID = no; + mc.boardName = str; + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "Device board ID: " << no; + DISCOVERER_DEBUG << "Device is: " << qPrintable(str); + io->networkIOMutex.unlock(); + + m_deviceCards.append(mc); + + str += " ("; + str += mc.ip_address.toString(); + str += ")"; + + set->addNetworkIOComboBoxEntry(str); + devicesFound++; + } + else if (m_deviceDatagram[2] == (char)0x03) { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "Device already sending data - trying to shut down..."; + io->networkIOMutex.unlock(); + + shutdownHPSDRDevice(); + clear(); + } + } + + } + set->setMetisCardList(m_deviceCards); + + if (devicesFound == 1) { + + set->setCurrentHPSDRDevice(m_deviceCards.at(0)); + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "Device selected: " << qPrintable(m_deviceCards.at(0).ip_address.toString()); + io->networkIOMutex.unlock(); + } + + socket.close(); + return devicesFound; +} + +void Discoverer::displayDiscoverySocketError(QAbstractSocket::SocketError error) { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery socket error: " << error; + io->networkIOMutex.unlock(); +} + +void Discoverer::clear() { + + //m_metisDeviceComboBox->clear(); + m_deviceCards.clear(); +} + +void Discoverer::shutdownHPSDRDevice() { + + QByteArray arr; + arr.resize(64); + arr[0] = (char)0xEF; + arr[1] = (char)0xFE; + arr[2] = (char)0x04; + arr[3] = (char)0x00; + + for (int i = 4; i < 64; i++) arr[i] = 0x00; + + QUdpSocket socket; + QHostAddress addr = mc.ip_address; + + for (int i = 0; i < 10; i++) { + + if (socket.writeDatagram(arr, addr, DEVICE_PORT) < 0) { + DISCOVERER_DEBUG << "forced shutdown socket write failed."; + } + } +} diff --git a/Source/src/DataEngine/cusdr_discoverer.h b/Source/src/DataEngine/cusdr_discoverer.h index 60d1484..ea8e006 100644 --- a/Source/src/DataEngine/cusdr_discoverer.h +++ b/Source/src/DataEngine/cusdr_discoverer.h @@ -58,6 +58,7 @@ public: int findHPSDRDevices(); void clear(); + void shutdownHPSDRDevice(); public slots: void initHPSDRDevice(); diff --git a/Source/src/DataEngine/cusdr_receiver.cpp b/Source/src/DataEngine/cusdr_receiver.cpp index 556019d..cdee767 100644 --- a/Source/src/DataEngine/cusdr_receiver.cpp +++ b/Source/src/DataEngine/cusdr_receiver.cpp @@ -321,7 +321,7 @@ void Receiver::dspProcessing() { //io.mutex.unlock(); // spectrum - qtdsp->getSpectrum(newSpectrum, set->getFFTMultiplicator()); + qtdsp->getSpectrum(newSpectrum, set->getFFTMultiplicator(m_receiver)); if (highResTimer->getElapsedTimeInMicroSec() >= getDisplayDelay()) { emit spectrumBufferChanged(m_receiver, newSpectrum); diff --git a/Source/src/DataEngine/soundout.cpp b/Source/src/DataEngine/soundout.cpp index fc94de2..ead2037 100644 --- a/Source/src/DataEngine/soundout.cpp +++ b/Source/src/DataEngine/soundout.cpp @@ -149,7 +149,7 @@ QAudioDeviceInfo DeviceInfo; if (-1 == OutDevIndx) m_OutDeviceInfo = QAudioDeviceInfo::defaultOutputDevice(); else m_OutDeviceInfo = m_OutDevices.at(OutDevIndx); -#if 0 //RRK get a list of audio devices and the default +#if 1 //RRK get a list of audio devices and the default foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) { qDebug() << "l:" << deviceInfo.deviceName(); } diff --git a/Source/src/GL/cusdr_oglReceiverPanel.cpp b/Source/src/GL/cusdr_oglReceiverPanel.cpp index 46d60bb..499ec3f 100644 --- a/Source/src/GL/cusdr_oglReceiverPanel.cpp +++ b/Source/src/GL/cusdr_oglReceiverPanel.cpp @@ -760,7 +760,7 @@ void QGLReceiverPanel::drawPanadapter() { glEnd(); } -#if 0 // remove big red overload indicator +#if 0 //RRK remove big red overload indicator if (m_adcStatus == 2) { glBegin(GL_TRIANGLE_STRIP); @@ -1774,7 +1774,21 @@ void QGLReceiverPanel::drawVFOControl() { } // FFT size - if (m_receiver == 0) { + //if (m_receiver == 0) { + if (set->getFFTAutoStatus(m_receiver)) { + } + else { + + str = "sample size: %1"; + x1 = m_panRect.right() - m_fonts.smallFontMetrics->width(str) - 65; + + if (m_dataEngineState == QSDR::DataEngineUp) { + + qglColor(QColor(0, 0, 0, 255)); + m_oglTextSmall->renderText(x1+3, y1, 0.0f, str.arg(m_sampleSize)); + qglColor(QColor(255, 170, 90, 200)); + m_oglTextSmall->renderText(x1+1, y1-2, 1.0f, str.arg(m_sampleSize)); + } str = "FFT: %1"; //float res; @@ -1797,6 +1811,10 @@ void QGLReceiverPanel::drawVFOControl() { case 8: s = "32k"; break; + + case 16: + s = "64k"; + break; } x1 = m_panRect.right() - m_fonts.smallFontMetrics->width(str) - 5; @@ -3766,15 +3784,18 @@ void QGLReceiverPanel::computeDisplayBins(QVector& buffer, QVector deltaSampleSize = m_spectrumSize - m_sampleSize; } - if (m_receiver == 0) { + if (set->getFFTAutoStatus(m_receiver)) { + } + else { if (m_sampleSize < 2048) { if (m_fftMult == 1) { GRAPHICS_DEBUG << "set sample size to 8192"; - set->setSampleSize(this, 0, 8192); - m_dBmPanLogGain += 6.0; + set->setSampleSize(this, m_receiver, 8192); + //m_dBmPanLogGain += 3.0103; + m_dBmPanLogGain += 6; m_fftMult = 2; return; @@ -3782,8 +3803,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector& buffer, QVector else if (m_fftMult == 2) { GRAPHICS_DEBUG << "set sample size to 16384"; - set->setSampleSize(this, 0, 16384); - m_dBmPanLogGain += 6.0; + set->setSampleSize(this, m_receiver, 16384); + //m_dBmPanLogGain += 3.0103; + m_dBmPanLogGain += 6; m_fftMult = 4; return; @@ -3791,10 +3813,21 @@ void QGLReceiverPanel::computeDisplayBins(QVector& buffer, QVector else if (m_fftMult == 4) { GRAPHICS_DEBUG << "set sample size to 32768"; - set->setSampleSize(this, 0, 32768); - m_dBmPanLogGain += 6.0; + set->setSampleSize(this, m_receiver, 32768); + //m_dBmPanLogGain += 3.0103; + m_dBmPanLogGain += 6; m_fftMult = 8; + return; + } + else if (m_fftMult == 8) { + + GRAPHICS_DEBUG << "set sample size to 65536"; + set->setSampleSize(this, m_receiver, 65536); + //m_dBmPanLogGain += 3.0103; + m_dBmPanLogGain += 6; + m_fftMult = 16; + return; } } @@ -3803,8 +3836,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector& buffer, QVector if (m_fftMult == 2) { GRAPHICS_DEBUG << "set sample size to 4096"; - set->setSampleSize(this, 0, 4096); - m_dBmPanLogGain -= 6.0; + set->setSampleSize(this, m_receiver, 4096); + //m_dBmPanLogGain -= 3.0103; + m_dBmPanLogGain -= 6; m_fftMult = 1; return; @@ -3812,8 +3846,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector& buffer, QVector else if (m_fftMult == 4) { GRAPHICS_DEBUG << "set sample size to 8192"; - set->setSampleSize(this, 0, 8192); - m_dBmPanLogGain -= 6.0; + set->setSampleSize(this, m_receiver, 8192); + //m_dBmPanLogGain -= 3.0103; + m_dBmPanLogGain -= 6; m_fftMult = 2; return; @@ -3821,10 +3856,21 @@ void QGLReceiverPanel::computeDisplayBins(QVector& buffer, QVector else if (m_fftMult == 8) { GRAPHICS_DEBUG << "set sample size to 16384"; - set->setSampleSize(this, 0, 16384); - m_dBmPanLogGain -= 6.0; + set->setSampleSize(this, m_receiver, 16384); + //m_dBmPanLogGain -= 3.0103; + m_dBmPanLogGain -= 6; m_fftMult = 4; + return; + } + else if (m_fftMult == 16) { + + GRAPHICS_DEBUG << "set sample size to 32768"; + set->setSampleSize(this, m_receiver, 32768); + //m_dBmPanLogGain -= 3.0103; + m_dBmPanLogGain -= 6; + m_fftMult = 8; + return; } } diff --git a/Source/src/QtDSP/qtdsp_demodulation.cpp b/Source/src/QtDSP/qtdsp_demodulation.cpp index c7983ea..b68e514 100644 --- a/Source/src/QtDSP/qtdsp_demodulation.cpp +++ b/Source/src/QtDSP/qtdsp_demodulation.cpp @@ -123,7 +123,7 @@ void Demodulation::DoSAM(CPX &in, CPX &out ) { if ((delay0.im) == 0.0 && (delay0.re == 0.0)) { - delay0.re = 0.000000000001; + delay0.re = 0.000000000001f; } difference = sqrt(in.at(i).re * in.at(i).re + in.at(i).im * in.at(i).im) * (qAtan2(delay0.im, delay0.re)); @@ -139,10 +139,10 @@ void Demodulation::DoSAM(CPX &in, CPX &out ) { m_phase += m_pll_frequency + m_alpha * difference; while (m_phase >= TWOPI) - m_phase -= TWOPI; + m_phase -= (float)TWOPI; while (m_phase < 0) - m_phase += TWOPI; + m_phase += (float)TWOPI; m_lockcurrent = 0.999 * m_lockcurrent + 0.001 * qAbs(delay0.re); m_lockprevious = m_lockcurrent; @@ -167,7 +167,7 @@ void Demodulation::DoFMN(CPX &in, CPX &out ) { if ((delay0.im) == 0.0 && (delay0.re == 0.0)) { - delay0.re = 0.000000000001; + delay0.re = 0.000000000001f; } difference = qAtan2(delay0.im, delay0.re); @@ -181,9 +181,9 @@ void Demodulation::DoFMN(CPX &in, CPX &out ) { m_phase += m_pll_frequency + m_alpha * difference; while (m_phase >= TWOPI) - m_phase -= TWOPI; + m_phase -= (float)TWOPI; while (m_phase < 0) - m_phase += TWOPI; + m_phase += (float)TWOPI; m_afc = 0.99 * m_afc + 0.01 * m_pll_frequency; out[i].re = (m_pll_frequency - m_afc) * m_cvt; diff --git a/Source/src/QtDSP/qtdsp_dspEngine.cpp b/Source/src/QtDSP/qtdsp_dspEngine.cpp index 65d89c4..8997708 100644 --- a/Source/src/QtDSP/qtdsp_dspEngine.cpp +++ b/Source/src/QtDSP/qtdsp_dspEngine.cpp @@ -33,6 +33,11 @@ #include "qtdsp_dspEngine.h" +double myLog(double x, double base) { + + return log(x) / log(base); +} + QDSPEngine::QDSPEngine(QObject *parent, int rx, int size) : QObject(parent) @@ -41,18 +46,18 @@ QDSPEngine::QDSPEngine(QObject *parent, int rx, int size) , m_rx(rx) , m_size(size) , m_samplerate(set->getSampleRate()) - , m_fftMultiplcator(1) + , m_fftMultiplier(1) , m_volume(0.0f) { qRegisterMetaType >(); qRegisterMetaType(); - fft = new QFFT(m_size); + fft = new QFFT(m_size); // m_size = 1024 filter = new QFilter(this, m_size, 2, 12);//8); wpagc = new QWPAGC(this, m_size); - spectrum = new PowerSpectrum(this, m_size*2); + //spectrum = new PowerSpectrum(this, m_size*2); - QString str = "Initializing DSP engine for rx %1: 8k FFT ...please wait"; + /*QString str = "Initializing DSP engine for rx %1: 8k FFT ...please wait"; set->setSystemMessage(str.arg(m_rx), 0); if (m_rx == 0) { @@ -66,6 +71,20 @@ QDSPEngine::QDSPEngine(QObject *parent, int rx, int size) str = "Initializing DSP engine for rx %1: 32k FFT ...please wait"; set->setSystemMessage(str.arg(m_rx), 0); spectrum8 = new PowerSpectrum(this, m_size*16); + + str = "Initializing DSP engine for rx %1: 64k FFT ...please wait"; + set->setSystemMessage(str.arg(m_rx), 0); + spectrum16 = new PowerSpectrum(this, m_size*32); + }*/ + + int factor = 2; + + while (factor <= 128) { + + PowerSpectrum* spec = new PowerSpectrum(this, m_size*factor); + powerSpectraList << spec; + + factor *= 2; } m_spectrumSize = m_size*4; @@ -116,8 +135,13 @@ QDSPEngine::~QDSPEngine() { if (wpagc) delete wpagc; - if (spectrum) - delete spectrum; + //if (spectrum) + // delete spectrum; + + if (!powerSpectraList.empty()) { + + powerSpectraList.clear(); + } if (signalmeter) delete signalmeter; @@ -175,7 +199,7 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) { m_mutex.lock(); - switch (m_fftMultiplcator) { + /*switch (m_fftMultiplcator) { case 1: spectrum->ProcessSpectrum(in, size*2, 1); @@ -192,7 +216,14 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) { case 8: spectrum8->ProcessSpectrum(in, size*16, 15); break; - } + + case 16: + spectrum16->ProcessSpectrum(in, size*32, 31); + break; + }*/ + + int idx = (int)(myLog(m_fftMultiplier, 2)); + powerSpectraList.at(idx)->ProcessSpectrum(in, size * m_fftMultiplier * 2, m_fftMultiplier*2-1); if (m_NcoFreq != 0) ProcessFrequencyShift(in, in, size); @@ -214,36 +245,10 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) { int QDSPEngine::getSpectrum(qVectorFloat &buffer, int mult) { - if (m_rx == 0) { - - m_fftMultiplcator = mult; - switch (m_fftMultiplcator) { - - case 1: - return spectrum->spectrumResult(buffer, 0); - break; - - case 2: - return spectrum2->spectrumResult(buffer, 2048); - break; - - case 4: - return spectrum4->spectrumResult(buffer, 6144); - break; - - case 8: - return spectrum8->spectrumResult(buffer, 14336); - break; - - default: - return spectrum->spectrumResult(buffer, 0); - break; - } - } - else { - - return spectrum->spectrumResult(buffer, 0); - } + m_fftMultiplier = mult; + int idx = (int)(myLog(m_fftMultiplier, 2)); + + return powerSpectraList.at(idx)->spectrumResult(buffer, m_size * m_fftMultiplier * 2 - 2048); } float QDSPEngine::getSMeterInstValue() { @@ -354,9 +359,7 @@ void QDSPEngine::setNCOFrequency(int rx, long ncoFreq) { void QDSPEngine::setSampleSize(int rx, int size) { - Q_UNUSED(rx) - - if (m_rx == 0) { + if (m_rx == rx) { m_mutex.lock(); m_spectrumSize = size; diff --git a/Source/src/QtDSP/qtdsp_dspEngine.h b/Source/src/QtDSP/qtdsp_dspEngine.h index c6fc4ac..c3918e7 100644 --- a/Source/src/QtDSP/qtdsp_dspEngine.h +++ b/Source/src/QtDSP/qtdsp_dspEngine.h @@ -72,9 +72,13 @@ public: PowerSpectrum* spectrum2; PowerSpectrum* spectrum4; PowerSpectrum* spectrum8; + PowerSpectrum* spectrum16; + SignalMeter* signalmeter; Demodulation* demod; + QList powerSpectraList; + void processDSP(CPX &in, CPX &out, int size); int getSpectrum(qVectorFloat &buffer, int mult); @@ -108,7 +112,7 @@ private: int m_size; int m_spectrumSize; int m_samplerate; - int m_fftMultiplcator; + int m_fftMultiplier; float m_volume; qreal m_NcoFreq; diff --git a/Source/src/QtDSP/qtdsp_filter.cpp b/Source/src/QtDSP/qtdsp_filter.cpp index 6242645..121f8d1 100644 --- a/Source/src/QtDSP/qtdsp_filter.cpp +++ b/Source/src/QtDSP/qtdsp_filter.cpp @@ -211,7 +211,7 @@ void QFilter::Normalize(CPX &in, CPX &out, int size) { void QFilter::Decimate(CPX &in, CPX &out, int downrate) { - int newsize = qRound((float) m_size/downrate); + int newsize = qRound(qreal(m_size / downrate)); //memset(out, 0, newsize * sizeof(CPX)); //memset(tmp, 0, m_size * sizeof(CPX)); diff --git a/Source/src/Util/cusdr_painter.cpp b/Source/src/Util/cusdr_painter.cpp index fee1031..a1c8e93 100644 --- a/Source/src/Util/cusdr_painter.cpp +++ b/Source/src/Util/cusdr_painter.cpp @@ -189,8 +189,8 @@ void QHPainter::drawShadowText (qreal x, qreal y, shadowImage.shadowBlur(radius, shadowColor); // Compose Text and Shadow - int addSizeX = (offset.x() > radius) ? (abs(offset.x()) - radius) : 0; - int addSizeY = (offset.y() > radius) ? (abs(offset.y()) - radius) : 0; + int addSizeX = (offset.x() > radius) ? (fabs(offset.x()) - radius) : 0; + int addSizeY = (offset.y() > radius) ? (fabs(offset.y()) - radius) : 0; QSize finalSize = shadowImage.size() + QSize(addSizeX, addSizeY); QPointF shadowTopLeft(QPointF((finalSize.width() - shadowImage.width()) / 2.0, diff --git a/Source/src/Util/cusdr_painter.h b/Source/src/Util/cusdr_painter.h index 8681894..1eb8705 100644 --- a/Source/src/Util/cusdr_painter.h +++ b/Source/src/Util/cusdr_painter.h @@ -30,6 +30,7 @@ #define CUSDR_PAINTER_H #include +#include class QHPainter : public QPainter { @@ -102,4 +103,4 @@ public: const QBrush& brush); }; -#endif // CUSDR_PAINTER_H \ No newline at end of file +#endif // CUSDR_PAINTER_H diff --git a/Source/src/cusdr_alexAntennaWidget.cpp b/Source/src/cusdr_alexAntennaWidget.cpp index 7d35878..a5c46c2 100644 --- a/Source/src/cusdr_alexAntennaWidget.cpp +++ b/Source/src/cusdr_alexAntennaWidget.cpp @@ -151,7 +151,7 @@ void AlexAntennaWidget::createAntennasGroup() { // band label QStringList bandNames; - bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "gen"; + bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen"; QList bandLabelList; diff --git a/Source/src/cusdr_extCtrlWidget.cpp b/Source/src/cusdr_extCtrlWidget.cpp index 6969206..7076250 100644 --- a/Source/src/cusdr_extCtrlWidget.cpp +++ b/Source/src/cusdr_extCtrlWidget.cpp @@ -138,7 +138,7 @@ void ExtCtrlWidget::createReceivePinsGroup() { // band label QStringList bandNames; - bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm"; + bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen"; QList bandLabelList; @@ -212,7 +212,7 @@ void ExtCtrlWidget::createTransmitPinsGroup() { // band label QStringList bandNames; - bandNames << "2200 m" << "630 m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm"; + bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen"; QList bandLabelList; diff --git a/Source/src/cusdr_hamDatabase.h b/Source/src/cusdr_hamDatabase.h index a5c75e4..7573842 100644 --- a/Source/src/cusdr_hamDatabase.h +++ b/Source/src/cusdr_hamDatabase.h @@ -60,7 +60,11 @@ typedef enum _hamBand { cm125, // 14 cm70, // 15 cm33, // 16 - gen // 17 + cm23, // 17 + cm13, // 18 + cm10, // 19 + cm5, // 21 + gen // 22 } HamBand; @@ -298,6 +302,39 @@ inline QList getHamBandFrequencies() { hamBandFreq.hamBand = (HamBand) cm33; hamBandFreq.bandString = "33cm"; hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + +//RRK TODO FIX + hamBandFreq.frequencyLo = 902000000; + hamBandFreq.frequencyHi = 928000000; + hamBandFreq.hamBand = (HamBand) cm23; + hamBandFreq.bandString = "23cm"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 902000000; + hamBandFreq.frequencyHi = 928000000; + hamBandFreq.hamBand = (HamBand) cm13; + hamBandFreq.bandString = "13cm"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 902000000; + hamBandFreq.frequencyHi = 928000000; + hamBandFreq.hamBand = (HamBand) cm10; + hamBandFreq.bandString = "10cm"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 902000000; + hamBandFreq.frequencyHi = 928000000; + hamBandFreq.hamBand = (HamBand) cm5; + hamBandFreq.bandString = "5cm"; + hamBandFreq.region = (IARURegion) region1; hamBandFreqList << hamBandFreq; diff --git a/Source/src/cusdr_mainWidget.h b/Source/src/cusdr_mainWidget.h index 2281804..b9182d1 100644 --- a/Source/src/cusdr_mainWidget.h +++ b/Source/src/cusdr_mainWidget.h @@ -107,6 +107,7 @@ public slots: void suspendSignal(QObject *sender); void startPlaybackSignal(QObject *sender); void showSettingsDialogSignal(QObject *sender); + void showWarningDialog(const QString &msg); private: void setSystemState( @@ -333,7 +334,6 @@ private slots: void showStatusBarMessage(const QString &msg, int time); void clearStatusBarMessage(); void showNetworkIODialog(); - void showWarningDialog(const QString &msg); void addNetworkIOComboBoxEntry(QString str); void clearNetworkIOComboBoxEntry(); diff --git a/Source/src/cusdr_radioPopupWidget.cpp b/Source/src/cusdr_radioPopupWidget.cpp index 66131b8..3fb096f 100644 --- a/Source/src/cusdr_radioPopupWidget.cpp +++ b/Source/src/cusdr_radioPopupWidget.cpp @@ -117,6 +117,7 @@ RadioPopupWidget::RadioPopupWidget(QWidget *parent, int rx) CHECKED_CONNECT(stickyBtn, SIGNAL(clicked()), this, SLOT(setSticky())); createOptionsBtnGroup(); + createFFTOptionsGroup(); createBandBtnGroup(); createModeBtnGroup(); createAgcBtnGroup(); @@ -150,6 +151,8 @@ RadioPopupWidget::RadioPopupWidget(QWidget *parent, int rx) mainLayout->addSpacing(16); //mainLayout->addStretch(); mainLayout->addLayout(optionsVBox); + mainLayout->addSpacing(8); + mainLayout->addLayout(fftOptionsVBox); mainLayout->addSpacing(16); mainLayout->addLayout(bandVBox); mainLayout->addSpacing(8); @@ -535,6 +538,62 @@ void RadioPopupWidget::createOptionsBtnGroup() { optionsVBox->addLayout(hbox5); } +void RadioPopupWidget::createFFTOptionsGroup() { + + m_FFTAutoBtn = new AeroButton("Auto", this); + m_FFTAutoBtn->setRoundness(10); + m_FFTAutoBtn->setFont(m_fonts.smallFont); + + m_4kFFTBtn = new AeroButton("FFT 4k", this); + m_4kFFTBtn->setRoundness(10); + m_4kFFTBtn->setFont(m_fonts.smallFont); + + m_8kFFTBtn = new AeroButton("FFT 8k", this); + m_8kFFTBtn->setRoundness(10); + m_8kFFTBtn->setFont(m_fonts.smallFont); + + m_16kFFTBtn = new AeroButton("FFT 16k", this); + m_16kFFTBtn->setRoundness(10); + m_16kFFTBtn->setFont(m_fonts.smallFont); + + m_32kFFTBtn = new AeroButton("FFT 32k", this); + m_32kFFTBtn->setRoundness(10); + m_32kFFTBtn->setFont(m_fonts.smallFont); + + m_64kFFTBtn = new AeroButton("FFT 64k", this); + m_64kFFTBtn->setRoundness(10); + m_64kFFTBtn->setFont(m_fonts.smallFont); + + m_128kFFTBtn = new AeroButton("FFT 128k", this); + m_128kFFTBtn->setRoundness(10); + m_128kFFTBtn->setFont(m_fonts.smallFont); + + m_256kFFTBtn = new AeroButton("FFT 256k", this); + m_256kFFTBtn->setRoundness(10); + m_256kFFTBtn->setFont(m_fonts.smallFont); + + QHBoxLayout* hbox1 = new QHBoxLayout(); + hbox1->setContentsMargins(0, 0, 0, 0); + hbox1->setSpacing(0); + hbox1->addWidget(m_FFTAutoBtn); + hbox1->addWidget(m_4kFFTBtn); + hbox1->addWidget(m_8kFFTBtn); + hbox1->addWidget(m_16kFFTBtn); + + QHBoxLayout* hbox2 = new QHBoxLayout(); + hbox2->setContentsMargins(0, 0, 0, 0); + hbox2->setSpacing(0); + hbox2->addWidget(m_32kFFTBtn); + hbox2->addWidget(m_64kFFTBtn); + hbox2->addWidget(m_128kFFTBtn); + hbox2->addWidget(m_256kFFTBtn); + + fftOptionsVBox = new QVBoxLayout; + fftOptionsVBox->setSpacing(1); + fftOptionsVBox->addLayout(hbox1); + fftOptionsVBox->addLayout(hbox2); +} + void RadioPopupWidget::createBandBtnGroup() { band2200mBtn = new AeroButton("2200m", this); @@ -605,6 +664,22 @@ void RadioPopupWidget::createBandBtnGroup() { bandBtnList.append(band33cmBtn); CHECKED_CONNECT(band33cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + band23cmBtn = new AeroButton("23 cm", this); + bandBtnList.append(band23cmBtn); + CHECKED_CONNECT(band23cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band13cmBtn = new AeroButton("13 cm", this); + bandBtnList.append(band13cmBtn); + CHECKED_CONNECT(band13cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band10cmBtn = new AeroButton("10 cm", this); + bandBtnList.append(band10cmBtn); + CHECKED_CONNECT(band10cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band5cmBtn = new AeroButton("5 cm", this); + bandBtnList.append(band5cmBtn); + CHECKED_CONNECT(band5cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + bandGenBtn = new AeroButton("Gen", this); bandBtnList.append(bandGenBtn); CHECKED_CONNECT(bandGenBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); @@ -637,22 +712,30 @@ void RadioPopupWidget::createBandBtnGroup() { hbox2->addWidget(band12mBtn); hbox2->addWidget(band10mBtn); hbox2->addWidget(band6mBtn); - hbox2->addWidget(bandGenBtn); + hbox2->addWidget(band2mBtn); QHBoxLayout *hbox3 = new QHBoxLayout(); hbox3->setContentsMargins(0, 0, 0, 0); hbox3->setSpacing(0); - hbox3->addWidget(band2mBtn); hbox3->addWidget(band125cmBtn); hbox3->addWidget(band70cmBtn); - hbox3->addWidget(band12mBtn); hbox3->addWidget(band33cmBtn); + hbox3->addWidget(band23cmBtn); + hbox3->addWidget(band13cmBtn); + hbox3->addWidget(band10cmBtn); + hbox3->addWidget(band5cmBtn); + + QHBoxLayout *hbox4 = new QHBoxLayout(); + hbox4->setContentsMargins(0, 0, 0, 0); + hbox4->setSpacing(0); + hbox4->addWidget(bandGenBtn); bandVBox = new QVBoxLayout; bandVBox->setSpacing(1); bandVBox->addLayout(hbox1); bandVBox->addLayout(hbox2); bandVBox->addLayout(hbox3); + bandVBox->addLayout(hbox4); } @@ -1198,6 +1281,18 @@ void RadioPopupWidget::bandChangedByBtn() { if (str == "33 cm") set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm33)); else + if (str == "23 cm") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm23)); + else + if (str == "13 cm") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm13)); + else + if (str == "10 cm") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm10)); + else + if (str == "5 cm") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm5)); + else if (str == "Gen") set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(gen)); } diff --git a/Source/src/cusdr_radioPopupWidget.h b/Source/src/cusdr_radioPopupWidget.h index 467094f..8b26e0a 100644 --- a/Source/src/cusdr_radioPopupWidget.h +++ b/Source/src/cusdr_radioPopupWidget.h @@ -93,6 +93,7 @@ private: WaterfallColorMode m_waterfallColorMode; QVBoxLayout* optionsVBox; + QVBoxLayout* fftOptionsVBox; QVBoxLayout* bandVBox; QVBoxLayout* modeVBox; QVBoxLayout* agcVBox; @@ -130,6 +131,15 @@ private: AeroButton* m_WaterfallSimpleBtn; AeroButton* m_WaterfallEnhancedBtn; + AeroButton* m_FFTAutoBtn; + AeroButton* m_4kFFTBtn; + AeroButton* m_8kFFTBtn; + AeroButton* m_16kFFTBtn; + AeroButton* m_32kFFTBtn; + AeroButton* m_64kFFTBtn; + AeroButton* m_128kFFTBtn; + AeroButton* m_256kFFTBtn; + AeroButton* band2200mBtn; AeroButton* band630mBtn; AeroButton* band160mBtn; @@ -147,6 +157,10 @@ private: AeroButton* band125cmBtn; AeroButton* band70cmBtn; AeroButton* band33cmBtn; + AeroButton* band23cmBtn; + AeroButton* band13cmBtn; + AeroButton* band10cmBtn; + AeroButton* band5cmBtn; AeroButton* bandGenBtn; //AeroButton* bandxxBtn; @@ -272,6 +286,7 @@ private slots: void setSticky(); void createOptionsBtnGroup(); + void createFFTOptionsGroup(); void createBandBtnGroup(); void createModeBtnGroup(); void createAgcBtnGroup(); diff --git a/Source/src/cusdr_radioWidget.cpp b/Source/src/cusdr_radioWidget.cpp index 7a19c1d..c9f80f9 100644 --- a/Source/src/cusdr_radioWidget.cpp +++ b/Source/src/cusdr_radioWidget.cpp @@ -345,40 +345,60 @@ void RadioWidget::createBandBtnGroup() { band2mBtn = new AeroButton("2 m", this); band2mBtn->setRoundness(0); - //band6mBtn->setGlass(false); band2mBtn->setFixedSize(btn_widths, btn_height); band2mBtn->setStyleSheet(set->getMiniButtonStyle()); - //band6mBtn->setTextColor(QColor(200, 200, 200)); bandBtnList.append(band2mBtn); CHECKED_CONNECT(band2mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); band125cmBtn = new AeroButton("125 cm", this); band125cmBtn->setRoundness(0); - //band6mBtn->setGlass(false); band125cmBtn->setFixedSize(btn_widths, btn_height); band125cmBtn->setStyleSheet(set->getMiniButtonStyle()); - //band6mBtn->setTextColor(QColor(200, 200, 200)); bandBtnList.append(band125cmBtn); CHECKED_CONNECT(band125cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); band70cmBtn = new AeroButton("70 cm", this); band70cmBtn->setRoundness(0); - //band6mBtn->setGlass(false); band70cmBtn->setFixedSize(btn_widths, btn_height); band70cmBtn->setStyleSheet(set->getMiniButtonStyle()); - //band6mBtn->setTextColor(QColor(200, 200, 200)); bandBtnList.append(band70cmBtn); CHECKED_CONNECT(band70cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); band33cmBtn = new AeroButton("33 cm", this); band33cmBtn->setRoundness(0); - //band6mBtn->setGlass(false); band33cmBtn->setFixedSize(btn_widths, btn_height); band33cmBtn->setStyleSheet(set->getMiniButtonStyle()); - //band6mBtn->setTextColor(QColor(200, 200, 200)); bandBtnList.append(band33cmBtn); CHECKED_CONNECT(band33cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + band23cmBtn = new AeroButton("23 cm", this); + band23cmBtn->setRoundness(0); + band23cmBtn->setFixedSize(btn_widths, btn_height); + band23cmBtn->setStyleSheet(set->getMiniButtonStyle()); + bandBtnList.append(band23cmBtn); + CHECKED_CONNECT(band23cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band13cmBtn = new AeroButton("13 cm", this); + band13cmBtn->setRoundness(0); + band13cmBtn->setFixedSize(btn_widths, btn_height); + band13cmBtn->setStyleSheet(set->getMiniButtonStyle()); + bandBtnList.append(band13cmBtn); + CHECKED_CONNECT(band13cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band10cmBtn = new AeroButton("10 cm", this); + band10cmBtn->setRoundness(0); + band10cmBtn->setFixedSize(btn_widths, btn_height); + band10cmBtn->setStyleSheet(set->getMiniButtonStyle()); + bandBtnList.append(band10cmBtn); + CHECKED_CONNECT(band10cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band5cmBtn = new AeroButton("5 cm", this); + band5cmBtn->setRoundness(0); + band5cmBtn->setFixedSize(btn_widths, btn_height); + band5cmBtn->setStyleSheet(set->getMiniButtonStyle()); + bandBtnList.append(band5cmBtn); + CHECKED_CONNECT(band5cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + bandGenBtn = new AeroButton("Gen", this); bandGenBtn->setRoundness(0); //bandGenBtn->setGlass(false); @@ -418,11 +438,15 @@ void RadioWidget::createBandBtnGroup() { layout->addWidget(band12mBtn, 1, 4); layout->addWidget(band10mBtn, 1, 5); layout->addWidget(band6mBtn, 2, 0); - layout->addWidget(band2mBtn, 2, 0); - layout->addWidget(band125cmBtn, 2, 0); - layout->addWidget(band70cmBtn, 2, 0); - layout->addWidget(band33cmBtn, 2, 0); - layout->addWidget(bandGenBtn, 2, 1); + layout->addWidget(band2mBtn, 2, 1); + layout->addWidget(band125cmBtn, 2, 2); + layout->addWidget(band70cmBtn, 2, 3); + layout->addWidget(band33cmBtn, 2, 4); + layout->addWidget(band23cmBtn, 2, 5); + layout->addWidget(band13cmBtn, 3, 0); + layout->addWidget(band10cmBtn, 3, 1); + layout->addWidget(band5cmBtn, 3, 2); + layout->addWidget(bandGenBtn, 3, 3); //layout->addWidget(bandxxBtn, 2, 3); QHBoxLayout *hbox1 = new QHBoxLayout(); @@ -1229,6 +1253,18 @@ void RadioWidget::bandChangedByBtn() { if (str == "33 cm") set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm33)); else + if (str == "23 cm") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm23)); + else + if (str == "13 cm") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm13)); + else + if (str == "10 cm") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm10)); + else + if (str == "5 cm") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm5)); + else if (str == "Gen") set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(gen)); diff --git a/Source/src/cusdr_radioWidget.h b/Source/src/cusdr_radioWidget.h index 241bd94..fc65e0c 100644 --- a/Source/src/cusdr_radioWidget.h +++ b/Source/src/cusdr_radioWidget.h @@ -89,6 +89,10 @@ private: AeroButton *band125cmBtn; AeroButton *band70cmBtn; AeroButton *band33cmBtn; + AeroButton *band23cmBtn; + AeroButton *band13cmBtn; + AeroButton *band10cmBtn; + AeroButton *band5cmBtn; AeroButton *bandGenBtn; //AeroButton *bandxxBtn; diff --git a/Source/src/cusdr_settings.cpp b/Source/src/cusdr_settings.cpp index 76e4888..5b0c82d 100644 --- a/Source/src/cusdr_settings.cpp +++ b/Source/src/cusdr_settings.cpp @@ -1,4675 +1,4796 @@ -/** -* @file cusdr_settings.cpp -* @brief settings class for cuSDR -* @author by Hermann von Hasseln, DL3HVH -* @version 0.1 -* @date 2010-11-18 -*/ - -/* - * Copyright 2010, 2011, 2012 Hermann von Hasseln, DL3HVH - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License version 2 as - * published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - - -#define LOG_SETTINGS - -#include "cusdr_settings.h" -#include "Util/cusdr_styles.h" - -Settings *Settings::m_instance = NULL; /*!< set m_instance to NULL. */ - -/*! - \class Settings - \brief Settings class implements application specific and user defined variables for the application. -*/ - -Settings::Settings(QObject *parent) - :QObject(parent) - , m_dataEngineState(QSDR::DataEngineDown) - , setLoaded(false) - , m_mainPower(false) - , m_manualSocketBufferSize(false) - , m_peakHold(false) - , m_packetsToggle(true) - , m_radioPopupVisible(false) - , m_hpsdrNetworkDevices(0) - , m_mercuryReceivers(1) - , m_currentReceiver(0) -{ - m_devices.mercuryFWVersion = 0; - - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType >(); - qRegisterMetaType("qVectorFloat"); - - startTime = QDateTime::currentDateTime(); - - qDebug() << "************************************************************************"; - SETTINGS_DEBUG << "start at: " << qPrintable(startTime.toString()); - - settingsFilename = "settings.ini"; - settings = new QSettings(QCoreApplication::applicationDirPath() + "/" + settingsFilename, QSettings::IniFormat); - - m_titleString = "cudaSDR BETA "; - - #ifdef DEBUG - m_titleString = "cudaSDR Debug BETA "; - #endif - - m_versionString = "v0.3.2.13"; - - qDebug() << qPrintable(m_titleString); - - // receiver data - for (int i = 0; i < MAX_RECEIVERS; i++) { - - TReceiver receiverData; - m_receiverDataList.append(receiverData); - - QString str = "receiver"; - QString num; - num.setNum(i); - str.append(num); - - m_rxStringList << str; - - m_receiverDataList[i].agcHangThreshold = 0.0; - m_receiverDataList[i].peakHold = false; - - for (int j = 0; j < MAX_BANDS; j++) { - - m_receiverDataList[i].mercuryAttenuators << 0; - m_receiverDataList[i].dBmPanScaleMinList << 0.0; - m_receiverDataList[i].dBmPanScaleMaxList << 0.0; - m_receiverDataList[i].dspModeList << (DSPMode) LSB; - } - } - - // Alex parameter configurations - m_alexConfig = 0; - - for (int i = 0; i < 6; i++) { - - m_HPFLoFrequencyList.append((long)0); - m_HPFHiFrequencyList.append((long)0); - } - - for (int i = 0; i < 7; i++) { - - m_LPFLoFrequencyList.append((long)0); - m_LPFHiFrequencyList.append((long)0); - } - - // init alex states - for (int i = 0; i < MAX_BANDS; i++) { - - m_alexStates << 0; - } - - // Rx, Tx J6 pins list - // Bands: 160m, 80m, 60m, 40m, 30m, 20m, 17m, 15m, 12m, 10m, 6m - // Values: no pin, pins 1 to 7 (0..7) - // - // 0 0 0 0 0 0 0 0 - // | | | | | | | - // | | | | | | | - // | | | | | | +-------------- pin 1 (0 = deactivated, 1 = activated) - // | | | | | +---------------- pin 2 (0 = deactivated, 1 = activated) - // | | | | +------------------ pin 3 (0 = deactivated, 1 = activated) - // | | | +-------------------- pin 4 (0 = deactivated, 1 = activated) - // | | +---------------------- pin 5 (0 = deactivated, 1 = activated) - // | +------------------------ pin 6 (0 = deactivated, 1 = activated) - // +-------------------------- pin 7 (0 = deactivated, 1 = activated) - - for (int i = 0; i < MAX_BANDS-1; i++) { - - m_rxJ6pinList << 0; - m_txJ6pinList << 0; - } - - - m_bandList = getHamBandFrequencies(); - m_bandTextList = getHamBandText(); - m_defaultFilterList = getDefaultFilterFrequencies(); - - m_transmitter.txAllowed = false; - m_fft = 1; -} - -Settings::~Settings() { - - //m_clDevices.clear(); -} - -int Settings::loadSettings() { - - QString str; - int value; - - //QList bandList = HamBandStrings(); - - // user's call sign - str = settings->value("user/callSign", "Your Call sign").toString(); - //while (str.startsWith('\"')) str = str.right(str.count() - 1).trimmed(); - //while (str.endsWith('\"')) str = str.left(str.count() - 1).trimmed(); - - m_callsignString = str; - - // Window settings - value = settings->value("window/minimumWidgetWidth", 235).toInt(); - if (value < 235 || value > 300) m_minimumWidgetWidth = 235; - m_minimumWidgetWidth = value; - - value = settings->value("window/minimumGroupBoxWidth", 230).toInt(); - if (value < 230 || value > 295 || value > m_minimumWidgetWidth - 5) m_minimumGroupBoxWidth = 230; - m_minimumGroupBoxWidth = value; - - value = settings->value("window/multiRxView", 0).toInt(); - if (value < 0 || value > 2) m_multiRxView = 0; - m_multiRxView = value; - - - // network settings - str = settings->value("network/server_ipAddress", "127.0.0.1").toString(); - while (str.startsWith('\"')) str = str.right(str.count() - 1).trimmed(); - while (str.endsWith('\"')) str = str.left(str.count() - 1).trimmed(); - m_serverAddress = str; - - str = settings->value("network/hpsdr_local_ipAddress", "127.0.0.1").toString(); - while (str.startsWith('\"')) str = str.right(str.count() - 1).trimmed(); - while (str.endsWith('\"')) str = str.left(str.count() - 1).trimmed(); - m_hpsdrDeviceLocalAddr = str; - - value = settings->value("network/server_port", 52685).toInt(); - if (value < 0 || value > 65535) value = 52685; - m_serverPort = value; - - value = settings->value("network/listen_port", 11000).toInt(); - if (value < 0 || value > 65535) value = 11000; - m_listenerPort = value; - - value = settings->value("network/audio_port", 15000).toInt(); - if (value < 0 || value > 65535) value = 15000; - m_audioPort = value; - - value = settings->value("network/metis_port", 1024).toInt(); - if (value < 0 || value > 65535) value = 1024; - m_metisPort = value; - - value = settings->value("network/socketBufferSize", 32).toInt(); - if (value != 16 && value != 32 && value != 64 && value != 128 && value != 256) value = 32; - m_socketBufferSize = value; - - - // HPSDR hardware - value = settings->value("hpsdr/hardware", 0).toInt(); - if (value < 0 || value > 2) value = 0; - m_hpsdrHardware = value; - - str = settings->value("hpsdr/mercury", "true").toString(); - if (str == "true") - m_devices.mercuryPresence = true; - else - m_devices.mercuryPresence = false; - - str = settings->value("hpsdr/penelope", "false").toString(); - if (str == "true") - m_devices.penelopePresence = true; - else - m_devices.penelopePresence = false; - - str = settings->value("hpsdr/pennylane", "false").toString(); - if (str == "true") - m_devices.pennylanePresence = true; - else - m_devices.pennylanePresence = false; - - str = settings->value("hpsdr/excalibur", "false").toString(); - if (str == "true") - m_devices.excaliburPresence = true; - else - m_devices.excaliburPresence = false; - - str = settings->value("hpsdr/alex", "false").toString(); - if (str == "true") - m_devices.alexPresence = true; - else - m_devices.alexPresence = false; - - -// str = settings->value("hpsdr/hermes", "false").toString(); -// if (str == "true") -// m_devices.hermesPresence = true; -// else -// m_devices.hermesPresence = false; - - if (m_hpsdrHardware == 0) { - - str = settings->value("hpsdr/interface", "metis").toString(); - if (str == "metis") - m_hwInterface = QSDR::Metis; - else - m_hwInterface = QSDR::NoInterfaceMode; - } - else if (m_hpsdrHardware == 1) { - - m_hwInterface = QSDR::Hermes; - } - - str = settings->value("hpsdr/checkfw", "true").toString(); - if (str == "true") - m_checkFirmwareVersions = true; - else - m_checkFirmwareVersions = false; - - //checkHPSDRDevices(); - - value = settings->value("server/sample_rate", 48000).toInt(); - if ((value != 48000) & (value != 96000) & (value != 192000) & (value != 384000)) value = 48000; - setSampleRate(this, value); - - str = settings->value("server/dither", "off").toString(); - if (str.toLower() == "on") - m_mercuryDither = 1; - else - m_mercuryDither = 0; - - str = settings->value("server/random", "off").toString(); - if (str.toLower() == "on") - m_mercuryRandom = 1; - else - m_mercuryRandom = 0; - - str = settings->value("server/10mhzsource", "mercury").toString(); - if (str == "atlas") - m_10MHzSource = 0; - else if (str == "penelope") - m_10MHzSource = 1; - else if (str == "mercury") - m_10MHzSource = 2; - else if (str == "none") - m_10MHzSource = 3; - else - m_10MHzSource = 2; - - str = settings->value("server/122_88mhzsource", "mercury").toString(); - if (str == "penelope") - m_122_8MHzSource = 0; - else - m_122_8MHzSource = 1; - - str = settings->value("server/mic_source", "penelope").toString(); - if (str == "janus") - m_micSource = 0; - else - m_micSource = 1; - - str = settings->value("server/class", 0).toString(); - m_RxClass = (str.toLower() == "E"); - if (m_RxClass) - m_RxClass = 1; - else - m_RxClass = 0; - - value = settings->value("server/timing", 0).toInt(); - if (value < 0 || value > 1) value = 0; - m_RxTiming = value; - - /*value = settings->value("server/mainVolume", 10).toInt(); - if (value < 0) value = 0; - if (value > 100) value = 100; - m_mainVolume = value / 100.0f;*/ - - str = settings->value("server/mode", "sdr").toString(); - if (str == "sdr") { - - m_serverMode = QSDR::SDRMode; - setSpectrumSize(this, 4096); - } - else if (str == "chirpWSPR") { - - m_serverMode = QSDR::ChirpWSPR; - setSpectrumSize(this, 4096); - } - else if (str == "chirpWSPRFile") { - - m_serverMode = QSDR::ChirpWSPRFile; - setSpectrumSize(this, 4096); - } - else { - - m_serverMode = QSDR::SDRMode; - setSpectrumSize(this, 4096); - } - - -// value = settings->value("server/mouseWheelFreqStep", 1000).toInt(); -// if ((value != 1) & (value != 10) & (value != 100) & (value != 1000) & (value != 10000) & (value != 100000) & -// (value != 5) & (value != 50) & (value != 500) & (value != 5000) & (value != 50000) & (value != 500000)) -// value = 100; -// m_mouseWheelFreqStep = (double)value; - - //****************************************************************** - // Alexiares data settings - // m_alexConfig (qint16): - // - // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - // | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | +-----Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) - // | | | | | | | | | | | | | +------ Alex - Bypass all HPFs (0 = disable, 1 = enable)* - // | | | | | | | | | | | | +-------- Alex - 6M low noise amplifier (0 = disable, 1 = enable)* - // | | | | | | | | | | | +---------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* - // | | | | | | | | | | +------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* - // | | | | | | | | | +-------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* - // | | | | | | | | +---------------- Alex - select 13MHz HPF (0 = disable, 1 = enable)* - // | | | | | | | +------------------ Alex - select 20MHz HPF (0 = disable, 1 = enable)* - // | | | | | | +-------------------- Alex - select 160m LPF (0 = disable, 1 = enable)* - // | | | | | +---------------------- Alex - select 80m LPF (0 = disable, 1 = enable)* - // | | | | +------------------------ Alex - select 60/40m LPF (0 = disable, 1 = enable)* - // | | | +-------------------------- Alex - select 30/20m LPF (0 = disable, 1 = enable)* - // | | +---------------------------- Alex - select 17/15m LPF (0 = disable, 1 = enable)* - // | +------------------------------ Alex - select 12/10m LPF (0 = disable, 1 = enable)* - // +-------------------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* - - m_alexConfig = 0; - double fLo; - double fHi; - - str = settings->value("alex/manual", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x01; - - str = settings->value("alex/bypassAll", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x02; - - str = settings->value("alex/amp6m", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x04; - - fLo = settings->value("alex/amp6mLo", 50000000).toDouble(); - if ((fLo < 49000000) || (fLo > 52500000)) fLo = 50000000; - - fHi = settings->value("alex/amp6mHi", 54000000).toDouble(); - if ((fHi < 52500000) || (fHi > 55000000)) fHi = 54000000; - - m_HPFLoFrequencyList[5] = (long)fLo; - m_HPFHiFrequencyList[5] = (long)fHi; - - - str = settings->value("alex/hpf1_5MHz", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x08; - - fLo = settings->value("alex/hpf1_5MHzLo", 1500000).toDouble(); - if ((fLo < 0) || (fLo > 2000000)) fLo = 1500000; - - fHi = settings->value("alex/hpf1_5MHzHi", 5500000).toDouble(); - if ((fHi < 1600000) || (fHi > 6000000)) fHi = 5500000; - - m_HPFLoFrequencyList[0] = (long)fLo; - m_HPFHiFrequencyList[0] = (long)fHi; - - - str = settings->value("alex/hpf6_5MHz", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x10; - - fLo = settings->value("alex/hpf6_5MHzLo", 7000000).toDouble(); - if ((fLo < 6000000) || (fLo > 8000000)) fLo = 7000000; - - fHi = settings->value("alex/hpf6_5MHzHi", 7300000).toDouble(); - if ((fHi < 7000000) || (fHi > 9500000)) fHi = 7300000; - - m_HPFLoFrequencyList[1] = (long)fLo; - m_HPFHiFrequencyList[1] = (long)fHi; - - - str = settings->value("alex/hpf9_5MHz", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x20; - - fLo = settings->value("alex/hpf9_5MHzLo", 10100000).toDouble(); - if ((fLo < 9000000) || (fLo > 11000000)) fLo = 10100000; - - fHi = settings->value("alex/hpf9_5MHzHi", 10150000).toDouble(); - if ((fHi < 10000000) || (fHi > 13000000)) fHi = 10150000; - - m_HPFLoFrequencyList[2] = (long)fLo; - m_HPFHiFrequencyList[2] = (long)fHi; - - - str = settings->value("alex/hpf13MHz", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x40; - - fLo = settings->value("alex/hpf13MHzLo", 14000000).toDouble(); - if ((fLo < 12000000) || (fLo > 15000000)) fLo = 14000000; - - fHi = settings->value("alex/hpf13MHzHi", 18168000).toDouble(); - if ((fHi < 13700000) || (fHi > 19000000)) fHi = 18168000; - - m_HPFLoFrequencyList[3] = (long)fLo; - m_HPFHiFrequencyList[3] = (long)fHi; - - - str = settings->value("alex/hpf20MHz", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x80; - - fLo = settings->value("alex/hpf20MHzLo", 21000000).toDouble(); - if ((fLo < 18000000) || (fLo > 25000000)) fLo = 21000000; - - fHi = settings->value("alex/hpf20MHzHi", 29700000).toDouble(); - if ((fHi < 25000000) || (fHi > 32000000)) fHi = 29700000; - - m_HPFLoFrequencyList[4] = (long)fLo; - m_HPFHiFrequencyList[4] = (long)fHi; - - - str = settings->value("alex/lpf160m", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x100; - - fLo = settings->value("alex/lpf160mLo", 1800000).toDouble(); - if ((fLo < 0) || (fLo > 1900000)) fLo = 1800000; - - fHi = settings->value("alex/lpf160mHi", 2000000).toDouble(); - if ((fHi < 1000000) || (fHi > 3000000)) fHi = 2000000; - - m_LPFLoFrequencyList[0] = (long)fLo; - m_LPFHiFrequencyList[0] = (long)fHi; - - - str = settings->value("alex/lpf80m", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x200; - - fLo = settings->value("alex/lpf80mLo", 3500000).toDouble(); - if ((fLo < 2000000) || (fLo > 4000000)) fLo = 3500000; - - fHi = settings->value("alex/lpf80mHi", 4000000).toDouble(); - if ((fHi < 2000000) || (fHi > 5000000)) fHi = 4000000; - - m_LPFLoFrequencyList[1] = (long)fLo; - m_LPFHiFrequencyList[1] = (long)fHi; - - - str = settings->value("alex/lpf60_40m", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x400; - - fLo = settings->value("alex/lpf60_40mLo", 5330000).toDouble(); - if ((fLo < 5000000) || (fLo > 11000000)) fLo = 5330000; - - fHi = settings->value("alex/lpf60_40mHi", 7300000).toDouble(); - if ((fHi < 5000000) || (fHi > 8000000)) fHi = 7300000; - - m_LPFLoFrequencyList[2] = (long)fLo; - m_LPFHiFrequencyList[2] = (long)fHi; - - - str = settings->value("alex/lpf30_20m", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x800; - - fLo = settings->value("alex/lpf30_20mLo", 10100000).toDouble(); - if ((fLo < 9000000) || (fLo > 15000000)) fLo = 10100000; - - fHi = settings->value("alex/lpf30_20mHi", 14350000).toDouble(); - if ((fHi < 9000000) || (fHi > 15000000)) fHi = 14350000; - - m_LPFLoFrequencyList[3] = (long)fLo; - m_LPFHiFrequencyList[3] = (long)fHi; - - - str = settings->value("alex/lpf17_15m", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x1000; - - fLo = settings->value("alex/lpf17_15mLo", 18068000).toDouble(); - if ((fLo < 17000000) || (fLo > 22000000)) fLo = 18068000; - - fHi = settings->value("alex/lpf17_15mHi", 21450000).toDouble(); - if ((fHi < 17000000) || (fHi > 22000000)) fHi = 21450000; - - m_LPFLoFrequencyList[4] = (long)fLo; - m_LPFHiFrequencyList[4] = (long)fHi; - - - str = settings->value("alex/lpf12_10m", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x2000; - - fLo = settings->value("alex/lpf12_10mLo", 24890000).toDouble(); - if ((fLo < 23000000) || (fLo > 30000000)) fLo = 24890000; - - fHi = settings->value("alex/lpf12_10mHi", 29700000).toDouble(); - if ((fHi < 23000000) || (fHi > 30000000)) fHi = 29700000; - - m_LPFLoFrequencyList[5] = (long)fLo; - m_LPFHiFrequencyList[5] = (long)fHi; - - - str = settings->value("alex/lpf6m", "off").toString(); - if (str.toLower() == "on") - m_alexConfig |= 0x4000; - - fLo = settings->value("alex/lpf6mLo", 50000000).toDouble(); - if ((fLo < 30000000) || (fLo > 52000000)) fLo = 50000000; - - fHi = settings->value("alex/lpf6mHi", 54000000).toDouble(); - if ((fHi < 52000000) || (fHi > 66000000)) fHi = 54000000; - - m_LPFLoFrequencyList[6] = (long)fLo; - m_LPFHiFrequencyList[6] = (long)fHi; - - - SETTINGS_DEBUG << "Alex config: " << m_alexConfig; - - if (m_alexStates.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { - - for (int i = 0; i < MAX_BANDS; i++) { - - str = "alex/state"; - str.append(m_bandList.at(i).bandString); - - value = settings->value(str, 33).toInt(); - setAlexState(this, i, value); - } - } - - //****************************************************************** - // Penny open collector settings - - str = settings->value("penny/OCenabled", "off").toString(); - if (str.toLower() == "on") - m_pennyOCEnabled = true; - else - m_pennyOCEnabled = false; - - if (m_rxJ6pinList.length() == MAX_BANDS-1 && m_txJ6pinList.length() == MAX_BANDS-1 && m_bandList.length() == MAX_BANDS) { - - for (int i = 0; i < MAX_BANDS-1; i++) { - - str = "penny/rxState"; - str.append(m_bandList.at(i).bandString); - - value = settings->value(str, 0).toInt(); - if (value < 0 || value > 255) value = 0; - setRxJ6Pin(this, (HamBand) i, value); - } - - for (int i = 0; i < MAX_BANDS-1; i++) { - - str = "penny/txState"; - str.append(m_bandList.at(i).bandString); - - value = settings->value(str, 0).toInt(); - if (value < 0 || value > 255) value = 0; - setTxJ6Pin(this, (HamBand) i, value); - } - } - else { - - qWarning() << "rxJ6pinList or txJ6pinList or bandList have wrong length!"; - } - - //****************************************************************** - // wideband settings - - str = settings->value("wideband/widebandData", "on").toString(); - if (str.toLower() == "on") - m_widebandOptions.wideBandData = true; - else if (str.toLower() == "off") - m_widebandOptions.wideBandData = false; - else - m_widebandOptions.wideBandData = true; - - str = settings->value("wideband/widebandDisplay", "off").toString(); - if (str.toLower() == "on") - m_widebandOptions.wideBandDisplayStatus = true; - else if (str.toLower() == "off") - m_widebandOptions.wideBandDisplayStatus = false; - else - m_widebandOptions.wideBandDisplayStatus = false; - - if (!m_widebandOptions.wideBandData) m_widebandOptions.wideBandDisplayStatus = false; - - str = settings->value("wideband/averaging", "on").toString(); - if (str.toLower() == "on") - m_widebandOptions.averaging = true; - else if (str.toLower() == "off") - m_widebandOptions.averaging = false; - else - m_widebandOptions.averaging = true; - - value = settings->value("wideband/averagingCnt", 5).toInt(); - if ((value < 1) || (value > 100)) value = 5; - m_widebandOptions.averagingCnt = value; - - value = settings->value("wideband/dBmWideBandScaleMin", -140).toInt(); - if ((value < -200) || (value > 0)) value = -140; - m_widebandOptions.dBmWBScaleMin = (qreal)(1.0 * value); - - value = settings->value("wideband/dBmWideBandScaleMax", -10).toInt(); - if ((value < -100) || (value > 0)) value = -10; - m_widebandOptions.dBmWBScaleMax = (qreal)(1.0 * value); - - str = settings->value("wideband/panMode", "LINE").toString(); - if (str == "LINE") - m_widebandOptions.panMode = Line; - else if (str == "FILLEDLINE") - m_widebandOptions.panMode = FilledLine; - else if (str == "SOLID") - m_widebandOptions.panMode = Solid; - - //****************************************************************** - // receiver data settings - - for (int i = 0; i < MAX_RECEIVERS; i++) { - - QString cstr = m_rxStringList.at(i); - cstr.append("/dspCore"); - - str = settings->value(cstr, "qtdsp").toString(); - if (str == "qtdsp") { - - m_receiverDataList[i].dspCore = QSDR::QtDSP; - setSpectrumSize(this, 4096); - //SETTINGS_DEBUG << "DSP core for rx " << i << " is QtDSP."; - } - - cstr = m_rxStringList.at(i); - cstr.append("/freqRulerPosition"); - - value = settings->value(cstr, 5).toInt(); - if (value < 0) value = 0; - if (value > 10) value = 10; - m_receiverDataList[i].freqRulerPosition = value/10.0f; - - cstr = m_rxStringList.at(i); - cstr.append("/audioVolume"); - - value = settings->value(cstr, 10).toInt(); - if (value < 0) value = 0; - if (value > 100) value = 100; - m_receiverDataList[i].audioVolume = value/100.0f; - - cstr = m_rxStringList.at(i); - cstr.append("/mouseWheelFreqStep"); - - value = settings->value(cstr, 100).toInt(); - if ((value != 1) & (value != 10) & (value != 100) & (value != 1000) & (value != 10000) & (value != 100000) & - (value != 5) & (value != 50) & (value != 500) & (value != 5000) & (value != 50000) & (value != 500000)) - value = 100; - m_receiverDataList[i].mouseWheelFreqStep = (qreal)value; - - cstr = m_rxStringList.at(i); - cstr.append("/agcGain"); - - value = settings->value(cstr, 100).toInt(); - if (value < -20) value = -20; - if (value > 120) value = 120; - m_receiverDataList[i].acgGain = value; - - cstr = m_rxStringList.at(i); - cstr.append("/agcFixedGain"); - - value = settings->value(cstr, 30).toInt(); - if (value < -20) value = -20; - if (value > 50) value = 50; - m_receiverDataList[i].agcFixedGain_dB = value; - - cstr = m_rxStringList.at(i); - cstr.append("/agcMaximumGain"); - - value = settings->value(cstr, 30).toInt(); - if (value < -20) value = -20; - if (value > 150) value = 150; - m_receiverDataList[i].agcMaximumGain_dB = value - 0; - - cstr = m_rxStringList.at(i); - cstr.append("/agcSlope"); - - value = settings->value(cstr, 0).toInt(); - if (value < 0) value = 0; - if (value > 20) value = 20; - m_receiverDataList[i].agcVariableGain = (qreal)value; - - cstr = m_rxStringList.at(i); - cstr.append("/agcAttacktime"); - - value = settings->value(cstr, 1).toInt(); - if (value < 1) value = 1; - if (value > 10) value = 10; - m_receiverDataList[i].agcAttackTime = value/1000.0; - - cstr = m_rxStringList.at(i); - cstr.append("/agcDecaytime"); - - value = settings->value(cstr, 250).toInt(); - if (value < 10) value = 10; - if (value > 5000) value = 5000; - m_receiverDataList[i].agcDecayTime = value/1000.0; - - cstr = m_rxStringList.at(i); - cstr.append("/agcHangtime"); - - value = settings->value(cstr, 100).toInt(); - if (value < 10) value = 10; - if (value > 5000) value = 5000; - m_receiverDataList[i].agcHangTime = value/1000.0; - - cstr = m_rxStringList.at(i); - cstr.append("/agcLines"); - - str = settings->value(cstr, "on").toString(); - if (str.toLower() == "on") - m_receiverDataList[i].agcLines = true; - else - m_receiverDataList[i].agcLines = false; - - cstr = m_rxStringList.at(i); - cstr.append("/agcMode"); - - str = settings->value(cstr, "MED").toString(); - if (str == "LONG") - m_receiverDataList[i].agcMode = agcLONG; - else if (str == "SLOW") - m_receiverDataList[i].agcMode = agcSLOW; - else if (str == "MED") - m_receiverDataList[i].agcMode = agcMED; - else if (str == "FAST") - m_receiverDataList[i].agcMode = agcFAST; - else - m_receiverDataList[i].agcMode = agcOFF; - - if (str == "MED" || str == "FAST") - m_receiverDataList[i].hangEnabled = false; - else - m_receiverDataList[i].hangEnabled = true; - - cstr = m_rxStringList.at(i); - cstr.append("/panMode"); - - str = settings->value(cstr, "LINE").toString(); - if (str == "LINE") - m_receiverDataList[i].panMode = Line; - else if (str == "FILLEDLINE") - m_receiverDataList[i].panMode = FilledLine; - else if (str == "SOLID") - m_receiverDataList[i].panMode = Solid; - - cstr = m_rxStringList.at(i); - cstr.append("/waterfallMode"); - - str = settings->value(cstr, "ENHANCED").toString(); - if (str == "SIMPLE") - m_receiverDataList[i].waterfallMode = Simple; - else if (str == "ENHANCED") - m_receiverDataList[i].waterfallMode = Enhanced; - - cstr = m_rxStringList.at(i); - cstr.append("/framesPerSecond"); - value = settings->value(cstr, 25).toInt(); - if (value < 0 || value > 200) value = 25; - m_receiverDataList[i].framesPerSecond = value; - - cstr = m_rxStringList.at(i); - cstr.append("/waterfallOffsetLo"); - value = settings->value(cstr, -5).toInt(); - if ((value < -50) || (value > 50)) value = -5; - m_receiverDataList[i].waterfallOffsetLo = value; - - cstr = m_rxStringList.at(i); - cstr.append("/waterfallOffsetHi"); - value = settings->value(cstr, 20).toInt(); - if ((value < -50) || (value > 50)) value = 20; - m_receiverDataList[i].waterfallOffsetHi = value; - - cstr = m_rxStringList.at(i); - cstr.append("/filterHi"); - value = settings->value(cstr, -150).toInt(); - if (value < -20000 || value > 20000) value = -150; - m_receiverDataList[i].filterHi = (qreal)(1.0f * value); - - cstr = m_rxStringList.at(i); - cstr.append("/filterLo"); - value = settings->value(cstr, -3050).toInt(); - if (value < -20000 || value > 20000) value = -3050; - m_receiverDataList[i].filterLo = (qreal)(1.0f * value); - - cstr = m_rxStringList.at(i); - cstr.append("/averaging"); - str = settings->value(cstr, "on").toString(); - if (str.toLower() == "on") - m_receiverDataList[i].spectrumAveraging = true; - else - m_receiverDataList[i].spectrumAveraging = false; - - cstr = m_rxStringList.at(i); - cstr.append("/averagingCnt"); - value = settings->value(cstr, 5).toInt(); - if ((value < 1) || (value > 100)) value = 5; - m_receiverDataList[i].averagingCnt = value; - - cstr = m_rxStringList.at(i); - cstr.append("/grid"); - str = settings->value(cstr, "on").toString(); - if (str.toLower() == "on") - m_receiverDataList[i].panGrid = true; - else - m_receiverDataList[i].panGrid = false; - - cstr = m_rxStringList.at(i); - cstr.append("/hairCross"); - str = settings->value(cstr, "off").toString(); - if (str.toLower() == "on") - m_receiverDataList[i].hairCross = true; - else - m_receiverDataList[i].hairCross = false; - - cstr = m_rxStringList.at(i); - cstr.append("/panLocked"); - str = settings->value(cstr, "off").toString(); - if (str.toLower() == "on") - m_receiverDataList[i].panLocked = true; - else - m_receiverDataList[i].panLocked = false; - - cstr = m_rxStringList.at(i); - cstr.append("/clickVFO"); - str = settings->value(cstr, "off").toString(); - if (str.toLower() == "on") - m_receiverDataList[i].clickVFO = true; - else - m_receiverDataList[i].clickVFO = false; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency2200m"); - value = settings->value(cstr, 135700).toDouble(); - if ((value < 135700) || (value > 137800)) value = 135700; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency2200m"); - value = settings->value(cstr, 135700).toDouble(); - if ((value < 135700) || (value > 137800)) value = 135700; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency630m"); - value = settings->value(cstr, 472000).toDouble(); - if ((value < 472000) || (value > 479000)) value = 472000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency630m"); - value = settings->value(cstr, 472000).toDouble(); - if ((value < 472000) || (value > 479000)) value = 472000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency160m"); - value = settings->value(cstr, 1810000).toDouble(); - if ((value < 1810000) || (value > 2000000)) value = 1810000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency160m"); - value = settings->value(cstr, 1800000).toDouble(); - if ((value < 1810000) || (value > 2000000)) value = 1810000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency80m"); - value = settings->value(cstr, 3500000).toDouble(); - if ((value < 3500000) || (value > 3800000)) value = 3500000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency80m"); - value = settings->value(cstr, 3500000).toDouble(); - if ((value < 3500000) || (value > 3800000)) value = 3500000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency60m"); - value = settings->value(cstr, 5260000).toDouble(); - if ((value < 5260000) || (value > 5410000)) value = 5260000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency60m"); - value = settings->value(cstr, 5260000).toDouble(); - if ((value < 5260000) || (value > 5410000)) value = 5260000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency40m"); - value = settings->value(cstr, 7000000).toDouble(); - if ((value < 7000000) || (value > 7200000)) value = 7000000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency40m"); - value = settings->value(cstr, 7000000).toDouble(); - if ((value < 7000000) || (value > 7200000)) value = 7000000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency30m"); - value = settings->value(cstr, 10100000).toDouble(); - if ((value < 10100000) || (value > 10150000)) value = 10100000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency30m"); - value = settings->value(cstr, 10100000).toDouble(); - if ((value < 10100000) || (value > 10150000)) value = 10100000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency20m"); - value = settings->value(cstr, 14000000).toDouble(); - if ((value < 14000000) || (value > 14350000)) value = 14000000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency20m"); - value = settings->value(cstr, 14000000).toDouble(); - if ((value < 14000000) || (value > 14350000)) value = 14000000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency17m"); - value = settings->value(cstr, 18068000).toDouble(); - if ((value < 18068000) || (value > 18168000)) value = 18068000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency17m"); - value = settings->value(cstr, 18068000).toDouble(); - if ((value < 18068000) || (value > 18168000)) value = 18068000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency15m"); - value = settings->value(cstr, 21000000).toDouble(); - if ((value < 21000000) || (value > 21450000)) value = 21000000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency15m"); - value = settings->value(cstr, 21000000).toDouble(); - if ((value < 21000000) || (value > 21450000)) value = 21000000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency12m"); - value = settings->value(cstr, 24890000).toDouble(); - if ((value < 24890000) || (value > 24990000)) value = 24890000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency12m"); - value = settings->value(cstr, 24890000).toDouble(); - if ((value < 24890000) || (value > 24990000)) value = 24890000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency10m"); - value = settings->value(cstr, 28000000).toDouble(); - if ((value < 28000000) || (value > 29700000)) value = 28000000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency10m"); - value = settings->value(cstr, 28000000).toDouble(); - if ((value < 28000000) || (value > 29700000)) value = 28000000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency6m"); - value = settings->value(cstr, 50000000).toDouble(); - if ((value < 50000000) || (value > 54000000)) value = 50000000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency6m"); - value = settings->value(cstr, 50000000).toDouble(); - if ((value < 50000000) || (value > 54000000)) value = 50000000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency2m"); - value = settings->value(cstr, 144000000).toDouble(); - if ((value < 144000000) || (value > 148000000)) value = 144000000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency2m"); - value = settings->value(cstr, 144000000).toDouble(); - if ((value < 144000000) || (value > 148000000)) value = 144000000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency125cm"); - value = settings->value(cstr, 222000000).toDouble(); - if ((value < 222000000) || (value > 225000000)) value = 222000000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency125cm"); - value = settings->value(cstr, 222000000).toDouble(); - if ((value < 222000000) || (value > 225000000)) value = 222000000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency70cm"); - value = settings->value(cstr, 420000000).toDouble(); - if ((value < 420000000) || (value > 450000000)) value = 420000000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency70cm"); - value = settings->value(cstr, 420000000).toDouble(); - if ((value < 420000000) || (value > 450000000)) value = 420000000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequency33cm"); - value = settings->value(cstr, 902000000).toDouble(); - if ((value < 902000000) || (value > 928000000)) value = 902000000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequency33cm"); - value = settings->value(cstr, 902000000).toDouble(); - if ((value < 902000000) || (value > 928000000)) value = 902000000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastCenterFrequencyGen"); - value = settings->value(cstr, 1800000).toDouble(); - if ((value < 0) || (value > 50000000)) value = 3500000; - m_receiverDataList[i].lastCenterFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/lastVfoFrequencyGen"); - value = settings->value(cstr, 1800000).toDouble(); - if ((value < 0) || (value > MAXFREQUENCY)) value = 1800000; - m_receiverDataList[i].lastVfoFrequencyList << value; - - cstr = m_rxStringList.at(i); - cstr.append("/centerFrequency"); - value = settings->value(cstr, 3672000).toDouble(); - if ((value < 0) || (value > MAXFREQUENCY)) value = 1800000; - m_receiverDataList[i].ctrFrequency = value; - - setCtrFrequency(i, value); - - cstr = m_rxStringList.at(i); - cstr.append("/vfoFrequency"); - value = settings->value(cstr, 3672000).toDouble(); - if ((value < 0) || (value > 50000000)) value = 3600000; - m_receiverDataList[i].vfoFrequency = value; - - setVfoFrequency(i, value); - - - if (m_receiverDataList[i].dspModeList.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { - - for (int j = 0; j < MAX_BANDS; j++) { - - cstr = m_rxStringList.at(i); - cstr.append("/dspMode"); - cstr.append(m_bandList.at(j).bandString); - - str = settings->value(cstr, "").toString(); - - if (str == "USB") - m_receiverDataList[i].dspModeList[j] = USB; - else if (str == "DSB") - m_receiverDataList[i].dspModeList[j] = DSB; - else if (str == "CWL") - m_receiverDataList[i].dspModeList[j] = CWL; - else if (str == "CWU") - m_receiverDataList[i].dspModeList[j] = CWU; - else if (str == "FMN") - m_receiverDataList[i].dspModeList[j] = FMN; - else if (str == "AM") - m_receiverDataList[i].dspModeList[j] = AM; - else if (str == "DIGU") - m_receiverDataList[i].dspModeList[j] = DIGU; - else if (str == "SPEC") - m_receiverDataList[i].dspModeList[j] = SPEC; - else if (str == "DIGL") - m_receiverDataList[i].dspModeList[j] = DIGL; - else if (str == "SAM") - m_receiverDataList[i].dspModeList[j] = SAM; - else if (str == "DRM") - m_receiverDataList[i].dspModeList[j] = DRM; - else - m_receiverDataList[i].dspModeList[j] = LSB; - - //SETTINGS_DEBUG << cstr << ": " << getDSPModeString(m_receiverDataList[i].dspModeList[j]); - } - } - - if (m_receiverDataList[i].mercuryAttenuators.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { - - for (int j = 0; j < MAX_BANDS; j++) { - - cstr = m_rxStringList.at(i); - cstr.append("/attenuator"); - cstr.append(m_bandList.at(j).bandString); - - str = settings->value(cstr, "off").toString(); - if (str.toLower() == "on") - m_receiverDataList[i].mercuryAttenuators[j] = 0; // which is 'Preamp' off - else - m_receiverDataList[i].mercuryAttenuators[j] = 1; // which is 'Preamp' on - } - } - - int valueMin, valueMax; - if (m_receiverDataList[i].dBmPanScaleMinList.length() == MAX_BANDS && - m_receiverDataList[i].dBmPanScaleMaxList.length() == MAX_BANDS && - m_bandList.length() == MAX_BANDS - ) { - for (int j = 0; j < MAX_BANDS; j++) { - - cstr = m_rxStringList.at(i); - cstr.append("/dBmPanScaleMin"); - cstr.append(m_bandList.at(j).bandString); - - valueMin = settings->value(cstr, -120).toInt(); - if ((valueMin < -200) || (valueMin > 0)) valueMin = -120; - - cstr = m_rxStringList.at(i); - cstr.append("/dBmPanScaleMax"); - cstr.append(m_bandList.at(j).bandString); - - valueMax = settings->value(cstr, -10).toInt(); - if ((valueMax < -200) || (valueMax > 0)) valueMax = -10; - - if (valueMax <= valueMin) { - - valueMin = -120; - valueMax = -10; - } - - m_receiverDataList[i].dBmPanScaleMinList[j] = (qreal)(1.0 * valueMin); - m_receiverDataList[i].dBmPanScaleMaxList[j] = (qreal)(1.0 * valueMax); - } - } - } - - //****************************************************************** - // Chirp WSPR settings - value = settings->value("ChirpWSPR/lowerChirpFrequency", 500).toInt(); - if (value < 1 || value > 10000) value = 500; - m_lowerChirpFreq = value; - - value = settings->value("ChirpWSPR/upperChirpFrequency", 2500).toInt(); - if (value < 2 || value < m_lowerChirpFreq + 1 || value > 50000) value = 2500; - m_upperChirpFreq = value; - - value = settings->value("ChirpWSPR/chirpAmplitude", 75).toInt(); - if (value < 0 || value > 100) return -1; - m_chirpAmplitude = qreal(value / 100.0); - - value = settings->value("ChirpWSPR/chirpSamplingFrequency", 48000).toInt(); - if ((value != 8000) & (value != 48000) & (value != 96000)) value = 48000; - m_chirpSamplingFreq = value; - - value = settings->value("ChirpWSPR/chirpBufferDurationUs", 10000000).toInt(); - if (value < 0 || value > 100000000) value = 10000000; - m_chirpBufferDurationUs = (qint64)value; - - value = settings->value("ChirpWSPR/chirpChannels", 1).toInt(); - if ((value != 1) & (value != 2)) value = 1; - m_chirpChannels = value; - - value = settings->value("ChirpWSPR/chirpBufferLength", 4096).toInt(); - if ((value != 4096) & (value != 16384)) value = 4096; - m_chirpBufferLength = (qint64)value; - - value = settings->value("ChirpWSPR/chirpFilterLowerFrequency", 500).toInt(); - if (value < 10000 || value > 10000) value = 500; - m_chirpFilterLowerFrequency = value; - - value = settings->value("ChirpWSPR/chirpFilterUpperFrequency", 2500).toInt(); - if (value < 10000 || value > 10000) value = 2500; - m_chirpFilterUpperFrequency = value; - - //****************************************************************** - // graphics settings - - value = settings->value("graphics/dBmDistScaleMin", -20).toInt(); - if ((value < -200) || (value > 0)) value = -20; - m_dBmDistScaleMin = (qreal)(1.0 * value); - - value = settings->value("graphics/dBmDistScaleMax", 100).toInt(); - if ((value < -100) || (value > 200)) value = 100; - m_dBmDistScaleMax = (qreal)(1.0 * value); - - value = settings->value("graphics/sMeterHoldTime", 2000).toInt(); - if ((value < 0) || (value > 10000)) value = 2000; - m_sMeterHoldTime = value; - - - //****************************************************************** - // color settings - QColor color; - - color = settings->value("colors/panBackground", QColor(102, 69, 8)).value(); - if (!color.isValid()) color = QColor(102, 69, 8); - m_panadapterColors.panBackgroundColor = color; - - color = settings->value("colors/waterfall", QColor(246, 146, 6)).value(); - if (!color.isValid()) color = QColor(246, 146, 6); - m_panadapterColors.waterfallColor = color; - - color = settings->value("colors/panLine", QColor(246, 164, 76)).value(); - if (!color.isValid()) color = QColor(246, 164, 76); - m_panadapterColors.panLineColor = color; - - color = settings->value("colors/panLineFilled", QColor(246, 159, 7)).value(); - if (!color.isValid()) color = QColor(246, 159, 7); - m_panadapterColors.panLineFilledColor = color; - - color = settings->value("colors/panSolidTop", QColor(230, 246, 204)).value(); - if (!color.isValid()) color = QColor(230, 246, 204); - m_panadapterColors.panSolidTopColor = color; - - color = settings->value("colors/panSolidBottom", QColor(102, 96, 8)).value(); - if (!color.isValid()) color = QColor(102, 96, 8); - m_panadapterColors.panSolidBottomColor = color; - - color = settings->value("colors/panWideBandLine", QColor(73, 111, 7)).value(); - if (!color.isValid()) color = QColor(73, 111, 7); - m_panadapterColors.wideBandLineColor = color; - - color = settings->value("colors/panWideBandFilled", QColor(137, 172, 62)).value(); - if (!color.isValid()) color = QColor(137, 172, 62); - m_panadapterColors.wideBandFilledColor = color; - - color = settings->value("colors/panWideBandSolidTop", QColor(236, 38, 16)).value(); - if (!color.isValid()) color = QColor(236, 38, 16); - m_panadapterColors.wideBandSolidTopColor = color; - - color = settings->value("colors/panWideBandSolidBottom", QColor(232, 134, 29)).value(); - if (!color.isValid()) color = QColor(232, 134, 29); - m_panadapterColors.wideBandSolidBottomColor = color; - - color = settings->value("colors/distanceLine", QColor(246, 27, 45)).value(); - if (!color.isValid()) color = QColor(246, 27, 45); - m_panadapterColors.distanceLineColor = color; - - color = settings->value("colors/distanceLineFilled", QColor(232, 29, 86)).value(); - if (!color.isValid()) color = QColor(232, 29, 86); - m_panadapterColors.distanceLineFilledColor = color; - - color = settings->value("colors/panCenterLine", QColor(246, 7, 19)).value(); - if (!color.isValid()) color = QColor(246, 7, 19); - m_panadapterColors.panCenterLineColor = color; - - color = settings->value("colors/gridLine", QColor(7, 96, 96)).value(); - if (!color.isValid()) color = QColor(7, 96, 96); - m_panadapterColors.gridLineColor = color; - - SETTINGS_DEBUG << "reading done."; - - return 0; -} - -int Settings::saveSettings() { - - QString str; - //QList bandList = HamBandStrings(); - - settings->setValue(getTitleStr(), getVersionStr()); - settings->setValue("saved", QDateTime::currentDateTime().toString("dddd dd MMMM yyyy hh:mm:ss"));// << " local time\n\n"); - settings->setValue("user/callSign", m_callsignString); - - // window settings - settings->setValue("window/minimumWidgetWidth", m_minimumWidgetWidth); - settings->setValue("window/minimumGroupBoxWidth", m_minimumGroupBoxWidth); - settings->setValue("window/multiRxView", m_multiRxView); - - // network settings - settings->setValue("network/server_ipAddress", m_serverAddress); - settings->setValue("network/hpsdr_local_ipAddress", m_hpsdrDeviceLocalAddr); - settings->setValue("network/server_port", m_serverPort); - settings->setValue("network/listen_port", m_listenerPort); - settings->setValue("network/audio_port", m_audioPort); - settings->setValue("network/metis_port", m_metisPort); - settings->setValue("network/socketBufferSize", m_socketBufferSize); - - - // HPSDR hardware - settings->setValue("hpsdr/hardware", m_hpsdrHardware); - - switch (m_hpsdrHardware) { - - // Mercury/Penelope, PennyLane - case 0: - - if (m_devices.mercuryPresence) - settings->setValue("hpsdr/mercury", "true"); - else - settings->setValue("hpsdr/mercury", "false"); - - if (m_devices.penelopePresence) - settings->setValue("hpsdr/penelope", "true"); - else - settings->setValue("hpsdr/penelope", "false"); - - if (m_devices.pennylanePresence) - settings->setValue("hpsdr/pennylane", "true"); - else - settings->setValue("hpsdr/pennylane", "false"); - - if (m_devices.excaliburPresence) - settings->setValue("hpsdr/excalibur", "true"); - else - settings->setValue("hpsdr/excalibur", "false"); - break; - - // Hermes - case 1: - - if (m_devices.mercuryPresence) - settings->setValue("hpsdr/mercury", "true"); - else - settings->setValue("hpsdr/mercury", "false"); - - if (m_devices.penelopePresence) - settings->setValue("hpsdr/penelope", "true"); - else - settings->setValue("hpsdr/penelope", "false"); - - if (m_devices.pennylanePresence) - settings->setValue("hpsdr/pennylane", "true"); - else - settings->setValue("hpsdr/pennylane", "false"); - - if (m_devices.excaliburPresence) - settings->setValue("hpsdr/excalibur", "true"); - else - settings->setValue("hpsdr/excalibur", "false"); - break; - - // Cyclops - case 2: - break; - } - - if (m_devices.alexPresence) - settings->setValue("hpsdr/alex", "true"); - else - settings->setValue("hpsdr/alex", "false"); - - -// if (m_devices.hermesPresence) -// settings->setValue("hpsdr/hermes", "true"); -// else -// settings->setValue("hpsdr/hermes", "false"); - - switch (m_hpsdrHardware) { - - // Mercury/Penelope - case 0: - - if (m_hwInterface == QSDR::Metis) - settings->setValue("hpsdr/interface", "metis"); - else if (m_hwInterface == QSDR::NoInterfaceMode) - settings->setValue("hpsdr/interface", "noInterface"); - break; - - // Hermes - case 1: - - if (m_hwInterface == QSDR::Hermes) - settings->setValue("hpsdr/interface", "hermes"); - break; - - // Cyclops - case 2: - break; - } - - if (m_checkFirmwareVersions) - settings->setValue("hpsdr/checkfw", "true"); - else - settings->setValue("hpsdr/checkfw", "false"); - - - // server settings - settings->setValue("server/sample_rate", getSampleRate()); - - if (m_mercuryDither == 1) - settings->setValue("server/dither", "on"); - else - settings->setValue("server/dither", "off"); - - if (m_mercuryRandom == 1) - settings->setValue("server/random", "on"); - else - settings->setValue("server/random", "off"); - - if (m_10MHzSource == 0) - settings->setValue("server/10mhzsource", "atlas"); - else if (m_10MHzSource == 1) - settings->setValue("server/10mhzsource", "penelope"); - else if (m_10MHzSource == 2) - settings->setValue("server/10mhzsource", "mercury"); - else if (m_10MHzSource == 3) - settings->setValue("server/10mhzsource", "none"); - else - settings->setValue("server/10mhzsource", "mercury"); - - if (m_122_8MHzSource == 0) - settings->setValue("server/122_88mhzsource", "penelope"); - else if (m_122_8MHzSource == 1) - settings->setValue("server/122_88mhzsource", "mercury"); - - if (m_micSource == 0) - settings->setValue("server/mic_source", "janus"); - else if (m_micSource == 1) - settings->setValue("server/mic_source", "penelope"); - - settings->setValue("server/class", m_RxClass); - settings->setValue("server/timing", m_RxTiming); - //settings->setValue("server/mainVolume", (int)(m_mainVolume * 100)); - - //if (m_serverMode == QSDR::SDRMode) - settings->setValue("server/mode", "sdr"); - - //settings->setValue("server/mouseWheelFreqStep", m_mouseWheelFreqStep); - - //****************************************************************** - // Alexiares data settings - - // m_alexConfig (qint16) - // - // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - // | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | +-----Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) - // | | | | | | | | | | | | | +------ Alex - Bypass all HPFs (0 = disable, 1 = enable)* - // | | | | | | | | | | | | +-------- Alex - 6M low noise amplifier (0 = disable, 1 = enable)* - // | | | | | | | | | | | +---------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* - // | | | | | | | | | | +------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* - // | | | | | | | | | +-------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* - // | | | | | | | | +---------------- Alex - select 13MHz HPF (0 = disable, 1 = enable)* - // | | | | | | | +------------------ Alex - select 20MHz HPF (0 = disable, 1 = enable)* - // | | | | | | +-------------------- Alex - select 160m LPF (0 = disable, 1 = enable)* - // | | | | | +---------------------- Alex - select 80m LPF (0 = disable, 1 = enable)* - // | | | | +------------------------ Alex - select 60/40m LPF (0 = disable, 1 = enable)* - // | | | +-------------------------- Alex - select 30/20m LPF (0 = disable, 1 = enable)* - // | | +---------------------------- Alex - select 17/15m LPF (0 = disable, 1 = enable)* - // | +------------------------------ Alex - select 12/10m LPF (0 = disable, 1 = enable)* - // +-------------------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* - - if (m_alexConfig & 0x01) - settings->setValue("alex/manual", "on"); - else - settings->setValue("alex/manual", "off"); - - if (m_alexConfig & 0x02) - settings->setValue("alex/bypassAll", "on"); - else - settings->setValue("alex/bypassAll", "off"); - - if (m_alexConfig & 0x04) - settings->setValue("alex/amp6m", "on"); - else - settings->setValue("alex/amp6m", "off"); - - settings->setValue("alex/amp6mLo", (int)m_HPFLoFrequencyList.at(5)); - settings->setValue("alex/amp6mHi", (int)m_HPFHiFrequencyList.at(5)); - - if (m_alexConfig & 0x08) - settings->setValue("alex/hpf1_5MHz", "on"); - else - settings->setValue("alex/hpf1_5MHz", "off"); - - settings->setValue("alex/hpf1_5MHzLo", (int)m_HPFLoFrequencyList.at(0)); - settings->setValue("alex/hpf1_5MHzHi", (int)m_HPFHiFrequencyList.at(0)); - - if (m_alexConfig & 0x10) - settings->setValue("alex/hpf6_5MHz", "on"); - else - settings->setValue("alex/hpf6_5MHz", "off"); - - settings->setValue("alex/hpf6_5MHzLo", (int)m_HPFLoFrequencyList.at(1)); - settings->setValue("alex/hpf6_5MHzHi", (int)m_HPFHiFrequencyList.at(1)); - - if (m_alexConfig & 0x20) - settings->setValue("alex/hpf9_5MHz", "on"); - else - settings->setValue("alex/hpf9_5MHz", "off"); - - settings->setValue("alex/hpf9_5MHzLo", (int)m_HPFLoFrequencyList.at(2)); - settings->setValue("alex/hpf9_5MHzHi", (int)m_HPFHiFrequencyList.at(2)); - - if (m_alexConfig & 0x40) - settings->setValue("alex/hpf13MHz", "on"); - else - settings->setValue("alex/hpf13MHz", "off"); - - settings->setValue("alex/hpf13MHzLo", (int)m_HPFLoFrequencyList.at(3)); - settings->setValue("alex/hpf13MHzHi", (int)m_HPFHiFrequencyList.at(3)); - - if (m_alexConfig & 0x80) - settings->setValue("alex/hpf20MHz", "on"); - else - settings->setValue("alex/hpf20MHz", "off"); - - settings->setValue("alex/hpf20MHzLo", (int)m_HPFLoFrequencyList.at(4)); - settings->setValue("alex/hpf20MHzHi", (int)m_HPFHiFrequencyList.at(4)); - - if (m_alexConfig & 0x100) - settings->setValue("alex/lpf160m", "on"); - else - settings->setValue("alex/lpf160m", "off"); - - settings->setValue("alex/lpf160mLo", (int)m_LPFLoFrequencyList.at(0)); - settings->setValue("alex/lpf160mHi", (int)m_LPFHiFrequencyList.at(0)); - - if (m_alexConfig & 0x200) - settings->setValue("alex/lpf80m", "on"); - else - settings->setValue("alex/lpf80m", "off"); - - settings->setValue("alex/lpf80mLo", (int)m_LPFLoFrequencyList.at(1)); - settings->setValue("alex/lpf80mHi", (int)m_LPFHiFrequencyList.at(1)); - - if (m_alexConfig & 0x400) - settings->setValue("alex/lpf60_40m", "on"); - else - settings->setValue("alex/lpf60_40m", "off"); - - settings->setValue("alex/lpf60_40mLo", (int)m_LPFLoFrequencyList.at(2)); - settings->setValue("alex/lpf60_40mHi", (int)m_LPFHiFrequencyList.at(2)); - - if (m_alexConfig & 0x800) - settings->setValue("alex/lpf30_20m", "on"); - else - settings->setValue("alex/lpf30_20m", "off"); - - settings->setValue("alex/lpf30_20mLo", (int)m_LPFLoFrequencyList.at(3)); - settings->setValue("alex/lpf30_20mHi", (int)m_LPFHiFrequencyList.at(3)); - - if (m_alexConfig & 0x1000) - settings->setValue("alex/lpf17_15m", "on"); - else - settings->setValue("alex/lpf17_15m", "off"); - - settings->setValue("alex/lpf17_15mLo", (int)m_LPFLoFrequencyList.at(4)); - settings->setValue("alex/lpf17_15mHi", (int)m_LPFHiFrequencyList.at(4)); - - if (m_alexConfig & 0x2000) - settings->setValue("alex/lpf12_10m", "on"); - else - settings->setValue("alex/lpf12_10m", "off"); - - settings->setValue("alex/lpf12_10mLo", (int)m_LPFLoFrequencyList.at(5)); - settings->setValue("alex/lpf12_10mHi", (int)m_LPFHiFrequencyList.at(5)); - - if (m_alexConfig & 0x4000) - settings->setValue("alex/lpf6m", "on"); - else - settings->setValue("alex/lpf6m", "off"); - - settings->setValue("alex/lpf6mLo", (int)m_LPFLoFrequencyList.at(6)); - settings->setValue("alex/lpf6mHi", (int)m_LPFHiFrequencyList.at(6)); - - - //*********************************************************************** - for (int i = 0; i < MAX_BANDS; i++) { - - str = "alex/state"; - str.append(m_bandList.at(i).bandString); - - settings->setValue(str, m_alexStates.at(i)); - } - - if (m_alexStates.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { - - for (int i = 0; i < MAX_BANDS-1; i++) { - - str = "alex/state"; - str.append(m_bandList.at(i).bandString); - - settings->setValue(str, m_alexStates.at(i)); - } - } - - - //****************************************************************** - // Penny open collector settings - - if (m_pennyOCEnabled) - settings->setValue("penny/OCenabled", "on"); - else - settings->setValue("penny/OCenabled", "off"); - - if (m_rxJ6pinList.length() == MAX_BANDS-1 && m_txJ6pinList.length() == MAX_BANDS-1 && m_bandList.length() == MAX_BANDS) { - - for (int i = 0; i < MAX_BANDS-1; i++) { - - str = "penny/rxState"; - str.append(m_bandList.at(i).bandString); - - settings->setValue(str, m_rxJ6pinList.at(i)); - } - - for (int i = 0; i < MAX_BANDS-1; i++) { - - str = "penny/txState"; - str.append(m_bandList.at(i).bandString); - - settings->setValue(str, m_txJ6pinList.at(i)); - } - } - - //****************************************************************** - // wideband settings - - if (m_widebandOptions.wideBandData) - settings->setValue("wideband/widebandData", "on"); - else - settings->setValue("wideband/widebandData", "off"); - - if (!m_widebandOptions.wideBandData) m_widebandOptions.wideBandDisplayStatus = false; - - if (m_widebandOptions.wideBandDisplayStatus) - settings->setValue("wideband/widebandDisplay", "on"); - else - settings->setValue("wideband/widebandDisplay", "off"); - - if (m_widebandOptions.averaging) - settings->setValue("wideband/averaging", "on"); - else - settings->setValue("wideband/averaging", "off"); - - settings->setValue("wideband/averagingCnt", m_widebandOptions.averagingCnt); - settings->setValue("wideband/dBmWideBandScaleMin", (int)m_widebandOptions.dBmWBScaleMin); - settings->setValue("wideband/dBmWideBandScaleMax", (int)m_widebandOptions.dBmWBScaleMax); - - if (m_widebandOptions.panMode == Line) - settings->setValue("wideband/panMode", "LINE"); - else if (m_widebandOptions.panMode == FilledLine) - settings->setValue("wideband/panMode", "FILLEDLINE"); - else if (m_widebandOptions.panMode == Solid) - settings->setValue("wideband/panMode", "SOLID"); - - - //****************************************************************** - // receiver data settings - - for (int i = 0; i < MAX_RECEIVERS; i++) { - - QString str = m_rxStringList.at(i); - str.append("/dspCore"); - - if (m_receiverDataList[i].dspCore == QSDR::QtDSP) - settings->setValue(str, "qtdsp"); - //else - // settings->setValue(str, "dttsp"); - - str = m_rxStringList.at(i); - str.append("/freqRulerPosition"); - settings->setValue(str, (int)(m_receiverDataList[i].freqRulerPosition * 10)); - - str = m_rxStringList.at(i); - str.append("/audioVolume"); - settings->setValue(str, (int)(m_receiverDataList[i].audioVolume * 100)); - - str = m_rxStringList.at(i); - str.append("/mouseWheelFreqStep"); - settings->setValue(str, (int)(m_receiverDataList[i].mouseWheelFreqStep)); - - str = m_rxStringList.at(i); - str.append("/agcGain"); - settings->setValue(str, m_receiverDataList[i].acgGain); - - str = m_rxStringList.at(i); - str.append("/agcFixedGain"); - settings->setValue(str, (int) m_receiverDataList[i].agcFixedGain_dB); - - str = m_rxStringList.at(i); - str.append("/agcMaximumGain"); - settings->setValue(str, (int) m_receiverDataList[i].agcMaximumGain_dB); - - str = m_rxStringList.at(i); - str.append("/agcSlope"); - settings->setValue(str, (int)m_receiverDataList[i].agcVariableGain); - - str = m_rxStringList.at(i); - str.append("/agcAttacktime"); - settings->setValue(str, (int)(m_receiverDataList[i].agcAttackTime * 1000)); - - str = m_rxStringList.at(i); - str.append("/agcDecaytime"); - settings->setValue(str, (int)(m_receiverDataList[i].agcDecayTime * 1000)); - - str = m_rxStringList.at(i); - str.append("/agcHangTime"); - settings->setValue(str, (int)(m_receiverDataList[i].agcHangTime * 1000)); - - str = m_rxStringList.at(i); - str.append("/agcLines"); - - if (m_receiverDataList[i].agcLines) - settings->setValue(str, "on"); - else - settings->setValue(str, "off"); - -// str = m_rxStringList.at(i); -// str.append("/attenuator"); -// str.append(m_bandList.at(j).bandString); -// -// if (m_receiverDataList.at(i).mercuryAttenuators.at(j)) -// settings->setValue(str, "off"); -// else -// settings->setValue(str, "on"); - - str = m_rxStringList.at(i); - str.append("/agcMode"); - - if (m_receiverDataList[i].agcMode == agcOFF) - settings->setValue(str, "OFF"); - else if (m_receiverDataList[i].agcMode == agcLONG) - settings->setValue(str, "LONG"); - else if (m_receiverDataList[i].agcMode == agcSLOW) - settings->setValue(str, "SLOW"); - else if (m_receiverDataList[i].agcMode == agcMED) - settings->setValue(str, "MED"); - else if (m_receiverDataList[i].agcMode == agcFAST) - settings->setValue(str, "FAST"); - - str = m_rxStringList.at(i); - str.append("/panMode"); - - if (m_receiverDataList[i].panMode == Line) - settings->setValue(str, "LINE"); - else if (m_receiverDataList[i].panMode == FilledLine) - settings->setValue(str, "FILLEDLINE"); - else if (m_receiverDataList[i].panMode == Solid) - settings->setValue(str, "SOLID"); - - str = m_rxStringList.at(i); - str.append("/waterfallMode"); - - if (m_receiverDataList[i].waterfallMode == Simple) - settings->setValue(str, "SIMPLE"); - else if (m_receiverDataList[i].waterfallMode == Enhanced) - settings->setValue(str, "ENHANCED"); - - str = m_rxStringList.at(i); - str.append("/framesPerSecond"); - settings->setValue(str, m_receiverDataList[i].framesPerSecond); - - str = m_rxStringList.at(i); - str.append("/waterfallOffsetLo"); - settings->setValue(str, m_receiverDataList[i].waterfallOffsetLo); - - str = m_rxStringList.at(i); - str.append("/waterfallOffsetHi"); - settings->setValue(str, m_receiverDataList[i].waterfallOffsetHi); - - str = m_rxStringList.at(i); - str.append("/filterHi"); - settings->setValue(str, m_receiverDataList[i].filterHi); - - str = m_rxStringList.at(i); - str.append("/filterLo"); - settings->setValue(str, m_receiverDataList[i].filterLo); - - str = m_rxStringList.at(i); - str.append("/averaging"); - if (m_receiverDataList[i].spectrumAveraging) - settings->setValue(str, "on"); - else - settings->setValue(str, "off"); - - str = m_rxStringList.at(i); - str.append("/averagingCnt"); - settings->setValue(str, m_receiverDataList[i].averagingCnt); - - str = m_rxStringList.at(i); - str.append("/grid"); - if (m_receiverDataList[i].panGrid) - settings->setValue(str, "on"); - else - settings->setValue(str, "off"); - - str = m_rxStringList.at(i); - str.append("/hairCross"); - if (m_receiverDataList[i].hairCross) - settings->setValue(str, "on"); - else - settings->setValue(str, "off"); - - str = m_rxStringList.at(i); - str.append("/panLocked"); - if (m_receiverDataList[i].panLocked) - settings->setValue(str, "on"); - else - settings->setValue(str, "off"); - - str = m_rxStringList.at(i); - str.append("/clickVFO"); - if (m_receiverDataList[i].clickVFO) - settings->setValue(str, "on"); - else - settings->setValue(str, "off"); - - // center frequencies - for (int j = 0; j < MAX_BANDS; j++) { - - str = m_rxStringList.at(i); - str.append("/lastCenterFrequency"); - str.append(m_bandList.at(j).bandString); - - settings->setValue(str, (int)m_receiverDataList[i].lastCenterFrequencyList.at(j)); - } - - // vfo frequencies - for (int j = 0; j < MAX_BANDS; j++) { - - str = m_rxStringList.at(i); - str.append("/lastVfoFrequency"); - str.append(m_bandList.at(j).bandString); - - settings->setValue(str, (int)m_receiverDataList[i].lastVfoFrequencyList.at(j)); - } - - str = m_rxStringList.at(i); - str.append("/centerFrequency"); - settings->setValue(str, (int)m_receiverDataList[i].ctrFrequency); - - str = m_rxStringList.at(i); - str.append("/vfoFrequency"); - settings->setValue(str, (int)m_receiverDataList[i].vfoFrequency); - - for (int j = 0; j < MAX_BANDS; j++) { - - str = m_rxStringList.at(i); - str.append("/dspMode"); - str.append(m_bandList.at(j).bandString); - - DSPMode mode = m_receiverDataList.at(i).dspModeList.at(j); - if (mode == LSB) - settings->setValue(str, "LSB"); - else if (mode == USB) - settings->setValue(str, "USB"); - else if (mode == DSB) - settings->setValue(str, "DSB"); - else if (mode == CWL) - settings->setValue(str, "CWL"); - else if (mode == CWU) - settings->setValue(str, "CWU"); - else if (mode == FMN) - settings->setValue(str, "FMN"); - else if (mode == AM) - settings->setValue(str, "AM"); - else if (mode == DIGU) - settings->setValue(str, "DIGU"); - else if (mode == SPEC) - settings->setValue(str, "SPEC"); - else if (mode == DIGL) - settings->setValue(str, "DIGL"); - else if (mode == SAM) - settings->setValue(str, "SAM"); - else if (mode == DRM) - settings->setValue(str, "DRM"); - } - - for (int j = 0; j < MAX_BANDS; j++) { - - str = m_rxStringList.at(i); - str.append("/attenuator"); - str.append(m_bandList.at(j).bandString); - - if (m_receiverDataList.at(i).mercuryAttenuators.at(j)) - settings->setValue(str, "off"); - else - settings->setValue(str, "on"); - } - - for (int j = 0; j < MAX_BANDS; j++) { - - str = m_rxStringList.at(i); - str.append("/dBmPanScaleMin"); - str.append(m_bandList.at(j).bandString); - - settings->setValue(str, (int)m_receiverDataList[i].dBmPanScaleMinList[j]); - - str = m_rxStringList.at(i); - str.append("/dBmPanScaleMax"); - str.append(m_bandList.at(j).bandString); - - settings->setValue(str, (int)m_receiverDataList[i].dBmPanScaleMaxList[j]); - } - } - - - //****************************************************************** - // Cuda settings - //settings->setValue("Cuda/lastDevice", m_cudaLastDevice); - - - //****************************************************************** - // Chirp WSPR settings - settings->setValue("ChirpWSPR/lowerChirpFrequency", m_lowerChirpFreq); - settings->setValue("ChirpWSPR/upperChirpFrequency", m_upperChirpFreq); - settings->setValue("ChirpWSPR/chirpAmplitude", int(m_chirpAmplitude * 100)); - settings->setValue("ChirpWSPR/chirpSamplingFrequency", m_chirpSamplingFreq); - settings->setValue("ChirpWSPR/chirpBufferDurationUs", m_chirpBufferDurationUs); - settings->setValue("ChirpWSPR/chirpChannels", m_chirpChannels); - settings->setValue("ChirpWSPR/chirpBufferLength", m_chirpBufferLength); - settings->setValue("ChirpWSPR/chirpFilterLowerFrequency", m_chirpFilterLowerFrequency); - settings->setValue("ChirpWSPR/chirpFilterUpperFrequency", m_chirpFilterUpperFrequency); - - - //settings->setValue("ChirpWSPR/chirpDownSampleRate", m_chirpDownSampleRate); - - - //****************************************************************** - // Graphics settings - - /*if (m_specAveraging) - settings->setValue("graphics/averaging", "on"); - else - settings->setValue("graphics/averaging", "off");*/ - - /*if (m_panGrid) - settings->setValue("graphics/grid", "on"); - else - settings->setValue("graphics/grid", "off");*/ - - settings->setValue("graphics/dBmDistScaleMin", (int)m_dBmDistScaleMin); - settings->setValue("graphics/dBmDistScaleMax", (int)m_dBmDistScaleMax); - - /*if (m_waterfallColorScheme == QSDRGraphics::simple) - settings->setValue("graphics/waterfall", "simple"); - else - if (m_waterfallColorScheme == QSDRGraphics::enhanced) - settings->setValue("graphics/waterfall", "enhanced"); - else - if (m_waterfallColorScheme == QSDRGraphics::spectran) - settings->setValue("graphics/waterfall", "spectran");*/ - - settings->setValue("graphics/sMeterHoldTime", m_sMeterHoldTime); - - - // Colors - settings->setValue("colors/panBackground", QVariant(m_panadapterColors.panBackgroundColor).toString()); - settings->setValue("colors/waterfall", QVariant(m_panadapterColors.waterfallColor).toString()); - settings->setValue("colors/panLine", QVariant(m_panadapterColors.panLineColor).toString()); - settings->setValue("colors/panLineFilled", QVariant(m_panadapterColors.panLineFilledColor).toString()); - settings->setValue("colors/panSolidTop", QVariant(m_panadapterColors.panSolidTopColor).toString()); - settings->setValue("colors/panSolidBottom", QVariant(m_panadapterColors.panSolidBottomColor).toString()); - settings->setValue("colors/panWideBandLine", QVariant(m_panadapterColors.wideBandLineColor).toString()); - settings->setValue("colors/panWideBandFilled", QVariant(m_panadapterColors.wideBandFilledColor).toString()); - settings->setValue("colors/panWideBandSolidTop", QVariant(m_panadapterColors.wideBandSolidTopColor).toString()); - settings->setValue("colors/panWideBandSolidBottom", QVariant(m_panadapterColors.wideBandSolidBottomColor).toString()); - settings->setValue("colors/distanceLine", QVariant(m_panadapterColors.distanceLineColor).toString()); - settings->setValue("colors/distanceLineFilled", QVariant(m_panadapterColors.distanceLineFilledColor).toString()); - settings->setValue("colors/panCenterLine", QVariant(m_panadapterColors.panCenterLineColor).toString()); - settings->setValue("colors/gridLine", QVariant(m_panadapterColors.gridLineColor).toString()); - - SETTINGS_DEBUG << "save settings done."; - return 0; -} - -//void Settings::setMainWindowsState(QObject* sender) { -// -// settings->setValue("geometry", sender.saveGeometry()); -// settings->setValue("windowState", saveState()); -//} - -//******************************************************* - -QList Settings::getCtrFrequencies() { - - QList frequencies; - - for (int i = 0; i < MAX_RECEIVERS; i++) - frequencies << m_receiverDataList[i].ctrFrequency; - - return frequencies; -} - -QList Settings::getVfoFrequencies() { - - QList frequencies; - - for (int i = 0; i < MAX_RECEIVERS; i++) - frequencies << m_receiverDataList[i].vfoFrequency; - - return frequencies; -} - -QString Settings::getDSPModeString(int mode) { - - switch (mode) { - - case 0: - return QString("LSB"); - - case 1: - return QString("USB"); - - case 2: - return QString("DSB"); - - case 3: - return QString("CWL"); - - case 4: - return QString("CWU"); - - case 5: - return QString("FMN"); - - case 6: - return QString("AM"); - - case 7: - return QString("DIGU"); - - case 8: - return QString("SPEC"); - - case 9: - return QString("DIGL"); - - case 10: - return QString("SAM"); - - case 11: - return QString("DRM"); - - default: - return QString("unknown mode"); - } -} - -//******************************************************* - -QString Settings::getTitleStr() { - - return m_titleString; -} - -QString Settings::getVersionStr() { - - return m_versionString; -} - -QString Settings::getSettingsFilename() { - - return settingsFilename; -} - -QString Settings::getCallsign() { - - return m_callsignString; -} - -QString Settings::getValue1000( - - double value, /*!<[in] Value to print. */ - int valuePrefix, /*!<[in] Value current prefix. */ - QString unitBase) /*!<[in] Unit base string. */ -{ - const int prefixBase = 1000; - int resPrefix = valuePrefix; - - static const char *prefixTab[prefixSiMax + 1] = { - "", /* prefixNothing */ - "k", /* prefixKilo */ - "M", /* prefixMega */ - "G", /* prefixGiga */ - "T", /* prefixTera */ - "P", /* prefixPeta */ - "E", /* prefixExa */ - "Z", /* prefixZetta */ - "Y", /* prefixYotta */ - }; - - /*while((value > (10 * prefixBase)) && (resPrefix < prefixSiMax)) { - value /= prefixBase; - resPrefix++; - }*/ - while((value > (prefixBase/10)) && (resPrefix < prefixSiMax)) { - value /= prefixBase; - resPrefix++; - } - - return QString("%1 %2%3").arg(value).arg(prefixTab[resPrefix]).arg(unitBase); -} - -QString Settings::getValue1024( - - double value, /*!<[in] Value to print. */ - int valuePrefix, /*!<[in] Value current prefix. */ - QString unitBase) /*!<[in] Unit base string. */ -{ - const int prefixBase = 1024; - int resPrefix = valuePrefix; - - static const char *prefixTab[prefixIecMax + 1] = { - "", /* prefixNothing */ - "Ki", /* prefixKibi */ - "Mi", /* prefixMebi */ - "Gi", /* prefixGibi */ - "Ti", /* prefixTebi */ - "Pi", /* prefixPebi */ - "Ei", /* prefixExbi */ - "Zi", /* prefixZebi */ - "Yi", /* prefixYobi */ - }; - - while((value > (10 * prefixBase)) && (resPrefix < prefixIecMax)) { - value /= prefixBase; - resPrefix++; - } - - return QString("%1 %2%3").arg(value).arg(prefixTab[resPrefix]).arg(unitBase); -} - -int Settings::getMinimumWidgetWidth() { - - return m_minimumWidgetWidth; -} - -int Settings::getMinimumGroupBoxWidth() { - - return m_minimumGroupBoxWidth; -} - -void Settings::debugSystemState() { - - qDebug() << " "; - SETTINGS_DEBUG << "**********************************************************"; - SETTINGS_DEBUG << "Error:\t\t\t" << qPrintable(getErrorString(m_systemError)); - SETTINGS_DEBUG << "HW Interface:\t\t" << qPrintable(getHWInterfaceModeString(m_hwInterface)); - SETTINGS_DEBUG << "Server Mode:\t\t" << qPrintable(getServerModeString(m_serverMode)); - SETTINGS_DEBUG << "DataEngine State:\t" << qPrintable(getHDataEngineStateString(m_dataEngineState)); - qDebug() << " "; -} - -QString Settings::getSDRStyle() { - - return sdrStyle; -} - -QString Settings::getWidgetStyle() { - - return widgetStyle; -} - -QString Settings::getMainWindowStyle() { - - return mainWindowStyle; -} - -QString Settings::getDockStyle() { - - return dockStyle; -} - -QString Settings::getDisplayToolbarStyle() { - - return displayToolbarStyle; -} - -QString Settings::getMainBtnToolbarStyle() { - - return mainBtnToolbarStyle; -} - -QString Settings::getStatusbarStyle() { - - return statusbarStyle; -} - -QString Settings::getMessageBoxStyle() { - - return messageBoxStyle; -} - -QString Settings::getLineEditStyle() { - - return lineEditStyle; -} - -QString Settings::getDialogStyle() { - - return dialogStyle; -} - -QString Settings::getColorDialogStyle() { - - return colorDialogStyle; -} - -QString Settings::getItemStyle() { - - return itemStyle; -} - -QString Settings::getLabelStyle() { - - return labelStyle; -} - -QString Settings::getSliderLabelStyle() { - - return sliderLabelStyle; -} - -QString Settings::getTableStyle() { - - return tableStyle; -} - -QString Settings::getComboBoxStyle() { - - return comboBoxStyle; -} - -QString Settings::getSpinBoxStyle() { - - return spinBoxStyle; -} - -QString Settings::getDoubleSpinBoxStyle() { - - return dSpinBoxStyle; -} - -QString Settings::getMenuStyle() { - - return menuStyle; -} - -QString Settings::getMiniButtonStyle() { - - return miniButtonStyle; -} - -QString Settings::getVolSliderStyle() { - - return volSliderStyle; -} - -QString Settings::getSplitterStyle() { - - return splitterStyle; -} - -QString Settings::getFrameStyle() { - - return frameStyle; -} - -QString Settings::getTabWidgetStyle() { - - return tabWidgetStyle; -} - -//QString Settings::getNewSliderStyle() { -// -// return m_newSliderStyle; -//} - - -//******************************************************* - -void Settings::setMainPower(QObject *sender, bool power) { - - if (m_mainPower == power) return; - - m_mainPower = power; - if (power) - m_mainPower = true; - else - m_mainPower = false; - - emit masterSwitchChanged(sender, m_mainPower); -} - -bool Settings::getMainPower() { - - return m_mainPower; -} - -void Settings::setSystemMessage(const QString &msg, int time) { - - emit systemMessageEvent(msg, time); -} - -void Settings::setSystemState( - - QObject *sender, - QSDR::_Error err, - QSDR::_HWInterfaceMode hwmode, - QSDR::_ServerMode mode, - QSDR::_DataEngineState state) -{ - Q_UNUSED (sender) - - //QMutexLocker locker(&settingsMutex); - - if (m_systemError != err) - m_systemError = err; - - if (m_hwInterface != hwmode) - m_hwInterface = hwmode; - - if (m_serverMode != mode) { - - m_serverMode = mode; - - if (m_serverMode == QSDR::ChirpWSPR) - setWidebandStatus(this, false); - } - - if (m_dataEngineState != state) - m_dataEngineState = state; - - if (m_dataEngineState == QSDR::DataEngineDown) - setCurrentReceiver(this, 0); - //m_currentReceiver = 0; - - //locker.unlock(); - - debugSystemState(); - emit systemStateChanged(this, m_systemError, m_hwInterface, m_serverMode, m_dataEngineState); -} - -QSDR::_ServerMode Settings::getCurrentServerMode() { - - return m_serverMode; -} - -QSDR::_HWInterfaceMode Settings::getHWInterface() { - - return m_hwInterface; -} - -QSDR::_DataEngineState Settings::getDataEngineState() { - - return m_dataEngineState; -} - -QString Settings::getErrorString(QSDR::_Error err) { - - QString str; - switch (err) { - - case 0: - str = "No error"; - break; - - case 1: - str = "Not implemented"; - break; - - case 2: - str = "Hardware IO error"; - break; - - case 3: - str = "Server mode error"; - break; - - case 4: - str = "open device error"; - break; - - case 5: - str = "dataReceiverThread error"; - break; - - case 6: - str = "dataProcessThread error"; - break; - - case 7: - str = "widebandDataProcessThread error"; - break; - - case 8: - str = "audioThread error"; - break; - - case 9: - str = "ChirpDataProcessThread error"; - break; - - case 10: - str = "underrun error"; - break; - - case 11: - str = "firmware error"; - break; - - case 12: - str = "fatal error"; - break; - } - return str; -} - -QString Settings::getHDataEngineStateString(QSDR::_DataEngineState mode) { - - QString str; - switch (mode) { - - case 0: - str = "down"; - break; - - case 1: - str = "up"; - break; - } - return str; -} - -QString Settings::getServerModeString(QSDR::_ServerMode mode) { - - QString str; - switch (mode) { - - case 0: - str = "no server mode"; - break; - - case 1: - str = "SDR mode"; - break; - - case 2: - str = "ChirpWSPR"; - break; - - case 3: - str = "ChirpWSPRFile"; - break; - - case 4: - str = "demo"; - break; - } - return str; -} - -QString Settings::getHWInterfaceModeString(QSDR::_HWInterfaceMode mode) { - - QString str; - switch (mode) { - - case 0: - str = "no interface"; - break; - - case 1: - str = "Metis"; - break; - - case 2: - str = "Hermes"; - break; - } - return str; -} - -void Settings::setTxAllowed(QObject *sender, bool value) { - - if (m_devices.penelopePresence || m_devices.pennylanePresence || (m_hwInterface == QSDR::Hermes)) - m_transmitter.txAllowed = value; - else - m_transmitter.txAllowed = false; - - emit txAllowedChanged(sender, m_transmitter.txAllowed); -} - -bool Settings::getTxAllowed() { - - return m_transmitter.txAllowed; -} - -void Settings::setGraphicsState( - - QObject *sender, - int rx, - PanGraphicsMode panMode, - WaterfallColorMode waterfallColorMode) -{ - Q_UNUSED (sender) - - //QMutexLocker locker(&settingsMutex); - - if (rx == -1) { - - m_widebandOptions.panMode = panMode; - } - else { - - m_receiverDataList[rx].panMode = panMode; - m_receiverDataList[rx].waterfallMode = waterfallColorMode; - } - - //locker.unlock(); - - //SETTINGS_DEBUG << "graphics mode:" << panMode << waterfallColorMode; - emit graphicModeChanged(this, rx, panMode, waterfallColorMode); -} - -PanGraphicsMode Settings::getPanadapterMode(int rx) { - - return m_receiverDataList[rx].panMode; -} - -WaterfallColorMode Settings::getWaterfallColorMode(int rx) { - - return m_receiverDataList.at(rx).waterfallMode; -} - -//QSDRGraphics::_Colors Settings::getColorItem() { -// -// return m_colorItem; -//} - -void Settings::setDefaultSkin(QObject *sender, bool value) { - - Q_UNUSED (sender) - - m_defaultSkin = value; -} - -bool Settings::getDefaultSkin() { - - return m_defaultSkin; -} - -void Settings::setSettingsFilename(QString filename) { - - filename = filename.trimmed(); - - //QMutexLocker locker(&settingsMutex); - - settingsFilename = filename; - //locker.unlock(); - - emit settingsFilenameChanged(filename); -} - -void Settings::setSettingsLoaded(bool value) { - - QMutexLocker locker(&settingsMutex); - - setLoaded = value; - - locker.unlock(); - - emit settingsLoadedChanged(setLoaded); -} - -bool Settings::getSettingsLoaded() { - - return setLoaded; -} - -void Settings::setCPULoad(short load) { - - emit cpuLoadChanged(load); -} - -void Settings::setCallsign(const QString &callsign) { - - QString cs = callsign.trimmed(); - - QMutexLocker locker(&settingsMutex); - - if (m_callsignString == cs) return; - - m_callsignString = cs; - - locker.unlock(); - emit callsignChanged(); -} - -void Settings::setRxList(QList rxList) { - - emit rxListChanged(rxList); -} - -void Settings::setMultiRxView(int view) { - - QMutexLocker locker(&settingsMutex); - - if (m_multiRxView == view) return; - m_multiRxView = view; - - locker.unlock(); - emit multiRxViewChanged(m_multiRxView); -} - -int Settings::getMultiRxView() { - - return m_multiRxView; -} - -void Settings::setMetisCardList(QList list) { - - QMutexLocker locker(&settingsMutex); - - m_metisCards = list; - - locker.unlock(); - emit metisCardListChanged(m_metisCards); -} - -void Settings::searchHpsdrNetworkDevices() { - - emit searchMetisSignal(); -} - -void Settings::clearMetisCardList() { - - m_metisCards.clear(); - - //emit metisCardListChanged(m_metisCards); -} - -void Settings::setCurrentHPSDRDevice(TNetworkDevicecard card) { - - m_currentHPSDRDevice = card; - - emit hpsdrNetworkDeviceChanged(m_currentHPSDRDevice); -} - -void Settings::setHPSDRDeviceNumber(int value) { - - m_hpsdrNetworkDevices = value; - emit networkDeviceNumberChanged(value); -} - -void Settings::showNetworkIODialog() { - - emit showNetworkIO(); -} - -void Settings::showWarningDialog(const QString &msg) { - - emit showWarning(msg); -} - -void Settings::addNetworkIOComboBoxEntry(QString str) { - - emit networkIOComboBoxEntryAdded(str); -} - -void Settings::clearNetworkIOComboBoxEntry() { - - emit clearNetworkIOComboBoxEntrySignal(); -} - -void Settings::setPBOPresence(bool value) { - - m_pboFound = value; -} - -bool Settings::getPBOPresence() { - - return m_pboFound; -} - -void Settings::setFBOPresence(bool value) { - - m_fboFound = value; -} - -bool Settings::getFBOPresence() { - - return m_fboFound; -} - -//******************************* -// Network settings - -void Settings::setNumberOfNetworkInterfaces(int value) { - - m_NetworkInterfacesNo = value; -} - -void Settings::addServerNetworkInterface(QString nicName, QString ipAddress) { - - emit newServerNetworkInterface(nicName, ipAddress); -} - -void Settings::addHPSDRDeviceNIC(QString nicName, QString ipAddress) { - - emit newHPSDRDeviceNIC(nicName, ipAddress); -} - -void Settings::setServerNetworkInterface(int index) { - - setServerAddr(this, this->m_ipAddressesList.at(index).toString()); - - //qDebug() << "m_networkInterfaces.at(index).humanReadableName():" << m_networkInterfaces.at(index).humanReadableName(); - //qDebug() << "m_ipAddressesList.at(index).toString():" << m_ipAddressesList.at(index).toString(); - - QString message = "[settings]: network interface set to: %1 (%2)."; - /*emit messageEvent( - message.arg( - m_networkInterfaces.at(index).humanReadableName(), - m_ipAddressesList.at(index).toString() ));*/ - -} - -void Settings::setHPSDRDeviceNIC(int index) { - - setHPSDRDeviceLocalAddr(this, this->m_ipAddressesList.at(index).toString()); - - QString message = "[settings]: HPSDR device network interface set to: %1 (%2)."; - /*emit messageEvent( - message.arg( - m_networkInterfaces.at(index).humanReadableName(), - m_ipAddressesList.at(index).toString() ));*/ - -} - -void Settings::setServerWidgetNIC(int index) { - - /*QString message = "[server]: network interface set to: %1 (%2)."; - emit messageEvent( - message.arg( - m_networkInterfaces.at(index).humanReadableName(), - m_ipAddressesList.at(index).toString() ));*/ - - emit serverNICChanged(index); -} - -void Settings::setHPSDRWidgetNIC(int index) { - - /*QString message = "[server]: HPSDR device network interface set to: %1 (%2)."; - emit messageEvent( - message.arg( - m_networkInterfaces.at(index).humanReadableName(), - m_ipAddressesList.at(index).toString() ));*/ - - emit hpsdrDeviceNICChanged(index); -} - -void Settings::setServerAddr(QObject *sender, QString addr) { - - QMutexLocker locker(&settingsMutex); - - m_serverAddress = addr; - - locker.unlock(); - emit serverAddrChanged(sender, m_serverAddress); -} - -QString Settings::getServerAddr() { - - return m_serverAddress; -} - -void Settings::setHPSDRDeviceLocalAddr(QObject *sender, QString addr) { - - QMutexLocker locker(&settingsMutex); - - m_hpsdrDeviceLocalAddr = addr; - - locker.unlock(); - emit hpsdrDeviceLocalAddrChanged(sender, m_hpsdrDeviceLocalAddr); -} - -QString Settings::getHPSDRDeviceLocalAddr() { - - return m_hpsdrDeviceLocalAddr; -} - -void Settings::setServerPort(QObject *sender, quint16 port) { - - QMutexLocker locker(&settingsMutex); - - m_serverPort = port; - - locker.unlock(); - emit serverPortChanged(sender, m_serverPort); -} - -quint16 Settings::getServerPort() { - - return m_serverPort; -} - -void Settings::setListenPort(QObject *sender, quint16 port) { - - QMutexLocker locker(&settingsMutex); - - m_listenerPort = port; - - locker.unlock(); - emit listenPortChanged(sender, m_listenerPort); -} - -quint16 Settings::getListenPort() { - - return m_listenerPort; -} - -void Settings::setAudioPort(QObject *sender, quint16 port) { - - QMutexLocker locker(&settingsMutex); - m_audioPort = port; - locker.unlock(); - - emit audioPortChanged(sender, m_audioPort); -} - -quint16 Settings::getAudioPort() { - - return m_audioPort; -} - -void Settings::setMetisPort(QObject *sender, quint16 port) { - - QMutexLocker locker(&settingsMutex); - m_metisPort = port; - locker.unlock(); - - emit metisPortChanged(sender, m_metisPort); -} - -quint16 Settings::getMetisPort() { - - return m_metisPort; -} - -void Settings::setClientConnected(QObject *sender, bool value) { - - QMutexLocker locker(&settingsMutex); - m_clientConnected = value; - locker.unlock(); - - emit clientConnectedChanged(sender, m_clientConnected); -} - -bool Settings::getClientConnected() { - - return m_clientConnected; -} - -void Settings::setClientNoConnected(QObject* sender, int client) { - - QMutexLocker locker(&settingsMutex); - m_clientNoConnected = client; - locker.unlock(); - - emit clientNoConnectedChanged(sender, m_clientNoConnected); -} - -void Settings::setAudioRx(QObject* sender, int rx) { - - emit audioRxChanged(sender, rx); -} - -void Settings::setConnected(QObject *sender, bool value) { - - QMutexLocker locker(&settingsMutex); - m_connected = value; - locker.unlock(); - - emit connectedChanged(sender, m_connected); -} - -bool Settings::getConnected() { - - return m_connected; -} - -void Settings::clientDisconnected(int client) { - - emit clientDisconnectedEvent(client); -} - -void Settings::setRxConnectedStatus(QObject* sender, int rx, bool value) { - - emit rxConnectedStatusChanged(sender, rx, value); -} - -void Settings::setSocketBufferSize(QObject *sender, int value) { - - m_socketBufferSize = value; - //SETTINGS_DEBUG << "m_socketBufferSize = " << value; - emit socketBufferSizeChanged(sender, value); -} - -void Settings::setManualSocketBufferSize(QObject *sender, bool value) { - - m_manualSocketBufferSize = value; - //SETTINGS_DEBUG << "m_manualSocketBufferSize = " << value; - emit manualSocketBufferChanged(sender, m_manualSocketBufferSize); -} - - -//******************************* -// HPSDR hardware presence and firmware versions - -THPSDRDevices Settings::getHPSDRDevices() { - - return m_devices; -} - -void Settings::setHPSDRDevices(QObject *sender, THPSDRDevices devices) { - - Q_UNUSED(sender) - Q_UNUSED(devices) -} - -void Settings::checkHPSDRDevices() { - - SETTINGS_DEBUG << "mercuryPresence: " << m_devices.mercuryPresence; - SETTINGS_DEBUG << "penelopePresence: " << m_devices.penelopePresence; - SETTINGS_DEBUG << "pennylanePresence: " << m_devices.pennylanePresence; - SETTINGS_DEBUG << "excaliburPresence: " << m_devices.excaliburPresence; - SETTINGS_DEBUG << "alexPresence: " << m_devices.alexPresence; - SETTINGS_DEBUG << "hermesPresence: " << m_devices.hermesPresence; - - if (m_hpsdrHardware == 0) { // 0 = Mercury/Penelope - - if (m_devices.penelopePresence && m_devices.pennylanePresence) { - - m_devices.pennylanePresence = false; - m_devices.penelopePresence = true; - SETTINGS_DEBUG << "settings specifies both Penelope and Pennylane - choosing Penelope !"; - } - - if (m_devices.hermesPresence) { - - m_devices.hermesPresence = false; - SETTINGS_DEBUG << "settings specifies also Hermes - choosing Mercury/Penelope/Pennylane !"; - } - } - else if (m_hpsdrHardware == 1) { // 1 = Hermes - - if (m_devices.mercuryPresence || - m_devices.penelopePresence || - m_devices.pennylanePresence || - m_devices.excaliburPresence) - { - m_devices.mercuryPresence = false; - m_devices.penelopePresence = false; - m_devices.pennylanePresence = false; - m_devices.excaliburPresence = false; - SETTINGS_DEBUG << "settings specifies HPSDR Modules - choosing Hermes !"; - } - } -} - - -void Settings::setHPSDRHardware(int value) { - - m_hpsdrHardware = value; // 0 = Mercury/Penelope, 1 = Hermes, 2 = Cyclops - - emit hpsdrHardwareChanged(m_hpsdrHardware); -} - -void Settings::setHermesVersion(int value) { - - QMutexLocker locker(&settingsMutex); - m_devices.hermesFWVersion = value; - locker.unlock(); - - emit hermesVersionChanged(m_devices.hermesFWVersion); -} - -void Settings::setMercuryPresence(bool value) { - - m_devices.mercuryPresence = value; - - emit mercuryPresenceChanged(m_devices.mercuryPresence); -} - -void Settings::setMercuryVersion(int value) { - - QMutexLocker locker(&settingsMutex); - m_devices.mercuryFWVersion = value; - locker.unlock(); - - emit mercuryVersionChanged(m_devices.mercuryFWVersion); -} - -void Settings::setPenelopePresence(bool value) { - - m_devices.penelopePresence = value; - setTxAllowed(this, value); - - emit penelopePresenceChanged(m_devices.penelopePresence); -} - -void Settings::setPenelopeVersion(int value) { - - QMutexLocker locker(&settingsMutex); - m_devices.penelopeFWVersion = value; - locker.unlock(); - - emit penelopeVersionChanged(m_devices.penelopeFWVersion); -} - -void Settings::setPennyLanePresence(bool value) { - - m_devices.pennylanePresence = value; - setTxAllowed(this, value); - - emit pennyLanePresenceChanged(m_devices.pennylanePresence); -} - -void Settings::setPennyLaneVersion(int value) { - - QMutexLocker locker(&settingsMutex); - m_devices.pennylaneFWVersion = value; - locker.unlock(); - - emit pennyLaneVersionChanged(m_devices.pennylaneFWVersion); -} - -void Settings::setAlexPresence(bool value) { - - m_devices.alexPresence = value; - - emit alexPresenceChanged(m_devices.alexPresence); -} - -void Settings::setExcaliburPresence(bool value) { - - m_devices.excaliburPresence = value; - - emit excaliburPresenceChanged(m_devices.excaliburPresence); -} - -void Settings::setMetisVersion(int value) { - - QMutexLocker locker(&settingsMutex); - m_devices.metisFWVersion = value; - locker.unlock(); - - emit metisVersionChanged(m_devices.metisFWVersion); -} - -void Settings::setCheckFirmwareVersion(QObject *sender, bool value) { - - m_checkFirmwareVersions = value; - - emit checkFirmwareVersionChanged(sender, value); -} - -void Settings::setProtocolSync(int value) { - - emit protocolSyncChanged(value); -} - -void Settings::setADCOverflow(int value) { - - emit adcOverflowChanged(value); -} - -void Settings::setPacketLoss(int value) { - - emit packetLossChanged(value); -} - -void Settings::setSendIQ(int value) { - - emit sendIQSignalChanged(value); -} - -void Settings::setRcveIQ(int value) { - - emit rcveIQSignalChanged(value); -} - -/** - * Set the number of receivers to be supported by this server - * \param r The number of receivers: 0 to 6 - * This value is embedded into the command & control bytes that are sent to Mercury. - * Thus it determines how the I & Q samples read from EP6 are placed in the data stream to dspservers. - */ -void Settings::setReceivers(QObject *sender, int value) { - - QMutexLocker locker(&settingsMutex); - - if (m_mercuryReceivers == value) return; - if (value > MAX_RECEIVERS) value = MAX_RECEIVERS; - - m_mercuryReceivers = value; - locker.unlock(); - - SETTINGS_DEBUG << "set number of receivers to: " << m_mercuryReceivers; - emit numberOfRXChanged(sender, value); -} - -//void Settings::setReceiver(QObject *sender, int value) { -// -// QMutexLocker locker(&settingsMutex); -// -// if (m_currentReceiver == value) return; -// if (value > MAX_RECEIVERS) value = MAX_RECEIVERS; -// -// m_currentReceiver = value; -// locker.unlock(); -// -// SETTINGS_DEBUG << "switch to receiver: " << m_currentReceiver; -// emit receiverChanged(value); -// emit frequencyChanged(this, true, value, m_receiverDataList[value].frequency); -//} - -void Settings::setCurrentReceiver(QObject *sender, int value) { - - //SETTINGS_DEBUG << "sender: " << sender; - QMutexLocker locker(&settingsMutex); - - if (value > MAX_RECEIVERS) { - - SETTINGS_DEBUG << "receiver number > MAX_RECEIVERS; setting to MAX_RECEIVERS."; - value = MAX_RECEIVERS; - } - - m_currentReceiver = value; - - HamBand band = m_receiverDataList.at(m_currentReceiver).hamBand; - DSPMode mode = m_receiverDataList.at(m_currentReceiver).dspModeList[band]; - locker.unlock(); - - setMercuryAttenuator(this, m_receiverDataList.at(m_currentReceiver).mercuryAttenuators.at(band)); - setFramesPerSecond(this, m_currentReceiver, m_receiverDataList.at(m_currentReceiver).framesPerSecond); - - SETTINGS_DEBUG << "switch to receiver: " << m_currentReceiver; - emit currentReceiverChanged(sender, value); - //emit frequencyChanged(sender, true, value, m_receiverDataList.at(m_currentReceiver).frequency); - long vfoF = m_receiverDataList.at(m_currentReceiver).vfoFrequency; - long ctrF = m_receiverDataList.at(m_currentReceiver).ctrFrequency; - - emit ctrFrequencyChanged(sender, true, value, ctrF); - emit vfoFrequencyChanged(sender, true, value, vfoF); - emit ncoFrequencyChanged(m_currentReceiver, vfoF - ctrF); - emit hamBandChanged(sender, m_currentReceiver, false, band); - emit dspModeChanged(sender, m_currentReceiver, mode); - emit mouseWheelFreqStepChanged(sender, m_currentReceiver, m_receiverDataList.at(m_currentReceiver).mouseWheelFreqStep); -} - -void Settings::setSampleRate(QObject *sender, int value) { - - QMutexLocker locker(&settingsMutex); - - switch (value) { - - case 48000: - m_sampleRate = value; - m_mercurySpeed = 0; - m_outputSampleIncrement = 1; - m_chirpDownSampleRate = 4; - break; - - case 96000: - m_sampleRate = value; - m_mercurySpeed = 1; - m_outputSampleIncrement = 2; - m_chirpDownSampleRate = 8; - break; - - case 192000: - m_sampleRate = value; - m_mercurySpeed = 2; - m_outputSampleIncrement = 4; - m_chirpDownSampleRate = 16; - break; - - case 384000: - m_sampleRate = value; - m_mercurySpeed = 3; - m_outputSampleIncrement = 8; - m_chirpDownSampleRate = 32; - break; - - default: - SETTINGS_DEBUG << "Invalid sample rate (must be 48, 96,192, or 384 kHz)!\n"; - break; - } - - for (int i = 0; i < MAX_RECEIVERS; i++) - m_receiverDataList[i].sampleRate = m_sampleRate; - - emit sampleRateChanged(sender, value); -} - -void Settings::setMercuryAttenuator(QObject *sender, int value) { - - //QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList.at(m_currentReceiver).mercuryAttenuators.length() != MAX_BANDS) - return; - - HamBand band = m_receiverDataList[m_currentReceiver].hamBand; - m_receiverDataList[m_currentReceiver].mercuryAttenuators[band] = value; - - emit mercuryAttenuatorChanged(sender, band, value); -} - -QList Settings::getMercuryAttenuators(int rx) { - - return m_receiverDataList[rx].mercuryAttenuators; -} - -void Settings::setDither(QObject *sender, int value) { - - QMutexLocker locker(&settingsMutex); - m_mercuryDither = value; - - emit ditherChanged(sender, value); -} - -void Settings::setRandom(QObject *sender, int value) { - - QMutexLocker locker(&settingsMutex); - m_mercuryRandom = value; - - emit randomChanged(sender, value); -} - -void Settings::set10MhzSource(QObject *sender, int source) { - - QMutexLocker locker(&settingsMutex); - - m_10MHzSource = source; - emit src10MhzChanged(sender, source); -} - -void Settings::set122_88MhzSource(QObject *sender, int source) { - - QMutexLocker locker(&settingsMutex); - - m_122_8MHzSource = source; - emit src122_88MhzChanged(sender, source); -} - -void Settings::setMicSource(QObject *sender, int source) { - - QMutexLocker locker(&settingsMutex); - - m_micSource = source; - emit micSourceChanged(sender, source); -} - -void Settings::setClass(QObject *sender, int value) { - - QMutexLocker locker(&settingsMutex); - - m_RxClass = value; - emit classChanged(sender, value); -} - -void Settings::setTiming(QObject *sender, int value) { - - QMutexLocker locker(&settingsMutex); - - m_RxTiming = value; - emit timingChanged(sender, value); -} - -void Settings::setMouseWheelFreqStep(QObject *sender, int rx, qreal value) { - - QMutexLocker locker(&settingsMutex); - - //m_mouseWheelFreqStep = value; - m_receiverDataList[rx].mouseWheelFreqStep = value; - emit mouseWheelFreqStepChanged(sender, rx, value); -} - -double Settings::getMouseWheelFreqStep(int rx) { - - return m_receiverDataList[rx].mouseWheelFreqStep; -} - -qreal Settings::getMainVolume(int rx) { - - return m_receiverDataList[rx].audioVolume; -} - -void Settings::setMainVolume(QObject *sender, int rx, float volume) { - - if (volume < 0) volume = 0.0f; - if (volume > 1) volume = 1.0f; - - QMutexLocker locker(&settingsMutex); - - //if (m_receiverDataList[rx].audioVolume == volume) return; - m_receiverDataList[rx].audioVolume = volume; - - emit mainVolumeChanged(sender, rx, volume); -} - -void Settings::setMainVolumeMute(QObject *sender, int rx, bool value) { - - Q_UNUSED(sender) - Q_UNUSED(value) - - qreal vol = getMainVolume(rx); - if (value) - setMainVolume(this, rx, 0.0f); - else - setMainVolume(this, rx, vol); -} - -void Settings::setCtrFrequency(int rx, long frequency) { - - QMutexLocker locker(&settingsMutex); - - HamBand band = getBandFromFrequency(m_bandList, frequency); - - m_receiverDataList[rx].ctrFrequency = frequency; - //m_receiverDataList[rx].hamBand = band; - //m_receiverDataList[rx].lastHamBand = band; - m_receiverDataList[rx].lastCenterFrequencyList[(int) band] = frequency; -} - -void Settings::setVfoFrequency(int rx, long frequency) { - - QMutexLocker locker(&settingsMutex); - - HamBand band = getBandFromFrequency(m_bandList, frequency); - - m_receiverDataList[rx].vfoFrequency = frequency; - m_receiverDataList[rx].hamBand = band; - m_receiverDataList[rx].lastHamBand = band; - m_receiverDataList[rx].lastVfoFrequencyList[(int) band] = frequency; - - m_receiverDataList[rx].ncoFrequency = frequency - m_receiverDataList.at(rx).ctrFrequency; -} - -void Settings::setCtrFrequency(QObject *sender, int mode, int rx, long frequency) { - - QMutexLocker locker(&settingsMutex); - m_receiverDataList[rx].ctrFrequency = frequency; - - HamBand band = getBandFromFrequency(m_bandList, frequency); - m_receiverDataList[rx].lastCenterFrequencyList[(int) band] = frequency; - locker.unlock(); - - switch (mode) { - - case 0: - break; - - case 1: - - setVFOFrequency(this, 0, rx, frequency); - break; - } - - //SETTINGS_DEBUG << "ctr freq (Rx " << rx << ") " << m_receiverDataList[rx].ctrFrequency; - emit ctrFrequencyChanged(sender, mode, rx, frequency); -} - -long Settings::getCtrFrequency(int rx) { - - return m_receiverDataList.at(rx).ctrFrequency; -} - -void Settings::setVFOFrequency(QObject *sender, int mode, int rx, long frequency) { - - QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList.at(rx).vfoFrequency == frequency) return; - m_receiverDataList[rx].vfoFrequency = frequency; - //SETTINGS_DEBUG << "vfo freq (Rx " << rx << ") " << m_receiverDataList[rx].vfoFrequency; - - HamBand band = getBandFromFrequency(m_bandList, frequency); - m_receiverDataList[rx].lastVfoFrequencyList[(int) band] = frequency; - - locker.unlock(); - if (m_receiverDataList.at(rx).hamBand != band) { - - //m_receiverDataList[rx].ctrFrequency = m_receiverDataList[rx].vfoFrequency; - setHamBand(this, rx, false, band); - } - - switch (mode) { - - case 0: // change only VFO - - m_receiverDataList[rx].ncoFrequency = frequency - m_receiverDataList.at(rx).ctrFrequency; - //SETTINGS_DEBUG << "nco freq = " << m_receiverDataList[rx].ncoFrequency; - break; - - case 1: // change VFO and center freq; keep NCO frequency - - setCtrFrequency(this, 0, rx, frequency - m_receiverDataList.at(rx).ncoFrequency); - break; - - case 2: // change VFO, set center frequency from lastCenterFrequencyList - - setCtrFrequency(this, 0, rx, m_receiverDataList.at(rx).lastCenterFrequencyList.at((int) band)); - m_receiverDataList[rx].ncoFrequency = frequency - m_receiverDataList.at(rx).ctrFrequency; - break; - } - - emit vfoFrequencyChanged(sender, mode, rx, frequency); - - //SETTINGS_DEBUG << "nco freq (Rx " << rx << ") " << m_receiverDataList[rx].ncoFrequency; - emit ncoFrequencyChanged(rx, m_receiverDataList[rx].ncoFrequency); -} - -long Settings::getVfoFrequency(int rx) { - - return m_receiverDataList.at(rx).vfoFrequency; -} - -void Settings::setNCOFrequency(QObject *sender, bool value, int rx, long frequency) { - - Q_UNUSED(sender) - Q_UNUSED(value) - - //SETTINGS_DEBUG << "nco freq (Rx " << rx << ") " << m_receiverDataList[rx].ncoFrequency << "(direct)"; - m_receiverDataList[rx].ncoFrequency = frequency; - - emit ncoFrequencyChanged(rx, frequency); -} - -void Settings::setHamBand(QObject *sender, int rx, bool byButton, HamBand band) { - - //SETTINGS_DEBUG << "sender: " << sender; - QMutexLocker locker(&settingsMutex); - if (m_receiverDataList[rx].hamBand == band && sender != this) - return; - - m_receiverDataList[rx].lastHamBand = m_receiverDataList[rx].hamBand; - m_receiverDataList[rx].hamBand = band; - - //SETTINGS_DEBUG << "last Ham band: " << m_receiverDataList[rx].lastHamBand; - //SETTINGS_DEBUG << "Ham band: " << m_receiverDataList[rx].hamBand; - - if (m_receiverDataList[rx].hamBand == (HamBand) gen) - setTxAllowed(this, false); - else - setTxAllowed(this, true); - - locker.unlock(); - - setDSPMode(this, rx, m_receiverDataList.at(rx).dspModeList.at(band)); - setMercuryAttenuator(this, m_receiverDataList[rx].mercuryAttenuators[band]); - - emit hamBandChanged(sender, rx, byButton, band); -} - -HamBand Settings::getCurrentHamBand(int rx) { - - return m_receiverDataList[rx].hamBand; -} - -void Settings::setDSPMode(QObject *sender, int rx, DSPMode mode) { - - //SETTINGS_DEBUG << "sender: " << sender; - HamBand band = m_receiverDataList[m_currentReceiver].hamBand; - - m_receiverDataList[rx].dspModeList[band] = mode; - setRXFilter(this, rx, m_defaultFilterList.at((int) mode).filterLo, m_defaultFilterList.at((int) mode).filterHi); - - emit dspModeChanged(sender, rx, mode); -} - -AGCMode Settings::getAGCMode(int rx) { - - return m_receiverDataList.at(rx).agcMode; -} - -QString Settings::getAGCModeString(int rx) { - - AGCMode mode = getAGCMode(rx); - QString str; - switch (mode) { - - case (AGCMode) agcOFF: - str = "Off"; - break; - - case (AGCMode) agcLONG: - str = "Long"; - break; - - case (AGCMode) agcSLOW: - str = "Slow"; - break; - - case (AGCMode) agcMED: - str = "Med"; - break; - - case (AGCMode) agcFAST: - str = "Fast"; - break; - - case (AGCMode) agcUser: - str = "User"; - break; - } - return str; -} - -void Settings::setAGCMode(QObject *sender, int rx, AGCMode mode) { - - QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList[rx].agcMode == mode) return; - m_receiverDataList[rx].agcMode = mode; - - bool hang; - if (mode == (AGCMode) agcOFF || mode == (AGCMode) agcMED || mode == (AGCMode) agcFAST) { - - m_receiverDataList[rx].hangEnabled = false; - hang = false; - if (mode == (AGCMode) agcOFF) - emit agcFixedGainChanged_dB(sender, rx, m_receiverDataList[rx].agcFixedGain_dB); - } - else { - - m_receiverDataList[rx].hangEnabled = true; - hang = true; - } - - emit agcModeChanged(sender, rx, mode, hang); - emit agcHangEnabledChanged(sender, rx, hang); -} - -void Settings::setAGCShowLines(QObject *sender, int rx, bool value) { - - if (m_receiverDataList[rx].agcLines == value) return; - m_receiverDataList[rx].agcLines = value; - - emit showAGCLinesStatusChanged(sender, m_receiverDataList[rx].agcLines, rx); -} - -int Settings::getAGCGain(int rx) { - - return m_receiverDataList[rx].acgGain; -} - -void Settings::setAGCGain(QObject *sender, int rx, int value) { - - //QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList[rx].acgGain == value) return; - m_receiverDataList[rx].acgGain = value; - //SETTINGS_DEBUG << "acgGain " << value; - emit agcGainChanged(sender, rx, value); -} - -void Settings::setAGCMaximumGain_dB(QObject *sender, int rx, qreal value) { - - //QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList[rx].agcMaximumGain_dB == value) return; - m_receiverDataList[rx].agcMaximumGain_dB = value; - - //SETTINGS_DEBUG << "agcMaximumGain_dB = " << m_receiverDataList[rx].agcMaximumGain_dB << " (sender: " << sender << ")"; - emit agcMaximumGainChanged_dB(sender, rx, value); -} - -qreal Settings::getAGCMaximumGain_dB(int rx) { - - return m_receiverDataList[rx].agcMaximumGain_dB; -} - -void Settings::setAGCFixedGain_dB(QObject *sender, int rx, qreal value) { - - //QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList[rx].agcFixedGain_dB == value) return; - m_receiverDataList[rx].agcFixedGain_dB = value; - - //SETTINGS_DEBUG << "m_receiverDataList[rx].agcFixedGain_dB = " << m_receiverDataList[rx].agcFixedGain_dB; - emit agcFixedGainChanged_dB(sender, rx, value); -} - -qreal Settings::getAGCFixedGain_dB(int rx) { - - return m_receiverDataList[rx].agcFixedGain_dB; -} - -void Settings::setAGCThreshold_dB(QObject *sender, int rx, qreal value) { - - //QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList[rx].acgThreshold_dB == value) return; - m_receiverDataList[rx].acgThreshold_dB = value; - - //SETTINGS_DEBUG << "acgThreshold = " << m_receiverDataList[rx].acgThreshold; - emit agcThresholdChanged_dB(sender, rx, value); -} - -void Settings::setAGCHangThresholdSlider(QObject *sender, int rx, qreal value) { - - emit agcHangThresholdSliderChanged(sender, rx, value); -} - -int Settings::getAGCHangThreshold(int rx) { - - return m_receiverDataList[rx].agcHangThreshold; -} - -void Settings::setAGCHangThreshold(QObject *sender, int rx, int value) { - - //QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList[rx].agcHangThreshold == value) return; - m_receiverDataList[rx].agcHangThreshold = value; - - //SETTINGS_DEBUG << "agcHangThreshold = " << m_receiverDataList[rx].agcHangThreshold; - emit agcHangThresholdChanged(sender, rx, value); -} - -int Settings::getAGCHangLeveldB(int rx) { - - return m_receiverDataList[rx].agcHangThreshold; -} - -void Settings::setAGCHangLevel_dB(QObject *sender, int rx, qreal value) { - - //QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList[rx].agcHangLevel == value) return; - m_receiverDataList[rx].agcHangLevel = value; - - //SETTINGS_DEBUG << "agcHangLevel = " << m_receiverDataList[rx].agcHangLevel; - emit agcHangLevelChanged_dB(sender, rx, value); -} - -void Settings::setAGCLineLevels(QObject *sender, int rx, qreal thresh, qreal hang) { - - if (m_currentReceiver != rx) return; - - m_receiverDataList[rx].agcHangLevel = hang; - //SETTINGS_DEBUG << "agcHangLevel = " << m_receiverDataList[rx].agcHangLevel; - - emit agcLineLevelsChanged(sender, rx, thresh, hang); -} - -void Settings::setAGCVariableGain_dB(QObject *sender, int rx, qreal value) { - - if (m_currentReceiver != rx) return; - - if (m_receiverDataList[rx].agcVariableGain == value) return; - m_receiverDataList[rx].agcVariableGain = value; - - SETTINGS_DEBUG << "agcVariableGain = " << m_receiverDataList[rx].agcVariableGain; - emit agcVariableGainChanged_dB(sender, rx, value); -} - -void Settings::setAGCAttackTime(QObject *sender, int rx, qreal value) { - - if (m_currentReceiver != rx) return; - - if (m_receiverDataList[rx].agcAttackTime == value) return; - m_receiverDataList[rx].agcAttackTime = value; - - SETTINGS_DEBUG << "agcAttackTime = " << m_receiverDataList[rx].agcAttackTime; - emit agcAttackTimeChanged(sender, rx, value); -} - -void Settings::setAGCDecayTime(QObject *sender, int rx, qreal value) { - - if (m_currentReceiver != rx) return; - - if (m_receiverDataList[rx].agcDecayTime == value) return; - m_receiverDataList[rx].agcDecayTime = value; - - SETTINGS_DEBUG << "agcDecayTime = " << m_receiverDataList[rx].agcDecayTime; - emit agcDecayTimeChanged(sender, rx, value); -} - -void Settings::setAGCHangTime(QObject *sender, int rx, qreal value) { - - if (m_currentReceiver != rx) return; - - if (m_receiverDataList[rx].agcHangTime == value) return; - m_receiverDataList[rx].agcHangTime = value; - - SETTINGS_DEBUG << "agcHangTime = " << m_receiverDataList[rx].agcHangTime; - emit agcHangTimeChanged(sender, rx, value); -} - -void Settings::setRXFilter(QObject *sender, int rx, qreal low, qreal high) { - - QMutexLocker locker(&settingsMutex); - - if (m_filterFrequencyLow == low && m_filterFrequencyHigh == high) return; - - m_filterFrequencyLow = low; - m_filterFrequencyHigh = high; - m_receiverDataList[rx].filterLo = low; - m_receiverDataList[rx].filterHi = high; - - emit filterFrequenciesChanged(sender, rx, m_filterFrequencyLow, m_filterFrequencyHigh); -} - -void Settings::setIQPort(QObject *sender, int rx, int port) { - - emit iqPortChanged(sender, rx, port); -} - -void Settings::setSpectrumBuffer(int rx, const qVectorFloat& buffer) { - - emit spectrumBufferChanged(rx, buffer); -} - -void Settings::setPostSpectrumBuffer(int rx, const float* buffer) { - - emit postSpectrumBufferChanged(rx, buffer); -} - -void Settings::setSMeterValue(int rx, float value) { - - emit sMeterValueChanged(rx, value); -} - -void Settings::setReceiverDataReady() { - - emit receiverDataReady(); -} - -void Settings::setSampleSize(QObject* sender, int rx, int size) { - - Q_UNUSED (sender) - - if (rx == 0) { - - SETTINGS_DEBUG << "set sample size to: " << size; - switch (size) { - - case 4096: - m_fft = 1; - break; - - case 8192: - m_fft = 2; - break; - - case 16384: - m_fft = 4; - break; - - case 32768: - m_fft = 8; - break; - } - - emit sampleSizeChanged(0, size); - } -} - -// Alex configuration: -// -// manual 0 -// bypassAll 1 -// amp6m 2 -// hpf1_5MHz 3 -// hpf6_5MHz 4 -// hpf9_5MHz 5 -// hpf13MHz 6 -// hpf20MHz 7 -// lpf160m 8 -// lpf80m 9 -// lpf60_40m 10 -// lpf30_20m 11 -// lpf17_15m 12 -// lpf12_10m 13 -// lpf6m 14 - -// m_alexConfig (qint16) -// -// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -// | | | | | | | | | | | | | | | -// | | | | | | | | | | | | | | +-----Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) -// | | | | | | | | | | | | | +------ Alex - Bypass all HPFs (0 = disable, 1 = enable)* -// | | | | | | | | | | | | +-------- Alex - 6M low noise amplifier (0 = disable, 1 = enable)* -// | | | | | | | | | | | +---------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* -// | | | | | | | | | | +------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* -// | | | | | | | | | +-------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* -// | | | | | | | | +---------------- Alex - select 13MHz HPF (0 = disable, 1 = enable)* -// | | | | | | | +------------------ Alex - select 20MHz HPF (0 = disable, 1 = enable)* -// | | | | | | +-------------------- Alex - select 160m LPF (0 = disable, 1 = enable)* -// | | | | | +---------------------- Alex - select 80m LPF (0 = disable, 1 = enable)* -// | | | | +------------------------ Alex - select 60/40m LPF (0 = disable, 1 = enable)* -// | | | +-------------------------- Alex - select 30/20m LPF (0 = disable, 1 = enable)* -// | | +---------------------------- Alex - select 17/15m LPF (0 = disable, 1 = enable)* -// | +------------------------------ Alex - select 12/10m LPF (0 = disable, 1 = enable)* -// +-------------------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* - -void Settings::setAlexConfiguration(QObject *sender, quint16 conf) { - - Q_UNUSED (sender) - - QMutexLocker locker(&settingsMutex); - m_alexConfig = conf; - - emit alexConfigurationChanged(m_alexConfig); -} - -void Settings::setAlexHPFLoFrequencies(int filter, long value) { - - m_HPFLoFrequencyList[filter] = value; -} - -void Settings::setAlexHPFHiFrequencies(int filter, long value) { - - m_HPFHiFrequencyList[filter] = value; -} - -void Settings::setAlexLPFLoFrequencies(int filter, long value) { - - m_LPFLoFrequencyList[filter] = value; -} - -void Settings::setAlexLPFHiFrequencies(int filter, long value) { - - m_LPFHiFrequencyList[filter] = value; -} - -/* - * Alex state encoding - * We use the same encoding as in the KISS Konsole by George Byrkit, K9TRV - * AA.TT.BBB.RR - * AA is RX Attenuator - * TT is TX antenna selection (0 is NOT valid!) - * BBB is RX special selection - * RR is TX antenna to use for RX (0 is NOT valid!) - * - */ -void Settings::setAlexState(QObject *sender, int pos, int value) { - - Q_UNUSED (sender) - - if (m_alexStates.length() != MAX_BANDS) - return; - else { - - if (m_alexStates.at(pos) == value) - return; - - int state = checkAlexState(value); - //qDebug() << "alex state at pos: " << pos <<" = " << state; - - m_alexStates.replace(pos, state); - - emit alexStateChanged((HamBand) pos, m_alexStates); - } -} - -void Settings::setAlexState(QObject *sender, int value) { - - Q_UNUSED(sender) - - HamBand band = m_receiverDataList[m_currentReceiver].hamBand; - - setAlexState(this, band, value); -} - -void Settings::setAlexStates(QObject *sender, const QList &states) { - - Q_UNUSED (sender) - - if (m_alexStates == states) return; - - m_alexStates = states; - - emit alexStatesChanged(m_alexStates); -} - -// check Alex state - adapted from KISS Konsole, (c) George Byrkit, K9TRV -int Settings::checkAlexState(int state) { - - if ((state & 0x3) == 0) { - - // if rx antenna selector is 0, set it to 1 - state |= 1; - } - - if (((state >> 5) & 0x3) == 0) { - - // if tx antenna selector is 0, set it to 1 - state |= 33; - } - return state; -} - -void Settings::setAlexToManual(QObject *sender, bool value) { - - //QMutexLocker locker(&settingsMutex); - - emit alexManualStateChanged(sender, value); -} - -void Settings::setRxJ6Pin(QObject *sender, HamBand band, int value) { - - Q_UNUSED (sender) - - if (m_rxJ6pinList.length() != MAX_BANDS-1) return; - if (m_rxJ6pinList[band] == value) return; - - m_rxJ6pinList[band] = value; - - emit rxJ6PinsChanged(m_rxJ6pinList); -} - -void Settings::setRxJ6Pins(QObject * sender, const QList &states) { - - Q_UNUSED (sender) - - //if (m_rxJ6pinList == states) return; - - m_rxJ6pinList = states; - - emit rxJ6PinsChanged(m_rxJ6pinList); -} - -void Settings::setTxJ6Pin(QObject *sender, HamBand band, int value) { - - Q_UNUSED (sender) - - if (m_txJ6pinList.length() != MAX_BANDS-1) return; - if (m_txJ6pinList[band] == value) return; - - m_txJ6pinList[band] = value; - - emit txJ6PinsChanged(m_txJ6pinList); -} - -void Settings::setTxJ6Pins(QObject * sender, const QList &states) { - - Q_UNUSED (sender) - - //if (m_txJ6pinList == states) return; - - m_txJ6pinList = states; - - emit txJ6PinsChanged(m_txJ6pinList); -} - -void Settings::setPennyOCEnabled(QObject *sender, bool value) { - - Q_UNUSED (sender) - - if (m_pennyOCEnabled == value) return; - - m_pennyOCEnabled = value; - - emit pennyOCEnabledChanged(m_pennyOCEnabled); -} - -//************************************** -//************************************** -// OpenCL stuff - -//void Settings::setOpenCLDevices(QList devices) { -// -// m_clDevices = devices; -//} - -//void Settings::setCudaPresence(bool value) { -// -// m_cudaPresence = value; -//} -// -//void Settings::setCudaDevices(int value) { -// -// QMutexLocker locker(&mutex); -// if (m_cuda_devices == value) return; -// m_cuda_devices = value; -// locker.unlock(); -// -// emit cudaDevicesChanged(this, value); -//} -// -//void Settings::setCudaDriver(QObject *sender, int value) { -// -// QMutexLocker locker(&mutex); -// if (m_cuda_driver_version == value) return; -// m_cuda_driver_version = value; -// locker.unlock(); -// -// emit cudaDriverChanged(sender, value); -//} -// -//void Settings::setCudaRuntime(QObject *sender, int value) { -// -// QMutexLocker locker(&mutex); -// if (m_cuda_runtime_version == value) return; -// m_cuda_runtime_version = value; -// locker.unlock(); -// -// emit cudaRuntimeChanged(sender, value); -//} -// -//void Settings::setCurrentCudaDevice(QObject *sender, int value) { -// -// QMutexLocker locker(&mutex); -// if (m_current_cuda_device == value) return; -// m_current_cuda_device = value; -// locker.unlock(); -// -// emit cudaCurrentDeviceChanged(sender, value); -//} -// -//void Settings::setCudaLastDevice(QObject *sender, int value) { -// -// QMutexLocker locker(&mutex); -// if (m_cudaLastDevice == value) return; -// m_cudaLastDevice = value; -// locker.unlock(); -// -// emit cudaLastDeviceChanged(sender, value); -//} - -void Settings::setFreqRulerPosition(QObject *sender, int rx, float position) { - - Q_UNUSED (sender) - - if (position < 0) position = 0; - if (position > 1) position = 1; - - m_receiverDataList[rx].freqRulerPosition = position; - emit freqRulerPositionChanged(this, rx, position); -} - -//********************************************************************************** -// audio settings - -void Settings::setAudioFormat(QObject *sender, const QAudioFormat &format) { - - Q_UNUSED (sender) - - QMutexLocker locker(&settingsMutex); - - //if (m_format == format) return; - m_format = format; - - emit audioFormatChanged(sender, m_format); -} - -void Settings::setAudioPosition(QObject *sender, qint64 position) { - - emit audioPositionChanged(sender, position); -} - -void Settings::setAudioBuffer(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer) { - - emit audioBufferChanged(sender, position, length, buffer); -} - - -//********************************************************************************** -// wideband data & options - -void Settings::setWidebandSpectrumBuffer(const qVectorFloat &buffer) { - - emit widebandSpectrumBufferChanged(buffer); -} - -void Settings::resetWidebandSpectrumBuffer() { - - emit widebandSpectrumBufferReset(); -} - -void Settings::setWidebandOptions(QObject* sender, TWideband options) { - - QMutexLocker locker(&settingsMutex); - - m_widebandOptions = options; - - emit widebandOptionsChanged(sender, m_widebandOptions); -} - -void Settings::setWidebandStatus(QObject* sender, bool value) { - - QMutexLocker locker(&settingsMutex); - - if (m_widebandOptions.wideBandDisplayStatus == value) return; - m_widebandOptions.wideBandDisplayStatus = value; - - emit widebandStatusChanged(sender, m_widebandOptions.wideBandDisplayStatus); -} - -void Settings::setWidebandData(QObject* sender, bool value) { - - QMutexLocker locker(&settingsMutex); - - if (m_widebandOptions.wideBandData == value) return; - m_widebandOptions.wideBandData = value; - - emit widebandDataChanged(sender, m_widebandOptions.wideBandData); -} - -void Settings::setWidebandBuffers(QObject *sender, int value) { - - Q_UNUSED(sender) - - QMutexLocker locker(&settingsMutex); - m_widebandOptions.numberOfBuffers = value; -} - -void Settings::setWidebanddBmScaleMin(QObject *sender, qreal value) { - - QMutexLocker locker(&settingsMutex); - - if (m_widebandOptions.dBmWBScaleMin == value) return; - m_widebandOptions.dBmWBScaleMin = value; - - locker.unlock(); - emit widebanddBmScaleMinChanged(sender, m_widebandOptions.dBmWBScaleMin); -} - -void Settings::setWidebanddBmScaleMax(QObject *sender, qreal value) { - - QMutexLocker locker(&settingsMutex); - - if (m_widebandOptions.dBmWBScaleMax == value) return; - m_widebandOptions.dBmWBScaleMax = value; - - locker.unlock(); - emit widebanddBmScaleMaxChanged(sender, m_widebandOptions.dBmWBScaleMax); -} - -void Settings::setWideBandRulerPosition(QObject *sender, float position) { - - if (m_widebandOptions.scalePosition == position) return; - if (position < 0) position = 0; - if (position > 1) position = 1; - m_widebandOptions.scalePosition = position; - - emit wideBandScalePositionChanged(sender, m_widebandOptions.scalePosition); -} - - -//********************************************************************************** -// chirp signal settings - -void Settings::switchToChirpSignalMode(QObject *sender) { - - emit chirpSignalModeChanged(sender); -} - -void Settings::setLowerChirpFreq(int value) { - - QMutexLocker locker(&settingsMutex); - - if (m_lowerChirpFreq == value) return; - if (m_lowerChirpFreq >= m_upperChirpFreq) - m_lowerChirpFreq = m_upperChirpFreq; - else - m_lowerChirpFreq = value; - - emit lowerChirpFreqChanged(this, m_lowerChirpFreq); -} - -void Settings::setUpperChirpFreq(int value) { - - QMutexLocker locker(&settingsMutex); - - if (m_upperChirpFreq == value) return; - if (m_lowerChirpFreq >= m_upperChirpFreq) - m_upperChirpFreq = m_lowerChirpFreq; - else - m_upperChirpFreq = value; - - emit upperChirpFreqChanged(this, m_upperChirpFreq); -} - -void Settings::setChirpAmplitude(qreal value) { - - QMutexLocker locker(&settingsMutex); - - if (m_chirpAmplitude == value) return; - m_chirpAmplitude = value; - - emit chirpAmplitudeChanged(this, m_chirpAmplitude); -} - -void Settings::setChirpSamplingFreq(int value) { - - QMutexLocker locker(&settingsMutex); - - if (m_chirpSamplingFreq == value) return; - m_chirpSamplingFreq = value; - - emit chirpSamplingFreqChanged(this, m_chirpSamplingFreq); -} - -void Settings::setChirpBufferDurationUs(int value) { - - QMutexLocker locker(&settingsMutex); - - if (m_chirpBufferDurationUs == (qint64)value) return; - m_chirpBufferDurationUs = (qint64)(1000 * value); - - emit chirpBufferDurationUsChanged(this, m_chirpBufferDurationUs); -} - -void Settings::setChirpRepetitionTimes(int value) { - - QMutexLocker locker(&settingsMutex); - - if (m_chirpRepetitionTimes == value) return; - m_chirpRepetitionTimes = value; - - emit chirpRepetitionTimesChanged(this, m_chirpRepetitionTimes); -} - -void Settings::setChirpReceiver(bool value) { - - QMutexLocker locker(&settingsMutex); - - if (m_chirpReceiverOn == value) return; - m_chirpReceiverOn = value; - - emit chirpReceiverChanged(this, m_chirpReceiverOn); -} - -void Settings::setChirpAvgLength(int value) { - - QMutexLocker locker(&settingsMutex); - - if (m_chirpAvgLength == value) return; - m_chirpAvgLength = value; - - emit chirpAvgLengthChanged(m_chirpAvgLength); -} - -void Settings::setChirpFFTShow(bool value) { - - QMutexLocker locker(&settingsMutex); - - if (m_showChirpFFT == value) return; - m_showChirpFFT = value; - - emit chirpFFTShowChanged(m_showChirpFFT); -} - -void Settings::setChirpUSB(bool value) { - - QMutexLocker locker(&settingsMutex); - - if (m_chirpUSB == value) return; - m_chirpUSB = value; - - emit chirpSidebandChanged(m_chirpUSB); -} - -//void Settings::setChirpDownSampleRate(int value) { -// -// if (m_chirpDownSampleRate == value) return; -// m_chirpDownSampleRate = value; -//} - -void Settings::setChirpBuffer(qint64 length, const QList &buffer) { - - emit chirpBufferChanged(length, buffer); -} - -void Settings::setChirpSpectrumBuffer(int sampleRate, qint64 length, const float *buffer) { - - emit chirpSpectrumBufferChanged(sampleRate, length, buffer); -} - -void Settings::setChirpSpectrum(qint64 position, qint64 length, const FrequencySpectrum &spectrum) { - - emit chirpSpectrumChanged(position, length, spectrum); -} - -void Settings::setChirpSpectrumList(const QList &spectrumList) { - - emit chirpSpectrumListChanged(spectrumList); -} - -void Settings::setChirpFilterLowerFrequency(int value) { - - if (m_chirpFilterLowerFrequency == value) return; - m_chirpFilterLowerFrequency = value; - - emit chirpFilterLowerFrequencyChanged(m_chirpFilterLowerFrequency); -} - -void Settings::setChirpFilterUpperFrequency(int value) { - - if (m_chirpFilterUpperFrequency == value) return; - m_chirpFilterUpperFrequency = value; - - emit chirpFilterUpperFrequencyChanged(m_chirpFilterUpperFrequency); -} - -//******************************** - -void Settings::setSpectrumSize(QObject *sender, int value) { - - if (m_spectrumSize == value) return; - - m_spectrumSize = value; - emit spectrumSizeChanged(sender, m_spectrumSize); -} - -void Settings::moveDisplayWidget(int value) { - - emit displayWidgetHeightChanged(value); -} - - -//********************************* -// color stuff - -void Settings::setPanadapterColors(TPanadapterColors type) { - - if (type.panBackgroundColor != m_panadapterColors.panBackgroundColor) - m_panadapterColors.panBackgroundColor = type.panBackgroundColor; - - if (type.waterfallColor != m_panadapterColors.waterfallColor) - m_panadapterColors.waterfallColor = type.waterfallColor; - - if (type.panLineColor != m_panadapterColors.panLineColor) - m_panadapterColors.panLineColor = type.panLineColor; - - if (type.panLineFilledColor != m_panadapterColors.panLineFilledColor) - m_panadapterColors.panLineFilledColor = type.panLineFilledColor; - - if (type.panSolidTopColor != m_panadapterColors.panSolidTopColor) - m_panadapterColors.panSolidTopColor = type.panSolidTopColor; - - if (type.panSolidBottomColor != m_panadapterColors.panSolidBottomColor) - m_panadapterColors.panSolidBottomColor = type.panSolidBottomColor; - - if (type.wideBandLineColor != m_panadapterColors.wideBandLineColor) - m_panadapterColors.wideBandLineColor = type.wideBandLineColor; - - if (type.wideBandFilledColor != m_panadapterColors.wideBandFilledColor) - m_panadapterColors.wideBandFilledColor = type.wideBandFilledColor; - - if (type.wideBandSolidBottomColor != m_panadapterColors.wideBandSolidTopColor) - m_panadapterColors.wideBandSolidTopColor = type.wideBandSolidTopColor; - - if (type.wideBandSolidBottomColor != m_panadapterColors.wideBandSolidBottomColor) - m_panadapterColors.wideBandSolidBottomColor = type.wideBandSolidBottomColor; - - if (type.distanceLineColor != m_panadapterColors.distanceLineColor) - m_panadapterColors.distanceLineColor = type.distanceLineColor; - - if (type.distanceLineFilledColor != m_panadapterColors.distanceLineFilledColor) - m_panadapterColors.distanceLineFilledColor = type.distanceLineFilledColor; - - if (type.panCenterLineColor != m_panadapterColors.panCenterLineColor) - m_panadapterColors.panCenterLineColor = type.panCenterLineColor; - - if (type.gridLineColor != m_panadapterColors.gridLineColor) - m_panadapterColors.gridLineColor = type.gridLineColor; - - emit panadapterColorChanged(); -} - -void Settings::setFramesPerSecond(QObject* sender, int rx, int value) { - - Q_UNUSED(sender) - - QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList.at(rx).framesPerSecond != value) - m_receiverDataList[rx].framesPerSecond = value; - - emit framesPerSecondChanged(this, rx, m_receiverDataList[rx].framesPerSecond); -} - -int Settings::getFramesPerSecond(int rx) { - - return m_receiverDataList.at(rx).framesPerSecond; -} - -void Settings::setSpectrumAveraging(QObject* sender, int rx, bool value) { - - if (rx == -1) - { - m_widebandOptions.averagingCnt = value; - } - else - { - m_receiverDataList[rx].spectrumAveraging = value; - } - - //SETTINGS_DEBUG << "Averaging for Rx " << rx << " : " << value; - emit spectrumAveragingChanged(sender, rx, value); -} - -bool Settings::getSpectrumAveraging(int rx) { - - if (rx == -1) - return m_widebandOptions.averaging; - else - return m_receiverDataList[rx].spectrumAveraging; -} - -int Settings::getSpectrumAveragingCnt(int rx) { - - if (rx == -1) - return m_widebandOptions.averagingCnt; - else - return m_receiverDataList[rx].averagingCnt; -} - -void Settings::setSpectrumAveragingCnt(QObject *sender, int rx, int value) { - - QMutexLocker locker(&settingsMutex); - - //if (m_specAveragingCnt == value) return - if (rx == -1) - m_widebandOptions.averagingCnt = value; - else - m_receiverDataList[rx].averagingCnt = value; - - emit spectrumAveragingCntChanged(sender, rx, value); -} - - - -void Settings::setPanGrid(bool value, int rx) { - - QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList.at(rx).panGrid == value) return; - m_receiverDataList[rx].panGrid = value; - - emit panGridStatusChanged(m_receiverDataList.at(rx).panGrid, rx); -} - -bool Settings::getPanGridStatus(int rx) { - - return m_receiverDataList[rx].panGrid; -} - -void Settings::setPeakHold(bool value, int rx) { - - QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList.at(rx).peakHold == value) return; - m_receiverDataList[rx].peakHold = value; - - emit peakHoldStatusChanged(m_receiverDataList.at(rx).peakHold, rx); -} - -bool Settings::getPeakHoldStatus(int rx) { - - return m_receiverDataList.at(rx).peakHold; -} - -void Settings::setPanLocked(bool value, int rx) { - - QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList.at(rx).panLocked == value) return; - m_receiverDataList[rx].panLocked = value; - - emit panLockedStatusChanged(m_receiverDataList.at(rx).panLocked, rx); -} - -bool Settings::getPanLockedStatus(int rx) { - - return m_receiverDataList[rx].panLocked; -} - -void Settings::setClickVFO(bool value, int rx) { - - QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList.at(rx).clickVFO == value) return; - m_receiverDataList[rx].clickVFO = value; - - emit clickVFOStatusChanged(m_receiverDataList.at(rx).clickVFO, rx); -} - -bool Settings::getClickVFOStatus(int rx) { - - return m_receiverDataList[rx].clickVFO; -} - -void Settings::setHairCross(bool value, int rx) { - - QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList.at(rx).hairCross == value) return; - m_receiverDataList[rx].hairCross = value; - - emit hairCrossStatusChanged(m_receiverDataList.at(rx).hairCross, rx); -} - -bool Settings::getHairCrossStatus(int rx) { - - return m_receiverDataList[rx].hairCross; -} - -void Settings::setWaterfallTime(int rx, int value) { - - Q_UNUSED(rx) - Q_UNUSED(value) - - QMutexLocker locker(&settingsMutex); - - //if (m_receiverDataList[rx].waterfallTime == value) return; - //m_receiverDataList[rx].waterfallTime = value; - - //emit waterfallTimeChanged(rx, value); -} - -void Settings::setWaterfallOffesetLo(int rx, int value) { - - QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList[rx].waterfallOffsetLo == value) return; - m_receiverDataList[rx].waterfallOffsetLo = value; - - emit waterfallOffesetLoChanged(rx, value); -} - -void Settings::setWaterfallOffesetHi(int rx, int value) { - - QMutexLocker locker(&settingsMutex); - - if (m_receiverDataList[rx].waterfallOffsetHi == value) return; - m_receiverDataList[rx].waterfallOffsetHi = value; - - emit waterfallOffesetHiChanged(rx, value); -} - -void Settings::setSMeterHoldTime(int value) { - - QMutexLocker locker(&settingsMutex); - - if (m_sMeterHoldTime == value) return; - m_sMeterHoldTime = value; - - emit sMeterHoldTimeChanged(m_sMeterHoldTime); -} - -void Settings::setdBmPanScaleMin(int rx, qreal value) { - - QMutexLocker locker(&settingsMutex); - - HamBand band = m_receiverDataList.at(m_currentReceiver).hamBand; - m_receiverDataList[rx].dBmPanScaleMinList[band] = value; - - emit dBmScaleMinChanged(rx, value); -} - -void Settings::setdBmPanScaleMax(int rx, qreal value) { - - QMutexLocker locker(&settingsMutex); - - HamBand band = m_receiverDataList.at(m_currentReceiver).hamBand; - m_receiverDataList[rx].dBmPanScaleMaxList[band] = value; - - emit dBmScaleMaxChanged(rx, value); -} - -void Settings::setdBmDistScaleMin(qreal value) { - - Q_UNUSED(value) -} - -void Settings::setdBmDistScaleMax(qreal value) { - - Q_UNUSED(value) -} - -// ********************************************************************** - -void Settings::showRadioPopupWidget() { - - if (m_radioPopupVisible) - m_radioPopupVisible = false; - else - m_radioPopupVisible = true; - - emit showRadioPopupChanged(m_radioPopupVisible); -} +/** +* @file cusdr_settings.cpp +* @brief settings class for cuSDR +* @author by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-11-18 +*/ + +/* + * Copyright 2010-2015 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + + +#define LOG_SETTINGS + +#include "cusdr_settings.h" +#include "Util/cusdr_styles.h" + +Settings *Settings::m_instance = NULL; /*!< set m_instance to NULL. */ + +/*! + \class Settings + \brief Settings class implements application specific and user defined variables for the application. +*/ + +Settings::Settings(QObject *parent) + :QObject(parent) + , m_dataEngineState(QSDR::DataEngineDown) + , setLoaded(false) + , m_mainPower(false) + , m_manualSocketBufferSize(false) + , m_peakHold(false) + , m_packetsToggle(true) + , m_radioPopupVisible(false) + , m_hpsdrNetworkDevices(0) + , m_mercuryReceivers(1) + , m_currentReceiver(0) +{ + m_devices.mercuryFWVersion = 0; + + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType >(); + qRegisterMetaType("qVectorFloat"); + + startTime = QDateTime::currentDateTime(); + + qDebug() << "************************************************************************"; + SETTINGS_DEBUG << "start at: " << qPrintable(startTime.toString()); + + settingsFilename = "settings.ini"; + settings = new QSettings(QCoreApplication::applicationDirPath() + "/" + settingsFilename, QSettings::IniFormat); + + m_titleString = "cudaSDR BETA"; + + #ifdef DEBUG + m_titleString = "cudaSDR Debug BETA "; + #endif + + m_versionString = "v0.3.2.13+"; + + qDebug() << qPrintable(m_titleString); + + // receiver data + for (int i = 0; i < MAX_RECEIVERS; i++) { + + TReceiver receiverData; + m_receiverDataList.append(receiverData); + + QString str = "receiver"; + QString num; + num.setNum(i); + str.append(num); + + m_rxStringList << str; + + m_receiverDataList[i].agcHangThreshold = 0.0; + m_receiverDataList[i].peakHold = false; + m_receiverDataList[i].fftFactor = 1; + + for (int j = 0; j < MAX_BANDS; j++) { + + m_receiverDataList[i].mercuryAttenuators << 0; + m_receiverDataList[i].dBmPanScaleMinList << 0.0; + m_receiverDataList[i].dBmPanScaleMaxList << 0.0; + m_receiverDataList[i].dspModeList << (DSPMode) LSB; + } + } + + // Alex parameter configurations + m_alexConfig = 0; + + for (int i = 0; i < 6; i++) { + + m_HPFLoFrequencyList.append((long)0); + m_HPFHiFrequencyList.append((long)0); + } + + for (int i = 0; i < 7; i++) { + + m_LPFLoFrequencyList.append((long)0); + m_LPFHiFrequencyList.append((long)0); + } + + // init alex states + for (int i = 0; i < MAX_BANDS; i++) { + + m_alexStates << 0; + } + + // Rx, Tx J6 pins list + // Bands: 160m, 80m, 60m, 40m, 30m, 20m, 17m, 15m, 12m, 10m, 6m + // Values: no pin, pins 1 to 7 (0..7) + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | + // | | | | | | | + // | | | | | | +-------------- pin 1 (0 = deactivated, 1 = activated) + // | | | | | +---------------- pin 2 (0 = deactivated, 1 = activated) + // | | | | +------------------ pin 3 (0 = deactivated, 1 = activated) + // | | | +-------------------- pin 4 (0 = deactivated, 1 = activated) + // | | +---------------------- pin 5 (0 = deactivated, 1 = activated) + // | +------------------------ pin 6 (0 = deactivated, 1 = activated) + // +-------------------------- pin 7 (0 = deactivated, 1 = activated) + + for (int i = 0; i < MAX_BANDS-1; i++) { + + m_rxJ6pinList << 0; + m_txJ6pinList << 0; + } + + + m_bandList = getHamBandFrequencies(); + m_bandTextList = getHamBandText(); + m_defaultFilterList = getDefaultFilterFrequencies(); + + m_transmitter.txAllowed = false; + //m_fft = 1; +} + +Settings::~Settings() { + + //m_clDevices.clear(); +} + +int Settings::loadSettings() { + + QString str; + int value; + + //QList bandList = HamBandStrings(); + + // user's call sign + str = settings->value("user/callSign", "Your Call sign").toString(); + //while (str.startsWith('\"')) str = str.right(str.count() - 1).trimmed(); + //while (str.endsWith('\"')) str = str.left(str.count() - 1).trimmed(); + + m_callsignString = str; + + // Window settings + value = settings->value("window/minimumWidgetWidth", 235).toInt(); + if (value < 235 || value > 300) m_minimumWidgetWidth = 235; + m_minimumWidgetWidth = value; + + value = settings->value("window/minimumGroupBoxWidth", 230).toInt(); + if (value < 230 || value > 295 || value > m_minimumWidgetWidth - 5) m_minimumGroupBoxWidth = 230; + m_minimumGroupBoxWidth = value; + + value = settings->value("window/multiRxView", 0).toInt(); + if (value < 0 || value > 2) m_multiRxView = 0; + m_multiRxView = value; + + + // network settings + str = settings->value("network/server_ipAddress", "127.0.0.1").toString(); + while (str.startsWith('\"')) str = str.right(str.count() - 1).trimmed(); + while (str.endsWith('\"')) str = str.left(str.count() - 1).trimmed(); + m_serverAddress = str; + + str = settings->value("network/hpsdr_local_ipAddress", "127.0.0.1").toString(); + while (str.startsWith('\"')) str = str.right(str.count() - 1).trimmed(); + while (str.endsWith('\"')) str = str.left(str.count() - 1).trimmed(); + m_hpsdrDeviceLocalAddr = str; + + value = settings->value("network/server_port", 52685).toInt(); + if (value < 0 || value > 65535) value = 52685; + m_serverPort = value; + + value = settings->value("network/listen_port", 11000).toInt(); + if (value < 0 || value > 65535) value = 11000; + m_listenerPort = value; + + value = settings->value("network/audio_port", 15000).toInt(); + if (value < 0 || value > 65535) value = 15000; + m_audioPort = value; + + value = settings->value("network/metis_port", 1024).toInt(); + if (value < 0 || value > 65535) value = 1024; + m_metisPort = value; + + value = settings->value("network/socketBufferSize", 32).toInt(); + if (value != 16 && value != 32 && value != 64 && value != 128 && value != 256) value = 32; + m_socketBufferSize = value; + + + // HPSDR hardware + value = settings->value("hpsdr/hardware", 0).toInt(); + if (value < 0 || value > 2) value = 0; + m_hpsdrHardware = value; + + str = settings->value("hpsdr/mercury", "true").toString(); + if (str == "true") + m_devices.mercuryPresence = true; + else + m_devices.mercuryPresence = false; + + str = settings->value("hpsdr/penelope", "false").toString(); + if (str == "true") + m_devices.penelopePresence = true; + else + m_devices.penelopePresence = false; + + str = settings->value("hpsdr/pennylane", "false").toString(); + if (str == "true") + m_devices.pennylanePresence = true; + else + m_devices.pennylanePresence = false; + + str = settings->value("hpsdr/excalibur", "false").toString(); + if (str == "true") + m_devices.excaliburPresence = true; + else + m_devices.excaliburPresence = false; + + str = settings->value("hpsdr/alex", "false").toString(); + if (str == "true") + m_devices.alexPresence = true; + else + m_devices.alexPresence = false; + + +// str = settings->value("hpsdr/hermes", "false").toString(); +// if (str == "true") +// m_devices.hermesPresence = true; +// else +// m_devices.hermesPresence = false; + + if (m_hpsdrHardware == 0) { + + str = settings->value("hpsdr/interface", "metis").toString(); + if (str == "metis") + m_hwInterface = QSDR::Metis; + else + m_hwInterface = QSDR::NoInterfaceMode; + } + else if (m_hpsdrHardware == 1) { + + m_hwInterface = QSDR::Hermes; + } + + str = settings->value("hpsdr/checkfw", "true").toString(); + if (str == "true") + m_checkFirmwareVersions = true; + else + m_checkFirmwareVersions = false; + + //checkHPSDRDevices(); + + value = settings->value("server/sample_rate", 48000).toInt(); + if ((value != 48000) & (value != 96000) & (value != 192000) & (value != 384000)) value = 48000; + setSampleRate(this, value); + + str = settings->value("server/dither", "off").toString(); + if (str.toLower() == "on") + m_mercuryDither = 1; + else + m_mercuryDither = 0; + + str = settings->value("server/random", "off").toString(); + if (str.toLower() == "on") + m_mercuryRandom = 1; + else + m_mercuryRandom = 0; + + str = settings->value("server/10mhzsource", "mercury").toString(); + if (str == "atlas") + m_10MHzSource = 0; + else if (str == "penelope") + m_10MHzSource = 1; + else if (str == "mercury") + m_10MHzSource = 2; + else if (str == "none") + m_10MHzSource = 3; + else + m_10MHzSource = 2; + + str = settings->value("server/122_88mhzsource", "mercury").toString(); + if (str == "penelope") + m_122_8MHzSource = 0; + else + m_122_8MHzSource = 1; + + str = settings->value("server/mic_source", "penelope").toString(); + if (str == "janus") + m_micSource = 0; + else + m_micSource = 1; + + str = settings->value("server/class", 0).toString(); + m_RxClass = (str.toLower() == "E"); + if (m_RxClass) + m_RxClass = 1; + else + m_RxClass = 0; + + value = settings->value("server/timing", 0).toInt(); + if (value < 0 || value > 1) value = 0; + m_RxTiming = value; + + /*value = settings->value("server/mainVolume", 10).toInt(); + if (value < 0) value = 0; + if (value > 100) value = 100; + m_mainVolume = value / 100.0f;*/ + + str = settings->value("server/mode", "sdr").toString(); + if (str == "sdr") { + + m_serverMode = QSDR::SDRMode; + setSpectrumSize(this, 4096); + } + else if (str == "chirpWSPR") { + + m_serverMode = QSDR::ChirpWSPR; + setSpectrumSize(this, 4096); + } + else if (str == "chirpWSPRFile") { + + m_serverMode = QSDR::ChirpWSPRFile; + setSpectrumSize(this, 4096); + } + else { + + m_serverMode = QSDR::SDRMode; + setSpectrumSize(this, 4096); + } + + +// value = settings->value("server/mouseWheelFreqStep", 1000).toInt(); +// if ((value != 1) & (value != 10) & (value != 100) & (value != 1000) & (value != 10000) & (value != 100000) & +// (value != 5) & (value != 50) & (value != 500) & (value != 5000) & (value != 50000) & (value != 500000)) +// value = 100; +// m_mouseWheelFreqStep = (double)value; + + //****************************************************************** + // Alexiares data settings + // m_alexConfig (qint16): + // + // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + // | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | +-----Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) + // | | | | | | | | | | | | | +------ Alex - Bypass all HPFs (0 = disable, 1 = enable)* + // | | | | | | | | | | | | +-------- Alex - 6M low noise amplifier (0 = disable, 1 = enable)* + // | | | | | | | | | | | +---------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | | +------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | +-------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | +---------------- Alex - select 13MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | +------------------ Alex - select 20MHz HPF (0 = disable, 1 = enable)* + // | | | | | | +-------------------- Alex - select 160m LPF (0 = disable, 1 = enable)* + // | | | | | +---------------------- Alex - select 80m LPF (0 = disable, 1 = enable)* + // | | | | +------------------------ Alex - select 60/40m LPF (0 = disable, 1 = enable)* + // | | | +-------------------------- Alex - select 30/20m LPF (0 = disable, 1 = enable)* + // | | +---------------------------- Alex - select 17/15m LPF (0 = disable, 1 = enable)* + // | +------------------------------ Alex - select 12/10m LPF (0 = disable, 1 = enable)* + // +-------------------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* + + m_alexConfig = 0; + double fLo; + double fHi; + + str = settings->value("alex/manual", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x01; + + str = settings->value("alex/bypassAll", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x02; + + str = settings->value("alex/amp6m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x04; + + fLo = settings->value("alex/amp6mLo", 50000000).toDouble(); + if ((fLo < 49000000) || (fLo > 52500000)) fLo = 50000000; + + fHi = settings->value("alex/amp6mHi", 54000000).toDouble(); + if ((fHi < 52500000) || (fHi > 55000000)) fHi = 54000000; + + m_HPFLoFrequencyList[5] = (long)fLo; + m_HPFHiFrequencyList[5] = (long)fHi; + + + str = settings->value("alex/hpf1_5MHz", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x08; + + fLo = settings->value("alex/hpf1_5MHzLo", 1500000).toDouble(); + if ((fLo < 0) || (fLo > 2000000)) fLo = 1500000; + + fHi = settings->value("alex/hpf1_5MHzHi", 5500000).toDouble(); + if ((fHi < 1600000) || (fHi > 6000000)) fHi = 5500000; + + m_HPFLoFrequencyList[0] = (long)fLo; + m_HPFHiFrequencyList[0] = (long)fHi; + + + str = settings->value("alex/hpf6_5MHz", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x10; + + fLo = settings->value("alex/hpf6_5MHzLo", 7000000).toDouble(); + if ((fLo < 6000000) || (fLo > 8000000)) fLo = 7000000; + + fHi = settings->value("alex/hpf6_5MHzHi", 7300000).toDouble(); + if ((fHi < 7000000) || (fHi > 9500000)) fHi = 7300000; + + m_HPFLoFrequencyList[1] = (long)fLo; + m_HPFHiFrequencyList[1] = (long)fHi; + + + str = settings->value("alex/hpf9_5MHz", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x20; + + fLo = settings->value("alex/hpf9_5MHzLo", 10100000).toDouble(); + if ((fLo < 9000000) || (fLo > 11000000)) fLo = 10100000; + + fHi = settings->value("alex/hpf9_5MHzHi", 10150000).toDouble(); + if ((fHi < 10000000) || (fHi > 13000000)) fHi = 10150000; + + m_HPFLoFrequencyList[2] = (long)fLo; + m_HPFHiFrequencyList[2] = (long)fHi; + + + str = settings->value("alex/hpf13MHz", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x40; + + fLo = settings->value("alex/hpf13MHzLo", 14000000).toDouble(); + if ((fLo < 12000000) || (fLo > 15000000)) fLo = 14000000; + + fHi = settings->value("alex/hpf13MHzHi", 18168000).toDouble(); + if ((fHi < 13700000) || (fHi > 19000000)) fHi = 18168000; + + m_HPFLoFrequencyList[3] = (long)fLo; + m_HPFHiFrequencyList[3] = (long)fHi; + + + str = settings->value("alex/hpf20MHz", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x80; + + fLo = settings->value("alex/hpf20MHzLo", 21000000).toDouble(); + if ((fLo < 18000000) || (fLo > 25000000)) fLo = 21000000; + + fHi = settings->value("alex/hpf20MHzHi", 29700000).toDouble(); + if ((fHi < 25000000) || (fHi > 32000000)) fHi = 29700000; + + m_HPFLoFrequencyList[4] = (long)fLo; + m_HPFHiFrequencyList[4] = (long)fHi; + + + str = settings->value("alex/lpf160m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x100; + + fLo = settings->value("alex/lpf160mLo", 1800000).toDouble(); + if ((fLo < 0) || (fLo > 1900000)) fLo = 1800000; + + fHi = settings->value("alex/lpf160mHi", 2000000).toDouble(); + if ((fHi < 1000000) || (fHi > 3000000)) fHi = 2000000; + + m_LPFLoFrequencyList[0] = (long)fLo; + m_LPFHiFrequencyList[0] = (long)fHi; + + + str = settings->value("alex/lpf80m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x200; + + fLo = settings->value("alex/lpf80mLo", 3500000).toDouble(); + if ((fLo < 2000000) || (fLo > 4000000)) fLo = 3500000; + + fHi = settings->value("alex/lpf80mHi", 4000000).toDouble(); + if ((fHi < 2000000) || (fHi > 5000000)) fHi = 4000000; + + m_LPFLoFrequencyList[1] = (long)fLo; + m_LPFHiFrequencyList[1] = (long)fHi; + + + str = settings->value("alex/lpf60_40m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x400; + + fLo = settings->value("alex/lpf60_40mLo", 5330000).toDouble(); + if ((fLo < 5000000) || (fLo > 11000000)) fLo = 5330000; + + fHi = settings->value("alex/lpf60_40mHi", 7300000).toDouble(); + if ((fHi < 5000000) || (fHi > 8000000)) fHi = 7300000; + + m_LPFLoFrequencyList[2] = (long)fLo; + m_LPFHiFrequencyList[2] = (long)fHi; + + + str = settings->value("alex/lpf30_20m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x800; + + fLo = settings->value("alex/lpf30_20mLo", 10100000).toDouble(); + if ((fLo < 9000000) || (fLo > 15000000)) fLo = 10100000; + + fHi = settings->value("alex/lpf30_20mHi", 14350000).toDouble(); + if ((fHi < 9000000) || (fHi > 15000000)) fHi = 14350000; + + m_LPFLoFrequencyList[3] = (long)fLo; + m_LPFHiFrequencyList[3] = (long)fHi; + + + str = settings->value("alex/lpf17_15m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x1000; + + fLo = settings->value("alex/lpf17_15mLo", 18068000).toDouble(); + if ((fLo < 17000000) || (fLo > 22000000)) fLo = 18068000; + + fHi = settings->value("alex/lpf17_15mHi", 21450000).toDouble(); + if ((fHi < 17000000) || (fHi > 22000000)) fHi = 21450000; + + m_LPFLoFrequencyList[4] = (long)fLo; + m_LPFHiFrequencyList[4] = (long)fHi; + + + str = settings->value("alex/lpf12_10m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x2000; + + fLo = settings->value("alex/lpf12_10mLo", 24890000).toDouble(); + if ((fLo < 23000000) || (fLo > 30000000)) fLo = 24890000; + + fHi = settings->value("alex/lpf12_10mHi", 29700000).toDouble(); + if ((fHi < 23000000) || (fHi > 30000000)) fHi = 29700000; + + m_LPFLoFrequencyList[5] = (long)fLo; + m_LPFHiFrequencyList[5] = (long)fHi; + + + str = settings->value("alex/lpf6m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x4000; + + fLo = settings->value("alex/lpf6mLo", 50000000).toDouble(); + if ((fLo < 30000000) || (fLo > 52000000)) fLo = 50000000; + + fHi = settings->value("alex/lpf6mHi", 54000000).toDouble(); + if ((fHi < 52000000) || (fHi > 66000000)) fHi = 54000000; + + m_LPFLoFrequencyList[6] = (long)fLo; + m_LPFHiFrequencyList[6] = (long)fHi; + + + SETTINGS_DEBUG << "Alex config: " << m_alexConfig; + + if (m_alexStates.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { + + for (int i = 0; i < MAX_BANDS; i++) { + + str = "alex/state"; + str.append(m_bandList.at(i).bandString); + + value = settings->value(str, 33).toInt(); + setAlexState(this, i, value); + } + } + + //****************************************************************** + // Penny open collector settings + + str = settings->value("penny/OCenabled", "off").toString(); + if (str.toLower() == "on") + m_pennyOCEnabled = true; + else + m_pennyOCEnabled = false; + + if (m_rxJ6pinList.length() == MAX_BANDS-1 && m_txJ6pinList.length() == MAX_BANDS-1 && m_bandList.length() == MAX_BANDS) { + + for (int i = 0; i < MAX_BANDS-1; i++) { + + str = "penny/rxState"; + str.append(m_bandList.at(i).bandString); + + value = settings->value(str, 0).toInt(); + if (value < 0 || value > 255) value = 0; + setRxJ6Pin(this, (HamBand) i, value); + } + + for (int i = 0; i < MAX_BANDS-1; i++) { + + str = "penny/txState"; + str.append(m_bandList.at(i).bandString); + + value = settings->value(str, 0).toInt(); + if (value < 0 || value > 255) value = 0; + setTxJ6Pin(this, (HamBand) i, value); + } + } + else { + + qWarning() << "rxJ6pinList or txJ6pinList or bandList have wrong length!"; + } + + //****************************************************************** + // wideband settings + + str = settings->value("wideband/widebandData", "on").toString(); + if (str.toLower() == "on") + m_widebandOptions.wideBandData = true; + else if (str.toLower() == "off") + m_widebandOptions.wideBandData = false; + else + m_widebandOptions.wideBandData = true; + + str = settings->value("wideband/widebandDisplay", "off").toString(); + if (str.toLower() == "on") + m_widebandOptions.wideBandDisplayStatus = true; + else if (str.toLower() == "off") + m_widebandOptions.wideBandDisplayStatus = false; + else + m_widebandOptions.wideBandDisplayStatus = false; + + if (!m_widebandOptions.wideBandData) m_widebandOptions.wideBandDisplayStatus = false; + + str = settings->value("wideband/averaging", "on").toString(); + if (str.toLower() == "on") + m_widebandOptions.averaging = true; + else if (str.toLower() == "off") + m_widebandOptions.averaging = false; + else + m_widebandOptions.averaging = true; + + value = settings->value("wideband/averagingCnt", 5).toInt(); + if ((value < 1) || (value > 100)) value = 5; + m_widebandOptions.averagingCnt = value; + + value = settings->value("wideband/dBmWideBandScaleMin", -140).toInt(); + if ((value < -200) || (value > 0)) value = -140; + m_widebandOptions.dBmWBScaleMin = (qreal)(1.0 * value); + + value = settings->value("wideband/dBmWideBandScaleMax", -10).toInt(); + if ((value < -100) || (value > 0)) value = -10; + m_widebandOptions.dBmWBScaleMax = (qreal)(1.0 * value); + + str = settings->value("wideband/panMode", "LINE").toString(); + if (str == "LINE") + m_widebandOptions.panMode = Line; + else if (str == "FILLEDLINE") + m_widebandOptions.panMode = FilledLine; + else if (str == "SOLID") + m_widebandOptions.panMode = Solid; + + //****************************************************************** + // receiver data settings + + for (int i = 0; i < MAX_RECEIVERS; i++) { + + QString cstr = m_rxStringList.at(i); + cstr.append("/dspCore"); + + str = settings->value(cstr, "qtdsp").toString(); + if (str == "qtdsp") { + + m_receiverDataList[i].dspCore = QSDR::QtDSP; + setSpectrumSize(this, 4096); + //SETTINGS_DEBUG << "DSP core for rx " << i << " is QtDSP."; + } + + cstr = m_rxStringList.at(i); + cstr.append("/freqRulerPosition"); + + value = settings->value(cstr, 5).toInt(); + if (value < 0) value = 0; + if (value > 10) value = 10; + m_receiverDataList[i].freqRulerPosition = value/10.0f; + + cstr = m_rxStringList.at(i); + cstr.append("/audioVolume"); + + value = settings->value(cstr, 10).toInt(); + if (value < 0) value = 0; + if (value > 100) value = 100; + m_receiverDataList[i].audioVolume = value/100.0f; + + cstr = m_rxStringList.at(i); + cstr.append("/mouseWheelFreqStep"); + + value = settings->value(cstr, 100).toInt(); + if ((value != 1) & (value != 10) & (value != 100) & (value != 1000) & (value != 10000) & (value != 100000) & + (value != 5) & (value != 50) & (value != 500) & (value != 5000) & (value != 50000) & (value != 500000)) + value = 100; + m_receiverDataList[i].mouseWheelFreqStep = (qreal)value; + + cstr = m_rxStringList.at(i); + cstr.append("/agcGain"); + + value = settings->value(cstr, 100).toInt(); + if (value < -20) value = -20; + if (value > 120) value = 120; + m_receiverDataList[i].acgGain = value; + + cstr = m_rxStringList.at(i); + cstr.append("/agcFixedGain"); + + value = settings->value(cstr, 30).toInt(); + if (value < -20) value = -20; + if (value > 50) value = 50; + m_receiverDataList[i].agcFixedGain_dB = value; + + cstr = m_rxStringList.at(i); + cstr.append("/agcMaximumGain"); + + value = settings->value(cstr, 30).toInt(); + if (value < -20) value = -20; + if (value > 150) value = 150; + m_receiverDataList[i].agcMaximumGain_dB = value - 0; + + cstr = m_rxStringList.at(i); + cstr.append("/agcSlope"); + + value = settings->value(cstr, 0).toInt(); + if (value < 0) value = 0; + if (value > 20) value = 20; + m_receiverDataList[i].agcVariableGain = (qreal)value; + + cstr = m_rxStringList.at(i); + cstr.append("/agcAttacktime"); + + value = settings->value(cstr, 1).toInt(); + if (value < 1) value = 1; + if (value > 10) value = 10; + m_receiverDataList[i].agcAttackTime = value/1000.0; + + cstr = m_rxStringList.at(i); + cstr.append("/agcDecaytime"); + + value = settings->value(cstr, 250).toInt(); + if (value < 10) value = 10; + if (value > 5000) value = 5000; + m_receiverDataList[i].agcDecayTime = value/1000.0; + + cstr = m_rxStringList.at(i); + cstr.append("/agcHangtime"); + + value = settings->value(cstr, 100).toInt(); + if (value < 10) value = 10; + if (value > 5000) value = 5000; + m_receiverDataList[i].agcHangTime = value/1000.0; + + cstr = m_rxStringList.at(i); + cstr.append("/agcLines"); + + str = settings->value(cstr, "on").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].agcLines = true; + else + m_receiverDataList[i].agcLines = false; + + cstr = m_rxStringList.at(i); + cstr.append("/agcMode"); + + str = settings->value(cstr, "MED").toString(); + if (str == "LONG") + m_receiverDataList[i].agcMode = agcLONG; + else if (str == "SLOW") + m_receiverDataList[i].agcMode = agcSLOW; + else if (str == "MED") + m_receiverDataList[i].agcMode = agcMED; + else if (str == "FAST") + m_receiverDataList[i].agcMode = agcFAST; + else + m_receiverDataList[i].agcMode = agcOFF; + + if (str == "MED" || str == "FAST") + m_receiverDataList[i].hangEnabled = false; + else + m_receiverDataList[i].hangEnabled = true; + + cstr = m_rxStringList.at(i); + cstr.append("/panMode"); + + str = settings->value(cstr, "LINE").toString(); + if (str == "LINE") + m_receiverDataList[i].panMode = Line; + else if (str == "FILLEDLINE") + m_receiverDataList[i].panMode = FilledLine; + else if (str == "SOLID") + m_receiverDataList[i].panMode = Solid; + + cstr = m_rxStringList.at(i); + cstr.append("/waterfallMode"); + + str = settings->value(cstr, "ENHANCED").toString(); + if (str == "SIMPLE") + m_receiverDataList[i].waterfallMode = Simple; + else if (str == "ENHANCED") + m_receiverDataList[i].waterfallMode = Enhanced; + + cstr = m_rxStringList.at(i); + cstr.append("/framesPerSecond"); + value = settings->value(cstr, 25).toInt(); + if (value < 0 || value > 200) value = 25; + m_receiverDataList[i].framesPerSecond = value; + + cstr = m_rxStringList.at(i); + cstr.append("/waterfallOffsetLo"); + value = settings->value(cstr, -5).toInt(); + if ((value < -50) || (value > 50)) value = -5; + m_receiverDataList[i].waterfallOffsetLo = value; + + cstr = m_rxStringList.at(i); + cstr.append("/waterfallOffsetHi"); + value = settings->value(cstr, 20).toInt(); + if ((value < -50) || (value > 50)) value = 20; + m_receiverDataList[i].waterfallOffsetHi = value; + + cstr = m_rxStringList.at(i); + cstr.append("/filterHi"); + value = settings->value(cstr, -150).toInt(); + if (value < -20000 || value > 20000) value = -150; + m_receiverDataList[i].filterHi = (qreal)(1.0f * value); + + cstr = m_rxStringList.at(i); + cstr.append("/filterLo"); + value = settings->value(cstr, -3050).toInt(); + if (value < -20000 || value > 20000) value = -3050; + m_receiverDataList[i].filterLo = (qreal)(1.0f * value); + + cstr = m_rxStringList.at(i); + cstr.append("/averaging"); + str = settings->value(cstr, "on").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].spectrumAveraging = true; + else + m_receiverDataList[i].spectrumAveraging = false; + + cstr = m_rxStringList.at(i); + cstr.append("/averagingCnt"); + value = settings->value(cstr, 5).toInt(); + if ((value < 1) || (value > 100)) value = 5; + m_receiverDataList[i].averagingCnt = value; + + cstr = m_rxStringList.at(i); + cstr.append("/grid"); + str = settings->value(cstr, "on").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].panGrid = true; + else + m_receiverDataList[i].panGrid = false; + + cstr = m_rxStringList.at(i); + cstr.append("/hairCross"); + str = settings->value(cstr, "off").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].hairCross = true; + else + m_receiverDataList[i].hairCross = false; + + cstr = m_rxStringList.at(i); + cstr.append("/panLocked"); + str = settings->value(cstr, "off").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].panLocked = true; + else + m_receiverDataList[i].panLocked = false; + + cstr = m_rxStringList.at(i); + cstr.append("/clickVFO"); + str = settings->value(cstr, "off").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].clickVFO = true; + else + m_receiverDataList[i].clickVFO = false; + + cstr = m_rxStringList.at(i); + cstr.append("/fftAuto"); + str = settings->value(cstr, "off").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].fftAuto = true; + else + m_receiverDataList[i].fftAuto = false; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency2200m"); + value = settings->value(cstr, 135700).toDouble(); + if ((value < 135700) || (value > 137800)) value = 135700; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency2200m"); + value = settings->value(cstr, 135700).toDouble(); + if ((value < 135700) || (value > 137800)) value = 135700; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency630m"); + value = settings->value(cstr, 472000).toDouble(); + if ((value < 472000) || (value > 479000)) value = 472000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency630m"); + value = settings->value(cstr, 472000).toDouble(); + if ((value < 472000) || (value > 479000)) value = 472000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency160m"); + value = settings->value(cstr, 1810000).toDouble(); + if ((value < 1810000) || (value > 2000000)) value = 1810000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency160m"); + value = settings->value(cstr, 1800000).toDouble(); + if ((value < 1810000) || (value > 2000000)) value = 1810000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency80m"); + value = settings->value(cstr, 3500000).toDouble(); + if ((value < 3500000) || (value > 3800000)) value = 3500000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency80m"); + value = settings->value(cstr, 3500000).toDouble(); + if ((value < 3500000) || (value > 3800000)) value = 3500000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency60m"); + value = settings->value(cstr, 5260000).toDouble(); + if ((value < 5260000) || (value > 5410000)) value = 5260000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency60m"); + value = settings->value(cstr, 5260000).toDouble(); + if ((value < 5260000) || (value > 5410000)) value = 5260000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency40m"); + value = settings->value(cstr, 7000000).toDouble(); + if ((value < 7000000) || (value > 7200000)) value = 7000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency40m"); + value = settings->value(cstr, 7000000).toDouble(); + if ((value < 7000000) || (value > 7200000)) value = 7000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency30m"); + value = settings->value(cstr, 10100000).toDouble(); + if ((value < 10100000) || (value > 10150000)) value = 10100000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency30m"); + value = settings->value(cstr, 10100000).toDouble(); + if ((value < 10100000) || (value > 10150000)) value = 10100000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency20m"); + value = settings->value(cstr, 14000000).toDouble(); + if ((value < 14000000) || (value > 14350000)) value = 14000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency20m"); + value = settings->value(cstr, 14000000).toDouble(); + if ((value < 14000000) || (value > 14350000)) value = 14000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency17m"); + value = settings->value(cstr, 18068000).toDouble(); + if ((value < 18068000) || (value > 18168000)) value = 18068000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency17m"); + value = settings->value(cstr, 18068000).toDouble(); + if ((value < 18068000) || (value > 18168000)) value = 18068000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency15m"); + value = settings->value(cstr, 21000000).toDouble(); + if ((value < 21000000) || (value > 21450000)) value = 21000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency15m"); + value = settings->value(cstr, 21000000).toDouble(); + if ((value < 21000000) || (value > 21450000)) value = 21000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency12m"); + value = settings->value(cstr, 24890000).toDouble(); + if ((value < 24890000) || (value > 24990000)) value = 24890000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency12m"); + value = settings->value(cstr, 24890000).toDouble(); + if ((value < 24890000) || (value > 24990000)) value = 24890000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency10m"); + value = settings->value(cstr, 28000000).toDouble(); + if ((value < 28000000) || (value > 29700000)) value = 28000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency10m"); + value = settings->value(cstr, 28000000).toDouble(); + if ((value < 28000000) || (value > 29700000)) value = 28000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency6m"); + value = settings->value(cstr, 50000000).toDouble(); + if ((value < 50000000) || (value > 54000000)) value = 50000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency6m"); + value = settings->value(cstr, 50000000).toDouble(); + if ((value < 50000000) || (value > 54000000)) value = 50000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency2m"); + value = settings->value(cstr, 144000000).toDouble(); + if ((value < 144000000) || (value > 148000000)) value = 144000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency2m"); + value = settings->value(cstr, 144000000).toDouble(); + if ((value < 144000000) || (value > 148000000)) value = 144000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency125cm"); + value = settings->value(cstr, 222000000).toDouble(); + if ((value < 222000000) || (value > 225000000)) value = 222000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency125cm"); + value = settings->value(cstr, 222000000).toDouble(); + if ((value < 222000000) || (value > 225000000)) value = 222000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency70cm"); + value = settings->value(cstr, 420000000).toDouble(); + if ((value < 420000000) || (value > 450000000)) value = 420000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency70cm"); + value = settings->value(cstr, 420000000).toDouble(); + if ((value < 420000000) || (value > 450000000)) value = 420000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency33cm"); + value = settings->value(cstr, 902000000).toDouble(); + if ((value < 902000000) || (value > 928000000)) value = 902000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + +//RRK TODO FIX + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency33cm"); + value = settings->value(cstr, 902000000).toDouble(); + if ((value < 902000000) || (value > 928000000)) value = 902000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency23cm"); + value = settings->value(cstr, 902000000).toDouble(); + if ((value < 902000000) || (value > 928000000)) value = 902000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency23cm"); + value = settings->value(cstr, 902000000).toDouble(); + if ((value < 902000000) || (value > 928000000)) value = 902000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency13cm"); + value = settings->value(cstr, 902000000).toDouble(); + if ((value < 902000000) || (value > 928000000)) value = 902000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency13cm"); + value = settings->value(cstr, 902000000).toDouble(); + if ((value < 902000000) || (value > 928000000)) value = 902000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency10cm"); + value = settings->value(cstr, 902000000).toDouble(); + if ((value < 902000000) || (value > 928000000)) value = 902000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency10cm"); + value = settings->value(cstr, 902000000).toDouble(); + if ((value < 902000000) || (value > 928000000)) value = 902000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency5cm"); + value = settings->value(cstr, 902000000).toDouble(); + if ((value < 902000000) || (value > 928000000)) value = 902000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency5cm"); + value = settings->value(cstr, 902000000).toDouble(); + if ((value < 902000000) || (value > 928000000)) value = 902000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequencyGen"); + value = settings->value(cstr, 1800000).toDouble(); + if ((value < 0) || (value > 50000000)) value = 3500000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequencyGen"); + value = settings->value(cstr, 1800000).toDouble(); + if ((value < 0) || (value > MAXFREQUENCY)) value = 1800000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/centerFrequency"); + value = settings->value(cstr, 3672000).toDouble(); + if ((value < 0) || (value > MAXFREQUENCY)) value = 1800000; + m_receiverDataList[i].ctrFrequency = value; + + setCtrFrequency(i, value); + + cstr = m_rxStringList.at(i); + cstr.append("/vfoFrequency"); + value = settings->value(cstr, 3672000).toDouble(); + if ((value < 0) || (value > 50000000)) value = 3600000; + m_receiverDataList[i].vfoFrequency = value; + + setVfoFrequency(i, value); + + + if (m_receiverDataList[i].dspModeList.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { + + for (int j = 0; j < MAX_BANDS; j++) { + + cstr = m_rxStringList.at(i); + cstr.append("/dspMode"); + cstr.append(m_bandList.at(j).bandString); + + str = settings->value(cstr, "").toString(); + + if (str == "USB") + m_receiverDataList[i].dspModeList[j] = USB; + else if (str == "DSB") + m_receiverDataList[i].dspModeList[j] = DSB; + else if (str == "CWL") + m_receiverDataList[i].dspModeList[j] = CWL; + else if (str == "CWU") + m_receiverDataList[i].dspModeList[j] = CWU; + else if (str == "FMN") + m_receiverDataList[i].dspModeList[j] = FMN; + else if (str == "AM") + m_receiverDataList[i].dspModeList[j] = AM; + else if (str == "DIGU") + m_receiverDataList[i].dspModeList[j] = DIGU; + else if (str == "SPEC") + m_receiverDataList[i].dspModeList[j] = SPEC; + else if (str == "DIGL") + m_receiverDataList[i].dspModeList[j] = DIGL; + else if (str == "SAM") + m_receiverDataList[i].dspModeList[j] = SAM; + else if (str == "DRM") + m_receiverDataList[i].dspModeList[j] = DRM; + else + m_receiverDataList[i].dspModeList[j] = LSB; + + //SETTINGS_DEBUG << cstr << ": " << getDSPModeString(m_receiverDataList[i].dspModeList[j]); + } + } + + if (m_receiverDataList[i].mercuryAttenuators.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { + + for (int j = 0; j < MAX_BANDS; j++) { + + cstr = m_rxStringList.at(i); + cstr.append("/attenuator"); + cstr.append(m_bandList.at(j).bandString); + + str = settings->value(cstr, "off").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].mercuryAttenuators[j] = 0; // which is 'Preamp' off + else + m_receiverDataList[i].mercuryAttenuators[j] = 1; // which is 'Preamp' on + } + } + + int valueMin, valueMax; + if (m_receiverDataList[i].dBmPanScaleMinList.length() == MAX_BANDS && + m_receiverDataList[i].dBmPanScaleMaxList.length() == MAX_BANDS && + m_bandList.length() == MAX_BANDS + ) { + for (int j = 0; j < MAX_BANDS; j++) { + + cstr = m_rxStringList.at(i); + cstr.append("/dBmPanScaleMin"); + cstr.append(m_bandList.at(j).bandString); + + valueMin = settings->value(cstr, -120).toInt(); + if ((valueMin < -200) || (valueMin > 0)) valueMin = -120; + + cstr = m_rxStringList.at(i); + cstr.append("/dBmPanScaleMax"); + cstr.append(m_bandList.at(j).bandString); + + valueMax = settings->value(cstr, -10).toInt(); + if ((valueMax < -200) || (valueMax > 0)) valueMax = -10; + + if (valueMax <= valueMin) { + + valueMin = -120; + valueMax = -10; + } + + m_receiverDataList[i].dBmPanScaleMinList[j] = (qreal)(1.0 * valueMin); + m_receiverDataList[i].dBmPanScaleMaxList[j] = (qreal)(1.0 * valueMax); + } + } + } + + //****************************************************************** + // Chirp WSPR settings + value = settings->value("ChirpWSPR/lowerChirpFrequency", 500).toInt(); + if (value < 1 || value > 10000) value = 500; + m_lowerChirpFreq = value; + + value = settings->value("ChirpWSPR/upperChirpFrequency", 2500).toInt(); + if (value < 2 || value < m_lowerChirpFreq + 1 || value > 50000) value = 2500; + m_upperChirpFreq = value; + + value = settings->value("ChirpWSPR/chirpAmplitude", 75).toInt(); + if (value < 0 || value > 100) return -1; + m_chirpAmplitude = qreal(value / 100.0); + + value = settings->value("ChirpWSPR/chirpSamplingFrequency", 48000).toInt(); + if ((value != 8000) & (value != 48000) & (value != 96000)) value = 48000; + m_chirpSamplingFreq = value; + + value = settings->value("ChirpWSPR/chirpBufferDurationUs", 10000000).toInt(); + if (value < 0 || value > 100000000) value = 10000000; + m_chirpBufferDurationUs = (qint64)value; + + value = settings->value("ChirpWSPR/chirpChannels", 1).toInt(); + if ((value != 1) & (value != 2)) value = 1; + m_chirpChannels = value; + + value = settings->value("ChirpWSPR/chirpBufferLength", 4096).toInt(); + if ((value != 4096) & (value != 16384)) value = 4096; + m_chirpBufferLength = (qint64)value; + + value = settings->value("ChirpWSPR/chirpFilterLowerFrequency", 500).toInt(); + if (value < 10000 || value > 10000) value = 500; + m_chirpFilterLowerFrequency = value; + + value = settings->value("ChirpWSPR/chirpFilterUpperFrequency", 2500).toInt(); + if (value < 10000 || value > 10000) value = 2500; + m_chirpFilterUpperFrequency = value; + + //****************************************************************** + // graphics settings + + value = settings->value("graphics/dBmDistScaleMin", -20).toInt(); + if ((value < -200) || (value > 0)) value = -20; + m_dBmDistScaleMin = (qreal)(1.0 * value); + + value = settings->value("graphics/dBmDistScaleMax", 100).toInt(); + if ((value < -100) || (value > 200)) value = 100; + m_dBmDistScaleMax = (qreal)(1.0 * value); + + value = settings->value("graphics/sMeterHoldTime", 2000).toInt(); + if ((value < 0) || (value > 10000)) value = 2000; + m_sMeterHoldTime = value; + + + //****************************************************************** + // color settings + QColor color; + + color = settings->value("colors/panBackground", QColor(102, 69, 8)).value(); + if (!color.isValid()) color = QColor(102, 69, 8); + m_panadapterColors.panBackgroundColor = color; + + color = settings->value("colors/waterfall", QColor(246, 146, 6)).value(); + if (!color.isValid()) color = QColor(246, 146, 6); + m_panadapterColors.waterfallColor = color; + + color = settings->value("colors/panLine", QColor(246, 164, 76)).value(); + if (!color.isValid()) color = QColor(246, 164, 76); + m_panadapterColors.panLineColor = color; + + color = settings->value("colors/panLineFilled", QColor(246, 159, 7)).value(); + if (!color.isValid()) color = QColor(246, 159, 7); + m_panadapterColors.panLineFilledColor = color; + + color = settings->value("colors/panSolidTop", QColor(230, 246, 204)).value(); + if (!color.isValid()) color = QColor(230, 246, 204); + m_panadapterColors.panSolidTopColor = color; + + color = settings->value("colors/panSolidBottom", QColor(102, 96, 8)).value(); + if (!color.isValid()) color = QColor(102, 96, 8); + m_panadapterColors.panSolidBottomColor = color; + + color = settings->value("colors/panWideBandLine", QColor(73, 111, 7)).value(); + if (!color.isValid()) color = QColor(73, 111, 7); + m_panadapterColors.wideBandLineColor = color; + + color = settings->value("colors/panWideBandFilled", QColor(137, 172, 62)).value(); + if (!color.isValid()) color = QColor(137, 172, 62); + m_panadapterColors.wideBandFilledColor = color; + + color = settings->value("colors/panWideBandSolidTop", QColor(236, 38, 16)).value(); + if (!color.isValid()) color = QColor(236, 38, 16); + m_panadapterColors.wideBandSolidTopColor = color; + + color = settings->value("colors/panWideBandSolidBottom", QColor(232, 134, 29)).value(); + if (!color.isValid()) color = QColor(232, 134, 29); + m_panadapterColors.wideBandSolidBottomColor = color; + + color = settings->value("colors/distanceLine", QColor(246, 27, 45)).value(); + if (!color.isValid()) color = QColor(246, 27, 45); + m_panadapterColors.distanceLineColor = color; + + color = settings->value("colors/distanceLineFilled", QColor(232, 29, 86)).value(); + if (!color.isValid()) color = QColor(232, 29, 86); + m_panadapterColors.distanceLineFilledColor = color; + + color = settings->value("colors/panCenterLine", QColor(246, 7, 19)).value(); + if (!color.isValid()) color = QColor(246, 7, 19); + m_panadapterColors.panCenterLineColor = color; + + color = settings->value("colors/gridLine", QColor(7, 96, 96)).value(); + if (!color.isValid()) color = QColor(7, 96, 96); + m_panadapterColors.gridLineColor = color; + + SETTINGS_DEBUG << "reading done."; + + return 0; +} + +int Settings::saveSettings() { + + QString str; + //QList bandList = HamBandStrings(); + + settings->setValue(getTitleStr(), getVersionStr()); + settings->setValue("saved", QDateTime::currentDateTime().toString("dddd dd MMMM yyyy hh:mm:ss"));// << " local time\n\n"); + settings->setValue("user/callSign", m_callsignString); + + // window settings + settings->setValue("window/minimumWidgetWidth", m_minimumWidgetWidth); + settings->setValue("window/minimumGroupBoxWidth", m_minimumGroupBoxWidth); + settings->setValue("window/multiRxView", m_multiRxView); + + // network settings + settings->setValue("network/server_ipAddress", m_serverAddress); + settings->setValue("network/hpsdr_local_ipAddress", m_hpsdrDeviceLocalAddr); + settings->setValue("network/server_port", m_serverPort); + settings->setValue("network/listen_port", m_listenerPort); + settings->setValue("network/audio_port", m_audioPort); + settings->setValue("network/metis_port", m_metisPort); + settings->setValue("network/socketBufferSize", m_socketBufferSize); + + + // HPSDR hardware + settings->setValue("hpsdr/hardware", m_hpsdrHardware); + + switch (m_hpsdrHardware) { + + // Mercury/Penelope, PennyLane + case 0: + + if (m_devices.mercuryPresence) + settings->setValue("hpsdr/mercury", "true"); + else + settings->setValue("hpsdr/mercury", "false"); + + if (m_devices.penelopePresence) + settings->setValue("hpsdr/penelope", "true"); + else + settings->setValue("hpsdr/penelope", "false"); + + if (m_devices.pennylanePresence) + settings->setValue("hpsdr/pennylane", "true"); + else + settings->setValue("hpsdr/pennylane", "false"); + + if (m_devices.excaliburPresence) + settings->setValue("hpsdr/excalibur", "true"); + else + settings->setValue("hpsdr/excalibur", "false"); + break; + + // Hermes + case 1: + + if (m_devices.mercuryPresence) + settings->setValue("hpsdr/mercury", "true"); + else + settings->setValue("hpsdr/mercury", "false"); + + if (m_devices.penelopePresence) + settings->setValue("hpsdr/penelope", "true"); + else + settings->setValue("hpsdr/penelope", "false"); + + if (m_devices.pennylanePresence) + settings->setValue("hpsdr/pennylane", "true"); + else + settings->setValue("hpsdr/pennylane", "false"); + + if (m_devices.excaliburPresence) + settings->setValue("hpsdr/excalibur", "true"); + else + settings->setValue("hpsdr/excalibur", "false"); + break; + + // Cyclops + case 2: + break; + } + + if (m_devices.alexPresence) + settings->setValue("hpsdr/alex", "true"); + else + settings->setValue("hpsdr/alex", "false"); + + +// if (m_devices.hermesPresence) +// settings->setValue("hpsdr/hermes", "true"); +// else +// settings->setValue("hpsdr/hermes", "false"); + + switch (m_hpsdrHardware) { + + // Mercury/Penelope + case 0: + + if (m_hwInterface == QSDR::Metis) + settings->setValue("hpsdr/interface", "metis"); + else if (m_hwInterface == QSDR::NoInterfaceMode) + settings->setValue("hpsdr/interface", "noInterface"); + break; + + // Hermes + case 1: + + if (m_hwInterface == QSDR::Hermes) + settings->setValue("hpsdr/interface", "hermes"); + break; + + // Cyclops + case 2: + break; + } + + if (m_checkFirmwareVersions) + settings->setValue("hpsdr/checkfw", "true"); + else + settings->setValue("hpsdr/checkfw", "false"); + + + // server settings + settings->setValue("server/sample_rate", getSampleRate()); + + if (m_mercuryDither == 1) + settings->setValue("server/dither", "on"); + else + settings->setValue("server/dither", "off"); + + if (m_mercuryRandom == 1) + settings->setValue("server/random", "on"); + else + settings->setValue("server/random", "off"); + + if (m_10MHzSource == 0) + settings->setValue("server/10mhzsource", "atlas"); + else if (m_10MHzSource == 1) + settings->setValue("server/10mhzsource", "penelope"); + else if (m_10MHzSource == 2) + settings->setValue("server/10mhzsource", "mercury"); + else if (m_10MHzSource == 3) + settings->setValue("server/10mhzsource", "none"); + else + settings->setValue("server/10mhzsource", "mercury"); + + if (m_122_8MHzSource == 0) + settings->setValue("server/122_88mhzsource", "penelope"); + else if (m_122_8MHzSource == 1) + settings->setValue("server/122_88mhzsource", "mercury"); + + if (m_micSource == 0) + settings->setValue("server/mic_source", "janus"); + else if (m_micSource == 1) + settings->setValue("server/mic_source", "penelope"); + + settings->setValue("server/class", m_RxClass); + settings->setValue("server/timing", m_RxTiming); + //settings->setValue("server/mainVolume", (int)(m_mainVolume * 100)); + + //if (m_serverMode == QSDR::SDRMode) + settings->setValue("server/mode", "sdr"); + + //settings->setValue("server/mouseWheelFreqStep", m_mouseWheelFreqStep); + + //****************************************************************** + // Alexiares data settings + + // m_alexConfig (qint16) + // + // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + // | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | +-----Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) + // | | | | | | | | | | | | | +------ Alex - Bypass all HPFs (0 = disable, 1 = enable)* + // | | | | | | | | | | | | +-------- Alex - 6M low noise amplifier (0 = disable, 1 = enable)* + // | | | | | | | | | | | +---------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | | +------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | +-------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | +---------------- Alex - select 13MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | +------------------ Alex - select 20MHz HPF (0 = disable, 1 = enable)* + // | | | | | | +-------------------- Alex - select 160m LPF (0 = disable, 1 = enable)* + // | | | | | +---------------------- Alex - select 80m LPF (0 = disable, 1 = enable)* + // | | | | +------------------------ Alex - select 60/40m LPF (0 = disable, 1 = enable)* + // | | | +-------------------------- Alex - select 30/20m LPF (0 = disable, 1 = enable)* + // | | +---------------------------- Alex - select 17/15m LPF (0 = disable, 1 = enable)* + // | +------------------------------ Alex - select 12/10m LPF (0 = disable, 1 = enable)* + // +-------------------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* + + if (m_alexConfig & 0x01) + settings->setValue("alex/manual", "on"); + else + settings->setValue("alex/manual", "off"); + + if (m_alexConfig & 0x02) + settings->setValue("alex/bypassAll", "on"); + else + settings->setValue("alex/bypassAll", "off"); + + if (m_alexConfig & 0x04) + settings->setValue("alex/amp6m", "on"); + else + settings->setValue("alex/amp6m", "off"); + + settings->setValue("alex/amp6mLo", (int)m_HPFLoFrequencyList.at(5)); + settings->setValue("alex/amp6mHi", (int)m_HPFHiFrequencyList.at(5)); + + if (m_alexConfig & 0x08) + settings->setValue("alex/hpf1_5MHz", "on"); + else + settings->setValue("alex/hpf1_5MHz", "off"); + + settings->setValue("alex/hpf1_5MHzLo", (int)m_HPFLoFrequencyList.at(0)); + settings->setValue("alex/hpf1_5MHzHi", (int)m_HPFHiFrequencyList.at(0)); + + if (m_alexConfig & 0x10) + settings->setValue("alex/hpf6_5MHz", "on"); + else + settings->setValue("alex/hpf6_5MHz", "off"); + + settings->setValue("alex/hpf6_5MHzLo", (int)m_HPFLoFrequencyList.at(1)); + settings->setValue("alex/hpf6_5MHzHi", (int)m_HPFHiFrequencyList.at(1)); + + if (m_alexConfig & 0x20) + settings->setValue("alex/hpf9_5MHz", "on"); + else + settings->setValue("alex/hpf9_5MHz", "off"); + + settings->setValue("alex/hpf9_5MHzLo", (int)m_HPFLoFrequencyList.at(2)); + settings->setValue("alex/hpf9_5MHzHi", (int)m_HPFHiFrequencyList.at(2)); + + if (m_alexConfig & 0x40) + settings->setValue("alex/hpf13MHz", "on"); + else + settings->setValue("alex/hpf13MHz", "off"); + + settings->setValue("alex/hpf13MHzLo", (int)m_HPFLoFrequencyList.at(3)); + settings->setValue("alex/hpf13MHzHi", (int)m_HPFHiFrequencyList.at(3)); + + if (m_alexConfig & 0x80) + settings->setValue("alex/hpf20MHz", "on"); + else + settings->setValue("alex/hpf20MHz", "off"); + + settings->setValue("alex/hpf20MHzLo", (int)m_HPFLoFrequencyList.at(4)); + settings->setValue("alex/hpf20MHzHi", (int)m_HPFHiFrequencyList.at(4)); + + if (m_alexConfig & 0x100) + settings->setValue("alex/lpf160m", "on"); + else + settings->setValue("alex/lpf160m", "off"); + + settings->setValue("alex/lpf160mLo", (int)m_LPFLoFrequencyList.at(0)); + settings->setValue("alex/lpf160mHi", (int)m_LPFHiFrequencyList.at(0)); + + if (m_alexConfig & 0x200) + settings->setValue("alex/lpf80m", "on"); + else + settings->setValue("alex/lpf80m", "off"); + + settings->setValue("alex/lpf80mLo", (int)m_LPFLoFrequencyList.at(1)); + settings->setValue("alex/lpf80mHi", (int)m_LPFHiFrequencyList.at(1)); + + if (m_alexConfig & 0x400) + settings->setValue("alex/lpf60_40m", "on"); + else + settings->setValue("alex/lpf60_40m", "off"); + + settings->setValue("alex/lpf60_40mLo", (int)m_LPFLoFrequencyList.at(2)); + settings->setValue("alex/lpf60_40mHi", (int)m_LPFHiFrequencyList.at(2)); + + if (m_alexConfig & 0x800) + settings->setValue("alex/lpf30_20m", "on"); + else + settings->setValue("alex/lpf30_20m", "off"); + + settings->setValue("alex/lpf30_20mLo", (int)m_LPFLoFrequencyList.at(3)); + settings->setValue("alex/lpf30_20mHi", (int)m_LPFHiFrequencyList.at(3)); + + if (m_alexConfig & 0x1000) + settings->setValue("alex/lpf17_15m", "on"); + else + settings->setValue("alex/lpf17_15m", "off"); + + settings->setValue("alex/lpf17_15mLo", (int)m_LPFLoFrequencyList.at(4)); + settings->setValue("alex/lpf17_15mHi", (int)m_LPFHiFrequencyList.at(4)); + + if (m_alexConfig & 0x2000) + settings->setValue("alex/lpf12_10m", "on"); + else + settings->setValue("alex/lpf12_10m", "off"); + + settings->setValue("alex/lpf12_10mLo", (int)m_LPFLoFrequencyList.at(5)); + settings->setValue("alex/lpf12_10mHi", (int)m_LPFHiFrequencyList.at(5)); + + if (m_alexConfig & 0x4000) + settings->setValue("alex/lpf6m", "on"); + else + settings->setValue("alex/lpf6m", "off"); + + settings->setValue("alex/lpf6mLo", (int)m_LPFLoFrequencyList.at(6)); + settings->setValue("alex/lpf6mHi", (int)m_LPFHiFrequencyList.at(6)); + + + //*********************************************************************** + for (int i = 0; i < MAX_BANDS; i++) { + + str = "alex/state"; + str.append(m_bandList.at(i).bandString); + + settings->setValue(str, m_alexStates.at(i)); + } + + if (m_alexStates.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { + + for (int i = 0; i < MAX_BANDS-1; i++) { + + str = "alex/state"; + str.append(m_bandList.at(i).bandString); + + settings->setValue(str, m_alexStates.at(i)); + } + } + + + //****************************************************************** + // Penny open collector settings + + if (m_pennyOCEnabled) + settings->setValue("penny/OCenabled", "on"); + else + settings->setValue("penny/OCenabled", "off"); + + if (m_rxJ6pinList.length() == MAX_BANDS-1 && m_txJ6pinList.length() == MAX_BANDS-1 && m_bandList.length() == MAX_BANDS) { + + for (int i = 0; i < MAX_BANDS-1; i++) { + + str = "penny/rxState"; + str.append(m_bandList.at(i).bandString); + + settings->setValue(str, m_rxJ6pinList.at(i)); + } + + for (int i = 0; i < MAX_BANDS-1; i++) { + + str = "penny/txState"; + str.append(m_bandList.at(i).bandString); + + settings->setValue(str, m_txJ6pinList.at(i)); + } + } + + //****************************************************************** + // wideband settings + + if (m_widebandOptions.wideBandData) + settings->setValue("wideband/widebandData", "on"); + else + settings->setValue("wideband/widebandData", "off"); + + if (!m_widebandOptions.wideBandData) m_widebandOptions.wideBandDisplayStatus = false; + + if (m_widebandOptions.wideBandDisplayStatus) + settings->setValue("wideband/widebandDisplay", "on"); + else + settings->setValue("wideband/widebandDisplay", "off"); + + if (m_widebandOptions.averaging) + settings->setValue("wideband/averaging", "on"); + else + settings->setValue("wideband/averaging", "off"); + + settings->setValue("wideband/averagingCnt", m_widebandOptions.averagingCnt); + settings->setValue("wideband/dBmWideBandScaleMin", (int)m_widebandOptions.dBmWBScaleMin); + settings->setValue("wideband/dBmWideBandScaleMax", (int)m_widebandOptions.dBmWBScaleMax); + + if (m_widebandOptions.panMode == Line) + settings->setValue("wideband/panMode", "LINE"); + else if (m_widebandOptions.panMode == FilledLine) + settings->setValue("wideband/panMode", "FILLEDLINE"); + else if (m_widebandOptions.panMode == Solid) + settings->setValue("wideband/panMode", "SOLID"); + + + //****************************************************************** + // receiver data settings + + for (int i = 0; i < MAX_RECEIVERS; i++) { + + QString str = m_rxStringList.at(i); + str.append("/dspCore"); + + if (m_receiverDataList[i].dspCore == QSDR::QtDSP) + settings->setValue(str, "qtdsp"); + //else + // settings->setValue(str, "dttsp"); + + str = m_rxStringList.at(i); + str.append("/freqRulerPosition"); + settings->setValue(str, (int)(m_receiverDataList[i].freqRulerPosition * 10)); + + str = m_rxStringList.at(i); + str.append("/audioVolume"); + settings->setValue(str, (int)(m_receiverDataList[i].audioVolume * 100)); + + str = m_rxStringList.at(i); + str.append("/mouseWheelFreqStep"); + settings->setValue(str, (int)(m_receiverDataList[i].mouseWheelFreqStep)); + + str = m_rxStringList.at(i); + str.append("/agcGain"); + settings->setValue(str, m_receiverDataList[i].acgGain); + + str = m_rxStringList.at(i); + str.append("/agcFixedGain"); + settings->setValue(str, (int) m_receiverDataList[i].agcFixedGain_dB); + + str = m_rxStringList.at(i); + str.append("/agcMaximumGain"); + settings->setValue(str, (int) m_receiverDataList[i].agcMaximumGain_dB); + + str = m_rxStringList.at(i); + str.append("/agcSlope"); + settings->setValue(str, (int)m_receiverDataList[i].agcVariableGain); + + str = m_rxStringList.at(i); + str.append("/agcAttacktime"); + settings->setValue(str, (int)(m_receiverDataList[i].agcAttackTime * 1000)); + + str = m_rxStringList.at(i); + str.append("/agcDecaytime"); + settings->setValue(str, (int)(m_receiverDataList[i].agcDecayTime * 1000)); + + str = m_rxStringList.at(i); + str.append("/agcHangTime"); + settings->setValue(str, (int)(m_receiverDataList[i].agcHangTime * 1000)); + + str = m_rxStringList.at(i); + str.append("/agcLines"); + + if (m_receiverDataList[i].agcLines) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + +// str = m_rxStringList.at(i); +// str.append("/attenuator"); +// str.append(m_bandList.at(j).bandString); +// +// if (m_receiverDataList.at(i).mercuryAttenuators.at(j)) +// settings->setValue(str, "off"); +// else +// settings->setValue(str, "on"); + + str = m_rxStringList.at(i); + str.append("/agcMode"); + + if (m_receiverDataList[i].agcMode == agcOFF) + settings->setValue(str, "OFF"); + else if (m_receiverDataList[i].agcMode == agcLONG) + settings->setValue(str, "LONG"); + else if (m_receiverDataList[i].agcMode == agcSLOW) + settings->setValue(str, "SLOW"); + else if (m_receiverDataList[i].agcMode == agcMED) + settings->setValue(str, "MED"); + else if (m_receiverDataList[i].agcMode == agcFAST) + settings->setValue(str, "FAST"); + + str = m_rxStringList.at(i); + str.append("/panMode"); + + if (m_receiverDataList[i].panMode == Line) + settings->setValue(str, "LINE"); + else if (m_receiverDataList[i].panMode == FilledLine) + settings->setValue(str, "FILLEDLINE"); + else if (m_receiverDataList[i].panMode == Solid) + settings->setValue(str, "SOLID"); + + str = m_rxStringList.at(i); + str.append("/waterfallMode"); + + if (m_receiverDataList[i].waterfallMode == Simple) + settings->setValue(str, "SIMPLE"); + else if (m_receiverDataList[i].waterfallMode == Enhanced) + settings->setValue(str, "ENHANCED"); + + str = m_rxStringList.at(i); + str.append("/framesPerSecond"); + settings->setValue(str, m_receiverDataList[i].framesPerSecond); + + str = m_rxStringList.at(i); + str.append("/waterfallOffsetLo"); + settings->setValue(str, m_receiverDataList[i].waterfallOffsetLo); + + str = m_rxStringList.at(i); + str.append("/waterfallOffsetHi"); + settings->setValue(str, m_receiverDataList[i].waterfallOffsetHi); + + str = m_rxStringList.at(i); + str.append("/filterHi"); + settings->setValue(str, m_receiverDataList[i].filterHi); + + str = m_rxStringList.at(i); + str.append("/filterLo"); + settings->setValue(str, m_receiverDataList[i].filterLo); + + str = m_rxStringList.at(i); + str.append("/averaging"); + if (m_receiverDataList[i].spectrumAveraging) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + + str = m_rxStringList.at(i); + str.append("/averagingCnt"); + settings->setValue(str, m_receiverDataList[i].averagingCnt); + + str = m_rxStringList.at(i); + str.append("/grid"); + if (m_receiverDataList[i].panGrid) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + + str = m_rxStringList.at(i); + str.append("/hairCross"); + if (m_receiverDataList[i].hairCross) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + + str = m_rxStringList.at(i); + str.append("/panLocked"); + if (m_receiverDataList[i].panLocked) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + + str = m_rxStringList.at(i); + str.append("/clickVFO"); + if (m_receiverDataList[i].clickVFO) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + + str = m_rxStringList.at(i); + str.append("/fftAuto"); + if (m_receiverDataList[i].fftAuto) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + + // center frequencies + for (int j = 0; j < MAX_BANDS; j++) { + + str = m_rxStringList.at(i); + str.append("/lastCenterFrequency"); + str.append(m_bandList.at(j).bandString); + + settings->setValue(str, (int)m_receiverDataList[i].lastCenterFrequencyList.at(j)); + } + + // vfo frequencies + for (int j = 0; j < MAX_BANDS; j++) { + + str = m_rxStringList.at(i); + str.append("/lastVfoFrequency"); + str.append(m_bandList.at(j).bandString); + + settings->setValue(str, (int)m_receiverDataList[i].lastVfoFrequencyList.at(j)); + } + + str = m_rxStringList.at(i); + str.append("/centerFrequency"); + settings->setValue(str, (int)m_receiverDataList[i].ctrFrequency); + + str = m_rxStringList.at(i); + str.append("/vfoFrequency"); + settings->setValue(str, (int)m_receiverDataList[i].vfoFrequency); + + for (int j = 0; j < MAX_BANDS; j++) { + + str = m_rxStringList.at(i); + str.append("/dspMode"); + str.append(m_bandList.at(j).bandString); + + DSPMode mode = m_receiverDataList.at(i).dspModeList.at(j); + if (mode == LSB) + settings->setValue(str, "LSB"); + else if (mode == USB) + settings->setValue(str, "USB"); + else if (mode == DSB) + settings->setValue(str, "DSB"); + else if (mode == CWL) + settings->setValue(str, "CWL"); + else if (mode == CWU) + settings->setValue(str, "CWU"); + else if (mode == FMN) + settings->setValue(str, "FMN"); + else if (mode == AM) + settings->setValue(str, "AM"); + else if (mode == DIGU) + settings->setValue(str, "DIGU"); + else if (mode == SPEC) + settings->setValue(str, "SPEC"); + else if (mode == DIGL) + settings->setValue(str, "DIGL"); + else if (mode == SAM) + settings->setValue(str, "SAM"); + else if (mode == DRM) + settings->setValue(str, "DRM"); + } + + for (int j = 0; j < MAX_BANDS; j++) { + + str = m_rxStringList.at(i); + str.append("/attenuator"); + str.append(m_bandList.at(j).bandString); + + if (m_receiverDataList.at(i).mercuryAttenuators.at(j)) + settings->setValue(str, "off"); + else + settings->setValue(str, "on"); + } + + for (int j = 0; j < MAX_BANDS; j++) { + + str = m_rxStringList.at(i); + str.append("/dBmPanScaleMin"); + str.append(m_bandList.at(j).bandString); + + settings->setValue(str, (int)m_receiverDataList[i].dBmPanScaleMinList[j]); + + str = m_rxStringList.at(i); + str.append("/dBmPanScaleMax"); + str.append(m_bandList.at(j).bandString); + + settings->setValue(str, (int)m_receiverDataList[i].dBmPanScaleMaxList[j]); + } + } + + + //****************************************************************** + // Cuda settings + //settings->setValue("Cuda/lastDevice", m_cudaLastDevice); + + + //****************************************************************** + // Chirp WSPR settings + settings->setValue("ChirpWSPR/lowerChirpFrequency", m_lowerChirpFreq); + settings->setValue("ChirpWSPR/upperChirpFrequency", m_upperChirpFreq); + settings->setValue("ChirpWSPR/chirpAmplitude", int(m_chirpAmplitude * 100)); + settings->setValue("ChirpWSPR/chirpSamplingFrequency", m_chirpSamplingFreq); + settings->setValue("ChirpWSPR/chirpBufferDurationUs", m_chirpBufferDurationUs); + settings->setValue("ChirpWSPR/chirpChannels", m_chirpChannels); + settings->setValue("ChirpWSPR/chirpBufferLength", m_chirpBufferLength); + settings->setValue("ChirpWSPR/chirpFilterLowerFrequency", m_chirpFilterLowerFrequency); + settings->setValue("ChirpWSPR/chirpFilterUpperFrequency", m_chirpFilterUpperFrequency); + + + //settings->setValue("ChirpWSPR/chirpDownSampleRate", m_chirpDownSampleRate); + + + //****************************************************************** + // Graphics settings + + /*if (m_specAveraging) + settings->setValue("graphics/averaging", "on"); + else + settings->setValue("graphics/averaging", "off");*/ + + /*if (m_panGrid) + settings->setValue("graphics/grid", "on"); + else + settings->setValue("graphics/grid", "off");*/ + + settings->setValue("graphics/dBmDistScaleMin", (int)m_dBmDistScaleMin); + settings->setValue("graphics/dBmDistScaleMax", (int)m_dBmDistScaleMax); + + /*if (m_waterfallColorScheme == QSDRGraphics::simple) + settings->setValue("graphics/waterfall", "simple"); + else + if (m_waterfallColorScheme == QSDRGraphics::enhanced) + settings->setValue("graphics/waterfall", "enhanced"); + else + if (m_waterfallColorScheme == QSDRGraphics::spectran) + settings->setValue("graphics/waterfall", "spectran");*/ + + settings->setValue("graphics/sMeterHoldTime", m_sMeterHoldTime); + + + // Colors + settings->setValue("colors/panBackground", QVariant(m_panadapterColors.panBackgroundColor).toString()); + settings->setValue("colors/waterfall", QVariant(m_panadapterColors.waterfallColor).toString()); + settings->setValue("colors/panLine", QVariant(m_panadapterColors.panLineColor).toString()); + settings->setValue("colors/panLineFilled", QVariant(m_panadapterColors.panLineFilledColor).toString()); + settings->setValue("colors/panSolidTop", QVariant(m_panadapterColors.panSolidTopColor).toString()); + settings->setValue("colors/panSolidBottom", QVariant(m_panadapterColors.panSolidBottomColor).toString()); + settings->setValue("colors/panWideBandLine", QVariant(m_panadapterColors.wideBandLineColor).toString()); + settings->setValue("colors/panWideBandFilled", QVariant(m_panadapterColors.wideBandFilledColor).toString()); + settings->setValue("colors/panWideBandSolidTop", QVariant(m_panadapterColors.wideBandSolidTopColor).toString()); + settings->setValue("colors/panWideBandSolidBottom", QVariant(m_panadapterColors.wideBandSolidBottomColor).toString()); + settings->setValue("colors/distanceLine", QVariant(m_panadapterColors.distanceLineColor).toString()); + settings->setValue("colors/distanceLineFilled", QVariant(m_panadapterColors.distanceLineFilledColor).toString()); + settings->setValue("colors/panCenterLine", QVariant(m_panadapterColors.panCenterLineColor).toString()); + settings->setValue("colors/gridLine", QVariant(m_panadapterColors.gridLineColor).toString()); + + SETTINGS_DEBUG << "save settings done."; + return 0; +} + +//void Settings::setMainWindowsState(QObject* sender) { +// +// settings->setValue("geometry", sender.saveGeometry()); +// settings->setValue("windowState", saveState()); +//} + +//******************************************************* + +QList Settings::getCtrFrequencies() { + + QList frequencies; + + for (int i = 0; i < MAX_RECEIVERS; i++) + frequencies << m_receiverDataList[i].ctrFrequency; + + return frequencies; +} + +QList Settings::getVfoFrequencies() { + + QList frequencies; + + for (int i = 0; i < MAX_RECEIVERS; i++) + frequencies << m_receiverDataList[i].vfoFrequency; + + return frequencies; +} + +QString Settings::getDSPModeString(int mode) { + + switch (mode) { + + case 0: + return QString("LSB"); + + case 1: + return QString("USB"); + + case 2: + return QString("DSB"); + + case 3: + return QString("CWL"); + + case 4: + return QString("CWU"); + + case 5: + return QString("FMN"); + + case 6: + return QString("AM"); + + case 7: + return QString("DIGU"); + + case 8: + return QString("SPEC"); + + case 9: + return QString("DIGL"); + + case 10: + return QString("SAM"); + + case 11: + return QString("DRM"); + + default: + return QString("unknown mode"); + } +} + +//******************************************************* + +QString Settings::getTitleStr() { + + return m_titleString; +} + +QString Settings::getVersionStr() { + + return m_versionString; +} + +QString Settings::getSettingsFilename() { + + return settingsFilename; +} + +QString Settings::getCallsign() { + + return m_callsignString; +} + +QString Settings::getValue1000( + + double value, /*!<[in] Value to print. */ + int valuePrefix, /*!<[in] Value current prefix. */ + QString unitBase) /*!<[in] Unit base string. */ +{ + const int prefixBase = 1000; + int resPrefix = valuePrefix; + + static const char *prefixTab[prefixSiMax + 1] = { + "", /* prefixNothing */ + "k", /* prefixKilo */ + "M", /* prefixMega */ + "G", /* prefixGiga */ + "T", /* prefixTera */ + "P", /* prefixPeta */ + "E", /* prefixExa */ + "Z", /* prefixZetta */ + "Y", /* prefixYotta */ + }; + + /*while((value > (10 * prefixBase)) && (resPrefix < prefixSiMax)) { + value /= prefixBase; + resPrefix++; + }*/ + while((value > (prefixBase/10)) && (resPrefix < prefixSiMax)) { + value /= prefixBase; + resPrefix++; + } + + return QString("%1 %2%3").arg(value).arg(prefixTab[resPrefix]).arg(unitBase); +} + +QString Settings::getValue1024( + + double value, /*!<[in] Value to print. */ + int valuePrefix, /*!<[in] Value current prefix. */ + QString unitBase) /*!<[in] Unit base string. */ +{ + const int prefixBase = 1024; + int resPrefix = valuePrefix; + + static const char *prefixTab[prefixIecMax + 1] = { + "", /* prefixNothing */ + "Ki", /* prefixKibi */ + "Mi", /* prefixMebi */ + "Gi", /* prefixGibi */ + "Ti", /* prefixTebi */ + "Pi", /* prefixPebi */ + "Ei", /* prefixExbi */ + "Zi", /* prefixZebi */ + "Yi", /* prefixYobi */ + }; + + while((value > (10 * prefixBase)) && (resPrefix < prefixIecMax)) { + value /= prefixBase; + resPrefix++; + } + + return QString("%1 %2%3").arg(value).arg(prefixTab[resPrefix]).arg(unitBase); +} + +int Settings::getMinimumWidgetWidth() { + + return m_minimumWidgetWidth; +} + +int Settings::getMinimumGroupBoxWidth() { + + return m_minimumGroupBoxWidth; +} + +void Settings::debugSystemState() { + + qDebug() << " "; + SETTINGS_DEBUG << "**********************************************************"; + SETTINGS_DEBUG << "Error:\t\t\t" << qPrintable(getErrorString(m_systemError)); + SETTINGS_DEBUG << "HW Interface:\t\t" << qPrintable(getHWInterfaceModeString(m_hwInterface)); + SETTINGS_DEBUG << "Server Mode:\t\t" << qPrintable(getServerModeString(m_serverMode)); + SETTINGS_DEBUG << "DataEngine State:\t" << qPrintable(getHDataEngineStateString(m_dataEngineState)); + qDebug() << " "; +} + +QString Settings::getSDRStyle() { + + return sdrStyle; +} + +QString Settings::getWidgetStyle() { + + return widgetStyle; +} + +QString Settings::getMainWindowStyle() { + + return mainWindowStyle; +} + +QString Settings::getDockStyle() { + + return dockStyle; +} + +QString Settings::getDisplayToolbarStyle() { + + return displayToolbarStyle; +} + +QString Settings::getMainBtnToolbarStyle() { + + return mainBtnToolbarStyle; +} + +QString Settings::getStatusbarStyle() { + + return statusbarStyle; +} + +QString Settings::getMessageBoxStyle() { + + return messageBoxStyle; +} + +QString Settings::getLineEditStyle() { + + return lineEditStyle; +} + +QString Settings::getDialogStyle() { + + return dialogStyle; +} + +QString Settings::getColorDialogStyle() { + + return colorDialogStyle; +} + +QString Settings::getItemStyle() { + + return itemStyle; +} + +QString Settings::getLabelStyle() { + + return labelStyle; +} + +QString Settings::getSliderLabelStyle() { + + return sliderLabelStyle; +} + +QString Settings::getTableStyle() { + + return tableStyle; +} + +QString Settings::getComboBoxStyle() { + + return comboBoxStyle; +} + +QString Settings::getSpinBoxStyle() { + + return spinBoxStyle; +} + +QString Settings::getDoubleSpinBoxStyle() { + + return dSpinBoxStyle; +} + +QString Settings::getMenuStyle() { + + return menuStyle; +} + +QString Settings::getMiniButtonStyle() { + + return miniButtonStyle; +} + +QString Settings::getVolSliderStyle() { + + return volSliderStyle; +} + +QString Settings::getSplitterStyle() { + + return splitterStyle; +} + +QString Settings::getFrameStyle() { + + return frameStyle; +} + +QString Settings::getTabWidgetStyle() { + + return tabWidgetStyle; +} + +//QString Settings::getNewSliderStyle() { +// +// return m_newSliderStyle; +//} + + +//******************************************************* + +void Settings::setMainPower(QObject *sender, bool power) { + + if (m_mainPower == power) return; + + m_mainPower = power; + if (power) + m_mainPower = true; + else + m_mainPower = false; + + emit masterSwitchChanged(sender, m_mainPower); +} + +bool Settings::getMainPower() { + + return m_mainPower; +} + +void Settings::setSystemMessage(const QString &msg, int time) { + + emit systemMessageEvent(msg, time); +} + +void Settings::setSystemState( + + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + + //QMutexLocker locker(&settingsMutex); + + if (m_systemError != err) + m_systemError = err; + + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + if (m_serverMode != mode) { + + m_serverMode = mode; + + if (m_serverMode == QSDR::ChirpWSPR) + setWidebandStatus(this, false); + } + + if (m_dataEngineState != state) + m_dataEngineState = state; + + if (m_dataEngineState == QSDR::DataEngineDown) + setCurrentReceiver(this, 0); + //m_currentReceiver = 0; + + //locker.unlock(); + + debugSystemState(); + emit systemStateChanged(this, m_systemError, m_hwInterface, m_serverMode, m_dataEngineState); +} + +QSDR::_ServerMode Settings::getCurrentServerMode() { + + return m_serverMode; +} + +QSDR::_HWInterfaceMode Settings::getHWInterface() { + + return m_hwInterface; +} + +QSDR::_DataEngineState Settings::getDataEngineState() { + + return m_dataEngineState; +} + +QString Settings::getErrorString(QSDR::_Error err) { + + QString str; + switch (err) { + + case 0: + str = "No error"; + break; + + case 1: + str = "Not implemented"; + break; + + case 2: + str = "Hardware IO error"; + break; + + case 3: + str = "Server mode error"; + break; + + case 4: + str = "open device error"; + break; + + case 5: + str = "dataReceiverThread error"; + break; + + case 6: + str = "dataProcessThread error"; + break; + + case 7: + str = "widebandDataProcessThread error"; + break; + + case 8: + str = "audioThread error"; + break; + + case 9: + str = "ChirpDataProcessThread error"; + break; + + case 10: + str = "underrun error"; + break; + + case 11: + str = "firmware error"; + break; + + case 12: + str = "fatal error"; + break; + } + return str; +} + +QString Settings::getHDataEngineStateString(QSDR::_DataEngineState mode) { + + QString str; + switch (mode) { + + case 0: + str = "down"; + break; + + case 1: + str = "up"; + break; + } + return str; +} + +QString Settings::getServerModeString(QSDR::_ServerMode mode) { + + QString str; + switch (mode) { + + case 0: + str = "no server mode"; + break; + + case 1: + str = "SDR mode"; + break; + + case 2: + str = "ChirpWSPR"; + break; + + case 3: + str = "ChirpWSPRFile"; + break; + + case 4: + str = "demo"; + break; + } + return str; +} + +QString Settings::getHWInterfaceModeString(QSDR::_HWInterfaceMode mode) { + + QString str; + switch (mode) { + + case 0: + str = "no interface"; + break; + + case 1: + str = "Metis"; + break; + + case 2: + str = "Hermes"; + break; + } + return str; +} + +void Settings::setTxAllowed(QObject *sender, bool value) { + + if (m_devices.penelopePresence || m_devices.pennylanePresence || (m_hwInterface == QSDR::Hermes)) + m_transmitter.txAllowed = value; + else + m_transmitter.txAllowed = false; + + emit txAllowedChanged(sender, m_transmitter.txAllowed); +} + +bool Settings::getTxAllowed() { + + return m_transmitter.txAllowed; +} + +void Settings::setGraphicsState( + + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode) +{ + Q_UNUSED (sender) + + //QMutexLocker locker(&settingsMutex); + + if (rx == -1) { + + m_widebandOptions.panMode = panMode; + } + else { + + m_receiverDataList[rx].panMode = panMode; + m_receiverDataList[rx].waterfallMode = waterfallColorMode; + } + + //locker.unlock(); + + //SETTINGS_DEBUG << "graphics mode:" << panMode << waterfallColorMode; + emit graphicModeChanged(this, rx, panMode, waterfallColorMode); +} + +PanGraphicsMode Settings::getPanadapterMode(int rx) { + + return m_receiverDataList[rx].panMode; +} + +WaterfallColorMode Settings::getWaterfallColorMode(int rx) { + + return m_receiverDataList.at(rx).waterfallMode; +} + +//QSDRGraphics::_Colors Settings::getColorItem() { +// +// return m_colorItem; +//} + +void Settings::setDefaultSkin(QObject *sender, bool value) { + + Q_UNUSED (sender) + + m_defaultSkin = value; +} + +bool Settings::getDefaultSkin() { + + return m_defaultSkin; +} + +void Settings::setSettingsFilename(QString filename) { + + filename = filename.trimmed(); + + //QMutexLocker locker(&settingsMutex); + + settingsFilename = filename; + //locker.unlock(); + + emit settingsFilenameChanged(filename); +} + +void Settings::setSettingsLoaded(bool value) { + + QMutexLocker locker(&settingsMutex); + + setLoaded = value; + + locker.unlock(); + + emit settingsLoadedChanged(setLoaded); +} + +bool Settings::getSettingsLoaded() { + + return setLoaded; +} + +void Settings::setCPULoad(short load) { + + emit cpuLoadChanged(load); +} + +void Settings::setCallsign(const QString &callsign) { + + QString cs = callsign.trimmed(); + + QMutexLocker locker(&settingsMutex); + + if (m_callsignString == cs) return; + + m_callsignString = cs; + + locker.unlock(); + emit callsignChanged(); +} + +void Settings::setRxList(QList rxList) { + + emit rxListChanged(rxList); +} + +void Settings::setMultiRxView(int view) { + + QMutexLocker locker(&settingsMutex); + + if (m_multiRxView == view) return; + m_multiRxView = view; + + locker.unlock(); + emit multiRxViewChanged(m_multiRxView); +} + +int Settings::getMultiRxView() { + + return m_multiRxView; +} + +void Settings::setMetisCardList(QList list) { + + QMutexLocker locker(&settingsMutex); + + m_metisCards = list; + + locker.unlock(); + emit metisCardListChanged(m_metisCards); +} + +void Settings::searchHpsdrNetworkDevices() { + + emit searchMetisSignal(); +} + +void Settings::clearMetisCardList() { + + m_metisCards.clear(); + + //emit metisCardListChanged(m_metisCards); +} + +void Settings::setCurrentHPSDRDevice(TNetworkDevicecard card) { + + m_currentHPSDRDevice = card; + + emit hpsdrNetworkDeviceChanged(m_currentHPSDRDevice); +} + +void Settings::setHPSDRDeviceNumber(int value) { + + m_hpsdrNetworkDevices = value; + emit networkDeviceNumberChanged(value); +} + +void Settings::showNetworkIODialog() { + + emit showNetworkIO(); +} + +void Settings::showWarningDialog(const QString &msg) { + + emit showWarning(msg); +} + +void Settings::addNetworkIOComboBoxEntry(QString str) { + + emit networkIOComboBoxEntryAdded(str); +} + +void Settings::clearNetworkIOComboBoxEntry() { + + emit clearNetworkIOComboBoxEntrySignal(); +} + +void Settings::setPBOPresence(bool value) { + + m_pboFound = value; +} + +bool Settings::getPBOPresence() { + + return m_pboFound; +} + +void Settings::setFBOPresence(bool value) { + + m_fboFound = value; +} + +bool Settings::getFBOPresence() { + + return m_fboFound; +} + +//******************************* +// Network settings + +void Settings::setNumberOfNetworkInterfaces(int value) { + + m_NetworkInterfacesNo = value; +} + +void Settings::addServerNetworkInterface(QString nicName, QString ipAddress) { + + emit newServerNetworkInterface(nicName, ipAddress); +} + +void Settings::addHPSDRDeviceNIC(QString nicName, QString ipAddress) { + + emit newHPSDRDeviceNIC(nicName, ipAddress); +} + +void Settings::setServerNetworkInterface(int index) { + + setServerAddr(this, this->m_ipAddressesList.at(index).toString()); + + //qDebug() << "m_networkInterfaces.at(index).humanReadableName():" << m_networkInterfaces.at(index).humanReadableName(); + //qDebug() << "m_ipAddressesList.at(index).toString():" << m_ipAddressesList.at(index).toString(); + + QString message = "[settings]: network interface set to: %1 (%2)."; + /*emit messageEvent( + message.arg( + m_networkInterfaces.at(index).humanReadableName(), + m_ipAddressesList.at(index).toString() ));*/ + +} + +void Settings::setHPSDRDeviceNIC(int index) { + + setHPSDRDeviceLocalAddr(this, this->m_ipAddressesList.at(index).toString()); + + QString message = "[settings]: HPSDR device network interface set to: %1 (%2)."; + /*emit messageEvent( + message.arg( + m_networkInterfaces.at(index).humanReadableName(), + m_ipAddressesList.at(index).toString() ));*/ + +} + +void Settings::setServerWidgetNIC(int index) { + + /*QString message = "[server]: network interface set to: %1 (%2)."; + emit messageEvent( + message.arg( + m_networkInterfaces.at(index).humanReadableName(), + m_ipAddressesList.at(index).toString() ));*/ + + emit serverNICChanged(index); +} + +void Settings::setHPSDRWidgetNIC(int index) { + + /*QString message = "[server]: HPSDR device network interface set to: %1 (%2)."; + emit messageEvent( + message.arg( + m_networkInterfaces.at(index).humanReadableName(), + m_ipAddressesList.at(index).toString() ));*/ + + emit hpsdrDeviceNICChanged(index); +} + +void Settings::setServerAddr(QObject *sender, QString addr) { + + QMutexLocker locker(&settingsMutex); + + m_serverAddress = addr; + + locker.unlock(); + emit serverAddrChanged(sender, m_serverAddress); +} + +QString Settings::getServerAddr() { + + return m_serverAddress; +} + +void Settings::setHPSDRDeviceLocalAddr(QObject *sender, QString addr) { + + QMutexLocker locker(&settingsMutex); + + m_hpsdrDeviceLocalAddr = addr; + + locker.unlock(); + emit hpsdrDeviceLocalAddrChanged(sender, m_hpsdrDeviceLocalAddr); +} + +QString Settings::getHPSDRDeviceLocalAddr() { + + return m_hpsdrDeviceLocalAddr; +} + +void Settings::setServerPort(QObject *sender, quint16 port) { + + QMutexLocker locker(&settingsMutex); + + m_serverPort = port; + + locker.unlock(); + emit serverPortChanged(sender, m_serverPort); +} + +quint16 Settings::getServerPort() { + + return m_serverPort; +} + +void Settings::setListenPort(QObject *sender, quint16 port) { + + QMutexLocker locker(&settingsMutex); + + m_listenerPort = port; + + locker.unlock(); + emit listenPortChanged(sender, m_listenerPort); +} + +quint16 Settings::getListenPort() { + + return m_listenerPort; +} + +void Settings::setAudioPort(QObject *sender, quint16 port) { + + QMutexLocker locker(&settingsMutex); + m_audioPort = port; + locker.unlock(); + + emit audioPortChanged(sender, m_audioPort); +} + +quint16 Settings::getAudioPort() { + + return m_audioPort; +} + +void Settings::setMetisPort(QObject *sender, quint16 port) { + + QMutexLocker locker(&settingsMutex); + m_metisPort = port; + locker.unlock(); + + emit metisPortChanged(sender, m_metisPort); +} + +quint16 Settings::getMetisPort() { + + return m_metisPort; +} + +void Settings::setClientConnected(QObject *sender, bool value) { + + QMutexLocker locker(&settingsMutex); + m_clientConnected = value; + locker.unlock(); + + emit clientConnectedChanged(sender, m_clientConnected); +} + +bool Settings::getClientConnected() { + + return m_clientConnected; +} + +void Settings::setClientNoConnected(QObject* sender, int client) { + + QMutexLocker locker(&settingsMutex); + m_clientNoConnected = client; + locker.unlock(); + + emit clientNoConnectedChanged(sender, m_clientNoConnected); +} + +void Settings::setAudioRx(QObject* sender, int rx) { + + emit audioRxChanged(sender, rx); +} + +void Settings::setConnected(QObject *sender, bool value) { + + QMutexLocker locker(&settingsMutex); + m_connected = value; + locker.unlock(); + + emit connectedChanged(sender, m_connected); +} + +bool Settings::getConnected() { + + return m_connected; +} + +void Settings::clientDisconnected(int client) { + + emit clientDisconnectedEvent(client); +} + +void Settings::setRxConnectedStatus(QObject* sender, int rx, bool value) { + + emit rxConnectedStatusChanged(sender, rx, value); +} + +void Settings::setSocketBufferSize(QObject *sender, int value) { + + m_socketBufferSize = value; + //SETTINGS_DEBUG << "m_socketBufferSize = " << value; + emit socketBufferSizeChanged(sender, value); +} + +void Settings::setManualSocketBufferSize(QObject *sender, bool value) { + + m_manualSocketBufferSize = value; + //SETTINGS_DEBUG << "m_manualSocketBufferSize = " << value; + emit manualSocketBufferChanged(sender, m_manualSocketBufferSize); +} + + +//******************************* +// HPSDR hardware presence and firmware versions + +THPSDRDevices Settings::getHPSDRDevices() { + + return m_devices; +} + +void Settings::setHPSDRDevices(QObject *sender, THPSDRDevices devices) { + + Q_UNUSED(sender) + Q_UNUSED(devices) +} + +void Settings::checkHPSDRDevices() { + + SETTINGS_DEBUG << "mercuryPresence: " << m_devices.mercuryPresence; + SETTINGS_DEBUG << "penelopePresence: " << m_devices.penelopePresence; + SETTINGS_DEBUG << "pennylanePresence: " << m_devices.pennylanePresence; + SETTINGS_DEBUG << "excaliburPresence: " << m_devices.excaliburPresence; + SETTINGS_DEBUG << "alexPresence: " << m_devices.alexPresence; + SETTINGS_DEBUG << "hermesPresence: " << m_devices.hermesPresence; + + if (m_hpsdrHardware == 0) { // 0 = Mercury/Penelope + + if (m_devices.penelopePresence && m_devices.pennylanePresence) { + + m_devices.pennylanePresence = false; + m_devices.penelopePresence = true; + SETTINGS_DEBUG << "settings specifies both Penelope and Pennylane - choosing Penelope !"; + } + + if (m_devices.hermesPresence) { + + m_devices.hermesPresence = false; + SETTINGS_DEBUG << "settings specifies also Hermes - choosing Mercury/Penelope/Pennylane !"; + } + } + else if (m_hpsdrHardware == 1) { // 1 = Hermes + + if (m_devices.mercuryPresence || + m_devices.penelopePresence || + m_devices.pennylanePresence || + m_devices.excaliburPresence) + { + m_devices.mercuryPresence = false; + m_devices.penelopePresence = false; + m_devices.pennylanePresence = false; + m_devices.excaliburPresence = false; + SETTINGS_DEBUG << "settings specifies HPSDR Modules - choosing Hermes !"; + } + } +} + + +void Settings::setHPSDRHardware(int value) { + + m_hpsdrHardware = value; // 0 = Mercury/Penelope, 1 = Hermes, 2 = Cyclops + + emit hpsdrHardwareChanged(m_hpsdrHardware); +} + +void Settings::setHermesVersion(int value) { + + QMutexLocker locker(&settingsMutex); + m_devices.hermesFWVersion = value; + locker.unlock(); + + emit hermesVersionChanged(m_devices.hermesFWVersion); +} + +void Settings::setMercuryPresence(bool value) { + + m_devices.mercuryPresence = value; + + emit mercuryPresenceChanged(m_devices.mercuryPresence); +} + +void Settings::setMercuryVersion(int value) { + + QMutexLocker locker(&settingsMutex); + m_devices.mercuryFWVersion = value; + locker.unlock(); + + emit mercuryVersionChanged(m_devices.mercuryFWVersion); +} + +void Settings::setPenelopePresence(bool value) { + + m_devices.penelopePresence = value; + setTxAllowed(this, value); + + emit penelopePresenceChanged(m_devices.penelopePresence); +} + +void Settings::setPenelopeVersion(int value) { + + QMutexLocker locker(&settingsMutex); + m_devices.penelopeFWVersion = value; + locker.unlock(); + + emit penelopeVersionChanged(m_devices.penelopeFWVersion); +} + +void Settings::setPennyLanePresence(bool value) { + + m_devices.pennylanePresence = value; + setTxAllowed(this, value); + + emit pennyLanePresenceChanged(m_devices.pennylanePresence); +} + +void Settings::setPennyLaneVersion(int value) { + + QMutexLocker locker(&settingsMutex); + m_devices.pennylaneFWVersion = value; + locker.unlock(); + + emit pennyLaneVersionChanged(m_devices.pennylaneFWVersion); +} + +void Settings::setAlexPresence(bool value) { + + m_devices.alexPresence = value; + + emit alexPresenceChanged(m_devices.alexPresence); +} + +void Settings::setExcaliburPresence(bool value) { + + m_devices.excaliburPresence = value; + + emit excaliburPresenceChanged(m_devices.excaliburPresence); +} + +void Settings::setMetisVersion(int value) { + + QMutexLocker locker(&settingsMutex); + m_devices.metisFWVersion = value; + locker.unlock(); + + emit metisVersionChanged(m_devices.metisFWVersion); +} + +void Settings::setCheckFirmwareVersion(QObject *sender, bool value) { + + m_checkFirmwareVersions = value; + + emit checkFirmwareVersionChanged(sender, value); +} + +void Settings::setProtocolSync(int value) { + + emit protocolSyncChanged(value); +} + +void Settings::setADCOverflow(int value) { + + emit adcOverflowChanged(value); +} + +void Settings::setPacketLoss(int value) { + + emit packetLossChanged(value); +} + +void Settings::setSendIQ(int value) { + + emit sendIQSignalChanged(value); +} + +void Settings::setRcveIQ(int value) { + + emit rcveIQSignalChanged(value); +} + +/** + * Set the number of receivers to be supported by this server + * \param r The number of receivers: 0 to 6 + * This value is embedded into the command & control bytes that are sent to Mercury. + * Thus it determines how the I & Q samples read from EP6 are placed in the data stream to dspservers. + */ +void Settings::setReceivers(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_mercuryReceivers == value) return; + if (value > MAX_RECEIVERS) value = MAX_RECEIVERS; + + m_mercuryReceivers = value; + locker.unlock(); + + SETTINGS_DEBUG << "set number of receivers to: " << m_mercuryReceivers; + emit numberOfRXChanged(sender, value); +} + +//void Settings::setReceiver(QObject *sender, int value) { +// +// QMutexLocker locker(&settingsMutex); +// +// if (m_currentReceiver == value) return; +// if (value > MAX_RECEIVERS) value = MAX_RECEIVERS; +// +// m_currentReceiver = value; +// locker.unlock(); +// +// SETTINGS_DEBUG << "switch to receiver: " << m_currentReceiver; +// emit receiverChanged(value); +// emit frequencyChanged(this, true, value, m_receiverDataList[value].frequency); +//} + +void Settings::setCurrentReceiver(QObject *sender, int value) { + + //SETTINGS_DEBUG << "sender: " << sender; + QMutexLocker locker(&settingsMutex); + + if (value > MAX_RECEIVERS) { + + SETTINGS_DEBUG << "receiver number > MAX_RECEIVERS; setting to MAX_RECEIVERS."; + value = MAX_RECEIVERS; + } + + m_currentReceiver = value; + + HamBand band = m_receiverDataList.at(m_currentReceiver).hamBand; + DSPMode mode = m_receiverDataList.at(m_currentReceiver).dspModeList[band]; + locker.unlock(); + + setMercuryAttenuator(this, m_receiverDataList.at(m_currentReceiver).mercuryAttenuators.at(band)); + setFramesPerSecond(this, m_currentReceiver, m_receiverDataList.at(m_currentReceiver).framesPerSecond); + + SETTINGS_DEBUG << "switch to receiver: " << m_currentReceiver; + emit currentReceiverChanged(sender, value); + //emit frequencyChanged(sender, true, value, m_receiverDataList.at(m_currentReceiver).frequency); + long vfoF = m_receiverDataList.at(m_currentReceiver).vfoFrequency; + long ctrF = m_receiverDataList.at(m_currentReceiver).ctrFrequency; + + emit ctrFrequencyChanged(sender, true, value, ctrF); + emit vfoFrequencyChanged(sender, true, value, vfoF); + emit ncoFrequencyChanged(m_currentReceiver, vfoF - ctrF); + emit hamBandChanged(sender, m_currentReceiver, false, band); + emit dspModeChanged(sender, m_currentReceiver, mode); + emit mouseWheelFreqStepChanged(sender, m_currentReceiver, m_receiverDataList.at(m_currentReceiver).mouseWheelFreqStep); +} + +void Settings::setSampleRate(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + + switch (value) { + + case 48000: + m_sampleRate = value; + m_mercurySpeed = 0; + m_outputSampleIncrement = 1; + m_chirpDownSampleRate = 4; + break; + + case 96000: + m_sampleRate = value; + m_mercurySpeed = 1; + m_outputSampleIncrement = 2; + m_chirpDownSampleRate = 8; + break; + + case 192000: + m_sampleRate = value; + m_mercurySpeed = 2; + m_outputSampleIncrement = 4; + m_chirpDownSampleRate = 16; + break; + + case 384000: + m_sampleRate = value; + m_mercurySpeed = 3; + m_outputSampleIncrement = 8; + m_chirpDownSampleRate = 32; + break; + + default: + SETTINGS_DEBUG << "Invalid sample rate (must be 48, 96,192, or 384 kHz)!\n"; + break; + } + + for (int i = 0; i < MAX_RECEIVERS; i++) + m_receiverDataList[i].sampleRate = m_sampleRate; + + emit sampleRateChanged(sender, value); +} + +void Settings::setMercuryAttenuator(QObject *sender, int value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(m_currentReceiver).mercuryAttenuators.length() != MAX_BANDS) + return; + + HamBand band = m_receiverDataList[m_currentReceiver].hamBand; + m_receiverDataList[m_currentReceiver].mercuryAttenuators[band] = value; + + emit mercuryAttenuatorChanged(sender, band, value); +} + +QList Settings::getMercuryAttenuators(int rx) { + + return m_receiverDataList[rx].mercuryAttenuators; +} + +void Settings::setDither(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + m_mercuryDither = value; + + emit ditherChanged(sender, value); +} + +void Settings::setRandom(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + m_mercuryRandom = value; + + emit randomChanged(sender, value); +} + +void Settings::set10MhzSource(QObject *sender, int source) { + + QMutexLocker locker(&settingsMutex); + + m_10MHzSource = source; + emit src10MhzChanged(sender, source); +} + +void Settings::set122_88MhzSource(QObject *sender, int source) { + + QMutexLocker locker(&settingsMutex); + + m_122_8MHzSource = source; + emit src122_88MhzChanged(sender, source); +} + +void Settings::setMicSource(QObject *sender, int source) { + + QMutexLocker locker(&settingsMutex); + + m_micSource = source; + emit micSourceChanged(sender, source); +} + +void Settings::setClass(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + + m_RxClass = value; + emit classChanged(sender, value); +} + +void Settings::setTiming(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + + m_RxTiming = value; + emit timingChanged(sender, value); +} + +void Settings::setMouseWheelFreqStep(QObject *sender, int rx, qreal value) { + + QMutexLocker locker(&settingsMutex); + + //m_mouseWheelFreqStep = value; + m_receiverDataList[rx].mouseWheelFreqStep = value; + emit mouseWheelFreqStepChanged(sender, rx, value); +} + +double Settings::getMouseWheelFreqStep(int rx) { + + return m_receiverDataList[rx].mouseWheelFreqStep; +} + +qreal Settings::getMainVolume(int rx) { + + return m_receiverDataList[rx].audioVolume; +} + +void Settings::setMainVolume(QObject *sender, int rx, float volume) { + + if (volume < 0) volume = 0.0f; + if (volume > 1) volume = 1.0f; + + QMutexLocker locker(&settingsMutex); + + //if (m_receiverDataList[rx].audioVolume == volume) return; + m_receiverDataList[rx].audioVolume = volume; + + emit mainVolumeChanged(sender, rx, volume); +} + +void Settings::setMainVolumeMute(QObject *sender, int rx, bool value) { + + Q_UNUSED(sender) + Q_UNUSED(value) + + qreal vol = getMainVolume(rx); + if (value) + setMainVolume(this, rx, 0.0f); + else + setMainVolume(this, rx, vol); +} + +void Settings::setCtrFrequency(int rx, long frequency) { + + QMutexLocker locker(&settingsMutex); + + HamBand band = getBandFromFrequency(m_bandList, frequency); + + m_receiverDataList[rx].ctrFrequency = frequency; + //m_receiverDataList[rx].hamBand = band; + //m_receiverDataList[rx].lastHamBand = band; + m_receiverDataList[rx].lastCenterFrequencyList[(int) band] = frequency; +} + +void Settings::setVfoFrequency(int rx, long frequency) { + + QMutexLocker locker(&settingsMutex); + + HamBand band = getBandFromFrequency(m_bandList, frequency); + + m_receiverDataList[rx].vfoFrequency = frequency; + m_receiverDataList[rx].hamBand = band; + m_receiverDataList[rx].lastHamBand = band; + m_receiverDataList[rx].lastVfoFrequencyList[(int) band] = frequency; + + m_receiverDataList[rx].ncoFrequency = frequency - m_receiverDataList.at(rx).ctrFrequency; +} + +void Settings::setCtrFrequency(QObject *sender, int mode, int rx, long frequency) { + + QMutexLocker locker(&settingsMutex); + m_receiverDataList[rx].ctrFrequency = frequency; + + HamBand band = getBandFromFrequency(m_bandList, frequency); + m_receiverDataList[rx].lastCenterFrequencyList[(int) band] = frequency; + locker.unlock(); + + switch (mode) { + + case 0: + break; + + case 1: + + setVFOFrequency(this, 0, rx, frequency); + break; + } + + //SETTINGS_DEBUG << "ctr freq (Rx " << rx << ") " << m_receiverDataList[rx].ctrFrequency; + emit ctrFrequencyChanged(sender, mode, rx, frequency); +} + +long Settings::getCtrFrequency(int rx) { + + return m_receiverDataList.at(rx).ctrFrequency; +} + +void Settings::setVFOFrequency(QObject *sender, int mode, int rx, long frequency) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).vfoFrequency == frequency) return; + m_receiverDataList[rx].vfoFrequency = frequency; + //SETTINGS_DEBUG << "vfo freq (Rx " << rx << ") " << m_receiverDataList[rx].vfoFrequency; + + HamBand band = getBandFromFrequency(m_bandList, frequency); + m_receiverDataList[rx].lastVfoFrequencyList[(int) band] = frequency; + + locker.unlock(); + if (m_receiverDataList.at(rx).hamBand != band) { + + //m_receiverDataList[rx].ctrFrequency = m_receiverDataList[rx].vfoFrequency; + setHamBand(this, rx, false, band); + } + + switch (mode) { + + case 0: // change only VFO + + m_receiverDataList[rx].ncoFrequency = frequency - m_receiverDataList.at(rx).ctrFrequency; + //SETTINGS_DEBUG << "nco freq = " << m_receiverDataList[rx].ncoFrequency; + break; + + case 1: // change VFO and center freq; keep NCO frequency + + setCtrFrequency(this, 0, rx, frequency - m_receiverDataList.at(rx).ncoFrequency); + break; + + case 2: // change VFO, set center frequency from lastCenterFrequencyList + + setCtrFrequency(this, 0, rx, m_receiverDataList.at(rx).lastCenterFrequencyList.at((int) band)); + m_receiverDataList[rx].ncoFrequency = frequency - m_receiverDataList.at(rx).ctrFrequency; + break; + } + + emit vfoFrequencyChanged(sender, mode, rx, frequency); + + //SETTINGS_DEBUG << "nco freq (Rx " << rx << ") " << m_receiverDataList[rx].ncoFrequency; + emit ncoFrequencyChanged(rx, m_receiverDataList[rx].ncoFrequency); +} + +long Settings::getVfoFrequency(int rx) { + + return m_receiverDataList.at(rx).vfoFrequency; +} + +void Settings::setNCOFrequency(QObject *sender, bool value, int rx, long frequency) { + + Q_UNUSED(sender) + Q_UNUSED(value) + + //SETTINGS_DEBUG << "nco freq (Rx " << rx << ") " << m_receiverDataList[rx].ncoFrequency << "(direct)"; + m_receiverDataList[rx].ncoFrequency = frequency; + + emit ncoFrequencyChanged(rx, frequency); +} + +void Settings::setHamBand(QObject *sender, int rx, bool byButton, HamBand band) { + + //SETTINGS_DEBUG << "sender: " << sender; + QMutexLocker locker(&settingsMutex); + if (m_receiverDataList[rx].hamBand == band && sender != this) + return; + + m_receiverDataList[rx].lastHamBand = m_receiverDataList[rx].hamBand; + m_receiverDataList[rx].hamBand = band; + + //SETTINGS_DEBUG << "last Ham band: " << m_receiverDataList[rx].lastHamBand; + //SETTINGS_DEBUG << "Ham band: " << m_receiverDataList[rx].hamBand; + + if (m_receiverDataList[rx].hamBand == (HamBand) gen) + setTxAllowed(this, false); + else + setTxAllowed(this, true); + + locker.unlock(); + + setDSPMode(this, rx, m_receiverDataList.at(rx).dspModeList.at(band)); + setMercuryAttenuator(this, m_receiverDataList[rx].mercuryAttenuators[band]); + + emit hamBandChanged(sender, rx, byButton, band); +} + +HamBand Settings::getCurrentHamBand(int rx) { + + return m_receiverDataList[rx].hamBand; +} + +void Settings::setDSPMode(QObject *sender, int rx, DSPMode mode) { + + //SETTINGS_DEBUG << "sender: " << sender; + HamBand band = m_receiverDataList[m_currentReceiver].hamBand; + + m_receiverDataList[rx].dspModeList[band] = mode; + setRXFilter(this, rx, m_defaultFilterList.at((int) mode).filterLo, m_defaultFilterList.at((int) mode).filterHi); + + emit dspModeChanged(sender, rx, mode); +} + +AGCMode Settings::getAGCMode(int rx) { + + return m_receiverDataList.at(rx).agcMode; +} + +QString Settings::getAGCModeString(int rx) { + + AGCMode mode = getAGCMode(rx); + QString str; + switch (mode) { + + case (AGCMode) agcOFF: + str = "Off"; + break; + + case (AGCMode) agcLONG: + str = "Long"; + break; + + case (AGCMode) agcSLOW: + str = "Slow"; + break; + + case (AGCMode) agcMED: + str = "Med"; + break; + + case (AGCMode) agcFAST: + str = "Fast"; + break; + + case (AGCMode) agcUser: + str = "User"; + break; + } + return str; +} + +void Settings::setAGCMode(QObject *sender, int rx, AGCMode mode) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].agcMode == mode) return; + m_receiverDataList[rx].agcMode = mode; + + bool hang; + if (mode == (AGCMode) agcOFF || mode == (AGCMode) agcMED || mode == (AGCMode) agcFAST) { + + m_receiverDataList[rx].hangEnabled = false; + hang = false; + if (mode == (AGCMode) agcOFF) + emit agcFixedGainChanged_dB(sender, rx, m_receiverDataList[rx].agcFixedGain_dB); + } + else { + + m_receiverDataList[rx].hangEnabled = true; + hang = true; + } + + emit agcModeChanged(sender, rx, mode, hang); + emit agcHangEnabledChanged(sender, rx, hang); +} + +void Settings::setAGCShowLines(QObject *sender, int rx, bool value) { + + if (m_receiverDataList[rx].agcLines == value) return; + m_receiverDataList[rx].agcLines = value; + + emit showAGCLinesStatusChanged(sender, m_receiverDataList[rx].agcLines, rx); +} + +int Settings::getAGCGain(int rx) { + + return m_receiverDataList[rx].acgGain; +} + +void Settings::setAGCGain(QObject *sender, int rx, int value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].acgGain == value) return; + m_receiverDataList[rx].acgGain = value; + //SETTINGS_DEBUG << "acgGain " << value; + emit agcGainChanged(sender, rx, value); +} + +void Settings::setAGCMaximumGain_dB(QObject *sender, int rx, qreal value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].agcMaximumGain_dB == value) return; + m_receiverDataList[rx].agcMaximumGain_dB = value; + + //SETTINGS_DEBUG << "agcMaximumGain_dB = " << m_receiverDataList[rx].agcMaximumGain_dB << " (sender: " << sender << ")"; + emit agcMaximumGainChanged_dB(sender, rx, value); +} + +qreal Settings::getAGCMaximumGain_dB(int rx) { + + return m_receiverDataList[rx].agcMaximumGain_dB; +} + +void Settings::setAGCFixedGain_dB(QObject *sender, int rx, qreal value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].agcFixedGain_dB == value) return; + m_receiverDataList[rx].agcFixedGain_dB = value; + + //SETTINGS_DEBUG << "m_receiverDataList[rx].agcFixedGain_dB = " << m_receiverDataList[rx].agcFixedGain_dB; + emit agcFixedGainChanged_dB(sender, rx, value); +} + +qreal Settings::getAGCFixedGain_dB(int rx) { + + return m_receiverDataList[rx].agcFixedGain_dB; +} + +void Settings::setAGCThreshold_dB(QObject *sender, int rx, qreal value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].acgThreshold_dB == value) return; + m_receiverDataList[rx].acgThreshold_dB = value; + + //SETTINGS_DEBUG << "acgThreshold = " << m_receiverDataList[rx].acgThreshold; + emit agcThresholdChanged_dB(sender, rx, value); +} + +void Settings::setAGCHangThresholdSlider(QObject *sender, int rx, qreal value) { + + emit agcHangThresholdSliderChanged(sender, rx, value); +} + +int Settings::getAGCHangThreshold(int rx) { + + return m_receiverDataList[rx].agcHangThreshold; +} + +void Settings::setAGCHangThreshold(QObject *sender, int rx, int value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].agcHangThreshold == value) return; + m_receiverDataList[rx].agcHangThreshold = value; + + //SETTINGS_DEBUG << "agcHangThreshold = " << m_receiverDataList[rx].agcHangThreshold; + emit agcHangThresholdChanged(sender, rx, value); +} + +int Settings::getAGCHangLeveldB(int rx) { + + return m_receiverDataList[rx].agcHangThreshold; +} + +void Settings::setAGCHangLevel_dB(QObject *sender, int rx, qreal value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].agcHangLevel == value) return; + m_receiverDataList[rx].agcHangLevel = value; + + //SETTINGS_DEBUG << "agcHangLevel = " << m_receiverDataList[rx].agcHangLevel; + emit agcHangLevelChanged_dB(sender, rx, value); +} + +void Settings::setAGCLineLevels(QObject *sender, int rx, qreal thresh, qreal hang) { + + if (m_currentReceiver != rx) return; + + m_receiverDataList[rx].agcHangLevel = hang; + //SETTINGS_DEBUG << "agcHangLevel = " << m_receiverDataList[rx].agcHangLevel; + + emit agcLineLevelsChanged(sender, rx, thresh, hang); +} + +void Settings::setAGCVariableGain_dB(QObject *sender, int rx, qreal value) { + + if (m_currentReceiver != rx) return; + + if (m_receiverDataList[rx].agcVariableGain == value) return; + m_receiverDataList[rx].agcVariableGain = value; + + SETTINGS_DEBUG << "agcVariableGain = " << m_receiverDataList[rx].agcVariableGain; + emit agcVariableGainChanged_dB(sender, rx, value); +} + +void Settings::setAGCAttackTime(QObject *sender, int rx, qreal value) { + + if (m_currentReceiver != rx) return; + + if (m_receiverDataList[rx].agcAttackTime == value) return; + m_receiverDataList[rx].agcAttackTime = value; + + SETTINGS_DEBUG << "agcAttackTime = " << m_receiverDataList[rx].agcAttackTime; + emit agcAttackTimeChanged(sender, rx, value); +} + +void Settings::setAGCDecayTime(QObject *sender, int rx, qreal value) { + + if (m_currentReceiver != rx) return; + + if (m_receiverDataList[rx].agcDecayTime == value) return; + m_receiverDataList[rx].agcDecayTime = value; + + SETTINGS_DEBUG << "agcDecayTime = " << m_receiverDataList[rx].agcDecayTime; + emit agcDecayTimeChanged(sender, rx, value); +} + +void Settings::setAGCHangTime(QObject *sender, int rx, qreal value) { + + if (m_currentReceiver != rx) return; + + if (m_receiverDataList[rx].agcHangTime == value) return; + m_receiverDataList[rx].agcHangTime = value; + + SETTINGS_DEBUG << "agcHangTime = " << m_receiverDataList[rx].agcHangTime; + emit agcHangTimeChanged(sender, rx, value); +} + +void Settings::setRXFilter(QObject *sender, int rx, qreal low, qreal high) { + + QMutexLocker locker(&settingsMutex); + + if (m_filterFrequencyLow == low && m_filterFrequencyHigh == high) return; + + m_filterFrequencyLow = low; + m_filterFrequencyHigh = high; + m_receiverDataList[rx].filterLo = low; + m_receiverDataList[rx].filterHi = high; + + emit filterFrequenciesChanged(sender, rx, m_filterFrequencyLow, m_filterFrequencyHigh); +} + +void Settings::setIQPort(QObject *sender, int rx, int port) { + + emit iqPortChanged(sender, rx, port); +} + +void Settings::setSpectrumBuffer(int rx, const qVectorFloat& buffer) { + + emit spectrumBufferChanged(rx, buffer); +} + +void Settings::setPostSpectrumBuffer(int rx, const float* buffer) { + + emit postSpectrumBufferChanged(rx, buffer); +} + +void Settings::setSMeterValue(int rx, float value) { + + emit sMeterValueChanged(rx, value); +} + +void Settings::setReceiverDataReady() { + + emit receiverDataReady(); +} + +void Settings::setSampleSize(QObject* sender, int rx, int size) { + + Q_UNUSED (sender) + + /*if (rx == 0) { + + SETTINGS_DEBUG << "set sample size to: " << size; + switch (size) { + + case 4096: + m_fft = 1; + break; + + case 8192: + m_fft = 2; + break; + + case 16384: + m_fft = 4; + break; + + case 32768: + m_fft = 8; + break; + + case 65536: + m_fft = 16; + break; + + case 131072: + m_fft = 32; + break; + + case 262144: + m_fft = 64; + break; + } + + emit sampleSizeChanged(0, size); + }*/ + + SETTINGS_DEBUG << "set sample size to: " << size << " for Rx " << rx; + switch (size) { + + case 4096: + m_receiverDataList[rx].fftFactor = 1; + break; + + case 8192: + m_receiverDataList[rx].fftFactor = 2; + break; + + case 16384: + m_receiverDataList[rx].fftFactor = 4; + break; + + case 32768: + m_receiverDataList[rx].fftFactor = 8; + break; + + case 65536: + m_receiverDataList[rx].fftFactor = 16; + break; + + case 131072: + m_receiverDataList[rx].fftFactor = 32; + break; + + case 262144: + m_receiverDataList[rx].fftFactor = 64; + break; + } + + emit sampleSizeChanged(rx, size); +} + +int Settings::getFFTMultiplicator(int rx) { + + return m_receiverDataList.at(rx).fftFactor; +} + +// Alex configuration: +// +// manual 0 +// bypassAll 1 +// amp6m 2 +// hpf1_5MHz 3 +// hpf6_5MHz 4 +// hpf9_5MHz 5 +// hpf13MHz 6 +// hpf20MHz 7 +// lpf160m 8 +// lpf80m 9 +// lpf60_40m 10 +// lpf30_20m 11 +// lpf17_15m 12 +// lpf12_10m 13 +// lpf6m 14 + +// m_alexConfig (qint16) +// +// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +// | | | | | | | | | | | | | | | +// | | | | | | | | | | | | | | +-----Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) +// | | | | | | | | | | | | | +------ Alex - Bypass all HPFs (0 = disable, 1 = enable)* +// | | | | | | | | | | | | +-------- Alex - 6M low noise amplifier (0 = disable, 1 = enable)* +// | | | | | | | | | | | +---------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* +// | | | | | | | | | | +------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* +// | | | | | | | | | +-------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* +// | | | | | | | | +---------------- Alex - select 13MHz HPF (0 = disable, 1 = enable)* +// | | | | | | | +------------------ Alex - select 20MHz HPF (0 = disable, 1 = enable)* +// | | | | | | +-------------------- Alex - select 160m LPF (0 = disable, 1 = enable)* +// | | | | | +---------------------- Alex - select 80m LPF (0 = disable, 1 = enable)* +// | | | | +------------------------ Alex - select 60/40m LPF (0 = disable, 1 = enable)* +// | | | +-------------------------- Alex - select 30/20m LPF (0 = disable, 1 = enable)* +// | | +---------------------------- Alex - select 17/15m LPF (0 = disable, 1 = enable)* +// | +------------------------------ Alex - select 12/10m LPF (0 = disable, 1 = enable)* +// +-------------------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* + +void Settings::setAlexConfiguration(QObject *sender, quint16 conf) { + + Q_UNUSED (sender) + + QMutexLocker locker(&settingsMutex); + m_alexConfig = conf; + + emit alexConfigurationChanged(m_alexConfig); +} + +void Settings::setAlexHPFLoFrequencies(int filter, long value) { + + m_HPFLoFrequencyList[filter] = value; +} + +void Settings::setAlexHPFHiFrequencies(int filter, long value) { + + m_HPFHiFrequencyList[filter] = value; +} + +void Settings::setAlexLPFLoFrequencies(int filter, long value) { + + m_LPFLoFrequencyList[filter] = value; +} + +void Settings::setAlexLPFHiFrequencies(int filter, long value) { + + m_LPFHiFrequencyList[filter] = value; +} + +/* + * Alex state encoding + * We use the same encoding as in the KISS Konsole by George Byrkit, K9TRV + * AA.TT.BBB.RR + * AA is RX Attenuator + * TT is TX antenna selection (0 is NOT valid!) + * BBB is RX special selection + * RR is TX antenna to use for RX (0 is NOT valid!) + * + */ +void Settings::setAlexState(QObject *sender, int pos, int value) { + + Q_UNUSED (sender) + + if (m_alexStates.length() != MAX_BANDS) + return; + else { + + if (m_alexStates.at(pos) == value) + return; + + int state = checkAlexState(value); + //qDebug() << "alex state at pos: " << pos <<" = " << state; + + m_alexStates.replace(pos, state); + + emit alexStateChanged((HamBand) pos, m_alexStates); + } +} + +void Settings::setAlexState(QObject *sender, int value) { + + Q_UNUSED(sender) + + HamBand band = m_receiverDataList[m_currentReceiver].hamBand; + + setAlexState(this, band, value); +} + +void Settings::setAlexStates(QObject *sender, const QList &states) { + + Q_UNUSED (sender) + + if (m_alexStates == states) return; + + m_alexStates = states; + + emit alexStatesChanged(m_alexStates); +} + +// check Alex state - adapted from KISS Konsole, (c) George Byrkit, K9TRV +int Settings::checkAlexState(int state) { + + if ((state & 0x3) == 0) { + + // if rx antenna selector is 0, set it to 1 + state |= 1; + } + + if (((state >> 5) & 0x3) == 0) { + + // if tx antenna selector is 0, set it to 1 + state |= 33; + } + return state; +} + +void Settings::setAlexToManual(QObject *sender, bool value) { + + //QMutexLocker locker(&settingsMutex); + + emit alexManualStateChanged(sender, value); +} + +void Settings::setRxJ6Pin(QObject *sender, HamBand band, int value) { + + Q_UNUSED (sender) + + if (m_rxJ6pinList.length() != MAX_BANDS-1) return; + if (m_rxJ6pinList[band] == value) return; + + m_rxJ6pinList[band] = value; + + emit rxJ6PinsChanged(m_rxJ6pinList); +} + +void Settings::setRxJ6Pins(QObject * sender, const QList &states) { + + Q_UNUSED (sender) + + //if (m_rxJ6pinList == states) return; + + m_rxJ6pinList = states; + + emit rxJ6PinsChanged(m_rxJ6pinList); +} + +void Settings::setTxJ6Pin(QObject *sender, HamBand band, int value) { + + Q_UNUSED (sender) + + if (m_txJ6pinList.length() != MAX_BANDS-1) return; + if (m_txJ6pinList[band] == value) return; + + m_txJ6pinList[band] = value; + + emit txJ6PinsChanged(m_txJ6pinList); +} + +void Settings::setTxJ6Pins(QObject * sender, const QList &states) { + + Q_UNUSED (sender) + + //if (m_txJ6pinList == states) return; + + m_txJ6pinList = states; + + emit txJ6PinsChanged(m_txJ6pinList); +} + +void Settings::setPennyOCEnabled(QObject *sender, bool value) { + + Q_UNUSED (sender) + + if (m_pennyOCEnabled == value) return; + + m_pennyOCEnabled = value; + + emit pennyOCEnabledChanged(m_pennyOCEnabled); +} + +//************************************** +//************************************** +// OpenCL stuff + +//void Settings::setOpenCLDevices(QList devices) { +// +// m_clDevices = devices; +//} + +//void Settings::setCudaPresence(bool value) { +// +// m_cudaPresence = value; +//} +// +//void Settings::setCudaDevices(int value) { +// +// QMutexLocker locker(&mutex); +// if (m_cuda_devices == value) return; +// m_cuda_devices = value; +// locker.unlock(); +// +// emit cudaDevicesChanged(this, value); +//} +// +//void Settings::setCudaDriver(QObject *sender, int value) { +// +// QMutexLocker locker(&mutex); +// if (m_cuda_driver_version == value) return; +// m_cuda_driver_version = value; +// locker.unlock(); +// +// emit cudaDriverChanged(sender, value); +//} +// +//void Settings::setCudaRuntime(QObject *sender, int value) { +// +// QMutexLocker locker(&mutex); +// if (m_cuda_runtime_version == value) return; +// m_cuda_runtime_version = value; +// locker.unlock(); +// +// emit cudaRuntimeChanged(sender, value); +//} +// +//void Settings::setCurrentCudaDevice(QObject *sender, int value) { +// +// QMutexLocker locker(&mutex); +// if (m_current_cuda_device == value) return; +// m_current_cuda_device = value; +// locker.unlock(); +// +// emit cudaCurrentDeviceChanged(sender, value); +//} +// +//void Settings::setCudaLastDevice(QObject *sender, int value) { +// +// QMutexLocker locker(&mutex); +// if (m_cudaLastDevice == value) return; +// m_cudaLastDevice = value; +// locker.unlock(); +// +// emit cudaLastDeviceChanged(sender, value); +//} + +void Settings::setFreqRulerPosition(QObject *sender, int rx, float position) { + + Q_UNUSED (sender) + + if (position < 0) position = 0; + if (position > 1) position = 1; + + m_receiverDataList[rx].freqRulerPosition = position; + emit freqRulerPositionChanged(this, rx, position); +} + +//********************************************************************************** +// audio settings + +void Settings::setAudioFormat(QObject *sender, const QAudioFormat &format) { + + Q_UNUSED (sender) + + QMutexLocker locker(&settingsMutex); + + //if (m_format == format) return; + m_format = format; + + emit audioFormatChanged(sender, m_format); +} + +void Settings::setAudioPosition(QObject *sender, qint64 position) { + + emit audioPositionChanged(sender, position); +} + +void Settings::setAudioBuffer(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer) { + + emit audioBufferChanged(sender, position, length, buffer); +} + + +//********************************************************************************** +// wideband data & options + +void Settings::setWidebandSpectrumBuffer(const qVectorFloat &buffer) { + + emit widebandSpectrumBufferChanged(buffer); +} + +void Settings::resetWidebandSpectrumBuffer() { + + emit widebandSpectrumBufferReset(); +} + +void Settings::setWidebandOptions(QObject* sender, TWideband options) { + + QMutexLocker locker(&settingsMutex); + + m_widebandOptions = options; + + emit widebandOptionsChanged(sender, m_widebandOptions); +} + +void Settings::setWidebandStatus(QObject* sender, bool value) { + + QMutexLocker locker(&settingsMutex); + + if (m_widebandOptions.wideBandDisplayStatus == value) return; + m_widebandOptions.wideBandDisplayStatus = value; + + emit widebandStatusChanged(sender, m_widebandOptions.wideBandDisplayStatus); +} + +void Settings::setWidebandData(QObject* sender, bool value) { + + QMutexLocker locker(&settingsMutex); + + if (m_widebandOptions.wideBandData == value) return; + m_widebandOptions.wideBandData = value; + + emit widebandDataChanged(sender, m_widebandOptions.wideBandData); +} + +void Settings::setWidebandBuffers(QObject *sender, int value) { + + Q_UNUSED(sender) + + QMutexLocker locker(&settingsMutex); + m_widebandOptions.numberOfBuffers = value; +} + +void Settings::setWidebanddBmScaleMin(QObject *sender, qreal value) { + + QMutexLocker locker(&settingsMutex); + + if (m_widebandOptions.dBmWBScaleMin == value) return; + m_widebandOptions.dBmWBScaleMin = value; + + locker.unlock(); + emit widebanddBmScaleMinChanged(sender, m_widebandOptions.dBmWBScaleMin); +} + +void Settings::setWidebanddBmScaleMax(QObject *sender, qreal value) { + + QMutexLocker locker(&settingsMutex); + + if (m_widebandOptions.dBmWBScaleMax == value) return; + m_widebandOptions.dBmWBScaleMax = value; + + locker.unlock(); + emit widebanddBmScaleMaxChanged(sender, m_widebandOptions.dBmWBScaleMax); +} + +void Settings::setWideBandRulerPosition(QObject *sender, float position) { + + if (m_widebandOptions.scalePosition == position) return; + if (position < 0) position = 0; + if (position > 1) position = 1; + m_widebandOptions.scalePosition = position; + + emit wideBandScalePositionChanged(sender, m_widebandOptions.scalePosition); +} + + +//********************************************************************************** +// chirp signal settings + +void Settings::switchToChirpSignalMode(QObject *sender) { + + emit chirpSignalModeChanged(sender); +} + +void Settings::setLowerChirpFreq(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_lowerChirpFreq == value) return; + if (m_lowerChirpFreq >= m_upperChirpFreq) + m_lowerChirpFreq = m_upperChirpFreq; + else + m_lowerChirpFreq = value; + + emit lowerChirpFreqChanged(this, m_lowerChirpFreq); +} + +void Settings::setUpperChirpFreq(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_upperChirpFreq == value) return; + if (m_lowerChirpFreq >= m_upperChirpFreq) + m_upperChirpFreq = m_lowerChirpFreq; + else + m_upperChirpFreq = value; + + emit upperChirpFreqChanged(this, m_upperChirpFreq); +} + +void Settings::setChirpAmplitude(qreal value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpAmplitude == value) return; + m_chirpAmplitude = value; + + emit chirpAmplitudeChanged(this, m_chirpAmplitude); +} + +void Settings::setChirpSamplingFreq(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpSamplingFreq == value) return; + m_chirpSamplingFreq = value; + + emit chirpSamplingFreqChanged(this, m_chirpSamplingFreq); +} + +void Settings::setChirpBufferDurationUs(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpBufferDurationUs == (qint64)value) return; + m_chirpBufferDurationUs = (qint64)(1000 * value); + + emit chirpBufferDurationUsChanged(this, m_chirpBufferDurationUs); +} + +void Settings::setChirpRepetitionTimes(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpRepetitionTimes == value) return; + m_chirpRepetitionTimes = value; + + emit chirpRepetitionTimesChanged(this, m_chirpRepetitionTimes); +} + +void Settings::setChirpReceiver(bool value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpReceiverOn == value) return; + m_chirpReceiverOn = value; + + emit chirpReceiverChanged(this, m_chirpReceiverOn); +} + +void Settings::setChirpAvgLength(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpAvgLength == value) return; + m_chirpAvgLength = value; + + emit chirpAvgLengthChanged(m_chirpAvgLength); +} + +void Settings::setChirpFFTShow(bool value) { + + QMutexLocker locker(&settingsMutex); + + if (m_showChirpFFT == value) return; + m_showChirpFFT = value; + + emit chirpFFTShowChanged(m_showChirpFFT); +} + +void Settings::setChirpUSB(bool value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpUSB == value) return; + m_chirpUSB = value; + + emit chirpSidebandChanged(m_chirpUSB); +} + +//void Settings::setChirpDownSampleRate(int value) { +// +// if (m_chirpDownSampleRate == value) return; +// m_chirpDownSampleRate = value; +//} + +void Settings::setChirpBuffer(qint64 length, const QList &buffer) { + + emit chirpBufferChanged(length, buffer); +} + +void Settings::setChirpSpectrumBuffer(int sampleRate, qint64 length, const float *buffer) { + + emit chirpSpectrumBufferChanged(sampleRate, length, buffer); +} + +void Settings::setChirpSpectrum(qint64 position, qint64 length, const FrequencySpectrum &spectrum) { + + emit chirpSpectrumChanged(position, length, spectrum); +} + +void Settings::setChirpSpectrumList(const QList &spectrumList) { + + emit chirpSpectrumListChanged(spectrumList); +} + +void Settings::setChirpFilterLowerFrequency(int value) { + + if (m_chirpFilterLowerFrequency == value) return; + m_chirpFilterLowerFrequency = value; + + emit chirpFilterLowerFrequencyChanged(m_chirpFilterLowerFrequency); +} + +void Settings::setChirpFilterUpperFrequency(int value) { + + if (m_chirpFilterUpperFrequency == value) return; + m_chirpFilterUpperFrequency = value; + + emit chirpFilterUpperFrequencyChanged(m_chirpFilterUpperFrequency); +} + +//******************************** + +void Settings::setSpectrumSize(QObject *sender, int value) { + + if (m_spectrumSize == value) return; + + m_spectrumSize = value; + emit spectrumSizeChanged(sender, m_spectrumSize); +} + +void Settings::moveDisplayWidget(int value) { + + emit displayWidgetHeightChanged(value); +} + + +//********************************* +// color stuff + +void Settings::setPanadapterColors(TPanadapterColors type) { + + if (type.panBackgroundColor != m_panadapterColors.panBackgroundColor) + m_panadapterColors.panBackgroundColor = type.panBackgroundColor; + + if (type.waterfallColor != m_panadapterColors.waterfallColor) + m_panadapterColors.waterfallColor = type.waterfallColor; + + if (type.panLineColor != m_panadapterColors.panLineColor) + m_panadapterColors.panLineColor = type.panLineColor; + + if (type.panLineFilledColor != m_panadapterColors.panLineFilledColor) + m_panadapterColors.panLineFilledColor = type.panLineFilledColor; + + if (type.panSolidTopColor != m_panadapterColors.panSolidTopColor) + m_panadapterColors.panSolidTopColor = type.panSolidTopColor; + + if (type.panSolidBottomColor != m_panadapterColors.panSolidBottomColor) + m_panadapterColors.panSolidBottomColor = type.panSolidBottomColor; + + if (type.wideBandLineColor != m_panadapterColors.wideBandLineColor) + m_panadapterColors.wideBandLineColor = type.wideBandLineColor; + + if (type.wideBandFilledColor != m_panadapterColors.wideBandFilledColor) + m_panadapterColors.wideBandFilledColor = type.wideBandFilledColor; + + if (type.wideBandSolidBottomColor != m_panadapterColors.wideBandSolidTopColor) + m_panadapterColors.wideBandSolidTopColor = type.wideBandSolidTopColor; + + if (type.wideBandSolidBottomColor != m_panadapterColors.wideBandSolidBottomColor) + m_panadapterColors.wideBandSolidBottomColor = type.wideBandSolidBottomColor; + + if (type.distanceLineColor != m_panadapterColors.distanceLineColor) + m_panadapterColors.distanceLineColor = type.distanceLineColor; + + if (type.distanceLineFilledColor != m_panadapterColors.distanceLineFilledColor) + m_panadapterColors.distanceLineFilledColor = type.distanceLineFilledColor; + + if (type.panCenterLineColor != m_panadapterColors.panCenterLineColor) + m_panadapterColors.panCenterLineColor = type.panCenterLineColor; + + if (type.gridLineColor != m_panadapterColors.gridLineColor) + m_panadapterColors.gridLineColor = type.gridLineColor; + + emit panadapterColorChanged(); +} + +void Settings::setFramesPerSecond(QObject* sender, int rx, int value) { + + Q_UNUSED(sender) + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).framesPerSecond != value) + m_receiverDataList[rx].framesPerSecond = value; + + emit framesPerSecondChanged(this, rx, m_receiverDataList[rx].framesPerSecond); +} + +int Settings::getFramesPerSecond(int rx) { + + return m_receiverDataList.at(rx).framesPerSecond; +} + +void Settings::setSpectrumAveraging(QObject* sender, int rx, bool value) { + + if (rx == -1) + { + m_widebandOptions.averagingCnt = value; + } + else + { + m_receiverDataList[rx].spectrumAveraging = value; + } + + //SETTINGS_DEBUG << "Averaging for Rx " << rx << " : " << value; + emit spectrumAveragingChanged(sender, rx, value); +} + +bool Settings::getSpectrumAveraging(int rx) { + + if (rx == -1) + return m_widebandOptions.averaging; + else + return m_receiverDataList[rx].spectrumAveraging; +} + +int Settings::getSpectrumAveragingCnt(int rx) { + + if (rx == -1) + return m_widebandOptions.averagingCnt; + else + return m_receiverDataList[rx].averagingCnt; +} + +void Settings::setSpectrumAveragingCnt(QObject *sender, int rx, int value) { + + QMutexLocker locker(&settingsMutex); + + //if (m_specAveragingCnt == value) return + if (rx == -1) + m_widebandOptions.averagingCnt = value; + else + m_receiverDataList[rx].averagingCnt = value; + + emit spectrumAveragingCntChanged(sender, rx, value); +} + + + +void Settings::setPanGrid(bool value, int rx) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).panGrid == value) return; + m_receiverDataList[rx].panGrid = value; + + emit panGridStatusChanged(m_receiverDataList.at(rx).panGrid, rx); +} + +bool Settings::getPanGridStatus(int rx) { + + return m_receiverDataList[rx].panGrid; +} + +void Settings::setPeakHold(bool value, int rx) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).peakHold == value) return; + m_receiverDataList[rx].peakHold = value; + + emit peakHoldStatusChanged(m_receiverDataList.at(rx).peakHold, rx); +} + +bool Settings::getPeakHoldStatus(int rx) { + + return m_receiverDataList.at(rx).peakHold; +} + +void Settings::setPanLocked(bool value, int rx) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).panLocked == value) return; + m_receiverDataList[rx].panLocked = value; + + emit panLockedStatusChanged(m_receiverDataList.at(rx).panLocked, rx); +} + +bool Settings::getPanLockedStatus(int rx) { + + return m_receiverDataList[rx].panLocked; +} + +void Settings::setClickVFO(bool value, int rx) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).clickVFO == value) return; + m_receiverDataList[rx].clickVFO = value; + + emit clickVFOStatusChanged(m_receiverDataList.at(rx).clickVFO, rx); +} + +bool Settings::getClickVFOStatus(int rx) { + + return m_receiverDataList[rx].clickVFO; +} + +void Settings::setHairCross(bool value, int rx) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).hairCross == value) return; + m_receiverDataList[rx].hairCross = value; + + emit hairCrossStatusChanged(m_receiverDataList.at(rx).hairCross, rx); +} + +bool Settings::getHairCrossStatus(int rx) { + + return m_receiverDataList[rx].hairCross; +} + +bool Settings::getFFTAutoStatus(int rx) { + + return m_receiverDataList[rx].fftAuto; +} + +void Settings::setWaterfallTime(int rx, int value) { + + Q_UNUSED(rx) + Q_UNUSED(value) + + QMutexLocker locker(&settingsMutex); + + //if (m_receiverDataList[rx].waterfallTime == value) return; + //m_receiverDataList[rx].waterfallTime = value; + + //emit waterfallTimeChanged(rx, value); +} + +void Settings::setWaterfallOffesetLo(int rx, int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].waterfallOffsetLo == value) return; + m_receiverDataList[rx].waterfallOffsetLo = value; + + emit waterfallOffesetLoChanged(rx, value); +} + +void Settings::setWaterfallOffesetHi(int rx, int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].waterfallOffsetHi == value) return; + m_receiverDataList[rx].waterfallOffsetHi = value; + + emit waterfallOffesetHiChanged(rx, value); +} + +void Settings::setSMeterHoldTime(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_sMeterHoldTime == value) return; + m_sMeterHoldTime = value; + + emit sMeterHoldTimeChanged(m_sMeterHoldTime); +} + +void Settings::setdBmPanScaleMin(int rx, qreal value) { + + QMutexLocker locker(&settingsMutex); + + HamBand band = m_receiverDataList.at(m_currentReceiver).hamBand; + m_receiverDataList[rx].dBmPanScaleMinList[band] = value; + + emit dBmScaleMinChanged(rx, value); +} + +void Settings::setdBmPanScaleMax(int rx, qreal value) { + + QMutexLocker locker(&settingsMutex); + + HamBand band = m_receiverDataList.at(m_currentReceiver).hamBand; + m_receiverDataList[rx].dBmPanScaleMaxList[band] = value; + + emit dBmScaleMaxChanged(rx, value); +} + +void Settings::setdBmDistScaleMin(qreal value) { + + Q_UNUSED(value) +} + +void Settings::setdBmDistScaleMax(qreal value) { + + Q_UNUSED(value) +} + +// ********************************************************************** + +void Settings::showRadioPopupWidget() { + + if (m_radioPopupVisible) + m_radioPopupVisible = false; + else + m_radioPopupVisible = true; + + emit showRadioPopupChanged(m_radioPopupVisible); +} diff --git a/Source/src/cusdr_settings.h b/Source/src/cusdr_settings.h index a3982bd..527310e 100644 --- a/Source/src/cusdr_settings.h +++ b/Source/src/cusdr_settings.h @@ -1,1587 +1,1608 @@ -/** -* @file cusdr_settings.h -* @brief settings header file for cuSDR -* @author by Hermann von Hasseln, DL3HVH -* @version 0.1 -* @date 2010-11-18 -*/ - -/* - * Copyright 2010, 2011, 2012 Hermann von Hasseln, DL3HVH - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License version 2 as - * published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef CUSDR_SETTINGS_H -#define CUSDR_SETTINGS_H - -//#define DEBUG - - -#include -#include -#include -#include -#include -#include -#include - -#include "cusdr_hamDatabase.h" - -// test for OpenCL -//#include "CL/qclcontext.h" - - -// ************************************** -// messages - -#define BANDSCOPE_IN_USE "Error: bandscope in use" -#define BANDSCOPE_NOT_OWNER "Error: Not owner of bandscope" - -#define RECEIVER_INVALID "Error: Invalid Receiver" -#define RECEIVER_IN_USE "Error: Receiver in use" -#define RECEIVER_NOT_OWNER "Error: Not owner of receiver" - -#define CLIENT_ATTACHED "Error: Client is already attached to receiver" -#define CLIENT_DETACHED "Error: Client is not attached to receiver" - -#define INVALID_COMMAND "Error: Invalid Command" - -#define OK "OK" - -// ************************************** -// constants - -#define ONEPI 3.14159265358979323846264338328 -#define TWOPI 6.28318530717958647692528676656 -//#define AGCOFFSET 33.0 - -#define MAXFREQUENCY 961440000 -//#define MAXHPFREQUENCY 61440000 -#define MAXHPFREQUENCY 30720000 -#define MINDBM -180 -#define MAXDBM 10 -#define MINDISTDBM -150 -#define MAXDISTDBM 150 -#define MAX_FFTSIZE 262144 - -// ************************************** -// receiver settings - -#define MAX_RECEIVERS 16 -#define MAX_BANDS 18 -#define BUFFER_SIZE 1024 -#define SAMPLE_BUFFER_SIZE 4096 -#define BANDSCOPE_BUFFER_SIZE 4096 - -#define SMALL_PACKETS -#define BIGWIDEBANDSIZE 16384 -//#define BIGWIDEBANDSIZE 32768 -#define SMALLWIDEBANDSIZE 4096 - - -// ************************************** -// IO buffer, command & control settings - -#define IO_BUFFERS 16 -#define IO_BUFFER_SIZE 512 -#define IO_HEADER_SIZE 8 -#define IO_AUDIOBUFFER_SIZE 8192 - -#define SYNC 0x7F - -#define IQ_DATAGRAM_BUFFERS 512 -#define AUDIO_DATAGRAM_BUFFERS 512 - -#define METIS_HEADER_SIZE 8 -#define METIS_DATA_SIZE 1032 - -#define ALEX_PARAMETERS 15 - -// uncomment to compile code that allows for SYNC error recovery -#define RESYNC - -#define MOX_DISABLED 0x00 -#define MOX_ENABLED 0x01 - -#define ATLAS_10MHZ_SOURCE 0x00 -#define PENELOPE_10MHZ_SOURCE 0x04 -#define MERCURY_10MHZ_SOURCE 0x08 -#define PENELOPE_122_88MHZ_SOURCE 0x00 -#define MERCURY_122_88MHZ_SOURCE 0x10 -#define PENELOPE_PRESENT 0x20 -#define MERCURY_PRESENT 0x40 -#define MIC_SOURCE_PENELOPE 0x80 - -//#define MIC_SOURCE_JANUS 0x00 -//#define CONFIG_NONE 0x00 -//#define CONFIG_BOTH 0x60 - - -//#define SPEED_48KHZ 0x00 -//#define SPEED_96KHZ 0x01 -//#define SPEED_192KHZ 0x02 - -#define MODE_CLASS_E 0x01 -#define MODE_OTHERS 0x00 - -#define ALEX_ATTENUATION_0DB 0x00 -#define ALEX_ATTENUATION_10DB 0x01 -#define ALEX_ATTENUATION_20DB 0x02 -#define ALEX_ATTENUATION_30DB 0x03 -#define LT2208_GAIN_OFF 0x00 -#define LT2208_GAIN_ON 0x04 -#define LT2208_DITHER_OFF 0x00 -#define LT2208_DITHER_ON 0x08 -#define LT2208_RANDOM_OFF 0x00 -#define LT2208_RANDOM_ON 0x10 - -//#define SIMPLEX 0x00 -//#define DUPLEX 0x04 - - -// ************************************** -// Metis definitions - -//#define MAX_METIS_CARDS 10 -//#define DISCOVER_IDLE 0 -//#define DISCOVER_SENT 1 -#define DEVICE_PORT 1024 -#define DATA_PORT 8886 - -// ************************************** -// Audio definitions - -#define WAVEFORM_WINDOW_DURATION 250000 -#define WAVEFORM_TILE_LENGTH 4096 - -//#include "cusdr_about.h" -#include "AudioEngine/cusdr_fspectrum.h" -#include "Util/cusdr_queue.h" - - -// ************************************** -// Server modes - -namespace QSDR { - - enum _Error { - - NoError, - NotImplemented, - HwIOError, - ServerModeError, - OpenError, - DataReceiverThreadError, - DataProcessThreadError, - WideBandDataProcessThreadError, - AudioThreadError, - ChirpDataProcessThreadError, - UnderrunError, - FirmwareError, - FatalError - }; - - enum _DataEngineState { - - DataEngineDown, - DataEngineUp - }; - - enum _DSPCore { - - QtDSP, - CudaDSP, - ExternalDSP - }; - - enum _ServerMode { - - NoServerMode, - SDRMode, - ChirpWSPR, - ChirpWSPRFile, - DemoMode - }; - - enum _HWInterfaceMode { - - NoInterfaceMode, - Metis, - Hermes - }; -} - -Q_DECLARE_METATYPE(QSDR::_Error) -Q_DECLARE_METATYPE(QSDR::_DataEngineState) -Q_DECLARE_METATYPE(QSDR::_ServerMode) -Q_DECLARE_METATYPE(QSDR::_HWInterfaceMode) - - -// ************************************** -enum { - prefixNothing = 0, /*!< No prefix. */ - - /* SI units. */ - prefixKilo = 1, /*!< Kilo prefix 1000^1 = 10^3. */ - prefixMega = 2, /*!< Mega prefix 1000^2 = 10^6. */ - prefixGiga = 3, /*!< Giga prefix 1000^3 = 10^9. */ - prefixTera = 4, /*!< Tera prefix 1000^4 = 10^12. */ - prefixPeta = 5, /*!< Peta prefix 1000^5 = 10^15. */ - prefixExa = 6, /*!< Exa prefix 1000^6 = 10^18. */ - prefixZetta = 7, /*!< Zetta prefix 1000^7 = 10^21. */ - prefixYotta = 8, /*!< Yotta prefix 1000^8 = 10^24. */ - prefixSiMax = prefixYotta, - - /* IEC 60027 units. */ - prefixKibi = 1, /*!< Kibi prefix 1024^1 = 2^10. */ - prefixMebi = 2, /*!< Mebi prefix 1024^2 = 2^20. */ - prefixGibi = 3, /*!< Gibi prefix 1024^3 = 2^30. */ - prefixTebi = 4, /*!< Tebi prefix 1024^4 = 2^40. */ - prefixPebi = 5, /*!< Pebi prefix 1024^5 = 2^50. */ - prefixExbi = 6, /*!< Exbi prefix 1024^6 = 2^60. */ - prefixZebi = 7, /*!< Zebi prefix 1024^7 = 2^70. */ - prefixYobi = 8, /*!< Yobi prefix 1024^8 = 2^80. */ - prefixIecMax = prefixYobi, -}; - - -// ************************************** -// type definitions - -typedef QVector qVectorFloat; - -typedef struct _frequency { - - int freqMHz; - int freqkHz; - - long frequency; - -} TFrequency; - -typedef struct _hpsdrDevices { - - bool mercuryPresence; - bool penelopePresence; - bool pennylanePresence; - bool excaliburPresence; - bool alexPresence; - bool hermesPresence; - bool metisPresence; - - int mercuryFWVersion; - int penelopeFWVersion; - int pennylaneFWVersion; - int excaliburFWVersion; - int alexFWVersion; - int hermesFWVersion; - int metisFWVersion; - -} THPSDRDevices; - -typedef struct _ccParameterRx { - - THPSDRDevices devices; - - uchar roundRobin; // roundRobin is varied in a round-robin fashion in order to decode - // all values which are sent in sequence. - - bool ptt; // PTT (1 = active, 0 = inactive), GPIO[23]= Ozy J8-8, Hermes J16-1 - bool dash; // DASH (1 = active, 0 = inactive), GPIO[21]= Ozy J8-6, Hermes J6-2 - bool dot; // DOT (1 = active, 0 = inactive), GPIO[22]= Ozy J8-7, Hermes J6-3 - bool lt2208; // LT2208 Overflow (1 = active, 0 = inactive) - bool hermesI01; // Hermes I01 (0 = active, 1 = inactive) - bool hermesI02; // Hermes I02 (0 = active, 1 = inactive) - bool hermesI03; // Hermes I03 (0 = active, 1 = inactive) - bool hermesI04; // Hermes I04 (0 = active, 1 = inactive) - bool cyclopsPLL; // Cyclops PLL locked (0 = unlocked, 1 = locked) - bool cyclops; // Cyclops - Mercury frequency changed, bit toggles - - //int mercuryFirmwareVersion; // Mercury firmware version - //int penelopeFirmwareVersion; // Penelope firmware version - //int networkDeviceFirmwareVersion; // Metis/Hermes firmware version - - quint16 ain1; // Forward Power from Alex or Apollo - quint16 ain2; // Reverse Power from Alex or Apollo - quint16 ain3; // AIN3 from Penny or Hermes - quint16 ain4; // AIN4 from Penny or Hermes - quint16 ain5; // Forward Power from Penelope or Hermes - quint16 ain6; // AIN6,13.8v supply on Hermes - - bool mercury1_LT2208; //Mercury 1 LT2208 Overflow (1 = active, 0 = inactive) - bool mercury2_LT2208; //Mercury 2 LT2208 Overflow (1 = active, 0 = inactive) - bool mercury3_LT2208; //Mercury 3 LT2208 Overflow (1 = active, 0 = inactive) - bool mercury4_LT2208; //Mercury 4 LT2208 Overflow (1 = active, 0 = inactive) - - -} TCCParameterRx; - -typedef struct _ccParameterTx { - - bool mox; - bool ptt; - bool lineIn; - bool micGain20dB; - bool pennyOCenabled; - bool vnaMode; - - uchar clockByte; - uchar timeStamp; - uchar commonMercuryFrequencies; - - int hpsdr10MhzSource; - int hpsdr122_88MhzSource; - int hpsdrConfig; - int duplex; - int mercuryAttenuator; - int dither; - int random; - int currentAlexState; - - HamBand currentBand; - - QList mercuryAttenuators; - QList alexStates; - //QList alexConfiguration; - quint16 alexConfig; - QList rxJ6pinList; - QList txJ6pinList; - -} TCCParameterTx; - -typedef struct _hpsdrParameter { - - uchar control_in[5]; - uchar control_out[5]; - - QByteArray ccIn; - QByteArray ccOut; - - uchar output_buffer[IO_BUFFER_SIZE]; - //float in_buffer[2*BUFFER_SIZE]; - float out_buffer[2*BUFFER_SIZE]; - - qVectorFloat wbWindow; - - //CPX cpxIn; - //CPX cpxOut; - //CPX cpxTmp; - - QByteArray audioDatagram; - - QHQueue iq_queue; - QHQueue au_queue; - QHQueue wb_queue; - QHQueue > chirp_queue; - QHQueue > data_queue; - - QList inputBuffer; - - QList clientList; - - QMutex mutex; - QMutex networkIOMutex; - - QWaitCondition devicefound; - //QMutex iqMutex; - - QHostAddress hpsdrDeviceIPAddress; - QString hpsdrDeviceName; - - TCCParameterRx ccRx; - TCCParameterTx ccTx; - - int samplerate; - int speed; - int outputMultiplier; - - int metisFW; - int hermesFW; - int mercuryFW; - int penelopeFW; - int pennylaneFW; - - int clients; - int current_client; - int receivers; - int currentReceiver; - int audio_rx; - int timing; - - int currentMetisCard; - - //int hpsdr_10MhzSource; - //int hpsdr_122_88MhzSource; - int mic_source; - int rxClass; - int rx_freq_change; - int tx_freq_change; - - float mic_gain; - float mic_left_buffer[BUFFER_SIZE]; - float mic_right_buffer[BUFFER_SIZE]; - - qreal penelopeForwardVolts; - qreal penelopeForwardPower; - qreal alexForwardVolts; - qreal alexForwardPower; - qreal alexReverseVolts; - qreal alexReversePower; - qreal ain3Volts; - qreal ain4Volts; - qreal supplyVolts; - - bool rcveIQ_toggle; - bool sendIQ_toggle; - bool timeStamp; - bool mute; - - qint16 audiofileChannels; - -} THPSDRParameter; - -typedef struct _networkDeviceCard { - - QHostAddress ip_address; - char mac_address[18]; - int boardID; - QString boardName; - -} TNetworkDevicecard; - -typedef enum _panGraphicsMode { - - Line, // 0 - FilledLine, // 1 - Solid // 2 - -} PanGraphicsMode; - -typedef enum _waterfallColorMode { - - Simple, // 0 - Enhanced // 1 - -} WaterfallColorMode; - -Q_DECLARE_METATYPE (TNetworkDevicecard) -Q_DECLARE_METATYPE (QList) - -typedef struct _receiver { - - QSDR::_DSPCore dspCore; - - HamBand hamBand; - HamBand lastHamBand; - DSPMode dspMode; - AGCMode agcMode; - TDefaultFilterMode defaultFilterMode; - PanGraphicsMode panMode; - WaterfallColorMode waterfallMode; - - QList lastCenterFrequencyList; - QList lastVfoFrequencyList; - QList mercuryAttenuators; - QList dBmPanScaleMinList; - QList dBmPanScaleMaxList; - QList dspModeList; - - bool hangEnabled; - bool agcLines; - bool panLocked; - bool spectrumAveraging; - bool hairCross; - bool panGrid; - bool peakHold; - bool clickVFO; - - long ctrFrequency; - long vfoFrequency; - long ncoFrequency; - - float freqRulerPosition; - float audioVolume; - - qreal mouseWheelFreqStep; - qreal filterLo; - qreal filterHi; - qreal agcSlope; - qreal acgGain; - qreal acgThreshold_dB; - qreal agcHangThreshold; - qreal agcHangLevel; - qreal agcMaximumGain_dB; - qreal agcAttackTime; - qreal agcDecayTime; - qreal agcHangTime; - qreal agcFixedGain_dB; - qreal agcVariableGain; - - int sampleRate; - int framesPerSecond; - int waterfallOffsetLo; - int waterfallOffsetHi; - int averagingCnt; - -} TReceiver; - -typedef struct _wideband { - - PanGraphicsMode panMode; - - bool wideBandData; - bool wideBandDisplayStatus; - bool averaging; - - int numberOfBuffers; - int averagingCnt; - - float scalePosition; - - qreal dBmWBScaleMin; - qreal dBmWBScaleMax; - -} TWideband; - -typedef struct _transmitter { - - QSDR::_DSPCore dspCore; - - HamBand hamBand; - DSPMode dspMode; - AGCMode agcMode; - TDefaultFilterMode defaultFilterMode; - - bool txAllowed; - long frequency; - - float audioVolume; - -} TTransmitter; - -typedef struct t_panadapterColors { - - QColor panBackgroundColor; - QColor waterfallColor; - QColor panLineColor; - QColor panLineFilledColor; - QColor panSolidTopColor; - QColor panSolidBottomColor; - QColor wideBandLineColor; - QColor wideBandFilledColor; - QColor wideBandSolidTopColor; - QColor wideBandSolidBottomColor; - QColor distanceLineColor; - QColor distanceLineFilledColor; - QColor panCenterLineColor; - QColor gridLineColor; - -} TPanadapterColors; - - -typedef enum _smeterType { - - SIGNAL_STRENGTH, - AVG_SIGNAL_STRENGTH, - ADC_REAL, - ADC_IMAG, - AGC_GAIN, - MIC, - PWR, - ALC, - EQtap, - LEVELER, - COMP, - CPDR, - ALC_G, - LVL_G, - MIC_PK, - ALC_PK, - EQ_PK, - LEVELER_PK, - COMP_PK, - CPDR_PK - -} TMeterType; - -typedef enum _windowtype { - - RECTANGULAR_WINDOW, - HANNING_WINDOW, - WELCH_WINDOW, - PARZEN_WINDOW, - BARTLETT_WINDOW, - HAMMING_WINDOW, - BLACKMAN2_WINDOW, - BLACKMAN3_WINDOW, - BLACKMAN4_WINDOW, - EXPONENTIAL_WINDOW, - RIEMANN_WINDOW, - BLACKMANHARRIS_WINDOW, - NUTTALL_WINDOW - -} TWindowtype; - - -class Receiver; - -// ********************************************************************* -// thread class - -class QThreadEx : public QThread { - -protected: - void run() { exec(); } - -}; - -// ************************************** -// Settings class - -class Settings : public QObject { - - Q_OBJECT - -public: - static Settings *instance(QObject *parent = 0) { - - if (Settings::m_instance) - return Settings::m_instance; - - Settings::m_instance = new Settings(parent); - - return Settings::m_instance; - } - - static void delete_instance() { - - if (Settings::m_instance) { - - disconnect(Settings::m_instance, 0, 0, 0); - delete Settings::m_instance; - Settings::m_instance = 0; - } - } - - virtual ~Settings(); - - QMutex settingsMutex; - -private: - Settings(QObject *parent = 0); - - static Settings *m_instance; - - QSettings *settings; - QSettings *debugLog; - QErrorMessage *error; - -signals: - void systemMessageEvent(const QString &msg, int); - - void masterSwitchChanged(QObject *sender, bool power); - - void systemStateChanged( - QObject *sender, - QSDR::_Error err, - QSDR::_HWInterfaceMode hwmode, - QSDR::_ServerMode mode, - QSDR::_DataEngineState state); - - void graphicModeChanged( - QObject *sender, - int rx, - PanGraphicsMode panMode, - WaterfallColorMode waterfallColorMode); - - void cpuLoadChanged(short load); - void txAllowedChanged(QObject* sender, bool value); - void multiRxViewChanged(int view); - void sMeterValueChanged(int rx, float value); - void spectrumBufferChanged(int rx, const qVectorFloat& buffer); - void postSpectrumBufferChanged(int rx, const float* buffer); - - void sampleSizeChanged(int rx, int size); - void rxListChanged(QList rxList); - void clientConnectedChanged(QObject* sender, bool connect); - void clientNoConnectedChanged(QObject* sender, int client); - void audioRxChanged(QObject* sender, int rx); - void receiverChanged(int value); - void currentReceiverChanged(QObject *sender, int rx); - void connectedChanged(QObject *sender, bool connect); - - void clientConnectedEvent(int client); - void clientDisconnectedEvent(int client); - void rxConnectedStatusChanged(QObject* sender, int rx, bool value); - void framesPerSecondChanged(QObject* sender, int rx, int value); - - void settingsFilenameChanged(QString filename); - void settingsLoadedChanged(bool loaded); - - void newServerNetworkInterface(QString nicName, QString ipAddress); - void newHPSDRDeviceNIC(QString nicName, QString ipAddress); - void serverNICChanged(int); - void hpsdrDeviceNICChanged(int); - void socketBufferSizeChanged(QObject* sender, int value); - void manualSocketBufferChanged(QObject* sender, bool value); - //void metisCardListChanged(QList list); - void metisCardListChanged(const QList &list); - void hpsdrDevicesChanged(QObject *sender, THPSDRDevices devices); - void hpsdrNetworkDeviceChanged(TNetworkDevicecard card); - void networkDeviceNumberChanged(int value); - void networkIOComboBoxEntryAdded(QString str); - void clearNetworkIOComboBoxEntrySignal(); - void searchMetisSignal(); - void serverAddrChanged(QObject *sender, QString addr); - void hpsdrDeviceLocalAddrChanged(QObject *sender, QString addr); - void serverPortChanged(QObject *sender, quint16 port); - void listenPortChanged(QObject *sender, quint16 port); - void audioPortChanged(QObject *sender, quint16 port); - void metisPortChanged(QObject *sender, quint16 port); - - void showNetworkIO(); - void showWarning(const QString &msg); - - void callsignChanged(); - - void mouseWheelFreqStepChanged(QObject *sender, int rx, qreal value); - void mainVolumeChanged(QObject *sender, int rx, float volume ); - - //void hermesPresenceChanged(bool value); - void hpsdrHardwareChanged(int value); - void hermesVersionChanged(int value); - void mercuryPresenceChanged(bool value); - void mercuryVersionChanged(int value); - void penelopePresenceChanged(bool value); - void penelopeVersionChanged(int value); - void pennyLanePresenceChanged(bool value); - void pennyLaneVersionChanged(int value); - void alexPresenceChanged(bool value); - void excaliburPresenceChanged(bool value); - void metisVersionChanged(int value); - //void alexConfigurationChanged(const QList &conf); - void alexConfigurationChanged(quint16 config); - //void alexParametersChanged(TAlexParameters p); - void alexStatesChanged(const QList &states); - void alexStateChanged(HamBand band, const QList &states); - void alexStateChanged(int pos, int value); - void alexManualStateChanged(QObject *sender, bool value); - void checkFirmwareVersionChanged(QObject *sender, bool value); - void pennyOCEnabledChanged(bool value); - void rxJ6PinsChanged(const QList &states); - void txJ6PinsChanged(const QList &states); - - void protocolSyncChanged(int value); - void adcOverflowChanged(int value); - void packetLossChanged(int value); - void sendIQSignalChanged(int value); - void rcveIQSignalChanged(int value); - - void numberOfRXChanged(QObject *sender, int value); - void sampleRateChanged(QObject *sender, int value); - void mercuryAttenuatorChanged(QObject *sender, HamBand band, int value); - //void mercuryAttenuatorsChanged(QObject *sender, const QList &values); - void ditherChanged(QObject *sender, int value); - void randomChanged(QObject *sender, int value); - void src10MhzChanged(QObject *sender, int source); - void src122_88MhzChanged(QObject *sender, int source); - void micSourceChanged(QObject *sender, int source); - void classChanged(QObject *sender, int value); - void timingChanged(QObject *sender, int value); - void controlBytesOutChanged(QObject *sender, unsigned char *values); - //void ctrFrequencyChanged(QObject* sender, bool value, int rx, long frequency); - void ctrFrequencyChanged(QObject* sender, int mode, int rx, long frequency); - //void vfoFrequencyChanged(QObject* sender, bool value, int rx, long frequency); - void vfoFrequencyChanged(QObject* sender, int mode, int rx, long frequency); - void ncoFrequencyChanged(int rx, long frequency); - - // wideband data - void widebandSpectrumBufferChanged(const qVectorFloat& buffer); - void widebandOptionsChanged(QObject* sender, TWideband options); - void widebandSpectrumBufferReset(); - void widebandStatusChanged(QObject* sender, bool value); - void widebandDataChanged(QObject* sender, bool value); - void widebanddBmScaleMinChanged(QObject *sender, qreal value); - void widebanddBmScaleMaxChanged(QObject *sender, qreal value); - void wideBandScalePositionChanged(QObject *sender, float position); - //void widebandAveragingChanged(QObject *sender, bool value); - //void widebandAveragingCntChanged(QObject *sender, int value); - - - void iqPortChanged(QObject* sender, int rx, int port); - - void hamBandChanged(QObject *sender, int rx, bool byButton, HamBand band); - void dspModeChanged(QObject *sender, int rx, DSPMode mode); - void agcModeChanged(QObject *sender, int rx, AGCMode mode, bool hangEnabled); - void agcHangEnabledChanged(QObject *sender, int rx, bool hang); - void agcGainChanged(QObject *sender, int rx, int value); - void agcThresholdChanged_dB(QObject *sender, int rx, qreal value); - void agcFixedGainChanged_dB(QObject *sender, int rx, qreal value); - void agcMaximumGainChanged_dB(QObject *sender, int rx, qreal value); - void agcHangThresholdChanged(QObject *sender, int rx, int value); - void agcHangThresholdSliderChanged(QObject *sender, int rx, qreal value); - void agcHangLevelChanged_dB(QObject *sender, int rx, qreal value); - void agcLineLevelsChanged(QObject *sender, int rx, qreal thresh, qreal hang); - void agcVariableGainChanged_dB(QObject *sender, int rx, qreal value); - void agcAttackTimeChanged(QObject *sender, int rx, qreal value); - void agcDecayTimeChanged(QObject *sender, int rx, qreal value); - void agcHangTimeChanged(QObject *sender, int rx, qreal value); - void filterFrequenciesChanged(QObject *sender, int rx, qreal low, qreal high); - - void cudaDevicesChanged(QObject *sender, int value); - void cudaDriverChanged(QObject *sender, int value); - void cudaRuntimeChanged(QObject *sender, int value); - void cudaCurrentDeviceChanged(QObject *sender, int value); - void cudaLastDeviceChanged(QObject* sender, int value); - - void freqRulerPositionChanged(QObject *sender, int rx, float position); - - - void audioFormatChanged(QObject *sender, const QAudioFormat &format); - void audioPositionChanged(QObject *sender, qint64 position); - void audioBufferChanged(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer); - //void audioBufferChanged(QObject *sender, const QByteArray &buffer); - - void chirpSignalModeChanged(QObject *sender); - void lowerChirpFreqChanged(QObject *sender, int value); - void upperChirpFreqChanged(QObject *sender, int value); - void chirpAmplitudeChanged(QObject *sender, qreal value); - void chirpSamplingFreqChanged(QObject *sender, int value); - void chirpBufferDurationUsChanged(QObject *sender, qint64 value); - void chirpRepetitionTimesChanged(QObject *sender, int value); - void chirpReceiverChanged(QObject *sender, int value); - void chirpBufferChanged(qint64 length, const QList &buffer); - void chirpAvgLengthChanged(int length); - void chirpFFTShowChanged(bool value); - void chirpSidebandChanged(bool value); - void chirpFilterLowerFrequencyChanged(int value); - void chirpFilterUpperFrequencyChanged(int value); - void chirpSpectrumBufferChanged(int sampleRate, qint64 length, const float *buffer); - void chirpSpectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum); - void chirpSpectrumListChanged(const QList &spectrumList); - - void displayWidgetHeightChanged(int value); - void spectrumSizeChanged(QObject *sender, int value); - void panadapterColorChanged(); - void panGridStatusChanged(bool value, int rx); - void peakHoldStatusChanged(bool value, int rx); - void panLockedStatusChanged(bool value, int rx); - void clickVFOStatusChanged(bool value, int rx); - void hairCrossStatusChanged(bool value, int rx); - void showAGCLinesStatusChanged(QObject *sender, bool value, int rx); - - void spectrumAveragingChanged(QObject *sender, int rx, bool value); - void spectrumAveragingCntChanged(QObject *sender, int rx, int value); - - - void waterfallTimeChanged(int rx, int value); - void waterfallOffesetLoChanged(int rx, int value); - void waterfallOffesetHiChanged(int rx, int value); - - void sMeterHoldTimeChanged(int value); - void dBmScaleMinChanged(int rx, qreal value); - void dBmScaleMaxChanged(int rx, qreal value); - - - void showRadioPopupChanged(bool value); - - void receiverDataReady(); - -public: - void debugSystemState(); - - int loadSettings(); - int saveSettings(); - - QSDR::_ServerMode getCurrentServerMode(); - QSDR::_HWInterfaceMode getHWInterface(); - QSDR::_DataEngineState getDataEngineState(); - - PanGraphicsMode getPanadapterMode(int rx); - WaterfallColorMode getWaterfallColorMode(int rx); - - QString getServerModeString(QSDR::_ServerMode mode); - QString getHWInterfaceModeString(QSDR::_HWInterfaceMode mode); - QString getHDataEngineStateString(QSDR::_DataEngineState mode); - QString getErrorString(QSDR::_Error err); - - QString getValue1000(double value, int valuePrefix, QString unitBase); - QString getValue1024(double value, int valuePrefix, QString unitBase); - - THPSDRDevices getHPSDRDevices(); - - bool getSettingsLoaded(); - bool getMainPower(); - bool getDefaultSkin(); - - int getMinimumWidgetWidth(); - int getMinimumGroupBoxWidth(); - int getMultiRxView(); - bool getPBOPresence(); - bool getFBOPresence(); - - bool getConnected(); - bool getClientConnected(); - bool getTxAllowed(); - - QString getTitleStr(); - QString getVersionStr(); - QString getSettingsFilename(); - QString getCallsign(); - - QString getSDRStyle(); - QString getWidgetStyle(); - QString getMainWindowStyle(); - QString getDockStyle(); - QString getDisplayToolbarStyle(); - QString getMainBtnToolbarStyle(); - QString getStatusbarStyle(); - QString getMessageBoxStyle(); - QString getLineEditStyle(); - QString getDialogStyle(); - QString getColorDialogStyle(); - QString getItemStyle(); - QString getLabelStyle(); - QString getSliderLabelStyle(); - QString getTableStyle(); - QString getComboBoxStyle(); - QString getSpinBoxStyle(); - QString getDoubleSpinBoxStyle(); - QString getMenuStyle(); - QString getMiniButtonStyle(); - QString getVolSliderStyle(); - QString getSplitterStyle(); - QString getFrameStyle(); - QString getTabWidgetStyle(); - //QString getNewSliderStyle(); - - - QString getServerAddr(); - QString getHPSDRDeviceLocalAddr(); - - quint16 getServerPort(); - quint16 getListenPort(); - quint16 getAudioPort(); - quint16 getMetisPort(); - - TNetworkDevicecard getCurrentMetisCard() { return m_currentHPSDRDevice; } - QList getMetisCardsList() { return m_metisCards; } - QList getReceiverDataList() { return m_receiverDataList; } - QList getBandFrequencyList() { return m_bandList; } - QList getHamBandTextList() { return m_bandTextList; } - QList getDefaultFilterList() { return m_defaultFilterList; } - TDefaultFilterMode getCurrentFilterMode() { return m_filterMode; } - quint16 getAlexConfig() { return m_alexConfig; } - QList getAlexStates() { return m_alexStates; } - QList getHPFLoFrequencies() { return m_HPFLoFrequencyList; } - QList getHPFHiFrequencies() { return m_HPFHiFrequencyList; } - QList getLPFLoFrequencies() { return m_LPFLoFrequencyList; } - QList getLPFHiFrequencies() { return m_LPFHiFrequencyList; } - QList getRxJ6Pins() { return m_rxJ6pinList; } - QList getTxJ6Pins() { return m_txJ6pinList; } - int getFramesPerSecond(int rx); - QString getDSPModeString(int mode); - - HamBand getCurrentHamBand(int rx); - QList getMercuryAttenuators(int rx); - //int getMercuryAttenuator(); - - bool getPennyOCEnabled() { return m_pennyOCEnabled; } - int getHpsdrNetworkDevices() { return m_hpsdrNetworkDevices; } - int getNetworkInterfacesNo() { return m_NetworkInterfacesNo; } - bool getMercuryPresence() { return m_devices.mercuryPresence; } - int getMercuryVersion() { return m_devices.mercuryFWVersion; } - bool getPenelopePresence() { return m_devices.penelopePresence; } - int getPenelopeVersion() { return m_devices.penelopeFWVersion; } - bool getPennyLanePresence() { return m_devices.pennylanePresence; } - int getPennyLaneVersion() { return m_devices.pennylaneFWVersion; } - bool getHermesPresence() { return m_devices.hermesPresence; } - int getHermesVersion() { return m_devices.hermesFWVersion; } - int getHPSDRHardware() { return m_hpsdrHardware; } - bool getAlexPresence() { return m_devices.alexPresence; } - bool getExcaliburPresence() { return m_devices.excaliburPresence; } - bool getMetisPresence() { return m_devices.metisPresence; } - int getMetisVersion() { return m_devices.metisFWVersion; } - int getSocketBufferSize() { return m_socketBufferSize; } - bool getManualSocketBufferSize() { return m_manualSocketBufferSize; } - bool getFirmwareVersionCheck() { return m_checkFirmwareVersions; } - - // wideband data & options - TWideband getWidebandOptions() { return m_widebandOptions; } - - bool getWidebandStatus() { return m_widebandOptions.wideBandDisplayStatus; } - bool getWidebandData() { return m_widebandOptions.wideBandData; } - qreal getWidebanddBmScaleMin() { return m_widebandOptions.dBmWBScaleMin; } - qreal getWidebanddBmScaleMax() { return m_widebandOptions.dBmWBScaleMax; } - int getWidebandBuffers() { return m_widebandOptions.numberOfBuffers; } - - - - bool getPanGridStatus(int rx); - bool getPeakHoldStatus(int rx); - bool getPanLockedStatus(int rx); - bool getClickVFOStatus(int rx); - bool getHairCrossStatus(int rx); - - int getMercurySpeed() { return m_mercurySpeed; } - int getOutputSampleIncrement() { return m_outputSampleIncrement; } - int getNumberOfReceivers() { return m_mercuryReceivers; } - //int getCurrentReceivers() { return m_mercuryReceivers; } - int getCurrentReceiver() { return m_currentReceiver; } - bool getFrequencyRx1onRx2() { return m_frequencyRx1onRx2; } - int getSampleRate() { return m_sampleRate; } - - //int getMercuryAttenuator() { return m_mercuryAttenuator; } - int getMercuryDither() { return m_mercuryDither; } - int getMercuryRandom() { return m_mercuryRandom; } - int get10MHzSource() { return m_10MHzSource; } - int get122_8MHzSource() { return m_122_8MHzSource; } - int getMicSource() { return m_micSource; } - int getRxClass() { return m_RxClass; } - int getRxTiming() { return m_RxTiming; } - - qreal getMainVolume(int rx); - qreal getMouseWheelFreqStep(int rx);// { return m_mouseWheelFreqStep; } - AGCMode getAGCMode(int rx); - QString getAGCModeString(int rx); - int getAGCGain(int rx); - qreal getAGCMaximumGain_dB(int rx); - qreal getAGCFixedGain_dB(int rx); - int getAGCHangThreshold(int rx); - int getAGCHangLeveldB(int rx); - - int getLowerChirpFreq() { return m_lowerChirpFreq; } - int getUpperChirpFreq() { return m_upperChirpFreq; } - qreal getChirpAmplitude() { return m_chirpAmplitude; } - int getChirpSamplingFreq() { return m_chirpSamplingFreq; } - qint64 getChirpBufferDurationUs() { return m_chirpBufferDurationUs; } - qint64 getChirpBufferLength() { return m_chirpBufferLength; } - int getChirpChannels() { return m_chirpChannels; } - int getChirpRepetitionTimes() { return m_chirpRepetitionTimes; } - int getChirpDownSampleRate() { return m_chirpDownSampleRate; } - int getChirpAvgLength() { return m_chirpAvgLength; } - int getChirpFilterLowerFrequency() { return m_chirpFilterLowerFrequency; } - int getChirpFilterUpperFrequency() { return m_chirpFilterUpperFrequency; } - bool getChirpReceiver() { return m_chirpReceiverOn; } - bool getChirpFFTShow() { return m_showChirpFFT; } - bool getChirpSideband() { return m_chirpUSB; } - - int getSpectrumSize() { return m_spectrumSize; } - - qreal getdBmDistScaleMin() { return m_dBmDistScaleMin; } - qreal getdBmDistScaleMax() { return m_dBmDistScaleMax; } - - int getSMeterHoldTime() { return m_sMeterHoldTime; } - - qreal getFilterFrequencyLow() { return m_filterFrequencyLow; } - qreal getFilterFrequencyHigh() { return m_filterFrequencyHigh; } - - QList m_ipAddressesList; - QList m_networkInterfaces; - - // audio - QAudio::Mode mode() const { return m_audioMode; } - QAudio::State state() const { return m_audioState; } - QAudioFormat getAudioFormat() const { return m_format; } - - // colors - TPanadapterColors getPanadapterColors() { return m_panadapterColors; } - - bool getSpectrumAveraging(int rx); - int getSpectrumAveragingCnt(int rx); - - int getFFTMultiplicator() { return m_fft; } - - QMutex debugMutex; - -public slots: - void setMainPower(QObject *sender, bool power); - void setDefaultSkin(QObject *sender, bool value); - void setSettingsFilename(QString filename); - - void setSystemMessage(const QString &msg, int time); - void setSettingsLoaded(bool loaded); - void setCPULoad(short load); - void setCallsign(const QString &callsign); - - void setPBOPresence(bool value); - void setFBOPresence(bool value); - - void setMainVolume(QObject *sender, int rx, float volume); - void setMainVolumeMute(QObject *sender, int rx, bool value); - - void setSystemState( - QObject *sender, - QSDR::_Error err, - QSDR::_HWInterfaceMode hwmode, - QSDR::_ServerMode mode, - QSDR::_DataEngineState state); - - void setGraphicsState( - QObject *sender, - int rx, - PanGraphicsMode panMode, - WaterfallColorMode waterfallColorMode); - - void setTxAllowed(QObject* sender, bool value); - void setMultiRxView(int view); - void setSMeterValue(int rx, float value); - void setSpectrumBuffer(int rx, const qVectorFloat &buffer); - void setPostSpectrumBuffer(int rx, const float*); - void setSampleSize(QObject* sender, int rx, int size); - void setRxList(QList rxList); - void setMetisCardList(QList list); - void searchHpsdrNetworkDevices(); - void clearMetisCardList(); - void setHPSDRDeviceNumber(int value); - void setCurrentHPSDRDevice(TNetworkDevicecard card); - void addNetworkIOComboBoxEntry(QString str); - void clearNetworkIOComboBoxEntry(); - void addServerNetworkInterface(QString nicName, QString ipAddress); - void addHPSDRDeviceNIC(QString nicName, QString ipAddress); - void setNumberOfNetworkInterfaces(int value); - void setServerNetworkInterface(int index); - void setHPSDRDeviceNIC(int index); - void setServerWidgetNIC(int index); - void setHPSDRWidgetNIC(int index); - void setServerAddr(QObject *sender, QString addr); - void setHPSDRDeviceLocalAddr(QObject *sender, QString addr); - void setServerPort(QObject *sender, quint16 port); - void setListenPort(QObject *sender, quint16 port); - void setAudioPort(QObject *sender, quint16 port); - void setMetisPort(QObject *sender, quint16 port); - void setClientConnected(QObject *sender, bool value); - void setClientNoConnected(QObject* sender, int client); - void setRxConnectedStatus(QObject* sender, int rx, bool value); - void setAudioRx(QObject* sender, int rx); - void setConnected(QObject *sender, bool value); - void setCheckFirmwareVersion(QObject *sender, bool value); - - void setHPSDRDevices(QObject *sender, THPSDRDevices devices); - //void setHermesPresence(bool value); - void setHermesVersion(int value); - void setHPSDRHardware(int value); - void setMercuryPresence(bool value); - void setMercuryVersion(int value); - void setPenelopePresence(bool value); - void setPenelopeVersion(int value); - void setPennyLanePresence(bool value); - void setPennyLaneVersion(int value); - void setAlexPresence(bool value); - void setExcaliburPresence(bool value); - void setMetisVersion(int value); - - //void setAlexConfiguration(QObject *sender, const QList &conf); - void setAlexConfiguration(QObject *sender, quint16 conf); - void setAlexHPFLoFrequencies(int filter, long value); - void setAlexHPFHiFrequencies(int filter, long value); - void setAlexLPFLoFrequencies(int filter, long value); - void setAlexLPFHiFrequencies(int filter, long value); - void setAlexStates(QObject *sender, const QList &states); - void setAlexState(QObject *sender, int pos, int value); - void setAlexState(QObject *sender, int value); - void setAlexToManual(QObject *sender, bool value); - int checkAlexState(int state); - - void setPennyOCEnabled(QObject *sender, bool value); - void setRxJ6Pin(QObject *sender, HamBand band, int value); - void setRxJ6Pins(QObject * sender, const QList &states); - void setTxJ6Pin(QObject *sender, HamBand band, int value); - void setTxJ6Pins(QObject * sender, const QList &states); - - void setIQPort(QObject *sender, int rx, int port); - - void setProtocolSync(int value); - void setADCOverflow(int value); - void setPacketLoss(int value); - void setSendIQ(int value); - void setRcveIQ(int value); - - void setReceivers(QObject *sender, int value); - //void setReceiver(QObject *sender, int value); - void setCurrentReceiver(QObject *sender, int value); - void setSampleRate(QObject *sender, int value); - void setMercuryAttenuator(QObject *sender, int value); - void setDither(QObject *sender, int value); - void setRandom(QObject *sender, int value); - void set10MhzSource(QObject *sender, int source); - void set122_88MhzSource(QObject *sender, int source); - void setMicSource(QObject *sender, int source); - void setClass(QObject *sender, int value); - void setTiming(QObject *sender, int value); - void setCtrFrequency(QObject *sender, int mode, int rx, long frequency); - void setCtrFrequency(int rx, long frequency); - long getCtrFrequency(int rx); - void setVFOFrequency(QObject *sender, int mode, int rx, long frequency); - void setVfoFrequency(int rx, long frequency); - long getVfoFrequency(int rx); - void setNCOFrequency(QObject *sender, bool value, int rx, long frequency); - - void clientDisconnected(int client); - void setFramesPerSecond(QObject *sender, int rx, int value); - void setMouseWheelFreqStep(QObject *sender, int rx, qreal value); - void setSocketBufferSize(QObject *sender, int value); - void setManualSocketBufferSize(QObject *sender, bool value); - - void setReceiverDataReady(); - - void setSpectrumSize(QObject *sender, int value); - void setdBmPanScaleMin(int rx, qreal value); - void setdBmPanScaleMax(int rx, qreal value); - - void setdBmDistScaleMin(qreal value); - void setdBmDistScaleMax(qreal value); - - void setHamBand(QObject* sender, int rx, bool byButton, HamBand band); - void setDSPMode(QObject* sender, int rx, DSPMode mode); - void setAGCMode(QObject* sender, int rx, AGCMode mode); - void setAGCGain(QObject* sender, int rx, int value); - void setAGCMaximumGain_dB(QObject *sender, int rx, qreal value); - void setAGCFixedGain_dB(QObject *sender, int rx, qreal value); - void setAGCThreshold_dB(QObject *sender, int rx, qreal value); - - void setAGCHangThresholdSlider(QObject *sender, int rx, qreal value); - void setAGCHangThreshold(QObject *sender, int rx, int value); - void setAGCHangLevel_dB(QObject *sender, int rx, qreal value); - void setAGCLineLevels(QObject *sender, int rx, qreal thresh, qreal hang); - void setAGCShowLines(QObject *sender, int rx, bool value); - void setAGCVariableGain_dB(QObject *sender, int rx, qreal value); - void setAGCAttackTime(QObject *sender, int rx, qreal value); - void setAGCDecayTime(QObject *sender, int rx, qreal value); - void setAGCHangTime(QObject *sender, int rx, qreal value); - void setRXFilter(QObject* sender, int rx, qreal low, qreal high); - - - // wideband data & options - void setWidebandBuffers(QObject *sender, int value); - void setWidebandSpectrumBuffer(const qVectorFloat &buffer); - void resetWidebandSpectrumBuffer(); - void setWidebandOptions(QObject* sender, TWideband options); - void setWidebandStatus(QObject* sender, bool value); - void setWidebandData(QObject* sender, bool value); - void setWidebanddBmScaleMin(QObject* sender, qreal value); - void setWidebanddBmScaleMax(QObject* sender, qreal value); - //void setWidebandAveraging(QObject *sender, bool value); - //void setWidebandAveragingCnt(QObject *sender, int value); - void setWideBandRulerPosition(QObject* sender, float pos); - - //void setOpenCLDevices(QList dev); - - /*void setCudaPresence(bool value); - void setCudaDevices(int value); - void setCudaLastDevice(QObject *sender, int vlaue); - void setCudaDriver(QObject *sender, int value); - void setCudaRuntime(QObject *sender, int value); - void setCurrentCudaDevice(QObject *sender, int value);*/ - - void setFreqRulerPosition(QObject* sender, int rx, float pos); - //void setRulerPosition(QObject *sender, float pos); - - void setAudioFormat(QObject *sender, const QAudioFormat &format); - void setAudioPosition(QObject *sender, qint64 position); - void setAudioBuffer(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer); - //void setAudioBuffer(QObject *sender, const QByteArray &buffer); - - void switchToChirpSignalMode(QObject *sender); - void setLowerChirpFreq(int value); - void setUpperChirpFreq(int value); - void setChirpAmplitude(qreal value); - void setChirpSamplingFreq(int value); - void setChirpBufferDurationUs(int value); - void setChirpRepetitionTimes(int value); - void setChirpReceiver(bool value); - void setChirpAvgLength(int value); - void setChirpFFTShow(bool value); - void setChirpUSB(bool value); - void setChirpFilterLowerFrequency(int value); - void setChirpFilterUpperFrequency(int value); - //void setChirpDownSampleRate(int value); - //void setChirpBufferLength(qint64 length); - void setChirpBuffer(qint64 length, const QList &buffer); - //void setChirpSpectrumBuffer(const QList &buffer); - void setChirpSpectrumBuffer(int sampleRate, qint64 length, const float *buffer); - - //void setSpectrumBuffer(const float *buffer); - void setChirpSpectrum(qint64 position, qint64 length, const FrequencySpectrum &spectrum); - void setChirpSpectrumList(const QList &spectrumList); - - void moveDisplayWidget(int value); - - void setPanadapterColors(TPanadapterColors type); - void setPanGrid(bool value, int rx); - void setPeakHold(bool value, int rx); - void setPanLocked(bool value, int rx); - void setClickVFO(bool value, int rx); - void setHairCross(bool value, int rx); - - void setSpectrumAveraging(QObject *sender, int rx, bool value); - void setSpectrumAveragingCnt(QObject *sender, int rx, int value); - - - void setWaterfallTime(int rx, int value); - void setWaterfallOffesetLo(int rx, int value); - void setWaterfallOffesetHi(int rx, int value); - - void setSMeterHoldTime(int value); - - void showNetworkIODialog(); - void showWarningDialog(const QString &msg); - - void showRadioPopupWidget(); - - QList getCtrFrequencies(); - QList getVfoFrequencies(); - -private slots: - -private: - QSDR::_Error m_systemError; - QSDR::_ServerMode m_serverMode; - QSDR::_HWInterfaceMode m_hwInterface; - QSDR::_DataEngineState m_dataEngineState; - - QAudio::Mode m_audioMode; - QAudio::State m_audioState; - QAudioFormat m_format; - - THPSDRDevices m_devices; - TDefaultFilterMode m_filterMode; - TPanadapterColors m_panadapterColors; - TNetworkDevicecard m_currentHPSDRDevice; - TTransmitter m_transmitter; - TWideband m_widebandOptions; - - QList m_metisCards; - QList m_receiverDataList; - QList m_bandList; - QList m_bandTextList; - QList m_defaultFilterList; - //QList m_clDevices; - QList m_rxStringList; - QList m_alexStates; - QList m_HPFLoFrequencyList; - QList m_HPFHiFrequencyList; - QList m_LPFLoFrequencyList; - QList m_LPFHiFrequencyList; - QList m_rxJ6pinList; - QList m_txJ6pinList; - - QString m_titleString; - QString m_versionString; - QString m_serverAddress; - QString m_hpsdrDeviceLocalAddr; - QString m_callsignString; - QString settingsFilename; - - QDateTime startTime; - QDateTime now; - - QHostAddress m_hostAddress; - - - quint16 m_serverPort; - quint16 m_listenerPort; - quint16 m_audioPort; - quint16 m_metisPort; - quint16 m_alexConfig; - - bool setLoaded; - - bool m_mainPower; - bool m_defaultSkin; - bool m_connected; - bool m_clientConnected; - bool m_pboFound; - bool m_fboFound; - bool m_manualSocketBufferSize; - bool m_pennyOCEnabled; - - //bool main_mute; - bool m_checkFirmwareVersions; - bool m_specAveraging; - bool m_panGrid; - bool m_peakHold; - bool m_packetsToggle; - - bool m_frequencyRx1onRx2; - bool m_radioPopupVisible; - - int m_hpsdrHardware; - int m_hpsdrNetworkDevices; - int m_NetworkInterfacesNo; - int m_socketBufferSize; - int m_clientNoConnected; - int m_minimumWidgetWidth; - int m_minimumGroupBoxWidth; - - int m_mercuryReceivers; - int m_currentReceiver; - int m_sampleRate; - int m_mercurySpeed; - - int m_mercuryAttenuator; - int m_mercuryDither; - int m_mercuryRandom; - - int m_outputSampleIncrement; - int m_10MHzSource; - int m_122_8MHzSource; - int m_micSource; - int m_RxClass; - int m_RxTiming; - - int m_framesPerSecond; - int m_multiRxView; - - //int m_wbBuffers; - int m_spectrumSize; - int m_sMeterHoldTime; - - long freq1; - - float m_mainVolume; - - int control_register; - bool connect_at_startup; - - qreal m_dBmDistScaleMin; - qreal m_dBmDistScaleMax; - - qreal m_filterFrequencyLow; - qreal m_filterFrequencyHigh; - - qreal m_chirpAmplitude; - - qint64 m_chirpBufferDurationUs; - qint64 m_chirpBufferLength; - - bool m_chirpReceiverOn; - bool m_showChirpFFT; - bool m_chirpUSB; - - int m_lowerChirpFreq; - int m_upperChirpFreq; - int m_chirpSamplingFreq; - int m_chirpChannels; - int m_chirpRepetitionTimes; - int m_chirpDownSampleRate; - int m_chirpAvgLength; - int m_chirpFilterLowerFrequency; - int m_chirpFilterUpperFrequency; - - int m_fft; - - /*bool m_cudaPresence; - int m_cuda_devices; - int m_cudaLastDevice; - int m_cuda_driver_version; - int m_cuda_runtime_version; - int m_current_cuda_device;*/ - - void checkHPSDRDevices(); -}; - - -//****************************************************** -// Macros - -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** The following Macro "CHECKED_CONNECT" is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ -// Macro which connects a signal to a slot, and which causes application to -// abort if the connection fails. This is intended to catch programming errors -// such as mis-typing a signal or slot name. It is necessary to write our own -// macro to do this - the following idiom -// Q_ASSERT(connect(source, signal, receiver, slot)); -// will not work because Q_ASSERT compiles to a no-op in release builds. - -#define CHECKED_CONNECT(source, signal, receiver, slot) \ - if(!connect(source, signal, receiver, slot)) \ - qt_assert_x(Q_FUNC_INFO, "CHECKED_CONNECT failed", __FILE__, __LINE__); - -#define CHECKED_CONNECT_OPT(source, signal, receiver, slot, opt) \ - if(!connect(source, signal, receiver, slot, opt)) \ - qt_assert_x(Q_FUNC_INFO, "CHECKED_CONNECT failed", __FILE__, __LINE__); - - - -//****************************************************** -// Debug output - -class NullDebug { - -public: - template - NullDebug& operator << (const T) { return *this; } -}; - -inline NullDebug nullDebug() { return NullDebug(); } - - -#ifdef LOG_SETTINGS -# define SETTINGS_DEBUG qDebug().nospace() << "Settings::\t" -#else -# define SETTINGS_DEBUG nullDebug() -#endif - - -//****************************************************** -// sleeper function - -class SleeperThread : public QThread { - - public: - static void msleep(unsigned long msecs) {QThread::msleep(msecs);} - static void usleep(unsigned long usecs) {QThread::usleep(usecs);} -}; - -#endif // CUSDR_SETTINGS_H +/** +* @file cusdr_settings.h +* @brief settings header file for cuSDR +* @author by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-11-18 +*/ + +/* + * Copyright 2010 - 2015 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CUSDR_SETTINGS_H +#define CUSDR_SETTINGS_H + +//#define DEBUG + +#include +#include +#include +#include +#include +#include +#include + +#include "cusdr_hamDatabase.h" +#include "fftw3.h" + +// test for OpenCL +//#include "CL/qclcontext.h" + + +// ************************************** +// messages + +#define BANDSCOPE_IN_USE "Error: bandscope in use" +#define BANDSCOPE_NOT_OWNER "Error: Not owner of bandscope" + +#define RECEIVER_INVALID "Error: Invalid Receiver" +#define RECEIVER_IN_USE "Error: Receiver in use" +#define RECEIVER_NOT_OWNER "Error: Not owner of receiver" + +#define CLIENT_ATTACHED "Error: Client is already attached to receiver" +#define CLIENT_DETACHED "Error: Client is not attached to receiver" + +#define INVALID_COMMAND "Error: Invalid Command" + +#define OK "OK" + +// ************************************** +// constants + +#define ONEPI 3.14159265358979323846264338328 +#define TWOPI 6.28318530717958647692528676656 +//#define AGCOFFSET 33.0 + +#define MAXFREQUENCY 961440000 +#ifdef HL +#define MAXHPFREQUENCY 30720000 +#else +#define MAXHPFREQUENCY 61440000 +#endif +#define MINDBM -180 +#define MAXDBM 10 +#define MINDISTDBM -150 +#define MAXDISTDBM 150 +#define MAX_FFTSIZE 262144 + +// ************************************** +// fftw definitions + +static void my_fftw_write_char(char c, void *f) { fputc(c, (FILE *) f); } +//static void my_fftw_write_char(char c, void *f) { fputc(c, (QFILE *) f); } +#define fftw_export_wisdom_to_file(f) fftw_export_wisdom(my_fftw_write_char, (void*) (f)) +#define fftwf_export_wisdom_to_file(f) fftwf_export_wisdom(my_fftw_write_char, (void*) (f)) +#define fftwl_export_wisdom_to_file(f) fftwl_export_wisdom(my_fftw_write_char, (void*) (f)) + +static int my_fftw_read_char(void *f) { return fgetc((FILE *) f); } +#define fftw_import_wisdom_from_file(f) fftw_import_wisdom(my_fftw_read_char, (void*) (f)) +#define fftwf_import_wisdom_from_file(f) fftwf_import_wisdom(my_fftw_read_char, (void*) (f)) +#define fftwl_import_wisdom_from_file(f) fftwl_import_wisdom(my_fftw_read_char, (void*) (f)) + + + +// ************************************** +// receiver settings + +#define MAX_RECEIVERS 20 +#define MAX_BANDS 22 +#define BUFFER_SIZE 1024 +#define SAMPLE_BUFFER_SIZE 4096 +#define BANDSCOPE_BUFFER_SIZE 4096 + +#define SMALL_PACKETS +#define BIGWIDEBANDSIZE 16384 +//#define BIGWIDEBANDSIZE 32768 +#define SMALLWIDEBANDSIZE 4096 + + +// ************************************** +// IO buffer, command & control settings + +#define IO_BUFFERS 16 +#define IO_BUFFER_SIZE 512 +#define IO_HEADER_SIZE 8 +#define IO_AUDIOBUFFER_SIZE 8192 + +#define SYNC 0x7F + +#define IQ_DATAGRAM_BUFFERS 512 +#define AUDIO_DATAGRAM_BUFFERS 512 + +#define METIS_HEADER_SIZE 8 +#define METIS_DATA_SIZE 1032 + +#define ALEX_PARAMETERS 15 + +// uncomment to compile code that allows for SYNC error recovery +#define RESYNC + +#define MOX_DISABLED 0x00 +#define MOX_ENABLED 0x01 + +#define ATLAS_10MHZ_SOURCE 0x00 +#define PENELOPE_10MHZ_SOURCE 0x04 +#define MERCURY_10MHZ_SOURCE 0x08 +#define PENELOPE_122_88MHZ_SOURCE 0x00 +#define MERCURY_122_88MHZ_SOURCE 0x10 +#define PENELOPE_PRESENT 0x20 +#define MERCURY_PRESENT 0x40 +#define MIC_SOURCE_PENELOPE 0x80 + +//#define MIC_SOURCE_JANUS 0x00 +//#define CONFIG_NONE 0x00 +//#define CONFIG_BOTH 0x60 + + +//#define SPEED_48KHZ 0x00 +//#define SPEED_96KHZ 0x01 +//#define SPEED_192KHZ 0x02 + +#define MODE_CLASS_E 0x01 +#define MODE_OTHERS 0x00 + +#define ALEX_ATTENUATION_0DB 0x00 +#define ALEX_ATTENUATION_10DB 0x01 +#define ALEX_ATTENUATION_20DB 0x02 +#define ALEX_ATTENUATION_30DB 0x03 +#define LT2208_GAIN_OFF 0x00 +#define LT2208_GAIN_ON 0x04 +#define LT2208_DITHER_OFF 0x00 +#define LT2208_DITHER_ON 0x08 +#define LT2208_RANDOM_OFF 0x00 +#define LT2208_RANDOM_ON 0x10 + +//#define SIMPLEX 0x00 +//#define DUPLEX 0x04 + + +// ************************************** +// Metis definitions + +//#define MAX_METIS_CARDS 10 +//#define DISCOVER_IDLE 0 +//#define DISCOVER_SENT 1 +#define DEVICE_PORT 1024 +#define DATA_PORT 8886 + +// ************************************** +// Audio definitions + +#define WAVEFORM_WINDOW_DURATION 250000 +#define WAVEFORM_TILE_LENGTH 4096 + +//#include "cusdr_about.h" +#include "AudioEngine/cusdr_fspectrum.h" +#include "Util/cusdr_queue.h" + + +// ************************************** +// Server modes + +namespace QSDR { + + enum _Error { + + NoError, + NotImplemented, + HwIOError, + ServerModeError, + OpenError, + DataReceiverThreadError, + DataProcessThreadError, + WideBandDataProcessThreadError, + AudioThreadError, + ChirpDataProcessThreadError, + UnderrunError, + FirmwareError, + FatalError + }; + + enum _DataEngineState { + + DataEngineDown, + DataEngineUp + }; + + enum _DSPCore { + + QtDSP, + CudaDSP, + ExternalDSP + }; + + enum _ServerMode { + + NoServerMode, + SDRMode, + ChirpWSPR, + ChirpWSPRFile, + DemoMode + }; + + enum _HWInterfaceMode { + + NoInterfaceMode, + Metis, + Hermes + }; +} + +Q_DECLARE_METATYPE(QSDR::_Error) +Q_DECLARE_METATYPE(QSDR::_DataEngineState) +Q_DECLARE_METATYPE(QSDR::_ServerMode) +Q_DECLARE_METATYPE(QSDR::_HWInterfaceMode) + + +// ************************************** +enum { + prefixNothing = 0, /*!< No prefix. */ + + /* SI units. */ + prefixKilo = 1, /*!< Kilo prefix 1000^1 = 10^3. */ + prefixMega = 2, /*!< Mega prefix 1000^2 = 10^6. */ + prefixGiga = 3, /*!< Giga prefix 1000^3 = 10^9. */ + prefixTera = 4, /*!< Tera prefix 1000^4 = 10^12. */ + prefixPeta = 5, /*!< Peta prefix 1000^5 = 10^15. */ + prefixExa = 6, /*!< Exa prefix 1000^6 = 10^18. */ + prefixZetta = 7, /*!< Zetta prefix 1000^7 = 10^21. */ + prefixYotta = 8, /*!< Yotta prefix 1000^8 = 10^24. */ + prefixSiMax = prefixYotta, + + /* IEC 60027 units. */ + prefixKibi = 1, /*!< Kibi prefix 1024^1 = 2^10. */ + prefixMebi = 2, /*!< Mebi prefix 1024^2 = 2^20. */ + prefixGibi = 3, /*!< Gibi prefix 1024^3 = 2^30. */ + prefixTebi = 4, /*!< Tebi prefix 1024^4 = 2^40. */ + prefixPebi = 5, /*!< Pebi prefix 1024^5 = 2^50. */ + prefixExbi = 6, /*!< Exbi prefix 1024^6 = 2^60. */ + prefixZebi = 7, /*!< Zebi prefix 1024^7 = 2^70. */ + prefixYobi = 8, /*!< Yobi prefix 1024^8 = 2^80. */ + prefixIecMax = prefixYobi, +}; + + +// ************************************** +// type definitions + +typedef QVector qVectorFloat; + +typedef struct _frequency { + + int freqMHz; + int freqkHz; + + long frequency; + +} TFrequency; + +typedef struct _hpsdrDevices { + + bool mercuryPresence; + bool penelopePresence; + bool pennylanePresence; + bool excaliburPresence; + bool alexPresence; + bool hermesPresence; + bool metisPresence; + + int mercuryFWVersion; + int penelopeFWVersion; + int pennylaneFWVersion; + int excaliburFWVersion; + int alexFWVersion; + int hermesFWVersion; + int metisFWVersion; + +} THPSDRDevices; + +typedef struct _ccParameterRx { + + THPSDRDevices devices; + + uchar roundRobin; // roundRobin is varied in a round-robin fashion in order to decode + // all values which are sent in sequence. + + bool ptt; // PTT (1 = active, 0 = inactive), GPIO[23]= Ozy J8-8, Hermes J16-1 + bool dash; // DASH (1 = active, 0 = inactive), GPIO[21]= Ozy J8-6, Hermes J6-2 + bool dot; // DOT (1 = active, 0 = inactive), GPIO[22]= Ozy J8-7, Hermes J6-3 + bool lt2208; // LT2208 Overflow (1 = active, 0 = inactive) + bool hermesI01; // Hermes I01 (0 = active, 1 = inactive) + bool hermesI02; // Hermes I02 (0 = active, 1 = inactive) + bool hermesI03; // Hermes I03 (0 = active, 1 = inactive) + bool hermesI04; // Hermes I04 (0 = active, 1 = inactive) + bool cyclopsPLL; // Cyclops PLL locked (0 = unlocked, 1 = locked) + bool cyclops; // Cyclops - Mercury frequency changed, bit toggles + + //int mercuryFirmwareVersion; // Mercury firmware version + //int penelopeFirmwareVersion; // Penelope firmware version + //int networkDeviceFirmwareVersion; // Metis/Hermes firmware version + + quint16 ain1; // Forward Power from Alex or Apollo + quint16 ain2; // Reverse Power from Alex or Apollo + quint16 ain3; // AIN3 from Penny or Hermes + quint16 ain4; // AIN4 from Penny or Hermes + quint16 ain5; // Forward Power from Penelope or Hermes + quint16 ain6; // AIN6,13.8v supply on Hermes + + bool mercury1_LT2208; //Mercury 1 LT2208 Overflow (1 = active, 0 = inactive) + bool mercury2_LT2208; //Mercury 2 LT2208 Overflow (1 = active, 0 = inactive) + bool mercury3_LT2208; //Mercury 3 LT2208 Overflow (1 = active, 0 = inactive) + bool mercury4_LT2208; //Mercury 4 LT2208 Overflow (1 = active, 0 = inactive) + + +} TCCParameterRx; + +typedef struct _ccParameterTx { + + bool mox; + bool ptt; + bool lineIn; + bool micGain20dB; + bool pennyOCenabled; + bool vnaMode; + + uchar clockByte; + uchar timeStamp; + uchar commonMercuryFrequencies; + + int hpsdr10MhzSource; + int hpsdr122_88MhzSource; + int hpsdrConfig; + int duplex; + int mercuryAttenuator; + int dither; + int random; + int currentAlexState; + + HamBand currentBand; + + QList mercuryAttenuators; + QList alexStates; + //QList alexConfiguration; + quint16 alexConfig; + QList rxJ6pinList; + QList txJ6pinList; + +} TCCParameterTx; + +typedef struct _hpsdrParameter { + + uchar control_in[5]; + uchar control_out[5]; + + QByteArray ccIn; + QByteArray ccOut; + + uchar output_buffer[IO_BUFFER_SIZE]; + //float in_buffer[2*BUFFER_SIZE]; + float out_buffer[2*BUFFER_SIZE]; + + qVectorFloat wbWindow; + + //CPX cpxIn; + //CPX cpxOut; + //CPX cpxTmp; + + QByteArray audioDatagram; + + QHQueue iq_queue; + QHQueue au_queue; + QHQueue wb_queue; + QHQueue > chirp_queue; + QHQueue > data_queue; + + QList inputBuffer; + + QList clientList; + + QMutex mutex; + QMutex networkIOMutex; + + QWaitCondition devicefound; + //QMutex iqMutex; + + QHostAddress hpsdrDeviceIPAddress; + QString hpsdrDeviceName; + + TCCParameterRx ccRx; + TCCParameterTx ccTx; + + int samplerate; + int speed; + int outputMultiplier; + + int metisFW; + int hermesFW; + int mercuryFW; + int penelopeFW; + int pennylaneFW; + + int clients; + int current_client; + int receivers; + int currentReceiver; + int audio_rx; + int timing; + + int currentMetisCard; + + //int hpsdr_10MhzSource; + //int hpsdr_122_88MhzSource; + int mic_source; + int rxClass; + int rx_freq_change; + int tx_freq_change; + + float mic_gain; + float mic_left_buffer[BUFFER_SIZE]; + float mic_right_buffer[BUFFER_SIZE]; + + qreal penelopeForwardVolts; + qreal penelopeForwardPower; + qreal alexForwardVolts; + qreal alexForwardPower; + qreal alexReverseVolts; + qreal alexReversePower; + qreal ain3Volts; + qreal ain4Volts; + qreal supplyVolts; + + bool rcveIQ_toggle; + bool sendIQ_toggle; + bool timeStamp; + bool mute; + + qint16 audiofileChannels; + +} THPSDRParameter; + +typedef struct _networkDeviceCard { + + QHostAddress ip_address; + char mac_address[18]; + int boardID; + QString boardName; + +} TNetworkDevicecard; + +typedef enum _panGraphicsMode { + + Line, // 0 + FilledLine, // 1 + Solid // 2 + +} PanGraphicsMode; + +typedef enum _waterfallColorMode { + + Simple, // 0 + Enhanced // 1 + +} WaterfallColorMode; + +Q_DECLARE_METATYPE (TNetworkDevicecard) +Q_DECLARE_METATYPE (QList) + +typedef struct _receiver { + + QSDR::_DSPCore dspCore; + + HamBand hamBand; + HamBand lastHamBand; + DSPMode dspMode; + AGCMode agcMode; + TDefaultFilterMode defaultFilterMode; + PanGraphicsMode panMode; + WaterfallColorMode waterfallMode; + + QList lastCenterFrequencyList; + QList lastVfoFrequencyList; + QList mercuryAttenuators; + QList dBmPanScaleMinList; + QList dBmPanScaleMaxList; + QList dspModeList; + + bool hangEnabled; + bool agcLines; + bool panLocked; + bool spectrumAveraging; + bool hairCross; + bool panGrid; + bool peakHold; + bool clickVFO; + bool fftAuto; + + long ctrFrequency; + long vfoFrequency; + long ncoFrequency; + + float freqRulerPosition; + float audioVolume; + + qreal mouseWheelFreqStep; + qreal filterLo; + qreal filterHi; + qreal agcSlope; + qreal acgGain; + qreal acgThreshold_dB; + qreal agcHangThreshold; + qreal agcHangLevel; + qreal agcMaximumGain_dB; + qreal agcAttackTime; + qreal agcDecayTime; + qreal agcHangTime; + qreal agcFixedGain_dB; + qreal agcVariableGain; + + int sampleRate; + int framesPerSecond; + int waterfallOffsetLo; + int waterfallOffsetHi; + int averagingCnt; + int fftFactor; + +} TReceiver; + +typedef struct _wideband { + + PanGraphicsMode panMode; + + bool wideBandData; + bool wideBandDisplayStatus; + bool averaging; + + int numberOfBuffers; + int averagingCnt; + + float scalePosition; + + qreal dBmWBScaleMin; + qreal dBmWBScaleMax; + +} TWideband; + +typedef struct _transmitter { + + QSDR::_DSPCore dspCore; + + HamBand hamBand; + DSPMode dspMode; + AGCMode agcMode; + TDefaultFilterMode defaultFilterMode; + + bool txAllowed; + long frequency; + + float audioVolume; + +} TTransmitter; + +typedef struct t_panadapterColors { + + QColor panBackgroundColor; + QColor waterfallColor; + QColor panLineColor; + QColor panLineFilledColor; + QColor panSolidTopColor; + QColor panSolidBottomColor; + QColor wideBandLineColor; + QColor wideBandFilledColor; + QColor wideBandSolidTopColor; + QColor wideBandSolidBottomColor; + QColor distanceLineColor; + QColor distanceLineFilledColor; + QColor panCenterLineColor; + QColor gridLineColor; + +} TPanadapterColors; + + +typedef enum _smeterType { + + SIGNAL_STRENGTH, + AVG_SIGNAL_STRENGTH, + ADC_REAL, + ADC_IMAG, + AGC_GAIN, + MIC, + PWR, + ALC, + EQtap, + LEVELER, + COMP, + CPDR, + ALC_G, + LVL_G, + MIC_PK, + ALC_PK, + EQ_PK, + LEVELER_PK, + COMP_PK, + CPDR_PK + +} TMeterType; + +typedef enum _windowtype { + + RECTANGULAR_WINDOW, + HANNING_WINDOW, + WELCH_WINDOW, + PARZEN_WINDOW, + BARTLETT_WINDOW, + HAMMING_WINDOW, + BLACKMAN2_WINDOW, + BLACKMAN3_WINDOW, + BLACKMAN4_WINDOW, + EXPONENTIAL_WINDOW, + RIEMANN_WINDOW, + BLACKMANHARRIS_WINDOW, + NUTTALL_WINDOW + +} TWindowtype; + + +class Receiver; + +// ********************************************************************* +// thread class + +class QThreadEx : public QThread { + +protected: + void run() { exec(); } + +}; + +// ************************************** +// Settings class + +class Settings : public QObject { + + Q_OBJECT + +public: + static Settings *instance(QObject *parent = 0) { + + if (Settings::m_instance) + return Settings::m_instance; + + Settings::m_instance = new Settings(parent); + + return Settings::m_instance; + } + + static void delete_instance() { + + if (Settings::m_instance) { + + disconnect(Settings::m_instance, 0, 0, 0); + delete Settings::m_instance; + Settings::m_instance = 0; + } + } + + virtual ~Settings(); + + QMutex settingsMutex; + +private: + Settings(QObject *parent = 0); + + static Settings *m_instance; + + QSettings *settings; + QSettings *debugLog; + QErrorMessage *error; + +signals: + void systemMessageEvent(const QString &msg, int); + + void masterSwitchChanged(QObject *sender, bool power); + + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void graphicModeChanged( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode); + + void cpuLoadChanged(short load); + void txAllowedChanged(QObject* sender, bool value); + void multiRxViewChanged(int view); + void sMeterValueChanged(int rx, float value); + void spectrumBufferChanged(int rx, const qVectorFloat& buffer); + void postSpectrumBufferChanged(int rx, const float* buffer); + + void sampleSizeChanged(int rx, int size); + void rxListChanged(QList rxList); + void clientConnectedChanged(QObject* sender, bool connect); + void clientNoConnectedChanged(QObject* sender, int client); + void audioRxChanged(QObject* sender, int rx); + void receiverChanged(int value); + void currentReceiverChanged(QObject *sender, int rx); + void connectedChanged(QObject *sender, bool connect); + + void clientConnectedEvent(int client); + void clientDisconnectedEvent(int client); + void rxConnectedStatusChanged(QObject* sender, int rx, bool value); + void framesPerSecondChanged(QObject* sender, int rx, int value); + + void settingsFilenameChanged(QString filename); + void settingsLoadedChanged(bool loaded); + + void newServerNetworkInterface(QString nicName, QString ipAddress); + void newHPSDRDeviceNIC(QString nicName, QString ipAddress); + void serverNICChanged(int); + void hpsdrDeviceNICChanged(int); + void socketBufferSizeChanged(QObject* sender, int value); + void manualSocketBufferChanged(QObject* sender, bool value); + //void metisCardListChanged(QList list); + void metisCardListChanged(const QList &list); + void hpsdrDevicesChanged(QObject *sender, THPSDRDevices devices); + void hpsdrNetworkDeviceChanged(TNetworkDevicecard card); + void networkDeviceNumberChanged(int value); + void networkIOComboBoxEntryAdded(QString str); + void clearNetworkIOComboBoxEntrySignal(); + void searchMetisSignal(); + void serverAddrChanged(QObject *sender, QString addr); + void hpsdrDeviceLocalAddrChanged(QObject *sender, QString addr); + void serverPortChanged(QObject *sender, quint16 port); + void listenPortChanged(QObject *sender, quint16 port); + void audioPortChanged(QObject *sender, quint16 port); + void metisPortChanged(QObject *sender, quint16 port); + + void showNetworkIO(); + void showWarning(const QString &msg); + + void callsignChanged(); + + void mouseWheelFreqStepChanged(QObject *sender, int rx, qreal value); + void mainVolumeChanged(QObject *sender, int rx, float volume ); + + //void hermesPresenceChanged(bool value); + void hpsdrHardwareChanged(int value); + void hermesVersionChanged(int value); + void mercuryPresenceChanged(bool value); + void mercuryVersionChanged(int value); + void penelopePresenceChanged(bool value); + void penelopeVersionChanged(int value); + void pennyLanePresenceChanged(bool value); + void pennyLaneVersionChanged(int value); + void alexPresenceChanged(bool value); + void excaliburPresenceChanged(bool value); + void metisVersionChanged(int value); + //void alexConfigurationChanged(const QList &conf); + void alexConfigurationChanged(quint16 config); + //void alexParametersChanged(TAlexParameters p); + void alexStatesChanged(const QList &states); + void alexStateChanged(HamBand band, const QList &states); + void alexStateChanged(int pos, int value); + void alexManualStateChanged(QObject *sender, bool value); + void checkFirmwareVersionChanged(QObject *sender, bool value); + void pennyOCEnabledChanged(bool value); + void rxJ6PinsChanged(const QList &states); + void txJ6PinsChanged(const QList &states); + + void protocolSyncChanged(int value); + void adcOverflowChanged(int value); + void packetLossChanged(int value); + void sendIQSignalChanged(int value); + void rcveIQSignalChanged(int value); + + void numberOfRXChanged(QObject *sender, int value); + void sampleRateChanged(QObject *sender, int value); + void mercuryAttenuatorChanged(QObject *sender, HamBand band, int value); + //void mercuryAttenuatorsChanged(QObject *sender, const QList &values); + void ditherChanged(QObject *sender, int value); + void randomChanged(QObject *sender, int value); + void src10MhzChanged(QObject *sender, int source); + void src122_88MhzChanged(QObject *sender, int source); + void micSourceChanged(QObject *sender, int source); + void classChanged(QObject *sender, int value); + void timingChanged(QObject *sender, int value); + void controlBytesOutChanged(QObject *sender, unsigned char *values); + //void ctrFrequencyChanged(QObject* sender, bool value, int rx, long frequency); + void ctrFrequencyChanged(QObject* sender, int mode, int rx, long frequency); + //void vfoFrequencyChanged(QObject* sender, bool value, int rx, long frequency); + void vfoFrequencyChanged(QObject* sender, int mode, int rx, long frequency); + void ncoFrequencyChanged(int rx, long frequency); + + // wideband data + void widebandSpectrumBufferChanged(const qVectorFloat& buffer); + void widebandOptionsChanged(QObject* sender, TWideband options); + void widebandSpectrumBufferReset(); + void widebandStatusChanged(QObject* sender, bool value); + void widebandDataChanged(QObject* sender, bool value); + void widebanddBmScaleMinChanged(QObject *sender, qreal value); + void widebanddBmScaleMaxChanged(QObject *sender, qreal value); + void wideBandScalePositionChanged(QObject *sender, float position); + //void widebandAveragingChanged(QObject *sender, bool value); + //void widebandAveragingCntChanged(QObject *sender, int value); + + + void iqPortChanged(QObject* sender, int rx, int port); + + void hamBandChanged(QObject *sender, int rx, bool byButton, HamBand band); + void dspModeChanged(QObject *sender, int rx, DSPMode mode); + void agcModeChanged(QObject *sender, int rx, AGCMode mode, bool hangEnabled); + void agcHangEnabledChanged(QObject *sender, int rx, bool hang); + void agcGainChanged(QObject *sender, int rx, int value); + void agcThresholdChanged_dB(QObject *sender, int rx, qreal value); + void agcFixedGainChanged_dB(QObject *sender, int rx, qreal value); + void agcMaximumGainChanged_dB(QObject *sender, int rx, qreal value); + void agcHangThresholdChanged(QObject *sender, int rx, int value); + void agcHangThresholdSliderChanged(QObject *sender, int rx, qreal value); + void agcHangLevelChanged_dB(QObject *sender, int rx, qreal value); + void agcLineLevelsChanged(QObject *sender, int rx, qreal thresh, qreal hang); + void agcVariableGainChanged_dB(QObject *sender, int rx, qreal value); + void agcAttackTimeChanged(QObject *sender, int rx, qreal value); + void agcDecayTimeChanged(QObject *sender, int rx, qreal value); + void agcHangTimeChanged(QObject *sender, int rx, qreal value); + void filterFrequenciesChanged(QObject *sender, int rx, qreal low, qreal high); + + void cudaDevicesChanged(QObject *sender, int value); + void cudaDriverChanged(QObject *sender, int value); + void cudaRuntimeChanged(QObject *sender, int value); + void cudaCurrentDeviceChanged(QObject *sender, int value); + void cudaLastDeviceChanged(QObject* sender, int value); + + void freqRulerPositionChanged(QObject *sender, int rx, float position); + + + void audioFormatChanged(QObject *sender, const QAudioFormat &format); + void audioPositionChanged(QObject *sender, qint64 position); + void audioBufferChanged(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer); + //void audioBufferChanged(QObject *sender, const QByteArray &buffer); + + void chirpSignalModeChanged(QObject *sender); + void lowerChirpFreqChanged(QObject *sender, int value); + void upperChirpFreqChanged(QObject *sender, int value); + void chirpAmplitudeChanged(QObject *sender, qreal value); + void chirpSamplingFreqChanged(QObject *sender, int value); + void chirpBufferDurationUsChanged(QObject *sender, qint64 value); + void chirpRepetitionTimesChanged(QObject *sender, int value); + void chirpReceiverChanged(QObject *sender, int value); + void chirpBufferChanged(qint64 length, const QList &buffer); + void chirpAvgLengthChanged(int length); + void chirpFFTShowChanged(bool value); + void chirpSidebandChanged(bool value); + void chirpFilterLowerFrequencyChanged(int value); + void chirpFilterUpperFrequencyChanged(int value); + void chirpSpectrumBufferChanged(int sampleRate, qint64 length, const float *buffer); + void chirpSpectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum); + void chirpSpectrumListChanged(const QList &spectrumList); + + void displayWidgetHeightChanged(int value); + void spectrumSizeChanged(QObject *sender, int value); + void panadapterColorChanged(); + void panGridStatusChanged(bool value, int rx); + void peakHoldStatusChanged(bool value, int rx); + void panLockedStatusChanged(bool value, int rx); + void clickVFOStatusChanged(bool value, int rx); + void hairCrossStatusChanged(bool value, int rx); + void showAGCLinesStatusChanged(QObject *sender, bool value, int rx); + + void spectrumAveragingChanged(QObject *sender, int rx, bool value); + void spectrumAveragingCntChanged(QObject *sender, int rx, int value); + + + void waterfallTimeChanged(int rx, int value); + void waterfallOffesetLoChanged(int rx, int value); + void waterfallOffesetHiChanged(int rx, int value); + + void sMeterHoldTimeChanged(int value); + void dBmScaleMinChanged(int rx, qreal value); + void dBmScaleMaxChanged(int rx, qreal value); + + + void showRadioPopupChanged(bool value); + + void receiverDataReady(); + +public: + void debugSystemState(); + + int loadSettings(); + int saveSettings(); + + QSDR::_ServerMode getCurrentServerMode(); + QSDR::_HWInterfaceMode getHWInterface(); + QSDR::_DataEngineState getDataEngineState(); + + PanGraphicsMode getPanadapterMode(int rx); + WaterfallColorMode getWaterfallColorMode(int rx); + + QString getServerModeString(QSDR::_ServerMode mode); + QString getHWInterfaceModeString(QSDR::_HWInterfaceMode mode); + QString getHDataEngineStateString(QSDR::_DataEngineState mode); + QString getErrorString(QSDR::_Error err); + + QString getValue1000(double value, int valuePrefix, QString unitBase); + QString getValue1024(double value, int valuePrefix, QString unitBase); + + THPSDRDevices getHPSDRDevices(); + + bool getSettingsLoaded(); + bool getMainPower(); + bool getDefaultSkin(); + + int getMinimumWidgetWidth(); + int getMinimumGroupBoxWidth(); + int getMultiRxView(); + bool getPBOPresence(); + bool getFBOPresence(); + + bool getConnected(); + bool getClientConnected(); + bool getTxAllowed(); + + QString getTitleStr(); + QString getVersionStr(); + QString getSettingsFilename(); + QString getCallsign(); + + QString getSDRStyle(); + QString getWidgetStyle(); + QString getMainWindowStyle(); + QString getDockStyle(); + QString getDisplayToolbarStyle(); + QString getMainBtnToolbarStyle(); + QString getStatusbarStyle(); + QString getMessageBoxStyle(); + QString getLineEditStyle(); + QString getDialogStyle(); + QString getColorDialogStyle(); + QString getItemStyle(); + QString getLabelStyle(); + QString getSliderLabelStyle(); + QString getTableStyle(); + QString getComboBoxStyle(); + QString getSpinBoxStyle(); + QString getDoubleSpinBoxStyle(); + QString getMenuStyle(); + QString getMiniButtonStyle(); + QString getVolSliderStyle(); + QString getSplitterStyle(); + QString getFrameStyle(); + QString getTabWidgetStyle(); + //QString getNewSliderStyle(); + + + QString getServerAddr(); + QString getHPSDRDeviceLocalAddr(); + + quint16 getServerPort(); + quint16 getListenPort(); + quint16 getAudioPort(); + quint16 getMetisPort(); + + TNetworkDevicecard getCurrentMetisCard() { return m_currentHPSDRDevice; } + QList getMetisCardsList() { return m_metisCards; } + QList getReceiverDataList() { return m_receiverDataList; } + QList getBandFrequencyList() { return m_bandList; } + QList getHamBandTextList() { return m_bandTextList; } + QList getDefaultFilterList() { return m_defaultFilterList; } + TDefaultFilterMode getCurrentFilterMode() { return m_filterMode; } + quint16 getAlexConfig() { return m_alexConfig; } + QList getAlexStates() { return m_alexStates; } + QList getHPFLoFrequencies() { return m_HPFLoFrequencyList; } + QList getHPFHiFrequencies() { return m_HPFHiFrequencyList; } + QList getLPFLoFrequencies() { return m_LPFLoFrequencyList; } + QList getLPFHiFrequencies() { return m_LPFHiFrequencyList; } + QList getRxJ6Pins() { return m_rxJ6pinList; } + QList getTxJ6Pins() { return m_txJ6pinList; } + int getFramesPerSecond(int rx); + QString getDSPModeString(int mode); + + HamBand getCurrentHamBand(int rx); + QList getMercuryAttenuators(int rx); + //int getMercuryAttenuator(); + + bool getPennyOCEnabled() { return m_pennyOCEnabled; } + int getHpsdrNetworkDevices() { return m_hpsdrNetworkDevices; } + int getNetworkInterfacesNo() { return m_NetworkInterfacesNo; } + bool getMercuryPresence() { return m_devices.mercuryPresence; } + int getMercuryVersion() { return m_devices.mercuryFWVersion; } + bool getPenelopePresence() { return m_devices.penelopePresence; } + int getPenelopeVersion() { return m_devices.penelopeFWVersion; } + bool getPennyLanePresence() { return m_devices.pennylanePresence; } + int getPennyLaneVersion() { return m_devices.pennylaneFWVersion; } + bool getHermesPresence() { return m_devices.hermesPresence; } + int getHermesVersion() { return m_devices.hermesFWVersion; } + int getHPSDRHardware() { return m_hpsdrHardware; } + bool getAlexPresence() { return m_devices.alexPresence; } + bool getExcaliburPresence() { return m_devices.excaliburPresence; } + bool getMetisPresence() { return m_devices.metisPresence; } + int getMetisVersion() { return m_devices.metisFWVersion; } + int getSocketBufferSize() { return m_socketBufferSize; } + bool getManualSocketBufferSize() { return m_manualSocketBufferSize; } + bool getFirmwareVersionCheck() { return m_checkFirmwareVersions; } + + // wideband data & options + TWideband getWidebandOptions() { return m_widebandOptions; } + + bool getWidebandStatus() { return m_widebandOptions.wideBandDisplayStatus; } + bool getWidebandData() { return m_widebandOptions.wideBandData; } + qreal getWidebanddBmScaleMin() { return m_widebandOptions.dBmWBScaleMin; } + qreal getWidebanddBmScaleMax() { return m_widebandOptions.dBmWBScaleMax; } + int getWidebandBuffers() { return m_widebandOptions.numberOfBuffers; } + + + + bool getPanGridStatus(int rx); + bool getPeakHoldStatus(int rx); + bool getPanLockedStatus(int rx); + bool getClickVFOStatus(int rx); + bool getHairCrossStatus(int rx); + bool getFFTAutoStatus(int rx); + + int getMercurySpeed() { return m_mercurySpeed; } + int getOutputSampleIncrement() { return m_outputSampleIncrement; } + int getNumberOfReceivers() { return m_mercuryReceivers; } + //int getCurrentReceivers() { return m_mercuryReceivers; } + int getCurrentReceiver() { return m_currentReceiver; } + bool getFrequencyRx1onRx2() { return m_frequencyRx1onRx2; } + int getSampleRate() { return m_sampleRate; } + + //int getMercuryAttenuator() { return m_mercuryAttenuator; } + int getMercuryDither() { return m_mercuryDither; } + int getMercuryRandom() { return m_mercuryRandom; } + int get10MHzSource() { return m_10MHzSource; } + int get122_8MHzSource() { return m_122_8MHzSource; } + int getMicSource() { return m_micSource; } + int getRxClass() { return m_RxClass; } + int getRxTiming() { return m_RxTiming; } + + qreal getMainVolume(int rx); + qreal getMouseWheelFreqStep(int rx);// { return m_mouseWheelFreqStep; } + AGCMode getAGCMode(int rx); + QString getAGCModeString(int rx); + int getAGCGain(int rx); + qreal getAGCMaximumGain_dB(int rx); + qreal getAGCFixedGain_dB(int rx); + int getAGCHangThreshold(int rx); + int getAGCHangLeveldB(int rx); + + int getLowerChirpFreq() { return m_lowerChirpFreq; } + int getUpperChirpFreq() { return m_upperChirpFreq; } + qreal getChirpAmplitude() { return m_chirpAmplitude; } + int getChirpSamplingFreq() { return m_chirpSamplingFreq; } + qint64 getChirpBufferDurationUs() { return m_chirpBufferDurationUs; } + qint64 getChirpBufferLength() { return m_chirpBufferLength; } + int getChirpChannels() { return m_chirpChannels; } + int getChirpRepetitionTimes() { return m_chirpRepetitionTimes; } + int getChirpDownSampleRate() { return m_chirpDownSampleRate; } + int getChirpAvgLength() { return m_chirpAvgLength; } + int getChirpFilterLowerFrequency() { return m_chirpFilterLowerFrequency; } + int getChirpFilterUpperFrequency() { return m_chirpFilterUpperFrequency; } + bool getChirpReceiver() { return m_chirpReceiverOn; } + bool getChirpFFTShow() { return m_showChirpFFT; } + bool getChirpSideband() { return m_chirpUSB; } + + int getSpectrumSize() { return m_spectrumSize; } + + qreal getdBmDistScaleMin() { return m_dBmDistScaleMin; } + qreal getdBmDistScaleMax() { return m_dBmDistScaleMax; } + + int getSMeterHoldTime() { return m_sMeterHoldTime; } + + qreal getFilterFrequencyLow() { return m_filterFrequencyLow; } + qreal getFilterFrequencyHigh() { return m_filterFrequencyHigh; } + + QList m_ipAddressesList; + QList m_networkInterfaces; + + // audio + QAudio::Mode mode() const { return m_audioMode; } + QAudio::State state() const { return m_audioState; } + QAudioFormat getAudioFormat() const { return m_format; } + + // colors + TPanadapterColors getPanadapterColors() { return m_panadapterColors; } + + bool getSpectrumAveraging(int rx); + int getSpectrumAveragingCnt(int rx); + int getFFTMultiplicator(int rx);// { return m_fft; } + + QMutex debugMutex; + +public slots: + void setMainPower(QObject *sender, bool power); + void setDefaultSkin(QObject *sender, bool value); + void setSettingsFilename(QString filename); + + void setSystemMessage(const QString &msg, int time); + void setSettingsLoaded(bool loaded); + void setCPULoad(short load); + void setCallsign(const QString &callsign); + + void setPBOPresence(bool value); + void setFBOPresence(bool value); + + void setMainVolume(QObject *sender, int rx, float volume); + void setMainVolumeMute(QObject *sender, int rx, bool value); + + void setSystemState( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void setGraphicsState( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode); + + void setTxAllowed(QObject* sender, bool value); + void setMultiRxView(int view); + void setSMeterValue(int rx, float value); + void setSpectrumBuffer(int rx, const qVectorFloat &buffer); + void setPostSpectrumBuffer(int rx, const float*); + void setSampleSize(QObject* sender, int rx, int size); + void setRxList(QList rxList); + void setMetisCardList(QList list); + void searchHpsdrNetworkDevices(); + void clearMetisCardList(); + void setHPSDRDeviceNumber(int value); + void setCurrentHPSDRDevice(TNetworkDevicecard card); + void addNetworkIOComboBoxEntry(QString str); + void clearNetworkIOComboBoxEntry(); + void addServerNetworkInterface(QString nicName, QString ipAddress); + void addHPSDRDeviceNIC(QString nicName, QString ipAddress); + void setNumberOfNetworkInterfaces(int value); + void setServerNetworkInterface(int index); + void setHPSDRDeviceNIC(int index); + void setServerWidgetNIC(int index); + void setHPSDRWidgetNIC(int index); + void setServerAddr(QObject *sender, QString addr); + void setHPSDRDeviceLocalAddr(QObject *sender, QString addr); + void setServerPort(QObject *sender, quint16 port); + void setListenPort(QObject *sender, quint16 port); + void setAudioPort(QObject *sender, quint16 port); + void setMetisPort(QObject *sender, quint16 port); + void setClientConnected(QObject *sender, bool value); + void setClientNoConnected(QObject* sender, int client); + void setRxConnectedStatus(QObject* sender, int rx, bool value); + void setAudioRx(QObject* sender, int rx); + void setConnected(QObject *sender, bool value); + void setCheckFirmwareVersion(QObject *sender, bool value); + + void setHPSDRDevices(QObject *sender, THPSDRDevices devices); + //void setHermesPresence(bool value); + void setHermesVersion(int value); + void setHPSDRHardware(int value); + void setMercuryPresence(bool value); + void setMercuryVersion(int value); + void setPenelopePresence(bool value); + void setPenelopeVersion(int value); + void setPennyLanePresence(bool value); + void setPennyLaneVersion(int value); + void setAlexPresence(bool value); + void setExcaliburPresence(bool value); + void setMetisVersion(int value); + + //void setAlexConfiguration(QObject *sender, const QList &conf); + void setAlexConfiguration(QObject *sender, quint16 conf); + void setAlexHPFLoFrequencies(int filter, long value); + void setAlexHPFHiFrequencies(int filter, long value); + void setAlexLPFLoFrequencies(int filter, long value); + void setAlexLPFHiFrequencies(int filter, long value); + void setAlexStates(QObject *sender, const QList &states); + void setAlexState(QObject *sender, int pos, int value); + void setAlexState(QObject *sender, int value); + void setAlexToManual(QObject *sender, bool value); + int checkAlexState(int state); + + void setPennyOCEnabled(QObject *sender, bool value); + void setRxJ6Pin(QObject *sender, HamBand band, int value); + void setRxJ6Pins(QObject * sender, const QList &states); + void setTxJ6Pin(QObject *sender, HamBand band, int value); + void setTxJ6Pins(QObject * sender, const QList &states); + + void setIQPort(QObject *sender, int rx, int port); + + void setProtocolSync(int value); + void setADCOverflow(int value); + void setPacketLoss(int value); + void setSendIQ(int value); + void setRcveIQ(int value); + + void setReceivers(QObject *sender, int value); + //void setReceiver(QObject *sender, int value); + void setCurrentReceiver(QObject *sender, int value); + void setSampleRate(QObject *sender, int value); + void setMercuryAttenuator(QObject *sender, int value); + void setDither(QObject *sender, int value); + void setRandom(QObject *sender, int value); + void set10MhzSource(QObject *sender, int source); + void set122_88MhzSource(QObject *sender, int source); + void setMicSource(QObject *sender, int source); + void setClass(QObject *sender, int value); + void setTiming(QObject *sender, int value); + void setCtrFrequency(QObject *sender, int mode, int rx, long frequency); + void setCtrFrequency(int rx, long frequency); + long getCtrFrequency(int rx); + void setVFOFrequency(QObject *sender, int mode, int rx, long frequency); + void setVfoFrequency(int rx, long frequency); + long getVfoFrequency(int rx); + void setNCOFrequency(QObject *sender, bool value, int rx, long frequency); + + void clientDisconnected(int client); + void setFramesPerSecond(QObject *sender, int rx, int value); + void setMouseWheelFreqStep(QObject *sender, int rx, qreal value); + void setSocketBufferSize(QObject *sender, int value); + void setManualSocketBufferSize(QObject *sender, bool value); + + void setReceiverDataReady(); + + void setSpectrumSize(QObject *sender, int value); + void setdBmPanScaleMin(int rx, qreal value); + void setdBmPanScaleMax(int rx, qreal value); + + void setdBmDistScaleMin(qreal value); + void setdBmDistScaleMax(qreal value); + + void setHamBand(QObject* sender, int rx, bool byButton, HamBand band); + void setDSPMode(QObject* sender, int rx, DSPMode mode); + void setAGCMode(QObject* sender, int rx, AGCMode mode); + void setAGCGain(QObject* sender, int rx, int value); + void setAGCMaximumGain_dB(QObject *sender, int rx, qreal value); + void setAGCFixedGain_dB(QObject *sender, int rx, qreal value); + void setAGCThreshold_dB(QObject *sender, int rx, qreal value); + + void setAGCHangThresholdSlider(QObject *sender, int rx, qreal value); + void setAGCHangThreshold(QObject *sender, int rx, int value); + void setAGCHangLevel_dB(QObject *sender, int rx, qreal value); + void setAGCLineLevels(QObject *sender, int rx, qreal thresh, qreal hang); + void setAGCShowLines(QObject *sender, int rx, bool value); + void setAGCVariableGain_dB(QObject *sender, int rx, qreal value); + void setAGCAttackTime(QObject *sender, int rx, qreal value); + void setAGCDecayTime(QObject *sender, int rx, qreal value); + void setAGCHangTime(QObject *sender, int rx, qreal value); + void setRXFilter(QObject* sender, int rx, qreal low, qreal high); + + + // wideband data & options + void setWidebandBuffers(QObject *sender, int value); + void setWidebandSpectrumBuffer(const qVectorFloat &buffer); + void resetWidebandSpectrumBuffer(); + void setWidebandOptions(QObject* sender, TWideband options); + void setWidebandStatus(QObject* sender, bool value); + void setWidebandData(QObject* sender, bool value); + void setWidebanddBmScaleMin(QObject* sender, qreal value); + void setWidebanddBmScaleMax(QObject* sender, qreal value); + //void setWidebandAveraging(QObject *sender, bool value); + //void setWidebandAveragingCnt(QObject *sender, int value); + void setWideBandRulerPosition(QObject* sender, float pos); + + //void setOpenCLDevices(QList dev); + + /*void setCudaPresence(bool value); + void setCudaDevices(int value); + void setCudaLastDevice(QObject *sender, int vlaue); + void setCudaDriver(QObject *sender, int value); + void setCudaRuntime(QObject *sender, int value); + void setCurrentCudaDevice(QObject *sender, int value);*/ + + void setFreqRulerPosition(QObject* sender, int rx, float pos); + //void setRulerPosition(QObject *sender, float pos); + + void setAudioFormat(QObject *sender, const QAudioFormat &format); + void setAudioPosition(QObject *sender, qint64 position); + void setAudioBuffer(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer); + //void setAudioBuffer(QObject *sender, const QByteArray &buffer); + + void switchToChirpSignalMode(QObject *sender); + void setLowerChirpFreq(int value); + void setUpperChirpFreq(int value); + void setChirpAmplitude(qreal value); + void setChirpSamplingFreq(int value); + void setChirpBufferDurationUs(int value); + void setChirpRepetitionTimes(int value); + void setChirpReceiver(bool value); + void setChirpAvgLength(int value); + void setChirpFFTShow(bool value); + void setChirpUSB(bool value); + void setChirpFilterLowerFrequency(int value); + void setChirpFilterUpperFrequency(int value); + //void setChirpDownSampleRate(int value); + //void setChirpBufferLength(qint64 length); + void setChirpBuffer(qint64 length, const QList &buffer); + //void setChirpSpectrumBuffer(const QList &buffer); + void setChirpSpectrumBuffer(int sampleRate, qint64 length, const float *buffer); + + //void setSpectrumBuffer(const float *buffer); + void setChirpSpectrum(qint64 position, qint64 length, const FrequencySpectrum &spectrum); + void setChirpSpectrumList(const QList &spectrumList); + + void moveDisplayWidget(int value); + + void setPanadapterColors(TPanadapterColors type); + void setPanGrid(bool value, int rx); + void setPeakHold(bool value, int rx); + void setPanLocked(bool value, int rx); + void setClickVFO(bool value, int rx); + void setHairCross(bool value, int rx); + + void setSpectrumAveraging(QObject *sender, int rx, bool value); + void setSpectrumAveragingCnt(QObject *sender, int rx, int value); + + + void setWaterfallTime(int rx, int value); + void setWaterfallOffesetLo(int rx, int value); + void setWaterfallOffesetHi(int rx, int value); + + void setSMeterHoldTime(int value); + + void showNetworkIODialog(); + void showWarningDialog(const QString &msg); + + void showRadioPopupWidget(); + + QList getCtrFrequencies(); + QList getVfoFrequencies(); + +private slots: + +private: + QSDR::_Error m_systemError; + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QAudio::Mode m_audioMode; + QAudio::State m_audioState; + QAudioFormat m_format; + + THPSDRDevices m_devices; + TDefaultFilterMode m_filterMode; + TPanadapterColors m_panadapterColors; + TNetworkDevicecard m_currentHPSDRDevice; + TTransmitter m_transmitter; + TWideband m_widebandOptions; + + QList m_metisCards; + QList m_receiverDataList; + QList m_bandList; + QList m_bandTextList; + QList m_defaultFilterList; + //QList m_clDevices; + QList m_rxStringList; + QList m_alexStates; + QList m_HPFLoFrequencyList; + QList m_HPFHiFrequencyList; + QList m_LPFLoFrequencyList; + QList m_LPFHiFrequencyList; + QList m_rxJ6pinList; + QList m_txJ6pinList; + + QString m_titleString; + QString m_versionString; + QString m_serverAddress; + QString m_hpsdrDeviceLocalAddr; + QString m_callsignString; + QString settingsFilename; + + QDateTime startTime; + QDateTime now; + + QHostAddress m_hostAddress; + + + quint16 m_serverPort; + quint16 m_listenerPort; + quint16 m_audioPort; + quint16 m_metisPort; + quint16 m_alexConfig; + + bool setLoaded; + + bool m_mainPower; + bool m_defaultSkin; + bool m_connected; + bool m_clientConnected; + bool m_pboFound; + bool m_fboFound; + bool m_manualSocketBufferSize; + bool m_pennyOCEnabled; + + //bool main_mute; + bool m_checkFirmwareVersions; + bool m_specAveraging; + bool m_panGrid; + bool m_peakHold; + bool m_packetsToggle; + + bool m_frequencyRx1onRx2; + bool m_radioPopupVisible; + + int m_hpsdrHardware; + int m_hpsdrNetworkDevices; + int m_NetworkInterfacesNo; + int m_socketBufferSize; + int m_clientNoConnected; + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + + int m_mercuryReceivers; + int m_currentReceiver; + int m_sampleRate; + int m_mercurySpeed; + + int m_mercuryAttenuator; + int m_mercuryDither; + int m_mercuryRandom; + + int m_outputSampleIncrement; + int m_10MHzSource; + int m_122_8MHzSource; + int m_micSource; + int m_RxClass; + int m_RxTiming; + + int m_framesPerSecond; + int m_multiRxView; + + //int m_wbBuffers; + int m_spectrumSize; + int m_sMeterHoldTime; + + long freq1; + + float m_mainVolume; + + int control_register; + bool connect_at_startup; + + qreal m_dBmDistScaleMin; + qreal m_dBmDistScaleMax; + + qreal m_filterFrequencyLow; + qreal m_filterFrequencyHigh; + + qreal m_chirpAmplitude; + + qint64 m_chirpBufferDurationUs; + qint64 m_chirpBufferLength; + + bool m_chirpReceiverOn; + bool m_showChirpFFT; + bool m_chirpUSB; + + int m_lowerChirpFreq; + int m_upperChirpFreq; + int m_chirpSamplingFreq; + int m_chirpChannels; + int m_chirpRepetitionTimes; + int m_chirpDownSampleRate; + int m_chirpAvgLength; + int m_chirpFilterLowerFrequency; + int m_chirpFilterUpperFrequency; + + //int m_fft; + + /*bool m_cudaPresence; + int m_cuda_devices; + int m_cudaLastDevice; + int m_cuda_driver_version; + int m_cuda_runtime_version; + int m_current_cuda_device;*/ + + void checkHPSDRDevices(); +}; + + +//****************************************************** +// Macros + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** The following Macro "CHECKED_CONNECT" is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ +// Macro which connects a signal to a slot, and which causes application to +// abort if the connection fails. This is intended to catch programming errors +// such as mis-typing a signal or slot name. It is necessary to write our own +// macro to do this - the following idiom +// Q_ASSERT(connect(source, signal, receiver, slot)); +// will not work because Q_ASSERT compiles to a no-op in release builds. + +#define CHECKED_CONNECT(source, signal, receiver, slot) \ + if(!connect(source, signal, receiver, slot)) \ + qt_assert_x(Q_FUNC_INFO, "CHECKED_CONNECT failed", __FILE__, __LINE__); + +#define CHECKED_CONNECT_OPT(source, signal, receiver, slot, opt) \ + if(!connect(source, signal, receiver, slot, opt)) \ + qt_assert_x(Q_FUNC_INFO, "CHECKED_CONNECT failed", __FILE__, __LINE__); + + + +//****************************************************** +// Debug output + +class NullDebug { + +public: + template + NullDebug& operator << (const T) { return *this; } +}; + +inline NullDebug nullDebug() { return NullDebug(); } + + +#ifdef LOG_SETTINGS +# define SETTINGS_DEBUG qDebug().nospace() << "Settings::\t" +#else +# define SETTINGS_DEBUG nullDebug() +#endif + + +//****************************************************** +// sleeper function + +class SleeperThread : public QThread { + + public: + static void msleep(unsigned long msecs) {QThread::msleep(msecs);} + static void usleep(unsigned long usecs) {QThread::usleep(usecs);} +}; + +#endif // CUSDR_SETTINGS_H diff --git a/Source/src/cusdr_transmitPAWidget.cpp b/Source/src/cusdr_transmitPAWidget.cpp index 1adc23a..07fd9e5 100644 --- a/Source/src/cusdr_transmitPAWidget.cpp +++ b/Source/src/cusdr_transmitPAWidget.cpp @@ -133,7 +133,7 @@ void TransmitPAWidget::createGainGroup() { // band label QStringList bandNames; - bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "gen"; + bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen"; QList bandLabelList; diff --git a/Source/src/main.cpp b/Source/src/main.cpp index f7baf67..108788c 100644 --- a/Source/src/main.cpp +++ b/Source/src/main.cpp @@ -32,6 +32,9 @@ #include "Util/cusdr_cpuUsage.h" #elif defined(Q_OS_LINUX) #include "Util/cusdr_cpuUsage_unix.h" + #include + #include + #define fopen_s(pFile,filename,mode) ((*(pFile))=fopen((filename), (mode)))==NULL #endif #include "fftw3.h" @@ -88,35 +91,51 @@ void cuSDRMessageHandler(QtMsgType type, const QMessageLogContext &context, cons ts << txt << endl << flush; } -static void my_fftw_write_char(char c, void *f) { fputc(c, (FILE *) f); } -#define fftw_export_wisdom_to_file(f) fftw_export_wisdom(my_fftw_write_char, (void*) (f)) -#define fftwf_export_wisdom_to_file(f) fftwf_export_wisdom(my_fftw_write_char, (void*) (f)) -#define fftwl_export_wisdom_to_file(f) fftwl_export_wisdom(my_fftw_write_char, (void*) (f)) - -static int my_fftw_read_char(void *f) { return fgetc((FILE *) f); } -#define fftw_import_wisdom_from_file(f) fftw_import_wisdom(my_fftw_read_char, (void*) (f)) -#define fftwf_import_wisdom_from_file(f) fftwf_import_wisdom(my_fftw_read_char, (void*) (f)) -#define fftwl_import_wisdom_from_file(f) fftwl_import_wisdom(my_fftw_read_char, (void*) (f)) - void runFFTWWisdom() { QString directory = QDir::currentPath(); - QDir currentDir = QDir(directory); - qDebug() << currentDir; + + int err; + FILE* wisdomFile; + + qDebug() << "Init::\tcurrent path: " << qPrintable(currentDir.absolutePath()); - if (currentDir.exists("wisdom")) { + if (currentDir.exists("fftwf_wisdom")) { - qDebug() << "wisdom exists !"; - return; + qDebug() << "Init::\tfftwf_wisdom exists."; + + /*errno_t err; + FILE* wisdomFile;*/ + err = fopen_s(&wisdomFile, "fftwf_wisdom", "r"); + if (err == 0) { + + qDebug() << "Init::\tfound fftwf_wisdom - this will be quick!"; + fftwf_import_wisdom_from_file(wisdomFile); + fclose(wisdomFile); + } + else { + + qDebug() << "Init::\tfound fftwf_wisdom but could not open."; + return; + } + } else { - qDebug() << "wisdom does not exist - planning FFT..."; - - /*const char* wisdom_file = "wisdom"; - if (!fftw_import_wisdom_from_file(wisdom_file)) { + qDebug() << "Init::\tfftw_wisdom does not exist - planning FFT..."; + + //string fname = "F:\\Eigene Dokumente\\Visual Studio 2010\\Projects\\cuSDR64\\fftwf_wisdom"; + //FILE* wis = fopen (fname.c_str(), "r"); + + /*if (wis) { + qDebug() << "Init::\tfound fftwf_wisdom - this will be quick!"; + fftwf_import_wisdom_from_file(wis); + fclose (wis); + } + else {*/ + int size = 64; QString str = "Planning FFT size %1"; @@ -127,7 +146,7 @@ void runFFTWWisdom() { while (size <= MAX_FFTSIZE) { - qDebug() << str.arg(size); + qDebug() << qPrintable(str.arg(size)); cpxbuf = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * size); plan_fwd = fftwf_plan_dft_1d(size , cpxbuf, cpxbuf, FFTW_FORWARD, FFTW_PATIENT); @@ -140,12 +159,22 @@ void runFFTWWisdom() { size *= 2; } - fftw_export_wisdom_to_file(wisdom_file); - }*/ - //QProcess process; - //process.start("fftwf-wisdom.exe"); - //process.waitForFinished(); - } + //FILE* wis = fopen (fname.c_str(), "w"); + //if (wis) { + + err = fopen_s(&wisdomFile, "fftwf_wisdom", "w"); + if (err == 0) { + + qDebug() << "Init::\texporting fftwf_wisdom for quick measurement."; + fftwf_export_wisdom_to_file(wisdomFile); + qDebug() << "Init::\texported fftwf_wisdom."; + fclose(wisdomFile); + } + else { + + qDebug() << "Init::\tcould not write fftwf_wisdom."; + } + } } int main(int argc, char *argv[]) { @@ -353,6 +382,94 @@ int main(int argc, char *argv[]) { SleeperThread::msleep(300); + //************************************************************************* + // FFTW wisdom + + QString directory = QDir::currentPath(); + QDir currentDir = QDir(directory); + + int err; + FILE* wisdomFile; + + qDebug() << "Init::\tcurrent path: " << qPrintable(currentDir.absolutePath()); + + if (currentDir.exists("fftwf_wisdom")) { + + qDebug() << "Init::\tfftwf_wisdom exists."; + + err = fopen_s(&wisdomFile, "fftwf_wisdom", "r"); + if (err == 0) { + + qDebug() << "Init::\tfound fftwf_wisdom - this will be quick!"; + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": found fftwf_wisdom - loading .."), + Qt::AlignTop | Qt::AlignLeft, Qt::yellow); + + fftwf_import_wisdom_from_file(wisdomFile); + fclose(wisdomFile); + } + else { + + qDebug() << "Init::\tfound fftwf_wisdom but could not open."; + return -1; + } + + } + else { + + qDebug() << "Init::\tfftw_wisdom does not exist - planning FFT..."; + + QString msg = "First time FFT planning. Please be patient, this may take up to 10 min!"; + mainWindow.showWarningDialog(msg); + + int size = 64; + QString str = "planning FFT size %1 ..."; + + fftwf_complex* cpxbuf; + fftwf_plan plan_fwd; + fftwf_plan plan_rev; + + while (size <= MAX_FFTSIZE) { + //while (size <= 2048) { + + qDebug() << qPrintable(str.arg(size)); + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": ") + str.arg(size), + Qt::AlignTop | Qt::AlignLeft, Qt::yellow); + + cpxbuf = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * size); + + plan_fwd = fftwf_plan_dft_1d(size , cpxbuf, cpxbuf, FFTW_FORWARD, FFTW_PATIENT); + fftwf_execute(plan_fwd); + fftwf_destroy_plan(plan_fwd); + + plan_rev = fftwf_plan_dft_1d(size, cpxbuf, cpxbuf, FFTW_BACKWARD, FFTW_PATIENT); + fftwf_execute(plan_rev); + fftwf_destroy_plan(plan_rev); + + size *= 2; + } + + err = fopen_s(&wisdomFile, "fftwf_wisdom", "w"); + if (err == 0) { + + qDebug() << "Init::\texporting fftwf_wisdom for quick measurement."; + fftwf_export_wisdom_to_file(wisdomFile); + qDebug() << "Init::\texported fftwf_wisdom."; + fclose(wisdomFile); + } + else { + + qDebug() << "Init::\tcould not write fftwf_wisdom."; + } + } + //app.processEvents(); mainWindow.show();