Hi James,
On 21/09/15 23:43, James Lynes wrote:
I apologize for the length of this question in advance.
Background: The July 2015 issue of Nuts and Volts magazine had an
article on using an inexpensive DVB-T USB dongle along with a 24MHz
upconverter as the basis for an HF and higher Software Defined
Receiver(SDR).
Amazing, I didn't know there were such things as SDRs, although I did
play around with the idea of using a microprocessor to act as a video
capture card, which I guess is a similar idea. So you're using a TV
receiver as a radio receiver? Slightly inverted, but cool.
The software used in the article was SDR# an MS-Windows application.
As I am an Ubuntu user, I looked for a similar Linux application. I
found gqrx. While waiting on parts to build the upconverter, I
installed gqrx-sdr from the Ubuntu Software Center. It ran and pulled
in various signals from 24MHz up, but was unstable. Turns out this was
a pretty old version and after uninstalling and then installing sudo
add-apt-repository ppa:gqrx/snapshots, a stable version was found.
Well, gqrx has a Remote Control feature that can accept commands over
a Telnet connection and more digging turned up a perl
script(gqrx-scan) that uses this interface, through Net::Telnet, to
implement a scanner feature. gqrx-scan has many bells and whistles
that I wouldn't ever use so I wrote a lite/crude version(lite.pl
<http://lite.pl>) that just scans from F1 to F2 repeatedly. For more
flexibility(and practice) I decided to expand lite.pl <http://lite.pl>
into a wxPerl application(wxgqrxLite.pl), mostly a bunch of text
controls and sizers.
Problem 1: lite.pl <http://lite.pl> is basically a while(1) loop
scanning from F1 to F2, listening for a second when a strong signal is
detected.
Question 1: Where should the non-GUI stuff fit into a wxPerl application?
Current Solution 1: I created two timer events and put the scan code
in one and the listen code in the other. They trigger each other
alternately at separate rates(30msec and 2 seconds). Only one of these
events/timers are active at a time. This actually works!
This depends on how decoupled you are. If you are completely decoupled
and just want an on or off signal (and I have a number of cases where I
do this) then a parallel process will do it. For instrance I have a
process to check network availability. Sometimes the network
availability is mixed, like on the edge of a mobile or wifi signal, in
this case wx::Timer will appear to hang and your process will freeze.
If this is not what you want, use a separate process. Here is an
example where I use a temporary file with 1 byte in it.
`echo 0 > /home/image/Documents/Endoscopia/DB/nw.txt`; # Create
base file with '0' (network not available)
# if in case previous instance
crashed with nw available
# and it now isn't.
$gl_nw_process_id_int=Wx::ExecuteCommand("perl iM_nw.pl",
wxEXEC_ASYNC); # Maintain network status file asynchronously.
.
.
.
call other stuff.
.
.
.
# on exit or crash
# Switch off nw monitor.
Wx::Process::Kill( $gl_nw_process_id_int, Wx::wxSIGKILL() ) if
$gl_nw_process_id_int;
I then use wx::Timer to reread the file and there is no pause. It
always returns 1 or 0.
Problem 2: You can't start scanning unless the Telnet connection is
open, otherwise it throws a connection refused error.
Solution 2: Add code to track scanning and connection status to
prevent the user from doing illegal operations or multiple consecutive
hits of the same button, and popup message boxes to flag these errors.
You can use a similar solution to the above.
Problem 3: The error checks, interlocks and message boxes between the
{startbutton} and {stopbutton} events seems to be ok. The same cannot
be said for the {connectbutton} and {disconnectbutton} events. There
seems to be a race/async processing problem between establishing the
Telnet connection(which errors and should set the {tnerror} flag) and
the mainline event code. The three individual print Dumper
$self->{tnerror} statements all show {tnerror} = 0 (wrong!) while the
print Dumper $self statement below shows {tnerror} = 1 (right!).
There's a delay in this flag being set in the Net::Telnet call which
causes the rest of the {connectbutton} event routine to process a
wrong flag value.
Question 3: HELP ????? I'm out of ideas...
Maybe a similar one a again?
Question 4: Does event->Skip() terminate the current event handler
like last terminates a while loop?
You have Skip and Veto, Skip says continue and imagine I am not here.
Eg if you pressed the escape key out of a dialog box, if you have code
there, the dialog box will not exit. If you use ->Skip, it will, as it
would as if there was no code there.
Veto says, undo what you just did and is not always applicable.
Neither of these says this routine over-rides and replaces the default
behaviour.
(People, do you all agree?).
Code attached. It will run without the dongle or gqrx installed. It
just fails on the Telnet connection.
Thanks for your input.
Broadly speaking your choices are Wx::Timer, Threads and
Wx::ExecuteCommand/Wx::Process
Good luck,
Steve
James
Ubuntu 14.04.2LTS/perl 5.18.2/wxPerl 3.0.1/HP 15 Quadcore Laptop