Re: Async processing issue within an event handler

[email protected] (James Lynes)
Newsgroups perl.wxperl.users
Message-ID <CABPysehDidnU=G9z7K4oJCtg4F0wUf-s3TXJ3Ze_snXG-4RECw@mail.gmail.com>
Steve:

Thanks for the great response as always.

Yes, I've been having fun playing with this stuff. DVB-T is the EU standard
for digital broadcast television. The standard is different in the US(go
figure☺). The dongle I bought was around $12 USD. I've heard WWV on 25MHz,
US Citizen's Band around 27MHz, US Broadcast FM 88-108 MHz, Aircraft
120-135 MHz, 2m Amateur 144-148 MHz, NOAA Weather 162 MHz, and 70cm Amateur
440 Mhz. Normal Amateur bands and shortwave stations below 24 MHz require
the 24 MHz upconverter which I haven't built yet). The output of gqrx can
be fed through Pulse Audio to fldigi for decoding digital data streams(I
have just started looking at this feature).

Based on your comments I went and read the Perl Threads tutorial and
searched Perl Monks for Wx and Threads(very little there). Also no working
example on the wxPerl Wiki.

I think Threads and Threads::Shared with lock() is the way to go. Now I
just have to go figure it out!

Thanks again,

James



On Thu, Sep 24, 2015 at 9:47 AM, Steve Cookson <[email protected]>
wrote:

> 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) that just scans from F1 to F2 repeatedly. For
> more flexibility(and practice) I decided to expand lite.pl into a wxPerl
> application(wxgqrxLite.pl), mostly a bunch of text controls and sizers.
>
> Problem 1: 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
>
>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.