From 4948c79d8482c8bb4045ad432af7f477d66e50ea Mon Sep 17 00:00:00 2001 From: Rob French Date: Sun, 20 Sep 2020 23:30:40 -0500 Subject: [PATCH] Seems to be a successful attempt at allowing both: (a) rig to control GQRX (b) GQRX to control rig There's a 0.5 second hang time whenever a given input is made, to prevent dueling inputs. The key thing appears to be, whenever GQRX sets the frequency, I need to tell the rig, but then also, tell GQRX again, so that it centers up the frequency. Other thing to note is that the frequencies are all negative. I wonder if that is actually necessary. --- gqrx-panadapter.py | 176 +++++++++++++++++++++++++++++++++------------ 1 file changed, 129 insertions(+), 47 deletions(-) diff --git a/gqrx-panadapter.py b/gqrx-panadapter.py index e6a1905..1817e50 100755 --- a/gqrx-panadapter.py +++ b/gqrx-panadapter.py @@ -25,18 +25,80 @@ import time DEBUG=True -usb_if_offset = -2700 -lsb_if_offset = 2730 +# States +WAITING = 0 +RIG_CMD = 1 +RIG_WAIT = 2 +GQRX_CMD = 3 +GQRX_WAIT = 4 -def calc_lnb_lo(freq, if_freq, is_usb=True): - if is_usb: +delay_secs = 0.5 +timeout = 0.0 + +usb_if_offset = -2250 +lsb_if_offset = 0 + +rs = 0 +gs = 0 + +def calc_lnb_lo(freq, ifreq, isusb=True): + if DEBUG: + print('Freq: ' + str(freq)) + print('IF Freq: ' + str(ifreq)) + if isusb: if DEBUG: - print('USB IF: ' + str(if_freq + usb_if_offset)) - return freq - (if_freq - usb_if_offset) + print('USB IF: ' + str(ifreq + usb_if_offset)) + return - freq - (ifreq - usb_if_offset) else: if DEBUG: - print('LSB IF: ' + str(if_freq + lsb_if_offset)) - return freq - (if_freq - lsb_if_offset) + print('LSB IF: ' + str(ifreq + lsb_if_offset)) + return - freq - (ifreq + lsb_if_offset) + +def get_rig_freq(rs): + rs.send(b'm\n') + is_usb = True if rs.recv(1024).splitlines()[0] == "USB" else False + rs.send(b'f\n') + return (int(rs.recv(1024)), is_usb) + +def set_rig_freq(rs, gs, freq, ifreq, isusb): + if DEBUG: + print('Set Rig freq: {}'.format(freq).encode()) + + rs.send(b'F ' + str(freq) + '\n') + rs.recv(1024) + + lnb = calc_lnb_lo(freq, ifreq, isusb) + if DEBUG: + print('Set LNB Freq: {}'.format(lnb).encode()) + + gs.send('LNB_LO {}'.format(lnb).encode()) + gs.recv(1024) + + if DEBUG: + print('Set GQRX Freq: {}'.format(freq).encode()) + + gs.send('F {}'.format(-1 * freq).encode()) + gs.recv(1024) + + +def get_gqrx_freq(gs): + gs.send(b'f\n') + return int(gs.recv(1024)) * -1 + +def set_gqrx_freq(gs, freq, ifreq, isusb): + lnb = calc_lnb_lo(freq, ifreq, isusb) + + if DEBUG: + print('Set LNB Freq: {}'.format(lnb).encode()) + + gs.send('LNB_LO {}'.format(lnb).encode()) + gs.recv(1024) + + if DEBUG: + print('Set GQRX Freq: {}'.format(freq).encode()) + + gs.send('F {}'.format(-1 * freq).encode()) + gs.recv(1024) def main(): parser = argparse.ArgumentParser() @@ -70,51 +132,71 @@ def main(): return 1 try: - iffreq = int(args.ifreq * 1e6) - old_rigfreq = 0 - old_lnbfreq = 0 - old_gqrxfreq = 0 + if_freq = int(args.ifreq * 1e6) + old_is_usb = True + tmp_is_usb = True + old_rig_freq = 0 + old_gqrx_freq = 0 + + (rig_freq, is_usb) = get_rig_freq(rs) + gqrx_freq = get_gqrx_freq(gs) + + state = WAITING while True: - if DEBUG: - print('--------------------') - rs.send(b'm\n') - is_usb = True if rs.recv(1024).splitlines()[0] == "USB" else False - rs.send(b'f\n') - rigfreq = int(rs.recv(1024)) - lnbfreq = calc_lnb_lo(rigfreq, iffreq, is_usb) + old_is_usb = is_usb + old_rig_freq = rig_freq + old_gqrx_freq = gqrx_freq - if lnbfreq != old_lnbfreq: - if DEBUG: - print('LNB Freq: {}'.format(lnbfreq).encode()) - gs.send('LNB_LO {}'.format(lnbfreq).encode()) - gs.recv(1024) - old_lnbfreq = lnbfreq + (rig_freq, is_usb) = get_rig_freq(rs) + gqrx_freq = get_gqrx_freq(gs) - if rigfreq != old_rigfreq: - if DEBUG: - print('Rig Freq: {}'.format(rigfreq).encode()) - gs.send('F {}'.format(rigfreq).encode()) - gs.recv(1024) - old_rigfreq = rigfreq - old_gqrxfreq = rigfreq + if state == WAITING: + if rig_freq != old_rig_freq or is_usb != old_is_usb: + set_gqrx_freq(gs, rig_freq, if_freq, is_usb) + timeout = time.time() + delay_secs + state = RIG_CMD + if DEBUG: + print("\nNew state: RIG_CMD\n"); -# gs.send(b'f\n') -# gqrxfreq = int(gs.recv(1024)) -# if DEBUG: -# print('Gqrx freq: {}'.format(gqrxfreq).encode()) -# if gqrxfreq != old_gqrxfreq: -# rs.send(b'F ' + str(gqrxfreq) + '\n') -# rs.recv(1024) -# old_gqrxfreq = gqrxfreq -# old_rigfreq = gqrxfreq -# -# lnbfreq = calc_lnb_lo(rigfreq, iffreq), is_usb) -# gs.send('LNB_LO {}'.format(lnbfreq).encode()) -# gs.recv(1024) -# old_lnb_freq = lnbfreq + elif gqrx_freq != old_gqrx_freq: + tmp_is_usb = is_usb + set_rig_freq(rs, gs, gqrx_freq, if_freq, tmp_is_usb) + timeout = time.time() + delay_secs + state = GQRX_CMD + if DEBUG: + print("\nNew state: GQRX_CMD\n"); + + elif rig_freq != gqrx_freq: + set_gqrx_freq(gs, rig_freq, if_freq, is_usb) + timeout = time.time() + delay_secs + state = RIG_CMD + if DEBUG: + print("\nNew state: RIG_CMD\n"); - time.sleep(args.interval / 100.0) + if state == RIG_CMD: + if rig_freq != old_rig_freq or is_usb != old_is_usb: + set_gqrx_freq(gs, rig_freq, if_freq, is_usb) + timeout = time.time() + delay_secs + elif time.time() > timeout or rig_freq == gqrx_freq: + state = WAITING + if DEBUG: + print("\nNew state: WAITING\n"); + + if state == GQRX_CMD: + if gqrx_freq != old_gqrx_freq: + set_rig_freq(rs, gs, gqrx_freq, if_freq, tmp_is_usb) + timeout = time.time() + delay_secs + elif time.time() > timeout or rig_freq == gqrx_freq: + state = WAITING + if DEBUG: + print("\nNew state: WAITING\n"); + is_usb = tmp_is_usb + + else: + pass + + time.sleep(args.interval / 1000.0) except KeyboardInterrupt: pass except Exception as e: