#!/usr/bin/env python

usage="""\
Antenna Switch Script

This script disables all channels for a period of time before
re-enabling them. This works as a poor man's proxy for an antenna
switch. Note that it does not turn off OmniStar.
"""

import RXTools
import time, random
import argparse

parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter,description=usage)
parser.add_argument('rcvr', nargs='+', help='receiver addr:port, e.g. 10.1.150.199:5018')
parser.add_argument('--on',
                    help='antenna on time range in seconds, e.g. 120,150 == 120 to 150 secs',
                    default="120,150")
parser.add_argument('--off',
                    help='antenna off time range in seconds, e.g. 15,25 == 15 to 25 secs',
                    default="15,25")
parser.add_argument('--chan_range',
                    help='only run on given channel range, e.g. 10,20 == channels 10-20',
                    default="")
args = parser.parse_args()

rcvr_list = []
print("Units to test:")
for rcvr in args.rcvr:
    IPaddr, port = rcvr.split(':')
    print("  %s:%s" % (IPaddr,port))
    rcvr_list.append( (IPaddr,int(port)) )

if args.chan_range == "":
    ant_on_cmd = RXTools.formDColAntennaOnCmd()
    ant_off_cmd = RXTools.formDColAntennaOffCmd()
else:
    ch_start,ch_stop = [int(x) for x in args.chan_range.split(',')]
    ant_on_cmd = RXTools.formDColAntennaOnCmd(start_chan=ch_start,
                                              end_chan=ch_stop)
    ant_off_cmd = RXTools.formDColAntennaOffCmd(start_chan=ch_start,
                                                end_chan=ch_stop)
    print("Channel range: %d-%d" % (ch_start,ch_stop))
on_times = [float(x) for x in args.on.split(',')]
if len(on_times) == 1:
    on_times.append(on_times[0])
off_times = [float(x) for x in args.off.split(',')]
if len(off_times) == 1:
    off_times.append(off_times[0])
print("Antenna on time range: %.1f-%.1f seconds" % (on_times[0],on_times[1]))
print("Antenna off time range: %.1f-%.1f seconds" % (off_times[0],off_times[1]))

loop_num = 0
while True:
    loop_num += 1
    random.shuffle(rcvr_list)
    socks = []
    for ip_addr,port in rcvr_list:
        s = RXTools.DColSocket( ip_addr, port )
        s.send_recv_ack( ant_off_cmd )
        socks.append(s)
    print("loop %d: Antenna is OFF" % loop_num)

    time.sleep(random.uniform(off_times[0],off_times[1]))

    for s in socks:
        s.send_recv_ack( ant_on_cmd )
    for s in socks:
        s.close() # this takes a little while
    print("loop %d: Antenna is ON" % loop_num)

    time.sleep(random.uniform(on_times[0],on_times[1]))
