diff --git a/CommonLibs/config_defs.h b/CommonLibs/config_defs.h index 33be73f8..bf49bcfa 100644 --- a/CommonLibs/config_defs.h +++ b/CommonLibs/config_defs.h @@ -57,4 +57,14 @@ struct trx_cfg { unsigned int stack_size; unsigned int num_chans; struct trx_chan chans[TRX_CHAN_MAX]; + struct { + bool ul_freq_override; + bool dl_freq_override; + bool ul_gain_override; + bool dl_gain_override; + double ul_freq; + double dl_freq; + double ul_gain; + double dl_gain; + } overrides; }; diff --git a/CommonLibs/trx_vty.c b/CommonLibs/trx_vty.c index 67241894..1878d837 100644 --- a/CommonLibs/trx_vty.c +++ b/CommonLibs/trx_vty.c @@ -285,6 +285,60 @@ DEFUN_ATTR(cfg_ul_fn_offset, cfg_ul_fn_offset_cmd, return CMD_SUCCESS; } +DEFUN_ATTR(cfg_ul_freq_override, cfg_ul_freq_override_cmd, + "ul-freq-override FLOAT", + "Overrides Rx carrier frequency\n" + "Frequency in Hz (e.g. 145300000)\n", + CMD_ATTR_HIDDEN) +{ + struct trx_ctx *trx = trx_from_vty(vty); + + trx->cfg.overrides.ul_freq_override = true; + trx->cfg.overrides.ul_freq = atof(argv[0]); + + return CMD_SUCCESS; +} +DEFUN_ATTR(cfg_dl_freq_override, cfg_dl_freq_override_cmd, + "dl-freq-override FLOAT", + "Overrides Tx carrier frequency\n" + "Frequency in Hz (e.g. 145300000)\n", + CMD_ATTR_HIDDEN) +{ + struct trx_ctx *trx = trx_from_vty(vty); + + trx->cfg.overrides.dl_freq_override = true; + trx->cfg.overrides.dl_freq = atof(argv[0]); + + return CMD_SUCCESS; +} + +DEFUN_ATTR(cfg_ul_gain_override, cfg_ul_gain_override_cmd, + "ul-gain-override FLOAT", + "Overrides Rx gain\n" + "gain in dB\n", + CMD_ATTR_HIDDEN) +{ + struct trx_ctx *trx = trx_from_vty(vty); + + trx->cfg.overrides.ul_gain_override = true; + trx->cfg.overrides.ul_gain = atof(argv[0]); + + return CMD_SUCCESS; +} +DEFUN_ATTR(cfg_dl_gain_override, cfg_dl_gain_override_cmd, + "dl-gain-override FLOAT", + "Overrides Tx gain\n" + "gain in dB\n", + CMD_ATTR_HIDDEN) +{ + struct trx_ctx *trx = trx_from_vty(vty); + + trx->cfg.overrides.dl_gain_override = true; + trx->cfg.overrides.dl_gain = atof(argv[0]); + + return CMD_SUCCESS; +} + DEFUN(cfg_swap_channels, cfg_swap_channels_cmd, "swap-channels (disable|enable)", "Swap primary and secondary channels of the PHY (if any)\n" @@ -638,6 +692,14 @@ static int config_write_trx(struct vty *vty) vty_out(vty, " stack-size %u%s", trx->cfg.stack_size, VTY_NEWLINE); if (trx->cfg.ul_fn_offset != 0) vty_out(vty, " ul-fn-offset %d%s", trx->cfg.ul_fn_offset, VTY_NEWLINE); + if (trx->cfg.overrides.dl_freq_override) + vty_out(vty, " dl-freq-override %f%s", trx->cfg.overrides.dl_freq, VTY_NEWLINE); + if (trx->cfg.overrides.ul_freq_override) + vty_out(vty, " ul-freq-override %f%s", trx->cfg.overrides.ul_freq, VTY_NEWLINE); + if (trx->cfg.overrides.dl_gain_override) + vty_out(vty, " dl-gain-override %f%s", trx->cfg.overrides.dl_gain, VTY_NEWLINE); + if (trx->cfg.overrides.ul_gain_override) + vty_out(vty, " ul-gain-override %f%s", trx->cfg.overrides.ul_gain, VTY_NEWLINE); trx_rate_ctr_threshold_write_config(vty, " "); for (i = 0; i < trx->cfg.num_chans; i++) { @@ -803,6 +865,10 @@ int trx_vty_init(struct trx_ctx* trx) install_element(TRX_NODE, &cfg_chan_cmd); install_element(TRX_NODE, &cfg_ul_fn_offset_cmd); + install_element(TRX_NODE, &cfg_ul_freq_override_cmd); + install_element(TRX_NODE, &cfg_dl_freq_override_cmd); + install_element(TRX_NODE, &cfg_ul_gain_override_cmd); + install_element(TRX_NODE, &cfg_dl_gain_override_cmd); install_node(&chan_node, dummy_config_write); install_element(CHAN_NODE, &cfg_chan_rx_path_cmd); install_element(CHAN_NODE, &cfg_chan_tx_path_cmd); diff --git a/Transceiver52M/device/uhd/UHDDevice.cpp b/Transceiver52M/device/uhd/UHDDevice.cpp index 95ea8e71..ec772aa5 100644 --- a/Transceiver52M/device/uhd/UHDDevice.cpp +++ b/Transceiver52M/device/uhd/UHDDevice.cpp @@ -295,6 +295,9 @@ double uhd_device::setRxGain(double db, size_t chan) return 0.0f; } + if (cfg->overrides.ul_gain_override) + return rx_gains[chan]; + usrp_dev->set_rx_gain(db, chan); rx_gains[chan] = usrp_dev->get_rx_gain(chan); @@ -337,6 +340,9 @@ double uhd_device::setPowerAttenuation(int atten, size_t chan) { return 0.0f; } + if (cfg->overrides.dl_gain_override) + return atten; // ensures caller does not apply digital attenuation + get_dev_band_desc(desc); tx_power = desc.nom_out_tx_power - atten; db = TxPower2TxGain(desc, tx_power); @@ -626,6 +632,32 @@ int uhd_device::open() // Print configuration LOGC(DDEV, INFO) << "Device configuration: " << usrp_dev->get_pp_string(); + if (cfg->overrides.dl_freq_override) { + uhd::tune_request_t treq_tx = uhd::tune_request_t(cfg->overrides.dl_freq, 0); + auto tres = usrp_dev->set_tx_freq(treq_tx, 0); + tx_freqs[0] = usrp_dev->get_tx_freq(0); + LOGCHAN(0, DDEV, INFO) << "OVERRIDE set_freq(" << tx_freqs[0] << ", TX): " << tres.to_pp_string() << std::endl; + } + + if (cfg->overrides.ul_freq_override) { + uhd::tune_request_t treq_rx = uhd::tune_request_t(cfg->overrides.ul_freq, 0); + auto tres = usrp_dev->set_rx_freq(treq_rx, 0); + rx_freqs[0] = usrp_dev->get_rx_freq(0); + LOGCHAN(0, DDEV, INFO) << "OVERRIDE set_freq(" << rx_freqs[0] << ", RX): " << tres.to_pp_string() << std::endl; + } + + if (cfg->overrides.ul_gain_override) { + usrp_dev->set_rx_gain(cfg->overrides.ul_gain, 0); + rx_gains[0] = usrp_dev->get_rx_gain(0); + LOGCHAN(0, DDEV, INFO) << " OVERRIDE RX gain:" << rx_gains[0] << std::endl; + } + + if (cfg->overrides.dl_gain_override) { + usrp_dev->set_tx_gain(cfg->overrides.dl_gain, 0); + tx_gains[0] = usrp_dev->get_tx_gain(0); + LOGCHAN(0, DDEV, INFO) << " OVERRIDE TX gain:" << tx_gains[0] << std::endl; + } + if (iface == MULTI_ARFCN) return MULTI_ARFCN; @@ -978,6 +1010,9 @@ bool uhd_device::set_freq(double freq, size_t chan, bool tx) uhd::tune_result_t tres; std::string str_dir = tx ? "Tx" : "Rx"; + if (cfg->overrides.dl_freq_override || cfg->overrides.ul_freq_override) + return true; + if (!update_band_from_freq(freq, chan, tx)) return false;