From 40e34bdebd00c13ce61c648728888fc3e37e94a4 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 17 Apr 2022 01:31:50 +0200 Subject: [PATCH] Massive UI revamping (v7): implemented device common settings from top bar and added documentation on device windows top and bottom bars --- doc/img/BeamsteeringCWMod_plugin.png | Bin 13932 -> 10159 bytes doc/img/BeamsteeringCWMod_plugin.xcf | Bin 42258 -> 30301 bytes doc/img/DeviceWindow.png | Bin 0 -> 30881 bytes doc/img/DeviceWindow.xcf | Bin 0 -> 81246 bytes doc/img/DeviceWindow_bottom.png | Bin 0 -> 3276 bytes doc/img/DeviceWindow_bottom.xcf | Bin 0 -> 14194 bytes doc/img/DeviceWindow_top.png | Bin 0 -> 11528 bytes doc/img/DeviceWindow_top.xcf | Bin 0 -> 47954 bytes doc/img/MainWindow_presets.png | Bin 7161 -> 6865 bytes doc/img/MainWindow_presets.xcf | Bin 24207 -> 26513 bytes doc/img/MainWindow_presets_view.png | Bin 59405 -> 56312 bytes doc/img/MainWindow_presets_view.xcf | Bin 176482 -> 158712 bytes plugins/channelrx/demodadsb/readme.md | 2 + .../bladerf2mimo/bladerf2mimogui.cpp | 33 +-- plugins/samplemimo/bladerf2mimo/readme.md | 2 + .../samplemimo/limesdrmimo/limesdrmimogui.cpp | 33 +-- plugins/samplemimo/limesdrmimo/readme.md | 2 + plugins/samplemimo/metismiso/metismisogui.cpp | 33 +-- plugins/samplemimo/metismiso/readme.md | 2 + .../plutosdrmimo/plutosdrmimogui.cpp | 33 +-- plugins/samplemimo/plutosdrmimo/readme.md | 2 + plugins/samplemimo/testmi/readme.md | 2 + plugins/samplemimo/testmi/testmigui.cpp | 33 +-- plugins/samplemimo/testmi/testmisettings.h | 3 +- plugins/samplemimo/testmosync/readme.md | 2 + .../samplemimo/testmosync/testmosyncgui.cpp | 26 ++ plugins/samplemimo/testmosync/testmosyncgui.h | 1 + .../testmosync/testmosyncsettings.cpp | 21 ++ .../testmosync/testmosyncsettings.h | 4 + plugins/samplemimo/xtrxmimo/readme.md | 2 + plugins/samplemimo/xtrxmimo/xtrxmimogui.cpp | 33 +-- .../samplesink/audiooutput/audiooutputgui.cpp | 34 +-- plugins/samplesink/audiooutput/readme.md | 2 + .../bladerf1output/bladerf1outputgui.cpp | 33 +-- plugins/samplesink/bladerf1output/readme.md | 2 + .../bladerf2output/bladerf2outputgui.cpp | 33 +-- plugins/samplesink/bladerf2output/readme.md | 2 + .../samplesink/fileoutput/fileoutputgui.cpp | 26 ++ plugins/samplesink/fileoutput/fileoutputgui.h | 1 + plugins/samplesink/fileoutput/readme.md | 2 + .../hackrfoutput/hackrfoutputgui.cpp | 33 +-- plugins/samplesink/hackrfoutput/readme.md | 4 +- .../limesdroutput/limesdroutputgui.cpp | 34 +-- plugins/samplesink/limesdroutput/readme.md | 2 + .../samplesink/localoutput/localoutputgui.cpp | 33 +-- plugins/samplesink/localoutput/readme.md | 2 + .../plutosdroutput/plutosdroutputgui.cpp | 33 +-- plugins/samplesink/plutosdroutput/readme.md | 2 + plugins/samplesink/remoteoutput/readme.md | 2 + .../remoteoutput/remoteoutputgui.cpp | 33 +-- plugins/samplesink/soapysdroutput/readme.md | 2 + .../soapysdroutput/soapysdroutputgui.cpp | 33 +-- plugins/samplesink/testsink/readme.md | 4 +- plugins/samplesink/testsink/testsinkgui.cpp | 26 ++ plugins/samplesink/testsink/testsinkgui.h | 1 + .../samplesink/testsink/testsinksettings.cpp | 22 +- .../samplesink/testsink/testsinksettings.h | 4 + plugins/samplesink/usrpoutput/readme.md | 4 +- .../samplesink/usrpoutput/usrpoutputgui.cpp | 34 +-- plugins/samplesink/xtrxoutput/readme.md | 3 + .../samplesink/xtrxoutput/xtrxoutputgui.cpp | 33 +-- plugins/samplesource/airspy/airspygui.cpp | 33 +-- plugins/samplesource/airspyhf/airspyhfgui.cpp | 33 +-- plugins/samplesource/airspyhf/readme.md | 2 + .../samplesource/audioinput/audioinputgui.cpp | 34 +-- plugins/samplesource/audioinput/readme.md | 2 + .../bladerf1input/bladerf1inputgui.cpp | 33 +-- plugins/samplesource/bladerf1input/readme.md | 2 + .../bladerf2input/bladerf2inputgui.cpp | 33 +-- plugins/samplesource/bladerf2input/readme.md | 2 + plugins/samplesource/fcdpro/fcdprogui.cpp | 33 +-- plugins/samplesource/fcdpro/readme.md | 2 + .../samplesource/fcdproplus/fcdproplusgui.cpp | 33 +-- plugins/samplesource/fcdproplus/readme.md | 4 +- .../samplesource/fileinput/fileinputgui.cpp | 33 +-- plugins/samplesource/fileinput/readme.md | 2 + .../hackrfinput/hackrfinputgui.cpp | 33 +-- plugins/samplesource/hackrfinput/readme.md | 4 +- plugins/samplesource/kiwisdr/kiwisdrgui.cpp | 33 +-- plugins/samplesource/kiwisdr/readme.md | 2 + .../limesdrinput/limesdrinputgui.cpp | 33 +-- plugins/samplesource/limesdrinput/readme.md | 4 +- .../samplesource/localinput/localinputgui.cpp | 33 +-- plugins/samplesource/localinput/readme.md | 2 + plugins/samplesource/perseus/perseusgui.cpp | 33 +-- plugins/samplesource/perseus/readme.md | 2 + .../plutosdrinput/plutosdrinputgui.cpp | 33 +-- plugins/samplesource/plutosdrinput/readme.md | 2 + plugins/samplesource/remoteinput/readme.md | 2 + .../remoteinput/remoteinputgui.cpp | 33 +-- plugins/samplesource/rtlsdr/readme.md | 2 + plugins/samplesource/rtlsdr/rtlsdrgui.cpp | 34 +-- plugins/samplesource/sdrplay/readme.md | 24 +- plugins/samplesource/sdrplay/sdrplaygui.cpp | 33 +-- plugins/samplesource/sdrplayv3/readme.md | 2 + .../samplesource/sdrplayv3/sdrplayv3gui.cpp | 33 +-- plugins/samplesource/sigmffileinput/readme.md | 2 + .../sigmffileinput/sigmffileinputgui.cpp | 33 +-- plugins/samplesource/soapysdrinput/readme.md | 2 + .../soapysdrinput/soapysdrinputgui.cpp | 33 +-- .../samplesource/testsource/testsourcegui.cpp | 33 +-- plugins/samplesource/usrpinput/readme.md | 7 +- .../samplesource/usrpinput/usrpinputgui.cpp | 33 +-- plugins/samplesource/xtrxinput/readme.md | 2 + .../samplesource/xtrxinput/xtrxinputgui.cpp | 33 +-- sdrgui/channel/channelgui.cpp | 2 +- sdrgui/device/devicegui.cpp | 15 ++ sdrgui/device/devicegui.h | 5 +- sdrgui/device/readme.md | 225 ++++++++++++++++++ 109 files changed, 1201 insertions(+), 630 deletions(-) create mode 100644 doc/img/DeviceWindow.png create mode 100644 doc/img/DeviceWindow.xcf create mode 100644 doc/img/DeviceWindow_bottom.png create mode 100644 doc/img/DeviceWindow_bottom.xcf create mode 100644 doc/img/DeviceWindow_top.png create mode 100644 doc/img/DeviceWindow_top.xcf create mode 100644 sdrgui/device/readme.md diff --git a/doc/img/BeamsteeringCWMod_plugin.png b/doc/img/BeamsteeringCWMod_plugin.png index 0a0dead8ce364d11d170c9e8343d428033637f3b..56c30be239ec95ed38600bbe58ac5f70730c8ce6 100644 GIT binary patch literal 10159 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 COuvf& diff --git a/doc/img/BeamsteeringCWMod_plugin.xcf b/doc/img/BeamsteeringCWMod_plugin.xcf index beb80beb87bf0a7393859d7a6c7b9716dc331cca..dbe0728d36a0c40743627162bc81111d2d38b06d 100644 GIT binary patch literal 30301 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

0B9|Fykqz? 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 literal 42258 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

F)LQ*>pE$G^93pJx!;t_E%iM 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 literal 0 HcmV?d00001 diff --git a/doc/img/DeviceWindow.xcf b/doc/img/DeviceWindow.xcf new file mode 100644 index 0000000000000000000000000000000000000000..fa1ca2efbc70dfcd580184f584942a1092449c5f GIT binary patch literal 81246 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 KL%-{ivi}E+8*C^5 literal 0 HcmV?d00001 diff --git a/doc/img/DeviceWindow_bottom.png b/doc/img/DeviceWindow_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..eb436eabc2b6cc349bd28f3c6c0777aeaa03a360 GIT binary patch literal 3276 zcmbtWcT`jP){UZsiNHva5>)yC(gcEpHW^4LL7D;q1VJVsf{208OHk?{0uqX%k)i=c zkx&Ez(usf+LkWT)Efb1FAwZNwX)iPLee0XIzW3j|Yu&rfJ@=k{&)UEJJ9no$+FJ>M zz#sqsAcV9=Tm%3PQF(E!06*`#S8%19mq-qP!yS=uxEv<*=GA~8KL9{ACqBp2n)1uZ z9&g$mS!bj7W<+=@)Axe&>kE~R$)GaSwRc^MW7^lo?h%`yAktAFOrla)i~7o_36!`1 z{OxIO?vso>ZU=Ehp*M+vYi;2)#R3H~K~8Twp(TL@Irgu6f`VN><17I3UlbB`(hI+P zp2<&M;l4`Cu8!0xT8dvE9<5%qs>wkPi>0Oa{0baAHDr@&V`6dA#W`~;<;5UqMUxs>)_aMws4ckMkncyL z-Icp-p&@@%L^n|N>EUBKm-H{%5(8lCblK2dwb1^>Gf6qapQ`WHej{hth8Pir}k$r3A942ITV$pOV6etxp zrVI~Ng4vZi0_KK4J__yZ)Epr%Z%<73t@7O~CE*P^yX4PaBz_Lhj^u=GZ?g(f2{4R( zXt}SSx%9cJMc2ETdZ zhF@?P03Pb+6XxeD7a0(CP0k8w=jeJ{SP}pLH6jsa&Qa5Avk5_Y{)aj@S+SD^>X=C# z)wRX~$7^a?&A~yl)0Xb)SA)=JE2t!>_%_@Q5?J7ew>Zg!JPKxt3n>;x?7w#_|KRy# zYX6rz_8%?vOYKt=Q@ZO!_=Hj#TP{wsv+eoo?={YRm7I47m2dNs%~D}~9c0h#v`Yeh zP(qH~N+uje;sq;|kf~01C5jpnPtQ~8$JpR~p^yLD2V+wBWpV4L9#7=M(Lh(@4m{nq zaT>ww^%8-0fNML;bl>3VCi7(qm}i1@N@{*_*}M*131i=UzK6N(NxQl6-}j}w7C5U$~LvPf+Q{WJwgq30y6X7`N1r`MF8ps@G8%SL*Y(N;Waia8Ahh;T0#o z@dLhy-D4#6q?Us2R`cJRc{HSAA*+FD2SG`v9$jJ0FKi@~?&fZk4x5L8XTr31$1!KZ zPkYYC8c)qXDrw^@;u_gnM`kHe3?G_!PI1}~#?5*WZZ)EHp#(*tO2g=l(NOMgUu?(R zw!;cSmw+~FeaaawAQO%WWq9Mn3bb(tpD0#7ltIiS`LT@Jl*uXOsk*HNrbh|mZ0qg= zcBzPtp%`duVat%3!s8(p!rDQz4w-A49*!j&s(>YmqiZ-!^T{~y`hm#j_k5FH{GVho z!MtuRz12u@k&&-B?iD5Ag?n!}TJvFBo4a3KN-U3zTwAiBrsoB<_Z12%le_&VyNMdy z*}$lt%k^M)S_K>`DBa$zOfh6?a1T2tNSX(1eA%n{=1)yeeY^a1L?jK?ChP(BF$c#* z{p>ss7)>A9&B7{4Q%4tbE-4T`!#!pb36q#dks{*r7Sc>Q^P?=3_UR!*8)OFTzEdF}NPS7YGV?=g0VQD%7J zp)FJUzs3GcM{AB@yL4NuOGa%bw@m?aERRQ&ppJ|R@Vqk$Rku27L^emFZQjM_C+!#V z0flR@EA|va(c8uz_bS&bl}=~VXf(LVY1uJuj&-u5>g$PyuN5=ijU*E_hNXfC6BV?T zufpqbv4;_&tE;Pe=8S@#Uap+f3~2d&T z_OVgJ@SZ=I+}cX;8!Q-|nnFfL8>S-?UA^PK-em}fyH+a&gh}PlE?l)slbr)jx_+_L zn-Wb&6nm(OKdGuRZB9~WIoGxFsL!l(t%Wu(~^;rmnuv6L*%UNG~c%4Kq zid~nN$f%8Ed6CZ`!FQ)?!>8weOJ-N09yD(3RkPX@zg51?wNMZl7#Mh<>j#>howX%E zb3Tz;vQ8OCd}$eM?082nL}kht1p96+_K%N`Zw%=T*Mu;7^+;Nm!)?Ykj%vA>osN`@ zW@%$`f3ka0Q**Dr9`dTC<@QsVZZid#Yk9mE5{{BwR&f~0Mf+nE?R$fwai^&WGJg=-&Q&ojB z7(x|Fnehx`QFe`*5?8iz%pf1Oc5GyKPMs5B&Mxz1a zjRp>ee-KKeAf8@Gl#>HziVCOo_xH<-gPI?q@c4jlMsG9|tA?{a(yV2Mu_owVK~l&5 zcRd_T;4rCm%ZAkS2dMGJhlq)$qh_5m&DdwppFgRp%EUlzEi71Ci6_)iH5j`27MqP! z64h|8OMd25F~(aD2)K+y$}*Ubqh)&GQ<-%#ba-TEqhv|h6y~Sc21B3jBg;dDl&z(~ zLjCI#?y?E=6v?`{Z=s2DCAGCVR4Nt67t^nNAG7i}GIW<4@{`@e*GDBiJF&y2R`Kzs zE-o(O;^L0p-oxc~k5tvw8I2!;85?v;J(-MMExW(<9-STX<>Lhd91?tonMU6@Ft~4ZIyxDT7d@k{9=$y^H+!_9p`pU0vAMah?EL+$ z>Fd?C@jDTys!J9c5{x%Fiov^hh}$4euo=6M-eTE9la5rUqWiLHu`5&@jJ~+&Sk(Sp zF!2_Nq-A7e^k!gy$=1`<)P(5khj3;ibBl`X;c$w3l& zDArHrwac5IqM4Rcufo-Lw%5?p^#SbyN&#mB+kt6wiN)0?^&J8{tDt(iy1Y5WBVu%V z+K8xAS6BDFP0-uJLuNCIP*D^U_zR=HzJ6nuJz;cO!$U)VPVe#Y*R|-r)YiZ??cj8T!e3L{TM!R9o)BNhiFl=4Nf(<37rP4EKm=K^ ztF))#YBDYR$2|HzWA784pH&(k;3CU32wm@j9r46X6@ZDAIUa)P=Mn~UVW=19a$XHH zY`dD|$p9ptp9(ioM#8-{i_$zpZ19VBobZtH@vO&`8zxX|Jkbo}TJ;~ym-0W1m@-nA zfLD_KpI_HM<9~Rz|L@=aF8kZd{X4{;W&aEJ4~Rcs{dWuae`UVVzvHsr1Aszw2VxbX Sb&O|o0Z0pb1j+nL;=cfUXh#A7 literal 0 HcmV?d00001 diff --git a/doc/img/DeviceWindow_bottom.xcf b/doc/img/DeviceWindow_bottom.xcf new file mode 100644 index 0000000000000000000000000000000000000000..dc4a86e705418c026b037cc0eaa7f43efa2c9d1f GIT binary patch literal 14194 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 v#!Nx-rD7u)iL^^cHOv184}zV? literal 0 HcmV?d00001 diff --git a/doc/img/DeviceWindow_top.png b/doc/img/DeviceWindow_top.png new file mode 100644 index 0000000000000000000000000000000000000000..5cae79348d0c1b8425d7d40fb2b4dee2a464c7fe GIT binary patch literal 11528 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 D!BUnD literal 0 HcmV?d00001 diff --git a/doc/img/DeviceWindow_top.xcf b/doc/img/DeviceWindow_top.xcf new file mode 100644 index 0000000000000000000000000000000000000000..89aec7d38b5609d92697eada0f976f99eb86f506 GIT binary patch literal 47954 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 F^S{C_LGb_p literal 0 HcmV?d00001 diff --git a/doc/img/MainWindow_presets.png b/doc/img/MainWindow_presets.png index 31791a73030fdb38a5210d6446c72d36a58f9494..f6e1b7096fd8767d73ba77057ce27bb68991b4bb 100644 GIT binary patch literal 6865 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 E0{Jve#sB~S diff --git a/doc/img/MainWindow_presets.xcf b/doc/img/MainWindow_presets.xcf index ace00b859b05310a4052d41801ce2cc7cd6cf3db..51008e7cc6439358daecad3bc31380142e1055ed 100644 GIT binary patch literal 26513 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 literal 24207 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 iRD?7WsT8S_>d>wxUD5t&B| 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 Nj+TKYL;Zx${{UsNfbjqT literal 59405 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 Z2ko!;xzSR3tdwr_YaNHt@7!vC^Z!;C1fT!_ literal 176482 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 NzO~~v{;XF1{{da%mlFU0 diff --git a/plugins/channelrx/demodadsb/readme.md b/plugins/channelrx/demodadsb/readme.md index 48cc25afb..8237c0d2f 100644 --- a/plugins/channelrx/demodadsb/readme.md +++ b/plugins/channelrx/demodadsb/readme.md @@ -2,6 +2,8 @@

Introduction

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + The ADS-B demodulator plugin can be used to receive and display ADS-B aircraft information. This is information about an aircraft, such as position, altitude, heading and speed, broadcast by aircraft on 1090MHz, in the 1090ES (Extended Squitter) format. 1090ES frames have a chip rate of 2Mchip/s, so the baseband sample rate should be set to be greater than 2MSa/s. As well as displaying information received via ADS-B, the plugin can also combine information from a number of databases to display more information about the aircraft and flight. diff --git a/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp b/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp index 6639a8b06..6621d25ac 100644 --- a/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp +++ b/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp @@ -29,7 +29,6 @@ #include "device/deviceuiset.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspdevicemimoengine.h" @@ -100,8 +99,7 @@ BladeRF2MIMOGui::BladeRF2MIMOGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleMIMO->setMessageQueueToGUI(&m_inputMessageQueue); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStopRx); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); sendSettings(); makeUIConnections(); @@ -794,21 +792,26 @@ void BladeRF2MIMOGui::updateStatus() void BladeRF2MIMOGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } float BladeRF2MIMOGui::getGainDB(int gainValue, int gainMin, int gainMax, int gainStep, float gainScale) diff --git a/plugins/samplemimo/bladerf2mimo/readme.md b/plugins/samplemimo/bladerf2mimo/readme.md index 5425a54bb..f8dc2c303 100644 --- a/plugins/samplemimo/bladerf2mimo/readme.md +++ b/plugins/samplemimo/bladerf2mimo/readme.md @@ -19,6 +19,8 @@ The BladeRF Host library is also provided by many Linux distributions (check its

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![BladeRF2 MIMO plugin GUI](../../../doc/img/BladeRF2MIMO_plugin.png)

1. Rx/Tx settings selection

diff --git a/plugins/samplemimo/limesdrmimo/limesdrmimogui.cpp b/plugins/samplemimo/limesdrmimo/limesdrmimogui.cpp index ceeb25951..0e94a7ec5 100644 --- a/plugins/samplemimo/limesdrmimo/limesdrmimogui.cpp +++ b/plugins/samplemimo/limesdrmimo/limesdrmimogui.cpp @@ -28,7 +28,6 @@ #include "device/deviceuiset.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspdevicemimoengine.h" @@ -100,8 +99,7 @@ LimeSDRMIMOGUI::LimeSDRMIMOGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_limeSDRMIMO->setMessageQueueToGUI(&m_inputMessageQueue); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStopRx); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); sendSettings(); makeUIConnections(); @@ -1126,21 +1124,26 @@ void LimeSDRMIMOGUI::on_antenna_currentIndexChanged(int index) void LimeSDRMIMOGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void LimeSDRMIMOGUI::makeUIConnections() diff --git a/plugins/samplemimo/limesdrmimo/readme.md b/plugins/samplemimo/limesdrmimo/readme.md index dee0039c4..6e70b2046 100644 --- a/plugins/samplemimo/limesdrmimo/readme.md +++ b/plugins/samplemimo/limesdrmimo/readme.md @@ -10,6 +10,8 @@ This MIMO plugin sends and receives its samples to/from a [LimeSDR device](https

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![LimeSDR MIMO plugin GUI](../../../doc/img/LimeSDRMIMO_plugin.png)

1. Rx/Tx settings selection

diff --git a/plugins/samplemimo/metismiso/metismisogui.cpp b/plugins/samplemimo/metismiso/metismisogui.cpp index 47b6b5b60..b7d5ce714 100644 --- a/plugins/samplemimo/metismiso/metismisogui.cpp +++ b/plugins/samplemimo/metismiso/metismisogui.cpp @@ -28,7 +28,6 @@ #include "device/deviceuiset.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspdevicemimoengine.h" @@ -73,8 +72,7 @@ MetisMISOGui::MetisMISOGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleMIMO->setMessageQueueToGUI(&m_inputMessageQueue); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); makeUIConnections(); } @@ -564,21 +562,26 @@ void MetisMISOGui::updateSubsamplingIndex() void MetisMISOGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void MetisMISOGui::makeUIConnections() diff --git a/plugins/samplemimo/metismiso/readme.md b/plugins/samplemimo/metismiso/readme.md index 02dced384..c8ca6f173 100644 --- a/plugins/samplemimo/metismiso/readme.md +++ b/plugins/samplemimo/metismiso/readme.md @@ -17,6 +17,8 @@ The plugin is present in the core of the software and thus is always present in

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![Metis MISO plugin GUI](../../../doc/img/MetisMISO_plugin.png)

1: Active stream selection

diff --git a/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.cpp b/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.cpp index 412b34629..497e18a6e 100644 --- a/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.cpp +++ b/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.cpp @@ -27,7 +27,6 @@ #include "device/deviceuiset.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspdevicemimoengine.h" @@ -93,8 +92,7 @@ PlutoSDRMIMOGUI::PlutoSDRMIMOGUI(DeviceUISet *deviceUISet, QWidget* parent) : ui->swDecimLabel->setText(QString::fromUtf8("S\u2193")); ui->lpFIRDecimationLabel->setText(QString::fromUtf8("\u2193")); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStopRx); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); blockApplySettings(true); displaySettings(); @@ -881,21 +879,26 @@ void PlutoSDRMIMOGUI::on_sampleRateMode_toggled(bool checked) void PlutoSDRMIMOGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void PlutoSDRMIMOGUI::makeUIConnections() diff --git a/plugins/samplemimo/plutosdrmimo/readme.md b/plugins/samplemimo/plutosdrmimo/readme.md index e571f1151..e30bfd53d 100644 --- a/plugins/samplemimo/plutosdrmimo/readme.md +++ b/plugins/samplemimo/plutosdrmimo/readme.md @@ -36,6 +36,8 @@ Then add the following defines on `cmake` command line when compiling SDRangel:

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![PlutoSDR MIMO plugin GUI](../../../doc/img/PlutoSDRMIMO_plugin.png)

1. Rx/Tx settings selection

diff --git a/plugins/samplemimo/testmi/readme.md b/plugins/samplemimo/testmi/readme.md index 1f66d548e..639506a4a 100644 --- a/plugins/samplemimo/testmi/readme.md +++ b/plugins/samplemimo/testmi/readme.md @@ -10,6 +10,8 @@ The plugin is present in the core of the software and thus is always present in

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![Test source input plugin GUI](../../../doc/img/TestSourceInput_plugin.png)

1: Common stream parameters

diff --git a/plugins/samplemimo/testmi/testmigui.cpp b/plugins/samplemimo/testmi/testmigui.cpp index 173e71eb5..061305401 100644 --- a/plugins/samplemimo/testmi/testmigui.cpp +++ b/plugins/samplemimo/testmi/testmigui.cpp @@ -28,7 +28,6 @@ #include "device/deviceuiset.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspdevicemimoengine.h" @@ -85,8 +84,7 @@ TestMIGui::TestMIGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleMIMO->setMessageQueueToGUI(&m_inputMessageQueue); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); makeUIConnections(); } @@ -551,21 +549,26 @@ void TestMIGui::updateSampleRateAndFrequency() void TestMIGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void TestMIGui::makeUIConnections() diff --git a/plugins/samplemimo/testmi/testmisettings.h b/plugins/samplemimo/testmi/testmisettings.h index 95898b1ac..063b9ba19 100644 --- a/plugins/samplemimo/testmi/testmisettings.h +++ b/plugins/samplemimo/testmi/testmisettings.h @@ -65,7 +65,8 @@ struct TestMIStreamSettings { void resetToDefaults(); }; -struct TestMISettings { +struct TestMISettings +{ bool m_useReverseAPI; QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; diff --git a/plugins/samplemimo/testmosync/readme.md b/plugins/samplemimo/testmosync/readme.md index 8c053be4d..e805cc17b 100644 --- a/plugins/samplemimo/testmosync/readme.md +++ b/plugins/samplemimo/testmosync/readme.md @@ -10,6 +10,8 @@ The plugin is always built.

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![Test MO sync plugin GUI](../../../doc/img/TestMOSync_plugin.png)

1: Start/Stop

diff --git a/plugins/samplemimo/testmosync/testmosyncgui.cpp b/plugins/samplemimo/testmosync/testmosyncgui.cpp index 845844ac8..c4e3f45aa 100644 --- a/plugins/samplemimo/testmosync/testmosyncgui.cpp +++ b/plugins/samplemimo/testmosync/testmosyncgui.cpp @@ -24,6 +24,7 @@ #include "plugin/pluginapi.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" +#include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" #include "dsp/spectrumvis.h" @@ -83,6 +84,7 @@ TestMOSyncGui::TestMOSyncGui(DeviceUISet *deviceUISet, QWidget* parent) : m_deviceUISet->m_deviceAPI->setSpectrumSinkInput(false, 0); m_deviceUISet->setSpectrumScalingFactor(SDR_TX_SCALEF); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); } TestMOSyncGui::~TestMOSyncGui() @@ -289,6 +291,30 @@ void TestMOSyncGui::tick() { } +void TestMOSyncGui::openDeviceSettingsDialog(const QPoint& p) +{ + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + + dialog.move(p); + dialog.exec(); + + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + + sendSettings(); + } + + resetContextMenuType(); +} + void TestMOSyncGui::makeUIConnections() { QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &TestMOSyncGui::on_centerFrequency_changed); diff --git a/plugins/samplemimo/testmosync/testmosyncgui.h b/plugins/samplemimo/testmosync/testmosyncgui.h index 13a509d67..be24d06e1 100644 --- a/plugins/samplemimo/testmosync/testmosyncgui.h +++ b/plugins/samplemimo/testmosync/testmosyncgui.h @@ -85,6 +85,7 @@ private slots: void on_startStop_toggled(bool checked); void on_interp_currentIndexChanged(int index); void on_spectrumIndex_currentIndexChanged(int index); + void openDeviceSettingsDialog(const QPoint& p); void updateHardware(); void updateStatus(); void tick(); diff --git a/plugins/samplemimo/testmosync/testmosyncsettings.cpp b/plugins/samplemimo/testmosync/testmosyncsettings.cpp index ca026deec..5b53cdcf7 100644 --- a/plugins/samplemimo/testmosync/testmosyncsettings.cpp +++ b/plugins/samplemimo/testmosync/testmosyncsettings.cpp @@ -32,6 +32,10 @@ void TestMOSyncSettings::resetToDefaults() m_log2Interp = 0; m_fcPosTx = FC_POS_CENTER; m_workspaceIndex = 0; + m_useReverseAPI = false; + m_reverseAPIAddress = "127.0.0.1"; + m_reverseAPIPort = 8888; + m_reverseAPIDeviceIndex = 0; } QByteArray TestMOSyncSettings::serialize() const @@ -43,6 +47,10 @@ QByteArray TestMOSyncSettings::serialize() const s.writeS32(3, (int) m_fcPosTx); s.writeS32(4, m_workspaceIndex); s.writeBlob(5, m_geometryBytes); + s.writeBool(6, m_useReverseAPI); + s.writeString(7, m_reverseAPIAddress); + s.writeU32(8, m_reverseAPIPort); + s.writeU32(9, m_reverseAPIDeviceIndex); return s.final(); } @@ -60,6 +68,7 @@ bool TestMOSyncSettings::deserialize(const QByteArray& data) if (d.getVersion() == 1) { int intval; + uint32_t utmp; d.readU64(1, &m_sampleRate, 48000); d.readU32(2, &m_log2Interp, 0); @@ -67,6 +76,18 @@ bool TestMOSyncSettings::deserialize(const QByteArray& data) m_fcPosTx = (fcPos_t) intval; d.readS32(4, &m_workspaceIndex, 0); d.readBlob(5, &m_geometryBytes); + d.readBool(1, &m_useReverseAPI, false); + d.readString(2, &m_reverseAPIAddress, "127.0.0.1"); + d.readU32(3, &utmp, 0); + + if ((utmp > 1023) && (utmp < 65535)) { + m_reverseAPIPort = utmp; + } else { + m_reverseAPIPort = 8888; + } + + d.readU32(4, &utmp, 0); + m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp; return true; } diff --git a/plugins/samplemimo/testmosync/testmosyncsettings.h b/plugins/samplemimo/testmosync/testmosyncsettings.h index 23976fb85..8743979a7 100644 --- a/plugins/samplemimo/testmosync/testmosyncsettings.h +++ b/plugins/samplemimo/testmosync/testmosyncsettings.h @@ -31,6 +31,10 @@ struct TestMOSyncSettings { quint64 m_sampleRate; quint32 m_log2Interp; fcPos_t m_fcPosTx; + bool m_useReverseAPI; + QString m_reverseAPIAddress; + uint16_t m_reverseAPIPort; + uint16_t m_reverseAPIDeviceIndex; int m_workspaceIndex; QByteArray m_geometryBytes; diff --git a/plugins/samplemimo/xtrxmimo/readme.md b/plugins/samplemimo/xtrxmimo/readme.md index 9041318c8..9037dac77 100644 --- a/plugins/samplemimo/xtrxmimo/readme.md +++ b/plugins/samplemimo/xtrxmimo/readme.md @@ -40,6 +40,8 @@ For a group the syntax is the same but the group name is prefixed with `@` like:

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![XTRX MIMO plugin GUI](../../../doc/img/XTRXMIMO_plugin.png)

1. Rx/Tx settings selection

diff --git a/plugins/samplemimo/xtrxmimo/xtrxmimogui.cpp b/plugins/samplemimo/xtrxmimo/xtrxmimogui.cpp index b054ff5df..dea49ea2d 100644 --- a/plugins/samplemimo/xtrxmimo/xtrxmimogui.cpp +++ b/plugins/samplemimo/xtrxmimo/xtrxmimogui.cpp @@ -26,7 +26,6 @@ #include "device/deviceuiset.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspdevicemimoengine.h" @@ -97,8 +96,7 @@ XTRXMIMOGUI::XTRXMIMOGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_xtrxMIMO->setMessageQueueToGUI(&m_inputMessageQueue); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStopRx); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); sendSettings(); makeUIConnections(); @@ -1002,21 +1000,26 @@ void XTRXMIMOGUI::on_antenna_currentIndexChanged(int index) void XTRXMIMOGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void XTRXMIMOGUI::makeUIConnections() diff --git a/plugins/samplesink/audiooutput/audiooutputgui.cpp b/plugins/samplesink/audiooutput/audiooutputgui.cpp index d298dfe39..a9664a96b 100644 --- a/plugins/samplesink/audiooutput/audiooutputgui.cpp +++ b/plugins/samplesink/audiooutput/audiooutputgui.cpp @@ -21,7 +21,6 @@ #include "ui_audiooutputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "gui/audioselectdialog.h" #include "dsp/dspengine.h" @@ -49,9 +48,7 @@ AudioOutputGui::AudioOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_helpURL = "plugins/samplesink/audiooutput/readme.md"; connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); - - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); m_sampleRate = m_audioOutput->getSampleRate(); m_centerFrequency = m_audioOutput->getCenterFrequency(); @@ -227,21 +224,26 @@ void AudioOutputGui::updateHardware() void AudioOutputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void AudioOutputGui::makeUIConnections() diff --git a/plugins/samplesink/audiooutput/readme.md b/plugins/samplesink/audiooutput/readme.md index 7275c48a9..dacf5d877 100644 --- a/plugins/samplesink/audiooutput/readme.md +++ b/plugins/samplesink/audiooutput/readme.md @@ -6,6 +6,8 @@ This output plugin sends its samples to an audio device.

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![Audio output plugin GUI](../../../doc/img/AudioOutput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesink/bladerf1output/bladerf1outputgui.cpp b/plugins/samplesink/bladerf1output/bladerf1outputgui.cpp index b8766bb00..fa5a967e0 100644 --- a/plugins/samplesink/bladerf1output/bladerf1outputgui.cpp +++ b/plugins/samplesink/bladerf1output/bladerf1outputgui.cpp @@ -23,7 +23,6 @@ #include "ui_bladerf1outputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -66,8 +65,7 @@ Bladerf1OutputGui::Bladerf1OutputGui(DeviceUISet *deviceUISet, QWidget* parent) connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); makeUIConnections(); @@ -448,21 +446,26 @@ unsigned int Bladerf1OutputGui::getXb200Index(bool xb_200, bladerf_xb200_path xb void Bladerf1OutputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void Bladerf1OutputGui::makeUIConnections() diff --git a/plugins/samplesink/bladerf1output/readme.md b/plugins/samplesink/bladerf1output/readme.md index 9617d8ca5..8de72b15f 100644 --- a/plugins/samplesink/bladerf1output/readme.md +++ b/plugins/samplesink/bladerf1output/readme.md @@ -37,6 +37,8 @@ The BladeRF Host library is also provided by many Linux distributions (check its

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![BladeRF1 output plugin GUI](../../../doc/img/BladeRF1Output_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp b/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp index fd40138d2..7e82197d2 100644 --- a/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp +++ b/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp @@ -23,7 +23,6 @@ #include "ui_bladerf2outputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -80,8 +79,7 @@ BladeRF2OutputGui::BladeRF2OutputGui(DeviceUISet *deviceUISet, QWidget* parent) connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); makeUIConnections(); @@ -426,21 +424,26 @@ void BladeRF2OutputGui::updateStatus() void BladeRF2OutputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } float BladeRF2OutputGui::getGainDB(int gainValue) diff --git a/plugins/samplesink/bladerf2output/readme.md b/plugins/samplesink/bladerf2output/readme.md index 661dfa507..5288003dd 100644 --- a/plugins/samplesink/bladerf2output/readme.md +++ b/plugins/samplesink/bladerf2output/readme.md @@ -14,6 +14,8 @@ The BladeRF Host library is also provided by many Linux distributions (check its

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![BladeRF2 output plugin GUI](../../../doc/img/BladeRF2Output_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesink/fileoutput/fileoutputgui.cpp b/plugins/samplesink/fileoutput/fileoutputgui.cpp index 918944a15..dfdef4781 100644 --- a/plugins/samplesink/fileoutput/fileoutputgui.cpp +++ b/plugins/samplesink/fileoutput/fileoutputgui.cpp @@ -27,6 +27,7 @@ #include "plugin/pluginapi.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" +#include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -76,6 +77,7 @@ FileOutputGui::FileOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_deviceSampleSink = (FileOutput*) m_deviceUISet->m_deviceAPI->getSampleSink(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); } FileOutputGui::~FileOutputGui() @@ -323,6 +325,30 @@ void FileOutputGui::tick() } } +void FileOutputGui::openDeviceSettingsDialog(const QPoint& p) +{ + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + + dialog.move(p); + dialog.exec(); + + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + + sendSettings(); + } + + resetContextMenuType(); +} + void FileOutputGui::makeUIConnections() { QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &FileOutputGui::on_centerFrequency_changed); diff --git a/plugins/samplesink/fileoutput/fileoutputgui.h b/plugins/samplesink/fileoutput/fileoutputgui.h index ef3445595..a95c25b92 100644 --- a/plugins/samplesink/fileoutput/fileoutputgui.h +++ b/plugins/samplesink/fileoutput/fileoutputgui.h @@ -89,6 +89,7 @@ private slots: void on_startStop_toggled(bool checked); void on_showFileDialog_clicked(bool checked); void on_interp_currentIndexChanged(int index); + void openDeviceSettingsDialog(const QPoint& p); void updateHardware(); void updateStatus(); void tick(); diff --git a/plugins/samplesink/fileoutput/readme.md b/plugins/samplesink/fileoutput/readme.md index a54dcdf63..6ba050a36 100644 --- a/plugins/samplesink/fileoutput/readme.md +++ b/plugins/samplesink/fileoutput/readme.md @@ -18,6 +18,8 @@ The plugin is always built.

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![File output plugin GUI](../../../doc/img/FileOutput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp b/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp index 03e613cd3..e48eba340 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp @@ -22,7 +22,6 @@ #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -62,8 +61,7 @@ HackRFOutputGui::HackRFOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); displayBandwidths(); @@ -443,21 +441,26 @@ void HackRFOutputGui::updateStatus() void HackRFOutputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void HackRFOutputGui::makeUIConnections() diff --git a/plugins/samplesink/hackrfoutput/readme.md b/plugins/samplesink/hackrfoutput/readme.md index 512e18488..898e7b3e0 100644 --- a/plugins/samplesink/hackrfoutput/readme.md +++ b/plugins/samplesink/hackrfoutput/readme.md @@ -6,6 +6,8 @@ This output sample sink plugin sends its samples to a [HackRF device](https://gr

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![HackRF output plugin GUI](../../../doc/img/HackRFOutput_plugin.png)

1: Start/Stop

@@ -111,4 +113,4 @@ When a device set for the same physical device is present the device center freq When the center frequency position Fc (control 9) is set to center (Cen) in both Tx and Rx the actual frequency of reception and transmission are the same. -In other cases for both frequencies to match you have to set the same sample rate and Fc position (either Inf or Sup) in the Tx and Rx. \ No newline at end of file +In other cases for both frequencies to match you have to set the same sample rate and Fc position (either Inf or Sup) in the Tx and Rx. diff --git a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp index c8e9f9777..158da7f39 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp @@ -21,7 +21,6 @@ #include "ui_limesdroutputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -93,9 +92,7 @@ LimeSDROutputGUI::LimeSDROutputGUI(DeviceUISet *deviceUISet, QWidget* parent) : sprintf(recFileNameCStr, "test_%d.sdriq", m_deviceUISet->m_deviceAPI->getDeviceUID()); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); - - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); sendSettings(); makeUIConnections(); @@ -619,21 +616,26 @@ void LimeSDROutputGUI::on_sampleRateMode_toggled(bool checked) void LimeSDROutputGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void LimeSDROutputGUI::makeUIConnections() diff --git a/plugins/samplesink/limesdroutput/readme.md b/plugins/samplesink/limesdroutput/readme.md index eecccd764..71dbc87e7 100644 --- a/plugins/samplesink/limesdroutput/readme.md +++ b/plugins/samplesink/limesdroutput/readme.md @@ -32,6 +32,8 @@ Then add the following defines on `cmake` command line:

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![LimeSDR output plugin GUI](../../../doc/img/LimeSDROutput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesink/localoutput/localoutputgui.cpp b/plugins/samplesink/localoutput/localoutputgui.cpp index c85432967..22a1da49f 100644 --- a/plugins/samplesink/localoutput/localoutputgui.cpp +++ b/plugins/samplesink/localoutput/localoutputgui.cpp @@ -32,7 +32,6 @@ #include "ui_localoutputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -67,8 +66,7 @@ LocalOutputGui::LocalOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : .arg(palette().highlight().color().darker(115).name()))); m_helpURL = "plugins/samplesink/localoutput/readme.md"; - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); @@ -282,21 +280,26 @@ void LocalOutputGui::updateStatus() void LocalOutputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void LocalOutputGui::makeUIConnections() diff --git a/plugins/samplesink/localoutput/readme.md b/plugins/samplesink/localoutput/readme.md index fedd3fcfd..796ec7f2a 100644 --- a/plugins/samplesink/localoutput/readme.md +++ b/plugins/samplesink/localoutput/readme.md @@ -6,6 +6,8 @@ This output sample sink plugin sends its samples to a Local Source channel in an

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![SDR Local output plugin GUI](../../../doc/img/LocalOutput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp b/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp index a0aaf5368..edb24a8d7 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp @@ -22,7 +22,6 @@ #include "dsp/dspengine.h" #include "dsp/dspcommands.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "device/deviceapi.h" #include "device/deviceuiset.h" @@ -70,8 +69,7 @@ PlutoSDROutputGUI::PlutoSDROutputGUI(DeviceUISet *deviceUISet, QWidget* parent) ui->swInterpLabel->setText(QString::fromUtf8("S\u2191")); ui->lpFIRInterpolationLabel->setText(QString::fromUtf8("\u2191")); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); blockApplySettings(true); displaySettings(); @@ -482,21 +480,26 @@ void PlutoSDROutputGUI::updateSampleRateAndFrequency() void PlutoSDROutputGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void PlutoSDROutputGUI::makeUIConnections() diff --git a/plugins/samplesink/plutosdroutput/readme.md b/plugins/samplesink/plutosdroutput/readme.md index fd2a6c223..6907cb500 100644 --- a/plugins/samplesink/plutosdroutput/readme.md +++ b/plugins/samplesink/plutosdroutput/readme.md @@ -27,6 +27,8 @@ Then add the following defines on `cmake` command line when compiling SDRangel:

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![PlutoSDR output plugin GUI](../../../doc/img/PlutoSDROutput_plugin.png)

1: Common stream parameters

diff --git a/plugins/samplesink/remoteoutput/readme.md b/plugins/samplesink/remoteoutput/readme.md index 6f2d154c0..046b61d07 100644 --- a/plugins/samplesink/remoteoutput/readme.md +++ b/plugins/samplesink/remoteoutput/readme.md @@ -16,6 +16,8 @@ The plugin will be built only if the [CM256cc library](https://github.com/f4exb/

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![SDR Remote output plugin GUI](../../../doc/img/RemoteOutput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesink/remoteoutput/remoteoutputgui.cpp b/plugins/samplesink/remoteoutput/remoteoutputgui.cpp index 65343e43f..6a384c80c 100644 --- a/plugins/samplesink/remoteoutput/remoteoutputgui.cpp +++ b/plugins/samplesink/remoteoutput/remoteoutputgui.cpp @@ -28,7 +28,6 @@ #include "plugin/pluginapi.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -87,8 +86,7 @@ RemoteOutputSinkGui::RemoteOutputSinkGui(DeviceUISet *deviceUISet, QWidget* pare displayEventCounts(); displayEventTimer(); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); sendSettings(); @@ -529,21 +527,26 @@ void RemoteOutputSinkGui::displayRemoteFixedData(const RemoteOutput::MsgReportRe void RemoteOutputSinkGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void RemoteOutputSinkGui::makeUIConnections() diff --git a/plugins/samplesink/soapysdroutput/readme.md b/plugins/samplesink/soapysdroutput/readme.md index 1956a740a..69e49d74a 100644 --- a/plugins/samplesink/soapysdroutput/readme.md +++ b/plugins/samplesink/soapysdroutput/readme.md @@ -65,6 +65,8 @@ When installed the Red Pitaya SoapySDR plugin lists a Red Pitaya device even if

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![SoapySDR input plugin GUI](../../../doc/img/SoapySDROutput_plugin1.png) The top part described by number tags is common for all devices. The bottom part under the "A" tag depends on the SoapySDR device implementation. The corresponding widgets are stacked vertically inside a scrollable area as there may be many controls depending on how the device interface is implemented in SoapySDR. Move the slider on the right to see all parameters available. diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp b/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp index fe7f7c800..d6525a0d6 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp @@ -25,7 +25,6 @@ #include "util/simpleserializer.h" #include "ui_soapysdroutputgui.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "soapygui/discreterangegui.h" #include "soapygui/intervalrangegui.h" @@ -94,8 +93,7 @@ SoapySDROutputGui::SoapySDROutputGui(DeviceUISet *deviceUISet, QWidget* parent) connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); @@ -872,21 +870,26 @@ void SoapySDROutputGui::updateStatus() void SoapySDROutputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void SoapySDROutputGui::makeUIConnections() diff --git a/plugins/samplesink/testsink/readme.md b/plugins/samplesink/testsink/readme.md index cf3ceff0b..919202ace 100644 --- a/plugins/samplesink/testsink/readme.md +++ b/plugins/samplesink/testsink/readme.md @@ -10,6 +10,8 @@ The plugin is always built.

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![Test sink plugin GUI](../../../doc/img/TestSink.png)

1: Start/Stop

@@ -40,4 +42,4 @@ Use the wheels to adjust the sample rate. Left click on a digit sets the cursor

6: Spectrum display

-This is the final output stream spectrum display after interpolation (4). This would be sent to the hardware device. Controls on the bottom of the panel are identical to the ones of the main spectrum display. \ No newline at end of file +This is the final output stream spectrum display after interpolation (4). This would be sent to the hardware device. Controls on the bottom of the panel are identical to the ones of the main spectrum display. diff --git a/plugins/samplesink/testsink/testsinkgui.cpp b/plugins/samplesink/testsink/testsinkgui.cpp index e63ba074c..08b6bcb59 100644 --- a/plugins/samplesink/testsink/testsinkgui.cpp +++ b/plugins/samplesink/testsink/testsinkgui.cpp @@ -25,6 +25,7 @@ #include "plugin/pluginapi.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" +#include "gui/basicdevicesettingsdialog.h" #include "dsp/spectrumvis.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -76,6 +77,7 @@ TestSinkGui::TestSinkGui(DeviceUISet *deviceUISet, QWidget* parent) : makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); } TestSinkGui::~TestSinkGui() @@ -263,6 +265,30 @@ void TestSinkGui::tick() { } +void TestSinkGui::openDeviceSettingsDialog(const QPoint& p) +{ + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + + dialog.move(p); + dialog.exec(); + + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + + sendSettings(); + } + + resetContextMenuType(); +} + void TestSinkGui::makeUIConnections() { QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &TestSinkGui::on_centerFrequency_changed); diff --git a/plugins/samplesink/testsink/testsinkgui.h b/plugins/samplesink/testsink/testsinkgui.h index 255d7b1de..dc7566492 100644 --- a/plugins/samplesink/testsink/testsinkgui.h +++ b/plugins/samplesink/testsink/testsinkgui.h @@ -85,6 +85,7 @@ private slots: void on_sampleRate_changed(quint64 value); void on_startStop_toggled(bool checked); void on_interp_currentIndexChanged(int index); + void openDeviceSettingsDialog(const QPoint& p); void updateHardware(); void updateStatus(); void tick(); diff --git a/plugins/samplesink/testsink/testsinksettings.cpp b/plugins/samplesink/testsink/testsinksettings.cpp index ea14da772..ec32a5dbf 100644 --- a/plugins/samplesink/testsink/testsinksettings.cpp +++ b/plugins/samplesink/testsink/testsinksettings.cpp @@ -31,6 +31,10 @@ void TestSinkSettings::resetToDefaults() m_log2Interp = 0; m_spectrumGUI = nullptr; m_workspaceIndex = 0; + m_useReverseAPI = false; + m_reverseAPIAddress = "127.0.0.1"; + m_reverseAPIPort = 8888; + m_reverseAPIDeviceIndex = 0; } QByteArray TestSinkSettings::serialize() const @@ -47,7 +51,10 @@ QByteArray TestSinkSettings::serialize() const s.writeS32(5, m_workspaceIndex); s.writeBlob(6, m_geometryBytes); - + s.writeBool(7, m_useReverseAPI); + s.writeString(8, m_reverseAPIAddress); + s.writeU32(9, m_reverseAPIPort); + s.writeU32(10, m_reverseAPIDeviceIndex); return s.final(); } @@ -64,6 +71,7 @@ bool TestSinkSettings::deserialize(const QByteArray& data) if (d.getVersion() == 1) { QByteArray bytetmp; + uint32_t uintval; d.readU64(1, &m_sampleRate, 435000*1000); d.readU64(2, &m_sampleRate, 48000); @@ -77,6 +85,18 @@ bool TestSinkSettings::deserialize(const QByteArray& data) d.readS32(5, &m_workspaceIndex, 0); d.readBlob(6, &m_geometryBytes); + d.readBool(7, &m_useReverseAPI, false); + d.readString(8, &m_reverseAPIAddress, "127.0.0.1"); + d.readU32(9, &uintval, 0); + + if ((uintval > 1023) && (uintval < 65535)) { + m_reverseAPIPort = uintval; + } else { + m_reverseAPIPort = 8888; + } + + d.readU32(10, &uintval, 0); + m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; return true; } diff --git a/plugins/samplesink/testsink/testsinksettings.h b/plugins/samplesink/testsink/testsinksettings.h index 79e082488..6f6377ae6 100644 --- a/plugins/samplesink/testsink/testsinksettings.h +++ b/plugins/samplesink/testsink/testsinksettings.h @@ -29,6 +29,10 @@ struct TestSinkSettings { Serializable *m_spectrumGUI; int m_workspaceIndex; QByteArray m_geometryBytes; + bool m_useReverseAPI; + QString m_reverseAPIAddress; + uint16_t m_reverseAPIPort; + uint16_t m_reverseAPIDeviceIndex; TestSinkSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/usrpoutput/readme.md b/plugins/samplesink/usrpoutput/readme.md index 3500ad751..130aec688 100644 --- a/plugins/samplesink/usrpoutput/readme.md +++ b/plugins/samplesink/usrpoutput/readme.md @@ -6,6 +6,8 @@ This output sample sink plugin sends its samples to a [USRP device](https://www.

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![USRP output plugin GUI](../../../doc/img/USRPOutput_plugin.png)

1: Start/Stop

@@ -18,7 +20,7 @@ Device start / stop button.

2A: Sample rate

-This is the sample rate at which IQ samples are transfered from SDRangel to the device, in kS/s (k) or MS/s (M). +This is the sample rate at which IQ samples are transfered from SDRangel to the device, in kS/s (k) or MS/s (M).

2B: Stream sample rate

diff --git a/plugins/samplesink/usrpoutput/usrpoutputgui.cpp b/plugins/samplesink/usrpoutput/usrpoutputgui.cpp index 4271c44de..3b8ac6f6b 100644 --- a/plugins/samplesink/usrpoutput/usrpoutputgui.cpp +++ b/plugins/samplesink/usrpoutput/usrpoutputgui.cpp @@ -22,7 +22,6 @@ #include "ui_usrpoutputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -86,9 +85,7 @@ USRPOutputGUI::USRPOutputGUI(DeviceUISet *deviceUISet, QWidget* parent) : sprintf(recFileNameCStr, "test_%d.sdriq", m_deviceUISet->m_deviceAPI->getDeviceUID()); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); - - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); sendSettings(); makeUIConnections(); @@ -563,21 +560,26 @@ void USRPOutputGUI::on_sampleRateMode_toggled(bool checked) void USRPOutputGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void USRPOutputGUI::makeUIConnections() diff --git a/plugins/samplesink/xtrxoutput/readme.md b/plugins/samplesink/xtrxoutput/readme.md index c641f7d4a..5676003f5 100644 --- a/plugins/samplesink/xtrxoutput/readme.md +++ b/plugins/samplesink/xtrxoutput/readme.md @@ -40,9 +40,12 @@ For a group the syntax is the same but the group name is prefixed with `@` like: ``` @realtime - rtprio 99 @realtime - memlock unlimited +```

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![XTRX output plugin GUI](../../../doc/img/XTRXOutput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesink/xtrxoutput/xtrxoutputgui.cpp b/plugins/samplesink/xtrxoutput/xtrxoutputgui.cpp index c20372447..b2bccc8a8 100644 --- a/plugins/samplesink/xtrxoutput/xtrxoutputgui.cpp +++ b/plugins/samplesink/xtrxoutput/xtrxoutputgui.cpp @@ -23,7 +23,6 @@ #include "ui_xtrxoutputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -74,8 +73,7 @@ XTRXOutputGUI::XTRXOutputGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); makeUIConnections(); @@ -554,21 +552,26 @@ void XTRXOutputGUI::on_sampleRateMode_toggled(bool checked) void XTRXOutputGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void XTRXOutputGUI::makeUIConnections() diff --git a/plugins/samplesource/airspy/airspygui.cpp b/plugins/samplesource/airspy/airspygui.cpp index b0d8de826..951b14c0d 100644 --- a/plugins/samplesource/airspy/airspygui.cpp +++ b/plugins/samplesource/airspy/airspygui.cpp @@ -29,7 +29,6 @@ #include "ui_airspygui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -57,8 +56,7 @@ AirspyGui::AirspyGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); @@ -435,21 +433,26 @@ int AirspyGui::getDevSampleRateIndex(uint32_t sampeRate) void AirspyGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void AirspyGui::makeUIConnections() diff --git a/plugins/samplesource/airspyhf/airspyhfgui.cpp b/plugins/samplesource/airspyhf/airspyhfgui.cpp index 3dcb22d42..c8831abaa 100644 --- a/plugins/samplesource/airspyhf/airspyhfgui.cpp +++ b/plugins/samplesource/airspyhf/airspyhfgui.cpp @@ -27,7 +27,6 @@ #include "ui_airspyhfgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -57,8 +56,7 @@ AirspyHFGui::AirspyHFGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); @@ -455,21 +453,26 @@ int AirspyHFGui::getDevSampleRateIndex(uint32_t sampeRate) void AirspyHFGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void AirspyHFGui::makeUIConnections() diff --git a/plugins/samplesource/airspyhf/readme.md b/plugins/samplesource/airspyhf/readme.md index b4df31de0..05e1992a6 100644 --- a/plugins/samplesource/airspyhf/readme.md +++ b/plugins/samplesource/airspyhf/readme.md @@ -14,6 +14,8 @@ Note: if you use binary distributions this is included in the bundle.

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + For controls 10 to 13 to be effective you will need a recent version (up to date in January 2019) of both libairspy and the firmware. ![AirspyHF input plugin GUI](../../../doc/img/AirspyHFInput_plugin.png) diff --git a/plugins/samplesource/audioinput/audioinputgui.cpp b/plugins/samplesource/audioinput/audioinputgui.cpp index c6497aa6f..5d186ed09 100644 --- a/plugins/samplesource/audioinput/audioinputgui.cpp +++ b/plugins/samplesource/audioinput/audioinputgui.cpp @@ -22,7 +22,6 @@ #include "ui_audioinputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -49,9 +48,7 @@ AudioInputGui::AudioInputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_helpURL = "plugins/samplesource/audioinput/readme.md"; connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); - - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); makeUIConnections(); @@ -295,21 +292,26 @@ void AudioInputGui::updateHardware() void AudioInputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void AudioInputGui::makeUIConnections() diff --git a/plugins/samplesource/audioinput/readme.md b/plugins/samplesource/audioinput/readme.md index 9767705b4..08e70b8c9 100644 --- a/plugins/samplesource/audioinput/readme.md +++ b/plugins/samplesource/audioinput/readme.md @@ -6,6 +6,8 @@ This input sample source plugin gets its samples from an audio device.

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![Audio input plugin GUI](../../../doc/img/AudioInput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesource/bladerf1input/bladerf1inputgui.cpp b/plugins/samplesource/bladerf1input/bladerf1inputgui.cpp index 11ac97b8d..5c378ef94 100644 --- a/plugins/samplesource/bladerf1input/bladerf1inputgui.cpp +++ b/plugins/samplesource/bladerf1input/bladerf1inputgui.cpp @@ -24,7 +24,6 @@ #include "ui_bladerf1inputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -69,8 +68,7 @@ Bladerf1InputGui::Bladerf1InputGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); @@ -514,21 +512,26 @@ unsigned int Bladerf1InputGui::getXb200Index(bool xb_200, bladerf_xb200_path xb2 void Bladerf1InputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void Bladerf1InputGui::makeUIConnections() diff --git a/plugins/samplesource/bladerf1input/readme.md b/plugins/samplesource/bladerf1input/readme.md index 1e3157fa0..adc814a03 100644 --- a/plugins/samplesource/bladerf1input/readme.md +++ b/plugins/samplesource/bladerf1input/readme.md @@ -19,6 +19,8 @@ The BladeRF Host library is also provided by many Linux distributions (check its

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![BladeRF1 input plugin GUI](../../../doc/img/BladeRF1Input_plugin.png)

1: Common stream parameters

diff --git a/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp b/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp index e05c5c149..f1a2a3637 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp @@ -24,7 +24,6 @@ #include "ui_bladerf2inputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -91,8 +90,7 @@ BladeRF2InputGui::BladeRF2InputGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); @@ -515,21 +513,26 @@ void BladeRF2InputGui::updateStatus() void BladeRF2InputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } float BladeRF2InputGui::getGainDB(int gainValue) diff --git a/plugins/samplesource/bladerf2input/readme.md b/plugins/samplesource/bladerf2input/readme.md index 99b66e1a1..30cf214ba 100644 --- a/plugins/samplesource/bladerf2input/readme.md +++ b/plugins/samplesource/bladerf2input/readme.md @@ -14,6 +14,8 @@ The BladeRF Host library is also provided by many Linux distributions (check its

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![BladeRF2 input plugin GUI](../../../doc/img/BladeRF2Input_plugin.png)

1: Common stream parameters

diff --git a/plugins/samplesource/fcdpro/fcdprogui.cpp b/plugins/samplesource/fcdpro/fcdprogui.cpp index 33840a7da..ee7a60bd0 100644 --- a/plugins/samplesource/fcdpro/fcdprogui.cpp +++ b/plugins/samplesource/fcdpro/fcdprogui.cpp @@ -21,7 +21,6 @@ #include "ui_fcdprogui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -151,8 +150,7 @@ FCDProGui::FCDProGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); makeUIConnections(); @@ -539,21 +537,26 @@ void FCDProGui::updateHardware() void FCDProGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void FCDProGui::makeUIConnections() diff --git a/plugins/samplesource/fcdpro/readme.md b/plugins/samplesource/fcdpro/readme.md index 8d1f12e92..5a117c858 100644 --- a/plugins/samplesource/fcdpro/readme.md +++ b/plugins/samplesource/fcdpro/readme.md @@ -6,6 +6,8 @@ This input sample source plugin gets its samples from a [FunCube Dongle (FCD) Pr

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![FCD Pro input plugin GUI](../../../doc/img/FCDPro_plugin.png)

1: Common stream parameters

diff --git a/plugins/samplesource/fcdproplus/fcdproplusgui.cpp b/plugins/samplesource/fcdproplus/fcdproplusgui.cpp index 3fa840b25..33503edfd 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusgui.cpp +++ b/plugins/samplesource/fcdproplus/fcdproplusgui.cpp @@ -22,7 +22,6 @@ #include "ui_fcdproplusgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -69,8 +68,7 @@ FCDProPlusGui::FCDProPlusGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); makeUIConnections(); @@ -361,21 +359,26 @@ void FCDProPlusGui::on_transverter_clicked() void FCDProPlusGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void FCDProPlusGui::makeUIConnections() diff --git a/plugins/samplesource/fcdproplus/readme.md b/plugins/samplesource/fcdproplus/readme.md index 3a775ada1..8c75e2783 100644 --- a/plugins/samplesource/fcdproplus/readme.md +++ b/plugins/samplesource/fcdproplus/readme.md @@ -6,6 +6,8 @@ This input sample source plugin gets its samples from a [FunCube Dongle (FCD) Pr

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![FCD Pro+ input plugin GUI](../../../doc/img/FCDProPlus_plugin.png)

1: Common stream parameters

@@ -80,4 +82,4 @@ This controls the tuner filter (band) used:

11: IF filter

-Selects the IF filter bandwidth \ No newline at end of file +Selects the IF filter bandwidth diff --git a/plugins/samplesource/fileinput/fileinputgui.cpp b/plugins/samplesource/fileinput/fileinputgui.cpp index 3a3d26dc3..39bc4004b 100644 --- a/plugins/samplesource/fileinput/fileinputgui.cpp +++ b/plugins/samplesource/fileinput/fileinputgui.cpp @@ -27,7 +27,6 @@ #include "plugin/pluginapi.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -66,8 +65,7 @@ FileInputGUI::FileInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); setAccelerationCombo(); displaySettings(); @@ -436,21 +434,26 @@ void FileInputGUI::setNumberStr(int n, QString& s) void FileInputGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void FileInputGUI::makeUIConnections() diff --git a/plugins/samplesource/fileinput/readme.md b/plugins/samplesource/fileinput/readme.md index 447d7de8e..f0dad6dd3 100644 --- a/plugins/samplesource/fileinput/readme.md +++ b/plugins/samplesource/fileinput/readme.md @@ -48,6 +48,8 @@ The header takes an integer number of 16 (4 bytes) or 24 (8 bytes) bits samples.

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![File input plugin GUI](../../../doc/img/FileInput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesource/hackrfinput/hackrfinputgui.cpp b/plugins/samplesource/hackrfinput/hackrfinputgui.cpp index 7f2c2a8d1..2c1658f28 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputgui.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinputgui.cpp @@ -25,7 +25,6 @@ #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -63,8 +62,7 @@ HackRFInputGui::HackRFInputGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); displayBandwidths(); @@ -497,21 +495,26 @@ void HackRFInputGui::updateStatus() void HackRFInputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void HackRFInputGui::makeUIConnections() diff --git a/plugins/samplesource/hackrfinput/readme.md b/plugins/samplesource/hackrfinput/readme.md index f256e06e9..c45712d0c 100644 --- a/plugins/samplesource/hackrfinput/readme.md +++ b/plugins/samplesource/hackrfinput/readme.md @@ -6,6 +6,8 @@ This input sample source plugin gets its samples from a [HackRF device](https://

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![HackRF input plugin GUI](../../../doc/img/HackRFInput_plugin.png)

1: Common stream parameters

@@ -113,4 +115,4 @@ When a device set for the same physical device is present the device center freq When the center frequency position Fc (control 8) is set to center (Cen) in both Rx and Tx the actual frequency of reception and transmission are the same. -In other cases for both frequencies to match you have to set the same sample rate and Fc position (either Inf or Sup) in the Rx and Tx. \ No newline at end of file +In other cases for both frequencies to match you have to set the same sample rate and Fc position (either Inf or Sup) in the Rx and Tx. diff --git a/plugins/samplesource/kiwisdr/kiwisdrgui.cpp b/plugins/samplesource/kiwisdr/kiwisdrgui.cpp index 1b1799b0f..2676ceea1 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrgui.cpp +++ b/plugins/samplesource/kiwisdr/kiwisdrgui.cpp @@ -28,7 +28,6 @@ #include "plugin/pluginapi.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -84,8 +83,7 @@ KiwiSDRGui::KiwiSDRGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); } KiwiSDRGui::~KiwiSDRGui() @@ -302,21 +300,26 @@ void KiwiSDRGui::updateSampleRateAndFrequency() void KiwiSDRGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void KiwiSDRGui::makeUIConnections() diff --git a/plugins/samplesource/kiwisdr/readme.md b/plugins/samplesource/kiwisdr/readme.md index f9896ea3d..fb0ce4998 100644 --- a/plugins/samplesource/kiwisdr/readme.md +++ b/plugins/samplesource/kiwisdr/readme.md @@ -6,6 +6,8 @@ This plugin is designed to enable connection to publicly available [KiwiSDR](htt

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![KiwiSDR input plugin GUI](../../../doc/img/KiwiSDRInput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.cpp b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp index 43937ca8c..20e374c75 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp @@ -26,7 +26,6 @@ #include "ui_limesdrinputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -102,8 +101,7 @@ LimeSDRInputGUI::LimeSDRInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_limeSDRInput->setMessageQueueToGUI(&m_inputMessageQueue); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); } LimeSDRInputGUI::~LimeSDRInputGUI() @@ -707,21 +705,26 @@ void LimeSDRInputGUI::on_sampleRateMode_toggled(bool checked) void LimeSDRInputGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void LimeSDRInputGUI::makeUIConnections() diff --git a/plugins/samplesource/limesdrinput/readme.md b/plugins/samplesource/limesdrinput/readme.md index 0b5464233..9c86f4687 100644 --- a/plugins/samplesource/limesdrinput/readme.md +++ b/plugins/samplesource/limesdrinput/readme.md @@ -12,6 +12,8 @@ LimeSDR is a 2x2 MIMO device so it has two receiving channels that can run concu

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![LimeSDR input plugin GUI](../../../doc/img/LimeSDRInput_plugin.png)

1: Common stream parameters

@@ -204,4 +206,4 @@ This is the board temperature in degrees Celsius updated every ~5s. Before the f

15: GPIO pins status

-This is the hexadecimal representation of the 8 available GPIO pins of the on board LimeSDR GPIO header. \ No newline at end of file +This is the hexadecimal representation of the 8 available GPIO pins of the on board LimeSDR GPIO header. diff --git a/plugins/samplesource/localinput/localinputgui.cpp b/plugins/samplesource/localinput/localinputgui.cpp index 81edc2066..d5a657dfa 100644 --- a/plugins/samplesource/localinput/localinputgui.cpp +++ b/plugins/samplesource/localinput/localinputgui.cpp @@ -33,7 +33,6 @@ #include "ui_localinputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -80,8 +79,7 @@ LocalInputGui::LocalInputGui(DeviceUISet *deviceUISet, QWidget* parent) : .arg(palette().highlight().color().darker(115).name()))); m_helpURL = "plugins/samplesource/localinput/readme.md"; - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); makeUIConnections(); @@ -310,21 +308,26 @@ void LocalInputGui::updateStatus() void LocalInputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void LocalInputGui::makeUIConnections() diff --git a/plugins/samplesource/localinput/readme.md b/plugins/samplesource/localinput/readme.md index 119d5abb7..bc58afcba 100644 --- a/plugins/samplesource/localinput/readme.md +++ b/plugins/samplesource/localinput/readme.md @@ -6,6 +6,8 @@ This input sample source plugin gets its samples from a Local Sink channel in an

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![SDR Local input plugin GUI](../../../doc/img/LocalInput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesource/perseus/perseusgui.cpp b/plugins/samplesource/perseus/perseusgui.cpp index a25a47957..0b4a8c049 100644 --- a/plugins/samplesource/perseus/perseusgui.cpp +++ b/plugins/samplesource/perseus/perseusgui.cpp @@ -25,7 +25,6 @@ #include "ui_perseusgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -55,8 +54,7 @@ PerseusGui::PerseusGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); @@ -379,21 +377,26 @@ int PerseusGui::getDevSampleRateIndex(uint32_t sampeRate) void PerseusGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void PerseusGui::makeUIConnections() diff --git a/plugins/samplesource/perseus/readme.md b/plugins/samplesource/perseus/readme.md index dcc224458..787a6d8ad 100644 --- a/plugins/samplesource/perseus/readme.md +++ b/plugins/samplesource/perseus/readme.md @@ -17,6 +17,8 @@ If you build it from source and install it in a custom location say: `/opt/insta

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + It has a limited number of controls compared to other source interfaces. This is because a lot of things are handled automatically within the Perseus: - gains diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp b/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp index 7b9a71a29..5ce1de780 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp @@ -23,7 +23,6 @@ #include "dsp/dspengine.h" #include "dsp/dspcommands.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "device/deviceapi.h" #include "device/deviceuiset.h" @@ -71,8 +70,7 @@ PlutoSDRInputGui::PlutoSDRInputGui(DeviceUISet *deviceUISet, QWidget* parent) : ui->swDecimLabel->setText(QString::fromUtf8("S\u2193")); ui->lpFIRDecimationLabel->setText(QString::fromUtf8("\u2193")); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); blockApplySettings(true); displaySettings(); @@ -554,21 +552,26 @@ void PlutoSDRInputGui::updateSampleRateAndFrequency() void PlutoSDRInputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void PlutoSDRInputGui::makeUIConnections() diff --git a/plugins/samplesource/plutosdrinput/readme.md b/plugins/samplesource/plutosdrinput/readme.md index b0cf00bef..33226490c 100644 --- a/plugins/samplesource/plutosdrinput/readme.md +++ b/plugins/samplesource/plutosdrinput/readme.md @@ -27,6 +27,8 @@ Then add the following defines on `cmake` command line when compiling SDRangel:

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![PlutoSDR input plugin GUI](../../../doc/img/PlutoSDRInput_plugin.png)

1: Common stream parameters

diff --git a/plugins/samplesource/remoteinput/readme.md b/plugins/samplesource/remoteinput/readme.md index 142f2db1d..0f614bd9f 100644 --- a/plugins/samplesource/remoteinput/readme.md +++ b/plugins/samplesource/remoteinput/readme.md @@ -18,6 +18,8 @@ The plugin will be built only if the [CM256cc library](https://github.com/f4exb/

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![SDR Remote input plugin GUI](../../../doc/img/RemoteInput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesource/remoteinput/remoteinputgui.cpp b/plugins/samplesource/remoteinput/remoteinputgui.cpp index d4e821181..aa8187ece 100644 --- a/plugins/samplesource/remoteinput/remoteinputgui.cpp +++ b/plugins/samplesource/remoteinput/remoteinputgui.cpp @@ -29,7 +29,6 @@ #include "ui_remoteinputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -80,8 +79,7 @@ RemoteInputGui::RemoteInputGui(DeviceUISet *deviceUISet, QWidget* parent) : ui->remoteDeviceFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->remoteDeviceFrequency->setValueRange(8, 0, 99999999); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); @@ -673,21 +671,26 @@ void RemoteInputGui::updateStatus() void RemoteInputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void RemoteInputGui::makeUIConnections() diff --git a/plugins/samplesource/rtlsdr/readme.md b/plugins/samplesource/rtlsdr/readme.md index 6d8b1eee7..3d5920854 100644 --- a/plugins/samplesource/rtlsdr/readme.md +++ b/plugins/samplesource/rtlsdr/readme.md @@ -12,6 +12,8 @@ If you want to benefit from the direct sampling you will have to compile and ins

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![RTLSDR input plugin GUI](../../../doc/img/RTLSDR_plugin.png)

1: Common stream parameters

diff --git a/plugins/samplesource/rtlsdr/rtlsdrgui.cpp b/plugins/samplesource/rtlsdr/rtlsdrgui.cpp index 9d10e9b83..35e9fc142 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrgui.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrgui.cpp @@ -27,7 +27,6 @@ #include "ui_rtlsdrgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -59,6 +58,7 @@ RTLSDRGui::RTLSDRGui(DeviceUISet *deviceUISet, QWidget* parent) : ui->rfBW->setColorMapper(ColorMapper(ColorMapper::GrayYellow)); ui->rfBW->setValueRange(4, 0, 10000); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); @@ -71,9 +71,6 @@ RTLSDRGui::RTLSDRGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); - - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); } RTLSDRGui::~RTLSDRGui() @@ -525,21 +522,26 @@ void RTLSDRGui::on_lowSampleRate_toggled(bool checked) void RTLSDRGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void RTLSDRGui::makeUIConnections() diff --git a/plugins/samplesource/sdrplay/readme.md b/plugins/samplesource/sdrplay/readme.md index 629ea597b..16838f31f 100644 --- a/plugins/samplesource/sdrplay/readme.md +++ b/plugins/samplesource/sdrplay/readme.md @@ -4,7 +4,7 @@ This plugin supports input from SDRplay RSP1 devices. SDRplay is based on the MSi001 and MSi2500 chips from Mirics. The standard API provided by Mirics is closed source moreover it could not be implemented successfully in SDRangel. An open source API libmirisdr-2 has been written by Miroslav Slugen and later amended by Leif Asbrink SM5BSZ. This API uses a new flavour called [libmirisdr-4](https://github.com/f4exb/libmirisdr-4) in this very same Github space. It contains enhancements and bug fixes. -No Windows support +No Windows support Driver is too unstable in Windows randomly stopping the application and causing BSOD. @@ -14,6 +14,8 @@ As mentioned already the plugin depends on libmirisdr-4. You will have to compil

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![SDRplay plugin GUI](../../../doc/img/SDRPlay_plugin.png)

1. Common controls

@@ -40,7 +42,7 @@ This selects a frequency range corresponding to the hardware path in the SDRplay - 250 MHz to 380 MHz - 380 MHz to 1 GHz - 1 GHz to 2 GHz - +

5. IF bandwidth

This selects the IF filter. Following bandwidths are available according to MSi001 specs: @@ -61,8 +63,8 @@ This selects the IF frequency between these values: - 0 for zero IF - 450 kHz: you have to set sample rate to 1792 kHz (7) and use decimation (8) with an infradyne position (9) - 1620 kHz: you have to set sample rate to 6400 kHz (7) and use decimation (8) with an infradyne position (9) - - 2048 kHz: you have to set sample rate to 8192 kHz (7) and use decimation (8) with an infradyne position (9) - + - 2048 kHz: you have to set sample rate to 8192 kHz (7) and use decimation (8) with an infradyne position (9) +

7. Sample rate

You have the choice between various sample rates from 1536 to 8192 kHz. Some values have a special destination: @@ -70,7 +72,7 @@ You have the choice between various sample rates from 1536 to 8192 kHz. Some val - 1792 kHz: for use with an IF of 450 kHz. - 6400 kHz: for use with an IF of 1620 kHz. - 8192 kHz: for use with an IF of 2048 kHz. - +

8. Decimation

Decimation in powers of two from 1 (no decimation) to 64. @@ -78,24 +80,24 @@ Decimation in powers of two from 1 (no decimation) to 64.

9: Decimated bandpass center frequency position relative the SDRplay center frequency

- **Cen**: the decimation operation takes place around the SDRplay center frequency Fs - - **Inf**: the decimation operation takes place around Fs - Fc. + - **Inf**: the decimation operation takes place around Fs - Fc. - **Sup**: the decimation operation takes place around Fs + Fc. - -With SR as the sample rate before decimation Fc is calculated as: + +With SR as the sample rate before decimation Fc is calculated as: - if decimation n is 4 or lower: Fc = SR/2^(log2(n)-1). The device center frequency is on the side of the baseband. You need a RF filter bandwidth at least twice the baseband. - if decimation n is 8 or higher: Fc = SR/n. The device center frequency is half the baseband away from the side of the baseband. You need a RF filter bandwidth at least 3 times the baseband. - +

10. Tuner gain mode

-Use this radiobutton to select a mode where the gain of the LNA (or mixer buffer below 50 MHz), mixer and baseband amplifiers are automatically selected depending on the tuner gain index (11). This index is the gain value in dB at the nominal gain of all amplifiers. This is not the exact gain at all frequencies because the LNA gain decreases significantly at higher frequencies. +Use this radiobutton to select a mode where the gain of the LNA (or mixer buffer below 50 MHz), mixer and baseband amplifiers are automatically selected depending on the tuner gain index (11). This index is the gain value in dB at the nominal gain of all amplifiers. This is not the exact gain at all frequencies because the LNA gain decreases significantly at higher frequencies.

11. Tuner gain setting

The tuner gain index can be set between 0 and 102 points (corresponds to dB in the nominal case).

12. Manual gain mode

- + Use this radiobutton to select a mode where the gain of all amplifiers can be set independently

13. LNA toggle

diff --git a/plugins/samplesource/sdrplay/sdrplaygui.cpp b/plugins/samplesource/sdrplay/sdrplaygui.cpp index ddeddb627..0ab1d750e 100644 --- a/plugins/samplesource/sdrplay/sdrplaygui.cpp +++ b/plugins/samplesource/sdrplay/sdrplaygui.cpp @@ -27,7 +27,6 @@ #include "ui_sdrplaygui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -78,8 +77,7 @@ SDRPlayGui::SDRPlayGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); makeUIConnections(); @@ -445,21 +443,26 @@ void SDRPlayGui::on_startStop_toggled(bool checked) void SDRPlayGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void SDRPlayGui::makeUIConnections() diff --git a/plugins/samplesource/sdrplayv3/readme.md b/plugins/samplesource/sdrplayv3/readme.md index a24083e4c..903336b8b 100644 --- a/plugins/samplesource/sdrplayv3/readme.md +++ b/plugins/samplesource/sdrplayv3/readme.md @@ -10,6 +10,8 @@ This plugin requires the SDRplay API V3.07 to have been installed and for the se

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![SDRplay v3 plugin GUI](../../../doc/img/SDRPlayV3_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp b/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp index 73be322df..53fd850da 100644 --- a/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp +++ b/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp @@ -28,7 +28,6 @@ #include "ui_sdrplayv3gui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -69,8 +68,7 @@ SDRPlayV3Gui::SDRPlayV3Gui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); ui->tuner->blockSignals(true); ui->antenna->blockSignals(true); @@ -509,21 +507,26 @@ void SDRPlayV3Gui::on_transverter_clicked() void SDRPlayV3Gui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void SDRPlayV3Gui::makeUIConnections() diff --git a/plugins/samplesource/sigmffileinput/readme.md b/plugins/samplesource/sigmffileinput/readme.md index 996eb0383..62dab8880 100644 --- a/plugins/samplesource/sigmffileinput/readme.md +++ b/plugins/samplesource/sigmffileinput/readme.md @@ -12,6 +12,8 @@ Note: this plugin is officially supported since version 6.

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![SigMF File input plugin GUI](../../../doc/img/SigMFFileInput_plugin.png)

1: Start/Stop

diff --git a/plugins/samplesource/sigmffileinput/sigmffileinputgui.cpp b/plugins/samplesource/sigmffileinput/sigmffileinputgui.cpp index 41bcd1979..d2f88919a 100644 --- a/plugins/samplesource/sigmffileinput/sigmffileinputgui.cpp +++ b/plugins/samplesource/sigmffileinput/sigmffileinputgui.cpp @@ -27,7 +27,6 @@ #include "plugin/pluginapi.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -75,8 +74,7 @@ SigMFFileInputGUI::SigMFFileInputGUI(DeviceUISet *deviceUISet, QWidget* parent) connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); setAccelerationCombo(); displaySettings(); @@ -668,21 +666,26 @@ void SigMFFileInputGUI::setNumberStr(int n, QString& s) void SigMFFileInputGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void SigMFFileInputGUI::makeUIConnections() diff --git a/plugins/samplesource/soapysdrinput/readme.md b/plugins/samplesource/soapysdrinput/readme.md index 05b8b6fab..31b116333 100644 --- a/plugins/samplesource/soapysdrinput/readme.md +++ b/plugins/samplesource/soapysdrinput/readme.md @@ -73,6 +73,8 @@ When installed the Red Pitaya SoapySDR plugin lists a Red Pitaya device even if

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![SoapySDR input plugin GUI](../../../doc/img/SoapySDRInput_plugin1.png) The top part described by number tags is common for all devices. The bottom part under the "A" tag depends on the SoapySDR device implementation. The corresponding widgets are stacked vertically inside a scrollable area as there may be many controls depending on how the device interface is implemented in SoapySDR. Move the slider on the right to see all parameters available. diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp b/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp index 500b3cedc..fa97d6638 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp @@ -25,7 +25,6 @@ #include "device/deviceuiset.h" #include "util/simpleserializer.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "soapygui/discreterangegui.h" #include "soapygui/intervalrangegui.h" @@ -96,8 +95,7 @@ SoapySDRInputGui::SoapySDRInputGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); @@ -913,21 +911,26 @@ void SoapySDRInputGui::updateStatus() void SoapySDRInputGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void SoapySDRInputGui::makeUIConnections() diff --git a/plugins/samplesource/testsource/testsourcegui.cpp b/plugins/samplesource/testsource/testsourcegui.cpp index 27a859af3..e6236daf8 100644 --- a/plugins/samplesource/testsource/testsourcegui.cpp +++ b/plugins/samplesource/testsource/testsourcegui.cpp @@ -27,7 +27,6 @@ #include "plugin/pluginapi.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -76,8 +75,7 @@ TestSourceGui::TestSourceGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); } TestSourceGui::~TestSourceGui() @@ -492,21 +490,26 @@ void TestSourceGui::updateSampleRateAndFrequency() void TestSourceGui::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void TestSourceGui::makeUIConnections() diff --git a/plugins/samplesource/usrpinput/readme.md b/plugins/samplesource/usrpinput/readme.md index be639aa92..3d57a4803 100644 --- a/plugins/samplesource/usrpinput/readme.md +++ b/plugins/samplesource/usrpinput/readme.md @@ -6,8 +6,9 @@ This input sample source plugin gets its samples from a [USRP device](https://ww

Interface

-![USRP input plugin GUI](../../../doc/img/USRPInput_plugin.png) +The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) +![USRP input plugin GUI](../../../doc/img/USRPInput_plugin.png)

1: Start/Stop

@@ -19,7 +20,7 @@ Device start / stop button.

2A: Sample rate

-This is the sample rate at which IQ samples are transfered the device to SDRangel, in kS/s (k) or MS/s (M). +This is the sample rate at which IQ samples are transfered the device to SDRangel, in kS/s (k) or MS/s (M).

2B: Stream sample rate

@@ -130,7 +131,7 @@ This label turns green when data is being received from the device. - **O**: turns red if stream experiences overruns - **T**: turns red if stream experiences timeouts - + The stream warning indicators are reset when the acqusition is started.

Dependendices

diff --git a/plugins/samplesource/usrpinput/usrpinputgui.cpp b/plugins/samplesource/usrpinput/usrpinputgui.cpp index bdc8459d4..d2edc86bd 100644 --- a/plugins/samplesource/usrpinput/usrpinputgui.cpp +++ b/plugins/samplesource/usrpinput/usrpinputgui.cpp @@ -27,7 +27,6 @@ #include "ui_usrpinputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -90,8 +89,7 @@ USRPInputGUI::USRPInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_usrpInput->setMessageQueueToGUI(&m_inputMessageQueue); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); } USRPInputGUI::~USRPInputGUI() @@ -609,21 +607,26 @@ void USRPInputGUI::on_sampleRateMode_toggled(bool checked) void USRPInputGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void USRPInputGUI::makeUIConnections() diff --git a/plugins/samplesource/xtrxinput/readme.md b/plugins/samplesource/xtrxinput/readme.md index 57c63f134..b82329800 100644 --- a/plugins/samplesource/xtrxinput/readme.md +++ b/plugins/samplesource/xtrxinput/readme.md @@ -44,6 +44,8 @@ For a group the syntax is the same but the group name is prefixed with `@` like:

Interface

+The top and bottom bars of the device window are described [here](../../../sdrgui/device/readme.md) + ![LimeSDR input plugin GUI](../../../doc/img/XTRXInput_plugin.png)

1: Common stream parameters

diff --git a/plugins/samplesource/xtrxinput/xtrxinputgui.cpp b/plugins/samplesource/xtrxinput/xtrxinputgui.cpp index 4f46ed0da..92409fad1 100644 --- a/plugins/samplesource/xtrxinput/xtrxinputgui.cpp +++ b/plugins/samplesource/xtrxinput/xtrxinputgui.cpp @@ -27,7 +27,6 @@ #include "ui_xtrxinputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" -#include "gui/crightclickenabler.h" #include "gui/basicdevicesettingsdialog.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -77,8 +76,7 @@ XTRXInputGUI::XTRXInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); - connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); makeUIConnections(); @@ -636,21 +634,26 @@ void XTRXInputGUI::on_sampleRateMode_toggled(bool checked) void XTRXInputGUI::openDeviceSettingsDialog(const QPoint& p) { - BasicDeviceSettingsDialog dialog(this); - dialog.setUseReverseAPI(m_settings.m_useReverseAPI); - dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); - dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); - dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + if (m_contextMenuType == ContextMenuDeviceSettings) + { + BasicDeviceSettingsDialog dialog(this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); - dialog.move(p); - dialog.exec(); + dialog.move(p); + dialog.exec(); - m_settings.m_useReverseAPI = dialog.useReverseAPI(); - m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); - m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); - m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); - sendSettings(); + sendSettings(); + } + + resetContextMenuType(); } void XTRXInputGUI::makeUIConnections() diff --git a/sdrgui/channel/channelgui.cpp b/sdrgui/channel/channelgui.cpp index 1ad76e619..7b274bf85 100644 --- a/sdrgui/channel/channelgui.cpp +++ b/sdrgui/channel/channelgui.cpp @@ -240,7 +240,7 @@ void ChannelGUI::setStreamIndicator(const QString& indicator) void ChannelGUI::activateSettingsDialog() { - QPoint p = mapFromGlobal(QCursor::pos()); + QPoint p = QCursor::pos(); m_contextMenuType = ContextMenuChannelSettings; emit customContextMenuRequested(p); } diff --git a/sdrgui/device/devicegui.cpp b/sdrgui/device/devicegui.cpp index 34eba9840..231ee3a4f 100644 --- a/sdrgui/device/devicegui.cpp +++ b/sdrgui/device/devicegui.cpp @@ -48,6 +48,11 @@ DeviceGUI::DeviceGUI(QWidget *parent) : m_indexLabel->setText(tr("X:%1").arg(m_deviceSetIndex)); m_indexLabel->setToolTip("Device type and set index"); + m_settingsButton = new QPushButton(); + QIcon settingsIcon(":/gear.png"); + m_settingsButton->setIcon(settingsIcon); + m_settingsButton->setToolTip("Common settings"); + m_changeDeviceButton = new QPushButton(); m_changeDeviceButton->setFixedSize(20, 20); QIcon changeDeviceIcon(":/swap.png"); @@ -129,6 +134,7 @@ DeviceGUI::DeviceGUI(QWidget *parent) : m_topLayout = new QHBoxLayout(); m_topLayout->setContentsMargins(0, 0, 0, 0); m_topLayout->addWidget(m_indexLabel); + m_topLayout->addWidget(m_settingsButton); m_topLayout->addWidget(m_changeDeviceButton); m_topLayout->addWidget(m_reloadDeviceButton); m_topLayout->addWidget(m_addChannelsButton); @@ -166,6 +172,7 @@ DeviceGUI::DeviceGUI(QWidget *parent) : QObjectCleanupHandler().add(layout()); setLayout(m_layouts); + connect(m_settingsButton, SIGNAL(clicked()), this, SLOT(activateSettingsDialog())); connect(m_changeDeviceButton, SIGNAL(clicked()), this, SLOT(openChangeDeviceDialog())); connect(m_reloadDeviceButton, SIGNAL(clicked()), this, SLOT(deviceReload())); connect(m_addChannelsButton, SIGNAL(clicked()), this, SLOT(openAddChannelsDialog())); @@ -207,6 +214,7 @@ DeviceGUI::~DeviceGUI() delete m_addChannelsButton; delete m_reloadDeviceButton; delete m_changeDeviceButton; + delete m_settingsButton; delete m_indexLabel; qDebug("DeviceGUI::~DeviceGUI: end"); } @@ -255,6 +263,13 @@ void DeviceGUI::deviceReload() } } +void DeviceGUI::activateSettingsDialog() +{ + QPoint p = QCursor::pos(); + m_contextMenuType = ContextMenuDeviceSettings; + emit customContextMenuRequested(p); +} + void DeviceGUI::showHelp() { if (m_helpURL.isEmpty()) { diff --git a/sdrgui/device/devicegui.h b/sdrgui/device/devicegui.h index aee35e306..13fd111da 100644 --- a/sdrgui/device/devicegui.h +++ b/sdrgui/device/devicegui.h @@ -49,8 +49,7 @@ public: enum ContextMenuType { ContextMenuNone, - ContextMenuChannelSettings, - ContextMenuStreamSettings + ContextMenuDeviceSettings }; DeviceGUI(QWidget *parent = nullptr); @@ -100,6 +99,7 @@ private: QString getDeviceTypeTag(); QLabel *m_indexLabel; + QPushButton *m_settingsButton; QPushButton *m_changeDeviceButton; QPushButton *m_reloadDeviceButton; QPushButton *m_addChannelsButton; @@ -124,6 +124,7 @@ private: ChannelAddDialog m_channelAddDialog; private slots: + void activateSettingsDialog(); void openChangeDeviceDialog(); void openAddChannelsDialog(); void deviceReload(); diff --git a/sdrgui/device/readme.md b/sdrgui/device/readme.md new file mode 100644 index 000000000..d07c77aef --- /dev/null +++ b/sdrgui/device/readme.md @@ -0,0 +1,225 @@ +

Device common controls

+ +The device windows have common top and bottom bars + + +![Device window](../../doc/img/DeviceWindow.png) + +

A: Top bar

+ +![Device window top bar](../../doc/img/DeviceWindow_top.png) + +

A.1 Devcice type and index

+ +The format is: + - Device type: + - R: receiver + - T: transmitter + - M: MIMO + - Semicolon separator + - Device set index. A "device set" is the set of a device and its corresponding channels + +THe tooltip shows the device type, sequence number and serial number of the device if it exists. + +You may click on this area and drag the window with the mouse. + +

A.2: Device common settings

+ +All device types have common settings. Clicking on the button opens a dialog to update them + +![Basic device settings dialog](../../doc/img/BasicDeviceSettings.png) + +

A.2.1: Toggle reverse API feature

+ +Use this checkbox to toggle on/off the reverse API feature. With reverse API engaged the changes in the device settings are forwarded to an API endpoint given by address (2.1.2.2), port (2.1.2.3) and device index (2.1.2.4) in the same format as the SDRangel REST API device settings endpoint. With the values of the screenshot the API URL is: `http://127.0.0.1:8888/sdrangel/deviceset/0/device/settings` The JSON payload follows the same format as the SDRangel REST API device settings. For example with HachRF Rx this would be something like: + +``` +{ + "deviceHwType": "HackRF", + "hackRFInputSettings": { + "LOppmTenths": 0, + "bandwidth": 1750000, + "biasT": 0, + "centerFrequency": 435000000, + "dcBlock": 0, + "devSampleRate": 2400000, + "fcPos": 2, + "iqCorrection": 0, + "linkTxFrequency": 0, + "lnaExt": 0, + "lnaGain": 16, + "log2Decim": 0, + "vgaGain": 16 + }, + "tx": 0 +} +``` +Note that the PATCH method is used. The full set of parameters is sent only when the reverse API is toggled on or a full settings update is done. + +The start and stop actions are also forwarded with the `/sdrangel/deviceset/{deviceSetIndex}/device/run` API endpoint using POST (start) or DELETE (stop) methods. + +More details on this feature can be found on the corresponding Wiki page. + +

A.2.2: API address

+ +This is the IP address of the API endpoint + +

A.2.3: API port

+ +This is the IP port of the API endpoint + +

A.2.4: Device index

+ +This is the targeted device index + +

A.2.5: Cancel changes and exit dialog

+ +Do not make any changes and exit dialog + +

A.2.6: Validate and exit dialog

+ +Validates the data (saves it in the channel marker object) and exits the dialog + + +

A.3: Change device

+ +Opens a dialog that lets you choose a different devuce + +![Main Window sampling devices dialog](../../doc/img/MainWindow_SDDialog.png) + +

A.3.1: Device selection combo

+ +Use this combo box to select the device. Only available devices will appear in the list. For devices having more than one channel (ex: LimeSDR) the channel number will appear next to the device sequence number inside the brackets. Ex: `LimeSDR[0:1] 0009060B00473419` designates the second Rx (Rx #1) of the first encountered LimeSDR which serial number is 0009060B00473419. + +

A.3.2: Device selection confirmation

+ +Use the `OK` button to confirm your choice and exit the dialog + +

A.3.3: Device selection cancellation

+ +Use the `Cancel` button to exit the dialog without any change + +

A.4: Reload device

+ +This button activates a close/open sequence to recycle the device. It may be useful when the device is not streaming anymore or in an attempt to clear possible errors. Make sure the streaming is stopped first. + +

A.5: Add channels

+ +Opens a dialog to add one or more channels connected to the device. + +![Add channels dialog](../../doc/img/AddChannels_dialog.png) + +

A.5.1: Channel selection

+ +Use this combo to select which channel type to add + +

A.5.2: Close dialog

+ +Use this button to dismiss the dialog + +

A.5.3: Add channel

+ +Add a new channel by clicking on the `Apply` button. You may click it several times to add more channels. The dialog can be dismissed with the `Close` button or the closing window icon `X` on the top bar. + +

A.6: Device set presets

+ +Opens a dialog to manage device set presets. Device set presets store configurations related to a single device set + +![Presets dialog](../../doc/img/MainWindow_presets_view.png) + +

A.6.1: Preset selection

+You select a preset or a preset group by clicking on its line in the tree view. All actions (6) will be done relative to this preset or preset group. + +

A.6.2: Group

+You can organize your presets into groups. Groups can be collapsed or expanded by using the caret icon on the left. + +

A.6.3: Center frequency

+The center frequency used in this preset is displayed here. + +

A.6.4: Rx/Tx indicator

+"R" is displayed for a Rx device set and "T" for a Tx device set + +

A.6.5: Preset name

+You can give a name to your preset. Names need not to be unique. + +

A.6.6: Preset control or actions

+ +![Presets controls](../../doc/img/MainWindow_presets.png) + +
A.6.6.1: New preset
+Click on this icon to create a new preset with the current values in the selected sample device tab (Main window: 2). + +
A.6.6.2: Update preset
+Click on this icon to create a update the selected preset with the current values in the selected sample device tab (Main window: 2). Please note that this does not save the preset immediately on disk to save presets immediately you need to use the save button (4). + +
A.6.6.3: Edit preset
+Opens a new window where you can change the group name and description. + + - for group items you can rename the group or merge all group presets into an existing group by selecting this existing group + + - for preset items you can: + - move the preset to another existing group by selecting this existing group + - assign this preset to a new group by typing in this new group + - change the description + +
A.6.6.4: Export preset
+Using the previous icon presets are saved globally in a system dependent place. Using this icon you can export a specific preset in a single file that can be imported on another machine possibly with a different O/S. The preset binary data (BLOB) is saved in Base-64 format. + +
A.6.6.5: Import preset
+This is the opposite of the previous operation. This will create a new preset in the selected group or the same group as the preset being selected. + +
A.6.6.6: Delete preset
+on a preset item: deletes the selected preset. +on a preset group: deletes the group and all its presets. + +
A.6.6.7: Load preset
+Applies the selected preset to the current device set (source and channel plugins). + +

A.7: Title

+ +The window title shows the device type and a sequence number. + +You may click on this area and drag the window with the mouse. + +

A.8: Help

+ +Clicking on this button opens the documentation about the device controls in github in the browser. + +

A.9: Move to a workspace

+ +Opens a dialog to choose a destination workspace to move the device window to. Nothing happens if the same workspace is selected. + +

A.10: Shrink window

+ +Click this button to reduce the window to its minimum size + +

A.11: Close window

+ +Click this button to close the window and removes the channel from the device set. + +

A.12: Top size grip

+ +You can drag this gray square to resize the window + +

B: Botom bar

+ +![Device window bottom bar](../../doc/img/DeviceWindow_bottom.png) + +

B.1: Show spectrum

+ +When the main spectrum window of this device is hidden this will show it. It has no effect if the main spectrum window is displayed. + +

B.2: Show all channels

+ +This will show all hidden channel windows if any. It has no effects on channel windows already displayed. + +

B.3: Status text

+ +The status messages appear here if any. + +You may click on this area and drag the window with the mouse. + +

A.4: Bottom size grip

+ +You can drag this gray square to resize the window +