#!/usr/bin/env python3

import argparse, sys

receiver = 'OTHER'
rx_phase = '+1'
rx_hand  = '-'
rx_pol   = 'cir'
rx_ang   = "0"


parser = argparse.ArgumentParser()
parser.add_argument('-f', '--freq', '-freq', help="Central Frequency (MHz)", type=int)
parser.add_argument('-d', '--das', '-das', help="DAS central Frequency (MHz)", type=int)
parser.add_argument('-i', '--inverted', '-inverted', help="DAS central Frequency", action="store_true")
parser.add_argument('-o', '--plan', '-plan', help="Show full bandwidth coverage", action="store_true")
parser.add_argument('-r', '--receiver', '-receiver', '-rx', '--rx', help="Receiver Name")
parser.add_argument('-l', '--linear', '-linear', help="Linear Receiver", action="store_true")
args = parser.parse_args()

if args.freq is None and args.das is None:
    sys.stderr.write("Need to pass -freq or -das\n")
    sys.exit()

if args.freq is not None and args.das is not None:
    sys.stderr.write("Pass either  -freq or -das, not both\n")
    sys.exit()

freq = args.freq
if freq is None:
    if args.inverted:
        freq = args.das-416
    else:
        freq = args.das+416

if args.inverted:    
    sideband = -1
else:
    sideband = 1

if args.receiver is not None:
    receiver = args.receiver

    if receiver.casefold() == "MARS".casefold():
        receiver = "MARS"
        rx_phase = "+1"
        rx_hand = "1"
        rx_pol = "cir"
        rx_ang = "45"

if args.linear:
    rx_pol = "lin"
    
print("""\
CONFIG_NAME             medusa.vlbi
# Instrument this configuration is valid for
INSTRUMENT              Medusa

# Owner of data files produced
USER                    spip
SCRIPTS_DIR             /home/uwb/linux_64/bin
CONFIG_DIR              /home/uwb/linux_64/share
WEB_DIR                 /home/uwb/linux_64/web
STATUS_DIR              /home/uwb/linux_64/web/status
PROCESSING_DB_KEY       /home/uwb/linux_64/share/bpsr.info

# Configured Processing Modes
TIMING_MODE             true
SEARCH_MODE             true
CONTINUUM_MODE          true


###############################################################################
# Server directory configuration
SERVER_HOST             medusa-srv0
SERVER_LOG_PORT         21000
SERVER_ALIASES          medusa-srv0.atnf.csiro.au
SERVER_DIR              /data/MEDUSA-SRV0_1/export/uwb
SERVER_RESULTS_DIR      /data/MEDUSA-SRV0_1/export/uwb/results
SERVER_OLD_RESULTS_DIR  /data/MEDUSA-SRV0_1/export/uwb/old_results
SERVER_ARCHIVE_DIR      /data/MEDUSA-SRV0_1/export/uwb/archives
SERVER_OLD_ARCHIVE_DIR  /data/MEDUSA-SRV0_1/export/uwb/old_archives
SERVER_STATS_DIR        /data/MEDUSA-SRV0_1/export/uwb/results/status
SERVER_LOG_DIR          /data/MEDUSA-SRV0_1/export/uwb/logs
SERVER_CONTROL_DIR      /data/MEDUSA-SRV0_1/export/uwb/control
SERVER_FOLD_DIR         /data/MEDUSA-SRV0_1/export/uwb/fold
SERVER_SEARCH_DIR       /data/MEDUSA-SRV0_1/export/uwb/search
SERVER_CONTINUUM_DIR    /data/MEDUSA-SRV0_1/export/uwb/continuum
SERVER_SPECTRAL_LINE_DIR     /data/MEDUSA-SRV0_1/export/uwb/specline
SERVER_VLBI_DIR         /data/MEDUSA-SRV0_1/export/uwb/vlbi
SERVER_BASEBAND_DIR     /data/MEDUSA-SRV0_1/export/uwb/baseband
SERVER_DAEMONS          uwb_logs:0 uwb_tcs:1 uwb_repack_fold_server:1 spip_results:1 uwb_repack_search:1 uwb_repack_continuum:1 uwb_tcs_interface:1 uwb_archiver:1

###############################################################################
# Port Configuration, stay below 32768

# TCS Interface configuration
TCS_INTERFACE_PORT        21100
TCS_REPORT_PORT           21200
SERVER_ALERT_PORT         21300
LMC_PORT                  21400

# For clients to log system messages
SERVER_SRC_LOG_PORT       21500
SERVER_SYS_LOG_PORT       21600

###############################################################################
# Client directory configuration
CLIENT_DIR              /data/local/uwb
CLIENT_CONTROL_DIR      /data/local/uwb/control
CLIENT_LOG_DIR          /data/local/uwb/logs
CLIENT_ARCHIVE_DIR      /data/local/uwb/archives
CLIENT_RECORDING_DIR    /data/local/uwb/rawdata
CLIENT_PREPROC_DIR      /data/local/uwb/preproc
CLIENT_FOLD_DIR         /data/local/uwb/fold
CLIENT_TRANS_DIR        /data/local/uwb/trans
CLIENT_SEARCH_DIR       /data/local/uwb/search
CLIENT_CONTINUUM_DIR    /data/local/uwb/continuum
CLIENT_SPECTRAL_LINE_DIR     /data/local/uwb/specline
CLIENT_VLBI_DIR         /data/local/uwb/vlbi
CLIENT_BASEBAND_DIR     /data/local/uwb/baseband
CLIENT_STATS_DIR        /data/local/uwb/stats
CLIENT_SCRATCH_DIR      /data/local/uwb/scratch
CLIENT_ZOOM_DIR      /data/local/uwb/zoom

CLIENT_DAEMONS          spip_smrb:0 uwb_recv:1 uwb_stat:2 uwb_repack_stat:2 uwb_preprocessor:2 uwb_repack_preprocessor:2 uwb_zoom:2 uwb_fold:2 uwb_re\
pack_fold:2 uwb_search:2 uwb_repack_search:2 uwb_baseband:2 uwb_repack_baseband:2 uwb_continuum:2 uwb_repack_continuum:2 uwb_vlbi:2 uwb_cleaner:2 uwb\
_discard:2 uwb_archiver:2

STREAM_BINARY           uwb_udpdbstats
STREAM_GEN_BINARY       uwb_udpgen
STREAM_STATS_BINARY     uwb_dbstats
STREAM_CTRL_PORT        22000
STREAM_LOG_PORT         22200
STREAM_PROC_PORT        22400
STREAM_GEN_PORT         22600
STREAM_STAT_PORT        22800
STREAM_RECV_PORT        23000
STREAM_PREPROC_PORT     23200
STREAM_RECV_STATS_PORT  23400

BEAM_DAEMONS            
BEAM_REPACK_FOLD_PORT               25000
STREAM_REPACK_FOLD_PORT             25000
BEAM_REPACK_CONTINUUM_PORT          25200
STREAM_REPACK_CONTINUUM_PORT        25200
BEAM_REPACK_SEARCH_PORT             25400
BEAM_REPACK_SPECTRAL_LINE_PORT      25600
BEAM_REPACK_VLBI_LINE_PORT          25800
BEAM_REPACK_BASEBAND_LINE_PORT      26000
BEAM_RESULTS_PORT                   28000

NUM_ZOOM                2

###############################################################################
# CPU Binding
SERVER_CPU_LIST         -1
BEAM_CPU_LIST_0         0,1,2,3
STREAM_CPU_LIST_0       1,2,3
STREAM_CPU_LIST_1       1,2,3
STREAM_CPU_LIST_2       1,2,3
STREAM_CPU_LIST_3       1,2,3
STREAM_CPU_LIST_4       1,2,3
STREAM_CPU_LIST_5       1,2,3
STREAM_CPU_LIST_6       1,2,3
STREAM_CPU_LIST_7       1,2,3

################################################################################
# Data block definitions
#
DATA_BLOCK_PREFIX       a
DATA_BLOCK_IDS          0 1 2 3 4 5 6 7
RECEIVING_DATA_BLOCK    0
TRANSIENTS_DATA_BLOCK   1
PROCESSING_DATA_BLOCK   2
BASEBAND_DATA_BLOCK     3
ZOOM1_DATA_BLOCK        4
ZOOM2_DATA_BLOCK        5
BASEBAND1_DATA_BLOCK    6
BASEBAND2_DATA_BLOCK    7
SEND_DATA_BLOCK         0
RECV_DATA_BLOCK         0

BLOCK_NBUFS_0           256
BLOCK_BUFSZ_0           67108864
BLOCK_NREAD_0           1
BLOCK_PAGE_0            true

# transients data [CPU] 64us, 1024 channels, 32-bit float
BLOCK_NBUFS_1           4
BLOCK_BUFSZ_1           4194304
BLOCK_NREAD_1           1
BLOCK_PAGE_1            true

# cleaned data [GPU]
BLOCK_NBUFS_2           4
BLOCK_BUFSZ_2           134217728
BLOCK_NREAD_2           2
BLOCK_PAGE_2            true
BLOCK_GPUID_2           0

# baseband data [CPU]
BLOCK_NBUFS_3           16
BLOCK_BUFSZ_3           33554432
BLOCK_NREAD_3           1
BLOCK_PAGE_3            true

# GPU Zoom Data Blocks
BLOCK_NBUFS_4           3
BLOCK_BUFSZ_4           134217728
BLOCK_NREAD_4           1
BLOCK_PAGE_4            true
BLOCK_GPUID_4           0

BLOCK_NBUFS_5           3
BLOCK_BUFSZ_5           134217728
BLOCK_NREAD_5           1
BLOCK_PAGE_5            true
BLOCK_GPUID_5           0

# Baseband Zoom Data Blocks
BLOCK_NBUFS_6           16
BLOCK_BUFSZ_6           33554432
BLOCK_NREAD_6           1
BLOCK_PAGE_6            true

BLOCK_NBUFS_7           16
BLOCK_BUFSZ_7           33554432
BLOCK_NREAD_7           1
BLOCK_PAGE_7            true

###############################################################################
# Signal definition
NANT                    1
NBIT                    16
NDIM                    2
NPOL                    2
OSRATIO                 1
RESOLUTION              8
TSAMP                   0.0078125
CHANBW                  128
INDEPENDENT_BEAMS       false
DSB                     1

###############################################################################
# Receiver definition
RECEIVER                {}
BACKEND_PHASE           {}
RCVR_HAND               {}
RCVR_BASIS              {}
RCVR_SANG               {}

# Beams are independent timeseries from multiple antenna or receiving elements
NUM_BEAM                1
BEAM_0                  1

# Sub bands are collections of 1 or more frequency channels
NUM_SUBBAND             8

# Streams are the number of input data streams that comprise NUM_BEAM * NUM_SUBBAND
NUM_STREAM              8

# Stream configration is of the form HOST:BEAM:SUBBAND
STREAM_0                medusa-gpu0:0:0
STREAM_1                medusa-gpu1:0:1
STREAM_2                medusa-gpu2:0:2
STREAM_3                medusa-gpu3:0:3
STREAM_4                medusa-gpu4:0:4
STREAM_5                medusa-gpu5:0:5
STREAM_6                medusa-gpu6:0:6
STREAM_7                medusa-gpu7:0:7

# assignment of GPUs to streams
GPU_ID_0                0
GPU_ID_1                0
GPU_ID_2                0
GPU_ID_3                0
GPU_ID_4                0
GPU_ID_5                0
GPU_ID_6                0
GPU_ID_7                0

STREAM_NUMA_0           0
STREAM_NUMA_1           0
STREAM_NUMA_2           0
STREAM_NUMA_3           0
STREAM_NUMA_4           0
STREAM_NUMA_5           0
STREAM_NUMA_6           0
STREAM_NUMA_7           0

STREAM_RECV_CORE_0      0
STREAM_RECV_CORE_1      0
STREAM_RECV_CORE_2      0
STREAM_RECV_CORE_3      0
STREAM_RECV_CORE_4      0
STREAM_RECV_CORE_5      0
STREAM_RECV_CORE_6      0
STREAM_RECV_CORE_7      0

STREAM_PROC_CORE_0      1
STREAM_PROC_CORE_1      1
STREAM_PROC_CORE_2      1
STREAM_PROC_CORE_3      1
STREAM_PROC_CORE_4      1
STREAM_PROC_CORE_5      1
STREAM_PROC_CORE_6      1
STREAM_PROC_CORE_7      1

STREAM_GEN_CORE_0       2
STREAM_GEN_CORE_1       2
STREAM_GEN_CORE_2       2
STREAM_GEN_CORE_3       2
STREAM_GEN_CORE_4       2
STREAM_GEN_CORE_5       2
STREAM_GEN_CORE_6       2
STREAM_GEN_CORE_7       2

STREAM_UDP_0            239.17.11.64:10.17.0.1:17264
STREAM_UDP_1            239.17.12.64:10.17.1.1:17265
STREAM_UDP_2            239.17.11.65:10.17.2.1:17266
STREAM_UDP_3            239.17.12.65:10.17.3.1:17267
STREAM_UDP_4            239.17.11.66:10.17.4.1:17268
STREAM_UDP_5            239.17.12.66:10.17.5.1:17269
STREAM_UDP_6            239.17.11.67:10.17.6.1:17270
STREAM_UDP_7            239.17.12.67:10.17.7.1:17271

# Each sub-band on each beam will have the same centre frequnecy, number of channels and bandwidth
# sub band configuration is of format CFREQ:BW:NCHAN  [MHz]
""".format(receiver,rx_phase,rx_hand,rx_pol,rx_ang))

f0 = freq - sideband*384 # 3.5 subbands of 128 MHz

for i in range(8):
    if args.plan:
        extent = ' #  {}-{} MHz'.format(f0+128*i*sideband-64, f0+128*i*sideband+64)
    else:
        extent = ''
        
    print("SUBBAND_CONFIG_{}        {}:{}:1{}".format(i, f0+128*i*sideband, 128*sideband, extent))

print("""\
SUBBAND_CHANS_0         0:0
SUBBAND_CHANS_1         1:1
SUBBAND_CHANS_2         2:2
SUBBAND_CHANS_3         3:3
SUBBAND_CHANS_4         4:4
SUBBAND_CHANS_5         5:5
SUBBAND_CHANS_6         6:6
SUBBAND_CHANS_7         7:7
""")
