SDR front end for HPSDR

http://openhpsdr.org/index.php


***********************************************************************
OS, needed software and recommended hardware:


- Windows Win7, Windows XP, 32 or 64 Bit.

- OpenGL capable graphic processor; must be at least OpenGL version 2.0.
  It has been tested on Nvidia and Ati (now AMD) chips. Also, Intel
  onboard graphic chips have been tested.

- At least a DualCore processor, better: QuadCore.

***********************************************************************
Current limitations / Known issues:

- This version is still Beta !

- Only Rx by now.

- Chirp-Decoder mode has been disabled currently.

- "External" DSP mode, i.e. server functionality, is disabled currently
  (although implemented).

- This version does not yet contain Cuda or OpenCL kernels.

- Sampling rate 384 kHz requires quite a lot of computational resources 
  when using 4 receivers!

 ***********************************************************************

Some short explanations:

If you right click with the mouse in the Pan a little window for 
controlling opens. You can 'fix' this window by clicking on the button on 
the top-right; otherwise it closes again if you leave with the mouse. 
These control popups can be opened for every receiver separately.

Let's go through the buttons (from top to down, left to right):

Pan Avg:    turns averaging on/off.
Pan Grid:   turns grid on/off.
Peak Hold:  as it says.
Lock Pan:   tuning the 'VFO' with the mouse wheel or the big frequency 
            display on the top of the app but keeping the center frequency 
			fixed.
Click VFO:  left mouse click moves the 'VFO' to the location of the mouse.
Mid=VFO:    moves the center frequency to the position of the VFO frequency 
            and centers the complete display again.
VFO=Mid:    moves the VFO frequency to the center frequency.

Line, Filled Line, Solid: different ways of displaying the power spectrum.
Simple, Enhanced: different color schemes for the waterfall display.

All other buttons should be self-explanatory, and all these buttons are valid 
for the receiver where you opened the popup.

A further remark: if 'Pan Lock' and 'Click VFO' are turned off, left clicking 
and dragging moves the center frequency as normal. This is also true if you 
left-click and drag with the mouse over the frequency scale. But, if 'Pan Lock' 
is on, left-clicking and dragging in the Pan moves the VFO frequency, and 
left-clicking and dragging with mouse over the frequency scale moves the center 
frequency by keeping the VFO frequency fixed. This is very practical if you 
want to stay on the station you are listeing to, but want to look what's on the 
edges or outside the visible spectrum.

ESC to switch to/from full screen mode.


***********************************************************************
list of changes:

v0.3.2.13+ (N1GP changes):

- Took VK5ABN's cudaSDR version based off v0.3.2.13 but modified to use cuda cores for DSP.
  Ripped the cuda DSP out and put back in the QtDSP, added local sound, added more rcvrs (20),
  added ADC selection in the floating rx widget. Mostly use this to test HPSDR FPGA changes.
  
v0.3.2.13:

- Improved threading model (nothing to see on the GUI).

v0.3.2.12:

- Added 384 ksps sample rate. Currently this only works OK for maximal 4
  receivers!
  
- Bug fix: averaging per receiver corrected.

v0.3.2.11:

- Rx 0 (the main receiver) increases spectrum resolution by zooming the 
  frequency scale now automatically up to 32768 bins FFT-size.
  
- For every receiver the Panadapter spectrum graphics can be selected
  seperately now; as well as the avering rate.
  
- Windows size is saved in windowsSettings.ini


v0.3.2.10:

- additional control: up to now, the frequency scale could be moved up 
  and down by clicking left-mouse on this scale. Now, to move this scale
  you have to hold the shift key AND left-click the mouse button.
  
  If you don't hit the shift key and use the left-mouse button on the 
  frequency scale the center frequency is moved accordingly (by keeping
  any difference to the VFO frequency constant).
  
v0.3.2.9:

- several bug fixes: 
	NCO frequency adjusted when changing sample rate
	NCO frequency changing when tuning other receiver than the current one
	Thread stopping caused a crash when using more than one receiver
	
	
v0.3.2.8:

- Bug fixes

v0.3.2.7:

- The Radio control Popup window opens now by clicking the right mouse
  button. These Popups can be opened for each receiver seperately, and
  can be made sticky. On the Popups you now find the controls for
  averaging, grid display, Peak-Hold function, 'VFO=Mid', and 'Mid=VFO',
  each of which is controlled seperately for each receiver window.
  
- The 'Locked Pan' feature has been extended by another mode called
  'Click VFO'. If only the 'Locked Pan' mode has been choosen, the VFO
  frequency is controlled by the mouse wheel or by dragging the mouse
  in the Pan/Waterfall. If in addition 'Click VFO' is choosen, the VFO
  frequency is controlled by clicking with the left mouse button, or by
  clicking and dragging.
  
- The status of 'Locked Pan', 'Click VFO' and all center and VFO 
  frequencies are stored in the settings.ini, and are retrieved after a
  restart of the application.
  
v0.3.2.6:

- added possibility to fix the Panadapter/Waterfall spectra to the 
  center frequency, and tune the VFO independently from this center 
  frequency. So now we have differentiate between the 'center frequency'
  and the 'VFO frequency', which is the frequency at which audio is 
  demodulated.
  
  You can turn on this feature by clicking on the small button 'Lock Pan'
  in the Panadapter window top left. Then you can drag the VFO with the
  mouse (left click), or by dragging the mouse wheel (tuning in fixed 
  mouse wheel steps). If you click in the Panadapter with right mouse
  button the hair cross shows up (as before), but then left clicking
  moves only the VFO frequency while the Panadapter is locked.
  
  Two additional buttons gives the possibility to set either the VFO
  frequency to the center frequency ('vfo = mid'), or the center 
  frequency to the current VFO frequency ('mid = vfo').
  
  A note on the implementation: this is a feature which was already present 
  in Cathy Moss' SDRMAX3 (but not the DSP related function), where the
  idea of the control of this feature is taken from. Another wonderful 
  feature of Cathy's work which I very much appreciate. 
  
  The DSP implementation is adapted from cuteSDR by Moe Wheatley, AE4JY. 
  It is actually an implementation for translating a frequency band using 
  a quadrature oscillator, as described in Richard Lyons book 'Understanding 
  Digital Signal Processing'. In fact, the implementation is fairly easy, 
  and it was especially easy for me because of the very nice example code  
  from Moe Wheatley's cuteSDR. I very much appreciate also his work on 
  cuteSDR!
  
  I am still experimenting with the features to control this behavior, and
  I welcome any clever ideas for doing this!

v0.3.2.5:

- added possibility to switch off firmware checks.

v0.3.2.4:

- added Metis FW V2.2

v0.3.2.3:

- Bug-fix: inital settings of demod mode corrected

- Bug-fix: sample-rate changing did not care about the filter settings.

v0.3.2.2:

- Bug-fix: wide band scope zooming now works correctly.

- Bug-fix: AGC mode 'User' caused an application crash.

- for Linux/MacOs only: improved font scaling on the control panel.


v0.3.1.2:

- Bug-fix: a font missing caused  an application crash if ADC overloads.

- Thanks to Berndt Wulf, VK5ABN, a socket option was adjusted.

- During HPSDR network device detection (Metis/Hermes) a message is shown
  on the status bar.

  
v0.3.1.1:

- Bug-fix on the Metis/Hermes network connections.

- S-Meter font mismatch corrected.


v0.3.1.0:

- Important: please use the new settings.ini with this release !

- The tool chain has been replaced by GCC (MinGW, MinGW-w64) and Eclipse 
  CDT. The sources have been revised for the use of GCC.
  Good-bye Visual Studio! If you want to follow me on that way, just let
  me know. You might also ask me why I did that ;-)

- The HPSDR protocol is now fully implemented (Rx & Tx), but for Tx it is
  still a way to go.

- A major revision of the internal data structure has been completed.

- Alex interface has been finished. The Alex states are stored per band.

- Penny OC pins (Rx & Tx) interface ready. The values are stored per band.

- A CPU usage indicator has been added on the status bar. It shows the
  mean CPU usage percentage of cuSDR.

- DoubleClick in the Panadapter opens a little window for changing Band, 
  Demod, Filtersize, AGC mode. If you move the mouse out of this window 
  it closes after a short time. This is a feature which was available in 
  similar form in SDRMAX III from Cathy Moss. Just another appreciation 
  of her work!
  
- Growing the receiver windows (Pan + Waterfall) causes to increase the 
  font sizes of the scales as well as the font size of the cross-hair 
  information.
  
- The Mercury attenuator ('Preamp') values are now stored per band.

- The dBm scale resolutions on the Panadapter are now stored now per band. 
  Note please: If you change the band by a band button in the Rx Ctrl 
  widget, the stored value is restored. If you change band by altering the 
  frequency (by the mouse wheel, or by dragging in the Panadapter, or by 
  altering the big frequency display) the stored values are NOT restored.

- The mode of operation (DSP mode) is stored now per band.

- Added a new high resolution timer based on QueryPerformanceFrequency of
  Windows OS. A better control of the FPS value (frames per second) based
  on the high resolution timer has been implemented. The FPS values are
  stored per receiver in the settings.ini. Each receiver runs its own
  high-res timer.

- Added a time scale to the waterfall spectra, which varies with the FPS 
  value.

- A first version of QtDSP has been implemented. DttSP is discarded.
  There is no noise reduction/noise blanker/notch filter present 
  currently. Please note: this is by no means a judgement over DttSP!
  
- Warren Pratt's, NR0V, AGC is now implemented in QtDSP. Added graphical 
  control for AGC gain threshold and hang threshold. Click on the orange
  colored button to turn AGC threshold/hang threshold lines on and off.

- Added volume mute functionality.

- Added local date & time display on the status bar.

- Some re-organization of the widget content.

- Added firmware version control for Mercury, Penelope/Pennylane, Metis
  and Hermes.


v0.3.0.1:

- Major change on the GUI. Introduced docking windows.
  
- Edit your Call Sign in the Display settings.

v0.2.2.6:

- Changed way of getting firmware version numbers.

- Added warnings if another hardware has been selected as was discovered.

v0.2.2.5:

- Bug fixes (wide band, multi-Rx views, and more)

- S-Meter min/max-Bar (the red/orange one) improved: slow reset.

- Added an IP-packet 'LED' in order to indicate if there are packet losses.
  Useful if you encounter audio distortions caused by network problems.
  
- Added timers to control the SYNC, ADC, and IP Packets LEDs.

only cuSDR32:

- Provided *.pro/*.pri files, and tested compilation under minGW.
  (gcc-Version 4.7.0)

v0.2.2.4:

- Important bug fix: memory leak closed !

v0.2.2.3:

- Bug fix in the Peak-Hold function; zooming on the frequency scale can
  cause a crash of the application.
  
- Added Peak-Hold for the other display styles.

v0.2.2.2:

- Peak Hold for the Panadapter has been added. Works currently only for 
  display style 'Line'.

v0.2.2.1:

- A new averaging method has been implemented. This method is taken from
  Richard Lyons' book 'Understanding Digital Signal Processing', 3rd ed.,
  p.791. It is called 'Dual-Mode Averaging', and consists of an exponential
  averaging together with a fast way of blending the moving averager.
  Note, this method introduces also a noise reduction, which can be seen
  on the 16k wide band spectrum if you turn averaging on and off.
  
v0.2.2.0:

- In order to ensure backward compatibility to HPSDR firmware versions,
  the start procedure has been changed. Now a first start is performed 
  to read out the firmware versions of the connected HPSDR hardware. 
  Then, with the correct initializations wrt the firmware versions, the 
  final start is launched. This causes in general a longer starting time.
  
- Added possibility to show wide band data with 16k sample size (Hermes 
  firmware > v1.6, Mercury firmware > v3.2).
  
- If there are two receivers selected, you now have the possibility to
  link the center frequency displays of the two receivers in the Waterfall
  display. This only makes sense if both receivers are on the same band.
  Then you can drag the frequency rulers of, e.g. receiver 1, to show only
  the Panadapter display, and receiver 2 to show only the Waterfall display.
  In this way you have a moving Panadapter display (receiver 1 in this case)
  and a fixed Waterfall display (receiver 2) with a line showing the 
  frequency of receiver 1.
  
v0.2.1.2:

- Minor correction of the wideband display data wrt 20 dB attn.

v0.2.1:

- The DOS command window is replaced now by a log file. This file 
  ("cuSDR.log") is normally placed in the directory where cuSDR is 
  started. If you have problems with the application, I would be glad
  if you could send me this log file.
  
  
v0.2.0:

- many small changes/improvements/bug fixes
- corrected a device discovery problem when more than one device is
  in the local network (Metis/Hermes)
- Panadapter display (Filter, Frequency etc.)
- finally a slider for the AGC gain (DttSP and QtDSP)
- first instance of the QtDSP package, the Qt-adaptation of the 
  SharpDSP package. Note: QtDSP package is not yet completed; e.g.
  the S-Meter is not yet working.
- first implementation of Warren Pratt's, NR0V, ingenious AGC function.
- Hermes (RX) support
- Alexiares support prepared
- First steps for the Tx path added; "Transmit" Tab added; "Ext Ctrl" Tab 
  added; "PA" Tab added; "Alex" Tab added

v0.1.10:

- added averaging for wide band panadapter
- fixed problem that Mercury/Metis are not correctly initialized after
  the first "Start" if more than one receiver is selected.
- fixed wrong debug message in DOS-console after hitting "Start"
  command ("send Start command to Metis at ...")
- fixed receiver display layout when switching from view1 to view2
  
v0.1.09:

- fixed problem when clicking the Windows close button and app is running
- fixed missing GUI link / filter and filter group changes
- fixed crashes when changing sample rate during receiving: inserted an
  additional mutex in method dspProcessing()
- changed method initMetis() to connect to Metis/Hermes: it is now based on
  a time out
- fixed some graphical problems when showing hair cross
- hair cross is switched off now when you switch receiver

V0.1.08

Changes:
- minor changes on the GUI; new S-Meter


***********************************************************************
Since there is no manual yet, here are the most important things to know,
but the GUI should mostly be self-explaining.

The application is controlled by a number of widgets which opens by hitting
the corresponding buttons, some of which are currently disabled. Just try
before hitting "Start" to find out where to control all the parameters.
Note, some of Buttons are disabled if the application is running (i.e
receiving), that is, they can only be altered after hitting "Stop".

If you are connecting Metis directly to the PC, chose the correct network
adapter with an APIPA address (see Metis manual) in the HPSDR widget.
Otherwise, if you are on a local LAN with DHCP server, the application will
check for the active network adapter. Remember, if your PC has already an
IP address, e.g. from your router, and you disconnect the PC from the network
in order to connect Metis to your PC, you have to deactivate and re-activate
your network adapter (or simply restart you PC). This is NOT necessary if
your PC has two network adapters, of course.

If you want to enable more than one receiver, please go to the "HPSDR" widget
(-> HPSDR Button) when the application is stopped. Then choose in the right
bottom the number of receivers. The corresponding number of receiver panels
should show up. Then press "Start" and feel lucky. On the main button panel,
right, you choose the receiver to control and listen to.

Every receiver panel can be controlled by itself. The scales are zoom-able
(right mouse button). The dBm scale can be moved by the left mouse button.
Mouse wheel for controlling frequency if you are in the panadapter. You can
also drag in the panadapter holding down the left mouse button to change
frequency.

If you move your mouse over the big frequency display, you can alter the
digits by the mouse wheel directly. Clicking on the digits alter the mouse
wheel's step size. The receiver panels are sizable. You can shut off the
waterfall display by dragging the frequency scales to the bottom of each
panel. Note, if you close a waterfall display by dragging the frequency scale
to the bottom, there is nearly no change of CPU utilization due to the use of
framebuffer objects of OpenGL.

On the Display widget you have some control over FPS and colors. Higher FPS
means, more data per time unit are sent to the receiver panels, and more CPU
resources are needed. Waterfall update is bound from below by 20 ms. The
ESCAPE key switches between full screen view and normal view.

A lot of parameters are stored in a file settings.ini. You can copy/rename/edit
this file, but always a file named settings.ini will be used. If you enter wrong
values, the application will take default values. If you loose settings.ini, the
application will create one for you.

In the settings.ini there is a parameter in the server section called 
'widebandData'. If 'widebandData=off', Metis/Hermes will be initialzed without
sending wide band data, if 'widebandData=on', with sending wide band data.
Be careful when editing settings.ini.

Have fun!

***********************************************************************
Acknowledgements:

The writing of this software would not have been possible without
previous work on famous software packages like:

- Catherine Moss' SDRMAX3 for QSR1: notably the best SDR-GUI written
  ever, at least in my eyes. I took her design idea for the zoom-able
  scales - with personal permission. It's a wonderful smooth,
  intelligent and working GUI concept!

- the SharpDSP package of Phil Covington (N8VB), which is used in KISS
  Konsole, and which has been the starting point for my CudaSharpDSP
  package.

- the wonderful KISS Konsole experimental software and all who have
  contributed to it, and where I started to learn about SDR programming,
  with lots of explanations. Special thanks to George, K9TRV and Phil,
  VK6APH, with whom I had some longer discussions about KISS code and
  techniques in the beginnings.

- the DttSP package, which I use currently for DSP processing.

- the MultiRx multiplexer function from gHPSDR3 by John Melton,
  G0ORX/N6LYT. Great stuff.

- People, who worked on PowerSDR; the Waterfall color scale from is taken
  from PowerSDR :-P

- to all Qt/OpenGL/OpenCL developers and their big number of example
  code and snippets!

Big thanks to the makers/contributors/organizers of the HPSDR hardware!


Hermann, DL3HVH

The author can be reached at hvh.net@gmail.com
