#
# Copyright 2015 Ettus Research LLC
# Copyright 2018 Ettus Research, a National Instruments Company
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
"""
Run device tests for the X3x0 series.
"""

# pylint: disable=wrong-import-position
# pylint: disable=unused-import

import os
from usrp_probe import get_num_chans
num_chans = get_num_chans(os.getenv('_UHD_TEST_ARGS_STR', ""))
tx_chans = num_chans['tx']
rx_chans = num_chans['rx']

from benchmark_rate_test import uhd_benchmark_rate_test
uhd_benchmark_rate_test.tests = {}
for (rate, speed) in [(1e6, 'slow'), (25e6, 'fast')]:
    for chan in range(tx_chans):
        uhd_benchmark_rate_test.tests.update({
            'tx_chan{}_{}'.format(chan, speed): {
                'duration': 1,
                'direction': 'tx',
                'chan': str(chan),
                'rate': rate,
                'acceptable-underruns': 10,
                'tx_buffer': (0.1*1e6)+32e6*8*1/32,  # 32 MB DRAM for each channel (32 bit OTW format),
            }
        })
    for chan in range(rx_chans):
        uhd_benchmark_rate_test.tests.update({
            'rx_chan{}_{}'.format(chan, speed): {
                'duration': 1,
                'direction': 'rx',
                'chan': str(chan),
                'rate': rate,
                'rx_buffer': 0.1*1e6,
            }
        })
    if tx_chans > 0:
        all_chans_str = ",".join([str(chan) for chan in range(tx_chans)])
        uhd_benchmark_rate_test.tests.update({
            'all_tx_chans_{}'.format(speed): {
                'duration': 1,
                'direction': 'tx',
                'chan': all_chans_str,
                'rate': rate if speed == 'slow' else rate / tx_chans,
                'acceptable-underruns': 10,
                'tx_buffer': (0.1*1e6)+32e6*8*1/32,  # 32 MB DRAM for each channel (32 bit OTW format),
            }
        })
    if rx_chans > 0:
        all_chans_str = ",".join([str(chan) for chan in range(rx_chans)])
        uhd_benchmark_rate_test.tests.update({
            'all_rx_chans_{}'.format(speed): {
                'duration': 1,
                'direction': 'rx',
                'chan': all_chans_str,
                'rate': rate if speed == 'slow' else rate / rx_chans,
                'rx_buffer': 0.1*1e6,
            }
        })
    if tx_chans == rx_chans:
        for chan in range(tx_chans):
            uhd_benchmark_rate_test.tests.update({
                'siso_chan{}_{}'.format(chan, speed): {
                    'duration': 1,
                    'direction': 'tx,rx',
                    'chan': str(chan),
                    'rate': rate,
                    'acceptable-underruns': 10,
                    'tx_buffer': (0.1*1e6)+32e6*8*1/32,  # 32 MB DRAM for each channel (32 bit OTW format),
                    'rx_buffer': 0.1*1e6,
                }
            })
        all_chans_str = ",".join([str(chan) for chan in range(tx_chans)])
        uhd_benchmark_rate_test.tests.update({
            'mimo_{}'.format(speed): {
                'duration': 1,
                'direction': 'tx,rx',
                'chan': all_chans_str,
                'rate': rate if speed == 'slow' else rate / tx_chans,
                'acceptable-underruns': 500,
                'tx_buffer': (0.1*1e6)+32e6*8*1/32,  # 32 MB DRAM for each channel (32 bit OTW format),
                'rx_buffer': 0.1*1e6,
            }
        })

if (tx_chans > 0):
    from tx_waveforms_test import uhd_tx_waveforms_test
    uhd_tx_waveforms_test.tests = {}
    all_chans = []
    for i in range(tx_chans):
        all_chans.append(str(i))
        test_name = 'chan{}'.format(i)
        uhd_tx_waveforms_test.tests.update({test_name : {'chan': i}})
    if (tx_chans > 1):
        uhd_tx_waveforms_test.tests.update({'all_chans': {'chan': ",".join(all_chans)}})
    from tx_bursts_test import uhd_tx_bursts_test
    from tx_multi_spc_timed_commands_test import tx_multi_spc_timed_commands_test

if (rx_chans > 0):
    from rx_samples_to_file_test import rx_samples_to_file_test
    from rx_multi_spc_timed_commands_test import rx_multi_spc_timed_commands_test
from test_pps_test import uhd_test_pps_test
from gpio_test import gpio_test
from bitbang_test import bitbang_test
from list_sensors_test import list_sensors_test
from test_messages_test import test_messages_test
