aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrent Stapleton <brent.stapleton@ettus.com>2019-01-14 10:35:25 -0800
committerBrent Stapleton <brent.stapleton@ettus.com>2019-01-16 11:40:23 -0800
commit967be2a4e82b1a125b26bb72a60318a4fb2b50c4 (patch)
tree8a24954b54d1546dc8049a17e485adb0a605f74f
parentaafe4e8b742a0e21d3818f21f34e3c8613132530 (diff)
downloaduhd-967be2a4e82b1a125b26bb72a60318a4fb2b50c4.tar.gz
uhd-967be2a4e82b1a125b26bb72a60318a4fb2b50c4.tar.bz2
uhd-967be2a4e82b1a125b26bb72a60318a4fb2b50c4.zip
uhd: mpm: apply clang-format to all files
Applying formatting changes to all .cpp and .hpp files in the following directories: ``` find host/examples/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/tests/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/lib/usrp/dboard/neon/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/lib/usrp/dboard/magnesium/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/lib/usrp/device3/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/lib/usrp/mpmd/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/lib/usrp/x300/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/utils/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find mpm/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file ``` Also formatted host/include/, except Cpp03 was used as a the language standard instead of Cpp11. ``` sed -i 's/ Cpp11/ Cpp03/g' .clang-format find host/include/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file ``` Formatting style was designated by the .clang-format file.
-rw-r--r--host/examples/ascii_art_dft.hpp486
-rw-r--r--host/examples/benchmark_rate.cpp571
-rw-r--r--host/examples/benchmark_streamer.cpp571
-rw-r--r--host/examples/gpio.cpp246
-rw-r--r--host/examples/init_usrp/init_usrp.cpp32
-rw-r--r--host/examples/latency_test.cpp204
-rw-r--r--host/examples/network_relay.cpp161
-rw-r--r--host/examples/replay_samples_from_file.cpp158
-rw-r--r--host/examples/rfnoc_nullsource_ce_rx.cpp174
-rw-r--r--host/examples/rfnoc_radio_loopback.cpp95
-rw-r--r--host/examples/rfnoc_rx_to_file.cpp296
-rw-r--r--host/examples/rx_ascii_art_dft.cpp207
-rw-r--r--host/examples/rx_multi_samples.cpp176
-rw-r--r--host/examples/rx_samples_to_file.cpp325
-rw-r--r--host/examples/rx_samples_to_udp.cpp179
-rw-r--r--host/examples/rx_timed_samples.cpp114
-rw-r--r--host/examples/sync_to_gps.cpp175
-rw-r--r--host/examples/test_clock_synch.cpp91
-rw-r--r--host/examples/test_dboard_coercion.cpp470
-rw-r--r--host/examples/test_messages.cpp352
-rw-r--r--host/examples/test_pps_input.cpp47
-rw-r--r--host/examples/test_timed_commands.cpp143
-rw-r--r--host/examples/twinrx_freq_hopping.cpp101
-rw-r--r--host/examples/tx_bursts.cpp138
-rw-r--r--host/examples/tx_samples_from_file.cpp187
-rw-r--r--host/examples/tx_timed_samples.cpp88
-rw-r--r--host/examples/tx_waveforms.cpp229
-rw-r--r--host/examples/txrx_loopback_to_file.cpp447
-rw-r--r--host/examples/usrp_list_sensors.cpp81
-rw-r--r--host/examples/wavetable.hpp54
-rw-r--r--host/include/uhd/build_info.hpp39
-rw-r--r--host/include/uhd/cal/container.hpp34
-rw-r--r--host/include/uhd/cal/power_container.hpp19
-rw-r--r--host/include/uhd/config.hpp133
-rw-r--r--host/include/uhd/convert.hpp177
-rw-r--r--host/include/uhd/deprecated.hpp82
-rw-r--r--host/include/uhd/device.hpp43
-rw-r--r--host/include/uhd/device3.hpp50
-rw-r--r--host/include/uhd/exception.hpp398
-rw-r--r--host/include/uhd/image_loader.hpp34
-rw-r--r--host/include/uhd/property_tree.hpp67
-rw-r--r--host/include/uhd/rfnoc/block_ctrl.hpp8
-rw-r--r--host/include/uhd/rfnoc/block_ctrl_base.hpp124
-rw-r--r--host/include/uhd/rfnoc/block_id.hpp392
-rw-r--r--host/include/uhd/rfnoc/blockdef.hpp23
-rw-r--r--host/include/uhd/rfnoc/constants.hpp78
-rw-r--r--host/include/uhd/rfnoc/ddc_block_ctrl.hpp16
-rw-r--r--host/include/uhd/rfnoc/dma_fifo_block_ctrl.hpp11
-rw-r--r--host/include/uhd/rfnoc/duc_block_ctrl.hpp17
-rw-r--r--host/include/uhd/rfnoc/fir_block_ctrl.hpp10
-rw-r--r--host/include/uhd/rfnoc/graph.hpp44
-rw-r--r--host/include/uhd/rfnoc/node_ctrl_base.hpp81
-rw-r--r--host/include/uhd/rfnoc/null_block_ctrl.hpp11
-rw-r--r--host/include/uhd/rfnoc/radio_ctrl.hpp122
-rw-r--r--host/include/uhd/rfnoc/rate_node_ctrl.hpp10
-rw-r--r--host/include/uhd/rfnoc/replay_block_ctrl.hpp22
-rw-r--r--host/include/uhd/rfnoc/scalar_node_ctrl.hpp9
-rw-r--r--host/include/uhd/rfnoc/siggen_block_ctrl.hpp8
-rw-r--r--host/include/uhd/rfnoc/sink_block_ctrl_base.hpp22
-rw-r--r--host/include/uhd/rfnoc/sink_node_ctrl.hpp30
-rw-r--r--host/include/uhd/rfnoc/source_block_ctrl_base.hpp58
-rw-r--r--host/include/uhd/rfnoc/source_node_ctrl.hpp34
-rw-r--r--host/include/uhd/rfnoc/stream_sig.hpp13
-rw-r--r--host/include/uhd/rfnoc/terminator_node_ctrl.hpp3
-rw-r--r--host/include/uhd/rfnoc/tick_node_ctrl.hpp15
-rw-r--r--host/include/uhd/rfnoc/traffic_counter.hpp44
-rw-r--r--host/include/uhd/rfnoc/window_block_ctrl.hpp20
-rw-r--r--host/include/uhd/stream.hpp88
-rw-r--r--host/include/uhd/transport/bounded_buffer.hpp177
-rw-r--r--host/include/uhd/transport/buffer_pool.hpp62
-rw-r--r--host/include/uhd/transport/chdr.hpp107
-rw-r--r--host/include/uhd/transport/if_addrs.hpp39
-rw-r--r--host/include/uhd/transport/muxed_zero_copy_if.hpp13
-rw-r--r--host/include/uhd/transport/nirio/rpc/rpc_client.hpp62
-rw-r--r--host/include/uhd/transport/nirio/rpc/rpc_common.hpp105
-rw-r--r--host/include/uhd/transport/nirio/rpc/usrprio_rpc_client.hpp42
-rw-r--r--host/include/uhd/transport/nirio/rpc/usrprio_rpc_common.hpp60
-rw-r--r--host/include/uhd/transport/nirio_zero_copy.hpp19
-rw-r--r--host/include/uhd/transport/tcp_zero_copy.hpp12
-rw-r--r--host/include/uhd/transport/udp_constants.hpp5
-rw-r--r--host/include/uhd/transport/udp_simple.hpp21
-rw-r--r--host/include/uhd/transport/udp_zero_copy.hpp24
-rw-r--r--host/include/uhd/transport/usb_control.hpp17
-rw-r--r--host/include/uhd/transport/usb_device_handle.hpp17
-rw-r--r--host/include/uhd/transport/usb_zero_copy.hpp11
-rw-r--r--host/include/uhd/transport/vrt_if_packet.hpp370
-rw-r--r--host/include/uhd/transport/zero_copy.hpp345
-rw-r--r--host/include/uhd/transport/zero_copy_flow_ctrl.hpp18
-rw-r--r--host/include/uhd/transport/zero_copy_recv_offload.hpp10
-rw-r--r--host/include/uhd/types/byte_vector.hpp25
-rw-r--r--host/include/uhd/types/clock_config.hpp85
-rw-r--r--host/include/uhd/types/component_file.hpp37
-rw-r--r--host/include/uhd/types/device_addr.hpp132
-rw-r--r--host/include/uhd/types/dict.hpp260
-rw-r--r--host/include/uhd/types/direction.hpp18
-rw-r--r--host/include/uhd/types/eeprom.hpp2
-rw-r--r--host/include/uhd/types/endianness.hpp9
-rw-r--r--host/include/uhd/types/filters.hpp440
-rw-r--r--host/include/uhd/types/io_type.hpp93
-rw-r--r--host/include/uhd/types/mac_addr.hpp77
-rw-r--r--host/include/uhd/types/metadata.hpp314
-rw-r--r--host/include/uhd/types/otw_type.hpp2
-rw-r--r--host/include/uhd/types/ranges.hpp170
-rw-r--r--host/include/uhd/types/ref_vector.hpp29
-rw-r--r--host/include/uhd/types/sensors.hpp249
-rw-r--r--host/include/uhd/types/serial.hpp328
-rw-r--r--host/include/uhd/types/sid.hpp466
-rw-r--r--host/include/uhd/types/stream_cmd.hpp74
-rw-r--r--host/include/uhd/types/time_spec.hpp225
-rw-r--r--host/include/uhd/types/tune_request.hpp164
-rw-r--r--host/include/uhd/types/tune_result.hpp113
-rw-r--r--host/include/uhd/types/wb_iface.hpp5
-rw-r--r--host/include/uhd/usrp/dboard_base.hpp30
-rw-r--r--host/include/uhd/usrp/dboard_eeprom.hpp15
-rw-r--r--host/include/uhd/usrp/dboard_id.hpp117
-rw-r--r--host/include/uhd/usrp/dboard_iface.hpp63
-rw-r--r--host/include/uhd/usrp/dboard_manager.hpp99
-rw-r--r--host/include/uhd/usrp/fe_connection.hpp198
-rw-r--r--host/include/uhd/usrp/gpio_defs.hpp14
-rw-r--r--host/include/uhd/usrp/gps_ctrl.hpp52
-rw-r--r--host/include/uhd/usrp/mboard_eeprom.hpp26
-rw-r--r--host/include/uhd/usrp/multi_usrp.hpp346
-rw-r--r--host/include/uhd/usrp/subdev_spec.hpp116
-rw-r--r--host/include/uhd/usrp_clock/multi_usrp_clock.hpp17
-rw-r--r--host/include/uhd/usrp_clock/octoclock_eeprom.hpp9
-rw-r--r--host/include/uhd/utils/algorithm.hpp122
-rw-r--r--host/include/uhd/utils/assert_has.hpp33
-rw-r--r--host/include/uhd/utils/byteswap.hpp44
-rw-r--r--host/include/uhd/utils/cast.hpp33
-rw-r--r--host/include/uhd/utils/csv.hpp16
-rw-r--r--host/include/uhd/utils/dirty_tracked.hpp201
-rw-r--r--host/include/uhd/utils/gain_group.hpp30
-rw-r--r--host/include/uhd/utils/log.hpp297
-rw-r--r--host/include/uhd/utils/log_add.hpp30
-rw-r--r--host/include/uhd/utils/math.hpp380
-rw-r--r--host/include/uhd/utils/msg_task.hpp91
-rw-r--r--host/include/uhd/utils/paths.hpp110
-rw-r--r--host/include/uhd/utils/pimpl.hpp6
-rw-r--r--host/include/uhd/utils/platform.hpp14
-rw-r--r--host/include/uhd/utils/safe_call.hpp18
-rw-r--r--host/include/uhd/utils/safe_main.hpp25
-rw-r--r--host/include/uhd/utils/soft_register.hpp350
-rw-r--r--host/include/uhd/utils/static.hpp16
-rw-r--r--host/include/uhd/utils/tasks.hpp47
-rw-r--r--host/include/uhd/utils/thread.hpp81
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp104
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp62
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_bands.cpp125
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_constants.hpp60
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.cpp183
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp96
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_gain_table.cpp125
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp8
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_cpld.cpp370
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_gain.cpp119
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp790
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp222
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp888
-rw-r--r--host/lib/usrp/dboard/neon/neon_ad9361_iface.cpp69
-rw-r--r--host/lib/usrp/dboard/neon/neon_bands.cpp101
-rw-r--r--host/lib/usrp/dboard/neon/neon_constants.hpp38
-rw-r--r--host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.cpp519
-rw-r--r--host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.hpp127
-rw-r--r--host/lib/usrp/dboard/neon/neon_radio_ctrl_init.cpp477
-rw-r--r--host/lib/usrp/dboard/neon/neon_regs.hpp17
-rw-r--r--host/lib/usrp/device3/device3_flow_ctrl.hpp259
-rw-r--r--host/lib/usrp/device3/device3_impl.cpp173
-rw-r--r--host/lib/usrp/device3/device3_impl.hpp154
-rw-r--r--host/lib/usrp/device3/device3_io_impl.cpp579
-rw-r--r--host/lib/usrp/mpmd/mpmd_devices.hpp2
-rw-r--r--host/lib/usrp/mpmd/mpmd_find.cpp175
-rw-r--r--host/lib/usrp/mpmd/mpmd_image_loader.cpp121
-rw-r--r--host/lib/usrp/mpmd/mpmd_impl.cpp369
-rw-r--r--host/lib/usrp/mpmd/mpmd_impl.hpp90
-rw-r--r--host/lib/usrp/mpmd/mpmd_mboard_impl.cpp516
-rw-r--r--host/lib/usrp/mpmd/mpmd_prop_tree.cpp280
-rw-r--r--host/lib/usrp/mpmd/mpmd_xport.cpp61
-rw-r--r--host/lib/usrp/mpmd/mpmd_xport_ctrl_base.hpp16
-rw-r--r--host/lib/usrp/mpmd/mpmd_xport_ctrl_liberio.cpp117
-rw-r--r--host/lib/usrp/mpmd/mpmd_xport_ctrl_liberio.hpp31
-rw-r--r--host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.cpp350
-rw-r--r--host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.hpp20
-rw-r--r--host/lib/usrp/mpmd/mpmd_xport_mgr.cpp87
-rw-r--r--host/lib/usrp/mpmd/mpmd_xport_mgr.hpp32
-rw-r--r--host/lib/usrp/x300/x300_adc_ctrl.cpp80
-rw-r--r--host/lib/usrp/x300/x300_adc_ctrl.hpp5
-rw-r--r--host/lib/usrp/x300/x300_clock_ctrl.cpp940
-rw-r--r--host/lib/usrp/x300/x300_clock_ctrl.hpp21
-rw-r--r--host/lib/usrp/x300/x300_dac_ctrl.cpp153
-rw-r--r--host/lib/usrp/x300/x300_dac_ctrl.hpp3
-rw-r--r--host/lib/usrp/x300/x300_dboard_iface.cpp171
-rw-r--r--host/lib/usrp/x300/x300_dboard_iface.hpp59
-rw-r--r--host/lib/usrp/x300/x300_defaults.hpp137
-rw-r--r--host/lib/usrp/x300/x300_device_args.hpp159
-rw-r--r--host/lib/usrp/x300/x300_fw_ctrl.cpp197
-rw-r--r--host/lib/usrp/x300/x300_fw_uart.cpp101
-rw-r--r--host/lib/usrp/x300/x300_image_loader.cpp545
-rw-r--r--host/lib/usrp/x300/x300_impl.cpp1692
-rw-r--r--host/lib/usrp/x300/x300_impl.hpp129
-rw-r--r--host/lib/usrp/x300/x300_io_impl.cpp16
-rw-r--r--host/lib/usrp/x300/x300_mb_eeprom.cpp294
-rw-r--r--host/lib/usrp/x300/x300_mb_eeprom_iface.cpp70
-rw-r--r--host/lib/usrp/x300/x300_mb_eeprom_iface.hpp4
-rw-r--r--host/lib/usrp/x300/x300_radio_ctrl_impl.cpp1092
-rw-r--r--host/lib/usrp/x300/x300_radio_ctrl_impl.hpp178
-rw-r--r--host/lib/usrp/x300/x300_regs.hpp239
-rw-r--r--host/tests/addr_test.cpp42
-rw-r--r--host/tests/block_id_test.cpp18
-rw-r--r--host/tests/blockdef_test.cpp38
-rw-r--r--host/tests/buffer_test.cpp18
-rw-r--r--host/tests/byteswap_test.cpp14
-rw-r--r--host/tests/cal_container_test.cpp33
-rw-r--r--host/tests/cast_test.cpp21
-rw-r--r--host/tests/chdr_test.cpp141
-rw-r--r--host/tests/common/mock_ctrl_iface_impl.cpp23
-rw-r--r--host/tests/common/mock_ctrl_iface_impl.hpp17
-rw-r--r--host/tests/common/mock_zero_copy.cpp29
-rw-r--r--host/tests/common/mock_zero_copy.hpp159
-rw-r--r--host/tests/config_parser_test.cpp109
-rw-r--r--host/tests/constrained_device_args_test.cpp146
-rw-r--r--host/tests/convert_test.cpp569
-rw-r--r--host/tests/device3_test.cpp95
-rw-r--r--host/tests/dict_test.cpp58
-rw-r--r--host/tests/dpdk_test.cpp216
-rw-r--r--host/tests/eeprom_utils_test.cpp46
-rw-r--r--host/tests/error_c_test.cpp129
-rw-r--r--host/tests/error_test.cpp57
-rw-r--r--host/tests/expert_test.cpp165
-rw-r--r--host/tests/fe_conn_test.cpp40
-rw-r--r--host/tests/fp_compare_delta_test.cpp134
-rw-r--r--host/tests/fp_compare_epsilon_test.cpp125
-rw-r--r--host/tests/gain_group_test.cpp53
-rw-r--r--host/tests/graph.hpp15
-rw-r--r--host/tests/graph_search_test.cpp30
-rw-r--r--host/tests/log_test.cpp29
-rw-r--r--host/tests/math_test.cpp8
-rw-r--r--host/tests/module_test.cpp3
-rw-r--r--host/tests/narrow_cast_test.cpp7
-rw-r--r--host/tests/nocscript_common.hpp19
-rw-r--r--host/tests/nocscript_expr_test.cpp189
-rw-r--r--host/tests/nocscript_ftable_test.cpp75
-rw-r--r--host/tests/nocscript_parser_test.cpp37
-rw-r--r--host/tests/node_connect_test.cpp30
-rw-r--r--host/tests/packet_handler_benchmark.cpp229
-rw-r--r--host/tests/paths_test.cpp34
-rw-r--r--host/tests/property_test.cpp91
-rw-r--r--host/tests/ranges_test.cpp17
-rw-r--r--host/tests/rate_node_test.cpp19
-rw-r--r--host/tests/sensors_test.cpp41
-rw-r--r--host/tests/sid_t_test.cpp21
-rw-r--r--host/tests/soft_reg_test.cpp9
-rw-r--r--host/tests/sph_recv_test.cpp836
-rw-r--r--host/tests/sph_send_test.cpp106
-rw-r--r--host/tests/stream_sig_test.cpp15
-rw-r--r--host/tests/subdev_spec_test.cpp17
-rw-r--r--host/tests/system_time_test.cpp22
-rw-r--r--host/tests/tasks_test.cpp12
-rw-r--r--host/tests/tick_node_test.cpp13
-rw-r--r--host/tests/time_spec_test.cpp28
-rw-r--r--host/tests/vrt_test.cpp185
-rw-r--r--host/utils/b2xx_fx3_utils.cpp342
-rw-r--r--host/utils/converter_benchmark.cpp278
-rw-r--r--host/utils/fx2_init_eeprom.cpp136
-rw-r--r--host/utils/latency/include/Responder.hpp538
-rw-r--r--host/utils/latency/lib/Responder.cpp1089
-rw-r--r--host/utils/latency/responder.cpp47
-rw-r--r--host/utils/octoclock_burn_eeprom.cpp63
-rw-r--r--host/utils/query_gpsdo_sensors.cpp459
-rw-r--r--host/utils/uhd_cal_rx_iq_balance.cpp215
-rw-r--r--host/utils/uhd_cal_tx_dc_offset.cpp222
-rw-r--r--host/utils/uhd_cal_tx_iq_balance.cpp222
-rw-r--r--host/utils/uhd_config_info.cpp40
-rw-r--r--host/utils/uhd_find_devices.cpp56
-rw-r--r--host/utils/uhd_image_loader.cpp86
-rw-r--r--host/utils/uhd_usrp_probe.cpp327
-rw-r--r--host/utils/usrp_burn_db_eeprom.cpp60
-rw-r--r--host/utils/usrp_burn_mb_eeprom.cpp60
-rw-r--r--host/utils/usrp_cal_utils.hpp267
-rw-r--r--host/utils/usrp_e3x0_network_mode.cpp31
-rw-r--r--mpm/include/mpm/ad9361/ad9361_ctrl.hpp30
-rw-r--r--mpm/include/mpm/ad9361/e320_defaults.hpp33
-rw-r--r--mpm/include/mpm/ad937x/ad937x_ctrl.hpp201
-rw-r--r--mpm/include/mpm/ad937x/ad937x_ctrl_types.hpp74
-rw-r--r--mpm/include/mpm/ad937x/ad937x_spi_iface.hpp13
-rw-r--r--mpm/include/mpm/ad937x/adi_ctrl.hpp9
-rw-r--r--mpm/include/mpm/dboards/magnesium_manager.hpp53
-rw-r--r--mpm/include/mpm/dboards/neon_manager.hpp29
-rw-r--r--mpm/include/mpm/exception.hpp264
-rw-r--r--mpm/include/mpm/i2c/i2c_iface.hpp83
-rw-r--r--mpm/include/mpm/i2c/i2c_python.hpp26
-rw-r--r--mpm/include/mpm/i2c/i2c_regs_iface.hpp33
-rw-r--r--mpm/include/mpm/spi/spi_iface.hpp68
-rw-r--r--mpm/include/mpm/spi/spi_python.hpp14
-rw-r--r--mpm/include/mpm/spi/spi_regs_iface.hpp35
-rw-r--r--mpm/include/mpm/tests/tests_spi_iface.hpp77
-rw-r--r--mpm/include/mpm/types/lockable.hpp39
-rw-r--r--mpm/include/mpm/types/log_buf.hpp117
-rw-r--r--mpm/include/mpm/types/mmap_regs_iface.hpp77
-rw-r--r--mpm/include/mpm/types/regs_iface.hpp57
-rw-r--r--mpm/include/mpm/types/types_python.hpp46
-rw-r--r--mpm/include/mpm/xbar_iface.hpp30
-rw-r--r--mpm/lib/dboards/magnesium_manager.cpp20
-rw-r--r--mpm/lib/dboards/neon_manager.cpp27
-rw-r--r--mpm/lib/exception.cpp53
-rw-r--r--mpm/lib/i2c/i2c_regs_iface.cpp75
-rw-r--r--mpm/lib/i2c/i2cdev_iface.cpp78
-rw-r--r--mpm/lib/mykonos/ad937x_ctrl.cpp342
-rw-r--r--mpm/lib/mykonos/ad937x_device.cpp767
-rw-r--r--mpm/lib/mykonos/ad937x_device.hpp120
-rw-r--r--mpm/lib/mykonos/ad937x_device_types.hpp45
-rw-r--r--mpm/lib/mykonos/ad937x_spi_iface.cpp17
-rw-r--r--mpm/lib/mykonos/adi_ctrl.cpp169
-rw-r--r--mpm/lib/mykonos/config/ad937x_config_t.cpp521
-rw-r--r--mpm/lib/mykonos/config/ad937x_config_t.hpp9
-rw-r--r--mpm/lib/mykonos/config/ad937x_default_config.hpp656
-rw-r--r--mpm/lib/mykonos/config/ad937x_fir.cpp29
-rw-r--r--mpm/lib/mykonos/config/ad937x_fir.hpp3
-rw-r--r--mpm/lib/mykonos/config/ad937x_gain_ctrl_config.cpp215
-rw-r--r--mpm/lib/mykonos/config/ad937x_gain_ctrl_config.hpp39
-rw-r--r--mpm/lib/spi/spi_regs_iface.cpp98
-rw-r--r--mpm/lib/spi/spidev_iface.cpp83
-rw-r--r--mpm/lib/types/lockable.cpp14
-rw-r--r--mpm/lib/types/log_buf.cpp28
-rw-r--r--mpm/lib/types/mmap_regs_iface.cpp56
-rw-r--r--mpm/lib/xbar_iface.cpp31
-rw-r--r--mpm/python/lib_helper.cpp22
-rw-r--r--mpm/python/pyusrp_periphs/converters.hpp89
-rw-r--r--mpm/python/pyusrp_periphs/e320/pyusrp_periphs.cpp21
-rw-r--r--mpm/python/pyusrp_periphs/n3xx/pyusrp_periphs.cpp23
-rw-r--r--mpm/python/tests_periphs.cpp19
-rw-r--r--mpm/tests/tests_device.hpp23
-rw-r--r--mpm/tests/tests_spi_iface.cpp98
332 files changed, 22735 insertions, 22736 deletions
diff --git a/host/examples/ascii_art_dft.hpp b/host/examples/ascii_art_dft.hpp
index bb038a155..19099cbf8 100644
--- a/host/examples/ascii_art_dft.hpp
+++ b/host/examples/ascii_art_dft.hpp
@@ -8,281 +8,315 @@
#ifndef ASCII_ART_DFT_HPP
#define ASCII_ART_DFT_HPP
-#include <string>
-#include <cstddef>
-#include <vector>
#include <complex>
+#include <cstddef>
#include <stdexcept>
+#include <string>
+#include <vector>
-namespace ascii_art_dft{
-
- //! Type produced by the log power DFT function
- typedef std::vector<float> log_pwr_dft_type;
-
- /*!
- * Get a logarithmic power DFT of the input samples.
- * Samples are expected to be in the range [-1.0, 1.0].
- * \param samps a pointer to an array of complex samples
- * \param nsamps the number of samples in the array
- * \return a real range of DFT bins in units of dB
- */
- template <typename T> log_pwr_dft_type log_pwr_dft(
- const std::complex<T> *samps, size_t nsamps
- );
-
- /*!
- * Convert a DFT to a piroundable ascii plot.
- * \param dft the log power dft bins
- * \param width the frame width in characters
- * \param height the frame height in characters
- * \param samp_rate the sample rate in Sps
- * \param dc_freq the DC frequency in Hz
- * \param dyn_rng the dynamic range in dB
- * \param ref_lvl the reference level in dB
- * \return the plot as an ascii string
- */
- std::string dft_to_plot(
- const log_pwr_dft_type &dft,
- size_t width,
- size_t height,
- double samp_rate,
- double dc_freq,
- float dyn_rng,
- float ref_lvl
- );
-
-} //namespace ascii_dft
+namespace ascii_art_dft {
+
+//! Type produced by the log power DFT function
+typedef std::vector<float> log_pwr_dft_type;
+
+/*!
+ * Get a logarithmic power DFT of the input samples.
+ * Samples are expected to be in the range [-1.0, 1.0].
+ * \param samps a pointer to an array of complex samples
+ * \param nsamps the number of samples in the array
+ * \return a real range of DFT bins in units of dB
+ */
+template <typename T>
+log_pwr_dft_type log_pwr_dft(const std::complex<T>* samps, size_t nsamps);
+
+/*!
+ * Convert a DFT to a piroundable ascii plot.
+ * \param dft the log power dft bins
+ * \param width the frame width in characters
+ * \param height the frame height in characters
+ * \param samp_rate the sample rate in Sps
+ * \param dc_freq the DC frequency in Hz
+ * \param dyn_rng the dynamic range in dB
+ * \param ref_lvl the reference level in dB
+ * \return the plot as an ascii string
+ */
+std::string dft_to_plot(const log_pwr_dft_type& dft,
+ size_t width,
+ size_t height,
+ double samp_rate,
+ double dc_freq,
+ float dyn_rng,
+ float ref_lvl);
+
+} // namespace ascii_art_dft
/***********************************************************************
* Implementation includes
**********************************************************************/
+#include <algorithm>
#include <cmath>
#include <sstream>
-#include <algorithm>
/***********************************************************************
* Helper functions
**********************************************************************/
-namespace {/*anon*/
+namespace { /*anon*/
+
+static const double pi = double(std::acos(-1.0));
- static const double pi = double(std::acos(-1.0));
+//! Round a floating-point value to the nearest integer
+template <typename T> int iround(T val)
+{
+ return (val > 0) ? int(val + 0.5) : int(val - 0.5);
+}
- //! Round a floating-point value to the nearest integer
- template <typename T> int iround(T val){
- return (val > 0)? int(val + 0.5) : int(val - 0.5);
+//! Pick the closest number that is nice to display
+template <typename T> T to_clean_num(const T num)
+{
+ if (num == 0)
+ return 0;
+ const T pow10 = std::pow(T(10), int(std::floor(std::log10(std::abs(num)))));
+ const T norm = std::abs(num) / pow10;
+ static const int cleans[] = {1, 2, 5, 10};
+ int clean = cleans[0];
+ for (size_t i = 1; i < sizeof(cleans) / sizeof(cleans[0]); i++) {
+ if (std::abs(norm - cleans[i]) < std::abs(norm - clean))
+ clean = cleans[i];
}
+ return ((num < 0) ? -1 : 1) * clean * pow10;
+}
- //! Pick the closest number that is nice to display
- template <typename T> T to_clean_num(const T num){
- if (num == 0) return 0;
- const T pow10 = std::pow(T(10), int(std::floor(std::log10(std::abs(num)))));
- const T norm = std::abs(num)/pow10;
- static const int cleans[] = {1, 2, 5, 10};
- int clean = cleans[0];
- for (size_t i = 1; i < sizeof(cleans)/sizeof(cleans[0]); i++){
- if (std::abs(norm - cleans[i]) < std::abs(norm - clean))
- clean = cleans[i];
- }
- return ((num < 0)? -1 : 1)*clean*pow10;
+//! Compute an FFT with pre-computed factors using Cooley-Tukey
+template <typename T>
+std::complex<T> ct_fft_f(const std::complex<T>* samps,
+ size_t nsamps,
+ const std::complex<T>* factors,
+ size_t start = 0,
+ size_t step = 1)
+{
+ if (nsamps == 1)
+ return samps[start];
+ std::complex<T> E_k = ct_fft_f(samps, nsamps / 2, factors + 1, start, step * 2);
+ std::complex<T> O_k =
+ ct_fft_f(samps, nsamps / 2, factors + 1, start + step, step * 2);
+ return E_k + factors[0] * O_k;
+}
+
+//! Compute an FFT for a particular bin k using Cooley-Tukey
+template <typename T>
+std::complex<T> ct_fft_k(const std::complex<T>* samps, size_t nsamps, size_t k)
+{
+ // pre-compute the factors to use in Cooley-Tukey
+ std::vector<std::complex<T>> factors;
+ for (size_t N = nsamps; N != 0; N /= 2) {
+ factors.push_back(std::exp(std::complex<T>(0, T(-2 * pi * k / N))));
}
+ return ct_fft_f(samps, nsamps, &factors.front());
+}
- //! Compute an FFT with pre-computed factors using Cooley-Tukey
- template <typename T> std::complex<T> ct_fft_f(
- const std::complex<T> *samps, size_t nsamps,
- const std::complex<T> *factors,
- size_t start = 0, size_t step = 1
- ){
- if (nsamps == 1) return samps[start];
- std::complex<T> E_k = ct_fft_f(samps, nsamps/2, factors+1, start, step*2);
- std::complex<T> O_k = ct_fft_f(samps, nsamps/2, factors+1, start+step, step*2);
- return E_k + factors[0]*O_k;
+//! Helper class to build a DFT plot frame
+class frame_type
+{
+public:
+ frame_type(size_t width, size_t height)
+ : _frame(width - 1, std::vector<char>(height, ' '))
+ {
+ /* NOP */
}
- //! Compute an FFT for a particular bin k using Cooley-Tukey
- template <typename T> std::complex<T> ct_fft_k(
- const std::complex<T> *samps, size_t nsamps, size_t k
- ){
- //pre-compute the factors to use in Cooley-Tukey
- std::vector<std::complex<T> > factors;
- for (size_t N = nsamps; N != 0; N /= 2){
- factors.push_back(std::exp(std::complex<T>(0, T(-2*pi*k/N))));
- }
- return ct_fft_f(samps, nsamps, &factors.front());
+ // accessors to parts of the frame
+ char& get_plot(size_t b, size_t z)
+ {
+ return _frame.at(b + albl_w).at(z + flbl_h);
+ }
+ char& get_albl(size_t b, size_t z)
+ {
+ return _frame.at(b).at(z + flbl_h);
+ }
+ char& get_ulbl(size_t b)
+ {
+ return _frame.at(b).at(flbl_h - 1);
+ }
+ char& get_flbl(size_t b)
+ {
+ return _frame.at(b + albl_w).at(flbl_h - 1);
}
- //! Helper class to build a DFT plot frame
- class frame_type{
- public:
- frame_type(size_t width, size_t height):
- _frame(width-1, std::vector<char>(height, ' '))
- {
- /* NOP */
- }
+ // dimension accessors
+ size_t get_plot_h(void) const
+ {
+ return _frame.front().size() - flbl_h;
+ }
+ size_t get_plot_w(void) const
+ {
+ return _frame.size() - albl_w;
+ }
+ size_t get_albl_w(void) const
+ {
+ return albl_w;
+ }
- //accessors to parts of the frame
- char &get_plot(size_t b, size_t z){return _frame.at(b+albl_w).at(z+flbl_h);}
- char &get_albl(size_t b, size_t z){return _frame.at(b) .at(z+flbl_h);}
- char &get_ulbl(size_t b) {return _frame.at(b) .at(flbl_h-1);}
- char &get_flbl(size_t b) {return _frame.at(b+albl_w).at(flbl_h-1);}
-
- //dimension accessors
- size_t get_plot_h(void) const{return _frame.front().size() - flbl_h;}
- size_t get_plot_w(void) const{return _frame.size() - albl_w;}
- size_t get_albl_w(void) const{return albl_w;}
-
- std::string to_string(void){
- std::stringstream frame_ss;
- for (size_t z = 0; z < _frame.front().size(); z++){
- for (size_t b = 0; b < _frame.size(); b++){
- frame_ss << _frame[b][_frame[b].size()-z-1];
- }
- frame_ss << std::endl;
+ std::string to_string(void)
+ {
+ std::stringstream frame_ss;
+ for (size_t z = 0; z < _frame.front().size(); z++) {
+ for (size_t b = 0; b < _frame.size(); b++) {
+ frame_ss << _frame[b][_frame[b].size() - z - 1];
}
- return frame_ss.str();
+ frame_ss << std::endl;
}
+ return frame_ss.str();
+ }
- private:
- static const size_t albl_w = 6, flbl_h = 1;
- std::vector<std::vector<char> > _frame;
- };
+private:
+ static const size_t albl_w = 6, flbl_h = 1;
+ std::vector<std::vector<char>> _frame;
+};
-} //namespace /*anon*/
+} // namespace
/***********************************************************************
* Implementation code
**********************************************************************/
-namespace ascii_art_dft{
-
- //! skip constants for amplitude and frequency labels
- static const size_t albl_skip = 5, flbl_skip = 20;
-
- template <typename T> log_pwr_dft_type log_pwr_dft(
- const std::complex<T> *samps, size_t nsamps
- ){
- if (nsamps & (nsamps - 1))
- throw std::runtime_error("num samps is not a power of 2");
-
- //compute the window
- double win_pwr = 0;
- std::vector<std::complex<T> > win_samps;
- for(size_t n = 0; n < nsamps; n++){
- //double w_n = 1;
- //double w_n = 0.54 //hamming window
- // -0.46*std::cos(2*pi*n/(nsamps-1))
- //;
- double w_n = 0.35875 //blackman-harris window
- -0.48829*std::cos(2*pi*n/(nsamps-1))
- +0.14128*std::cos(4*pi*n/(nsamps-1))
- -0.01168*std::cos(6*pi*n/(nsamps-1))
- ;
- //double w_n = 1 // flat top window
- // -1.930*std::cos(2*pi*n/(nsamps-1))
- // +1.290*std::cos(4*pi*n/(nsamps-1))
- // -0.388*std::cos(6*pi*n/(nsamps-1))
- // +0.032*std::cos(8*pi*n/(nsamps-1))
- //;
- win_samps.push_back(T(w_n)*samps[n]);
- win_pwr += w_n*w_n;
- }
-
- //compute the log-power dft
- log_pwr_dft_type log_pwr_dft;
- for(size_t k = 0; k < nsamps; k++){
- std::complex<T> dft_k = ct_fft_k(&win_samps.front(), nsamps, k);
- log_pwr_dft.push_back(float(
- + 20*std::log10(std::abs(dft_k))
- - 20*std::log10(T(nsamps))
- - 10*std::log10(win_pwr/nsamps)
- + 3
- ));
- }
+namespace ascii_art_dft {
+
+//! skip constants for amplitude and frequency labels
+static const size_t albl_skip = 5, flbl_skip = 20;
+
+template <typename T>
+log_pwr_dft_type log_pwr_dft(const std::complex<T>* samps, size_t nsamps)
+{
+ if (nsamps & (nsamps - 1))
+ throw std::runtime_error("num samps is not a power of 2");
+
+ // compute the window
+ double win_pwr = 0;
+ std::vector<std::complex<T>> win_samps;
+ for (size_t n = 0; n < nsamps; n++) {
+ // double w_n = 1;
+ // double w_n = 0.54 //hamming window
+ // -0.46*std::cos(2*pi*n/(nsamps-1))
+ //;
+ double w_n = 0.35875 // blackman-harris window
+ - 0.48829 * std::cos(2 * pi * n / (nsamps - 1))
+ + 0.14128 * std::cos(4 * pi * n / (nsamps - 1))
+ - 0.01168 * std::cos(6 * pi * n / (nsamps - 1));
+ // double w_n = 1 // flat top window
+ // -1.930*std::cos(2*pi*n/(nsamps-1))
+ // +1.290*std::cos(4*pi*n/(nsamps-1))
+ // -0.388*std::cos(6*pi*n/(nsamps-1))
+ // +0.032*std::cos(8*pi*n/(nsamps-1))
+ //;
+ win_samps.push_back(T(w_n) * samps[n]);
+ win_pwr += w_n * w_n;
+ }
- return log_pwr_dft;
+ // compute the log-power dft
+ log_pwr_dft_type log_pwr_dft;
+ for (size_t k = 0; k < nsamps; k++) {
+ std::complex<T> dft_k = ct_fft_k(&win_samps.front(), nsamps, k);
+ log_pwr_dft.push_back(
+ float(+20 * std::log10(std::abs(dft_k)) - 20 * std::log10(T(nsamps))
+ - 10 * std::log10(win_pwr / nsamps) + 3));
}
- std::string dft_to_plot(
- const log_pwr_dft_type &dft_,
- size_t width,
- size_t height,
- double samp_rate,
- double dc_freq,
- float dyn_rng,
- float ref_lvl
- ){
- frame_type frame(width, height); //fill this frame
-
- //re-order the dft so dc in in the center
- const size_t num_bins = dft_.size() - 1 + dft_.size()%2; //make it odd
- log_pwr_dft_type dft(num_bins);
- for (size_t n = 0; n < num_bins; n++){
- dft[n] = dft_[(n + num_bins/2)%num_bins];
- }
+ return log_pwr_dft;
+}
- //fill the plot with dft bins
- for (size_t b = 0; b < frame.get_plot_w(); b++){
- //indexes from the dft to grab for the plot
- const size_t n_start = std::max(iround(double(b-0.5)*(num_bins-1)/(frame.get_plot_w()-1)), 0);
- const size_t n_stop = std::min(iround(double(b+0.5)*(num_bins-1)/(frame.get_plot_w()-1)), int(num_bins));
-
- //calculate val as the max across points
- float val = dft.at(n_start);
- for (size_t n = n_start; n < n_stop; n++) val = std::max(val, dft.at(n));
-
- const float scaled = (val - (ref_lvl - dyn_rng))*(frame.get_plot_h()-1)/dyn_rng;
- for (size_t z = 0; z < frame.get_plot_h(); z++){
- static const std::string syms(".:!|");
- if (scaled-z > 1) frame.get_plot(b, z) = syms.at(syms.size()-1);
- else if (scaled-z > 0) frame.get_plot(b, z) = syms.at(size_t((scaled-z)*syms.size()));
- }
- }
+std::string dft_to_plot(const log_pwr_dft_type& dft_,
+ size_t width,
+ size_t height,
+ double samp_rate,
+ double dc_freq,
+ float dyn_rng,
+ float ref_lvl)
+{
+ frame_type frame(width, height); // fill this frame
+
+ // re-order the dft so dc in in the center
+ const size_t num_bins = dft_.size() - 1 + dft_.size() % 2; // make it odd
+ log_pwr_dft_type dft(num_bins);
+ for (size_t n = 0; n < num_bins; n++) {
+ dft[n] = dft_[(n + num_bins / 2) % num_bins];
+ }
- //create vertical amplitude labels
- const float db_step = to_clean_num(dyn_rng/(frame.get_plot_h()-1)*albl_skip);
- for (
- float db = db_step*(int((ref_lvl - dyn_rng)/db_step));
- db <= db_step*(int(ref_lvl/db_step));
- db += db_step
- ){
- const int z = iround((db - (ref_lvl - dyn_rng))*(frame.get_plot_h()-1)/dyn_rng);
- if (z < 0 or size_t(z) >= frame.get_plot_h()) continue;
- std::stringstream ss; ss << db; std::string lbl = ss.str();
- for (size_t i = 0; i < lbl.size() and i < frame.get_albl_w(); i++){
- frame.get_albl(i, z) = lbl[i];
- }
+ // fill the plot with dft bins
+ for (size_t b = 0; b < frame.get_plot_w(); b++) {
+ // indexes from the dft to grab for the plot
+ const size_t n_start = std::max(
+ iround(double(b - 0.5) * (num_bins - 1) / (frame.get_plot_w() - 1)), 0);
+ const size_t n_stop =
+ std::min(iround(double(b + 0.5) * (num_bins - 1) / (frame.get_plot_w() - 1)),
+ int(num_bins));
+
+ // calculate val as the max across points
+ float val = dft.at(n_start);
+ for (size_t n = n_start; n < n_stop; n++)
+ val = std::max(val, dft.at(n));
+
+ const float scaled =
+ (val - (ref_lvl - dyn_rng)) * (frame.get_plot_h() - 1) / dyn_rng;
+ for (size_t z = 0; z < frame.get_plot_h(); z++) {
+ static const std::string syms(".:!|");
+ if (scaled - z > 1)
+ frame.get_plot(b, z) = syms.at(syms.size() - 1);
+ else if (scaled - z > 0)
+ frame.get_plot(b, z) = syms.at(size_t((scaled - z) * syms.size()));
}
+ }
- //create vertical units label
- std::string ulbl = "dBfs";
- for (size_t i = 0; i < ulbl.size(); i++){
- frame.get_ulbl(i+1) = ulbl[i];
+ // create vertical amplitude labels
+ const float db_step = to_clean_num(dyn_rng / (frame.get_plot_h() - 1) * albl_skip);
+ for (float db = db_step * (int((ref_lvl - dyn_rng) / db_step));
+ db <= db_step * (int(ref_lvl / db_step));
+ db += db_step) {
+ const int z =
+ iround((db - (ref_lvl - dyn_rng)) * (frame.get_plot_h() - 1) / dyn_rng);
+ if (z < 0 or size_t(z) >= frame.get_plot_h())
+ continue;
+ std::stringstream ss;
+ ss << db;
+ std::string lbl = ss.str();
+ for (size_t i = 0; i < lbl.size() and i < frame.get_albl_w(); i++) {
+ frame.get_albl(i, z) = lbl[i];
}
+ }
- //create horizontal frequency labels
- const double f_step = to_clean_num(samp_rate/frame.get_plot_w()*flbl_skip);
- for (
- double freq = f_step*int((-samp_rate/2/f_step));
- freq <= f_step*int((+samp_rate/2/f_step));
- freq += f_step
- ){
- const int b = iround((freq + samp_rate/2)*(frame.get_plot_w()-1)/samp_rate);
- std::stringstream ss; ss << (freq+dc_freq)/1e6 << "MHz"; std::string lbl = ss.str();
- if (b < int(lbl.size()/2) or b + lbl.size() - lbl.size()/2 >= frame.get_plot_w()) continue;
- for (size_t i = 0; i < lbl.size(); i++){
- frame.get_flbl(b + i - lbl.size()/2) = lbl[i];
- }
- }
+ // create vertical units label
+ std::string ulbl = "dBfs";
+ for (size_t i = 0; i < ulbl.size(); i++) {
+ frame.get_ulbl(i + 1) = ulbl[i];
+ }
- return frame.to_string();
+ // create horizontal frequency labels
+ const double f_step = to_clean_num(samp_rate / frame.get_plot_w() * flbl_skip);
+ for (double freq = f_step * int((-samp_rate / 2 / f_step));
+ freq <= f_step * int((+samp_rate / 2 / f_step));
+ freq += f_step) {
+ const int b =
+ iround((freq + samp_rate / 2) * (frame.get_plot_w() - 1) / samp_rate);
+ std::stringstream ss;
+ ss << (freq + dc_freq) / 1e6 << "MHz";
+ std::string lbl = ss.str();
+ if (b < int(lbl.size() / 2)
+ or b + lbl.size() - lbl.size() / 2 >= frame.get_plot_w())
+ continue;
+ for (size_t i = 0; i < lbl.size(); i++) {
+ frame.get_flbl(b + i - lbl.size() / 2) = lbl[i];
+ }
}
-} //namespace ascii_dft
+
+ return frame.to_string();
+}
+} // namespace ascii_art_dft
/*
//example main function to test the dft
-#include <iostream>
-#include <cstdlib>
#include <curses.h>
+#include <cstdlib>
+#include <iostream>
int main(void){
initscr();
diff --git a/host/examples/benchmark_rate.cpp b/host/examples/benchmark_rate.cpp
index 5e997f59a..b97de09ac 100644
--- a/host/examples/benchmark_rate.cpp
+++ b/host/examples/benchmark_rate.cpp
@@ -5,49 +5,50 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
#include <uhd/convert.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <boost/program_options.hpp>
-#include <boost/format.hpp>
-#include <boost/thread/thread.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
-#include <iostream>
-#include <complex>
-#include <cstdlib>
+#include <boost/format.hpp>
+#include <boost/program_options.hpp>
+#include <boost/thread/thread.hpp>
#include <atomic>
#include <chrono>
+#include <complex>
+#include <cstdlib>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
namespace {
- constexpr int64_t CLOCK_TIMEOUT = 1000; // 1000mS timeout for external clock locking
- constexpr float INIT_DELAY = 0.05; // 50mS initial delay before transmit
-}
+constexpr int64_t CLOCK_TIMEOUT = 1000; // 1000mS timeout for external clock locking
+constexpr float INIT_DELAY = 0.05; // 50mS initial delay before transmit
+} // namespace
/***********************************************************************
* Test result variables
**********************************************************************/
-unsigned long long num_overruns = 0;
-unsigned long long num_underruns = 0;
-unsigned long long num_rx_samps = 0;
-unsigned long long num_tx_samps = 0;
+unsigned long long num_overruns = 0;
+unsigned long long num_underruns = 0;
+unsigned long long num_rx_samps = 0;
+unsigned long long num_tx_samps = 0;
unsigned long long num_dropped_samps = 0;
-unsigned long long num_seq_errors = 0;
-unsigned long long num_seqrx_errors = 0; // "D"s
+unsigned long long num_seq_errors = 0;
+unsigned long long num_seqrx_errors = 0; // "D"s
unsigned long long num_late_commands = 0;
-unsigned long long num_timeouts_rx = 0;
-unsigned long long num_timeouts_tx = 0;
+unsigned long long num_timeouts_rx = 0;
+unsigned long long num_timeouts_tx = 0;
-inline boost::posix_time::time_duration time_delta(const boost::posix_time::ptime &ref_time)
+inline boost::posix_time::time_duration time_delta(
+ const boost::posix_time::ptime& ref_time)
{
return boost::posix_time::microsec_clock::local_time() - ref_time;
}
-inline std::string time_delta_str(const boost::posix_time::ptime &ref_time)
+inline std::string time_delta_str(const boost::posix_time::ptime& ref_time)
{
return boost::posix_time::to_simple_string(time_delta(ref_time));
}
@@ -57,44 +58,45 @@ inline std::string time_delta_str(const boost::posix_time::ptime &ref_time)
/***********************************************************************
* Benchmark RX Rate
**********************************************************************/
-void benchmark_rx_rate(
- uhd::usrp::multi_usrp::sptr usrp,
- const std::string &rx_cpu,
- uhd::rx_streamer::sptr rx_stream,
- bool random_nsamps,
- const boost::posix_time::ptime &start_time,
- std::atomic<bool>& burst_timer_elapsed
-) {
+void benchmark_rx_rate(uhd::usrp::multi_usrp::sptr usrp,
+ const std::string& rx_cpu,
+ uhd::rx_streamer::sptr rx_stream,
+ bool random_nsamps,
+ const boost::posix_time::ptime& start_time,
+ std::atomic<bool>& burst_timer_elapsed)
+{
uhd::set_thread_priority_safe();
- //print pre-test summary
- std::cout << boost::format(
- "[%s] Testing receive rate %f Msps on %u channels"
- ) % NOW() % (usrp->get_rx_rate()/1e6) % rx_stream->get_num_channels() << std::endl;
+ // print pre-test summary
+ std::cout << boost::format("[%s] Testing receive rate %f Msps on %u channels") % NOW()
+ % (usrp->get_rx_rate() / 1e6) % rx_stream->get_num_channels()
+ << std::endl;
- //setup variables and allocate buffer
+ // setup variables and allocate buffer
uhd::rx_metadata_t md;
const size_t max_samps_per_packet = rx_stream->get_max_num_samps();
- std::vector<char> buff(max_samps_per_packet*uhd::convert::get_bytes_per_item(rx_cpu));
- std::vector<void *> buffs;
+ std::vector<char> buff(
+ max_samps_per_packet * uhd::convert::get_bytes_per_item(rx_cpu));
+ std::vector<void*> buffs;
for (size_t ch = 0; ch < rx_stream->get_num_channels(); ch++)
- buffs.push_back(&buff.front()); //same buffer for each channel
+ buffs.push_back(&buff.front()); // same buffer for each channel
bool had_an_overflow = false;
uhd::time_spec_t last_time;
const double rate = usrp->get_rx_rate();
uhd::stream_cmd_t cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
- cmd.time_spec = usrp->get_time_now() + uhd::time_spec_t(INIT_DELAY);
+ cmd.time_spec = usrp->get_time_now() + uhd::time_spec_t(INIT_DELAY);
cmd.stream_now = (buffs.size() == 1);
rx_stream->issue_stream_cmd(cmd);
const float burst_pkt_time =
- std::max<float>(0.100f, (2 * max_samps_per_packet/rate));
+ std::max<float>(0.100f, (2 * max_samps_per_packet / rate));
float recv_timeout = burst_pkt_time + INIT_DELAY;
bool stop_called = false;
while (true) {
- //if (burst_timer_elapsed.load(boost::memory_order_relaxed) and not stop_called) {
+ // if (burst_timer_elapsed.load(boost::memory_order_relaxed) and not stop_called)
+ // {
if (burst_timer_elapsed and not stop_called) {
rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
stop_called = true;
@@ -104,71 +106,78 @@ void benchmark_rx_rate(
rx_stream->issue_stream_cmd(cmd);
}
try {
- num_rx_samps += rx_stream->recv(buffs, max_samps_per_packet, md, recv_timeout)*rx_stream->get_num_channels();
+ num_rx_samps += rx_stream->recv(buffs, max_samps_per_packet, md, recv_timeout)
+ * rx_stream->get_num_channels();
recv_timeout = burst_pkt_time;
- }
- catch (uhd::io_error &e) {
+ } catch (uhd::io_error& e) {
std::cerr << "[" << NOW() << "] Caught an IO exception. " << std::endl;
std::cerr << e.what() << std::endl;
return;
}
- //handle the error codes
- switch(md.error_code){
- case uhd::rx_metadata_t::ERROR_CODE_NONE:
- if (had_an_overflow) {
- had_an_overflow = false;
- const long dropped_samps =
- (md.time_spec - last_time).to_ticks(rate);
- if (dropped_samps < 0) {
- std::cerr
- << "[" << NOW() << "] Timestamp after overrun recovery "
- "ahead of error timestamp! Unable to calculate "
- "number of dropped samples."
- "(Delta: " << dropped_samps << " ticks)\n";
+ // handle the error codes
+ switch (md.error_code) {
+ case uhd::rx_metadata_t::ERROR_CODE_NONE:
+ if (had_an_overflow) {
+ had_an_overflow = false;
+ const long dropped_samps = (md.time_spec - last_time).to_ticks(rate);
+ if (dropped_samps < 0) {
+ std::cerr << "[" << NOW()
+ << "] Timestamp after overrun recovery "
+ "ahead of error timestamp! Unable to calculate "
+ "number of dropped samples."
+ "(Delta: "
+ << dropped_samps << " ticks)\n";
+ }
+ num_dropped_samps += std::max<long>(1, dropped_samps);
}
- num_dropped_samps += std::max<long>(1, dropped_samps);
- }
- if ((burst_timer_elapsed or stop_called) and md.end_of_burst) {
- return;
- }
- break;
-
- // ERROR_CODE_OVERFLOW can indicate overflow or sequence error
- case uhd::rx_metadata_t::ERROR_CODE_OVERFLOW:
- last_time = md.time_spec;
- had_an_overflow = true;
- // check out_of_sequence flag to see if it was a sequence error or overflow
- if (!md.out_of_sequence) {
- num_overruns++;
- } else {
- num_seqrx_errors++;
- std::cerr << "[" << NOW() << "] Detected Rx sequence error." << std::endl;
- }
- break;
-
- case uhd::rx_metadata_t::ERROR_CODE_LATE_COMMAND:
- std::cerr << "[" << NOW() << "] Receiver error: " << md.strerror() << ", restart streaming..."<< std::endl;
- num_late_commands++;
- // Radio core will be in the idle state. Issue stream command to restart streaming.
- cmd.time_spec = usrp->get_time_now() + uhd::time_spec_t(0.05);
- cmd.stream_now = (buffs.size() == 1);
- rx_stream->issue_stream_cmd(cmd);
- break;
-
- case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT:
- if (burst_timer_elapsed) {
- return;
- }
- std::cerr << "[" << NOW() << "] Receiver error: " << md.strerror() << ", continuing..." << std::endl;
- num_timeouts_rx++;
- break;
-
- // Otherwise, it's an error
- default:
- std::cerr << "[" << NOW() << "] Receiver error: " << md.strerror() << std::endl;
- std::cerr << "[" << NOW() << "] Unexpected error on recv, continuing..." << std::endl;
- break;
+ if ((burst_timer_elapsed or stop_called) and md.end_of_burst) {
+ return;
+ }
+ break;
+
+ // ERROR_CODE_OVERFLOW can indicate overflow or sequence error
+ case uhd::rx_metadata_t::ERROR_CODE_OVERFLOW:
+ last_time = md.time_spec;
+ had_an_overflow = true;
+ // check out_of_sequence flag to see if it was a sequence error or
+ // overflow
+ if (!md.out_of_sequence) {
+ num_overruns++;
+ } else {
+ num_seqrx_errors++;
+ std::cerr << "[" << NOW() << "] Detected Rx sequence error."
+ << std::endl;
+ }
+ break;
+
+ case uhd::rx_metadata_t::ERROR_CODE_LATE_COMMAND:
+ std::cerr << "[" << NOW() << "] Receiver error: " << md.strerror()
+ << ", restart streaming..." << std::endl;
+ num_late_commands++;
+ // Radio core will be in the idle state. Issue stream command to restart
+ // streaming.
+ cmd.time_spec = usrp->get_time_now() + uhd::time_spec_t(0.05);
+ cmd.stream_now = (buffs.size() == 1);
+ rx_stream->issue_stream_cmd(cmd);
+ break;
+
+ case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT:
+ if (burst_timer_elapsed) {
+ return;
+ }
+ std::cerr << "[" << NOW() << "] Receiver error: " << md.strerror()
+ << ", continuing..." << std::endl;
+ num_timeouts_rx++;
+ break;
+
+ // Otherwise, it's an error
+ default:
+ std::cerr << "[" << NOW() << "] Receiver error: " << md.strerror()
+ << std::endl;
+ std::cerr << "[" << NOW() << "] Unexpected error on recv, continuing..."
+ << std::endl;
+ break;
}
}
}
@@ -176,71 +185,75 @@ void benchmark_rx_rate(
/***********************************************************************
* Benchmark TX Rate
**********************************************************************/
-void benchmark_tx_rate(
- uhd::usrp::multi_usrp::sptr usrp,
- const std::string &tx_cpu,
- uhd::tx_streamer::sptr tx_stream,
- std::atomic<bool>& burst_timer_elapsed,
- const boost::posix_time::ptime &start_time,
- bool random_nsamps=false
-) {
+void benchmark_tx_rate(uhd::usrp::multi_usrp::sptr usrp,
+ const std::string& tx_cpu,
+ uhd::tx_streamer::sptr tx_stream,
+ std::atomic<bool>& burst_timer_elapsed,
+ const boost::posix_time::ptime& start_time,
+ bool random_nsamps = false)
+{
uhd::set_thread_priority_safe();
- //print pre-test summary
- std::cout << boost::format(
- "[%s] Testing transmit rate %f Msps on %u channels"
- ) % NOW() % (usrp->get_tx_rate()/1e6) % tx_stream->get_num_channels() << std::endl;
+ // print pre-test summary
+ std::cout << boost::format("[%s] Testing transmit rate %f Msps on %u channels")
+ % NOW() % (usrp->get_tx_rate() / 1e6) % tx_stream->get_num_channels()
+ << std::endl;
- //setup variables and allocate buffer
+ // setup variables and allocate buffer
const size_t max_samps_per_packet = tx_stream->get_max_num_samps();
- std::vector<char> buff(max_samps_per_packet*uhd::convert::get_bytes_per_item(tx_cpu));
- std::vector<const void *> buffs;
+ std::vector<char> buff(
+ max_samps_per_packet * uhd::convert::get_bytes_per_item(tx_cpu));
+ std::vector<const void*> buffs;
for (size_t ch = 0; ch < tx_stream->get_num_channels(); ch++)
- buffs.push_back(&buff.front()); //same buffer for each channel
+ buffs.push_back(&buff.front()); // same buffer for each channel
// Create the metadata, and populate the time spec at the latest possible moment
uhd::tx_metadata_t md;
md.has_time_spec = (buffs.size() != 1);
- md.time_spec = usrp->get_time_now() + uhd::time_spec_t(INIT_DELAY);
+ md.time_spec = usrp->get_time_now() + uhd::time_spec_t(INIT_DELAY);
if (random_nsamps) {
std::srand((unsigned int)time(NULL));
while (not burst_timer_elapsed) {
size_t total_num_samps = rand() % max_samps_per_packet;
- size_t num_acc_samps = 0;
- const float timeout = 1;
+ size_t num_acc_samps = 0;
+ const float timeout = 1;
usrp->set_time_now(uhd::time_spec_t(0.0));
- while(num_acc_samps < total_num_samps){
- //send a single packet
- num_tx_samps += tx_stream->send(buffs, max_samps_per_packet, md, timeout)*tx_stream->get_num_channels();
- num_acc_samps += std::min(total_num_samps-num_acc_samps, tx_stream->get_max_num_samps());
+ while (num_acc_samps < total_num_samps) {
+ // send a single packet
+ num_tx_samps += tx_stream->send(buffs, max_samps_per_packet, md, timeout)
+ * tx_stream->get_num_channels();
+ num_acc_samps += std::min(
+ total_num_samps - num_acc_samps, tx_stream->get_max_num_samps());
}
}
} else {
while (not burst_timer_elapsed) {
- const size_t num_tx_samps_sent_now = tx_stream->send(buffs, max_samps_per_packet, md)*tx_stream->get_num_channels();
+ const size_t num_tx_samps_sent_now =
+ tx_stream->send(buffs, max_samps_per_packet, md)
+ * tx_stream->get_num_channels();
num_tx_samps += num_tx_samps_sent_now;
if (num_tx_samps_sent_now == 0) {
num_timeouts_tx++;
if ((num_timeouts_tx % 10000) == 1) {
- std::cerr << "[" << NOW() << "] Tx timeouts: " << num_timeouts_tx << std::endl;
+ std::cerr << "[" << NOW() << "] Tx timeouts: " << num_timeouts_tx
+ << std::endl;
}
}
md.has_time_spec = false;
}
}
- //send a mini EOB packet
+ // send a mini EOB packet
md.end_of_burst = true;
tx_stream->send(buffs, 0, md);
}
-void benchmark_tx_rate_async_helper(
- uhd::tx_streamer::sptr tx_stream,
- const boost::posix_time::ptime &start_time,
- std::atomic<bool>& burst_timer_elapsed
-) {
- //setup variables and allocate buffer
+void benchmark_tx_rate_async_helper(uhd::tx_streamer::sptr tx_stream,
+ const boost::posix_time::ptime& start_time,
+ std::atomic<bool>& burst_timer_elapsed)
+{
+ // setup variables and allocate buffer
uhd::async_metadata_t async_md;
bool exit_flag = false;
@@ -255,25 +268,26 @@ void benchmark_tx_rate_async_helper(
continue;
}
- //handle the error codes
- switch(async_md.event_code){
- case uhd::async_metadata_t::EVENT_CODE_BURST_ACK:
- return;
-
- case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW:
- case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW_IN_PACKET:
- num_underruns++;
- break;
-
- case uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR:
- case uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR_IN_BURST:
- num_seq_errors++;
- break;
+ // handle the error codes
+ switch (async_md.event_code) {
+ case uhd::async_metadata_t::EVENT_CODE_BURST_ACK:
+ return;
- default:
- std::cerr << "[" << NOW() << "] Event code: " << async_md.event_code << std::endl;
- std::cerr << "Unexpected event on async recv, continuing..." << std::endl;
- break;
+ case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW:
+ case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW_IN_PACKET:
+ num_underruns++;
+ break;
+
+ case uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR:
+ case uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR_IN_BURST:
+ num_seq_errors++;
+ break;
+
+ default:
+ std::cerr << "[" << NOW() << "] Event code: " << async_md.event_code
+ << std::endl;
+ std::cerr << "Unexpected event on async recv, continuing..." << std::endl;
+ break;
}
}
}
@@ -281,10 +295,11 @@ void benchmark_tx_rate_async_helper(
/***********************************************************************
* Main code + dispatcher
**********************************************************************/
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args;
std::string rx_subdev, tx_subdev;
double duration;
@@ -297,7 +312,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
std::atomic<bool> burst_timer_elapsed(false);
size_t overrun_threshold, underrun_threshold, drop_threshold, seq_threshold;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -333,45 +348,52 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help") or (vm.count("rx_rate") + vm.count("tx_rate")) == 0){
+ // print the help message
+ if (vm.count("help") or (vm.count("rx_rate") + vm.count("tx_rate")) == 0) {
std::cout << boost::format("UHD Benchmark Rate %s") % desc << std::endl;
- std::cout <<
- " Specify --rx_rate for a receive-only test.\n"
- " Specify --tx_rate for a transmit-only test.\n"
- " Specify both options for a full-duplex test.\n"
- << std::endl;
+ std::cout << " Specify --rx_rate for a receive-only test.\n"
+ " Specify --tx_rate for a transmit-only test.\n"
+ " Specify both options for a full-duplex test.\n"
+ << std::endl;
return ~0;
}
// Random number of samples?
if (vm.count("random")) {
- std::cout << "Using random number of samples in send() and recv() calls." << std::endl;
+ std::cout << "Using random number of samples in send() and recv() calls."
+ << std::endl;
random_nsamps = true;
}
if (vm.count("mode")) {
if (vm.count("pps") or vm.count("ref")) {
- std::cout << "ERROR: The \"mode\" parameter cannot be used with the \"ref\" and \"pps\" parameters.\n" << std::endl;
+ std::cout << "ERROR: The \"mode\" parameter cannot be used with the \"ref\" "
+ "and \"pps\" parameters.\n"
+ << std::endl;
return -1;
} else if (mode == "mimo") {
ref = pps = "mimo";
- std::cout << "The use of the \"mode\" parameter is deprecated. Please use \"ref\" and \"pps\" parameters instead\n" << std::endl;
+ std::cout << "The use of the \"mode\" parameter is deprecated. Please use "
+ "\"ref\" and \"pps\" parameters instead\n"
+ << std::endl;
}
}
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
uhd::device_addrs_t device_addrs = uhd::device::find(args, uhd::device::USRP);
- if (not device_addrs.empty() and device_addrs.at(0).get("type", "") == "usrp1"){
+ if (not device_addrs.empty() and device_addrs.at(0).get("type", "") == "usrp1") {
std::cerr << "*** Warning! ***" << std::endl;
- std::cerr << "Benchmark results will be inaccurate on USRP1 due to insufficient features.\n" << std::endl;
+ std::cerr << "Benchmark results will be inaccurate on USRP1 due to insufficient "
+ "features.\n"
+ << std::endl;
}
boost::posix_time::ptime start_time(boost::posix_time::microsec_clock::local_time());
- std::cout << boost::format("[%s] Creating the usrp device with: %s...") % NOW() % args << std::endl;
+ std::cout << boost::format("[%s] Creating the usrp device with: %s...") % NOW() % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
- //always select the subdevice first, the channel mapping affects the other settings
+ // always select the subdevice first, the channel mapping affects the other settings
if (vm.count("rx_subdev")) {
usrp->set_rx_subdev_spec(rx_subdev);
}
@@ -384,34 +406,35 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
boost::thread_group thread_group;
- if(vm.count("ref"))
- {
- if (ref == "mimo")
- {
+ if (vm.count("ref")) {
+ if (ref == "mimo") {
if (num_mboards != 2) {
- std::cerr << "ERROR: ref = \"mimo\" implies 2 motherboards; your system has " << num_mboards << " boards" << std::endl;
+ std::cerr
+ << "ERROR: ref = \"mimo\" implies 2 motherboards; your system has "
+ << num_mboards << " boards" << std::endl;
return -1;
}
- usrp->set_clock_source("mimo",1);
+ usrp->set_clock_source("mimo", 1);
} else {
usrp->set_clock_source(ref);
}
- if(ref != "internal") {
+ if (ref != "internal") {
std::cout << "Now confirming lock on clock signals..." << std::endl;
bool is_locked = false;
auto end_time =
- boost::get_system_time() +
- boost::posix_time::milliseconds(CLOCK_TIMEOUT);
+ boost::get_system_time() + boost::posix_time::milliseconds(CLOCK_TIMEOUT);
for (int i = 0; i < num_mboards; i++) {
- if (ref == "mimo" and i == 0) continue;
- while((is_locked = usrp->get_mboard_sensor("ref_locked",i).to_bool()) == false and
- boost::get_system_time() < end_time )
- {
+ if (ref == "mimo" and i == 0)
+ continue;
+ while ((is_locked = usrp->get_mboard_sensor("ref_locked", i).to_bool())
+ == false
+ and boost::get_system_time() < end_time) {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
if (is_locked == false) {
- std::cerr << "ERROR: Unable to confirm clock signal locked on board:" << i << std::endl;
+ std::cerr << "ERROR: Unable to confirm clock signal locked on board:"
+ << i << std::endl;
return -1;
}
is_locked = false;
@@ -419,22 +442,22 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
}
}
- if(vm.count("pps"))
- {
- if(pps == "mimo")
- {
- if (num_mboards != 2) {
- std::cerr << "ERROR: ref = \"mimo\" implies 2 motherboards; your system has " << num_mboards << " boards" << std::endl;
- return -1;
- }
- //make mboard 1 a slave over the MIMO Cable
- usrp->set_time_source("mimo", 1);
- } else {
- usrp->set_time_source(pps);
- }
+ if (vm.count("pps")) {
+ if (pps == "mimo") {
+ if (num_mboards != 2) {
+ std::cerr
+ << "ERROR: ref = \"mimo\" implies 2 motherboards; your system has "
+ << num_mboards << " boards" << std::endl;
+ return -1;
+ }
+ // make mboard 1 a slave over the MIMO Cable
+ usrp->set_time_source("mimo", 1);
+ } else {
+ usrp->set_time_source(pps);
+ }
}
- //check that the device has sufficient RX and TX channels available
+ // check that the device has sufficient RX and TX channels available
std::vector<std::string> channel_strings;
std::vector<size_t> rx_channel_nums;
if (vm.count("rx_rate")) {
@@ -470,7 +493,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
}
}
- std::cout << boost::format("[%s] Setting device timestamp to 0...") % NOW() << std::endl;
+ std::cout << boost::format("[%s] Setting device timestamp to 0...") % NOW()
+ << std::endl;
if (pps == "mimo" or ref == "mimo") {
// only set the master's time, the slave's is automatically sync'd
usrp->set_time_now(uhd::time_spec_t(0.0), 0);
@@ -484,144 +508,103 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
usrp->set_time_now(0.0);
}
- //spawn the receive test thread
- if (vm.count("rx_rate")){
+ // spawn the receive test thread
+ if (vm.count("rx_rate")) {
usrp->set_rx_rate(rx_rate);
- //create a receive streamer
+ // create a receive streamer
uhd::stream_args_t stream_args(rx_cpu, rx_otw);
- stream_args.channels = rx_channel_nums;
+ stream_args.channels = rx_channel_nums;
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
- auto rx_thread = thread_group.create_thread([=, &burst_timer_elapsed](){
+ auto rx_thread = thread_group.create_thread([=, &burst_timer_elapsed]() {
benchmark_rx_rate(
- usrp,
- rx_cpu,
- rx_stream,
- random_nsamps,
- start_time,
- burst_timer_elapsed
- );
+ usrp, rx_cpu, rx_stream, random_nsamps, start_time, burst_timer_elapsed);
});
uhd::set_thread_name(rx_thread, "bmark_rx_stream");
}
- //spawn the transmit test thread
- if (vm.count("tx_rate")){
+ // spawn the transmit test thread
+ if (vm.count("tx_rate")) {
usrp->set_tx_rate(tx_rate);
- //create a transmit streamer
+ // create a transmit streamer
uhd::stream_args_t stream_args(tx_cpu, tx_otw);
- stream_args.channels = tx_channel_nums;
+ stream_args.channels = tx_channel_nums;
uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(stream_args);
- auto tx_thread = thread_group.create_thread([=, &burst_timer_elapsed](){
+ auto tx_thread = thread_group.create_thread([=, &burst_timer_elapsed]() {
benchmark_tx_rate(
- usrp,
- tx_cpu,
- tx_stream,
- burst_timer_elapsed,
- start_time,
- random_nsamps
- );
+ usrp, tx_cpu, tx_stream, burst_timer_elapsed, start_time, random_nsamps);
});
uhd::set_thread_name(tx_thread, "bmark_tx_stream");
- auto tx_async_thread = thread_group.create_thread([=, &burst_timer_elapsed](){
- benchmark_tx_rate_async_helper(
- tx_stream,
- start_time,
- burst_timer_elapsed
- );
+ auto tx_async_thread = thread_group.create_thread([=, &burst_timer_elapsed]() {
+ benchmark_tx_rate_async_helper(tx_stream, start_time, burst_timer_elapsed);
});
uhd::set_thread_name(tx_async_thread, "bmark_tx_helper");
}
- //sleep for the required duration
+ // sleep for the required duration
const bool wait_for_multichan =
(rx_channel_nums.size() <= 1 and tx_channel_nums.size() <= 1);
- const int64_t secs =
- int64_t(duration + (wait_for_multichan ? 0 : INIT_DELAY * 1000));
- const int64_t usecs = int64_t((duration - secs)*1e6);
+ const int64_t secs = int64_t(duration + (wait_for_multichan ? 0 : INIT_DELAY * 1000));
+ const int64_t usecs = int64_t((duration - secs) * 1e6);
std::this_thread::sleep_for(
- std::chrono::seconds(secs) +
- std::chrono::microseconds(usecs)
- );
+ std::chrono::seconds(secs) + std::chrono::microseconds(usecs));
- //interrupt and join the threads
+ // interrupt and join the threads
burst_timer_elapsed = true;
thread_group.join_all();
std::cout << "[" << NOW() << "] Benchmark complete." << std::endl << std::endl;
- //print summary
+ // print summary
const std::string threshold_err(" ERROR: Exceeds threshold!");
- const bool overrun_threshold_err =
- vm.count("overrun-threshold") and
- num_overruns > overrun_threshold;
- const bool underrun_threshold_err =
- vm.count("underrun-threshold") and
- num_underruns > underrun_threshold;
- const bool drop_threshold_err =
- vm.count("drop-threshold") and
- num_seqrx_errors > drop_threshold;
- const bool seq_threshold_err =
- vm.count("seq-threshold") and
- num_seq_errors > seq_threshold;
+ const bool overrun_threshold_err = vm.count("overrun-threshold")
+ and num_overruns > overrun_threshold;
+ const bool underrun_threshold_err = vm.count("underrun-threshold")
+ and num_underruns > underrun_threshold;
+ const bool drop_threshold_err = vm.count("drop-threshold")
+ and num_seqrx_errors > drop_threshold;
+ const bool seq_threshold_err = vm.count("seq-threshold")
+ and num_seq_errors > seq_threshold;
std::cout << std::endl
- << boost::format(
- "Benchmark rate summary:\n"
- " Num received samples: %u\n"
- " Num dropped samples: %u\n"
- " Num overruns detected: %u\n"
- " Num transmitted samples: %u\n"
- " Num sequence errors (Tx): %u\n"
- " Num sequence errors (Rx): %u\n"
- " Num underruns detected: %u\n"
- " Num late commands: %u\n"
- " Num timeouts (Tx): %u\n"
- " Num timeouts (Rx): %u\n"
- ) % num_rx_samps
- % num_dropped_samps
- % num_overruns
- % num_tx_samps
- % num_seq_errors
- % num_seqrx_errors
- % num_underruns
- % num_late_commands
- % num_timeouts_tx
- % num_timeouts_rx
- << std::endl;
- //finished
+ << boost::format("Benchmark rate summary:\n"
+ " Num received samples: %u\n"
+ " Num dropped samples: %u\n"
+ " Num overruns detected: %u\n"
+ " Num transmitted samples: %u\n"
+ " Num sequence errors (Tx): %u\n"
+ " Num sequence errors (Rx): %u\n"
+ " Num underruns detected: %u\n"
+ " Num late commands: %u\n"
+ " Num timeouts (Tx): %u\n"
+ " Num timeouts (Rx): %u\n")
+ % num_rx_samps % num_dropped_samps % num_overruns % num_tx_samps
+ % num_seq_errors % num_seqrx_errors % num_underruns
+ % num_late_commands % num_timeouts_tx % num_timeouts_rx
+ << std::endl;
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
- if (overrun_threshold_err
- || underrun_threshold_err
- || drop_threshold_err
- || seq_threshold_err) {
+ if (overrun_threshold_err || underrun_threshold_err || drop_threshold_err
+ || seq_threshold_err) {
std::cout << "The following error thresholds were exceeded:\n";
if (overrun_threshold_err) {
- std::cout
- << boost::format(" * Overruns (%d/%d)")
- % num_overruns
- % overrun_threshold
- << std::endl;
+ std::cout << boost::format(" * Overruns (%d/%d)") % num_overruns
+ % overrun_threshold
+ << std::endl;
}
if (underrun_threshold_err) {
- std::cout
- << boost::format(" * Underruns (%d/%d)")
- % num_underruns
- % underrun_threshold
- << std::endl;
+ std::cout << boost::format(" * Underruns (%d/%d)") % num_underruns
+ % underrun_threshold
+ << std::endl;
}
if (drop_threshold_err) {
- std::cout
- << boost::format(" * Dropped packets (RX) (%d/%d)")
- % num_seqrx_errors
- % drop_threshold
- << std::endl;
+ std::cout << boost::format(" * Dropped packets (RX) (%d/%d)")
+ % num_seqrx_errors % drop_threshold
+ << std::endl;
}
if (seq_threshold_err) {
- std::cout
- << boost::format(" * Dropped packets (TX) (%d/%d)")
- % num_seq_errors
- % seq_threshold
- << std::endl;
+ std::cout << boost::format(" * Dropped packets (TX) (%d/%d)")
+ % num_seq_errors % seq_threshold
+ << std::endl;
}
return EXIT_FAILURE;
}
diff --git a/host/examples/benchmark_streamer.cpp b/host/examples/benchmark_streamer.cpp
index 609e50788..44851825a 100644
--- a/host/examples/benchmark_streamer.cpp
+++ b/host/examples/benchmark_streamer.cpp
@@ -4,27 +4,28 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/device3.hpp>
#include <uhd/convert.hpp>
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
+#include <uhd/device3.hpp>
#include <uhd/rfnoc/block_ctrl.hpp>
-#include <uhd/rfnoc/null_block_ctrl.hpp>
#include <uhd/rfnoc/ddc_block_ctrl.hpp>
#include <uhd/rfnoc/duc_block_ctrl.hpp>
-#include <boost/program_options.hpp>
-#include <boost/format.hpp>
+#include <uhd/rfnoc/null_block_ctrl.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/algorithm/string/trim_all.hpp>
+#include <boost/format.hpp>
+#include <boost/program_options.hpp>
+#include <chrono>
+#include <deque>
+#include <iomanip>
#include <iostream>
#include <sstream>
-#include <iomanip>
#include <thread>
-#include <chrono>
-#include <deque>
namespace po = boost::program_options;
-struct traffic_counter_values {
+struct traffic_counter_values
+{
uint64_t clock_cycles;
uint64_t xbar_to_shell_xfer_count;
@@ -40,71 +41,80 @@ struct traffic_counter_values {
uint64_t ce_to_shell_pkt_count;
};
-struct host_measurement_values {
+struct host_measurement_values
+{
double seconds;
uint64_t num_samples;
uint64_t num_packets;
uint64_t spp;
};
-struct test_results {
+struct test_results
+{
std::vector<traffic_counter_values> traffic_counter;
host_measurement_values host;
};
-struct noc_block_endpoint {
+struct noc_block_endpoint
+{
std::string block_id;
size_t port;
};
-void enable_traffic_counters(
- uhd::property_tree::sptr tree,
- uhd::fs_path noc_block_root
-) {
- tree->access<uint64_t>(noc_block_root/"traffic_counter/enable").set(true);
+void enable_traffic_counters(uhd::property_tree::sptr tree, uhd::fs_path noc_block_root)
+{
+ tree->access<uint64_t>(noc_block_root / "traffic_counter/enable").set(true);
}
-void disable_traffic_counters(
- uhd::property_tree::sptr tree,
- uhd::fs_path noc_block_root
-) {
- tree->access<uint64_t>(noc_block_root/"traffic_counter/enable").set(false);
+void disable_traffic_counters(uhd::property_tree::sptr tree, uhd::fs_path noc_block_root)
+{
+ tree->access<uint64_t>(noc_block_root / "traffic_counter/enable").set(false);
}
traffic_counter_values read_traffic_counters(
- uhd::property_tree::sptr tree,
- uhd::fs_path noc_block_root
-) {
- uhd::fs_path root = noc_block_root/"traffic_counter";
+ uhd::property_tree::sptr tree, uhd::fs_path noc_block_root)
+{
+ uhd::fs_path root = noc_block_root / "traffic_counter";
traffic_counter_values vals;
- vals.clock_cycles = tree->access<uint64_t>(root/"bus_clock_ticks").get();
+ vals.clock_cycles = tree->access<uint64_t>(root / "bus_clock_ticks").get();
- vals.xbar_to_shell_pkt_count = tree->access<uint64_t>(root/"xbar_to_shell_pkt_count").get();
- vals.xbar_to_shell_xfer_count = tree->access<uint64_t>(root/"xbar_to_shell_xfer_count").get();
+ vals.xbar_to_shell_pkt_count =
+ tree->access<uint64_t>(root / "xbar_to_shell_pkt_count").get();
+ vals.xbar_to_shell_xfer_count =
+ tree->access<uint64_t>(root / "xbar_to_shell_xfer_count").get();
- vals.shell_to_xbar_pkt_count = tree->access<uint64_t>(root/"shell_to_xbar_pkt_count").get();
- vals.shell_to_xbar_xfer_count = tree->access<uint64_t>(root/"shell_to_xbar_xfer_count").get();
+ vals.shell_to_xbar_pkt_count =
+ tree->access<uint64_t>(root / "shell_to_xbar_pkt_count").get();
+ vals.shell_to_xbar_xfer_count =
+ tree->access<uint64_t>(root / "shell_to_xbar_xfer_count").get();
- vals.shell_to_ce_pkt_count = tree->access<uint64_t>(root/"shell_to_ce_pkt_count").get();
- vals.shell_to_ce_xfer_count = tree->access<uint64_t>(root/"shell_to_ce_xfer_count").get();
+ vals.shell_to_ce_pkt_count =
+ tree->access<uint64_t>(root / "shell_to_ce_pkt_count").get();
+ vals.shell_to_ce_xfer_count =
+ tree->access<uint64_t>(root / "shell_to_ce_xfer_count").get();
- vals.ce_to_shell_pkt_count = tree->access<uint64_t>(root/"ce_to_shell_pkt_count").get();
- vals.ce_to_shell_xfer_count = tree->access<uint64_t>(root/"ce_to_shell_xfer_count").get();
+ vals.ce_to_shell_pkt_count =
+ tree->access<uint64_t>(root / "ce_to_shell_pkt_count").get();
+ vals.ce_to_shell_xfer_count =
+ tree->access<uint64_t>(root / "ce_to_shell_xfer_count").get();
return vals;
}
-void print_traffic_counters(
- const traffic_counter_values& vals
-) {
+void print_traffic_counters(const traffic_counter_values& vals)
+{
std::cout << "Clock cycles: " << vals.clock_cycles << std::endl;
- std::cout << "Xbar to shell pkt count: " << vals.xbar_to_shell_pkt_count << std::endl;
- std::cout << "Xbar to shell xfer count: " << vals.xbar_to_shell_xfer_count << std::endl;
+ std::cout << "Xbar to shell pkt count: " << vals.xbar_to_shell_pkt_count
+ << std::endl;
+ std::cout << "Xbar to shell xfer count: " << vals.xbar_to_shell_xfer_count
+ << std::endl;
- std::cout << "Shell to xbar pkt count: " << vals.shell_to_xbar_pkt_count << std::endl;
- std::cout << "Shell to xbar xfer count: " << vals.shell_to_xbar_xfer_count << std::endl;
+ std::cout << "Shell to xbar pkt count: " << vals.shell_to_xbar_pkt_count
+ << std::endl;
+ std::cout << "Shell to xbar xfer count: " << vals.shell_to_xbar_xfer_count
+ << std::endl;
std::cout << "Shell to CE pkt count: " << vals.shell_to_ce_pkt_count << std::endl;
std::cout << "Shell to CE xfer count: " << vals.shell_to_ce_xfer_count << std::endl;
@@ -113,173 +123,189 @@ void print_traffic_counters(
std::cout << "CE to shell xfer count: " << vals.ce_to_shell_xfer_count << std::endl;
}
-void print_rx_statistics(
- const traffic_counter_values& vals,
- const double bus_clk_freq
-) {
- const double bus_time_elapsed = vals.clock_cycles / bus_clk_freq;
+void print_rx_statistics(const traffic_counter_values& vals, const double bus_clk_freq)
+{
+ const double bus_time_elapsed = vals.clock_cycles / bus_clk_freq;
const uint64_t num_ce_packets_read = vals.ce_to_shell_pkt_count;
- const uint64_t num_ce_samples_read = (vals.ce_to_shell_xfer_count - num_ce_packets_read)*2;
+ const uint64_t num_ce_samples_read =
+ (vals.ce_to_shell_xfer_count - num_ce_packets_read) * 2;
- const uint64_t num_non_data_packets_read = vals.shell_to_xbar_pkt_count - num_ce_packets_read;
- const double rx_data_packet_ratio = (double)num_ce_packets_read/num_non_data_packets_read;
+ const uint64_t num_non_data_packets_read =
+ vals.shell_to_xbar_pkt_count - num_ce_packets_read;
+ const double rx_data_packet_ratio =
+ (double)num_ce_packets_read / num_non_data_packets_read;
- const double calculated_throughput = num_ce_samples_read/bus_time_elapsed;
+ const double calculated_throughput = num_ce_samples_read / bus_time_elapsed;
std::cout << "Time elapsed: " << bus_time_elapsed << " s" << std::endl;
std::cout << "Samples read: " << num_ce_samples_read << std::endl;
std::cout << "Data packets read: " << num_ce_packets_read << std::endl;
- std::cout << "RX data packet ratio: " << rx_data_packet_ratio << " data to non-data packets" << std::endl;
- std::cout << "Calculated throughput: " << calculated_throughput/1e6 << " Msps" << std::endl;
+ std::cout << "RX data packet ratio: " << rx_data_packet_ratio
+ << " data to non-data packets" << std::endl;
+ std::cout << "Calculated throughput: " << calculated_throughput / 1e6 << " Msps"
+ << std::endl;
}
-void print_tx_statistics(
- const traffic_counter_values& vals,
- const double bus_clk_freq
-) {
- const double bus_time_elapsed = vals.clock_cycles / bus_clk_freq;
+void print_tx_statistics(const traffic_counter_values& vals, const double bus_clk_freq)
+{
+ const double bus_time_elapsed = vals.clock_cycles / bus_clk_freq;
const uint64_t num_ce_packets_written = vals.shell_to_ce_pkt_count;
- const uint64_t num_ce_samples_written = (vals.shell_to_ce_xfer_count - num_ce_packets_written)*2;
+ const uint64_t num_ce_samples_written =
+ (vals.shell_to_ce_xfer_count - num_ce_packets_written) * 2;
- const uint64_t num_non_data_packets_written = vals.xbar_to_shell_pkt_count - num_ce_packets_written;
- const double tx_data_packet_ratio = (double)num_ce_packets_written/num_non_data_packets_written;
+ const uint64_t num_non_data_packets_written =
+ vals.xbar_to_shell_pkt_count - num_ce_packets_written;
+ const double tx_data_packet_ratio =
+ (double)num_ce_packets_written / num_non_data_packets_written;
- const double calculated_throughput = num_ce_samples_written/bus_time_elapsed;
+ const double calculated_throughput = num_ce_samples_written / bus_time_elapsed;
std::cout << "Time elapsed: " << bus_time_elapsed << " s" << std::endl;
std::cout << "Samples written: " << num_ce_samples_written << std::endl;
std::cout << "Data packets written: " << num_ce_packets_written << std::endl;
- std::cout << "TX data packet ratio: " << tx_data_packet_ratio << " data to non-data packets" << std::endl;
- std::cout << "Calculated throughput: " << calculated_throughput/1e6 << " Msps" << std::endl;
+ std::cout << "TX data packet ratio: " << tx_data_packet_ratio
+ << " data to non-data packets" << std::endl;
+ std::cout << "Calculated throughput: " << calculated_throughput / 1e6 << " Msps"
+ << std::endl;
}
-void print_utilization_statistics(
- const traffic_counter_values& vals
-) {
- const double rx_data_cycles = vals.ce_to_shell_xfer_count - vals.ce_to_shell_pkt_count;
+void print_utilization_statistics(const traffic_counter_values& vals)
+{
+ const double rx_data_cycles =
+ vals.ce_to_shell_xfer_count - vals.ce_to_shell_pkt_count;
const double rx_idle_cycles = vals.clock_cycles - vals.shell_to_xbar_xfer_count;
const double rx_data_header_cycles = vals.ce_to_shell_pkt_count;
- const double rx_other_cycles = vals.shell_to_xbar_xfer_count - vals.ce_to_shell_xfer_count;
+ const double rx_other_cycles =
+ vals.shell_to_xbar_xfer_count - vals.ce_to_shell_xfer_count;
- const double rx_data_util = rx_data_cycles / vals.clock_cycles*100;
- const double rx_idle_util = rx_idle_cycles / vals.clock_cycles*100;
+ const double rx_data_util = rx_data_cycles / vals.clock_cycles * 100;
+ const double rx_idle_util = rx_idle_cycles / vals.clock_cycles * 100;
const double rx_data_header_util = rx_data_header_cycles / vals.clock_cycles * 100;
- const double rx_other_util = rx_other_cycles / vals.clock_cycles * 100;
+ const double rx_other_util = rx_other_cycles / vals.clock_cycles * 100;
std::cout << "RX utilization:" << std::endl;
std::cout << " data: " << rx_data_util << " %" << std::endl;
std::cout << " idle: " << rx_idle_util << " %" << std::endl;
std::cout << " data header: " << rx_data_header_util << " %" << std::endl;
- std::cout << " other: " << rx_other_util << " % (flow control, register I/O)" << std::endl;
+ std::cout << " other: " << rx_other_util << " % (flow control, register I/O)"
+ << std::endl;
std::cout << std::endl;
- const double tx_data_cycles = vals.shell_to_ce_xfer_count - vals.shell_to_ce_pkt_count;
+ const double tx_data_cycles =
+ vals.shell_to_ce_xfer_count - vals.shell_to_ce_pkt_count;
const double tx_idle_cycles = vals.clock_cycles - vals.xbar_to_shell_xfer_count;
const double tx_data_header_cycles = vals.shell_to_ce_pkt_count;
- const double tx_other_cycles = vals.xbar_to_shell_xfer_count - vals.shell_to_ce_xfer_count;
+ const double tx_other_cycles =
+ vals.xbar_to_shell_xfer_count - vals.shell_to_ce_xfer_count;
- const double tx_data_util = tx_data_cycles / vals.clock_cycles*100;
- const double tx_idle_util = tx_idle_cycles / vals.clock_cycles*100;
+ const double tx_data_util = tx_data_cycles / vals.clock_cycles * 100;
+ const double tx_idle_util = tx_idle_cycles / vals.clock_cycles * 100;
const double tx_data_header_util = tx_data_header_cycles / vals.clock_cycles * 100;
- const double tx_other_util = tx_other_cycles / vals.clock_cycles * 100;
+ const double tx_other_util = tx_other_cycles / vals.clock_cycles * 100;
std::cout << "TX utilization:" << std::endl;
std::cout << " data: " << tx_data_util << " %" << std::endl;
std::cout << " idle: " << tx_idle_util << " %" << std::endl;
std::cout << " data header: " << tx_data_header_util << " %" << std::endl;
- std::cout << " other: " << tx_other_util << " % (flow control, register I/O)" << std::endl;
+ std::cout << " other: " << tx_other_util << " % (flow control, register I/O)"
+ << std::endl;
}
-void print_rx_results(
- const test_results& results,
- double bus_clk_freq
-) {
- std::cout << "------------------------------------------------------------------" << std::endl;
- std::cout << "------------------- Benchmarking rx stream -----------------------" << std::endl;
- std::cout << "------------------------------------------------------------------" << std::endl;
+void print_rx_results(const test_results& results, double bus_clk_freq)
+{
+ std::cout << "------------------------------------------------------------------"
+ << std::endl;
+ std::cout << "------------------- Benchmarking rx stream -----------------------"
+ << std::endl;
+ std::cout << "------------------------------------------------------------------"
+ << std::endl;
std::cout << "RX samples per packet: " << results.host.spp << std::endl;
std::cout << std::endl;
for (const auto& tc : results.traffic_counter) {
- std::cout << "------------------ Traffic counter values ------------------------" << std::endl;
+ std::cout << "------------------ Traffic counter values ------------------------"
+ << std::endl;
print_traffic_counters(tc);
std::cout << std::endl;
- std::cout << "------------ Values calculated from traffic counters -------------" << std::endl;
+ std::cout << "------------ Values calculated from traffic counters -------------"
+ << std::endl;
print_rx_statistics(tc, bus_clk_freq);
std::cout << std::endl;
print_utilization_statistics(tc);
std::cout << std::endl;
}
- std::cout << "--------------------- Host measurements --------------------------" << std::endl;
+ std::cout << "--------------------- Host measurements --------------------------"
+ << std::endl;
std::cout << "Time elapsed: " << results.host.seconds << " s" << std::endl;
std::cout << "Samples read: " << results.host.num_samples << std::endl;
std::cout << "Data packets read: " << results.host.num_packets << std::endl;
- std::cout << "Calculated throughput: " << results.host.num_samples / results.host.seconds / 1e6 << " Msps" << std::endl;
+ std::cout << "Calculated throughput: "
+ << results.host.num_samples / results.host.seconds / 1e6 << " Msps"
+ << std::endl;
}
-void print_tx_results(
- const test_results& results,
- const double bus_clk_freq
-) {
- std::cout << "------------------------------------------------------------------" << std::endl;
- std::cout << "------------------- Benchmarking tx stream -----------------------" << std::endl;
- std::cout << "------------------------------------------------------------------" << std::endl;
+void print_tx_results(const test_results& results, const double bus_clk_freq)
+{
+ std::cout << "------------------------------------------------------------------"
+ << std::endl;
+ std::cout << "------------------- Benchmarking tx stream -----------------------"
+ << std::endl;
+ std::cout << "------------------------------------------------------------------"
+ << std::endl;
std::cout << "TX samples per packet: " << results.host.spp << std::endl;
std::cout << std::endl;
for (const auto& tc : results.traffic_counter) {
- std::cout << "------------------ Traffic counter values ------------------------" << std::endl;
+ std::cout << "------------------ Traffic counter values ------------------------"
+ << std::endl;
print_traffic_counters(tc);
std::cout << std::endl;
- std::cout << "------------ Values calculated from traffic counters -------------" << std::endl;
+ std::cout << "------------ Values calculated from traffic counters -------------"
+ << std::endl;
print_tx_statistics(tc, bus_clk_freq);
std::cout << std::endl;
print_utilization_statistics(tc);
std::cout << std::endl;
}
- std::cout << "--------------------- Host measurements --------------------------" << std::endl;
+ std::cout << "--------------------- Host measurements --------------------------"
+ << std::endl;
std::cout << "Time elapsed: " << results.host.seconds << " s" << std::endl;
std::cout << "Samples written: " << results.host.num_samples << std::endl;
std::cout << "Data packets written: " << results.host.num_packets << std::endl;
- std::cout << "Calculated throughput: " << results.host.num_samples / results.host.seconds / 1e6 << " Msps" << std::endl;
+ std::cout << "Calculated throughput: "
+ << results.host.num_samples / results.host.seconds / 1e6 << " Msps"
+ << std::endl;
}
-void configure_ddc(
- uhd::device3::sptr usrp,
- const std::string& ddcid,
- double ddc_decim
-) {
+void configure_ddc(uhd::device3::sptr usrp, const std::string& ddcid, double ddc_decim)
+{
auto ddc_ctrl = usrp->get_block_ctrl<uhd::rfnoc::ddc_block_ctrl>(ddcid);
ddc_ctrl->set_arg<double>("input_rate", 1, 0);
- ddc_ctrl->set_arg<double>("output_rate", 1/ddc_decim, 0);
+ ddc_ctrl->set_arg<double>("output_rate", 1 / ddc_decim, 0);
double actual_rate = ddc_ctrl->get_arg<double>("output_rate", 0);
- std::cout << "Actual DDC decimation: " << 1/actual_rate << std::endl;
+ std::cout << "Actual DDC decimation: " << 1 / actual_rate << std::endl;
}
-void configure_duc(
- uhd::device3::sptr usrp,
- const std::string& ducid,
- double duc_interp
-) {
+void configure_duc(uhd::device3::sptr usrp, const std::string& ducid, double duc_interp)
+{
auto duc_ctrl = usrp->get_block_ctrl<uhd::rfnoc::duc_block_ctrl>(ducid);
duc_ctrl->set_arg<double>("output_rate", 1, 0);
- duc_ctrl->set_arg<double>("input_rate", 1/duc_interp, 0);
+ duc_ctrl->set_arg<double>("input_rate", 1 / duc_interp, 0);
double actual_rate = duc_ctrl->get_arg<double>("input_rate", 0);
- std::cout << "Actual DUC interpolation: " << 1/actual_rate << std::endl;
+ std::cout << "Actual DUC interpolation: " << 1 / actual_rate << std::endl;
}
-uhd::rx_streamer::sptr configure_rx_streamer(
- uhd::device3::sptr usrp,
+uhd::rx_streamer::sptr configure_rx_streamer(uhd::device3::sptr usrp,
const std::string null_id,
const std::string splitter_id,
const std::vector<std::vector<noc_block_endpoint>>& noc_blocks,
const size_t spp,
- const std::string& format
-) {
+ const std::string& format)
+{
std::cout << "Configuring rx stream with" << std::endl;
std::cout << " Null ID: " << null_id << std::endl;
if (not splitter_id.empty()) {
@@ -289,8 +315,8 @@ uhd::rx_streamer::sptr configure_rx_streamer(
if (noc_blocks[i].size() > 0) {
std::cout << " Channel " << i << std::endl;
for (const auto& b : noc_blocks[i]) {
- std::cout << " Block ID: " << b.block_id
- << ", port: " << b.port << std::endl;
+ std::cout << " Block ID: " << b.block_id << ", port: " << b.port
+ << std::endl;
}
}
}
@@ -308,8 +334,7 @@ uhd::rx_streamer::sptr configure_rx_streamer(
if (noc_blocks.size() == 1) {
// No splitter required
endpoints = {{null_id, 0}};
- }
- else {
+ } else {
// Connect to splitter
rx_graph->connect(null_id, splitter_id);
@@ -326,12 +351,9 @@ uhd::rx_streamer::sptr configure_rx_streamer(
const auto& noc_block = noc_blocks[i][j];
rx_graph->connect(
- endpoint_id,
- endpoint_port,
- noc_block.block_id,
- noc_block.port);
+ endpoint_id, endpoint_port, noc_block.block_id, noc_block.port);
- endpoint_id = noc_block.block_id;
+ endpoint_id = noc_block.block_id;
endpoint_port = noc_block.port;
}
@@ -348,32 +370,32 @@ uhd::rx_streamer::sptr configure_rx_streamer(
// Configure null source
auto null_ctrl = usrp->get_block_ctrl<uhd::rfnoc::null_block_ctrl>(null_id);
- const size_t otw_bytes_per_item = uhd::convert::get_bytes_per_item(stream_args.otw_format);
+ const size_t otw_bytes_per_item =
+ uhd::convert::get_bytes_per_item(stream_args.otw_format);
const size_t samps_per_packet = rx_stream->get_max_num_samps();
null_ctrl->set_arg<int>("line_rate", 0);
- null_ctrl->set_arg<int>("bpp", samps_per_packet*otw_bytes_per_item);
+ null_ctrl->set_arg<int>("bpp", samps_per_packet * otw_bytes_per_item);
return rx_stream;
}
-test_results benchmark_rx_streamer(
- uhd::device3::sptr usrp,
+test_results benchmark_rx_streamer(uhd::device3::sptr usrp,
uhd::rx_streamer::sptr rx_stream,
const std::string& nullid,
const double duration,
- const std::string& format
-) {
+ const std::string& format)
+{
auto null_src_ctrl = usrp->get_block_ctrl<uhd::rfnoc::null_block_ctrl>(nullid);
// Allocate buffer
const size_t cpu_bytes_per_item = uhd::convert::get_bytes_per_item(format);
- const size_t samps_per_packet = rx_stream->get_max_num_samps();
+ const size_t samps_per_packet = rx_stream->get_max_num_samps();
const size_t num_channels = rx_stream->get_num_channels();
std::vector<std::vector<uint8_t>> buffer(num_channels);
- std::vector<void *> buffers;
+ std::vector<void*> buffers;
for (size_t i = 0; i < num_channels; i++) {
- buffer[i].resize(samps_per_packet*cpu_bytes_per_item);
+ buffer[i].resize(samps_per_packet * cpu_bytes_per_item);
buffers.push_back(&buffer[i].front());
}
@@ -387,29 +409,27 @@ test_results benchmark_rx_streamer(
const std::chrono::duration<double> requested_duration(duration);
const auto start_time = std::chrono::steady_clock::now();
- auto current_time = start_time;
+ auto current_time = start_time;
- uint64_t num_rx_samps = 0;
+ uint64_t num_rx_samps = 0;
uint64_t num_rx_packets = 0;
uhd::rx_metadata_t md;
while (current_time - start_time < requested_duration) {
const size_t packets_per_iteration = 1000;
- for (size_t i = 0; i < packets_per_iteration; i++){
+ for (size_t i = 0; i < packets_per_iteration; i++) {
num_rx_samps += rx_stream->recv(buffers, samps_per_packet, md, 1.0);
if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW) {
continue;
- }
- else if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_TIMEOUT) {
+ } else if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_TIMEOUT) {
std::cout << "[ERROR] Receive timeout, aborting." << std::endl;
break;
- }
- else {
- std::cout << std::string("[ERROR] Receiver error: ")
- << md.strerror() << std::endl;
+ } else {
+ std::cout << std::string("[ERROR] Receiver error: ") << md.strerror()
+ << std::endl;
break;
}
}
@@ -424,31 +444,29 @@ test_results benchmark_rx_streamer(
null_src_ctrl->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
test_results results;
- results.traffic_counter.push_back(
- read_traffic_counters(
- usrp->get_tree(), null_src_ctrl->get_block_id().get_tree_root()));
+ results.traffic_counter.push_back(read_traffic_counters(
+ usrp->get_tree(), null_src_ctrl->get_block_id().get_tree_root()));
- const std::chrono::duration<double> elapsed_time(current_time-start_time);
- results.host.seconds = elapsed_time.count();
+ const std::chrono::duration<double> elapsed_time(current_time - start_time);
+ results.host.seconds = elapsed_time.count();
results.host.num_samples = num_rx_samps;
results.host.num_packets = num_rx_packets;
- results.host.spp = samps_per_packet;
+ results.host.spp = samps_per_packet;
return results;
}
-uhd::tx_streamer::sptr configure_tx_streamer(
- uhd::device3::sptr usrp,
+uhd::tx_streamer::sptr configure_tx_streamer(uhd::device3::sptr usrp,
const std::vector<std::vector<noc_block_endpoint>> noc_blocks,
const size_t spp,
- const std::string& format
-) {
+ const std::string& format)
+{
std::cout << "Configuring tx stream with" << std::endl;
for (size_t i = 0; i < noc_blocks.size(); i++) {
std::cout << " Channel " << i << std::endl;
for (const auto& b : noc_blocks[i]) {
- std::cout << " Block ID: " << b.block_id
- << ", port: " << b.port << std::endl;
+ std::cout << " Block ID: " << b.block_id << ", port: " << b.port
+ << std::endl;
}
}
@@ -470,12 +488,9 @@ uhd::tx_streamer::sptr configure_tx_streamer(
if (j != 0) {
tx_graph->connect(
- noc_block.block_id,
- noc_block.port,
- endpoint_id,
- endpoint_port);
+ noc_block.block_id, noc_block.port, endpoint_id, endpoint_port);
}
- endpoint_id = noc_block.block_id;
+ endpoint_id = noc_block.block_id;
endpoint_port = noc_block.port;
}
@@ -494,28 +509,26 @@ uhd::tx_streamer::sptr configure_tx_streamer(
return tx_stream;
}
-test_results benchmark_tx_streamer(
- uhd::device3::sptr usrp,
+test_results benchmark_tx_streamer(uhd::device3::sptr usrp,
uhd::tx_streamer::sptr tx_stream,
const std::vector<std::string>& null_ids,
const double duration,
- const std::string& format
-) {
+ const std::string& format)
+{
std::vector<boost::shared_ptr<uhd::rfnoc::null_block_ctrl>> null_ctrls;
for (const auto& id : null_ids) {
- null_ctrls.push_back(
- usrp->get_block_ctrl<uhd::rfnoc::null_block_ctrl>(id));
+ null_ctrls.push_back(usrp->get_block_ctrl<uhd::rfnoc::null_block_ctrl>(id));
}
// Allocate buffer
const size_t cpu_bytes_per_item = uhd::convert::get_bytes_per_item(format);
- const size_t samps_per_packet = tx_stream->get_max_num_samps();
+ const size_t samps_per_packet = tx_stream->get_max_num_samps();
const size_t num_channels = tx_stream->get_num_channels();
std::vector<std::vector<uint8_t>> buffer(num_channels);
- std::vector<void *> buffers;
+ std::vector<void*> buffers;
for (size_t i = 0; i < num_channels; i++) {
- buffer[i].resize(samps_per_packet*cpu_bytes_per_item);
+ buffer[i].resize(samps_per_packet * cpu_bytes_per_item);
buffers.push_back(&buffer[i].front());
}
@@ -525,18 +538,18 @@ test_results benchmark_tx_streamer(
}
// Stream some packets
- uint64_t num_tx_samps = 0;
+ uint64_t num_tx_samps = 0;
uint64_t num_tx_packets = 0;
uhd::tx_metadata_t md;
const std::chrono::duration<double> requested_duration(duration);
const auto start_time = std::chrono::steady_clock::now();
- auto current_time = start_time;
+ auto current_time = start_time;
while (current_time - start_time < requested_duration) {
const size_t packets_per_iteration = 1000;
- for (size_t i = 0; i < packets_per_iteration; i++){
+ for (size_t i = 0; i < packets_per_iteration; i++) {
num_tx_samps += tx_stream->send(buffers, samps_per_packet, md);
}
@@ -555,23 +568,21 @@ test_results benchmark_tx_streamer(
test_results results;
for (auto& null_ctrl : null_ctrls) {
- results.traffic_counter.push_back(
- read_traffic_counters(
- usrp->get_tree(), null_ctrl->get_block_id().get_tree_root()));
+ results.traffic_counter.push_back(read_traffic_counters(
+ usrp->get_tree(), null_ctrl->get_block_id().get_tree_root()));
}
- const std::chrono::duration<double> elapsed_time(current_time-start_time);
- results.host.seconds = elapsed_time.count();
+ const std::chrono::duration<double> elapsed_time(current_time - start_time);
+ results.host.seconds = elapsed_time.count();
results.host.num_samples = num_tx_samps;
results.host.num_packets = num_tx_packets;
- results.host.spp = samps_per_packet;
+ results.host.spp = samps_per_packet;
return results;
}
-std::vector<std::string> parse_csv(
- const std::string& list
-) {
+std::vector<std::string> parse_csv(const std::string& list)
+{
std::vector<std::string> result;
std::istringstream input(list);
@@ -585,31 +596,29 @@ std::vector<std::string> parse_csv(
return result;
}
-std::deque<noc_block_endpoint> create_noc_block_queue(
- const size_t num_blocks,
+std::deque<noc_block_endpoint> create_noc_block_queue(const size_t num_blocks,
const std::string& user_override_id_list,
const std::string& prefix,
- const size_t num_ports
-) {
+ const size_t num_ports)
+{
const std::vector<std::string> overrides = parse_csv(user_override_id_list);
std::deque<noc_block_endpoint> result;
for (size_t i = 0; i < num_blocks; i++) {
if (i < overrides.size()) {
result.push_back({overrides[i], (i % num_ports)});
- }
- else {
+ } else {
const std::string format_str = prefix + "_%d";
- noc_block_endpoint block = {
- str(boost::format(format_str) % (i/num_ports)),
- i % num_ports};
+ noc_block_endpoint block = {
+ str(boost::format(format_str) % (i / num_ports)), i % num_ports};
result.push_back(block);
}
}
return result;
}
-int UHD_SAFE_MAIN(int argc, char *argv[]) {
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
// Variables to be set by po
bool dma_fifo, ddc, duc, tx_loopback_fifo, rx_loopback_fifo;
std::string args, format;
@@ -656,52 +665,54 @@ int UHD_SAFE_MAIN(int argc, char *argv[]) {
if (vm.count("help") or (num_streamers == 0)) {
std::cout << boost::format("UHD - Benchmark Streamer") << std::endl;
- std::cout <<
- " Benchmark streamer connects a null sink/source to a streamer and\n"
- " measures maximum throughput. You can benchmark the operation of\n"
- " multiple streamers concurrently. Each streamer executes in a\n"
- " separate thread. The FPGA image on the device must contain a\n"
- " null source for each channel in the test.\n"
- " Benchmarks of common use-cases:\n"
- " Specify --num_tx_streamers=1 to test tx streamer.\n"
- " Specify --num_rx_streamers=1 to test rx streamer.\n"
- " Specify --num_tx_streamers=1 --num_tx_channels-2 to test tx\n"
- " streamer with two channels.\n"
- " Specify --num_rx_streamers=1 --num_rx_channels=2 to test rx\n"
- " rx streamer with two channels. This requires a split_stream\n"
- " RFNOC block.\n"
- " Specify --num_rx_streamers=1 --num_tx_streams=1 to test full\n"
- " duplex data transfer.\n"
- " Specify --num_rx_streamers=2 --num_rx_streams=2 to test full\n"
- " duplex data tranfser with two streamers in each direction.\n"
- " Benchmarks streamer allows DMA FIFOs, loopback FIFOs, DDCs, and\n"
- " DUCs to be added to the data path. Enable these by setting the\n"
- " corresponding Boolean option to true. The order of the blocks\n"
- " is fixed. If present, the DMA FIFO is connected to the host bus\n"
- " interface, followed by the loopback FIFOs, and then DUC on a tx\n"
- " stream or a DDC on an rx stream.\n"
- " Note: for full duplex tests, if a DMA FIFO is specified, it is\n"
- " inserted in the tx data path only.\n"
- " Testing multiple rx channels in a single streamer requires a\n"
- " split stream RFNOC block with the number of outputs equal to the\n"
- " number of channels. Each streamer connects to a single null\n"
- " source through the split stream block.\n"
- " In order to allow testing of blocks with different compilation\n"
- " parameters, such as the block FIFO size, this example provides\n"
- " options to override RFNOC block IDs. Block IDs can be specified\n"
- " as a comma-delimited list for each type of block. If the block\n"
- " type is used in both tx and rx streams, block IDs are assigned\n"
- " to tx streams first, followed by rx streams. For example, a test\n"
- " with two tx and two rx streams will assign the first two IDs in\n"
- " the null_ids list to the tx streams and the next two IDs to the\n"
- " rx streams.\n"
- << std::endl << desc << std::endl;
+ std::cout
+ << " Benchmark streamer connects a null sink/source to a streamer and\n"
+ " measures maximum throughput. You can benchmark the operation of\n"
+ " multiple streamers concurrently. Each streamer executes in a\n"
+ " separate thread. The FPGA image on the device must contain a\n"
+ " null source for each channel in the test.\n"
+ " Benchmarks of common use-cases:\n"
+ " Specify --num_tx_streamers=1 to test tx streamer.\n"
+ " Specify --num_rx_streamers=1 to test rx streamer.\n"
+ " Specify --num_tx_streamers=1 --num_tx_channels-2 to test tx\n"
+ " streamer with two channels.\n"
+ " Specify --num_rx_streamers=1 --num_rx_channels=2 to test rx\n"
+ " rx streamer with two channels. This requires a split_stream\n"
+ " RFNOC block.\n"
+ " Specify --num_rx_streamers=1 --num_tx_streams=1 to test full\n"
+ " duplex data transfer.\n"
+ " Specify --num_rx_streamers=2 --num_rx_streams=2 to test full\n"
+ " duplex data tranfser with two streamers in each direction.\n"
+ " Benchmarks streamer allows DMA FIFOs, loopback FIFOs, DDCs, and\n"
+ " DUCs to be added to the data path. Enable these by setting the\n"
+ " corresponding Boolean option to true. The order of the blocks\n"
+ " is fixed. If present, the DMA FIFO is connected to the host bus\n"
+ " interface, followed by the loopback FIFOs, and then DUC on a tx\n"
+ " stream or a DDC on an rx stream.\n"
+ " Note: for full duplex tests, if a DMA FIFO is specified, it is\n"
+ " inserted in the tx data path only.\n"
+ " Testing multiple rx channels in a single streamer requires a\n"
+ " split stream RFNOC block with the number of outputs equal to the\n"
+ " number of channels. Each streamer connects to a single null\n"
+ " source through the split stream block.\n"
+ " In order to allow testing of blocks with different compilation\n"
+ " parameters, such as the block FIFO size, this example provides\n"
+ " options to override RFNOC block IDs. Block IDs can be specified\n"
+ " as a comma-delimited list for each type of block. If the block\n"
+ " type is used in both tx and rx streams, block IDs are assigned\n"
+ " to tx streams first, followed by rx streams. For example, a test\n"
+ " with two tx and two rx streams will assign the first two IDs in\n"
+ " the null_ids list to the tx streams and the next two IDs to the\n"
+ " rx streams.\n"
+ << std::endl
+ << desc << std::endl;
return EXIT_SUCCESS;
}
uhd::set_thread_priority_safe();
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::device3::sptr usrp = uhd::device3::make(args);
// For each block type, calculate the number of blocks needed by the test
@@ -722,38 +733,37 @@ int UHD_SAFE_MAIN(int argc, char *argv[]) {
const size_t num_splitter_blocks = num_rx_channels > 1 ? num_rx_streamers : 0;
size_t num_dma_fifo_blocks = 0;
- bool tx_dma_fifo = false;
- bool rx_dma_fifo = false;
+ bool tx_dma_fifo = false;
+ bool rx_dma_fifo = false;
if (dma_fifo) {
if (total_tx_channels == 0) {
num_dma_fifo_blocks = total_rx_channels;
- rx_dma_fifo = true;
- }
- else {
+ rx_dma_fifo = true;
+ } else {
num_dma_fifo_blocks = total_tx_channels;
- tx_dma_fifo = true;
+ tx_dma_fifo = true;
}
}
// Create block IDs
- std::deque<noc_block_endpoint> null_blocks = create_noc_block_queue(
- num_null_blocks, null_ids, "0/NullSrcSink", 1);
+ std::deque<noc_block_endpoint> null_blocks =
+ create_noc_block_queue(num_null_blocks, null_ids, "0/NullSrcSink", 1);
- std::deque<noc_block_endpoint> duc_blocks = create_noc_block_queue(
- num_duc_blocks, duc_ids, "0/DUC", 1);
+ std::deque<noc_block_endpoint> duc_blocks =
+ create_noc_block_queue(num_duc_blocks, duc_ids, "0/DUC", 1);
- std::deque<noc_block_endpoint> ddc_blocks = create_noc_block_queue(
- num_ddc_blocks, ddc_ids, "0/DDC", 1);
+ std::deque<noc_block_endpoint> ddc_blocks =
+ create_noc_block_queue(num_ddc_blocks, ddc_ids, "0/DDC", 1);
- std::deque<noc_block_endpoint> fifo_blocks = create_noc_block_queue(
- num_fifo_blocks, fifo_ids, "0/FIFO", 1);
+ std::deque<noc_block_endpoint> fifo_blocks =
+ create_noc_block_queue(num_fifo_blocks, fifo_ids, "0/FIFO", 1);
- std::deque<noc_block_endpoint> dma_fifo_blocks = create_noc_block_queue(
- num_dma_fifo_blocks, "", "0/DmaFIFO", 2);
+ std::deque<noc_block_endpoint> dma_fifo_blocks =
+ create_noc_block_queue(num_dma_fifo_blocks, "", "0/DmaFIFO", 2);
- std::deque<noc_block_endpoint> splitter_blocks = create_noc_block_queue(
- num_splitter_blocks, split_stream_ids, "0/SplitStream", 1);
+ std::deque<noc_block_endpoint> splitter_blocks =
+ create_noc_block_queue(num_splitter_blocks, split_stream_ids, "0/SplitStream", 1);
// Configure all streamers
usrp->clear();
@@ -787,8 +797,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]) {
}
};
- tx_streamers.push_back(
- configure_tx_streamer(usrp, blocks, spp, format));
+ tx_streamers.push_back(configure_tx_streamer(usrp, blocks, spp, format));
tx_null_ids.push_back(null_ids);
}
@@ -821,14 +830,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[]) {
splitter_blocks.pop_front();
}
- rx_streamers.push_back(
- configure_rx_streamer(
- usrp,
- null_blocks.front().block_id,
- splitter_id,
- blocks,
- spp,
- format));
+ rx_streamers.push_back(configure_rx_streamer(
+ usrp, null_blocks.front().block_id, splitter_id, blocks, spp, format));
// Store the null ids to read traffic counters later
rx_null_ids.push_back(null_blocks.front().block_id);
@@ -839,38 +842,26 @@ int UHD_SAFE_MAIN(int argc, char *argv[]) {
std::vector<std::thread> threads;
std::vector<test_results> tx_results(num_tx_streamers);
for (size_t i = 0; i < num_tx_streamers; i++) {
- test_results& results = tx_results[i];
- uhd::tx_streamer::sptr streamer = tx_streamers[i];
+ test_results& results = tx_results[i];
+ uhd::tx_streamer::sptr streamer = tx_streamers[i];
std::vector<std::string> null_ids = tx_null_ids[i];
threads.push_back(
- std::thread(
- [&results, usrp, streamer, null_ids, duration, format]() {
- results = benchmark_tx_streamer(
- usrp,
- streamer,
- null_ids,
- duration,
- format);
- })
- );
+ std::thread([&results, usrp, streamer, null_ids, duration, format]() {
+ results =
+ benchmark_tx_streamer(usrp, streamer, null_ids, duration, format);
+ }));
}
std::vector<test_results> rx_results(num_rx_streamers);
for (size_t i = 0; i < num_rx_streamers; i++) {
- test_results& results = rx_results[i];
+ test_results& results = rx_results[i];
uhd::rx_streamer::sptr streamer = rx_streamers[i];
- std::string null_id = rx_null_ids[i];
+ std::string null_id = rx_null_ids[i];
threads.push_back(
- std::thread(
- [&results, usrp, streamer, null_id, duration, format]() {
- results = benchmark_rx_streamer(
- usrp,
- streamer,
- null_id,
- duration,
- format);
- })
- );
+ std::thread([&results, usrp, streamer, null_id, duration, format]() {
+ results =
+ benchmark_rx_streamer(usrp, streamer, null_id, duration, format);
+ }));
}
// Join threads
@@ -879,11 +870,11 @@ int UHD_SAFE_MAIN(int argc, char *argv[]) {
}
// Print results
- for (const test_results& result: tx_results) {
+ for (const test_results& result : tx_results) {
print_tx_results(result, bus_clk_freq);
}
- for (const test_results& result: rx_results) {
+ for (const test_results& result : rx_results) {
print_rx_results(result, bus_clk_freq);
}
diff --git a/host/examples/gpio.cpp b/host/examples/gpio.cpp
index 537da80ca..0ed8d01ef 100644
--- a/host/examples/gpio.cpp
+++ b/host/examples/gpio.cpp
@@ -63,29 +63,29 @@
// mask - a mask indicating which bits in the specified attribute register are
// to be changed (default is all bits).
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
-#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/convert.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/usrp/multi_usrp.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
+#include <stdint.h>
+#include <stdlib.h>
#include <boost/format.hpp>
+#include <boost/program_options.hpp>
+#include <chrono>
#include <csignal>
#include <iostream>
#include <thread>
-#include <chrono>
-#include <stdlib.h>
-#include <stdint.h>
-static const std::string GPIO_DEFAULT_CPU_FORMAT = "fc32";
-static const std::string GPIO_DEFAULT_OTW_FORMAT = "sc16";
-static const double GPIO_DEFAULT_RX_RATE = 500e3;
-static const double GPIO_DEFAULT_TX_RATE = 500e3;
-static const double GPIO_DEFAULT_DWELL_TIME = 2.0;
-static const std::string GPIO_DEFAULT_GPIO = "FP0";
-static const size_t GPIO_DEFAULT_NUM_BITS = 11;
-static const std::string GPIO_DEFAULT_CTRL = "0x0"; // all as user controlled
-static const std::string GPIO_DEFAULT_DDR = "0x0"; // all as inputs
-static const std::string GPIO_DEFAULT_OUT = "0x0";
+static const std::string GPIO_DEFAULT_CPU_FORMAT = "fc32";
+static const std::string GPIO_DEFAULT_OTW_FORMAT = "sc16";
+static const double GPIO_DEFAULT_RX_RATE = 500e3;
+static const double GPIO_DEFAULT_TX_RATE = 500e3;
+static const double GPIO_DEFAULT_DWELL_TIME = 2.0;
+static const std::string GPIO_DEFAULT_GPIO = "FP0";
+static const size_t GPIO_DEFAULT_NUM_BITS = 11;
+static const std::string GPIO_DEFAULT_CTRL = "0x0"; // all as user controlled
+static const std::string GPIO_DEFAULT_DDR = "0x0"; // all as inputs
+static const std::string GPIO_DEFAULT_OUT = "0x0";
static inline uint32_t GPIO_BIT(const size_t x)
{
@@ -95,13 +95,15 @@ static inline uint32_t GPIO_BIT(const size_t x)
namespace po = boost::program_options;
static bool stop_signal_called = false;
-void sig_int_handler(int){stop_signal_called = true;}
+void sig_int_handler(int)
+{
+ stop_signal_called = true;
+}
std::string to_bit_string(uint32_t val, const size_t num_bits)
{
std::string out;
- for (int i = num_bits - 1; i >= 0; i--)
- {
+ for (int i = num_bits - 1; i >= 0; i--) {
std::string bit = ((val >> i) & 1) ? "1" : "0";
out += " ";
out += bit;
@@ -109,39 +111,29 @@ std::string to_bit_string(uint32_t val, const size_t num_bits)
return out;
}
-void output_reg_values(
- const std::string bank,
- const uhd::usrp::multi_usrp::sptr &usrp,
- const size_t num_bits
-) {
+void output_reg_values(const std::string bank,
+ const uhd::usrp::multi_usrp::sptr& usrp,
+ const size_t num_bits)
+{
const std::vector<std::string> attrs = {
- "CTRL",
- "DDR",
- "ATR_0X",
- "ATR_RX",
- "ATR_TX",
- "ATR_XX",
- "OUT",
- "READBACK"
- };
+ "CTRL", "DDR", "ATR_0X", "ATR_RX", "ATR_TX", "ATR_XX", "OUT", "READBACK"};
std::cout << (boost::format("%10s ") % "Bit");
for (int i = num_bits - 1; i >= 0; i--)
std::cout << (boost::format(" %2d") % i);
std::cout << std::endl;
- for (const auto &attr : attrs) {
+ for (const auto& attr : attrs) {
const uint32_t gpio_bits = uint32_t(usrp->get_gpio_attr(bank, attr));
- std::cout
- << (boost::format("%10s:%s")
- % attr % to_bit_string(gpio_bits, num_bits))
- << std::endl;
+ std::cout << (boost::format("%10s:%s") % attr
+ % to_bit_string(gpio_bits, num_bits))
+ << std::endl;
}
}
-int UHD_SAFE_MAIN(int argc, char *argv[])
+int UHD_SAFE_MAIN(int argc, char* argv[])
{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args;
std::string cpu, otw;
double rx_rate, tx_rate, dwell;
@@ -151,7 +143,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
std::string ddr_str;
std::string out_str;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -174,80 +166,80 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("gpio %s") % desc << std::endl;
return ~0;
}
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //print out initial unconfigured state of FP GPIO
+ // print out initial unconfigured state of FP GPIO
std::cout << "Initial GPIO values:" << std::endl;
output_reg_values(gpio, usrp, num_bits);
- //configure GPIO registers
- uint32_t ddr = strtoul(ddr_str.c_str(), NULL, 0);
- uint32_t out = strtoul(out_str.c_str(), NULL, 0);
- uint32_t ctrl = 0;
- uint32_t atr_idle = 0;
- uint32_t atr_rx = 0;
- uint32_t atr_tx = 0;
+ // configure GPIO registers
+ uint32_t ddr = strtoul(ddr_str.c_str(), NULL, 0);
+ uint32_t out = strtoul(out_str.c_str(), NULL, 0);
+ uint32_t ctrl = 0;
+ uint32_t atr_idle = 0;
+ uint32_t atr_rx = 0;
+ uint32_t atr_tx = 0;
uint32_t atr_duplex = 0;
- uint32_t mask = (1 << num_bits) - 1;
+ uint32_t mask = (1 << num_bits) - 1;
- if (!vm.count("bitbang"))
- {
- //set up GPIO outputs:
- //GPIO[0] = ATR output 1 at idle
+ if (!vm.count("bitbang")) {
+ // set up GPIO outputs:
+ // GPIO[0] = ATR output 1 at idle
ctrl |= GPIO_BIT(0);
atr_idle |= GPIO_BIT(0);
ddr |= GPIO_BIT(0);
- //GPIO[1] = ATR output 1 during RX
+ // GPIO[1] = ATR output 1 during RX
ctrl |= GPIO_BIT(1);
ddr |= GPIO_BIT(1);
atr_rx |= GPIO_BIT(1);
- //GPIO[2] = ATR output 1 during TX
+ // GPIO[2] = ATR output 1 during TX
ctrl |= GPIO_BIT(2);
ddr |= GPIO_BIT(2);
atr_tx |= GPIO_BIT(2);
- //GPIO[3] = ATR output 1 during full duplex
+ // GPIO[3] = ATR output 1 during full duplex
ctrl |= GPIO_BIT(3);
ddr |= GPIO_BIT(3);
atr_duplex |= GPIO_BIT(3);
- //GPIO[4] = output
+ // GPIO[4] = output
ddr |= GPIO_BIT(4);
}
- //set data direction register (DDR)
+ // set data direction register (DDR)
usrp->set_gpio_attr(gpio, "DDR", ddr, mask);
- //set control register
+ // set control register
usrp->set_gpio_attr(gpio, "CTRL", ctrl, mask);
- //set output values (OUT)
+ // set output values (OUT)
usrp->set_gpio_attr(gpio, "OUT", out, mask);
- //set ATR registers
+ // set ATR registers
usrp->set_gpio_attr(gpio, "ATR_0X", atr_idle, mask);
usrp->set_gpio_attr(gpio, "ATR_RX", atr_rx, mask);
usrp->set_gpio_attr(gpio, "ATR_TX", atr_tx, mask);
usrp->set_gpio_attr(gpio, "ATR_XX", atr_duplex, mask);
- //print out initial state of FP GPIO
+ // print out initial state of FP GPIO
std::cout << "\nConfigured GPIO values:" << std::endl;
output_reg_values(gpio, usrp, num_bits);
std::cout << std::endl;
- //set up streams
+ // set up streams
uhd::stream_args_t rx_args(cpu, otw);
uhd::stream_args_t tx_args(cpu, otw);
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(rx_args);
@@ -257,20 +249,22 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
usrp->set_rx_rate(rx_rate);
usrp->set_tx_rate(tx_rate);
- //set up buffers for tx and rx
+ // set up buffers for tx and rx
const size_t max_samps_per_packet = rx_stream->get_max_num_samps();
- const size_t nsamps_per_buff = max_samps_per_packet;
- std::vector<char> rx_buff(max_samps_per_packet*uhd::convert::get_bytes_per_item(cpu));
- std::vector<char> tx_buff(max_samps_per_packet*uhd::convert::get_bytes_per_item(cpu));
- std::vector<void *> rx_buffs, tx_buffs;
+ const size_t nsamps_per_buff = max_samps_per_packet;
+ std::vector<char> rx_buff(
+ max_samps_per_packet * uhd::convert::get_bytes_per_item(cpu));
+ std::vector<char> tx_buff(
+ max_samps_per_packet * uhd::convert::get_bytes_per_item(cpu));
+ std::vector<void*> rx_buffs, tx_buffs;
for (size_t ch = 0; ch < rx_stream->get_num_channels(); ch++)
- rx_buffs.push_back(&rx_buff.front()); //same buffer for each channel
+ rx_buffs.push_back(&rx_buff.front()); // same buffer for each channel
for (size_t ch = 0; ch < tx_stream->get_num_channels(); ch++)
- tx_buffs.push_back(&tx_buff.front()); //same buffer for each channel
+ tx_buffs.push_back(&tx_buff.front()); // same buffer for each channel
uhd::rx_metadata_t rx_md;
uhd::tx_metadata_t tx_md;
- tx_md.has_time_spec = false;
+ tx_md.has_time_spec = false;
tx_md.start_of_burst = true;
uhd::time_spec_t stop_time;
double timeout = 0.01;
@@ -278,61 +272,54 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
int loop = 0;
uint32_t rb, expected;
- //register signal handler
+ // register signal handler
std::signal(SIGINT, &sig_int_handler);
- if (!vm.count("bitbang"))
- {
+ if (!vm.count("bitbang")) {
// Test the mask parameter of the multi_usrp::set_gpio_attr API
// We only need to test once with no dwell time
std::cout << "\nTesting mask..." << std::flush;
- //send a value of all 1's to the DDR with a mask for only upper most bit
+ // send a value of all 1's to the DDR with a mask for only upper most bit
usrp->set_gpio_attr(gpio, "DDR", ~0, GPIO_BIT(num_bits - 1));
- //upper most bit should now be 1, but all the other bits should be unchanged
- rb = usrp->get_gpio_attr(gpio, "DDR") & mask;
+ // upper most bit should now be 1, but all the other bits should be unchanged
+ rb = usrp->get_gpio_attr(gpio, "DDR") & mask;
expected = ddr | GPIO_BIT(num_bits - 1);
if (rb == expected)
std::cout << "pass:" << std::endl;
else
std::cout << "fail:" << std::endl;
output_reg_values(gpio, usrp, num_bits);
- //restore DDR value
+ // restore DDR value
usrp->set_gpio_attr(gpio, "DDR", ddr, mask);
}
- while (not stop_signal_called)
- {
+ while (not stop_signal_called) {
int failures = 0;
if (vm.count("repeat"))
std::cout << "Press Ctrl + C to quit..." << std::endl;
- if (vm.count("bitbang"))
- {
+ if (vm.count("bitbang")) {
// dwell and continuously read back GPIO values
stop_time = usrp->get_time_now() + dwell_time;
- while (not stop_signal_called and usrp->get_time_now() < stop_time)
- {
+ while (not stop_signal_called and usrp->get_time_now() < stop_time) {
rb = usrp->get_gpio_attr(gpio, "READBACK");
std::cout << "\rREADBACK: " << to_bit_string(rb, num_bits);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
std::cout << std::endl;
- }
- else
- {
+ } else {
// test user controlled GPIO and ATR idle by setting bit 4 high for 1 second
- std::cout << "\nTesting user controlled GPIO and ATR idle output..." << std::flush;
+ std::cout << "\nTesting user controlled GPIO and ATR idle output..."
+ << std::flush;
usrp->set_gpio_attr(gpio, "OUT", 1 << 4, 1 << 4);
stop_time = usrp->get_time_now() + dwell_time;
- while (not stop_signal_called and usrp->get_time_now() < stop_time)
- {
+ while (not stop_signal_called and usrp->get_time_now() < stop_time) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
- rb = usrp->get_gpio_attr(gpio, "READBACK");
+ rb = usrp->get_gpio_attr(gpio, "READBACK");
expected = GPIO_BIT(4) | GPIO_BIT(0);
- if ((rb & expected) != expected)
- {
+ if ((rb & expected) != expected) {
++failures;
std::cout << "fail:" << std::endl;
if ((rb & GPIO_BIT(0)) == 0)
@@ -352,16 +339,15 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
rx_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS;
rx_stream->issue_stream_cmd(rx_cmd);
stop_time = usrp->get_time_now() + dwell_time;
- while (not stop_signal_called and usrp->get_time_now() < stop_time)
- {
+ while (not stop_signal_called and usrp->get_time_now() < stop_time) {
try {
rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout);
- } catch(...){}
+ } catch (...) {
+ }
}
- rb = usrp->get_gpio_attr(gpio, "READBACK");
+ rb = usrp->get_gpio_attr(gpio, "READBACK");
expected = GPIO_BIT(1);
- if ((rb & expected) != expected)
- {
+ if ((rb & expected) != expected) {
++failures;
std::cout << "fail:" << std::endl;
std::cout << "Bit 1 should be set, but is not" << std::endl;
@@ -370,29 +356,29 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
}
output_reg_values(gpio, usrp, num_bits);
rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
- //clear out any data left in the rx stream
+ // clear out any data left in the rx stream
try {
rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout);
- } catch(...){}
+ } catch (...) {
+ }
if (stop_signal_called)
break;
// test ATR TX by transmitting for 1 second
std::cout << "\nTesting ATR TX output..." << std::flush;
- stop_time = usrp->get_time_now() + dwell_time;
+ stop_time = usrp->get_time_now() + dwell_time;
tx_md.start_of_burst = true;
- tx_md.end_of_burst = false;
- while (not stop_signal_called and usrp->get_time_now() < stop_time)
- {
+ tx_md.end_of_burst = false;
+ while (not stop_signal_called and usrp->get_time_now() < stop_time) {
try {
tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout);
tx_md.start_of_burst = false;
- } catch(...){}
+ } catch (...) {
+ }
}
- rb = usrp->get_gpio_attr(gpio, "READBACK");
+ rb = usrp->get_gpio_attr(gpio, "READBACK");
expected = GPIO_BIT(2);
- if ((rb & expected) != expected)
- {
+ if ((rb & expected) != expected) {
++failures;
std::cout << "fail:" << std::endl;
std::cout << "Bit 2 should be set, but is not" << std::endl;
@@ -403,7 +389,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
tx_md.end_of_burst = true;
try {
tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout);
- } catch(...){}
+ } catch (...) {
+ }
if (stop_signal_called)
break;
@@ -412,20 +399,19 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
rx_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS;
rx_stream->issue_stream_cmd(rx_cmd);
tx_md.start_of_burst = true;
- tx_md.end_of_burst = false;
- stop_time = usrp->get_time_now() + dwell_time;
- while (not stop_signal_called and usrp->get_time_now() < stop_time)
- {
+ tx_md.end_of_burst = false;
+ stop_time = usrp->get_time_now() + dwell_time;
+ while (not stop_signal_called and usrp->get_time_now() < stop_time) {
try {
tx_stream->send(rx_buffs, nsamps_per_buff, tx_md, timeout);
tx_md.start_of_burst = false;
rx_stream->recv(tx_buffs, nsamps_per_buff, rx_md, timeout);
- } catch(...){}
+ } catch (...) {
+ }
}
- rb = usrp->get_gpio_attr(gpio, "READBACK");
+ rb = usrp->get_gpio_attr(gpio, "READBACK");
expected = GPIO_BIT(3);
- if ((rb & expected) != expected)
- {
+ if ((rb & expected) != expected) {
++failures;
std::cout << "fail:" << std::endl;
std::cout << "Bit 3 should be set, but is not" << std::endl;
@@ -437,11 +423,13 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
tx_md.end_of_burst = true;
try {
tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout);
- } catch(...){}
- //clear out any data left in the rx stream
+ } catch (...) {
+ }
+ // clear out any data left in the rx stream
try {
rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout);
- } catch(...){}
+ } catch (...) {
+ }
std::cout << std::endl;
if (failures)
@@ -454,10 +442,10 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
break;
if (not stop_signal_called)
- std::cout << (boost::format("\nLoop %d completed") % ++loop) << std::endl;
+ std::cout << (boost::format("\nLoop %d completed") % ++loop) << std::endl;
}
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/init_usrp/init_usrp.cpp b/host/examples/init_usrp/init_usrp.cpp
index 302db355b..62515b538 100644
--- a/host/examples/init_usrp/init_usrp.cpp
+++ b/host/examples/init_usrp/init_usrp.cpp
@@ -10,40 +10,42 @@
// The program itself only initializes a USRP. For more elaborate examples,
// have a look at the files in host/examples/.
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
+#include <boost/program_options.hpp>
#include <iostream>
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
- desc.add_options()
- ("help", "help message")
- ("args", po::value<std::string>(&args)->default_value(""), "multi uhd device address args")
- ;
+ desc.add_options()("help", "help message")("args",
+ po::value<std::string>(&args)->default_value(""),
+ "multi uhd device address args");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
- std::cout << boost::format("Mini-example to initialize a USRP (args==%s).") % args << std::endl;
+ // print the help message
+ if (vm.count("help")) {
+ std::cout << boost::format("Mini-example to initialize a USRP (args==%s).") % args
+ << std::endl;
return ~0;
}
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
return EXIT_SUCCESS;
diff --git a/host/examples/latency_test.cpp b/host/examples/latency_test.cpp
index 9a173b8a4..798279310 100644
--- a/host/examples/latency_test.cpp
+++ b/host/examples/latency_test.cpp
@@ -5,27 +5,28 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
-#include <iostream>
+#include <boost/program_options.hpp>
#include <complex>
+#include <iostream>
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args;
size_t nsamps;
double rate;
double rtt;
size_t nruns;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -42,90 +43,82 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD - Latency Test %s") % desc << std::endl;
- std::cout <<
- " Latency test receives a packet at time t,\n"
- " and tries to send a packet at time t + rtt,\n"
- " where rtt is the round trip time sample time\n"
- " from device to host and back to the device.\n"
- " This can be used to test latency between UHD and the device.\n"
- " If the value rtt is chosen too small, the transmit packet will.\n"
- " arrive too late at the device indicate an error.\n"
- " The smallest value of rtt that does not indicate an error is an\n"
- " approximation for the time it takes for a sample packet to\n"
- " go to UHD and back to the device."
- << std::endl;
+ std::cout
+ << " Latency test receives a packet at time t,\n"
+ " and tries to send a packet at time t + rtt,\n"
+ " where rtt is the round trip time sample time\n"
+ " from device to host and back to the device.\n"
+ " This can be used to test latency between UHD and the device.\n"
+ " If the value rtt is chosen too small, the transmit packet will.\n"
+ " arrive too late at the device indicate an error.\n"
+ " The smallest value of rtt that does not indicate an error is an\n"
+ " approximation for the time it takes for a sample packet to\n"
+ " go to UHD and back to the device."
+ << std::endl;
return EXIT_SUCCESS;
}
bool verbose = vm.count("verbose") != 0;
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- //std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ // std::cout << boost::format("Creating the usrp device with: %s...") % args <<
+ // std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
- //std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
+ // std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() <<
+ // std::endl;
usrp->set_time_now(uhd::time_spec_t(0.0));
- //set the tx sample rate
+ // set the tx sample rate
usrp->set_tx_rate(rate);
- std::cout
- << boost::format("Actual TX Rate: %f Msps...")
- % (usrp->get_tx_rate()/1e6)
- << std::endl;
+ std::cout << boost::format("Actual TX Rate: %f Msps...") % (usrp->get_tx_rate() / 1e6)
+ << std::endl;
- //set the rx sample rate
+ // set the rx sample rate
usrp->set_rx_rate(rate);
- std::cout
- << boost::format("Actual RX Rate: %f Msps...")
- % (usrp->get_rx_rate()/1e6)
- << std::endl;
+ std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp->get_rx_rate() / 1e6)
+ << std::endl;
- //allocate a buffer to use
- std::vector<std::complex<float> > buffer(nsamps);
+ // allocate a buffer to use
+ std::vector<std::complex<float>> buffer(nsamps);
- //create RX and TX streamers
- uhd::stream_args_t stream_args("fc32"); //complex floats
+ // create RX and TX streamers
+ uhd::stream_args_t stream_args("fc32"); // complex floats
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(stream_args);
- //initialize result counts
+ // initialize result counts
int time_error = 0;
- int ack = 0;
- int underflow = 0;
- int other = 0;
-
- for(size_t nrun = 0; nrun < nruns; nrun++){
+ int ack = 0;
+ int underflow = 0;
+ int other = 0;
+ for (size_t nrun = 0; nrun < nruns; nrun++) {
/***************************************************************
* Issue a stream command some time in the near future
**************************************************************/
uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
- stream_cmd.num_samps = buffer.size();
+ stream_cmd.num_samps = buffer.size();
stream_cmd.stream_now = false;
- stream_cmd.time_spec = usrp->get_time_now() + uhd::time_spec_t(0.01);
+ stream_cmd.time_spec = usrp->get_time_now() + uhd::time_spec_t(0.01);
rx_stream->issue_stream_cmd(stream_cmd);
/***************************************************************
* Receive the requested packet
**************************************************************/
uhd::rx_metadata_t rx_md;
- size_t num_rx_samps = rx_stream->recv(
- &buffer.front(), buffer.size(), rx_md
- );
+ size_t num_rx_samps = rx_stream->recv(&buffer.front(), buffer.size(), rx_md);
if (verbose) {
std::cout << boost::format(
- "Run %d: Got packet: %u samples, %u full secs, %f frac secs"
- )
- % nrun
- % num_rx_samps
- % rx_md.time_spec.get_full_secs()
- % rx_md.time_spec.get_frac_secs()
- << std::endl;
+ "Run %d: Got packet: %u samples, %u full secs, %f frac secs")
+ % nrun % num_rx_samps % rx_md.time_spec.get_full_secs()
+ % rx_md.time_spec.get_frac_secs()
+ << std::endl;
} else {
std::cout << "." << std::flush;
}
@@ -135,45 +128,43 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
**************************************************************/
uhd::tx_metadata_t tx_md;
tx_md.start_of_burst = true;
- tx_md.end_of_burst = true;
- tx_md.has_time_spec = true;
- tx_md.time_spec = rx_md.time_spec + uhd::time_spec_t(rtt);
- size_t num_tx_samps = tx_stream->send(
- &buffer.front(), buffer.size(), tx_md
- );
+ tx_md.end_of_burst = true;
+ tx_md.has_time_spec = true;
+ tx_md.time_spec = rx_md.time_spec + uhd::time_spec_t(rtt);
+ size_t num_tx_samps = tx_stream->send(&buffer.front(), buffer.size(), tx_md);
if (verbose) {
- std::cout
- << boost::format("Sent %d samples") % num_tx_samps
- << std::endl;
+ std::cout << boost::format("Sent %d samples") % num_tx_samps << std::endl;
}
/***************************************************************
* Check the async messages for result
**************************************************************/
uhd::async_metadata_t async_md;
- if (not tx_stream->recv_async_msg(async_md)){
- std::cout << boost::format("failed:\n Async message recv timed out.\n") << std::endl;
+ if (not tx_stream->recv_async_msg(async_md)) {
+ std::cout << boost::format("failed:\n Async message recv timed out.\n")
+ << std::endl;
continue;
}
- switch(async_md.event_code){
- case uhd::async_metadata_t::EVENT_CODE_TIME_ERROR:
- time_error++;
- break;
-
- case uhd::async_metadata_t::EVENT_CODE_BURST_ACK:
- ack++;
- break;
-
- case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW:
- underflow++;
- break;
-
- default:
- std::cerr << boost::format(
- "failed:\n Got unexpected event code 0x%x.\n"
- ) % async_md.event_code << std::endl;
- other++;
- break;
+ switch (async_md.event_code) {
+ case uhd::async_metadata_t::EVENT_CODE_TIME_ERROR:
+ time_error++;
+ break;
+
+ case uhd::async_metadata_t::EVENT_CODE_BURST_ACK:
+ ack++;
+ break;
+
+ case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW:
+ underflow++;
+ break;
+
+ default:
+ std::cerr << boost::format(
+ "failed:\n Got unexpected event code 0x%x.\n")
+ % async_md.event_code
+ << std::endl;
+ other++;
+ break;
}
}
@@ -182,25 +173,26 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
if (not tx_stream->recv_async_msg(async_md)) {
break;
}
- switch(async_md.event_code){
- case uhd::async_metadata_t::EVENT_CODE_TIME_ERROR:
- time_error++;
- break;
-
- case uhd::async_metadata_t::EVENT_CODE_BURST_ACK:
- ack++;
- break;
-
- case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW:
- underflow++;
- break;
-
- default:
- std::cerr << boost::format(
- "failed:\n Got unexpected event code 0x%x.\n"
- ) % async_md.event_code << std::endl;
- other++;
- break;
+ switch (async_md.event_code) {
+ case uhd::async_metadata_t::EVENT_CODE_TIME_ERROR:
+ time_error++;
+ break;
+
+ case uhd::async_metadata_t::EVENT_CODE_BURST_ACK:
+ ack++;
+ break;
+
+ case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW:
+ underflow++;
+ break;
+
+ default:
+ std::cerr << boost::format(
+ "failed:\n Got unexpected event code 0x%x.\n")
+ % async_md.event_code
+ << std::endl;
+ other++;
+ break;
}
}
if (!verbose) {
@@ -213,7 +205,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
std::cout << "Summary\n"
<< "================\n"
<< "Number of runs: " << nruns << std::endl
- << "RTT value tested: " << (rtt*1e3) << " ms" << std::endl
+ << "RTT value tested: " << (rtt * 1e3) << " ms" << std::endl
<< "ACKs received: " << ack << "/" << nruns << std::endl
<< "Underruns: " << underflow << std::endl
<< "Late packets: " << time_error << std::endl
diff --git a/host/examples/network_relay.cpp b/host/examples/network_relay.cpp
index 3f4a1d711..464d2084d 100644
--- a/host/examples/network_relay.cpp
+++ b/host/examples/network_relay.cpp
@@ -5,21 +5,21 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
+#include <boost/asio.hpp>
+#include <boost/format.hpp>
#include <boost/program_options.hpp>
#include <boost/thread/condition_variable.hpp>
#include <boost/thread/thread.hpp>
-#include <boost/format.hpp>
-#include <boost/asio.hpp>
-#include <iostream>
+#include <chrono>
#include <csignal>
-#include <vector>
#include <cstdlib>
-#include <chrono>
+#include <iostream>
#include <thread>
+#include <vector>
-namespace po = boost::program_options;
+namespace po = boost::program_options;
namespace asio = boost::asio;
typedef boost::shared_ptr<asio::ip::udp::socket> socket_type;
@@ -27,11 +27,11 @@ typedef boost::shared_ptr<asio::ip::udp::socket> socket_type;
static const size_t insane_mtu = 9000;
#if defined(UHD_PLATFORM_MACOS)
- //limit buffer resize on macos or it will error
- const size_t rx_dsp_buff_size = size_t(1e6);
+// limit buffer resize on macos or it will error
+const size_t rx_dsp_buff_size = size_t(1e6);
#else
- //set to half-a-second of buffering at max rate
- const size_t rx_dsp_buff_size = size_t(50e6);
+// set to half-a-second of buffering at max rate
+const size_t rx_dsp_buff_size = size_t(50e6);
#endif
const size_t tx_dsp_buff_size = (1 << 20);
@@ -40,43 +40,49 @@ const size_t tx_dsp_buff_size = (1 << 20);
* Signal handlers
**********************************************************************/
static bool stop_signal_called = false;
-void sig_int_handler(int){stop_signal_called = true;}
+void sig_int_handler(int)
+{
+ stop_signal_called = true;
+}
-static bool wait_for_recv_ready(int sock_fd){
- //setup timeval for timeout
+static bool wait_for_recv_ready(int sock_fd)
+{
+ // setup timeval for timeout
timeval tv;
- tv.tv_sec = 0;
- tv.tv_usec = 100000; //100ms
+ tv.tv_sec = 0;
+ tv.tv_usec = 100000; // 100ms
- //setup rset for timeout
+ // setup rset for timeout
fd_set rset;
FD_ZERO(&rset);
FD_SET(sock_fd, &rset);
- //call select with timeout on receive socket
- return ::select(sock_fd+1, &rset, NULL, NULL, &tv) > 0;
+ // call select with timeout on receive socket
+ return ::select(sock_fd + 1, &rset, NULL, NULL, &tv) > 0;
}
/***********************************************************************
* Relay class
**********************************************************************/
-class udp_relay_type{
+class udp_relay_type
+{
public:
- udp_relay_type(
- const std::string &server_addr,
- const std::string &client_addr,
- const std::string &port,
+ udp_relay_type(const std::string& server_addr,
+ const std::string& client_addr,
+ const std::string& port,
const size_t server_rx_size = 0,
const size_t server_tx_size = 0,
const size_t client_rx_size = 0,
- const size_t client_tx_size = 0
- ):_port(port){
+ const size_t client_tx_size = 0)
+ : _port(port)
+ {
{
asio::ip::udp::resolver resolver(_io_service);
asio::ip::udp::resolver::query query(asio::ip::udp::v4(), server_addr, port);
asio::ip::udp::endpoint endpoint = *resolver.resolve(query);
- _server_socket = boost::shared_ptr<asio::ip::udp::socket>(new asio::ip::udp::socket(_io_service, endpoint));
+ _server_socket = boost::shared_ptr<asio::ip::udp::socket>(
+ new asio::ip::udp::socket(_io_service, endpoint));
resize_buffs(_server_socket, server_rx_size, server_tx_size);
}
{
@@ -84,22 +90,27 @@ public:
asio::ip::udp::resolver::query query(asio::ip::udp::v4(), client_addr, port);
asio::ip::udp::endpoint endpoint = *resolver.resolve(query);
- _client_socket = boost::shared_ptr<asio::ip::udp::socket>(new asio::ip::udp::socket(_io_service));
+ _client_socket = boost::shared_ptr<asio::ip::udp::socket>(
+ new asio::ip::udp::socket(_io_service));
_client_socket->open(asio::ip::udp::v4());
_client_socket->connect(endpoint);
resize_buffs(_client_socket, client_rx_size, client_tx_size);
}
std::cout << "spawning relay threads... " << _port << std::endl;
- boost::unique_lock<boost::mutex> lock(spawn_mutex); // lock in preparation to wait for threads to spawn
- (void)_thread_group.create_thread(boost::bind(&udp_relay_type::server_thread, this));
- wait_for_thread.wait(lock); // wait for thread to spin up
- (void)_thread_group.create_thread(boost::bind(&udp_relay_type::client_thread, this));
- wait_for_thread.wait(lock); // wait for thread to spin up
+ boost::unique_lock<boost::mutex> lock(
+ spawn_mutex); // lock in preparation to wait for threads to spawn
+ (void)_thread_group.create_thread(
+ boost::bind(&udp_relay_type::server_thread, this));
+ wait_for_thread.wait(lock); // wait for thread to spin up
+ (void)_thread_group.create_thread(
+ boost::bind(&udp_relay_type::client_thread, this));
+ wait_for_thread.wait(lock); // wait for thread to spin up
std::cout << " done!" << std::endl << std::endl;
}
- ~udp_relay_type(void){
+ ~udp_relay_type(void)
+ {
std::cout << "killing relay threads... " << _port << std::endl;
_thread_group.interrupt_all();
_thread_group.join_all();
@@ -107,31 +118,36 @@ public:
}
private:
-
- static void resize_buffs(socket_type sock, const size_t rx_size, const size_t tx_size){
- if (rx_size != 0) sock->set_option(asio::socket_base::receive_buffer_size(rx_size));
- if (tx_size != 0) sock->set_option(asio::socket_base::send_buffer_size(tx_size));
+ static void resize_buffs(socket_type sock, const size_t rx_size, const size_t tx_size)
+ {
+ if (rx_size != 0)
+ sock->set_option(asio::socket_base::receive_buffer_size(rx_size));
+ if (tx_size != 0)
+ sock->set_option(asio::socket_base::send_buffer_size(tx_size));
}
- void server_thread(void){
+ void server_thread(void)
+ {
uhd::set_thread_priority_safe();
std::cout << " entering server_thread..." << std::endl;
- wait_for_thread.notify_one(); // notify constructor that this thread has started
+ wait_for_thread.notify_one(); // notify constructor that this thread has started
std::vector<char> buff(insane_mtu);
- while (not boost::this_thread::interruption_requested()){
- if (wait_for_recv_ready(_server_socket->native_handle())){
+ while (not boost::this_thread::interruption_requested()) {
+ if (wait_for_recv_ready(_server_socket->native_handle())) {
boost::mutex::scoped_lock lock(_endpoint_mutex);
- const size_t len = _server_socket->receive_from(asio::buffer(&buff.front(), buff.size()), _endpoint);
+ const size_t len = _server_socket->receive_from(
+ asio::buffer(&buff.front(), buff.size()), _endpoint);
lock.unlock();
_client_socket->send(asio::buffer(&buff.front(), len));
- //perform sequence error detection on tx dsp data (can detect bad network cards)
+ // perform sequence error detection on tx dsp data (can detect bad network
+ // cards)
/*
if (_port[4] == '7'){
static uint32_t next_seq;
- const uint32_t this_seq = ntohl(reinterpret_cast<const uint32_t *>(&buff.front())[0]);
- if (next_seq != this_seq and this_seq != 0) std::cout << "S" << std::flush;
- next_seq = this_seq + 1;
+ const uint32_t this_seq = ntohl(reinterpret_cast<const uint32_t
+ *>(&buff.front())[0]); if (next_seq != this_seq and this_seq != 0)
+ std::cout << "S" << std::flush; next_seq = this_seq + 1;
}
*/
}
@@ -139,14 +155,16 @@ private:
std::cout << " exiting server_thread..." << std::endl;
}
- void client_thread(void){
+ void client_thread(void)
+ {
uhd::set_thread_priority_safe();
std::cout << " entering client_thread..." << std::endl;
- wait_for_thread.notify_one(); // notify constructor that this thread has started
+ wait_for_thread.notify_one(); // notify constructor that this thread has started
std::vector<char> buff(insane_mtu);
- while (not boost::this_thread::interruption_requested()){
- if (wait_for_recv_ready(_client_socket->native_handle())){
- const size_t len = _client_socket->receive(asio::buffer(&buff.front(), buff.size()));
+ while (not boost::this_thread::interruption_requested()) {
+ if (wait_for_recv_ready(_client_socket->native_handle())) {
+ const size_t len =
+ _client_socket->receive(asio::buffer(&buff.front(), buff.size()));
boost::mutex::scoped_lock lock(_endpoint_mutex);
_server_socket->send_to(asio::buffer(&buff.front(), len), _endpoint);
}
@@ -168,14 +186,15 @@ private:
/***********************************************************************
* Main
**********************************************************************/
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string addr;
std::string bind;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -188,32 +207,36 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help") or not vm.count("addr")){
- std::cout
- << boost::format("UHD Network Relay %s") % desc << std::endl
- << "Runs a network relay between UHD on one computer and a USRP on the network.\n"
- << "This example is basically for test purposes. Use at your own convenience.\n"
- << std::endl;
+ // print the help message
+ if (vm.count("help") or not vm.count("addr")) {
+ std::cout << boost::format("UHD Network Relay %s") % desc << std::endl
+ << "Runs a network relay between UHD on one computer and a USRP on the "
+ "network.\n"
+ << "This example is basically for test purposes. Use at your own "
+ "convenience.\n"
+ << std::endl;
return EXIT_FAILURE;
}
{
- boost::shared_ptr<udp_relay_type> ctrl (new udp_relay_type(bind, addr, "49152"));
- boost::shared_ptr<udp_relay_type> rxdsp0(new udp_relay_type(bind, addr, "49156", 0, tx_dsp_buff_size, rx_dsp_buff_size, 0));
- boost::shared_ptr<udp_relay_type> txdsp0(new udp_relay_type(bind, addr, "49157", tx_dsp_buff_size, 0, 0, tx_dsp_buff_size));
- boost::shared_ptr<udp_relay_type> rxdsp1(new udp_relay_type(bind, addr, "49158", 0, tx_dsp_buff_size, rx_dsp_buff_size, 0));
- boost::shared_ptr<udp_relay_type> gps (new udp_relay_type(bind, addr, "49172"));
+ boost::shared_ptr<udp_relay_type> ctrl(new udp_relay_type(bind, addr, "49152"));
+ boost::shared_ptr<udp_relay_type> rxdsp0(new udp_relay_type(
+ bind, addr, "49156", 0, tx_dsp_buff_size, rx_dsp_buff_size, 0));
+ boost::shared_ptr<udp_relay_type> txdsp0(new udp_relay_type(
+ bind, addr, "49157", tx_dsp_buff_size, 0, 0, tx_dsp_buff_size));
+ boost::shared_ptr<udp_relay_type> rxdsp1(new udp_relay_type(
+ bind, addr, "49158", 0, tx_dsp_buff_size, rx_dsp_buff_size, 0));
+ boost::shared_ptr<udp_relay_type> gps(new udp_relay_type(bind, addr, "49172"));
std::signal(SIGINT, &sig_int_handler);
std::cout << "Press Ctrl + C to stop streaming..." << std::endl;
- while (not stop_signal_called){
+ while (not stop_signal_called) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/replay_samples_from_file.cpp b/host/examples/replay_samples_from_file.cpp
index 07691df2b..8f022b4f2 100644
--- a/host/examples/replay_samples_from_file.cpp
+++ b/host/examples/replay_samples_from_file.cpp
@@ -10,25 +10,23 @@
// It streams the file data to the Replay block, where it is recorded, then it
// is played back to the radio.
-#include <uhd/utils/safe_main.hpp>
#include <uhd/device3.hpp>
#include <uhd/rfnoc/radio_ctrl.hpp>
#include <uhd/rfnoc/replay_block_ctrl.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
#include <boost/format.hpp>
-#include <fstream>
+#include <boost/program_options.hpp>
#include <csignal>
+#include <fstream>
#include <thread>
-
namespace po = boost::program_options;
using std::cout;
using std::endl;
-
///////////////////////////////////////////////////////////////////////////////
static volatile bool stop_signal_called = false;
@@ -40,8 +38,7 @@ void sig_int_handler(int)
}
-
-int UHD_SAFE_MAIN(int argc, char *argv[])
+int UHD_SAFE_MAIN(int argc, char* argv[])
{
// We use sc16 in this example, but the replay block only uses 64-bit words
// and is not aware of the CPU or wire format.
@@ -49,10 +46,10 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
std::string cpu_format("sc16");
// Constants related to the Replay block
- const size_t replay_word_size = 8; // Size of words used by replay block
- const size_t bytes_per_sample = 4; // Complex signed 16-bit is 32 bits per sample
- const size_t samples_per_word = 2; // Number of sc16 samples per word
- const size_t replay_spp = 2000; // SC16 Samples per packet generated by Replay block
+ const size_t replay_word_size = 8; // Size of words used by replay block
+ const size_t bytes_per_sample = 4; // Complex signed 16-bit is 32 bits per sample
+ const size_t samples_per_word = 2; // Number of sc16 samples per word
+ const size_t replay_spp = 2000; // SC16 Samples per packet generated by Replay block
///////////////////////////////////////////////////////////////////////////
@@ -89,9 +86,10 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
// Print help message
if (vm.count("help")) {
cout << boost::format("UHD/RFNoC Replay samples from file %s") % desc << endl;
- cout
- << "This application uses the Replay block to playback data from a file to a radio" << endl
- << endl;
+ cout << "This application uses the Replay block to playback data from a file to "
+ "a radio"
+ << endl
+ << endl;
return EXIT_FAILURE;
}
@@ -117,7 +115,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
return EXIT_FAILURE;
}
replay_ctrl = usrp->get_block_ctrl<uhd::rfnoc::replay_block_ctrl>(replay_ctrl_id);
- std::cout << "Using replay block " << replay_id << ", channel " << replay_chan << std::endl;
+ std::cout << "Using replay block " << replay_id << ", channel " << replay_chan
+ << std::endl;
///////////////////////////////////////////////////////////////////////////
@@ -130,37 +129,47 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
radio_ctrl->set_args(radio_args);
// Set the center frequency
- if (not vm.count("freq")){
+ if (not vm.count("freq")) {
std::cerr << "Please specify the center frequency with --freq" << std::endl;
return EXIT_FAILURE;
}
- std::cout << boost::format("Setting TX Freq: %f MHz...") % (freq/1e6) << std::endl;
+ std::cout << boost::format("Setting TX Freq: %f MHz...") % (freq / 1e6) << std::endl;
radio_ctrl->set_tx_frequency(freq, radio_chan);
- std::cout << boost::format("Actual TX Freq: %f MHz...") % (radio_ctrl->get_tx_frequency(radio_chan)/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Freq: %f MHz...")
+ % (radio_ctrl->get_tx_frequency(radio_chan) / 1e6)
+ << std::endl
+ << std::endl;
// Set the sample rate
if (vm.count("rate")) {
- std::cout << boost::format("Setting TX Rate: %f Msps...") % (rate/1e6) << std::endl;
+ std::cout << boost::format("Setting TX Rate: %f Msps...") % (rate / 1e6)
+ << std::endl;
radio_ctrl->set_rate(rate);
- std::cout << boost::format("Actual TX Rate: %f Msps...") % (radio_ctrl->get_rate()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Rate: %f Msps...")
+ % (radio_ctrl->get_rate() / 1e6)
+ << std::endl
+ << std::endl;
}
// Set the RF gain
- if (vm.count("gain")){
+ if (vm.count("gain")) {
std::cout << boost::format("Setting TX Gain: %f dB...") % gain << std::endl;
radio_ctrl->set_tx_gain(gain, radio_chan);
- std::cout << boost::format("Actual TX Gain: %f dB...") % radio_ctrl->get_tx_gain(radio_chan) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Gain: %f dB...")
+ % radio_ctrl->get_tx_gain(radio_chan)
+ << std::endl
+ << std::endl;
}
// Set the analog front-end filter bandwidth
- if (vm.count("bw")){
- std::cout << boost::format("Setting TX Bandwidth: %f MHz...")
- % (bw / 1e6)
+ if (vm.count("bw")) {
+ std::cout << boost::format("Setting TX Bandwidth: %f MHz...") % (bw / 1e6)
<< std::endl;
radio_ctrl->set_tx_bandwidth(bw, radio_chan);
std::cout << boost::format("Actual TX Bandwidth: %f MHz...")
- % (radio_ctrl->get_tx_bandwidth(radio_chan) / 1e6)
- << std::endl << std::endl;
+ % (radio_ctrl->get_tx_bandwidth(radio_chan) / 1e6)
+ << std::endl
+ << std::endl;
}
// Set the antenna
@@ -172,13 +181,18 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
- ///////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////
// Connect Replay block to radio
uhd::rfnoc::graph::sptr replay_graph = usrp->create_graph("rfnoc_replay");
usrp->clear();
- std::cout << "Connecting " << replay_ctrl->get_block_id() << " ==> " << radio_ctrl->get_block_id() << std::endl;
- replay_graph->connect(replay_ctrl->get_block_id(), replay_chan, radio_ctrl->get_block_id(), radio_chan, replay_spp);
+ std::cout << "Connecting " << replay_ctrl->get_block_id() << " ==> "
+ << radio_ctrl->get_block_id() << std::endl;
+ replay_graph->connect(replay_ctrl->get_block_id(),
+ replay_chan,
+ radio_ctrl->get_block_id(),
+ radio_chan,
+ replay_spp);
// Inform replay block that it has an RX streamer connected to it
replay_ctrl->set_rx_streamer(true, replay_chan);
@@ -193,20 +207,20 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
uhd::tx_streamer::sptr tx_stream;
uhd::tx_metadata_t tx_md;
- streamer_args["block_id"] = replay_ctrl->get_block_id().to_string();
+ streamer_args["block_id"] = replay_ctrl->get_block_id().to_string();
streamer_args["block_port"] = str(boost::format("%d") % replay_chan);
- stream_args.args = streamer_args;
- tx_stream = usrp->get_tx_stream(stream_args);
+ stream_args.args = streamer_args;
+ tx_stream = usrp->get_tx_stream(stream_args);
// Make sure that streamer SPP is a multiple of the Replay block word size
size_t tx_spp = tx_stream->get_max_num_samps();
- if(tx_spp % samples_per_word != 0) {
+ if (tx_spp % samples_per_word != 0) {
// Round SPP down to a multiple of the word size
tx_spp = (tx_spp / samples_per_word) * samples_per_word;
tx_stream.reset();
streamer_args["spp"] = boost::lexical_cast<std::string>(tx_spp);
- stream_args.args = streamer_args;
- tx_stream = usrp->get_tx_stream(stream_args);
+ stream_args.args = streamer_args;
+ tx_stream = usrp->get_tx_stream(stream_args);
}
cout << "Using streamer args: " << stream_args.args.to_string() << endl;
@@ -228,7 +242,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
infile.seekg(0, std::ios::beg);
// Calculate the number of 64-bit words and samples to replay
- size_t words_to_replay = file_size / replay_word_size;
+ size_t words_to_replay = file_size / replay_word_size;
size_t samples_to_replay = words_to_replay * replay_word_size / bytes_per_sample;
// Create buffer
@@ -254,15 +268,26 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
replay_ctrl->set_words_per_packet(replay_spp / samples_per_word, replay_chan);
// Display replay configuration
- cout << boost::format("Replay file size: %d bytes (%d qwords, %d samples)")
- % (words_to_replay * replay_word_size) % words_to_replay % samples_to_replay
+ cout << boost::format("Replay file size: %d bytes (%d qwords, %d samples)")
+ % (words_to_replay * replay_word_size) % words_to_replay
+ % samples_to_replay
<< endl;
- cout << boost::format("Record base address: 0x%X") % replay_ctrl->get_record_addr(replay_chan) << endl;
- cout << boost::format("Record buffer size: %d bytes") % replay_ctrl->get_record_size(replay_chan) << endl;
- cout << boost::format("Record fullness: %d") % replay_ctrl->get_record_fullness(replay_chan) << endl;
- cout << boost::format("Play base address: 0x%X") % replay_ctrl->get_play_addr(replay_chan) << endl;
- cout << boost::format("Play buffer size: %d bytes") % replay_ctrl->get_play_size(replay_chan) << endl;
+ cout << boost::format("Record base address: 0x%X")
+ % replay_ctrl->get_record_addr(replay_chan)
+ << endl;
+ cout << boost::format("Record buffer size: %d bytes")
+ % replay_ctrl->get_record_size(replay_chan)
+ << endl;
+ cout << boost::format("Record fullness: %d")
+ % replay_ctrl->get_record_fullness(replay_chan)
+ << endl;
+ cout << boost::format("Play base address: 0x%X")
+ % replay_ctrl->get_play_addr(replay_chan)
+ << endl;
+ cout << boost::format("Play buffer size: %d bytes")
+ % replay_ctrl->get_play_size(replay_chan)
+ << endl;
// Restart record buffer repeatedly until no new data appears on the Replay
// block's input. This will flush any data that was buffered on the input.
@@ -278,12 +303,13 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
start_time = std::chrono::system_clock::now();
do {
fullness = replay_ctrl->get_record_fullness(replay_chan);
- if (fullness != 0) break;
+ if (fullness != 0)
+ break;
time_diff = std::chrono::system_clock::now() - start_time;
time_diff = std::chrono::duration_cast<std::chrono::milliseconds>(time_diff);
} while (time_diff.count() < 250);
} while (fullness);
-
+
///////////////////////////////////////////////////////////////////////////
// Send data to replay (record the data)
@@ -291,10 +317,11 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
cout << "Sending data to be recorded..." << endl;
tx_md.start_of_burst = true;
tx_md.end_of_burst = true;
- size_t num_tx_samps = tx_stream->send(tx_buf_ptr, samples_to_replay, tx_md);
+ size_t num_tx_samps = tx_stream->send(tx_buf_ptr, samples_to_replay, tx_md);
if (num_tx_samps != samples_to_replay) {
- cout << boost::format("ERROR: Unable to send %d samples") % samples_to_replay << endl;
+ cout << boost::format("ERROR: Unable to send %d samples") % samples_to_replay
+ << endl;
return EXIT_FAILURE;
}
@@ -303,7 +330,9 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
// Wait for data to be stored in on-board memory
cout << "Waiting for recording to complete..." << endl;
- while (replay_ctrl->get_record_fullness(replay_chan) < words_to_replay*replay_word_size);
+ while (replay_ctrl->get_record_fullness(replay_chan)
+ < words_to_replay * replay_word_size)
+ ;
///////////////////////////////////////////////////////////////////////////
@@ -314,15 +343,18 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
if (nsamps <= 0) {
// Replay the entire buffer over and over
stream_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS;
- stream_cmd.num_samps = words_to_replay;
- cout << boost::format("Issuing replay command for %d words in continuous mode...") % stream_cmd.num_samps << endl;
- }
- else {
+ stream_cmd.num_samps = words_to_replay;
+ cout << boost::format("Issuing replay command for %d words in continuous mode...")
+ % stream_cmd.num_samps
+ << endl;
+ } else {
// Replay nsamps, wrapping back to the start of the buffer if nsamps is
// larger than the buffer size.
stream_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE;
- stream_cmd.num_samps = nsamps / samples_per_word;
- cout << boost::format("Issuing replay command for %d words...") % stream_cmd.num_samps << endl;
+ stream_cmd.num_samps = nsamps / samples_per_word;
+ cout << boost::format("Issuing replay command for %d words...")
+ % stream_cmd.num_samps
+ << endl;
}
stream_cmd.stream_now = true;
replay_ctrl->issue_stream_cmd(stream_cmd, replay_chan);
@@ -335,7 +367,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
std::signal(SIGINT, &sig_int_handler);
cout << "Replaying data (Press Ctrl+C to stop)..." << endl;
- while (not stop_signal_called);
+ while (not stop_signal_called)
+ ;
// Remove SIGINT handler
std::signal(SIGINT, SIG_DFL);
@@ -359,11 +392,16 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
uint16_t prev_packet_count, packet_count;
cout << "Waiting for replay data to flush... ";
- prev_packet_count = replay_ctrl->sr_read64(uhd::rfnoc::SR_READBACK_REG_GLOBAL_PARAMS, replay_chan) >> 32;
- while(true) {
+ prev_packet_count =
+ replay_ctrl->sr_read64(uhd::rfnoc::SR_READBACK_REG_GLOBAL_PARAMS, replay_chan)
+ >> 32;
+ while (true) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
- packet_count = replay_ctrl->sr_read64(uhd::rfnoc::SR_READBACK_REG_GLOBAL_PARAMS, replay_chan) >> 32;
- if (packet_count == prev_packet_count) break;
+ packet_count =
+ replay_ctrl->sr_read64(uhd::rfnoc::SR_READBACK_REG_GLOBAL_PARAMS, replay_chan)
+ >> 32;
+ if (packet_count == prev_packet_count)
+ break;
prev_packet_count = packet_count;
}
diff --git a/host/examples/rfnoc_nullsource_ce_rx.cpp b/host/examples/rfnoc_nullsource_ce_rx.cpp
index f6aa6e1a4..16eb49c7b 100644
--- a/host/examples/rfnoc_nullsource_ce_rx.cpp
+++ b/host/examples/rfnoc_nullsource_ce_rx.cpp
@@ -21,36 +21,39 @@
// and then streams the result to the host, writing it into a file.
#include <uhd/device3.hpp>
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/exception.hpp>
#include <uhd/rfnoc/block_ctrl.hpp>
#include <uhd/rfnoc/null_block_ctrl.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
-#include <iostream>
-#include <fstream>
-#include <csignal>
+#include <boost/program_options.hpp>
+#include <chrono>
#include <complex>
+#include <csignal>
+#include <fstream>
+#include <iostream>
#include <thread>
-#include <chrono>
namespace po = boost::program_options;
static bool stop_signal_called = false;
-void sig_int_handler(int){stop_signal_called = true;}
+void sig_int_handler(int)
+{
+ stop_signal_called = true;
+}
-template<typename samp_type> void recv_to_file(
- uhd::rx_streamer::sptr rx_stream,
- const std::string &file,
+template <typename samp_type>
+void recv_to_file(uhd::rx_streamer::sptr rx_stream,
+ const std::string& file,
size_t samps_per_buff,
unsigned long long num_requested_samples,
- double time_requested = 0.0,
- bool bw_summary = false,
- bool stats = false,
- bool continue_on_bad_packet = false
-) {
+ double time_requested = 0.0,
+ bool bw_summary = false,
+ bool stats = false,
+ bool continue_on_bad_packet = false)
+{
unsigned long long num_total_samps = 0;
uhd::rx_metadata_t md;
@@ -61,14 +64,13 @@ template<typename samp_type> void recv_to_file(
}
bool overflow_message = true;
- //setup streaming
- uhd::stream_cmd_t stream_cmd((num_requested_samples == 0)?
- uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS:
- uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE
- );
- stream_cmd.num_samps = num_requested_samples;
+ // setup streaming
+ uhd::stream_cmd_t stream_cmd((num_requested_samples == 0)
+ ? uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS
+ : uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
+ stream_cmd.num_samps = num_requested_samples;
stream_cmd.stream_now = true;
- stream_cmd.time_spec = uhd::time_spec_t();
+ stream_cmd.time_spec = uhd::time_spec_t();
std::cout << "Issuing start stream cmd" << std::endl;
// This actually goes to the null source; the processing block
// should propagate it.
@@ -77,19 +79,14 @@ template<typename samp_type> void recv_to_file(
const auto start_time = std::chrono::steady_clock::now();
const auto stop_time =
- start_time
- + std::chrono::milliseconds(int64_t(1000 * time_requested));
+ start_time + std::chrono::milliseconds(int64_t(1000 * time_requested));
// Track time and samps between updating the BW summary
- auto last_update = start_time;
+ auto last_update = start_time;
unsigned long long last_update_samps = 0;
- while(
- not stop_signal_called
- and (num_requested_samples != num_total_samps
- or num_requested_samples == 0)
- and (time_requested == 0.0
- or std::chrono::steady_clock::now() <= stop_time)
- ) {
+ while (not stop_signal_called
+ and (num_requested_samples != num_total_samps or num_requested_samples == 0)
+ and (time_requested == 0.0 or std::chrono::steady_clock::now() <= stop_time)) {
const auto now = std::chrono::steady_clock::now();
size_t num_rx_samps = rx_stream->recv(&buff.front(), buff.size(), md, 3.0);
@@ -98,28 +95,27 @@ template<typename samp_type> void recv_to_file(
std::cout << "Timeout while streaming" << std::endl;
break;
}
- if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW){
- if (overflow_message){
+ if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW) {
+ if (overflow_message) {
overflow_message = false;
std::cerr << "Got an overflow indication. If writing to disk, your\n"
"write medium may not be able to keep up.\n";
}
continue;
}
- if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE){
+ if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
const auto error = std::string("Receiver error: ") + md.strerror();
- if (continue_on_bad_packet){
+ if (continue_on_bad_packet) {
std::cerr << error << std::endl;
continue;
- }
- else {
+ } else {
throw std::runtime_error(error);
}
}
num_total_samps += num_rx_samps;
if (outfile.is_open()) {
- outfile.write((const char*)&buff.front(), num_rx_samps*sizeof(samp_type));
+ outfile.write((const char*)&buff.front(), num_rx_samps * sizeof(samp_type));
}
if (bw_summary) {
@@ -128,11 +124,10 @@ template<typename samp_type> void recv_to_file(
if (time_since_last_update > std::chrono::seconds(1)) {
const double time_since_last_update_s =
std::chrono::duration<double>(time_since_last_update).count();
- const double rate =
- double(last_update_samps) / time_since_last_update_s;
- std::cout << "\t" << (rate/1e6) << " Msps" << std::endl;
+ const double rate = double(last_update_samps) / time_since_last_update_s;
+ std::cout << "\t" << (rate / 1e6) << " Msps" << std::endl;
last_update_samps = 0;
- last_update = now;
+ last_update = now;
}
}
}
@@ -151,13 +146,11 @@ template<typename samp_type> void recv_to_file(
std::cout << std::endl;
const double actual_duration_seconds =
std::chrono::duration<float>(actual_stop_time - start_time).count();
- std::cout
- << boost::format("Received %d samples in %f seconds")
- % num_total_samps
- % actual_duration_seconds
- << std::endl;
- const double rate = (double) num_total_samps / actual_duration_seconds;
- std::cout << (rate/1e6) << " Msps" << std::endl;
+ std::cout << boost::format("Received %d samples in %f seconds") % num_total_samps
+ % actual_duration_seconds
+ << std::endl;
+ const double rate = (double)num_total_samps / actual_duration_seconds;
+ std::cout << (rate / 1e6) << " Msps" << std::endl;
}
}
@@ -211,16 +204,16 @@ void pretty_print_flow_graph(std::vector<std::string> blocks)
}
///////////////////// MAIN ////////////////////////////////////////////////////
-int UHD_SAFE_MAIN(int argc, char *argv[])
+int UHD_SAFE_MAIN(int argc, char* argv[])
{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args, file, format, nullid, blockid, blockid2;
size_t total_num_samps, spb, spp;
double rate, total_time, setup_time, block_rate;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -248,17 +241,16 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
- std::cout
- << "[RFNOC] Connect a null source to another (processing) block, "
- "and stream the result to file."
- << desc << std::endl;
+ // print the help message
+ if (vm.count("help")) {
+ std::cout << "[RFNOC] Connect a null source to another (processing) block, "
+ "and stream the result to file."
+ << desc << std::endl;
return EXIT_SUCCESS;
}
- bool bw_summary = vm.count("progress") > 0;
- bool stats = vm.count("stats") > 0;
+ bool bw_summary = vm.count("progress") > 0;
+ bool stats = vm.count("stats") > 0;
bool continue_on_bad_packet = vm.count("continue") > 0;
// Check settings
@@ -267,7 +259,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
return ~0;
}
if (not uhd::rfnoc::block_id_t::is_valid_block_id(blockid)) {
- std::cout << "Must specify a valid block ID for the processing block." << std::endl;
+ std::cout << "Must specify a valid block ID for the processing block."
+ << std::endl;
return ~0;
}
if (not blockid2.empty()) {
@@ -290,7 +283,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
std::cout << "Creating the USRP device with args: " << args << std::endl;
uhd::device3::sptr usrp = uhd::device3::make(args);
- std::this_thread::sleep_for( //allow for some setup time
+ std::this_thread::sleep_for( // allow for some setup time
std::chrono::milliseconds(int64_t(setup_time * 1000)));
// Reset device streaming state
usrp->clear();
@@ -356,18 +349,18 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
}
// Or, if our block has its own getters + setters, you can call those:
- std::cout << str(boost::format("Requesting rate: %.2f Msps (%.2f MByte/s).") % (rate / 1e6) % (rate * 4 / 1e6)) << std::endl;
+ std::cout << str(boost::format("Requesting rate: %.2f Msps (%.2f MByte/s).")
+ % (rate / 1e6) % (rate * 4 / 1e6))
+ << std::endl;
const size_t SAMPLES_PER_LINE = 2;
null_src_ctrl->set_line_rate(rate / SAMPLES_PER_LINE, block_rate);
// Now, it's possible that this requested rate is not available.
// Let's read back the true rate with the getter:
- double actual_rate_mega = null_src_ctrl->get_line_rate(block_rate) / 1e6 * SAMPLES_PER_LINE;
- std::cout
- << str(
- boost::format("Actually got rate: %.2f Msps (%.2f MByte/s).")
- % actual_rate_mega % (actual_rate_mega * BYTES_PER_SAMPLE)
- )
- << std::endl;
+ double actual_rate_mega =
+ null_src_ctrl->get_line_rate(block_rate) / 1e6 * SAMPLES_PER_LINE;
+ std::cout << str(boost::format("Actually got rate: %.2f Msps (%.2f MByte/s).")
+ % actual_rate_mega % (actual_rate_mega * BYTES_PER_SAMPLE))
+ << std::endl;
/////////////////////////////////////////////////////////////////////////
@@ -376,33 +369,42 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
std::cout << "Connecting blocks..." << std::endl;
if (proc_block_ctrl) {
rx_graph->connect( // Yes, it's that easy!
- null_src_ctrl->get_block_id(),
- proc_block_ctrl->get_block_id()
- );
+ null_src_ctrl->get_block_id(),
+ proc_block_ctrl->get_block_id());
}
if (proc_block_ctrl2 and proc_block_ctrl) {
rx_graph->connect(
- proc_block_ctrl->get_block_id(),
- proc_block_ctrl2->get_block_id()
- );
+ proc_block_ctrl->get_block_id(), proc_block_ctrl2->get_block_id());
}
/////////////////////////////////////////////////////////////////////////
//////// 6. Spawn receiver //////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
uhd::stream_args_t stream_args(format, "sc16");
- stream_args.args = stream_args_args;
+ stream_args.args = stream_args_args;
stream_args.args["spp"] = std::to_string(spp);
- UHD_LOGGER_DEBUG("RFNOC") << "Using streamer args: " << stream_args.args.to_string() << std::endl;
+ UHD_LOGGER_DEBUG("RFNOC") << "Using streamer args: " << stream_args.args.to_string()
+ << std::endl;
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
#define recv_to_file_args() \
- (rx_stream, file, spb, total_num_samps, total_time, bw_summary, stats, continue_on_bad_packet)
- //recv to file
- if (format == "fc64") recv_to_file<std::complex<double> >recv_to_file_args();
- else if (format == "fc32") recv_to_file<std::complex<float> >recv_to_file_args();
- else if (format == "sc16") recv_to_file<std::complex<short> >recv_to_file_args();
- else throw std::runtime_error("Unknown type sample type: " + format);
+ (rx_stream, \
+ file, \
+ spb, \
+ total_num_samps, \
+ total_time, \
+ bw_summary, \
+ stats, \
+ continue_on_bad_packet)
+ // recv to file
+ if (format == "fc64")
+ recv_to_file<std::complex<double>> recv_to_file_args();
+ else if (format == "fc32")
+ recv_to_file<std::complex<float>> recv_to_file_args();
+ else if (format == "sc16")
+ recv_to_file<std::complex<short>> recv_to_file_args();
+ else
+ throw std::runtime_error("Unknown type sample type: " + format);
// Finished!
std::cout << std::endl << "Done!" << std::endl << std::endl;
diff --git a/host/examples/rfnoc_radio_loopback.cpp b/host/examples/rfnoc_radio_loopback.cpp
index f773cfe90..848f9c4da 100644
--- a/host/examples/rfnoc_radio_loopback.cpp
+++ b/host/examples/rfnoc_radio_loopback.cpp
@@ -13,9 +13,9 @@
#include <uhd/utils/math.hpp>
#include <uhd/utils/safe_main.hpp>
#include <boost/program_options.hpp>
-#include <iostream>
-#include <csignal>
#include <chrono>
+#include <csignal>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
@@ -25,20 +25,23 @@ using uhd::rfnoc::radio_ctrl;
* SIGINT handling
***************************************************************************/
static bool stop_signal_called = false;
-void sig_int_handler(int){stop_signal_called = true;}
+void sig_int_handler(int)
+{
+ stop_signal_called = true;
+}
/****************************************************************************
* main
***************************************************************************/
-int UHD_SAFE_MAIN(int argc, char *argv[])
+int UHD_SAFE_MAIN(int argc, char* argv[])
{
- //variables to be set by po
+ // variables to be set by po
std::string args, rx_args, tx_args, rx_ant, tx_ant, rx_blockid, tx_blockid, ref;
size_t total_num_samps, spp, rx_chan, tx_chan, tx_delay;
double rate, rx_freq, tx_freq, rx_gain, tx_gain, bw, total_time, setup_time;
bool rx_timestamps;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -72,7 +75,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
+ // print the help message
if (vm.count("help")) {
std::cout << boost::format("RFNoC: Radio loopback test %s") % desc << std::endl;
std::cout
@@ -84,7 +87,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
// Create a device session
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
auto dev = boost::dynamic_pointer_cast<uhd::device3>(uhd::device::make(args));
if (not dev) {
std::cout << "Error: Could not find an RFNoC-compatible device." << std::endl;
@@ -93,13 +97,12 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
// Access block controllers
if (not dev->has_block<uhd::rfnoc::radio_ctrl>(rx_blockid)
- or not dev->has_block<uhd::rfnoc::radio_ctrl>(tx_blockid)) {
+ or not dev->has_block<uhd::rfnoc::radio_ctrl>(tx_blockid)) {
std::cout << "Error: Could not access at least one of these blocks:\n"
- << "- " << rx_blockid
- << "- " << tx_blockid
- << std::endl;
- std::cout << "Please confirm these blocks are actually available on the current loaded device."
- << std::endl;
+ << "- " << rx_blockid << "- " << tx_blockid << std::endl;
+ std::cout << "Please confirm these blocks are actually available on the current "
+ "loaded device."
+ << std::endl;
return EXIT_FAILURE;
}
auto rx_radio_ctrl = dev->get_block_ctrl<radio_ctrl>(rx_blockid);
@@ -110,58 +113,65 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
rx_radio_ctrl->set_args(rx_args);
if (spp) {
rx_radio_ctrl->set_arg<int>("spp", spp, rx_chan);
-
}
- std::cout << "Setting Rx rate: " << (rate/1e6) << " Msps" << std::endl;
+ std::cout << "Setting Rx rate: " << (rate / 1e6) << " Msps" << std::endl;
double actual_rx_rate = rx_radio_ctrl->set_rate(rate);
- std::cout << "Actual Rx rate: " << (actual_rx_rate/1e6) << " Msps" << std::endl;
- std::cout << "Setting Rx frequency: " << (rx_freq/1e6) << " MHz." << std::endl;
- std::cout << "Actual Rx frequency: " << (rx_radio_ctrl->set_rx_frequency(rx_freq, rx_chan)/1e6) << " MHz." << std::endl;
+ std::cout << "Actual Rx rate: " << (actual_rx_rate / 1e6) << " Msps" << std::endl;
+ std::cout << "Setting Rx frequency: " << (rx_freq / 1e6) << " MHz." << std::endl;
+ std::cout << "Actual Rx frequency: "
+ << (rx_radio_ctrl->set_rx_frequency(rx_freq, rx_chan) / 1e6) << " MHz."
+ << std::endl;
if (rx_gain) {
std::cout << "Setting Rx gain: " << (rx_gain) << " dB." << std::endl;
- std::cout << "Actual Rx gain: " << (rx_radio_ctrl->set_rx_gain(rx_gain, rx_chan)) << " dB." << std::endl;
+ std::cout << "Actual Rx gain: " << (rx_radio_ctrl->set_rx_gain(rx_gain, rx_chan))
+ << " dB." << std::endl;
}
if (not rx_ant.empty()) {
std::cout << "Setting Rx antenna: " << (rx_ant) << "." << std::endl;
rx_radio_ctrl->set_rx_antenna(rx_ant, rx_chan);
- std::cout << "Actual Rx antenna: " << rx_radio_ctrl->get_rx_antenna(rx_chan) << "." << std::endl;
+ std::cout << "Actual Rx antenna: " << rx_radio_ctrl->get_rx_antenna(rx_chan)
+ << "." << std::endl;
}
if (!rx_timestamps) {
- std::cout << "Disabling timestamps on RX... (direct loopback, may underrun)" << std::endl;
+ std::cout << "Disabling timestamps on RX... (direct loopback, may underrun)"
+ << std::endl;
}
rx_radio_ctrl->enable_rx_timestamps(rx_timestamps, 0);
// Configure Tx radio
std::cout << "Configuring Tx radio..." << std::endl;
tx_radio_ctrl->set_args(tx_args);
- std::cout << "Setting Tx rate: " << (rate/1e6) << " Msps" << std::endl;
+ std::cout << "Setting Tx rate: " << (rate / 1e6) << " Msps" << std::endl;
double actual_tx_rate = tx_radio_ctrl->set_rate(rate);
- std::cout << "Actual Tx rate: " << (actual_tx_rate/1e6) << " Msps" << std::endl;
- std::cout << "Setting Tx frequency: " << (tx_freq/1e6) << " MHz." << std::endl;
- std::cout << "Actual Tx frequency: " << (tx_radio_ctrl->set_tx_frequency(tx_freq, tx_chan)/1e6) << " MHz." << std::endl;
+ std::cout << "Actual Tx rate: " << (actual_tx_rate / 1e6) << " Msps" << std::endl;
+ std::cout << "Setting Tx frequency: " << (tx_freq / 1e6) << " MHz." << std::endl;
+ std::cout << "Actual Tx frequency: "
+ << (tx_radio_ctrl->set_tx_frequency(tx_freq, tx_chan) / 1e6) << " MHz."
+ << std::endl;
if (tx_gain) {
std::cout << "Setting Tx gain: " << (tx_gain) << " dB." << std::endl;
- std::cout << "Actual Tx gain: " << (tx_radio_ctrl->set_tx_gain(tx_gain, tx_chan)) << " dB." << std::endl;
+ std::cout << "Actual Tx gain: " << (tx_radio_ctrl->set_tx_gain(tx_gain, tx_chan))
+ << " dB." << std::endl;
}
if (not tx_ant.empty()) {
std::cout << "Setting Tx antenna: " << (tx_ant) << "." << std::endl;
tx_radio_ctrl->set_tx_antenna(tx_ant, tx_chan);
- std::cout << "Actual Tx antenna: " << tx_radio_ctrl->get_tx_antenna(tx_chan) << "." << std::endl;
+ std::cout << "Actual Tx antenna: " << tx_radio_ctrl->get_tx_antenna(tx_chan)
+ << "." << std::endl;
}
// Compare rates
if (not uhd::math::frequencies_are_equal(actual_rx_rate, actual_tx_rate)) {
- std::cout << "Error: Failed to set receive and transmit radios to same sampling rate!" << std::endl;
+ std::cout
+ << "Error: Failed to set receive and transmit radios to same sampling rate!"
+ << std::endl;
return EXIT_FAILURE;
}
// Create graph and connect blocks
uhd::rfnoc::graph::sptr graph = dev->create_graph("radio_loopback");
std::cout << "Connecting radios..." << std::endl;
try {
- graph->connect(
- rx_blockid, rx_chan,
- tx_blockid, tx_chan
- );
- } catch (const uhd::runtime_error &ex) {
+ graph->connect(rx_blockid, rx_chan, tx_blockid, tx_chan);
+ } catch (const uhd::runtime_error& ex) {
std::cout << "Error connecting blocks: " << std::endl;
std::cout << ex.what() << std::endl;
return EXIT_FAILURE;
@@ -170,8 +180,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
rx_radio_ctrl->set_rx_streamer(true, rx_chan);
// Allow for some setup time
- std::this_thread::sleep_for(
- std::chrono::milliseconds(int64_t(setup_time * 1000)));
+ std::this_thread::sleep_for(std::chrono::milliseconds(int64_t(setup_time * 1000)));
// Arm SIGINT handler
std::signal(SIGINT, &sig_int_handler);
@@ -179,17 +188,16 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
// Calculate timeout and set timers
if (total_time == 0 and total_num_samps > 0) {
const double buffer_time = 1.0; // seconds
- total_time = (1.0/rate) * total_num_samps + buffer_time;
+ total_time = (1.0 / rate) * total_num_samps + buffer_time;
}
// Start streaming
- uhd::stream_cmd_t stream_cmd((total_num_samps == 0)?
- uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS:
- uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE
- );
- stream_cmd.num_samps = size_t(total_num_samps);
+ uhd::stream_cmd_t stream_cmd((total_num_samps == 0)
+ ? uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS
+ : uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
+ stream_cmd.num_samps = size_t(total_num_samps);
stream_cmd.stream_now = true;
- stream_cmd.time_spec = uhd::time_spec_t();
+ stream_cmd.time_spec = uhd::time_spec_t();
std::cout << "Issuing start stream cmd..." << std::endl;
rx_radio_ctrl->issue_stream_cmd(stream_cmd, rx_chan);
std::cout << "Wait..." << std::endl;
@@ -208,4 +216,3 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
return EXIT_SUCCESS;
}
-
diff --git a/host/examples/rfnoc_rx_to_file.cpp b/host/examples/rfnoc_rx_to_file.cpp
index 8993d52b7..98b0a5479 100644
--- a/host/examples/rfnoc_rx_to_file.cpp
+++ b/host/examples/rfnoc_rx_to_file.cpp
@@ -15,42 +15,45 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
-#include <uhd/types/tune_request.hpp>
-#include <uhd/types/sensors.hpp>
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/device3.hpp>
+#include <uhd/exception.hpp>
#include <uhd/rfnoc/radio_ctrl.hpp>
#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-#include <uhd/exception.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/types/sensors.hpp>
+#include <uhd/types/tune_request.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
-#include <iostream>
-#include <fstream>
-#include <csignal>
+#include <boost/program_options.hpp>
+#include <chrono>
#include <complex>
+#include <csignal>
+#include <fstream>
+#include <iostream>
#include <thread>
-#include <chrono>
namespace po = boost::program_options;
-const int64_t UPDATE_INTERVAL = 1; //1 second update interval for BW summary
+const int64_t UPDATE_INTERVAL = 1; // 1 second update interval for BW summary
static bool stop_signal_called = false;
-void sig_int_handler(int){stop_signal_called = true;}
+void sig_int_handler(int)
+{
+ stop_signal_called = true;
+}
-template<typename samp_type> void recv_to_file(
- uhd::rx_streamer::sptr rx_stream,
- const std::string &file,
+template <typename samp_type>
+void recv_to_file(uhd::rx_streamer::sptr rx_stream,
+ const std::string& file,
const size_t samps_per_buff,
const double rx_rate,
const unsigned long long num_requested_samples,
- double time_requested = 0.0,
- bool bw_summary = false,
- bool stats = false,
- bool enable_size_map = false,
- bool continue_on_bad_packet = false
-){
+ double time_requested = 0.0,
+ bool bw_summary = false,
+ bool stats = false,
+ bool enable_size_map = false,
+ bool continue_on_bad_packet = false)
+{
unsigned long long num_total_samps = 0;
uhd::rx_metadata_t md;
@@ -61,65 +64,61 @@ template<typename samp_type> void recv_to_file(
}
bool overflow_message = true;
- //setup streaming
- uhd::stream_cmd_t stream_cmd((num_requested_samples == 0)?
- uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS:
- uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE
- );
- stream_cmd.num_samps = size_t(num_requested_samples);
+ // setup streaming
+ uhd::stream_cmd_t stream_cmd((num_requested_samples == 0)
+ ? uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS
+ : uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
+ stream_cmd.num_samps = size_t(num_requested_samples);
stream_cmd.stream_now = true;
- stream_cmd.time_spec = uhd::time_spec_t();
+ stream_cmd.time_spec = uhd::time_spec_t();
std::cout << "Issuing stream cmd" << std::endl;
rx_stream->issue_stream_cmd(stream_cmd);
const auto start_time = std::chrono::steady_clock::now();
const auto stop_time =
- start_time
- + std::chrono::milliseconds(int64_t(1000 * time_requested));
+ start_time + std::chrono::milliseconds(int64_t(1000 * time_requested));
// Track time and samps between updating the BW summary
- auto last_update = start_time;
+ auto last_update = start_time;
unsigned long long last_update_samps = 0;
- typedef std::map<size_t,size_t> SizeMap;
+ typedef std::map<size_t, size_t> SizeMap;
SizeMap mapSizes;
// Run this loop until either time expired (if a duration was given), until
// the requested number of samples were collected (if such a number was
// given), or until Ctrl-C was pressed.
while (not stop_signal_called
- and (num_requested_samples != num_total_samps
- or num_requested_samples == 0)
- and (time_requested == 0.0
- or std::chrono::steady_clock::now() <= stop_time)
- ) {
+ and (num_requested_samples != num_total_samps or num_requested_samples == 0)
+ and (time_requested == 0.0 or std::chrono::steady_clock::now() <= stop_time)) {
const auto now = std::chrono::steady_clock::now();
- size_t num_rx_samps = rx_stream->recv(&buff.front(), buff.size(), md, 3.0, enable_size_map);
+ size_t num_rx_samps =
+ rx_stream->recv(&buff.front(), buff.size(), md, 3.0, enable_size_map);
if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT) {
std::cout << boost::format("Timeout while streaming") << std::endl;
break;
}
- if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW){
+ if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW) {
if (overflow_message) {
overflow_message = false;
- std::cerr << boost::format(
- "Got an overflow indication. Please consider the following:\n"
- " Your write medium must sustain a rate of %fMB/s.\n"
- " Dropped samples will not be written to the file.\n"
- " Please modify this example for your purposes.\n"
- " This message will not appear again.\n"
- ) % (rx_rate*sizeof(samp_type)/1e6);
+ std::cerr
+ << boost::format(
+ "Got an overflow indication. Please consider the following:\n"
+ " Your write medium must sustain a rate of %fMB/s.\n"
+ " Dropped samples will not be written to the file.\n"
+ " Please modify this example for your purposes.\n"
+ " This message will not appear again.\n")
+ % (rx_rate * sizeof(samp_type) / 1e6);
}
continue;
}
- if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE){
+ if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
std::string error = str(boost::format("Receiver error: %s") % md.strerror());
- if (continue_on_bad_packet){
+ if (continue_on_bad_packet) {
std::cerr << error << std::endl;
continue;
- }
- else
+ } else
throw std::runtime_error(error);
}
@@ -133,7 +132,7 @@ template<typename samp_type> void recv_to_file(
num_total_samps += num_rx_samps;
if (outfile.is_open()) {
- outfile.write((const char*)&buff.front(), num_rx_samps*sizeof(samp_type));
+ outfile.write((const char*)&buff.front(), num_rx_samps * sizeof(samp_type));
}
if (bw_summary) {
@@ -142,14 +141,12 @@ template<typename samp_type> void recv_to_file(
if (time_since_last_update > std::chrono::seconds(UPDATE_INTERVAL)) {
const double time_since_last_update_s =
std::chrono::duration<double>(time_since_last_update).count();
- const double rate =
- double(last_update_samps) / time_since_last_update_s;
- std::cout << "\t" << (rate/1e6) << " MSps" << std::endl;
+ const double rate = double(last_update_samps) / time_since_last_update_s;
+ std::cout << "\t" << (rate / 1e6) << " MSps" << std::endl;
last_update_samps = 0;
- last_update = now;
+ last_update = now;
}
}
-
}
const auto actual_stop_time = std::chrono::steady_clock::now();
@@ -161,7 +158,7 @@ template<typename samp_type> void recv_to_file(
int num_post_samps = 0;
do {
num_post_samps = rx_stream->recv(&buff.front(), buff.size(), md, 3.0);
- } while(num_post_samps and md.error_code == uhd::rx_metadata_t::ERROR_CODE_NONE);
+ } while (num_post_samps and md.error_code == uhd::rx_metadata_t::ERROR_CODE_NONE);
if (outfile.is_open())
outfile.close();
@@ -172,13 +169,11 @@ template<typename samp_type> void recv_to_file(
const double actual_duration_seconds =
std::chrono::duration<float>(actual_stop_time - start_time).count();
- std::cout
- << boost::format("Received %d samples in %f seconds")
- % num_total_samps
- % actual_duration_seconds
- << std::endl;
+ std::cout << boost::format("Received %d samples in %f seconds") % num_total_samps
+ % actual_duration_seconds
+ << std::endl;
const double rate = (double)num_total_samps / actual_duration_seconds;
- std::cout << (rate/1e6) << " MSps" << std::endl;
+ std::cout << (rate / 1e6) << " MSps" << std::endl;
if (enable_size_map) {
std::cout << std::endl;
@@ -189,23 +184,26 @@ template<typename samp_type> void recv_to_file(
}
}
-typedef boost::function<uhd::sensor_value_t (const std::string&)> get_sensor_fn_t;
+typedef boost::function<uhd::sensor_value_t(const std::string&)> get_sensor_fn_t;
-bool check_locked_sensor(std::vector<std::string> sensor_names, const char* sensor_name, get_sensor_fn_t get_sensor_fn, double setup_time){
- if (std::find(sensor_names.begin(), sensor_names.end(), sensor_name) == sensor_names.end())
+bool check_locked_sensor(std::vector<std::string> sensor_names,
+ const char* sensor_name,
+ get_sensor_fn_t get_sensor_fn,
+ double setup_time)
+{
+ if (std::find(sensor_names.begin(), sensor_names.end(), sensor_name)
+ == sensor_names.end())
return false;
- auto setup_timeout =
- std::chrono::steady_clock::now()
- + std::chrono::milliseconds(int64_t(setup_time * 1000));
+ auto setup_timeout = std::chrono::steady_clock::now()
+ + std::chrono::milliseconds(int64_t(setup_time * 1000));
bool lock_detected = false;
std::cout << boost::format("Waiting for \"%s\": ") % sensor_name;
std::cout.flush();
while (true) {
- if (lock_detected and
- (std::chrono::steady_clock::now() > setup_timeout)) {
+ if (lock_detected and (std::chrono::steady_clock::now() > setup_timeout)) {
std::cout << " locked." << std::endl;
break;
}
@@ -213,14 +211,13 @@ bool check_locked_sensor(std::vector<std::string> sensor_names, const char* sens
std::cout << "+";
std::cout.flush();
lock_detected = true;
- }
- else {
+ } else {
if (std::chrono::steady_clock::now() > setup_timeout) {
std::cout << std::endl;
- throw std::runtime_error(str(
- boost::format("timed out waiting for consecutive locks on sensor \"%s\"")
- % sensor_name
- ));
+ throw std::runtime_error(
+ str(boost::format(
+ "timed out waiting for consecutive locks on sensor \"%s\"")
+ % sensor_name));
}
std::cout << "_";
std::cout.flush();
@@ -232,15 +229,17 @@ bool check_locked_sensor(std::vector<std::string> sensor_names, const char* sens
return true;
}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
- std::string args, file, format, ant, subdev, ref, wirefmt, streamargs, radio_args, block_id, block_args;
+ // variables to be set by po
+ std::string args, file, format, ant, subdev, ref, wirefmt, streamargs, radio_args,
+ block_id, block_args;
size_t total_num_samps, spb, radio_id, radio_chan;
double rate, freq, gain, bw, total_time, setup_time;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -280,26 +279,27 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
+ // print the help message
if (vm.count("help")) {
std::cout << boost::format("UHD/RFNoC RX samples to file %s") % desc << std::endl;
- std::cout
- << std::endl
- << "This application streams data from a single channel of a USRP device to a file.\n"
- << std::endl;
+ std::cout << std::endl
+ << "This application streams data from a single channel of a USRP "
+ "device to a file.\n"
+ << std::endl;
return ~0;
}
bool bw_summary = vm.count("progress") > 0;
- bool stats = vm.count("stats") > 0;
+ bool stats = vm.count("stats") > 0;
if (vm.count("null") > 0) {
file = "";
}
- bool enable_size_map = vm.count("sizemap") > 0;
+ bool enable_size_map = vm.count("sizemap") > 0;
bool continue_on_bad_packet = vm.count("continue") > 0;
if (enable_size_map) {
- std::cout << "Packet size tracking enabled - will only recv one packet at a time!" << std::endl;
+ std::cout << "Packet size tracking enabled - will only recv one packet at a time!"
+ << std::endl;
}
if (format != "sc16" and format != "fc32" and format != "fc64") {
@@ -311,12 +311,14 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
* Create device and block controls
***********************************************************************/
std::cout << std::endl;
- std::cout << boost::format("Creating the USRP device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the USRP device with: %s...") % args
+ << std::endl;
uhd::device3::sptr usrp = uhd::device3::make(args);
// Create handle for radio object
uhd::rfnoc::block_id_t radio_ctrl_id(0, "Radio", radio_id);
// This next line will fail if the radio is not actually available
- uhd::rfnoc::radio_ctrl::sptr radio_ctrl = usrp->get_block_ctrl< uhd::rfnoc::radio_ctrl >(radio_ctrl_id);
+ uhd::rfnoc::radio_ctrl::sptr radio_ctrl =
+ usrp->get_block_ctrl<uhd::rfnoc::radio_ctrl>(radio_ctrl_id);
std::cout << "Using radio " << radio_id << ", channel " << radio_chan << std::endl;
/************************************************************************
@@ -324,60 +326,73 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
***********************************************************************/
radio_ctrl->set_args(radio_args);
if (vm.count("ref")) {
- std::cout << "TODO -- Need to implement API call to set clock source." << std::endl;
- //Lock mboard clocks TODO
- //usrp->set_clock_source(ref);
+ std::cout << "TODO -- Need to implement API call to set clock source."
+ << std::endl;
+ // Lock mboard clocks TODO
+ // usrp->set_clock_source(ref);
}
- //set the sample rate
- if (rate <= 0.0){
+ // set the sample rate
+ if (rate <= 0.0) {
std::cerr << "Please specify a valid sample rate" << std::endl;
return EXIT_FAILURE;
}
- std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate/1e6) << std::endl;
+ std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate / 1e6) << std::endl;
radio_ctrl->set_rate(rate);
- std::cout << boost::format("Actual RX Rate: %f Msps...") % (radio_ctrl->get_rate()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Rate: %f Msps...")
+ % (radio_ctrl->get_rate() / 1e6)
+ << std::endl
+ << std::endl;
- //set the center frequency
+ // set the center frequency
if (vm.count("freq")) {
- std::cout << boost::format("Setting RX Freq: %f MHz...") % (freq/1e6) << std::endl;
+ std::cout << boost::format("Setting RX Freq: %f MHz...") % (freq / 1e6)
+ << std::endl;
uhd::tune_request_t tune_request(freq);
if (vm.count("int-n")) {
- //tune_request.args = uhd::device_addr_t("mode_n=integer"); TODO
+ // tune_request.args = uhd::device_addr_t("mode_n=integer"); TODO
}
radio_ctrl->set_rx_frequency(freq, radio_chan);
- std::cout << boost::format("Actual RX Freq: %f MHz...") % (radio_ctrl->get_rx_frequency(radio_chan)/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Freq: %f MHz...")
+ % (radio_ctrl->get_rx_frequency(radio_chan) / 1e6)
+ << std::endl
+ << std::endl;
}
- //set the rf gain
+ // set the rf gain
if (vm.count("gain")) {
std::cout << boost::format("Setting RX Gain: %f dB...") % gain << std::endl;
radio_ctrl->set_rx_gain(gain, radio_chan);
- std::cout << boost::format("Actual RX Gain: %f dB...") % radio_ctrl->get_rx_gain(radio_chan) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Gain: %f dB...")
+ % radio_ctrl->get_rx_gain(radio_chan)
+ << std::endl
+ << std::endl;
}
- //set the IF filter bandwidth
+ // set the IF filter bandwidth
if (vm.count("bw")) {
- //std::cout << boost::format("Setting RX Bandwidth: %f MHz...") % (bw/1e6) << std::endl;
- //radio_ctrl->set_rx_bandwidth(bw, radio_chan); // TODO
- //std::cout << boost::format("Actual RX Bandwidth: %f MHz...") % (radio_ctrl->get_rx_bandwidth(radio_chan)/1e6) << std::endl << std::endl;
+ // std::cout << boost::format("Setting RX Bandwidth: %f MHz...") % (bw/1e6) <<
+ // std::endl; radio_ctrl->set_rx_bandwidth(bw, radio_chan); // TODO std::cout <<
+ // boost::format("Actual RX Bandwidth: %f MHz...") %
+ // (radio_ctrl->get_rx_bandwidth(radio_chan)/1e6) << std::endl << std::endl;
}
- //set the antenna
+ // set the antenna
if (vm.count("ant")) {
radio_ctrl->set_rx_antenna(ant, radio_chan);
}
- std::this_thread::sleep_for(
- std::chrono::milliseconds(int64_t(1000 * setup_time))
- );
+ std::this_thread::sleep_for(std::chrono::milliseconds(int64_t(1000 * setup_time)));
- //check Ref and LO Lock detect
- if (not vm.count("skip-lo")){
+ // check Ref and LO Lock detect
+ if (not vm.count("skip-lo")) {
// TODO
- //check_locked_sensor(usrp->get_rx_sensor_names(0), "lo_locked", boost::bind(&uhd::usrp::multi_usrp::get_rx_sensor, usrp, _1, radio_id), setup_time);
- //if (ref == "external")
- //check_locked_sensor(usrp->get_mboard_sensor_names(0), "ref_locked", boost::bind(&uhd::usrp::multi_usrp::get_mboard_sensor, usrp, _1, radio_id), setup_time);
+ // check_locked_sensor(usrp->get_rx_sensor_names(0), "lo_locked",
+ // boost::bind(&uhd::usrp::multi_usrp::get_rx_sensor, usrp, _1, radio_id),
+ // setup_time); if (ref == "external")
+ // check_locked_sensor(usrp->get_mboard_sensor_names(0), "ref_locked",
+ // boost::bind(&uhd::usrp::multi_usrp::get_mboard_sensor, usrp, _1, radio_id),
+ // setup_time);
}
size_t spp = radio_ctrl->get_arg<int>("spp");
@@ -392,12 +407,13 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
// Set the stream args on the radio:
if (block_id.empty()) {
// If no extra block is required, connect to the radio:
- streamer_args["block_id"] = radio_ctrl_id.to_string();
+ streamer_args["block_id"] = radio_ctrl_id.to_string();
streamer_args["block_port"] = str(boost::format("%d") % radio_chan);
} else {
// Otherwise, see if the requested block exists and connect it to the radio:
if (not usrp->has_block(block_id)) {
- std::cout << "Block does not exist on current device: " << block_id << std::endl;
+ std::cout << "Block does not exist on current device: " << block_id
+ << std::endl;
return EXIT_FAILURE;
}
@@ -409,17 +425,20 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
blk_ctrl->set_args(uhd::device_addr_t(block_args));
}
// Connect:
- std::cout << "Connecting " << radio_ctrl_id << " ==> " << blk_ctrl->get_block_id() << std::endl;
- rx_graph->connect(radio_ctrl_id, radio_chan, blk_ctrl->get_block_id(), uhd::rfnoc::ANY_PORT);
+ std::cout << "Connecting " << radio_ctrl_id << " ==> " << blk_ctrl->get_block_id()
+ << std::endl;
+ rx_graph->connect(
+ radio_ctrl_id, radio_chan, blk_ctrl->get_block_id(), uhd::rfnoc::ANY_PORT);
streamer_args["block_id"] = blk_ctrl->get_block_id().to_string();
spp = blk_ctrl->get_args().cast<size_t>("spp", spp);
}
- //create a receive streamer
+ // create a receive streamer
std::cout << "Samples per packet: " << spp << std::endl;
- uhd::stream_args_t stream_args(format, "sc16"); // We should read the wire format from the blocks
- stream_args.args = streamer_args;
+ uhd::stream_args_t stream_args(
+ format, "sc16"); // We should read the wire format from the blocks
+ stream_args.args = streamer_args;
stream_args.args["spp"] = boost::lexical_cast<std::string>(spp);
std::cout << "Using streamer args: " << stream_args.args.to_string() << std::endl;
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
@@ -429,14 +448,27 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
std::cout << "Press Ctrl + C to stop streaming..." << std::endl;
}
#define recv_to_file_args() \
- (rx_stream, file, spb, rate, total_num_samps, total_time, bw_summary, stats, enable_size_map, continue_on_bad_packet)
- //recv to file
- if (format == "fc64") recv_to_file<std::complex<double> >recv_to_file_args();
- else if (format == "fc32") recv_to_file<std::complex<float> >recv_to_file_args();
- else if (format == "sc16") recv_to_file<std::complex<short> >recv_to_file_args();
- else throw std::runtime_error("Unknown data format: " + format);
-
- //finished
+ (rx_stream, \
+ file, \
+ spb, \
+ rate, \
+ total_num_samps, \
+ total_time, \
+ bw_summary, \
+ stats, \
+ enable_size_map, \
+ continue_on_bad_packet)
+ // recv to file
+ if (format == "fc64")
+ recv_to_file<std::complex<double>> recv_to_file_args();
+ else if (format == "fc32")
+ recv_to_file<std::complex<float>> recv_to_file_args();
+ else if (format == "sc16")
+ recv_to_file<std::complex<short>> recv_to_file_args();
+ else
+ throw std::runtime_error("Unknown data format: " + format);
+
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/rx_ascii_art_dft.cpp b/host/examples/rx_ascii_art_dft.cpp
index 8e4179fe3..a82d8ee49 100644
--- a/host/examples/rx_ascii_art_dft.cpp
+++ b/host/examples/rx_ascii_art_dft.cpp
@@ -5,33 +5,34 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
-#include <uhd/usrp/multi_usrp.hpp>
#include "ascii_art_dft.hpp" //implementation
-#include <boost/program_options.hpp>
-#include <boost/format.hpp>
+#include <uhd/usrp/multi_usrp.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <curses.h>
-#include <iostream>
+#include <boost/format.hpp>
+#include <boost/program_options.hpp>
+#include <chrono>
#include <complex>
#include <cstdlib>
-#include <chrono>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
using std::chrono::high_resolution_clock;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args, ant, subdev, ref;
size_t num_bins;
double rate, freq, gain, bw, frame_rate, step;
float ref_lvl, dyn_rng;
bool show_controls;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -59,150 +60,176 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help") or not vm.count("rate")){
+ // print the help message
+ if (vm.count("help") or not vm.count("rate")) {
std::cout << boost::format("UHD RX ASCII Art DFT %s") % desc << std::endl;
return EXIT_FAILURE;
}
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
- //Lock mboard clocks
+ // Lock mboard clocks
usrp->set_clock_source(ref);
- //always select the subdevice first, the channel mapping affects the other settings
- if (vm.count("subdev")) usrp->set_rx_subdev_spec(subdev);
+ // always select the subdevice first, the channel mapping affects the other settings
+ if (vm.count("subdev"))
+ usrp->set_rx_subdev_spec(subdev);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //set the sample rate
- if (not vm.count("rate")){
+ // set the sample rate
+ if (not vm.count("rate")) {
std::cerr << "Please specify the sample rate with --rate" << std::endl;
return EXIT_FAILURE;
}
- std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate/1e6) << std::endl;
+ std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate / 1e6) << std::endl;
usrp->set_rx_rate(rate);
- std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp->get_rx_rate()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp->get_rx_rate() / 1e6)
+ << std::endl
+ << std::endl;
- //set the center frequency
- if (not vm.count("freq")){
+ // set the center frequency
+ if (not vm.count("freq")) {
std::cerr << "Please specify the center frequency with --freq" << std::endl;
return EXIT_FAILURE;
}
- std::cout << boost::format("Setting RX Freq: %f MHz...") % (freq/1e6) << std::endl;
+ std::cout << boost::format("Setting RX Freq: %f MHz...") % (freq / 1e6) << std::endl;
uhd::tune_request_t tune_request(freq);
- if(vm.count("int-n")) tune_request.args = uhd::device_addr_t("mode_n=integer");
+ if (vm.count("int-n"))
+ tune_request.args = uhd::device_addr_t("mode_n=integer");
usrp->set_rx_freq(tune_request);
- std::cout << boost::format("Actual RX Freq: %f MHz...") % (usrp->get_rx_freq()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Freq: %f MHz...") % (usrp->get_rx_freq() / 1e6)
+ << std::endl
+ << std::endl;
- //set the rf gain
- if (vm.count("gain")){
+ // set the rf gain
+ if (vm.count("gain")) {
std::cout << boost::format("Setting RX Gain: %f dB...") % gain << std::endl;
usrp->set_rx_gain(gain);
- std::cout << boost::format("Actual RX Gain: %f dB...") % usrp->get_rx_gain() << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Gain: %f dB...") % usrp->get_rx_gain()
+ << std::endl
+ << std::endl;
} else {
gain = usrp->get_rx_gain();
}
- //set the analog frontend filter bandwidth
- if (vm.count("bw")){
- std::cout << boost::format("Setting RX Bandwidth: %f MHz...") % (bw/1e6) << std::endl;
+ // set the analog frontend filter bandwidth
+ if (vm.count("bw")) {
+ std::cout << boost::format("Setting RX Bandwidth: %f MHz...") % (bw / 1e6)
+ << std::endl;
usrp->set_rx_bandwidth(bw);
- std::cout << boost::format("Actual RX Bandwidth: %f MHz...") % (usrp->get_rx_bandwidth()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Bandwidth: %f MHz...")
+ % (usrp->get_rx_bandwidth() / 1e6)
+ << std::endl
+ << std::endl;
} else {
bw = usrp->get_rx_bandwidth();
}
- //set the antenna
- if (vm.count("ant")) usrp->set_rx_antenna(ant);
+ // set the antenna
+ if (vm.count("ant"))
+ usrp->set_rx_antenna(ant);
- std::this_thread::sleep_for(std::chrono::seconds(1)); //allow for some setup time
+ std::this_thread::sleep_for(std::chrono::seconds(1)); // allow for some setup time
- //Check Ref and LO Lock detect
+ // Check Ref and LO Lock detect
std::vector<std::string> sensor_names;
sensor_names = usrp->get_rx_sensor_names(0);
- if (std::find(sensor_names.begin(), sensor_names.end(), "lo_locked") != sensor_names.end()) {
- uhd::sensor_value_t lo_locked = usrp->get_rx_sensor("lo_locked",0);
- std::cout << boost::format("Checking RX: %s ...") % lo_locked.to_pp_string() << std::endl;
+ if (std::find(sensor_names.begin(), sensor_names.end(), "lo_locked")
+ != sensor_names.end()) {
+ uhd::sensor_value_t lo_locked = usrp->get_rx_sensor("lo_locked", 0);
+ std::cout << boost::format("Checking RX: %s ...") % lo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(lo_locked.to_bool());
}
sensor_names = usrp->get_mboard_sensor_names(0);
- if ((ref == "mimo") and (std::find(sensor_names.begin(), sensor_names.end(), "mimo_locked") != sensor_names.end())) {
- uhd::sensor_value_t mimo_locked = usrp->get_mboard_sensor("mimo_locked",0);
- std::cout << boost::format("Checking RX: %s ...") % mimo_locked.to_pp_string() << std::endl;
+ if ((ref == "mimo")
+ and (std::find(sensor_names.begin(), sensor_names.end(), "mimo_locked")
+ != sensor_names.end())) {
+ uhd::sensor_value_t mimo_locked = usrp->get_mboard_sensor("mimo_locked", 0);
+ std::cout << boost::format("Checking RX: %s ...") % mimo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(mimo_locked.to_bool());
}
- if ((ref == "external") and (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked") != sensor_names.end())) {
- uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked",0);
- std::cout << boost::format("Checking RX: %s ...") % ref_locked.to_pp_string() << std::endl;
+ if ((ref == "external")
+ and (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked")
+ != sensor_names.end())) {
+ uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked", 0);
+ std::cout << boost::format("Checking RX: %s ...") % ref_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(ref_locked.to_bool());
}
- //create a receive streamer
- uhd::stream_args_t stream_args("fc32"); //complex floats
+ // create a receive streamer
+ uhd::stream_args_t stream_args("fc32"); // complex floats
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
- //allocate recv buffer and metatdata
+ // allocate recv buffer and metatdata
uhd::rx_metadata_t md;
- std::vector<std::complex<float> > buff(num_bins);
+ std::vector<std::complex<float>> buff(num_bins);
//------------------------------------------------------------------
//-- Initialize
//------------------------------------------------------------------
- initscr(); //curses init
+ initscr(); // curses init
rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
auto next_refresh = high_resolution_clock::now();
//------------------------------------------------------------------
//-- Main loop
//------------------------------------------------------------------
- while (true){
- //read a buffer's worth of samples every iteration
- size_t num_rx_samps = rx_stream->recv(
- &buff.front(), buff.size(), md
- );
- if (num_rx_samps != buff.size()) continue;
-
- //check and update the display refresh condition
+ while (true) {
+ // read a buffer's worth of samples every iteration
+ size_t num_rx_samps = rx_stream->recv(&buff.front(), buff.size(), md);
+ if (num_rx_samps != buff.size())
+ continue;
+
+ // check and update the display refresh condition
if (high_resolution_clock::now() < next_refresh) {
continue;
}
- next_refresh =
- high_resolution_clock::now()
- + std::chrono::microseconds(int64_t(1e6/frame_rate));
+ next_refresh = high_resolution_clock::now()
+ + std::chrono::microseconds(int64_t(1e6 / frame_rate));
- //calculate the dft and create the ascii art frame
+ // calculate the dft and create the ascii art frame
ascii_art_dft::log_pwr_dft_type lpdft(
- ascii_art_dft::log_pwr_dft(&buff.front(), num_rx_samps)
- );
- std::string frame = ascii_art_dft::dft_to_plot(
- lpdft, COLS, (show_controls ? LINES-6 : LINES),
+ ascii_art_dft::log_pwr_dft(&buff.front(), num_rx_samps));
+ std::string frame = ascii_art_dft::dft_to_plot(lpdft,
+ COLS,
+ (show_controls ? LINES - 6 : LINES),
usrp->get_rx_rate(),
usrp->get_rx_freq(),
- dyn_rng, ref_lvl
- );
+ dyn_rng,
+ ref_lvl);
std::string border = std::string((COLS), '-');
- //curses screen handling: clear and print frame
+ // curses screen handling: clear and print frame
clear();
if (show_controls) {
printw("%s", border.c_str());
printw("[f-F]req: %4.3f MHz | [r-R]ate: %2.2f Msps |"
" [b-B]w: %2.2f MHz | [g-G]ain: %2.0f dB\n\n",
- freq/1e6, rate/1e6, bw/1e6, gain);
+ freq / 1e6,
+ rate / 1e6,
+ bw / 1e6,
+ gain);
printw("[d-D]yn Range: %2.0f dB | Ref [l-L]evel: %2.0f dB |"
" fp[s-S] : %2.0f | [t-T]uning step: %3.3f M\n",
- dyn_rng, ref_lvl, frame_rate, step/1e6);
+ dyn_rng,
+ ref_lvl,
+ frame_rate,
+ step / 1e6);
printw("(press c to toggle controls)\n");
printw("%s", border.c_str());
}
printw("%s", frame.c_str());
- //curses key handling: no timeout, any key to exit
+ // curses key handling: no timeout, any key to exit
timeout(0);
int ch = getch();
@@ -255,33 +282,35 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
freq = usrp->get_rx_freq();
}
- else if (ch == 'l') ref_lvl -= 10;
- else if (ch == 'L') ref_lvl += 10;
- else if (ch == 'd') dyn_rng -= 10;
- else if (ch == 'D') dyn_rng += 10;
+ else if (ch == 'l')
+ ref_lvl -= 10;
+ else if (ch == 'L')
+ ref_lvl += 10;
+ else if (ch == 'd')
+ dyn_rng -= 10;
+ else if (ch == 'D')
+ dyn_rng += 10;
else if (ch == 's') {
if (frame_rate > 1) {
frame_rate -= 1;
}
- }
- else if (ch == 'S') {
+ } else if (ch == 'S') {
frame_rate += 1;
- }
- else if (ch == 't') {
+ } else if (ch == 't') {
if (step > 1) {
step /= 2;
}
- }
- else if (ch == 'T') step *= 2;
+ } else if (ch == 'T')
+ step *= 2;
else if (ch == 'c' || ch == 'C') {
show_controls = !show_controls;
}
-
+
// Arrow keypress generates 3 characters:
// '\033', '[', 'A'/'B'/'C'/'D' for Up / Down / Right / Left
else if (ch == '\033') {
getch();
- switch(getch()) {
+ switch (getch()) {
case 'A':
case 'C':
freq += step;
@@ -296,17 +325,17 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
freq = usrp->get_rx_freq();
break;
}
- }
- else if (ch != KEY_RESIZE and ch != ERR) break;
+ } else if (ch != KEY_RESIZE and ch != ERR)
+ break;
}
//------------------------------------------------------------------
//-- Cleanup
//------------------------------------------------------------------
rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
- endwin(); //curses done
+ endwin(); // curses done
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/rx_multi_samples.cpp b/host/examples/rx_multi_samples.cpp
index 8c50c5b69..f395b69b7 100644
--- a/host/examples/rx_multi_samples.cpp
+++ b/host/examples/rx_multi_samples.cpp
@@ -5,29 +5,30 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <boost/program_options.hpp>
-#include <boost/format.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/algorithm/string.hpp>
-#include <iostream>
-#include <complex>
+#include <boost/format.hpp>
+#include <boost/program_options.hpp>
#include <chrono>
+#include <complex>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args, sync, subdev, channel_list;
double seconds_in_future;
size_t total_num_samps;
double rate;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -46,138 +47,145 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD RX Multi Samples %s") % desc << std::endl;
- std::cout <<
- " This is a demonstration of how to receive aligned data from multiple channels.\n"
- " This example can receive from multiple DSPs, multiple motherboards, or both.\n"
- " The MIMO cable or PPS can be used to synchronize the configuration. See --sync\n"
- "\n"
- " Specify --subdev to select multiple channels per motherboard.\n"
- " Ex: --subdev=\"0:A 0:B\" to get 2 channels on a Basic RX.\n"
- "\n"
- " Specify --args to select multiple motherboards in a configuration.\n"
- " Ex: --args=\"addr0=192.168.10.2, addr1=192.168.10.3\"\n"
- << std::endl;
+ std::cout
+ << " This is a demonstration of how to receive aligned data from multiple "
+ "channels.\n"
+ " This example can receive from multiple DSPs, multiple motherboards, "
+ "or both.\n"
+ " The MIMO cable or PPS can be used to synchronize the configuration. "
+ "See --sync\n"
+ "\n"
+ " Specify --subdev to select multiple channels per motherboard.\n"
+ " Ex: --subdev=\"0:A 0:B\" to get 2 channels on a Basic RX.\n"
+ "\n"
+ " Specify --args to select multiple motherboards in a configuration.\n"
+ " Ex: --args=\"addr0=192.168.10.2, addr1=192.168.10.3\"\n"
+ << std::endl;
return ~0;
}
bool verbose = vm.count("dilv") == 0;
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
- //always select the subdevice first, the channel mapping affects the other settings
- if (vm.count("subdev")) usrp->set_rx_subdev_spec(subdev); //sets across all mboards
+ // always select the subdevice first, the channel mapping affects the other settings
+ if (vm.count("subdev"))
+ usrp->set_rx_subdev_spec(subdev); // sets across all mboards
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //set the rx sample rate (sets across all channels)
- std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate/1e6) << std::endl;
+ // set the rx sample rate (sets across all channels)
+ std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate / 1e6) << std::endl;
usrp->set_rx_rate(rate);
- std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp->get_rx_rate()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp->get_rx_rate() / 1e6)
+ << std::endl
+ << std::endl;
std::cout << boost::format("Setting device timestamp to 0...") << std::endl;
- if (sync == "now"){
- //This is not a true time lock, the devices will be off by a few RTT.
- //Rather, this is just to allow for demonstration of the code below.
+ if (sync == "now") {
+ // This is not a true time lock, the devices will be off by a few RTT.
+ // Rather, this is just to allow for demonstration of the code below.
usrp->set_time_now(uhd::time_spec_t(0.0));
- }
- else if (sync == "pps"){
+ } else if (sync == "pps") {
usrp->set_time_source("external");
usrp->set_time_unknown_pps(uhd::time_spec_t(0.0));
- std::this_thread::sleep_for(std::chrono::seconds(1)); //wait for pps sync pulse
- }
- else if (sync == "mimo"){
+ std::this_thread::sleep_for(std::chrono::seconds(1)); // wait for pps sync pulse
+ } else if (sync == "mimo") {
UHD_ASSERT_THROW(usrp->get_num_mboards() == 2);
- //make mboard 1 a slave over the MIMO Cable
+ // make mboard 1 a slave over the MIMO Cable
usrp->set_clock_source("mimo", 1);
usrp->set_time_source("mimo", 1);
- //set time on the master (mboard 0)
+ // set time on the master (mboard 0)
usrp->set_time_now(uhd::time_spec_t(0.0), 0);
- //sleep a bit while the slave locks its time to the master
+ // sleep a bit while the slave locks its time to the master
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
- //detect which channels to use
+ // detect which channels to use
std::vector<std::string> channel_strings;
std::vector<size_t> channel_nums;
boost::split(channel_strings, channel_list, boost::is_any_of("\"',"));
- for(size_t ch = 0; ch < channel_strings.size(); ch++){
+ for (size_t ch = 0; ch < channel_strings.size(); ch++) {
size_t chan = std::stoi(channel_strings[ch]);
- if(chan >= usrp->get_rx_num_channels()){
+ if (chan >= usrp->get_rx_num_channels()) {
throw std::runtime_error("Invalid channel(s) specified.");
- }
- else channel_nums.push_back(std::stoi(channel_strings[ch]));
+ } else
+ channel_nums.push_back(std::stoi(channel_strings[ch]));
}
- //create a receive streamer
- //linearly map channels (index0 = channel0, index1 = channel1, ...)
- uhd::stream_args_t stream_args("fc32"); //complex floats
- stream_args.channels = channel_nums;
+ // create a receive streamer
+ // linearly map channels (index0 = channel0, index1 = channel1, ...)
+ uhd::stream_args_t stream_args("fc32"); // complex floats
+ stream_args.channels = channel_nums;
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
- //setup streaming
+ // setup streaming
std::cout << std::endl;
- std::cout << boost::format(
- "Begin streaming %u samples, %f seconds in the future..."
- ) % total_num_samps % seconds_in_future << std::endl;
+ std::cout << boost::format("Begin streaming %u samples, %f seconds in the future...")
+ % total_num_samps % seconds_in_future
+ << std::endl;
uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
- stream_cmd.num_samps = total_num_samps;
+ stream_cmd.num_samps = total_num_samps;
stream_cmd.stream_now = false;
- stream_cmd.time_spec = uhd::time_spec_t(seconds_in_future);
- rx_stream->issue_stream_cmd(stream_cmd); //tells all channels to stream
+ stream_cmd.time_spec = uhd::time_spec_t(seconds_in_future);
+ rx_stream->issue_stream_cmd(stream_cmd); // tells all channels to stream
- //meta-data will be filled in by recv()
+ // meta-data will be filled in by recv()
uhd::rx_metadata_t md;
- //allocate buffers to receive with samples (one buffer per channel)
+ // allocate buffers to receive with samples (one buffer per channel)
const size_t samps_per_buff = rx_stream->get_max_num_samps();
- std::vector<std::vector<std::complex<float> > > buffs(
- usrp->get_rx_num_channels(), std::vector<std::complex<float> >(samps_per_buff)
- );
+ std::vector<std::vector<std::complex<float>>> buffs(
+ usrp->get_rx_num_channels(), std::vector<std::complex<float>>(samps_per_buff));
- //create a vector of pointers to point to each of the channel buffers
- std::vector<std::complex<float> *> buff_ptrs;
- for (size_t i = 0; i < buffs.size(); i++) buff_ptrs.push_back(&buffs[i].front());
+ // create a vector of pointers to point to each of the channel buffers
+ std::vector<std::complex<float>*> buff_ptrs;
+ for (size_t i = 0; i < buffs.size(); i++)
+ buff_ptrs.push_back(&buffs[i].front());
- //the first call to recv() will block this many seconds before receiving
- double timeout = seconds_in_future + 0.1; //timeout (delay before receive + padding)
+ // the first call to recv() will block this many seconds before receiving
+ double timeout = seconds_in_future + 0.1; // timeout (delay before receive + padding)
- size_t num_acc_samps = 0; //number of accumulated samples
- while(num_acc_samps < total_num_samps){
- //receive a single packet
- size_t num_rx_samps = rx_stream->recv(
- buff_ptrs, samps_per_buff, md, timeout
- );
+ size_t num_acc_samps = 0; // number of accumulated samples
+ while (num_acc_samps < total_num_samps) {
+ // receive a single packet
+ size_t num_rx_samps = rx_stream->recv(buff_ptrs, samps_per_buff, md, timeout);
- //use a small timeout for subsequent packets
+ // use a small timeout for subsequent packets
timeout = 0.1;
- //handle the error code
- if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT) break;
- if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE){
- throw std::runtime_error(str(boost::format(
- "Receiver error %s"
- ) % md.strerror()));
+ // handle the error code
+ if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT)
+ break;
+ if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
+ throw std::runtime_error(
+ str(boost::format("Receiver error %s") % md.strerror()));
}
- if(verbose) std::cout << boost::format(
- "Received packet: %u samples, %u full secs, %f frac secs"
- ) % num_rx_samps % md.time_spec.get_full_secs() % md.time_spec.get_frac_secs() << std::endl;
+ if (verbose)
+ std::cout << boost::format(
+ "Received packet: %u samples, %u full secs, %f frac secs")
+ % num_rx_samps % md.time_spec.get_full_secs()
+ % md.time_spec.get_frac_secs()
+ << std::endl;
num_acc_samps += num_rx_samps;
}
- if (num_acc_samps < total_num_samps) std::cerr << "Receive timeout before all samples received..." << std::endl;
+ if (num_acc_samps < total_num_samps)
+ std::cerr << "Receive timeout before all samples received..." << std::endl;
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/rx_samples_to_file.cpp b/host/examples/rx_samples_to_file.cpp
index c459fa257..66ec284de 100644
--- a/host/examples/rx_samples_to_file.cpp
+++ b/host/examples/rx_samples_to_file.cpp
@@ -5,47 +5,50 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include <uhd/exception.hpp>
#include <uhd/types/tune_request.hpp>
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <uhd/exception.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>
-#include <iostream>
-#include <fstream>
-#include <csignal>
+#include <boost/program_options.hpp>
+#include <chrono>
#include <complex>
+#include <csignal>
+#include <fstream>
+#include <iostream>
#include <thread>
-#include <chrono>
namespace po = boost::program_options;
static bool stop_signal_called = false;
-void sig_int_handler(int){stop_signal_called = true;}
-
-template<typename samp_type> void recv_to_file(
- uhd::usrp::multi_usrp::sptr usrp,
- const std::string &cpu_format,
- const std::string &wire_format,
- const size_t &channel,
- const std::string &file,
+void sig_int_handler(int)
+{
+ stop_signal_called = true;
+}
+
+template <typename samp_type>
+void recv_to_file(uhd::usrp::multi_usrp::sptr usrp,
+ const std::string& cpu_format,
+ const std::string& wire_format,
+ const size_t& channel,
+ const std::string& file,
size_t samps_per_buff,
unsigned long long num_requested_samples,
- double time_requested = 0.0,
- bool bw_summary = false,
- bool stats = false,
- bool null = false,
- bool enable_size_map = false,
- bool continue_on_bad_packet = false
-){
+ double time_requested = 0.0,
+ bool bw_summary = false,
+ bool stats = false,
+ bool null = false,
+ bool enable_size_map = false,
+ bool continue_on_bad_packet = false)
+{
unsigned long long num_total_samps = 0;
- //create a receive streamer
- uhd::stream_args_t stream_args(cpu_format,wire_format);
+ // create a receive streamer
+ uhd::stream_args_t stream_args(cpu_format, wire_format);
std::vector<size_t> channel_nums;
channel_nums.push_back(channel);
- stream_args.channels = channel_nums;
+ stream_args.channels = channel_nums;
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
uhd::rx_metadata_t md;
@@ -55,35 +58,30 @@ template<typename samp_type> void recv_to_file(
outfile.open(file.c_str(), std::ofstream::binary);
bool overflow_message = true;
- //setup streaming
- uhd::stream_cmd_t stream_cmd((num_requested_samples == 0)?
- uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS:
- uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE
- );
- stream_cmd.num_samps = size_t(num_requested_samples);
+ // setup streaming
+ uhd::stream_cmd_t stream_cmd((num_requested_samples == 0)
+ ? uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS
+ : uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
+ stream_cmd.num_samps = size_t(num_requested_samples);
stream_cmd.stream_now = true;
- stream_cmd.time_spec = uhd::time_spec_t();
+ stream_cmd.time_spec = uhd::time_spec_t();
rx_stream->issue_stream_cmd(stream_cmd);
- typedef std::map<size_t,size_t> SizeMap;
+ typedef std::map<size_t, size_t> SizeMap;
SizeMap mapSizes;
const auto start_time = std::chrono::steady_clock::now();
const auto stop_time =
- start_time
- + std::chrono::milliseconds(int64_t(1000 * time_requested));
+ start_time + std::chrono::milliseconds(int64_t(1000 * time_requested));
// Track time and samps between updating the BW summary
- auto last_update = start_time;
+ auto last_update = start_time;
unsigned long long last_update_samps = 0;
// Run this loop until either time expired (if a duration was given), until
// the requested number of samples were collected (if such a number was
// given), or until Ctrl-C was pressed.
while (not stop_signal_called
- and (num_requested_samples != num_total_samps
- or num_requested_samples == 0)
- and (time_requested == 0.0
- or std::chrono::steady_clock::now() <= stop_time)
- ) {
+ and (num_requested_samples != num_total_samps or num_requested_samples == 0)
+ and (time_requested == 0.0 or std::chrono::steady_clock::now() <= stop_time)) {
const auto now = std::chrono::steady_clock::now();
size_t num_rx_samps =
@@ -93,26 +91,26 @@ template<typename samp_type> void recv_to_file(
std::cout << boost::format("Timeout while streaming") << std::endl;
break;
}
- if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW){
+ if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW) {
if (overflow_message) {
overflow_message = false;
- std::cerr << boost::format(
- "Got an overflow indication. Please consider the following:\n"
- " Your write medium must sustain a rate of %fMB/s.\n"
- " Dropped samples will not be written to the file.\n"
- " Please modify this example for your purposes.\n"
- " This message will not appear again.\n"
- ) % (usrp->get_rx_rate(channel)*sizeof(samp_type)/1e6);
+ std::cerr
+ << boost::format(
+ "Got an overflow indication. Please consider the following:\n"
+ " Your write medium must sustain a rate of %fMB/s.\n"
+ " Dropped samples will not be written to the file.\n"
+ " Please modify this example for your purposes.\n"
+ " This message will not appear again.\n")
+ % (usrp->get_rx_rate(channel) * sizeof(samp_type) / 1e6);
}
continue;
}
- if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE){
+ if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
std::string error = str(boost::format("Receiver error: %s") % md.strerror());
- if (continue_on_bad_packet){
+ if (continue_on_bad_packet) {
std::cerr << error << std::endl;
continue;
- }
- else
+ } else
throw std::runtime_error(error);
}
@@ -126,10 +124,7 @@ template<typename samp_type> void recv_to_file(
num_total_samps += num_rx_samps;
if (outfile.is_open()) {
- outfile.write(
- (const char*)&buff.front(),
- num_rx_samps*sizeof(samp_type)
- );
+ outfile.write((const char*)&buff.front(), num_rx_samps * sizeof(samp_type));
}
if (bw_summary) {
@@ -138,11 +133,10 @@ template<typename samp_type> void recv_to_file(
if (time_since_last_update > std::chrono::seconds(1)) {
const double time_since_last_update_s =
std::chrono::duration<double>(time_since_last_update).count();
- const double rate =
- double(last_update_samps) / time_since_last_update_s;
- std::cout << "\t" << (rate/1e6) << " Msps" << std::endl;
+ const double rate = double(last_update_samps) / time_since_last_update_s;
+ std::cout << "\t" << (rate / 1e6) << " Msps" << std::endl;
last_update_samps = 0;
- last_update = now;
+ last_update = now;
}
}
}
@@ -160,13 +154,11 @@ template<typename samp_type> void recv_to_file(
const double actual_duration_seconds =
std::chrono::duration<float>(actual_stop_time - start_time).count();
- std::cout
- << boost::format("Received %d samples in %f seconds")
- % num_total_samps
- % actual_duration_seconds
- << std::endl;
+ std::cout << boost::format("Received %d samples in %f seconds") % num_total_samps
+ % actual_duration_seconds
+ << std::endl;
const double rate = (double)num_total_samps / actual_duration_seconds;
- std::cout << (rate/1e6) << " Msps" << std::endl;
+ std::cout << (rate / 1e6) << " Msps" << std::endl;
if (enable_size_map) {
std::cout << std::endl;
@@ -179,26 +171,24 @@ template<typename samp_type> void recv_to_file(
typedef std::function<uhd::sensor_value_t(const std::string&)> get_sensor_fn_t;
-bool check_locked_sensor(
- std::vector<std::string> sensor_names,
+bool check_locked_sensor(std::vector<std::string> sensor_names,
const char* sensor_name,
get_sensor_fn_t get_sensor_fn,
- double setup_time
-) {
- if (std::find(sensor_names.begin(), sensor_names.end(), sensor_name) == sensor_names.end())
+ double setup_time)
+{
+ if (std::find(sensor_names.begin(), sensor_names.end(), sensor_name)
+ == sensor_names.end())
return false;
- auto setup_timeout =
- std::chrono::steady_clock::now()
- + std::chrono::milliseconds(int64_t(setup_time * 1000));
+ auto setup_timeout = std::chrono::steady_clock::now()
+ + std::chrono::milliseconds(int64_t(setup_time * 1000));
bool lock_detected = false;
std::cout << boost::format("Waiting for \"%s\": ") % sensor_name;
std::cout.flush();
while (true) {
- if (lock_detected and
- (std::chrono::steady_clock::now() > setup_timeout)) {
+ if (lock_detected and (std::chrono::steady_clock::now() > setup_timeout)) {
std::cout << " locked." << std::endl;
break;
}
@@ -206,14 +196,13 @@ bool check_locked_sensor(
std::cout << "+";
std::cout.flush();
lock_detected = true;
- }
- else {
+ } else {
if (std::chrono::steady_clock::now() > setup_timeout) {
std::cout << std::endl;
- throw std::runtime_error(str(
- boost::format("timed out waiting for consecutive locks on sensor \"%s\"")
- % sensor_name
- ));
+ throw std::runtime_error(
+ str(boost::format(
+ "timed out waiting for consecutive locks on sensor \"%s\"")
+ % sensor_name));
}
std::cout << "_";
std::cout.flush();
@@ -224,15 +213,16 @@ bool check_locked_sensor(
return true;
}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args, file, type, ant, subdev, ref, wirefmt;
size_t channel, total_num_samps, spb;
double rate, freq, gain, bw, total_time, setup_time, lo_offset;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -269,132 +259,163 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
+ // print the help message
if (vm.count("help")) {
std::cout << boost::format("UHD RX samples to file %s") % desc << std::endl;
- std::cout
- << std::endl
- << "This application streams data from a single channel of a USRP device to a file.\n"
- << std::endl;
+ std::cout << std::endl
+ << "This application streams data from a single channel of a USRP "
+ "device to a file.\n"
+ << std::endl;
return ~0;
}
- bool bw_summary = vm.count("progress") > 0;
- bool stats = vm.count("stats") > 0;
- bool null = vm.count("null") > 0;
- bool enable_size_map = vm.count("sizemap") > 0;
+ bool bw_summary = vm.count("progress") > 0;
+ bool stats = vm.count("stats") > 0;
+ bool null = vm.count("null") > 0;
+ bool enable_size_map = vm.count("sizemap") > 0;
bool continue_on_bad_packet = vm.count("continue") > 0;
if (enable_size_map)
- std::cout << "Packet size tracking enabled - will only recv one packet at a time!" << std::endl;
+ std::cout << "Packet size tracking enabled - will only recv one packet at a time!"
+ << std::endl;
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
- //Lock mboard clocks
+ // Lock mboard clocks
usrp->set_clock_source(ref);
- //always select the subdevice first, the channel mapping affects the other settings
- if (vm.count("subdev")) usrp->set_rx_subdev_spec(subdev);
+ // always select the subdevice first, the channel mapping affects the other settings
+ if (vm.count("subdev"))
+ usrp->set_rx_subdev_spec(subdev);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //set the sample rate
- if (rate <= 0.0){
+ // set the sample rate
+ if (rate <= 0.0) {
std::cerr << "Please specify a valid sample rate" << std::endl;
return ~0;
}
- std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate/1e6) << std::endl;
+ std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate / 1e6) << std::endl;
usrp->set_rx_rate(rate, channel);
- std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp->get_rx_rate(channel)/1e6) << std::endl << std::endl;
-
- //set the center frequency
- if (vm.count("freq")) { //with default of 0.0 this will always be true
- std::cout << boost::format("Setting RX Freq: %f MHz...") % (freq/1e6) << std::endl;
- std::cout << boost::format("Setting RX LO Offset: %f MHz...") % (lo_offset/1e6)
+ std::cout << boost::format("Actual RX Rate: %f Msps...")
+ % (usrp->get_rx_rate(channel) / 1e6)
+ << std::endl
+ << std::endl;
+
+ // set the center frequency
+ if (vm.count("freq")) { // with default of 0.0 this will always be true
+ std::cout << boost::format("Setting RX Freq: %f MHz...") % (freq / 1e6)
+ << std::endl;
+ std::cout << boost::format("Setting RX LO Offset: %f MHz...") % (lo_offset / 1e6)
<< std::endl;
uhd::tune_request_t tune_request(freq, lo_offset);
- if(vm.count("int-n")) tune_request.args = uhd::device_addr_t("mode_n=integer");
+ if (vm.count("int-n"))
+ tune_request.args = uhd::device_addr_t("mode_n=integer");
usrp->set_rx_freq(tune_request, channel);
- std::cout << boost::format("Actual RX Freq: %f MHz...") % (usrp->get_rx_freq(channel)/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Freq: %f MHz...")
+ % (usrp->get_rx_freq(channel) / 1e6)
+ << std::endl
+ << std::endl;
}
- //set the rf gain
+ // set the rf gain
if (vm.count("gain")) {
std::cout << boost::format("Setting RX Gain: %f dB...") % gain << std::endl;
usrp->set_rx_gain(gain, channel);
- std::cout << boost::format("Actual RX Gain: %f dB...") % usrp->get_rx_gain(channel) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Gain: %f dB...")
+ % usrp->get_rx_gain(channel)
+ << std::endl
+ << std::endl;
}
- //set the IF filter bandwidth
+ // set the IF filter bandwidth
if (vm.count("bw")) {
- std::cout << boost::format("Setting RX Bandwidth: %f MHz...") % (bw/1e6) << std::endl;
+ std::cout << boost::format("Setting RX Bandwidth: %f MHz...") % (bw / 1e6)
+ << std::endl;
usrp->set_rx_bandwidth(bw, channel);
- std::cout << boost::format("Actual RX Bandwidth: %f MHz...") % (usrp->get_rx_bandwidth(channel)/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Bandwidth: %f MHz...")
+ % (usrp->get_rx_bandwidth(channel) / 1e6)
+ << std::endl
+ << std::endl;
}
- //set the antenna
- if (vm.count("ant")) usrp->set_rx_antenna(ant, channel);
+ // set the antenna
+ if (vm.count("ant"))
+ usrp->set_rx_antenna(ant, channel);
- std::this_thread::sleep_for(
- std::chrono::milliseconds(int64_t(1000 * setup_time))
- );
+ std::this_thread::sleep_for(std::chrono::milliseconds(int64_t(1000 * setup_time)));
- //check Ref and LO Lock detect
- if (not vm.count("skip-lo")){
- check_locked_sensor(
- usrp->get_rx_sensor_names(channel),
+ // check Ref and LO Lock detect
+ if (not vm.count("skip-lo")) {
+ check_locked_sensor(usrp->get_rx_sensor_names(channel),
"lo_locked",
- [usrp,channel](const std::string& sensor_name){
+ [usrp, channel](const std::string& sensor_name) {
return usrp->get_rx_sensor(sensor_name, channel);
},
- setup_time
- );
+ setup_time);
if (ref == "mimo") {
- check_locked_sensor(
- usrp->get_mboard_sensor_names(0),
+ check_locked_sensor(usrp->get_mboard_sensor_names(0),
"mimo_locked",
- [usrp](const std::string& sensor_name){
+ [usrp](const std::string& sensor_name) {
return usrp->get_mboard_sensor(sensor_name);
},
- setup_time
- );
+ setup_time);
}
if (ref == "external") {
- check_locked_sensor(
- usrp->get_mboard_sensor_names(0),
+ check_locked_sensor(usrp->get_mboard_sensor_names(0),
"ref_locked",
- [usrp](const std::string& sensor_name){
+ [usrp](const std::string& sensor_name) {
return usrp->get_mboard_sensor(sensor_name);
},
- setup_time
- );
+ setup_time);
}
}
- if (total_num_samps == 0){
+ if (total_num_samps == 0) {
std::signal(SIGINT, &sig_int_handler);
std::cout << "Press Ctrl + C to stop streaming..." << std::endl;
}
#define recv_to_file_args(format) \
- (usrp, format, wirefmt, channel, file, spb, total_num_samps, total_time, bw_summary, stats, null, enable_size_map, continue_on_bad_packet)
- //recv to file
+ (usrp, \
+ format, \
+ wirefmt, \
+ channel, \
+ file, \
+ spb, \
+ total_num_samps, \
+ total_time, \
+ bw_summary, \
+ stats, \
+ null, \
+ enable_size_map, \
+ continue_on_bad_packet)
+ // recv to file
if (wirefmt == "s16") {
- if (type == "double") recv_to_file<double>recv_to_file_args("f64");
- else if (type == "float") recv_to_file<float>recv_to_file_args("f32");
- else if (type == "short") recv_to_file<short>recv_to_file_args("s16");
- else throw std::runtime_error("Unknown type " + type);
+ if (type == "double")
+ recv_to_file<double> recv_to_file_args("f64");
+ else if (type == "float")
+ recv_to_file<float> recv_to_file_args("f32");
+ else if (type == "short")
+ recv_to_file<short> recv_to_file_args("s16");
+ else
+ throw std::runtime_error("Unknown type " + type);
} else {
- if (type == "double") recv_to_file<std::complex<double> >recv_to_file_args("fc64");
- else if (type == "float") recv_to_file<std::complex<float> >recv_to_file_args("fc32");
- else if (type == "short") recv_to_file<std::complex<short> >recv_to_file_args("sc16");
- else throw std::runtime_error("Unknown type " + type);
+ if (type == "double")
+ recv_to_file<std::complex<double>> recv_to_file_args("fc64");
+ else if (type == "float")
+ recv_to_file<std::complex<float>> recv_to_file_args("fc32");
+ else if (type == "short")
+ recv_to_file<std::complex<short>> recv_to_file_args("sc16");
+ else
+ throw std::runtime_error("Unknown type " + type);
}
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/rx_samples_to_udp.cpp b/host/examples/rx_samples_to_udp.cpp
index 5268de020..6dd04ec6a 100644
--- a/host/examples/rx_samples_to_udp.cpp
+++ b/host/examples/rx_samples_to_udp.cpp
@@ -5,31 +5,32 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include <uhd/exception.hpp>
+#include <uhd/transport/udp_simple.hpp>
#include <uhd/types/tune_request.hpp>
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <uhd/transport/udp_simple.hpp>
-#include <uhd/exception.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
-#include <iostream>
-#include <complex>
+#include <boost/program_options.hpp>
#include <chrono>
+#include <complex>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args, file, ant, subdev, ref;
size_t total_num_samps;
double rate, freq, gain, bw;
std::string addr, port;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -52,122 +53,144 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD RX to UDP %s") % desc << std::endl;
return ~0;
}
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //Lock mboard clocks
+ // Lock mboard clocks
usrp->set_clock_source(ref);
- //always select the subdevice first, the channel mapping affects the other settings
+ // always select the subdevice first, the channel mapping affects the other settings
if (vm.count("subdev")) {
usrp->set_rx_subdev_spec(subdev);
}
- //set the rx sample rate
- std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate/1e6) << std::endl;
+ // set the rx sample rate
+ std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate / 1e6) << std::endl;
usrp->set_rx_rate(rate);
- std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp->get_rx_rate()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp->get_rx_rate() / 1e6)
+ << std::endl
+ << std::endl;
- //set the rx center frequency
- std::cout << boost::format("Setting RX Freq: %f MHz...") % (freq/1e6) << std::endl;
+ // set the rx center frequency
+ std::cout << boost::format("Setting RX Freq: %f MHz...") % (freq / 1e6) << std::endl;
uhd::tune_request_t tune_request(freq);
- if(vm.count("int-n")) tune_request.args = uhd::device_addr_t("mode_n=integer");
+ if (vm.count("int-n"))
+ tune_request.args = uhd::device_addr_t("mode_n=integer");
usrp->set_rx_freq(tune_request);
- std::cout << boost::format("Actual RX Freq: %f MHz...") % (usrp->get_rx_freq()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Freq: %f MHz...") % (usrp->get_rx_freq() / 1e6)
+ << std::endl
+ << std::endl;
- //set the rx rf gain
+ // set the rx rf gain
std::cout << boost::format("Setting RX Gain: %f dB...") % gain << std::endl;
usrp->set_rx_gain(gain);
- std::cout << boost::format("Actual RX Gain: %f dB...") % usrp->get_rx_gain() << std::endl << std::endl;
-
- //set the analog frontend filter bandwidth
- if (vm.count("bw")){
- std::cout << boost::format("Setting RX Bandwidth: %f MHz...") % (bw/1e6) << std::endl;
+ std::cout << boost::format("Actual RX Gain: %f dB...") % usrp->get_rx_gain()
+ << std::endl
+ << std::endl;
+
+ // set the analog frontend filter bandwidth
+ if (vm.count("bw")) {
+ std::cout << boost::format("Setting RX Bandwidth: %f MHz...") % (bw / 1e6)
+ << std::endl;
usrp->set_rx_bandwidth(bw);
- std::cout << boost::format("Actual RX Bandwidth: %f MHz...") % (usrp->get_rx_bandwidth()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Bandwidth: %f MHz...")
+ % (usrp->get_rx_bandwidth() / 1e6)
+ << std::endl
+ << std::endl;
}
- //set the antenna
- if (vm.count("ant")) usrp->set_rx_antenna(ant);
+ // set the antenna
+ if (vm.count("ant"))
+ usrp->set_rx_antenna(ant);
- std::this_thread::sleep_for(std::chrono::seconds(1)); //allow for some setup time
+ std::this_thread::sleep_for(std::chrono::seconds(1)); // allow for some setup time
- //Check Ref and LO Lock detect
+ // Check Ref and LO Lock detect
std::vector<std::string> sensor_names;
sensor_names = usrp->get_rx_sensor_names(0);
- if (std::find(sensor_names.begin(), sensor_names.end(), "lo_locked") != sensor_names.end()) {
- uhd::sensor_value_t lo_locked = usrp->get_rx_sensor("lo_locked",0);
- std::cout << boost::format("Checking RX: %s ...") % lo_locked.to_pp_string() << std::endl;
+ if (std::find(sensor_names.begin(), sensor_names.end(), "lo_locked")
+ != sensor_names.end()) {
+ uhd::sensor_value_t lo_locked = usrp->get_rx_sensor("lo_locked", 0);
+ std::cout << boost::format("Checking RX: %s ...") % lo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(lo_locked.to_bool());
}
sensor_names = usrp->get_mboard_sensor_names(0);
- if ((ref == "mimo") and (std::find(sensor_names.begin(), sensor_names.end(), "mimo_locked") != sensor_names.end())) {
- uhd::sensor_value_t mimo_locked = usrp->get_mboard_sensor("mimo_locked",0);
- std::cout << boost::format("Checking RX: %s ...") % mimo_locked.to_pp_string() << std::endl;
+ if ((ref == "mimo")
+ and (std::find(sensor_names.begin(), sensor_names.end(), "mimo_locked")
+ != sensor_names.end())) {
+ uhd::sensor_value_t mimo_locked = usrp->get_mboard_sensor("mimo_locked", 0);
+ std::cout << boost::format("Checking RX: %s ...") % mimo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(mimo_locked.to_bool());
}
- if ((ref == "external") and (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked") != sensor_names.end())) {
- uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked",0);
- std::cout << boost::format("Checking RX: %s ...") % ref_locked.to_pp_string() << std::endl;
+ if ((ref == "external")
+ and (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked")
+ != sensor_names.end())) {
+ uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked", 0);
+ std::cout << boost::format("Checking RX: %s ...") % ref_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(ref_locked.to_bool());
}
- //create a receive streamer
- uhd::stream_args_t stream_args("fc32"); //complex floats
+ // create a receive streamer
+ uhd::stream_args_t stream_args("fc32"); // complex floats
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
- //setup streaming
+ // setup streaming
uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
- stream_cmd.num_samps = total_num_samps;
+ stream_cmd.num_samps = total_num_samps;
stream_cmd.stream_now = true;
rx_stream->issue_stream_cmd(stream_cmd);
- //loop until total number of samples reached
- size_t num_acc_samps = 0; //number of accumulated samples
+ // loop until total number of samples reached
+ size_t num_acc_samps = 0; // number of accumulated samples
uhd::rx_metadata_t md;
- std::vector<std::complex<float> > buff(rx_stream->get_max_num_samps());
- uhd::transport::udp_simple::sptr udp_xport = uhd::transport::udp_simple::make_connected(addr, port);
-
- while(num_acc_samps < total_num_samps){
- size_t num_rx_samps = rx_stream->recv(
- &buff.front(), buff.size(), md
- );
-
- //handle the error codes
- switch(md.error_code){
- case uhd::rx_metadata_t::ERROR_CODE_NONE:
- break;
-
- case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT:
- if (num_acc_samps == 0) continue;
- std::cout << boost::format(
- "Got timeout before all samples received, possible packet loss, exiting loop..."
- ) << std::endl;
- goto done_loop;
-
- default:
- std::cout << boost::format(
- "Got error code 0x%x, exiting loop..."
- ) % md.error_code << std::endl;
- goto done_loop;
+ std::vector<std::complex<float>> buff(rx_stream->get_max_num_samps());
+ uhd::transport::udp_simple::sptr udp_xport =
+ uhd::transport::udp_simple::make_connected(addr, port);
+
+ while (num_acc_samps < total_num_samps) {
+ size_t num_rx_samps = rx_stream->recv(&buff.front(), buff.size(), md);
+
+ // handle the error codes
+ switch (md.error_code) {
+ case uhd::rx_metadata_t::ERROR_CODE_NONE:
+ break;
+
+ case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT:
+ if (num_acc_samps == 0)
+ continue;
+ std::cout << boost::format("Got timeout before all samples received, "
+ "possible packet loss, exiting loop...")
+ << std::endl;
+ goto done_loop;
+
+ default:
+ std::cout << boost::format("Got error code 0x%x, exiting loop...")
+ % md.error_code
+ << std::endl;
+ goto done_loop;
}
- //send complex single precision floating point samples over udp
- udp_xport->send(boost::asio::buffer(buff, num_rx_samps*sizeof(buff.front())));
+ // send complex single precision floating point samples over udp
+ udp_xport->send(boost::asio::buffer(buff, num_rx_samps * sizeof(buff.front())));
num_acc_samps += num_rx_samps;
- } done_loop:
+ }
+done_loop:
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/rx_timed_samples.cpp b/host/examples/rx_timed_samples.cpp
index cfe710409..6411cb4cc 100644
--- a/host/examples/rx_timed_samples.cpp
+++ b/host/examples/rx_timed_samples.cpp
@@ -5,21 +5,22 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <boost/program_options.hpp>
-#include <boost/format.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/algorithm/string.hpp>
-#include <iostream>
+#include <boost/format.hpp>
+#include <boost/program_options.hpp>
#include <complex>
+#include <iostream>
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args;
std::string wire;
double seconds_in_future;
@@ -27,7 +28,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
double rate;
std::string channel_list;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -45,96 +46,101 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD RX Timed Samples %s") % desc << std::endl;
return ~0;
}
bool verbose = vm.count("dilv") == 0;
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //detect which channels to use
+ // detect which channels to use
std::vector<std::string> channel_strings;
std::vector<size_t> channel_nums;
boost::split(channel_strings, channel_list, boost::is_any_of("\"',"));
- for(size_t ch = 0; ch < channel_strings.size(); ch++){
+ for (size_t ch = 0; ch < channel_strings.size(); ch++) {
size_t chan = std::stoi(channel_strings[ch]);
- if(chan >= usrp->get_tx_num_channels() or chan >= usrp->get_rx_num_channels()){
+ if (chan >= usrp->get_tx_num_channels() or chan >= usrp->get_rx_num_channels()) {
throw std::runtime_error("Invalid channel(s) specified.");
- }
- else channel_nums.push_back(std::stoi(channel_strings[ch]));
+ } else
+ channel_nums.push_back(std::stoi(channel_strings[ch]));
}
- //set the rx sample rate
- std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate/1e6) << std::endl;
+ // set the rx sample rate
+ std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate / 1e6) << std::endl;
usrp->set_rx_rate(rate);
- std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp->get_rx_rate()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp->get_rx_rate() / 1e6)
+ << std::endl
+ << std::endl;
std::cout << boost::format("Setting device timestamp to 0...") << std::endl;
usrp->set_time_now(uhd::time_spec_t(0.0));
- //create a receive streamer
- uhd::stream_args_t stream_args("fc32", wire); //complex floats
- stream_args.channels = channel_nums;
+ // create a receive streamer
+ uhd::stream_args_t stream_args("fc32", wire); // complex floats
+ stream_args.channels = channel_nums;
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
- //setup streaming
+ // setup streaming
std::cout << std::endl;
- std::cout << boost::format(
- "Begin streaming %u samples, %f seconds in the future..."
- ) % total_num_samps % seconds_in_future << std::endl;
+ std::cout << boost::format("Begin streaming %u samples, %f seconds in the future...")
+ % total_num_samps % seconds_in_future
+ << std::endl;
uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
- stream_cmd.num_samps = total_num_samps;
+ stream_cmd.num_samps = total_num_samps;
stream_cmd.stream_now = false;
- stream_cmd.time_spec = uhd::time_spec_t(seconds_in_future);
+ stream_cmd.time_spec = uhd::time_spec_t(seconds_in_future);
rx_stream->issue_stream_cmd(stream_cmd);
- //meta-data will be filled in by recv()
+ // meta-data will be filled in by recv()
uhd::rx_metadata_t md;
- //allocate buffer to receive with samples
- std::vector<std::complex<float> > buff(rx_stream->get_max_num_samps());
- std::vector<void *> buffs;
+ // allocate buffer to receive with samples
+ std::vector<std::complex<float>> buff(rx_stream->get_max_num_samps());
+ std::vector<void*> buffs;
for (size_t ch = 0; ch < rx_stream->get_num_channels(); ch++)
- buffs.push_back(&buff.front()); //same buffer for each channel
+ buffs.push_back(&buff.front()); // same buffer for each channel
- //the first call to recv() will block this many seconds before receiving
- double timeout = seconds_in_future + 0.1; //timeout (delay before receive + padding)
+ // the first call to recv() will block this many seconds before receiving
+ double timeout = seconds_in_future + 0.1; // timeout (delay before receive + padding)
- size_t num_acc_samps = 0; //number of accumulated samples
- while(num_acc_samps < total_num_samps){
- //receive a single packet
- size_t num_rx_samps = rx_stream->recv(
- buffs, buff.size(), md, timeout, true
- );
+ size_t num_acc_samps = 0; // number of accumulated samples
+ while (num_acc_samps < total_num_samps) {
+ // receive a single packet
+ size_t num_rx_samps = rx_stream->recv(buffs, buff.size(), md, timeout, true);
- //use a small timeout for subsequent packets
+ // use a small timeout for subsequent packets
timeout = 0.1;
- //handle the error code
- if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT) break;
- if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE){
- throw std::runtime_error(str(boost::format(
- "Receiver error %s"
- ) % md.strerror()));
+ // handle the error code
+ if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT)
+ break;
+ if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
+ throw std::runtime_error(
+ str(boost::format("Receiver error %s") % md.strerror()));
}
- if(verbose) std::cout << boost::format(
- "Received packet: %u samples, %u full secs, %f frac secs"
- ) % num_rx_samps % md.time_spec.get_full_secs() % md.time_spec.get_frac_secs() << std::endl;
+ if (verbose)
+ std::cout << boost::format(
+ "Received packet: %u samples, %u full secs, %f frac secs")
+ % num_rx_samps % md.time_spec.get_full_secs()
+ % md.time_spec.get_frac_secs()
+ << std::endl;
num_acc_samps += num_rx_samps;
}
- if (num_acc_samps < total_num_samps) std::cerr << "Receive timeout before all samples received..." << std::endl;
+ if (num_acc_samps < total_num_samps)
+ std::cerr << "Receive timeout before all samples received..." << std::endl;
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/sync_to_gps.cpp b/host/examples/sync_to_gps.cpp
index 3449aef55..952e7f8b3 100644
--- a/host/examples/sync_to_gps.cpp
+++ b/host/examples/sync_to_gps.cpp
@@ -4,13 +4,13 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
#include <boost/program_options.hpp>
-#include <iostream>
#include <chrono>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
@@ -18,20 +18,28 @@ namespace po = boost::program_options;
void print_notes(void)
{
// Helpful notes
- std::cout << boost::format("**************************************Helpful Notes on Clock/PPS Selection**************************************\n");
- std::cout << boost::format("As you can see, the default 10 MHz Reference and 1 PPS signals are now from the GPSDO.\n");
- std::cout << boost::format("If you would like to use the internal reference(TCXO) in other applications, you must configure that explicitly.\n");
- std::cout << boost::format("You can no longer select the external SMAs for 10 MHz or 1 PPS signaling.\n");
- std::cout << boost::format("****************************************************************************************************************\n");
+ std::cout << boost::format(
+ "**************************************Helpful Notes on Clock/PPS "
+ "Selection**************************************\n");
+ std::cout << boost::format("As you can see, the default 10 MHz Reference and 1 PPS "
+ "signals are now from the GPSDO.\n");
+ std::cout << boost::format(
+ "If you would like to use the internal reference(TCXO) in other applications, "
+ "you must configure that explicitly.\n");
+ std::cout << boost::format(
+ "You can no longer select the external SMAs for 10 MHz or 1 PPS signaling.\n");
+ std::cout << boost::format(
+ "********************************************************************************"
+ "********************************\n");
}
-int UHD_SAFE_MAIN(int argc, char *argv[])
+int UHD_SAFE_MAIN(int argc, char* argv[])
{
uhd::set_thread_priority_safe();
std::string args;
- //Set up program options
+ // Set up program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -43,27 +51,25 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //Print the help message
- if (vm.count("help"))
- {
+ // Print the help message
+ if (vm.count("help")) {
std::cout << boost::format("Synchronize USRP to GPS %s") % desc << std::endl;
return EXIT_FAILURE;
}
- //Create a USRP device
+ // Create a USRP device
std::cout << boost::format("\nCreating the USRP device with: %s...\n") % args;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
std::cout << boost::format("Using Device: %s\n") % usrp->get_pp_string();
- try
- {
- size_t num_mboards = usrp->get_num_mboards();
+ try {
+ size_t num_mboards = usrp->get_num_mboards();
size_t num_gps_locked = 0;
- for (size_t mboard = 0; mboard < num_mboards; mboard++)
- {
- std::cout << "Synchronizing mboard " << mboard << ": " << usrp->get_mboard_name(mboard) << std::endl;
+ for (size_t mboard = 0; mboard < num_mboards; mboard++) {
+ std::cout << "Synchronizing mboard " << mboard << ": "
+ << usrp->get_mboard_name(mboard) << std::endl;
- //Set references to GPSDO
+ // Set references to GPSDO
usrp->set_clock_source("gpsdo", mboard);
usrp->set_time_source("gpsdo", mboard);
@@ -71,112 +77,117 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
print_notes();
std::cout << std::endl;
- //Check for 10 MHz lock
+ // Check for 10 MHz lock
std::vector<std::string> sensor_names = usrp->get_mboard_sensor_names(mboard);
- if(std::find(sensor_names.begin(), sensor_names.end(), "ref_locked") != sensor_names.end())
- {
+ if (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked")
+ != sensor_names.end()) {
std::cout << "Waiting for reference lock..." << std::flush;
bool ref_locked = false;
- for (int i = 0; i < 30 and not ref_locked; i++)
- {
+ for (int i = 0; i < 30 and not ref_locked; i++) {
ref_locked = usrp->get_mboard_sensor("ref_locked", mboard).to_bool();
- if (not ref_locked)
- {
+ if (not ref_locked) {
std::cout << "." << std::flush;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
- if(ref_locked)
- {
+ if (ref_locked) {
std::cout << "LOCKED" << std::endl;
} else {
std::cout << "FAILED" << std::endl;
- std::cout << "Failed to lock to GPSDO 10 MHz Reference. Exiting." << std::endl;
+ std::cout << "Failed to lock to GPSDO 10 MHz Reference. Exiting."
+ << std::endl;
exit(EXIT_FAILURE);
}
- }
- else
- {
- std::cout << boost::format("ref_locked sensor not present on this board.\n");
+ } else {
+ std::cout << boost::format(
+ "ref_locked sensor not present on this board.\n");
}
- //Wait for GPS lock
+ // Wait for GPS lock
bool gps_locked = usrp->get_mboard_sensor("gps_locked", mboard).to_bool();
- if(gps_locked)
- {
+ if (gps_locked) {
num_gps_locked++;
std::cout << boost::format("GPS Locked\n");
- }
- else
- {
- std::cerr << "WARNING: GPS not locked - time will not be accurate until locked" << std::endl;
+ } else {
+ std::cerr
+ << "WARNING: GPS not locked - time will not be accurate until locked"
+ << std::endl;
}
- //Set to GPS time
- uhd::time_spec_t gps_time = uhd::time_spec_t(int64_t(usrp->get_mboard_sensor("gps_time", mboard).to_int()));
- usrp->set_time_next_pps(gps_time+1.0, mboard);
+ // Set to GPS time
+ uhd::time_spec_t gps_time = uhd::time_spec_t(
+ int64_t(usrp->get_mboard_sensor("gps_time", mboard).to_int()));
+ usrp->set_time_next_pps(gps_time + 1.0, mboard);
- //Wait for it to apply
- //The wait is 2 seconds because N-Series has a known issue where
- //the time at the last PPS does not properly update at the PPS edge
- //when the time is actually set.
+ // Wait for it to apply
+ // The wait is 2 seconds because N-Series has a known issue where
+ // the time at the last PPS does not properly update at the PPS edge
+ // when the time is actually set.
std::this_thread::sleep_for(std::chrono::seconds(2));
- //Check times
- gps_time = uhd::time_spec_t(int64_t(usrp->get_mboard_sensor("gps_time", mboard).to_int()));
+ // Check times
+ gps_time = uhd::time_spec_t(
+ int64_t(usrp->get_mboard_sensor("gps_time", mboard).to_int()));
uhd::time_spec_t time_last_pps = usrp->get_time_last_pps(mboard);
- std::cout << "USRP time: " << (boost::format("%0.9f") % time_last_pps.get_real_secs()) << std::endl;
- std::cout << "GPSDO time: " << (boost::format("%0.9f") % gps_time.get_real_secs()) << std::endl;
+ std::cout << "USRP time: "
+ << (boost::format("%0.9f") % time_last_pps.get_real_secs())
+ << std::endl;
+ std::cout << "GPSDO time: "
+ << (boost::format("%0.9f") % gps_time.get_real_secs()) << std::endl;
if (gps_time.get_real_secs() == time_last_pps.get_real_secs())
- std::cout << std::endl << "SUCCESS: USRP time synchronized to GPS time" << std::endl << std::endl;
+ std::cout << std::endl
+ << "SUCCESS: USRP time synchronized to GPS time" << std::endl
+ << std::endl;
else
- std::cerr << std::endl << "ERROR: Failed to synchronize USRP time to GPS time" << std::endl << std::endl;
+ std::cerr << std::endl
+ << "ERROR: Failed to synchronize USRP time to GPS time"
+ << std::endl
+ << std::endl;
}
- if (num_gps_locked == num_mboards and num_mboards > 1)
- {
- //Check to see if all USRP times are aligned
- //First, wait for PPS.
+ if (num_gps_locked == num_mboards and num_mboards > 1) {
+ // Check to see if all USRP times are aligned
+ // First, wait for PPS.
uhd::time_spec_t time_last_pps = usrp->get_time_last_pps();
- while (time_last_pps == usrp->get_time_last_pps())
- {
+ while (time_last_pps == usrp->get_time_last_pps()) {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
- //Sleep a little to make sure all devices have seen a PPS edge
+ // Sleep a little to make sure all devices have seen a PPS edge
std::this_thread::sleep_for(std::chrono::milliseconds(200));
- //Compare times across all mboards
- bool all_matched = true;
+ // Compare times across all mboards
+ bool all_matched = true;
uhd::time_spec_t mboard0_time = usrp->get_time_last_pps(0);
- for (size_t mboard = 1; mboard < num_mboards; mboard++)
- {
+ for (size_t mboard = 1; mboard < num_mboards; mboard++) {
uhd::time_spec_t mboard_time = usrp->get_time_last_pps(mboard);
- if (mboard_time != mboard0_time)
- {
+ if (mboard_time != mboard0_time) {
all_matched = false;
- std::cerr << (boost::format("ERROR: Times are not aligned: USRP 0=%0.9f, USRP %d=%0.9f")
- % mboard0_time.get_real_secs()
- % mboard
- % mboard_time.get_real_secs()) << std::endl;
+ std::cerr << (boost::format("ERROR: Times are not aligned: USRP "
+ "0=%0.9f, USRP %d=%0.9f")
+ % mboard0_time.get_real_secs() % mboard
+ % mboard_time.get_real_secs())
+ << std::endl;
}
}
- if (all_matched)
- {
+ if (all_matched) {
std::cout << "SUCCESS: USRP times aligned" << std::endl << std::endl;
} else {
- std::cout << "ERROR: USRP times are not aligned" << std::endl << std::endl;
+ std::cout << "ERROR: USRP times are not aligned" << std::endl
+ << std::endl;
}
}
- }
- catch (std::exception& e)
- {
+ } catch (std::exception& e) {
std::cout << boost::format("\nError: %s") % e.what();
- std::cout << boost::format("This could mean that you have not installed the GPSDO correctly.\n\n");
+ std::cout << boost::format(
+ "This could mean that you have not installed the GPSDO correctly.\n\n");
std::cout << boost::format("Visit one of these pages if the problem persists:\n");
- std::cout << boost::format(" * N2X0/E1X0: http://files.ettus.com/manual/page_gpsdo.html");
- std::cout << boost::format(" * X3X0: http://files.ettus.com/manual/page_gpsdo_x3x0.html\n\n");
- std::cout << boost::format(" * E3X0: http://files.ettus.com/manual/page_usrp_e3x0.html#e3x0_hw_gps\n\n");
+ std::cout << boost::format(
+ " * N2X0/E1X0: http://files.ettus.com/manual/page_gpsdo.html");
+ std::cout << boost::format(
+ " * X3X0: http://files.ettus.com/manual/page_gpsdo_x3x0.html\n\n");
+ std::cout << boost::format(
+ " * E3X0: http://files.ettus.com/manual/page_usrp_e3x0.html#e3x0_hw_gps\n\n");
exit(EXIT_FAILURE);
}
diff --git a/host/examples/test_clock_synch.cpp b/host/examples/test_clock_synch.cpp
index cb34e625c..96ebd05a6 100644
--- a/host/examples/test_clock_synch.cpp
+++ b/host/examples/test_clock_synch.cpp
@@ -7,17 +7,15 @@
#include <uhd/device.hpp>
#include <uhd/exception.hpp>
-#include <uhd/usrp_clock/multi_usrp_clock.hpp>
#include <uhd/types/time_spec.hpp>
#include <uhd/usrp/multi_usrp.hpp>
+#include <uhd/usrp_clock/multi_usrp_clock.hpp>
#include <uhd/utils/safe_main.hpp>
#include <uhd/utils/thread.hpp>
-
#include <boost/format.hpp>
#include <boost/program_options.hpp>
-
-#include <iostream>
#include <chrono>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
@@ -25,18 +23,20 @@ namespace po = boost::program_options;
using namespace uhd::usrp_clock;
using namespace uhd::usrp;
-void get_usrp_time(multi_usrp::sptr usrp, size_t mboard, std::vector<int64_t> *times){
+void get_usrp_time(multi_usrp::sptr usrp, size_t mboard, std::vector<int64_t>* times)
+{
(*times)[mboard] = usrp->get_time_now(mboard).get_full_secs();
}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //Variables to be set by command line options
+ // Variables to be set by command line options
std::string clock_args, usrp_args;
uint32_t max_interval, num_tests;
- //Set up program options
+ // Set up program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -51,83 +51,96 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //Print the help message
- if (vm.count("help")){
+ // Print the help message
+ if (vm.count("help")) {
std::cout << std::endl << "Test Clock Synchronization" << std::endl << std::endl;
std::cout << "This example shows how to use a clock device to" << std::endl
- << "synchronize the time on multiple USRP devices." << std::endl << std::endl;
+ << "synchronize the time on multiple USRP devices." << std::endl
+ << std::endl;
std::cout << desc << std::endl;
return EXIT_SUCCESS;
}
- //Create a Multi-USRP-Clock device (currently OctoClock only)
- std::cout << boost::format("\nCreating the Clock device with: %s") % clock_args << std::endl;
+ // Create a Multi-USRP-Clock device (currently OctoClock only)
+ std::cout << boost::format("\nCreating the Clock device with: %s") % clock_args
+ << std::endl;
multi_usrp_clock::sptr clock = multi_usrp_clock::make(clock_args);
- //Make sure Clock configuration is correct
- if(clock->get_sensor("gps_detected").value == "false"){
+ // Make sure Clock configuration is correct
+ if (clock->get_sensor("gps_detected").value == "false") {
throw uhd::runtime_error("No GPSDO detected on Clock.");
}
- if(clock->get_sensor("using_ref").value != "internal"){
+ if (clock->get_sensor("using_ref").value != "internal") {
throw uhd::runtime_error("Clock must be using an internal reference.");
}
- //Create a Multi-USRP device
- std::cout << boost::format("\nCreating the USRP device with: %s") % usrp_args << std::endl;
+ // Create a Multi-USRP device
+ std::cout << boost::format("\nCreating the USRP device with: %s") % usrp_args
+ << std::endl;
multi_usrp::sptr usrp = multi_usrp::make(usrp_args);
- //Store USRP device serials for useful output
+ // Store USRP device serials for useful output
std::vector<std::string> serials;
- for(size_t ch = 0; ch < usrp->get_num_mboards(); ch++){
+ for (size_t ch = 0; ch < usrp->get_num_mboards(); ch++) {
serials.push_back(usrp->get_usrp_tx_info(ch)["mboard_serial"]);
}
std::cout << std::endl << "Checking USRP devices for lock." << std::endl;
bool all_locked = true;
- for(size_t ch = 0; ch < usrp->get_num_mboards(); ch++){
- std::string ref_locked = usrp->get_mboard_sensor("ref_locked",ch).value;
+ for (size_t ch = 0; ch < usrp->get_num_mboards(); ch++) {
+ std::string ref_locked = usrp->get_mboard_sensor("ref_locked", ch).value;
std::cout << boost::format(" * %s: %s") % serials[ch] % ref_locked << std::endl;
- if(ref_locked != "true") all_locked = false;
+ if (ref_locked != "true")
+ all_locked = false;
}
- if(not all_locked) std::cout << std::endl << "WARNING: One or more devices not locked." << std::endl;
+ if (not all_locked)
+ std::cout << std::endl << "WARNING: One or more devices not locked." << std::endl;
- //Get GPS time to initially set USRP devices
- std::cout << std::endl << "Querying Clock for time and setting USRP times..." << std::endl << std::endl;
+ // Get GPS time to initially set USRP devices
+ std::cout << std::endl
+ << "Querying Clock for time and setting USRP times..." << std::endl
+ << std::endl;
int64_t clock_time = clock->get_time();
- usrp->set_time_next_pps(uhd::time_spec_t(double(clock_time+1)));
+ usrp->set_time_next_pps(uhd::time_spec_t(double(clock_time + 1)));
srand((unsigned int)time(NULL));
- std::cout << boost::format("Running %d comparisons at random intervals.") % num_tests << std::endl;
+ std::cout << boost::format("Running %d comparisons at random intervals.") % num_tests
+ << std::endl;
uint32_t num_matches = 0;
- for(size_t i = 0; i < num_tests; i++){
- //Wait random time before querying
+ for (size_t i = 0; i < num_tests; i++) {
+ // Wait random time before querying
uint16_t wait_time = rand() % max_interval;
std::this_thread::sleep_for(std::chrono::milliseconds(wait_time));
- //Get all times before output
+ // Get all times before output
std::vector<int64_t> usrp_times(usrp->get_num_mboards());
boost::thread_group thread_group;
clock_time = clock->get_time();
- for(size_t j = 0; j < usrp->get_num_mboards(); j++){
+ for (size_t j = 0; j < usrp->get_num_mboards(); j++) {
thread_group.create_thread(boost::bind(&get_usrp_time, usrp, j, &usrp_times));
}
- //Wait for threads to complete
+ // Wait for threads to complete
thread_group.join_all();
- std::cout << boost::format("Comparison #%d") % (i+1) << std::endl;
+ std::cout << boost::format("Comparison #%d") % (i + 1) << std::endl;
bool all_match = true;
std::cout << boost::format(" * Clock time: %d") % clock_time << std::endl;
- for(size_t j = 0; j < usrp->get_num_mboards(); j++){
- std::cout << boost::format(" * %s time: %d") % serials[j] % usrp_times[j] << std::endl;
- if(usrp_times[j] != clock_time) all_match = false;
+ for (size_t j = 0; j < usrp->get_num_mboards(); j++) {
+ std::cout << boost::format(" * %s time: %d") % serials[j] % usrp_times[j]
+ << std::endl;
+ if (usrp_times[j] != clock_time)
+ all_match = false;
}
- if(all_match) num_matches++;
+ if (all_match)
+ num_matches++;
}
- std::cout << std::endl << boost::format("Number of matches: %d/%d") % num_matches % num_tests << std::endl;
+ std::cout << std::endl
+ << boost::format("Number of matches: %d/%d") % num_matches % num_tests
+ << std::endl;
return EXIT_SUCCESS;
}
diff --git a/host/examples/test_dboard_coercion.cpp b/host/examples/test_dboard_coercion.cpp
index 1bbe6a81b..8ea2446fa 100644
--- a/host/examples/test_dboard_coercion.cpp
+++ b/host/examples/test_dboard_coercion.cpp
@@ -5,35 +5,38 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
#include <boost/math/special_functions/round.hpp>
-#include <iostream>
+#include <boost/program_options.hpp>
+#include <chrono>
#include <complex>
+#include <iostream>
+#include <thread>
#include <utility>
#include <vector>
-#include <chrono>
-#include <thread>
static const double SAMP_RATE = 1e6;
namespace po = boost::program_options;
-typedef std::pair<double, double> double_pair; //BOOST_FOREACH doesn't like commas
-typedef std::vector<std::pair<double, double> > pair_vector;
+typedef std::pair<double, double> double_pair; // BOOST_FOREACH doesn't like commas
+typedef std::vector<std::pair<double, double>> pair_vector;
/************************************************************************
* Misc functions
-************************************************************************/
+ ************************************************************************/
-std::string MHz_str(double freq){
+std::string MHz_str(double freq)
+{
return std::string(str(boost::format("%5.2f MHz") % (freq / 1e6)));
}
-std::string return_usrp_config_string(uhd::usrp::multi_usrp::sptr usrp, int chan, bool test_tx, bool test_rx, bool is_b2xx){
+std::string return_usrp_config_string(
+ uhd::usrp::multi_usrp::sptr usrp, int chan, bool test_tx, bool test_rx, bool is_b2xx)
+{
uhd::dict<std::string, std::string> tx_info = usrp->get_usrp_tx_info(chan);
uhd::dict<std::string, std::string> rx_info = usrp->get_usrp_rx_info(chan);
std::string info_string;
@@ -42,195 +45,236 @@ std::string return_usrp_config_string(uhd::usrp::multi_usrp::sptr usrp, int chan
std::string rx_serial, rx_subdev_name, rx_subdev_spec;
mboard_id = tx_info.get("mboard_id");
- if(tx_info.get("mboard_serial") == "") mboard_serial = "no serial";
- else mboard_serial = tx_info.get("mboard_serial");
-
- info_string = str(boost::format("Motherboard: %s (%s)\n") % mboard_id % mboard_serial);
-
- if(test_tx){
- if(tx_info.get("tx_serial") == "") tx_serial = "no serial";
- else tx_serial = tx_info.get("tx_serial");
+ if (tx_info.get("mboard_serial") == "")
+ mboard_serial = "no serial";
+ else
+ mboard_serial = tx_info.get("mboard_serial");
+
+ info_string =
+ str(boost::format("Motherboard: %s (%s)\n") % mboard_id % mboard_serial);
+
+ if (test_tx) {
+ if (tx_info.get("tx_serial") == "")
+ tx_serial = "no serial";
+ else
+ tx_serial = tx_info.get("tx_serial");
tx_subdev_name = tx_info.get("tx_subdev_name");
tx_subdev_spec = tx_info.get("tx_subdev_spec");
- info_string += is_b2xx ? str(boost::format("TX: %s (%s)")
- % tx_subdev_name % tx_subdev_spec)
- : str(boost::format("TX: %s (%s, %s)")
- % tx_subdev_name % tx_serial % tx_subdev_spec);
+ info_string +=
+ is_b2xx ? str(boost::format("TX: %s (%s)") % tx_subdev_name % tx_subdev_spec)
+ : str(boost::format("TX: %s (%s, %s)") % tx_subdev_name % tx_serial
+ % tx_subdev_spec);
}
- if(test_tx and test_rx) info_string += "\n";
- if(test_rx){
- if(rx_info.get("rx_serial") == "") rx_serial = "no serial";
- else rx_serial = rx_info.get("rx_serial");
+ if (test_tx and test_rx)
+ info_string += "\n";
+ if (test_rx) {
+ if (rx_info.get("rx_serial") == "")
+ rx_serial = "no serial";
+ else
+ rx_serial = rx_info.get("rx_serial");
rx_subdev_name = rx_info.get("rx_subdev_name");
rx_subdev_spec = rx_info.get("rx_subdev_spec");
- info_string += is_b2xx ? str(boost::format("RX: %s (%s)")
- % rx_subdev_name % rx_subdev_spec)
- : str(boost::format("RX: %s (%s, %s)")
- % rx_subdev_name % rx_serial % rx_subdev_spec);
+ info_string +=
+ is_b2xx ? str(boost::format("RX: %s (%s)") % rx_subdev_name % rx_subdev_spec)
+ : str(boost::format("RX: %s (%s, %s)") % rx_subdev_name % rx_serial
+ % rx_subdev_spec);
}
return info_string;
}
-std::string coercion_test(uhd::usrp::multi_usrp::sptr usrp, std::string type, int chan,
- bool test_gain, double freq_step, double gain_step, bool verbose){
-
- //Getting USRP info
- uhd::dict<std::string, std::string> usrp_info = (type == "TX") ? usrp->get_usrp_tx_info(chan)
- : usrp->get_usrp_rx_info(chan);
+std::string coercion_test(uhd::usrp::multi_usrp::sptr usrp,
+ std::string type,
+ int chan,
+ bool test_gain,
+ double freq_step,
+ double gain_step,
+ bool verbose)
+{
+ // Getting USRP info
+ uhd::dict<std::string, std::string> usrp_info =
+ (type == "TX") ? usrp->get_usrp_tx_info(chan) : usrp->get_usrp_rx_info(chan);
std::string subdev_name = (type == "TX") ? usrp_info.get("tx_subdev_name")
: usrp_info.get("rx_subdev_name");
std::string subdev_spec = (type == "TX") ? usrp_info.get("tx_subdev_spec")
: usrp_info.get("rx_subdev_spec");
- //Establish frequency range
+ // Establish frequency range
std::vector<double> freqs;
- std::vector<double> xcvr_freqs; //XCVR2450 has two ranges
- uhd::freq_range_t freq_ranges = (type == "TX") ? usrp->get_fe_tx_freq_range(chan)
- : usrp->get_fe_rx_freq_range(chan);
+ std::vector<double> xcvr_freqs; // XCVR2450 has two ranges
+ uhd::freq_range_t freq_ranges = (type == "TX") ? usrp->get_fe_tx_freq_range(chan)
+ : usrp->get_fe_rx_freq_range(chan);
std::cout << boost::format("\nTesting %s coercion...") % type << std::endl;
- for(const uhd::range_t &range: freq_ranges){
+ for (const uhd::range_t& range : freq_ranges) {
double freq_begin = range.start();
- double freq_end = range.stop();
+ double freq_end = range.stop();
- if(subdev_name.find("XCVR2450") == 0){
+ if (subdev_name.find("XCVR2450") == 0) {
xcvr_freqs.push_back(freq_begin);
xcvr_freqs.push_back(freq_end);
}
double current_freq = freq_begin;
- while(current_freq < freq_end){
+ while (current_freq < freq_end) {
freqs.push_back(current_freq);
current_freq += freq_step;
}
- if(freq_end != *freqs.end()) freqs.push_back(freq_end);
+ if (freq_end != *freqs.end())
+ freqs.push_back(freq_end);
}
std::vector<double> gains;
- if(test_gain){
- //Establish gain range
+ if (test_gain) {
+ // Establish gain range
uhd::gain_range_t gain_range = (type == "TX") ? usrp->get_tx_gain_range(chan)
: usrp->get_rx_gain_range(chan);
double gain_begin = gain_range.start();
- //Start gain at 0 if range begins negative
- if(gain_begin < 0.0) gain_begin = 0.0;
+ // Start gain at 0 if range begins negative
+ if (gain_begin < 0.0)
+ gain_begin = 0.0;
double gain_end = gain_range.stop();
double current_gain = gain_begin;
- while(current_gain < gain_end){
+ while (current_gain < gain_end) {
gains.push_back(current_gain);
current_gain += gain_step;
}
gains.push_back(gain_end);
}
- //Establish error-storing variables
+ // Establish error-storing variables
std::vector<double> bad_tune_freqs;
std::vector<double> no_lock_freqs;
pair_vector bad_gain_vals;
- //Sensor names
- std::vector<std::string> dboard_sensor_names = (type == "TX") ? usrp->get_tx_sensor_names(chan)
- : usrp->get_rx_sensor_names(chan);
+ // Sensor names
+ std::vector<std::string> dboard_sensor_names = (type == "TX")
+ ? usrp->get_tx_sensor_names(chan)
+ : usrp->get_rx_sensor_names(chan);
std::vector<std::string> mboard_sensor_names = usrp->get_mboard_sensor_names();
- bool has_sensor = (std::find(dboard_sensor_names.begin(), dboard_sensor_names.end(), "lo_locked")) != dboard_sensor_names.end();
-
- for(double freq: freqs){
+ bool has_sensor =
+ (std::find(dboard_sensor_names.begin(), dboard_sensor_names.end(), "lo_locked"))
+ != dboard_sensor_names.end();
- //Testing for successful frequency tune
- if(type == "TX") usrp->set_tx_freq(freq,chan);
- else usrp->set_rx_freq(freq,chan);
+ for (double freq : freqs) {
+ // Testing for successful frequency tune
+ if (type == "TX")
+ usrp->set_tx_freq(freq, chan);
+ else
+ usrp->set_rx_freq(freq, chan);
std::this_thread::sleep_for(std::chrono::microseconds(long(1000)));
double actual_freq = (type == "TX") ? usrp->get_tx_freq(chan)
: usrp->get_rx_freq(chan);
- if(freq == 0.0){
- if(floor(actual_freq + 0.5) == 0.0){
- if(verbose) std::cout << boost::format("\n%s frequency successfully tuned to %s.")
- % type % MHz_str(freq) << std::endl;
- }
- else{
- if(verbose) std::cout << boost::format("\n%s frequency tuned to %s instead of %s.")
- % type % MHz_str(actual_freq) % MHz_str(freq) << std::endl;
+ if (freq == 0.0) {
+ if (floor(actual_freq + 0.5) == 0.0) {
+ if (verbose)
+ std::cout << boost::format("\n%s frequency successfully tuned to %s.")
+ % type % MHz_str(freq)
+ << std::endl;
+ } else {
+ if (verbose)
+ std::cout << boost::format(
+ "\n%s frequency tuned to %s instead of %s.")
+ % type % MHz_str(actual_freq) % MHz_str(freq)
+ << std::endl;
bad_tune_freqs.push_back(freq);
}
- }
- else{
- if((freq / actual_freq > 0.9999) and (freq / actual_freq < 1.0001)){
- if(verbose) std::cout << boost::format("\n%s frequency successfully tuned to %s.")
- % type % MHz_str(freq) << std::endl;
- }
- else{
- if(verbose) std::cout << boost::format("\n%s frequency tuned to %s instead of %s.")
- % type % MHz_str(actual_freq) % MHz_str(freq) << std::endl;
+ } else {
+ if ((freq / actual_freq > 0.9999) and (freq / actual_freq < 1.0001)) {
+ if (verbose)
+ std::cout << boost::format("\n%s frequency successfully tuned to %s.")
+ % type % MHz_str(freq)
+ << std::endl;
+ } else {
+ if (verbose)
+ std::cout << boost::format(
+ "\n%s frequency tuned to %s instead of %s.")
+ % type % MHz_str(actual_freq) % MHz_str(freq)
+ << std::endl;
bad_tune_freqs.push_back(freq);
}
}
- //Testing for successful lock
+ // Testing for successful lock
if (has_sensor) {
bool is_locked = false;
- for(int i = 0; i < 1000; i++){
- is_locked = (type == "TX") ?
- usrp->get_tx_sensor("lo_locked", 0).to_bool() :
- usrp->get_rx_sensor("lo_locked", 0).to_bool();
+ for (int i = 0; i < 1000; i++) {
+ is_locked = (type == "TX")
+ ? usrp->get_tx_sensor("lo_locked", 0).to_bool()
+ : usrp->get_rx_sensor("lo_locked", 0).to_bool();
if (is_locked) {
break;
}
std::this_thread::sleep_for(std::chrono::microseconds(1000));
}
- if(is_locked){
- if(verbose) std::cout << boost::format("LO successfully locked at %s frequency %s.")
- % type % MHz_str(freq) << std::endl;
- }
- else{
- if(verbose) std::cout << boost::format("LO did not successfully lock at %s frequency %s.")
- % type % MHz_str(freq) << std::endl;
+ if (is_locked) {
+ if (verbose)
+ std::cout << boost::format(
+ "LO successfully locked at %s frequency %s.")
+ % type % MHz_str(freq)
+ << std::endl;
+ } else {
+ if (verbose)
+ std::cout << boost::format(
+ "LO did not successfully lock at %s frequency %s.")
+ % type % MHz_str(freq)
+ << std::endl;
no_lock_freqs.push_back(freq);
}
}
- if(test_gain){
+ if (test_gain) {
+ // Testing for successful gain tune
- //Testing for successful gain tune
-
- for(double gain: gains){
- if(type == "TX") usrp->set_tx_gain(gain,chan);
- else usrp->set_rx_gain(gain,chan);
+ for (double gain : gains) {
+ if (type == "TX")
+ usrp->set_tx_gain(gain, chan);
+ else
+ usrp->set_rx_gain(gain, chan);
std::this_thread::sleep_for(std::chrono::microseconds(1000));
double actual_gain = (type == "TX") ? usrp->get_tx_gain(chan)
: usrp->get_rx_gain(chan);
- if(gain == 0.0){
- if(actual_gain == 0.0){
- if(verbose) std::cout << boost::format("Gain successfully set to %5.2f at %s frequency %s.")
- % gain % type % MHz_str(freq) << std::endl;
- }
- else{
- if(verbose) std::cout << boost::format("Gain set to %5.2f instead of %5.2f at %s frequency %s.")
- % actual_gain % gain % type % MHz_str(freq) << std::endl;
+ if (gain == 0.0) {
+ if (actual_gain == 0.0) {
+ if (verbose)
+ std::cout << boost::format("Gain successfully set to %5.2f "
+ "at %s frequency %s.")
+ % gain % type % MHz_str(freq)
+ << std::endl;
+ } else {
+ if (verbose)
+ std::cout << boost::format("Gain set to %5.2f instead of "
+ "%5.2f at %s frequency %s.")
+ % actual_gain % gain % type % MHz_str(freq)
+ << std::endl;
bad_gain_vals.push_back(std::make_pair(freq, gain));
}
- }
- else{
- if((gain / actual_gain) > 0.9999 and (gain / actual_gain) < 1.0001){
- if(verbose) std::cout << boost::format("Gain successfully set to %5.2f at %s frequency %s.")
- % gain % type % MHz_str(freq) << std::endl;
- }
- else{
- if(verbose) std::cout << boost::format("Gain set to %5.2f instead of %5.2f at %s frequency %s.")
- % actual_gain % gain % type % MHz_str(freq) << std::endl;
+ } else {
+ if ((gain / actual_gain) > 0.9999 and (gain / actual_gain) < 1.0001) {
+ if (verbose)
+ std::cout << boost::format("Gain successfully set to %5.2f "
+ "at %s frequency %s.")
+ % gain % type % MHz_str(freq)
+ << std::endl;
+ } else {
+ if (verbose)
+ std::cout << boost::format("Gain set to %5.2f instead of "
+ "%5.2f at %s frequency %s.")
+ % actual_gain % gain % type % MHz_str(freq)
+ << std::endl;
bad_gain_vals.push_back(std::make_pair(freq, gain));
}
}
@@ -239,60 +283,68 @@ std::string coercion_test(uhd::usrp::multi_usrp::sptr usrp, std::string type, in
}
std::string results = str(boost::format("%s Summary:\n") % type);
- if(subdev_name.find("XCVR2450") == 0){
+ if (subdev_name.find("XCVR2450") == 0) {
results += str(boost::format("Frequency Range: %s - %s, %s - %s\n")
% MHz_str(xcvr_freqs[0]) % MHz_str(xcvr_freqs[1])
% MHz_str(xcvr_freqs[2]) % MHz_str(xcvr_freqs[3]));
- }
- else results += str(boost::format("Frequency Range: %s - %s (Step: %s)\n")
- % MHz_str(freqs.front()) % MHz_str(freqs.back()) % MHz_str(freq_step));
- if(test_gain) results += str(boost::format("Gain Range:%5.2f - %5.2f (Step:%5.2f)\n")
- % gains.front() % gains.back() % gain_step);
-
- if(bad_tune_freqs.empty()) results += "USRP successfully tuned to all frequencies.";
- else if(bad_tune_freqs.size() > 10 and not verbose){
- //If tuning fails at many values, don't print them all
+ } else
+ results +=
+ str(boost::format("Frequency Range: %s - %s (Step: %s)\n")
+ % MHz_str(freqs.front()) % MHz_str(freqs.back()) % MHz_str(freq_step));
+ if (test_gain)
+ results += str(boost::format("Gain Range:%5.2f - %5.2f (Step:%5.2f)\n")
+ % gains.front() % gains.back() % gain_step);
+
+ if (bad_tune_freqs.empty())
+ results += "USRP successfully tuned to all frequencies.";
+ else if (bad_tune_freqs.size() > 10 and not verbose) {
+ // If tuning fails at many values, don't print them all
results += str(boost::format("USRP did not successfully tune at %d frequencies.")
% bad_tune_freqs.size());
- }
- else{
+ } else {
results += "USRP did not successfully tune to the following frequencies: ";
- for(double bad_freq: bad_tune_freqs){
- if(bad_freq != *bad_tune_freqs.begin()) results += ", ";
+ for (double bad_freq : bad_tune_freqs) {
+ if (bad_freq != *bad_tune_freqs.begin())
+ results += ", ";
results += MHz_str(bad_freq);
}
}
- if(has_sensor){
-
+ if (has_sensor) {
results += "\n";
- if(no_lock_freqs.empty()) results += "LO successfully locked at all frequencies.";
- else if(no_lock_freqs.size() > 10 and not verbose){
- //If locking fails at many values, don't print them all
- results += str(boost::format("USRP did not successfully lock at %d frequencies.")
- % no_lock_freqs.size());
- }
- else{
+ if (no_lock_freqs.empty())
+ results += "LO successfully locked at all frequencies.";
+ else if (no_lock_freqs.size() > 10 and not verbose) {
+ // If locking fails at many values, don't print them all
+ results +=
+ str(boost::format("USRP did not successfully lock at %d frequencies.")
+ % no_lock_freqs.size());
+ } else {
results += "LO did not lock at the following frequencies: ";
- for(double bad_freq: no_lock_freqs){
- if(bad_freq != *no_lock_freqs.begin()) results += ", ";
+ for (double bad_freq : no_lock_freqs) {
+ if (bad_freq != *no_lock_freqs.begin())
+ results += ", ";
results += MHz_str(bad_freq);
}
}
}
- if(test_gain){
+ if (test_gain) {
results += "\n";
- if(bad_gain_vals.empty()) results += "USRP successfully set all specified gain values at all frequencies.";
- else if(bad_gain_vals.size() > 10 and not verbose){
- //If gain fails at many values, don't print them all
- results += str(boost::format("USRP did not successfully set gain at %d values.")
- % bad_gain_vals.size());
- }
- else{
- results += "USRP did not successfully set gain under the following circumstances:";
- for(double_pair bad_pair: bad_gain_vals){
+ if (bad_gain_vals.empty())
+ results +=
+ "USRP successfully set all specified gain values at all frequencies.";
+ else if (bad_gain_vals.size() > 10 and not verbose) {
+ // If gain fails at many values, don't print them all
+ results +=
+ str(boost::format("USRP did not successfully set gain at %d values.")
+ % bad_gain_vals.size());
+ } else {
+ results +=
+ "USRP did not successfully set gain under the following circumstances:";
+ for (double_pair bad_pair : bad_gain_vals) {
double bad_freq = bad_pair.first;
double bad_gain = bad_pair.second;
- results += str(boost::format("\nFrequency: %s, Gain: %5.2f") % MHz_str(bad_freq) % bad_gain);
+ results += str(boost::format("\nFrequency: %s, Gain: %5.2f")
+ % MHz_str(bad_freq) % bad_gain);
}
}
}
@@ -302,11 +354,11 @@ std::string coercion_test(uhd::usrp::multi_usrp::sptr usrp, std::string type, in
/************************************************************************
* Initial Setup
-************************************************************************/
-
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+ ************************************************************************/
- //Variables
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
+ // Variables
int chan;
std::string args;
double freq_step, gain_step;
@@ -315,7 +367,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
std::string rx_results;
std::string usrp_config;
- //Set up the program options
+ // Set up the program options
po::options_description desc("Allowed Options");
// clang-format off
desc.add_options()
@@ -336,8 +388,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //Help messages, errors
- if(vm.count("help") > 0){
+ // Help messages, errors
+ if (vm.count("help") > 0) {
std::cout << "UHD Daughterboard Coercion Test\n"
"This program tests your USRP daughterboard(s) to\n"
"make sure that they can successfully tune to all\n"
@@ -346,94 +398,120 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
return EXIT_SUCCESS;
}
- if(vm.count("tx") + vm.count("rx") == 0){
+ if (vm.count("tx") + vm.count("rx") == 0) {
std::cout << desc << std::endl;
std::cout << "Specify --tx to test for TX frequency coercion\n"
"Specify --rx to test for RX frequency coercion\n";
return EXIT_FAILURE;
}
- //Create a USRP device
+ // Create a USRP device
std::cout << std::endl;
uhd::device_addrs_t device_addrs = uhd::device::find(args, uhd::device::USRP);
- std::cout << boost::format("Creating the USRP device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the USRP device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
- std::cout << std::endl << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
+ std::cout << std::endl
+ << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
usrp->set_tx_rate(SAMP_RATE);
usrp->set_rx_rate(SAMP_RATE);
- //Boolean variables based on command line input
- bool test_tx = vm.count("tx") > 0;
- bool test_rx = vm.count("rx") > 0;
- bool test_tx_gain = !(vm.count("no-tx-gain") > 0) and (usrp->get_tx_gain_range().stop() > 0);
- bool test_rx_gain = !(vm.count("no-rx-gain") > 0) and (usrp->get_rx_gain_range().stop() > 0);
+ // Boolean variables based on command line input
+ bool test_tx = vm.count("tx") > 0;
+ bool test_rx = vm.count("rx") > 0;
+ bool test_tx_gain = !(vm.count("no-tx-gain") > 0)
+ and (usrp->get_tx_gain_range().stop() > 0);
+ bool test_rx_gain = !(vm.count("no-rx-gain") > 0)
+ and (usrp->get_rx_gain_range().stop() > 0);
bool verbose = vm.count("verbose") > 0;
- if(ref != "internal" and ref != "external" and ref != "mimo"){
+ if (ref != "internal" and ref != "external" and ref != "mimo") {
std::cout << desc << std::endl;
std::cout << "REF must equal internal, external, or mimo." << std::endl;
return EXIT_FAILURE;
}
- //Use TX mboard ID to determine if this is a B2xx, will still return value if there is no TX
+ // Use TX mboard ID to determine if this is a B2xx, will still return value if there
+ // is no TX
std::string tx_mboard_id = usrp->get_usrp_tx_info(chan).get("mboard_id");
- bool is_b2xx = (tx_mboard_id == "B200" or tx_mboard_id == "B210");
+ bool is_b2xx = (tx_mboard_id == "B200" or tx_mboard_id == "B210");
- //Don't perform daughterboard validity checks for B200/B210
- if((not is_b2xx) and test_tx){
+ // Don't perform daughterboard validity checks for B200/B210
+ if ((not is_b2xx) and test_tx) {
std::string tx_dboard_name = usrp->get_usrp_tx_info(chan).get("tx_id");
- if(tx_dboard_name == "Basic TX (0x0000)" or tx_dboard_name == "LF TX (0x000e)"){
+ if (tx_dboard_name == "Basic TX (0x0000)" or tx_dboard_name == "LF TX (0x000e)") {
std::cout << desc << std::endl;
- std::cout << boost::format("This test does not work with the %s daughterboard.")
- % tx_dboard_name << std::endl;
+ std::cout << boost::format(
+ "This test does not work with the %s daughterboard.")
+ % tx_dboard_name
+ << std::endl;
return EXIT_FAILURE;
- }
- else if(tx_dboard_name == "Unknown (0xffff)"){
+ } else if (tx_dboard_name == "Unknown (0xffff)") {
std::cout << desc << std::endl;
- std::cout << "This daughterboard is unrecognized, or there is no TX daughterboard." << std::endl;
+ std::cout
+ << "This daughterboard is unrecognized, or there is no TX daughterboard."
+ << std::endl;
return EXIT_FAILURE;
}
}
- //Don't perform daughterboard validity checks for B200/B210
- if((not is_b2xx) and test_rx){
+ // Don't perform daughterboard validity checks for B200/B210
+ if ((not is_b2xx) and test_rx) {
std::string rx_dboard_name = usrp->get_usrp_rx_info(chan).get("rx_id");
- if(rx_dboard_name == "Basic RX (0x0001)" or rx_dboard_name == "LF RX (0x000f)"){
+ if (rx_dboard_name == "Basic RX (0x0001)" or rx_dboard_name == "LF RX (0x000f)") {
std::cout << desc << std::endl;
- std::cout << boost::format("This test does not work with the %s daughterboard.")
- % rx_dboard_name << std::endl;
+ std::cout << boost::format(
+ "This test does not work with the %s daughterboard.")
+ % rx_dboard_name
+ << std::endl;
return EXIT_FAILURE;
- }
- else if(rx_dboard_name == "Unknown (0xffff)"){
+ } else if (rx_dboard_name == "Unknown (0xffff)") {
std::cout << desc << std::endl;
- std::cout << "This daughterboard is unrecognized, or there is no RX daughterboard." << std::endl;
+ std::cout
+ << "This daughterboard is unrecognized, or there is no RX daughterboard."
+ << std::endl;
return EXIT_FAILURE;
}
}
- //Setting clock source
+ // Setting clock source
usrp->set_clock_source(ref);
std::this_thread::sleep_for(std::chrono::seconds(1));
std::vector<std::string> sensor_names = usrp->get_mboard_sensor_names(0);
- if ((ref == "mimo") and (std::find(sensor_names.begin(), sensor_names.end(), "mimo_locked") != sensor_names.end())) {
- uhd::sensor_value_t mimo_locked = usrp->get_mboard_sensor("mimo_locked",0);
- std::cout << boost::format("Checking MIMO lock: %s ...") % mimo_locked.to_pp_string() << std::endl;
+ if ((ref == "mimo")
+ and (std::find(sensor_names.begin(), sensor_names.end(), "mimo_locked")
+ != sensor_names.end())) {
+ uhd::sensor_value_t mimo_locked = usrp->get_mboard_sensor("mimo_locked", 0);
+ std::cout << boost::format("Checking MIMO lock: %s ...")
+ % mimo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(mimo_locked.to_bool());
}
- if ((ref == "external") and (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked") != sensor_names.end())) {
- uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked",0);
- std::cout << boost::format("Checking REF lock: %s ...") % ref_locked.to_pp_string() << std::endl;
+ if ((ref == "external")
+ and (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked")
+ != sensor_names.end())) {
+ uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked", 0);
+ std::cout << boost::format("Checking REF lock: %s ...")
+ % ref_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(ref_locked.to_bool());
}
usrp_config = return_usrp_config_string(usrp, chan, test_tx, test_rx, is_b2xx);
- if(test_tx) tx_results = coercion_test(usrp, "TX", chan, test_tx_gain, freq_step, gain_step, verbose);
- if(test_rx) rx_results = coercion_test(usrp, "RX", chan, test_rx_gain, freq_step, gain_step, verbose);
+ if (test_tx)
+ tx_results =
+ coercion_test(usrp, "TX", chan, test_tx_gain, freq_step, gain_step, verbose);
+ if (test_rx)
+ rx_results =
+ coercion_test(usrp, "RX", chan, test_rx_gain, freq_step, gain_step, verbose);
std::cout << std::endl << usrp_config << std::endl << std::endl;
- if(test_tx) std::cout << tx_results << std::endl;
- if(test_tx and test_rx) std::cout << std::endl;
- if(test_rx) std::cout << rx_results << std::endl;
+ if (test_tx)
+ std::cout << tx_results << std::endl;
+ if (test_tx and test_rx)
+ std::cout << std::endl;
+ if (test_rx)
+ std::cout << rx_results << std::endl;
return EXIT_SUCCESS;
}
diff --git a/host/examples/test_messages.cpp b/host/examples/test_messages.cpp
index 2ff10049d..4d4771900 100644
--- a/host/examples/test_messages.cpp
+++ b/host/examples/test_messages.cpp
@@ -6,18 +6,18 @@
//
#include <uhd/config.hpp>
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
-#include <uhd/utils/static.hpp>
#include <uhd/types/stream_cmd.hpp>
#include <uhd/usrp/multi_usrp.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/static.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/assign/list_of.hpp>
-#include <boost/program_options.hpp>
#include <boost/bind.hpp>
#include <boost/format.hpp>
+#include <boost/program_options.hpp>
+#include <complex>
#include <cstdlib>
#include <ctime>
-#include <complex>
#include <iostream>
namespace po = boost::program_options;
@@ -27,45 +27,45 @@ namespace po = boost::program_options;
* Issue a stream command with a time that is in the past.
* We expect to get an inline late command message.
*/
-bool test_late_command_message(uhd::usrp::multi_usrp::sptr usrp, uhd::rx_streamer::sptr rx_stream, uhd::tx_streamer::sptr){
+bool test_late_command_message(uhd::usrp::multi_usrp::sptr usrp,
+ uhd::rx_streamer::sptr rx_stream,
+ uhd::tx_streamer::sptr)
+{
std::cout << "Test late command message... " << std::flush;
- usrp->set_time_now(uhd::time_spec_t(200.0)); //set time
+ usrp->set_time_now(uhd::time_spec_t(200.0)); // set time
uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
- stream_cmd.num_samps = rx_stream->get_max_num_samps();
+ stream_cmd.num_samps = rx_stream->get_max_num_samps();
stream_cmd.stream_now = false;
- stream_cmd.time_spec = uhd::time_spec_t(100.0); //time in the past
+ stream_cmd.time_spec = uhd::time_spec_t(100.0); // time in the past
rx_stream->issue_stream_cmd(stream_cmd);
- std::vector<std::complex<float> > buff(rx_stream->get_max_num_samps());
+ std::vector<std::complex<float>> buff(rx_stream->get_max_num_samps());
uhd::rx_metadata_t md;
- const size_t nsamps = rx_stream->recv(
- &buff.front(), buff.size(), md
- );
-
- switch(md.error_code){
- case uhd::rx_metadata_t::ERROR_CODE_LATE_COMMAND:
- std::cout << boost::format(
- "success:\n"
- " Got error code late command message.\n"
- ) << std::endl;
- return true;
-
- case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT:
- std::cout << boost::format(
- "failed:\n"
- " Inline message recv timed out.\n"
- ) << std::endl;
- return false;
-
- default:
- std::cout << boost::format(
- "failed:\n"
- " Got unexpected error code 0x%x (%s), nsamps %u.\n"
- ) % md.error_code % md.strerror() % nsamps << std::endl;
- return false;
+ const size_t nsamps = rx_stream->recv(&buff.front(), buff.size(), md);
+
+ switch (md.error_code) {
+ case uhd::rx_metadata_t::ERROR_CODE_LATE_COMMAND:
+ std::cout << boost::format("success:\n"
+ " Got error code late command message.\n")
+ << std::endl;
+ return true;
+
+ case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT:
+ std::cout << boost::format("failed:\n"
+ " Inline message recv timed out.\n")
+ << std::endl;
+ return false;
+
+ default:
+ std::cout << boost::format(
+ "failed:\n"
+ " Got unexpected error code 0x%x (%s), nsamps %u.\n")
+ % md.error_code % md.strerror() % nsamps
+ << std::endl;
+ return false;
}
}
@@ -74,46 +74,49 @@ bool test_late_command_message(uhd::usrp::multi_usrp::sptr usrp, uhd::rx_streame
* Issue a stream command with num samps and more.
* We expect to get an inline broken chain message.
*/
-bool test_broken_chain_message(UHD_UNUSED(uhd::usrp::multi_usrp::sptr usrp), uhd::rx_streamer::sptr rx_stream, uhd::tx_streamer::sptr){
+bool test_broken_chain_message(UHD_UNUSED(uhd::usrp::multi_usrp::sptr usrp),
+ uhd::rx_streamer::sptr rx_stream,
+ uhd::tx_streamer::sptr)
+{
std::cout << "Test broken chain message... " << std::flush;
uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE);
stream_cmd.stream_now = true;
- stream_cmd.num_samps = rx_stream->get_max_num_samps();
+ stream_cmd.num_samps = rx_stream->get_max_num_samps();
rx_stream->issue_stream_cmd(stream_cmd);
- std::vector<std::complex<float> > buff(rx_stream->get_max_num_samps());
+ std::vector<std::complex<float>> buff(rx_stream->get_max_num_samps());
uhd::rx_metadata_t md;
- rx_stream->recv( //once for the requested samples
- &buff.front(), buff.size(), md
- );
-
- rx_stream->recv( //again for the inline message
- &buff.front(), buff.size(), md
- );
-
- switch(md.error_code){
- case uhd::rx_metadata_t::ERROR_CODE_BROKEN_CHAIN:
- std::cout << boost::format(
- "success:\n"
- " Got error code broken chain message.\n"
- ) << std::endl;
- return true;
-
- case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT:
- std::cout << boost::format(
- "failed:\n"
- " Inline message recv timed out.\n"
- ) << std::endl;
- return false;
-
- default:
- std::cout << boost::format(
- "failed:\n"
- " Got unexpected error code 0x%x (%s).\n"
- ) % md.error_code % md.strerror() << std::endl;
- return false;
+ rx_stream->recv( // once for the requested samples
+ &buff.front(),
+ buff.size(),
+ md);
+
+ rx_stream->recv( // again for the inline message
+ &buff.front(),
+ buff.size(),
+ md);
+
+ switch (md.error_code) {
+ case uhd::rx_metadata_t::ERROR_CODE_BROKEN_CHAIN:
+ std::cout << boost::format("success:\n"
+ " Got error code broken chain message.\n")
+ << std::endl;
+ return true;
+
+ case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT:
+ std::cout << boost::format("failed:\n"
+ " Inline message recv timed out.\n")
+ << std::endl;
+ return false;
+
+ default:
+ std::cout << boost::format("failed:\n"
+ " Got unexpected error code 0x%x (%s).\n")
+ % md.error_code % md.strerror()
+ << std::endl;
+ return false;
}
}
@@ -122,7 +125,9 @@ bool test_broken_chain_message(UHD_UNUSED(uhd::usrp::multi_usrp::sptr usrp), uhd
* Send a burst of many samples that will fragment internally.
* We expect to get an burst ack async message.
*/
-bool test_burst_ack_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr tx_stream){
+bool test_burst_ack_message(
+ uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr tx_stream)
+{
std::cout << "Test burst ack message... " << std::flush;
uhd::tx_metadata_t md;
@@ -130,33 +135,31 @@ bool test_burst_ack_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr,
md.end_of_burst = true;
md.has_time_spec = false;
- //3 times max-sps guarantees a SOB, no burst, and EOB packet
- std::vector<std::complex<float> > buff(tx_stream->get_max_num_samps()*3);
+ // 3 times max-sps guarantees a SOB, no burst, and EOB packet
+ std::vector<std::complex<float>> buff(tx_stream->get_max_num_samps() * 3);
tx_stream->send(&buff.front(), buff.size(), md);
uhd::async_metadata_t async_md;
- if (not tx_stream->recv_async_msg(async_md)){
- std::cout << boost::format(
- "failed:\n"
- " Async message recv timed out.\n"
- ) << std::endl;
+ if (not tx_stream->recv_async_msg(async_md)) {
+ std::cout << boost::format("failed:\n"
+ " Async message recv timed out.\n")
+ << std::endl;
return false;
}
- switch(async_md.event_code){
- case uhd::async_metadata_t::EVENT_CODE_BURST_ACK:
- std::cout << boost::format(
- "success:\n"
- " Got event code burst ack message.\n"
- ) << std::endl;
- return true;
-
- default:
- std::cout << boost::format(
- "failed:\n"
- " Got unexpected event code 0x%x.\n"
- ) % async_md.event_code << std::endl;
- return false;
+ switch (async_md.event_code) {
+ case uhd::async_metadata_t::EVENT_CODE_BURST_ACK:
+ std::cout << boost::format("success:\n"
+ " Got event code burst ack message.\n")
+ << std::endl;
+ return true;
+
+ default:
+ std::cout << boost::format("failed:\n"
+ " Got unexpected event code 0x%x.\n")
+ % async_md.event_code
+ << std::endl;
+ return false;
}
}
@@ -165,7 +168,9 @@ bool test_burst_ack_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr,
* Send a start of burst packet with no following end of burst.
* We expect to get an underflow(within a burst) async message.
*/
-bool test_underflow_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr tx_stream){
+bool test_underflow_message(
+ uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr tx_stream)
+{
std::cout << "Test underflow message... " << std::flush;
uhd::tx_metadata_t md;
@@ -173,32 +178,30 @@ bool test_underflow_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr,
md.end_of_burst = false;
md.has_time_spec = false;
- std::vector< std::complex<float> > buff(tx_stream->get_max_num_samps());
+ std::vector<std::complex<float>> buff(tx_stream->get_max_num_samps());
tx_stream->send(&buff.front(), buff.size(), md);
uhd::async_metadata_t async_md;
- if (not tx_stream->recv_async_msg(async_md, 1)){
- std::cout << boost::format(
- "failed:\n"
- " Async message recv timed out.\n"
- ) << std::endl;
+ if (not tx_stream->recv_async_msg(async_md, 1)) {
+ std::cout << boost::format("failed:\n"
+ " Async message recv timed out.\n")
+ << std::endl;
return false;
}
- switch(async_md.event_code){
- case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW:
- std::cout << boost::format(
- "success:\n"
- " Got event code underflow message.\n"
- ) << std::endl;
- return true;
-
- default:
- std::cout << boost::format(
- "failed:\n"
- " Got unexpected event code 0x%x.\n"
- ) % async_md.event_code << std::endl;
- return false;
+ switch (async_md.event_code) {
+ case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW:
+ std::cout << boost::format("success:\n"
+ " Got event code underflow message.\n")
+ << std::endl;
+ return true;
+
+ default:
+ std::cout << boost::format("failed:\n"
+ " Got unexpected event code 0x%x.\n")
+ % async_md.event_code
+ << std::endl;
+ return false;
}
}
@@ -207,73 +210,78 @@ bool test_underflow_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr,
* Send a burst packet that occurs at a time in the past.
* We expect to get a time error async message.
*/
-bool test_time_error_message(uhd::usrp::multi_usrp::sptr usrp, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr tx_stream){
+bool test_time_error_message(uhd::usrp::multi_usrp::sptr usrp,
+ uhd::rx_streamer::sptr,
+ uhd::tx_streamer::sptr tx_stream)
+{
std::cout << "Test time error message... " << std::flush;
uhd::tx_metadata_t md;
md.start_of_burst = true;
md.end_of_burst = true;
md.has_time_spec = true;
- md.time_spec = uhd::time_spec_t(100.0); //send at 100s
+ md.time_spec = uhd::time_spec_t(100.0); // send at 100s
- usrp->set_time_now(uhd::time_spec_t(200.0)); //time at 200s
+ usrp->set_time_now(uhd::time_spec_t(200.0)); // time at 200s
- std::vector< std::complex<float> > buff(tx_stream->get_max_num_samps());
+ std::vector<std::complex<float>> buff(tx_stream->get_max_num_samps());
tx_stream->send(&buff.front(), buff.size(), md);
uhd::async_metadata_t async_md;
- if (not tx_stream->recv_async_msg(async_md)){
- std::cout << boost::format(
- "failed:\n"
- " Async message recv timed out.\n"
- ) << std::endl;
+ if (not tx_stream->recv_async_msg(async_md)) {
+ std::cout << boost::format("failed:\n"
+ " Async message recv timed out.\n")
+ << std::endl;
return false;
}
- switch(async_md.event_code){
- case uhd::async_metadata_t::EVENT_CODE_TIME_ERROR:
- std::cout << boost::format(
- "success:\n"
- " Got event code time error message.\n"
- ) << std::endl;
- return true;
-
- default:
- std::cout << boost::format(
- "failed:\n"
- " Got unexpected event code 0x%x.\n"
- ) % async_md.event_code << std::endl;
- return false;
+ switch (async_md.event_code) {
+ case uhd::async_metadata_t::EVENT_CODE_TIME_ERROR:
+ std::cout << boost::format("success:\n"
+ " Got event code time error message.\n")
+ << std::endl;
+ return true;
+
+ default:
+ std::cout << boost::format("failed:\n"
+ " Got unexpected event code 0x%x.\n")
+ % async_md.event_code
+ << std::endl;
+ return false;
}
}
-void flush_async(uhd::tx_streamer::sptr tx_stream){
+void flush_async(uhd::tx_streamer::sptr tx_stream)
+{
uhd::async_metadata_t async_md;
- while (tx_stream->recv_async_msg(async_md)){}
+ while (tx_stream->recv_async_msg(async_md)) {
+ }
}
-void flush_recv(uhd::rx_streamer::sptr rx_stream){
+void flush_recv(uhd::rx_streamer::sptr rx_stream)
+{
uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
- stream_cmd.num_samps = rx_stream->get_max_num_samps()*3;
+ stream_cmd.num_samps = rx_stream->get_max_num_samps() * 3;
stream_cmd.stream_now = true;
rx_stream->issue_stream_cmd(stream_cmd);
- std::vector<std::complex<float> > buff(stream_cmd.num_samps);
+ std::vector<std::complex<float>> buff(stream_cmd.num_samps);
uhd::rx_metadata_t md;
- do{
+ do {
rx_stream->recv(&buff.front(), buff.size(), md);
} while (md.error_code != uhd::rx_metadata_t::ERROR_CODE_TIMEOUT);
}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args;
size_t ntests;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -287,70 +295,72 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD Test Messages %s") % desc << std::endl;
return ~0;
}
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //create RX and TX streamers
- uhd::stream_args_t stream_args("fc32"); //complex floats
+ // create RX and TX streamers
+ uhd::stream_args_t stream_args("fc32"); // complex floats
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(stream_args);
//------------------------------------------------------------------
// begin messages test
//------------------------------------------------------------------
- static uhd::dict<std::string, boost::function<bool(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr)> >
- tests = boost::assign::map_list_of
- ("Test Burst ACK ", &test_burst_ack_message)
- ("Test Underflow ", &test_underflow_message)
- ("Test Time Error", &test_time_error_message)
- ("Test Late Command", &test_late_command_message)
- ;
+ static uhd::dict<std::string,
+ boost::function<bool(
+ uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr)>>
+ tests = boost::assign::map_list_of("Test Burst ACK ", &test_burst_ack_message)(
+ "Test Underflow ", &test_underflow_message)("Test Time Error",
+ &test_time_error_message)("Test Late Command", &test_late_command_message);
if (vm.count("test-chain")) {
tests["Test Broken Chain"] = &test_broken_chain_message;
}
- //init result counts
+ // init result counts
uhd::dict<std::string, size_t> failures, successes;
- for(const std::string &key: tests.keys()){
- failures[key] = 0;
+ for (const std::string& key : tests.keys()) {
+ failures[key] = 0;
successes[key] = 0;
}
- //run the tests, pick at random
- std::srand((unsigned int) time(NULL));
- for (size_t n = 0; n < ntests; n++){
+ // run the tests, pick at random
+ std::srand((unsigned int)time(NULL));
+ for (size_t n = 0; n < ntests; n++) {
std::string key = tests.keys()[std::rand() % tests.size()];
- bool pass = tests[key](usrp, rx_stream, tx_stream);
+ bool pass = tests[key](usrp, rx_stream, tx_stream);
flush_recv(rx_stream);
flush_async(tx_stream);
- //store result
- if (pass) successes[key]++;
- else failures[key]++;
+ // store result
+ if (pass)
+ successes[key]++;
+ else
+ failures[key]++;
}
- //print the result summary
+ // print the result summary
bool any_failure = false;
std::cout << std::endl << "Summary:" << std::endl << std::endl;
- for(const std::string &key: tests.keys()){
- std::cout << boost::format(
- "%s -> %3u successes, %3u failures"
- ) % key % successes[key] % failures[key] << std::endl;
+ for (const std::string& key : tests.keys()) {
+ std::cout << boost::format("%s -> %3u successes, %3u failures") % key
+ % successes[key] % failures[key]
+ << std::endl;
any_failure = any_failure or (failures[key] > 0);
}
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return any_failure ? EXIT_FAILURE : EXIT_SUCCESS;
diff --git a/host/examples/test_pps_input.cpp b/host/examples/test_pps_input.cpp
index 5d11b9dcd..24171aa04 100644
--- a/host/examples/test_pps_input.cpp
+++ b/host/examples/test_pps_input.cpp
@@ -5,26 +5,27 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
-#include <iostream>
-#include <complex>
+#include <boost/program_options.hpp>
#include <chrono>
+#include <complex>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args;
std::string time_source;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -37,31 +38,35 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD Test PPS Input %s") % desc << std::endl;
std::cout
- << std::endl
- << "Tests if the PPS input signal is working. Will throw an error if not."
- << std::endl
- << std::endl;
+ << std::endl
+ << "Tests if the PPS input signal is working. Will throw an error if not."
+ << std::endl
+ << std::endl;
return ~0;
}
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //sleep off if gpsdo detected and time next pps already set
+ // sleep off if gpsdo detected and time next pps already set
std::this_thread::sleep_for(std::chrono::seconds(1));
- //set time source if specified
- if (not time_source.empty()) usrp->set_time_source(time_source);
+ // set time source if specified
+ if (not time_source.empty())
+ usrp->set_time_source(time_source);
- //set the time at an unknown pps (will throw if no pps)
- std::cout << std::endl << "Attempt to detect the PPS and set the time..." << std::endl << std::endl;
+ // set the time at an unknown pps (will throw if no pps)
+ std::cout << std::endl
+ << "Attempt to detect the PPS and set the time..." << std::endl
+ << std::endl;
usrp->set_time_unknown_pps(uhd::time_spec_t(0.0));
std::cout << std::endl << "Success!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/test_timed_commands.cpp b/host/examples/test_timed_commands.cpp
index f53f3c282..5fe8d818c 100644
--- a/host/examples/test_timed_commands.cpp
+++ b/host/examples/test_timed_commands.cpp
@@ -5,23 +5,24 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
-#include <iostream>
+#include <boost/program_options.hpp>
#include <complex>
+#include <iostream>
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -33,26 +34,26 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD Test Timed Commands %s") % desc << std::endl;
return ~0;
}
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //check if timed commands are supported
+ // check if timed commands are supported
std::cout << std::endl;
std::cout << "Testing support for timed commands on this hardware... " << std::flush;
- try{
+ try {
usrp->set_command_time(uhd::time_spec_t(0.0));
usrp->clear_command_time();
- }
- catch (const std::exception &e){
+ } catch (const std::exception& e) {
std::cout << "fail" << std::endl;
std::cerr << "Got exception: " << e.what() << std::endl;
std::cerr << "Timed commands are not supported on this hardware." << std::endl;
@@ -60,27 +61,27 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
}
std::cout << "pass" << std::endl;
- //readback time really fast, time diff is small
+ // readback time really fast, time diff is small
std::cout << std::endl;
std::cout << "Perform fast readback of registers:" << std::endl;
uhd::time_spec_t total_time;
- for (size_t i = 0; i < 100; i++){
+ for (size_t i = 0; i < 100; i++) {
const uhd::time_spec_t t0 = usrp->get_time_now();
const uhd::time_spec_t t1 = usrp->get_time_now();
- total_time += (t1-t0);
+ total_time += (t1 - t0);
}
- std::cout << boost::format(
- " Difference between paired reads: %f us"
- ) % (total_time.get_real_secs()/100*1e6) << std::endl;
-
- //test timed control command
- //issues get_time_now() command twice a fixed time apart
- //outputs difference for each response time vs. the expected time
- //and difference between actual and expected time deltas
+ std::cout << boost::format(" Difference between paired reads: %f us")
+ % (total_time.get_real_secs() / 100 * 1e6)
+ << std::endl;
+
+ // test timed control command
+ // issues get_time_now() command twice a fixed time apart
+ // outputs difference for each response time vs. the expected time
+ // and difference between actual and expected time deltas
std::cout << std::endl;
std::cout << "Testing control timed command:" << std::endl;
- const uhd::time_spec_t span = uhd::time_spec_t(0.1);
- const uhd::time_spec_t now = usrp->get_time_now();
+ const uhd::time_spec_t span = uhd::time_spec_t(0.1);
+ const uhd::time_spec_t now = usrp->get_time_now();
const uhd::time_spec_t cmd_time1 = now + uhd::time_spec_t(0.1);
const uhd::time_spec_t cmd_time2 = cmd_time1 + span;
usrp->set_command_time(cmd_time1);
@@ -88,63 +89,65 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
usrp->set_command_time(cmd_time2);
uhd::time_spec_t response_time2 = usrp->get_time_now();
usrp->clear_command_time();
+ std::cout << boost::format(" Span : %f us\n"
+ " Now : %f us\n"
+ " Response 1: %f us\n"
+ " Response 2: %f us")
+ % (span.get_real_secs() * 1e6) % (now.get_real_secs() * 1e6)
+ % (response_time1.get_real_secs() * 1e6)
+ % (response_time2.get_real_secs() * 1e6)
+ << std::endl;
+ std::cout << boost::format(" Difference of response time 1: %f us")
+ % ((response_time1 - cmd_time1).get_real_secs() * 1e6)
+ << std::endl;
+ std::cout << boost::format(" Difference of response time 2: %f us")
+ % ((response_time2 - cmd_time2).get_real_secs() * 1e6)
+ << std::endl;
std::cout << boost::format(
- " Span : %f us\n"
- " Now : %f us\n"
- " Response 1: %f us\n"
- " Response 2: %f us"
- ) % (span.get_real_secs()*1e6) % (now.get_real_secs()*1e6) % (response_time1.get_real_secs()*1e6) % (response_time2.get_real_secs()*1e6) << std::endl;
- std::cout << boost::format(
- " Difference of response time 1: %f us"
- ) % ((response_time1 - cmd_time1).get_real_secs()*1e6) << std::endl;
- std::cout << boost::format(
- " Difference of response time 2: %f us"
- ) % ((response_time2 - cmd_time2).get_real_secs()*1e6) << std::endl;
- std::cout << boost::format(
- " Difference between actual and expected time delta: %f us"
- ) % ((response_time2 - response_time1 - span).get_real_secs()*1e6) << std::endl;
-
- //use a timed command to start a stream at a specific time
- //this is not the right way start streaming at time x,
- //but it should approximate it within control RTT/2
- //setup streaming
+ " Difference between actual and expected time delta: %f us")
+ % ((response_time2 - response_time1 - span).get_real_secs() * 1e6)
+ << std::endl;
+
+ // use a timed command to start a stream at a specific time
+ // this is not the right way start streaming at time x,
+ // but it should approximate it within control RTT/2
+ // setup streaming
std::cout << std::endl;
std::cout << "About to start streaming using timed command:" << std::endl;
- //create a receive streamer
- uhd::stream_args_t stream_args("fc32"); //complex floats
+ // create a receive streamer
+ uhd::stream_args_t stream_args("fc32"); // complex floats
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
- stream_cmd.num_samps = 100;
- stream_cmd.stream_now = false;
+ stream_cmd.num_samps = 100;
+ stream_cmd.stream_now = false;
const uhd::time_spec_t stream_time = usrp->get_time_now() + uhd::time_spec_t(0.1);
- stream_cmd.time_spec = stream_time;
+ stream_cmd.time_spec = stream_time;
rx_stream->issue_stream_cmd(stream_cmd);
- //meta-data will be filled in by recv()
+ // meta-data will be filled in by recv()
uhd::rx_metadata_t md;
- //allocate buffer to receive with samples
- std::vector<std::complex<float> > buff(stream_cmd.num_samps);
+ // allocate buffer to receive with samples
+ std::vector<std::complex<float>> buff(stream_cmd.num_samps);
const size_t num_rx_samps = rx_stream->recv(&buff.front(), buff.size(), md, 1.0);
- if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE){
- throw std::runtime_error(str(boost::format(
- "Receiver error %s"
- ) % md.strerror()));
+ if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
+ throw std::runtime_error(str(boost::format("Receiver error %s") % md.strerror()));
}
- std::cout << boost::format(
- " Received packet: %u samples, %u full secs, %f frac secs"
- ) % num_rx_samps % md.time_spec.get_full_secs() % md.time_spec.get_frac_secs() << std::endl;
- std::cout << boost::format(
- " Stream time was: %u full secs, %f frac secs"
- ) % stream_time.get_full_secs() % stream_time.get_frac_secs() << std::endl;
- std::cout << boost::format(
- " Difference between stream time and first packet: %f us"
- ) % ((md.time_spec-stream_time).get_real_secs()*1e6) << std::endl;
-
- //finished
+ std::cout << boost::format(" Received packet: %u samples, %u full secs, %f frac secs")
+ % num_rx_samps % md.time_spec.get_full_secs()
+ % md.time_spec.get_frac_secs()
+ << std::endl;
+ std::cout << boost::format(" Stream time was: %u full secs, %f frac secs")
+ % stream_time.get_full_secs() % stream_time.get_frac_secs()
+ << std::endl;
+ std::cout << boost::format(" Difference between stream time and first packet: %f us")
+ % ((md.time_spec - stream_time).get_real_secs() * 1e6)
+ << std::endl;
+
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/twinrx_freq_hopping.cpp b/host/examples/twinrx_freq_hopping.cpp
index f4ce3e528..ea350928c 100644
--- a/host/examples/twinrx_freq_hopping.cpp
+++ b/host/examples/twinrx_freq_hopping.cpp
@@ -7,15 +7,12 @@
// FFT conversion
#include "ascii_art_dft.hpp"
-
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/program_options.hpp>
#include <boost/thread.hpp>
#include <boost/thread/thread_time.hpp>
-
#include <fstream>
/*
@@ -23,8 +20,8 @@
* motherboard and a TwinRX daughterboard.
*
* The TwinRX daughterboard is different than previous daughterboards in that it has two
- * RX channels, each with a set of Local Oscillators (LOs). Either channel can be configured
- * to use either LO set, allowing for the two channels to share an LO source.
+ * RX channels, each with a set of Local Oscillators (LOs). Either channel can be
+ * configured to use either LO set, allowing for the two channels to share an LO source.
*
* The TwinRX can be used like any other daughterboard, as the multi_usrp::set_rx_freq()
* function will automatically calculate and set the two LO frequencies as needed.
@@ -35,7 +32,8 @@
*
* 1. Tune across the given frequency range, storing the calculated LO frequencies along
* the way.
- * 2. Use timed commands to tell the TwinRX to receive bursts of samples at given intervals.
+ * 2. Use timed commands to tell the TwinRX to receive bursts of samples at given
+ * intervals.
* 3. For each frequency, tune the LOs for the inactive channel for the next frequency and
* receive at the current frequency.
* 4. If applicable, send the next timed command for streaming.
@@ -44,7 +42,7 @@
namespace pt = boost::posix_time;
namespace po = boost::program_options;
-typedef std::vector<std::complex<float> > recv_buff_t;
+typedef std::vector<std::complex<float>> recv_buff_t;
typedef std::vector<recv_buff_t> recv_buffs_t;
// Global objects
@@ -67,8 +65,8 @@ const int X300_COMMAND_FIFO_DEPTH = 16;
// This is a helper function for receiving samples from the USRP
-static void twinrx_recv(recv_buff_t &buffer) {
-
+static void twinrx_recv(recv_buff_t& buffer)
+{
size_t num_acc_samps = 0;
uhd::rx_metadata_t md;
@@ -77,9 +75,10 @@ static void twinrx_recv(recv_buff_t &buffer) {
size_t num_to_recv = std::min<size_t>(recv_spb, (spb - num_acc_samps));
// recv call will block until samples are ready or the call times out
- size_t num_recvd = rx_stream->recv(&buffer[num_acc_samps], num_to_recv, md, receive_interval);
+ size_t num_recvd =
+ rx_stream->recv(&buffer[num_acc_samps], num_to_recv, md, receive_interval);
- if(md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
+ if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
std::cout << md.strerror() << std::endl;
break;
}
@@ -88,18 +87,20 @@ static void twinrx_recv(recv_buff_t &buffer) {
}
// Function to write the acquisition FFT to a binary file
-static void write_fft_to_file(const std::string &fft_path) {
+static void write_fft_to_file(const std::string& fft_path)
+{
std::cout << "Calculating FFTs (this may take a while)... " << std::flush;
std::ofstream ofile(fft_path.c_str(), std::ios::binary);
- BOOST_FOREACH(const recv_buff_t &buff, buffs) {
- std::vector<float> fft = ascii_art_dft::log_pwr_dft(&buff.front(), buff.size());
- ofile.write((char*)&fft[0], (sizeof(float)*fft.size()));
- }
+ BOOST_FOREACH (const recv_buff_t& buff, buffs) {
+ std::vector<float> fft = ascii_art_dft::log_pwr_dft(&buff.front(), buff.size());
+ ofile.write((char*)&fft[0], (sizeof(float) * fft.size()));
+ }
ofile.close();
std::cout << "done." << std::endl;
}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
// Program options
@@ -129,22 +130,25 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- if(vm.count("help")) {
+ if (vm.count("help")) {
std::cout << "TwinRX Frequency Hopping Example - " << desc << std::endl;
return EXIT_SUCCESS;
}
// Create a USRP device
- std::cout << boost::format("\nCreating the USRP device with args: \"%s\"...\n") % args;
+ std::cout << boost::format("\nCreating the USRP device with args: \"%s\"...\n")
+ % args;
usrp = uhd::usrp::multi_usrp::make(args);
// Make sure the USRP is an X3xx with a TwinRX
uhd::dict<std::string, std::string> info = usrp->get_usrp_rx_info();
- if(info.get("mboard_id").find("X3") == std::string::npos) {
- throw uhd::runtime_error("This example can only be used with an X-Series motherboard.");
+ if (info.get("mboard_id").find("X3") == std::string::npos) {
+ throw uhd::runtime_error(
+ "This example can only be used with an X-Series motherboard.");
}
- if(info.get("rx_id").find("TwinRX") == std::string::npos) {
- throw uhd::runtime_error("This example can only be used with a TwinRX daughterboard.");
+ if (info.get("rx_id").find("TwinRX") == std::string::npos) {
+ throw uhd::runtime_error(
+ "This example can only be used with a TwinRX daughterboard.");
}
// Validate frequency range
@@ -156,26 +160,31 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
end_freq = rx_freq_range.stop();
}
if (start_freq < rx_freq_range.start() or end_freq > rx_freq_range.stop()) {
- throw uhd::runtime_error((boost::format("Start and stop frequencies must be between %d and %d MHz")
- % (rx_freq_range.start() / 1e6) % (rx_freq_range.stop() / 1e6)).str());
+ throw uhd::runtime_error(
+ (boost::format("Start and stop frequencies must be between %d and %d MHz")
+ % (rx_freq_range.start() / 1e6) % (rx_freq_range.stop() / 1e6))
+ .str());
}
if (start_freq > end_freq) {
throw uhd::runtime_error("Start frequency must be less than end frequency.");
}
if ((end_freq - start_freq) > 0 and (end_freq - start_freq) < rate) {
- throw uhd::runtime_error("The sample rate must be less than the range between the start and end frequencies.");
+ throw uhd::runtime_error("The sample rate must be less than the range between "
+ "the start and end frequencies.");
}
// Set TwinRX settings
usrp->set_rx_subdev_spec(subdev);
- // Set the unused channel to not use any LOs. This allows the active channel to control them.
+ // Set the unused channel to not use any LOs. This allows the active channel to
+ // control them.
usrp->set_rx_lo_source("disabled", uhd::usrp::multi_usrp::ALL_LOS, UNUSED_CHAN);
// Set user settings
std::cout << boost::format("Setting antenna to: %s\n") % ant;
usrp->set_rx_antenna(ant, ACTIVE_CHAN);
- std::cout << boost::format("Actual antenna: %s\n") % usrp->get_rx_antenna(ACTIVE_CHAN);
+ std::cout << boost::format("Actual antenna: %s\n")
+ % usrp->get_rx_antenna(ACTIVE_CHAN);
std::cout << boost::format("Setting sample rate to: %d\n") % rate;
usrp->set_rx_rate(rate);
@@ -189,7 +198,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
uhd::stream_args_t stream_args("fc32", "sc16");
stream_args.channels.push_back(0);
rx_stream = usrp->get_rx_stream(stream_args);
- recv_spb = rx_stream->get_max_num_samps();
+ recv_spb = rx_stream->get_max_num_samps();
// Calculate the frequency hops
for (double rx_freq = start_freq; rx_freq <= end_freq; rx_freq += rate) {
@@ -204,10 +213,11 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
usrp->set_rx_freq(rf_freqs[0], ACTIVE_CHAN);
usrp->set_time_now(uhd::time_spec_t(0.0));
- // Configure the stream command which will be issued to acquire samples at each frequency
- stream_cmd.num_samps = spb;
+ // Configure the stream command which will be issued to acquire samples at each
+ // frequency
+ stream_cmd.num_samps = spb;
stream_cmd.stream_now = false;
- stream_cmd.time_spec = uhd::time_spec_t(0.0);
+ stream_cmd.time_spec = uhd::time_spec_t(0.0);
// Stream commands will be scheduled at regular intervals
uhd::time_spec_t receive_interval_ts = uhd::time_spec_t(receive_interval);
@@ -216,14 +226,14 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
size_t num_initial_cmds = std::min<size_t>(X300_COMMAND_FIFO_DEPTH, rf_freqs.size());
size_t num_issued_commands;
- for (num_issued_commands = 0; num_issued_commands < num_initial_cmds; num_issued_commands++) {
+ for (num_issued_commands = 0; num_issued_commands < num_initial_cmds;
+ num_issued_commands++) {
stream_cmd.time_spec += receive_interval_ts;
rx_stream->issue_stream_cmd(stream_cmd);
}
// Hop frequencies and acquire bursts of samples at each until done sweeping
- while(1) {
-
+ while (1) {
std::cout << "Scanning..." << std::endl;
auto start_time = boost::get_system_time();
@@ -234,11 +244,12 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
usrp->set_rx_lo_source(lo_src, uhd::usrp::multi_usrp::ALL_LOS, ACTIVE_CHAN);
// Preconfigure the next frequency
- usrp->set_rx_freq(rf_freqs[(i+1) % rf_freqs.size()], UNUSED_CHAN);
+ usrp->set_rx_freq(rf_freqs[(i + 1) % rf_freqs.size()], UNUSED_CHAN);
// Program the current frequency
- // This frequency was already pre-programmed in the previous iteration so the local oscillators
- // are already tuned. This call will only configure front-end filter, amplifiers, etc
+ // This frequency was already pre-programmed in the previous iteration so the
+ // local oscillators are already tuned. This call will only configure
+ // front-end filter, amplifiers, etc
usrp->set_rx_freq(rf_freqs[i], ACTIVE_CHAN);
// Receive one burst of samples
@@ -253,16 +264,15 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
}
auto end_time = boost::get_system_time();
- std::cout
- << boost::format("Sweep done in %d milliseconds.\n")
- % ((end_time - start_time).total_milliseconds() * 1000);
+ std::cout << boost::format("Sweep done in %d milliseconds.\n")
+ % ((end_time - start_time).total_milliseconds() * 1000);
// Optionally convert received samples to FFT and write to file
- if(vm.count("fft-path")) {
+ if (vm.count("fft-path")) {
write_fft_to_file(fft_path);
}
- if (!vm.count("repeat")){
+ if (!vm.count("repeat")) {
break;
}
}
@@ -272,4 +282,3 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
usrp.reset();
return EXIT_SUCCESS;
}
-
diff --git a/host/examples/tx_bursts.cpp b/host/examples/tx_bursts.cpp
index 3f179b47c..4be4e694b 100644
--- a/host/examples/tx_bursts.cpp
+++ b/host/examples/tx_bursts.cpp
@@ -5,26 +5,30 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/format.hpp>
#include <boost/program_options.hpp>
#include <boost/thread/thread.hpp>
-#include <boost/format.hpp>
-#include <boost/algorithm/string.hpp>
+#include <complex>
#include <csignal>
#include <iostream>
-#include <complex>
namespace po = boost::program_options;
static bool stop_signal_called = false;
-void sig_int_handler(int){stop_signal_called = true;}
+void sig_int_handler(int)
+{
+ stop_signal_called = true;
+}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args, channel_list;
double seconds_in_future;
size_t total_num_samps;
@@ -34,7 +38,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
double rep_rate;
double gain;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -57,110 +61,116 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD TX Timed Samples %s") % desc << std::endl;
return ~0;
}
bool verbose = vm.count("dilv") == 0;
- bool repeat = vm.count("repeat") != 0;
+ bool repeat = vm.count("repeat") != 0;
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //detect which channels to use
+ // detect which channels to use
std::vector<std::string> channel_strings;
std::vector<size_t> channel_nums;
boost::split(channel_strings, channel_list, boost::is_any_of("\"',"));
- for(size_t ch = 0; ch < channel_strings.size(); ch++){
+ for (size_t ch = 0; ch < channel_strings.size(); ch++) {
size_t chan = std::stoi(channel_strings[ch]);
- if(chan >= usrp->get_tx_num_channels()){
+ if (chan >= usrp->get_tx_num_channels()) {
throw std::runtime_error("Invalid channel(s) specified.");
- }
- else channel_nums.push_back(std::stoi(channel_strings[ch]));
+ } else
+ channel_nums.push_back(std::stoi(channel_strings[ch]));
}
- //set the tx sample rate
- std::cout << boost::format("Setting TX Rate: %f Msps...") % (rate/1e6) << std::endl;
+ // set the tx sample rate
+ std::cout << boost::format("Setting TX Rate: %f Msps...") % (rate / 1e6) << std::endl;
usrp->set_tx_rate(rate);
- std::cout << boost::format("Actual TX Rate: %f Msps...") % (usrp->get_tx_rate()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Rate: %f Msps...") % (usrp->get_tx_rate() / 1e6)
+ << std::endl
+ << std::endl;
- std::cout << boost::format("Setting TX Freq: %f MHz...") % (freq/1e6) << std::endl;
- for(size_t i=0; i < channel_nums.size(); i++){
+ std::cout << boost::format("Setting TX Freq: %f MHz...") % (freq / 1e6) << std::endl;
+ for (size_t i = 0; i < channel_nums.size(); i++) {
uhd::tune_request_t tune_request(freq);
- if(vm.count("int-n")) tune_request.args = uhd::device_addr_t("mode_n=integer");
+ if (vm.count("int-n"))
+ tune_request.args = uhd::device_addr_t("mode_n=integer");
usrp->set_tx_freq(tune_request, channel_nums[i]);
}
- std::cout << boost::format("Actual TX Freq: %f MHz...") % (usrp->get_tx_freq()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Freq: %f MHz...") % (usrp->get_tx_freq() / 1e6)
+ << std::endl
+ << std::endl;
std::cout << boost::format("Setting TX Gain: %f...") % (gain) << std::endl;
- for(size_t i=0; i < channel_nums.size(); i++) usrp->set_tx_gain(gain, channel_nums[i]);
- std::cout << boost::format("Actual TX Gain: %f...") % (usrp->get_tx_gain()) << std::endl << std::endl;
+ for (size_t i = 0; i < channel_nums.size(); i++)
+ usrp->set_tx_gain(gain, channel_nums[i]);
+ std::cout << boost::format("Actual TX Gain: %f...") % (usrp->get_tx_gain())
+ << std::endl
+ << std::endl;
std::cout << boost::format("Setting device timestamp to 0...") << std::endl;
usrp->set_time_now(uhd::time_spec_t(0.0));
- //create a transmit streamer
- uhd::stream_args_t stream_args("fc32"); //complex floats
- stream_args.channels = channel_nums;
+ // create a transmit streamer
+ uhd::stream_args_t stream_args("fc32"); // complex floats
+ stream_args.channels = channel_nums;
uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(stream_args);
- //allocate buffer with data to send
+ // allocate buffer with data to send
const size_t spb = tx_stream->get_max_num_samps();
- std::vector<std::complex<float> > buff(spb, std::complex<float>(ampl, ampl));
- std::vector<std::complex<float> *> buffs(channel_nums.size(), &buff.front());
+ std::vector<std::complex<float>> buff(spb, std::complex<float>(ampl, ampl));
+ std::vector<std::complex<float>*> buffs(channel_nums.size(), &buff.front());
std::signal(SIGINT, &sig_int_handler);
- if(repeat) std::cout << "Press Ctrl + C to quit..." << std::endl;
+ if (repeat)
+ std::cout << "Press Ctrl + C to quit..." << std::endl;
double time_to_send = seconds_in_future;
do {
- //setup metadata for the first packet
+ // setup metadata for the first packet
uhd::tx_metadata_t md;
md.start_of_burst = true;
- md.end_of_burst = false;
- md.has_time_spec = true;
- md.time_spec = uhd::time_spec_t(time_to_send);
+ md.end_of_burst = false;
+ md.has_time_spec = true;
+ md.time_spec = uhd::time_spec_t(time_to_send);
- //the first call to send() will block this many seconds before sending:
- double timeout = std::max(rep_rate, seconds_in_future) + 0.1; //timeout (delay before transmit + padding)
+ // the first call to send() will block this many seconds before sending:
+ double timeout = std::max(rep_rate, seconds_in_future)
+ + 0.1; // timeout (delay before transmit + padding)
- size_t num_acc_samps = 0; //number of accumulated samples
- while(num_acc_samps < total_num_samps){
+ size_t num_acc_samps = 0; // number of accumulated samples
+ while (num_acc_samps < total_num_samps) {
size_t samps_to_send = total_num_samps - num_acc_samps;
- if (samps_to_send > spb)
- {
+ if (samps_to_send > spb) {
samps_to_send = spb;
} else {
md.end_of_burst = true;
}
- //send a single packet
- size_t num_tx_samps = tx_stream->send(
- buffs, samps_to_send, md, timeout
- );
- //do not use time spec for subsequent packets
- md.has_time_spec = false;
+ // send a single packet
+ size_t num_tx_samps = tx_stream->send(buffs, samps_to_send, md, timeout);
+ // do not use time spec for subsequent packets
+ md.has_time_spec = false;
md.start_of_burst = false;
- if (num_tx_samps < samps_to_send)
- {
+ if (num_tx_samps < samps_to_send) {
std::cerr << "Send timeout..." << std::endl;
- if (stop_signal_called)
- {
+ if (stop_signal_called) {
exit(EXIT_FAILURE);
}
}
- if(verbose)
- {
- std::cout << boost::format("Sent packet: %u samples") % num_tx_samps << std::endl;
+ if (verbose) {
+ std::cout << boost::format("Sent packet: %u samples") % num_tx_samps
+ << std::endl;
}
num_acc_samps += num_tx_samps;
@@ -171,18 +181,18 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
std::cout << std::endl << "Waiting for async burst ACK... " << std::flush;
uhd::async_metadata_t async_md;
size_t acks = 0;
- //loop through all messages for the ACK packets (may have underflow messages in queue)
- while (acks < channel_nums.size() and tx_stream->recv_async_msg(async_md, seconds_in_future))
- {
- if (async_md.event_code == uhd::async_metadata_t::EVENT_CODE_BURST_ACK)
- {
+ // loop through all messages for the ACK packets (may have underflow messages in
+ // queue)
+ while (acks < channel_nums.size()
+ and tx_stream->recv_async_msg(async_md, seconds_in_future)) {
+ if (async_md.event_code == uhd::async_metadata_t::EVENT_CODE_BURST_ACK) {
acks++;
}
}
std::cout << (acks == channel_nums.size() ? "success" : "fail") << std::endl;
} while (not stop_signal_called and repeat);
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/tx_samples_from_file.cpp b/host/examples/tx_samples_from_file.cpp
index 40974b4a2..d2de72a68 100644
--- a/host/examples/tx_samples_from_file.cpp
+++ b/host/examples/tx_samples_from_file.cpp
@@ -6,41 +6,41 @@
//
#include <uhd/types/tune_request.hpp>
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
-#include <iostream>
-#include <fstream>
+#include <boost/program_options.hpp>
+#include <chrono>
#include <complex>
#include <csignal>
-#include <chrono>
+#include <fstream>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
static bool stop_signal_called = false;
-void sig_int_handler(int){stop_signal_called = true;}
-
-template<typename samp_type> void send_from_file(
- uhd::tx_streamer::sptr tx_stream,
- const std::string &file,
- size_t samps_per_buff
-){
+void sig_int_handler(int)
+{
+ stop_signal_called = true;
+}
+template <typename samp_type>
+void send_from_file(
+ uhd::tx_streamer::sptr tx_stream, const std::string& file, size_t samps_per_buff)
+{
uhd::tx_metadata_t md;
md.start_of_burst = false;
- md.end_of_burst = false;
+ md.end_of_burst = false;
std::vector<samp_type> buff(samps_per_buff);
std::ifstream infile(file.c_str(), std::ifstream::binary);
- //loop until the entire file has been read
-
- while(not md.end_of_burst and not stop_signal_called){
+ // loop until the entire file has been read
- infile.read((char*)&buff.front(), buff.size()*sizeof(samp_type));
- size_t num_tx_samps = size_t(infile.gcount()/sizeof(samp_type));
+ while (not md.end_of_burst and not stop_signal_called) {
+ infile.read((char*)&buff.front(), buff.size() * sizeof(samp_type));
+ size_t num_tx_samps = size_t(infile.gcount() / sizeof(samp_type));
md.end_of_burst = infile.eof();
@@ -50,15 +50,16 @@ template<typename samp_type> void send_from_file(
infile.close();
}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args, file, type, ant, subdev, ref, wirefmt, channel;
size_t spb;
double rate, freq, gain, bw, delay, lo_offset;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -89,125 +90,149 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD TX samples from file %s") % desc << std::endl;
return ~0;
}
bool repeat = vm.count("repeat") > 0;
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
- //Lock mboard clocks
+ // Lock mboard clocks
usrp->set_clock_source(ref);
- //always select the subdevice first, the channel mapping affects the other settings
- if (vm.count("subdev")) usrp->set_tx_subdev_spec(subdev);
+ // always select the subdevice first, the channel mapping affects the other settings
+ if (vm.count("subdev"))
+ usrp->set_tx_subdev_spec(subdev);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //set the sample rate
- if (not vm.count("rate")){
+ // set the sample rate
+ if (not vm.count("rate")) {
std::cerr << "Please specify the sample rate with --rate" << std::endl;
return ~0;
}
- std::cout << boost::format("Setting TX Rate: %f Msps...") % (rate/1e6) << std::endl;
+ std::cout << boost::format("Setting TX Rate: %f Msps...") % (rate / 1e6) << std::endl;
usrp->set_tx_rate(rate);
- std::cout << boost::format("Actual TX Rate: %f Msps...") % (usrp->get_tx_rate()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Rate: %f Msps...") % (usrp->get_tx_rate() / 1e6)
+ << std::endl
+ << std::endl;
- //set the center frequency
- if (not vm.count("freq")){
+ // set the center frequency
+ if (not vm.count("freq")) {
std::cerr << "Please specify the center frequency with --freq" << std::endl;
return ~0;
}
- std::cout << boost::format("Setting TX Freq: %f MHz...") % (freq/1e6) << std::endl;
- std::cout << boost::format("Setting TX LO Offset: %f MHz...") % (lo_offset/1e6) << std::endl;
+ std::cout << boost::format("Setting TX Freq: %f MHz...") % (freq / 1e6) << std::endl;
+ std::cout << boost::format("Setting TX LO Offset: %f MHz...") % (lo_offset / 1e6)
+ << std::endl;
uhd::tune_request_t tune_request;
tune_request = uhd::tune_request_t(freq, lo_offset);
- if(vm.count("int-n")) tune_request.args = uhd::device_addr_t("mode_n=integer");
+ if (vm.count("int-n"))
+ tune_request.args = uhd::device_addr_t("mode_n=integer");
usrp->set_tx_freq(tune_request);
- std::cout << boost::format("Actual TX Freq: %f MHz...") % (usrp->get_tx_freq()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Freq: %f MHz...") % (usrp->get_tx_freq() / 1e6)
+ << std::endl
+ << std::endl;
- //set the rf gain
- if (vm.count("gain")){
+ // set the rf gain
+ if (vm.count("gain")) {
std::cout << boost::format("Setting TX Gain: %f dB...") % gain << std::endl;
usrp->set_tx_gain(gain);
- std::cout << boost::format("Actual TX Gain: %f dB...") % usrp->get_tx_gain() << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Gain: %f dB...") % usrp->get_tx_gain()
+ << std::endl
+ << std::endl;
}
- //set the analog frontend filter bandwidth
- if (vm.count("bw")){
- std::cout << boost::format("Setting TX Bandwidth: %f MHz...")
- % (bw / 1e6)
+ // set the analog frontend filter bandwidth
+ if (vm.count("bw")) {
+ std::cout << boost::format("Setting TX Bandwidth: %f MHz...") % (bw / 1e6)
<< std::endl;
usrp->set_tx_bandwidth(bw);
std::cout << boost::format("Actual TX Bandwidth: %f MHz...")
- % (usrp->get_tx_bandwidth() / 1e6)
- << std::endl << std::endl;
+ % (usrp->get_tx_bandwidth() / 1e6)
+ << std::endl
+ << std::endl;
}
- //set the antenna
- if (vm.count("ant")) usrp->set_tx_antenna(ant);
+ // set the antenna
+ if (vm.count("ant"))
+ usrp->set_tx_antenna(ant);
- //allow for some setup time:
+ // allow for some setup time:
std::this_thread::sleep_for(std::chrono::seconds(1));
- //Check Ref and LO Lock detect
+ // Check Ref and LO Lock detect
std::vector<std::string> sensor_names;
sensor_names = usrp->get_tx_sensor_names(0);
- if (std::find(sensor_names.begin(), sensor_names.end(), "lo_locked") != sensor_names.end()) {
- uhd::sensor_value_t lo_locked = usrp->get_tx_sensor("lo_locked",0);
- std::cout << boost::format("Checking TX: %s ...") % lo_locked.to_pp_string() << std::endl;
+ if (std::find(sensor_names.begin(), sensor_names.end(), "lo_locked")
+ != sensor_names.end()) {
+ uhd::sensor_value_t lo_locked = usrp->get_tx_sensor("lo_locked", 0);
+ std::cout << boost::format("Checking TX: %s ...") % lo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(lo_locked.to_bool());
}
sensor_names = usrp->get_mboard_sensor_names(0);
- if ((ref == "mimo") and (std::find(sensor_names.begin(), sensor_names.end(), "mimo_locked") != sensor_names.end())) {
- uhd::sensor_value_t mimo_locked = usrp->get_mboard_sensor("mimo_locked",0);
- std::cout << boost::format("Checking TX: %s ...") % mimo_locked.to_pp_string() << std::endl;
+ if ((ref == "mimo")
+ and (std::find(sensor_names.begin(), sensor_names.end(), "mimo_locked")
+ != sensor_names.end())) {
+ uhd::sensor_value_t mimo_locked = usrp->get_mboard_sensor("mimo_locked", 0);
+ std::cout << boost::format("Checking TX: %s ...") % mimo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(mimo_locked.to_bool());
}
- if ((ref == "external") and (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked") != sensor_names.end())) {
- uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked",0);
- std::cout << boost::format("Checking TX: %s ...") % ref_locked.to_pp_string() << std::endl;
+ if ((ref == "external")
+ and (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked")
+ != sensor_names.end())) {
+ uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked", 0);
+ std::cout << boost::format("Checking TX: %s ...") % ref_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(ref_locked.to_bool());
}
- //set sigint if user wants to receive
- if(repeat){
+ // set sigint if user wants to receive
+ if (repeat) {
std::signal(SIGINT, &sig_int_handler);
std::cout << "Press Ctrl + C to stop streaming..." << std::endl;
}
- //create a transmit streamer
+ // create a transmit streamer
std::string cpu_format;
std::vector<size_t> channel_nums;
- if (type == "double") cpu_format = "fc64";
- else if (type == "float") cpu_format = "fc32";
- else if (type == "short") cpu_format = "sc16";
+ if (type == "double")
+ cpu_format = "fc64";
+ else if (type == "float")
+ cpu_format = "fc32";
+ else if (type == "short")
+ cpu_format = "sc16";
uhd::stream_args_t stream_args(cpu_format, wirefmt);
channel_nums.push_back(boost::lexical_cast<size_t>(channel));
- stream_args.channels = channel_nums;
+ stream_args.channels = channel_nums;
uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(stream_args);
- //send from file
- do{
- if (type == "double") send_from_file<std::complex<double> >(tx_stream, file, spb);
- else if (type == "float") send_from_file<std::complex<float> >(tx_stream, file, spb);
- else if (type == "short") send_from_file<std::complex<short> >(tx_stream, file, spb);
- else throw std::runtime_error("Unknown type " + type);
-
- if(repeat and delay > 0.0) {
- std::this_thread::sleep_for(
- std::chrono::milliseconds(int64_t(delay*1000))
- );
+ // send from file
+ do {
+ if (type == "double")
+ send_from_file<std::complex<double>>(tx_stream, file, spb);
+ else if (type == "float")
+ send_from_file<std::complex<float>>(tx_stream, file, spb);
+ else if (type == "short")
+ send_from_file<std::complex<short>>(tx_stream, file, spb);
+ else
+ throw std::runtime_error("Unknown type " + type);
+
+ if (repeat and delay > 0.0) {
+ std::this_thread::sleep_for(std::chrono::milliseconds(int64_t(delay * 1000)));
}
- } while(repeat and not stop_signal_called);
+ } while (repeat and not stop_signal_called);
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/tx_timed_samples.cpp b/host/examples/tx_timed_samples.cpp
index b57578939..5ec5dbc23 100644
--- a/host/examples/tx_timed_samples.cpp
+++ b/host/examples/tx_timed_samples.cpp
@@ -5,21 +5,22 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
+#include <boost/format.hpp>
#include <boost/program_options.hpp>
#include <boost/thread/thread.hpp>
-#include <boost/format.hpp>
-#include <iostream>
#include <complex>
+#include <iostream>
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args;
std::string wire;
double seconds_in_future;
@@ -27,7 +28,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
double rate;
float ampl;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -45,77 +46,84 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD TX Timed Samples %s") % desc << std::endl;
return ~0;
}
bool verbose = vm.count("dilv") == 0;
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //set the tx sample rate
- std::cout << boost::format("Setting TX Rate: %f Msps...") % (rate/1e6) << std::endl;
+ // set the tx sample rate
+ std::cout << boost::format("Setting TX Rate: %f Msps...") % (rate / 1e6) << std::endl;
usrp->set_tx_rate(rate);
- std::cout << boost::format("Actual TX Rate: %f Msps...") % (usrp->get_tx_rate()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Rate: %f Msps...") % (usrp->get_tx_rate() / 1e6)
+ << std::endl
+ << std::endl;
std::cout << boost::format("Setting device timestamp to 0...") << std::endl;
usrp->set_time_now(uhd::time_spec_t(0.0));
- //create a transmit streamer
- uhd::stream_args_t stream_args("fc32", wire); //complex floats
+ // create a transmit streamer
+ uhd::stream_args_t stream_args("fc32", wire); // complex floats
uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(stream_args);
- //allocate buffer with data to send
- std::vector<std::complex<float> > buff(tx_stream->get_max_num_samps(), std::complex<float>(ampl, ampl));
+ // allocate buffer with data to send
+ std::vector<std::complex<float>> buff(
+ tx_stream->get_max_num_samps(), std::complex<float>(ampl, ampl));
- //setup metadata for the first packet
+ // setup metadata for the first packet
uhd::tx_metadata_t md;
md.start_of_burst = false;
- md.end_of_burst = false;
- md.has_time_spec = true;
- md.time_spec = uhd::time_spec_t(seconds_in_future);
+ md.end_of_burst = false;
+ md.has_time_spec = true;
+ md.time_spec = uhd::time_spec_t(seconds_in_future);
- //the first call to send() will block this many seconds before sending:
- const double timeout = seconds_in_future + 0.1; //timeout (delay before transmit + padding)
+ // the first call to send() will block this many seconds before sending:
+ const double timeout =
+ seconds_in_future + 0.1; // timeout (delay before transmit + padding)
- size_t num_acc_samps = 0; //number of accumulated samples
- while(num_acc_samps < total_num_samps){
+ size_t num_acc_samps = 0; // number of accumulated samples
+ while (num_acc_samps < total_num_samps) {
size_t samps_to_send = std::min(total_num_samps - num_acc_samps, buff.size());
- //send a single packet
- size_t num_tx_samps = tx_stream->send(
- &buff.front(), samps_to_send, md, timeout
- );
+ // send a single packet
+ size_t num_tx_samps = tx_stream->send(&buff.front(), samps_to_send, md, timeout);
- //do not use time spec for subsequent packets
+ // do not use time spec for subsequent packets
md.has_time_spec = false;
- if (num_tx_samps < samps_to_send) std::cerr << "Send timeout..." << std::endl;
- if(verbose) std::cout << boost::format("Sent packet: %u samples") % num_tx_samps << std::endl;
+ if (num_tx_samps < samps_to_send)
+ std::cerr << "Send timeout..." << std::endl;
+ if (verbose)
+ std::cout << boost::format("Sent packet: %u samples") % num_tx_samps
+ << std::endl;
num_acc_samps += num_tx_samps;
}
- //send a mini EOB packet
- md.end_of_burst = true;
+ // send a mini EOB packet
+ md.end_of_burst = true;
tx_stream->send("", 0, md);
std::cout << std::endl << "Waiting for async burst ACK... " << std::flush;
uhd::async_metadata_t async_md;
bool got_async_burst_ack = false;
- //loop through all messages for the ACK packet (may have underflow messages in queue)
- while (not got_async_burst_ack and tx_stream->recv_async_msg(async_md, timeout)){
- got_async_burst_ack = (async_md.event_code == uhd::async_metadata_t::EVENT_CODE_BURST_ACK);
+ // loop through all messages for the ACK packet (may have underflow messages in queue)
+ while (not got_async_burst_ack and tx_stream->recv_async_msg(async_md, timeout)) {
+ got_async_burst_ack =
+ (async_md.event_code == uhd::async_metadata_t::EVENT_CODE_BURST_ACK);
}
- std::cout << (got_async_burst_ack? "success" : "fail") << std::endl;
+ std::cout << (got_async_burst_ack ? "success" : "fail") << std::endl;
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/examples/tx_waveforms.cpp b/host/examples/tx_waveforms.cpp
index 1698c019d..5eb52f34c 100644
--- a/host/examples/tx_waveforms.cpp
+++ b/host/examples/tx_waveforms.cpp
@@ -6,20 +6,20 @@
//
#include "wavetable.hpp"
-#include <uhd/utils/thread.hpp>
+#include <uhd/exception.hpp>
+#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/utils/safe_main.hpp>
#include <uhd/utils/static.hpp>
-#include <uhd/usrp/multi_usrp.hpp>
-#include <uhd/exception.hpp>
-#include <boost/program_options.hpp>
-#include <boost/math/special_functions/round.hpp>
-#include <boost/format.hpp>
-#include <boost/algorithm/string.hpp>
+#include <uhd/utils/thread.hpp>
#include <stdint.h>
-#include <iostream>
+#include <boost/algorithm/string.hpp>
+#include <boost/format.hpp>
+#include <boost/math/special_functions/round.hpp>
+#include <boost/program_options.hpp>
+#include <chrono>
#include <csignal>
+#include <iostream>
#include <string>
-#include <chrono>
#include <thread>
namespace po = boost::program_options;
@@ -28,22 +28,26 @@ namespace po = boost::program_options;
* Signal handlers
**********************************************************************/
static bool stop_signal_called = false;
-void sig_int_handler(int){stop_signal_called = true;}
+void sig_int_handler(int)
+{
+ stop_signal_called = true;
+}
/***********************************************************************
* Main function
**********************************************************************/
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //variables to be set by po
+ // variables to be set by po
std::string args, wave_type, ant, subdev, ref, pps, otw, channel_list;
uint64_t total_num_samps;
size_t spb;
double rate, freq, gain, wave_freq, bw, lo_offset;
float ampl;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -73,170 +77,194 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD TX Waveforms %s") % desc << std::endl;
return ~0;
}
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
- //always select the subdevice first, the channel mapping affects the other settings
- if (vm.count("subdev")) usrp->set_tx_subdev_spec(subdev);
+ // always select the subdevice first, the channel mapping affects the other settings
+ if (vm.count("subdev"))
+ usrp->set_tx_subdev_spec(subdev);
- //detect which channels to use
+ // detect which channels to use
std::vector<std::string> channel_strings;
std::vector<size_t> channel_nums;
boost::split(channel_strings, channel_list, boost::is_any_of("\"',"));
- for(size_t ch = 0; ch < channel_strings.size(); ch++){
+ for (size_t ch = 0; ch < channel_strings.size(); ch++) {
size_t chan = std::stoi(channel_strings[ch]);
- if(chan >= usrp->get_tx_num_channels())
+ if (chan >= usrp->get_tx_num_channels())
throw std::runtime_error("Invalid channel(s) specified.");
else
channel_nums.push_back(std::stoi(channel_strings[ch]));
}
- //Lock mboard clocks
+ // Lock mboard clocks
usrp->set_clock_source(ref);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
- //set the sample rate
- if (not vm.count("rate")){
+ // set the sample rate
+ if (not vm.count("rate")) {
std::cerr << "Please specify the sample rate with --rate" << std::endl;
return ~0;
}
- std::cout << boost::format("Setting TX Rate: %f Msps...") % (rate/1e6) << std::endl;
+ std::cout << boost::format("Setting TX Rate: %f Msps...") % (rate / 1e6) << std::endl;
usrp->set_tx_rate(rate);
- std::cout << boost::format("Actual TX Rate: %f Msps...") % (usrp->get_tx_rate()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Rate: %f Msps...") % (usrp->get_tx_rate() / 1e6)
+ << std::endl
+ << std::endl;
- //set the center frequency
- if (not vm.count("freq")){
+ // set the center frequency
+ if (not vm.count("freq")) {
std::cerr << "Please specify the center frequency with --freq" << std::endl;
return ~0;
}
- for(size_t ch = 0; ch < channel_nums.size(); ch++) {
- std::cout << boost::format("Setting TX Freq: %f MHz...") % (freq/1e6) << std::endl;
- std::cout << boost::format("Setting TX LO Offset: %f MHz...") % (lo_offset/1e6)
+ for (size_t ch = 0; ch < channel_nums.size(); ch++) {
+ std::cout << boost::format("Setting TX Freq: %f MHz...") % (freq / 1e6)
+ << std::endl;
+ std::cout << boost::format("Setting TX LO Offset: %f MHz...") % (lo_offset / 1e6)
<< std::endl;
uhd::tune_request_t tune_request(freq, lo_offset);
- if(vm.count("int-n")) tune_request.args = uhd::device_addr_t("mode_n=integer");
+ if (vm.count("int-n"))
+ tune_request.args = uhd::device_addr_t("mode_n=integer");
usrp->set_tx_freq(tune_request, channel_nums[ch]);
- std::cout << boost::format("Actual TX Freq: %f MHz...") % (usrp->get_tx_freq(channel_nums[ch])/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Freq: %f MHz...")
+ % (usrp->get_tx_freq(channel_nums[ch]) / 1e6)
+ << std::endl
+ << std::endl;
- //set the rf gain
- if (vm.count("gain")){
+ // set the rf gain
+ if (vm.count("gain")) {
std::cout << boost::format("Setting TX Gain: %f dB...") % gain << std::endl;
usrp->set_tx_gain(gain, channel_nums[ch]);
- std::cout << boost::format("Actual TX Gain: %f dB...") % usrp->get_tx_gain(channel_nums[ch]) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Gain: %f dB...")
+ % usrp->get_tx_gain(channel_nums[ch])
+ << std::endl
+ << std::endl;
}
- //set the analog frontend filter bandwidth
- if (vm.count("bw")){
- std::cout << boost::format("Setting TX Bandwidth: %f MHz...") % bw << std::endl;
+ // set the analog frontend filter bandwidth
+ if (vm.count("bw")) {
+ std::cout << boost::format("Setting TX Bandwidth: %f MHz...") % bw
+ << std::endl;
usrp->set_tx_bandwidth(bw, channel_nums[ch]);
- std::cout << boost::format("Actual TX Bandwidth: %f MHz...") % usrp->get_tx_bandwidth(channel_nums[ch]) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Bandwidth: %f MHz...")
+ % usrp->get_tx_bandwidth(channel_nums[ch])
+ << std::endl
+ << std::endl;
}
- //set the antenna
- if (vm.count("ant")) usrp->set_tx_antenna(ant, channel_nums[ch]);
+ // set the antenna
+ if (vm.count("ant"))
+ usrp->set_tx_antenna(ant, channel_nums[ch]);
}
- std::this_thread::sleep_for(std::chrono::seconds(1)); //allow for some setup time
+ std::this_thread::sleep_for(std::chrono::seconds(1)); // allow for some setup time
- //for the const wave, set the wave freq for small samples per period
- if (wave_freq == 0){
- if (wave_type == "CONST"){
- wave_freq = usrp->get_tx_rate()/2;
+ // for the const wave, set the wave freq for small samples per period
+ if (wave_freq == 0) {
+ if (wave_type == "CONST") {
+ wave_freq = usrp->get_tx_rate() / 2;
} else {
- throw std::runtime_error("wave freq cannot be 0 with wave type other than CONST");
+ throw std::runtime_error(
+ "wave freq cannot be 0 with wave type other than CONST");
}
}
- //error when the waveform is not possible to generate
- if (std::abs(wave_freq) > usrp->get_tx_rate()/2){
+ // error when the waveform is not possible to generate
+ if (std::abs(wave_freq) > usrp->get_tx_rate() / 2) {
throw std::runtime_error("wave freq out of Nyquist zone");
}
- if (usrp->get_tx_rate()/std::abs(wave_freq) > wave_table_len/2){
+ if (usrp->get_tx_rate() / std::abs(wave_freq) > wave_table_len / 2) {
throw std::runtime_error("wave freq too small for table");
}
- //pre-compute the waveform values
+ // pre-compute the waveform values
const wave_table_class wave_table(wave_type, ampl);
- const size_t step = boost::math::iround(wave_freq/usrp->get_tx_rate() * wave_table_len);
+ const size_t step =
+ boost::math::iround(wave_freq / usrp->get_tx_rate() * wave_table_len);
size_t index = 0;
- //create a transmit streamer
- //linearly map channels (index0 = channel0, index1 = channel1, ...)
+ // create a transmit streamer
+ // linearly map channels (index0 = channel0, index1 = channel1, ...)
uhd::stream_args_t stream_args("fc32", otw);
- stream_args.channels = channel_nums;
+ stream_args.channels = channel_nums;
uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(stream_args);
- //allocate a buffer which we re-use for each channel
+ // allocate a buffer which we re-use for each channel
if (spb == 0) {
- spb = tx_stream->get_max_num_samps()*10;
+ spb = tx_stream->get_max_num_samps() * 10;
}
- std::vector<std::complex<float> > buff(spb);
- std::vector<std::complex<float> *> buffs(channel_nums.size(), &buff.front());
+ std::vector<std::complex<float>> buff(spb);
+ std::vector<std::complex<float>*> buffs(channel_nums.size(), &buff.front());
- //pre-fill the buffer with the waveform
- for (size_t n = 0; n < buff.size(); n++){
+ // pre-fill the buffer with the waveform
+ for (size_t n = 0; n < buff.size(); n++) {
buff[n] = wave_table(index += step);
}
std::cout << boost::format("Setting device timestamp to 0...") << std::endl;
- if (channel_nums.size() > 1)
- {
+ if (channel_nums.size() > 1) {
// Sync times
- if (pps == "mimo")
- {
+ if (pps == "mimo") {
UHD_ASSERT_THROW(usrp->get_num_mboards() == 2);
- //make mboard 1 a slave over the MIMO Cable
+ // make mboard 1 a slave over the MIMO Cable
usrp->set_time_source("mimo", 1);
- //set time on the master (mboard 0)
+ // set time on the master (mboard 0)
usrp->set_time_now(uhd::time_spec_t(0.0), 0);
- //sleep a bit while the slave locks its time to the master
+ // sleep a bit while the slave locks its time to the master
std::this_thread::sleep_for(std::chrono::milliseconds(100));
- }
- else
- {
+ } else {
if (pps == "internal" or pps == "external" or pps == "gpsdo")
usrp->set_time_source(pps);
usrp->set_time_unknown_pps(uhd::time_spec_t(0.0));
- std::this_thread::sleep_for(std::chrono::seconds(1)); //wait for pps sync pulse
+ std::this_thread::sleep_for(
+ std::chrono::seconds(1)); // wait for pps sync pulse
}
- }
- else
- {
+ } else {
usrp->set_time_now(0.0);
}
- //Check Ref and LO Lock detect
+ // Check Ref and LO Lock detect
std::vector<std::string> sensor_names;
const size_t tx_sensor_chan = channel_nums.empty() ? 0 : channel_nums[0];
- sensor_names = usrp->get_tx_sensor_names(tx_sensor_chan);
- if (std::find(sensor_names.begin(), sensor_names.end(), "lo_locked") != sensor_names.end()) {
+ sensor_names = usrp->get_tx_sensor_names(tx_sensor_chan);
+ if (std::find(sensor_names.begin(), sensor_names.end(), "lo_locked")
+ != sensor_names.end()) {
uhd::sensor_value_t lo_locked = usrp->get_tx_sensor("lo_locked", tx_sensor_chan);
- std::cout << boost::format("Checking TX: %s ...") % lo_locked.to_pp_string() << std::endl;
+ std::cout << boost::format("Checking TX: %s ...") % lo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(lo_locked.to_bool());
}
const size_t mboard_sensor_idx = 0;
- sensor_names = usrp->get_mboard_sensor_names(mboard_sensor_idx);
- if ((ref == "mimo") and (std::find(sensor_names.begin(), sensor_names.end(), "mimo_locked") != sensor_names.end())) {
- uhd::sensor_value_t mimo_locked = usrp->get_mboard_sensor("mimo_locked", mboard_sensor_idx);
- std::cout << boost::format("Checking TX: %s ...") % mimo_locked.to_pp_string() << std::endl;
+ sensor_names = usrp->get_mboard_sensor_names(mboard_sensor_idx);
+ if ((ref == "mimo")
+ and (std::find(sensor_names.begin(), sensor_names.end(), "mimo_locked")
+ != sensor_names.end())) {
+ uhd::sensor_value_t mimo_locked =
+ usrp->get_mboard_sensor("mimo_locked", mboard_sensor_idx);
+ std::cout << boost::format("Checking TX: %s ...") % mimo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(mimo_locked.to_bool());
}
- if ((ref == "external") and (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked") != sensor_names.end())) {
- uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked", mboard_sensor_idx);
- std::cout << boost::format("Checking TX: %s ...") % ref_locked.to_pp_string() << std::endl;
+ if ((ref == "external")
+ and (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked")
+ != sensor_names.end())) {
+ uhd::sensor_value_t ref_locked =
+ usrp->get_mboard_sensor("ref_locked", mboard_sensor_idx);
+ std::cout << boost::format("Checking TX: %s ...") % ref_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(ref_locked.to_bool());
}
@@ -249,13 +277,12 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
md.start_of_burst = true;
md.end_of_burst = false;
md.has_time_spec = true;
- md.time_spec = usrp->get_time_now() + uhd::time_spec_t(0.1);
+ md.time_spec = usrp->get_time_now() + uhd::time_spec_t(0.1);
- //send data until the signal handler gets called
- //or if we accumulate the number of samples specified (unless it's 0)
+ // send data until the signal handler gets called
+ // or if we accumulate the number of samples specified (unless it's 0)
uint64_t num_acc_samps = 0;
- while(true){
-
+ while (true) {
// Break on the end of duration or CTRL-C
if (stop_signal_called) {
break;
@@ -265,25 +292,23 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
break;
}
- //send the entire contents of the buffer
- num_acc_samps += tx_stream->send(
- buffs, buff.size(), md
- );
+ // send the entire contents of the buffer
+ num_acc_samps += tx_stream->send(buffs, buff.size(), md);
- //fill the buffer with the waveform
- for (size_t n = 0; n < buff.size(); n++){
+ // fill the buffer with the waveform
+ for (size_t n = 0; n < buff.size(); n++) {
buff[n] = wave_table(index += step);
}
md.start_of_burst = false;
- md.has_time_spec = false;
+ md.has_time_spec = false;
}
- //send a mini EOB packet
+ // send a mini EOB packet
md.end_of_burst = true;
tx_stream->send("", 0, md);
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
}
diff --git a/host/examples/txrx_loopback_to_file.cpp b/host/examples/txrx_loopback_to_file.cpp
index cae69e043..d1d0ae615 100644
--- a/host/examples/txrx_loopback_to_file.cpp
+++ b/host/examples/txrx_loopback_to_file.cpp
@@ -6,21 +6,21 @@
//
#include "wavetable.hpp"
+#include <uhd/exception.hpp>
#include <uhd/types/tune_request.hpp>
-#include <uhd/utils/thread.hpp>
+#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/utils/safe_main.hpp>
#include <uhd/utils/static.hpp>
-#include <uhd/usrp/multi_usrp.hpp>
-#include <uhd/exception.hpp>
-#include <boost/thread/thread.hpp>
-#include <boost/program_options.hpp>
-#include <boost/math/special_functions/round.hpp>
-#include <boost/format.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/filesystem.hpp>
-#include <iostream>
-#include <fstream>
+#include <boost/format.hpp>
+#include <boost/math/special_functions/round.hpp>
+#include <boost/program_options.hpp>
+#include <boost/thread/thread.hpp>
#include <csignal>
+#include <fstream>
+#include <iostream>
namespace po = boost::program_options;
@@ -28,25 +28,26 @@ namespace po = boost::program_options;
* Signal handlers
**********************************************************************/
static bool stop_signal_called = false;
-void sig_int_handler(int){stop_signal_called = true;}
+void sig_int_handler(int)
+{
+ stop_signal_called = true;
+}
/***********************************************************************
* Utilities
**********************************************************************/
//! Change to filename, e.g. from usrp_samples.dat to usrp_samples.00.dat,
// but only if multiple names are to be generated.
-std::string generate_out_filename(const std::string &base_fn, size_t n_names, size_t this_name)
+std::string generate_out_filename(
+ const std::string& base_fn, size_t n_names, size_t this_name)
{
if (n_names == 1) {
return base_fn;
}
boost::filesystem::path base_fn_fp(base_fn);
- base_fn_fp.replace_extension(
- boost::filesystem::path(
- str(boost::format("%02d%s") % this_name % base_fn_fp.extension().string())
- )
- );
+ base_fn_fp.replace_extension(boost::filesystem::path(
+ str(boost::format("%02d%s") % this_name % base_fn_fp.extension().string())));
return base_fn_fp.string();
}
@@ -55,32 +56,31 @@ std::string generate_out_filename(const std::string &base_fn, size_t n_names, si
* transmit_worker function
* A function to be used as a boost::thread_group thread for transmitting
**********************************************************************/
-void transmit_worker(
- std::vector<std::complex<float> > buff,
+void transmit_worker(std::vector<std::complex<float>> buff,
wave_table_class wave_table,
uhd::tx_streamer::sptr tx_streamer,
uhd::tx_metadata_t metadata,
size_t step,
size_t index,
- int num_channels
-){
- std::vector<std::complex<float> *> buffs(num_channels, &buff.front());
-
- //send data until the signal handler gets called
- while(not stop_signal_called){
- //fill the buffer with the waveform
- for (size_t n = 0; n < buff.size(); n++){
+ int num_channels)
+{
+ std::vector<std::complex<float>*> buffs(num_channels, &buff.front());
+
+ // send data until the signal handler gets called
+ while (not stop_signal_called) {
+ // fill the buffer with the waveform
+ for (size_t n = 0; n < buff.size(); n++) {
buff[n] = wave_table(index += step);
}
- //send the entire contents of the buffer
+ // send the entire contents of the buffer
tx_streamer->send(buffs, buff.size(), metadata);
metadata.start_of_burst = false;
- metadata.has_time_spec = false;
+ metadata.has_time_spec = false;
}
- //send a mini EOB packet
+ // send a mini EOB packet
metadata.end_of_burst = true;
tx_streamer->send("", 0, metadata);
}
@@ -89,86 +89,88 @@ void transmit_worker(
/***********************************************************************
* recv_to_file function
**********************************************************************/
-template<typename samp_type> void recv_to_file(
- uhd::usrp::multi_usrp::sptr usrp,
- const std::string &cpu_format,
- const std::string &wire_format,
- const std::string &file,
+template <typename samp_type>
+void recv_to_file(uhd::usrp::multi_usrp::sptr usrp,
+ const std::string& cpu_format,
+ const std::string& wire_format,
+ const std::string& file,
size_t samps_per_buff,
int num_requested_samples,
double settling_time,
- std::vector<size_t> rx_channel_nums
-){
+ std::vector<size_t> rx_channel_nums)
+{
int num_total_samps = 0;
- //create a receive streamer
- uhd::stream_args_t stream_args(cpu_format,wire_format);
- stream_args.channels = rx_channel_nums;
+ // create a receive streamer
+ uhd::stream_args_t stream_args(cpu_format, wire_format);
+ stream_args.channels = rx_channel_nums;
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
// Prepare buffers for received samples and metadata
uhd::rx_metadata_t md;
- std::vector <std::vector< samp_type > > buffs(
- rx_channel_nums.size(), std::vector< samp_type >(samps_per_buff)
- );
- //create a vector of pointers to point to each of the channel buffers
- std::vector<samp_type *> buff_ptrs;
+ std::vector<std::vector<samp_type>> buffs(
+ rx_channel_nums.size(), std::vector<samp_type>(samps_per_buff));
+ // create a vector of pointers to point to each of the channel buffers
+ std::vector<samp_type*> buff_ptrs;
for (size_t i = 0; i < buffs.size(); i++) {
buff_ptrs.push_back(&buffs[i].front());
}
// Create one ofstream object per channel
// (use shared_ptr because ofstream is non-copyable)
- std::vector<boost::shared_ptr<std::ofstream> > outfiles;
+ std::vector<boost::shared_ptr<std::ofstream>> outfiles;
for (size_t i = 0; i < buffs.size(); i++) {
const std::string this_filename = generate_out_filename(file, buffs.size(), i);
- outfiles.push_back(boost::shared_ptr<std::ofstream>(new std::ofstream(this_filename.c_str(), std::ofstream::binary)));
+ outfiles.push_back(boost::shared_ptr<std::ofstream>(
+ new std::ofstream(this_filename.c_str(), std::ofstream::binary)));
}
UHD_ASSERT_THROW(outfiles.size() == buffs.size());
UHD_ASSERT_THROW(buffs.size() == rx_channel_nums.size());
bool overflow_message = true;
- double timeout = settling_time + 0.1f; //expected settling time + padding for first recv
-
- //setup streaming
- uhd::stream_cmd_t stream_cmd((num_requested_samples == 0)?
- uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS:
- uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE
- );
- stream_cmd.num_samps = num_requested_samples;
+ double timeout =
+ settling_time + 0.1f; // expected settling time + padding for first recv
+
+ // setup streaming
+ uhd::stream_cmd_t stream_cmd((num_requested_samples == 0)
+ ? uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS
+ : uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
+ stream_cmd.num_samps = num_requested_samples;
stream_cmd.stream_now = false;
- stream_cmd.time_spec = uhd::time_spec_t(settling_time);
+ stream_cmd.time_spec = uhd::time_spec_t(settling_time);
rx_stream->issue_stream_cmd(stream_cmd);
- while(not stop_signal_called and (num_requested_samples > num_total_samps or num_requested_samples == 0)){
+ while (not stop_signal_called
+ and (num_requested_samples > num_total_samps or num_requested_samples == 0)) {
size_t num_rx_samps = rx_stream->recv(buff_ptrs, samps_per_buff, md, timeout);
- timeout = 0.1f; //small timeout for subsequent recv
+ timeout = 0.1f; // small timeout for subsequent recv
if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT) {
std::cout << boost::format("Timeout while streaming") << std::endl;
break;
}
- if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW){
- if (overflow_message){
+ if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW) {
+ if (overflow_message) {
overflow_message = false;
- std::cerr << boost::format(
- "Got an overflow indication. Please consider the following:\n"
- " Your write medium must sustain a rate of %fMB/s.\n"
- " Dropped samples will not be written to the file.\n"
- " Please modify this example for your purposes.\n"
- " This message will not appear again.\n"
- ) % (usrp->get_rx_rate()*sizeof(samp_type)/1e6);
+ std::cerr
+ << boost::format(
+ "Got an overflow indication. Please consider the following:\n"
+ " Your write medium must sustain a rate of %fMB/s.\n"
+ " Dropped samples will not be written to the file.\n"
+ " Please modify this example for your purposes.\n"
+ " This message will not appear again.\n")
+ % (usrp->get_rx_rate() * sizeof(samp_type) / 1e6);
}
continue;
}
- if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE){
- throw std::runtime_error(str(boost::format(
- "Receiver error %s"
- ) % md.strerror()));
+ if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
+ throw std::runtime_error(
+ str(boost::format("Receiver error %s") % md.strerror()));
}
num_total_samps += num_rx_samps;
for (size_t i = 0; i < outfiles.size(); i++) {
- outfiles[i]->write((const char*) buff_ptrs[i], num_rx_samps*sizeof(samp_type));
+ outfiles[i]->write(
+ (const char*)buff_ptrs[i], num_rx_samps * sizeof(samp_type));
}
}
@@ -186,21 +188,22 @@ template<typename samp_type> void recv_to_file(
/***********************************************************************
* Main function
**********************************************************************/
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
uhd::set_thread_priority_safe();
- //transmit variables to be set by po
+ // transmit variables to be set by po
std::string tx_args, wave_type, tx_ant, tx_subdev, ref, otw, tx_channels;
double tx_rate, tx_freq, tx_gain, wave_freq, tx_bw;
float ampl;
- //receive variables to be set by po
+ // receive variables to be set by po
std::string rx_args, file, type, rx_ant, rx_subdev, rx_channels;
size_t total_num_samps, spb;
double rx_rate, rx_freq, rx_gain, rx_bw;
double settling;
- //setup the program options
+ // setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -239,245 +242,315 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD TXRX Loopback to File %s") % desc << std::endl;
return ~0;
}
- //create a usrp device
+ // create a usrp device
std::cout << std::endl;
- std::cout << boost::format("Creating the transmit usrp device with: %s...") % tx_args << std::endl;
+ std::cout << boost::format("Creating the transmit usrp device with: %s...") % tx_args
+ << std::endl;
uhd::usrp::multi_usrp::sptr tx_usrp = uhd::usrp::multi_usrp::make(tx_args);
std::cout << std::endl;
- std::cout << boost::format("Creating the receive usrp device with: %s...") % rx_args << std::endl;
+ std::cout << boost::format("Creating the receive usrp device with: %s...") % rx_args
+ << std::endl;
uhd::usrp::multi_usrp::sptr rx_usrp = uhd::usrp::multi_usrp::make(rx_args);
- //always select the subdevice first, the channel mapping affects the other settings
- if (vm.count("tx-subdev")) tx_usrp->set_tx_subdev_spec(tx_subdev);
- if (vm.count("rx-subdev")) rx_usrp->set_rx_subdev_spec(rx_subdev);
+ // always select the subdevice first, the channel mapping affects the other settings
+ if (vm.count("tx-subdev"))
+ tx_usrp->set_tx_subdev_spec(tx_subdev);
+ if (vm.count("rx-subdev"))
+ rx_usrp->set_rx_subdev_spec(rx_subdev);
- //detect which channels to use
+ // detect which channels to use
std::vector<std::string> tx_channel_strings;
std::vector<size_t> tx_channel_nums;
boost::split(tx_channel_strings, tx_channels, boost::is_any_of("\"',"));
- for(size_t ch = 0; ch < tx_channel_strings.size(); ch++){
+ for (size_t ch = 0; ch < tx_channel_strings.size(); ch++) {
size_t chan = std::stoi(tx_channel_strings[ch]);
- if(chan >= tx_usrp->get_tx_num_channels()){
+ if (chan >= tx_usrp->get_tx_num_channels()) {
throw std::runtime_error("Invalid TX channel(s) specified.");
- }
- else tx_channel_nums.push_back(std::stoi(tx_channel_strings[ch]));
+ } else
+ tx_channel_nums.push_back(std::stoi(tx_channel_strings[ch]));
}
std::vector<std::string> rx_channel_strings;
std::vector<size_t> rx_channel_nums;
boost::split(rx_channel_strings, rx_channels, boost::is_any_of("\"',"));
- for(size_t ch = 0; ch < rx_channel_strings.size(); ch++){
+ for (size_t ch = 0; ch < rx_channel_strings.size(); ch++) {
size_t chan = std::stoi(rx_channel_strings[ch]);
- if(chan >= rx_usrp->get_rx_num_channels()){
+ if (chan >= rx_usrp->get_rx_num_channels()) {
throw std::runtime_error("Invalid RX channel(s) specified.");
- }
- else rx_channel_nums.push_back(std::stoi(rx_channel_strings[ch]));
+ } else
+ rx_channel_nums.push_back(std::stoi(rx_channel_strings[ch]));
}
- //Lock mboard clocks
+ // Lock mboard clocks
tx_usrp->set_clock_source(ref);
rx_usrp->set_clock_source(ref);
- std::cout << boost::format("Using TX Device: %s") % tx_usrp->get_pp_string() << std::endl;
- std::cout << boost::format("Using RX Device: %s") % rx_usrp->get_pp_string() << std::endl;
+ std::cout << boost::format("Using TX Device: %s") % tx_usrp->get_pp_string()
+ << std::endl;
+ std::cout << boost::format("Using RX Device: %s") % rx_usrp->get_pp_string()
+ << std::endl;
- //set the transmit sample rate
- if (not vm.count("tx-rate")){
- std::cerr << "Please specify the transmit sample rate with --tx-rate" << std::endl;
+ // set the transmit sample rate
+ if (not vm.count("tx-rate")) {
+ std::cerr << "Please specify the transmit sample rate with --tx-rate"
+ << std::endl;
return ~0;
}
- std::cout << boost::format("Setting TX Rate: %f Msps...") % (tx_rate/1e6) << std::endl;
+ std::cout << boost::format("Setting TX Rate: %f Msps...") % (tx_rate / 1e6)
+ << std::endl;
tx_usrp->set_tx_rate(tx_rate);
- std::cout << boost::format("Actual TX Rate: %f Msps...") % (tx_usrp->get_tx_rate()/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Rate: %f Msps...")
+ % (tx_usrp->get_tx_rate() / 1e6)
+ << std::endl
+ << std::endl;
- //set the receive sample rate
- if (not vm.count("rx-rate")){
+ // set the receive sample rate
+ if (not vm.count("rx-rate")) {
std::cerr << "Please specify the sample rate with --rx-rate" << std::endl;
return ~0;
}
- std::cout << boost::format("Setting RX Rate: %f Msps...") % (rx_rate/1e6) << std::endl;
+ std::cout << boost::format("Setting RX Rate: %f Msps...") % (rx_rate / 1e6)
+ << std::endl;
rx_usrp->set_rx_rate(rx_rate);
- std::cout << boost::format("Actual RX Rate: %f Msps...") % (rx_usrp->get_rx_rate()/1e6) << std::endl << std::endl;
-
- //set the transmit center frequency
- if (not vm.count("tx-freq")){
- std::cerr << "Please specify the transmit center frequency with --tx-freq" << std::endl;
+ std::cout << boost::format("Actual RX Rate: %f Msps...")
+ % (rx_usrp->get_rx_rate() / 1e6)
+ << std::endl
+ << std::endl;
+
+ // set the transmit center frequency
+ if (not vm.count("tx-freq")) {
+ std::cerr << "Please specify the transmit center frequency with --tx-freq"
+ << std::endl;
return ~0;
}
- for(size_t ch = 0; ch < tx_channel_nums.size(); ch++) {
+ for (size_t ch = 0; ch < tx_channel_nums.size(); ch++) {
size_t channel = tx_channel_nums[ch];
if (tx_channel_nums.size() > 1) {
std::cout << "Configuring TX Channel " << channel << std::endl;
}
- std::cout << boost::format("Setting TX Freq: %f MHz...") % (tx_freq/1e6) << std::endl;
+ std::cout << boost::format("Setting TX Freq: %f MHz...") % (tx_freq / 1e6)
+ << std::endl;
uhd::tune_request_t tx_tune_request(tx_freq);
- if(vm.count("tx-int-n")) tx_tune_request.args = uhd::device_addr_t("mode_n=integer");
+ if (vm.count("tx-int-n"))
+ tx_tune_request.args = uhd::device_addr_t("mode_n=integer");
tx_usrp->set_tx_freq(tx_tune_request, channel);
- std::cout << boost::format("Actual TX Freq: %f MHz...") % (tx_usrp->get_tx_freq(channel)/1e6) << std::endl << std::endl;
-
- //set the rf gain
- if (vm.count("tx-gain")){
- std::cout << boost::format("Setting TX Gain: %f dB...") % tx_gain << std::endl;
+ std::cout << boost::format("Actual TX Freq: %f MHz...")
+ % (tx_usrp->get_tx_freq(channel) / 1e6)
+ << std::endl
+ << std::endl;
+
+ // set the rf gain
+ if (vm.count("tx-gain")) {
+ std::cout << boost::format("Setting TX Gain: %f dB...") % tx_gain
+ << std::endl;
tx_usrp->set_tx_gain(tx_gain, channel);
- std::cout << boost::format("Actual TX Gain: %f dB...") % tx_usrp->get_tx_gain(channel) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Gain: %f dB...")
+ % tx_usrp->get_tx_gain(channel)
+ << std::endl
+ << std::endl;
}
- //set the analog frontend filter bandwidth
- if (vm.count("tx-bw")){
- std::cout << boost::format("Setting TX Bandwidth: %f MHz...") % tx_bw << std::endl;
+ // set the analog frontend filter bandwidth
+ if (vm.count("tx-bw")) {
+ std::cout << boost::format("Setting TX Bandwidth: %f MHz...") % tx_bw
+ << std::endl;
tx_usrp->set_tx_bandwidth(tx_bw, channel);
- std::cout << boost::format("Actual TX Bandwidth: %f MHz...") % tx_usrp->get_tx_bandwidth(channel) << std::endl << std::endl;
+ std::cout << boost::format("Actual TX Bandwidth: %f MHz...")
+ % tx_usrp->get_tx_bandwidth(channel)
+ << std::endl
+ << std::endl;
}
- //set the antenna
- if (vm.count("tx-ant")) tx_usrp->set_tx_antenna(tx_ant, channel);
+ // set the antenna
+ if (vm.count("tx-ant"))
+ tx_usrp->set_tx_antenna(tx_ant, channel);
}
- for(size_t ch = 0; ch < rx_channel_nums.size(); ch++) {
+ for (size_t ch = 0; ch < rx_channel_nums.size(); ch++) {
size_t channel = rx_channel_nums[ch];
if (rx_channel_nums.size() > 1) {
std::cout << "Configuring RX Channel " << channel << std::endl;
}
- //set the receive center frequency
- if (not vm.count("rx-freq")){
- std::cerr << "Please specify the center frequency with --rx-freq" << std::endl;
+ // set the receive center frequency
+ if (not vm.count("rx-freq")) {
+ std::cerr << "Please specify the center frequency with --rx-freq"
+ << std::endl;
return ~0;
}
- std::cout << boost::format("Setting RX Freq: %f MHz...") % (rx_freq/1e6) << std::endl;
+ std::cout << boost::format("Setting RX Freq: %f MHz...") % (rx_freq / 1e6)
+ << std::endl;
uhd::tune_request_t rx_tune_request(rx_freq);
- if(vm.count("rx-int-n")) rx_tune_request.args = uhd::device_addr_t("mode_n=integer");
+ if (vm.count("rx-int-n"))
+ rx_tune_request.args = uhd::device_addr_t("mode_n=integer");
rx_usrp->set_rx_freq(rx_tune_request, channel);
- std::cout << boost::format("Actual RX Freq: %f MHz...") % (rx_usrp->get_rx_freq(channel)/1e6) << std::endl << std::endl;
-
- //set the receive rf gain
- if (vm.count("rx-gain")){
- std::cout << boost::format("Setting RX Gain: %f dB...") % rx_gain << std::endl;
+ std::cout << boost::format("Actual RX Freq: %f MHz...")
+ % (rx_usrp->get_rx_freq(channel) / 1e6)
+ << std::endl
+ << std::endl;
+
+ // set the receive rf gain
+ if (vm.count("rx-gain")) {
+ std::cout << boost::format("Setting RX Gain: %f dB...") % rx_gain
+ << std::endl;
rx_usrp->set_rx_gain(rx_gain, channel);
- std::cout << boost::format("Actual RX Gain: %f dB...") % rx_usrp->get_rx_gain(channel) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Gain: %f dB...")
+ % rx_usrp->get_rx_gain(channel)
+ << std::endl
+ << std::endl;
}
- //set the receive analog frontend filter bandwidth
- if (vm.count("rx-bw")){
- std::cout << boost::format("Setting RX Bandwidth: %f MHz...") % (rx_bw/1e6) << std::endl;
+ // set the receive analog frontend filter bandwidth
+ if (vm.count("rx-bw")) {
+ std::cout << boost::format("Setting RX Bandwidth: %f MHz...") % (rx_bw / 1e6)
+ << std::endl;
rx_usrp->set_rx_bandwidth(rx_bw, channel);
- std::cout << boost::format("Actual RX Bandwidth: %f MHz...") % (rx_usrp->get_rx_bandwidth(channel)/1e6) << std::endl << std::endl;
+ std::cout << boost::format("Actual RX Bandwidth: %f MHz...")
+ % (rx_usrp->get_rx_bandwidth(channel) / 1e6)
+ << std::endl
+ << std::endl;
}
// set the receive antenna
- if (vm.count("rx-ant")) rx_usrp->set_rx_antenna(rx_ant, channel);
+ if (vm.count("rx-ant"))
+ rx_usrp->set_rx_antenna(rx_ant, channel);
}
- //for the const wave, set the wave freq for small samples per period
- if (wave_freq == 0 and wave_type == "CONST"){
- wave_freq = tx_usrp->get_tx_rate()/2;
+ // for the const wave, set the wave freq for small samples per period
+ if (wave_freq == 0 and wave_type == "CONST") {
+ wave_freq = tx_usrp->get_tx_rate() / 2;
}
- //error when the waveform is not possible to generate
- if (std::abs(wave_freq) > tx_usrp->get_tx_rate()/2){
+ // error when the waveform is not possible to generate
+ if (std::abs(wave_freq) > tx_usrp->get_tx_rate() / 2) {
throw std::runtime_error("wave freq out of Nyquist zone");
}
- if (tx_usrp->get_tx_rate()/std::abs(wave_freq) > wave_table_len/2){
+ if (tx_usrp->get_tx_rate() / std::abs(wave_freq) > wave_table_len / 2) {
throw std::runtime_error("wave freq too small for table");
}
- //pre-compute the waveform values
+ // pre-compute the waveform values
const wave_table_class wave_table(wave_type, ampl);
- const size_t step = boost::math::iround(wave_freq/tx_usrp->get_tx_rate() * wave_table_len);
+ const size_t step =
+ boost::math::iround(wave_freq / tx_usrp->get_tx_rate() * wave_table_len);
size_t index = 0;
- //create a transmit streamer
- //linearly map channels (index0 = channel0, index1 = channel1, ...)
+ // create a transmit streamer
+ // linearly map channels (index0 = channel0, index1 = channel1, ...)
uhd::stream_args_t stream_args("fc32", otw);
- stream_args.channels = tx_channel_nums;
+ stream_args.channels = tx_channel_nums;
uhd::tx_streamer::sptr tx_stream = tx_usrp->get_tx_stream(stream_args);
- //allocate a buffer which we re-use for each channel
- if (spb == 0) spb = tx_stream->get_max_num_samps()*10;
- std::vector<std::complex<float> > buff(spb);
+ // allocate a buffer which we re-use for each channel
+ if (spb == 0)
+ spb = tx_stream->get_max_num_samps() * 10;
+ std::vector<std::complex<float>> buff(spb);
int num_channels = tx_channel_nums.size();
- //setup the metadata flags
+ // setup the metadata flags
uhd::tx_metadata_t md;
md.start_of_burst = true;
md.end_of_burst = false;
md.has_time_spec = true;
- md.time_spec = uhd::time_spec_t(0.5); //give us 0.5 seconds to fill the tx buffers
+ md.time_spec = uhd::time_spec_t(0.5); // give us 0.5 seconds to fill the tx buffers
- //Check Ref and LO Lock detect
+ // Check Ref and LO Lock detect
std::vector<std::string> tx_sensor_names, rx_sensor_names;
tx_sensor_names = tx_usrp->get_tx_sensor_names(0);
- if (std::find(tx_sensor_names.begin(), tx_sensor_names.end(), "lo_locked") != tx_sensor_names.end()) {
- uhd::sensor_value_t lo_locked = tx_usrp->get_tx_sensor("lo_locked",0);
- std::cout << boost::format("Checking TX: %s ...") % lo_locked.to_pp_string() << std::endl;
+ if (std::find(tx_sensor_names.begin(), tx_sensor_names.end(), "lo_locked")
+ != tx_sensor_names.end()) {
+ uhd::sensor_value_t lo_locked = tx_usrp->get_tx_sensor("lo_locked", 0);
+ std::cout << boost::format("Checking TX: %s ...") % lo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(lo_locked.to_bool());
}
rx_sensor_names = rx_usrp->get_rx_sensor_names(0);
- if (std::find(rx_sensor_names.begin(), rx_sensor_names.end(), "lo_locked") != rx_sensor_names.end()) {
- uhd::sensor_value_t lo_locked = rx_usrp->get_rx_sensor("lo_locked",0);
- std::cout << boost::format("Checking RX: %s ...") % lo_locked.to_pp_string() << std::endl;
+ if (std::find(rx_sensor_names.begin(), rx_sensor_names.end(), "lo_locked")
+ != rx_sensor_names.end()) {
+ uhd::sensor_value_t lo_locked = rx_usrp->get_rx_sensor("lo_locked", 0);
+ std::cout << boost::format("Checking RX: %s ...") % lo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(lo_locked.to_bool());
}
tx_sensor_names = tx_usrp->get_mboard_sensor_names(0);
- if ((ref == "mimo") and (std::find(tx_sensor_names.begin(), tx_sensor_names.end(), "mimo_locked") != tx_sensor_names.end())) {
- uhd::sensor_value_t mimo_locked = tx_usrp->get_mboard_sensor("mimo_locked",0);
- std::cout << boost::format("Checking TX: %s ...") % mimo_locked.to_pp_string() << std::endl;
+ if ((ref == "mimo")
+ and (std::find(tx_sensor_names.begin(), tx_sensor_names.end(), "mimo_locked")
+ != tx_sensor_names.end())) {
+ uhd::sensor_value_t mimo_locked = tx_usrp->get_mboard_sensor("mimo_locked", 0);
+ std::cout << boost::format("Checking TX: %s ...") % mimo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(mimo_locked.to_bool());
}
- if ((ref == "external") and (std::find(tx_sensor_names.begin(), tx_sensor_names.end(), "ref_locked") != tx_sensor_names.end())) {
- uhd::sensor_value_t ref_locked = tx_usrp->get_mboard_sensor("ref_locked",0);
- std::cout << boost::format("Checking TX: %s ...") % ref_locked.to_pp_string() << std::endl;
+ if ((ref == "external")
+ and (std::find(tx_sensor_names.begin(), tx_sensor_names.end(), "ref_locked")
+ != tx_sensor_names.end())) {
+ uhd::sensor_value_t ref_locked = tx_usrp->get_mboard_sensor("ref_locked", 0);
+ std::cout << boost::format("Checking TX: %s ...") % ref_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(ref_locked.to_bool());
}
rx_sensor_names = rx_usrp->get_mboard_sensor_names(0);
- if ((ref == "mimo") and (std::find(rx_sensor_names.begin(), rx_sensor_names.end(), "mimo_locked") != rx_sensor_names.end())) {
- uhd::sensor_value_t mimo_locked = rx_usrp->get_mboard_sensor("mimo_locked",0);
- std::cout << boost::format("Checking RX: %s ...") % mimo_locked.to_pp_string() << std::endl;
+ if ((ref == "mimo")
+ and (std::find(rx_sensor_names.begin(), rx_sensor_names.end(), "mimo_locked")
+ != rx_sensor_names.end())) {
+ uhd::sensor_value_t mimo_locked = rx_usrp->get_mboard_sensor("mimo_locked", 0);
+ std::cout << boost::format("Checking RX: %s ...") % mimo_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(mimo_locked.to_bool());
}
- if ((ref == "external") and (std::find(rx_sensor_names.begin(), rx_sensor_names.end(), "ref_locked") != rx_sensor_names.end())) {
- uhd::sensor_value_t ref_locked = rx_usrp->get_mboard_sensor("ref_locked",0);
- std::cout << boost::format("Checking RX: %s ...") % ref_locked.to_pp_string() << std::endl;
+ if ((ref == "external")
+ and (std::find(rx_sensor_names.begin(), rx_sensor_names.end(), "ref_locked")
+ != rx_sensor_names.end())) {
+ uhd::sensor_value_t ref_locked = rx_usrp->get_mboard_sensor("ref_locked", 0);
+ std::cout << boost::format("Checking RX: %s ...") % ref_locked.to_pp_string()
+ << std::endl;
UHD_ASSERT_THROW(ref_locked.to_bool());
}
- if (total_num_samps == 0){
+ if (total_num_samps == 0) {
std::signal(SIGINT, &sig_int_handler);
std::cout << "Press Ctrl + C to stop streaming..." << std::endl;
}
- //reset usrp time to prepare for transmit/receive
+ // reset usrp time to prepare for transmit/receive
std::cout << boost::format("Setting device timestamp to 0...") << std::endl;
tx_usrp->set_time_now(uhd::time_spec_t(0.0));
- //start transmit worker thread
+ // start transmit worker thread
boost::thread_group transmit_thread;
- transmit_thread.create_thread(boost::bind(&transmit_worker, buff, wave_table, tx_stream, md, step, index, num_channels));
-
- //recv to file
- if (type == "double") recv_to_file<std::complex<double> >(rx_usrp, "fc64", otw, file, spb, total_num_samps, settling, rx_channel_nums);
- else if (type == "float") recv_to_file<std::complex<float> >(rx_usrp, "fc32", otw, file, spb, total_num_samps, settling, rx_channel_nums);
- else if (type == "short") recv_to_file<std::complex<short> >(rx_usrp, "sc16", otw, file, spb, total_num_samps, settling, rx_channel_nums);
+ transmit_thread.create_thread(boost::bind(
+ &transmit_worker, buff, wave_table, tx_stream, md, step, index, num_channels));
+
+ // recv to file
+ if (type == "double")
+ recv_to_file<std::complex<double>>(
+ rx_usrp, "fc64", otw, file, spb, total_num_samps, settling, rx_channel_nums);
+ else if (type == "float")
+ recv_to_file<std::complex<float>>(
+ rx_usrp, "fc32", otw, file, spb, total_num_samps, settling, rx_channel_nums);
+ else if (type == "short")
+ recv_to_file<std::complex<short>>(
+ rx_usrp, "sc16", otw, file, spb, total_num_samps, settling, rx_channel_nums);
else {
- //clean up transmit worker
+ // clean up transmit worker
stop_signal_called = true;
transmit_thread.join_all();
throw std::runtime_error("Unknown type " + type);
}
- //clean up transmit worker
+ // clean up transmit worker
stop_signal_called = true;
transmit_thread.join_all();
- //finished
+ // finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
}
diff --git a/host/examples/usrp_list_sensors.cpp b/host/examples/usrp_list_sensors.cpp
index 0ffe33e5a..56ecf9b7a 100644
--- a/host/examples/usrp_list_sensors.cpp
+++ b/host/examples/usrp_list_sensors.cpp
@@ -6,60 +6,53 @@
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/utils/safe_main.hpp>
-#include <boost/program_options.hpp>
#include <boost/algorithm/string.hpp> //for split
+#include <boost/program_options.hpp>
#include <iostream>
#include <sstream>
namespace po = boost::program_options;
namespace {
- std::string make_border(const std::string &text)
- {
- std::stringstream ss;
- ss << " _____________________________________________________\n";
- ss << " /" << std::endl;
- std::vector<std::string> lines;
- boost::split(lines, text, boost::is_any_of("\n"));
- while (lines.back().empty()) {
- lines.pop_back(); //strip trailing newlines
- }
- if (not lines.empty()) {
- lines[0] = " " + lines[0]; //indent the title line
- }
- for (const std::string& line : lines)
- {
- ss << "| " << line << std::endl;
- }
- return ss.str();
+std::string make_border(const std::string& text)
+{
+ std::stringstream ss;
+ ss << " _____________________________________________________\n";
+ ss << " /" << std::endl;
+ std::vector<std::string> lines;
+ boost::split(lines, text, boost::is_any_of("\n"));
+ while (lines.back().empty()) {
+ lines.pop_back(); // strip trailing newlines
+ }
+ if (not lines.empty()) {
+ lines[0] = " " + lines[0]; // indent the title line
}
+ for (const std::string& line : lines) {
+ ss << "| " << line << std::endl;
+ }
+ return ss.str();
}
+} // namespace
using namespace uhd::usrp;
std::string db_sensors_string(
- const std::string& tx_rx,
- multi_usrp::sptr usrp,
- const size_t mb_idx
-) {
+ const std::string& tx_rx, multi_usrp::sptr usrp, const size_t mb_idx)
+{
std::stringstream ss;
ss << tx_rx << " Sensors: \n" << std::endl;
- const size_t num_chans = (tx_rx == "RX")
- ? usrp->get_rx_subdev_spec(mb_idx).size()
- : usrp->get_tx_subdev_spec(mb_idx).size()
- ;
+ const size_t num_chans = (tx_rx == "RX") ? usrp->get_rx_subdev_spec(mb_idx).size()
+ : usrp->get_tx_subdev_spec(mb_idx).size();
for (size_t chan_idx = 0; chan_idx < num_chans; chan_idx++) {
ss << "Chan " << chan_idx << ": " << std::endl;
- const auto sensors = (tx_rx == "RX")
- ? usrp->get_rx_sensor_names(chan_idx)
- : usrp->get_tx_sensor_names(chan_idx);
+ const auto sensors = (tx_rx == "RX") ? usrp->get_rx_sensor_names(chan_idx)
+ : usrp->get_tx_sensor_names(chan_idx);
for (const auto& sensor : sensors) {
const auto sensor_value = (tx_rx == "RX")
- ? usrp->get_rx_sensor(sensor, chan_idx)
- : usrp->get_tx_sensor(sensor, chan_idx)
- ;
+ ? usrp->get_rx_sensor(sensor, chan_idx)
+ : usrp->get_tx_sensor(sensor, chan_idx);
ss << "* " << sensor_value.to_pp_string() << std::endl;
}
ss << std::endl;
@@ -74,8 +67,7 @@ std::string mboard_sensors_string(multi_usrp::sptr usrp, const size_t mb_idx)
ss << "Sensors for motherboard " << mb_idx << ": \n" << std::endl;
const auto mboard_sensors = usrp->get_mboard_sensor_names(mb_idx);
for (const auto& mboard_sensor : mboard_sensors) {
- const auto sensor_value =
- usrp->get_mboard_sensor(mboard_sensor, mb_idx);
+ const auto sensor_value = usrp->get_mboard_sensor(mboard_sensor, mb_idx);
ss << "* " << sensor_value.to_pp_string() << std::endl;
}
ss << make_border(db_sensors_string("RX", usrp, mb_idx)) << std::endl;
@@ -84,8 +76,8 @@ std::string mboard_sensors_string(multi_usrp::sptr usrp, const size_t mb_idx)
return ss.str();
}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
-
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
// Variables to be set by command line options
std::string usrp_args;
@@ -102,11 +94,11 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::notify(vm);
// Print the help message
- if (vm.count("help")){
- std::cout << std::endl << "Print sensor values"
- << std::endl << std::endl;
+ if (vm.count("help")) {
+ std::cout << std::endl << "Print sensor values" << std::endl << std::endl;
std::cout << "This example shows how to query sensors from"
- << "a USRP device.\n" << std::endl;
+ << "a USRP device.\n"
+ << std::endl;
std::cout << desc << std::endl;
return EXIT_SUCCESS;
}
@@ -116,12 +108,11 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
multi_usrp::sptr usrp = multi_usrp::make(usrp_args);
const size_t num_mboards = usrp->get_num_mboards();
- std::cout << "Device contains " << num_mboards
- << " motherboard(s)." << std::endl << std::endl;
+ std::cout << "Device contains " << num_mboards << " motherboard(s)." << std::endl
+ << std::endl;
for (size_t mboard_idx = 0; mboard_idx < num_mboards; mboard_idx++) {
- std::cout << make_border(mboard_sensors_string(usrp, mboard_idx))
- << std::endl;
+ std::cout << make_border(mboard_sensors_string(usrp, mboard_idx)) << std::endl;
}
return EXIT_SUCCESS;
diff --git a/host/examples/wavetable.hpp b/host/examples/wavetable.hpp
index 8fdc8db30..2a1d13f48 100644
--- a/host/examples/wavetable.hpp
+++ b/host/examples/wavetable.hpp
@@ -5,55 +5,51 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <string>
#include <cmath>
#include <complex>
-#include <vector>
#include <stdexcept>
+#include <string>
+#include <vector>
static const size_t wave_table_len = 8192;
-class wave_table_class{
+class wave_table_class
+{
public:
- wave_table_class(const std::string &wave_type, const float ampl):
- _wave_table(wave_table_len)
+ wave_table_class(const std::string& wave_type, const float ampl)
+ : _wave_table(wave_table_len)
{
- //compute real wave table with 1.0 amplitude
+ // compute real wave table with 1.0 amplitude
std::vector<float> real_wave_table(wave_table_len);
- if (wave_type == "CONST"){
+ if (wave_type == "CONST") {
for (size_t i = 0; i < wave_table_len; i++)
real_wave_table[i] = 1.0;
- }
- else if (wave_type == "SQUARE"){
+ } else if (wave_type == "SQUARE") {
for (size_t i = 0; i < wave_table_len; i++)
- real_wave_table[i] = (i < wave_table_len/2)? 0.0 : 1.0;
- }
- else if (wave_type == "RAMP"){
+ real_wave_table[i] = (i < wave_table_len / 2) ? 0.0 : 1.0;
+ } else if (wave_type == "RAMP") {
for (size_t i = 0; i < wave_table_len; i++)
- real_wave_table[i] = 2.0*i/(wave_table_len-1) - 1.0;
- }
- else if (wave_type == "SINE"){
- static const double tau = 2*std::acos(-1.0);
+ real_wave_table[i] = 2.0 * i / (wave_table_len - 1) - 1.0;
+ } else if (wave_type == "SINE") {
+ static const double tau = 2 * std::acos(-1.0);
for (size_t i = 0; i < wave_table_len; i++)
- real_wave_table[i] = std::sin((tau*i)/wave_table_len);
- }
- else throw std::runtime_error("unknown waveform type: " + wave_type);
+ real_wave_table[i] = std::sin((tau * i) / wave_table_len);
+ } else
+ throw std::runtime_error("unknown waveform type: " + wave_type);
- //compute i and q pairs with 90% offset and scale to amplitude
- for (size_t i = 0; i < wave_table_len; i++){
- const size_t q = (i+(3*wave_table_len)/4)%wave_table_len;
- _wave_table[i] = std::complex<float>(
- ampl*real_wave_table[i],
- ampl*real_wave_table[q]
- );
+ // compute i and q pairs with 90% offset and scale to amplitude
+ for (size_t i = 0; i < wave_table_len; i++) {
+ const size_t q = (i + (3 * wave_table_len) / 4) % wave_table_len;
+ _wave_table[i] =
+ std::complex<float>(ampl * real_wave_table[i], ampl * real_wave_table[q]);
}
}
- inline std::complex<float> operator()(const size_t index) const{
+ inline std::complex<float> operator()(const size_t index) const
+ {
return _wave_table[index % wave_table_len];
}
private:
- std::vector<std::complex<float> > _wave_table;
+ std::vector<std::complex<float>> _wave_table;
};
-
diff --git a/host/include/uhd/build_info.hpp b/host/include/uhd/build_info.hpp
index 7bac2e89e..88de3ea27 100644
--- a/host/include/uhd/build_info.hpp
+++ b/host/include/uhd/build_info.hpp
@@ -8,37 +8,36 @@
#define INCLUDED_UHD_BUILD_INFO_HPP
#include <uhd/config.hpp>
-
#include <string>
namespace uhd { namespace build_info {
- //! Return the version of Boost this build was built with.
- UHD_API const std::string boost_version();
+//! Return the version of Boost this build was built with.
+UHD_API const std::string boost_version();
- //! Return the date and time (GMT) this UHD build was built.
- UHD_API const std::string build_date();
+//! Return the date and time (GMT) this UHD build was built.
+UHD_API const std::string build_date();
- //! Return the C compiler used for this build.
- UHD_API const std::string c_compiler();
+//! Return the C compiler used for this build.
+UHD_API const std::string c_compiler();
- //! Return the C++ compiler used for this build.
- UHD_API const std::string cxx_compiler();
+//! Return the C++ compiler used for this build.
+UHD_API const std::string cxx_compiler();
- //! Return the C flags passed into this build.
- UHD_API const std::string c_flags();
+//! Return the C flags passed into this build.
+UHD_API const std::string c_flags();
- //! Return the C++ flags passed into this build.
- UHD_API const std::string cxx_flags();
+//! Return the C++ flags passed into this build.
+UHD_API const std::string cxx_flags();
- //! Return the UHD components enabled for this build, comma-delimited.
- UHD_API const std::string enabled_components();
+//! Return the UHD components enabled for this build, comma-delimited.
+UHD_API const std::string enabled_components();
- //! Return the default CMake install prefix for this build.
- UHD_API const std::string install_prefix();
+//! Return the default CMake install prefix for this build.
+UHD_API const std::string install_prefix();
- //! Return the version of libusb this build was built with.
- UHD_API const std::string libusb_version();
-}}
+//! Return the version of libusb this build was built with.
+UHD_API const std::string libusb_version();
+}} // namespace uhd::build_info
#endif /* INCLUDED_UHD_BUILD_INFO_HPP */
diff --git a/host/include/uhd/cal/container.hpp b/host/include/uhd/cal/container.hpp
index 5e6c612d8..75ce566e2 100644
--- a/host/include/uhd/cal/container.hpp
+++ b/host/include/uhd/cal/container.hpp
@@ -9,18 +9,18 @@
#define INCLUDED_UHD_CAL_CONTAINER_HPP
#include <uhd/config.hpp>
-#include <boost/serialization/serialization.hpp>
-#include <boost/serialization/vector.hpp>
-#include <boost/serialization/string.hpp>
-#include <boost/serialization/map.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
+#include <boost/serialization/map.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/string.hpp>
+#include <boost/serialization/vector.hpp>
#include <boost/shared_ptr.hpp>
-namespace uhd {
-namespace cal {
+namespace uhd { namespace cal {
-class base_container {
+class base_container
+{
public:
typedef std::map<std::string, std::string> metadata_t;
typedef boost::shared_ptr<base_container> sptr;
@@ -37,8 +37,9 @@ public:
* The container only supports inputs of the same type to be mapped.
*
*/
-template<typename in_type, typename out_type>
-class UHD_API cal_container : public base_container {
+template <typename in_type, typename out_type>
+class UHD_API cal_container : public base_container
+{
public:
typedef std::map<in_type, out_type> container_t;
@@ -51,7 +52,7 @@ public:
* \throws uhd::assertion_error if the dimensions of the input args
* are incorrect for this container
*/
- virtual out_type get(const in_type &args) = 0;
+ virtual out_type get(const in_type& args) = 0;
/*!
* Add a data point to the container.
@@ -61,21 +62,21 @@ public:
* \param output the output of the data point mapping
* \param args input values
*/
- virtual void add(const out_type output, const in_type &args) = 0;
+ virtual void add(const out_type output, const in_type& args) = 0;
/*!
* Associate some metadata with the container.
*
* \param data a map of metadata (string -> string).
*/
- virtual void add_metadata(const metadata_t &data) = 0;
+ virtual void add_metadata(const metadata_t& data) = 0;
/*!
* Retrieve metadata from the container.
*
* \returns map of metadata.
*/
- virtual const metadata_t &get_metadata() = 0;
+ virtual const metadata_t& get_metadata() = 0;
public:
typedef boost::archive::text_iarchive iarchive_type;
@@ -84,11 +85,10 @@ public:
protected:
friend class boost::serialization::access;
- virtual void serialize(iarchive_type & ar, const unsigned int) = 0;
- virtual void serialize(oarchive_type & ar, const unsigned int) = 0;
+ virtual void serialize(iarchive_type& ar, const unsigned int) = 0;
+ virtual void serialize(oarchive_type& ar, const unsigned int) = 0;
};
-} // namespace cal
-} // namespace uhd
+}} // namespace uhd::cal
#endif /* INCLUDED_UHD_CAL_CONTAINER_HPP */
diff --git a/host/include/uhd/cal/power_container.hpp b/host/include/uhd/cal/power_container.hpp
index 564a28018..052c68e6c 100644
--- a/host/include/uhd/cal/power_container.hpp
+++ b/host/include/uhd/cal/power_container.hpp
@@ -8,14 +8,14 @@
#ifndef INCLUDED_UHD_CAL_POWER_CONTAINER_HPP
#define INCLUDED_UHD_CAL_POWER_CONTAINER_HPP
-#include <uhd/config.hpp>
#include <uhd/cal/container.hpp>
+#include <uhd/config.hpp>
#include <boost/shared_ptr.hpp>
-namespace uhd {
-namespace cal {
+namespace uhd { namespace cal {
-class UHD_API power_container : public cal_container<std::vector<double>, double> {
+class UHD_API power_container : public cal_container<std::vector<double>, double>
+{
public:
typedef boost::shared_ptr<power_container> sptr;
@@ -35,7 +35,7 @@ public:
* \throws uhd::assertion_error if the number of input values are incorrect
* for the container type
*/
- virtual double get(const std::vector<double> &args) = 0;
+ virtual double get(const std::vector<double>& args) = 0;
/*!
* Add a data point to the container.
@@ -46,24 +46,23 @@ public:
* \param output the output of the data point mapping
* \param args input values
*/
- virtual void add(const double output, const std::vector<double> &args) = 0;
+ virtual void add(const double output, const std::vector<double>& args) = 0;
/*!
* Associate some metadata with the container.
*
* \param data a map of metadata (string -> string).
*/
- virtual void add_metadata(const metadata_t &data) = 0;
+ virtual void add_metadata(const metadata_t& data) = 0;
/*!
* Retrieve metadata from the container.
*
* \returns map of metadata.
*/
- virtual const metadata_t &get_metadata() = 0;
+ virtual const metadata_t& get_metadata() = 0;
};
-} // namespace cal
-} // namespace uhd
+}} // namespace uhd::cal
#endif /* INCLUDED_UHD_CAL_POWER_CONTAINER_HPP */
diff --git a/host/include/uhd/config.hpp b/host/include/uhd/config.hpp
index e7b48e5d8..dee0716f4 100644
--- a/host/include/uhd/config.hpp
+++ b/host/include/uhd/config.hpp
@@ -18,99 +18,106 @@
//# pragma warning(disable: 4512) // assignment operator can't not be generated
//# pragma warning(disable: 4100) // unreferenced formal parameter
//# pragma warning(disable: 4996) // <symbol> was declared deprecated
-# pragma warning(disable: 4355) // 'this' : used in base member initializer list
+# pragma warning(disable : 4355) // 'this' : used in base member initializer list
//# pragma warning(disable: 4706) // assignment within conditional expression
-# pragma warning(disable: 4251) // class 'A<T>' needs to have dll-interface to be used by clients of class 'B'
+# pragma warning(disable : 4251) // class 'A<T>' needs to have dll-interface to be used
+ // by clients of class 'B'
//# pragma warning(disable: 4127) // conditional expression is constant
//# pragma warning(disable: 4290) // C++ exception specification ignored except to ...
-//# pragma warning(disable: 4180) // qualifier applied to function type has no meaning; ignored
-# pragma warning(disable: 4275) // non dll-interface class ... used as base for dll-interface class ...
-//# pragma warning(disable: 4267) // 'var' : conversion from 'size_t' to 'type', possible loss of data
-//# pragma warning(disable: 4511) // 'class' : copy constructor could not be generated
-# pragma warning(disable: 4250) // 'class' : inherits 'method' via dominance
-# pragma warning(disable: 4200) // nonstandard extension used : zero-sized array in struct/union
+//# pragma warning(disable: 4180) // qualifier applied to function type has no meaning;
+// ignored
+# pragma warning(disable : 4275) // non dll-interface class ... used as base for
+ // dll-interface class ...
+//# pragma warning(disable: 4267) // 'var' : conversion from 'size_t' to 'type', possible
+// loss of data # pragma warning(disable: 4511) // 'class' : copy constructor could not be
+// generated
+# pragma warning(disable : 4250) // 'class' : inherits 'method' via dominance
+# pragma warning( \
+ disable : 4200) // nonstandard extension used : zero-sized array in struct/union
// define logical operators
-#include <ciso646>
+# include <ciso646>
// define ssize_t
-#include <cstddef>
+# include <cstddef>
typedef ptrdiff_t ssize_t;
-#endif //BOOST_MSVC
+#endif // BOOST_MSVC
-//define cross platform attribute macros
+// define cross platform attribute macros
#if defined(BOOST_MSVC)
- #define UHD_EXPORT __declspec(dllexport)
- #define UHD_IMPORT __declspec(dllimport)
- #define UHD_INLINE __forceinline
- #define UHD_FORCE_INLINE __forceinline
- #define UHD_DEPRECATED __declspec(deprecated)
- #define UHD_ALIGNED(x) __declspec(align(x))
- #define UHD_UNUSED(x) x
+# define UHD_EXPORT __declspec(dllexport)
+# define UHD_IMPORT __declspec(dllimport)
+# define UHD_INLINE __forceinline
+# define UHD_FORCE_INLINE __forceinline
+# define UHD_DEPRECATED __declspec(deprecated)
+# define UHD_ALIGNED(x) __declspec(align(x))
+# define UHD_UNUSED(x) x
#elif defined(__MINGW32__)
- #define UHD_EXPORT __declspec(dllexport)
- #define UHD_IMPORT __declspec(dllimport)
- #define UHD_INLINE inline
- #define UHD_FORCE_INLINE inline
- #define UHD_DEPRECATED __declspec(deprecated)
- #define UHD_ALIGNED(x) __declspec(align(x))
- #define UHD_UNUSED(x) x __attribute__((unused))
+# define UHD_EXPORT __declspec(dllexport)
+# define UHD_IMPORT __declspec(dllimport)
+# define UHD_INLINE inline
+# define UHD_FORCE_INLINE inline
+# define UHD_DEPRECATED __declspec(deprecated)
+# define UHD_ALIGNED(x) __declspec(align(x))
+# define UHD_UNUSED(x) x __attribute__((unused))
#elif defined(__GNUG__) && __GNUG__ >= 4
- #define UHD_EXPORT __attribute__((visibility("default")))
- #define UHD_IMPORT __attribute__((visibility("default")))
- #define UHD_INLINE inline __attribute__((always_inline))
- #define UHD_FORCE_INLINE inline __attribute__((always_inline))
- #define UHD_DEPRECATED __attribute__((deprecated))
- #define UHD_ALIGNED(x) __attribute__((aligned(x)))
- #define UHD_UNUSED(x) x __attribute__((unused))
+# define UHD_EXPORT __attribute__((visibility("default")))
+# define UHD_IMPORT __attribute__((visibility("default")))
+# define UHD_INLINE inline __attribute__((always_inline))
+# define UHD_FORCE_INLINE inline __attribute__((always_inline))
+# define UHD_DEPRECATED __attribute__((deprecated))
+# define UHD_ALIGNED(x) __attribute__((aligned(x)))
+# define UHD_UNUSED(x) x __attribute__((unused))
#elif defined(__clang__)
- #define UHD_EXPORT __attribute__((visibility("default")))
- #define UHD_IMPORT __attribute__((visibility("default")))
- #define UHD_INLINE inline __attribute__((always_inline))
- #define UHD_FORCE_INLINE inline __attribute__((always_inline))
- #define UHD_DEPRECATED __attribute__((deprecated))
- #define UHD_ALIGNED(x) __attribute__((aligned(x)))
- #define UHD_UNUSED(x) x __attribute__((unused))
+# define UHD_EXPORT __attribute__((visibility("default")))
+# define UHD_IMPORT __attribute__((visibility("default")))
+# define UHD_INLINE inline __attribute__((always_inline))
+# define UHD_FORCE_INLINE inline __attribute__((always_inline))
+# define UHD_DEPRECATED __attribute__((deprecated))
+# define UHD_ALIGNED(x) __attribute__((aligned(x)))
+# define UHD_UNUSED(x) x __attribute__((unused))
#else
- #define UHD_EXPORT
- #define UHD_IMPORT
- #define UHD_INLINE inline
- #define UHD_FORCE_INLINE inline
- #define UHD_DEPRECATED
- #define UHD_ALIGNED(x)
- #define UHD_UNUSED(x) x
+# define UHD_EXPORT
+# define UHD_IMPORT
+# define UHD_INLINE inline
+# define UHD_FORCE_INLINE inline
+# define UHD_DEPRECATED
+# define UHD_ALIGNED(x)
+# define UHD_UNUSED(x) x
#endif
// Define API declaration macro
#ifdef UHD_STATIC_LIB
- #define UHD_API
+# define UHD_API
#else
- #ifdef UHD_DLL_EXPORTS
- #define UHD_API UHD_EXPORT
- #else
- #define UHD_API UHD_IMPORT
- #endif // UHD_DLL_EXPORTS
+# ifdef UHD_DLL_EXPORTS
+# define UHD_API UHD_EXPORT
+# else
+# define UHD_API UHD_IMPORT
+# endif // UHD_DLL_EXPORTS
#endif // UHD_STATIC_LIB
#ifdef UHD_RFNOC_ENABLED
- #define UHD_RFNOC_API UHD_API
+# define UHD_RFNOC_API UHD_API
#else
- #define UHD_RFNOC_API
+# define UHD_RFNOC_API
#endif // UHD_RFNOC_ENABLED
// Platform defines for conditional parts of headers:
// Taken from boost/config/select_platform_config.hpp,
// however, we define macros, not strings for platforms.
-#if (defined(linux) || defined(__linux) || defined(__linux__) || defined(__GLIBC__)) && !defined(_CRAYC) && !defined(__FreeBSD_kernel__) && !defined(__GNU__)
- #define UHD_PLATFORM_LINUX
+#if (defined(linux) || defined(__linux) || defined(__linux__) || defined(__GLIBC__)) \
+ && !defined(_CRAYC) && !defined(__FreeBSD_kernel__) && !defined(__GNU__)
+# define UHD_PLATFORM_LINUX
#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
- #define UHD_PLATFORM_WIN32
+# define UHD_PLATFORM_WIN32
#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
- #define UHD_PLATFORM_MACOS
-#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD_kernel__)
- #define UHD_PLATFORM_BSD
+# define UHD_PLATFORM_MACOS
+#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) \
+ || defined(__FreeBSD_kernel__)
+# define UHD_PLATFORM_BSD
#endif
// Define 'stringize' preprocessor macros. The stringize macro, XSTR, takes
@@ -118,9 +125,9 @@ typedef ptrdiff_t ssize_t;
// There are two different versions because MSVC handles this syntax a bit
// differently than other compilers.
#if defined(BOOST_MSVC)
- #define XSTR(x,...) #x
+# define XSTR(x, ...) # x
#else
- #define XSTR(x...) #x
+# define XSTR(x...) # x
#endif
#define STR(x) XSTR(x)
diff --git a/host/include/uhd/convert.hpp b/host/include/uhd/convert.hpp
index 64cebe945..3af7cc47b 100644
--- a/host/include/uhd/convert.hpp
+++ b/host/include/uhd/convert.hpp
@@ -10,99 +10,96 @@
#include <uhd/config.hpp>
#include <uhd/types/ref_vector.hpp>
-#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <boost/operators.hpp>
+#include <boost/shared_ptr.hpp>
#include <string>
-namespace uhd{ namespace convert{
-
- //! A conversion class that implements a conversion from inputs -> outputs.
- class converter{
- public:
- typedef boost::shared_ptr<converter> sptr;
- typedef uhd::ref_vector<void *> output_type;
- typedef uhd::ref_vector<const void *> input_type;
-
- virtual ~converter(void) = 0;
-
- //! Set the scale factor (used in floating point conversions)
- virtual void set_scalar(const double) = 0;
-
- //! The public conversion method to convert inputs -> outputs
- UHD_INLINE void conv(const input_type &in, const output_type &out, const size_t num){
- if (num != 0) (*this)(in, out, num);
- }
-
- private:
- //! Callable method: input vectors, output vectors, num samples
- //
- // This is the guts of the converter. When deriving new converter types,
- // this is where the actual conversion routines go.
- //
- // \param in Pointers to the input buffers
- // \param out Pointers to the output buffers
- // \param num Number of items in the input buffers to convert
- virtual void operator()(const input_type& in, const output_type& out, const size_t num) = 0;
- };
-
- //! Conversion factory function typedef
- typedef boost::function<converter::sptr(void)> function_type;
-
- //! Priority of conversion routines
- typedef int priority_type;
-
- //! Identify a conversion routine in the registry
- struct UHD_API id_type : boost::equality_comparable<id_type>{
- std::string input_format;
- size_t num_inputs;
- std::string output_format;
- size_t num_outputs;
- std::string to_pp_string(void) const;
- std::string to_string(void) const;
- };
-
- //! Implement equality_comparable interface
- UHD_API bool operator==(const id_type &, const id_type &);
-
- /*!
- * Register a converter function.
- *
- * Converters with higher priority are given preference.
- *
- * \param id identify the conversion
- * \param fcn makes a new converter
- * \param prio the function priority
- */
- UHD_API void register_converter(
- const id_type &id,
- const function_type &fcn,
- const priority_type prio
- );
-
- /*!
- * Get a converter factory function.
- * \param id identify the conversion
- * \param prio the desired prio or -1 for best
- * \return the converter factory function
- */
- UHD_API function_type get_converter(
- const id_type &id,
- const priority_type prio = -1
- );
-
- /*!
- * Register the size of a particular item.
- * \param format the item format
- * \param size the size in bytes
- */
- UHD_API void register_bytes_per_item(
- const std::string &format, const size_t size
- );
-
- //! Convert an item format to a size in bytes
- UHD_API size_t get_bytes_per_item(const std::string &format);
-
-}} //namespace
+namespace uhd { namespace convert {
+
+//! A conversion class that implements a conversion from inputs -> outputs.
+class converter
+{
+public:
+ typedef boost::shared_ptr<converter> sptr;
+ typedef uhd::ref_vector<void*> output_type;
+ typedef uhd::ref_vector<const void*> input_type;
+
+ virtual ~converter(void) = 0;
+
+ //! Set the scale factor (used in floating point conversions)
+ virtual void set_scalar(const double) = 0;
+
+ //! The public conversion method to convert inputs -> outputs
+ UHD_INLINE void conv(const input_type& in, const output_type& out, const size_t num)
+ {
+ if (num != 0)
+ (*this)(in, out, num);
+ }
+
+private:
+ //! Callable method: input vectors, output vectors, num samples
+ //
+ // This is the guts of the converter. When deriving new converter types,
+ // this is where the actual conversion routines go.
+ //
+ // \param in Pointers to the input buffers
+ // \param out Pointers to the output buffers
+ // \param num Number of items in the input buffers to convert
+ virtual void operator()(
+ const input_type& in, const output_type& out, const size_t num) = 0;
+};
+
+//! Conversion factory function typedef
+typedef boost::function<converter::sptr(void)> function_type;
+
+//! Priority of conversion routines
+typedef int priority_type;
+
+//! Identify a conversion routine in the registry
+struct UHD_API id_type : boost::equality_comparable<id_type>
+{
+ std::string input_format;
+ size_t num_inputs;
+ std::string output_format;
+ size_t num_outputs;
+ std::string to_pp_string(void) const;
+ std::string to_string(void) const;
+};
+
+//! Implement equality_comparable interface
+UHD_API bool operator==(const id_type&, const id_type&);
+
+/*!
+ * Register a converter function.
+ *
+ * Converters with higher priority are given preference.
+ *
+ * \param id identify the conversion
+ * \param fcn makes a new converter
+ * \param prio the function priority
+ */
+UHD_API void register_converter(
+ const id_type& id, const function_type& fcn, const priority_type prio);
+
+/*!
+ * Get a converter factory function.
+ * \param id identify the conversion
+ * \param prio the desired prio or -1 for best
+ * \return the converter factory function
+ */
+UHD_API function_type get_converter(const id_type& id, const priority_type prio = -1);
+
+/*!
+ * Register the size of a particular item.
+ * \param format the item format
+ * \param size the size in bytes
+ */
+UHD_API void register_bytes_per_item(const std::string& format, const size_t size);
+
+//! Convert an item format to a size in bytes
+UHD_API size_t get_bytes_per_item(const std::string& format);
+
+}} // namespace uhd::convert
#endif /* INCLUDED_UHD_CONVERT_HPP */
diff --git a/host/include/uhd/deprecated.hpp b/host/include/uhd/deprecated.hpp
index 91635f8ca..0eeefecee 100644
--- a/host/include/uhd/deprecated.hpp
+++ b/host/include/uhd/deprecated.hpp
@@ -10,58 +10,58 @@
//
#ifndef INCLUDED_UHD_TYPES_OTW_TYPE_HPP
-#define INCLUDED_UHD_TYPES_OTW_TYPE_HPP
+# define INCLUDED_UHD_TYPES_OTW_TYPE_HPP
-#include <uhd/config.hpp>
-#include <cstddef>
+# include <uhd/config.hpp>
+# include <cstddef>
-namespace uhd{
+namespace uhd {
+/*!
+ * Description for over-the-wire integers:
+ * The DSP units in the FPGA deal with signed 16-bit integers.
+ * The width and shift define the translation between OTW and DSP,
+ * defined by the following relation: otw_int = dsp_int >> shift
+ *
+ * Note: possible combinations of width, shift, and byteorder
+ * depend on the internals of the FPGA. Not all are supported!
+ */
+struct UHD_API otw_type_t
+{
/*!
- * Description for over-the-wire integers:
- * The DSP units in the FPGA deal with signed 16-bit integers.
- * The width and shift define the translation between OTW and DSP,
- * defined by the following relation: otw_int = dsp_int >> shift
- *
- * Note: possible combinations of width, shift, and byteorder
- * depend on the internals of the FPGA. Not all are supported!
+ * Width of an over-the-wire integer in bits.
*/
- struct UHD_API otw_type_t{
+ size_t width; // in bits
- /*!
- * Width of an over-the-wire integer in bits.
- */
- size_t width; //in bits
-
- /*!
- * Shift of an over-the-wire integer in bits.
- * otw_int = dsp_int >> shift
- * dsp_int = otw_int << shift
- */
- size_t shift; //in bits
+ /*!
+ * Shift of an over-the-wire integer in bits.
+ * otw_int = dsp_int >> shift
+ * dsp_int = otw_int << shift
+ */
+ size_t shift; // in bits
- /*!
- * Constants for byte order (borrowed from numpy's dtype)
- */
- enum /*bo_t*/ {
- BO_NATIVE = int('='),
- BO_LITTLE_ENDIAN = int('<'),
- BO_BIG_ENDIAN = int('>'),
- BO_NOT_APPLICABLE = int('|')
- } byteorder;
+ /*!
+ * Constants for byte order (borrowed from numpy's dtype)
+ */
+ enum /*bo_t*/ {
+ BO_NATIVE = int('='),
+ BO_LITTLE_ENDIAN = int('<'),
+ BO_BIG_ENDIAN = int('>'),
+ BO_NOT_APPLICABLE = int('|')
+ } byteorder;
- /*!
- * Get the sample size of this otw type.
- * \return the size of a sample in bytes
- */
- size_t get_sample_size(void) const;
+ /*!
+ * Get the sample size of this otw type.
+ * \return the size of a sample in bytes
+ */
+ size_t get_sample_size(void) const;
- otw_type_t(void);
- };
+ otw_type_t(void);
+};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_OTW_TYPE_HPP */
-#include <uhd/types/io_type.hpp> //wish it was in here
#include <uhd/types/clock_config.hpp> //wish it was in here
+#include <uhd/types/io_type.hpp> //wish it was in here
diff --git a/host/include/uhd/device.hpp b/host/include/uhd/device.hpp
index e0f8e3b60..9aecdc088 100644
--- a/host/include/uhd/device.hpp
+++ b/host/include/uhd/device.hpp
@@ -9,35 +9,31 @@
#define INCLUDED_UHD_DEVICE_HPP
#include <uhd/config.hpp>
-#include <uhd/stream.hpp>
#include <uhd/deprecated.hpp>
#include <uhd/property_tree.hpp>
+#include <uhd/stream.hpp>
#include <uhd/types/device_addr.hpp>
-#include <boost/utility.hpp>
-#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
-namespace uhd{
+namespace uhd {
-class property_tree; //forward declaration
+class property_tree; // forward declaration
/*!
* The device interface represents the hardware.
* The API allows for discovery, configuration, and streaming.
*/
-class UHD_API device : boost::noncopyable{
-
+class UHD_API device : boost::noncopyable
+{
public:
typedef boost::shared_ptr<device> sptr;
- typedef boost::function<device_addrs_t(const device_addr_t &)> find_t;
- typedef boost::function<sptr(const device_addr_t &)> make_t;
+ typedef boost::function<device_addrs_t(const device_addr_t&)> find_t;
+ typedef boost::function<sptr(const device_addr_t&)> make_t;
//! Device type, used as a filter in make
- enum device_filter_t {
- ANY,
- USRP,
- CLOCK
- };
+ enum device_filter_t { ANY, USRP, CLOCK };
virtual ~device(void) = 0;
/*!
@@ -48,10 +44,7 @@ public:
* \param filter include only USRP devices, clock devices, or both
*/
static void register_device(
- const find_t &find,
- const make_t &make,
- const device_filter_t filter
- );
+ const find_t& find, const make_t& make, const device_filter_t filter);
/*!
* \brief Find devices attached to the host.
@@ -63,7 +56,7 @@ public:
* \param filter an optional filter to exclude USRP or clock devices
* \return a vector of device addresses for all devices on the system
*/
- static device_addrs_t find(const device_addr_t &hint, device_filter_t filter = ANY);
+ static device_addrs_t find(const device_addr_t& hint, device_filter_t filter = ANY);
/*!
* \brief Create a new device from the device address hint.
@@ -79,21 +72,22 @@ public:
* \param which which address to use when multiple are found
* \return a shared pointer to a new device instance
*/
- static sptr make(const device_addr_t &hint, device_filter_t filter = ANY, size_t which = 0);
+ static sptr make(
+ const device_addr_t& hint, device_filter_t filter = ANY, size_t which = 0);
/*! \brief Make a new receive streamer from the streamer arguments
*
* Note: There can always only be one streamer. When calling get_rx_stream()
* a second time, the first streamer must be destroyed beforehand.
*/
- virtual rx_streamer::sptr get_rx_stream(const stream_args_t &args) = 0;
+ virtual rx_streamer::sptr get_rx_stream(const stream_args_t& args) = 0;
/*! \brief Make a new transmit streamer from the streamer arguments
*
* Note: There can always only be one streamer. When calling get_tx_stream()
* a second time, the first streamer must be destroyed beforehand.
*/
- virtual tx_streamer::sptr get_tx_stream(const stream_args_t &args) = 0;
+ virtual tx_streamer::sptr get_tx_stream(const stream_args_t& args) = 0;
/*!
* Receive and asynchronous message from the device.
@@ -102,8 +96,7 @@ public:
* \return true when the async_metadata is valid, false for timeout
*/
virtual bool recv_async_msg(
- async_metadata_t &async_metadata, double timeout = 0.1
- ) = 0;
+ async_metadata_t& async_metadata, double timeout = 0.1) = 0;
//! Get access to the underlying property structure
uhd::property_tree::sptr get_tree(void) const;
@@ -116,6 +109,6 @@ protected:
device_filter_t _type;
};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_DEVICE_HPP */
diff --git a/host/include/uhd/device3.hpp b/host/include/uhd/device3.hpp
index af304d37d..8dca2bc47 100644
--- a/host/include/uhd/device3.hpp
+++ b/host/include/uhd/device3.hpp
@@ -9,10 +9,10 @@
#define INCLUDED_UHD_DEVICE3_HPP
#include <uhd/device.hpp>
-#include <uhd/rfnoc/graph.hpp>
#include <uhd/rfnoc/block_ctrl_base.hpp>
-#include <boost/units/detail/utility.hpp>
+#include <uhd/rfnoc/graph.hpp>
#include <boost/thread/mutex.hpp>
+#include <boost/units/detail/utility.hpp>
#include <vector>
namespace uhd {
@@ -24,15 +24,15 @@ namespace uhd {
* - They support RFNoC (RF Network-on-Chip).
* - Data transport uses the compressed VITA (CVITA/CHDR) data format.
*/
-class UHD_API device3 : public uhd::device {
-
- public:
+class UHD_API device3 : public uhd::device
+{
+public:
typedef boost::shared_ptr<device3> sptr;
//! Same as uhd::device::make(), but will fail if not actually a device3
- static sptr make(const device_addr_t &hint, const size_t which = 0);
+ static sptr make(const device_addr_t& hint, const size_t which = 0);
- virtual rfnoc::graph::sptr create_graph(const std::string &name="") = 0;
+ virtual rfnoc::graph::sptr create_graph(const std::string& name = "") = 0;
/*! Reset blocks after a stream.
*
@@ -46,15 +46,14 @@ class UHD_API device3 : public uhd::device {
* \return true if a block with the specified id exists
* \note this access is not thread safe if peformed during block enumeration
*/
- bool has_block(const rfnoc::block_id_t &block_id) const;
+ bool has_block(const rfnoc::block_id_t& block_id) const;
/*! Same as has_block(), but with a type check.
*
* \return true if a block of type T with the specified id exists
* \note this access is not thread safe if peformed during block enumeration
*/
- template <typename T>
- bool has_block(const rfnoc::block_id_t &block_id) const
+ template <typename T> bool has_block(const rfnoc::block_id_t& block_id) const
{
if (has_block(block_id)) {
return bool(boost::dynamic_pointer_cast<T>(get_block_ctrl(block_id)));
@@ -71,7 +70,7 @@ class UHD_API device3 : public uhd::device {
* \param block_id Canonical block name (e.g. "0/FFT_1").
* \note this access is not thread safe if peformed during block enumeration
*/
- rfnoc::block_ctrl_base::sptr get_block_ctrl(const rfnoc::block_id_t &block_id) const;
+ rfnoc::block_ctrl_base::sptr get_block_ctrl(const rfnoc::block_id_t& block_id) const;
/*! Same as get_block_ctrl(), but with a type cast.
*
@@ -82,19 +81,22 @@ class UHD_API device3 : public uhd::device {
*
* \code{.cpp}
* // Assume DEV is a device3::sptr
- * uhd::rfnoc::my_block_ctrl::sptr block_controller = get_block_ctrl<my_block_ctrl>("0/MyBlock_0");
+ * uhd::rfnoc::my_block_ctrl::sptr block_controller =
+ * get_block_ctrl<my_block_ctrl>("0/MyBlock_0");
* block_controller->my_own_block_method();
* \endcode
* \note this access is not thread safe if peformed during block enumeration
*/
template <typename T>
- boost::shared_ptr<T> get_block_ctrl(const rfnoc::block_id_t &block_id) const
+ boost::shared_ptr<T> get_block_ctrl(const rfnoc::block_id_t& block_id) const
{
- boost::shared_ptr<T> blk = boost::dynamic_pointer_cast<T>(get_block_ctrl(block_id));
+ boost::shared_ptr<T> blk =
+ boost::dynamic_pointer_cast<T>(get_block_ctrl(block_id));
if (blk) {
return blk;
} else {
- throw uhd::lookup_error(str(boost::format("This device does not have a block of type %s with ID: %s")
+ throw uhd::lookup_error(str(
+ boost::format("This device does not have a block of type %s with ID: %s")
% boost::units::detail::demangle(typeid(T).name())
% block_id.to_string()));
}
@@ -108,16 +110,16 @@ class UHD_API device3 : public uhd::device {
* use the templated version of this function, e.g.
* \code{.cpp}
* // Assume DEV is a device3::sptr
- * null_block_ctrl::sptr null_block = DEV->find_blocks<null_block_ctrl>("NullSrcSink");
- * \endcode
- * \note this access is not thread safe if peformed during block enumeration
+ * null_block_ctrl::sptr null_block =
+ * DEV->find_blocks<null_block_ctrl>("NullSrcSink"); \endcode \note this access is not
+ * thread safe if peformed during block enumeration
*/
- std::vector<rfnoc::block_id_t> find_blocks(const std::string &block_id_hint) const;
+ std::vector<rfnoc::block_id_t> find_blocks(const std::string& block_id_hint) const;
/*! Type-cast version of find_blocks().
*/
template <typename T>
- std::vector<rfnoc::block_id_t> find_blocks(const std::string &block_id_hint) const
+ std::vector<rfnoc::block_id_t> find_blocks(const std::string& block_id_hint) const
{
std::vector<rfnoc::block_id_t> all_block_ids = find_blocks(block_id_hint);
std::vector<rfnoc::block_id_t> filt_block_ids;
@@ -129,15 +131,15 @@ class UHD_API device3 : public uhd::device {
return filt_block_ids;
}
- protected:
+protected:
//! List of *all* RFNoC blocks available on this device.
// It is the responsibility of the deriving class to make
// sure this gets correctly populated.
- std::vector< rfnoc::block_ctrl_base::sptr > _rfnoc_block_ctrl;
+ std::vector<rfnoc::block_ctrl_base::sptr> _rfnoc_block_ctrl;
//! Mutex to protect access to members
- boost::mutex _block_ctrl_mutex;
+ boost::mutex _block_ctrl_mutex;
};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_DEVICE3_HPP */
diff --git a/host/include/uhd/exception.hpp b/host/include/uhd/exception.hpp
index 727c09697..7189015a0 100644
--- a/host/include/uhd/exception.hpp
+++ b/host/include/uhd/exception.hpp
@@ -30,200 +30,220 @@
*
* http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2106.html
*/
-namespace uhd{
-
- /*! Base class of all UHD-specific exceptions.
- */
- struct UHD_API exception : std::runtime_error{
- exception(const std::string &what);
- virtual unsigned code(void) const = 0;
- virtual exception *dynamic_clone(void) const = 0;
- virtual void dynamic_throw(void) const = 0;
- };
-
- /*! Raised when an assert statement fails.
- *
- * This includes our own assertion macros, such as UHD_ASSERT_THROW().
- */
- struct UHD_API assertion_error : exception{
- assertion_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual assertion_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*! The base class for exceptions that are raised when a key or index is
- * invalid.
- */
- struct UHD_API lookup_error : exception{
- lookup_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual lookup_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*! Raised when a sequence index is out of range.
- */
- struct UHD_API index_error : lookup_error{
- index_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual index_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*! Raised when a dictionary-like object is trying to be indexed by an
- * invalid key.
- *
- * This includes the property tree.
- */
- struct UHD_API key_error : lookup_error{
- key_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual key_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*! Raised when an operation or function is executed with a value of
- * incorrect type.
- *
- * This might occur when values are being passed around as strings, but the
- * underlying code will need convert to a native type.
- */
- struct UHD_API type_error : exception{
- type_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual type_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*! Raised when an operation or function receives an argument that has the
- * right type but an inappropriate or invalid value, and no other exception
- * is more specific.
- */
- struct UHD_API value_error : exception{
- value_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual value_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*! Raised when a value is inappropriate because it can't be narrowed as
- * required.
- *
- * Mostly raised by uhd::narrow()
- */
- struct UHD_API narrowing_error : value_error{
- narrowing_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual narrowing_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*! Raised when an error is detected that doesn't fall into any of the
- * categories.
- */
- struct UHD_API runtime_error : exception{
- runtime_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual runtime_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*! Raised when an error occurs during a USB transaction.
- */
- struct UHD_API usb_error : runtime_error{
- int _code;
- usb_error(int code, const std::string &what);
- virtual unsigned code(void) const { return _code; };
- virtual usb_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*! Raised when a function is stubbed out but doesn't actually do anything
- * useful.
- */
- struct UHD_API not_implemented_error : runtime_error{
- not_implemented_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual not_implemented_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
+namespace uhd {
- /*! Base class for errors that occur outside of UHD.
- */
- struct UHD_API environment_error : exception{
- environment_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual environment_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*! Raised when an I/O operation fails for an I/O-related reason.
- */
- struct UHD_API io_error : environment_error{
- io_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual io_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*! Raised when a function returns a system-related error.
- */
- struct UHD_API os_error : environment_error{
- os_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual os_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
+/*! Base class of all UHD-specific exceptions.
+ */
+struct UHD_API exception : std::runtime_error
+{
+ exception(const std::string& what);
+ virtual unsigned code(void) const = 0;
+ virtual exception* dynamic_clone(void) const = 0;
+ virtual void dynamic_throw(void) const = 0;
+};
+
+/*! Raised when an assert statement fails.
+ *
+ * This includes our own assertion macros, such as UHD_ASSERT_THROW().
+ */
+struct UHD_API assertion_error : exception
+{
+ assertion_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual assertion_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! The base class for exceptions that are raised when a key or index is
+ * invalid.
+ */
+struct UHD_API lookup_error : exception
+{
+ lookup_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual lookup_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Raised when a sequence index is out of range.
+ */
+struct UHD_API index_error : lookup_error
+{
+ index_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual index_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Raised when a dictionary-like object is trying to be indexed by an
+ * invalid key.
+ *
+ * This includes the property tree.
+ */
+struct UHD_API key_error : lookup_error
+{
+ key_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual key_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Raised when an operation or function is executed with a value of
+ * incorrect type.
+ *
+ * This might occur when values are being passed around as strings, but the
+ * underlying code will need convert to a native type.
+ */
+struct UHD_API type_error : exception
+{
+ type_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual type_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Raised when an operation or function receives an argument that has the
+ * right type but an inappropriate or invalid value, and no other exception
+ * is more specific.
+ */
+struct UHD_API value_error : exception
+{
+ value_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual value_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Raised when a value is inappropriate because it can't be narrowed as
+ * required.
+ *
+ * Mostly raised by uhd::narrow()
+ */
+struct UHD_API narrowing_error : value_error
+{
+ narrowing_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual narrowing_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Raised when an error is detected that doesn't fall into any of the
+ * categories.
+ */
+struct UHD_API runtime_error : exception
+{
+ runtime_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual runtime_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Raised when an error occurs during a USB transaction.
+ */
+struct UHD_API usb_error : runtime_error
+{
+ int _code;
+ usb_error(int code, const std::string& what);
+ virtual unsigned code(void) const
+ {
+ return _code;
+ };
+ virtual usb_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Raised when a function is stubbed out but doesn't actually do anything
+ * useful.
+ */
+struct UHD_API not_implemented_error : runtime_error
+{
+ not_implemented_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual not_implemented_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Base class for errors that occur outside of UHD.
+ */
+struct UHD_API environment_error : exception
+{
+ environment_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual environment_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Raised when an I/O operation fails for an I/O-related reason.
+ */
+struct UHD_API io_error : environment_error
+{
+ io_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual io_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Raised when a function returns a system-related error.
+ */
+struct UHD_API os_error : environment_error
+{
+ os_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual os_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! \deprecated
+ */
+struct UHD_API system_error : exception
+{
+ system_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual system_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*! Raised when a parser encounters a syntax error.
+ *
+ * Within UHD, this is limited to Noc-Script execution.
+ */
+struct UHD_API syntax_error : exception
+{
+ syntax_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual syntax_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
- /*! \deprecated
- */
- struct UHD_API system_error : exception{
- system_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual system_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
+/*!
+ * Create a formatted string with throw-site information.
+ * Fills in the function name, file name, and line number.
+ * \param what the std::exception message
+ * \return the formatted exception message
+ */
+#define UHD_THROW_SITE_INFO(what) \
+ std::string(std::string(what) + "\n" + " in " + std::string(BOOST_CURRENT_FUNCTION) \
+ + "\n" + " at " + std::string(__FILE__) + ":" \
+ + BOOST_STRINGIZE(__LINE__) + "\n")
- /*! Raised when a parser encounters a syntax error.
- *
- * Within UHD, this is limited to Noc-Script execution.
- */
- struct UHD_API syntax_error : exception{
- syntax_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual syntax_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
+/*!
+ * Throws an invalid code path exception with throw-site information.
+ * Use this macro in places that code execution is not supposed to go.
+ */
+#define UHD_THROW_INVALID_CODE_PATH() \
+ throw uhd::system_error(UHD_THROW_SITE_INFO("invalid code path"))
- /*!
- * Create a formatted string with throw-site information.
- * Fills in the function name, file name, and line number.
- * \param what the std::exception message
- * \return the formatted exception message
- */
- #define UHD_THROW_SITE_INFO(what) std::string( \
- std::string(what) + "\n" + \
- " in " + std::string(BOOST_CURRENT_FUNCTION) + "\n" + \
- " at " + std::string(__FILE__) + ":" + BOOST_STRINGIZE(__LINE__) + "\n" \
- )
-
- /*!
- * Throws an invalid code path exception with throw-site information.
- * Use this macro in places that code execution is not supposed to go.
- */
- #define UHD_THROW_INVALID_CODE_PATH() \
- throw uhd::system_error(UHD_THROW_SITE_INFO("invalid code path"))
-
- /*!
- * Assert the result of the code evaluation.
- * If the code evaluates to false, throw an assertion error.
- * \param code the code that resolved to a boolean
- */
- #define UHD_ASSERT_THROW(code) {if (not (code)) \
- throw uhd::assertion_error(UHD_THROW_SITE_INFO(#code)); \
+/*!
+ * Assert the result of the code evaluation.
+ * If the code evaluates to false, throw an assertion error.
+ * \param code the code that resolved to a boolean
+ */
+#define UHD_ASSERT_THROW(code) \
+ { \
+ if (not(code)) \
+ throw uhd::assertion_error(UHD_THROW_SITE_INFO(#code)); \
}
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_EXCEPTION_HPP */
diff --git a/host/include/uhd/image_loader.hpp b/host/include/uhd/image_loader.hpp
index 6556bbdd8..3b4b9133e 100644
--- a/host/include/uhd/image_loader.hpp
+++ b/host/include/uhd/image_loader.hpp
@@ -8,21 +8,19 @@
#ifndef INCLUDED_UHD_IMAGE_LOADER_HPP
#define INCLUDED_UHD_IMAGE_LOADER_HPP
-#include <string>
-
-#include <boost/function.hpp>
-#include <boost/noncopyable.hpp>
-
#include <uhd/config.hpp>
#include <uhd/types/device_addr.hpp>
+#include <boost/function.hpp>
+#include <boost/noncopyable.hpp>
+#include <string>
-namespace uhd{
-
-class UHD_API image_loader : boost::noncopyable{
+namespace uhd {
+class UHD_API image_loader : boost::noncopyable
+{
public:
-
- typedef struct{
+ typedef struct
+ {
uhd::device_addr_t args;
bool load_firmware;
bool load_fpga;
@@ -48,7 +46,7 @@ public:
* device and expect the default image(s) to be loaded, but the specific
* model of the device cannot be determined beyond a category.
*/
- typedef boost::function<bool(const image_loader_args_t &)> loader_fcn_t;
+ typedef boost::function<bool(const image_loader_args_t&)> loader_fcn_t;
//! Register an image loader
/*!
@@ -56,17 +54,15 @@ public:
* \param loader_fcn the loader function for the given device
* \param recovery_instructions instructions on how to restore a device
*/
- static void register_image_loader(
- const std::string &device_type,
- const loader_fcn_t &loader_fcn,
- const std::string &recovery_instructions
- );
+ static void register_image_loader(const std::string& device_type,
+ const loader_fcn_t& loader_fcn,
+ const std::string& recovery_instructions);
//! Load firmware and/or FPGA onto a device
/*!
* \param image_loader_args arguments to pass into image loading function
*/
- static bool load(const image_loader_args_t &image_loader_args);
+ static bool load(const image_loader_args_t& image_loader_args);
//! Get the instructions on how to recovery a particular device
/*!
@@ -75,9 +71,9 @@ public:
* \param device_type the "type=foo" value given in an --args option
* \return recovery instructions
*/
- static std::string get_recovery_instructions(const std::string &device_type);
+ static std::string get_recovery_instructions(const std::string& device_type);
};
-}
+} // namespace uhd
#endif /* INCLUDED_UHD_IMAGE_LOADER_HPP */
diff --git a/host/include/uhd/property_tree.hpp b/host/include/uhd/property_tree.hpp
index 84466e62a..173398986 100644
--- a/host/include/uhd/property_tree.hpp
+++ b/host/include/uhd/property_tree.hpp
@@ -9,12 +9,12 @@
#define INCLUDED_UHD_PROPERTY_TREE_HPP
#include <uhd/config.hpp>
-#include <boost/utility.hpp>
-#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
#include <vector>
-namespace uhd{
+namespace uhd {
/*!
* A templated property interface for holding the state
@@ -63,11 +63,12 @@ namespace uhd{
* - T must have a copy constructor
* - T must have an assignment operator
*/
-template <typename T> class property : boost::noncopyable{
+template <typename T> class property : boost::noncopyable
+{
public:
- typedef boost::function<void(const T &)> subscriber_type;
+ typedef boost::function<void(const T&)> subscriber_type;
typedef boost::function<T(void)> publisher_type;
- typedef boost::function<T(const T &)> coercer_type;
+ typedef boost::function<T(const T&)> coercer_type;
virtual ~property<T>(void) = 0;
@@ -81,7 +82,7 @@ public:
* \return a reference to this property for chaining
* \throws uhd::assertion_error if called more than once
*/
- virtual property<T> &set_coercer(const coercer_type &coercer) = 0;
+ virtual property<T>& set_coercer(const coercer_type& coercer) = 0;
/*!
* Register a publisher into the property.
@@ -93,7 +94,7 @@ public:
* \return a reference to this property for chaining
* \throws uhd::assertion_error if called more than once
*/
- virtual property<T> &set_publisher(const publisher_type &publisher) = 0;
+ virtual property<T>& set_publisher(const publisher_type& publisher) = 0;
/*!
* Register a subscriber into the property.
@@ -104,7 +105,7 @@ public:
* \param subscriber the subscriber callback function
* \return a reference to this property for chaining
*/
- virtual property<T> &add_desired_subscriber(const subscriber_type &subscriber) = 0;
+ virtual property<T>& add_desired_subscriber(const subscriber_type& subscriber) = 0;
/*!
* Register a subscriber into the property.
@@ -115,7 +116,7 @@ public:
* \param subscriber the subscriber callback function
* \return a reference to this property for chaining
*/
- virtual property<T> &add_coerced_subscriber(const subscriber_type &subscriber) = 0;
+ virtual property<T>& add_coerced_subscriber(const subscriber_type& subscriber) = 0;
/*!
* Update calls all subscribers w/ the current value.
@@ -123,7 +124,7 @@ public:
* \return a reference to this property for chaining
* \throws uhd::assertion_error
*/
- virtual property<T> &update(void) = 0;
+ virtual property<T>& update(void) = 0;
/*!
* Set the new value and call all the necessary subscribers.
@@ -137,7 +138,7 @@ public:
* \return a reference to this property for chaining
* \throws uhd::assertion_error
*/
- virtual property<T> &set(const T &value) = 0;
+ virtual property<T>& set(const T& value) = 0;
/*!
* Set a coerced value and call all subscribers.
@@ -150,7 +151,7 @@ public:
* \return a reference to this property for chaining
* \throws uhd::assertion_error
*/
- virtual property<T> &set_coerced(const T &value) = 0;
+ virtual property<T>& set_coerced(const T& value) = 0;
/*!
* Get the current value of this property.
@@ -179,8 +180,8 @@ public:
virtual bool empty(void) const = 0;
};
-template <typename T>
-property<T>::~property(void){
+template <typename T> property<T>::~property(void)
+{
/* NOP */
}
@@ -191,21 +192,23 @@ property<T>::~property(void){
* Notice: we do not declare UHD_API on the whole structure
* because MSVC will do weird things with std::string and linking.
*/
-struct fs_path : std::string{
+struct fs_path : std::string
+{
UHD_API fs_path(void);
- UHD_API fs_path(const char *);
- UHD_API fs_path(const std::string &);
+ UHD_API fs_path(const char*);
+ UHD_API fs_path(const std::string&);
UHD_API std::string leaf(void) const;
UHD_API fs_path branch_path(void) const;
};
-UHD_API fs_path operator/(const fs_path &, const fs_path &);
-UHD_API fs_path operator/(const fs_path &, size_t);
+UHD_API fs_path operator/(const fs_path&, const fs_path&);
+UHD_API fs_path operator/(const fs_path&, size_t);
/*!
* The property tree provides a file system structure for accessing properties.
*/
-class UHD_API property_tree : boost::noncopyable{
+class UHD_API property_tree : boost::noncopyable
+{
public:
typedef boost::shared_ptr<property_tree> sptr;
@@ -217,35 +220,33 @@ public:
static sptr make(void);
//! Get a subtree with a new root starting at path
- virtual sptr subtree(const fs_path &path) const = 0;
+ virtual sptr subtree(const fs_path& path) const = 0;
//! Remove a property or directory (recursive)
- virtual void remove(const fs_path &path) = 0;
+ virtual void remove(const fs_path& path) = 0;
//! True if the path exists in the tree
- virtual bool exists(const fs_path &path) const = 0;
+ virtual bool exists(const fs_path& path) const = 0;
//! Get an iterable to all things in the given path
- virtual std::vector<std::string> list(const fs_path &path) const = 0;
+ virtual std::vector<std::string> list(const fs_path& path) const = 0;
//! Create a new property entry in the tree
- template <typename T> property<T> &create(
- const fs_path &path,
- coerce_mode_t coerce_mode = AUTO_COERCE);
+ template <typename T>
+ property<T>& create(const fs_path& path, coerce_mode_t coerce_mode = AUTO_COERCE);
//! Get access to a property in the tree
- template <typename T> property<T> &access(const fs_path &path);
+ template <typename T> property<T>& access(const fs_path& path);
private:
//! Internal create property with wild-card type
- virtual void _create(const fs_path &path, const boost::shared_ptr<void> &prop) = 0;
+ virtual void _create(const fs_path& path, const boost::shared_ptr<void>& prop) = 0;
//! Internal access property with wild-card type
- virtual boost::shared_ptr<void> &_access(const fs_path &path) const = 0;
-
+ virtual boost::shared_ptr<void>& _access(const fs_path& path) const = 0;
};
-} //namespace uhd
+} // namespace uhd
#include <uhd/property_tree.ipp>
diff --git a/host/include/uhd/rfnoc/block_ctrl.hpp b/host/include/uhd/rfnoc/block_ctrl.hpp
index 9a8c5f8ec..c26ee0f85 100644
--- a/host/include/uhd/rfnoc/block_ctrl.hpp
+++ b/host/include/uhd/rfnoc/block_ctrl.hpp
@@ -8,11 +8,10 @@
#ifndef INCLUDED_LIBUHD_RFNOC_BLOCK_CTRL_HPP
#define INCLUDED_LIBUHD_RFNOC_BLOCK_CTRL_HPP
-#include <uhd/rfnoc/source_block_ctrl_base.hpp>
#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
+#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief This is the default implementation of a block_ctrl_base.
*
@@ -20,7 +19,8 @@ namespace uhd {
* can be set by sr_write(). The default behaviour of functions is documented
* in uhd::rfnoc::block_ctrl_base.
*/
-class UHD_RFNOC_API block_ctrl : public source_block_ctrl_base, public sink_block_ctrl_base
+class UHD_RFNOC_API block_ctrl : public source_block_ctrl_base,
+ public sink_block_ctrl_base
{
public:
// Required macro in RFNoC block classes
diff --git a/host/include/uhd/rfnoc/block_ctrl_base.hpp b/host/include/uhd/rfnoc/block_ctrl_base.hpp
index 4b97fa185..0bf701810 100644
--- a/host/include/uhd/rfnoc/block_ctrl_base.hpp
+++ b/host/include/uhd/rfnoc/block_ctrl_base.hpp
@@ -9,36 +9,34 @@
#define INCLUDED_LIBUHD_BLOCK_CTRL_BASE_HPP
#include <uhd/property_tree.hpp>
+#include <uhd/rfnoc/block_id.hpp>
+#include <uhd/rfnoc/blockdef.hpp>
+#include <uhd/rfnoc/constants.hpp>
+#include <uhd/rfnoc/node_ctrl_base.hpp>
+#include <uhd/rfnoc/stream_sig.hpp>
#include <uhd/stream.hpp>
#include <uhd/types/sid.hpp>
#include <uhd/types/stream_cmd.hpp>
#include <uhd/types/wb_iface.hpp>
#include <uhd/utils/static.hpp>
-#include <uhd/rfnoc/node_ctrl_base.hpp>
-#include <uhd/rfnoc/block_id.hpp>
-#include <uhd/rfnoc/stream_sig.hpp>
-#include <uhd/rfnoc/blockdef.hpp>
-#include <uhd/rfnoc/constants.hpp>
-#include <boost/shared_ptr.hpp>
#include <stdint.h>
+#include <boost/shared_ptr.hpp>
-namespace uhd {
- namespace rfnoc {
- // Forward declarations
- class ctrl_iface;
- namespace nocscript {
- class block_iface;
- }
+namespace uhd { namespace rfnoc {
+// Forward declarations
+class ctrl_iface;
+namespace nocscript {
+class block_iface;
+}
// TODO: Move this out of public section
struct make_args_t
{
- make_args_t(const std::string &key="") :
- device_index(0),
- block_name(""),
- block_key(key)
- {}
+ make_args_t(const std::string& key = "")
+ : device_index(0), block_name(""), block_key(key)
+ {
+ }
//! A valid interface that allows us to read and write registers
std::map<size_t, boost::shared_ptr<ctrl_iface> > ctrl_ifaces;
@@ -58,25 +56,21 @@ struct make_args_t
//! This macro must be put in the public section of an RFNoC
// block class
-#define UHD_RFNOC_BLOCK_OBJECT(class_name) \
- typedef boost::shared_ptr< class_name > sptr;
+#define UHD_RFNOC_BLOCK_OBJECT(class_name) typedef boost::shared_ptr<class_name> sptr;
//! Shorthand for block constructor
#define UHD_RFNOC_BLOCK_CONSTRUCTOR(CLASS_NAME) \
- CLASS_NAME##_impl( \
- const make_args_t &make_args \
- ) : block_ctrl_base(make_args)
+ CLASS_NAME##_impl(const make_args_t& make_args) : block_ctrl_base(make_args)
//! This macro must be placed inside a block implementation file
// after the class definition
-#define UHD_RFNOC_BLOCK_REGISTER(CLASS_NAME, BLOCK_NAME) \
- block_ctrl_base::sptr CLASS_NAME##_make( \
- const make_args_t &make_args \
- ) { \
- return block_ctrl_base::sptr(new CLASS_NAME##_impl(make_args)); \
- } \
- UHD_STATIC_BLOCK(register_rfnoc_##CLASS_NAME) \
- { \
+#define UHD_RFNOC_BLOCK_REGISTER(CLASS_NAME, BLOCK_NAME) \
+ block_ctrl_base::sptr CLASS_NAME##_make(const make_args_t& make_args) \
+ { \
+ return block_ctrl_base::sptr(new CLASS_NAME##_impl(make_args)); \
+ } \
+ UHD_STATIC_BLOCK(register_rfnoc_##CLASS_NAME) \
+ { \
uhd::rfnoc::block_ctrl_base::register_block(&CLASS_NAME##_make, BLOCK_NAME); \
}
@@ -97,7 +91,7 @@ public:
* Types
**********************************************************************/
typedef boost::shared_ptr<block_ctrl_base> sptr;
- typedef boost::function<sptr(const make_args_t &)> make_t;
+ typedef boost::function<sptr(const make_args_t&)> make_t;
/***********************************************************************
* Factory functions
@@ -113,7 +107,7 @@ public:
* \param name A unique block name, e.g. 'FFT'. If a block has this block name,
* it will use \p make to generate the block controller class.
*/
- static void register_block(const make_t &make, const std::string &name);
+ static void register_block(const make_t& make, const std::string& name);
/*!
* \brief Create a block controller class given a NoC-ID or a block name.
@@ -129,7 +123,7 @@ public:
* \param noc_id The 64-Bit NoC-ID.
* \return a shared pointer to a new device instance
*/
- static sptr make(const make_args_t &make_args, uint64_t noc_id = ~0);
+ static sptr make(const make_args_t& make_args, uint64_t noc_id = ~0);
/***********************************************************************
* Block Communication and Control
@@ -139,15 +133,21 @@ public:
/*! Returns the 16-Bit address for this block.
*/
- uint32_t get_address(size_t block_port=0);
+ uint32_t get_address(size_t block_port = 0);
/*! Returns the unique block ID for this block (e.g. "0/FFT_1").
*/
- block_id_t get_block_id() const { return _block_id; };
+ block_id_t get_block_id() const
+ {
+ return _block_id;
+ };
/*! Shorthand for get_block_id().to_string()
*/
- std::string unique_id() const { return _block_id.to_string(); };
+ std::string unique_id() const
+ {
+ return _block_id.to_string();
+ };
/***********************************************************************
* FPGA control & communication
@@ -178,7 +178,7 @@ public:
* \throw uhd::key_error if \p reg is not a valid register name
*
*/
- void sr_write(const std::string &reg, const uint32_t data, const size_t port = 0);
+ void sr_write(const std::string& reg, const uint32_t data, const size_t port = 0);
/*! Allows reading one register on the settings bus (64-Bit version).
*
@@ -221,7 +221,7 @@ public:
* \returns the readback value.
* \throws uhd::key_error if \p reg is not a valid register name
*/
- uint64_t user_reg_read64(const std::string &reg, const size_t port = 0);
+ uint64_t user_reg_read64(const std::string& reg, const size_t port = 0);
/*! Allows reading one user-defined register (32-Bit version).
*
@@ -247,7 +247,7 @@ public:
* \throws uhd::key_error if \p reg is not a valid register name
* \param port Port from which to read
*/
- uint32_t user_reg_read32(const std::string &reg, const size_t port = 0);
+ uint32_t user_reg_read32(const std::string& reg, const size_t port = 0);
/*! Sets a command time for all future command packets.
@@ -255,7 +255,7 @@ public:
* \throws uhd::assertion_error if the underlying interface does not
* actually support timing.
*/
- void set_command_time(const time_spec_t &time_spec, const size_t port = ANY_PORT);
+ void set_command_time(const time_spec_t& time_spec, const size_t port = ANY_PORT);
/*! Returns the current command time for all future command packets.
*
@@ -307,15 +307,16 @@ public:
* Note that this function will silently ignore any keys in \p args that
* aren't already registered as block arguments.
*/
- void set_args(const uhd::device_addr_t &args, const size_t port = 0);
+ void set_args(const uhd::device_addr_t& args, const size_t port = 0);
//! Set a specific block argument. \p val is converted to the corresponding
// data type using by looking up its type in the block definition.
- void set_arg(const std::string &key, const std::string &val, const size_t port = 0);
+ void set_arg(const std::string& key, const std::string& val, const size_t port = 0);
//! Direct access to set a block argument.
template <typename T>
- void set_arg(const std::string &key, const T &val, const size_t port = 0) {
+ void set_arg(const std::string& key, const T& val, const size_t port = 0)
+ {
_tree->access<T>(get_arg_path(key, port) / "value").set(val);
}
@@ -323,40 +324,40 @@ public:
uhd::device_addr_t get_args(const size_t port = 0) const;
//! Return a single block argument in string format.
- std::string get_arg(const std::string &key, const size_t port = 0) const;
+ std::string get_arg(const std::string& key, const size_t port = 0) const;
//! Direct access to get a block argument.
- template <typename T>
- T get_arg(const std::string &key, const size_t port = 0) const {
+ template <typename T> T get_arg(const std::string& key, const size_t port = 0) const
+ {
return _tree->access<T>(get_arg_path(key, port) / "value").get();
}
- std::string get_arg_type(const std::string &key, const size_t port = 0) const;
+ std::string get_arg_type(const std::string& key, const size_t port = 0) const;
protected:
/***********************************************************************
* Structors
**********************************************************************/
- block_ctrl_base(void) {}; // To allow pure virtual (interface) sub-classes
+ block_ctrl_base(void){}; // To allow pure virtual (interface) sub-classes
virtual ~block_ctrl_base();
/*! Constructor. This is only called from the internal block factory!
*
* \param make_args All arguments to this constructor are passed in this object.
- * Its details are subject to change. Use the UHD_RFNOC_BLOCK_CONSTRUCTOR()
- * macro to set up your block's constructor in a portable fashion.
+ * Its details are subject to change. Use the
+ * UHD_RFNOC_BLOCK_CONSTRUCTOR() macro to set up your block's constructor in a
+ * portable fashion.
*/
- block_ctrl_base(
- const make_args_t &make_args
- );
+ block_ctrl_base(const make_args_t& make_args);
/***********************************************************************
* Helpers
**********************************************************************/
- stream_sig_t _resolve_port_def(const blockdef::port_t &port_def) const;
+ stream_sig_t _resolve_port_def(const blockdef::port_t& port_def) const;
//! Return the property tree path to a block argument \p key on \p port
- uhd::fs_path get_arg_path(const std::string &key, size_t port = 0) const {
+ uhd::fs_path get_arg_path(const std::string& key, size_t port = 0) const
+ {
return _root_path / "args" / port / key;
};
@@ -373,7 +374,8 @@ protected:
//! Override this function if your block needs to specially handle
// setting the command time
- virtual void _set_command_time(const time_spec_t &time_spec, const size_t port = ANY_PORT);
+ virtual void _set_command_time(
+ const time_spec_t& time_spec, const size_t port = ANY_PORT);
/***********************************************************************
* Protected members
**********************************************************************/
@@ -389,11 +391,9 @@ protected:
private:
//! Helper function to initialize the port definition nodes in the prop tree
- void _init_port_defs(
- const std::string &direction,
- blockdef::ports_t ports,
- const size_t first_port_index=0
- );
+ void _init_port_defs(const std::string& direction,
+ blockdef::ports_t ports,
+ const size_t first_port_index = 0);
//! Helper function to initialize the block args (used by ctor only)
void _init_block_args();
diff --git a/host/include/uhd/rfnoc/block_id.hpp b/host/include/uhd/rfnoc/block_id.hpp
index 126f3be25..8c4884807 100644
--- a/host/include/uhd/rfnoc/block_id.hpp
+++ b/host/include/uhd/rfnoc/block_id.hpp
@@ -14,187 +14,223 @@
#include <string>
namespace uhd {
- struct fs_path;
-
- namespace rfnoc {
-
- /*!
- * Identifies an RFNoC block.
- *
- * An RFNoC block ID is a string such as: 0/FFT_1
- *
- * The rules for formatting such a string are:
- *
- * DEVICE/BLOCKNAME_COUNTER
- *
- * DEVICE: Identifies the device (usually the motherboard index)
- * BLOCKNAME: A name given to this block
- * COUNTER: If is are more than one block with a BLOCKNAME, this counts up.
- *
- * So, 0/FFT_1 means we're addressing the second block called FFT
- * on the first device.
- *
- * This class can represent these block IDs.
- */
- class UHD_RFNOC_API block_id_t
- {
- public:
- block_id_t();
- block_id_t(const std::string &block_str);
- //! \param device_no Device number
- //! \param block_name Block name
- //! \param block_ctr Which block of this type is this on this device?
- block_id_t(const size_t device_no, const std::string &block_name, const size_t block_ctr=0);
-
- //! Return a string like this: "0/FFT_1" (includes all components, if set)
- std::string to_string() const;
-
- //! Check if a given string is valid as a block name.
- //
- // Note: This only applies to the block *name*, not the entire block ID.
- // Examples:
- // * is_valid_blockname("FFT") will return true.
- // * is_valid_blockname("FIR_Filter") will return false, because an underscore
- // is not allowed in a block name.
- //
- // Internally, this matches the string with uhd::rfnoc::VALID_BLOCKNAME_REGEX.
- static bool is_valid_blockname(const std::string &block_name);
-
- //! Check if a given string is valid as a block ID.
- //
- // Note: This does necessary require a complete complete ID. If this returns
- // true, then it is a valid input for block_id_t::match().
- //
- // Examples:
- // * is_valid_block_id("FFT") will return true.
- // * is_valid_block_id("0/Filter_1") will return true.
- // * is_valid_block_id("0/Filter_Foo") will return false.
- //
- // Internally, this matches the string with uhd::rfnoc::VALID_BLOCKID_REGEX.
- static bool is_valid_block_id(const std::string &block_id);
-
- //! Check if block_str matches this block.
- //
- // A match is a less strict version of equality.
- // Less specific block IDs will match more specific ones,
- // e.g. "FFT" will match "0/FFT_1", "1/FFT_2", etc.
- // "FFT_1" will only match the former, etc.
- bool match(const std::string &block_str);
-
- // Getters
-
- //! Short for to_string()
- std::string get() const { return to_string(); };
-
- //! Like get(), but only returns the local part ("FFT_1")
- std::string get_local() const;
-
- //! Returns the property tree root for this block (e.g. "/mboards/0/xbar/FFT_1/")
- uhd::fs_path get_tree_root() const;
-
- //! Return device number
- size_t get_device_no() const { return _device_no; };
-
- //! Return block count
- size_t get_block_count() const { return _block_ctr; };
-
- //! Return block name
- std::string get_block_name() const { return _block_name; };
-
- // Setters
-
- //! Set from string such as "0/FFT_1", "FFT_0", ...
- // Returns true if successful (i.e. if string valid)
- bool set(const std::string &new_name);
-
- //! Sets from individual compontents, like calling set_device_no(), set_block_name()
- // and set_block_count() one after another, only if \p block_name is invalid, stops
- // and returns false before chaning anything
- bool set(const size_t device_no, const std::string &block_name, const size_t block_ctr=0);
-
- //! Set the device number
- void set_device_no(size_t device_no) { _device_no = device_no; };
-
- //! Set the block name. Will return false if invalid block string.
- bool set_block_name(const std::string &block_name);
-
- //! Set the block count.
- void set_block_count(size_t count) { _block_ctr = count; };
-
- // Overloaded operators
-
- //! Assignment: Works like set(std::string)
- block_id_t operator = (const std::string &new_name) {
- set(new_name);
- return *this;
- }
-
- bool operator == (const block_id_t &block_id) const {
- return (_device_no == block_id.get_device_no())
- and (_block_name == block_id.get_block_name())
- and (_block_ctr == block_id.get_block_count());
- }
-
- bool operator != (const block_id_t &block_id) const {
- return not (*this == block_id);
- }
-
- bool operator < (const block_id_t &block_id) const {
- return (
- _device_no < block_id.get_device_no()
- or (_device_no == block_id.get_device_no() and _block_name < block_id.get_block_name())
- or (_device_no == block_id.get_device_no() and _block_name == block_id.get_block_name() and _block_ctr < block_id.get_block_count())
- );
- }
-
- bool operator > (const block_id_t &block_id) const {
- return (
- _device_no > block_id.get_device_no()
- or (_device_no == block_id.get_device_no() and _block_name > block_id.get_block_name())
- or (_device_no == block_id.get_device_no() and _block_name == block_id.get_block_name() and _block_ctr > block_id.get_block_count())
- );
- }
-
- //! Check if a string matches the entire block ID (not like match())
- bool operator == (const std::string &block_id_str) const {
- return get() == block_id_str;
- }
-
- //! Check if a string matches the entire block ID (not like match())
- bool operator == (const char *block_id_str) const {
- std::string comp = std::string(block_id_str);
- return *this == comp;
- }
-
- //! Type-cast operator does the same as to_string()
- operator std::string() const {
- return to_string();
- }
-
- //! Increment the block count ("FFT_1" -> "FFT_2")
- block_id_t operator++() {
- _block_ctr++;
- return *this;
- }
-
- //! Increment the block count ("FFT_1" -> "FFT_2")
- block_id_t operator++(int) {
- _block_ctr++;
- return *this;
- }
-
- private:
- size_t _device_no;
- std::string _block_name;
- size_t _block_ctr;
+struct fs_path;
+
+namespace rfnoc {
+
+/*!
+ * Identifies an RFNoC block.
+ *
+ * An RFNoC block ID is a string such as: 0/FFT_1
+ *
+ * The rules for formatting such a string are:
+ *
+ * DEVICE/BLOCKNAME_COUNTER
+ *
+ * DEVICE: Identifies the device (usually the motherboard index)
+ * BLOCKNAME: A name given to this block
+ * COUNTER: If is are more than one block with a BLOCKNAME, this counts up.
+ *
+ * So, 0/FFT_1 means we're addressing the second block called FFT
+ * on the first device.
+ *
+ * This class can represent these block IDs.
+ */
+class UHD_RFNOC_API block_id_t
+{
+public:
+ block_id_t();
+ block_id_t(const std::string& block_str);
+ //! \param device_no Device number
+ //! \param block_name Block name
+ //! \param block_ctr Which block of this type is this on this device?
+ block_id_t(const size_t device_no,
+ const std::string& block_name,
+ const size_t block_ctr = 0);
+
+ //! Return a string like this: "0/FFT_1" (includes all components, if set)
+ std::string to_string() const;
+
+ //! Check if a given string is valid as a block name.
+ //
+ // Note: This only applies to the block *name*, not the entire block ID.
+ // Examples:
+ // * is_valid_blockname("FFT") will return true.
+ // * is_valid_blockname("FIR_Filter") will return false, because an underscore
+ // is not allowed in a block name.
+ //
+ // Internally, this matches the string with uhd::rfnoc::VALID_BLOCKNAME_REGEX.
+ static bool is_valid_blockname(const std::string& block_name);
+
+ //! Check if a given string is valid as a block ID.
+ //
+ // Note: This does necessary require a complete complete ID. If this returns
+ // true, then it is a valid input for block_id_t::match().
+ //
+ // Examples:
+ // * is_valid_block_id("FFT") will return true.
+ // * is_valid_block_id("0/Filter_1") will return true.
+ // * is_valid_block_id("0/Filter_Foo") will return false.
+ //
+ // Internally, this matches the string with uhd::rfnoc::VALID_BLOCKID_REGEX.
+ static bool is_valid_block_id(const std::string& block_id);
+
+ //! Check if block_str matches this block.
+ //
+ // A match is a less strict version of equality.
+ // Less specific block IDs will match more specific ones,
+ // e.g. "FFT" will match "0/FFT_1", "1/FFT_2", etc.
+ // "FFT_1" will only match the former, etc.
+ bool match(const std::string& block_str);
+
+ // Getters
+
+ //! Short for to_string()
+ std::string get() const
+ {
+ return to_string();
+ };
+
+ //! Like get(), but only returns the local part ("FFT_1")
+ std::string get_local() const;
+
+ //! Returns the property tree root for this block (e.g. "/mboards/0/xbar/FFT_1/")
+ uhd::fs_path get_tree_root() const;
+
+ //! Return device number
+ size_t get_device_no() const
+ {
+ return _device_no;
+ };
+
+ //! Return block count
+ size_t get_block_count() const
+ {
+ return _block_ctr;
+ };
+
+ //! Return block name
+ std::string get_block_name() const
+ {
+ return _block_name;
+ };
+
+ // Setters
+
+ //! Set from string such as "0/FFT_1", "FFT_0", ...
+ // Returns true if successful (i.e. if string valid)
+ bool set(const std::string& new_name);
+
+ //! Sets from individual compontents, like calling set_device_no(), set_block_name()
+ // and set_block_count() one after another, only if \p block_name is invalid, stops
+ // and returns false before chaning anything
+ bool set(const size_t device_no,
+ const std::string& block_name,
+ const size_t block_ctr = 0);
+
+ //! Set the device number
+ void set_device_no(size_t device_no)
+ {
+ _device_no = device_no;
};
- //! Shortcut for << block_id.to_string()
- inline std::ostream& operator<< (std::ostream& out, block_id_t block_id) {
- out << block_id.to_string();
- return out;
+ //! Set the block name. Will return false if invalid block string.
+ bool set_block_name(const std::string& block_name);
+
+ //! Set the block count.
+ void set_block_count(size_t count)
+ {
+ _block_ctr = count;
+ };
+
+ // Overloaded operators
+
+ //! Assignment: Works like set(std::string)
+ block_id_t operator=(const std::string& new_name)
+ {
+ set(new_name);
+ return *this;
+ }
+
+ bool operator==(const block_id_t& block_id) const
+ {
+ return (_device_no == block_id.get_device_no())
+ and (_block_name == block_id.get_block_name())
+ and (_block_ctr == block_id.get_block_count());
+ }
+
+ bool operator!=(const block_id_t& block_id) const
+ {
+ return not(*this == block_id);
+ }
+
+ bool operator<(const block_id_t& block_id) const
+ {
+ return (_device_no < block_id.get_device_no()
+ or (_device_no == block_id.get_device_no()
+ and _block_name < block_id.get_block_name())
+ or (_device_no == block_id.get_device_no()
+ and _block_name == block_id.get_block_name()
+ and _block_ctr < block_id.get_block_count()));
+ }
+
+ bool operator>(const block_id_t& block_id) const
+ {
+ return (_device_no > block_id.get_device_no()
+ or (_device_no == block_id.get_device_no()
+ and _block_name > block_id.get_block_name())
+ or (_device_no == block_id.get_device_no()
+ and _block_name == block_id.get_block_name()
+ and _block_ctr > block_id.get_block_count()));
+ }
+
+ //! Check if a string matches the entire block ID (not like match())
+ bool operator==(const std::string& block_id_str) const
+ {
+ return get() == block_id_str;
+ }
+
+ //! Check if a string matches the entire block ID (not like match())
+ bool operator==(const char* block_id_str) const
+ {
+ std::string comp = std::string(block_id_str);
+ return *this == comp;
+ }
+
+ //! Type-cast operator does the same as to_string()
+ operator std::string() const
+ {
+ return to_string();
+ }
+
+ //! Increment the block count ("FFT_1" -> "FFT_2")
+ block_id_t operator++()
+ {
+ _block_ctr++;
+ return *this;
+ }
+
+ //! Increment the block count ("FFT_1" -> "FFT_2")
+ block_id_t operator++(int)
+ {
+ _block_ctr++;
+ return *this;
}
-}} //namespace uhd::rfnoc
+private:
+ size_t _device_no;
+ std::string _block_name;
+ size_t _block_ctr;
+};
+
+//! Shortcut for << block_id.to_string()
+inline std::ostream& operator<<(std::ostream& out, block_id_t block_id)
+{
+ out << block_id.to_string();
+ return out;
+}
+
+} // namespace rfnoc
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_BLOCK_ID_HPP */
diff --git a/host/include/uhd/rfnoc/blockdef.hpp b/host/include/uhd/rfnoc/blockdef.hpp
index 43845aa7d..30c5219e1 100644
--- a/host/include/uhd/rfnoc/blockdef.hpp
+++ b/host/include/uhd/rfnoc/blockdef.hpp
@@ -8,12 +8,12 @@
#ifndef INCLUDED_LIBUHD_RFNOC_BLOCKDEF_HPP
#define INCLUDED_LIBUHD_RFNOC_BLOCKDEF_HPP
-#include <stdint.h>
-#include <boost/enable_shared_from_this.hpp>
#include <uhd/config.hpp>
#include <uhd/types/device_addr.hpp>
-#include <vector>
+#include <stdint.h>
+#include <boost/enable_shared_from_this.hpp>
#include <set>
+#include <vector>
namespace uhd { namespace rfnoc {
@@ -31,17 +31,18 @@ public:
// to describe what kind of connection is allowed for this port.
//
// All the keys listed in PORT_ARGS will be available in this class.
- class port_t : public uhd::dict<std::string, std::string> {
- public:
+ class port_t : public uhd::dict<std::string, std::string>
+ {
+ public:
//! A list of args a port can have.
static const device_addr_t PORT_ARGS;
port_t();
//! Checks if the value at \p key is a variable (e.g. '$fftlen')
- bool is_variable(const std::string &key) const;
+ bool is_variable(const std::string& key) const;
//! Checks if the value at \p key is a keyword (e.g. '%vlen')
- bool is_keyword(const std::string &key) const;
+ bool is_keyword(const std::string& key) const;
//! Basic validity check of this port definition. Variables and
// keywords are not resolved.
bool is_valid() const;
@@ -51,8 +52,9 @@ public:
typedef std::vector<port_t> ports_t;
//! Describes arguments in a block definition.
- class arg_t : public uhd::dict<std::string, std::string> {
- public:
+ class arg_t : public uhd::dict<std::string, std::string>
+ {
+ public:
//! A list of args an argument can have.
static const device_addr_t ARG_ARGS;
static const std::set<std::string> VALID_TYPES;
@@ -63,7 +65,6 @@ public:
bool is_valid() const;
//! Returns a string with the most important keys
std::string to_string() const;
-
};
typedef std::vector<arg_t> args_t;
@@ -92,7 +93,7 @@ public:
//! Return the one NoC that is valid for this block
virtual uint64_t noc_id() const = 0;
- virtual ports_t get_input_ports() = 0;
+ virtual ports_t get_input_ports() = 0;
virtual ports_t get_output_ports() = 0;
//! Returns the full list of port numbers used
diff --git a/host/include/uhd/rfnoc/constants.hpp b/host/include/uhd/rfnoc/constants.hpp
index 8c97fa220..9d9295809 100644
--- a/host/include/uhd/rfnoc/constants.hpp
+++ b/host/include/uhd/rfnoc/constants.hpp
@@ -9,12 +9,11 @@
#define INCLUDED_LIBUHD_RFNOC_CONSTANTS_HPP
#include <uhd/types/dict.hpp>
-#include <boost/assign/list_of.hpp>
#include <stdint.h>
+#include <boost/assign/list_of.hpp>
#include <string>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
// All these configure the XML reader
//! Where the RFNoC block/component definition files lie, relative to UHD_PKG_DIR
@@ -24,11 +23,11 @@ static const std::string XML_PATH_ENV = "UHD_RFNOC_DIR";
//! If the block name can't be automatically detected, this name is used
static const std::string DEFAULT_BLOCK_NAME = "Block";
-static const uint64_t DEFAULT_NOC_ID = 0xFFFFFFFFFFFFFFFF;
-static const size_t NOC_SHELL_COMPAT_MAJOR = 5;
-static const size_t NOC_SHELL_COMPAT_MINOR = 0;
+static const uint64_t DEFAULT_NOC_ID = 0xFFFFFFFFFFFFFFFF;
+static const size_t NOC_SHELL_COMPAT_MAJOR = 5;
+static const size_t NOC_SHELL_COMPAT_MINOR = 0;
-static const size_t MAX_PACKET_SIZE = 8000; // bytes
+static const size_t MAX_PACKET_SIZE = 8000; // bytes
static const size_t DEFAULT_PACKET_SIZE = 1456; // bytes
// One line in FPGA is 64 Bits
@@ -44,57 +43,60 @@ static const size_t DEFAULT_FC_TX_RESPONSE_FREQ = 8; // ACKs per flow control wi
// Why not 100% full? Because we need to have some headroom to account for the inaccuracy
// when computing the window size. We compute the flow control window based on the frame
// size but the buffer can have overhead due to things like UDP headers, page alignment,
-// housekeeping info, etc. This number has to be transport agnostic so 20% of headroom is safe.
+// housekeeping info, etc. This number has to be transport agnostic so 20% of headroom is
+// safe.
static const double DEFAULT_FC_RX_SW_BUFF_FULL_FACTOR = 0.80;
// Common settings registers.
-static const uint32_t SR_FLOW_CTRL_BYTES_PER_ACK = 1;
-static const uint32_t SR_FLOW_CTRL_WINDOW_SIZE = 2;
-static const uint32_t SR_FLOW_CTRL_EN = 3;
-static const uint32_t SR_ERROR_POLICY = 4;
-static const uint32_t SR_BLOCK_SID = 5; // TODO rename to SRC_SID
-static const uint32_t SR_NEXT_DST_SID = 6;
-static const uint32_t SR_RESP_IN_DST_SID = 7;
-static const uint32_t SR_RESP_OUT_DST_SID = 8;
-static const uint32_t SR_FLOW_CTRL_PKT_LIMIT = 9;
-
-static const uint32_t SR_READBACK_ADDR = 124;
-static const uint32_t SR_READBACK = 127;
-
-static const uint32_t SR_CLEAR_RX_FC = 125;
-static const uint32_t SR_CLEAR_TX_FC = 126;
+static const uint32_t SR_FLOW_CTRL_BYTES_PER_ACK = 1;
+static const uint32_t SR_FLOW_CTRL_WINDOW_SIZE = 2;
+static const uint32_t SR_FLOW_CTRL_EN = 3;
+static const uint32_t SR_ERROR_POLICY = 4;
+static const uint32_t SR_BLOCK_SID = 5; // TODO rename to SRC_SID
+static const uint32_t SR_NEXT_DST_SID = 6;
+static const uint32_t SR_RESP_IN_DST_SID = 7;
+static const uint32_t SR_RESP_OUT_DST_SID = 8;
+static const uint32_t SR_FLOW_CTRL_PKT_LIMIT = 9;
+
+static const uint32_t SR_READBACK_ADDR = 124;
+static const uint32_t SR_READBACK = 127;
+
+static const uint32_t SR_CLEAR_RX_FC = 125;
+static const uint32_t SR_CLEAR_TX_FC = 126;
//! Settings register readback
enum settingsbus_reg_t {
- SR_READBACK_REG_ID = 0,
- SR_READBACK_REG_GLOBAL_PARAMS = 1,
- SR_READBACK_REG_FIFOSIZE = 2, // fifo size
- SR_READBACK_REG_MTU = 3,
+ SR_READBACK_REG_ID = 0,
+ SR_READBACK_REG_GLOBAL_PARAMS = 1,
+ SR_READBACK_REG_FIFOSIZE = 2, // fifo size
+ SR_READBACK_REG_MTU = 3,
SR_READBACK_REG_BLOCKPORT_SIDS = 4,
- SR_READBACK_REG_USER = 5,
- SR_READBACK_COMPAT = 6
+ SR_READBACK_REG_USER = 5,
+ SR_READBACK_COMPAT = 6
};
// AXI stream configuration bus (output master bus of axi wrapper) registers
-static const uint32_t AXI_WRAPPER_BASE = 128;
-static const uint32_t AXIS_CONFIG_BUS = AXI_WRAPPER_BASE+1; // tdata with tvalid asserted
-static const uint32_t AXIS_CONFIG_BUS_TLAST = AXI_WRAPPER_BASE+2; // tdata with tvalid & tlast asserted
+static const uint32_t AXI_WRAPPER_BASE = 128;
+static const uint32_t AXIS_CONFIG_BUS =
+ AXI_WRAPPER_BASE + 1; // tdata with tvalid asserted
+static const uint32_t AXIS_CONFIG_BUS_TLAST =
+ AXI_WRAPPER_BASE + 2; // tdata with tvalid & tlast asserted
static const size_t CMD_FIFO_SIZE = 128; // Lines == multiples of 8 bytes
// Named settings registers
-static const uhd::dict<std::string, uint32_t> DEFAULT_NAMED_SR = boost::assign::map_list_of
- ("AXIS_CONFIG_BUS", AXIS_CONFIG_BUS)
- ("AXIS_CONFIG_BUS_TLAST", AXIS_CONFIG_BUS_TLAST)
-;
+static const uhd::dict<std::string, uint32_t> DEFAULT_NAMED_SR =
+ boost::assign::map_list_of("AXIS_CONFIG_BUS", AXIS_CONFIG_BUS)(
+ "AXIS_CONFIG_BUS_TLAST", AXIS_CONFIG_BUS_TLAST);
// Block ports
-static const size_t ANY_PORT = size_t(~0);
+static const size_t ANY_PORT = size_t(~0);
static const size_t MAX_NUM_PORTS = 16;
// Regular expressions
static const std::string VALID_BLOCKNAME_REGEX = "[A-Za-z][A-Za-z0-9]*";
-static const std::string VALID_BLOCKID_REGEX = "(?:(\\d+)(?:/))?([A-Za-z][A-Za-z0-9]*)(?:(?:_)(\\d\\d?))?";
+static const std::string VALID_BLOCKID_REGEX =
+ "(?:(\\d+)(?:/))?([A-Za-z][A-Za-z0-9]*)(?:(?:_)(\\d\\d?))?";
}} /* namespace uhd::rfnoc */
diff --git a/host/include/uhd/rfnoc/ddc_block_ctrl.hpp b/host/include/uhd/rfnoc/ddc_block_ctrl.hpp
index daca3b8d3..2a261db00 100644
--- a/host/include/uhd/rfnoc/ddc_block_ctrl.hpp
+++ b/host/include/uhd/rfnoc/ddc_block_ctrl.hpp
@@ -8,13 +8,12 @@
#ifndef INCLUDED_LIBUHD_RFNOC_DDC_BLOCK_CTRL_HPP
#define INCLUDED_LIBUHD_RFNOC_DDC_BLOCK_CTRL_HPP
-#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
#include <uhd/rfnoc/rate_node_ctrl.hpp>
#include <uhd/rfnoc/scalar_node_ctrl.hpp>
+#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
+#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief DDC block controller
*
@@ -24,11 +23,10 @@ namespace uhd {
*
* It also includes a CORDIC component to shift signals in frequency.
*/
-class UHD_RFNOC_API ddc_block_ctrl :
- public source_block_ctrl_base,
- public sink_block_ctrl_base,
- public rate_node_ctrl,
- public scalar_node_ctrl
+class UHD_RFNOC_API ddc_block_ctrl : public source_block_ctrl_base,
+ public sink_block_ctrl_base,
+ public rate_node_ctrl,
+ public scalar_node_ctrl
{
public:
UHD_RFNOC_BLOCK_OBJECT(ddc_block_ctrl)
diff --git a/host/include/uhd/rfnoc/dma_fifo_block_ctrl.hpp b/host/include/uhd/rfnoc/dma_fifo_block_ctrl.hpp
index 74ab1ec15..093e2ef91 100644
--- a/host/include/uhd/rfnoc/dma_fifo_block_ctrl.hpp
+++ b/host/include/uhd/rfnoc/dma_fifo_block_ctrl.hpp
@@ -8,11 +8,10 @@
#ifndef INCLUDED_LIBUHD_RFNOC_DMA_FIFO_BLOCK_HPP
#define INCLUDED_LIBUHD_RFNOC_DMA_FIFO_BLOCK_HPP
-#include <uhd/rfnoc/source_block_ctrl_base.hpp>
#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
+#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Block controller for a DMA FIFO block.
*
@@ -24,13 +23,15 @@ namespace uhd {
* bank.
*
*/
-class UHD_RFNOC_API dma_fifo_block_ctrl : public source_block_ctrl_base, public sink_block_ctrl_base
+class UHD_RFNOC_API dma_fifo_block_ctrl : public source_block_ctrl_base,
+ public sink_block_ctrl_base
{
public:
UHD_RFNOC_BLOCK_OBJECT(dma_fifo_block_ctrl)
//! Configure the base address and depth of the FIFO (in bytes).
- virtual void resize(const uint32_t base_addr, const uint32_t depth, const size_t chan) = 0;
+ virtual void resize(
+ const uint32_t base_addr, const uint32_t depth, const size_t chan) = 0;
//! Returns the base address of the FIFO (in bytes).
uint32_t get_base_addr(const size_t chan) const;
diff --git a/host/include/uhd/rfnoc/duc_block_ctrl.hpp b/host/include/uhd/rfnoc/duc_block_ctrl.hpp
index 13eac5812..b24f7af26 100644
--- a/host/include/uhd/rfnoc/duc_block_ctrl.hpp
+++ b/host/include/uhd/rfnoc/duc_block_ctrl.hpp
@@ -8,13 +8,12 @@
#ifndef INCLUDED_LIBUHD_RFNOC_DUC_BLOCK_CTRL_HPP
#define INCLUDED_LIBUHD_RFNOC_DUC_BLOCK_CTRL_HPP
-#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
#include <uhd/rfnoc/rate_node_ctrl.hpp>
#include <uhd/rfnoc/scalar_node_ctrl.hpp>
+#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
+#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief DUC block controller
*
@@ -24,11 +23,10 @@ namespace uhd {
*
* It also includes a CORDIC component to shift signals in frequency.
*/
-class UHD_RFNOC_API duc_block_ctrl :
- public source_block_ctrl_base,
- public sink_block_ctrl_base,
- public rate_node_ctrl,
- public scalar_node_ctrl
+class UHD_RFNOC_API duc_block_ctrl : public source_block_ctrl_base,
+ public sink_block_ctrl_base,
+ public rate_node_ctrl,
+ public scalar_node_ctrl
{
public:
UHD_RFNOC_BLOCK_OBJECT(duc_block_ctrl)
@@ -38,4 +36,3 @@ public:
}} /* namespace uhd::rfnoc */
#endif /* INCLUDED_LIBUHD_RFNOC_DUC_BLOCK_CTRL_HPP */
-
diff --git a/host/include/uhd/rfnoc/fir_block_ctrl.hpp b/host/include/uhd/rfnoc/fir_block_ctrl.hpp
index 3fd93620d..67a6a958b 100644
--- a/host/include/uhd/rfnoc/fir_block_ctrl.hpp
+++ b/host/include/uhd/rfnoc/fir_block_ctrl.hpp
@@ -7,11 +7,10 @@
#ifndef INCLUDED_LIBUHD_RFNOC_fir_block_ctrl_HPP
#define INCLUDED_LIBUHD_RFNOC_fir_block_ctrl_HPP
-#include <uhd/rfnoc/source_block_ctrl_base.hpp>
#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
+#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Block controller for the standard FIR RFNoC block.
*
@@ -24,7 +23,8 @@ namespace uhd {
* It will perform one FFT operation per incoming packet, treating it
* as a vector of samples.
*/
-class UHD_RFNOC_API fir_block_ctrl : public source_block_ctrl_base, public sink_block_ctrl_base
+class UHD_RFNOC_API fir_block_ctrl : public source_block_ctrl_base,
+ public sink_block_ctrl_base
{
public:
UHD_RFNOC_BLOCK_OBJECT(fir_block_ctrl)
@@ -34,7 +34,7 @@ public:
// The length of \p taps must correspond the number of taps
// in this block. If it's shorter, zeros will be padded.
// If it's longer, throws a uhd::value_error.
- virtual void set_taps(const std::vector<int> &taps) = 0;
+ virtual void set_taps(const std::vector<int>& taps) = 0;
//! Returns the number of filter taps in this block.
virtual size_t get_n_taps() const = 0;
diff --git a/host/include/uhd/rfnoc/graph.hpp b/host/include/uhd/rfnoc/graph.hpp
index f6620d39b..b3372e389 100644
--- a/host/include/uhd/rfnoc/graph.hpp
+++ b/host/include/uhd/rfnoc/graph.hpp
@@ -8,9 +8,9 @@
#ifndef INCLUDED_LIBUHD_RFNOC_GRAPH_HPP
#define INCLUDED_LIBUHD_RFNOC_GRAPH_HPP
-#include <boost/noncopyable.hpp>
#include <uhd/rfnoc/block_id.hpp>
#include <uhd/types/sid.hpp>
+#include <boost/noncopyable.hpp>
namespace uhd { namespace rfnoc {
@@ -19,7 +19,8 @@ class graph : boost::noncopyable
public:
typedef boost::shared_ptr<uhd::rfnoc::graph> sptr;
- /*! Connect a RFNOC block with block ID \p src_block to another with block ID \p dst_block.
+ /*! Connect a RFNOC block with block ID \p src_block to another with block ID \p
+ * dst_block.
*
* This will:
* - Check if this connection is valid (IO signatures, see if types match)
@@ -27,22 +28,17 @@ public:
* - Configure SID for the upstream block
* - Register the upstream block in the downstream block
*/
- virtual void connect(
- const block_id_t &src_block,
- size_t src_block_port,
- const block_id_t &dst_block,
- size_t dst_block_port,
- const size_t pkt_size = 0
- ) = 0;
+ virtual void connect(const block_id_t& src_block,
+ size_t src_block_port,
+ const block_id_t& dst_block,
+ size_t dst_block_port,
+ const size_t pkt_size = 0) = 0;
/*! Shorthand for connect().
*
* Using default ports for both source and destination.
*/
- virtual void connect(
- const block_id_t &src_block,
- const block_id_t &dst_block
- ) = 0;
+ virtual void connect(const block_id_t& src_block, const block_id_t& dst_block) = 0;
/*! Anonymous connection.
*
@@ -53,13 +49,11 @@ public:
* \param dst_sid SID to route traffic to
* \param buf_size_dst_bytes Destination window buffer in bytes
*/
- virtual void connect_src(
- const block_id_t &src_block,
- const size_t src_block_port,
- const uhd::sid_t dst_sid,
- const size_t buf_size_dst_bytes,
- const size_t pkt_size_
- ) = 0;
+ virtual void connect_src(const block_id_t& src_block,
+ const size_t src_block_port,
+ const uhd::sid_t dst_sid,
+ const size_t buf_size_dst_bytes,
+ const size_t pkt_size_) = 0;
/*! Anonymous connection
*
@@ -69,15 +63,13 @@ public:
* \param dst_block_port Destination (sink) block port
* \param bytes_per_ack Flow control frequency in bytes
*/
- virtual void connect_sink(
- const block_id_t &sink_block,
- const size_t dst_block_port,
- const size_t bytes_per_ack
- ) = 0;
+ virtual void connect_sink(const block_id_t& sink_block,
+ const size_t dst_block_port,
+ const size_t bytes_per_ack) = 0;
virtual std::string get_name() const = 0;
};
-}}; /* name space uhd::rfnoc */
+}}; // namespace uhd::rfnoc
#endif /* INCLUDED_LIBUHD_RFNOC_GRAPH_HPP */
diff --git a/host/include/uhd/rfnoc/node_ctrl_base.hpp b/host/include/uhd/rfnoc/node_ctrl_base.hpp
index 791f74afd..0fed28bed 100644
--- a/host/include/uhd/rfnoc/node_ctrl_base.hpp
+++ b/host/include/uhd/rfnoc/node_ctrl_base.hpp
@@ -8,19 +8,18 @@
#ifndef INCLUDED_LIBUHD_NODE_CTRL_BASE_HPP
#define INCLUDED_LIBUHD_NODE_CTRL_BASE_HPP
-#include <uhd/types/device_addr.hpp>
#include <uhd/rfnoc/constants.hpp>
+#include <uhd/types/device_addr.hpp>
#include <uhd/utils/log.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/utility.hpp>
+#include <stdint.h>
#include <boost/enable_shared_from_this.hpp>
#include <boost/function.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
#include <map>
#include <set>
-#include <stdint.h>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
#define UHD_RFNOC_BLOCK_TRACE() UHD_LOGGER_TRACE("RFNOC")
@@ -28,7 +27,8 @@ namespace uhd {
*
*/
class UHD_RFNOC_API node_ctrl_base;
-class node_ctrl_base : boost::noncopyable, public boost::enable_shared_from_this<node_ctrl_base>
+class node_ctrl_base : boost::noncopyable,
+ public boost::enable_shared_from_this<node_ctrl_base>
{
public:
/***********************************************************************
@@ -36,8 +36,8 @@ public:
**********************************************************************/
typedef boost::shared_ptr<node_ctrl_base> sptr;
typedef boost::weak_ptr<node_ctrl_base> wptr;
- typedef std::map< size_t, wptr > node_map_t;
- typedef std::pair< size_t, wptr > node_map_pair_t;
+ typedef std::map<size_t, wptr> node_map_t;
+ typedef std::pair<size_t, wptr> node_map_pair_t;
/***********************************************************************
* Node control
@@ -52,8 +52,14 @@ public:
*/
virtual void clear();
- node_map_t list_downstream_nodes() { return _downstream_nodes; };
- node_map_t list_upstream_nodes() { return _upstream_nodes; };
+ node_map_t list_downstream_nodes()
+ {
+ return _downstream_nodes;
+ };
+ node_map_t list_upstream_nodes()
+ {
+ return _upstream_nodes;
+ };
/*! Disconnect this node from all neighbouring nodes.
*/
@@ -109,7 +115,8 @@ public:
* Search only goes downstream.
*/
template <typename T>
- UHD_INLINE std::vector< boost::shared_ptr<T> > find_downstream_node(bool active_only = false)
+ UHD_INLINE std::vector<boost::shared_ptr<T> > find_downstream_node(
+ bool active_only = false)
{
return _find_child_node<T, true>(active_only);
}
@@ -117,7 +124,8 @@ public:
/*! Same as find_downstream_node(), but only search upstream.
*/
template <typename T>
- UHD_INLINE std::vector< boost::shared_ptr<T> > find_upstream_node(bool active_only = false)
+ UHD_INLINE std::vector<boost::shared_ptr<T> > find_upstream_node(
+ bool active_only = false)
{
return _find_child_node<T, false>(active_only);
}
@@ -136,22 +144,26 @@ public:
*/
template <typename T, typename value_type>
UHD_INLINE value_type find_downstream_unique_property(
- boost::function<value_type(boost::shared_ptr<T> node, size_t port)> get_property,
- value_type null_value,
- const std::set< boost::shared_ptr<T> > &exclude_nodes=std::set< boost::shared_ptr<T> >()
- ) {
- return _find_unique_property<T, value_type, true>(get_property, null_value, exclude_nodes);
+ boost::function<value_type(boost::shared_ptr<T> node, size_t port)> get_property,
+ value_type null_value,
+ const std::set<boost::shared_ptr<T> >& exclude_nodes =
+ std::set<boost::shared_ptr<T> >())
+ {
+ return _find_unique_property<T, value_type, true>(
+ get_property, null_value, exclude_nodes);
}
/*! Like find_downstream_unique_property(), but searches upstream.
*/
template <typename T, typename value_type>
UHD_INLINE value_type find_upstream_unique_property(
- boost::function<value_type(boost::shared_ptr<T> node, size_t port)> get_property,
- value_type null_value,
- const std::set< boost::shared_ptr<T> > &exclude_nodes=std::set< boost::shared_ptr<T> >()
- ) {
- return _find_unique_property<T, value_type, false>(get_property, null_value, exclude_nodes);
+ boost::function<value_type(boost::shared_ptr<T> node, size_t port)> get_property,
+ value_type null_value,
+ const std::set<boost::shared_ptr<T> >& exclude_nodes =
+ std::set<boost::shared_ptr<T> >())
+ {
+ return _find_unique_property<T, value_type, false>(
+ get_property, null_value, exclude_nodes);
}
protected:
@@ -159,7 +171,10 @@ protected:
* Structors
**********************************************************************/
node_ctrl_base(void) {}
- virtual ~node_ctrl_base() { disconnect(); }
+ virtual ~node_ctrl_base()
+ {
+ disconnect();
+ }
/***********************************************************************
* Protected members
@@ -204,9 +219,7 @@ protected:
* See also uhd::rfnoc::source_node_ctrl::_register_downstream_node().
*/
virtual void _register_downstream_node(
- node_ctrl_base::sptr downstream_node,
- size_t port
- );
+ node_ctrl_base::sptr downstream_node, size_t port);
/*! Registers another node as upstream of this node, connected to a given port.
*
@@ -214,10 +227,7 @@ protected:
* a source node.
* See also uhd::rfnoc::sink_node_ctrl::_register_upstream_node().
*/
- virtual void _register_upstream_node(
- node_ctrl_base::sptr upstream_node,
- size_t port
- );
+ virtual void _register_upstream_node(node_ctrl_base::sptr upstream_node, size_t port);
private:
/*! Implements the search algorithm for find_downstream_node() and
@@ -229,7 +239,7 @@ private:
* \param downstream Set to true if search goes downstream, false for upstream.
*/
template <typename T, bool downstream>
- std::vector< boost::shared_ptr<T> > _find_child_node(bool active_only = false);
+ std::vector<boost::shared_ptr<T> > _find_child_node(bool active_only = false);
/*! Implements the search algorithm for find_downstream_unique_property() and
* find_upstream_unique_property().
@@ -241,10 +251,9 @@ private:
*/
template <typename T, typename value_type, bool downstream>
value_type _find_unique_property(
- boost::function<value_type(boost::shared_ptr<T>, size_t)> get_property,
- value_type NULL_VALUE,
- const std::set< boost::shared_ptr<T> > &exclude_nodes
- );
+ boost::function<value_type(boost::shared_ptr<T>, size_t)> get_property,
+ value_type NULL_VALUE,
+ const std::set<boost::shared_ptr<T> >& exclude_nodes);
/*! Stores the remote port number of a downstream connection.
*/
diff --git a/host/include/uhd/rfnoc/null_block_ctrl.hpp b/host/include/uhd/rfnoc/null_block_ctrl.hpp
index 18ff7cea1..1406fd219 100644
--- a/host/include/uhd/rfnoc/null_block_ctrl.hpp
+++ b/host/include/uhd/rfnoc/null_block_ctrl.hpp
@@ -7,11 +7,10 @@
#ifndef INCLUDED_LIBUHD_RFNOC_NULL_BLOCK_CTRL_HPP
#define INCLUDED_LIBUHD_RFNOC_NULL_BLOCK_CTRL_HPP
-#include <uhd/rfnoc/source_block_ctrl_base.hpp>
#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
+#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Provide access to a 'null block'.
*
@@ -45,7 +44,7 @@ public:
static const uint32_t SR_ENABLE_STREAM = 131;
static const size_t DEFAULT_LINES_PER_PACKET = 32;
- static const size_t BYTES_PER_LINE = 8;
+ static const size_t BYTES_PER_LINE = 8;
//! Custom function to set the rate at which data is produced.
// Note: This is 'cycles per line', so the bit rate is actually
@@ -56,11 +55,11 @@ public:
// \param The rate you want to set this to
// \param The clock rate of this block's clock domain
// \returns the actual line rate (will find closest possible).
- virtual double set_line_rate(double rate, double clock_rate=166.6e6) = 0;
+ virtual double set_line_rate(double rate, double clock_rate = 166.6e6) = 0;
//! Return the current line rate. Equivalent to reading line_rate/value
// from the property tree.
- virtual double get_line_rate(double clock_rate=166.6e6) const = 0;
+ virtual double get_line_rate(double clock_rate = 166.6e6) const = 0;
}; /* class null_block_ctrl*/
diff --git a/host/include/uhd/rfnoc/radio_ctrl.hpp b/host/include/uhd/rfnoc/radio_ctrl.hpp
index 28ba9264b..4f8f3bb1d 100644
--- a/host/include/uhd/rfnoc/radio_ctrl.hpp
+++ b/host/include/uhd/rfnoc/radio_ctrl.hpp
@@ -8,31 +8,29 @@
#ifndef INCLUDED_LIBUHD_RFNOC_RADIO_CTRL_HPP
#define INCLUDED_LIBUHD_RFNOC_RADIO_CTRL_HPP
-#include <uhd/types/ranges.hpp>
-#include <uhd/types/direction.hpp>
-#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
#include <uhd/rfnoc/rate_node_ctrl.hpp>
-#include <uhd/rfnoc/tick_node_ctrl.hpp>
#include <uhd/rfnoc/scalar_node_ctrl.hpp>
+#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
+#include <uhd/rfnoc/source_block_ctrl_base.hpp>
#include <uhd/rfnoc/terminator_node_ctrl.hpp>
+#include <uhd/rfnoc/tick_node_ctrl.hpp>
+#include <uhd/types/direction.hpp>
+#include <uhd/types/ranges.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Block controller for all RFNoC-based radio blocks
*/
-class UHD_RFNOC_API radio_ctrl :
- public source_block_ctrl_base,
- public sink_block_ctrl_base,
- public rate_node_ctrl,
- public tick_node_ctrl,
- public terminator_node_ctrl
+class UHD_RFNOC_API radio_ctrl : public source_block_ctrl_base,
+ public sink_block_ctrl_base,
+ public rate_node_ctrl,
+ public tick_node_ctrl,
+ public terminator_node_ctrl
{
public:
UHD_RFNOC_BLOCK_OBJECT(radio_ctrl)
- virtual ~radio_ctrl(){}
+ virtual ~radio_ctrl() {}
//! A wildcard channel index
@@ -69,7 +67,7 @@ public:
*
* \throws uhd::value_error if \p ant is not a valid value.
*/
- virtual void set_tx_antenna(const std::string &ant, const size_t chan) = 0;
+ virtual void set_tx_antenna(const std::string& ant, const size_t chan) = 0;
/*! Return the selected RX antenna for channel \p chan.
*
@@ -81,7 +79,7 @@ public:
*
* \throws uhd::value_error if \p ant is not a valid value.
*/
- virtual void set_rx_antenna(const std::string &ant, const size_t chan) = 0;
+ virtual void set_rx_antenna(const std::string& ant, const size_t chan) = 0;
/*! Return the current transmit LO frequency on channel \p chan.
*
@@ -163,10 +161,7 @@ public:
*
* \return The actual bandwidth value
*/
- virtual double set_tx_bandwidth(
- const double bandwidth,
- const size_t chan
- ) = 0;
+ virtual double set_tx_bandwidth(const double bandwidth, const size_t chan) = 0;
/*! Return the analog filter bandwidth channel \p chan
*
@@ -189,7 +184,7 @@ public:
* time in alignment with a certain reference time, use
* set_time_next_pps().
*/
- virtual void set_time_now(const time_spec_t &time_spec) = 0;
+ virtual void set_time_now(const time_spec_t& time_spec) = 0;
/*! Set the time registers at the next pps tick.
*
@@ -202,7 +197,7 @@ public:
*
* \param time_spec the time to latch into the timekeeper
*/
- virtual void set_time_next_pps(const time_spec_t &time_spec) = 0;
+ virtual void set_time_next_pps(const time_spec_t& time_spec) = 0;
/*! Get the current time in the timekeeper registers.
*
@@ -241,12 +236,10 @@ public:
* \param value the new value for this GPIO bank
* \param mask the bit mask to effect which pins are changed
*/
- virtual void set_gpio_attr(
- const std::string &bank,
- const std::string &attr,
- const uint32_t value,
- const uint32_t mask
- ) = 0;
+ virtual void set_gpio_attr(const std::string& bank,
+ const std::string& attr,
+ const uint32_t value,
+ const uint32_t mask) = 0;
/*!
* Get a GPIO attribute on a particular GPIO bank.
@@ -263,7 +256,7 @@ public:
* \param attr the name of a GPIO attribute
* \return the value set for this attribute
*/
- virtual uint32_t get_gpio_attr(const std::string &bank, const std::string &attr) = 0;
+ virtual uint32_t get_gpio_attr(const std::string& bank, const std::string& attr) = 0;
/**************************************************************************
* LO Controls
@@ -283,7 +276,8 @@ public:
* \param chan the channel index 0 to N-1
* \return a vector of strings for possible settings
*/
- virtual std::vector<std::string> get_rx_lo_sources(const std::string &name, const size_t chan) = 0;
+ virtual std::vector<std::string> get_rx_lo_sources(
+ const std::string& name, const size_t chan) = 0;
/*!
* Get the LO frequency range of the RX LO.
@@ -293,7 +287,8 @@ public:
* \param chan the channel index 0 to N-1
* \return a frequency range object
*/
- virtual freq_range_t get_rx_lo_freq_range(const std::string &name, const size_t chan) = 0;
+ virtual freq_range_t get_rx_lo_freq_range(
+ const std::string& name, const size_t chan) = 0;
/*!
* Set the LO source for a channel.
@@ -304,7 +299,8 @@ public:
* \param name the name of the LO stage to update
* \param chan the channel index 0 to N-1
*/
- virtual void set_rx_lo_source(const std::string &src, const std::string &name, const size_t chan) = 0;
+ virtual void set_rx_lo_source(
+ const std::string& src, const std::string& name, const size_t chan) = 0;
/*!
* Get the currently set LO source.
@@ -314,7 +310,8 @@ public:
* \param chan the channel index 0 to N-1
* \return the configured LO source
*/
- virtual const std::string get_rx_lo_source(const std::string &name, const size_t chan) = 0;
+ virtual const std::string get_rx_lo_source(
+ const std::string& name, const size_t chan) = 0;
/*!
* Set whether the LO used by the usrp device is exported
@@ -324,14 +321,15 @@ public:
* \param name the name of the LO stage to update
* \param chan the channel index 0 to N-1 for the source channel
*/
- virtual void set_rx_lo_export_enabled(bool enabled, const std::string &name, const size_t chan) = 0;
+ virtual void set_rx_lo_export_enabled(
+ bool enabled, const std::string& name, const size_t chan) = 0;
/*!
* Returns true if the currently selected LO is being exported.
* \param name the name of the LO stage to query
* \param chan the channel index 0 to N-1
*/
- virtual bool get_rx_lo_export_enabled(const std::string &name, const size_t chan) = 0;
+ virtual bool get_rx_lo_export_enabled(const std::string& name, const size_t chan) = 0;
/*!
* Set the RX LO frequency (Advanced).
@@ -340,7 +338,8 @@ public:
* \param chan the channel index 0 to N-1
* \return a coerced LO frequency
*/
- virtual double set_rx_lo_freq(double freq, const std::string &name, const size_t chan) = 0;
+ virtual double set_rx_lo_freq(
+ double freq, const std::string& name, const size_t chan) = 0;
/*!
* Get the current RX LO frequency (Advanced).
@@ -350,7 +349,7 @@ public:
* \param chan the channel index 0 to N-1
* \return the configured LO frequency
*/
- virtual double get_rx_lo_freq(const std::string &name, const size_t chan) = 0;
+ virtual double get_rx_lo_freq(const std::string& name, const size_t chan) = 0;
/*! Get a list of possible LO stage names
*
@@ -368,9 +367,7 @@ public:
* \return a vector of strings for possible settings
*/
virtual std::vector<std::string> get_tx_lo_sources(
- const std::string &name,
- const size_t chan
- ) = 0;
+ const std::string& name, const size_t chan) = 0;
/*!
* Get the LO frequency range of the tx LO.
@@ -381,9 +378,7 @@ public:
* \return a frequency range object
*/
virtual freq_range_t get_tx_lo_freq_range(
- const std::string &name,
- const size_t chan
- ) = 0;
+ const std::string& name, const size_t chan) = 0;
/*!
* Set the LO source for a channel.
@@ -395,10 +390,7 @@ public:
* \param chan the channel index 0 to N-1
*/
virtual void set_tx_lo_source(
- const std::string &src,
- const std::string &name,
- const size_t chan
- ) = 0;
+ const std::string& src, const std::string& name, const size_t chan) = 0;
/*!
* Get the currently set LO source.
@@ -409,9 +401,7 @@ public:
* \return the configured LO source
*/
virtual const std::string get_tx_lo_source(
- const std::string &name,
- const size_t chan
- ) = 0;
+ const std::string& name, const size_t chan) = 0;
/*!
* Set whether the LO used by the usrp device is exported
@@ -422,20 +412,14 @@ public:
* \param chan the channel index 0 to N-1 for the source channel
*/
virtual void set_tx_lo_export_enabled(
- const bool enabled,
- const std::string &name,
- const size_t chan
- ) = 0;
+ const bool enabled, const std::string& name, const size_t chan) = 0;
/*!
* Returns true if the currently selected LO is being exported.
* \param name the name of the LO stage to query
* \param chan the channel index 0 to N-1
*/
- virtual bool get_tx_lo_export_enabled(
- const std::string &name,
- const size_t chan
- ) = 0;
+ virtual bool get_tx_lo_export_enabled(const std::string& name, const size_t chan) = 0;
/*! Set the tx LO frequency (Advanced).
*
@@ -447,10 +431,7 @@ public:
* \return a coerced LO frequency
*/
virtual double set_tx_lo_freq(
- const double freq,
- const std::string &name,
- const size_t chan
- ) = 0;
+ const double freq, const std::string& name, const size_t chan) = 0;
/*! Get the current TX LO frequency (Advanced).
*
@@ -463,16 +444,13 @@ public:
* \param chan the channel index 0 to N-1
* \return the configured LO frequency
*/
- virtual double get_tx_lo_freq(
- const std::string &name,
- const size_t chan
- ) = 0;
+ virtual double get_tx_lo_freq(const std::string& name, const size_t chan) = 0;
/**************************************************************************
* Time and clock control
*************************************************************************/
- /*!
+ /*!
* Set the time source for this radio.
*
* May affect other radio blocks.
@@ -480,7 +458,7 @@ public:
* \param source A string representing the time source
* \throws uhd::value_error if the value can't be applied
*/
- virtual void set_time_source(const std::string &source) = 0;
+ virtual void set_time_source(const std::string& source) = 0;
/*!
* Get the currently set time source.
@@ -503,7 +481,7 @@ public:
*
* \param source a string representing the clock source
*/
- virtual void set_clock_source(const std::string &source) = 0;
+ virtual void set_clock_source(const std::string& source) = 0;
/*!
* Get the currently set clock source.
@@ -525,11 +503,13 @@ public:
* map to channels 0 and 1 respectively. A BasicRX boards has alphabetical
* frontends (A, B) which map to channels differently.
*/
- virtual size_t get_chan_from_dboard_fe(const std::string &fe, const uhd::direction_t dir) = 0;
+ virtual size_t get_chan_from_dboard_fe(
+ const std::string& fe, const uhd::direction_t dir) = 0;
/*! The inverse function to get_chan_from_dboard_fe()
*/
- virtual std::string get_dboard_fe_from_chan(const size_t chan, const uhd::direction_t dir) = 0;
+ virtual std::string get_dboard_fe_from_chan(
+ const size_t chan, const uhd::direction_t dir) = 0;
/*! Enable or disable the setting of timestamps on Rx.
*/
diff --git a/host/include/uhd/rfnoc/rate_node_ctrl.hpp b/host/include/uhd/rfnoc/rate_node_ctrl.hpp
index 71ebf3927..f04af11f4 100644
--- a/host/include/uhd/rfnoc/rate_node_ctrl.hpp
+++ b/host/include/uhd/rfnoc/rate_node_ctrl.hpp
@@ -8,11 +8,10 @@
#ifndef INCLUDED_LIBUHD_RATE_NODE_CTRL_BASE_HPP
#define INCLUDED_LIBUHD_RATE_NODE_CTRL_BASE_HPP
-#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/rfnoc/constants.hpp>
+#include <uhd/rfnoc/node_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Sampling-rate-aware node control
*
@@ -45,12 +44,11 @@ public:
* and then return that value multiplied by the decimation factor.
*
*/
- virtual double get_input_samp_rate(size_t port=ANY_PORT);
- virtual double get_output_samp_rate(size_t port=ANY_PORT);
+ virtual double get_input_samp_rate(size_t port = ANY_PORT);
+ virtual double get_output_samp_rate(size_t port = ANY_PORT);
}; /* class rate_node_ctrl */
}} /* namespace uhd::rfnoc */
#endif /* INCLUDED_LIBUHD_RATE_NODE_CTRL_BASE_HPP */
-
diff --git a/host/include/uhd/rfnoc/replay_block_ctrl.hpp b/host/include/uhd/rfnoc/replay_block_ctrl.hpp
index ba49a6a7d..639d31595 100644
--- a/host/include/uhd/rfnoc/replay_block_ctrl.hpp
+++ b/host/include/uhd/rfnoc/replay_block_ctrl.hpp
@@ -7,11 +7,10 @@
#ifndef INCLUDED_LIBUHD_RFNOC_REPLAY_BLOCK_HPP
#define INCLUDED_LIBUHD_RFNOC_REPLAY_BLOCK_HPP
-#include <uhd/rfnoc/source_block_ctrl_base.hpp>
#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
+#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Replay block controller
*
@@ -25,23 +24,26 @@ namespace uhd {
* memory, usually an off-chip DRAM.
*
*/
-class UHD_RFNOC_API replay_block_ctrl : public source_block_ctrl_base, public sink_block_ctrl_base
+class UHD_RFNOC_API replay_block_ctrl : public source_block_ctrl_base,
+ public sink_block_ctrl_base
{
public:
UHD_RFNOC_BLOCK_OBJECT(replay_block_ctrl)
//! Configure the base address and size of the record buffer region (in bytes).
- virtual void config_record(const uint32_t base_addr, const uint32_t size, const size_t chan) = 0;
-
+ virtual void config_record(
+ const uint32_t base_addr, const uint32_t size, const size_t chan) = 0;
+
//! Configure the base address and size of the playback buffer region (in bytes).
- virtual void config_play(const uint32_t base_addr, const uint32_t size, const size_t chan) = 0;
+ virtual void config_play(
+ const uint32_t base_addr, const uint32_t size, const size_t chan) = 0;
//! Restarts recording at the beginning of the record buffer
virtual void record_restart(const size_t chan) = 0;
//! Returns the base address of the record buffer (in bytes).
virtual uint32_t get_record_addr(const size_t chan) = 0;
-
+
//! Returns the base address of the playback buffer (in bytes).
virtual uint32_t get_play_addr(const size_t chan) = 0;
@@ -50,7 +52,7 @@ public:
//! Returns the current fullness of the record buffer (in bytes).
virtual uint32_t get_record_fullness(const size_t chan) = 0;
-
+
//! Returns the size of the playback buffer (in bytes).
virtual uint32_t get_play_size(const size_t chan) = 0;
@@ -62,7 +64,7 @@ public:
//! Halts playback and clears the playback command FIFO
virtual void play_halt(const size_t chan) = 0;
-
+
}; /* class replay_block_ctrl*/
}} /* namespace uhd::rfnoc */
diff --git a/host/include/uhd/rfnoc/scalar_node_ctrl.hpp b/host/include/uhd/rfnoc/scalar_node_ctrl.hpp
index e428f76fb..910a94b0c 100644
--- a/host/include/uhd/rfnoc/scalar_node_ctrl.hpp
+++ b/host/include/uhd/rfnoc/scalar_node_ctrl.hpp
@@ -8,11 +8,10 @@
#ifndef INCLUDED_LIBUHD_SCALAR_NODE_CTRL_BASE_HPP
#define INCLUDED_LIBUHD_SCALAR_NODE_CTRL_BASE_HPP
-#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/rfnoc/constants.hpp>
+#include <uhd/rfnoc/node_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Scaling node control
*
@@ -45,7 +44,7 @@ public:
*
* \param port Port Number
*/
- virtual double get_input_scale_factor(size_t port=ANY_PORT);
+ virtual double get_input_scale_factor(size_t port = ANY_PORT);
/*! Returns the scaling factor for this block on output.
*
@@ -54,7 +53,7 @@ public:
*
* \param port Port Number
*/
- virtual double get_output_scale_factor(size_t port=ANY_PORT);
+ virtual double get_output_scale_factor(size_t port = ANY_PORT);
}; /* class scalar_node_ctrl */
diff --git a/host/include/uhd/rfnoc/siggen_block_ctrl.hpp b/host/include/uhd/rfnoc/siggen_block_ctrl.hpp
index 3d21ca258..c58d3490d 100644
--- a/host/include/uhd/rfnoc/siggen_block_ctrl.hpp
+++ b/host/include/uhd/rfnoc/siggen_block_ctrl.hpp
@@ -7,13 +7,13 @@
#ifndef INCLUDED_LIBUHD_RFNOC_SIGGEN_BLOCK_CTRL_HPP
#define INCLUDED_LIBUHD_RFNOC_SIGGEN_BLOCK_CTRL_HPP
-#include <uhd/rfnoc/source_block_ctrl_base.hpp>
#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
+#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
-class UHD_RFNOC_API siggen_block_ctrl : public source_block_ctrl_base, public sink_block_ctrl_base
+class UHD_RFNOC_API siggen_block_ctrl : public source_block_ctrl_base,
+ public sink_block_ctrl_base
{
public:
UHD_RFNOC_BLOCK_OBJECT(siggen_block_ctrl)
diff --git a/host/include/uhd/rfnoc/sink_block_ctrl_base.hpp b/host/include/uhd/rfnoc/sink_block_ctrl_base.hpp
index 959148b7f..a2d4685be 100644
--- a/host/include/uhd/rfnoc/sink_block_ctrl_base.hpp
+++ b/host/include/uhd/rfnoc/sink_block_ctrl_base.hpp
@@ -11,8 +11,7 @@
#include <uhd/rfnoc/block_ctrl_base.hpp>
#include <uhd/rfnoc/sink_node_ctrl.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Extends block_ctrl_base with input capabilities.
*
@@ -41,7 +40,7 @@ public:
* \returns The stream signature for port \p block_port
* \throws uhd::runtime_error if \p block_port is not a valid port
*/
- stream_sig_t get_input_signature(size_t block_port=0) const;
+ stream_sig_t get_input_signature(size_t block_port = 0) const;
/*! Return a list of valid input ports.
*/
@@ -62,7 +61,7 @@ public:
*
* Returns the size of the buffer in bytes.
*/
- size_t get_fifo_size(size_t block_port=0) const;
+ size_t get_fifo_size(size_t block_port = 0) const;
/*! Configure flow control for incoming streams.
*
@@ -77,21 +76,18 @@ public:
*
* \param bytes Send an ACK after this many bytes have been consumed.
* Setting this to zero disables flow control acknowledgement.
- * \param block_port Set up flow control for a stream coming in on this particular block port.
+ * \param block_port Set up flow control for a stream coming in on this particular
+ * block port.
*/
virtual void configure_flow_control_in(
- const size_t bytes,
- const size_t block_port=0
- );
+ const size_t bytes, const size_t block_port = 0);
/*! Configure the behaviour for errors on incoming packets
* (e.g. sequence errors).
*
*
*/
- virtual void set_error_policy(
- const std::string &policy
- );
+ virtual void set_error_policy(const std::string& policy);
protected:
/***********************************************************************
@@ -101,9 +97,7 @@ protected:
* the port has an input signature.
*/
virtual size_t _request_input_port(
- const size_t suggested_port,
- const uhd::device_addr_t &args
- ) const;
+ const size_t suggested_port, const uhd::device_addr_t& args) const;
}; /* class sink_block_ctrl_base */
diff --git a/host/include/uhd/rfnoc/sink_node_ctrl.hpp b/host/include/uhd/rfnoc/sink_node_ctrl.hpp
index e080035f1..22100f4c5 100644
--- a/host/include/uhd/rfnoc/sink_node_ctrl.hpp
+++ b/host/include/uhd/rfnoc/sink_node_ctrl.hpp
@@ -8,13 +8,12 @@
#ifndef INCLUDED_LIBUHD_SINK_NODE_CTRL_BASE_HPP
#define INCLUDED_LIBUHD_SINK_NODE_CTRL_BASE_HPP
-#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/rfnoc/constants.hpp>
+#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/rfnoc/sink_node_ctrl.hpp>
#include <boost/thread.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Abstract class for sink nodes.
*
@@ -28,8 +27,8 @@ public:
* Types
**********************************************************************/
typedef boost::shared_ptr<sink_node_ctrl> sptr;
- typedef std::map< size_t, boost::weak_ptr<sink_node_ctrl> > node_map_t;
- typedef std::pair< size_t, boost::weak_ptr<sink_node_ctrl> > node_map_pair_t;
+ typedef std::map<size_t, boost::weak_ptr<sink_node_ctrl> > node_map_t;
+ typedef std::pair<size_t, boost::weak_ptr<sink_node_ctrl> > node_map_pair_t;
/***********************************************************************
* Sink block controls
@@ -48,11 +47,9 @@ public:
*
* \returns The actual port number used.
*/
- size_t connect_upstream(
- node_ctrl_base::sptr upstream_node,
- size_t port=ANY_PORT,
- const uhd::device_addr_t &args=uhd::device_addr_t()
- );
+ size_t connect_upstream(node_ctrl_base::sptr upstream_node,
+ size_t port = ANY_PORT,
+ const uhd::device_addr_t& args = uhd::device_addr_t());
/*! Call this function to notify a node about its streamer activity.
*
@@ -64,7 +61,6 @@ public:
protected:
-
/*! Ask for a port number to connect an upstream block to.
*
* Typically, this will be overridden for custom behaviour.
@@ -94,16 +90,15 @@ protected:
* \returns A valid input port, or ANY_PORT on failure.
*/
virtual size_t _request_input_port(
- const size_t suggested_port,
- const uhd::device_addr_t &args
- ) const;
+ const size_t suggested_port, const uhd::device_addr_t& args) const;
private:
/*! Makes connecting something to the input thread-safe.
*/
boost::mutex _input_mutex;
- /*! Register a node upstream of this one (i.e., a node that can send data to this node).
+ /*! Register a node upstream of this one (i.e., a node that can send data to this
+ * node).
*
* By definition, the upstream node must of type source_node_ctrl.
*
@@ -113,10 +108,7 @@ private:
* \param upstream_node A pointer to the node instantiation
* \param port Port number the upstream node is connected to
*/
- void _register_upstream_node(
- node_ctrl_base::sptr upstream_node,
- size_t port
- );
+ void _register_upstream_node(node_ctrl_base::sptr upstream_node, size_t port);
}; /* class sink_node_ctrl */
diff --git a/host/include/uhd/rfnoc/source_block_ctrl_base.hpp b/host/include/uhd/rfnoc/source_block_ctrl_base.hpp
index 4f54a72c6..c0a8494c1 100644
--- a/host/include/uhd/rfnoc/source_block_ctrl_base.hpp
+++ b/host/include/uhd/rfnoc/source_block_ctrl_base.hpp
@@ -11,8 +11,7 @@
#include <uhd/rfnoc/block_ctrl_base.hpp>
#include <uhd/rfnoc/source_node_ctrl.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Extends block_ctrl_base with receive capabilities.
*
@@ -22,7 +21,8 @@ namespace uhd {
* data *from* this block.
*/
class UHD_RFNOC_API source_block_ctrl_base;
-class source_block_ctrl_base : virtual public block_ctrl_base, virtual public source_node_ctrl
+class source_block_ctrl_base : virtual public block_ctrl_base,
+ virtual public source_node_ctrl
{
public:
typedef boost::shared_ptr<source_block_ctrl_base> sptr;
@@ -50,9 +50,11 @@ public:
* See also register_upstream_block().
*
* \param stream_cmd The stream command.
- * \param chan Channel for which this command is meant (data shall be produced on this channel).
+ * \param chan Channel for which this command is meant (data shall be produced on this
+ * channel).
*/
- virtual void issue_stream_cmd(const uhd::stream_cmd_t &stream_cmd, const size_t chan=0);
+ virtual void issue_stream_cmd(
+ const uhd::stream_cmd_t& stream_cmd, const size_t chan = 0);
/***********************************************************************
* Stream signatures
@@ -67,7 +69,7 @@ public:
* \returns The stream signature for port \p block_port
* \throws uhd::runtime_error if \p block_port is not a valid port
*/
- stream_sig_t get_output_signature(size_t block_port=0) const;
+ stream_sig_t get_output_signature(size_t block_port = 0) const;
/*! Return a list of valid output ports.
*/
@@ -85,10 +87,7 @@ public:
* to register SR_NEXT_DST of this blocks settings bus. The value will also
* have bit 16 set to 1, since some blocks require this to respect this value.
*/
- virtual void set_destination(
- uint32_t next_address,
- size_t output_block_port = 0
- );
+ virtual void set_destination(uint32_t next_address, size_t output_block_port = 0);
/*! Configure flow control for outgoing streams.
*
@@ -97,26 +96,25 @@ public:
*
* Override this function if your block has port-specific flow control settings.
*
- * \param enable_output Enable flow control module's output. If disabled, no packets will be output
- * regardless of flow control state.
- * \param buf_size_bytes The size of the downstream block's input FIFO size in number of bytes. Setting
- * this to zero disables byte based flow control. If both byte based flow control and
- * the packet limit are set to zero, the block will then produce data as fast as it can.
- * \b Warning: This can cause head-of-line blocking, and potentially lock up your device!
- * \param pkt_limit Limit the maximum number of packets in flight. Setting this to zero disables packet limiting.
- * Usually kept disabled except for special case connections (such as DMA) that support only
- * a finite number of packets in flight.
+ * \param enable_output Enable flow control module's output. If disabled, no packets
+ * will be output regardless of flow control state. \param buf_size_bytes The size of
+ * the downstream block's input FIFO size in number of bytes. Setting this to zero
+ * disables byte based flow control. If both byte based flow control and the packet
+ * limit are set to zero, the block will then produce data as fast as it can. \b
+ * Warning: This can cause head-of-line blocking, and potentially lock up your device!
+ * \param pkt_limit Limit the maximum number of packets in flight. Setting this to
+ * zero disables packet limiting. Usually kept disabled except for special case
+ * connections (such as DMA) that support only a finite number of packets in flight.
* \param block_port Specify on which outgoing port this setting is valid.
- * \param sid The SID for which this is valid. This is meant for cases where the outgoing block port is
- * not sufficient to set the flow control, and as such is rarely used.
+ * \param sid The SID for which this is valid. This is meant for cases where the
+ * outgoing block port is not sufficient to set the flow control, and as such is
+ * rarely used.
*/
- virtual void configure_flow_control_out(
- const bool enable_output,
- const size_t buf_size_bytes,
- const size_t pkt_limit=0,
- const size_t block_port=0,
- const uhd::sid_t &sid=uhd::sid_t()
- );
+ virtual void configure_flow_control_out(const bool enable_output,
+ const size_t buf_size_bytes,
+ const size_t pkt_limit = 0,
+ const size_t block_port = 0,
+ const uhd::sid_t& sid = uhd::sid_t());
protected:
@@ -127,9 +125,7 @@ protected:
* the port has an output signature.
*/
virtual size_t _request_output_port(
- const size_t suggested_port,
- const uhd::device_addr_t &args
- ) const;
+ const size_t suggested_port, const uhd::device_addr_t& args) const;
}; /* class source_block_ctrl_base */
diff --git a/host/include/uhd/rfnoc/source_node_ctrl.hpp b/host/include/uhd/rfnoc/source_node_ctrl.hpp
index a0e8dbe9d..1dcc1ecfb 100644
--- a/host/include/uhd/rfnoc/source_node_ctrl.hpp
+++ b/host/include/uhd/rfnoc/source_node_ctrl.hpp
@@ -8,13 +8,12 @@
#ifndef INCLUDED_LIBUHD_SOURCE_NODE_CTRL_BASE_HPP
#define INCLUDED_LIBUHD_SOURCE_NODE_CTRL_BASE_HPP
-#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/rfnoc/constants.hpp>
+#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/types/stream_cmd.hpp>
#include <boost/thread.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Abstract class for source nodes.
*
@@ -28,8 +27,8 @@ public:
* Types
**********************************************************************/
typedef boost::shared_ptr<source_node_ctrl> sptr;
- typedef std::map< size_t, boost::weak_ptr<source_node_ctrl> > node_map_t;
- typedef std::pair< size_t, boost::weak_ptr<source_node_ctrl> > node_map_pair_t;
+ typedef std::map<size_t, boost::weak_ptr<source_node_ctrl> > node_map_t;
+ typedef std::pair<size_t, boost::weak_ptr<source_node_ctrl> > node_map_pair_t;
/***********************************************************************
* Source block controls
@@ -39,9 +38,7 @@ public:
* \param chan Channel Index
*/
virtual void issue_stream_cmd(
- const uhd::stream_cmd_t &stream_cmd,
- const size_t chan=0
- ) = 0;
+ const uhd::stream_cmd_t& stream_cmd, const size_t chan = 0) = 0;
/*! Connect another node downstream of this node.
*
@@ -57,11 +54,9 @@ public:
*
* \returns The actual port number used.
*/
- size_t connect_downstream(
- node_ctrl_base::sptr downstream_node,
- size_t port=ANY_PORT,
- const uhd::device_addr_t &args=uhd::device_addr_t()
- );
+ size_t connect_downstream(node_ctrl_base::sptr downstream_node,
+ size_t port = ANY_PORT,
+ const uhd::device_addr_t& args = uhd::device_addr_t());
/*! Call this function to notify a node about its streamer activity.
*
@@ -72,7 +67,6 @@ public:
virtual void set_rx_streamer(bool active, const size_t port);
protected:
-
/*! Ask for a port number to connect a downstream block to.
*
* See sink_node_ctrl::_request_input_port(). This is the same
@@ -84,9 +78,7 @@ protected:
* \returns A valid input port, or ANY_PORT on failure.
*/
virtual size_t _request_output_port(
- const size_t suggested_port,
- const uhd::device_addr_t &args
- ) const;
+ const size_t suggested_port, const uhd::device_addr_t& args) const;
private:
@@ -94,7 +86,8 @@ private:
*/
boost::mutex _output_mutex;
- /*! Register a node downstream of this one (i.e., a node that receives data from this node).
+ /*! Register a node downstream of this one (i.e., a node that receives data from this
+ * node).
*
* By definition, the upstream node must of type sink_node_ctrl.
*
@@ -104,10 +97,7 @@ private:
* \param downstream_node A pointer to the node instantiation
* \param port Port number the downstream node is connected to
*/
- void _register_downstream_node(
- node_ctrl_base::sptr downstream_node,
- size_t port
- );
+ void _register_downstream_node(node_ctrl_base::sptr downstream_node, size_t port);
}; /* class source_node_ctrl */
diff --git a/host/include/uhd/rfnoc/stream_sig.hpp b/host/include/uhd/rfnoc/stream_sig.hpp
index 4a5128a43..3b8482781 100644
--- a/host/include/uhd/rfnoc/stream_sig.hpp
+++ b/host/include/uhd/rfnoc/stream_sig.hpp
@@ -8,8 +8,8 @@
#ifndef INCLUDED_LIBUHD_RFNOC_STREAMSIG_HPP
#define INCLUDED_LIBUHD_RFNOC_STREAMSIG_HPP
-#include <iostream>
#include <uhd/config.hpp>
+#include <iostream>
namespace uhd { namespace rfnoc {
@@ -20,8 +20,9 @@ namespace uhd { namespace rfnoc {
* so, some attributes may be left undefined (e.g., a FIFO block
* works for any item type, so it doesn't need to set it).
*/
-class UHD_RFNOC_API stream_sig_t {
- public:
+class UHD_RFNOC_API stream_sig_t
+{
+public:
/***********************************************************************
* Structors
***********************************************************************/
@@ -63,11 +64,13 @@ class UHD_RFNOC_API stream_sig_t {
*
* \return true if streams are compatible
*/
- static bool is_compatible(const stream_sig_t &output_sig, const stream_sig_t &input_sig);
+ static bool is_compatible(
+ const stream_sig_t& output_sig, const stream_sig_t& input_sig);
};
//! Shortcut for << stream_sig.to_string()
-UHD_INLINE std::ostream& operator<< (std::ostream& out, stream_sig_t stream_sig) {
+UHD_INLINE std::ostream& operator<<(std::ostream& out, stream_sig_t stream_sig)
+{
out << stream_sig.to_string().c_str();
return out;
}
diff --git a/host/include/uhd/rfnoc/terminator_node_ctrl.hpp b/host/include/uhd/rfnoc/terminator_node_ctrl.hpp
index 56ff3a3c1..5909a6367 100644
--- a/host/include/uhd/rfnoc/terminator_node_ctrl.hpp
+++ b/host/include/uhd/rfnoc/terminator_node_ctrl.hpp
@@ -10,8 +10,7 @@
#include <uhd/rfnoc/node_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Abstract class for terminator nodes (i.e. nodes that terminate
* the flow graph).
diff --git a/host/include/uhd/rfnoc/tick_node_ctrl.hpp b/host/include/uhd/rfnoc/tick_node_ctrl.hpp
index 0b288274f..da75a209f 100644
--- a/host/include/uhd/rfnoc/tick_node_ctrl.hpp
+++ b/host/include/uhd/rfnoc/tick_node_ctrl.hpp
@@ -8,11 +8,10 @@
#ifndef INCLUDED_LIBUHD_TICK_NODE_CTRL_BASE_HPP
#define INCLUDED_LIBUHD_TICK_NODE_CTRL_BASE_HPP
-#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/rfnoc/constants.hpp>
+#include <uhd/rfnoc/node_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Tick-rate-aware node control
*
@@ -45,12 +44,14 @@ public:
* or it's a tick rate defined by an adjacent block.
* In that case, performs a graph search to figure out the tick rate.
*/
- double get_tick_rate(
- const std::set< node_ctrl_base::sptr > &_explored_nodes=std::set< node_ctrl_base::sptr >()
- );
+ double get_tick_rate(const std::set<node_ctrl_base::sptr>& _explored_nodes =
+ std::set<node_ctrl_base::sptr>());
protected:
- virtual double _get_tick_rate() { return RATE_UNDEFINED; };
+ virtual double _get_tick_rate()
+ {
+ return RATE_UNDEFINED;
+ };
}; /* class tick_node_ctrl */
diff --git a/host/include/uhd/rfnoc/traffic_counter.hpp b/host/include/uhd/rfnoc/traffic_counter.hpp
index bff04e38e..9a0546f17 100644
--- a/host/include/uhd/rfnoc/traffic_counter.hpp
+++ b/host/include/uhd/rfnoc/traffic_counter.hpp
@@ -9,47 +9,42 @@
#include <uhd/property_tree.hpp>
#include <stdint.h>
-#include <memory>
-#include <functional>
#include <type_traits>
+#include <functional>
+#include <memory>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
class traffic_counter
{
public:
typedef std::shared_ptr<traffic_counter> sptr;
- typedef std::function<void(const uint32_t addr, const uint32_t data)> write_reg_fn_t ;
- typedef std::function<uint64_t(const uint32_t addr)> read_reg_fn_t ;
+ typedef std::function<void(const uint32_t addr, const uint32_t data)> write_reg_fn_t;
+ typedef std::function<uint64_t(const uint32_t addr)> read_reg_fn_t;
- traffic_counter(
- uhd::property_tree::sptr tree,
+ traffic_counter(uhd::property_tree::sptr tree,
uhd::fs_path root_path,
write_reg_fn_t write_reg_fn,
- read_reg_fn_t read_reg_fn
- ) :
- _write_reg_fn(write_reg_fn),
- _read_reg_fn(read_reg_fn)
+ read_reg_fn_t read_reg_fn)
+ : _write_reg_fn(write_reg_fn), _read_reg_fn(read_reg_fn)
{
- const uint32_t id_reg_offset = 0;
+ const uint32_t id_reg_offset = 0;
const uint32_t first_counter_offset = 1;
- const uint64_t traffic_counter_id = 0x712AFF1C00000000ULL;
+ const uint64_t traffic_counter_id = 0x712AFF1C00000000ULL;
// Check traffic counter id to determine if it's present
const uint64_t id = _read_reg_fn(id_reg_offset);
// If present, add properties
- if (id == traffic_counter_id)
- {
- tree->create<bool>(root_path/"traffic_counter/enable")
+ if (id == traffic_counter_id) {
+ tree->create<bool>(root_path / "traffic_counter/enable")
.add_coerced_subscriber([this](const bool enable) {
- uint32_t val = enable? 1 : 0;
+ uint32_t val = enable ? 1 : 0;
return _write_reg_fn(0, val);
- }).set(false);
+ })
+ .set(false);
- const char* counters[] = {
- "bus_clock_ticks",
+ const char* counters[] = {"bus_clock_ticks",
"xbar_to_shell_xfer_count",
"xbar_to_shell_pkt_count",
"shell_to_xbar_xfer_count",
@@ -60,16 +55,17 @@ public:
"ce_to_shell_pkt_count"};
for (size_t i = 0; i < std::extent<decltype(counters)>::value; i++) {
- tree->create<uint64_t>(root_path/"traffic_counter"/counters[i])
+ tree->create<uint64_t>(root_path / "traffic_counter" / counters[i])
.set_publisher([this, i, first_counter_offset]() {
- return _read_reg_fn(i+first_counter_offset);
+ return _read_reg_fn(i + first_counter_offset);
});
}
}
}
+
private:
write_reg_fn_t _write_reg_fn;
- read_reg_fn_t _read_reg_fn;
+ read_reg_fn_t _read_reg_fn;
};
}} /* namespace uhd::rfnoc */
diff --git a/host/include/uhd/rfnoc/window_block_ctrl.hpp b/host/include/uhd/rfnoc/window_block_ctrl.hpp
index 093b34e67..ee5439b40 100644
--- a/host/include/uhd/rfnoc/window_block_ctrl.hpp
+++ b/host/include/uhd/rfnoc/window_block_ctrl.hpp
@@ -7,11 +7,10 @@
#ifndef INCLUDED_LIBUHD_RFNOC_WINDOW_BLOCK_CTRL_HPP
#define INCLUDED_LIBUHD_RFNOC_WINDOW_BLOCK_CTRL_HPP
-#include <uhd/rfnoc/source_block_ctrl_base.hpp>
#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
+#include <uhd/rfnoc/source_block_ctrl_base.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Block controller for the standard windowing RFNoC block.
*
@@ -24,22 +23,23 @@ namespace uhd {
* It will perform one window operation per incoming packet, treating it
* as a vector of samples.
*/
-class UHD_RFNOC_API window_block_ctrl : public source_block_ctrl_base, public sink_block_ctrl_base
+class UHD_RFNOC_API window_block_ctrl : public source_block_ctrl_base,
+ public sink_block_ctrl_base
{
public:
UHD_RFNOC_BLOCK_OBJECT(window_block_ctrl)
- static const size_t MAX_COEFF_VAL = 32767;
- static const uint32_t SR_WINDOW_LEN = 131; // Note: AXI config bus uses 129 & 130
- static const uint32_t RB_MAX_WINDOW_LEN = 0;
- static const uint32_t AXIS_WINDOW_LOAD = AXIS_CONFIG_BUS+0; // 2*0+0
- static const uint32_t AXIS_WINDOW_LOAD_TLAST = AXIS_CONFIG_BUS+1; // 2*0+1
+ static const size_t MAX_COEFF_VAL = 32767;
+ static const uint32_t SR_WINDOW_LEN = 131; // Note: AXI config bus uses 129 & 130
+ static const uint32_t RB_MAX_WINDOW_LEN = 0;
+ static const uint32_t AXIS_WINDOW_LOAD = AXIS_CONFIG_BUS + 0; // 2*0+0
+ static const uint32_t AXIS_WINDOW_LOAD_TLAST = AXIS_CONFIG_BUS + 1; // 2*0+1
//! Configure the window coefficients
//
// \p coeffs size determines the window length. If it longer than
// the maximum window length, throws a uhd::value_error.
- virtual void set_window(const std::vector<int> &coeffs) = 0;
+ virtual void set_window(const std::vector<int>& coeffs) = 0;
//! Returns the maximum window length.
virtual size_t get_max_len() const = 0;
diff --git a/host/include/uhd/stream.hpp b/host/include/uhd/stream.hpp
index 757198dde..133893cf9 100644
--- a/host/include/uhd/stream.hpp
+++ b/host/include/uhd/stream.hpp
@@ -9,16 +9,16 @@
#define INCLUDED_UHD_STREAM_HPP
#include <uhd/config.hpp>
-#include <uhd/types/metadata.hpp>
#include <uhd/types/device_addr.hpp>
-#include <uhd/types/stream_cmd.hpp>
+#include <uhd/types/metadata.hpp>
#include <uhd/types/ref_vector.hpp>
-#include <boost/utility.hpp>
+#include <uhd/types/stream_cmd.hpp>
#include <boost/shared_ptr.hpp>
-#include <vector>
+#include <boost/utility.hpp>
#include <string>
+#include <vector>
-namespace uhd{
+namespace uhd {
/*!
* A struct of parameters to construct a streamer.
@@ -55,13 +55,11 @@ namespace uhd{
* stream_args.args["block_port2"] = "1";
* \endcode
*/
-struct UHD_API stream_args_t{
-
+struct UHD_API stream_args_t
+{
//! Convenience constructor for streamer args
- stream_args_t(
- const std::string &cpu = "",
- const std::string &otw = ""
- ){
+ stream_args_t(const std::string& cpu = "", const std::string& otw = "")
+ {
cpu_format = cpu;
otw_format = otw;
}
@@ -95,12 +93,12 @@ struct UHD_API stream_args_t{
* - s16 - R16_1 R16_0
* - s8 - R8_3 R8_2 R8_1 R8_0
*
- * Setting the OTW ("over-the-wire") format is, in theory, transparent to the application,
- * but changing this can have some side effects. Using less bits for example (e.g. when going
- * from `otw_format` `sc16` to `sc8`) will reduce the dynamic range, and increases quantization
- * noise. On the other hand, it reduces the load on the data link and thus allows more bandwidth
- * (a USRP N210 can work with 25 MHz bandwidth for 16-Bit complex samples, and 50 MHz for 8-Bit
- * complex samples).
+ * Setting the OTW ("over-the-wire") format is, in theory, transparent to the
+ * application, but changing this can have some side effects. Using less bits for
+ * example (e.g. when going from `otw_format` `sc16` to `sc8`) will reduce the dynamic
+ * range, and increases quantization noise. On the other hand, it reduces the load on
+ * the data link and thus allows more bandwidth (a USRP N210 can work with 25 MHz
+ * bandwidth for 16-Bit complex samples, and 50 MHz for 8-Bit complex samples).
*/
std::string otw_format;
@@ -113,16 +111,17 @@ struct UHD_API stream_args_t{
* Set the "fullscale" to scale the samples in the host to the
* expected input range and/or output range of your application.
*
- * - peak: specifies a fractional sample level to calculate scaling with the sc8 wire format.
- * When using sc8 samples over the wire, the device must scale samples
- * (both on the host and in the device) to satisfy the dynamic range needs.
- * The peak value specifies a fraction of the maximum sample level (1.0 = 100%).
- * Set peak to max_sample_level/full_scale_level to ensure optimum dynamic range.
+ * - peak: specifies a fractional sample level to calculate scaling with the sc8 wire
+ * format. When using sc8 samples over the wire, the device must scale samples (both
+ * on the host and in the device) to satisfy the dynamic range needs. The peak value
+ * specifies a fraction of the maximum sample level (1.0 = 100%). Set peak to
+ * max_sample_level/full_scale_level to ensure optimum dynamic range.
*
* - underflow_policy: how the TX DSP should recover from underflow.
* Possible options are "next_burst" or "next_packet".
- * In the "next_burst" mode, the DSP drops incoming packets until a new burst is started.
- * In the "next_packet" mode, the DSP starts transmitting again at the next packet.
+ * In the "next_burst" mode, the DSP drops incoming packets until a new burst is
+ * started. In the "next_packet" mode, the DSP starts transmitting again at the next
+ * packet.
*
* - spp: (samples per packet) controls the size of RX packets.
* When not specified, the packets are always maximum frame size.
@@ -150,9 +149,9 @@ struct UHD_API stream_args_t{
* of `A:0 B:0`. This means the device has two channels available.
*
* Setting `stream_args.channels = (0, 1)` therefore configures MIMO streaming
- * from both channels. By switching the channel indexes, `stream_args.channels = (1, 0)`,
- * the channels are switched and the first channel of the USRP is mapped to
- * the second channel in the application.
+ * from both channels. By switching the channel indexes, `stream_args.channels = (1,
+ * 0)`, the channels are switched and the first channel of the USRP is mapped to the
+ * second channel in the application.
*
* If only a single channel is used for streaming, `stream_args.channels = (1,)` would
* only select a single channel (in this case, the second one). When streaming
@@ -167,7 +166,8 @@ struct UHD_API stream_args_t{
* It represents the layer between the samples on the host
* and samples inside the device's receive DSP processing.
*/
-class UHD_API rx_streamer : boost::noncopyable{
+class UHD_API rx_streamer : boost::noncopyable
+{
public:
typedef boost::shared_ptr<rx_streamer> sptr;
@@ -180,7 +180,7 @@ public:
virtual size_t get_max_num_samps(void) const = 0;
//! Typedef for a pointer to a single, or a collection of recv buffers
- typedef ref_vector<void *> buffs_type;
+ typedef ref_vector<void*> buffs_type;
/*!
* Receive buffers containing samples described by the metadata.
@@ -216,13 +216,11 @@ public:
* \param one_packet return after the first packet is received
* \return the number of samples received or 0 on error
*/
- virtual size_t recv(
- const buffs_type &buffs,
+ virtual size_t recv(const buffs_type& buffs,
const size_t nsamps_per_buff,
- rx_metadata_t &metadata,
- const double timeout = 0.1,
- const bool one_packet = false
- ) = 0;
+ rx_metadata_t& metadata,
+ const double timeout = 0.1,
+ const bool one_packet = false) = 0;
/*!
* Issue a stream command to the usrp device.
@@ -235,7 +233,7 @@ public:
*
* \param stream_cmd the stream command to issue
*/
- virtual void issue_stream_cmd(const stream_cmd_t &stream_cmd) = 0;
+ virtual void issue_stream_cmd(const stream_cmd_t& stream_cmd) = 0;
};
/*!
@@ -243,7 +241,8 @@ public:
* It represents the layer between the samples on the host
* and samples inside the device's transmit DSP processing.
*/
-class UHD_API tx_streamer : boost::noncopyable{
+class UHD_API tx_streamer : boost::noncopyable
+{
public:
typedef boost::shared_ptr<tx_streamer> sptr;
@@ -256,7 +255,7 @@ public:
virtual size_t get_max_num_samps(void) const = 0;
//! Typedef for a pointer to a single, or a collection of send buffers
- typedef ref_vector<const void *> buffs_type;
+ typedef ref_vector<const void*> buffs_type;
/*!
* Send buffers containing samples described by the metadata.
@@ -279,12 +278,10 @@ public:
* \param timeout the timeout in seconds to wait on a packet
* \return the number of samples sent
*/
- virtual size_t send(
- const buffs_type &buffs,
+ virtual size_t send(const buffs_type& buffs,
const size_t nsamps_per_buff,
- const tx_metadata_t &metadata,
- const double timeout = 0.1
- ) = 0;
+ const tx_metadata_t& metadata,
+ const double timeout = 0.1) = 0;
/*!
* Receive and asynchronous message from this TX stream.
@@ -293,10 +290,9 @@ public:
* \return true when the async_metadata is valid, false for timeout
*/
virtual bool recv_async_msg(
- async_metadata_t &async_metadata, double timeout = 0.1
- ) = 0;
+ async_metadata_t& async_metadata, double timeout = 0.1) = 0;
};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_STREAM_HPP */
diff --git a/host/include/uhd/transport/bounded_buffer.hpp b/host/include/uhd/transport/bounded_buffer.hpp
index 76966ed2d..354cff5e2 100644
--- a/host/include/uhd/transport/bounded_buffer.hpp
+++ b/host/include/uhd/transport/bounded_buffer.hpp
@@ -10,102 +10,109 @@
#include <uhd/transport/bounded_buffer.ipp> //detail
-namespace uhd{ namespace transport{
+namespace uhd { namespace transport {
+/*!
+ * Implement a templated bounded buffer:
+ * Used for passing elements between threads in a producer-consumer model.
+ * The bounded buffer implemented waits and timed waits with condition variables.
+ * The pop operation blocks on the bounded_buffer to become non empty.
+ * The push operation blocks on the bounded_buffer to become non full.
+ */
+template <typename elem_type> class bounded_buffer
+{
+public:
/*!
- * Implement a templated bounded buffer:
- * Used for passing elements between threads in a producer-consumer model.
- * The bounded buffer implemented waits and timed waits with condition variables.
- * The pop operation blocks on the bounded_buffer to become non empty.
- * The push operation blocks on the bounded_buffer to become non full.
+ * Create a new bounded buffer object.
+ * \param capacity the bounded_buffer capacity
*/
- template <typename elem_type> class bounded_buffer{
- public:
+ bounded_buffer(size_t capacity) : _detail(capacity)
+ {
+ /* NOP */
+ }
- /*!
- * Create a new bounded buffer object.
- * \param capacity the bounded_buffer capacity
- */
- bounded_buffer(size_t capacity):
- _detail(capacity)
- {
- /* NOP */
- }
-
- /*!
- * Push a new element into the bounded buffer immediately.
- * The element will not be pushed when the buffer is full.
- * \param elem the element reference pop to
- * \return false when the buffer is full
- */
- UHD_INLINE bool push_with_haste(const elem_type &elem){
- return _detail.push_with_haste(elem);
- }
+ /*!
+ * Push a new element into the bounded buffer immediately.
+ * The element will not be pushed when the buffer is full.
+ * \param elem the element reference pop to
+ * \return false when the buffer is full
+ */
+ UHD_INLINE bool push_with_haste(const elem_type& elem)
+ {
+ return _detail.push_with_haste(elem);
+ }
- /*!
- * Push a new element into the bounded buffer.
- * If the buffer is full prior to the push,
- * make room by popping the oldest element.
- * \param elem the new element to push
- * \return true if the element fit without popping for space
- */
- UHD_INLINE bool push_with_pop_on_full(const elem_type &elem){
- return _detail.push_with_pop_on_full(elem);
- }
+ /*!
+ * Push a new element into the bounded buffer.
+ * If the buffer is full prior to the push,
+ * make room by popping the oldest element.
+ * \param elem the new element to push
+ * \return true if the element fit without popping for space
+ */
+ UHD_INLINE bool push_with_pop_on_full(const elem_type& elem)
+ {
+ return _detail.push_with_pop_on_full(elem);
+ }
- /*!
- * Push a new element into the bounded_buffer.
- * Wait until the bounded_buffer becomes non-full.
- * \param elem the new element to push
- */
- UHD_INLINE void push_with_wait(const elem_type &elem){
- return _detail.push_with_wait(elem);
- }
+ /*!
+ * Push a new element into the bounded_buffer.
+ * Wait until the bounded_buffer becomes non-full.
+ * \param elem the new element to push
+ */
+ UHD_INLINE void push_with_wait(const elem_type& elem)
+ {
+ return _detail.push_with_wait(elem);
+ }
- /*!
- * Push a new element into the bounded_buffer.
- * Wait until the bounded_buffer becomes non-full or timeout.
- * \param elem the new element to push
- * \param timeout the timeout in seconds
- * \return false when the operation times out
- */
- UHD_INLINE bool push_with_timed_wait(const elem_type &elem, double timeout){
- return _detail.push_with_timed_wait(elem, timeout);
- }
+ /*!
+ * Push a new element into the bounded_buffer.
+ * Wait until the bounded_buffer becomes non-full or timeout.
+ * \param elem the new element to push
+ * \param timeout the timeout in seconds
+ * \return false when the operation times out
+ */
+ UHD_INLINE bool push_with_timed_wait(const elem_type& elem, double timeout)
+ {
+ return _detail.push_with_timed_wait(elem, timeout);
+ }
- /*!
- * Pop an element from the bounded buffer immediately.
- * The element will not be popped when the buffer is empty.
- * \param elem the element reference pop to
- * \return false when the buffer is empty
- */
- UHD_INLINE bool pop_with_haste(elem_type &elem){
- return _detail.pop_with_haste(elem);
- }
+ /*!
+ * Pop an element from the bounded buffer immediately.
+ * The element will not be popped when the buffer is empty.
+ * \param elem the element reference pop to
+ * \return false when the buffer is empty
+ */
+ UHD_INLINE bool pop_with_haste(elem_type& elem)
+ {
+ return _detail.pop_with_haste(elem);
+ }
- /*!
- * Pop an element from the bounded_buffer.
- * Wait until the bounded_buffer becomes non-empty.
- * \param elem the element reference pop to
- */
- UHD_INLINE void pop_with_wait(elem_type &elem){
- return _detail.pop_with_wait(elem);
- }
+ /*!
+ * Pop an element from the bounded_buffer.
+ * Wait until the bounded_buffer becomes non-empty.
+ * \param elem the element reference pop to
+ */
+ UHD_INLINE void pop_with_wait(elem_type& elem)
+ {
+ return _detail.pop_with_wait(elem);
+ }
- /*!
- * Pop an element from the bounded_buffer.
- * Wait until the bounded_buffer becomes non-empty or timeout.
- * \param elem the element reference pop to
- * \param timeout the timeout in seconds
- * \return false when the operation times out
- */
- UHD_INLINE bool pop_with_timed_wait(elem_type &elem, double timeout){
- return _detail.pop_with_timed_wait(elem, timeout);
- }
+ /*!
+ * Pop an element from the bounded_buffer.
+ * Wait until the bounded_buffer becomes non-empty or timeout.
+ * \param elem the element reference pop to
+ * \param timeout the timeout in seconds
+ * \return false when the operation times out
+ */
+ UHD_INLINE bool pop_with_timed_wait(elem_type& elem, double timeout)
+ {
+ return _detail.pop_with_timed_wait(elem, timeout);
+ }
- private: bounded_buffer_detail<elem_type> _detail;
- };
+private:
+ bounded_buffer_detail<elem_type> _detail;
+};
-}} //namespace
+}} // namespace uhd::transport
#endif /* INCLUDED_UHD_TRANSPORT_BOUNDED_BUFFER_HPP */
diff --git a/host/include/uhd/transport/buffer_pool.hpp b/host/include/uhd/transport/buffer_pool.hpp
index 0ad835c1b..769c78180 100644
--- a/host/include/uhd/transport/buffer_pool.hpp
+++ b/host/include/uhd/transport/buffer_pool.hpp
@@ -9,43 +9,41 @@
#define INCLUDED_UHD_TRANSPORT_BUFFER_POOL_HPP
#include <uhd/config.hpp>
-#include <boost/utility.hpp>
#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
+
+namespace uhd { namespace transport {
+
+/*!
+ * A buffer pool manages memory for a homogeneous set of buffers.
+ * Each buffer is the pool start at a 16-byte alignment boundary.
+ */
+class UHD_API buffer_pool : boost::noncopyable
+{
+public:
+ typedef boost::shared_ptr<buffer_pool> sptr;
+ typedef void* ptr_type;
-namespace uhd{ namespace transport{
+ virtual ~buffer_pool(void) = 0;
/*!
- * A buffer pool manages memory for a homogeneous set of buffers.
- * Each buffer is the pool start at a 16-byte alignment boundary.
+ * Make a new buffer pool.
+ * \param num_buffs the number of buffers to allocate
+ * \param buff_size the size of each buffer in bytes
+ * \param alignment the alignment boundary in bytes
+ * \return a new buffer pool buff_size X num_buffs
*/
- class UHD_API buffer_pool : boost::noncopyable{
- public:
- typedef boost::shared_ptr<buffer_pool> sptr;
- typedef void * ptr_type;
-
- virtual ~buffer_pool(void) = 0;
-
- /*!
- * Make a new buffer pool.
- * \param num_buffs the number of buffers to allocate
- * \param buff_size the size of each buffer in bytes
- * \param alignment the alignment boundary in bytes
- * \return a new buffer pool buff_size X num_buffs
- */
- static sptr make(
- const size_t num_buffs,
- const size_t buff_size,
- const size_t alignment = 16
- );
-
- //! Get a pointer to the buffer start at the specified index
- virtual ptr_type at(const size_t index) const = 0;
-
- //! Get the number of buffers in this pool
- virtual size_t size(void) const = 0;
- };
-
-}} //namespace
+ static sptr make(
+ const size_t num_buffs, const size_t buff_size, const size_t alignment = 16);
+
+ //! Get a pointer to the buffer start at the specified index
+ virtual ptr_type at(const size_t index) const = 0;
+
+ //! Get the number of buffers in this pool
+ virtual size_t size(void) const = 0;
+};
+
+}} // namespace uhd::transport
#endif /* INCLUDED_UHD_TRANSPORT_BUFFER_POOL_HPP */
diff --git a/host/include/uhd/transport/chdr.hpp b/host/include/uhd/transport/chdr.hpp
index 64260fbfc..f4b5c91f1 100644
--- a/host/include/uhd/transport/chdr.hpp
+++ b/host/include/uhd/transport/chdr.hpp
@@ -10,7 +10,7 @@
#include <uhd/transport/vrt_if_packet.hpp>
-namespace uhd{ namespace transport{ namespace vrt{
+namespace uhd { namespace transport { namespace vrt {
/*! \brief CHDR related function
*
@@ -34,70 +34,59 @@ namespace uhd{ namespace transport{ namespace vrt{
*
* In the unpacker, these values will be set accordingly.
*/
-namespace chdr{
+namespace chdr {
- //! The maximum number of 64-bit words in a CHDR header
- static const size_t max_if_hdr_words64 = 2; // CHDR + tsf (fractional timestamp)
+//! The maximum number of 64-bit words in a CHDR header
+static const size_t max_if_hdr_words64 = 2; // CHDR + tsf (fractional timestamp)
- /*!
- * Pack a CHDR header from metadata (big endian format).
- *
- * See \ref vrt_pack_contract, but `link_type` is assumed to be
- * `LINK_TYPE_CHDR`.
- *
- * \param packet_buff memory to write the packed vrt header
- * \param if_packet_info the if packet info (read/write)
- */
- UHD_API void if_hdr_pack_be(
- uint32_t *packet_buff,
- if_packet_info_t &if_packet_info
- );
+/*!
+ * Pack a CHDR header from metadata (big endian format).
+ *
+ * See \ref vrt_pack_contract, but `link_type` is assumed to be
+ * `LINK_TYPE_CHDR`.
+ *
+ * \param packet_buff memory to write the packed vrt header
+ * \param if_packet_info the if packet info (read/write)
+ */
+UHD_API void if_hdr_pack_be(uint32_t* packet_buff, if_packet_info_t& if_packet_info);
- /*!
- * Unpack a CHDR header to metadata (big endian format).
- *
- * See \ref vrt_unpack_contract, but `link_type` is assumed to be
- * `LINK_TYPE_CHDR`.
- *
- * \param packet_buff memory to read the packed vrt header
- * \param if_packet_info the if packet info (read/write)
- */
- UHD_API void if_hdr_unpack_be(
- const uint32_t *packet_buff,
- if_packet_info_t &if_packet_info
- );
+/*!
+ * Unpack a CHDR header to metadata (big endian format).
+ *
+ * See \ref vrt_unpack_contract, but `link_type` is assumed to be
+ * `LINK_TYPE_CHDR`.
+ *
+ * \param packet_buff memory to read the packed vrt header
+ * \param if_packet_info the if packet info (read/write)
+ */
+UHD_API void if_hdr_unpack_be(
+ const uint32_t* packet_buff, if_packet_info_t& if_packet_info);
- /*!
- * Pack a CHDR header from metadata (little endian format).
- *
- * See \ref vrt_pack_contract, but `link_type` is assumed to be
- * `LINK_TYPE_CHDR`.
- *
- * \param packet_buff memory to write the packed vrt header
- * \param if_packet_info the if packet info (read/write)
- */
- UHD_API void if_hdr_pack_le(
- uint32_t *packet_buff,
- if_packet_info_t &if_packet_info
- );
+/*!
+ * Pack a CHDR header from metadata (little endian format).
+ *
+ * See \ref vrt_pack_contract, but `link_type` is assumed to be
+ * `LINK_TYPE_CHDR`.
+ *
+ * \param packet_buff memory to write the packed vrt header
+ * \param if_packet_info the if packet info (read/write)
+ */
+UHD_API void if_hdr_pack_le(uint32_t* packet_buff, if_packet_info_t& if_packet_info);
- /*!
- * Unpack a CHDR header to metadata (little endian format).
- *
- * See \ref vrt_unpack_contract, but `link_type` is assumed to be
- * `LINK_TYPE_CHDR`.
- *
- * \param packet_buff memory to read the packed vrt header
- * \param if_packet_info the if packet info (read/write)
- */
- UHD_API void if_hdr_unpack_le(
- const uint32_t *packet_buff,
- if_packet_info_t &if_packet_info
- );
+/*!
+ * Unpack a CHDR header to metadata (little endian format).
+ *
+ * See \ref vrt_unpack_contract, but `link_type` is assumed to be
+ * `LINK_TYPE_CHDR`.
+ *
+ * \param packet_buff memory to read the packed vrt header
+ * \param if_packet_info the if packet info (read/write)
+ */
+UHD_API void if_hdr_unpack_le(
+ const uint32_t* packet_buff, if_packet_info_t& if_packet_info);
-} //namespace chdr
+} // namespace chdr
-}}} //namespace uhd::transport::vrt
+}}} // namespace uhd::transport::vrt
#endif /* INCLUDED_UHD_TRANSPORT_CHDR_HPP */
-
diff --git a/host/include/uhd/transport/if_addrs.hpp b/host/include/uhd/transport/if_addrs.hpp
index 0458fe4f7..b97c6156e 100644
--- a/host/include/uhd/transport/if_addrs.hpp
+++ b/host/include/uhd/transport/if_addrs.hpp
@@ -12,25 +12,26 @@
#include <string>
#include <vector>
-namespace uhd{ namespace transport{
-
- /*!
- * The address for a network interface.
- */
- struct UHD_API if_addrs_t{
- std::string inet;
- std::string mask;
- std::string bcast;
- };
-
- /*!
- * Get a list of network interface addresses.
- * The internal implementation is system-dependent.
- * \return a vector of if addrs
- */
- UHD_API std::vector<if_addrs_t> get_if_addrs(void);
-
-}} //namespace
+namespace uhd { namespace transport {
+
+/*!
+ * The address for a network interface.
+ */
+struct UHD_API if_addrs_t
+{
+ std::string inet;
+ std::string mask;
+ std::string bcast;
+};
+
+/*!
+ * Get a list of network interface addresses.
+ * The internal implementation is system-dependent.
+ * \return a vector of if addrs
+ */
+UHD_API std::vector<if_addrs_t> get_if_addrs(void);
+
+}} // namespace uhd::transport
#endif /* INCLUDED_UHD_TRANSPORT_IF_ADDRS_HPP */
diff --git a/host/include/uhd/transport/muxed_zero_copy_if.hpp b/host/include/uhd/transport/muxed_zero_copy_if.hpp
index 0cf293a18..f69e6f288 100644
--- a/host/include/uhd/transport/muxed_zero_copy_if.hpp
+++ b/host/include/uhd/transport/muxed_zero_copy_if.hpp
@@ -8,11 +8,11 @@
#ifndef INCLUDED_LIBUHD_TRANSPORT_MUXED_ZERO_COPY_IF_HPP
#define INCLUDED_LIBUHD_TRANSPORT_MUXED_ZERO_COPY_IF_HPP
-#include <uhd/transport/zero_copy.hpp>
#include <uhd/config.hpp>
+#include <uhd/transport/zero_copy.hpp>
+#include <stdint.h>
#include <boost/function.hpp>
#include <boost/noncopyable.hpp>
-#include <stdint.h>
namespace uhd { namespace transport {
@@ -25,7 +25,8 @@ namespace uhd { namespace transport {
* appropriate virtual streams with the given classifier
* function. A worker therad is spawned to handle the demuxing.
*/
-class muxed_zero_copy_if : private boost::noncopyable {
+class muxed_zero_copy_if : private boost::noncopyable
+{
public:
typedef boost::shared_ptr<muxed_zero_copy_if> sptr;
@@ -54,9 +55,11 @@ public:
virtual size_t get_num_dropped_frames() const = 0;
//! Make a new demuxer from a transport and parameters
- static sptr make(zero_copy_if::sptr base_xport, stream_classifier_fn classify_fn, size_t max_streams);
+ static sptr make(zero_copy_if::sptr base_xport,
+ stream_classifier_fn classify_fn,
+ size_t max_streams);
};
-}} //namespace uhd::transport
+}} // namespace uhd::transport
#endif /* INCLUDED_LIBUHD_TRANSPORT_MUXED_ZERO_COPY_IF_HPP */
diff --git a/host/include/uhd/transport/nirio/rpc/rpc_client.hpp b/host/include/uhd/transport/nirio/rpc/rpc_client.hpp
index bf309ad28..536210c31 100644
--- a/host/include/uhd/transport/nirio/rpc/rpc_client.hpp
+++ b/host/include/uhd/transport/nirio/rpc/rpc_client.hpp
@@ -8,52 +8,54 @@
#ifndef INCLUDED_RPC_CLIENT_HPP
#define INCLUDED_RPC_CLIENT_HPP
+#include "rpc_common.hpp"
+#include <uhd/utils/log.hpp>
#include <boost/asio.hpp>
#include <boost/smart_ptr.hpp>
-#include <boost/thread/thread.hpp>
#include <boost/thread/condition_variable.hpp>
-#include "rpc_common.hpp"
-#include <uhd/utils/log.hpp>
+#include <boost/thread/thread.hpp>
namespace uhd { namespace usrprio_rpc {
class rpc_client : private boost::noncopyable
{
public:
- static const uint32_t CURRENT_VERSION = 1;
+ static const uint32_t CURRENT_VERSION = 1;
static const uint32_t OLDEST_COMPATIBLE_VERSION = 1;
- rpc_client(
- const std::string& server,
+ rpc_client(const std::string& server,
const std::string& port,
uint32_t process_id,
uint32_t host_id);
~rpc_client();
- const boost::system::error_code& call(
- func_id_t func_id,
+ const boost::system::error_code& call(func_id_t func_id,
const func_args_writer_t& in_args,
- func_args_reader_t &out_args,
+ func_args_reader_t& out_args,
boost::posix_time::milliseconds timeout);
- inline const boost::system::error_code& status() const {
+ inline const boost::system::error_code& status() const
+ {
return _exec_err;
}
/* [Possible boost::system::error_code values]
* boost::asio::error::connection_aborted: Network connection failure
* boost::asio::error::eof: Network connection closed cleanly
- * boost::asio::error::connection_refused: Software handshake failure (version mismatch, etc)
- * boost::asio::error::timed_out: RPC call timed out
+ * boost::asio::error::connection_refused: Software handshake failure (version
+ * mismatch, etc) boost::asio::error::timed_out: RPC call timed out
* boost::asio::error::operation_aborted: RPC call aborted but connection alive
*/
private:
- void _handle_response_hdr(const boost::system::error_code& err, size_t transferred, size_t expected);
- void _handle_response_data(const boost::system::error_code& err, size_t transferred, size_t expected);
+ void _handle_response_hdr(
+ const boost::system::error_code& err, size_t transferred, size_t expected);
+ void _handle_response_data(
+ const boost::system::error_code& err, size_t transferred, size_t expected);
void _wait_for_next_response_header();
- inline void _stop_io_service() {
+ inline void _stop_io_service()
+ {
if (_io_service_thread.get()) {
UHD_LOGGER_INFO("NIRIO") << "rpc_client stopping...";
_io_service.stop();
@@ -63,22 +65,22 @@ private:
}
}
- //Services
- boost::asio::io_service _io_service;
- boost::scoped_ptr<boost::thread> _io_service_thread;
- boost::asio::ip::tcp::socket _socket;
- //Handshake info
- hshake_args_t _hshake_args_client;
- hshake_args_t _hshake_args_server;
- //In-out function args
- func_xport_buf_t _request;
- func_xport_buf_t _response;
- //Synchronization
- boost::mutex _mutex;
- boost::condition_variable _exec_gate;
- boost::system::error_code _exec_err;
+ // Services
+ boost::asio::io_service _io_service;
+ boost::scoped_ptr<boost::thread> _io_service_thread;
+ boost::asio::ip::tcp::socket _socket;
+ // Handshake info
+ hshake_args_t _hshake_args_client;
+ hshake_args_t _hshake_args_server;
+ // In-out function args
+ func_xport_buf_t _request;
+ func_xport_buf_t _response;
+ // Synchronization
+ boost::mutex _mutex;
+ boost::condition_variable _exec_gate;
+ boost::system::error_code _exec_err;
};
-}}
+}} // namespace uhd::usrprio_rpc
#endif /* INCLUDED_RPC_CLIENT_HPP */
diff --git a/host/include/uhd/transport/nirio/rpc/rpc_common.hpp b/host/include/uhd/transport/nirio/rpc/rpc_common.hpp
index c1261f634..2384c0f61 100644
--- a/host/include/uhd/transport/nirio/rpc/rpc_common.hpp
+++ b/host/include/uhd/transport/nirio/rpc/rpc_common.hpp
@@ -10,139 +10,150 @@
#define USE_BINARY_ARCHIVE 0
-#include <string>
#include <iostream>
#include <sstream>
+#include <string>
#include <vector>
#if (USE_BINARY_ARCHIVE)
- #include <boost/archive/binary_oarchive.hpp>
- #include <boost/archive/binary_iarchive.hpp>
+# include <boost/archive/binary_iarchive.hpp>
+# include <boost/archive/binary_oarchive.hpp>
#else
- #include <boost/archive/text_oarchive.hpp>
- #include <boost/archive/text_iarchive.hpp>
+# include <boost/archive/text_iarchive.hpp>
+# include <boost/archive/text_oarchive.hpp>
#endif
#include <stdint.h>
namespace uhd { namespace usrprio_rpc {
//[Over-the-wire] IDs
-typedef int32_t func_id_t;
+typedef int32_t func_id_t;
typedef uint64_t client_id_t;
#define build_client_id(host_id, process_id) \
((static_cast<uint64_t>(host_id) << 32) | static_cast<uint64_t>(process_id))
-#define get_process_id_from_client_id(client_id) \
- (static_cast<int32_t>(client_id))
-#define get_host_id_from_client_id(client_id) \
- (static_cast<uint32_t>(client_id >> 32))
+#define get_process_id_from_client_id(client_id) (static_cast<int32_t>(client_id))
+#define get_host_id_from_client_id(client_id) (static_cast<uint32_t>(client_id >> 32))
//[Over-the-wire] Handshake format
-struct hshake_args_t {
+struct hshake_args_t
+{
uint32_t version;
uint32_t oldest_comp_version;
- int32_t boost_archive_version;
- client_id_t client_id;
+ int32_t boost_archive_version;
+ client_id_t client_id;
};
//[Over-the-wire] Header for RPC request and response
-class func_args_header_t {
+class func_args_header_t
+{
public:
- func_id_t func_id;
- client_id_t client_id;
+ func_id_t func_id;
+ client_id_t client_id;
uint32_t func_args_size;
- static bool match_function(const func_args_header_t& a, const func_args_header_t& b) {
+ static bool match_function(const func_args_header_t& a, const func_args_header_t& b)
+ {
return ((a.func_id == b.func_id) && (a.client_id == b.client_id));
}
};
//[Internal] Storage for RPC header and arguments
-class func_xport_buf_t {
+class func_xport_buf_t
+{
public:
- func_args_header_t header;
- std::vector<char> data;
+ func_args_header_t header;
+ std::vector<char> data;
};
//[Internal] Serializer for RPC input parameters
-class func_args_writer_t {
+class func_args_writer_t
+{
public:
func_args_writer_t() : _stream(), _archive(_stream, boost::archive::no_header) {}
- template<typename data_t>
- void push(const data_t& d) {
+ template <typename data_t> void push(const data_t& d)
+ {
_archive << d;
}
- template<typename data_t>
- func_args_writer_t& operator<< (const data_t& data) {
+ template <typename data_t> func_args_writer_t& operator<<(const data_t& data)
+ {
push(data);
return *this;
}
- void store(std::vector<char>& data) const {
+ void store(std::vector<char>& data) const
+ {
const std::string& str = _stream.str();
data.resize(str.length());
data.assign((char*)str.c_str(), ((char*)str.c_str()) + str.length());
}
private:
- std::ostringstream _stream;
+ std::ostringstream _stream;
#if (USE_BINARY_ARCHIVE)
boost::archive::binary_oarchive _archive;
#else
- boost::archive::text_oarchive _archive;
+ boost::archive::text_oarchive _archive;
#endif
};
//[Internal] Deserializer for RPC output parameters
-class func_args_reader_t {
+class func_args_reader_t
+{
public:
func_args_reader_t() : _stream(), _archive() {}
- template<typename data_t>
- void pull(data_t& d) const {
- if (_archive) (*_archive) >> d;
+ template <typename data_t> void pull(data_t& d) const
+ {
+ if (_archive)
+ (*_archive) >> d;
}
- template<typename data_t>
- const func_args_reader_t& operator>> (data_t& data) const {
+ template <typename data_t> const func_args_reader_t& operator>>(data_t& data) const
+ {
pull(data);
return *this;
}
- void load(const std::vector<char>& data) {
+ void load(const std::vector<char>& data)
+ {
_stream.str(std::string(data.begin(), data.end()));
#if (USE_BINARY_ARCHIVE)
- _archive.reset(new boost::archive::binary_iarchive(_stream, boost::archive::no_header));
+ _archive.reset(
+ new boost::archive::binary_iarchive(_stream, boost::archive::no_header));
#else
- _archive.reset(new boost::archive::text_iarchive(_stream, boost::archive::no_header));
+ _archive.reset(
+ new boost::archive::text_iarchive(_stream, boost::archive::no_header));
#endif
}
private:
- std::istringstream _stream;
+ std::istringstream _stream;
#if (USE_BINARY_ARCHIVE)
- boost::scoped_ptr<boost::archive::binary_iarchive> _archive;
+ boost::scoped_ptr<boost::archive::binary_iarchive> _archive;
#else
- boost::scoped_ptr<boost::archive::text_iarchive> _archive;
+ boost::scoped_ptr<boost::archive::text_iarchive> _archive;
#endif
};
-class boost_serialization_archive_utils {
+class boost_serialization_archive_utils
+{
public:
- static int32_t get_version() {
- #if (USE_BINARY_ARCHIVE)
+ static int32_t get_version()
+ {
+#if (USE_BINARY_ARCHIVE)
typedef boost::archive::binary_oarchive archive_t;
- #else
- typedef boost::archive::text_oarchive archive_t;
- #endif
+#else
+ typedef boost::archive::text_oarchive archive_t;
+#endif
std::ostringstream stream;
archive_t dummy_archive(stream, boost::archive::no_header);
return static_cast<int32_t>(dummy_archive.get_library_version());
}
};
-}}
+}} // namespace uhd::usrprio_rpc
#undef USE_BINARY_ARCHIVE
diff --git a/host/include/uhd/transport/nirio/rpc/usrprio_rpc_client.hpp b/host/include/uhd/transport/nirio/rpc/usrprio_rpc_client.hpp
index b05cf0d5d..1d67d9286 100644
--- a/host/include/uhd/transport/nirio/rpc/usrprio_rpc_client.hpp
+++ b/host/include/uhd/transport/nirio/rpc/usrprio_rpc_client.hpp
@@ -8,51 +8,47 @@
#ifndef INCLUDED_USRPRIO_RPC_CLIENT_HPP
#define INCLUDED_USRPRIO_RPC_CLIENT_HPP
-#include <uhd/transport/nirio/rpc/rpc_common.hpp>
#include <uhd/transport/nirio/rpc/rpc_client.hpp>
+#include <uhd/transport/nirio/rpc/rpc_common.hpp>
#include <uhd/transport/nirio/rpc/usrprio_rpc_common.hpp>
#include <uhd/transport/nirio/status.h>
namespace uhd { namespace usrprio_rpc {
-class UHD_API usrprio_rpc_client {
+class UHD_API usrprio_rpc_client
+{
public:
- usrprio_rpc_client(
- std::string server,
- std::string port);
+ usrprio_rpc_client(std::string server, std::string port);
~usrprio_rpc_client();
- inline void set_rpc_timeout(boost::posix_time::milliseconds timeout_in_ms) {
+ inline void set_rpc_timeout(boost::posix_time::milliseconds timeout_in_ms)
+ {
_timeout = timeout_in_ms;
}
- inline nirio_status get_ctor_status() {
+ inline nirio_status get_ctor_status()
+ {
return _ctor_status;
}
- nirio_status niusrprio_enumerate(
- NIUSRPRIO_ENUMERATE_ARGS);
- nirio_status niusrprio_open_session(
- NIUSRPRIO_OPEN_SESSION_ARGS);
- nirio_status niusrprio_close_session(
- NIUSRPRIO_CLOSE_SESSION_ARGS);
- nirio_status niusrprio_reset_device(
- NIUSRPRIO_RESET_SESSION_ARGS);
+ nirio_status niusrprio_enumerate(NIUSRPRIO_ENUMERATE_ARGS);
+ nirio_status niusrprio_open_session(NIUSRPRIO_OPEN_SESSION_ARGS);
+ nirio_status niusrprio_close_session(NIUSRPRIO_CLOSE_SESSION_ARGS);
+ nirio_status niusrprio_reset_device(NIUSRPRIO_RESET_SESSION_ARGS);
nirio_status niusrprio_download_bitstream_to_fpga(
NIUSRPRIO_DOWNLOAD_BITSTREAM_TO_FPGA_ARGS);
- nirio_status niusrprio_get_interface_path(
- NIUSRPRIO_GET_INTERFACE_PATH_ARGS);
- nirio_status niusrprio_download_fpga_to_flash(
- NIUSRPRIO_DOWNLOAD_FPGA_TO_FLASH_ARGS);
+ nirio_status niusrprio_get_interface_path(NIUSRPRIO_GET_INTERFACE_PATH_ARGS);
+ nirio_status niusrprio_download_fpga_to_flash(NIUSRPRIO_DOWNLOAD_FPGA_TO_FLASH_ARGS);
private:
- static nirio_status _boost_error_to_nirio_status(const boost::system::error_code& err);
+ static nirio_status _boost_error_to_nirio_status(
+ const boost::system::error_code& err);
- rpc_client _rpc_client;
+ rpc_client _rpc_client;
boost::posix_time::milliseconds _timeout;
- nirio_status _ctor_status;
+ nirio_status _ctor_status;
};
-}}
+}} // namespace uhd::usrprio_rpc
#endif /* INCLUDED_USRPRIO_RPC_CLIENT_HPP */
diff --git a/host/include/uhd/transport/nirio/rpc/usrprio_rpc_common.hpp b/host/include/uhd/transport/nirio/rpc/usrprio_rpc_common.hpp
index 12cf5f385..71d8f7047 100644
--- a/host/include/uhd/transport/nirio/rpc/usrprio_rpc_common.hpp
+++ b/host/include/uhd/transport/nirio/rpc/usrprio_rpc_common.hpp
@@ -12,9 +12,9 @@
namespace uhd { namespace usrprio_rpc {
-//Function IDs
+// Function IDs
-static const func_id_t NIUSRPRIO_FUNC_BASE = 0x100;
+static const func_id_t NIUSRPRIO_FUNC_BASE = 0x100;
static const func_id_t NIUSRPRIO_ENUMERATE = NIUSRPRIO_FUNC_BASE + 0;
static const func_id_t NIUSRPRIO_OPEN_SESSION = NIUSRPRIO_FUNC_BASE + 1;
@@ -24,52 +24,44 @@ static const func_id_t NIUSRPRIO_DOWNLOAD_BITSTREAM_TO_FPGA = NIUSRPRIO_FUNC_BAS
static const func_id_t NIUSRPRIO_GET_INTERFACE_PATH = NIUSRPRIO_FUNC_BASE + 5;
static const func_id_t NIUSRPRIO_DOWNLOAD_FPGA_TO_FLASH = NIUSRPRIO_FUNC_BASE + 6;
-//Function Args
+// Function Args
-struct usrprio_device_info {
+struct usrprio_device_info
+{
uint32_t interface_num;
- std::string resource_name;
- std::string pcie_serial_num;
- std::string interface_path;
+ std::string resource_name;
+ std::string pcie_serial_num;
+ std::string interface_path;
- template <typename Archive>
- void serialize(Archive& ar, const unsigned int version)
+ template <typename Archive> void serialize(Archive& ar, const unsigned int version)
{
- if (version || !version) { //Suppress unused warning
- ar & interface_num;
- ar & resource_name;
- ar & pcie_serial_num;
- ar & interface_path;
+ if (version || !version) { // Suppress unused warning
+ ar& interface_num;
+ ar& resource_name;
+ ar& pcie_serial_num;
+ ar& interface_path;
}
}
};
typedef std::vector<usrprio_device_info> usrprio_device_info_vtr;
-#define NIUSRPRIO_ENUMERATE_ARGS \
- usrprio_device_info_vtr& device_info_vtr
+#define NIUSRPRIO_ENUMERATE_ARGS usrprio_device_info_vtr& device_info_vtr
-#define NIUSRPRIO_OPEN_SESSION_ARGS \
- const std::string& resource, \
- const std::string& path, \
- const std::string& signature, \
- const uint16_t& download_fpga
+#define NIUSRPRIO_OPEN_SESSION_ARGS \
+ const std::string &resource, const std::string &path, const std::string &signature, \
+ const uint16_t &download_fpga
-#define NIUSRPRIO_CLOSE_SESSION_ARGS \
- const std::string& resource
+#define NIUSRPRIO_CLOSE_SESSION_ARGS const std::string& resource
-#define NIUSRPRIO_RESET_SESSION_ARGS \
- const std::string& resource
+#define NIUSRPRIO_RESET_SESSION_ARGS const std::string& resource
-#define NIUSRPRIO_DOWNLOAD_BITSTREAM_TO_FPGA_ARGS \
- const std::string& resource
+#define NIUSRPRIO_DOWNLOAD_BITSTREAM_TO_FPGA_ARGS const std::string& resource
-#define NIUSRPRIO_GET_INTERFACE_PATH_ARGS \
- const std::string& resource, \
- std::string& interface_path
+#define NIUSRPRIO_GET_INTERFACE_PATH_ARGS \
+ const std::string &resource, std::string &interface_path
-#define NIUSRPRIO_DOWNLOAD_FPGA_TO_FLASH_ARGS \
- const std::string& resource, \
- const std::string& bitstream_path
-}}
+#define NIUSRPRIO_DOWNLOAD_FPGA_TO_FLASH_ARGS \
+ const std::string &resource, const std::string &bitstream_path
+}} // namespace uhd::usrprio_rpc
#endif /* INCLUDED_USRPRIO_RPC_COMMON_HPP */
diff --git a/host/include/uhd/transport/nirio_zero_copy.hpp b/host/include/uhd/transport/nirio_zero_copy.hpp
index bc055d636..b5e4dea38 100644
--- a/host/include/uhd/transport/nirio_zero_copy.hpp
+++ b/host/include/uhd/transport/nirio_zero_copy.hpp
@@ -8,27 +8,26 @@
#ifndef INCLUDED_UHD_TRANSPORT_NIRIO_ZERO_COPY_HPP
#define INCLUDED_UHD_TRANSPORT_NIRIO_ZERO_COPY_HPP
-#include <uhd/transport/nirio/niusrprio_session.h>
#include <uhd/config.hpp>
+#include <uhd/transport/nirio/niusrprio_session.h>
#include <uhd/transport/zero_copy.hpp>
#include <uhd/types/device_addr.hpp>
-#include <boost/shared_ptr.hpp>
#include <stdint.h>
+#include <boost/shared_ptr.hpp>
-namespace uhd{ namespace transport{
+namespace uhd { namespace transport {
-class UHD_API nirio_zero_copy : public virtual zero_copy_if{
+class UHD_API nirio_zero_copy : public virtual zero_copy_if
+{
public:
typedef boost::shared_ptr<nirio_zero_copy> sptr;
- static sptr make(
- uhd::niusrprio::niusrprio_session::sptr fpga_session,
+ static sptr make(uhd::niusrprio::niusrprio_session::sptr fpga_session,
const uint32_t instance,
- const zero_copy_xport_params &default_buff_args,
- const device_addr_t &hints = device_addr_t()
- );
+ const zero_copy_xport_params& default_buff_args,
+ const device_addr_t& hints = device_addr_t());
};
-}} //namespace
+}} // namespace uhd::transport
#endif /* INCLUDED_UHD_TRANSPORT_NIRIO_ZERO_COPY_HPP */
diff --git a/host/include/uhd/transport/tcp_zero_copy.hpp b/host/include/uhd/transport/tcp_zero_copy.hpp
index d250f675a..4db68cec8 100644
--- a/host/include/uhd/transport/tcp_zero_copy.hpp
+++ b/host/include/uhd/transport/tcp_zero_copy.hpp
@@ -13,7 +13,7 @@
#include <uhd/types/device_addr.hpp>
#include <boost/shared_ptr.hpp>
-namespace uhd{ namespace transport{
+namespace uhd { namespace transport {
/*!
* The zero copy TCP transport.
@@ -37,13 +37,11 @@ struct UHD_API tcp_zero_copy : public virtual zero_copy_if
* \param port a string representing the destination port
* \param hints optional parameters to pass to the underlying transport
*/
- static zero_copy_if::sptr make(
- const std::string &addr,
- const std::string &port,
- const device_addr_t &hints = device_addr_t()
- );
+ static zero_copy_if::sptr make(const std::string& addr,
+ const std::string& port,
+ const device_addr_t& hints = device_addr_t());
};
-}} //namespace
+}} // namespace uhd::transport
#endif /* INCLUDED_UHD_TRANSPORT_TCP_ZERO_COPY_HPP */
diff --git a/host/include/uhd/transport/udp_constants.hpp b/host/include/uhd/transport/udp_constants.hpp
index 5d3f5dea0..6fe26424f 100644
--- a/host/include/uhd/transport/udp_constants.hpp
+++ b/host/include/uhd/transport/udp_constants.hpp
@@ -10,7 +10,8 @@
// Constants related to UDP (over Ethernet)
-static const size_t IP_PROTOCOL_MIN_MTU_SIZE = 576; //bytes
-static const size_t IP_PROTOCOL_UDP_PLUS_IP_HEADER = 28; //bytes. Note that this is the minimum value!
+static const size_t IP_PROTOCOL_MIN_MTU_SIZE = 576; // bytes
+static const size_t IP_PROTOCOL_UDP_PLUS_IP_HEADER =
+ 28; // bytes. Note that this is the minimum value!
#endif /* INCLUDED_UHD_TRANSPORT_UDP_CONSTANTS_HPP */
diff --git a/host/include/uhd/transport/udp_simple.hpp b/host/include/uhd/transport/udp_simple.hpp
index 3683ed8e0..19164d80b 100644
--- a/host/include/uhd/transport/udp_simple.hpp
+++ b/host/include/uhd/transport/udp_simple.hpp
@@ -11,19 +11,21 @@
#include <uhd/config.hpp>
#include <uhd/types/serial.hpp>
#include <boost/asio/buffer.hpp>
-#include <boost/utility.hpp>
#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
-namespace uhd{ namespace transport{
+namespace uhd { namespace transport {
-class UHD_API udp_simple : boost::noncopyable{
+class UHD_API udp_simple : boost::noncopyable
+{
public:
typedef boost::shared_ptr<udp_simple> sptr;
virtual ~udp_simple(void) = 0;
//! The maximum number of bytes per udp packet.
- static const size_t mtu = 1500 - 20 - 8; //default ipv4 mtu - ipv4 header - udp header
+ static const size_t mtu = 1500 - 20 - 8; // default ipv4 mtu - ipv4 header - udp
+ // header
/*!
* Make a new connected udp transport:
@@ -38,7 +40,7 @@ public:
* \param addr a string representing the destination address
* \param port a string representing the destination port
*/
- static sptr make_connected(const std::string &addr, const std::string &port);
+ static sptr make_connected(const std::string& addr, const std::string& port);
/*!
* Make a new broadcasting udp transport:
@@ -52,7 +54,7 @@ public:
* \param addr a string representing the destination address
* \param port a string representing the destination port
*/
- static sptr make_broadcast(const std::string &addr, const std::string &port);
+ static sptr make_broadcast(const std::string& addr, const std::string& port);
/*!
* Make a UART interface from a UDP transport.
@@ -67,7 +69,7 @@ public:
* \param buff single asio buffer
* \return the number of bytes sent
*/
- virtual size_t send(const boost::asio::const_buffer &buff) = 0;
+ virtual size_t send(const boost::asio::const_buffer& buff) = 0;
/*!
* Receive into the provided buffer.
@@ -76,7 +78,8 @@ public:
* \param timeout the timeout in seconds
* \return the number of bytes received or zero on timeout
*/
- virtual size_t recv(const boost::asio::mutable_buffer &buff, double timeout = 0.1) = 0;
+ virtual size_t recv(
+ const boost::asio::mutable_buffer& buff, double timeout = 0.1) = 0;
/*!
* Get the last IP address as seen by recv().
@@ -90,6 +93,6 @@ public:
virtual std::string get_send_addr(void) = 0;
};
-}} //namespace
+}} // namespace uhd::transport
#endif /* INCLUDED_UHD_TRANSPORT_UDP_SIMPLE_HPP */
diff --git a/host/include/uhd/transport/udp_zero_copy.hpp b/host/include/uhd/transport/udp_zero_copy.hpp
index ff55a58da..2fedad99a 100644
--- a/host/include/uhd/transport/udp_zero_copy.hpp
+++ b/host/include/uhd/transport/udp_zero_copy.hpp
@@ -13,7 +13,7 @@
#include <uhd/types/device_addr.hpp>
#include <boost/shared_ptr.hpp>
-namespace uhd{ namespace transport{
+namespace uhd { namespace transport {
/*!
* A zero copy udp transport provides an efficient way to handle data.
@@ -25,11 +25,13 @@ namespace uhd{ namespace transport{
* If no platform specific solution is available, make returns a boost asio
* implementation that wraps the functionality around a standard send/recv calls.
*/
-class UHD_API udp_zero_copy : public virtual zero_copy_if{
+class UHD_API udp_zero_copy : public virtual zero_copy_if
+{
public:
- struct buff_params {
- size_t recv_buff_size;
- size_t send_buff_size;
+ struct buff_params
+ {
+ size_t recv_buff_size;
+ size_t send_buff_size;
};
typedef boost::shared_ptr<udp_zero_copy> sptr;
@@ -50,13 +52,11 @@ public:
* \param[out] buff_params_out Returns the actual buffer sizes
* \param hints optional parameters to pass to the underlying transport
*/
- static sptr make(
- const std::string &addr,
- const std::string &port,
- const zero_copy_xport_params &default_buff_args,
+ static sptr make(const std::string& addr,
+ const std::string& port,
+ const zero_copy_xport_params& default_buff_args,
udp_zero_copy::buff_params& buff_params_out,
- const device_addr_t &hints = device_addr_t()
- );
+ const device_addr_t& hints = device_addr_t());
/*! Return the local port of the UDP connection
*
@@ -74,6 +74,6 @@ public:
virtual std::string get_local_addr(void) const = 0;
};
-}} //namespace
+}} // namespace uhd::transport
#endif /* INCLUDED_UHD_TRANSPORT_UDP_ZERO_COPY_HPP */
diff --git a/host/include/uhd/transport/usb_control.hpp b/host/include/uhd/transport/usb_control.hpp
index 53c35881a..3fc6d0394 100644
--- a/host/include/uhd/transport/usb_control.hpp
+++ b/host/include/uhd/transport/usb_control.hpp
@@ -12,7 +12,8 @@
namespace uhd { namespace transport {
-class UHD_API usb_control : boost::noncopyable {
+class UHD_API usb_control : boost::noncopyable
+{
public:
typedef boost::shared_ptr<usb_control> sptr;
@@ -47,14 +48,14 @@ public:
* \return number of bytes submitted or error code
*/
virtual int submit(uint8_t request_type,
- uint8_t request,
- uint16_t value,
- uint16_t index,
- unsigned char *buff,
- uint16_t length,
- uint32_t timeout = 0) = 0;
+ uint8_t request,
+ uint16_t value,
+ uint16_t index,
+ unsigned char* buff,
+ uint16_t length,
+ uint32_t timeout = 0) = 0;
};
-}} //namespace
+}} // namespace uhd::transport
#endif /* INCLUDED_UHD_TRANSPORT_USB_CONTROL_HPP */
diff --git a/host/include/uhd/transport/usb_device_handle.hpp b/host/include/uhd/transport/usb_device_handle.hpp
index 9b0806b30..3cd740771 100644
--- a/host/include/uhd/transport/usb_device_handle.hpp
+++ b/host/include/uhd/transport/usb_device_handle.hpp
@@ -9,9 +9,9 @@
#define INCLUDED_UHD_TRANSPORT_USB_DEVICE_HANDLE_HPP
#include <uhd/config.hpp>
-#include <boost/utility.hpp>
-#include <boost/shared_ptr.hpp>
#include <stdint.h>
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
#include <vector>
namespace uhd { namespace transport {
@@ -28,7 +28,8 @@ namespace uhd { namespace transport {
* a true descriptor serial number string. This interface returns the
* actual string descriptor.
*/
-class UHD_API usb_device_handle : boost::noncopyable {
+class UHD_API usb_device_handle : boost::noncopyable
+{
public:
typedef boost::shared_ptr<usb_device_handle> sptr;
typedef std::pair<uint16_t, uint16_t> vid_pid_pair_t;
@@ -75,12 +76,14 @@ public:
* Return a vector of USB devices on this host
* \return a vector of USB device handles that match vid and pid
*/
- static std::vector<usb_device_handle::sptr> get_device_list(uint16_t vid, uint16_t pid);
- static std::vector<usb_device_handle::sptr> get_device_list(const std::vector<usb_device_handle::vid_pid_pair_t>& vid_pid_pair_list);
+ static std::vector<usb_device_handle::sptr> get_device_list(
+ uint16_t vid, uint16_t pid);
+ static std::vector<usb_device_handle::sptr> get_device_list(
+ const std::vector<usb_device_handle::vid_pid_pair_t>& vid_pid_pair_list);
-}; //namespace usb
+}; // namespace usb
-}} //namespace
+}} // namespace uhd::transport
#endif /* INCLUDED_UHD_TRANSPORT_USB_DEVICE_HANDLE_HPP */
diff --git a/host/include/uhd/transport/usb_zero_copy.hpp b/host/include/uhd/transport/usb_zero_copy.hpp
index 7ce85e54a..d78807768 100644
--- a/host/include/uhd/transport/usb_zero_copy.hpp
+++ b/host/include/uhd/transport/usb_zero_copy.hpp
@@ -24,7 +24,8 @@ namespace uhd { namespace transport {
* If no platform specific solution is available, make returns a boost asio
* implementation that wraps functionality around standard send/recv calls.
*/
-class UHD_API usb_zero_copy : public virtual zero_copy_if {
+class UHD_API usb_zero_copy : public virtual zero_copy_if
+{
public:
typedef boost::shared_ptr<usb_zero_copy> sptr;
@@ -45,16 +46,14 @@ public:
* \param hints optional parameters to pass to the underlying transport
* \return a new zero copy USB object
*/
- static sptr make(
- usb_device_handle::sptr handle,
+ static sptr make(usb_device_handle::sptr handle,
const int recv_interface,
const unsigned char recv_endpoint,
const int send_interface,
const unsigned char send_endpoint,
- const device_addr_t &hints = device_addr_t()
- );
+ const device_addr_t& hints = device_addr_t());
};
-}} //namespace
+}} // namespace uhd::transport
#endif /* INCLUDED_UHD_TRANSPORT_USB_ZERO_COPY_HPP */
diff --git a/host/include/uhd/transport/vrt_if_packet.hpp b/host/include/uhd/transport/vrt_if_packet.hpp
index 07792f13f..f357b8ceb 100644
--- a/host/include/uhd/transport/vrt_if_packet.hpp
+++ b/host/include/uhd/transport/vrt_if_packet.hpp
@@ -12,191 +12,189 @@
#include <stdint.h>
#include <cstddef> //size_t
-namespace uhd{ namespace transport{
-
-namespace vrt{
-
- //! The maximum number of 32-bit words in the vrlp link layer
- static const size_t num_vrl_words32 = 3;
-
- //! The maximum number of 32-bit words in a vrt if packet header
- static const size_t max_if_hdr_words32 = 7; //hdr+sid+cid+tsi+tsf
-
- /*!
- * Definition for fields that can be packed into a vrt if header.
- * The size fields are used for input and output depending upon
- * the operation used (ie the pack or unpack function call).
- */
- struct UHD_API if_packet_info_t
- {
- if_packet_info_t(void);
-
- //link layer type - always set for pack and unpack
- enum link_type_t
- {
- LINK_TYPE_NONE = 0x0,
- LINK_TYPE_CHDR = 0x1,
- LINK_TYPE_VRLP = 0x2
- } link_type;
-
- //packet type
- enum packet_type_t
- {
- // VRT language:
- PACKET_TYPE_DATA = 0x0,
- PACKET_TYPE_IF_EXT = 0x1,
- PACKET_TYPE_CONTEXT = 0x2, //extension context: has_sid = true
-
- // CHDR language:
- //PACKET_TYPE_DATA = 0x0, // Data
- PACKET_TYPE_FC = 0x1, // Flow control
- PACKET_TYPE_ACK = 0x1, // Flow control (ack)
- PACKET_TYPE_CMD = 0x2, // Command
- PACKET_TYPE_RESP = 0x3, // Command response
- PACKET_TYPE_ERROR = 0x3 // Command response: Error (the EOB bit is raised in this case)
- } packet_type;
-
- //size fields
- size_t num_payload_words32; //required in pack, derived in unpack
- size_t num_payload_bytes; //required in pack, derived in unpack
- size_t num_header_words32; //derived in pack, derived in unpack
- size_t num_packet_words32; //derived in pack, required in unpack
-
- //header fields
- size_t packet_count;
- //! Asserted for start- or end-of-burst
- bool sob, eob;
- //! This is asserted for command responses that are errors (CHDR only)
- bool error;
- //! This is asserted for flow control packets are ACKS (CHDR only)
- bool fc_ack;
-
- //optional fields
- //! Stream ID (SID). See uhd::sid_t
- bool has_sid; uint32_t sid;
- //! Class ID.
- bool has_cid; uint64_t cid;
- //! Integer timestamp
- bool has_tsi; uint32_t tsi;
- //! Fractional timestamp
- bool has_tsf; uint64_t tsf;
- //! Trailer
- bool has_tlr; uint32_t tlr;
- };
-
- /*!
- * Pack a vrt header from metadata (big endian format).
- *
- * \section vrt_pack_contract Packing contract
- *
- * \subsection vrt_pack_contract_reqs Requirements:
- * - packet_buff points to a valid address space with enough space to write
- * the entire buffer, regardless of its length. At the very least, it must
- * be able to hold an entire header.
- * - `if_packet_info` has the following members set to correct values:
- * - `has_*` members all set accordingly
- * - For every true `has_*` member, the corresponding variable holds a valid
- * value (e.g. if `has_sid` is true, `sid` contains a valid SID)
- * - `num_payload_bytes` and `num_payload_words32` are both set to the correct values
- *
- * \subsection vrt_pack_contract_res Result:
- * - `packet_buff` now points to a valid header that can be sent over the transport
- * without further modification
- * - The following members on `if_packet_info` are set:
- * - `num_header_words32`
- * - `num_packet_words32`
- *
- * \param packet_buff memory to write the packed vrt header
- * \param if_packet_info the if packet info (read/write)
- */
- UHD_API void if_hdr_pack_be(
- uint32_t *packet_buff,
- if_packet_info_t &if_packet_info
- );
-
- /*!
- * Unpack a vrt header to metadata (big endian format).
- *
- * \section vrt_unpack_contract Unpacking contract
- *
- * \subsection vrt_unpack_contract_reqs Requirements
- * - `packet_buff` points to a readable address space with a
- * CHDR packet, starting at the header. `packet_buff[0]` *must* always
- * point to a valid first word of the header. This implies that num_packet_words32
- * must be at least 1.
- * - `if_packet_info` has the following members set to correct values:
- * - `num_packet_words32`. This means all values `packet_buff[0]`
- * through `packet_buff[if_packet_info.num_packet_words32-1]` are
- * readable words from this packet.
- * - `link_type`
- *
- * \subsection vrt_unpack_contract_res Result
- * - `if_packet_info` now has the following values set to correct values:
- * - `packet_type`
- * - `num_payload_bytes`
- * - `num_payload_words32`
- * - `num_header_words32`
- * - `has_*`
- * - `sob`, `eob`, `error`, `cid`, `sid` (if applicable)
- * - `tsf`, `tsi` (if applicable)
- *
- * \subsection Exceptions
- * - If the header is invalid, but the requirements are still met,
- * will throw a uhd::value_error.
- *
- * \param packet_buff memory to read the packed vrt header
- * \param if_packet_info the if packet info (read/write)
- */
- UHD_API void if_hdr_unpack_be(
- const uint32_t *packet_buff,
- if_packet_info_t &if_packet_info
- );
-
- /*!
- * Pack a vrt header from metadata (little endian format).
- *
- * See \ref vrt_pack_contract.
- *
- * \param packet_buff memory to write the packed vrt header
- * \param if_packet_info the if packet info (read/write)
- */
- UHD_API void if_hdr_pack_le(
- uint32_t *packet_buff,
- if_packet_info_t &if_packet_info
- );
-
- /*!
- * Unpack a vrt header to metadata (little endian format).
- *
- * See \ref vrt_unpack_contract.
- *
- * \param packet_buff memory to read the packed vrt header
- * \param if_packet_info the if packet info (read/write)
- */
- UHD_API void if_hdr_unpack_le(
- const uint32_t *packet_buff,
- if_packet_info_t &if_packet_info
- );
-
- UHD_INLINE if_packet_info_t::if_packet_info_t(void):
- link_type(LINK_TYPE_NONE),
- packet_type(PACKET_TYPE_DATA),
- num_payload_words32(0),
- num_payload_bytes(0),
- num_header_words32(0),
- num_packet_words32(0),
- packet_count(0),
- sob(false), eob(false),
- error(false), fc_ack(false),
- has_sid(false), sid(0),
- has_cid(false), cid(0),
- has_tsi(false), tsi(0),
- has_tsf(false), tsf(0),
- has_tlr(false), tlr(0)
- {}
-
-} //namespace vrt
-
-}} //namespace
+namespace uhd { namespace transport { namespace vrt {
+
+//! The maximum number of 32-bit words in the vrlp link layer
+static const size_t num_vrl_words32 = 3;
+
+//! The maximum number of 32-bit words in a vrt if packet header
+static const size_t max_if_hdr_words32 = 7; // hdr+sid+cid+tsi+tsf
+
+/*!
+ * Definition for fields that can be packed into a vrt if header.
+ * The size fields are used for input and output depending upon
+ * the operation used (ie the pack or unpack function call).
+ */
+struct UHD_API if_packet_info_t
+{
+ if_packet_info_t(void);
+
+ // link layer type - always set for pack and unpack
+ enum link_type_t {
+ LINK_TYPE_NONE = 0x0,
+ LINK_TYPE_CHDR = 0x1,
+ LINK_TYPE_VRLP = 0x2
+ } link_type;
+
+ // packet type
+ enum packet_type_t {
+ // VRT language:
+ PACKET_TYPE_DATA = 0x0,
+ PACKET_TYPE_IF_EXT = 0x1,
+ PACKET_TYPE_CONTEXT = 0x2, // extension context: has_sid = true
+
+ // CHDR language:
+ // PACKET_TYPE_DATA = 0x0, // Data
+ PACKET_TYPE_FC = 0x1, // Flow control
+ PACKET_TYPE_ACK = 0x1, // Flow control (ack)
+ PACKET_TYPE_CMD = 0x2, // Command
+ PACKET_TYPE_RESP = 0x3, // Command response
+ PACKET_TYPE_ERROR =
+ 0x3 // Command response: Error (the EOB bit is raised in this case)
+ } packet_type;
+
+ // size fields
+ size_t num_payload_words32; // required in pack, derived in unpack
+ size_t num_payload_bytes; // required in pack, derived in unpack
+ size_t num_header_words32; // derived in pack, derived in unpack
+ size_t num_packet_words32; // derived in pack, required in unpack
+
+ // header fields
+ size_t packet_count;
+ //! Asserted for start- or end-of-burst
+ bool sob, eob;
+ //! This is asserted for command responses that are errors (CHDR only)
+ bool error;
+ //! This is asserted for flow control packets are ACKS (CHDR only)
+ bool fc_ack;
+
+ // optional fields
+ //! Stream ID (SID). See uhd::sid_t
+ bool has_sid;
+ uint32_t sid;
+ //! Class ID.
+ bool has_cid;
+ uint64_t cid;
+ //! Integer timestamp
+ bool has_tsi;
+ uint32_t tsi;
+ //! Fractional timestamp
+ bool has_tsf;
+ uint64_t tsf;
+ //! Trailer
+ bool has_tlr;
+ uint32_t tlr;
+};
+
+/*!
+ * Pack a vrt header from metadata (big endian format).
+ *
+ * \section vrt_pack_contract Packing contract
+ *
+ * \subsection vrt_pack_contract_reqs Requirements:
+ * - packet_buff points to a valid address space with enough space to write
+ * the entire buffer, regardless of its length. At the very least, it must
+ * be able to hold an entire header.
+ * - `if_packet_info` has the following members set to correct values:
+ * - `has_*` members all set accordingly
+ * - For every true `has_*` member, the corresponding variable holds a valid
+ * value (e.g. if `has_sid` is true, `sid` contains a valid SID)
+ * - `num_payload_bytes` and `num_payload_words32` are both set to the correct values
+ *
+ * \subsection vrt_pack_contract_res Result:
+ * - `packet_buff` now points to a valid header that can be sent over the transport
+ * without further modification
+ * - The following members on `if_packet_info` are set:
+ * - `num_header_words32`
+ * - `num_packet_words32`
+ *
+ * \param packet_buff memory to write the packed vrt header
+ * \param if_packet_info the if packet info (read/write)
+ */
+UHD_API void if_hdr_pack_be(uint32_t* packet_buff, if_packet_info_t& if_packet_info);
+
+/*!
+ * Unpack a vrt header to metadata (big endian format).
+ *
+ * \section vrt_unpack_contract Unpacking contract
+ *
+ * \subsection vrt_unpack_contract_reqs Requirements
+ * - `packet_buff` points to a readable address space with a
+ * CHDR packet, starting at the header. `packet_buff[0]` *must* always
+ * point to a valid first word of the header. This implies that num_packet_words32
+ * must be at least 1.
+ * - `if_packet_info` has the following members set to correct values:
+ * - `num_packet_words32`. This means all values `packet_buff[0]`
+ * through `packet_buff[if_packet_info.num_packet_words32-1]` are
+ * readable words from this packet.
+ * - `link_type`
+ *
+ * \subsection vrt_unpack_contract_res Result
+ * - `if_packet_info` now has the following values set to correct values:
+ * - `packet_type`
+ * - `num_payload_bytes`
+ * - `num_payload_words32`
+ * - `num_header_words32`
+ * - `has_*`
+ * - `sob`, `eob`, `error`, `cid`, `sid` (if applicable)
+ * - `tsf`, `tsi` (if applicable)
+ *
+ * \subsection Exceptions
+ * - If the header is invalid, but the requirements are still met,
+ * will throw a uhd::value_error.
+ *
+ * \param packet_buff memory to read the packed vrt header
+ * \param if_packet_info the if packet info (read/write)
+ */
+UHD_API void if_hdr_unpack_be(
+ const uint32_t* packet_buff, if_packet_info_t& if_packet_info);
+
+/*!
+ * Pack a vrt header from metadata (little endian format).
+ *
+ * See \ref vrt_pack_contract.
+ *
+ * \param packet_buff memory to write the packed vrt header
+ * \param if_packet_info the if packet info (read/write)
+ */
+UHD_API void if_hdr_pack_le(uint32_t* packet_buff, if_packet_info_t& if_packet_info);
+
+/*!
+ * Unpack a vrt header to metadata (little endian format).
+ *
+ * See \ref vrt_unpack_contract.
+ *
+ * \param packet_buff memory to read the packed vrt header
+ * \param if_packet_info the if packet info (read/write)
+ */
+UHD_API void if_hdr_unpack_le(
+ const uint32_t* packet_buff, if_packet_info_t& if_packet_info);
+
+UHD_INLINE if_packet_info_t::if_packet_info_t(void)
+ : link_type(LINK_TYPE_NONE)
+ , packet_type(PACKET_TYPE_DATA)
+ , num_payload_words32(0)
+ , num_payload_bytes(0)
+ , num_header_words32(0)
+ , num_packet_words32(0)
+ , packet_count(0)
+ , sob(false)
+ , eob(false)
+ , error(false)
+ , fc_ack(false)
+ , has_sid(false)
+ , sid(0)
+ , has_cid(false)
+ , cid(0)
+ , has_tsi(false)
+ , tsi(0)
+ , has_tsf(false)
+ , tsf(0)
+ , has_tlr(false)
+ , tlr(0)
+{
+}
+
+}}} // namespace uhd::transport::vrt
#endif /* INCLUDED_UHD_TRANSPORT_VRT_IF_PACKET_HPP */
diff --git a/host/include/uhd/transport/zero_copy.hpp b/host/include/uhd/transport/zero_copy.hpp
index 4218ab2f9..05582f902 100644
--- a/host/include/uhd/transport/zero_copy.hpp
+++ b/host/include/uhd/transport/zero_copy.hpp
@@ -9,199 +9,212 @@
#define INCLUDED_UHD_TRANSPORT_ZERO_COPY_HPP
#include <uhd/config.hpp>
-#include <boost/utility.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/intrusive_ptr.hpp>
#include <boost/detail/atomic_count.hpp>
+#include <boost/intrusive_ptr.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
-namespace uhd{ namespace transport{
+namespace uhd { namespace transport {
- //! Simple managed buffer with release interface
- class UHD_API managed_buffer{
- public:
- managed_buffer(void):_ref_count(0),_buffer(NULL),_length(0)
- {
+//! Simple managed buffer with release interface
+class UHD_API managed_buffer
+{
+public:
+ managed_buffer(void) : _ref_count(0), _buffer(NULL), _length(0)
+ {
#ifdef UHD_TXRX_DEBUG_PRINTS
- _mb_num = s_buffer_count;
- // From Boost website: atomic_count seems only to have precrement operator.
- ++s_buffer_count;
+ _mb_num = s_buffer_count;
+ // From Boost website: atomic_count seems only to have precrement operator.
+ ++s_buffer_count;
#endif
- }
-
- virtual ~managed_buffer(void) {}
-
- /*!
- * Signal to the transport that we are done with the buffer.
- * This should be called to release the buffer to the transport object.
- * After calling, the referenced memory should be considered invalid.
- */
- virtual void release(void) = 0;
-
- /*!
- * Use commit() to re-write the length (for use with send buffers).
- * \param num_bytes the number of bytes written into the buffer
- */
- UHD_INLINE void commit(size_t num_bytes){
- _length = num_bytes;
- }
-
- /*!
- * Get a pointer to the underlying buffer.
- * \return a pointer into memory
- */
- template <class T> UHD_INLINE T cast(void) const{
- return static_cast<T>(_buffer);
- }
-
- /*!
- * Get the size of the underlying buffer.
- * \return the number of bytes
- */
- UHD_INLINE size_t size(void) const{
- return _length;
- }
-
- //! Create smart pointer to a reusable managed buffer
- template <typename T> UHD_INLINE boost::intrusive_ptr<T> make(
- T *p, void *buffer, size_t length
- ){
- _buffer = buffer;
- _length = length;
- return boost::intrusive_ptr<T>(p);
- }
-
- boost::detail::atomic_count _ref_count;
- typedef boost::intrusive_ptr<managed_buffer> sptr;
-
- int ref_count(){
- return (int) _ref_count;
- }
+ }
+
+ virtual ~managed_buffer(void) {}
+
+ /*!
+ * Signal to the transport that we are done with the buffer.
+ * This should be called to release the buffer to the transport object.
+ * After calling, the referenced memory should be considered invalid.
+ */
+ virtual void release(void) = 0;
+
+ /*!
+ * Use commit() to re-write the length (for use with send buffers).
+ * \param num_bytes the number of bytes written into the buffer
+ */
+ UHD_INLINE void commit(size_t num_bytes)
+ {
+ _length = num_bytes;
+ }
+
+ /*!
+ * Get a pointer to the underlying buffer.
+ * \return a pointer into memory
+ */
+ template <class T> UHD_INLINE T cast(void) const
+ {
+ return static_cast<T>(_buffer);
+ }
+
+ /*!
+ * Get the size of the underlying buffer.
+ * \return the number of bytes
+ */
+ UHD_INLINE size_t size(void) const
+ {
+ return _length;
+ }
+
+ //! Create smart pointer to a reusable managed buffer
+ template <typename T>
+ UHD_INLINE boost::intrusive_ptr<T> make(T* p, void* buffer, size_t length)
+ {
+ _buffer = buffer;
+ _length = length;
+ return boost::intrusive_ptr<T>(p);
+ }
+
+ boost::detail::atomic_count _ref_count;
+ typedef boost::intrusive_ptr<managed_buffer> sptr;
+
+ int ref_count()
+ {
+ return (int)_ref_count;
+ }
#ifdef UHD_TXRX_DEBUG_PRINTS
- int num() const{
- return _mb_num;
- }
+ int num() const
+ {
+ return _mb_num;
+ }
#endif
- protected:
- void *_buffer;
- size_t _length;
+protected:
+ void* _buffer;
+ size_t _length;
#ifdef UHD_TXRX_DEBUG_PRINTS
- int _mb_num;
+ int _mb_num;
#endif
- private:
+private:
#ifdef UHD_TXRX_DEBUG_PRINTS
- static boost::detail::atomic_count s_buffer_count;
+ static boost::detail::atomic_count s_buffer_count;
#endif
- };
-
- UHD_INLINE void intrusive_ptr_add_ref(managed_buffer *p){
- ++(p->_ref_count);
+};
+
+UHD_INLINE void intrusive_ptr_add_ref(managed_buffer* p)
+{
+ ++(p->_ref_count);
+}
+
+UHD_INLINE void intrusive_ptr_release(managed_buffer* p)
+{
+ if (--(p->_ref_count) == 0)
+ p->release();
+}
+
+/*!
+ * A managed receive buffer:
+ * Contains a reference to transport-managed memory,
+ * and a method to release the memory after reading.
+ */
+class UHD_API managed_recv_buffer : public managed_buffer
+{
+public:
+ typedef boost::intrusive_ptr<managed_recv_buffer> sptr;
+};
+
+/*!
+ * A managed send buffer:
+ * Contains a reference to transport-managed memory,
+ * and a method to commit the memory after writing.
+ */
+class UHD_API managed_send_buffer : public managed_buffer
+{
+public:
+ typedef boost::intrusive_ptr<managed_send_buffer> sptr;
+};
+
+/*!
+ * Transport parameters
+ */
+struct zero_copy_xport_params
+{
+ zero_copy_xport_params()
+ : recv_frame_size(0)
+ , send_frame_size(0)
+ , num_recv_frames(0)
+ , num_send_frames(0)
+ , recv_buff_size(0)
+ , send_buff_size(0)
+ { /* NOP */
}
+ size_t recv_frame_size;
+ size_t send_frame_size;
+ size_t num_recv_frames;
+ size_t num_send_frames;
+ size_t recv_buff_size;
+ size_t send_buff_size;
+};
+
+/*!
+ * A zero-copy interface for transport objects.
+ * Provides a way to get send and receive buffers
+ * with memory managed by the transport object.
+ */
+class UHD_API zero_copy_if : boost::noncopyable
+{
+public:
+ typedef boost::shared_ptr<zero_copy_if> sptr;
- UHD_INLINE void intrusive_ptr_release(managed_buffer *p){
- if (--(p->_ref_count) == 0) p->release();
- }
+ /*!
+ * Clean up tasks before releasing the transport object.
+ */
+ virtual ~zero_copy_if(){};
+
+ /*!
+ * Get a new receive buffer from this transport object.
+ * \param timeout the timeout to get the buffer in seconds
+ * \return a managed buffer, or null sptr on timeout/error
+ */
+ virtual managed_recv_buffer::sptr get_recv_buff(double timeout = 0.1) = 0;
/*!
- * A managed receive buffer:
- * Contains a reference to transport-managed memory,
- * and a method to release the memory after reading.
+ * Get the number of receive frames:
+ * The number of simultaneous receive buffers in use.
+ * \return number of frames
*/
- class UHD_API managed_recv_buffer : public managed_buffer{
- public:
- typedef boost::intrusive_ptr<managed_recv_buffer> sptr;
- };
+ virtual size_t get_num_recv_frames(void) const = 0;
/*!
- * A managed send buffer:
- * Contains a reference to transport-managed memory,
- * and a method to commit the memory after writing.
+ * Get the size of a receive frame:
+ * The maximum capacity of a single receive buffer.
+ * \return frame size in bytes
*/
- class UHD_API managed_send_buffer : public managed_buffer{
- public:
- typedef boost::intrusive_ptr<managed_send_buffer> sptr;
- };
+ virtual size_t get_recv_frame_size(void) const = 0;
/*!
- * Transport parameters
+ * Get a new send buffer from this transport object.
+ * \param timeout the timeout to get the buffer in seconds
+ * \return a managed buffer, or null sptr on timeout/error
*/
- struct zero_copy_xport_params {
- zero_copy_xport_params() :
- recv_frame_size(0),
- send_frame_size(0),
- num_recv_frames(0),
- num_send_frames(0),
- recv_buff_size(0),
- send_buff_size(0)
- { /* NOP */ }
- size_t recv_frame_size;
- size_t send_frame_size;
- size_t num_recv_frames;
- size_t num_send_frames;
- size_t recv_buff_size;
- size_t send_buff_size;
- };
+ virtual managed_send_buffer::sptr get_send_buff(double timeout = 0.1) = 0;
/*!
- * A zero-copy interface for transport objects.
- * Provides a way to get send and receive buffers
- * with memory managed by the transport object.
+ * Get the number of send frames:
+ * The number of simultaneous send buffers in use.
+ * \return number of frames
*/
- class UHD_API zero_copy_if : boost::noncopyable{
- public:
- typedef boost::shared_ptr<zero_copy_if> sptr;
-
- /*!
- * Clean up tasks before releasing the transport object.
- */
- virtual ~zero_copy_if() {};
-
- /*!
- * Get a new receive buffer from this transport object.
- * \param timeout the timeout to get the buffer in seconds
- * \return a managed buffer, or null sptr on timeout/error
- */
- virtual managed_recv_buffer::sptr get_recv_buff(double timeout = 0.1) = 0;
-
- /*!
- * Get the number of receive frames:
- * The number of simultaneous receive buffers in use.
- * \return number of frames
- */
- virtual size_t get_num_recv_frames(void) const = 0;
-
- /*!
- * Get the size of a receive frame:
- * The maximum capacity of a single receive buffer.
- * \return frame size in bytes
- */
- virtual size_t get_recv_frame_size(void) const = 0;
-
- /*!
- * Get a new send buffer from this transport object.
- * \param timeout the timeout to get the buffer in seconds
- * \return a managed buffer, or null sptr on timeout/error
- */
- virtual managed_send_buffer::sptr get_send_buff(double timeout = 0.1) = 0;
-
- /*!
- * Get the number of send frames:
- * The number of simultaneous send buffers in use.
- * \return number of frames
- */
- virtual size_t get_num_send_frames(void) const = 0;
-
- /*!
- * Get the size of a send frame:
- * The maximum capacity of a single send buffer.
- * \return frame size in bytes
- */
- virtual size_t get_send_frame_size(void) const = 0;
-
- };
-
-}} //namespace
+ virtual size_t get_num_send_frames(void) const = 0;
+
+ /*!
+ * Get the size of a send frame:
+ * The maximum capacity of a single send buffer.
+ * \return frame size in bytes
+ */
+ virtual size_t get_send_frame_size(void) const = 0;
+};
+
+}} // namespace uhd::transport
#endif /* INCLUDED_UHD_TRANSPORT_ZERO_COPY_HPP */
diff --git a/host/include/uhd/transport/zero_copy_flow_ctrl.hpp b/host/include/uhd/transport/zero_copy_flow_ctrl.hpp
index bc99e9bbf..f98a0891c 100644
--- a/host/include/uhd/transport/zero_copy_flow_ctrl.hpp
+++ b/host/include/uhd/transport/zero_copy_flow_ctrl.hpp
@@ -13,7 +13,7 @@
#include <boost/function.hpp>
#include <boost/shared_ptr.hpp>
-namespace uhd{ namespace transport{
+namespace uhd { namespace transport {
/*!
* Flow control function.
@@ -25,7 +25,8 @@ typedef boost::function<bool(managed_buffer::sptr buff)> flow_ctrl_func;
/*!
* Adds flow control to any zero_copy_if transport.
*/
-class UHD_API zero_copy_flow_ctrl : public virtual zero_copy_if {
+class UHD_API zero_copy_flow_ctrl : public virtual zero_copy_if
+{
public:
typedef boost::shared_ptr<zero_copy_flow_ctrl> sptr;
@@ -33,16 +34,15 @@ public:
* Make flow controlled transport.
*
* \param transport a shared pointer to the transport interface
- * \param send_flow_ctrl optional send flow control function called before buffer is sent
- * \param recv_flow_ctrl optional receive flow control function called after buffer released
+ * \param send_flow_ctrl optional send flow control function called before buffer is
+ * sent \param recv_flow_ctrl optional receive flow control function called after
+ * buffer released
*/
- static sptr make(
- zero_copy_if::sptr transport,
+ static sptr make(zero_copy_if::sptr transport,
flow_ctrl_func send_flow_ctrl,
- flow_ctrl_func recv_flow_ctrl
- );
+ flow_ctrl_func recv_flow_ctrl);
};
-}} //namespace
+}} // namespace uhd::transport
#endif /* INCLUDED_ZERO_COPY_FLOW_CTRL_HPP */
diff --git a/host/include/uhd/transport/zero_copy_recv_offload.hpp b/host/include/uhd/transport/zero_copy_recv_offload.hpp
index 92aa28073..04878f72d 100644
--- a/host/include/uhd/transport/zero_copy_recv_offload.hpp
+++ b/host/include/uhd/transport/zero_copy_recv_offload.hpp
@@ -12,13 +12,14 @@
#include <uhd/transport/zero_copy.hpp>
#include <boost/shared_ptr.hpp>
-namespace uhd{ namespace transport{
+namespace uhd { namespace transport {
/*!
* A threaded transport offload that is meant to relieve the main thread of
* the responsibility of making receive calls.
*/
-class UHD_API zero_copy_recv_offload : public virtual zero_copy_if {
+class UHD_API zero_copy_recv_offload : public virtual zero_copy_if
+{
public:
typedef boost::shared_ptr<zero_copy_recv_offload> sptr;
@@ -31,10 +32,9 @@ public:
* \param transport a shared pointer to the transport interface
* \param timeout a general timeout for pushing and pulling on the bounded buffer
*/
- static sptr make(zero_copy_if::sptr transport,
- const double timeout);
+ static sptr make(zero_copy_if::sptr transport, const double timeout);
};
-}} //namespace
+}} // namespace uhd::transport
#endif /* INCLUDED_ZERO_COPY_OFFLOAD_HPP */
diff --git a/host/include/uhd/types/byte_vector.hpp b/host/include/uhd/types/byte_vector.hpp
index 9cf0be88c..64c0911e2 100644
--- a/host/include/uhd/types/byte_vector.hpp
+++ b/host/include/uhd/types/byte_vector.hpp
@@ -14,22 +14,23 @@
#include <string>
#include <vector>
-namespace uhd{
+namespace uhd {
- //! Byte vector used for I2C data passing and EEPROM parsing.
- typedef std::vector<uint8_t> byte_vector_t;
+//! Byte vector used for I2C data passing and EEPROM parsing.
+typedef std::vector<uint8_t> byte_vector_t;
- template<typename RangeSrc, typename RangeDst> UHD_INLINE
- void byte_copy(const RangeSrc &src, RangeDst &dst){
- std::copy(boost::begin(src), boost::end(src), boost::begin(dst));
- }
+template <typename RangeSrc, typename RangeDst>
+UHD_INLINE void byte_copy(const RangeSrc& src, RangeDst& dst)
+{
+ std::copy(boost::begin(src), boost::end(src), boost::begin(dst));
+}
- //! Create a string from a byte vector, terminate when invalid ASCII encountered
- UHD_API std::string bytes_to_string(const byte_vector_t &bytes);
+//! Create a string from a byte vector, terminate when invalid ASCII encountered
+UHD_API std::string bytes_to_string(const byte_vector_t& bytes);
- //! Create a byte vector from a string, end at null terminator or max length
- UHD_API byte_vector_t string_to_bytes(const std::string &str, size_t max_length);
+//! Create a byte vector from a string, end at null terminator or max length
+UHD_API byte_vector_t string_to_bytes(const std::string& str, size_t max_length);
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_BYTE_VECTOR_HPP */
diff --git a/host/include/uhd/types/clock_config.hpp b/host/include/uhd/types/clock_config.hpp
index 92b7b7e44..30a754f54 100644
--- a/host/include/uhd/types/clock_config.hpp
+++ b/host/include/uhd/types/clock_config.hpp
@@ -10,47 +10,48 @@
#include <uhd/config.hpp>
-namespace uhd{
-
- /*!
- * The DEPRECATED Clock configuration settings:
- * The source for the 10MHz reference clock.
- * The source and polarity for the PPS clock.
- *
- * Deprecated in favor of set time/clock source calls.
- * Its still in this file for the sake of gr-uhd swig.
- *
- * Use the convenience functions external() and internal(),
- * unless you have a special purpose and cannot use them.
- */
- struct UHD_API clock_config_t{
- //------ simple usage --------//
-
- //! A convenience function to create an external clock configuration
- static clock_config_t external(void);
-
- //! A convenience function to create an internal clock configuration
- static clock_config_t internal(void);
-
- //------ advanced usage --------//
- enum ref_source_t {
- REF_AUTO = int('a'), //automatic (device specific)
- REF_INT = int('i'), //internal reference
- REF_SMA = int('s'), //external sma port
- REF_MIMO = int('m') //reference from mimo cable
- } ref_source;
- enum pps_source_t {
- PPS_INT = int('i'), //there is no internal
- PPS_SMA = int('s'), //external sma port
- PPS_MIMO = int('m') //time sync from mimo cable
- } pps_source;
- enum pps_polarity_t {
- PPS_NEG = int('n'), //negative edge
- PPS_POS = int('p') //positive edge
- } pps_polarity;
- clock_config_t(void);
- };
-
-} //namespace uhd
+namespace uhd {
+
+/*!
+ * The DEPRECATED Clock configuration settings:
+ * The source for the 10MHz reference clock.
+ * The source and polarity for the PPS clock.
+ *
+ * Deprecated in favor of set time/clock source calls.
+ * Its still in this file for the sake of gr-uhd swig.
+ *
+ * Use the convenience functions external() and internal(),
+ * unless you have a special purpose and cannot use them.
+ */
+struct UHD_API clock_config_t
+{
+ //------ simple usage --------//
+
+ //! A convenience function to create an external clock configuration
+ static clock_config_t external(void);
+
+ //! A convenience function to create an internal clock configuration
+ static clock_config_t internal(void);
+
+ //------ advanced usage --------//
+ enum ref_source_t {
+ REF_AUTO = int('a'), // automatic (device specific)
+ REF_INT = int('i'), // internal reference
+ REF_SMA = int('s'), // external sma port
+ REF_MIMO = int('m') // reference from mimo cable
+ } ref_source;
+ enum pps_source_t {
+ PPS_INT = int('i'), // there is no internal
+ PPS_SMA = int('s'), // external sma port
+ PPS_MIMO = int('m') // time sync from mimo cable
+ } pps_source;
+ enum pps_polarity_t {
+ PPS_NEG = int('n'), // negative edge
+ PPS_POS = int('p') // positive edge
+ } pps_polarity;
+ clock_config_t(void);
+};
+
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_CLOCK_CONFIG_HPP */
diff --git a/host/include/uhd/types/component_file.hpp b/host/include/uhd/types/component_file.hpp
index 07c009257..905fc067f 100644
--- a/host/include/uhd/types/component_file.hpp
+++ b/host/include/uhd/types/component_file.hpp
@@ -11,26 +11,27 @@
#include <string>
#include <vector>
-namespace uhd{ namespace usrp{
+namespace uhd { namespace usrp {
- /*! Defines a file that can be sent using update_component
- *
- * \param metadata dictionary of strings that define the metadata
- * associated with the file.
- *
- * Keys must include "id" and "filename", and may include an "md5" hash,
- * as well as other, device- or component-specific keys.
- *
- * \param data the binary data file
- *
- * Can be the contents of the FPGA image file, for example.
- */
- struct component_file_t {
- uhd::dict<std::string, std::string> metadata;
- std::vector<uint8_t> data;
- };
+/*! Defines a file that can be sent using update_component
+ *
+ * \param metadata dictionary of strings that define the metadata
+ * associated with the file.
+ *
+ * Keys must include "id" and "filename", and may include an "md5" hash,
+ * as well as other, device- or component-specific keys.
+ *
+ * \param data the binary data file
+ *
+ * Can be the contents of the FPGA image file, for example.
+ */
+struct component_file_t
+{
+ uhd::dict<std::string, std::string> metadata;
+ std::vector<uint8_t> data;
+};
- typedef std::vector<component_file_t> component_files_t;
+typedef std::vector<component_file_t> component_files_t;
}} // namespace uhd::usrp
diff --git a/host/include/uhd/types/device_addr.hpp b/host/include/uhd/types/device_addr.hpp
index b9d3659c0..93a5d345f 100644
--- a/host/include/uhd/types/device_addr.hpp
+++ b/host/include/uhd/types/device_addr.hpp
@@ -11,85 +11,87 @@
#include <uhd/config.hpp>
#include <uhd/types/dict.hpp>
#include <boost/lexical_cast.hpp>
+#include <map>
#include <stdexcept>
-#include <vector>
#include <string>
-#include <map>
+#include <vector>
-namespace uhd{
+namespace uhd {
+/*!
+ * Mapping of key/value pairs for locating devices on the system.
+ * When left empty, the device discovery routines will search
+ * all available transports on the system (ethernet, usb...).
+ *
+ * To narrow down the discovery process to a particular device,
+ * specify a transport key/value pair specific to your device.
+ * - Ex, to find a usrp2: my_dev_addr["addr"] = [resolvable_hostname_or_ip]
+ *
+ * The device address can also be used to pass arguments into
+ * the transport layer control to set (for example) buffer sizes.
+ *
+ * An arguments string, is a way to represent a device address
+ * using a single string with delimiter characters.
+ * - Ex: addr=192.168.10.2
+ * - Ex: addr=192.168.10.2, recv_buff_size=1e6
+ */
+class UHD_API device_addr_t : public dict<std::string, std::string>
+{
+public:
/*!
- * Mapping of key/value pairs for locating devices on the system.
- * When left empty, the device discovery routines will search
- * all available transports on the system (ethernet, usb...).
- *
- * To narrow down the discovery process to a particular device,
- * specify a transport key/value pair specific to your device.
- * - Ex, to find a usrp2: my_dev_addr["addr"] = [resolvable_hostname_or_ip]
- *
- * The device address can also be used to pass arguments into
- * the transport layer control to set (for example) buffer sizes.
- *
- * An arguments string, is a way to represent a device address
- * using a single string with delimiter characters.
- * - Ex: addr=192.168.10.2
- * - Ex: addr=192.168.10.2, recv_buff_size=1e6
+ * Create a device address from an args string.
+ * \param args the arguments string
*/
- class UHD_API device_addr_t : public dict<std::string, std::string>{
- public:
- /*!
- * Create a device address from an args string.
- * \param args the arguments string
- */
- device_addr_t(const std::string &args = "");
+ device_addr_t(const std::string& args = "");
- /*!
- * Create a device address from a std::map
- * \param info the device info map
- */
- device_addr_t(const std::map<std::string, std::string> &info);
+ /*!
+ * Create a device address from a std::map
+ * \param info the device info map
+ */
+ device_addr_t(const std::map<std::string, std::string>& info);
- /*!
- * Convert a device address into a pretty print string.
- * \return a printable string representing the device address
- */
- std::string to_pp_string(void) const;
+ /*!
+ * Convert a device address into a pretty print string.
+ * \return a printable string representing the device address
+ */
+ std::string to_pp_string(void) const;
- /*!
- * Convert the device address into an args string.
- * The args string contains delimiter symbols.
- * \return a string with delimiter markup
- */
- std::string to_string(void) const;
+ /*!
+ * Convert the device address into an args string.
+ * The args string contains delimiter symbols.
+ * \return a string with delimiter markup
+ */
+ std::string to_string(void) const;
- /*!
- * Lexically cast a parameter to the specified type,
- * or use the default value if the key is not found.
- * \param key the key as one of the address parameters
- * \param def the value to use when key is not present
- * \return the casted value as type T or the default
- * \throw error when the parameter cannot be casted
- */
- template <typename T> T cast(const std::string &key, const T &def) const{
- if (not this->has_key(key)) return def;
- try{
- return boost::lexical_cast<T>((*this)[key]);
- }
- catch(const boost::bad_lexical_cast &){
- throw std::runtime_error("cannot cast " + key + " = " + (*this)[key]);
- }
+ /*!
+ * Lexically cast a parameter to the specified type,
+ * or use the default value if the key is not found.
+ * \param key the key as one of the address parameters
+ * \param def the value to use when key is not present
+ * \return the casted value as type T or the default
+ * \throw error when the parameter cannot be casted
+ */
+ template <typename T> T cast(const std::string& key, const T& def) const
+ {
+ if (not this->has_key(key))
+ return def;
+ try {
+ return boost::lexical_cast<T>((*this)[key]);
+ } catch (const boost::bad_lexical_cast&) {
+ throw std::runtime_error("cannot cast " + key + " = " + (*this)[key]);
}
- };
+ }
+};
- //! A typedef for a vector of device addresses
- typedef std::vector<device_addr_t> device_addrs_t;
+//! A typedef for a vector of device addresses
+typedef std::vector<device_addr_t> device_addrs_t;
- //! Separate an indexed device address into a vector of device addresses
- UHD_API device_addrs_t separate_device_addr(const device_addr_t &dev_addr);
+//! Separate an indexed device address into a vector of device addresses
+UHD_API device_addrs_t separate_device_addr(const device_addr_t& dev_addr);
- //! Combine a vector of device addresses into an indexed device address
- UHD_API device_addr_t combine_device_addrs(const device_addrs_t &dev_addrs);
+//! Combine a vector of device addresses into an indexed device address
+UHD_API device_addr_t combine_device_addrs(const device_addrs_t& dev_addrs);
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_DEVICE_ADDR_HPP */
diff --git a/host/include/uhd/types/dict.hpp b/host/include/uhd/types/dict.hpp
index 51594e17b..8b7a63c69 100644
--- a/host/include/uhd/types/dict.hpp
+++ b/host/include/uhd/types/dict.hpp
@@ -9,141 +9,141 @@
#define INCLUDED_UHD_TYPES_DICT_HPP
#include <uhd/config.hpp>
-#include <vector>
#include <list>
+#include <vector>
+
+namespace uhd {
+
+/*!
+ * A templated dictionary class with a python-like interface.
+ */
+template <typename Key, typename Val> class dict
+{
+public:
+ /*!
+ * Create a new empty dictionary.
+ */
+ dict(void);
+
+ /*!
+ * Input iterator constructor:
+ * Makes boost::assign::map_list_of work.
+ * \param first the begin iterator
+ * \param last the end iterator
+ */
+ template <typename InputIterator> dict(InputIterator first, InputIterator last);
+
+ /*!
+ * Get the number of elements in this dict.
+ * \return the number of elements
+ */
+ std::size_t size(void) const;
+
+ /*!
+ * Get a list of the keys in this dict.
+ * Key order depends on insertion precedence.
+ * \return vector of keys
+ */
+ std::vector<Key> keys(void) const;
+
+ /*!
+ * Get a list of the values in this dict.
+ * Value order depends on insertion precedence.
+ * \return vector of values
+ */
+ std::vector<Val> vals(void) const;
+
+ /*!
+ * Does the dictionary contain this key?
+ * \param key the key to look for
+ * \return true if found
+ */
+ bool has_key(const Key& key) const;
+
+ /*!
+ * Get a value in the dict or default.
+ * \param key the key to look for
+ * \param other use if key not found
+ * \return the value or default
+ */
+ const Val& get(const Key& key, const Val& other) const;
+
+ /*!
+ * Get a value in the dict or throw.
+ * \param key the key to look for
+ * \return the value or default
+ */
+ const Val& get(const Key& key) const;
+
+ /*!
+ * Set a value in the dict at the key.
+ * \param key the key to set at
+ * \param val the value to set
+ */
+ void set(const Key& key, const Val& val);
+
+ /*!
+ * Get a value for the given key if it exists.
+ * If the key is not found throw an error.
+ * \param key the key to look for
+ * \return the value at the key
+ * \throw an exception when not found
+ */
+ const Val& operator[](const Key& key) const;
-namespace uhd{
+ /*!
+ * Set a value for the given key, however, in reality
+ * it really returns a reference which can be assigned to.
+ * \param key the key to set to
+ * \return a reference to the value
+ */
+ Val& operator[](const Key& key);
+
+ /*!
+ * Equals operator for the dict type
+ * \param other the dict being compared to this
+ * \return whether or not the two dict's are equal
+ */
+ bool operator==(const dict<Key, Val>& other) const;
/*!
- * A templated dictionary class with a python-like interface.
+ * Not equal operator for the dict type
+ * \param other the dict being compared to this
+ * \return whether or not the two dict's are not equal
*/
- template <typename Key, typename Val> class dict{
- public:
- /*!
- * Create a new empty dictionary.
- */
- dict(void);
-
- /*!
- * Input iterator constructor:
- * Makes boost::assign::map_list_of work.
- * \param first the begin iterator
- * \param last the end iterator
- */
- template <typename InputIterator>
- dict(InputIterator first, InputIterator last);
-
- /*!
- * Get the number of elements in this dict.
- * \return the number of elements
- */
- std::size_t size(void) const;
-
- /*!
- * Get a list of the keys in this dict.
- * Key order depends on insertion precedence.
- * \return vector of keys
- */
- std::vector<Key> keys(void) const;
-
- /*!
- * Get a list of the values in this dict.
- * Value order depends on insertion precedence.
- * \return vector of values
- */
- std::vector<Val> vals(void) const;
-
- /*!
- * Does the dictionary contain this key?
- * \param key the key to look for
- * \return true if found
- */
- bool has_key(const Key &key) const;
-
- /*!
- * Get a value in the dict or default.
- * \param key the key to look for
- * \param other use if key not found
- * \return the value or default
- */
- const Val &get(const Key &key, const Val &other) const;
-
- /*!
- * Get a value in the dict or throw.
- * \param key the key to look for
- * \return the value or default
- */
- const Val &get(const Key &key) const;
-
- /*!
- * Set a value in the dict at the key.
- * \param key the key to set at
- * \param val the value to set
- */
- void set(const Key &key, const Val &val);
-
- /*!
- * Get a value for the given key if it exists.
- * If the key is not found throw an error.
- * \param key the key to look for
- * \return the value at the key
- * \throw an exception when not found
- */
- const Val &operator[](const Key &key) const;
-
- /*!
- * Set a value for the given key, however, in reality
- * it really returns a reference which can be assigned to.
- * \param key the key to set to
- * \return a reference to the value
- */
- Val &operator[](const Key &key);
-
- /*!
- * Equals operator for the dict type
- * \param other the dict being compared to this
- * \return whether or not the two dict's are equal
- */
- bool operator==(const dict<Key, Val> &other) const;
-
- /*!
- * Not equal operator for the dict type
- * \param other the dict being compared to this
- * \return whether or not the two dict's are not equal
- */
- bool operator!=(const dict<Key, Val> &other) const;
-
- /*!
- * Pop an item out of the dictionary.
- * \param key the item key
- * \return the value of the item
- * \throw an exception when not found
- */
- Val pop(const Key &key);
-
- /*! Update this dictionary with values from another.
- *
- * Basically, this copies all the key/value pairs from \p new_dict
- * into this dict. When the key is already present in the current
- * dict, it either overwrites the current value (if \p fail_on_conflict
- * is false) or it throws (if \p fail_on_conflict is true *and* the
- * values differ).
- *
- * With the exception of \p fail_on_conflict, this behaves analogously
- * to Python's dict.update() method.
- *
- * \param new_dict The arguments to copy.
- * \param fail_on_conflict If true, throws.
- * \throws uhd::value_error
- */
- void update(const dict<Key, Val> &new_dict, bool fail_on_conflict=true);
-
- private:
- typedef std::pair<Key, Val> pair_t;
- std::list<pair_t> _map; //private container
- };
-
-} //namespace uhd
+ bool operator!=(const dict<Key, Val>& other) const;
+
+ /*!
+ * Pop an item out of the dictionary.
+ * \param key the item key
+ * \return the value of the item
+ * \throw an exception when not found
+ */
+ Val pop(const Key& key);
+
+ /*! Update this dictionary with values from another.
+ *
+ * Basically, this copies all the key/value pairs from \p new_dict
+ * into this dict. When the key is already present in the current
+ * dict, it either overwrites the current value (if \p fail_on_conflict
+ * is false) or it throws (if \p fail_on_conflict is true *and* the
+ * values differ).
+ *
+ * With the exception of \p fail_on_conflict, this behaves analogously
+ * to Python's dict.update() method.
+ *
+ * \param new_dict The arguments to copy.
+ * \param fail_on_conflict If true, throws.
+ * \throws uhd::value_error
+ */
+ void update(const dict<Key, Val>& new_dict, bool fail_on_conflict = true);
+
+private:
+ typedef std::pair<Key, Val> pair_t;
+ std::list<pair_t> _map; // private container
+};
+
+} // namespace uhd
#include <uhd/types/dict.ipp>
diff --git a/host/include/uhd/types/direction.hpp b/host/include/uhd/types/direction.hpp
index 79d942bd6..73ef0c07f 100644
--- a/host/include/uhd/types/direction.hpp
+++ b/host/include/uhd/types/direction.hpp
@@ -10,15 +10,15 @@
namespace uhd {
- enum direction_t {
- //! Receive
- RX_DIRECTION,
- //! Transmit
- TX_DIRECTION,
- //! Duplex
- DX_DIRECTION
- };
+enum direction_t {
+ //! Receive
+ RX_DIRECTION,
+ //! Transmit
+ TX_DIRECTION,
+ //! Duplex
+ DX_DIRECTION
+};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_DIRECTION_HPP */
diff --git a/host/include/uhd/types/eeprom.hpp b/host/include/uhd/types/eeprom.hpp
index a61fbf211..d2b29fe6b 100644
--- a/host/include/uhd/types/eeprom.hpp
+++ b/host/include/uhd/types/eeprom.hpp
@@ -13,7 +13,7 @@
namespace uhd {
- typedef std::map<std::string, std::vector<uint8_t>> eeprom_map_t;
+typedef std::map<std::string, std::vector<uint8_t> > eeprom_map_t;
} /* namespace uhd */
diff --git a/host/include/uhd/types/endianness.hpp b/host/include/uhd/types/endianness.hpp
index 74b8f43e9..a14bfcd23 100644
--- a/host/include/uhd/types/endianness.hpp
+++ b/host/include/uhd/types/endianness.hpp
@@ -10,13 +10,10 @@
#include <uhd/config.hpp>
-namespace uhd{
+namespace uhd {
- enum endianness_t {
- ENDIANNESS_BIG,
- ENDIANNESS_LITTLE
- };
+enum endianness_t { ENDIANNESS_BIG, ENDIANNESS_LITTLE };
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_ENDIANNESS_HPP */
diff --git a/host/include/uhd/types/filters.hpp b/host/include/uhd/types/filters.hpp
index 9879774cc..ff72dd5e3 100644
--- a/host/include/uhd/types/filters.hpp
+++ b/host/include/uhd/types/filters.hpp
@@ -10,267 +10,249 @@
#include <uhd/config.hpp>
#include <uhd/utils/log.hpp>
-
#include <stdint.h>
-#include <boost/shared_ptr.hpp>
#include <boost/scoped_array.hpp>
-#include <string>
-#include <vector>
+#include <boost/shared_ptr.hpp>
#include <iostream>
#include <ostream>
#include <sstream>
+#include <string>
+#include <vector>
-namespace uhd{
-
- class UHD_API filter_info_base
- {
- public:
- typedef boost::shared_ptr<filter_info_base> sptr;
- enum filter_type
- {
- ANALOG_LOW_PASS,
- ANALOG_BAND_PASS,
- DIGITAL_I16,
- DIGITAL_FIR_I16
- };
-
- filter_info_base(
- filter_type type,
- bool bypass,
- size_t position_index
- ):
- _type(type), _bypass(bypass),
- _position_index(position_index)
- {
- //NOP
- }
-
- UHD_INLINE virtual bool is_bypassed()
- {
- return _bypass;
- }
-
- UHD_INLINE filter_type get_type()
- {
- return _type;
- }
-
- virtual ~filter_info_base()
- {
- //NOP
- }
-
- virtual std::string to_pp_string();
-
- protected:
- filter_type _type;
- bool _bypass;
- size_t _position_index;
-
- };
+namespace uhd {
- UHD_API std::ostream& operator<<(std::ostream& os, filter_info_base& f);
+class UHD_API filter_info_base
+{
+public:
+ typedef boost::shared_ptr<filter_info_base> sptr;
+ enum filter_type { ANALOG_LOW_PASS, ANALOG_BAND_PASS, DIGITAL_I16, DIGITAL_FIR_I16 };
- class UHD_API analog_filter_base : public filter_info_base
+ filter_info_base(filter_type type, bool bypass, size_t position_index)
+ : _type(type), _bypass(bypass), _position_index(position_index)
{
- std::string _analog_type;
- public:
- typedef boost::shared_ptr<analog_filter_base> sptr;
- analog_filter_base(
- filter_type type,
- bool bypass,
- size_t position_index,
- const std::string& analog_type
- ):
- filter_info_base(type, bypass, position_index),
- _analog_type(analog_type)
- {
- //NOP
- }
+ // NOP
+ }
- UHD_INLINE const std::string& get_analog_type()
- {
- return _analog_type;
- }
-
- virtual std::string to_pp_string();
- };
+ UHD_INLINE virtual bool is_bypassed()
+ {
+ return _bypass;
+ }
- class UHD_API analog_filter_lp : public analog_filter_base
+ UHD_INLINE filter_type get_type()
{
- double _cutoff;
- double _rolloff;
-
- public:
- typedef boost::shared_ptr<analog_filter_lp> sptr;
- analog_filter_lp(
- filter_type type,
- bool bypass,
- size_t position_index,
- const std::string& analog_type,
- double cutoff,
- double rolloff
- ):
- analog_filter_base(type, bypass, position_index, analog_type),
- _cutoff(cutoff),
- _rolloff(rolloff)
- {
- //NOP
- }
+ return _type;
+ }
- UHD_INLINE double get_cutoff()
- {
- return _cutoff;
- }
+ virtual ~filter_info_base()
+ {
+ // NOP
+ }
+
+ virtual std::string to_pp_string();
+
+protected:
+ filter_type _type;
+ bool _bypass;
+ size_t _position_index;
+};
+
+UHD_API std::ostream& operator<<(std::ostream& os, filter_info_base& f);
+
+class UHD_API analog_filter_base : public filter_info_base
+{
+ std::string _analog_type;
+
+public:
+ typedef boost::shared_ptr<analog_filter_base> sptr;
+ analog_filter_base(filter_type type,
+ bool bypass,
+ size_t position_index,
+ const std::string& analog_type)
+ : filter_info_base(type, bypass, position_index), _analog_type(analog_type)
+ {
+ // NOP
+ }
- UHD_INLINE double get_rolloff()
- {
- return _rolloff;
- }
+ UHD_INLINE const std::string& get_analog_type()
+ {
+ return _analog_type;
+ }
+
+ virtual std::string to_pp_string();
+};
+
+class UHD_API analog_filter_lp : public analog_filter_base
+{
+ double _cutoff;
+ double _rolloff;
+
+public:
+ typedef boost::shared_ptr<analog_filter_lp> sptr;
+ analog_filter_lp(filter_type type,
+ bool bypass,
+ size_t position_index,
+ const std::string& analog_type,
+ double cutoff,
+ double rolloff)
+ : analog_filter_base(type, bypass, position_index, analog_type)
+ , _cutoff(cutoff)
+ , _rolloff(rolloff)
+ {
+ // NOP
+ }
- UHD_INLINE void set_cutoff(const double cutoff)
- {
- _cutoff = cutoff;
- }
+ UHD_INLINE double get_cutoff()
+ {
+ return _cutoff;
+ }
- virtual std::string to_pp_string();
- };
+ UHD_INLINE double get_rolloff()
+ {
+ return _rolloff;
+ }
- template<typename tap_t>
- class UHD_API digital_filter_base : public filter_info_base
+ UHD_INLINE void set_cutoff(const double cutoff)
{
- protected:
- double _rate;
- uint32_t _interpolation;
- uint32_t _decimation;
- tap_t _tap_full_scale;
- uint32_t _max_num_taps;
- std::vector<tap_t> _taps;
-
- public:
- typedef boost::shared_ptr<digital_filter_base> sptr;
- digital_filter_base(
- filter_type type,
- bool bypass,
- size_t position_index,
- double rate,
- size_t interpolation,
- size_t decimation,
- double tap_full_scale,
- size_t max_num_taps,
- const std::vector<tap_t>& taps
- ):
- filter_info_base(type, bypass, position_index),
- _rate(rate),
- _interpolation(interpolation),
- _decimation(decimation),
- _tap_full_scale(tap_full_scale),
- _max_num_taps(max_num_taps),
- _taps(taps)
- {
- //NOP
- }
+ _cutoff = cutoff;
+ }
+
+ virtual std::string to_pp_string();
+};
+
+template <typename tap_t> class UHD_API digital_filter_base : public filter_info_base
+{
+protected:
+ double _rate;
+ uint32_t _interpolation;
+ uint32_t _decimation;
+ tap_t _tap_full_scale;
+ uint32_t _max_num_taps;
+ std::vector<tap_t> _taps;
+
+public:
+ typedef boost::shared_ptr<digital_filter_base> sptr;
+ digital_filter_base(filter_type type,
+ bool bypass,
+ size_t position_index,
+ double rate,
+ size_t interpolation,
+ size_t decimation,
+ double tap_full_scale,
+ size_t max_num_taps,
+ const std::vector<tap_t>& taps)
+ : filter_info_base(type, bypass, position_index)
+ , _rate(rate)
+ , _interpolation(interpolation)
+ , _decimation(decimation)
+ , _tap_full_scale(tap_full_scale)
+ , _max_num_taps(max_num_taps)
+ , _taps(taps)
+ {
+ // NOP
+ }
- UHD_INLINE double get_output_rate()
- {
- return (_bypass ? _rate : (_rate / _decimation * _interpolation));
- }
+ UHD_INLINE double get_output_rate()
+ {
+ return (_bypass ? _rate : (_rate / _decimation * _interpolation));
+ }
- UHD_INLINE double get_input_rate()
- {
- return _rate;
- }
+ UHD_INLINE double get_input_rate()
+ {
+ return _rate;
+ }
- UHD_INLINE double get_interpolation()
- {
- return _interpolation;
- }
+ UHD_INLINE double get_interpolation()
+ {
+ return _interpolation;
+ }
- UHD_INLINE double get_decimation()
- {
- return _decimation;
- }
+ UHD_INLINE double get_decimation()
+ {
+ return _decimation;
+ }
- UHD_INLINE double get_tap_full_scale()
- {
- return _tap_full_scale;
- }
+ UHD_INLINE double get_tap_full_scale()
+ {
+ return _tap_full_scale;
+ }
- UHD_INLINE std::vector<tap_t>& get_taps()
- {
- return _taps;
- }
+ UHD_INLINE std::vector<tap_t>& get_taps()
+ {
+ return _taps;
+ }
- virtual std::string to_pp_string()
- {
- std::ostringstream os;
- os<<filter_info_base::to_pp_string()<<
- "\t[digital_filter_base]"<<std::endl<<
- "\tinput rate: "<<_rate<<std::endl<<
- "\tinterpolation: "<<_interpolation<<std::endl<<
- "\tdecimation: "<<_decimation<<std::endl<<
- "\tfull-scale: "<<_tap_full_scale<<std::endl<<
- "\tmax num taps: "<<_max_num_taps<<std::endl<<
- "\ttaps: "<<std::endl;
-
- os<<"\t\t";
- for(size_t i = 0; i < _taps.size(); i++)
- {
- os<<"(tap "<<i<<": "<<_taps[i]<<")";
- if( ((i%10) == 0) && (i != 0))
- {
- os<<std::endl<<"\t\t";
- }
+ virtual std::string to_pp_string()
+ {
+ std::ostringstream os;
+ os << filter_info_base::to_pp_string() << "\t[digital_filter_base]" << std::endl
+ << "\tinput rate: " << _rate << std::endl
+ << "\tinterpolation: " << _interpolation << std::endl
+ << "\tdecimation: " << _decimation << std::endl
+ << "\tfull-scale: " << _tap_full_scale << std::endl
+ << "\tmax num taps: " << _max_num_taps << std::endl
+ << "\ttaps: " << std::endl;
+
+ os << "\t\t";
+ for (size_t i = 0; i < _taps.size(); i++) {
+ os << "(tap " << i << ": " << _taps[i] << ")";
+ if (((i % 10) == 0) && (i != 0)) {
+ os << std::endl << "\t\t";
}
- os<<std::endl;
- return std::string(os.str());
}
-
- };
-
- template<typename tap_t>
- class UHD_API digital_filter_fir : public digital_filter_base<tap_t>
+ os << std::endl;
+ return std::string(os.str());
+ }
+};
+
+template <typename tap_t>
+class UHD_API digital_filter_fir : public digital_filter_base<tap_t>
+{
+public:
+ typedef boost::shared_ptr<digital_filter_fir<tap_t> > sptr;
+
+ digital_filter_fir(filter_info_base::filter_type type,
+ bool bypass,
+ size_t position_index,
+ double rate,
+ size_t interpolation,
+ size_t decimation,
+ size_t tap_bit_width,
+ size_t max_num_taps,
+ const std::vector<tap_t>& taps)
+ : digital_filter_base<tap_t>(type,
+ bypass,
+ position_index,
+ rate,
+ interpolation,
+ decimation,
+ tap_bit_width,
+ max_num_taps,
+ taps)
{
- public:
- typedef boost::shared_ptr<digital_filter_fir<tap_t> > sptr;
-
- digital_filter_fir(
- filter_info_base::filter_type type,
- bool bypass, size_t position_index,
- double rate,
- size_t interpolation,
- size_t decimation,
- size_t tap_bit_width,
- size_t max_num_taps,
- const std::vector<tap_t>& taps
- ):
- digital_filter_base<tap_t>(type, bypass, position_index, rate, interpolation, decimation, tap_bit_width, max_num_taps, taps)
- {
- //NOP
- }
+ // NOP
+ }
- void set_taps(const std::vector<tap_t>& taps)
- {
- std::size_t num_taps = taps.size();
- if(num_taps < this->_max_num_taps){
- UHD_LOGGER_WARNING("FILTERS") << "digital_filter_fir::set_taps not enough coefficients. Appending zeros";
- std::vector<tap_t> coeffs;
- for (size_t i = 0; i < this->_max_num_taps; i++)
- {
- if(i < num_taps)
- {
- coeffs.push_back(taps[i]);
- } else {
- coeffs.push_back(0);
- }
+ void set_taps(const std::vector<tap_t>& taps)
+ {
+ std::size_t num_taps = taps.size();
+ if (num_taps < this->_max_num_taps) {
+ UHD_LOGGER_WARNING("FILTERS") << "digital_filter_fir::set_taps not enough "
+ "coefficients. Appending zeros";
+ std::vector<tap_t> coeffs;
+ for (size_t i = 0; i < this->_max_num_taps; i++) {
+ if (i < num_taps) {
+ coeffs.push_back(taps[i]);
+ } else {
+ coeffs.push_back(0);
}
- this->_taps = coeffs;
- } else {
- this->_taps = taps;
}
+ this->_taps = coeffs;
+ } else {
+ this->_taps = taps;
}
- };
+ }
+};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_FILTERS_HPP */
diff --git a/host/include/uhd/types/io_type.hpp b/host/include/uhd/types/io_type.hpp
index 3effe5cec..01e10142c 100644
--- a/host/include/uhd/types/io_type.hpp
+++ b/host/include/uhd/types/io_type.hpp
@@ -10,60 +10,59 @@
#include <uhd/config.hpp>
-namespace uhd{
+namespace uhd {
+/*!
+ * The DEPRECATED Input/Output configuration struct:
+ * Used to specify the IO type with device send/recv.
+ *
+ * Deprecated in favor of streamer interface.
+ * Its still in this file for the sake of gr-uhd swig.
+ */
+class UHD_API io_type_t
+{
+public:
/*!
- * The DEPRECATED Input/Output configuration struct:
- * Used to specify the IO type with device send/recv.
- *
- * Deprecated in favor of streamer interface.
- * Its still in this file for the sake of gr-uhd swig.
+ * Built in IO types known to the system.
*/
- class UHD_API io_type_t{
- public:
-
- /*!
- * Built in IO types known to the system.
- */
- enum tid_t{
- //! Custom type (technically unsupported by implementation)
- CUSTOM_TYPE = int('?'),
- //! Complex floating point (64-bit floats) range [-1.0, +1.0]
- COMPLEX_FLOAT64 = int('d'),
- //! Complex floating point (32-bit floats) range [-1.0, +1.0]
- COMPLEX_FLOAT32 = int('f'),
- //! Complex signed integer (16-bit integers) range [-32768, +32767]
- COMPLEX_INT16 = int('s'),
- //! Complex signed integer (8-bit integers) range [-128, 127]
- COMPLEX_INT8 = int('b')
- };
-
- /*!
- * The size of this io type in bytes.
- */
- const size_t size;
+ enum tid_t {
+ //! Custom type (technically unsupported by implementation)
+ CUSTOM_TYPE = int('?'),
+ //! Complex floating point (64-bit floats) range [-1.0, +1.0]
+ COMPLEX_FLOAT64 = int('d'),
+ //! Complex floating point (32-bit floats) range [-1.0, +1.0]
+ COMPLEX_FLOAT32 = int('f'),
+ //! Complex signed integer (16-bit integers) range [-32768, +32767]
+ COMPLEX_INT16 = int('s'),
+ //! Complex signed integer (8-bit integers) range [-128, 127]
+ COMPLEX_INT8 = int('b')
+ };
- /*!
- * The type id of this io type.
- * Good for using with switch statements.
- */
- const tid_t tid;
+ /*!
+ * The size of this io type in bytes.
+ */
+ const size_t size;
- /*!
- * Create an io type from a built-in type id.
- * \param tid a type id known to the system
- */
- io_type_t(tid_t tid);
+ /*!
+ * The type id of this io type.
+ * Good for using with switch statements.
+ */
+ const tid_t tid;
- /*!
- * Create an io type from attributes.
- * The tid will be set to custom.
- * \param size the size in bytes
- */
- io_type_t(size_t size);
+ /*!
+ * Create an io type from a built-in type id.
+ * \param tid a type id known to the system
+ */
+ io_type_t(tid_t tid);
- };
+ /*!
+ * Create an io type from attributes.
+ * The tid will be set to custom.
+ * \param size the size in bytes
+ */
+ io_type_t(size_t size);
+};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_IO_TYPE_HPP */
diff --git a/host/include/uhd/types/mac_addr.hpp b/host/include/uhd/types/mac_addr.hpp
index ff119c5de..316c5890c 100644
--- a/host/include/uhd/types/mac_addr.hpp
+++ b/host/include/uhd/types/mac_addr.hpp
@@ -12,45 +12,46 @@
#include <uhd/types/serial.hpp>
#include <string>
-namespace uhd{
+namespace uhd {
+
+/*!
+ * Wrapper for an ethernet mac address.
+ * Provides conversion between string and binary formats.
+ */
+class UHD_API mac_addr_t
+{
+public:
+ /*!
+ * Create a mac address a byte array.
+ * \param bytes a vector of bytes
+ * \return a new mac address
+ */
+ static mac_addr_t from_bytes(const byte_vector_t& bytes);
+
+ /*!
+ * Create a mac address from a string.
+ * \param mac_addr_str the string with delimiters
+ * \return a new mac address
+ */
+ static mac_addr_t from_string(const std::string& mac_addr_str);
/*!
- * Wrapper for an ethernet mac address.
- * Provides conversion between string and binary formats.
- */
- class UHD_API mac_addr_t{
- public:
- /*!
- * Create a mac address a byte array.
- * \param bytes a vector of bytes
- * \return a new mac address
- */
- static mac_addr_t from_bytes(const byte_vector_t &bytes);
-
- /*!
- * Create a mac address from a string.
- * \param mac_addr_str the string with delimiters
- * \return a new mac address
- */
- static mac_addr_t from_string(const std::string &mac_addr_str);
-
- /*!
- * Get the byte representation of the mac address.
- * \return a vector of bytes
- */
- byte_vector_t to_bytes(void) const;
-
- /*!
- * Get the string representation of this mac address.
- * \return a string with delimiters
- */
- std::string to_string(void) const;
-
- private:
- mac_addr_t(const byte_vector_t &bytes); //private constructor
- const byte_vector_t _bytes; //internal representation
- };
-
-} //namespace uhd
+ * Get the byte representation of the mac address.
+ * \return a vector of bytes
+ */
+ byte_vector_t to_bytes(void) const;
+
+ /*!
+ * Get the string representation of this mac address.
+ * \return a string with delimiters
+ */
+ std::string to_string(void) const;
+
+private:
+ mac_addr_t(const byte_vector_t& bytes); // private constructor
+ const byte_vector_t _bytes; // internal representation
+};
+
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_MAC_ADDR_HPP */
diff --git a/host/include/uhd/types/metadata.hpp b/host/include/uhd/types/metadata.hpp
index b46eb0a89..a29cae93c 100644
--- a/host/include/uhd/types/metadata.hpp
+++ b/host/include/uhd/types/metadata.hpp
@@ -13,186 +13,190 @@
#include <stdint.h>
#include <string>
-namespace uhd{
+namespace uhd {
+
+/*!
+ * RX metadata structure for describing sent IF data.
+ * Includes time specification, fragmentation flags, burst flags, and error codes.
+ * The receive routines will convert IF data headers into metadata.
+ */
+struct UHD_API rx_metadata_t
+{
+ //! Default constructor.
+ rx_metadata_t()
+ {
+ reset();
+ }
+
+ //! Reset values.
+ void reset()
+ {
+ has_time_spec = false;
+ time_spec = time_spec_t(0.0);
+ more_fragments = false;
+ fragment_offset = 0;
+ start_of_burst = false;
+ end_of_burst = false;
+ error_code = ERROR_CODE_NONE;
+ out_of_sequence = false;
+ }
+
+ //! Has time specification?
+ bool has_time_spec;
+
+ //! Time of the first sample.
+ time_spec_t time_spec;
/*!
- * RX metadata structure for describing sent IF data.
- * Includes time specification, fragmentation flags, burst flags, and error codes.
- * The receive routines will convert IF data headers into metadata.
+ * Fragmentation flag:
+ * Similar to IPv4 fragmentation:
+ * http://en.wikipedia.org/wiki/IPv4#Fragmentation_and_reassembly More fragments is
+ * true when the input buffer has insufficient size to fit an entire received packet.
+ * More fragments will be false for the last fragment.
*/
- struct UHD_API rx_metadata_t{
-
- //! Default constructor.
- rx_metadata_t()
- {
- reset();
- }
-
- //! Reset values.
- void reset()
- {
- has_time_spec = false;
- time_spec = time_spec_t(0.0);
- more_fragments = false;
- fragment_offset = 0;
- start_of_burst = false;
- end_of_burst = false;
- error_code = ERROR_CODE_NONE;
- out_of_sequence = false;
- }
-
- //! Has time specification?
- bool has_time_spec;
-
- //! Time of the first sample.
- time_spec_t time_spec;
+ bool more_fragments;
- /*!
- * Fragmentation flag:
- * Similar to IPv4 fragmentation: http://en.wikipedia.org/wiki/IPv4#Fragmentation_and_reassembly
- * More fragments is true when the input buffer has insufficient size to fit
- * an entire received packet. More fragments will be false for the last fragment.
- */
- bool more_fragments;
-
- /*!
- * Fragmentation offset:
- * The fragment offset is the sample number at the start of the receive buffer.
- * For non-fragmented receives, the fragment offset should always be zero.
- */
- size_t fragment_offset;
+ /*!
+ * Fragmentation offset:
+ * The fragment offset is the sample number at the start of the receive buffer.
+ * For non-fragmented receives, the fragment offset should always be zero.
+ */
+ size_t fragment_offset;
- //! Start of burst will be true for the first packet in the chain.
- bool start_of_burst;
+ //! Start of burst will be true for the first packet in the chain.
+ bool start_of_burst;
- //! End of burst will be true for the last packet in the chain.
- bool end_of_burst;
-
- /*!
- * The error condition on a receive call.
- *
- * Note: When an overrun occurs in continuous streaming mode,
- * the device will continue to send samples to the host.
- * For other streaming modes, streaming will discontinue
- * until the user issues a new stream command.
- *
- * The metadata fields have meaning for the following error codes:
- * - none
- * - late command
- * - broken chain
- * - overflow
- */
- enum error_code_t {
- //! No error associated with this metadata.
- ERROR_CODE_NONE = 0x0,
- //! No packet received, implementation timed-out.
- ERROR_CODE_TIMEOUT = 0x1,
- //! A stream command was issued in the past.
- ERROR_CODE_LATE_COMMAND = 0x2,
- //! Expected another stream command.
- ERROR_CODE_BROKEN_CHAIN = 0x4,
- /*!
- * An internal receive buffer has filled or a sequence error has been detected.
- * So, why is this overloaded? Simple: legacy support. It would have been much cleaner
- * to create a separate error code for a sequence error, but that would have broken
- * legacy applications. So, the out_of_sequence flag was added to differentiate between
- * the two error cases. In either case, data is missing between this time_spec and the
- * and the time_spec of the next successful receive.
- */
- ERROR_CODE_OVERFLOW = 0x8,
- //! Multi-channel alignment failed.
- ERROR_CODE_ALIGNMENT = 0xc,
- //! The packet could not be parsed.
- ERROR_CODE_BAD_PACKET = 0xf
- } error_code;
-
- //! Out of sequence. The transport has either dropped a packet or received data out of order.
- bool out_of_sequence;
+ //! End of burst will be true for the last packet in the chain.
+ bool end_of_burst;
+ /*!
+ * The error condition on a receive call.
+ *
+ * Note: When an overrun occurs in continuous streaming mode,
+ * the device will continue to send samples to the host.
+ * For other streaming modes, streaming will discontinue
+ * until the user issues a new stream command.
+ *
+ * The metadata fields have meaning for the following error codes:
+ * - none
+ * - late command
+ * - broken chain
+ * - overflow
+ */
+ enum error_code_t {
+ //! No error associated with this metadata.
+ ERROR_CODE_NONE = 0x0,
+ //! No packet received, implementation timed-out.
+ ERROR_CODE_TIMEOUT = 0x1,
+ //! A stream command was issued in the past.
+ ERROR_CODE_LATE_COMMAND = 0x2,
+ //! Expected another stream command.
+ ERROR_CODE_BROKEN_CHAIN = 0x4,
/*!
- * Convert a rx_metadata_t into a pretty print string.
- *
- * \param compact Set to false for a more verbose output.
- * \return a printable string representing the metadata.
+ * An internal receive buffer has filled or a sequence error has been detected.
+ * So, why is this overloaded? Simple: legacy support. It would have been much
+ * cleaner to create a separate error code for a sequence error, but that would
+ * have broken legacy applications. So, the out_of_sequence flag was added to
+ * differentiate between the two error cases. In either case, data is missing
+ * between this time_spec and the and the time_spec of the next successful
+ * receive.
*/
- std::string to_pp_string(bool compact=true) const;
+ ERROR_CODE_OVERFLOW = 0x8,
+ //! Multi-channel alignment failed.
+ ERROR_CODE_ALIGNMENT = 0xc,
+ //! The packet could not be parsed.
+ ERROR_CODE_BAD_PACKET = 0xf
+ } error_code;
- /*!
- * Similar to C's strerror() function, creates a std::string describing the error code.
- * \return a printable string representing the error.
- */
- std::string strerror(void) const;
- };
+ //! Out of sequence. The transport has either dropped a packet or received data out
+ //! of order.
+ bool out_of_sequence;
/*!
- * TX metadata structure for describing received IF data.
- * Includes time specification, and start and stop burst flags.
- * The send routines will convert the metadata to IF data headers.
+ * Convert a rx_metadata_t into a pretty print string.
+ *
+ * \param compact Set to false for a more verbose output.
+ * \return a printable string representing the metadata.
*/
- struct UHD_API tx_metadata_t{
- /*!
- * Has time specification?
- * - Set false to send immediately.
- * - Set true to send at the time specified by time spec.
- */
- bool has_time_spec;
+ std::string to_pp_string(bool compact = true) const;
- //! When to send the first sample.
- time_spec_t time_spec;
+ /*!
+ * Similar to C's strerror() function, creates a std::string describing the error
+ * code. \return a printable string representing the error.
+ */
+ std::string strerror(void) const;
+};
+
+/*!
+ * TX metadata structure for describing received IF data.
+ * Includes time specification, and start and stop burst flags.
+ * The send routines will convert the metadata to IF data headers.
+ */
+struct UHD_API tx_metadata_t
+{
+ /*!
+ * Has time specification?
+ * - Set false to send immediately.
+ * - Set true to send at the time specified by time spec.
+ */
+ bool has_time_spec;
- //! Set start of burst to true for the first packet in the chain.
- bool start_of_burst;
+ //! When to send the first sample.
+ time_spec_t time_spec;
- //! Set end of burst to true for the last packet in the chain.
- bool end_of_burst;
+ //! Set start of burst to true for the first packet in the chain.
+ bool start_of_burst;
- /*!
- * The default constructor:
- * Sets the fields to default values (flags set to false).
- */
- tx_metadata_t(void);
- };
+ //! Set end of burst to true for the last packet in the chain.
+ bool end_of_burst;
/*!
- * Async metadata structure for describing transmit related events.
+ * The default constructor:
+ * Sets the fields to default values (flags set to false).
*/
- struct UHD_API async_metadata_t{
- //! The channel number in a mimo configuration
- size_t channel;
+ tx_metadata_t(void);
+};
- //! Has time specification?
- bool has_time_spec;
+/*!
+ * Async metadata structure for describing transmit related events.
+ */
+struct UHD_API async_metadata_t
+{
+ //! The channel number in a mimo configuration
+ size_t channel;
- //! When the async event occurred.
- time_spec_t time_spec;
+ //! Has time specification?
+ bool has_time_spec;
- /*!
- * The type of event for a receive async message call.
- */
- enum event_code_t {
- //! A burst was successfully transmitted.
- EVENT_CODE_BURST_ACK = 0x1,
- //! An internal send buffer has emptied.
- EVENT_CODE_UNDERFLOW = 0x2,
- //! Packet loss between host and device.
- EVENT_CODE_SEQ_ERROR = 0x4,
- //! Packet had time that was late.
- EVENT_CODE_TIME_ERROR = 0x8,
- //! Underflow occurred inside a packet.
- EVENT_CODE_UNDERFLOW_IN_PACKET = 0x10,
- //! Packet loss within a burst.
- EVENT_CODE_SEQ_ERROR_IN_BURST = 0x20,
- //! Some kind of custom user payload
- EVENT_CODE_USER_PAYLOAD = 0x40
- } event_code;
+ //! When the async event occurred.
+ time_spec_t time_spec;
- /*!
- * A special payload populated by custom FPGA fabric.
- */
- uint32_t user_payload[4];
+ /*!
+ * The type of event for a receive async message call.
+ */
+ enum event_code_t {
+ //! A burst was successfully transmitted.
+ EVENT_CODE_BURST_ACK = 0x1,
+ //! An internal send buffer has emptied.
+ EVENT_CODE_UNDERFLOW = 0x2,
+ //! Packet loss between host and device.
+ EVENT_CODE_SEQ_ERROR = 0x4,
+ //! Packet had time that was late.
+ EVENT_CODE_TIME_ERROR = 0x8,
+ //! Underflow occurred inside a packet.
+ EVENT_CODE_UNDERFLOW_IN_PACKET = 0x10,
+ //! Packet loss within a burst.
+ EVENT_CODE_SEQ_ERROR_IN_BURST = 0x20,
+ //! Some kind of custom user payload
+ EVENT_CODE_USER_PAYLOAD = 0x40
+ } event_code;
- };
+ /*!
+ * A special payload populated by custom FPGA fabric.
+ */
+ uint32_t user_payload[4];
+};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_METADATA_HPP */
diff --git a/host/include/uhd/types/otw_type.hpp b/host/include/uhd/types/otw_type.hpp
index 6dc634fc8..ff761cc55 100644
--- a/host/include/uhd/types/otw_type.hpp
+++ b/host/include/uhd/types/otw_type.hpp
@@ -1,2 +1,2 @@
-//The OTW type API has been deprecated in favor of the streamer interface
+// The OTW type API has been deprecated in favor of the streamer interface
#include <uhd/deprecated.hpp>
diff --git a/host/include/uhd/types/ranges.hpp b/host/include/uhd/types/ranges.hpp
index 862b5ba8a..982fdae98 100644
--- a/host/include/uhd/types/ranges.hpp
+++ b/host/include/uhd/types/ranges.hpp
@@ -12,104 +12,106 @@
#include <string>
#include <vector>
-namespace uhd{
+namespace uhd {
+
+/*!
+ * A range object describes a set of discrete values of the form:
+ * y = start + step*n, where n is an integer between 0 and (stop - start)/step
+ */
+class UHD_API range_t
+{
+public:
+ /*!
+ * Create a range from a single value.
+ * The step size will be taken as zero.
+ * \param value the only possible value in this range
+ */
+ range_t(double value = 0);
/*!
- * A range object describes a set of discrete values of the form:
- * y = start + step*n, where n is an integer between 0 and (stop - start)/step
+ * Create a range from a full set of values.
+ * A step size of zero implies infinite precision.
+ * \param start the minimum value for this range
+ * \param stop the maximum value for this range
+ * \param step the step size for this range
*/
- class UHD_API range_t{
- public:
+ range_t(double start, double stop, double step = 0);
- /*!
- * Create a range from a single value.
- * The step size will be taken as zero.
- * \param value the only possible value in this range
- */
- range_t(double value = 0);
+ //! Get the start value for this range.
+ double start(void) const;
- /*!
- * Create a range from a full set of values.
- * A step size of zero implies infinite precision.
- * \param start the minimum value for this range
- * \param stop the maximum value for this range
- * \param step the step size for this range
- */
- range_t(double start, double stop, double step = 0);
+ //! Get the stop value for this range.
+ double stop(void) const;
- //! Get the start value for this range.
- double start(void) const;
+ //! Get the step value for this range.
+ double step(void) const;
- //! Get the stop value for this range.
- double stop(void) const;
+ //! Convert this range to a printable string
+ const std::string to_pp_string(void) const;
- //! Get the step value for this range.
- double step(void) const;
+ //! Equality operator
+ bool operator==(const range_t& other) const;
- //! Convert this range to a printable string
- const std::string to_pp_string(void) const;
+ //! Inequality operator
+ bool operator!=(const range_t& other) const;
- //! Equality operator
- bool operator==(const range_t &other) const;
+private:
+ double _start, _stop, _step;
+};
- //! Inequality operator
- bool operator!=(const range_t &other) const;
+/*!
+ * A meta-range object holds a list of individual ranges.
+ */
+struct UHD_API meta_range_t : std::vector<range_t>
+{
+ //! A default constructor for an empty meta-range
+ meta_range_t(void);
- private: double _start, _stop, _step;
- };
+ /*!
+ * Input iterator constructor:
+ * Makes boost::assign::list_of work.
+ * \param first the begin iterator
+ * \param last the end iterator
+ */
+ template <typename InputIterator>
+ meta_range_t(InputIterator first, InputIterator last)
+ : std::vector<range_t>(first, last)
+ { /* NOP */
+ }
/*!
- * A meta-range object holds a list of individual ranges.
+ * A convenience constructor for a single range.
+ * A step size of zero implies infinite precision.
+ * \param start the minimum value for this range
+ * \param stop the maximum value for this range
+ * \param step the step size for this range
*/
- struct UHD_API meta_range_t : std::vector<range_t>{
-
- //! A default constructor for an empty meta-range
- meta_range_t(void);
-
- /*!
- * Input iterator constructor:
- * Makes boost::assign::list_of work.
- * \param first the begin iterator
- * \param last the end iterator
- */
- template <typename InputIterator>
- meta_range_t(InputIterator first, InputIterator last):
- std::vector<range_t>(first, last){ /* NOP */ }
-
- /*!
- * A convenience constructor for a single range.
- * A step size of zero implies infinite precision.
- * \param start the minimum value for this range
- * \param stop the maximum value for this range
- * \param step the step size for this range
- */
- meta_range_t(double start, double stop, double step = 0);
-
- //! Get the overall start value for this meta-range.
- double start(void) const;
-
- //! Get the overall stop value for this meta-range.
- double stop(void) const;
-
- //! Get the overall step value for this meta-range.
- double step(void) const;
-
- /*!
- * Clip the target value to a possible range value.
- * \param value the value to clip to this range
- * \param clip_step if true, clip to steps as well
- * \return a value that is in one of the ranges
- */
- double clip(double value, bool clip_step = false) const;
-
- //! Convert this meta-range to a printable string
- const std::string to_pp_string(void) const;
-
- };
-
- typedef meta_range_t gain_range_t;
- typedef meta_range_t freq_range_t;
-
-} //namespace uhd
+ meta_range_t(double start, double stop, double step = 0);
+
+ //! Get the overall start value for this meta-range.
+ double start(void) const;
+
+ //! Get the overall stop value for this meta-range.
+ double stop(void) const;
+
+ //! Get the overall step value for this meta-range.
+ double step(void) const;
+
+ /*!
+ * Clip the target value to a possible range value.
+ * \param value the value to clip to this range
+ * \param clip_step if true, clip to steps as well
+ * \return a value that is in one of the ranges
+ */
+ double clip(double value, bool clip_step = false) const;
+
+ //! Convert this meta-range to a printable string
+ const std::string to_pp_string(void) const;
+};
+
+typedef meta_range_t gain_range_t;
+typedef meta_range_t freq_range_t;
+
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_RANGES_HPP */
diff --git a/host/include/uhd/types/ref_vector.hpp b/host/include/uhd/types/ref_vector.hpp
index 6cbc5edd9..2a1fc0aad 100644
--- a/host/include/uhd/types/ref_vector.hpp
+++ b/host/include/uhd/types/ref_vector.hpp
@@ -11,22 +11,23 @@
#include <uhd/config.hpp>
#include <cstddef>
-namespace uhd{
+namespace uhd {
/*!
* Reference vector:
* - Provides a std::vector-like interface for an array.
* - Statically sized, and does not manage the memory.
*/
-template <typename T> class UHD_API ref_vector{
+template <typename T> class UHD_API ref_vector
+{
public:
/*!
* Create a reference vector of size 1 from a pointer.
* Therefore: rv[0] == ptr and rv.size() == 1
* \param ptr a pointer to a chunk of memory
*/
- template <typename Ptr> ref_vector(Ptr *ptr):
- _ptr(T(ptr)), _mem(_mem_t(&_ptr)), _size(1)
+ template <typename Ptr>
+ ref_vector(Ptr* ptr) : _ptr(T(ptr)), _mem(_mem_t(&_ptr)), _size(1)
{
/* NOP */
}
@@ -36,8 +37,9 @@ public:
* Therefore: rv[n] == vec[n] and rv.size() == vec.size()
* \param vec a const reference to an std::vector
*/
- template <typename Vector> ref_vector(const Vector &vec):
- _ptr(T()), _mem(_mem_t(&vec.front())), _size(vec.size())
+ template <typename Vector>
+ ref_vector(const Vector& vec)
+ : _ptr(T()), _mem(_mem_t(&vec.front())), _size(vec.size())
{
/* NOP */
}
@@ -48,29 +50,30 @@ public:
* \param mem a pointer to an array of pointers
* \param len the length of the array of pointers
*/
- ref_vector(const T *mem, size_t len):
- _ptr(T()), _mem(_mem_t(mem)), _size(len)
+ ref_vector(const T* mem, size_t len) : _ptr(T()), _mem(_mem_t(mem)), _size(len)
{
/* NOP */
}
//! Index operator gets the value of rv[index]
- const T &operator[](size_t index) const{
+ const T& operator[](size_t index) const
+ {
return _mem[index];
}
//! The number of elements in this container
- size_t size(void) const{
+ size_t size(void) const
+ {
return _size;
}
private:
- const T _ptr;
- typedef T* _mem_t;
+ const T _ptr;
+ typedef T* _mem_t;
const _mem_t _mem;
const size_t _size;
};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_REF_VECTOR_HPP */
diff --git a/host/include/uhd/types/sensors.hpp b/host/include/uhd/types/sensors.hpp
index 4f1b64534..5423f2423 100644
--- a/host/include/uhd/types/sensors.hpp
+++ b/host/include/uhd/types/sensors.hpp
@@ -12,142 +12,127 @@
#include <map>
#include <string>
-namespace uhd{
+namespace uhd {
+
+/*!
+ * A sensor value stores a sensor reading as a string with unit and data type.
+ * The sensor value class can be used in the following way:
+ *
+ * sensor_value_t ref_lock_sensor("Reference", my_lock, "unlocked", "locked");
+ * std::cout << ref_lock_sensor.to_pp_string() << std::endl;
+ * //prints Reference: locked
+ *
+ * sensor_value_t temp_sensor("Temperature", my_temp, "C");
+ * std::cout << temp_sensor.to_pp_string() << std::endl;
+ * //prints Temperature: 38.5 C
+ */
+struct UHD_API sensor_value_t
+{
+ typedef std::map<std::string, std::string> sensor_map_t;
/*!
- * A sensor value stores a sensor reading as a string with unit and data type.
- * The sensor value class can be used in the following way:
+ * Create a sensor value from a boolean.
+ * \param name the name of the sensor
+ * \param value the value true or false
+ * \param utrue the unit string when value is true
+ * \param ufalse the unit string when value is false
+ */
+ sensor_value_t(const std::string& name,
+ bool value,
+ const std::string& utrue,
+ const std::string& ufalse);
+
+ /*!
+ * Create a sensor value from an integer.
+ * \param name the name of the sensor
+ * \param value the signed integer value
+ * \param unit the associated unit type
+ * \param formatter the formatter string
+ */
+ sensor_value_t(const std::string& name,
+ signed value,
+ const std::string& unit,
+ const std::string& formatter = "%d");
+
+ /*!
+ * Create a sensor value from a real number.
+ * \param name the name of the sensor
+ * \param value the real number value
+ * \param unit the associated unit type
+ * \param formatter the formatter string
+ */
+ sensor_value_t(const std::string& name,
+ double value,
+ const std::string& unit,
+ const std::string& formatter = "%f");
+
+ /*!
+ * Create a sensor value from a string.
+ * \param name the name of the sensor
+ * \param value the real number value
+ * \param unit the associated unit type
+ */
+ sensor_value_t(
+ const std::string& name, const std::string& value, const std::string& unit);
+
+ /*!
+ * Create a sensor value from a map.
*
- * sensor_value_t ref_lock_sensor("Reference", my_lock, "unlocked", "locked");
- * std::cout << ref_lock_sensor.to_pp_string() << std::endl;
- * //prints Reference: locked
+ * The map must have the following keys: name, type, value, and unit.
*
- * sensor_value_t temp_sensor("Temperature", my_temp, "C");
- * std::cout << temp_sensor.to_pp_string() << std::endl;
- * //prints Temperature: 38.5 C
+ * type must one of the following strings: BOOLEAN, INTEGER, REALNUM,
+ * or STRING (see data_type_t).
*/
- struct UHD_API sensor_value_t{
- typedef std::map<std::string, std::string> sensor_map_t;
-
- /*!
- * Create a sensor value from a boolean.
- * \param name the name of the sensor
- * \param value the value true or false
- * \param utrue the unit string when value is true
- * \param ufalse the unit string when value is false
- */
- sensor_value_t(
- const std::string &name,
- bool value,
- const std::string &utrue,
- const std::string &ufalse
- );
-
- /*!
- * Create a sensor value from an integer.
- * \param name the name of the sensor
- * \param value the signed integer value
- * \param unit the associated unit type
- * \param formatter the formatter string
- */
- sensor_value_t(
- const std::string &name,
- signed value,
- const std::string &unit,
- const std::string &formatter = "%d"
- );
-
- /*!
- * Create a sensor value from a real number.
- * \param name the name of the sensor
- * \param value the real number value
- * \param unit the associated unit type
- * \param formatter the formatter string
- */
- sensor_value_t(
- const std::string &name,
- double value,
- const std::string &unit,
- const std::string &formatter = "%f"
- );
-
- /*!
- * Create a sensor value from a string.
- * \param name the name of the sensor
- * \param value the real number value
- * \param unit the associated unit type
- */
- sensor_value_t(
- const std::string &name,
- const std::string &value,
- const std::string &unit
- );
-
- /*!
- * Create a sensor value from a map.
- *
- * The map must have the following keys: name, type, value, and unit.
- *
- * type must one of the following strings: BOOLEAN, INTEGER, REALNUM,
- * or STRING (see data_type_t).
- */
- sensor_value_t(
- const std::map<std::string, std::string> &sensor_dict
- );
-
- /*!
- * Create a sensor value from another sensor value.
- * \param source the source sensor value to copy
- */
- sensor_value_t(const sensor_value_t& source);
-
- //! convert the sensor value to a boolean
- bool to_bool(void) const;
-
- //! convert the sensor value to an integer
- signed to_int(void) const;
-
- //! convert the sensor value to real number
- double to_real(void) const;
-
- //! convert the sensor value to sensor_map_t
- sensor_map_t to_map(void) const;
-
- //! The name of the sensor value
- std::string name;
-
- /*!
- * The sensor value as a string.
- * For integer and real number types, this will be the output of the formatter.
- * For boolean types, the value will be the string literal "true" or "false".
- */
- std::string value;
-
- /*!
- * The sensor value's unit type.
- * For boolean types, this will be the one of the two units
- * depending upon the value of the boolean true or false.
- */
- std::string unit;
-
- //! Enumeration of possible data types in a sensor
- enum data_type_t {
- BOOLEAN = 'b',
- INTEGER = 'i',
- REALNUM = 'r',
- STRING = 's'
- };
-
- //! The data type of the value
- data_type_t type;
-
- //! Convert this sensor value into a printable string
- std::string to_pp_string(void) const;
-
- //! Assignment operator for sensor value
- sensor_value_t& operator=(const sensor_value_t& value);
- };
-
-} //namespace uhd
+ sensor_value_t(const std::map<std::string, std::string>& sensor_dict);
+
+ /*!
+ * Create a sensor value from another sensor value.
+ * \param source the source sensor value to copy
+ */
+ sensor_value_t(const sensor_value_t& source);
+
+ //! convert the sensor value to a boolean
+ bool to_bool(void) const;
+
+ //! convert the sensor value to an integer
+ signed to_int(void) const;
+
+ //! convert the sensor value to real number
+ double to_real(void) const;
+
+ //! convert the sensor value to sensor_map_t
+ sensor_map_t to_map(void) const;
+
+ //! The name of the sensor value
+ std::string name;
+
+ /*!
+ * The sensor value as a string.
+ * For integer and real number types, this will be the output of the formatter.
+ * For boolean types, the value will be the string literal "true" or "false".
+ */
+ std::string value;
+
+ /*!
+ * The sensor value's unit type.
+ * For boolean types, this will be the one of the two units
+ * depending upon the value of the boolean true or false.
+ */
+ std::string unit;
+
+ //! Enumeration of possible data types in a sensor
+ enum data_type_t { BOOLEAN = 'b', INTEGER = 'i', REALNUM = 'r', STRING = 's' };
+
+ //! The data type of the value
+ data_type_t type;
+
+ //! Convert this sensor value into a printable string
+ std::string to_pp_string(void) const;
+
+ //! Assignment operator for sensor value
+ sensor_value_t& operator=(const sensor_value_t& value);
+};
+
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_SENSORS_HPP */
diff --git a/host/include/uhd/types/serial.hpp b/host/include/uhd/types/serial.hpp
index 5ede2d4f5..b68c68870 100644
--- a/host/include/uhd/types/serial.hpp
+++ b/host/include/uhd/types/serial.hpp
@@ -9,198 +9,176 @@
#define INCLUDED_UHD_TYPES_SERIAL_HPP
#include <uhd/config.hpp>
-#include <boost/shared_ptr.hpp>
#include <stdint.h>
+#include <boost/shared_ptr.hpp>
#include <vector>
-namespace uhd{
+namespace uhd {
+
+/*!
+ * Byte vector typedef for passing data in and out of I2C interfaces.
+ */
+typedef std::vector<uint8_t> byte_vector_t;
+
+/*!
+ * The i2c interface class:
+ * Provides i2c and eeprom functionality.
+ * A subclass should only have to implement the i2c routines.
+ * An eeprom implementation comes for free with the interface.
+ *
+ * The eeprom routines are implemented on top of i2c.
+ * The built in eeprom implementation only does single
+ * byte reads and byte writes over the i2c interface,
+ * so it should be portable across multiple eeproms.
+ * Override the eeprom routines if this is not acceptable.
+ */
+class UHD_API i2c_iface
+{
+public:
+ typedef boost::shared_ptr<i2c_iface> sptr;
+
+ virtual ~i2c_iface(void);
+
+ //! Create an i2c_iface than can talk to 16 bit addressable EEPROMS
+ i2c_iface::sptr eeprom16(void);
+
+ /*!
+ * Write bytes over the i2c.
+ * \param addr the address
+ * \param buf the vector of bytes
+ */
+ virtual void write_i2c(uint16_t addr, const byte_vector_t& buf) = 0;
+
+ /*!
+ * Read bytes over the i2c.
+ * \param addr the address
+ * \param num_bytes number of bytes to read
+ * \return a vector of bytes
+ */
+ virtual byte_vector_t read_i2c(uint16_t addr, size_t num_bytes) = 0;
+
+ /*!
+ * Write bytes to an eeprom.
+ * \param addr the address
+ * \param offset byte offset
+ * \param buf the vector of bytes
+ */
+ virtual void write_eeprom(uint16_t addr, uint16_t offset, const byte_vector_t& buf);
+
+ /*!
+ * Read bytes from an eeprom.
+ * \param addr the address
+ * \param offset byte offset
+ * \param num_bytes number of bytes to read
+ * \return a vector of bytes
+ */
+ virtual byte_vector_t read_eeprom(uint16_t addr, uint16_t offset, size_t num_bytes);
+};
+
+/*!
+ * The SPI configuration struct:
+ * Used to configure a SPI transaction interface.
+ */
+struct UHD_API spi_config_t
+{
+ /*!
+ * The edge type specifies when data is valid
+ * relative to the edge of the serial clock.
+ */
+ enum edge_t { EDGE_RISE = 'r', EDGE_FALL = 'f' };
+
+ //! on what edge is the mosi data valid?
+ edge_t mosi_edge;
+
+ //! on what edge is the miso data valid?
+ edge_t miso_edge;
+
+ //! Set the clock speed for this transaction
+ bool use_custom_divider;
+
+ //! Optionally set the SPI clock divider for this transaction
+ size_t divider;
+
+ /*!
+ * Create a new spi config.
+ * \param edge the default edge for mosi and miso
+ */
+ spi_config_t(edge_t edge = EDGE_RISE);
+};
+
+/*!
+ * The SPI interface class.
+ * Provides routines to transact SPI and do other useful things which haven't been defined
+ * yet.
+ */
+class UHD_API spi_iface
+{
+public:
+ typedef boost::shared_ptr<spi_iface> sptr;
+
+ virtual ~spi_iface(void);
/*!
- * Byte vector typedef for passing data in and out of I2C interfaces.
+ * Perform a spi transaction.
+ * \param which_slave the slave device number
+ * \param config spi config args
+ * \param data the bits to write
+ * \param num_bits how many bits in data
+ * \param readback true to readback a value
+ * \return spi data if readback set
*/
- typedef std::vector<uint8_t> byte_vector_t;
+ virtual uint32_t transact_spi(int which_slave,
+ const spi_config_t& config,
+ uint32_t data,
+ size_t num_bits,
+ bool readback) = 0;
/*!
- * The i2c interface class:
- * Provides i2c and eeprom functionality.
- * A subclass should only have to implement the i2c routines.
- * An eeprom implementation comes for free with the interface.
- *
- * The eeprom routines are implemented on top of i2c.
- * The built in eeprom implementation only does single
- * byte reads and byte writes over the i2c interface,
- * so it should be portable across multiple eeproms.
- * Override the eeprom routines if this is not acceptable.
+ * Read from the SPI bus.
+ * \param which_slave the slave device number
+ * \param config spi config args
+ * \param data the bits to write out (be sure to set write bit)
+ * \param num_bits how many bits in data
+ * \return spi data
*/
- class UHD_API i2c_iface{
- public:
- typedef boost::shared_ptr<i2c_iface> sptr;
-
- virtual ~i2c_iface(void);
-
- //! Create an i2c_iface than can talk to 16 bit addressable EEPROMS
- i2c_iface::sptr eeprom16(void);
-
- /*!
- * Write bytes over the i2c.
- * \param addr the address
- * \param buf the vector of bytes
- */
- virtual void write_i2c(
- uint16_t addr,
- const byte_vector_t &buf
- ) = 0;
-
- /*!
- * Read bytes over the i2c.
- * \param addr the address
- * \param num_bytes number of bytes to read
- * \return a vector of bytes
- */
- virtual byte_vector_t read_i2c(
- uint16_t addr,
- size_t num_bytes
- ) = 0;
-
- /*!
- * Write bytes to an eeprom.
- * \param addr the address
- * \param offset byte offset
- * \param buf the vector of bytes
- */
- virtual void write_eeprom(
- uint16_t addr,
- uint16_t offset,
- const byte_vector_t &buf
- );
-
- /*!
- * Read bytes from an eeprom.
- * \param addr the address
- * \param offset byte offset
- * \param num_bytes number of bytes to read
- * \return a vector of bytes
- */
- virtual byte_vector_t read_eeprom(
- uint16_t addr,
- uint16_t offset,
- size_t num_bytes
- );
- };
+ virtual uint32_t read_spi(
+ int which_slave, const spi_config_t& config, uint32_t data, size_t num_bits);
/*!
- * The SPI configuration struct:
- * Used to configure a SPI transaction interface.
+ * Write to the SPI bus.
+ * \param which_slave the slave device number
+ * \param config spi config args
+ * \param data the bits to write
+ * \param num_bits how many bits in data
*/
- struct UHD_API spi_config_t{
- /*!
- * The edge type specifies when data is valid
- * relative to the edge of the serial clock.
- */
- enum edge_t{
- EDGE_RISE = 'r',
- EDGE_FALL = 'f'
- };
-
- //! on what edge is the mosi data valid?
- edge_t mosi_edge;
-
- //! on what edge is the miso data valid?
- edge_t miso_edge;
-
- //! Set the clock speed for this transaction
- bool use_custom_divider;
-
- //! Optionally set the SPI clock divider for this transaction
- size_t divider;
-
- /*!
- * Create a new spi config.
- * \param edge the default edge for mosi and miso
- */
- spi_config_t(edge_t edge = EDGE_RISE);
- };
+ virtual void write_spi(
+ int which_slave, const spi_config_t& config, uint32_t data, size_t num_bits);
+};
+
+/*!
+ * UART interface to write and read strings.
+ */
+class UHD_API uart_iface
+{
+public:
+ typedef boost::shared_ptr<uart_iface> sptr;
+
+ virtual ~uart_iface(void);
/*!
- * The SPI interface class.
- * Provides routines to transact SPI and do other useful things which haven't been defined yet.
+ * Write to a serial port.
+ * \param buf the data to write
*/
- class UHD_API spi_iface{
- public:
- typedef boost::shared_ptr<spi_iface> sptr;
-
- virtual ~spi_iface(void);
-
- /*!
- * Perform a spi transaction.
- * \param which_slave the slave device number
- * \param config spi config args
- * \param data the bits to write
- * \param num_bits how many bits in data
- * \param readback true to readback a value
- * \return spi data if readback set
- */
- virtual uint32_t transact_spi(
- int which_slave,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits,
- bool readback
- ) = 0;
-
- /*!
- * Read from the SPI bus.
- * \param which_slave the slave device number
- * \param config spi config args
- * \param data the bits to write out (be sure to set write bit)
- * \param num_bits how many bits in data
- * \return spi data
- */
- virtual uint32_t read_spi(
- int which_slave,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
- );
-
- /*!
- * Write to the SPI bus.
- * \param which_slave the slave device number
- * \param config spi config args
- * \param data the bits to write
- * \param num_bits how many bits in data
- */
- virtual void write_spi(
- int which_slave,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
- );
- };
+ virtual void write_uart(const std::string& buf) = 0;
/*!
- * UART interface to write and read strings.
+ * Read a line from a serial port.
+ * \param timeout the timeout in seconds
+ * \return the line or empty string upon timeout
*/
- class UHD_API uart_iface{
- public:
- typedef boost::shared_ptr<uart_iface> sptr;
-
- virtual ~uart_iface(void);
-
- /*!
- * Write to a serial port.
- * \param buf the data to write
- */
- virtual void write_uart(const std::string &buf) = 0;
-
- /*!
- * Read a line from a serial port.
- * \param timeout the timeout in seconds
- * \return the line or empty string upon timeout
- */
- virtual std::string read_uart(double timeout) = 0;
- };
-
-} //namespace uhd
+ virtual std::string read_uart(double timeout) = 0;
+};
+
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_SERIAL_HPP */
diff --git a/host/include/uhd/types/sid.hpp b/host/include/uhd/types/sid.hpp
index bb92646d0..fe3ac1ac7 100644
--- a/host/include/uhd/types/sid.hpp
+++ b/host/include/uhd/types/sid.hpp
@@ -9,229 +9,261 @@
#define INCLUDED_UHD_TYPES_SID_HPP
#include <uhd/config.hpp>
-#include <iostream>
#include <stdint.h>
+#include <iostream>
namespace uhd {
- /*!
- * \brief Represents a stream ID (SID).
- *
- * A stream ID (SID) is an identifier for data.
- * It is a 32-Bit value which consists of 16 Bits
- * for the source address and 16 Bits for the destination
- * address.
- * Every address is split into two parts: The _address_, which
- * identifies the device used, and the _endpoint_, which identifies
- * a specific object inside the given device (e.g., a block).
- * *Note:* In the case where there are several crossbars on a single
- * device, each crossbar gets its own address.
- * Both address and endpoint are 8 bits in length. If a 16-bit address
- * is required, we use the combination of the 8-bit address and the 8-bit
- * endpoint.
- *
- * <pre>
- * +-------------+--------------+-------------+--------------+
- * | SRC address | SRC endpoint | DST address | DST endpoint |
- * +-------------+--------------+-------------+--------------+
- * </pre>
- *
- * \section sid_str_repr String Representation (pretty printing)
- *
- * The string representation of a SID is of the form
- *
- * 2.3>0.6
- *
- * The '>' symbol shows the direction, so in this case,
- * data is flowing from address 2.3 to 0.6.
- *
- * As a convention, ':' is used instead of '.' when giving the
- * SID in hexadecimal numbers, and two characters are used for each
- * address part. As an example, the following two SIDs are identical:
- *
- * 2.3>0.16 (decimal)
- * 02:03>00:10 (hexadecimal)
- *
- * The format is:
- * SRC_ADDRESS.SRC_ENDPOINT>DST_ADDRESS.DST_ENDPOINT
- *
- *
- * \section sid_block_ports Block Ports
- *
- * In the special case where a block on a crossbar is addressed, the
- * endpoint is further split up into two parts of four bits each: The
- * first four bits specify the port number on the crossbar, whereas the
- * lower four bits represent the *block port*. As an example, consider
- * the following SID, given in hexadecimal:
- *
- * 00:10>02:A1
- *
- * In this example, assume data is flowing from the host computer to an
- * X300. The crossbar address is 02. The endpoint is A1, which means we
- * are accessing a block on crossbar port A (the tenth port), and are addressing
- * block port 1.
- *
- */
- class UHD_API sid_t
- {
- public:
- //! Create an unset SID
- sid_t();
- //! Create a sid_t object from a 32-Bit SID value
- sid_t(uint32_t sid);
- //! Create a sid_t object from its four components
- sid_t(uint8_t src_addr, uint8_t src_ep, uint8_t dst_addr, uint8_t dst_ep);
- //! Convert a string representation of a SID into its numerical representation
- sid_t(const std::string &);
-
- //! Return a decimal string representation of the SID.
- std::string to_pp_string() const;
- //! Return a hexadecimal string representation of the SID.
- std::string to_pp_string_hex() const;
-
- //! Returns true if this actually holds a valid SID
- bool is_set() const { return _set; };
-
- // Getters
- //
- //! Alias for get_sid()
- inline uint32_t get() const { return get_sid(); };
- //! Returns a 32-Bit representation of the SID if set, or zero otherwise.
- inline uint32_t get_sid() const { return _set ? _sid : 0; };
- //! Return the 16-bit source address of this SID
- inline uint32_t get_src() const {
- return (_sid >> 16) & 0xFFFF;
- }
- //! Return the 16-bit destination address of this SID
- inline uint32_t get_dst() const {
- return _sid & 0xFFFF;
- }
- //! Return 8-bit address of the source
- inline uint32_t get_src_addr() const {
- return (get_src() >> 8) & 0xFF;
- }
- //! Return endpoint of the source
- inline uint32_t get_src_endpoint() const {
- return get_src() & 0xFF;
- }
- //! Return crossbar port of the source
- inline uint32_t get_src_xbarport() const {
- return (get_src_endpoint() >> 4) & 0xF;
- }
- //! Return block port of the source
- inline uint32_t get_src_blockport() const {
- return (get_src_endpoint()) & 0xF;
- }
- //! Return 8-bit address of the destination
- inline uint32_t get_dst_addr() const {
- return (get_dst() >> 8) & 0xFF;
- }
- //! Return endpoint of the destination
- inline uint32_t get_dst_endpoint() const {
- return get_dst() & 0xFF;
- }
- //! Return crossbar port of the source
- inline uint32_t get_dst_xbarport() const {
- return (get_dst_endpoint() >> 4) & 0xF;
- }
- //! Return block port of the source
- inline uint32_t get_dst_blockport() const {
- return (get_dst_endpoint()) & 0xF;
- }
-
- // Setters
-
- //! Alias for set_sid()
- void set(uint32_t new_sid) { set_sid(new_sid); };
- //! Convert a string representation of a SID into a numerical one
- // Throws uhd::value_error if the string is not a valid SID
- // representation.
- void set_from_str(const std::string &);
- void set_sid(uint32_t new_sid);
- //! Set the source address of this SID
- // (the first 16 Bits)
- void set_src(uint32_t new_addr);
- //! Set the destination address of this SID
- // (the last 16 Bits)
- void set_dst(uint32_t new_addr);
- void set_src_addr(uint32_t new_addr);
- void set_src_endpoint(uint32_t new_addr);
- void set_dst_addr(uint32_t new_addr);
- void set_dst_endpoint(uint32_t new_addr);
- void set_dst_xbarport(uint32_t new_xbarport);
- void set_dst_blockport(uint32_t new_blockport);
-
- // Manipulators
-
- //! Swaps dst and src address and returns the new SID.
- sid_t reversed() const;
-
- //! Swaps dst and src in-place. This modifies the current SID.
- void reverse();
-
- // Overloaded operators
-
- sid_t operator = (const uint32_t new_sid) {
- set_sid(new_sid);
- return *this;
- }
-
- sid_t operator = (sid_t &sid) {
- set_sid(sid.get_sid());
- return *this;
- }
-
- sid_t operator = (const sid_t &sid) {
- set_sid(sid.get_sid());
- return *this;
- }
-
- sid_t operator = (const std::string &sid_str) {
- set_from_str(sid_str);
- return *this;
- }
-
- bool operator == (const sid_t &sid) const {
- return (not _set and not sid.is_set()) or (_sid == sid.get_sid());
- }
-
- bool operator == (uint32_t sid) const {
- return _set and _sid == sid;
- }
-
- bool operator == (const std::string &sid_str) const {
- sid_t rhs(sid_str);
- return *this == rhs;
- }
-
- // overloaded type casts are tricky, but for now we'll need them
- // for backward compatibility. consider them deprecated.
-
- //! If the SID is not set, always returns zero.
- // Use is_set() to check if the return value is valid.
- operator uint32_t() const {
- return get();
- }
-
- operator bool() const {
- return _set;
- }
-
- private:
- uint32_t _sid;
- bool _set;
+/*!
+ * \brief Represents a stream ID (SID).
+ *
+ * A stream ID (SID) is an identifier for data.
+ * It is a 32-Bit value which consists of 16 Bits
+ * for the source address and 16 Bits for the destination
+ * address.
+ * Every address is split into two parts: The _address_, which
+ * identifies the device used, and the _endpoint_, which identifies
+ * a specific object inside the given device (e.g., a block).
+ * *Note:* In the case where there are several crossbars on a single
+ * device, each crossbar gets its own address.
+ * Both address and endpoint are 8 bits in length. If a 16-bit address
+ * is required, we use the combination of the 8-bit address and the 8-bit
+ * endpoint.
+ *
+ * <pre>
+ * +-------------+--------------+-------------+--------------+
+ * | SRC address | SRC endpoint | DST address | DST endpoint |
+ * +-------------+--------------+-------------+--------------+
+ * </pre>
+ *
+ * \section sid_str_repr String Representation (pretty printing)
+ *
+ * The string representation of a SID is of the form
+ *
+ * 2.3>0.6
+ *
+ * The '>' symbol shows the direction, so in this case,
+ * data is flowing from address 2.3 to 0.6.
+ *
+ * As a convention, ':' is used instead of '.' when giving the
+ * SID in hexadecimal numbers, and two characters are used for each
+ * address part. As an example, the following two SIDs are identical:
+ *
+ * 2.3>0.16 (decimal)
+ * 02:03>00:10 (hexadecimal)
+ *
+ * The format is:
+ * SRC_ADDRESS.SRC_ENDPOINT>DST_ADDRESS.DST_ENDPOINT
+ *
+ *
+ * \section sid_block_ports Block Ports
+ *
+ * In the special case where a block on a crossbar is addressed, the
+ * endpoint is further split up into two parts of four bits each: The
+ * first four bits specify the port number on the crossbar, whereas the
+ * lower four bits represent the *block port*. As an example, consider
+ * the following SID, given in hexadecimal:
+ *
+ * 00:10>02:A1
+ *
+ * In this example, assume data is flowing from the host computer to an
+ * X300. The crossbar address is 02. The endpoint is A1, which means we
+ * are accessing a block on crossbar port A (the tenth port), and are addressing
+ * block port 1.
+ *
+ */
+class UHD_API sid_t
+{
+public:
+ //! Create an unset SID
+ sid_t();
+ //! Create a sid_t object from a 32-Bit SID value
+ sid_t(uint32_t sid);
+ //! Create a sid_t object from its four components
+ sid_t(uint8_t src_addr, uint8_t src_ep, uint8_t dst_addr, uint8_t dst_ep);
+ //! Convert a string representation of a SID into its numerical representation
+ sid_t(const std::string&);
+
+ //! Return a decimal string representation of the SID.
+ std::string to_pp_string() const;
+ //! Return a hexadecimal string representation of the SID.
+ std::string to_pp_string_hex() const;
+
+ //! Returns true if this actually holds a valid SID
+ bool is_set() const
+ {
+ return _set;
+ };
+
+ // Getters
+ //
+ //! Alias for get_sid()
+ inline uint32_t get() const
+ {
+ return get_sid();
+ };
+ //! Returns a 32-Bit representation of the SID if set, or zero otherwise.
+ inline uint32_t get_sid() const
+ {
+ return _set ? _sid : 0;
+ };
+ //! Return the 16-bit source address of this SID
+ inline uint32_t get_src() const
+ {
+ return (_sid >> 16) & 0xFFFF;
+ }
+ //! Return the 16-bit destination address of this SID
+ inline uint32_t get_dst() const
+ {
+ return _sid & 0xFFFF;
+ }
+ //! Return 8-bit address of the source
+ inline uint32_t get_src_addr() const
+ {
+ return (get_src() >> 8) & 0xFF;
+ }
+ //! Return endpoint of the source
+ inline uint32_t get_src_endpoint() const
+ {
+ return get_src() & 0xFF;
+ }
+ //! Return crossbar port of the source
+ inline uint32_t get_src_xbarport() const
+ {
+ return (get_src_endpoint() >> 4) & 0xF;
+ }
+ //! Return block port of the source
+ inline uint32_t get_src_blockport() const
+ {
+ return (get_src_endpoint()) & 0xF;
+ }
+ //! Return 8-bit address of the destination
+ inline uint32_t get_dst_addr() const
+ {
+ return (get_dst() >> 8) & 0xFF;
+ }
+ //! Return endpoint of the destination
+ inline uint32_t get_dst_endpoint() const
+ {
+ return get_dst() & 0xFF;
+ }
+ //! Return crossbar port of the source
+ inline uint32_t get_dst_xbarport() const
+ {
+ return (get_dst_endpoint() >> 4) & 0xF;
+ }
+ //! Return block port of the source
+ inline uint32_t get_dst_blockport() const
+ {
+ return (get_dst_endpoint()) & 0xF;
+ }
+
+ // Setters
+
+ //! Alias for set_sid()
+ void set(uint32_t new_sid)
+ {
+ set_sid(new_sid);
};
+ //! Convert a string representation of a SID into a numerical one
+ // Throws uhd::value_error if the string is not a valid SID
+ // representation.
+ void set_from_str(const std::string&);
+ void set_sid(uint32_t new_sid);
+ //! Set the source address of this SID
+ // (the first 16 Bits)
+ void set_src(uint32_t new_addr);
+ //! Set the destination address of this SID
+ // (the last 16 Bits)
+ void set_dst(uint32_t new_addr);
+ void set_src_addr(uint32_t new_addr);
+ void set_src_endpoint(uint32_t new_addr);
+ void set_dst_addr(uint32_t new_addr);
+ void set_dst_endpoint(uint32_t new_addr);
+ void set_dst_xbarport(uint32_t new_xbarport);
+ void set_dst_blockport(uint32_t new_blockport);
+
+ // Manipulators
+
+ //! Swaps dst and src address and returns the new SID.
+ sid_t reversed() const;
+
+ //! Swaps dst and src in-place. This modifies the current SID.
+ void reverse();
+
+ // Overloaded operators
+
+ sid_t operator=(const uint32_t new_sid)
+ {
+ set_sid(new_sid);
+ return *this;
+ }
+
+ sid_t operator=(sid_t& sid)
+ {
+ set_sid(sid.get_sid());
+ return *this;
+ }
+
+ sid_t operator=(const sid_t& sid)
+ {
+ set_sid(sid.get_sid());
+ return *this;
+ }
+
+ sid_t operator=(const std::string& sid_str)
+ {
+ set_from_str(sid_str);
+ return *this;
+ }
+
+ bool operator==(const sid_t& sid) const
+ {
+ return (not _set and not sid.is_set()) or (_sid == sid.get_sid());
+ }
+
+ bool operator==(uint32_t sid) const
+ {
+ return _set and _sid == sid;
+ }
+
+ bool operator==(const std::string& sid_str) const
+ {
+ sid_t rhs(sid_str);
+ return *this == rhs;
+ }
+
+ // overloaded type casts are tricky, but for now we'll need them
+ // for backward compatibility. consider them deprecated.
+
+ //! If the SID is not set, always returns zero.
+ // Use is_set() to check if the return value is valid.
+ operator uint32_t() const
+ {
+ return get();
+ }
+
+ operator bool() const
+ {
+ return _set;
+ }
+
+private:
+ uint32_t _sid;
+ bool _set;
+};
- //! Stream output operator. Honors std::ios::hex.
- inline std::ostream& operator<< (std::ostream& out, const sid_t &sid) {
- std::ios_base::fmtflags ff = out.flags();
- if (ff & std::ios::hex) {
- out << sid.to_pp_string_hex();
- } else {
- out << sid.to_pp_string();
- }
- return out;
+//! Stream output operator. Honors std::ios::hex.
+inline std::ostream& operator<<(std::ostream& out, const sid_t& sid)
+{
+ std::ios_base::fmtflags ff = out.flags();
+ if (ff & std::ios::hex) {
+ out << sid.to_pp_string_hex();
+ } else {
+ out << sid.to_pp_string();
}
+ return out;
+}
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_SID_HPP */
diff --git a/host/include/uhd/types/stream_cmd.hpp b/host/include/uhd/types/stream_cmd.hpp
index 5628e8d92..9cd1e581f 100644
--- a/host/include/uhd/types/stream_cmd.hpp
+++ b/host/include/uhd/types/stream_cmd.hpp
@@ -11,43 +11,43 @@
#include <uhd/config.hpp>
#include <uhd/types/time_spec.hpp>
-namespace uhd{
-
- /*!
- * Command struct for configuration and control of streaming:
- *
- * A stream command defines how the device sends samples to the host.
- * Streaming is controlled by submitting a stream command to the rx dsp.
- * Granular control over what the device streams to the host can be
- * achieved through submission of multiple (carefully-crafted) commands.
- *
- * The mode parameter controls how streaming is issued to the device:
- * - "Start continuous" tells the device to stream samples indefinitely.
- * - "Stop continuous" tells the device to end continuous streaming.
- * - "Num samps and done" tells the device to stream num samps and
- * to not expect a future stream command for contiguous samples.
- * - "Num samps and more" tells the device to stream num samps and
- * to expect a future stream command for contiguous samples.
- *
- * The stream now parameter controls when the stream begins.
- * When true, the device will begin streaming ASAP. When false,
- * the device will begin streaming at a time specified by time_spec.
- */
- struct UHD_API stream_cmd_t{
-
- enum stream_mode_t {
- STREAM_MODE_START_CONTINUOUS = int('a'),
- STREAM_MODE_STOP_CONTINUOUS = int('o'),
- STREAM_MODE_NUM_SAMPS_AND_DONE = int('d'),
- STREAM_MODE_NUM_SAMPS_AND_MORE = int('m')
- } stream_mode;
- size_t num_samps;
-
- bool stream_now;
- time_spec_t time_spec;
-
- stream_cmd_t(const stream_mode_t &stream_mode);
- };
+namespace uhd {
+
+/*!
+ * Command struct for configuration and control of streaming:
+ *
+ * A stream command defines how the device sends samples to the host.
+ * Streaming is controlled by submitting a stream command to the rx dsp.
+ * Granular control over what the device streams to the host can be
+ * achieved through submission of multiple (carefully-crafted) commands.
+ *
+ * The mode parameter controls how streaming is issued to the device:
+ * - "Start continuous" tells the device to stream samples indefinitely.
+ * - "Stop continuous" tells the device to end continuous streaming.
+ * - "Num samps and done" tells the device to stream num samps and
+ * to not expect a future stream command for contiguous samples.
+ * - "Num samps and more" tells the device to stream num samps and
+ * to expect a future stream command for contiguous samples.
+ *
+ * The stream now parameter controls when the stream begins.
+ * When true, the device will begin streaming ASAP. When false,
+ * the device will begin streaming at a time specified by time_spec.
+ */
+struct UHD_API stream_cmd_t
+{
+ enum stream_mode_t {
+ STREAM_MODE_START_CONTINUOUS = int('a'),
+ STREAM_MODE_STOP_CONTINUOUS = int('o'),
+ STREAM_MODE_NUM_SAMPS_AND_DONE = int('d'),
+ STREAM_MODE_NUM_SAMPS_AND_MORE = int('m')
+ } stream_mode;
+ size_t num_samps;
+
+ bool stream_now;
+ time_spec_t time_spec;
+
+ stream_cmd_t(const stream_mode_t& stream_mode);
+};
} /* namespace uhd */
diff --git a/host/include/uhd/types/time_spec.hpp b/host/include/uhd/types/time_spec.hpp
index c8d5443a0..89655807e 100644
--- a/host/include/uhd/types/time_spec.hpp
+++ b/host/include/uhd/types/time_spec.hpp
@@ -9,122 +9,123 @@
#define INCLUDED_UHD_TYPES_TIME_SPEC_HPP
#include <uhd/config.hpp>
-#include <boost/operators.hpp>
#include <stdint.h>
+#include <boost/operators.hpp>
-namespace uhd{
+namespace uhd {
+
+/*!
+ * A time_spec_t holds a seconds and a fractional seconds time value.
+ * Depending upon usage, the time_spec_t can represent absolute times,
+ * relative times, or time differences (between absolute times).
+ *
+ * The time_spec_t provides clock-domain independent time storage,
+ * but can convert fractional seconds to/from clock-domain specific units.
+ *
+ * The fractional seconds are stored as double precision floating point.
+ * This gives the fractional seconds enough precision to unambiguously
+ * specify a clock-tick/sample-count up to rates of several petahertz.
+ */
+class UHD_API time_spec_t : boost::additive<time_spec_t>,
+ boost::additive<time_spec_t, double>,
+ boost::totally_ordered<time_spec_t>
+{
+public:
+ /*!
+ * Create a time_spec_t from a real-valued seconds count.
+ * \param secs the real-valued seconds count (default = 0)
+ */
+ time_spec_t(double secs = 0);
+
+ /*!
+ * Create a time_spec_t from whole and fractional seconds.
+ * \param full_secs the whole/integer seconds count
+ * \param frac_secs the fractional seconds count (default = 0)
+ */
+ time_spec_t(int64_t full_secs, double frac_secs = 0);
+
+ /*!
+ * Create a time_spec_t from whole seconds and fractional ticks.
+ * Translation from clock-domain specific units.
+ * \param full_secs the whole/integer seconds count
+ * \param tick_count the fractional seconds tick count
+ * \param tick_rate the number of ticks per second
+ */
+ time_spec_t(int64_t full_secs, long tick_count, double tick_rate);
+
+ /*!
+ * Create a time_spec_t from a 64-bit tick count.
+ * Translation from clock-domain specific units.
+ * \param ticks an integer count of ticks
+ * \param tick_rate the number of ticks per second
+ */
+ static time_spec_t from_ticks(long long ticks, double tick_rate);
+
+ /*!
+ * Convert the fractional seconds to clock ticks.
+ * Translation into clock-domain specific units.
+ * \param tick_rate the number of ticks per second
+ * \return the fractional seconds tick count
+ */
+ long get_tick_count(double tick_rate) const;
+
+ /*!
+ * Convert the time spec into a 64-bit tick count.
+ * Translation into clock-domain specific units.
+ * \param tick_rate the number of ticks per second
+ * \return an integer number of ticks
+ */
+ long long to_ticks(const double tick_rate) const;
+
+ /*!
+ * Get the time as a real-valued seconds count.
+ * Note: If this time_spec_t represents an absolute time,
+ * the precision of the fractional seconds may be lost.
+ * \return the real-valued seconds
+ */
+ double get_real_secs(void) const;
+
+ /*!
+ * Get the whole/integer part of the time in seconds.
+ * \return the whole/integer seconds
+ */
+ int64_t get_full_secs(void) const;
/*!
- * A time_spec_t holds a seconds and a fractional seconds time value.
- * Depending upon usage, the time_spec_t can represent absolute times,
- * relative times, or time differences (between absolute times).
- *
- * The time_spec_t provides clock-domain independent time storage,
- * but can convert fractional seconds to/from clock-domain specific units.
- *
- * The fractional seconds are stored as double precision floating point.
- * This gives the fractional seconds enough precision to unambiguously
- * specify a clock-tick/sample-count up to rates of several petahertz.
+ * Get the fractional part of the time in seconds.
+ * \return the fractional seconds
*/
- class UHD_API time_spec_t :
- boost::additive<time_spec_t>,
- boost::additive<time_spec_t, double>,
- boost::totally_ordered<time_spec_t>{
- public:
-
- /*!
- * Create a time_spec_t from a real-valued seconds count.
- * \param secs the real-valued seconds count (default = 0)
- */
- time_spec_t(double secs = 0);
-
- /*!
- * Create a time_spec_t from whole and fractional seconds.
- * \param full_secs the whole/integer seconds count
- * \param frac_secs the fractional seconds count (default = 0)
- */
- time_spec_t(int64_t full_secs, double frac_secs = 0);
-
- /*!
- * Create a time_spec_t from whole seconds and fractional ticks.
- * Translation from clock-domain specific units.
- * \param full_secs the whole/integer seconds count
- * \param tick_count the fractional seconds tick count
- * \param tick_rate the number of ticks per second
- */
- time_spec_t(int64_t full_secs, long tick_count, double tick_rate);
-
- /*!
- * Create a time_spec_t from a 64-bit tick count.
- * Translation from clock-domain specific units.
- * \param ticks an integer count of ticks
- * \param tick_rate the number of ticks per second
- */
- static time_spec_t from_ticks(long long ticks, double tick_rate);
-
- /*!
- * Convert the fractional seconds to clock ticks.
- * Translation into clock-domain specific units.
- * \param tick_rate the number of ticks per second
- * \return the fractional seconds tick count
- */
- long get_tick_count(double tick_rate) const;
-
- /*!
- * Convert the time spec into a 64-bit tick count.
- * Translation into clock-domain specific units.
- * \param tick_rate the number of ticks per second
- * \return an integer number of ticks
- */
- long long to_ticks(const double tick_rate) const;
-
- /*!
- * Get the time as a real-valued seconds count.
- * Note: If this time_spec_t represents an absolute time,
- * the precision of the fractional seconds may be lost.
- * \return the real-valued seconds
- */
- double get_real_secs(void) const;
-
- /*!
- * Get the whole/integer part of the time in seconds.
- * \return the whole/integer seconds
- */
- int64_t get_full_secs(void) const;
-
- /*!
- * Get the fractional part of the time in seconds.
- * \return the fractional seconds
- */
- double get_frac_secs(void) const;
-
- //! Implement addable interface
- time_spec_t &operator+=(const time_spec_t &);
- time_spec_t &operator+=(double &);
- //! Implement subtractable interface
- time_spec_t &operator-=(const time_spec_t &);
- time_spec_t &operator-=(double &);
-
- //private time storage details
- private:
- int64_t _full_secs;
- double _frac_secs;
- };
-
- //! Implement equality_comparable interface
- UHD_API bool operator==(const time_spec_t &, const time_spec_t &);
-
- //! Implement less_than_comparable interface
- UHD_API bool operator<(const time_spec_t &, const time_spec_t &);
-
- UHD_INLINE int64_t time_spec_t::get_full_secs(void) const{
- return this->_full_secs;
- }
-
- UHD_INLINE double time_spec_t::get_frac_secs(void) const{
- return this->_frac_secs;
- }
-
-} //namespace uhd
+ double get_frac_secs(void) const;
+
+ //! Implement addable interface
+ time_spec_t& operator+=(const time_spec_t&);
+ time_spec_t& operator+=(double&);
+ //! Implement subtractable interface
+ time_spec_t& operator-=(const time_spec_t&);
+ time_spec_t& operator-=(double&);
+
+ // private time storage details
+private:
+ int64_t _full_secs;
+ double _frac_secs;
+};
+
+//! Implement equality_comparable interface
+UHD_API bool operator==(const time_spec_t&, const time_spec_t&);
+
+//! Implement less_than_comparable interface
+UHD_API bool operator<(const time_spec_t&, const time_spec_t&);
+
+UHD_INLINE int64_t time_spec_t::get_full_secs(void) const
+{
+ return this->_full_secs;
+}
+
+UHD_INLINE double time_spec_t::get_frac_secs(void) const
+{
+ return this->_frac_secs;
+}
+
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_TIME_SPEC_HPP */
diff --git a/host/include/uhd/types/tune_request.hpp b/host/include/uhd/types/tune_request.hpp
index ec7e70619..c85ca95a1 100644
--- a/host/include/uhd/types/tune_request.hpp
+++ b/host/include/uhd/types/tune_request.hpp
@@ -11,99 +11,99 @@
#include <uhd/config.hpp>
#include <uhd/types/device_addr.hpp>
-namespace uhd{
+namespace uhd {
+/*!
+ * A tune request instructs the implementation how to tune the RF chain.
+ * The policies can be used to select automatic tuning or
+ * fined control over the daughterboard IF and DSP tuning.
+ * Not all combinations of policies are applicable.
+ * Convenience constructors are supplied for most use cases.
+ *
+ * See also \ref general_tuning
+ */
+struct UHD_API tune_request_t
+{
/*!
- * A tune request instructs the implementation how to tune the RF chain.
- * The policies can be used to select automatic tuning or
- * fined control over the daughterboard IF and DSP tuning.
- * Not all combinations of policies are applicable.
- * Convenience constructors are supplied for most use cases.
- *
- * See also \ref general_tuning
+ * Make a new tune request for a particular center frequency.
+ * Use an automatic policy for the RF and DSP frequency
+ * to tune the chain as close as possible to the target frequency.
+ * \param target_freq the target frequency in Hz
*/
- struct UHD_API tune_request_t{
- /*!
- * Make a new tune request for a particular center frequency.
- * Use an automatic policy for the RF and DSP frequency
- * to tune the chain as close as possible to the target frequency.
- * \param target_freq the target frequency in Hz
- */
- tune_request_t(double target_freq = 0);
-
- /*!
- * Make a new tune request for a particular center frequency.
- * Use a manual policy for the RF frequency,
- * and an automatic policy for the DSP frequency,
- * to tune the chain as close as possible to the target frequency.
- * \param target_freq the target frequency in Hz
- * \param lo_off the LO offset frequency in Hz
- */
- tune_request_t(double target_freq, double lo_off);
+ tune_request_t(double target_freq = 0);
- //! Policy options for tunable elements in the RF chain.
- enum policy_t {
- //! Do not set this argument, use current setting.
- POLICY_NONE = int('N'),
- //! Automatically determine the argument's value.
- POLICY_AUTO = int('A'),
- //! Use the argument's value for the setting.
- POLICY_MANUAL = int('M')
- };
+ /*!
+ * Make a new tune request for a particular center frequency.
+ * Use a manual policy for the RF frequency,
+ * and an automatic policy for the DSP frequency,
+ * to tune the chain as close as possible to the target frequency.
+ * \param target_freq the target frequency in Hz
+ * \param lo_off the LO offset frequency in Hz
+ */
+ tune_request_t(double target_freq, double lo_off);
- /*!
- * The target frequency of the overall chain in Hz.
- * Set this even if all policies are set to manual.
- */
- double target_freq;
+ //! Policy options for tunable elements in the RF chain.
+ enum policy_t {
+ //! Do not set this argument, use current setting.
+ POLICY_NONE = int('N'),
+ //! Automatically determine the argument's value.
+ POLICY_AUTO = int('A'),
+ //! Use the argument's value for the setting.
+ POLICY_MANUAL = int('M')
+ };
- /*!
- * The policy for the RF frequency.
- * Automatic behavior: the target frequency + default LO offset.
- */
- policy_t rf_freq_policy;
+ /*!
+ * The target frequency of the overall chain in Hz.
+ * Set this even if all policies are set to manual.
+ */
+ double target_freq;
- /*!
- * The RF frequency in Hz.
- * Set when the policy is set to manual.
- */
- double rf_freq;
+ /*!
+ * The policy for the RF frequency.
+ * Automatic behavior: the target frequency + default LO offset.
+ */
+ policy_t rf_freq_policy;
- /*!
- * The policy for the DSP frequency.
- * Automatic behavior: the difference between the target and IF.
- */
- policy_t dsp_freq_policy;
+ /*!
+ * The RF frequency in Hz.
+ * Set when the policy is set to manual.
+ */
+ double rf_freq;
- /*!
- * The DSP frequency in Hz.
- * Set when the policy is set to manual.
- *
- * Note that the meaning of the DSP frequency's sign differs between
- * TX and RX operations. The target frequency is the result of
- * `target_freq = rf_freq + sign * dsp_freq`. For TX, `sign` is
- * negative, and for RX, `sign` is positive.
- * Example: If both RF and DSP tuning policies are set to manual, and
- * `rf_freq` is set to 1 GHz, and `dsp_freq` is set to 10 MHz, the
- * actual target frequency is 990 MHz for a TX tune request, and
- * 1010 MHz for an RX tune request.
- */
- double dsp_freq;
+ /*!
+ * The policy for the DSP frequency.
+ * Automatic behavior: the difference between the target and IF.
+ */
+ policy_t dsp_freq_policy;
- /*!
- * The args parameter is used to pass arbitrary key/value pairs.
- * Possible keys used by args (depends on implementation):
- *
- * - mode_n: Allows the user to tell the daughterboard tune code
- * to choose between an integer N divider or fractional N divider.
- * Default is fractional N on boards that support fractional N tuning.
- * Fractional N provides greater tuning accuracy at the expense of spurs.
- * Possible options for this key: "integer" or "fractional".
- */
- device_addr_t args;
+ /*!
+ * The DSP frequency in Hz.
+ * Set when the policy is set to manual.
+ *
+ * Note that the meaning of the DSP frequency's sign differs between
+ * TX and RX operations. The target frequency is the result of
+ * `target_freq = rf_freq + sign * dsp_freq`. For TX, `sign` is
+ * negative, and for RX, `sign` is positive.
+ * Example: If both RF and DSP tuning policies are set to manual, and
+ * `rf_freq` is set to 1 GHz, and `dsp_freq` is set to 10 MHz, the
+ * actual target frequency is 990 MHz for a TX tune request, and
+ * 1010 MHz for an RX tune request.
+ */
+ double dsp_freq;
- };
+ /*!
+ * The args parameter is used to pass arbitrary key/value pairs.
+ * Possible keys used by args (depends on implementation):
+ *
+ * - mode_n: Allows the user to tell the daughterboard tune code
+ * to choose between an integer N divider or fractional N divider.
+ * Default is fractional N on boards that support fractional N tuning.
+ * Fractional N provides greater tuning accuracy at the expense of spurs.
+ * Possible options for this key: "integer" or "fractional".
+ */
+ device_addr_t args;
+};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_TUNE_REQUEST_HPP */
diff --git a/host/include/uhd/types/tune_result.hpp b/host/include/uhd/types/tune_result.hpp
index 50b4e9536..2860b50c6 100644
--- a/host/include/uhd/types/tune_result.hpp
+++ b/host/include/uhd/types/tune_result.hpp
@@ -11,68 +11,69 @@
#include <uhd/config.hpp>
#include <string>
-namespace uhd{
+namespace uhd {
- /*!
- * The tune result struct holds the RF and DSP tuned frequencies.
- */
- struct UHD_API tune_result_t{
- /*! The target RF frequency, clipped to be within system range
- *
- * If the requested frequency is within the range of the system, then
- * this variable will equal the requested frequency. If the requested
- * frequency is outside of the tunable range, however, this variable
- * will hold the value that it was 'clipped' to in order to keep tuning
- * in-bounds. */
- double clipped_rf_freq;
+/*!
+ * The tune result struct holds the RF and DSP tuned frequencies.
+ */
+struct UHD_API tune_result_t
+{
+ /*! The target RF frequency, clipped to be within system range
+ *
+ * If the requested frequency is within the range of the system, then
+ * this variable will equal the requested frequency. If the requested
+ * frequency is outside of the tunable range, however, this variable
+ * will hold the value that it was 'clipped' to in order to keep tuning
+ * in-bounds. */
+ double clipped_rf_freq;
- /*! Target RF Freq, including RF FE offset
- *
- * AUTO Tuning Policy:
- * This variable holds the requested center frequency, plus any LO
- * offset required by the radio front-end. Note that this is *not* the
- * LO offset requested by the user (if one exists), but rather one
- * required by the hardware (if required).
- *
- * MANUAL Tuning Policy:
- * This variable equals the RF frequency in the tune request. */
- double target_rf_freq;
+ /*! Target RF Freq, including RF FE offset
+ *
+ * AUTO Tuning Policy:
+ * This variable holds the requested center frequency, plus any LO
+ * offset required by the radio front-end. Note that this is *not* the
+ * LO offset requested by the user (if one exists), but rather one
+ * required by the hardware (if required).
+ *
+ * MANUAL Tuning Policy:
+ * This variable equals the RF frequency in the tune request. */
+ double target_rf_freq;
- /*! The frequency to which the RF LO actually tuned
- *
- * If this does not equal the `target_rf_freq`, then it is because the
- * target was outside of the range of the LO, or the LO was not able to
- * hit it exactly due to tuning accuracy. */
- double actual_rf_freq;
+ /*! The frequency to which the RF LO actually tuned
+ *
+ * If this does not equal the `target_rf_freq`, then it is because the
+ * target was outside of the range of the LO, or the LO was not able to
+ * hit it exactly due to tuning accuracy. */
+ double actual_rf_freq;
- /*! The frequency the CORDIC must adjust the RF
- *
- * AUTO Tuning Policy:
- * It is fairly common for the RF LO to not be able to exactly hit the
- * requested frequency. This variable holds the required adjustment the
- * CORDIC must make to the signal to bring it to the requested center
- * frequency.
- *
- * MANUAL Tuning Policy
- * This variable equals the DSP frequency in the tune request, clipped
- * to be within range of the DSP if it was outside. */
- double target_dsp_freq;
+ /*! The frequency the CORDIC must adjust the RF
+ *
+ * AUTO Tuning Policy:
+ * It is fairly common for the RF LO to not be able to exactly hit the
+ * requested frequency. This variable holds the required adjustment the
+ * CORDIC must make to the signal to bring it to the requested center
+ * frequency.
+ *
+ * MANUAL Tuning Policy
+ * This variable equals the DSP frequency in the tune request, clipped
+ * to be within range of the DSP if it was outside. */
+ double target_dsp_freq;
- /*! The frequency to which the CORDIC in the DSP actually tuned
- *
- * If we failed to hit the target DSP frequency, it is either because
- * the requested resolution wasn't possible or something went wrong in
- * the DSP. In most cases, it should equal the `target_dsp_freq` above.
- */
- double actual_dsp_freq;
+ /*! The frequency to which the CORDIC in the DSP actually tuned
+ *
+ * If we failed to hit the target DSP frequency, it is either because
+ * the requested resolution wasn't possible or something went wrong in
+ * the DSP. In most cases, it should equal the `target_dsp_freq` above.
+ */
+ double actual_dsp_freq;
- /*!
- * Create a pretty print string for this tune result struct.
- * \return the printable string
- */
- std::string to_pp_string(void) const;
- };
+ /*!
+ * Create a pretty print string for this tune result struct.
+ * \return the printable string
+ */
+ std::string to_pp_string(void) const;
+};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_TUNE_RESULT_HPP */
diff --git a/host/include/uhd/types/wb_iface.hpp b/host/include/uhd/types/wb_iface.hpp
index 53c381c86..495762118 100644
--- a/host/include/uhd/types/wb_iface.hpp
+++ b/host/include/uhd/types/wb_iface.hpp
@@ -13,8 +13,7 @@
#include <stdint.h>
#include <boost/shared_ptr.hpp>
-namespace uhd
-{
+namespace uhd {
class UHD_API wb_iface
{
@@ -85,6 +84,6 @@ public:
virtual void set_time(const time_spec_t& t) = 0;
};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_TYPES_WB_IFACE_HPP */
diff --git a/host/include/uhd/usrp/dboard_base.hpp b/host/include/uhd/usrp/dboard_base.hpp
index 9d885dfc0..8f9873399 100644
--- a/host/include/uhd/usrp/dboard_base.hpp
+++ b/host/include/uhd/usrp/dboard_base.hpp
@@ -9,20 +9,21 @@
#include <uhd/config.hpp>
#include <uhd/property_tree.hpp>
-#include <uhd/utils/pimpl.hpp>
-#include <boost/utility.hpp>
-#include <boost/shared_ptr.hpp>
+#include <uhd/usrp/dboard_eeprom.hpp>
#include <uhd/usrp/dboard_id.hpp>
#include <uhd/usrp/dboard_iface.hpp>
-#include <uhd/usrp/dboard_eeprom.hpp>
+#include <uhd/utils/pimpl.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
-namespace uhd{ namespace usrp{
+namespace uhd { namespace usrp {
/*!
* A daughter board dboard_base class for all dboards.
* Only other dboard dboard_base classes should inherit this.
*/
-class UHD_API dboard_base : boost::noncopyable{
+class UHD_API dboard_base : boost::noncopyable
+{
public:
typedef boost::shared_ptr<dboard_base> sptr;
/*!
@@ -30,13 +31,13 @@ public:
* Derived classes should pass the args into the base class,
* but should not deal with the internals of the args.
*/
- typedef void * ctor_args_t;
+ typedef void* ctor_args_t;
- //structors
+ // structors
dboard_base(ctor_args_t);
virtual ~dboard_base() {}
- //post-construction initializer
+ // post-construction initializer
virtual void initialize() {}
protected:
@@ -57,7 +58,8 @@ private:
* A xcvr daughter board implements rx and tx methods
* Sub classes for xcvr boards should inherit this.
*/
-class UHD_API xcvr_dboard_base : public dboard_base{
+class UHD_API xcvr_dboard_base : public dboard_base
+{
public:
/*!
* Create a new xcvr dboard object, override in subclasses.
@@ -70,7 +72,8 @@ public:
* A rx daughter board only implements rx methods.
* Sub classes for rx-only boards should inherit this.
*/
-class UHD_API rx_dboard_base : public dboard_base{
+class UHD_API rx_dboard_base : public dboard_base
+{
public:
/*!
* Create a new rx dboard object, override in subclasses.
@@ -83,7 +86,8 @@ public:
* A tx daughter board only implements tx methods.
* Sub classes for rx-only boards should inherit this.
*/
-class UHD_API tx_dboard_base : public dboard_base{
+class UHD_API tx_dboard_base : public dboard_base
+{
public:
/*!
* Create a new rx dboard object, override in subclasses.
@@ -92,6 +96,6 @@ public:
virtual ~tx_dboard_base() {}
};
-}} //namespace
+}} // namespace uhd::usrp
#endif /* INCLUDED_UHD_USRP_DBOARD_BASE_HPP */
diff --git a/host/include/uhd/usrp/dboard_eeprom.hpp b/host/include/uhd/usrp/dboard_eeprom.hpp
index 407d3f886..09d220bb3 100644
--- a/host/include/uhd/usrp/dboard_eeprom.hpp
+++ b/host/include/uhd/usrp/dboard_eeprom.hpp
@@ -9,14 +9,14 @@
#define INCLUDED_UHD_USRP_DBOARD_EEPROM_HPP
#include <uhd/config.hpp>
-#include <uhd/usrp/dboard_id.hpp>
#include <uhd/types/serial.hpp>
+#include <uhd/usrp/dboard_id.hpp>
#include <string>
-namespace uhd{ namespace usrp{
-
-struct UHD_API dboard_eeprom_t{
+namespace uhd { namespace usrp {
+struct UHD_API dboard_eeprom_t
+{
//! The ID for the daughterboard type
dboard_id_t id;
@@ -36,17 +36,16 @@ struct UHD_API dboard_eeprom_t{
* \param iface the serial interface with i2c
* \param addr the i2c address for the eeprom
*/
- void load(i2c_iface &iface, uint8_t addr);
+ void load(i2c_iface& iface, uint8_t addr);
/*!
* Store the object to bytes in the eeprom.
* \param iface the serial interface with i2c
* \param addr the i2c address for the eeprom
*/
- void store(i2c_iface &iface, uint8_t addr) const;
-
+ void store(i2c_iface& iface, uint8_t addr) const;
};
-}} //namespace
+}} // namespace uhd::usrp
#endif /* INCLUDED_UHD_USRP_DBOARD_EEPROM_HPP */
diff --git a/host/include/uhd/usrp/dboard_id.hpp b/host/include/uhd/usrp/dboard_id.hpp
index 76c9c190b..2b48b0e46 100644
--- a/host/include/uhd/usrp/dboard_id.hpp
+++ b/host/include/uhd/usrp/dboard_id.hpp
@@ -13,74 +13,75 @@
#include <boost/operators.hpp>
#include <string>
-namespace uhd{ namespace usrp{
+namespace uhd { namespace usrp {
- class UHD_API dboard_id_t : boost::equality_comparable<dboard_id_t>{
- public:
- /*!
- * Create a dboard id from an integer.
- * \param id the integer representation
- */
- dboard_id_t(uint16_t id = 0xffff);
-
- /*!
- * Obtain a dboard id that represents no dboard.
- * \return the dboard id with the 0xffff id.
- */
- static dboard_id_t none(void);
-
- /*!
- * Create a new dboard id from an integer representation.
- * \param uint16 an unsigned 16 bit integer
- * \return a new dboard id containing the integer
- */
- static dboard_id_t from_uint16(uint16_t uint16);
+class UHD_API dboard_id_t : boost::equality_comparable<dboard_id_t>
+{
+public:
+ /*!
+ * Create a dboard id from an integer.
+ * \param id the integer representation
+ */
+ dboard_id_t(uint16_t id = 0xffff);
- /*!
- * Get the dboard id represented as an integer.
- * \return an unsigned 16 bit integer representation
- */
- uint16_t to_uint16(void) const;
+ /*!
+ * Obtain a dboard id that represents no dboard.
+ * \return the dboard id with the 0xffff id.
+ */
+ static dboard_id_t none(void);
- /*!
- * Create a new dboard id from a string representation.
- * If the string has a 0x prefix, it will be parsed as hex.
- * \param string a numeric string, possibly hex
- * \return a new dboard id containing the integer
- */
- static dboard_id_t from_string(const std::string &string);
+ /*!
+ * Create a new dboard id from an integer representation.
+ * \param uint16 an unsigned 16 bit integer
+ * \return a new dboard id containing the integer
+ */
+ static dboard_id_t from_uint16(uint16_t uint16);
- /*!
- * Get the dboard id represented as an integer.
- * \return a hex string representation with 0x prefix
- */
- std::string to_string(void) const;
+ /*!
+ * Get the dboard id represented as an integer.
+ * \return an unsigned 16 bit integer representation
+ */
+ uint16_t to_uint16(void) const;
- /*!
- * Get the dboard id represented as a canonical name.
- * \return the canonical string representation
- */
- std::string to_cname(void) const;
+ /*!
+ * Create a new dboard id from a string representation.
+ * If the string has a 0x prefix, it will be parsed as hex.
+ * \param string a numeric string, possibly hex
+ * \return a new dboard id containing the integer
+ */
+ static dboard_id_t from_string(const std::string& string);
- /*!
- * Get the pretty print representation of this dboard id.
- * \return a string with the dboard name and id number
- */
- std::string to_pp_string(void) const;
+ /*!
+ * Get the dboard id represented as an integer.
+ * \return a hex string representation with 0x prefix
+ */
+ std::string to_string(void) const;
- private:
- uint16_t _id; //internal representation
- };
+ /*!
+ * Get the dboard id represented as a canonical name.
+ * \return the canonical string representation
+ */
+ std::string to_cname(void) const;
/*!
- * Comparator operator overloaded for dboard ids.
- * The boost::equality_comparable provides the !=.
- * \param lhs the dboard id to the left of the operator
- * \param rhs the dboard id to the right of the operator
- * \return true when the dboard ids are equal
+ * Get the pretty print representation of this dboard id.
+ * \return a string with the dboard name and id number
*/
- UHD_API bool operator==(const dboard_id_t &lhs, const dboard_id_t &rhs);
+ std::string to_pp_string(void) const;
+
+private:
+ uint16_t _id; // internal representation
+};
+
+/*!
+ * Comparator operator overloaded for dboard ids.
+ * The boost::equality_comparable provides the !=.
+ * \param lhs the dboard id to the left of the operator
+ * \param rhs the dboard id to the right of the operator
+ * \return true when the dboard ids are equal
+ */
+UHD_API bool operator==(const dboard_id_t& lhs, const dboard_id_t& rhs);
-}} //namespace
+}} // namespace uhd::usrp
#endif /* INCLUDED_UHD_USRP_DBOARD_ID_HPP */
diff --git a/host/include/uhd/usrp/dboard_iface.hpp b/host/include/uhd/usrp/dboard_iface.hpp
index 60b1954fc..162d0c6a3 100644
--- a/host/include/uhd/usrp/dboard_iface.hpp
+++ b/host/include/uhd/usrp/dboard_iface.hpp
@@ -9,21 +9,22 @@
#define INCLUDED_UHD_USRP_DBOARD_IFACE_HPP
#include <uhd/config.hpp>
-#include <uhd/utils/pimpl.hpp>
#include <uhd/types/serial.hpp>
#include <uhd/types/time_spec.hpp>
#include <uhd/usrp/fe_connection.hpp>
#include <uhd/usrp/gpio_defs.hpp>
-#include <boost/shared_ptr.hpp>
+#include <uhd/utils/pimpl.hpp>
#include <stdint.h>
+#include <boost/shared_ptr.hpp>
#include <boost/thread/thread.hpp>
#include <string>
#include <vector>
-namespace uhd{ namespace usrp{
+namespace uhd { namespace usrp {
//! Special properties that differentiate this daughterboard slot
-struct UHD_API dboard_iface_special_props_t{
+struct UHD_API dboard_iface_special_props_t
+{
/*!
* Soft clock divider:
* When a motherboard cannot provided a divided dboard clock,
@@ -49,20 +50,21 @@ struct UHD_API dboard_iface_special_props_t{
* This interface provides i2c, spi, gpio, atr, aux dac/adc access.
* Each mboard should have a specially tailored iface for its dboard.
*/
-class UHD_API dboard_iface : public uhd::i2c_iface{
+class UHD_API dboard_iface : public uhd::i2c_iface
+{
public:
typedef boost::shared_ptr<dboard_iface> sptr;
typedef dboard_iface_special_props_t special_props_t;
//! tells the host which unit to use
- enum unit_t{
+ enum unit_t {
UNIT_RX = int('r'),
UNIT_TX = int('t'),
UNIT_BOTH = int('b'),
};
//! aux dac selection enums (per unit)
- enum aux_dac_t{
+ enum aux_dac_t {
AUX_DAC_A = int('a'),
AUX_DAC_B = int('b'),
AUX_DAC_C = int('c'),
@@ -70,14 +72,11 @@ public:
};
//! aux adc selection enums (per unit)
- enum aux_adc_t{
- AUX_ADC_A = int('a'),
- AUX_ADC_B = int('b')
- };
+ enum aux_adc_t { AUX_ADC_A = int('a'), AUX_ADC_B = int('b') };
typedef uhd::usrp::gpio_atr::gpio_atr_reg_t atr_reg_t;
- virtual ~dboard_iface(void) {};
+ virtual ~dboard_iface(void){};
/*!
* Get special properties information for this dboard slot.
@@ -112,9 +111,7 @@ public:
* \param value 16-bits, 0=GPIO controlled, 1=ATR controlled
* \param mask 16-bits, 0=do not change, 1=change value
*/
- virtual void set_pin_ctrl(
- unit_t unit, uint32_t value, uint32_t mask = 0xffff
- ) = 0;
+ virtual void set_pin_ctrl(unit_t unit, uint32_t value, uint32_t mask = 0xffff) = 0;
/*!
* Read back the pin control setting.
@@ -133,8 +130,7 @@ public:
* \param mask 16-bits, 0=do not change, 1=change value
*/
virtual void set_atr_reg(
- unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask = 0xffff
- ) = 0;
+ unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask = 0xffff) = 0;
/*!
* Read back an ATR register setting.
@@ -152,9 +148,7 @@ public:
* \param value 16-bits, 0=GPIO input, 1=GPIO output
* \param mask 16-bits, 0=do not change, 1=change value
*/
- virtual void set_gpio_ddr(
- unit_t unit, uint32_t value, uint32_t mask = 0xffff
- ) = 0;
+ virtual void set_gpio_ddr(unit_t unit, uint32_t value, uint32_t mask = 0xffff) = 0;
/*!
* Read back the GPIO data direction setting.
@@ -171,9 +165,7 @@ public:
* \param value 16-bits, 0=GPIO output low, 1=GPIO output high
* \param mask 16-bits, 0=do not change, 1=change value
*/
- virtual void set_gpio_out(
- unit_t unit, uint32_t value, uint32_t mask = 0xffff
- ) = 0;
+ virtual void set_gpio_out(unit_t unit, uint32_t value, uint32_t mask = 0xffff) = 0;
/*!
* Read back the GPIO pin output setting.
@@ -200,11 +192,7 @@ public:
* \param num_bits the number of bits in data
*/
virtual void write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
- ) = 0;
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits) = 0;
/*!
* Read and write data to SPI bus peripheral.
@@ -216,11 +204,7 @@ public:
* \return the data that was read
*/
virtual uint32_t read_write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
- ) = 0;
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits) = 0;
/*!
* Set the rate of a dboard clock.
@@ -270,15 +254,16 @@ public:
* \param fe_name name of the front-end to update
* \param fe_conn connection parameters class
*/
- virtual void set_fe_connection(
- unit_t unit,
+ virtual void set_fe_connection(unit_t unit,
const std::string& fe_name,
- const uhd::usrp::fe_connection_t& fe_conn
- ) = 0;
+ const uhd::usrp::fe_connection_t& fe_conn) = 0;
/*! Returns the true if set_fe_connection() is implemented on this dboard_iface
*/
- virtual bool has_set_fe_connection(const unit_t) { return false; }
+ virtual bool has_set_fe_connection(const unit_t)
+ {
+ return false;
+ }
/*!
* Get the command time.
@@ -299,6 +284,6 @@ public:
virtual void sleep(const boost::chrono::nanoseconds& time);
};
-}} //namespace
+}} // namespace uhd::usrp
#endif /* INCLUDED_UHD_USRP_DBOARD_IFACE_HPP */
diff --git a/host/include/uhd/usrp/dboard_manager.hpp b/host/include/uhd/usrp/dboard_manager.hpp
index 9b9384fa8..cda1127fb 100644
--- a/host/include/uhd/usrp/dboard_manager.hpp
+++ b/host/include/uhd/usrp/dboard_manager.hpp
@@ -10,62 +10,61 @@
#include <uhd/config.hpp>
#include <uhd/property_tree.hpp>
#include <uhd/usrp/dboard_base.hpp>
-#include <uhd/usrp/dboard_id.hpp>
#include <uhd/usrp/dboard_eeprom.hpp>
-#include <boost/utility.hpp>
+#include <uhd/usrp/dboard_id.hpp>
#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
#include <string>
#include <vector>
-namespace uhd{ namespace usrp{
+namespace uhd { namespace usrp {
/*!
* A daughter board subdev dboard_manager class.
* Create subdev instances for each subdev on a dboard.
* Provide wax::obj access to the subdevs inside.
*/
-class UHD_API dboard_manager : boost::noncopyable{
+class UHD_API dboard_manager : boost::noncopyable
+{
public:
typedef boost::shared_ptr<dboard_manager> sptr;
- //dboard constructor (each dboard should have a ::make with this signature)
- typedef dboard_base::sptr(*dboard_ctor_t)(dboard_base::ctor_args_t);
+ // dboard constructor (each dboard should have a ::make with this signature)
+ typedef dboard_base::sptr (*dboard_ctor_t)(dboard_base::ctor_args_t);
/*!
* Register a rx or tx dboard into the system.
* For single subdevice boards, omit subdev_names.
* \param dboard_id the dboard id (rx or tx)
- * \param db_subdev_ctor the dboard sub-device constructor function pointer (one instance per subdev name)
- * \param name the canonical name for the dboard represented
+ * \param db_subdev_ctor the dboard sub-device constructor function pointer (one
+ * instance per subdev name) \param name the canonical name for the dboard represented
* \param subdev_names the names of the subdevs on this dboard
- * \param db_container_ctor the dboard container constructor function pointer (one instance per dboard)
+ * \param db_container_ctor the dboard container constructor function pointer (one
+ * instance per dboard)
*/
- static void register_dboard(
- const dboard_id_t &dboard_id,
+ static void register_dboard(const dboard_id_t& dboard_id,
dboard_ctor_t db_subdev_ctor,
- const std::string &name,
- const std::vector<std::string> &subdev_names = std::vector<std::string>(1, "0"),
- dboard_ctor_t db_container_ctor = NULL
- );
+ const std::string& name,
+ const std::vector<std::string>& subdev_names = std::vector<std::string>(1, "0"),
+ dboard_ctor_t db_container_ctor = NULL);
/*!
* Register an xcvr dboard into the system.
* For single subdevice boards, omit subdev_names.
* \param rx_dboard_id the rx unit dboard id
* \param tx_dboard_id the tx unit dboard id
- * \param db_subdev_ctor the dboard sub-device constructor function pointer (one instance per subdev name)
- * \param name the canonical name for the dboard represented
+ * \param db_subdev_ctor the dboard sub-device constructor function pointer (one
+ * instance per subdev name) \param name the canonical name for the dboard represented
* \param subdev_names the names of the subdevs on this dboard
- * \param db_container_ctor the dboard container constructor function pointer (one instance per dboard)
+ * \param db_container_ctor the dboard container constructor function pointer (one
+ * instance per dboard)
*/
- static void register_dboard(
- const dboard_id_t &rx_dboard_id,
- const dboard_id_t &tx_dboard_id,
+ static void register_dboard(const dboard_id_t& rx_dboard_id,
+ const dboard_id_t& tx_dboard_id,
dboard_ctor_t db_subdev_ctor,
- const std::string &name,
- const std::vector<std::string> &subdev_names = std::vector<std::string>(1, "0"),
- dboard_ctor_t db_container_ctor = NULL
- );
+ const std::string& name,
+ const std::vector<std::string>& subdev_names = std::vector<std::string>(1, "0"),
+ dboard_ctor_t db_container_ctor = NULL);
/*!
* Register a restricted rx or tx dboard into the system.
@@ -73,18 +72,17 @@ public:
* For single subdevice boards, omit subdev_names.
* The iface for a restricted board is not registered into the property tree.
* \param dboard_id the dboard id (rx or tx)
- * \param db_subdev_ctor the dboard sub-device constructor function pointer (one instance per subdev name)
- * \param name the canonical name for the dboard represented
+ * \param db_subdev_ctor the dboard sub-device constructor function pointer (one
+ * instance per subdev name) \param name the canonical name for the dboard represented
* \param subdev_names the names of the subdevs on this dboard
- * \param db_container_ctor the dboard container constructor function pointer (one instance per dboard)
+ * \param db_container_ctor the dboard container constructor function pointer (one
+ * instance per dboard)
*/
- static void register_dboard_restricted(
- const dboard_id_t &dboard_id,
+ static void register_dboard_restricted(const dboard_id_t& dboard_id,
dboard_ctor_t db_subdev_ctor,
- const std::string &name,
- const std::vector<std::string> &subdev_names = std::vector<std::string>(1, "0"),
- dboard_ctor_t db_container_ctor = NULL
- );
+ const std::string& name,
+ const std::vector<std::string>& subdev_names = std::vector<std::string>(1, "0"),
+ dboard_ctor_t db_container_ctor = NULL);
/*!
* Register a restricted xcvr dboard into the system.
@@ -93,19 +91,18 @@ public:
* The iface for a restricted board is not registered into the property tree.
* \param rx_dboard_id the rx unit dboard id
* \param tx_dboard_id the tx unit dboard id
- * \param db_subdev_ctor the dboard sub-device constructor function pointer (one instance per subdev name)
- * \param name the canonical name for the dboard represented
+ * \param db_subdev_ctor the dboard sub-device constructor function pointer (one
+ * instance per subdev name) \param name the canonical name for the dboard represented
* \param subdev_names the names of the subdevs on this dboard
- * \param db_container_ctor the dboard container constructor function pointer (one instance per dboard)
+ * \param db_container_ctor the dboard container constructor function pointer (one
+ * instance per dboard)
*/
- static void register_dboard_restricted(
- const dboard_id_t &rx_dboard_id,
- const dboard_id_t &tx_dboard_id,
+ static void register_dboard_restricted(const dboard_id_t& rx_dboard_id,
+ const dboard_id_t& tx_dboard_id,
dboard_ctor_t db_subdev_ctor,
- const std::string &name,
- const std::vector<std::string> &subdev_names = std::vector<std::string>(1, "0"),
- dboard_ctor_t db_container_ctor = NULL
- );
+ const std::string& name,
+ const std::vector<std::string>& subdev_names = std::vector<std::string>(1, "0"),
+ dboard_ctor_t db_container_ctor = NULL);
/*!
* Make a new dboard manager.
@@ -117,14 +114,12 @@ public:
* \param defer_db_init initialising the daughterboards (DEPRECATED)
* \return an sptr to the new dboard manager
*/
- static sptr make(
- dboard_id_t rx_dboard_id,
+ static sptr make(dboard_id_t rx_dboard_id,
dboard_id_t tx_dboard_id,
dboard_id_t gdboard_id,
dboard_iface::sptr iface,
property_tree::sptr subtree,
- bool defer_db_init = false
- );
+ bool defer_db_init = false);
/*!
* Make a new dboard manager.
@@ -136,14 +131,12 @@ public:
* \param defer_db_init initialising the daughterboards (DEPRECATED)
* \return an sptr to the new dboard manager
*/
- static sptr make(
- dboard_eeprom_t rx_eeprom,
+ static sptr make(dboard_eeprom_t rx_eeprom,
dboard_eeprom_t tx_eeprom,
dboard_eeprom_t gdb_eeprom,
dboard_iface::sptr iface,
property_tree::sptr subtree,
- bool defer_db_init = false
- );
+ bool defer_db_init = false);
virtual ~dboard_manager() {}
@@ -165,6 +158,6 @@ public:
virtual const std::vector<std::string>& get_tx_frontends() const = 0;
};
-}} //namespace
+}} // namespace uhd::usrp
#endif /* INCLUDED_UHD_USRP_DBOARD_MANAGER_HPP */
diff --git a/host/include/uhd/usrp/fe_connection.hpp b/host/include/uhd/usrp/fe_connection.hpp
index d2050bb0f..0b34af40d 100644
--- a/host/include/uhd/usrp/fe_connection.hpp
+++ b/host/include/uhd/usrp/fe_connection.hpp
@@ -14,104 +14,114 @@
namespace uhd { namespace usrp {
- class UHD_API fe_connection_t : boost::equality_comparable<fe_connection_t> {
- public:
- /** Sampling mode.
- * Represents the sampling architecture for the front-end
- */
- enum sampling_t {
- QUADRATURE, /**< Complex sampling (Complex input, Complex output). */
- HETERODYNE, /**< Heterodyne sampling (Real input, Complex output). Only one of the I and Q inputs is used. */
- REAL /**< Real sampling (Real input, Real output). Only one of the I and Q inputs is used. */
- };
-
- /*!
- * Create a frontend connection class from individual settings.
- * \param sampling_mode can be { QUADRATURE, HETERODYNE, REAL }
- * \param iq_swapped indicates if the IQ channels are swapped (after inverion and heterodyne correction)
- * \param i_inverted indicates if the I channel is inverted (negated)
- * \param q_inverted indicates if the Q channel is inverted (negated)
- * \param if_freq the baseband sampling frequency.
- */
- fe_connection_t(
- sampling_t sampling_mode, bool iq_swapped,
- bool i_inverted, bool q_inverted, double if_freq = 0.0
- );
-
- /*!
- * Create a frontend connection class from a connection string
- * The connection string can be:
- * - in {I, Q}: Real mode sampling with no inversion.
- * - in {Ib, Qb}: Real mode sampling with inversion.
- * - in {IQ, QI}: Quadrature sampling with no inversion.
- * - in {IbQb, QbIb}: Quadrature sampling with inversion.
- * - in {II, QQ}: Heterodyne sampling with no inversion.
- * - in {IbIb, QbQb}: Heterodyne sampling with inversion.
- *
- * \param conn_str the connection string.
- * \param if_freq the baseband sampling frequency.
- */
- fe_connection_t(const std::string& conn_str, double if_freq = 0.0);
-
- /*!
- * Accessor for sampling mode
- */
- inline sampling_t get_sampling_mode() const {
- return _sampling_mode;
- }
-
- /*!
- * Accessor for IQ swap parameter
- */
- inline bool is_iq_swapped() const {
- return _iq_swapped;
- }
-
- /*!
- * Accessor for I inversion parameter
- */
- inline bool is_i_inverted() const {
- return _i_inverted;
- }
-
- /*!
- * Accessor for Q inversion parameter
- */
- inline bool is_q_inverted() const {
- return _q_inverted;
- }
-
- /*!
- * Accessor for IF frequency
- */
- inline double get_if_freq() const {
- return _if_freq;
- }
-
- /*!
- * Mutator for IF frequency
- */
- inline void set_if_freq(double freq) {
- _if_freq = freq;
- }
-
- private:
- sampling_t _sampling_mode;
- bool _iq_swapped;
- bool _i_inverted;
- bool _q_inverted;
- double _if_freq;
+class UHD_API fe_connection_t : boost::equality_comparable<fe_connection_t>
+{
+public:
+ /** Sampling mode.
+ * Represents the sampling architecture for the front-end
+ */
+ enum sampling_t {
+ QUADRATURE, /**< Complex sampling (Complex input, Complex output). */
+ HETERODYNE, /**< Heterodyne sampling (Real input, Complex output). Only one of the
+ I and Q inputs is used. */
+ REAL /**< Real sampling (Real input, Real output). Only one of the I and Q inputs
+ is used. */
};
/*!
- * Comparator operator overloaded for fe_connection_t.
- * The boost::equality_comparable provides the !=.
- * \param lhs the fe_connection_t to the left of the operator
- * \param rhs the fe_connection_t to the right of the operator
- * \return true when the fe connections are equal
+ * Create a frontend connection class from individual settings.
+ * \param sampling_mode can be { QUADRATURE, HETERODYNE, REAL }
+ * \param iq_swapped indicates if the IQ channels are swapped (after inverion and
+ * heterodyne correction) \param i_inverted indicates if the I channel is inverted
+ * (negated) \param q_inverted indicates if the Q channel is inverted (negated) \param
+ * if_freq the baseband sampling frequency.
+ */
+ fe_connection_t(sampling_t sampling_mode,
+ bool iq_swapped,
+ bool i_inverted,
+ bool q_inverted,
+ double if_freq = 0.0);
+
+ /*!
+ * Create a frontend connection class from a connection string
+ * The connection string can be:
+ * - in {I, Q}: Real mode sampling with no inversion.
+ * - in {Ib, Qb}: Real mode sampling with inversion.
+ * - in {IQ, QI}: Quadrature sampling with no inversion.
+ * - in {IbQb, QbIb}: Quadrature sampling with inversion.
+ * - in {II, QQ}: Heterodyne sampling with no inversion.
+ * - in {IbIb, QbQb}: Heterodyne sampling with inversion.
+ *
+ * \param conn_str the connection string.
+ * \param if_freq the baseband sampling frequency.
*/
- UHD_API bool operator==(const fe_connection_t &lhs, const fe_connection_t &rhs);
+ fe_connection_t(const std::string& conn_str, double if_freq = 0.0);
-}} //namespace
+ /*!
+ * Accessor for sampling mode
+ */
+ inline sampling_t get_sampling_mode() const
+ {
+ return _sampling_mode;
+ }
+
+ /*!
+ * Accessor for IQ swap parameter
+ */
+ inline bool is_iq_swapped() const
+ {
+ return _iq_swapped;
+ }
+
+ /*!
+ * Accessor for I inversion parameter
+ */
+ inline bool is_i_inverted() const
+ {
+ return _i_inverted;
+ }
+
+ /*!
+ * Accessor for Q inversion parameter
+ */
+ inline bool is_q_inverted() const
+ {
+ return _q_inverted;
+ }
+
+ /*!
+ * Accessor for IF frequency
+ */
+ inline double get_if_freq() const
+ {
+ return _if_freq;
+ }
+
+ /*!
+ * Mutator for IF frequency
+ */
+ inline void set_if_freq(double freq)
+ {
+ _if_freq = freq;
+ }
+
+private:
+ sampling_t _sampling_mode;
+ bool _iq_swapped;
+ bool _i_inverted;
+ bool _q_inverted;
+ double _if_freq;
+};
+
+/*!
+ * Comparator operator overloaded for fe_connection_t.
+ * The boost::equality_comparable provides the !=.
+ * \param lhs the fe_connection_t to the left of the operator
+ * \param rhs the fe_connection_t to the right of the operator
+ * \return true when the fe connections are equal
+ */
+UHD_API bool operator==(const fe_connection_t& lhs, const fe_connection_t& rhs);
+
+}} // namespace uhd::usrp
#endif /* INCLUDED_UHD_USRP_FE_CONNECTION_HPP */
diff --git a/host/include/uhd/usrp/gpio_defs.hpp b/host/include/uhd/usrp/gpio_defs.hpp
index 65d6a761e..5cf09b496 100644
--- a/host/include/uhd/usrp/gpio_defs.hpp
+++ b/host/include/uhd/usrp/gpio_defs.hpp
@@ -10,13 +10,13 @@
namespace uhd { namespace usrp { namespace gpio_atr {
- enum gpio_atr_reg_t {
- ATR_REG_IDLE = int('i'),
- ATR_REG_TX_ONLY = int('t'),
- ATR_REG_RX_ONLY = int('r'),
- ATR_REG_FULL_DUPLEX = int('f')
- };
+enum gpio_atr_reg_t {
+ ATR_REG_IDLE = int('i'),
+ ATR_REG_TX_ONLY = int('t'),
+ ATR_REG_RX_ONLY = int('r'),
+ ATR_REG_FULL_DUPLEX = int('f')
+};
-}}} //namespaces
+}}} // namespace uhd::usrp::gpio_atr
#endif /* INCLUDED_LIBUHD_USRP_GPIO_DEFS_HPP */
diff --git a/host/include/uhd/usrp/gps_ctrl.hpp b/host/include/uhd/usrp/gps_ctrl.hpp
index 1e0d35b91..91d653759 100644
--- a/host/include/uhd/usrp/gps_ctrl.hpp
+++ b/host/include/uhd/usrp/gps_ctrl.hpp
@@ -8,46 +8,46 @@
#ifndef INCLUDED_GPS_CTRL_HPP
#define INCLUDED_GPS_CTRL_HPP
-#include <uhd/types/serial.hpp>
#include <uhd/types/sensors.hpp>
+#include <uhd/types/serial.hpp>
+#include <boost/function.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/utility.hpp>
-#include <boost/function.hpp>
#include <vector>
-namespace uhd{
+namespace uhd {
-class UHD_API gps_ctrl : boost::noncopyable{
+class UHD_API gps_ctrl : boost::noncopyable
+{
public:
- typedef boost::shared_ptr<gps_ctrl> sptr;
-
- virtual ~gps_ctrl(void) = 0;
+ typedef boost::shared_ptr<gps_ctrl> sptr;
- /*!
- * Make a GPS config for internal GPSDOs or generic NMEA GPS devices
- */
- static sptr make(uart_iface::sptr uart);
+ virtual ~gps_ctrl(void) = 0;
- /*!
- * Retrieve the list of sensors this GPS object provides
- */
- virtual std::vector<std::string> get_sensors(void) = 0;
+ /*!
+ * Make a GPS config for internal GPSDOs or generic NMEA GPS devices
+ */
+ static sptr make(uart_iface::sptr uart);
- /*!
- * Retrieve the named sensor
- */
- virtual uhd::sensor_value_t get_sensor(std::string key) = 0;
+ /*!
+ * Retrieve the list of sensors this GPS object provides
+ */
+ virtual std::vector<std::string> get_sensors(void) = 0;
- /*!
- * Tell you if there's a supported GPS connected or not
- * \return true if a supported GPS is connected
- */
- virtual bool gps_detected(void) = 0;
+ /*!
+ * Retrieve the named sensor
+ */
+ virtual uhd::sensor_value_t get_sensor(std::string key) = 0;
- //TODO: other fun things you can do with a GPS.
+ /*!
+ * Tell you if there's a supported GPS connected or not
+ * \return true if a supported GPS is connected
+ */
+ virtual bool gps_detected(void) = 0;
+ // TODO: other fun things you can do with a GPS.
};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_GPS_CTRL_HPP */
diff --git a/host/include/uhd/usrp/mboard_eeprom.hpp b/host/include/uhd/usrp/mboard_eeprom.hpp
index 72efd7c99..fcc587e08 100644
--- a/host/include/uhd/usrp/mboard_eeprom.hpp
+++ b/host/include/uhd/usrp/mboard_eeprom.hpp
@@ -12,20 +12,20 @@
#include <uhd/types/dict.hpp>
#include <string>
-namespace uhd{ namespace usrp{
+namespace uhd { namespace usrp {
- /*! The motherboard EEPROM object.
- *
- * The specific implementation knows how to read and write the EEPROM for
- * various USRPs. By itself, this class is nothing but a thin wrapper
- * around a string -> string dictionary.
- *
- * Note that writing to an object of type mboard_eeprom_t does not actually
- * write to the EEPROM. Devices have their own APIs to read/write from the
- * EEPROM chips themselves. Most devices will write the EEPROM itself when
- * the according property is updated.
- */
- typedef uhd::dict<std::string, std::string> mboard_eeprom_t;
+/*! The motherboard EEPROM object.
+ *
+ * The specific implementation knows how to read and write the EEPROM for
+ * various USRPs. By itself, this class is nothing but a thin wrapper
+ * around a string -> string dictionary.
+ *
+ * Note that writing to an object of type mboard_eeprom_t does not actually
+ * write to the EEPROM. Devices have their own APIs to read/write from the
+ * EEPROM chips themselves. Most devices will write the EEPROM itself when
+ * the according property is updated.
+ */
+typedef uhd::dict<std::string, std::string> mboard_eeprom_t;
}} // namespace uhd::usrp
diff --git a/host/include/uhd/usrp/multi_usrp.hpp b/host/include/uhd/usrp/multi_usrp.hpp
index 71b2a1161..a99cba845 100644
--- a/host/include/uhd/usrp/multi_usrp.hpp
+++ b/host/include/uhd/usrp/multi_usrp.hpp
@@ -8,7 +8,7 @@
#ifndef INCLUDED_UHD_USRP_MULTI_USRP_HPP
#define INCLUDED_UHD_USRP_MULTI_USRP_HPP
-//define API capabilities for compile time detection of new features
+// define API capabilities for compile time detection of new features
#define UHD_USRP_MULTI_USRP_REF_SOURCES_API
#define UHD_USRP_MULTI_USRP_GET_RATES_API
#define UHD_USRP_MULTI_USRP_FRONTEND_CAL_API
@@ -25,17 +25,17 @@
#define UHD_USRP_MULTI_USRP_TX_LO_CONFIG_API
#include <uhd/config.hpp>
-#include <uhd/device.hpp>
#include <uhd/deprecated.hpp>
+#include <uhd/device.hpp>
+#include <uhd/types/filters.hpp>
#include <uhd/types/ranges.hpp>
+#include <uhd/types/sensors.hpp>
#include <uhd/types/stream_cmd.hpp>
#include <uhd/types/tune_request.hpp>
#include <uhd/types/tune_result.hpp>
-#include <uhd/types/sensors.hpp>
-#include <uhd/types/filters.hpp>
#include <uhd/types/wb_iface.hpp>
-#include <uhd/usrp/subdev_spec.hpp>
#include <uhd/usrp/dboard_iface.hpp>
+#include <uhd/usrp/subdev_spec.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/utility.hpp>
#include <complex>
@@ -43,9 +43,9 @@
#include <vector>
namespace uhd {
- class device3;
+class device3;
- namespace usrp{
+namespace usrp {
/*!
* The Multi-USRP device class:
@@ -93,7 +93,8 @@ namespace uhd {
*
* </pre>
*/
-class UHD_API multi_usrp : boost::noncopyable{
+class UHD_API multi_usrp : boost::noncopyable
+{
public:
typedef boost::shared_ptr<multi_usrp> sptr;
@@ -118,7 +119,7 @@ public:
* \throws uhd::key_error no device found
* \throws uhd::index_error fewer devices found than expected
*/
- static sptr make(const device_addr_t &dev_addr);
+ static sptr make(const device_addr_t& dev_addr);
/*!
* Get the underlying device object.
@@ -142,10 +143,10 @@ public:
virtual boost::shared_ptr<uhd::device3> get_device3(void) = 0;
//! Convenience method to get a RX streamer. See also uhd::device::get_rx_stream().
- virtual rx_streamer::sptr get_rx_stream(const stream_args_t &args) = 0;
+ virtual rx_streamer::sptr get_rx_stream(const stream_args_t& args) = 0;
//! Convenience method to get a TX streamer. See also uhd::device::get_tx_stream().
- virtual tx_streamer::sptr get_tx_stream(const stream_args_t &args) = 0;
+ virtual tx_streamer::sptr get_tx_stream(const stream_args_t& args) = 0;
/*!
* Returns identifying information about this USRP's configuration.
@@ -163,7 +164,7 @@ public:
* \param chan channel index 0 to N-1
* \return TX info
*/
- virtual dict<std::string, std::string> get_usrp_tx_info(size_t chan = 0) = 0;
+ virtual dict<std::string, std::string> get_usrp_tx_info(size_t chan = 0) = 0;
/*******************************************************************
* Mboard methods
@@ -258,7 +259,8 @@ public:
* \param time_spec the time to latch into the usrp device
* \param mboard the motherboard index 0 to M-1
*/
- virtual void set_time_now(const time_spec_t &time_spec, size_t mboard = ALL_MBOARDS) = 0;
+ virtual void set_time_now(
+ const time_spec_t& time_spec, size_t mboard = ALL_MBOARDS) = 0;
/*!
* Set the time registers on the usrp at the next pps tick.
@@ -272,7 +274,8 @@ public:
* \param time_spec the time to latch into the usrp device
* \param mboard the motherboard index 0 to M-1
*/
- virtual void set_time_next_pps(const time_spec_t &time_spec, size_t mboard = ALL_MBOARDS) = 0;
+ virtual void set_time_next_pps(
+ const time_spec_t& time_spec, size_t mboard = ALL_MBOARDS) = 0;
/*!
* Synchronize the times across all motherboards in this configuration.
@@ -289,7 +292,7 @@ public:
*
* \param time_spec the time to latch at the next pps after catching the edge
*/
- virtual void set_time_unknown_pps(const time_spec_t &time_spec) = 0;
+ virtual void set_time_unknown_pps(const time_spec_t& time_spec) = 0;
/*!
* Are the times across all motherboards in this configuration synchronized?
@@ -309,7 +312,8 @@ public:
* \param time_spec the time at which the next command will activate
* \param mboard which motherboard to set the config
*/
- virtual void set_command_time(const uhd::time_spec_t &time_spec, size_t mboard = ALL_MBOARDS) = 0;
+ virtual void set_command_time(
+ const uhd::time_spec_t& time_spec, size_t mboard = ALL_MBOARDS) = 0;
/*!
* Clear the command time so future commands are sent ASAP.
@@ -330,7 +334,8 @@ public:
* \param stream_cmd the stream command to issue
* \param chan the channel index 0 to N-1
*/
- virtual void issue_stream_cmd(const stream_cmd_t &stream_cmd, size_t chan = ALL_CHANS) = 0;
+ virtual void issue_stream_cmd(
+ const stream_cmd_t& stream_cmd, size_t chan = ALL_CHANS) = 0;
/*!
* Set the clock configuration for the usrp device.
@@ -340,7 +345,8 @@ public:
* \param clock_config the clock configuration to set
* \param mboard which motherboard to set the config
*/
- virtual void set_clock_config(const clock_config_t &clock_config, size_t mboard = ALL_MBOARDS) = 0;
+ virtual void set_clock_config(
+ const clock_config_t& clock_config, size_t mboard = ALL_MBOARDS) = 0;
/*! Set the time source for the USRP device
*
@@ -385,9 +391,7 @@ public:
* \throws uhd::value_error if \p source is an invalid option
*/
virtual void set_time_source(
- const std::string &source,
- const size_t mboard = ALL_MBOARDS
- ) = 0;
+ const std::string& source, const size_t mboard = ALL_MBOARDS) = 0;
/*!
* Get the currently set time source.
@@ -446,9 +450,7 @@ public:
* \throws uhd::value_error if \p source is an invalid option
*/
virtual void set_clock_source(
- const std::string &source,
- const size_t mboard = ALL_MBOARDS
- ) = 0;
+ const std::string& source, const size_t mboard = ALL_MBOARDS) = 0;
/*!
* Get the currently set clock source.
@@ -474,11 +476,9 @@ public:
* \param mboard which motherboard to set the config
* \throws uhd::value_error if the sources don't actually exist
*/
- virtual void set_sync_source(
- const std::string &clock_source,
- const std::string &time_source,
- const size_t mboard = ALL_MBOARDS
- ) = 0;
+ virtual void set_sync_source(const std::string& clock_source,
+ const std::string& time_source,
+ const size_t mboard = ALL_MBOARDS) = 0;
/*! Set the reference/synchronization sources for the USRP device
*
@@ -503,9 +503,7 @@ public:
* combination of clock and time source is invalid.
*/
virtual void set_sync_source(
- const device_addr_t& sync_source,
- const size_t mboard = ALL_MBOARDS
- ) = 0;
+ const device_addr_t& sync_source, const size_t mboard = ALL_MBOARDS) = 0;
/*! Get the currently set sync source.
*
@@ -529,7 +527,8 @@ public:
* \param enb true to output the clock source.
* \param mboard which motherboard to set
*/
- virtual void set_clock_source_out(const bool enb, const size_t mboard = ALL_MBOARDS) = 0;
+ virtual void set_clock_source_out(
+ const bool enb, const size_t mboard = ALL_MBOARDS) = 0;
/*!
* Send the time source to an output connector.
@@ -539,7 +538,8 @@ public:
* \param enb true to output the time source.
* \param mboard which motherboard to set
*/
- virtual void set_time_source_out(const bool enb, const size_t mboard = ALL_MBOARDS) = 0;
+ virtual void set_time_source_out(
+ const bool enb, const size_t mboard = ALL_MBOARDS) = 0;
/*!
* Get the number of USRP motherboards in this configuration.
@@ -552,7 +552,8 @@ public:
* \param mboard the motherboard index 0 to M-1
* \return a sensor value object
*/
- virtual sensor_value_t get_mboard_sensor(const std::string &name, size_t mboard = 0) = 0;
+ virtual sensor_value_t get_mboard_sensor(
+ const std::string& name, size_t mboard = 0) = 0;
/*!
* Get a list of possible motherboard sensor names.
@@ -568,7 +569,8 @@ public:
* \param data 32-bit register value
* \param mboard which motherboard to set the user register
*/
- virtual void set_user_register(const uint8_t addr, const uint32_t data, size_t mboard = ALL_MBOARDS) = 0;
+ virtual void set_user_register(
+ const uint8_t addr, const uint32_t data, size_t mboard = ALL_MBOARDS) = 0;
/*! Return a user settings interface object
*
@@ -607,7 +609,8 @@ public:
* \param spec the new frontend specification
* \param mboard the motherboard index 0 to M-1
*/
- virtual void set_rx_subdev_spec(const uhd::usrp::subdev_spec_t &spec, size_t mboard = ALL_MBOARDS) = 0;
+ virtual void set_rx_subdev_spec(
+ const uhd::usrp::subdev_spec_t& spec, size_t mboard = ALL_MBOARDS) = 0;
/*!
* Get the RX frontend specification.
@@ -658,8 +661,7 @@ public:
* \return a tune result object
*/
virtual tune_result_t set_rx_freq(
- const tune_request_t &tune_request, size_t chan = 0
- ) = 0;
+ const tune_request_t& tune_request, size_t chan = 0) = 0;
/*!
* Get the RX center frequency.
@@ -716,10 +718,7 @@ public:
* \param chan the channel index 0 to N-1
*/
virtual void set_rx_lo_source(
- const std::string &src,
- const std::string &name = ALL_LOS,
- size_t chan = 0
- ) = 0;
+ const std::string& src, const std::string& name = ALL_LOS, size_t chan = 0) = 0;
/*! Get the currently selected LO source.
*
@@ -730,9 +729,7 @@ public:
* \return the configured LO source
*/
virtual const std::string get_rx_lo_source(
- const std::string &name = ALL_LOS,
- size_t chan = 0
- ) = 0;
+ const std::string& name = ALL_LOS, size_t chan = 0) = 0;
/*! Get a list of possible LO sources.
*
@@ -746,9 +743,7 @@ public:
* \return a vector of strings for possible settings
*/
virtual std::vector<std::string> get_rx_lo_sources(
- const std::string &name = ALL_LOS,
- size_t chan = 0
- ) = 0;
+ const std::string& name = ALL_LOS, size_t chan = 0) = 0;
/*! Set whether the LO used by the device is exported
*
@@ -761,10 +756,7 @@ public:
* \throws uhd::runtime_error if LO exporting is not enabled
*/
virtual void set_rx_lo_export_enabled(
- bool enabled,
- const std::string &name = ALL_LOS,
- size_t chan = 0
- ) = 0;
+ bool enabled, const std::string& name = ALL_LOS, size_t chan = 0) = 0;
/*! Returns true if the currently selected LO is being exported.
*
@@ -772,9 +764,7 @@ public:
* \param chan the channel index 0 to N-1
*/
virtual bool get_rx_lo_export_enabled(
- const std::string &name = ALL_LOS,
- size_t chan = 0
- ) = 0;
+ const std::string& name = ALL_LOS, size_t chan = 0) = 0;
/*! Set the RX LO frequency (Advanced).
*
@@ -800,10 +790,7 @@ public:
* \return a coerced LO frequency
*/
virtual double set_rx_lo_freq(
- double freq,
- const std::string &name,
- size_t chan = 0
- ) = 0;
+ double freq, const std::string& name, size_t chan = 0) = 0;
/*! Get the current RX LO frequency (Advanced).
*
@@ -815,10 +802,7 @@ public:
* \param chan the channel index 0 to N-1
* \return the configured LO frequency
*/
- virtual double get_rx_lo_freq(
- const std::string &name,
- size_t chan = 0
- ) = 0;
+ virtual double get_rx_lo_freq(const std::string& name, size_t chan = 0) = 0;
/*! Get the LO frequency range of the RX LO.
*
@@ -830,9 +814,7 @@ public:
* \return a frequency range object
*/
virtual freq_range_t get_rx_lo_freq_range(
- const std::string &name,
- size_t chan = 0
- ) = 0;
+ const std::string& name, size_t chan = 0) = 0;
/*! Get a list of possible TX LO stage names
*
@@ -859,11 +841,9 @@ public:
* this channel.
* \param chan the channel index 0 to N-1
*/
- virtual void set_tx_lo_source(
- const std::string &src,
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) = 0;
+ virtual void set_tx_lo_source(const std::string& src,
+ const std::string& name = ALL_LOS,
+ const size_t chan = 0) = 0;
/*! Get the currently selected TX LO source.
*
@@ -874,9 +854,7 @@ public:
* \return the configured LO source
*/
virtual const std::string get_tx_lo_source(
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) = 0;
+ const std::string& name = ALL_LOS, const size_t chan = 0) = 0;
/*! Get a list of possible LO sources.
*
@@ -889,9 +867,7 @@ public:
* \return a vector of strings for possible settings
*/
virtual std::vector<std::string> get_tx_lo_sources(
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) = 0;
+ const std::string& name = ALL_LOS, const size_t chan = 0) = 0;
/*! Set whether the TX LO used by the device is exported
*
@@ -904,10 +880,7 @@ public:
* \throws uhd::runtime_error if LO exporting is not enabled
*/
virtual void set_tx_lo_export_enabled(
- const bool enabled,
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) = 0;
+ const bool enabled, const std::string& name = ALL_LOS, const size_t chan = 0) = 0;
/*! Returns true if the currently selected LO is being exported.
*
@@ -915,9 +888,7 @@ public:
* \param chan the channel index 0 to N-1
*/
virtual bool get_tx_lo_export_enabled(
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) = 0;
+ const std::string& name = ALL_LOS, const size_t chan = 0) = 0;
/*! Set the TX LO frequency (Advanced).
*
@@ -943,10 +914,7 @@ public:
* \return a coerced LO frequency
*/
virtual double set_tx_lo_freq(
- const double freq,
- const std::string &name,
- const size_t chan=0
- ) = 0;
+ const double freq, const std::string& name, const size_t chan = 0) = 0;
/*! Get the current TX LO frequency (Advanced).
*
@@ -958,10 +926,7 @@ public:
* \param chan the channel index 0 to N-1
* \return the configured LO frequency
*/
- virtual double get_tx_lo_freq(
- const std::string &name,
- const size_t chan=0
- ) = 0;
+ virtual double get_tx_lo_freq(const std::string& name, const size_t chan = 0) = 0;
/*! Get the LO frequency range of the TX LO.
*
@@ -973,9 +938,7 @@ public:
* \return a frequency range object
*/
virtual freq_range_t get_tx_lo_freq_range(
- const std::string &name,
- const size_t chan=0
- ) = 0;
+ const std::string& name, const size_t chan = 0) = 0;
/**************************************************************************
* Gain controls
@@ -987,15 +950,15 @@ public:
* \param name the name of the gain element
* \param chan the channel index 0 to N-1
*/
- virtual void set_rx_gain(double gain, const std::string &name, size_t chan = 0) = 0;
+ virtual void set_rx_gain(double gain, const std::string& name, size_t chan = 0) = 0;
/*! Get a list of possible RX gain profile options
*
- * Example: On the TwinRX, this will return "low-noise", "low-distortion" or "default".
- * These names can be used in gain-profile related API called.
- * An empty return value doesn't mean there are no profile options, it means that
- * this radio does not have any gain profiles implemented, and typically means
- * there is only one default profile of set gain
+ * Example: On the TwinRX, this will return "low-noise", "low-distortion" or
+ * "default". These names can be used in gain-profile related API called. An empty
+ * return value doesn't mean there are no profile options, it means that this radio
+ * does not have any gain profiles implemented, and typically means there is only one
+ * default profile of set gain
*
* \param chan the channel index 0 to N-1
* \return a vector of strings for possible gain profile options, or an empty list of
@@ -1008,7 +971,8 @@ public:
* \param profile the profile string option
* \param chan the channel index 0 to N-1
*/
- virtual void set_rx_gain_profile(const std::string& profile, const size_t chan = 0) = 0;
+ virtual void set_rx_gain_profile(
+ const std::string& profile, const size_t chan = 0) = 0;
/*!
* Get the RX gain profile.
@@ -1018,7 +982,8 @@ public:
virtual std::string get_rx_gain_profile(const size_t chan = 0) = 0;
//! A convenience wrapper for setting overall RX gain
- void set_rx_gain(double gain, size_t chan = 0){
+ void set_rx_gain(double gain, size_t chan = 0)
+ {
return this->set_rx_gain(gain, ALL_GAINS, chan);
}
@@ -1043,8 +1008,8 @@ public:
/*!
* Enable or disable the RX AGC module.
* Once this module is enabled manual gain settings will be ignored.
- * The AGC will start in a default configuration which should be good for most use cases.
- * Device specific configuration parameters can be found in the property tree.
+ * The AGC will start in a default configuration which should be good for most use
+ * cases. Device specific configuration parameters can be found in the property tree.
* \param enable Enable or Disable the AGC
* \param chan the channel index 0 to N-1
*/
@@ -1057,10 +1022,11 @@ public:
* \param chan the channel index 0 to N-1
* \return the gain in dB
*/
- virtual double get_rx_gain(const std::string &name, size_t chan = 0) = 0;
+ virtual double get_rx_gain(const std::string& name, size_t chan = 0) = 0;
//! A convenience wrapper for getting overall RX gain
- double get_rx_gain(size_t chan = 0){
+ double get_rx_gain(size_t chan = 0)
+ {
return this->get_rx_gain(ALL_GAINS, chan);
}
@@ -1083,10 +1049,11 @@ public:
* \param chan the channel index 0 to N-1
* \return a gain range object
*/
- virtual gain_range_t get_rx_gain_range(const std::string &name, size_t chan = 0) = 0;
+ virtual gain_range_t get_rx_gain_range(const std::string& name, size_t chan = 0) = 0;
//! A convenience wrapper for getting overall RX gain range
- gain_range_t get_rx_gain_range(size_t chan = 0){
+ gain_range_t get_rx_gain_range(size_t chan = 0)
+ {
return this->get_rx_gain_range(ALL_GAINS, chan);
}
@@ -1103,7 +1070,7 @@ public:
* \param ant the antenna name
* \param chan the channel index 0 to N-1
*/
- virtual void set_rx_antenna(const std::string &ant, size_t chan = 0) = 0;
+ virtual void set_rx_antenna(const std::string& ant, size_t chan = 0) = 0;
/*!
* Get the selected RX antenna on the frontend.
@@ -1155,7 +1122,7 @@ public:
* \param chan the channel index 0 to N-1
* \return a sensor value object
*/
- virtual sensor_value_t get_rx_sensor(const std::string &name, size_t chan = 0) = 0;
+ virtual sensor_value_t get_rx_sensor(const std::string& name, size_t chan = 0) = 0;
/*!
* Get a list of possible RX frontend sensor names.
@@ -1185,7 +1152,8 @@ public:
* \param offset the dc offset (1.0 is full-scale)
* \param chan the channel index 0 to N-1
*/
- virtual void set_rx_dc_offset(const std::complex<double> &offset, size_t chan = ALL_CHANS) = 0;
+ virtual void set_rx_dc_offset(
+ const std::complex<double>& offset, size_t chan = ALL_CHANS) = 0;
/*!
* Get the valid range for RX DC offset values.
@@ -1208,7 +1176,8 @@ public:
* \param correction the complex correction (1.0 is full-scale)
* \param chan the channel index 0 to N-1
*/
- virtual void set_rx_iq_balance(const std::complex<double> &correction, size_t chan = ALL_CHANS) = 0;
+ virtual void set_rx_iq_balance(
+ const std::complex<double>& correction, size_t chan = ALL_CHANS) = 0;
/*******************************************************************
* TX methods
@@ -1221,7 +1190,8 @@ public:
* \param spec the new frontend specification
* \param mboard the motherboard index 0 to M-1
*/
- virtual void set_tx_subdev_spec(const uhd::usrp::subdev_spec_t &spec, size_t mboard = ALL_MBOARDS) = 0;
+ virtual void set_tx_subdev_spec(
+ const uhd::usrp::subdev_spec_t& spec, size_t mboard = ALL_MBOARDS) = 0;
/*!
* Get the TX frontend specification.
@@ -1272,8 +1242,7 @@ public:
* \return a tune result object
*/
virtual tune_result_t set_tx_freq(
- const tune_request_t &tune_request, size_t chan = 0
- ) = 0;
+ const tune_request_t& tune_request, size_t chan = 0) = 0;
/*!
* Get the TX center frequency.
@@ -1307,7 +1276,7 @@ public:
* \param name the name of the gain element
* \param chan the channel index 0 to N-1
*/
- virtual void set_tx_gain(double gain, const std::string &name, size_t chan = 0) = 0;
+ virtual void set_tx_gain(double gain, const std::string& name, size_t chan = 0) = 0;
/*! Get a list of possible TX gain profile options
*
@@ -1328,7 +1297,8 @@ public:
* \param profile the profile string option
* \param chan the channel index 0 to N-1
*/
- virtual void set_tx_gain_profile(const std::string& profile, const size_t chan = 0) = 0;
+ virtual void set_tx_gain_profile(
+ const std::string& profile, const size_t chan = 0) = 0;
/*!
* Get the TX gain profile.
@@ -1338,7 +1308,8 @@ public:
virtual std::string get_tx_gain_profile(const size_t chan = 0) = 0;
//! A convenience wrapper for setting overall TX gain
- void set_tx_gain(double gain, size_t chan = 0){
+ void set_tx_gain(double gain, size_t chan = 0)
+ {
return this->set_tx_gain(gain, ALL_GAINS, chan);
}
@@ -1361,10 +1332,11 @@ public:
* \param chan the channel index 0 to N-1
* \return the gain in dB
*/
- virtual double get_tx_gain(const std::string &name, size_t chan = 0) = 0;
+ virtual double get_tx_gain(const std::string& name, size_t chan = 0) = 0;
//! A convenience wrapper for getting overall TX gain
- double get_tx_gain(size_t chan = 0){
+ double get_tx_gain(size_t chan = 0)
+ {
return this->get_tx_gain(ALL_GAINS, chan);
}
@@ -1387,10 +1359,11 @@ public:
* \param chan the channel index 0 to N-1
* \return a gain range object
*/
- virtual gain_range_t get_tx_gain_range(const std::string &name, size_t chan = 0) = 0;
+ virtual gain_range_t get_tx_gain_range(const std::string& name, size_t chan = 0) = 0;
//! A convenience wrapper for getting overall TX gain range
- gain_range_t get_tx_gain_range(size_t chan = 0){
+ gain_range_t get_tx_gain_range(size_t chan = 0)
+ {
return this->get_tx_gain_range(ALL_GAINS, chan);
}
@@ -1407,7 +1380,7 @@ public:
* \param ant the antenna name
* \param chan the channel index 0 to N-1
*/
- virtual void set_tx_antenna(const std::string &ant, size_t chan = 0) = 0;
+ virtual void set_tx_antenna(const std::string& ant, size_t chan = 0) = 0;
/*!
* Get the selected TX antenna on the frontend.
@@ -1459,7 +1432,7 @@ public:
* \param chan the channel index 0 to N-1
* \return a sensor value object
*/
- virtual sensor_value_t get_tx_sensor(const std::string &name, size_t chan = 0) = 0;
+ virtual sensor_value_t get_tx_sensor(const std::string& name, size_t chan = 0) = 0;
/*!
* Get a list of possible TX frontend sensor names.
@@ -1474,7 +1447,8 @@ public:
* \param offset the dc offset (1.0 is full-scale)
* \param chan the channel index 0 to N-1
*/
- virtual void set_tx_dc_offset(const std::complex<double> &offset, size_t chan = ALL_CHANS) = 0;
+ virtual void set_tx_dc_offset(
+ const std::complex<double>& offset, size_t chan = ALL_CHANS) = 0;
/*!
* Get the valid range for TX DC offset values.
@@ -1489,7 +1463,8 @@ public:
* \param correction the complex correction (1.0 is full-scale)
* \param chan the channel index 0 to N-1
*/
- virtual void set_tx_iq_balance(const std::complex<double> &correction, size_t chan = ALL_CHANS) = 0;
+ virtual void set_tx_iq_balance(
+ const std::complex<double>& correction, size_t chan = ALL_CHANS) = 0;
/*******************************************************************
* GPIO methods
@@ -1518,13 +1493,18 @@ public:
* \param mask the bit mask to effect which pins are changed
* \param mboard the motherboard index 0 to M-1
*/
- virtual void set_gpio_attr(const std::string &bank, const std::string &attr, const uint32_t value, const uint32_t mask = 0xffffffff, const size_t mboard = 0) = 0;
+ virtual void set_gpio_attr(const std::string& bank,
+ const std::string& attr,
+ const uint32_t value,
+ const uint32_t mask = 0xffffffff,
+ const size_t mboard = 0) = 0;
/*!
* Set a GPIO attribute on a particular GPIO bank.
* Possible attribute names:
* - SRC - "PS" for handling by processing system
- * - "RADIO_N/M" for handling by radio block with N is in [0..Number of Radio]; M is in [0..Number of port per Radio]
+ * - "RADIO_N/M" for handling by radio block with N is in [0..Number of
+ * Radio]; M is in [0..Number of port per Radio]
* - CTRL - "ATR" for ATR mode
* - "GPIO" for GPIO mode
* - DDR - "OUT" for output
@@ -1532,20 +1512,28 @@ public:
* - OUT - a string of numbers representing GPIO output level (not ATR mode)
* - "HIGH"or "LOW" as GPIO output level that apply for each bit mask that is 1
* - ATR_0X - a string of numbers representing a value of the ATR idle state register
- * - "HIGH" or "LOW" as a value set on each bit on of the ATR idle state register
- * - ATR_RX - a string of numbers representing a value of a ATR receive only state register
- * - "HIGH" or "LOW" as a value set on each bit on of the ATR receive only state register
- * - ATR_TX - a string of numbers representing a value of the ATR transmit only state register
- * - "HIGH" or "LOW" as a value set on each bit on of the ATR transmit only state register
- * - ATR_XX - a string of numbers representing a value of the ATR full duplex state register
- * - "HIGH" or "LOW" as a value set on each bit on of the ATR full duplex state register
- * \param bank the name of a GPIO bank
- * \param attr the name of a GPIO attribute
- * \param value the new value for this GPIO bank
- * \param mask the bit mask to effect which pins are changed
- * \param mboard the motherboard index 0 to M-1
- */
- virtual void set_gpio_attr(const std::string &bank, const std::string &attr, const std::string &value, const uint32_t mask = 0xffffffff, const size_t mboard = 0) = 0;
+ * - "HIGH" or "LOW" as a value set on each bit on of the ATR idle state
+ * register
+ * - ATR_RX - a string of numbers representing a value of a ATR receive only state
+ * register
+ * - "HIGH" or "LOW" as a value set on each bit on of the ATR receive only
+ * state register
+ * - ATR_TX - a string of numbers representing a value of the ATR transmit only state
+ * register
+ * - "HIGH" or "LOW" as a value set on each bit on of the ATR transmit only
+ * state register
+ * - ATR_XX - a string of numbers representing a value of the ATR full duplex state
+ * register
+ * - "HIGH" or "LOW" as a value set on each bit on of the ATR full duplex
+ * state register \param bank the name of a GPIO bank \param attr the name of a GPIO
+ * attribute \param value the new value for this GPIO bank \param mask the bit mask to
+ * effect which pins are changed \param mboard the motherboard index 0 to M-1
+ */
+ virtual void set_gpio_attr(const std::string& bank,
+ const std::string& attr,
+ const std::string& value,
+ const uint32_t mask = 0xffffffff,
+ const size_t mboard = 0) = 0;
/*!
* Get a GPIO attribute on a particular GPIO bank.
@@ -1563,13 +1551,15 @@ public:
* \param mboard the motherboard index 0 to M-1
* \return the value set for this attribute
*/
- virtual uint32_t get_gpio_attr(const std::string &bank, const std::string &attr, const size_t mboard = 0) = 0;
+ virtual uint32_t get_gpio_attr(
+ const std::string& bank, const std::string& attr, const size_t mboard = 0) = 0;
/*!
* Get a GPIO attribute on a particular GPIO bank.
* Possible attribute names:
* - SRC - "PS" for handling by processing system
- * - "RADIO_N/M" for handling by radio block with N is in [0..Number of Radio]; M is in [0..Number of port per Radio]
+ * - "RADIO_N/M" for handling by radio block with N is in [0..Number of
+ * Radio]; M is in [0..Number of port per Radio]
* - CTRL - "ATR" for ATR mode
* - "GPIO" for GPIO mode
* - DDR - "OUT" for output
@@ -1577,25 +1567,34 @@ public:
* - OUT - a string of numbers representing GPIO output level (not ATR mode)
* - "HIGH"or "LOW" as GPIO output level that apply for each bit mask that is 1
* - ATR_0X - a string of numbers representing a value of the ATR idle state register
- * - "HIGH" or "LOW" as a value set on each bit on of the ATR idle state register
- * - ATR_RX - a string of numbers representing a value of a ATR receive only state register
- * - "HIGH" or "LOW" as a value set on each bit on of the ATR receive only state register
- * - ATR_TX - a string of numbers representing a value of the ATR transmit only state register
- * - "HIGH" or "LOW" as a value set on each bit on of the ATR transmit only state register
- * - ATR_XX - a string of numbers representing a value of the ATR full duplex state register
- * - "HIGH" or "LOW" as a value set on each bit on of the ATR full duplex state register
+ * - "HIGH" or "LOW" as a value set on each bit on of the ATR idle state
+ * register
+ * - ATR_RX - a string of numbers representing a value of a ATR receive only state
+ * register
+ * - "HIGH" or "LOW" as a value set on each bit on of the ATR receive only
+ * state register
+ * - ATR_TX - a string of numbers representing a value of the ATR transmit only state
+ * register
+ * - "HIGH" or "LOW" as a value set on each bit on of the ATR transmit only
+ * state register
+ * - ATR_XX - a string of numbers representing a value of the ATR full duplex state
+ * register
+ * - "HIGH" or "LOW" as a value set on each bit on of the ATR full duplex
+ * state register
* - READBACK - readback input GPIOs
* \param bank the name of a GPIO bank
* \param attr the name of a GPIO attribute
* \param mboard the motherboard index 0 to M-1
* \return the value set for this attribute in vector of strings
*/
- virtual std::vector<std::string> get_gpio_string_attr(const std::string &bank, const std::string &attr, const size_t mboard = 0) = 0;
+ virtual std::vector<std::string> get_gpio_string_attr(
+ const std::string& bank, const std::string& attr, const size_t mboard = 0) = 0;
/*******************************************************************
* Register IO methods
******************************************************************/
- struct register_info_t {
+ struct register_info_t
+ {
size_t bitwidth;
bool readable;
bool writable;
@@ -1612,18 +1611,23 @@ public:
* Get more information about a low-level device register
* \param path the full path to the register
* \param mboard the motherboard index 0 to M-1
- * \return the info struct which contains the bitwidth and read-write access information
+ * \return the info struct which contains the bitwidth and read-write access
+ * information
*/
- virtual register_info_t get_register_info(const std::string &path, const size_t mboard = 0) = 0;
+ virtual register_info_t get_register_info(
+ const std::string& path, const size_t mboard = 0) = 0;
/*!
* Write a low-level register field for a register in the USRP hardware
* \param path the full path to the register
- * \param field the identifier of bitfield to be written (all other bits remain unchanged)
- * \param value the value to write to the register field
- * \param mboard the motherboard index 0 to M-1
+ * \param field the identifier of bitfield to be written (all other bits remain
+ * unchanged) \param value the value to write to the register field \param mboard the
+ * motherboard index 0 to M-1
*/
- virtual void write_register(const std::string &path, const uint32_t field, const uint64_t value, const size_t mboard = 0) = 0;
+ virtual void write_register(const std::string& path,
+ const uint32_t field,
+ const uint64_t value,
+ const size_t mboard = 0) = 0;
/*!
* Read a low-level register field from a register in the USRP hardware
@@ -1632,7 +1636,8 @@ public:
* \param mboard the motherboard index 0 to M-1
* \return the value of the register field
*/
- virtual uint64_t read_register(const std::string &path, const uint32_t field, const size_t mboard = 0) = 0;
+ virtual uint64_t read_register(
+ const std::string& path, const uint32_t field, const size_t mboard = 0) = 0;
/*******************************************************************
* Filter API methods
@@ -1644,18 +1649,19 @@ public:
* \parblock
* Select only certain filter names by specifying this search mask.
*
- * E.g. if search mask is set to "rx_frontends/A" only filter names including that string will be returned.
- * \endparblock
- * \return a vector of strings representing the selected filter names.
+ * E.g. if search mask is set to "rx_frontends/A" only filter names including that
+ * string will be returned. \endparblock \return a vector of strings representing the
+ * selected filter names.
*/
- virtual std::vector<std::string> get_filter_names(const std::string &search_mask = "") = 0;
+ virtual std::vector<std::string> get_filter_names(
+ const std::string& search_mask = "") = 0;
/*!
* Return the filter object for the given name.
* \param path the name of the filter as returned from get_filter_names().
* \return a filter_info_base::sptr.
*/
- virtual filter_info_base::sptr get_filter(const std::string &path) = 0;
+ virtual filter_info_base::sptr get_filter(const std::string& path) = 0;
/*!
* Write back a filter obtained by get_filter() to the signal path.
@@ -1664,10 +1670,10 @@ public:
* \param path the name of the filter as returned from get_filter_names().
* \param filter the filter_info_base::sptr of the filter object to be written
*/
- virtual void set_filter(const std::string &path, filter_info_base::sptr filter) = 0;
-
+ virtual void set_filter(const std::string& path, filter_info_base::sptr filter) = 0;
};
-}}
+} // namespace usrp
+} // namespace uhd
#endif /* INCLUDED_UHD_USRP_MULTI_USRP_HPP */
diff --git a/host/include/uhd/usrp/subdev_spec.hpp b/host/include/uhd/usrp/subdev_spec.hpp
index 37746a7be..eb526e536 100644
--- a/host/include/uhd/usrp/subdev_spec.hpp
+++ b/host/include/uhd/usrp/subdev_spec.hpp
@@ -10,78 +10,76 @@
#include <uhd/config.hpp>
#include <boost/operators.hpp>
-#include <vector>
#include <string>
+#include <vector>
-namespace uhd{ namespace usrp{
+namespace uhd { namespace usrp {
- /*!
- * A subdevice specification (daughterboard slot, subdevice) name pairing.
- */
- struct UHD_API subdev_spec_pair_t : boost::equality_comparable<subdev_spec_pair_t>{
- //! The daughterboard slot name
- std::string db_name;
+/*!
+ * A subdevice specification (daughterboard slot, subdevice) name pairing.
+ */
+struct UHD_API subdev_spec_pair_t : boost::equality_comparable<subdev_spec_pair_t>
+{
+ //! The daughterboard slot name
+ std::string db_name;
- //! The subdevice name
- std::string sd_name;
+ //! The subdevice name
+ std::string sd_name;
- /*!
- * Create a new subdevice specification pair from dboard and subdev names.
- * \param db_name the name of a daughterboard slot
- * \param sd_name the name of a subdevice on that daughterboard
- */
- subdev_spec_pair_t(
- const std::string &db_name = "",
- const std::string &sd_name = ""
- );
+ /*!
+ * Create a new subdevice specification pair from dboard and subdev names.
+ * \param db_name the name of a daughterboard slot
+ * \param sd_name the name of a subdevice on that daughterboard
+ */
+ subdev_spec_pair_t(const std::string& db_name = "", const std::string& sd_name = "");
- //! overloaded equality operator
- bool operator==(const subdev_spec_pair_t &other);
+ //! overloaded equality operator
+ bool operator==(const subdev_spec_pair_t& other);
- //! overloaded inquality operator
- bool operator!=(const subdev_spec_pair_t &other);
- };
+ //! overloaded inquality operator
+ bool operator!=(const subdev_spec_pair_t& other);
+};
- //! overloaded comparison operator for subdev_spec_pair_t
- UHD_API bool operator==(const subdev_spec_pair_t &, const subdev_spec_pair_t &);
+//! overloaded comparison operator for subdev_spec_pair_t
+UHD_API bool operator==(const subdev_spec_pair_t&, const subdev_spec_pair_t&);
+/*!
+ * A list of (daughterboard slot name, subdevice name) pairs:
+ *
+ * A subdevice specification represents a list of subdevices on a motherboard.
+ * The subdevices specified may span across multiple daughterboards;
+ * Hence the need for a subdevice specification over a simple list of strings.
+ * Typically, the user will pass a RX or TX subdevice specification into the API,
+ * and the implementation will infer the channel configuration from the specification.
+ *
+ * The subdevice specification can be represented as a markup-string.
+ * The markup-string is a whitespace separated list of dboard:subdev pairs.
+ * The first pair represents the subdevice for channel zero,
+ * the second pair represents the subdevice for channel one, and so on.
+ */
+class UHD_API subdev_spec_t : public std::vector<subdev_spec_pair_t>
+{
+public:
/*!
- * A list of (daughterboard slot name, subdevice name) pairs:
- *
- * A subdevice specification represents a list of subdevices on a motherboard.
- * The subdevices specified may span across multiple daughterboards;
- * Hence the need for a subdevice specification over a simple list of strings.
- * Typically, the user will pass a RX or TX subdevice specification into the API,
- * and the implementation will infer the channel configuration from the specification.
- *
- * The subdevice specification can be represented as a markup-string.
- * The markup-string is a whitespace separated list of dboard:subdev pairs.
- * The first pair represents the subdevice for channel zero,
- * the second pair represents the subdevice for channel one, and so on.
+ * Create a subdev specification from a markup string.
+ * \param markup the markup string
*/
- class UHD_API subdev_spec_t : public std::vector<subdev_spec_pair_t>{
- public:
+ subdev_spec_t(const std::string& markup = "");
- /*!
- * Create a subdev specification from a markup string.
- * \param markup the markup string
- */
- subdev_spec_t(const std::string &markup = "");
-
- /*!
- * Convert a subdev specification into a pretty print string.
- * \return a printable string representing the subdev specification
- */
- std::string to_pp_string(void) const;
+ /*!
+ * Convert a subdev specification into a pretty print string.
+ * \return a printable string representing the subdev specification
+ */
+ std::string to_pp_string(void) const;
- /*!
- * Convert the subdevice specification into a markup string.
- * The markup string contains the delimiter symbols.
- * \return a string with delimiter markup
- */
- std::string to_string(void) const;
- };
+ /*!
+ * Convert the subdevice specification into a markup string.
+ * The markup string contains the delimiter symbols.
+ * \return a string with delimiter markup
+ */
+ std::string to_string(void) const;
+};
-}}
+}} // namespace uhd::usrp
#endif /* INCLUDED_UHD_USRP_SUBDEV_SPEC_HPP */
diff --git a/host/include/uhd/usrp_clock/multi_usrp_clock.hpp b/host/include/uhd/usrp_clock/multi_usrp_clock.hpp
index a8fe67684..05759c383 100644
--- a/host/include/uhd/usrp_clock/multi_usrp_clock.hpp
+++ b/host/include/uhd/usrp_clock/multi_usrp_clock.hpp
@@ -8,15 +8,14 @@
#ifndef INCLUDED_UHD_MULTI_USRP_CLOCK_HPP
#define INCLUDED_UHD_MULTI_USRP_CLOCK_HPP
-#include <string>
-#include <vector>
-
#include <uhd/config.hpp>
#include <uhd/device.hpp>
#include <uhd/types/device_addr.hpp>
#include <uhd/types/sensors.hpp>
+#include <string>
+#include <vector>
-namespace uhd{ namespace usrp_clock{
+namespace uhd { namespace usrp_clock {
/*!
* The Multi-USRP-Clock device class:
@@ -43,7 +42,8 @@ namespace uhd{ namespace usrp_clock{
* multi_usrp_clock::sptr clock = multi_usrp_clock::make(dev);
* </pre>
*/
-class UHD_API multi_usrp_clock : boost::noncopyable {
+class UHD_API multi_usrp_clock : boost::noncopyable
+{
public:
typedef boost::shared_ptr<multi_usrp_clock> sptr;
@@ -54,7 +54,7 @@ public:
* \param dev_addr the device address
* \return a new Multi-USRP-Clock object
*/
- static sptr make(const device_addr_t &dev_addr);
+ static sptr make(const device_addr_t& dev_addr);
/*!
* Return the underlying device.
@@ -81,7 +81,7 @@ public:
* \param board the board index (0 to M-1)
* \return a sensor value object
*/
- virtual sensor_value_t get_sensor(const std::string &name, size_t board = 0) = 0;
+ virtual sensor_value_t get_sensor(const std::string& name, size_t board = 0) = 0;
/*!
* Get a list of possible USRP Clock sensor names.
@@ -91,7 +91,6 @@ public:
virtual std::vector<std::string> get_sensor_names(size_t board = 0) = 0;
};
-} //namespace
-} //namespace
+}} // namespace uhd::usrp_clock
#endif /* INCLUDED_UHD_MULTI_USRP_CLOCK_HPP */
diff --git a/host/include/uhd/usrp_clock/octoclock_eeprom.hpp b/host/include/uhd/usrp_clock/octoclock_eeprom.hpp
index 3aaa0ad7c..3d514ebc2 100644
--- a/host/include/uhd/usrp_clock/octoclock_eeprom.hpp
+++ b/host/include/uhd/usrp_clock/octoclock_eeprom.hpp
@@ -13,7 +13,7 @@
#include <uhd/types/dict.hpp>
#include <string>
-namespace uhd{ namespace usrp_clock{
+namespace uhd { namespace usrp_clock {
/*!
* The OctoClock EEPROM object:
@@ -22,7 +22,8 @@ namespace uhd{ namespace usrp_clock{
* Use the dictionary interface to get and set values.
* Commit to the EEPROM to save changed settings.
*/
-class UHD_API octoclock_eeprom_t : public uhd::dict<std::string, std::string>{
+class UHD_API octoclock_eeprom_t : public uhd::dict<std::string, std::string>
+{
public:
//! Make a new empty OctoClock EEPROM handler
octoclock_eeprom_t(void);
@@ -44,10 +45,8 @@ private:
uint32_t _proto_ver;
void _load();
void _store() const;
-
};
-} //namespace
-} //namespace
+}} // namespace uhd::usrp_clock
#endif /* INCLUDED_UHD_USRP_CLOCK_OCTOCLOCK_EEPROM_HPP */
diff --git a/host/include/uhd/utils/algorithm.hpp b/host/include/uhd/utils/algorithm.hpp
index 6c2067918..6a6c611d6 100644
--- a/host/include/uhd/utils/algorithm.hpp
+++ b/host/include/uhd/utils/algorithm.hpp
@@ -8,74 +8,84 @@
#ifndef INCLUDED_UHD_UTILS_ALGORITHM_HPP
#define INCLUDED_UHD_UTILS_ALGORITHM_HPP
-#include <algorithm>
#include <stdint.h>
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
+#include <algorithm>
/*!
* Useful templated functions, classes, and constants. Some of these overlap
* with the STL, but these are created with Boost for portability.
* Many of the range wrapper functions come with versions of boost >= 1.43.
*/
-namespace uhd{
- /*!
- * A wrapper around std::sort that takes a range instead of an iterator.
- *
- * The elements are sorted into ascending order using the less-than operator.
- * This wrapper sorts the elements non-destructively into a new range.
- * Based on the builtin python function sorted(...)
- *
- * \param range the range of elements to be sorted
- * \return a new range with the elements sorted
- */
- template<typename Range> UHD_INLINE Range sorted(const Range &range){
- Range r(range); std::sort(boost::begin(r), boost::end(r)); return r;
- }
+namespace uhd {
+/*!
+ * A wrapper around std::sort that takes a range instead of an iterator.
+ *
+ * The elements are sorted into ascending order using the less-than operator.
+ * This wrapper sorts the elements non-destructively into a new range.
+ * Based on the builtin python function sorted(...)
+ *
+ * \param range the range of elements to be sorted
+ * \return a new range with the elements sorted
+ */
+template <typename Range> UHD_INLINE Range sorted(const Range& range)
+{
+ Range r(range);
+ std::sort(boost::begin(r), boost::end(r));
+ return r;
+}
- /*!
- * A wrapper around std::reverse that takes a range instead of an iterator.
- *
- * The elements are reversed into descending order using the less-than operator.
- * This wrapper reverses the elements non-destructively into a new range.
- * Based on the builtin python function reversed(...)
- *
- * \param range the range of elements to be reversed
- * \return a new range with the elements reversed
- */
- template<typename Range> UHD_INLINE Range reversed(const Range &range){
- Range r(range); std::reverse(boost::begin(r), boost::end(r)); return r;
- }
+/*!
+ * A wrapper around std::reverse that takes a range instead of an iterator.
+ *
+ * The elements are reversed into descending order using the less-than operator.
+ * This wrapper reverses the elements non-destructively into a new range.
+ * Based on the builtin python function reversed(...)
+ *
+ * \param range the range of elements to be reversed
+ * \return a new range with the elements reversed
+ */
+template <typename Range> UHD_INLINE Range reversed(const Range& range)
+{
+ Range r(range);
+ std::reverse(boost::begin(r), boost::end(r));
+ return r;
+}
- /*!
- * Is the value found within the elements in this range?
- *
- * Uses std::find to search the iterable for an element.
- *
- * \param range the elements to search through
- * \param value the match to look for in the range
- * \return true when the value is found in the range
- */
- template<typename Range, typename T> UHD_INLINE
- bool has(const Range &range, const T &value){
- return boost::end(range) != std::find(boost::begin(range), boost::end(range), value);
- }
+/*!
+ * Is the value found within the elements in this range?
+ *
+ * Uses std::find to search the iterable for an element.
+ *
+ * \param range the elements to search through
+ * \param value the match to look for in the range
+ * \return true when the value is found in the range
+ */
+template <typename Range, typename T>
+UHD_INLINE bool has(const Range& range, const T& value)
+{
+ return boost::end(range) != std::find(boost::begin(range), boost::end(range), value);
+}
- /*!
- * A templated clip implementation.
- * \param val the value to clip between an upper and lower limit
- * \param bound1 the upper or lower bound
- * \param bound2 the upper or lower bound
- * \return the value clipped at the bounds
- */
- template<typename T> UHD_INLINE T clip(const T &val, const T &bound1, const T &bound2){
- const T minimum = std::min(bound1, bound2);
- if (val < minimum) return minimum;
- const T maximum = std::max(bound1, bound2);
- if (val > maximum) return maximum;
- return val;
- }
+/*!
+ * A templated clip implementation.
+ * \param val the value to clip between an upper and lower limit
+ * \param bound1 the upper or lower bound
+ * \param bound2 the upper or lower bound
+ * \return the value clipped at the bounds
+ */
+template <typename T> UHD_INLINE T clip(const T& val, const T& bound1, const T& bound2)
+{
+ const T minimum = std::min(bound1, bound2);
+ if (val < minimum)
+ return minimum;
+ const T maximum = std::max(bound1, bound2);
+ if (val > maximum)
+ return maximum;
+ return val;
+}
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_UTILS_ALGORITHM_HPP */
diff --git a/host/include/uhd/utils/assert_has.hpp b/host/include/uhd/utils/assert_has.hpp
index 25f3a2620..281c61ddf 100644
--- a/host/include/uhd/utils/assert_has.hpp
+++ b/host/include/uhd/utils/assert_has.hpp
@@ -11,26 +11,23 @@
#include <uhd/config.hpp>
#include <string>
-namespace uhd{
+namespace uhd {
- /*!
- * Check that an element is found in a container.
- * If not, throw a meaningful assertion error.
- * The "what" in the error will show what is
- * being set and a list of known good values.
- *
- * \param range a list of possible settings
- * \param value an element that may be in the list
- * \param what a description of what the value is
- * \throw assertion_error when elem not in list
- */
- template<typename T, typename Range> void assert_has(
- const Range &range,
- const T &value,
- const std::string &what = "unknown"
- );
+/*!
+ * Check that an element is found in a container.
+ * If not, throw a meaningful assertion error.
+ * The "what" in the error will show what is
+ * being set and a list of known good values.
+ *
+ * \param range a list of possible settings
+ * \param value an element that may be in the list
+ * \param what a description of what the value is
+ * \throw assertion_error when elem not in list
+ */
+template <typename T, typename Range>
+void assert_has(const Range& range, const T& value, const std::string& what = "unknown");
-}//namespace uhd
+} // namespace uhd
#include <uhd/utils/assert_has.ipp>
diff --git a/host/include/uhd/utils/byteswap.hpp b/host/include/uhd/utils/byteswap.hpp
index a8fa81e19..e05a6cced 100644
--- a/host/include/uhd/utils/byteswap.hpp
+++ b/host/include/uhd/utils/byteswap.hpp
@@ -16,36 +16,36 @@
* Provide fast byteswaping routines for 16, 32, and 64 bit integers,
* by using the system's native routines/intrinsics when available.
*/
-namespace uhd{
+namespace uhd {
- //! perform a byteswap on a 16 bit integer
- uint16_t byteswap(uint16_t);
+//! perform a byteswap on a 16 bit integer
+uint16_t byteswap(uint16_t);
- //! perform a byteswap on a 32 bit integer
- uint32_t byteswap(uint32_t);
+//! perform a byteswap on a 32 bit integer
+uint32_t byteswap(uint32_t);
- //! perform a byteswap on a 64 bit integer
- uint64_t byteswap(uint64_t);
+//! perform a byteswap on a 64 bit integer
+uint64_t byteswap(uint64_t);
- //! network to host: short, long, or long-long
- template<typename T> T ntohx(T);
+//! network to host: short, long, or long-long
+template <typename T> T ntohx(T);
- //! host to network: short, long, or long-long
- template<typename T> T htonx(T);
+//! host to network: short, long, or long-long
+template <typename T> T htonx(T);
- //! worknet to host: short, long, or long-long
- //
- // The argument is assumed to be little-endian (i.e, the inverse
- // of typical network endianness).
- template<typename T> T wtohx(T);
+//! worknet to host: short, long, or long-long
+//
+// The argument is assumed to be little-endian (i.e, the inverse
+// of typical network endianness).
+template <typename T> T wtohx(T);
- //! host to worknet: short, long, or long-long
- //
- // The return value is little-endian (i.e, the inverse
- // of typical network endianness).
- template<typename T> T htowx(T);
+//! host to worknet: short, long, or long-long
+//
+// The return value is little-endian (i.e, the inverse
+// of typical network endianness).
+template <typename T> T htowx(T);
-} //namespace uhd
+} // namespace uhd
#include <uhd/utils/byteswap.ipp>
diff --git a/host/include/uhd/utils/cast.hpp b/host/include/uhd/utils/cast.hpp
index 0944c012a..d6d86d119 100644
--- a/host/include/uhd/utils/cast.hpp
+++ b/host/include/uhd/utils/cast.hpp
@@ -9,25 +9,24 @@
#define INCLUDED_UHD_UTILS_CAST_HPP
#include <uhd/config.hpp>
-#include <string>
#include <sstream>
+#include <string>
-namespace uhd{ namespace cast{
- //! Convert a hexadecimal string into a value.
- //
- // Example:
- // uint16_t x = hexstr_cast<uint16_t>("0xDEADBEEF");
- // Uses stringstream.
- template<typename T> UHD_INLINE T hexstr_cast(const std::string &in)
- {
- T x;
- std::stringstream ss;
- ss << std::hex << in;
- ss >> x;
- return x;
- }
+namespace uhd { namespace cast {
+//! Convert a hexadecimal string into a value.
+//
+// Example:
+// uint16_t x = hexstr_cast<uint16_t>("0xDEADBEEF");
+// Uses stringstream.
+template <typename T> UHD_INLINE T hexstr_cast(const std::string& in)
+{
+ T x;
+ std::stringstream ss;
+ ss << std::hex << in;
+ ss >> x;
+ return x;
+}
-}} //namespace uhd::cast
+}} // namespace uhd::cast
#endif /* INCLUDED_UHD_UTILS_CAST_HPP */
-
diff --git a/host/include/uhd/utils/csv.hpp b/host/include/uhd/utils/csv.hpp
index dbc73695b..90933d416 100644
--- a/host/include/uhd/utils/csv.hpp
+++ b/host/include/uhd/utils/csv.hpp
@@ -9,17 +9,17 @@
#define INCLUDED_UHD_UTILS_CSV_HPP
#include <uhd/config.hpp>
-#include <vector>
-#include <string>
#include <istream>
+#include <string>
+#include <vector>
-namespace uhd{ namespace csv{
- typedef std::vector<std::string> row_type;
- typedef std::vector<row_type> rows_type;
+namespace uhd { namespace csv {
+typedef std::vector<std::string> row_type;
+typedef std::vector<row_type> rows_type;
- //! Convert an input stream to csv rows.
- UHD_API rows_type to_rows(std::istream &input);
+//! Convert an input stream to csv rows.
+UHD_API rows_type to_rows(std::istream& input);
-}} //namespace uhd::csv
+}} // namespace uhd::csv
#endif /* INCLUDED_UHD_UTILS_CSV_HPP */
diff --git a/host/include/uhd/utils/dirty_tracked.hpp b/host/include/uhd/utils/dirty_tracked.hpp
index 1fbfddc6f..8fb390a8b 100644
--- a/host/include/uhd/utils/dirty_tracked.hpp
+++ b/host/include/uhd/utils/dirty_tracked.hpp
@@ -8,115 +8,126 @@
#ifndef INCLUDED_UHD_UTILS_DIRTY_TRACKED_HPP
#define INCLUDED_UHD_UTILS_DIRTY_TRACKED_HPP
-namespace uhd{
+namespace uhd {
+/*!
+ * A class that wraps a data value with a dirty flag
+ * When the client uses the assignment operator on this object, the object
+ * automatically dirties itself if the assigned type is not equal the underlying
+ * data. Data can be cleaned using the mark_clean entry-point.
+ *
+ * Requirements for data_t
+ * - Must have a default constructor
+ * - Must have a copy constructor
+ * - Must have an assignment operator (=)
+ * - Must have an equality operator (==)
+ */
+template <typename data_t> class dirty_tracked
+{
+public:
/*!
- * A class that wraps a data value with a dirty flag
- * When the client uses the assignment operator on this object, the object
- * automatically dirties itself if the assigned type is not equal the underlying
- * data. Data can be cleaned using the mark_clean entry-point.
- *
- * Requirements for data_t
- * - Must have a default constructor
- * - Must have a copy constructor
- * - Must have an assignment operator (=)
- * - Must have an equality operator (==)
+ * Default ctor: Initialize to default value and dirty
*/
- template<typename data_t>
- class dirty_tracked {
- public:
- /*!
- * Default ctor: Initialize to default value and dirty
- */
- dirty_tracked() :
- _data(), //data_t must have a default ctor
- _dirty(true)
- {}
+ dirty_tracked()
+ : _data()
+ , // data_t must have a default ctor
+ _dirty(true)
+ {
+ }
- /*!
- * Initialize to specified value and dirty
- */
- dirty_tracked(const data_t& value) :
- _data(value), //data_t must have a copy ctor
- _dirty(true)
- {}
+ /*!
+ * Initialize to specified value and dirty
+ */
+ dirty_tracked(const data_t& value)
+ : _data(value)
+ , // data_t must have a copy ctor
+ _dirty(true)
+ {
+ }
- /*!
- * Copy ctor: Assign source to this type
- */
- dirty_tracked(const dirty_tracked& source) {
- *this = source;
- }
+ /*!
+ * Copy ctor: Assign source to this type
+ */
+ dirty_tracked(const dirty_tracked& source)
+ {
+ *this = source;
+ }
- /*!
- * Get underlying data
- */
- UHD_INLINE const data_t& get() const {
- return _data;
- }
+ /*!
+ * Get underlying data
+ */
+ UHD_INLINE const data_t& get() const
+ {
+ return _data;
+ }
- /*!
- * Has the underlying data changed since the last
- * time it was cleaned?
- */
- UHD_INLINE bool is_dirty() const {
- return _dirty;
- }
+ /*!
+ * Has the underlying data changed since the last
+ * time it was cleaned?
+ */
+ UHD_INLINE bool is_dirty() const
+ {
+ return _dirty;
+ }
- /*!
- * Mark the underlying data as clean
- */
- UHD_INLINE void mark_clean() {
- _dirty = false;
- }
+ /*!
+ * Mark the underlying data as clean
+ */
+ UHD_INLINE void mark_clean()
+ {
+ _dirty = false;
+ }
- /*!
- * Mark the underlying data as dirty
- */
- UHD_INLINE void force_dirty() {
- _dirty = true;
- }
+ /*!
+ * Mark the underlying data as dirty
+ */
+ UHD_INLINE void force_dirty()
+ {
+ _dirty = true;
+ }
- /*!
- * Assignment with data.
- * Store the specified value and mark it as dirty
- * if it is not equal to the underlying data.
- */
- UHD_INLINE dirty_tracked& operator=(const data_t& value)
- {
- if(!(_data == value)) { //data_t must have an equality operator
- _dirty = true;
- _data = value; //data_t must have an assignment operator
- }
- return *this;
+ /*!
+ * Assignment with data.
+ * Store the specified value and mark it as dirty
+ * if it is not equal to the underlying data.
+ */
+ UHD_INLINE dirty_tracked& operator=(const data_t& value)
+ {
+ if (!(_data == value)) { // data_t must have an equality operator
+ _dirty = true;
+ _data = value; // data_t must have an assignment operator
}
+ return *this;
+ }
- /*!
- * Assignment with dirty tracked type.
- * Store the specified value from dirty type and mark it as dirty
- * if it is not equal to the underlying data.
- * This exists to optimize out an implicit cast from dirty_tracked
- * type to data type.
- */
- UHD_INLINE dirty_tracked& operator=(const dirty_tracked& source) {
- if (!(_data == source._data)) {
- _dirty = true;
- _data = source._data;
- }
- return *this;
+ /*!
+ * Assignment with dirty tracked type.
+ * Store the specified value from dirty type and mark it as dirty
+ * if it is not equal to the underlying data.
+ * This exists to optimize out an implicit cast from dirty_tracked
+ * type to data type.
+ */
+ UHD_INLINE dirty_tracked& operator=(const dirty_tracked& source)
+ {
+ if (!(_data == source._data)) {
+ _dirty = true;
+ _data = source._data;
}
+ return *this;
+ }
- /*!
- * Explicit conversion from this type to data_t
- */
- UHD_INLINE operator const data_t&() const {
- return get();
- }
+ /*!
+ * Explicit conversion from this type to data_t
+ */
+ UHD_INLINE operator const data_t&() const
+ {
+ return get();
+ }
- private:
- data_t _data;
- bool _dirty;
- };
+private:
+ data_t _data;
+ bool _dirty;
+};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_UTILS_DIRTY_TRACKED_HPP */
diff --git a/host/include/uhd/utils/gain_group.hpp b/host/include/uhd/utils/gain_group.hpp
index 128577c39..9822f3620 100644
--- a/host/include/uhd/utils/gain_group.hpp
+++ b/host/include/uhd/utils/gain_group.hpp
@@ -10,24 +10,26 @@
#include <uhd/config.hpp>
#include <uhd/types/ranges.hpp>
-#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
+#include <boost/shared_ptr.hpp>
#include <boost/utility.hpp>
-#include <vector>
#include <string>
+#include <vector>
-namespace uhd{
+namespace uhd {
/*!
* A set of function to control a gain element.
*/
-struct UHD_API gain_fcns_t{
+struct UHD_API gain_fcns_t
+{
boost::function<gain_range_t(void)> get_range;
- boost::function<double(void)> get_value;
- boost::function<void(double)> set_value;
+ boost::function<double(void)> get_value;
+ boost::function<void(double)> set_value;
};
-class UHD_API gain_group : boost::noncopyable{
+class UHD_API gain_group : boost::noncopyable
+{
public:
typedef boost::shared_ptr<gain_group> sptr;
@@ -40,7 +42,7 @@ public:
* \param name name of the gain element (optional)
* \return a gain range with overall min, max, step
*/
- virtual gain_range_t get_range(const std::string &name = "") = 0;
+ virtual gain_range_t get_range(const std::string& name = "") = 0;
/*!
* Get the gain value for the gain element specified by name.
@@ -48,7 +50,7 @@ public:
* \param name name of the gain element (optional)
* \return a gain value of the element or all elements
*/
- virtual double get_value(const std::string &name = "") = 0;
+ virtual double get_value(const std::string& name = "") = 0;
/*!
* Set the gain value for the gain element specified by name.
@@ -58,7 +60,7 @@ public:
* \param gain the gain to set for the element or across the group
* \param name name of the gain element (optional)
*/
- virtual void set_value(double gain, const std::string &name = "") = 0;
+ virtual void set_value(double gain, const std::string& name = "") = 0;
/*!
* Get a list of names of registered gain elements.
@@ -82,10 +84,7 @@ public:
* \param priority the priority of the gain element
*/
virtual void register_fcns(
- const std::string &name,
- const gain_fcns_t &gain_fcns,
- size_t priority = 0
- ) = 0;
+ const std::string& name, const gain_fcns_t& gain_fcns, size_t priority = 0) = 0;
/*!
* Make a new empty gain group.
@@ -94,7 +93,6 @@ public:
static sptr make(void);
};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_UTILS_GAIN_GROUP_HPP */
-
diff --git a/host/include/uhd/utils/log.hpp b/host/include/uhd/utils/log.hpp
index 584ba2cad..95ba8e670 100644
--- a/host/include/uhd/utils/log.hpp
+++ b/host/include/uhd/utils/log.hpp
@@ -11,10 +11,10 @@
#include <uhd/config.hpp>
#include <boost/current_function.hpp>
#include <boost/thread/thread.hpp>
+#include <iostream>
#include <ostream>
-#include <string>
#include <sstream>
-#include <iostream>
+#include <string>
/*! \file log.hpp
*
@@ -94,85 +94,83 @@
* fatal: 5
*/
-namespace uhd {
- namespace log {
- /*! Logging severity levels
- *
- * Either numeric value or string can be used to define loglevel in
- * CMake and environment variables
- */
- enum severity_level {
- trace = 0, /**< displays every available log message */
- debug = 1, /**< displays most log messages necessary for debugging internals */
- info = 2, /**< informational messages about setup and what is going on*/
- warning = 3, /**< something is not right but operation can continue */
- error = 4, /**< something has gone wrong */
- fatal = 5, /**< something has gone horribly wrong */
- off = 6, /**< logging is turned off */
- };
-
- /*! Logging info structure
- *
- * Information needed to create a log entry is fully contained in the
- * logging_info structure.
- */
- struct UHD_API logging_info {
- logging_info()
- : verbosity(uhd::log::off) {}
- logging_info(
- const boost::posix_time::ptime &time_,
- const uhd::log::severity_level &verbosity_,
- const std::string &file_,
- const unsigned int &line_,
- const std::string &component_,
- const boost::thread::id &thread_id_
- ) : time(time_),
- verbosity(verbosity_),
- file(file_),
- line(line_),
- component(component_),
- thread_id(thread_id_)
- { /* nop */ }
-
- boost::posix_time::ptime time;
- uhd::log::severity_level verbosity;
- std::string file;
- unsigned int line;
- std::string component;
- boost::thread::id thread_id;
- std::string message;
- };
-
- /*! Set the global log level
- *
- * The global log level gets applied before the specific log level.
- * So, if the global log level is 'info', no logger can can print
- * messages at level 'debug' or below.
- */
- UHD_API void set_log_level(uhd::log::severity_level level);
-
- /*! Set the log level for the console logger (if defined).
- *
- * Short-hand for `set_logger_level("console", level);`
- */
- UHD_API void set_console_level(uhd::log::severity_level level);
-
- /*! Set the log level for the file logger (if defined)
- *
- * Short-hand for `set_logger_level("file", level);`
- */
- UHD_API void set_file_level(uhd::log::severity_level level);
-
- /*! Set the log level for any specific logger.
- *
- * \param logger Name of the logger
- * \param level New log level for this logger.
- *
- * \throws uhd::key_error if \p logger was not defined
- */
- UHD_API void set_logger_level(const std::string &logger, uhd::log::severity_level level);
+namespace uhd { namespace log {
+/*! Logging severity levels
+ *
+ * Either numeric value or string can be used to define loglevel in
+ * CMake and environment variables
+ */
+enum severity_level {
+ trace = 0, /**< displays every available log message */
+ debug = 1, /**< displays most log messages necessary for debugging internals */
+ info = 2, /**< informational messages about setup and what is going on*/
+ warning = 3, /**< something is not right but operation can continue */
+ error = 4, /**< something has gone wrong */
+ fatal = 5, /**< something has gone horribly wrong */
+ off = 6, /**< logging is turned off */
+};
+
+/*! Logging info structure
+ *
+ * Information needed to create a log entry is fully contained in the
+ * logging_info structure.
+ */
+struct UHD_API logging_info
+{
+ logging_info() : verbosity(uhd::log::off) {}
+ logging_info(const boost::posix_time::ptime& time_,
+ const uhd::log::severity_level& verbosity_,
+ const std::string& file_,
+ const unsigned int& line_,
+ const std::string& component_,
+ const boost::thread::id& thread_id_)
+ : time(time_)
+ , verbosity(verbosity_)
+ , file(file_)
+ , line(line_)
+ , component(component_)
+ , thread_id(thread_id_)
+ { /* nop */
}
-}
+
+ boost::posix_time::ptime time;
+ uhd::log::severity_level verbosity;
+ std::string file;
+ unsigned int line;
+ std::string component;
+ boost::thread::id thread_id;
+ std::string message;
+};
+
+/*! Set the global log level
+ *
+ * The global log level gets applied before the specific log level.
+ * So, if the global log level is 'info', no logger can can print
+ * messages at level 'debug' or below.
+ */
+UHD_API void set_log_level(uhd::log::severity_level level);
+
+/*! Set the log level for the console logger (if defined).
+ *
+ * Short-hand for `set_logger_level("console", level);`
+ */
+UHD_API void set_console_level(uhd::log::severity_level level);
+
+/*! Set the log level for the file logger (if defined)
+ *
+ * Short-hand for `set_logger_level("file", level);`
+ */
+UHD_API void set_file_level(uhd::log::severity_level level);
+
+/*! Set the log level for any specific logger.
+ *
+ * \param logger Name of the logger
+ * \param level New log level for this logger.
+ *
+ * \throws uhd::key_error if \p logger was not defined
+ */
+UHD_API void set_logger_level(const std::string& logger, uhd::log::severity_level level);
+}} // namespace uhd::log
//! \cond
//! Internal logging macro to be used in other macros
@@ -182,45 +180,45 @@ namespace uhd {
// macro-style logging (compile-time determined)
#if UHD_LOG_MIN_LEVEL < 1
-#define UHD_LOG_TRACE(component, message) \
- _UHD_LOG_INTERNAL(component, uhd::log::trace) << message;
+# define UHD_LOG_TRACE(component, message) \
+ _UHD_LOG_INTERNAL(component, uhd::log::trace) << message;
#else
-#define UHD_LOG_TRACE(component, message)
+# define UHD_LOG_TRACE(component, message)
#endif
#if UHD_LOG_MIN_LEVEL < 2
-#define UHD_LOG_DEBUG(component, message) \
- _UHD_LOG_INTERNAL(component, uhd::log::debug) << message;
+# define UHD_LOG_DEBUG(component, message) \
+ _UHD_LOG_INTERNAL(component, uhd::log::debug) << message;
#else
-#define UHD_LOG_DEBUG(component, message)
+# define UHD_LOG_DEBUG(component, message)
#endif
#if UHD_LOG_MIN_LEVEL < 3
-#define UHD_LOG_INFO(component, message) \
- _UHD_LOG_INTERNAL(component, uhd::log::info) << message;
+# define UHD_LOG_INFO(component, message) \
+ _UHD_LOG_INTERNAL(component, uhd::log::info) << message;
#else
-#define UHD_LOG_INFO(component, message)
+# define UHD_LOG_INFO(component, message)
#endif
#if UHD_LOG_MIN_LEVEL < 4
-#define UHD_LOG_WARNING(component, message) \
- _UHD_LOG_INTERNAL(component, uhd::log::warning) << message;
+# define UHD_LOG_WARNING(component, message) \
+ _UHD_LOG_INTERNAL(component, uhd::log::warning) << message;
#else
-#define UHD_LOG_WARNING(component, message)
+# define UHD_LOG_WARNING(component, message)
#endif
#if UHD_LOG_MIN_LEVEL < 5
-#define UHD_LOG_ERROR(component, message) \
- _UHD_LOG_INTERNAL(component, uhd::log::error) << message;
+# define UHD_LOG_ERROR(component, message) \
+ _UHD_LOG_INTERNAL(component, uhd::log::error) << message;
#else
-#define UHD_LOG_ERROR(component, message)
+# define UHD_LOG_ERROR(component, message)
#endif
#if UHD_LOG_MIN_LEVEL < 6
-#define UHD_LOG_FATAL(component, message) \
- _UHD_LOG_INTERNAL(component, uhd::log::fatal) << message;
+# define UHD_LOG_FATAL(component, message) \
+ _UHD_LOG_INTERNAL(component, uhd::log::fatal) << message;
#else
-#define UHD_LOG_FATAL(component, message)
+# define UHD_LOG_FATAL(component, message)
#endif
#ifndef UHD_LOG_FASTPATH_DISABLE
@@ -228,10 +226,9 @@ namespace uhd {
// No metadata is tracked. Only the message is displayed. This does not go
// through the regular backends. Mostly used for printing the UOSDL characters
// during streaming.
-#define UHD_LOG_FASTPATH(message) \
- uhd::_log::log_fastpath(message);
+# define UHD_LOG_FASTPATH(message) uhd::_log::log_fastpath(message);
#else
-#define UHD_LOG_FASTPATH(message)
+# define UHD_LOG_FASTPATH(message)
#endif
// iostream-style logging
@@ -245,67 +242,67 @@ namespace uhd {
#if defined(__GNUG__)
//! Helpful debug tool to print site info
-#define UHD_HERE() \
- UHD_LOGGER_DEBUG("DEBUG") << __FILE__ << ":" << __LINE__ << " (" << __PRETTY_FUNCTION__ << ")";
+# define UHD_HERE() \
+ UHD_LOGGER_DEBUG("DEBUG") \
+ << __FILE__ << ":" << __LINE__ << " (" << __PRETTY_FUNCTION__ << ")";
#else
//! Helpful debug tool to print site info
-#define UHD_HERE() \
- UHD_LOGGER_DEBUG("DEBUG") << __FILE__ << ":" << __LINE__;
+# define UHD_HERE() UHD_LOGGER_DEBUG("DEBUG") << __FILE__ << ":" << __LINE__;
#endif
//! Helpful debug tool to print a variable
-#define UHD_VAR(var) \
- UHD_LOGGER_DEBUG("DEBUG") << #var << " = " << var;
+#define UHD_VAR(var) UHD_LOGGER_DEBUG("DEBUG") << #var << " = " << var;
//! Helpful debug tool to print a variable in hex
-#define UHD_HEX(var) \
- UHD_LOGGER_DEBUG("DEBUG") << #var << " = 0x" << std::hex << std::setfill('0') << std::setw(8) << var << std::dec;
+#define UHD_HEX(var) \
+ UHD_LOGGER_DEBUG("DEBUG") << #var << " = 0x" << std::hex << std::setfill('0') \
+ << std::setw(8) << var << std::dec;
//! \cond
-namespace uhd{ namespace _log {
-
- //! Fastpath logging
- void UHD_API log_fastpath(const std::string &);
-
- //! Internal logging object (called by UHD_LOG* macros)
- class UHD_API log {
- public:
- log(
- const uhd::log::severity_level verbosity,
- const std::string &file,
- const unsigned int line,
- const std::string &component,
- const boost::thread::id thread_id
- );
-
- ~log(void);
-
- // Macro for overloading insertion operators to avoid costly
- // conversion of types if not logging.
- #define INSERTION_OVERLOAD(x) log& operator<< (x) \
- { \
- if(_log_it) { \
- _ss << val ; \
- } \
- return *this; \
- }
-
- // General insertion overload
- template <typename T>
- INSERTION_OVERLOAD(T val)
-
- // Insertion overloads for std::ostream manipulators
- INSERTION_OVERLOAD(std::ostream& (*val)(std::ostream&))
+namespace uhd {
+namespace _log {
+
+//! Fastpath logging
+void UHD_API log_fastpath(const std::string&);
+
+//! Internal logging object (called by UHD_LOG* macros)
+class UHD_API log
+{
+public:
+ log(const uhd::log::severity_level verbosity,
+ const std::string& file,
+ const unsigned int line,
+ const std::string& component,
+ const boost::thread::id thread_id);
+
+ ~log(void);
+
+// Macro for overloading insertion operators to avoid costly
+// conversion of types if not logging.
+#define INSERTION_OVERLOAD(x) \
+ log& operator<<(x) \
+ { \
+ if (_log_it) { \
+ _ss << val; \
+ } \
+ return *this; \
+ }
+
+ // General insertion overload
+ template <typename T>
+ INSERTION_OVERLOAD(T val)
+
+ // Insertion overloads for std::ostream manipulators
+ INSERTION_OVERLOAD(std::ostream& (*val)(std::ostream&))
INSERTION_OVERLOAD(std::ios& (*val)(std::ios&))
- INSERTION_OVERLOAD(std::ios_base& (*val)(std::ios_base&))
+ INSERTION_OVERLOAD(std::ios_base& (*val)(std::ios_base&))
- private:
- uhd::log::logging_info _log_info;
- std::ostringstream _ss;
- const bool _log_it;
- };
+ private : uhd::log::logging_info _log_info;
+ std::ostringstream _ss;
+ const bool _log_it;
+};
-} //namespace uhd::_log
+} // namespace _log
//! \endcond
} /* namespace uhd */
diff --git a/host/include/uhd/utils/log_add.hpp b/host/include/uhd/utils/log_add.hpp
index 3b552d3a4..36a34523e 100644
--- a/host/include/uhd/utils/log_add.hpp
+++ b/host/include/uhd/utils/log_add.hpp
@@ -13,23 +13,21 @@
#include <uhd/utils/log.hpp>
#include <functional>
-namespace uhd {
- namespace log {
+namespace uhd { namespace log {
- /*! Logging function type
- *
- * Every logging_backend has to define a function with this signature.
- * Can be added to the logging core.
- */
- typedef std::function<void(const uhd::log::logging_info&)> log_fn_t ;
+/*! Logging function type
+ *
+ * Every logging_backend has to define a function with this signature.
+ * Can be added to the logging core.
+ */
+typedef std::function<void(const uhd::log::logging_info&)> log_fn_t;
- /*! Add logging backend to the log system
- *
- * \param key Identifies the logging backend in the logging core
- * \param logger_fn function which actually logs messages to this backend
- */
- UHD_API void add_logger(const std::string &key, log_fn_t logger_fn);
- }
-} /* namespace uhd::log */
+/*! Add logging backend to the log system
+ *
+ * \param key Identifies the logging backend in the logging core
+ * \param logger_fn function which actually logs messages to this backend
+ */
+UHD_API void add_logger(const std::string& key, log_fn_t logger_fn);
+}} /* namespace uhd::log */
#endif /* INCLUDED_UHD_UTILS_LOG_ADD_HPP */
diff --git a/host/include/uhd/utils/math.hpp b/host/include/uhd/utils/math.hpp
index b0e7dd145..e9f8efb57 100644
--- a/host/include/uhd/utils/math.hpp
+++ b/host/include/uhd/utils/math.hpp
@@ -8,10 +8,10 @@
#ifndef INCLUDED_UHD_UTILS_MATH_HPP
#define INCLUDED_UHD_UTILS_MATH_HPP
-#include <cmath>
#include <uhd/config.hpp>
#include <stdint.h>
#include <boost/numeric/conversion/bounds.hpp>
+#include <cmath>
namespace uhd {
@@ -21,213 +21,221 @@ namespace uhd {
*/
namespace math {
- /*!
- * Define epsilon values for floating point comparisons.
- *
- * There are a lot of different sources for epsilon values that we could use
- * for this. For single-precision (f32), most machines will report an
- * epsilon of 1.192e-7, and for double-precision (f64) most machines will
- * report an epsilon of 2.220e-16. The issue is that these are not always
- * appropriate, depending on the scale of the operands and how they have
- * been rounded in previous calculations. The values defined here are
- * defaults, but should be overridden for calculations depending on the
- * application.
- *
- * If a particular comparison is operating using very small or very large
- * values, a custom epsilon should be defined for those computations. This
- * use-case is provided for in the `fp_compare_epsilon` class constructor.
- */
- static const float SINGLE_PRECISION_EPSILON = 1.19e-7f;
- static const double DOUBLE_PRECISION_EPSILON = 2.22e-16;
+/*!
+ * Define epsilon values for floating point comparisons.
+ *
+ * There are a lot of different sources for epsilon values that we could use
+ * for this. For single-precision (f32), most machines will report an
+ * epsilon of 1.192e-7, and for double-precision (f64) most machines will
+ * report an epsilon of 2.220e-16. The issue is that these are not always
+ * appropriate, depending on the scale of the operands and how they have
+ * been rounded in previous calculations. The values defined here are
+ * defaults, but should be overridden for calculations depending on the
+ * application.
+ *
+ * If a particular comparison is operating using very small or very large
+ * values, a custom epsilon should be defined for those computations. This
+ * use-case is provided for in the `fp_compare_epsilon` class constructor.
+ */
+static const float SINGLE_PRECISION_EPSILON = 1.19e-7f;
+static const double DOUBLE_PRECISION_EPSILON = 2.22e-16;
namespace fp_compare {
- /*!
- * Class for floating-point comparisons using an epsilon.
- *
- * At construction, you can specify the epsilon to use for the comparisons.
- * This class, combined with the operators under it, allow for
- * epsilon-comparisons of floats. An example is:
- *
- * // Compare floats 'x' and 'y'.
- * bool x_equals_y = (fp_compare_epsilon<float>(x) == y);
- *
- * // Compare doubles 'x' and 'y'.
- * bool x_equals_y = (fp_compare_epsilon<double>(x) == y);
- */
- template<typename float_t> class fp_compare_epsilon {
- public:
- UHD_INLINE fp_compare_epsilon(float_t value);
- UHD_INLINE fp_compare_epsilon(float_t value, float_t epsilon);
- UHD_INLINE fp_compare_epsilon(const fp_compare_epsilon<float_t>& copy);
- UHD_INLINE ~fp_compare_epsilon();
- UHD_INLINE void operator=(const fp_compare_epsilon& copy);
-
- float_t _value;
- float_t _epsilon;
- };
-
- /* A Note on Floating Point Equality with Epsilons
- *
- * There are obviously a lot of strategies for defining floating point
- * equality, and in the end it all comes down to the domain at hand. UHD's
- * floating-point-with-epsilon comparison algorithm is based on the method
- * presented in Knuth's "The Art of Computer Science" called "very close
- * with tolerance epsilon".
- *
- * [(|u - v| / |u|) <= e] && [(|u - v| / |v|) <= e]
- *
- * UHD's modification to this algorithm is using the denominator's epsilon
- * value (since each float_t object has its own epsilon) for each
- * comparison.
- */
-
- template<typename float_t> UHD_INLINE
- bool operator==(fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator!=(fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator<(fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator<=(fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator>(fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator>=(fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
-
- /* If these operators are used with floats, we rely on type promotion to
- * double. */
- template<typename float_t> UHD_INLINE
- bool operator==(fp_compare_epsilon<float_t> lhs, double rhs);
- template<typename float_t> UHD_INLINE
- bool operator!=(fp_compare_epsilon<float_t> lhs, double rhs);
- template<typename float_t> UHD_INLINE
- bool operator<(fp_compare_epsilon<float_t> lhs, double rhs);
- template<typename float_t> UHD_INLINE
- bool operator<=(fp_compare_epsilon<float_t> lhs, double rhs);
- template<typename float_t> UHD_INLINE
- bool operator>(fp_compare_epsilon<float_t> lhs, double rhs);
- template<typename float_t> UHD_INLINE
- bool operator>=(fp_compare_epsilon<float_t> lhs, double rhs);
-
- template<typename float_t> UHD_INLINE
- bool operator==(double lhs, fp_compare_epsilon<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator!=(double lhs, fp_compare_epsilon<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator<(double lhs, fp_compare_epsilon<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator<=(double lhs, fp_compare_epsilon<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator>(double lhs, fp_compare_epsilon<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator>=(double lhs, fp_compare_epsilon<float_t> rhs);
+/*!
+ * Class for floating-point comparisons using an epsilon.
+ *
+ * At construction, you can specify the epsilon to use for the comparisons.
+ * This class, combined with the operators under it, allow for
+ * epsilon-comparisons of floats. An example is:
+ *
+ * // Compare floats 'x' and 'y'.
+ * bool x_equals_y = (fp_compare_epsilon<float>(x) == y);
+ *
+ * // Compare doubles 'x' and 'y'.
+ * bool x_equals_y = (fp_compare_epsilon<double>(x) == y);
+ */
+template <typename float_t> class fp_compare_epsilon
+{
+public:
+ UHD_INLINE fp_compare_epsilon(float_t value);
+ UHD_INLINE fp_compare_epsilon(float_t value, float_t epsilon);
+ UHD_INLINE fp_compare_epsilon(const fp_compare_epsilon<float_t>& copy);
+ UHD_INLINE ~fp_compare_epsilon();
+ UHD_INLINE void operator=(const fp_compare_epsilon& copy);
+
+ float_t _value;
+ float_t _epsilon;
+};
+
+/* A Note on Floating Point Equality with Epsilons
+ *
+ * There are obviously a lot of strategies for defining floating point
+ * equality, and in the end it all comes down to the domain at hand. UHD's
+ * floating-point-with-epsilon comparison algorithm is based on the method
+ * presented in Knuth's "The Art of Computer Science" called "very close
+ * with tolerance epsilon".
+ *
+ * [(|u - v| / |u|) <= e] && [(|u - v| / |v|) <= e]
+ *
+ * UHD's modification to this algorithm is using the denominator's epsilon
+ * value (since each float_t object has its own epsilon) for each
+ * comparison.
+ */
+
+template <typename float_t>
+UHD_INLINE bool operator==(
+ fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator!=(
+ fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator<(
+ fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator<=(
+ fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator>(
+ fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator>=(
+ fp_compare_epsilon<float_t> lhs, fp_compare_epsilon<float_t> rhs);
+
+/* If these operators are used with floats, we rely on type promotion to
+ * double. */
+template <typename float_t>
+UHD_INLINE bool operator==(fp_compare_epsilon<float_t> lhs, double rhs);
+template <typename float_t>
+UHD_INLINE bool operator!=(fp_compare_epsilon<float_t> lhs, double rhs);
+template <typename float_t>
+UHD_INLINE bool operator<(fp_compare_epsilon<float_t> lhs, double rhs);
+template <typename float_t>
+UHD_INLINE bool operator<=(fp_compare_epsilon<float_t> lhs, double rhs);
+template <typename float_t>
+UHD_INLINE bool operator>(fp_compare_epsilon<float_t> lhs, double rhs);
+template <typename float_t>
+UHD_INLINE bool operator>=(fp_compare_epsilon<float_t> lhs, double rhs);
+
+template <typename float_t>
+UHD_INLINE bool operator==(double lhs, fp_compare_epsilon<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator!=(double lhs, fp_compare_epsilon<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator<(double lhs, fp_compare_epsilon<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator<=(double lhs, fp_compare_epsilon<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator>(double lhs, fp_compare_epsilon<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator>=(double lhs, fp_compare_epsilon<float_t> rhs);
} // namespace fp_compare
- /*!
- * Define delta values for floating point comparisons.
- *
- * These are the default deltas used by the 'fp_compare_delta' class for
- * single and double-precision floating point comparisons.
- */
- static const float SINGLE_PRECISION_DELTA = 1e-3f;
- static const double DOUBLE_PRECISION_DELTA = 1e-5;
+/*!
+ * Define delta values for floating point comparisons.
+ *
+ * These are the default deltas used by the 'fp_compare_delta' class for
+ * single and double-precision floating point comparisons.
+ */
+static const float SINGLE_PRECISION_DELTA = 1e-3f;
+static const double DOUBLE_PRECISION_DELTA = 1e-5;
- /*! Floating-point delta to use for frequency comparisons. */
- static const double FREQ_COMPARISON_DELTA_HZ = 0.1;
+/*! Floating-point delta to use for frequency comparisons. */
+static const double FREQ_COMPARISON_DELTA_HZ = 0.1;
namespace fp_compare {
/*!
- * Class for floating-point comparisons using a delta.
- *
- * At construction, you can specify the delta to use for the comparisons.
- * This class, combined with the operators under it, allow for
- * delta-comparisons of floats. An example is:
- *
- * // Compare floats 'x' and 'y'.
- * bool x_equals_y = (fp_compare_delta<float>(x) == y);
- *
- * // Compare doubles 'x' and 'y'.
- * bool x_equals_y = (fp_compare_delta<double>(x) == y);
- */
- template<typename float_t> class fp_compare_delta {
- public:
- UHD_INLINE fp_compare_delta(float_t value);
- UHD_INLINE fp_compare_delta(float_t value, float_t delta);
- UHD_INLINE fp_compare_delta(const fp_compare_delta<float_t>& copy);
- UHD_INLINE ~fp_compare_delta();
- UHD_INLINE void operator=(const fp_compare_delta& copy);
-
- float_t _value;
- float_t _delta;
- };
-
- template<typename float_t> UHD_INLINE
- bool operator==(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator!=(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator<(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator<=(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator>(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator>=(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
-
- /* If these operators are used with floats, we rely on type promotion to
- * double. */
- template<typename float_t> UHD_INLINE
- bool operator==(fp_compare_delta<float_t> lhs, double rhs);
- template<typename float_t> UHD_INLINE
- bool operator!=(fp_compare_delta<float_t> lhs, double rhs);
- template<typename float_t> UHD_INLINE
- bool operator<(fp_compare_delta<float_t> lhs, double rhs);
- template<typename float_t> UHD_INLINE
- bool operator<=(fp_compare_delta<float_t> lhs, double rhs);
- template<typename float_t> UHD_INLINE
- bool operator>(fp_compare_delta<float_t> lhs, double rhs);
- template<typename float_t> UHD_INLINE
- bool operator>=(fp_compare_delta<float_t> lhs, double rhs);
-
- template<typename float_t> UHD_INLINE
- bool operator==(double lhs, fp_compare_delta<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator!=(double lhs, fp_compare_delta<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator<(double lhs, fp_compare_delta<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator<=(double lhs, fp_compare_delta<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator>(double lhs, fp_compare_delta<float_t> rhs);
- template<typename float_t> UHD_INLINE
- bool operator>=(double lhs, fp_compare_delta<float_t> rhs);
+ * Class for floating-point comparisons using a delta.
+ *
+ * At construction, you can specify the delta to use for the comparisons.
+ * This class, combined with the operators under it, allow for
+ * delta-comparisons of floats. An example is:
+ *
+ * // Compare floats 'x' and 'y'.
+ * bool x_equals_y = (fp_compare_delta<float>(x) == y);
+ *
+ * // Compare doubles 'x' and 'y'.
+ * bool x_equals_y = (fp_compare_delta<double>(x) == y);
+ */
+template <typename float_t> class fp_compare_delta
+{
+public:
+ UHD_INLINE fp_compare_delta(float_t value);
+ UHD_INLINE fp_compare_delta(float_t value, float_t delta);
+ UHD_INLINE fp_compare_delta(const fp_compare_delta<float_t>& copy);
+ UHD_INLINE ~fp_compare_delta();
+ UHD_INLINE void operator=(const fp_compare_delta& copy);
+
+ float_t _value;
+ float_t _delta;
+};
+
+template <typename float_t>
+UHD_INLINE bool operator==(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator!=(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator<(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator<=(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator>(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator>=(fp_compare_delta<float_t> lhs, fp_compare_delta<float_t> rhs);
+
+/* If these operators are used with floats, we rely on type promotion to
+ * double. */
+template <typename float_t>
+UHD_INLINE bool operator==(fp_compare_delta<float_t> lhs, double rhs);
+template <typename float_t>
+UHD_INLINE bool operator!=(fp_compare_delta<float_t> lhs, double rhs);
+template <typename float_t>
+UHD_INLINE bool operator<(fp_compare_delta<float_t> lhs, double rhs);
+template <typename float_t>
+UHD_INLINE bool operator<=(fp_compare_delta<float_t> lhs, double rhs);
+template <typename float_t>
+UHD_INLINE bool operator>(fp_compare_delta<float_t> lhs, double rhs);
+template <typename float_t>
+UHD_INLINE bool operator>=(fp_compare_delta<float_t> lhs, double rhs);
+
+template <typename float_t>
+UHD_INLINE bool operator==(double lhs, fp_compare_delta<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator!=(double lhs, fp_compare_delta<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator<(double lhs, fp_compare_delta<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator<=(double lhs, fp_compare_delta<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator>(double lhs, fp_compare_delta<float_t> rhs);
+template <typename float_t>
+UHD_INLINE bool operator>=(double lhs, fp_compare_delta<float_t> rhs);
} // namespace fp_compare
- UHD_INLINE bool frequencies_are_equal(double lhs, double rhs) {
- return(fp_compare::fp_compare_delta<double>(lhs, FREQ_COMPARISON_DELTA_HZ)
- == fp_compare::fp_compare_delta<double>(rhs, FREQ_COMPARISON_DELTA_HZ));
- }
+UHD_INLINE bool frequencies_are_equal(double lhs, double rhs)
+{
+ return (fp_compare::fp_compare_delta<double>(lhs, FREQ_COMPARISON_DELTA_HZ)
+ == fp_compare::fp_compare_delta<double>(rhs, FREQ_COMPARISON_DELTA_HZ));
+}
- //! Portable log2()
- template <typename float_t> UHD_INLINE
- float_t log2(float_t x)
- {
- // C++11 defines std::log2(), when that's universally supported
- // we can switch over.
- return std::log(x) / std::log(float_t(2));
- }
+//! Portable log2()
+template <typename float_t> UHD_INLINE float_t log2(float_t x)
+{
+ // C++11 defines std::log2(), when that's universally supported
+ // we can switch over.
+ return std::log(x) / std::log(float_t(2));
+}
} // namespace math
} // namespace uhd
-#include <uhd/utils/fp_compare_epsilon.ipp>
#include <uhd/utils/fp_compare_delta.ipp>
+#include <uhd/utils/fp_compare_epsilon.ipp>
#endif /* INCLUDED_UHD_UTILS_MATH_HPP */
diff --git a/host/include/uhd/utils/msg_task.hpp b/host/include/uhd/utils/msg_task.hpp
index 18490c363..f19f8010d 100644
--- a/host/include/uhd/utils/msg_task.hpp
+++ b/host/include/uhd/utils/msg_task.hpp
@@ -10,58 +10,59 @@
#include <uhd/config.hpp>
#include <uhd/transport/zero_copy.hpp>
-#include <boost/shared_ptr.hpp>
+#include <stdint.h>
#include <boost/function.hpp>
-#include <boost/utility.hpp>
#include <boost/optional/optional.hpp>
-#include <stdint.h>
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
#include <vector>
-namespace uhd{
- class UHD_API msg_task : boost::noncopyable{
- public:
- typedef boost::shared_ptr<msg_task> sptr;
- typedef std::vector<uint8_t> msg_payload_t;
- typedef std::pair<uint32_t, msg_payload_t > msg_type_t;
- typedef boost::function<boost::optional<msg_type_t>(void)> task_fcn_type;
+namespace uhd {
+class UHD_API msg_task : boost::noncopyable
+{
+public:
+ typedef boost::shared_ptr<msg_task> sptr;
+ typedef std::vector<uint8_t> msg_payload_t;
+ typedef std::pair<uint32_t, msg_payload_t> msg_type_t;
+ typedef boost::function<boost::optional<msg_type_t>(void)> task_fcn_type;
- /*
- * During shutdown message queues for radio control cores might not be available anymore.
- * Such stranded messages get pushed into a dump queue.
- * With this function radio_ctrl_core can check if one of the messages meant for it got stranded.
- */
- virtual msg_payload_t get_msg_from_dump_queue(uint32_t sid) = 0;
+ /*
+ * During shutdown message queues for radio control cores might not be available
+ * anymore. Such stranded messages get pushed into a dump queue. With this function
+ * radio_ctrl_core can check if one of the messages meant for it got stranded.
+ */
+ virtual msg_payload_t get_msg_from_dump_queue(uint32_t sid) = 0;
- UHD_INLINE static std::vector<uint8_t> buff_to_vector(uint8_t* p, size_t n) {
- if(p and n > 0){
- std::vector<uint8_t> v(n);
- memcpy(&v.front(), p, n);
- return v;
- }
- return std::vector<uint8_t>();
- }
+ UHD_INLINE static std::vector<uint8_t> buff_to_vector(uint8_t* p, size_t n)
+ {
+ if (p and n > 0) {
+ std::vector<uint8_t> v(n);
+ memcpy(&v.front(), p, n);
+ return v;
+ }
+ return std::vector<uint8_t>();
+ }
- virtual ~msg_task(void) = 0;
+ virtual ~msg_task(void) = 0;
- /*!
- * Create a new task object with function callback.
- * The task function callback will be run in a loop.
- * until the thread is interrupted by the deconstructor.
- *
- * A function may return payload which is then pushed to
- * a synchronized message queue.
- *
- * A task should return in a reasonable amount of time
- * or may block forever under the following conditions:
- * - The blocking call is interruptible.
- * - The task polls the interrupt condition.
- *
- * \param task_fcn the task callback function
- * \return a new task object
- */
- static sptr make(const task_fcn_type &task_fcn);
- };
-} //namespace uhd
+ /*!
+ * Create a new task object with function callback.
+ * The task function callback will be run in a loop.
+ * until the thread is interrupted by the deconstructor.
+ *
+ * A function may return payload which is then pushed to
+ * a synchronized message queue.
+ *
+ * A task should return in a reasonable amount of time
+ * or may block forever under the following conditions:
+ * - The blocking call is interruptible.
+ * - The task polls the interrupt condition.
+ *
+ * \param task_fcn the task callback function
+ * \return a new task object
+ */
+ static sptr make(const task_fcn_type& task_fcn);
+};
+} // namespace uhd
#endif /* INCLUDED_UHD_UTILS_MSG_TASK_HPP */
-
diff --git a/host/include/uhd/utils/paths.hpp b/host/include/uhd/utils/paths.hpp
index 341e0fa6c..035a4943d 100644
--- a/host/include/uhd/utils/paths.hpp
+++ b/host/include/uhd/utils/paths.hpp
@@ -9,9 +9,7 @@
#define INCLUDED_UHD_UTILS_PATHS_HPP
#include <uhd/config.hpp>
-
#include <boost/filesystem.hpp>
-
#include <string>
#include <vector>
@@ -19,65 +17,67 @@ namespace fs = boost::filesystem;
namespace uhd {
- //! Get a string representing the system's temporary directory
- UHD_API std::string get_tmp_path(void);
+//! Get a string representing the system's temporary directory
+UHD_API std::string get_tmp_path(void);
- //! Get a string representing the system's appdata directory
- UHD_API std::string get_app_path(void);
+//! Get a string representing the system's appdata directory
+UHD_API std::string get_app_path(void);
- //! Get a string representing the system's pkg directory
- UHD_API std::string get_pkg_path(void);
+//! Get a string representing the system's pkg directory
+UHD_API std::string get_pkg_path(void);
- //! Get UHD library paths
- UHD_API std::vector<fs::path> get_module_paths(void);
+//! Get UHD library paths
+UHD_API std::vector<fs::path> get_module_paths(void);
- /*! Return the UHD images directory path.
- *
- * This function returns the UHD images installation path on this system. The
- * returned directory path is guaranteed to exist (assuming a valid path is
- * found). This function will look for a directory that exists using this
- * order of precedence:
- *
- * 1) `UHD_IMAGES_DIR` environment variable
- * 2) Any paths passed to this function via `search_paths'
- * 3) UHD package path / share / uhd / images
- *
- * The `search_paths` parameter may contain Windows registry keys. If no
- * directory is found, an empty string is returned.
- *
- * \param search_paths A comma-separated list of hints for paths to include.
- * \returns A path string if one is found, or an empty string on failure.
- */
- UHD_API std::string get_images_dir(const std::string &search_paths);
+/*! Return the UHD images directory path.
+ *
+ * This function returns the UHD images installation path on this system. The
+ * returned directory path is guaranteed to exist (assuming a valid path is
+ * found). This function will look for a directory that exists using this
+ * order of precedence:
+ *
+ * 1) `UHD_IMAGES_DIR` environment variable
+ * 2) Any paths passed to this function via `search_paths'
+ * 3) UHD package path / share / uhd / images
+ *
+ * The `search_paths` parameter may contain Windows registry keys. If no
+ * directory is found, an empty string is returned.
+ *
+ * \param search_paths A comma-separated list of hints for paths to include.
+ * \returns A path string if one is found, or an empty string on failure.
+ */
+UHD_API std::string get_images_dir(const std::string& search_paths);
- /*! Return the full path to particular UHD binary image.
- *
- * This function searches for the passed image name, and returns an absolute
- * path to it. The returned path is guaranteed to exist. The caller can also
- * provide a full path to the image in the argument, and this function will
- * validate it and convert it to an absolute system path.
- *
- * \param image_name The name of the file to search for, or the full path.
- * \param search_paths Hints / paths to use when calling `get_images_dir`
- * \return the full system path to the file
- * \throw exception uhd::io_error if the file was not found.
- */
- UHD_API std::string find_image_path(const std::string &image_name, const std::string &search_paths = "");
+/*! Return the full path to particular UHD binary image.
+ *
+ * This function searches for the passed image name, and returns an absolute
+ * path to it. The returned path is guaranteed to exist. The caller can also
+ * provide a full path to the image in the argument, and this function will
+ * validate it and convert it to an absolute system path.
+ *
+ * \param image_name The name of the file to search for, or the full path.
+ * \param search_paths Hints / paths to use when calling `get_images_dir`
+ * \return the full system path to the file
+ * \throw exception uhd::io_error if the file was not found.
+ */
+UHD_API std::string find_image_path(
+ const std::string& image_name, const std::string& search_paths = "");
- /*!
- * Search for the location of a particular UHD utility.
- * The utility must be installed in the `uhd/utils` directory.
- * \param name the name of the utility to search for
- * \return the full system path to the given utility
- */
- UHD_API std::string find_utility(const std::string &name);
+/*!
+ * Search for the location of a particular UHD utility.
+ * The utility must be installed in the `uhd/utils` directory.
+ * \param name the name of the utility to search for
+ * \return the full system path to the given utility
+ */
+UHD_API std::string find_utility(const std::string& name);
- /*!
- * Return an error string recommending the user run the utility.
- * The error string will include the full path to the utility to run.
- * \return the message suggesting the use of the named utility.
- */
- UHD_API std::string print_utility_error(const std::string &name, const std::string &args = "");
-} //namespace uhd
+/*!
+ * Return an error string recommending the user run the utility.
+ * The error string will include the full path to the utility to run.
+ * \return the message suggesting the use of the named utility.
+ */
+UHD_API std::string print_utility_error(
+ const std::string& name, const std::string& args = "");
+} // namespace uhd
#endif /* INCLUDED_UHD_UTILS_PATHS_HPP */
diff --git a/host/include/uhd/utils/pimpl.hpp b/host/include/uhd/utils/pimpl.hpp
index e536c3d0d..a19f4ddc2 100644
--- a/host/include/uhd/utils/pimpl.hpp
+++ b/host/include/uhd/utils/pimpl.hpp
@@ -30,7 +30,8 @@
* \param _name the name of the pimpl class
*/
#define UHD_PIMPL_DECL(_name) \
- struct _name; boost::shared_ptr<_name>
+ struct _name; \
+ boost::shared_ptr<_name>
/*!
* Make an instance of a pimpl in a source file.
@@ -39,7 +40,6 @@
* \param _name the name of the pimpl class
* \param _args the constructor args for the pimpl
*/
-#define UHD_PIMPL_MAKE(_name, _args) \
- boost::shared_ptr<_name>(new _name _args)
+#define UHD_PIMPL_MAKE(_name, _args) boost::shared_ptr<_name>(new _name _args)
#endif /* INCLUDED_UHD_UTILS_PIMPL_HPP */
diff --git a/host/include/uhd/utils/platform.hpp b/host/include/uhd/utils/platform.hpp
index bd5d19264..1d8d58b26 100644
--- a/host/include/uhd/utils/platform.hpp
+++ b/host/include/uhd/utils/platform.hpp
@@ -12,15 +12,15 @@
namespace uhd {
- /* Returns the process ID of the current process */
- int32_t get_process_id();
+/* Returns the process ID of the current process */
+int32_t get_process_id();
- /* Returns a unique identifier for the current machine */
- uint32_t get_host_id();
+/* Returns a unique identifier for the current machine */
+uint32_t get_host_id();
- /* Get a unique identifier for the current machine and process */
- uint32_t get_process_hash();
+/* Get a unique identifier for the current machine and process */
+uint32_t get_process_hash();
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_UTILS_PLATFORM_HPP */
diff --git a/host/include/uhd/utils/safe_call.hpp b/host/include/uhd/utils/safe_call.hpp
index e37014b71..2688c5d68 100644
--- a/host/include/uhd/utils/safe_call.hpp
+++ b/host/include/uhd/utils/safe_call.hpp
@@ -13,9 +13,9 @@
#include <uhd/utils/log.hpp>
//! helper macro for safe call to produce warnings
-#define _UHD_SAFE_CALL_WARNING(code, what) UHD_LOGGER_ERROR("UHD") << \
- UHD_THROW_SITE_INFO("Exception caught in safe-call.") + #code + " -> " + what \
-;
+#define _UHD_SAFE_CALL_WARNING(code, what) \
+ UHD_LOGGER_ERROR("UHD") << UHD_THROW_SITE_INFO("Exception caught in safe-call.") \
+ + #code + " -> " + what;
/*!
* A safe-call catches all exceptions thrown by code,
@@ -23,12 +23,12 @@
* Usage: UHD_SAFE_CALL(some_code_to_call();)
* \param code the block of code to call safely
*/
-#define UHD_SAFE_CALL(code) \
- try{code} \
- catch(const std::exception &e){ \
- _UHD_SAFE_CALL_WARNING(code, e.what()); \
- } \
- catch(...){ \
+#define UHD_SAFE_CALL(code) \
+ try { \
+ code \
+ } catch (const std::exception& e) { \
+ _UHD_SAFE_CALL_WARNING(code, e.what()); \
+ } catch (...) { \
_UHD_SAFE_CALL_WARNING(code, "unknown exception"); \
}
diff --git a/host/include/uhd/utils/safe_main.hpp b/host/include/uhd/utils/safe_main.hpp
index 8261ad7d2..ca00a97dd 100644
--- a/host/include/uhd/utils/safe_main.hpp
+++ b/host/include/uhd/utils/safe_main.hpp
@@ -19,16 +19,19 @@
* \param _argc the declaration for argc
* \param _argv the declaration for argv
*/
-#define UHD_SAFE_MAIN(_argc, _argv) _main(int, char*[]); \
-int main(int argc, char *argv[]){ \
- try { \
- return _main(argc, argv); \
- } catch(const std::exception &e) { \
- std::cerr << "Error: " << e.what() << std::endl; \
- } catch(...) { \
- std::cerr << "Error: unknown exception" << std::endl; \
- } \
- return ~0; \
-} int _main(_argc, _argv)
+#define UHD_SAFE_MAIN(_argc, _argv) \
+ _main(int, char* []); \
+ int main(int argc, char* argv[]) \
+ { \
+ try { \
+ return _main(argc, argv); \
+ } catch (const std::exception& e) { \
+ std::cerr << "Error: " << e.what() << std::endl; \
+ } catch (...) { \
+ std::cerr << "Error: unknown exception" << std::endl; \
+ } \
+ return ~0; \
+ } \
+ int _main(_argc, _argv)
#endif /* INCLUDED_UHD_UTILS_SAFE_MAIN_HPP */
diff --git a/host/include/uhd/utils/soft_register.hpp b/host/include/uhd/utils/soft_register.hpp
index fea4c0791..5a1d175e0 100644
--- a/host/include/uhd/utils/soft_register.hpp
+++ b/host/include/uhd/utils/soft_register.hpp
@@ -8,16 +8,16 @@
#ifndef INCLUDED_UHD_UTILS_SOFT_REGISTER_HPP
#define INCLUDED_UHD_UTILS_SOFT_REGISTER_HPP
-#include <stdint.h>
-#include <boost/noncopyable.hpp>
-#include <uhd/types/wb_iface.hpp>
#include <uhd/exception.hpp>
+#include <uhd/types/wb_iface.hpp>
#include <uhd/utils/dirty_tracked.hpp>
-#include <boost/thread/mutex.hpp>
+#include <stdint.h>
+#include <boost/foreach.hpp>
+#include <boost/noncopyable.hpp>
#include <boost/thread/locks.hpp>
-#include <boost/unordered_map.hpp>
+#include <boost/thread/mutex.hpp>
#include <boost/tokenizer.hpp>
-#include <boost/foreach.hpp>
+#include <boost/unordered_map.hpp>
#include <list>
/*! \file soft_register.hpp
@@ -43,7 +43,7 @@
namespace uhd {
-//TODO: These hints were added to boost 1.53.
+// TODO: These hints were added to boost 1.53.
/** \brief hint for the branch prediction */
UHD_INLINE bool likely(bool expr)
@@ -53,7 +53,7 @@ UHD_INLINE bool likely(bool expr)
#else
return expr;
#endif
- }
+}
/** \brief hint for the branch prediction */
UHD_INLINE bool unlikely(bool expr)
@@ -75,45 +75,49 @@ UHD_INLINE bool unlikely(bool expr)
typedef uint32_t soft_reg_field_t;
namespace soft_reg_field {
- UHD_INLINE size_t width(const soft_reg_field_t field) {
- return (field & 0xFF);
- }
+UHD_INLINE size_t width(const soft_reg_field_t field)
+{
+ return (field & 0xFF);
+}
- UHD_INLINE size_t shift(const soft_reg_field_t field) {
- return ((field >> 8) & 0xFF);
- }
+UHD_INLINE size_t shift(const soft_reg_field_t field)
+{
+ return ((field >> 8) & 0xFF);
+}
- template<typename data_t>
- UHD_INLINE data_t mask(const soft_reg_field_t field) {
- constexpr data_t ONE = static_cast<data_t>(1);
- constexpr data_t ALL_ONES = ~static_cast<data_t>(0);
- //Behavior for the left shift operation is undefined in C++
- //if the shift amount is >= bitwidth of the datatype
- //So we treat that as a special case with a branch predicition hint
- if (likely((sizeof(data_t)*8) != width(field))) {
- return ((ONE<<width(field))-ONE)<<shift(field);
- } else {
- return ALL_ONES<<shift(field);
- }
+template <typename data_t> UHD_INLINE data_t mask(const soft_reg_field_t field)
+{
+ constexpr data_t ONE = static_cast<data_t>(1);
+ constexpr data_t ALL_ONES = ~static_cast<data_t>(0);
+ // Behavior for the left shift operation is undefined in C++
+ // if the shift amount is >= bitwidth of the datatype
+ // So we treat that as a special case with a branch predicition hint
+ if (likely((sizeof(data_t) * 8) != width(field))) {
+ return ((ONE << width(field)) - ONE) << shift(field);
+ } else {
+ return ALL_ONES << shift(field);
}
}
+} // namespace soft_reg_field
-class soft_register_base : public boost::noncopyable {
+class soft_register_base : public boost::noncopyable
+{
public:
virtual ~soft_register_base() {}
virtual void initialize(wb_iface& iface, bool sync = false) = 0;
- virtual void flush() = 0;
- virtual void refresh() = 0;
- virtual size_t get_bitwidth() = 0;
- virtual bool is_readable() = 0;
- virtual bool is_writable() = 0;
+ virtual void flush() = 0;
+ virtual void refresh() = 0;
+ virtual size_t get_bitwidth() = 0;
+ virtual bool is_readable() = 0;
+ virtual bool is_writable() = 0;
/*!
* Cast the soft_register generic reference to a more specific type
*/
template <typename soft_reg_t>
- UHD_INLINE static soft_reg_t& cast(soft_register_base& reg) {
+ UHD_INLINE static soft_reg_t& cast(soft_register_base& reg)
+ {
soft_reg_t* ptr = dynamic_cast<soft_reg_t*>(&reg);
if (ptr) {
return *ptr;
@@ -130,33 +134,38 @@ enum soft_reg_flush_mode_t { OPTIMIZED_FLUSH, ALWAYS_FLUSH };
* Methods give convenient field-level access to soft-copy and the ability
* to do read-modify-write operations.
*/
-template<typename reg_data_t, bool readable, bool writable>
-class UHD_API soft_register_t : public soft_register_base {
+template <typename reg_data_t, bool readable, bool writable>
+class UHD_API soft_register_t : public soft_register_base
+{
public:
- typedef boost::shared_ptr< soft_register_t<reg_data_t, readable, writable> > sptr;
+ typedef boost::shared_ptr<soft_register_t<reg_data_t, readable, writable> > sptr;
- //Reserved field. Represents all bits in the register.
- UHD_DEFINE_SOFT_REG_FIELD(REGISTER, sizeof(reg_data_t)*8, 0); //[WIDTH-1:0]
+ // Reserved field. Represents all bits in the register.
+ UHD_DEFINE_SOFT_REG_FIELD(REGISTER, sizeof(reg_data_t) * 8, 0); //[WIDTH-1:0]
/*!
* Generic constructor for all soft_register types
*/
- soft_register_t(
- wb_iface::wb_addr_type wr_addr,
- wb_iface::wb_addr_type rd_addr,
- soft_reg_flush_mode_t mode = ALWAYS_FLUSH):
- _iface(NULL), _wr_addr(wr_addr), _rd_addr(rd_addr), _soft_copy(0), _flush_mode(mode)
- {}
+ soft_register_t(wb_iface::wb_addr_type wr_addr,
+ wb_iface::wb_addr_type rd_addr,
+ soft_reg_flush_mode_t mode = ALWAYS_FLUSH)
+ : _iface(NULL)
+ , _wr_addr(wr_addr)
+ , _rd_addr(rd_addr)
+ , _soft_copy(0)
+ , _flush_mode(mode)
+ {
+ }
/*!
* Constructor for read-only, write-only registers and read-write registers
* with rd_addr == wr_addr
*/
explicit soft_register_t(
- wb_iface::wb_addr_type addr,
- soft_reg_flush_mode_t mode = ALWAYS_FLUSH):
- _iface(NULL), _wr_addr(addr), _rd_addr(addr), _soft_copy(0), _flush_mode(mode)
- {}
+ wb_iface::wb_addr_type addr, soft_reg_flush_mode_t mode = ALWAYS_FLUSH)
+ : _iface(NULL), _wr_addr(addr), _rd_addr(addr), _soft_copy(0), _flush_mode(mode)
+ {
+ }
/*!
* Initialize the register when the underlying bus is usable.
@@ -167,9 +176,11 @@ public:
{
_iface = &iface;
- //Synchronize with hardware. For RW register, flush THEN refresh.
- if (sync && writable) flush();
- if (sync && readable) refresh();
+ // Synchronize with hardware. For RW register, flush THEN refresh.
+ if (sync && writable)
+ flush();
+ if (sync && readable)
+ refresh();
}
/*!
@@ -179,8 +190,9 @@ public:
*/
UHD_INLINE void set(const soft_reg_field_t field, const reg_data_t value)
{
- _soft_copy = (_soft_copy & ~soft_reg_field::mask<reg_data_t>(field)) |
- ((value << soft_reg_field::shift(field)) & soft_reg_field::mask<reg_data_t>(field));
+ _soft_copy = (_soft_copy & ~soft_reg_field::mask<reg_data_t>(field))
+ | ((value << soft_reg_field::shift(field))
+ & soft_reg_field::mask<reg_data_t>(field));
}
/*!
@@ -189,7 +201,8 @@ public:
*/
UHD_INLINE reg_data_t get(const soft_reg_field_t field)
{
- return (_soft_copy & soft_reg_field::mask<reg_data_t>(field)) >> soft_reg_field::shift(field);
+ return (_soft_copy & soft_reg_field::mask<reg_data_t>(field))
+ >> soft_reg_field::shift(field);
}
/*!
@@ -198,9 +211,9 @@ public:
UHD_INLINE void flush()
{
if (writable && _iface) {
- //If optimized flush then poke only if soft copy is dirty
- //If flush mode is ALWAYS, the dirty flag should get optimized
- //out by the compiler because it is never read
+ // If optimized flush then poke only if soft copy is dirty
+ // If flush mode is ALWAYS, the dirty flag should get optimized
+ // out by the compiler because it is never read
if (_flush_mode == ALWAYS_FLUSH || _soft_copy.is_dirty()) {
if (get_bitwidth() <= 16) {
_iface->poke16(_wr_addr, static_cast<uint16_t>(_soft_copy));
@@ -209,12 +222,14 @@ public:
} else if (get_bitwidth() <= 64) {
_iface->poke64(_wr_addr, static_cast<uint64_t>(_soft_copy));
} else {
- throw uhd::not_implemented_error("soft_register only supports up to 64 bits.");
+ throw uhd::not_implemented_error(
+ "soft_register only supports up to 64 bits.");
}
_soft_copy.mark_clean();
}
} else {
- throw uhd::not_implemented_error("soft_register is not writable or uninitialized.");
+ throw uhd::not_implemented_error(
+ "soft_register is not writable or uninitialized.");
}
}
@@ -231,11 +246,13 @@ public:
} else if (get_bitwidth() <= 64) {
_soft_copy = static_cast<reg_data_t>(_iface->peek64(_rd_addr));
} else {
- throw uhd::not_implemented_error("soft_register only supports up to 64 bits.");
+ throw uhd::not_implemented_error(
+ "soft_register only supports up to 64 bits.");
}
_soft_copy.mark_clean();
} else {
- throw uhd::not_implemented_error("soft_register is not readable or uninitialized.");
+ throw uhd::not_implemented_error(
+ "soft_register is not readable or uninitialized.");
}
}
@@ -283,34 +300,37 @@ public:
}
private:
- wb_iface* _iface;
- const wb_iface::wb_addr_type _wr_addr;
- const wb_iface::wb_addr_type _rd_addr;
- dirty_tracked<reg_data_t> _soft_copy;
- const soft_reg_flush_mode_t _flush_mode;
+ wb_iface* _iface;
+ const wb_iface::wb_addr_type _wr_addr;
+ const wb_iface::wb_addr_type _rd_addr;
+ dirty_tracked<reg_data_t> _soft_copy;
+ const soft_reg_flush_mode_t _flush_mode;
};
/*!
* A synchronized soft register object.
* All operations in the synchronized register are serialized.
*/
-template<typename reg_data_t, bool readable, bool writable>
-class UHD_API soft_register_sync_t : public soft_register_t<reg_data_t, readable, writable> {
+template <typename reg_data_t, bool readable, bool writable>
+class UHD_API soft_register_sync_t
+ : public soft_register_t<reg_data_t, readable, writable>
+{
public:
- typedef boost::shared_ptr< soft_register_sync_t<reg_data_t, readable, writable> > sptr;
+ typedef boost::shared_ptr<soft_register_sync_t<reg_data_t, readable, writable> > sptr;
- soft_register_sync_t(
- wb_iface::wb_addr_type wr_addr,
- wb_iface::wb_addr_type rd_addr,
- soft_reg_flush_mode_t mode = ALWAYS_FLUSH):
- soft_register_t<reg_data_t, readable, writable>(wr_addr, rd_addr, mode), _mutex()
- {}
+ soft_register_sync_t(wb_iface::wb_addr_type wr_addr,
+ wb_iface::wb_addr_type rd_addr,
+ soft_reg_flush_mode_t mode = ALWAYS_FLUSH)
+ : soft_register_t<reg_data_t, readable, writable>(wr_addr, rd_addr, mode)
+ , _mutex()
+ {
+ }
explicit soft_register_sync_t(
- wb_iface::wb_addr_type addr,
- soft_reg_flush_mode_t mode = ALWAYS_FLUSH):
- soft_register_t<reg_data_t, readable, writable>(addr, mode), _mutex()
- {}
+ wb_iface::wb_addr_type addr, soft_reg_flush_mode_t mode = ALWAYS_FLUSH)
+ : soft_register_t<reg_data_t, readable, writable>(addr, mode), _mutex()
+ {
+ }
UHD_INLINE void initialize(wb_iface& iface, bool sync = false)
{
@@ -370,27 +390,27 @@ private:
*
*/
-//16-bit shortcuts
-typedef soft_register_t<uint16_t, false, true> soft_reg16_wo_t;
-typedef soft_register_t<uint16_t, true, false> soft_reg16_ro_t;
-typedef soft_register_t<uint16_t, true, true> soft_reg16_rw_t;
-typedef soft_register_sync_t<uint16_t, false, true> soft_reg16_wo_sync_t;
-typedef soft_register_sync_t<uint16_t, true, false> soft_reg16_ro_sync_t;
-typedef soft_register_sync_t<uint16_t, true, true> soft_reg16_rw_sync_t;
-//32-bit shortcuts
-typedef soft_register_t<uint32_t, false, true> soft_reg32_wo_t;
-typedef soft_register_t<uint32_t, true, false> soft_reg32_ro_t;
-typedef soft_register_t<uint32_t, true, true> soft_reg32_rw_t;
-typedef soft_register_sync_t<uint32_t, false, true> soft_reg32_wo_sync_t;
-typedef soft_register_sync_t<uint32_t, true, false> soft_reg32_ro_sync_t;
-typedef soft_register_sync_t<uint32_t, true, true> soft_reg32_rw_sync_t;
-//64-bit shortcuts
-typedef soft_register_t<uint64_t, false, true> soft_reg64_wo_t;
-typedef soft_register_t<uint64_t, true, false> soft_reg64_ro_t;
-typedef soft_register_t<uint64_t, true, true> soft_reg64_rw_t;
-typedef soft_register_sync_t<uint64_t, false, true> soft_reg64_wo_sync_t;
-typedef soft_register_sync_t<uint64_t, true, false> soft_reg64_ro_sync_t;
-typedef soft_register_sync_t<uint64_t, true, true> soft_reg64_rw_sync_t;
+// 16-bit shortcuts
+typedef soft_register_t<uint16_t, false, true> soft_reg16_wo_t;
+typedef soft_register_t<uint16_t, true, false> soft_reg16_ro_t;
+typedef soft_register_t<uint16_t, true, true> soft_reg16_rw_t;
+typedef soft_register_sync_t<uint16_t, false, true> soft_reg16_wo_sync_t;
+typedef soft_register_sync_t<uint16_t, true, false> soft_reg16_ro_sync_t;
+typedef soft_register_sync_t<uint16_t, true, true> soft_reg16_rw_sync_t;
+// 32-bit shortcuts
+typedef soft_register_t<uint32_t, false, true> soft_reg32_wo_t;
+typedef soft_register_t<uint32_t, true, false> soft_reg32_ro_t;
+typedef soft_register_t<uint32_t, true, true> soft_reg32_rw_t;
+typedef soft_register_sync_t<uint32_t, false, true> soft_reg32_wo_sync_t;
+typedef soft_register_sync_t<uint32_t, true, false> soft_reg32_ro_sync_t;
+typedef soft_register_sync_t<uint32_t, true, true> soft_reg32_rw_sync_t;
+// 64-bit shortcuts
+typedef soft_register_t<uint64_t, false, true> soft_reg64_wo_t;
+typedef soft_register_t<uint64_t, true, false> soft_reg64_ro_t;
+typedef soft_register_t<uint64_t, true, true> soft_reg64_rw_t;
+typedef soft_register_sync_t<uint64_t, false, true> soft_reg64_wo_sync_t;
+typedef soft_register_sync_t<uint64_t, true, false> soft_reg64_ro_sync_t;
+typedef soft_register_sync_t<uint64_t, true, true> soft_reg64_rw_sync_t;
/*
@@ -424,7 +444,7 @@ typedef soft_register_sync_t<uint64_t, true, true> soft_reg64_rw_sync_t;
reg_obj->write(example_reg_t::FIELD2, 0x1234);
}
*/
-}
+} // namespace uhd
//==================================================================
// Soft Register Map and Database Definition
@@ -432,14 +452,15 @@ typedef soft_register_sync_t<uint64_t, true, true> soft_reg64_rw_sync_t;
namespace uhd {
-class UHD_API soft_regmap_accessor_t {
+class UHD_API soft_regmap_accessor_t
+{
public:
typedef boost::shared_ptr<soft_regmap_accessor_t> sptr;
- virtual ~soft_regmap_accessor_t() {};
+ virtual ~soft_regmap_accessor_t(){};
virtual soft_register_base& lookup(const std::string& path) const = 0;
- virtual std::vector<std::string> enumerate() const = 0;
- virtual const std::string& get_name() const = 0;
+ virtual std::vector<std::string> enumerate() const = 0;
+ virtual const std::string& get_name() const = 0;
};
/*!
@@ -452,15 +473,19 @@ public:
* Methods give convenient field-level access to soft-copy and the ability
* to do read-modify-write operations.
*/
-class UHD_API soft_regmap_t : public soft_regmap_accessor_t, public boost::noncopyable {
+class UHD_API soft_regmap_t : public soft_regmap_accessor_t, public boost::noncopyable
+{
public:
soft_regmap_t(const std::string& name) : _name(name) {}
- virtual ~soft_regmap_t() {};
+ virtual ~soft_regmap_t(){};
/*!
* Get the name of this register map
*/
- virtual UHD_INLINE const std::string& get_name() const { return _name; }
+ virtual UHD_INLINE const std::string& get_name() const
+ {
+ return _name;
+ }
/*!
* Initialize all registers in this register map using a bus.
@@ -468,9 +493,10 @@ public:
* The order of initialization is the same as the order in
* which registers were added to the map.
*/
- void initialize(wb_iface& iface, bool sync = false) {
+ void initialize(wb_iface& iface, bool sync = false)
+ {
boost::lock_guard<boost::mutex> lock(_mutex);
- BOOST_FOREACH(soft_register_base* reg, _reglist) {
+ BOOST_FOREACH (soft_register_base* reg, _reglist) {
reg->initialize(iface, sync);
}
}
@@ -480,9 +506,10 @@ public:
* The order of writing is the same as the order in
* which registers were added to the map.
*/
- void flush() {
+ void flush()
+ {
boost::lock_guard<boost::mutex> lock(_mutex);
- BOOST_FOREACH(soft_register_base* reg, _reglist) {
+ BOOST_FOREACH (soft_register_base* reg, _reglist) {
reg->flush();
}
}
@@ -492,9 +519,10 @@ public:
* The order of reading is the same as the order in
* which registers were added to the map.
*/
- void refresh() {
+ void refresh()
+ {
boost::lock_guard<boost::mutex> lock(_mutex);
- BOOST_FOREACH(soft_register_base* reg, _reglist) {
+ BOOST_FOREACH (soft_register_base* reg, _reglist) {
reg->refresh();
}
}
@@ -503,7 +531,8 @@ public:
* Lookup a register object by name.
* If a register with "name" is not found, runtime_error is thrown
*/
- virtual soft_register_base& lookup(const std::string& name) const {
+ virtual soft_register_base& lookup(const std::string& name) const
+ {
regmap_t::const_iterator iter = _regmap.find(name);
if (iter != _regmap.end()) {
return *(iter->second);
@@ -516,9 +545,10 @@ public:
* Enumerate all the registers in this map.
* Return fully qualified paths.
*/
- virtual std::vector<std::string> enumerate() const {
+ virtual std::vector<std::string> enumerate() const
+ {
std::vector<std::string> temp;
- BOOST_FOREACH(const regmap_t::value_type& reg, _regmap) {
+ BOOST_FOREACH (const regmap_t::value_type& reg, _regmap) {
temp.push_back(_name + "/" + reg.first);
}
return temp;
@@ -526,19 +556,23 @@ public:
protected:
enum visibility_t {
- PUBLIC, //Is accessible through the soft_regmap_accessor_t interface
- PRIVATE //Is NOT accessible through the soft_regmap_accessor_t interface
+ PUBLIC, // Is accessible through the soft_regmap_accessor_t interface
+ PRIVATE // Is NOT accessible through the soft_regmap_accessor_t interface
};
/*!
* Add a register to this map with an identifier "name" and visibility
*/
- UHD_INLINE void add_to_map(soft_register_base& reg, const std::string& name, const visibility_t visible = PRIVATE) {
+ UHD_INLINE void add_to_map(soft_register_base& reg,
+ const std::string& name,
+ const visibility_t visible = PRIVATE)
+ {
boost::lock_guard<boost::mutex> lock(_mutex);
if (visible == PUBLIC) {
- //Only add to the map if this register is publicly visible
+ // Only add to the map if this register is publicly visible
if (not _regmap.insert(regmap_t::value_type(name, &reg)).second) {
- throw uhd::assertion_error("cannot add two registers with the same name to regmap: " + name);
+ throw uhd::assertion_error(
+ "cannot add two registers with the same name to regmap: " + name);
}
}
_reglist.push_back(&reg);
@@ -546,12 +580,12 @@ protected:
private:
typedef boost::unordered_map<std::string, soft_register_base*> regmap_t;
- typedef std::list<soft_register_base*> reglist_t;
+ typedef std::list<soft_register_base*> reglist_t;
- const std::string _name;
- regmap_t _regmap; //For lookups
- reglist_t _reglist; //To maintain order
- boost::mutex _mutex;
+ const std::string _name;
+ regmap_t _regmap; // For lookups
+ reglist_t _reglist; // To maintain order
+ boost::mutex _mutex;
};
@@ -561,7 +595,8 @@ private:
* fashion.
* A regmap_db *does not* manage storage for regmaps. It is simply a wrapper.
*/
-class UHD_API soft_regmap_db_t : public soft_regmap_accessor_t, public boost::noncopyable {
+class UHD_API soft_regmap_db_t : public soft_regmap_accessor_t, public boost::noncopyable
+{
public:
typedef boost::shared_ptr<soft_regmap_db_t> sptr;
@@ -578,12 +613,16 @@ public:
/*!
* Get the name of this register map
*/
- const std::string& get_name() const { return _name; }
+ const std::string& get_name() const
+ {
+ return _name;
+ }
/*!
* Add a regmap to this map with an identifier "name" and visibility
*/
- void add(soft_regmap_t& regmap) {
+ void add(soft_regmap_t& regmap)
+ {
boost::lock_guard<boost::mutex> lock(_mutex);
_regmaps.push_back(&regmap);
}
@@ -591,7 +630,8 @@ public:
/*!
* Add a level of regmap_db to this map with an identifier "name" and visibility
*/
- void add(soft_regmap_db_t& db) {
+ void add(soft_regmap_db_t& db)
+ {
boost::lock_guard<boost::mutex> lock(_mutex);
if (&db == this) {
throw uhd::assertion_error("cannot add regmap db to itself" + _name);
@@ -612,32 +652,33 @@ public:
*/
soft_register_base& lookup(const std::string& path) const
{
- //Turn the slash separated path string into tokens
+ // Turn the slash separated path string into tokens
std::list<std::string> tokens;
- BOOST_FOREACH(
- const std::string& node,
- boost::tokenizer< boost::char_separator<char> >(path, boost::char_separator<char>("/")))
- {
+ BOOST_FOREACH (const std::string& node,
+ boost::tokenizer<boost::char_separator<char> >(
+ path, boost::char_separator<char>("/"))) {
tokens.push_back(node);
}
- if ((tokens.size() > 2 && tokens.front() == _name) || //If this is a nested DB
- (tokens.size() > 1 && _name == "")) { //If this is a top-level DB
- if (_name != "") tokens.pop_front();
- if (tokens.size() == 2) { //2 tokens => regmap/register path
- BOOST_FOREACH(const soft_regmap_accessor_t* regmap, _regmaps) {
+ if ((tokens.size() > 2 && tokens.front() == _name) || // If this is a nested DB
+ (tokens.size() > 1 && _name == "")) { // If this is a top-level DB
+ if (_name != "")
+ tokens.pop_front();
+ if (tokens.size() == 2) { // 2 tokens => regmap/register path
+ BOOST_FOREACH (const soft_regmap_accessor_t* regmap, _regmaps) {
if (regmap->get_name() == tokens.front()) {
return regmap->lookup(tokens.back());
}
}
throw uhd::runtime_error("could not find register map: " + path);
- } else if (not _regmap_dbs.empty()) { //>2 tokens => <1 or more dbs>/regmap/register
- //Reconstruct path from tokens
+ } else if (not _regmap_dbs
+ .empty()) { //>2 tokens => <1 or more dbs>/regmap/register
+ // Reconstruct path from tokens
std::string newpath;
- BOOST_FOREACH(const std::string& node, tokens) {
+ BOOST_FOREACH (const std::string& node, tokens) {
newpath += ("/" + node);
}
- //Dispatch path to hierarchical DB
- BOOST_FOREACH(const soft_regmap_accessor_t* db, _regmap_dbs) {
+ // Dispatch path to hierarchical DB
+ BOOST_FOREACH (const soft_regmap_accessor_t* db, _regmap_dbs) {
try {
return db->lookup(newpath.substr(1));
} catch (std::exception&) {
@@ -652,13 +693,14 @@ public:
/*!
* Enumerate the paths of all registers that this DB can access
*/
- virtual std::vector<std::string> enumerate() const {
+ virtual std::vector<std::string> enumerate() const
+ {
std::vector<std::string> paths;
- BOOST_FOREACH(const soft_regmap_accessor_t* regmap, _regmaps) {
+ BOOST_FOREACH (const soft_regmap_accessor_t* regmap, _regmaps) {
const std::vector<std::string>& regs = regmap->enumerate();
paths.insert(paths.end(), regs.begin(), regs.end());
}
- BOOST_FOREACH(const soft_regmap_accessor_t* db, _regmap_dbs) {
+ BOOST_FOREACH (const soft_regmap_accessor_t* db, _regmap_dbs) {
const std::vector<std::string>& regs = db->enumerate();
paths.insert(paths.end(), regs.begin(), regs.end());
}
@@ -668,12 +710,12 @@ public:
private:
typedef std::list<soft_regmap_accessor_t*> db_t;
- const std::string _name;
- db_t _regmaps;
- db_t _regmap_dbs;
- boost::mutex _mutex;
+ const std::string _name;
+ db_t _regmaps;
+ db_t _regmap_dbs;
+ boost::mutex _mutex;
};
-} //namespace uhd
+} // namespace uhd
#endif /* INCLUDED_UHD_UTILS_SOFT_REGISTER_HPP */
diff --git a/host/include/uhd/utils/static.hpp b/host/include/uhd/utils/static.hpp
index 3cde74b96..6a6f24721 100644
--- a/host/include/uhd/utils/static.hpp
+++ b/host/include/uhd/utils/static.hpp
@@ -16,21 +16,27 @@
* \param _x the name of the defined function
* \return a reference to the lazy instance
*/
-#define UHD_SINGLETON_FCN(_t, _x) static _t &_x(){static _t _x; return _x;}
+#define UHD_SINGLETON_FCN(_t, _x) \
+ static _t& _x() \
+ { \
+ static _t _x; \
+ return _x; \
+ }
/*!
* Defines a static code block that will be called before main()
* The static block will catch and print exceptions to std error.
* \param _x the unique name of the fixture (unique per source)
*/
-#define UHD_STATIC_BLOCK(_x) \
- void _x(void); \
+#define UHD_STATIC_BLOCK(_x) \
+ void _x(void); \
static _uhd_static_fixture _x##_fixture(&_x, #_x); \
void _x(void)
//! Helper for static block, constructor calls function
-struct UHD_API _uhd_static_fixture{
- _uhd_static_fixture(void (*)(void), const char *);
+struct UHD_API _uhd_static_fixture
+{
+ _uhd_static_fixture(void (*)(void), const char*);
};
#endif /* INCLUDED_UHD_UTILS_STATIC_HPP */
diff --git a/host/include/uhd/utils/tasks.hpp b/host/include/uhd/utils/tasks.hpp
index d1245616c..5131fa028 100644
--- a/host/include/uhd/utils/tasks.hpp
+++ b/host/include/uhd/utils/tasks.hpp
@@ -10,35 +10,32 @@
#define INCLUDED_UHD_UTILS_TASKS_HPP
#include <uhd/config.hpp>
-#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
+#include <boost/shared_ptr.hpp>
#include <boost/utility.hpp>
-namespace uhd{
+namespace uhd {
- class UHD_API task : boost::noncopyable{
- public:
- typedef boost::shared_ptr<task> sptr;
- typedef boost::function<void(void)> task_fcn_type;
+class UHD_API task : boost::noncopyable
+{
+public:
+ typedef boost::shared_ptr<task> sptr;
+ typedef boost::function<void(void)> task_fcn_type;
- /*!
- * Create a new task object with function callback.
- * The task function callback will be run in a loop.
- * until the thread is interrupted by the destructor.
- *
- * A task should return in a reasonable amount of time.
- * It may not block, or the destructor will also block.
- *
- * \param task_fcn the task callback function
- * \param name Task name. Will be used as a thread name.
- * \return a new task object
- */
- static sptr make(
- const task_fcn_type &task_fcn,
- const std::string &name=""
- );
- };
-} //namespace uhd
+ /*!
+ * Create a new task object with function callback.
+ * The task function callback will be run in a loop.
+ * until the thread is interrupted by the destructor.
+ *
+ * A task should return in a reasonable amount of time.
+ * It may not block, or the destructor will also block.
+ *
+ * \param task_fcn the task callback function
+ * \param name Task name. Will be used as a thread name.
+ * \return a new task object
+ */
+ static sptr make(const task_fcn_type& task_fcn, const std::string& name = "");
+};
+} // namespace uhd
#endif /* INCLUDED_UHD_UTILS_TASKS_HPP */
-
diff --git a/host/include/uhd/utils/thread.hpp b/host/include/uhd/utils/thread.hpp
index 5251d341e..c7358040e 100644
--- a/host/include/uhd/utils/thread.hpp
+++ b/host/include/uhd/utils/thread.hpp
@@ -12,49 +12,42 @@
#include <boost/thread/thread.hpp>
#include <string>
-namespace uhd{
-
- static const float default_thread_priority = float(0.5);
-
- /*!
- * Set the scheduling priority on the current thread.
- *
- * A new thread or calling process should make this call
- * with the defaults this to enable realtime scheduling.
- *
- * A priority of zero corresponds to normal priority.
- * Positive priority values are higher than normal.
- * Negative priority values are lower than normal.
- *
- * \param priority a value between -1 and 1
- * \param realtime true to use realtime mode
- * \throw exception on set priority failure
- */
- UHD_API void set_thread_priority(
- float priority = default_thread_priority,
- bool realtime = true
- );
-
- /*!
- * Set the scheduling priority on the current thread.
- * Same as set_thread_priority but does not throw on failure.
- * \return true on success, false on failure
- */
- UHD_API bool set_thread_priority_safe(
- float priority = default_thread_priority,
- bool realtime = true
- );
-
- /*!
- * Set the thread name on the given boost thread.
- * \param thread pointer to a boost thread
- * \param name thread name with maximum length of 16 characters
- */
- UHD_API void set_thread_name(
- boost::thread *thread,
- const std::string &name
- );
-
-} //namespace uhd
+namespace uhd {
+
+static const float default_thread_priority = float(0.5);
+
+/*!
+ * Set the scheduling priority on the current thread.
+ *
+ * A new thread or calling process should make this call
+ * with the defaults this to enable realtime scheduling.
+ *
+ * A priority of zero corresponds to normal priority.
+ * Positive priority values are higher than normal.
+ * Negative priority values are lower than normal.
+ *
+ * \param priority a value between -1 and 1
+ * \param realtime true to use realtime mode
+ * \throw exception on set priority failure
+ */
+UHD_API void set_thread_priority(
+ float priority = default_thread_priority, bool realtime = true);
+
+/*!
+ * Set the scheduling priority on the current thread.
+ * Same as set_thread_priority but does not throw on failure.
+ * \return true on success, false on failure
+ */
+UHD_API bool set_thread_priority_safe(
+ float priority = default_thread_priority, bool realtime = true);
+
+/*!
+ * Set the thread name on the given boost thread.
+ * \param thread pointer to a boost thread
+ * \param name thread name with maximum length of 16 characters
+ */
+UHD_API void set_thread_name(boost::thread* thread, const std::string& name);
+
+} // namespace uhd
#endif /* INCLUDED_UHD_UTILS_THREAD_HPP */
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
index 8fd82cbc8..6a14f3976 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
@@ -6,93 +6,79 @@
#include "magnesium_ad9371_iface.hpp"
#include <uhd/utils/log.hpp>
-#include <uhd/utils/log.hpp>
using namespace uhd;
namespace {
- /*! Return a valid 'which' string for use with AD9371 API calls
- *
- * These strings take the form of "RX1", "TX2", ...
- */
- std::string _get_which(
- const direction_t dir,
- const size_t chan
- ) {
- UHD_ASSERT_THROW(dir == RX_DIRECTION or dir == TX_DIRECTION);
- UHD_ASSERT_THROW(chan == 0 or chan == 1);
- return str(boost::format("%s%d")
- % (dir == RX_DIRECTION ? "RX" : "TX")
- % (chan+1)
- );
- }
+/*! Return a valid 'which' string for use with AD9371 API calls
+ *
+ * These strings take the form of "RX1", "TX2", ...
+ */
+std::string _get_which(const direction_t dir, const size_t chan)
+{
+ UHD_ASSERT_THROW(dir == RX_DIRECTION or dir == TX_DIRECTION);
+ UHD_ASSERT_THROW(chan == 0 or chan == 1);
+ return str(boost::format("%s%d") % (dir == RX_DIRECTION ? "RX" : "TX") % (chan + 1));
}
+} // namespace
/******************************************************************************
* Structors
*****************************************************************************/
magnesium_ad9371_iface::magnesium_ad9371_iface(
- uhd::rpc_client::sptr rpcc,
- const size_t slot_idx
-) : _rpcc(rpcc)
- , _slot_idx(slot_idx)
- , _rpc_prefix((slot_idx == 0) ? "db_0_" : "db_1_")
- , _log_prefix((slot_idx == 0) ? "AD9371-0" : "AD9371-1")
+ uhd::rpc_client::sptr rpcc, const size_t slot_idx)
+ : _rpcc(rpcc)
+ , _slot_idx(slot_idx)
+ , _rpc_prefix((slot_idx == 0) ? "db_0_" : "db_1_")
+ , _log_prefix((slot_idx == 0) ? "AD9371-0" : "AD9371-1")
{
UHD_LOG_TRACE(_log_prefix,
- "Initialized controls with RPC prefix " << _rpc_prefix <<
- " for slot " << _slot_idx);
+ "Initialized controls with RPC prefix " << _rpc_prefix << " for slot "
+ << _slot_idx);
}
double magnesium_ad9371_iface::set_frequency(
- const double freq,
- const size_t chan,
- const direction_t dir
-) {
+ const double freq, const size_t chan, const direction_t dir)
+{
// Note: This sets the frequency for both channels (1 and 2).
- auto which = _get_which(dir, chan);
+ auto which = _get_which(dir, chan);
auto actual_freq = request<double>("set_freq", which, freq, false);
- UHD_LOG_TRACE(_log_prefix,
- _rpc_prefix << "set_freq returned " << actual_freq);
+ UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "set_freq returned " << actual_freq);
return actual_freq;
}
double magnesium_ad9371_iface::set_gain(
- const double gain,
- const size_t chan,
- const direction_t dir
-) {
- auto which = _get_which(dir, chan);
+ const double gain, const size_t chan, const direction_t dir)
+{
+ auto which = _get_which(dir, chan);
auto retval = request<double>("set_gain", which, gain);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "set_gain returned " << retval);
return retval;
- //return 0.0;
+ // return 0.0;
}
-double magnesium_ad9371_iface::set_master_clock_rate(
- const double freq
-) {
+double magnesium_ad9371_iface::set_master_clock_rate(const double freq)
+{
const auto actual_freq = request<double>("set_master_clock_rate", freq);
- UHD_LOG_TRACE(_log_prefix,
- _rpc_prefix << "set_master_clock_rate returned successfully");
+ UHD_LOG_TRACE(
+ _log_prefix, _rpc_prefix << "set_master_clock_rate returned successfully");
return actual_freq;
}
-double magnesium_ad9371_iface::set_bandwidth(const double bandwidth, const size_t chan, const direction_t dir)
+double magnesium_ad9371_iface::set_bandwidth(
+ const double bandwidth, const size_t chan, const direction_t dir)
{
auto const which = _get_which(dir, chan);
- auto retval = request<double>("set_bw_filter", which, bandwidth);
+ auto retval = request<double>("set_bw_filter", which, bandwidth);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "set_bw_filter returned " << retval);
return retval;
}
-double magnesium_ad9371_iface::get_frequency(
- const size_t chan,
- const direction_t dir
-) {
- auto which = _get_which(dir, chan);
+double magnesium_ad9371_iface::get_frequency(const size_t chan, const direction_t dir)
+{
+ auto which = _get_which(dir, chan);
auto retval = request<double>("get_freq", which);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "get_freq returned " << retval);
return retval;
@@ -100,13 +86,14 @@ double magnesium_ad9371_iface::get_frequency(
double magnesium_ad9371_iface::get_gain(const size_t chan, const direction_t dir)
{
- auto which = _get_which(dir, chan);
+ auto which = _get_which(dir, chan);
auto retval = request<double>("get_gain", which);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "get_gain returned " << retval);
return retval;
}
-double magnesium_ad9371_iface::get_bandwidth(const size_t /*chan*/, const direction_t /*dir*/)
+double magnesium_ad9371_iface::get_bandwidth(
+ const size_t /*chan*/, const direction_t /*dir*/)
{
// TODO: implement
UHD_LOG_WARNING(_log_prefix, "Ignoring attempt to get bandwidth");
@@ -114,23 +101,20 @@ double magnesium_ad9371_iface::get_bandwidth(const size_t /*chan*/, const direct
}
std::string magnesium_ad9371_iface::set_lo_source(
- const std::string &source,
- const uhd::direction_t dir
-) {
+ const std::string& source, const uhd::direction_t dir)
+{
// There is only one LO for 2 channels. Using channel 0 for 'which'
- auto which = _get_which(dir, 0);
+ auto which = _get_which(dir, 0);
auto retval = request<std::string>("set_lo_source", which, source);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "set_lo_source returned " << retval);
return retval;
}
-std::string magnesium_ad9371_iface::get_lo_source(
- const uhd::direction_t dir
-) {
+std::string magnesium_ad9371_iface::get_lo_source(const uhd::direction_t dir)
+{
// There is only one LO for 2 channels. Using channel 0 for 'which'
- auto which = _get_which(dir, 0);
+ auto which = _get_which(dir, 0);
auto retval = request<std::string>("get_lo_source", which);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "get_lo_source returned " << retval);
return retval;
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
index acfecf2df..245c302ba 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
@@ -17,56 +17,27 @@ class magnesium_ad9371_iface
public:
using uptr = std::unique_ptr<magnesium_ad9371_iface>;
- magnesium_ad9371_iface(
- uhd::rpc_client::sptr rpcc,
- const size_t slot_idx
- );
+ magnesium_ad9371_iface(uhd::rpc_client::sptr rpcc, const size_t slot_idx);
double set_frequency(
- const double freq,
- const size_t chan,
- const uhd::direction_t dir
- );
-
- double get_frequency(
- const size_t chan,
- const uhd::direction_t dir
- );
-
- double set_gain(
- const double gain,
- const size_t chan,
- const uhd::direction_t dir
- );
-
- double get_gain(
- const size_t chan,
- const uhd::direction_t dir
- );
-
- double set_master_clock_rate(
- const double freq
- );
+ const double freq, const size_t chan, const uhd::direction_t dir);
+
+ double get_frequency(const size_t chan, const uhd::direction_t dir);
+
+ double set_gain(const double gain, const size_t chan, const uhd::direction_t dir);
+
+ double get_gain(const size_t chan, const uhd::direction_t dir);
+
+ double set_master_clock_rate(const double freq);
double set_bandwidth(
- const double bandwidth,
- const size_t chan,
- const uhd::direction_t dir
- );
+ const double bandwidth, const size_t chan, const uhd::direction_t dir);
- double get_bandwidth(
- const size_t chan,
- const uhd::direction_t dir
- );
+ double get_bandwidth(const size_t chan, const uhd::direction_t dir);
- std::string set_lo_source(
- const std::string &source,
- const uhd::direction_t dir
- );
+ std::string set_lo_source(const std::string& source, const uhd::direction_t dir);
- std::string get_lo_source(
- const uhd::direction_t dir
- );
+ std::string get_lo_source(const uhd::direction_t dir);
private:
/*! Shorthand to perform an RPC request. Saves some typing.
@@ -76,9 +47,7 @@ private:
{
UHD_LOG_TRACE(_log_prefix, "[RPC] Calling " << func_name);
return _rpcc->request_with_token<return_type>(
- _rpc_prefix + func_name,
- std::forward<Args>(args)...
- );
+ _rpc_prefix + func_name, std::forward<Args>(args)...);
};
//! Reference to the RPC client
@@ -92,7 +61,6 @@ private:
//! Logger prefix
const std::string _log_prefix;
-
};
#endif /* INCLUDED_LIBUHD_RFNOC_MAGNESIUM_AD9371_IFACE_HPP */
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_bands.cpp b/host/lib/usrp/dboard/magnesium/magnesium_bands.cpp
index 656543653..4792dcac6 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_bands.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_bands.cpp
@@ -6,8 +6,8 @@
// The band plan
-#include "magnesium_radio_ctrl_impl.hpp"
#include "magnesium_constants.hpp"
+#include "magnesium_radio_ctrl_impl.hpp"
#include <uhd/utils/math.hpp>
/*
@@ -43,66 +43,67 @@ using namespace uhd::rfnoc;
using namespace uhd::math::fp_compare;
namespace {
- /* Note on the RX filter bank:
- *
- * The RX path has 7 bands, which we call BAND0 through BAND7. BAND0 is the
- * lowest frequency band (it goes through F44, the 490 MHz low pass filter,
- * on the first channel). BAND7 is the highest frequency band, it goes
- * through the 2.7 GHz high pass filter (F43 on the first channel).
- *
- * For all frequencies, there are gain values where we bypass the filter
- * bank. In this case, the band setting does not apply (does not have any
- * meaning).
- *
- * The lowband, when not disabling the filter bank, always goes through
- * BAND0, but there are non-lowband frequencies which can also go through
- * BAND0.
- *
- * The following constants define lower cutoff frequencies for each band.
- * BAND0 does not have a lower cutoff frequency, it is implied by
- * MAGNESIUM_MIN_FREQ. MAGNESIUM_RX_BAND1_MIN_FREQ is the cutover frequency
- * for switching from BAND0 to BAND1, and so on.
- *
- * Bands 1-6 have both high- and low-pass filters (effectively band
- * passes). Frequencies need to be chosen to allow as much of the full
- * bandwidth through unattenuated.
- */
- constexpr double MAGNESIUM_RX_BAND1_MIN_FREQ = 430e6;
- constexpr double MAGNESIUM_RX_BAND2_MIN_FREQ = 600e6;
- constexpr double MAGNESIUM_RX_BAND3_MIN_FREQ = 1050e6;
- constexpr double MAGNESIUM_RX_BAND4_MIN_FREQ = 1600e6;
- constexpr double MAGNESIUM_RX_BAND5_MIN_FREQ = 2100e6;
- constexpr double MAGNESIUM_RX_BAND6_MIN_FREQ = 2700e6;
+/* Note on the RX filter bank:
+ *
+ * The RX path has 7 bands, which we call BAND0 through BAND7. BAND0 is the
+ * lowest frequency band (it goes through F44, the 490 MHz low pass filter,
+ * on the first channel). BAND7 is the highest frequency band, it goes
+ * through the 2.7 GHz high pass filter (F43 on the first channel).
+ *
+ * For all frequencies, there are gain values where we bypass the filter
+ * bank. In this case, the band setting does not apply (does not have any
+ * meaning).
+ *
+ * The lowband, when not disabling the filter bank, always goes through
+ * BAND0, but there are non-lowband frequencies which can also go through
+ * BAND0.
+ *
+ * The following constants define lower cutoff frequencies for each band.
+ * BAND0 does not have a lower cutoff frequency, it is implied by
+ * MAGNESIUM_MIN_FREQ. MAGNESIUM_RX_BAND1_MIN_FREQ is the cutover frequency
+ * for switching from BAND0 to BAND1, and so on.
+ *
+ * Bands 1-6 have both high- and low-pass filters (effectively band
+ * passes). Frequencies need to be chosen to allow as much of the full
+ * bandwidth through unattenuated.
+ */
+constexpr double MAGNESIUM_RX_BAND1_MIN_FREQ = 430e6;
+constexpr double MAGNESIUM_RX_BAND2_MIN_FREQ = 600e6;
+constexpr double MAGNESIUM_RX_BAND3_MIN_FREQ = 1050e6;
+constexpr double MAGNESIUM_RX_BAND4_MIN_FREQ = 1600e6;
+constexpr double MAGNESIUM_RX_BAND5_MIN_FREQ = 2100e6;
+constexpr double MAGNESIUM_RX_BAND6_MIN_FREQ = 2700e6;
- /* Note on the TX filter bank:
- *
- * The TX path has 4 bands, which we call BAND0 through BAND3.
- * For all frequencies, there are gain values where we bypass the filter
- * bank. In this case, the band setting does not apply (does not have any
- * meaning).
- *
- * The lowband, when not disabling the filter bank, always goes through
- * BAND0, but there are non-lowband frequencies which can also go through
- * BAND0.
- *
- * The following constants define lower cutoff frequencies for each band.
- * BAND0 does not have a lower cutoff frequency, it is implied by
- * MAGNESIUM_MIN_FREQ. MAGNESIUM_TX_BAND1_MIN_FREQ is the cutover frequency
- * for switching from BAND0 to BAND1, and so on.
- *
- * On current Magnesium revisions, all filters on the TX filter bank are
- * low pass filters (no high pass filters).
- * Frequencies need to be chosen to allow as much of the full bandwidth
- * through unattenuated (so don't go all the way up to the cutoff frequency
- * of that filter, OK).
- */
- constexpr double MAGNESIUM_TX_BAND1_MIN_FREQ = 723.17e6;
- constexpr double MAGNESIUM_TX_BAND2_MIN_FREQ = 1623.17e6;
- constexpr double MAGNESIUM_TX_BAND3_MIN_FREQ = 3323.17e6;
-}
+/* Note on the TX filter bank:
+ *
+ * The TX path has 4 bands, which we call BAND0 through BAND3.
+ * For all frequencies, there are gain values where we bypass the filter
+ * bank. In this case, the band setting does not apply (does not have any
+ * meaning).
+ *
+ * The lowband, when not disabling the filter bank, always goes through
+ * BAND0, but there are non-lowband frequencies which can also go through
+ * BAND0.
+ *
+ * The following constants define lower cutoff frequencies for each band.
+ * BAND0 does not have a lower cutoff frequency, it is implied by
+ * MAGNESIUM_MIN_FREQ. MAGNESIUM_TX_BAND1_MIN_FREQ is the cutover frequency
+ * for switching from BAND0 to BAND1, and so on.
+ *
+ * On current Magnesium revisions, all filters on the TX filter bank are
+ * low pass filters (no high pass filters).
+ * Frequencies need to be chosen to allow as much of the full bandwidth
+ * through unattenuated (so don't go all the way up to the cutoff frequency
+ * of that filter, OK).
+ */
+constexpr double MAGNESIUM_TX_BAND1_MIN_FREQ = 723.17e6;
+constexpr double MAGNESIUM_TX_BAND2_MIN_FREQ = 1623.17e6;
+constexpr double MAGNESIUM_TX_BAND3_MIN_FREQ = 3323.17e6;
+} // namespace
-magnesium_radio_ctrl_impl::rx_band
-magnesium_radio_ctrl_impl::_map_freq_to_rx_band(const double freq) {
+magnesium_radio_ctrl_impl::rx_band magnesium_radio_ctrl_impl::_map_freq_to_rx_band(
+ const double freq)
+{
magnesium_radio_ctrl_impl::rx_band band;
if (fp_compare_epsilon<double>(freq) < MAGNESIUM_MIN_FREQ) {
@@ -130,8 +131,9 @@ magnesium_radio_ctrl_impl::_map_freq_to_rx_band(const double freq) {
return band;
}
-magnesium_radio_ctrl_impl::tx_band
-magnesium_radio_ctrl_impl::_map_freq_to_tx_band(const double freq) {
+magnesium_radio_ctrl_impl::tx_band magnesium_radio_ctrl_impl::_map_freq_to_tx_band(
+ const double freq)
+{
magnesium_radio_ctrl_impl::tx_band band;
if (fp_compare_epsilon<double>(freq) < MAGNESIUM_MIN_FREQ) {
@@ -152,4 +154,3 @@ magnesium_radio_ctrl_impl::_map_freq_to_tx_band(const double freq) {
return band;
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp b/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp
index e19603b94..a045d0558 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp
@@ -7,17 +7,17 @@
#ifndef INCLUDED_LIBUHD_MAGNESIUM_CONSTANTS_HPP
#define INCLUDED_LIBUHD_MAGNESIUM_CONSTANTS_HPP
-#include <vector>
-#include <string>
-#include <cstddef>
#include <uhd/types/ranges.hpp>
+#include <cstddef>
+#include <string>
+#include <vector>
-static constexpr size_t FPGPIO_MASTER_RADIO = 0;
-static constexpr size_t TOTAL_RADIO_PORTS = 4;
-static constexpr double AD9371_RX_MIN_BANDWIDTH = 20.0e6; // HZ
+static constexpr size_t FPGPIO_MASTER_RADIO = 0;
+static constexpr size_t TOTAL_RADIO_PORTS = 4;
+static constexpr double AD9371_RX_MIN_BANDWIDTH = 20.0e6; // HZ
static constexpr double AD9371_RX_MAX_BANDWIDTH = 100.0e6; // HZ
-static constexpr double AD9371_TX_MIN_BANDWIDTH = 20.0e6; // HZ
+static constexpr double AD9371_TX_MIN_BANDWIDTH = 20.0e6; // HZ
static constexpr double AD9371_TX_MAX_BANDWIDTH = 100.0e6; // HZ
static constexpr double AD9371_MIN_FREQ = 300.0e6; // Hz
@@ -27,36 +27,36 @@ static constexpr double ADF4351_MIN_FREQ = 35.0e6;
static constexpr double ADF4351_MAX_FREQ = 4.4e9;
static const std::vector<double> MAGNESIUM_RADIO_RATES = {122.88e6, 125e6, 153.6e6};
-static constexpr double MAGNESIUM_RADIO_RATE = 125e6; // Hz
-static constexpr double MAGNESIUM_MIN_FREQ = 1e6; // Hz
-static constexpr double MAGNESIUM_MAX_FREQ = 6e9; // Hz
+static constexpr double MAGNESIUM_RADIO_RATE = 125e6; // Hz
+static constexpr double MAGNESIUM_MIN_FREQ = 1e6; // Hz
+static constexpr double MAGNESIUM_MAX_FREQ = 6e9; // Hz
static constexpr double MAGNESIUM_LOWBAND_FREQ = 300e6;
-static constexpr double AD9371_MIN_RX_GAIN = 0.0; // dB
-static constexpr double AD9371_MAX_RX_GAIN = 30.0; // dB
+static constexpr double AD9371_MIN_RX_GAIN = 0.0; // dB
+static constexpr double AD9371_MAX_RX_GAIN = 30.0; // dB
static constexpr double AD9371_RX_GAIN_STEP = 0.5;
-static constexpr double DSA_MIN_GAIN = 0; // dB
-static constexpr double DSA_MAX_GAIN = 31.5; // dB
-static constexpr double DSA_GAIN_STEP = 0.5; // db
-static constexpr double AMP_MIN_GAIN = 0; // dB
-static constexpr double AMP_MAX_GAIN = 10; // dB
-static constexpr double AMP_GAIN_STEP = 10;// dB
-static constexpr double AD9371_MIN_TX_GAIN = 0.0; // dB
-static constexpr double AD9371_MAX_TX_GAIN = 41.95; // dB
+static constexpr double DSA_MIN_GAIN = 0; // dB
+static constexpr double DSA_MAX_GAIN = 31.5; // dB
+static constexpr double DSA_GAIN_STEP = 0.5; // db
+static constexpr double AMP_MIN_GAIN = 0; // dB
+static constexpr double AMP_MAX_GAIN = 10; // dB
+static constexpr double AMP_GAIN_STEP = 10; // dB
+static constexpr double AD9371_MIN_TX_GAIN = 0.0; // dB
+static constexpr double AD9371_MAX_TX_GAIN = 41.95; // dB
static constexpr double AD9371_TX_GAIN_STEP = 0.05;
-static constexpr double ALL_RX_MIN_GAIN = 0.0;
-static constexpr double ALL_RX_MAX_GAIN = 75.0;
-static constexpr double ALL_RX_GAIN_STEP = 0.5;
-static constexpr double ALL_TX_MIN_GAIN = 0.0;
-static constexpr double ALL_TX_MAX_GAIN = 65.0;
-static constexpr double ALL_TX_GAIN_STEP = 0.5;
+static constexpr double ALL_RX_MIN_GAIN = 0.0;
+static constexpr double ALL_RX_MAX_GAIN = 75.0;
+static constexpr double ALL_RX_GAIN_STEP = 0.5;
+static constexpr double ALL_TX_MIN_GAIN = 0.0;
+static constexpr double ALL_TX_MAX_GAIN = 65.0;
+static constexpr double ALL_TX_GAIN_STEP = 0.5;
-static const uhd::freq_range_t MAGNESIUM_FREQ_RANGE(MAGNESIUM_MIN_FREQ, MAGNESIUM_MAX_FREQ);
+static const uhd::freq_range_t MAGNESIUM_FREQ_RANGE(
+ MAGNESIUM_MIN_FREQ, MAGNESIUM_MAX_FREQ);
static const std::vector<std::string> MAGNESIUM_RX_ANTENNAS = {
- "TX/RX", "RX2", "CAL", "LOCAL"
-};
+ "TX/RX", "RX2", "CAL", "LOCAL"};
//! AD9371 LO (for direct conversion)
static constexpr char MAGNESIUM_LO1[] = "rfic";
@@ -72,7 +72,7 @@ static constexpr char MAGNESIUM_AMP[] = "amp";
// Note: MAGNESIUM_NUM_CHANS is independent of the number of chans per
// RFNoC block. TODO: When we go to one radio per dboard, this comment can
// be deleted.
-static constexpr size_t MAGNESIUM_NUM_CHANS = 2;
+static constexpr size_t MAGNESIUM_NUM_CHANS = 2;
static constexpr double MAGNESIUM_RX_IF_FREQ = 2.44e9;
static constexpr double MAGNESIUM_TX_IF_FREQ = 1.95e9;
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.cpp b/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.cpp
index 3e68e2011..172f26390 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.cpp
@@ -11,35 +11,26 @@
#include <chrono>
namespace {
- //! Address of the CPLD scratch register
- const uint8_t CPLD_REGS_SCRATCH = 0x0040;
+//! Address of the CPLD scratch register
+const uint8_t CPLD_REGS_SCRATCH = 0x0040;
- //! Address of the CPLD reset register
- const uint8_t CPLD_REGS_RESET = 0x0041;
-}
+//! Address of the CPLD reset register
+const uint8_t CPLD_REGS_RESET = 0x0041;
+} // namespace
-magnesium_cpld_ctrl::magnesium_cpld_ctrl(
- write_spi_t write_fn,
- read_spi_t read_fn
-)
+magnesium_cpld_ctrl::magnesium_cpld_ctrl(write_spi_t write_fn, read_spi_t read_fn)
{
- _write_fn = [write_fn](const uint8_t addr, const uint32_t data){
+ _write_fn = [write_fn](const uint8_t addr, const uint32_t data) {
UHD_LOG_TRACE("MG_CPLD",
- str(boost::format("Writing to CPLD: 0x%02X -> 0x%04X")
- % uint32_t(addr) % data));
- const uint32_t spi_transaction = 0
- | ((addr & 0x7F) << 16)
- | data
- ;
+ str(boost::format("Writing to CPLD: 0x%02X -> 0x%04X") % uint32_t(addr)
+ % data));
+ const uint32_t spi_transaction = 0 | ((addr & 0x7F) << 16) | data;
write_fn(spi_transaction);
};
- _read_fn = [read_fn](const uint8_t addr){
+ _read_fn = [read_fn](const uint8_t addr) {
UHD_LOG_TRACE("MG_CPLD",
- str(boost::format("Reading from CPLD address 0x%02X")
- % uint32_t(addr)));
- const uint32_t spi_transaction = (1<<23)
- | ((addr & 0x7F) << 16)
- ;
+ str(boost::format("Reading from CPLD address 0x%02X") % uint32_t(addr)));
+ const uint32_t spi_transaction = (1 << 23) | ((addr & 0x7F) << 16);
return read_fn(spi_transaction);
};
@@ -82,23 +73,24 @@ uint16_t magnesium_cpld_ctrl::get_scratch()
return get_reg(CPLD_REGS_SCRATCH);
}
-void magnesium_cpld_ctrl::set_tx_switches(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_tx_switches(const chan_sel_t chan,
const tx_sw1_t tx_sw1,
const tx_sw2_t tx_sw2,
const tx_sw3_t tx_sw3,
const lowband_mixer_path_sel_t select_lowband_mixer_path,
const bool enb_lowband_mixer,
const atr_state_t atr_state,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
_regs.ch1_idle_tx_sw1 = magnesium_cpld_regs_t::ch1_idle_tx_sw1_t(tx_sw1);
_regs.ch1_idle_tx_sw2 = magnesium_cpld_regs_t::ch1_idle_tx_sw2_t(tx_sw2);
_regs.ch1_idle_tx_sw3 = magnesium_cpld_regs_t::ch1_idle_tx_sw3_t(tx_sw3);
- _regs.ch1_idle_tx_lowband_mixer_path_select = magnesium_cpld_regs_t::ch1_idle_tx_lowband_mixer_path_select_t(select_lowband_mixer_path);
+ _regs.ch1_idle_tx_lowband_mixer_path_select =
+ magnesium_cpld_regs_t::ch1_idle_tx_lowband_mixer_path_select_t(
+ select_lowband_mixer_path);
_regs.ch1_idle_tx_mixer_en = enb_lowband_mixer;
}
if (atr_state == ON or atr_state == ANY) {
@@ -106,7 +98,8 @@ void magnesium_cpld_ctrl::set_tx_switches(
_regs.ch1_on_tx_sw2 = magnesium_cpld_regs_t::ch1_on_tx_sw2_t(tx_sw2);
_regs.ch1_on_tx_sw3 = magnesium_cpld_regs_t::ch1_on_tx_sw3_t(tx_sw3);
_regs.ch1_on_tx_lowband_mixer_path_select =
- magnesium_cpld_regs_t::ch1_on_tx_lowband_mixer_path_select_t(select_lowband_mixer_path);
+ magnesium_cpld_regs_t::ch1_on_tx_lowband_mixer_path_select_t(
+ select_lowband_mixer_path);
_regs.ch1_on_tx_mixer_en = enb_lowband_mixer;
}
}
@@ -116,7 +109,8 @@ void magnesium_cpld_ctrl::set_tx_switches(
_regs.ch2_idle_tx_sw2 = magnesium_cpld_regs_t::ch2_idle_tx_sw2_t(tx_sw1);
_regs.ch2_idle_tx_sw3 = magnesium_cpld_regs_t::ch2_idle_tx_sw3_t(tx_sw1);
_regs.ch2_idle_tx_lowband_mixer_path_select =
- magnesium_cpld_regs_t::ch2_idle_tx_lowband_mixer_path_select_t(select_lowband_mixer_path);
+ magnesium_cpld_regs_t::ch2_idle_tx_lowband_mixer_path_select_t(
+ select_lowband_mixer_path);
_regs.ch2_idle_tx_mixer_en = enb_lowband_mixer;
}
if (atr_state == ON or atr_state == ANY) {
@@ -124,7 +118,8 @@ void magnesium_cpld_ctrl::set_tx_switches(
_regs.ch2_on_tx_sw2 = magnesium_cpld_regs_t::ch2_on_tx_sw2_t(tx_sw2);
_regs.ch2_on_tx_sw3 = magnesium_cpld_regs_t::ch2_on_tx_sw3_t(tx_sw3);
_regs.ch2_on_tx_lowband_mixer_path_select =
- magnesium_cpld_regs_t::ch2_on_tx_lowband_mixer_path_select_t(select_lowband_mixer_path);
+ magnesium_cpld_regs_t::ch2_on_tx_lowband_mixer_path_select_t(
+ select_lowband_mixer_path);
_regs.ch2_on_tx_mixer_en = enb_lowband_mixer;
}
}
@@ -134,8 +129,7 @@ void magnesium_cpld_ctrl::set_tx_switches(
}
}
-void magnesium_cpld_ctrl::set_rx_switches(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_rx_switches(const chan_sel_t chan,
const rx_sw2_t rx_sw2,
const rx_sw3_t rx_sw3,
const rx_sw4_t rx_sw4,
@@ -144,8 +138,8 @@ void magnesium_cpld_ctrl::set_rx_switches(
const lowband_mixer_path_sel_t select_lowband_mixer_path,
const bool enb_lowband_mixer,
const atr_state_t atr_state,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
@@ -154,7 +148,9 @@ void magnesium_cpld_ctrl::set_rx_switches(
_regs.ch1_idle_rx_sw4 = magnesium_cpld_regs_t::ch1_idle_rx_sw4_t(rx_sw4);
_regs.ch1_idle_rx_sw5 = magnesium_cpld_regs_t::ch1_idle_rx_sw5_t(rx_sw5);
_regs.ch1_idle_rx_sw6 = magnesium_cpld_regs_t::ch1_idle_rx_sw6_t(rx_sw6);
- _regs.ch1_idle_rx_loband_mixer_path_sel = magnesium_cpld_regs_t::ch1_idle_rx_loband_mixer_path_sel_t(select_lowband_mixer_path);
+ _regs.ch1_idle_rx_loband_mixer_path_sel =
+ magnesium_cpld_regs_t::ch1_idle_rx_loband_mixer_path_sel_t(
+ select_lowband_mixer_path);
_regs.ch1_idle_rx_mixer_en = enb_lowband_mixer;
}
if (atr_state == ON or atr_state == ANY) {
@@ -163,7 +159,9 @@ void magnesium_cpld_ctrl::set_rx_switches(
_regs.ch1_on_rx_sw4 = magnesium_cpld_regs_t::ch1_on_rx_sw4_t(rx_sw4);
_regs.ch1_on_rx_sw5 = magnesium_cpld_regs_t::ch1_on_rx_sw5_t(rx_sw5);
_regs.ch1_on_rx_sw6 = magnesium_cpld_regs_t::ch1_on_rx_sw6_t(rx_sw6);
- _regs.ch1_on_rx_loband_mixer_path_sel = magnesium_cpld_regs_t::ch1_on_rx_loband_mixer_path_sel_t(select_lowband_mixer_path);
+ _regs.ch1_on_rx_loband_mixer_path_sel =
+ magnesium_cpld_regs_t::ch1_on_rx_loband_mixer_path_sel_t(
+ select_lowband_mixer_path);
_regs.ch1_on_rx_mixer_en = enb_lowband_mixer;
}
}
@@ -175,7 +173,8 @@ void magnesium_cpld_ctrl::set_rx_switches(
_regs.ch2_idle_rx_sw5 = magnesium_cpld_regs_t::ch2_idle_rx_sw5_t(rx_sw5);
_regs.ch2_idle_rx_sw6 = magnesium_cpld_regs_t::ch2_idle_rx_sw6_t(rx_sw6);
_regs.ch2_idle_rx_loband_mixer_path_sel =
- magnesium_cpld_regs_t::ch2_idle_rx_loband_mixer_path_sel_t(select_lowband_mixer_path);
+ magnesium_cpld_regs_t::ch2_idle_rx_loband_mixer_path_sel_t(
+ select_lowband_mixer_path);
_regs.ch2_idle_rx_mixer_en = enb_lowband_mixer;
}
if (atr_state == ON or atr_state == ANY) {
@@ -184,7 +183,9 @@ void magnesium_cpld_ctrl::set_rx_switches(
_regs.ch2_on_rx_sw4 = magnesium_cpld_regs_t::ch2_on_rx_sw4_t(rx_sw4);
_regs.ch2_on_rx_sw5 = magnesium_cpld_regs_t::ch2_on_rx_sw5_t(rx_sw5);
_regs.ch2_on_rx_sw6 = magnesium_cpld_regs_t::ch2_on_rx_sw6_t(rx_sw6);
- _regs.ch2_on_rx_loband_mixer_path_sel = magnesium_cpld_regs_t::ch2_on_rx_loband_mixer_path_sel_t(select_lowband_mixer_path);
+ _regs.ch2_on_rx_loband_mixer_path_sel =
+ magnesium_cpld_regs_t::ch2_on_rx_loband_mixer_path_sel_t(
+ select_lowband_mixer_path);
_regs.ch2_on_rx_mixer_en = enb_lowband_mixer;
}
}
@@ -193,40 +194,39 @@ void magnesium_cpld_ctrl::set_rx_switches(
}
}
-void magnesium_cpld_ctrl::set_tx_atr_bits(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_tx_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool tx_led,
const bool tx_pa_enb,
const bool tx_amp_enb,
const bool tx_myk_en,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch1_idle_tx_led = tx_led;
- _regs.ch1_idle_tx_pa_en = tx_pa_enb;
+ _regs.ch1_idle_tx_led = tx_led;
+ _regs.ch1_idle_tx_pa_en = tx_pa_enb;
_regs.ch1_idle_tx_amp_en = tx_amp_enb;
_regs.ch1_idle_tx_myk_en = tx_myk_en;
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch1_on_tx_led = tx_led;
- _regs.ch1_on_tx_pa_en = tx_pa_enb;
+ _regs.ch1_on_tx_led = tx_led;
+ _regs.ch1_on_tx_pa_en = tx_pa_enb;
_regs.ch1_on_tx_amp_en = tx_amp_enb;
_regs.ch1_on_tx_myk_en = tx_myk_en;
}
}
if (chan == CHAN2 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch2_idle_tx_led = tx_led;
- _regs.ch2_idle_tx_pa_en = tx_pa_enb;
+ _regs.ch2_idle_tx_led = tx_led;
+ _regs.ch2_idle_tx_pa_en = tx_pa_enb;
_regs.ch2_idle_tx_amp_en = tx_amp_enb;
_regs.ch2_idle_tx_myk_en = tx_myk_en;
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch2_on_tx_led = tx_led;
- _regs.ch2_on_tx_pa_en = tx_pa_enb;
+ _regs.ch2_on_tx_led = tx_led;
+ _regs.ch2_on_tx_pa_en = tx_pa_enb;
_regs.ch2_on_tx_amp_en = tx_amp_enb;
_regs.ch2_on_tx_myk_en = tx_myk_en;
}
@@ -236,31 +236,26 @@ void magnesium_cpld_ctrl::set_tx_atr_bits(
}
}
-void magnesium_cpld_ctrl::set_trx_sw_atr_bits(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_trx_sw_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const sw_trx_t trx_sw,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch1_idle_sw_trx =
- magnesium_cpld_regs_t::ch1_idle_sw_trx_t(trx_sw);
+ _regs.ch1_idle_sw_trx = magnesium_cpld_regs_t::ch1_idle_sw_trx_t(trx_sw);
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch1_on_sw_trx =
- magnesium_cpld_regs_t::ch1_on_sw_trx_t(trx_sw);
+ _regs.ch1_on_sw_trx = magnesium_cpld_regs_t::ch1_on_sw_trx_t(trx_sw);
}
}
if (chan == CHAN2 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch2_idle_sw_trx =
- magnesium_cpld_regs_t::ch2_idle_sw_trx_t(trx_sw);
+ _regs.ch2_idle_sw_trx = magnesium_cpld_regs_t::ch2_idle_sw_trx_t(trx_sw);
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch2_on_sw_trx =
- magnesium_cpld_regs_t::ch2_on_sw_trx_t(trx_sw);
+ _regs.ch2_on_sw_trx = magnesium_cpld_regs_t::ch2_on_sw_trx_t(trx_sw);
}
}
if (not defer_commit) {
@@ -268,40 +263,35 @@ void magnesium_cpld_ctrl::set_trx_sw_atr_bits(
}
}
-void magnesium_cpld_ctrl::set_rx_input_atr_bits(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_rx_input_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const rx_sw1_t rx_sw1,
const bool rx_led,
const bool rx2_led,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch1_idle_rx_sw1 =
- magnesium_cpld_regs_t::ch1_idle_rx_sw1_t(rx_sw1);
- _regs.ch1_idle_rx_led = rx_led;
+ _regs.ch1_idle_rx_sw1 = magnesium_cpld_regs_t::ch1_idle_rx_sw1_t(rx_sw1);
+ _regs.ch1_idle_rx_led = rx_led;
_regs.ch1_idle_rx2_led = rx2_led;
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch1_on_rx_sw1 =
- magnesium_cpld_regs_t::ch1_on_rx_sw1_t(rx_sw1);
- _regs.ch1_on_rx_led = rx_led;
+ _regs.ch1_on_rx_sw1 = magnesium_cpld_regs_t::ch1_on_rx_sw1_t(rx_sw1);
+ _regs.ch1_on_rx_led = rx_led;
_regs.ch1_on_rx2_led = rx2_led;
}
}
if (chan == CHAN2 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch2_idle_rx_sw1 =
- magnesium_cpld_regs_t::ch2_idle_rx_sw1_t(rx_sw1);
- _regs.ch2_idle_rx_led = rx_led;
+ _regs.ch2_idle_rx_sw1 = magnesium_cpld_regs_t::ch2_idle_rx_sw1_t(rx_sw1);
+ _regs.ch2_idle_rx_led = rx_led;
_regs.ch2_idle_rx2_led = rx2_led;
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch2_on_rx_sw1 =
- magnesium_cpld_regs_t::ch2_on_rx_sw1_t(rx_sw1);
- _regs.ch2_on_rx_led = rx_led;
+ _regs.ch2_on_rx_sw1 = magnesium_cpld_regs_t::ch2_on_rx_sw1_t(rx_sw1);
+ _regs.ch2_on_rx_led = rx_led;
_regs.ch2_on_rx2_led = rx2_led;
}
}
@@ -311,13 +301,12 @@ void magnesium_cpld_ctrl::set_rx_input_atr_bits(
}
}
-void magnesium_cpld_ctrl::set_rx_atr_bits(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_rx_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool rx_amp_enb,
const bool rx_myk_en,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
@@ -345,13 +334,12 @@ void magnesium_cpld_ctrl::set_rx_atr_bits(
}
}
-void magnesium_cpld_ctrl::set_rx_lna_atr_bits(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_rx_lna_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool rx_lna1_enb,
const bool rx_lna2_enb,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
@@ -394,9 +382,7 @@ void magnesium_cpld_ctrl::_loopback_test()
if (actual != random_number) {
UHD_LOGGER_ERROR("MG_CPLD")
<< "CPLD scratch loopback failed! "
- << boost::format("Expected: 0x%04X Got: 0x%04X")
- % random_number % actual
- ;
+ << boost::format("Expected: 0x%04X Got: 0x%04X") % random_number % actual;
throw uhd::runtime_error("CPLD scratch loopback failed!");
}
UHD_LOG_TRACE("MG_CPLD", "CPLD scratch loopback test passed!");
@@ -406,19 +392,16 @@ void magnesium_cpld_ctrl::_loopback_test()
void magnesium_cpld_ctrl::commit(const bool save_all)
{
UHD_LOGGER_TRACE("MG_CPLD")
- << "Storing register cache "
- << (save_all ? "completely" : "selectively")
- << " to CPLD via SPI..."
- ;
- auto changed_addrs = save_all ?
- _regs.get_all_addrs() :
- _regs.get_changed_addrs<size_t>();
- for (const auto addr: changed_addrs) {
+ << "Storing register cache " << (save_all ? "completely" : "selectively")
+ << " to CPLD via SPI...";
+ auto changed_addrs = save_all ? _regs.get_all_addrs()
+ : _regs.get_changed_addrs<size_t>();
+ for (const auto addr : changed_addrs) {
_write_fn(addr, _regs.get_reg(addr));
}
_regs.save_state();
UHD_LOG_TRACE("MG_CPLD",
- "Storing cache complete: " \
- "Updated " << changed_addrs.size() << " registers.");
+ "Storing cache complete: "
+ "Updated "
+ << changed_addrs.size() << " registers.");
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp b/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp
index fc3af77de..05455e3fd 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp
@@ -8,10 +8,10 @@
#define INCLUDED_LIBUHD_MAGNESIUM_CPLD_CTRL_HPP
#include "adf4351_regs.hpp"
-#include <uhd/types/serial.hpp>
#include "magnesium_cpld_regs.hpp"
-#include <mutex>
+#include <uhd/types/serial.hpp>
#include <memory>
+#include <mutex>
//! Controls the CPLD on a Magnesium daughterboard
//
@@ -31,21 +31,13 @@ public:
//! ATR state: The CPLD has 2 states for RX and TX each, not like the radio
// which has 4 states (one for every RX/TX state combo).
- enum atr_state_t {
- IDLE,
- ON,
- ANY
- };
+ enum atr_state_t { IDLE, ON, ANY };
//! Channel select: One CPLD controls both channels on a daughterboard
- enum chan_sel_t {
- CHAN1,
- CHAN2,
- BOTH
- };
+ enum chan_sel_t { CHAN1, CHAN2, BOTH };
enum tx_sw1_t {
- TX_SW1_SHUTDOWNTXSW1 = 0,
+ TX_SW1_SHUTDOWNTXSW1 = 0,
TX_SW1_FROMTXFILTERLP1700MHZ = 1,
TX_SW1_FROMTXFILTERLP3400MHZ = 2,
TX_SW1_FROMTXFILTERLP0800MHZ = 3
@@ -58,59 +50,56 @@ public:
TX_SW2_TOTXFILTERLP6400MHZ = 8
};
- enum tx_sw3_t {
- TX_SW3_TOTXFILTERBANKS = 0,
- TX_SW3_BYPASSPATHTOTRXSW = 1
- };
+ enum tx_sw3_t { TX_SW3_TOTXFILTERBANKS = 0, TX_SW3_BYPASSPATHTOTRXSW = 1 };
enum sw_trx_t {
- SW_TRX_FROMLOWERFILTERBANKTXSW1 = 0,
+ SW_TRX_FROMLOWERFILTERBANKTXSW1 = 0,
SW_TRX_FROMTXUPPERFILTERBANKLP6400MHZ = 1,
- SW_TRX_RXCHANNELPATH = 2,
- SW_TRX_BYPASSPATHTOTXSW3 = 3
+ SW_TRX_RXCHANNELPATH = 2,
+ SW_TRX_BYPASSPATHTOTXSW3 = 3
};
enum rx_sw1_t {
- RX_SW1_TXRXINPUT = 0,
- RX_SW1_RXLOCALINPUT = 1,
+ RX_SW1_TXRXINPUT = 0,
+ RX_SW1_RXLOCALINPUT = 1,
RX_SW1_TRXSWITCHOUTPUT = 2,
- RX_SW1_RX2INPUT = 3
+ RX_SW1_RX2INPUT = 3
};
enum rx_sw2_t {
- RX_SW2_SHUTDOWNSW2 = 0,
+ RX_SW2_SHUTDOWNSW2 = 0,
RX_SW2_LOWERFILTERBANKTOSWITCH3 = 1,
- RX_SW2_BYPASSPATHTOSWITCH6 = 2,
+ RX_SW2_BYPASSPATHTOSWITCH6 = 2,
RX_SW2_UPPERFILTERBANKTOSWITCH4 = 3
};
enum rx_sw3_t {
RX_SW3_FILTER2100X2850MHZ = 0,
- RX_SW3_FILTER0490LPMHZ = 1,
+ RX_SW3_FILTER0490LPMHZ = 1,
RX_SW3_FILTER1600X2250MHZ = 2,
RX_SW3_FILTER0440X0530MHZ = 4,
RX_SW3_FILTER0650X1000MHZ = 5,
RX_SW3_FILTER1100X1575MHZ = 6,
- RX_SW3_SHUTDOWNSW3 = 7
+ RX_SW3_SHUTDOWNSW3 = 7
};
enum rx_sw4_t {
RX_SW4_FILTER2100X2850MHZFROM = 1,
RX_SW4_FILTER1600X2250MHZFROM = 2,
- RX_SW4_FILTER2700HPMHZ = 4
+ RX_SW4_FILTER2700HPMHZ = 4
};
enum rx_sw5_t {
RX_SW5_FILTER0440X0530MHZFROM = 1,
RX_SW5_FILTER1100X1575MHZFROM = 2,
- RX_SW5_FILTER0490LPMHZFROM = 4,
+ RX_SW5_FILTER0490LPMHZFROM = 4,
RX_SW5_FILTER0650X1000MHZFROM = 8
};
enum rx_sw6_t {
RX_SW6_LOWERFILTERBANKFROMSWITCH5 = 1,
RX_SW6_UPPERFILTERBANKFROMSWITCH4 = 2,
- RX_SW6_BYPASSPATHFROMSWITCH2 = 4
+ RX_SW6_BYPASSPATHFROMSWITCH2 = 4
};
enum lowband_mixer_path_sel_t {
@@ -124,10 +113,7 @@ public:
* \param write_spi_fn SPI write functor
* \param read_spi_fn SPI read functor
*/
- magnesium_cpld_ctrl(
- write_spi_t write_spi_fn,
- read_spi_t read_spi_fn
- );
+ magnesium_cpld_ctrl(write_spi_t write_spi_fn, read_spi_t read_spi_fn);
/**************************************************************************
* API
@@ -167,16 +153,14 @@ public:
* \param atr_state If IDLE, only update the idle register. If ON, only
* enable the on register. If ANY, update both.
*/
- void set_tx_switches(
- const chan_sel_t chan,
+ void set_tx_switches(const chan_sel_t chan,
const tx_sw1_t tx_sw1,
const tx_sw2_t tx_sw2,
const tx_sw3_t tx_sw3,
const lowband_mixer_path_sel_t select_lowband_mixer_path,
const bool enb_lowband_mixer,
const atr_state_t atr_state = ANY,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! Frequency-related settings, receive side
*
@@ -194,8 +178,7 @@ public:
* \param atr_state If IDLE, only update the idle register. If ON, only
* enable the on register. If ANY, update both.
*/
- void set_rx_switches(
- const chan_sel_t chan,
+ void set_rx_switches(const chan_sel_t chan,
const rx_sw2_t rx_sw2,
const rx_sw3_t rx_sw3,
const rx_sw4_t rx_sw4,
@@ -204,8 +187,7 @@ public:
const lowband_mixer_path_sel_t select_lowband_mixer_path,
const bool enb_lowband_mixer,
const atr_state_t atr_state = ANY,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! ATR settings: LEDs, PAs, LNAs, ... for TX side
*
@@ -223,15 +205,13 @@ public:
* \param tx_amp_enb State of the TX amp for this ATR state (on or off)
* \param tx_myk_enb State of the AD9371 TX enable pin for this ATR state
*/
- void set_tx_atr_bits(
- const chan_sel_t chan,
+ void set_tx_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool tx_led,
const bool tx_pa_enb,
const bool tx_amp_enb,
const bool tx_myk_enb,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! ATR settings: TRX switch
*
@@ -242,12 +222,10 @@ public:
* \param atr_state TX state for which these settings apply.
* \param trx_sw State of the TRX switch for this ATR state
*/
- void set_trx_sw_atr_bits(
- const chan_sel_t chan,
+ void set_trx_sw_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const sw_trx_t trx_sw,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! ATR settings: LEDs, input switches for RX side
*
@@ -263,14 +241,12 @@ public:
* \param rx2_led State of the RX LED for this ATR state (on or off). This
* is the LED on the RX2 port.
*/
- void set_rx_input_atr_bits(
- const chan_sel_t chan,
+ void set_rx_input_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const rx_sw1_t rx_sw1,
const bool rx_led,
const bool rx2_led,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! ATR settings: Amp, Mykonos settings for RX side
*
@@ -287,13 +263,11 @@ public:
* \param rx_amp_enb State of RX amp for this ATR state (on or off).
* \param rx_myk_enb State of the AD9371 RX enable pin for this ATR state
*/
- void set_rx_atr_bits(
- const chan_sel_t chan,
+ void set_rx_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool rx_amp_enb,
const bool rx_myk_en,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! ATR settings: LNAs for RX side
*
@@ -311,13 +285,11 @@ public:
* \param rx_lna2_enb State of RX LNA 2 for this ATR state (on or off).
* This is the low-band LNA.
*/
- void set_rx_lna_atr_bits(
- const chan_sel_t chan,
+ void set_rx_lna_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool rx_lna1_enb,
const bool rx_lna2_enb,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
private:
//! Write functor: Take address / data pair, craft SPI transaction
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_gain_table.cpp b/host/lib/usrp/dboard/magnesium/magnesium_gain_table.cpp
index 05b6dbe8f..67b20f5fa 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_gain_table.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_gain_table.cpp
@@ -15,47 +15,45 @@ using namespace uhd::rfnoc;
using namespace magnesium;
namespace {
- typedef magnesium_radio_ctrl_impl::rx_band rx_band;
- typedef magnesium_radio_ctrl_impl::tx_band tx_band;
+typedef magnesium_radio_ctrl_impl::rx_band rx_band;
+typedef magnesium_radio_ctrl_impl::tx_band tx_band;
- const size_t TX_LOWBAND = 0;
- const size_t TX_HIGHBAND = 1;
- const size_t RX_LOWBAND = 0;
- const size_t RX_MIDBAND = 1;
- const size_t RX_HIGHBAND = 2;
+const size_t TX_LOWBAND = 0;
+const size_t TX_HIGHBAND = 1;
+const size_t RX_LOWBAND = 0;
+const size_t RX_MIDBAND = 1;
+const size_t RX_HIGHBAND = 2;
- size_t map_tx_band(const tx_band band)
- {
- if (band == tx_band::LOWBAND) {
- return TX_LOWBAND;
- }
- return TX_HIGHBAND;
+size_t map_tx_band(const tx_band band)
+{
+ if (band == tx_band::LOWBAND) {
+ return TX_LOWBAND;
}
+ return TX_HIGHBAND;
+}
- size_t map_rx_band(const rx_band band)
- {
- if (band == rx_band::LOWBAND) {
- return RX_LOWBAND;
- }
- if (band == rx_band::BAND0 or
- band == rx_band::BAND1 or
- band == rx_band::BAND2 or
- band == rx_band::BAND3) {
- return RX_MIDBAND;
- }
- return RX_HIGHBAND;
+size_t map_rx_band(const rx_band band)
+{
+ if (band == rx_band::LOWBAND) {
+ return RX_LOWBAND;
+ }
+ if (band == rx_band::BAND0 or band == rx_band::BAND1 or band == rx_band::BAND2
+ or band == rx_band::BAND3) {
+ return RX_MIDBAND;
}
+ return RX_HIGHBAND;
+}
- //! Maps gain index -> gain_tuple_t
- //
- // Note: This is an int, for easier lookups. We're basically hardcoding the
- // knowledge that the gain map has a 1 dB granularity.
- using gain_tuple_map_t = std::map<int, gain_tuple_t>;
+//! Maps gain index -> gain_tuple_t
+//
+// Note: This is an int, for easier lookups. We're basically hardcoding the
+// knowledge that the gain map has a 1 dB granularity.
+using gain_tuple_map_t = std::map<int, gain_tuple_t>;
- //! Maps band -> gain_tuple_map_t
- using gain_tables_t = std::map<size_t, gain_tuple_map_t>;
+//! Maps band -> gain_tuple_map_t
+using gain_tables_t = std::map<size_t, gain_tuple_map_t>;
- // clang-format off
+// clang-format off
/*! RX gain tables
*/
const gain_tables_t rx_gain_tables = {
@@ -437,53 +435,38 @@ namespace {
{65, {0, 0, false}}
}}
}; /* tx_gain_tables */
- // clang-format on
+// clang-format on
- gain_tuple_t fine_tune_ad9371_att(
- const gain_tuple_t gain_tuple,
- const double gain_index
- ) {
- // Here, we hardcode the half-dB steps. We soak up all half-dB
- // steps by twiddling the AD9371 attenuation, but we need to make
- // sure we don't make it negative.
- if (gain_index - int(gain_index) >= .5) {
- gain_tuple_t gt2 = gain_tuple;
- gt2.ad9371_att = std::max(0.0, gain_tuple.ad9371_att - .5);
- return gt2;
- }
- return gain_tuple;
+gain_tuple_t fine_tune_ad9371_att(const gain_tuple_t gain_tuple, const double gain_index)
+{
+ // Here, we hardcode the half-dB steps. We soak up all half-dB
+ // steps by twiddling the AD9371 attenuation, but we need to make
+ // sure we don't make it negative.
+ if (gain_index - int(gain_index) >= .5) {
+ gain_tuple_t gt2 = gain_tuple;
+ gt2.ad9371_att = std::max(0.0, gain_tuple.ad9371_att - .5);
+ return gt2;
}
+ return gain_tuple;
+}
-} /* namespace ANON */
+} // namespace
gain_tuple_t magnesium::get_rx_gain_tuple(
- const double gain_index,
- const magnesium_radio_ctrl_impl::rx_band band
-) {
- UHD_ASSERT_THROW(
- gain_index <= ALL_RX_MAX_GAIN and gain_index >= ALL_RX_MIN_GAIN
- );
- auto &gain_table = rx_gain_tables.at(map_rx_band(band));
+ const double gain_index, const magnesium_radio_ctrl_impl::rx_band band)
+{
+ UHD_ASSERT_THROW(gain_index <= ALL_RX_MAX_GAIN and gain_index >= ALL_RX_MIN_GAIN);
+ auto& gain_table = rx_gain_tables.at(map_rx_band(band));
const int gain_index_truncd = int(gain_index);
- return fine_tune_ad9371_att(
- gain_table.at(gain_index_truncd),
- gain_index
- );
+ return fine_tune_ad9371_att(gain_table.at(gain_index_truncd), gain_index);
}
gain_tuple_t magnesium::get_tx_gain_tuple(
- const double gain_index,
- const magnesium_radio_ctrl_impl::tx_band band
-) {
- UHD_ASSERT_THROW(
- gain_index <= ALL_TX_MAX_GAIN and gain_index >= ALL_TX_MIN_GAIN
- );
- auto &gain_table = tx_gain_tables.at(map_tx_band(band));
+ const double gain_index, const magnesium_radio_ctrl_impl::tx_band band)
+{
+ UHD_ASSERT_THROW(gain_index <= ALL_TX_MAX_GAIN and gain_index >= ALL_TX_MIN_GAIN);
+ auto& gain_table = tx_gain_tables.at(map_tx_band(band));
const int gain_index_truncd = int(gain_index);
- return fine_tune_ad9371_att(
- gain_table.at(gain_index_truncd),
- gain_index
- );
+ return fine_tune_ad9371_att(gain_table.at(gain_index_truncd), gain_index);
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp b/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp
index e36bdd59c..8769b44ac 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp
@@ -31,16 +31,12 @@ struct gain_tuple_t
/*! Given a gain index, return a tuple of gain-related settings (Rx)
*/
gain_tuple_t get_rx_gain_tuple(
- const double gain_index,
- const uhd::rfnoc::magnesium_radio_ctrl_impl::rx_band band_
-);
+ const double gain_index, const uhd::rfnoc::magnesium_radio_ctrl_impl::rx_band band_);
/*! Given a gain index, return a tuple of gain-related settings (Tx)
*/
gain_tuple_t get_tx_gain_tuple(
- const double gain_index,
- const uhd::rfnoc::magnesium_radio_ctrl_impl::tx_band band_
-);
+ const double gain_index, const uhd::rfnoc::magnesium_radio_ctrl_impl::tx_band band_);
} /* namespace magnesium */
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_cpld.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_cpld.cpp
index 9ddb2cfcb..3c66a3b62 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_cpld.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_cpld.cpp
@@ -4,37 +4,32 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "magnesium_radio_ctrl_impl.hpp"
-#include "magnesium_cpld_ctrl.hpp"
#include "magnesium_constants.hpp"
+#include "magnesium_cpld_ctrl.hpp"
+#include "magnesium_radio_ctrl_impl.hpp"
#include <uhd/utils/log.hpp>
using namespace uhd;
using namespace uhd::usrp;
using namespace uhd::rfnoc;
-void magnesium_radio_ctrl_impl::_identify_with_leds(
- const int identify_duration
-) {
- auto end_time = std::chrono::steady_clock::now()
- + std::chrono::seconds(identify_duration);
+void magnesium_radio_ctrl_impl::_identify_with_leds(const int identify_duration)
+{
+ auto end_time =
+ std::chrono::steady_clock::now() + std::chrono::seconds(identify_duration);
bool led_state = true;
while (std::chrono::steady_clock::now() < end_time) {
- _cpld->set_tx_atr_bits(
- magnesium_cpld_ctrl::BOTH,
+ _cpld->set_tx_atr_bits(magnesium_cpld_ctrl::BOTH,
magnesium_cpld_ctrl::ANY,
led_state,
false,
false,
- true
- );
- _cpld->set_rx_input_atr_bits(
- magnesium_cpld_ctrl::BOTH,
+ true);
+ _cpld->set_rx_input_atr_bits(magnesium_cpld_ctrl::BOTH,
magnesium_cpld_ctrl::ANY,
magnesium_cpld_ctrl::RX_SW1_TXRXINPUT, /* whatever */
led_state,
- led_state
- );
+ led_state);
led_state = !led_state;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
@@ -44,27 +39,26 @@ void magnesium_radio_ctrl_impl::_identify_with_leds(
void magnesium_radio_ctrl_impl::_update_atr_switches(
const magnesium_cpld_ctrl::chan_sel_t chan,
const direction_t dir,
- const std::string &ant
-){
+ const std::string& ant)
+{
if (dir == RX_DIRECTION or dir == DX_DIRECTION) {
// These default values work for RX2
bool trx_led = false;
bool rx2_led = true;
- auto rx_sw1 = magnesium_cpld_ctrl::RX_SW1_RX2INPUT;
+ auto rx_sw1 = magnesium_cpld_ctrl::RX_SW1_RX2INPUT;
// The TRX switch in TX-idle mode defaults to TX-on mode. When TX is
// off, and we're receiving on TX/RX however, we need to point TRX to
// RX SW1. In all other cases, a TX state toggle (on to idle or vice
// versa) won't trigger a change of the TRX switch.
auto sw_trx = _sw_trx[chan];
- UHD_LOG_TRACE(unique_id(),
- "Updating all RX-ATR related switches for antenna==" << ant);
+ UHD_LOG_TRACE(
+ unique_id(), "Updating all RX-ATR related switches for antenna==" << ant);
if (ant == "TX/RX") {
- rx_sw1 = magnesium_cpld_ctrl::RX_SW1_TRXSWITCHOUTPUT;
- sw_trx = magnesium_cpld_ctrl::SW_TRX_RXCHANNELPATH;
+ rx_sw1 = magnesium_cpld_ctrl::RX_SW1_TRXSWITCHOUTPUT;
+ sw_trx = magnesium_cpld_ctrl::SW_TRX_RXCHANNELPATH;
trx_led = true;
rx2_led = false;
- }
- else if (ant == "CAL") {
+ } else if (ant == "CAL") {
// It makes intuitive sense to illuminate the green TX/RX LED when
// receiving on CAL (because it goes over to the TX/RX port), but
// the problem is that CAL is only useful when we're both TXing and
@@ -72,35 +66,30 @@ void magnesium_radio_ctrl_impl::_update_atr_switches(
// So, for CAL, we light up the green RX2 LED.
trx_led = false;
rx2_led = true;
- rx_sw1 = magnesium_cpld_ctrl::RX_SW1_TXRXINPUT;
- }
- else if (ant == "LOCAL") {
+ rx_sw1 = magnesium_cpld_ctrl::RX_SW1_TXRXINPUT;
+ } else if (ant == "LOCAL") {
rx_sw1 = magnesium_cpld_ctrl::RX_SW1_RXLOCALINPUT;
}
- _cpld->set_rx_input_atr_bits(
- chan,
+ _cpld->set_rx_input_atr_bits(chan,
magnesium_cpld_ctrl::ON,
rx_sw1,
trx_led,
rx2_led,
true /* defer commit */
);
- _cpld->set_rx_atr_bits(
- chan,
+ _cpld->set_rx_atr_bits(chan,
magnesium_cpld_ctrl::ON,
- true, /* amp on */
- true, /* mykonos on */
- true /* defer commit */
+ true, /* amp on */
+ true, /* mykonos on */
+ true /* defer commit */
);
- _cpld->set_rx_atr_bits(
- chan,
+ _cpld->set_rx_atr_bits(chan,
magnesium_cpld_ctrl::IDLE,
- true, /* amp stays on */
- true, /* mykonos on */
- true /* defer commit */
+ true, /* amp stays on */
+ true, /* mykonos on */
+ true /* defer commit */
);
- _cpld->set_trx_sw_atr_bits(
- chan,
+ _cpld->set_trx_sw_atr_bits(chan,
magnesium_cpld_ctrl::IDLE, /* idle here means TX is off */
sw_trx,
false /* don't defer commit */
@@ -108,220 +97,203 @@ void magnesium_radio_ctrl_impl::_update_atr_switches(
}
if (dir == TX_DIRECTION or dir == DX_DIRECTION) {
UHD_LOG_TRACE(unique_id(), "Updating all TX-ATR related switches...");
- _cpld->set_tx_atr_bits(
- chan,
+ _cpld->set_tx_atr_bits(chan,
magnesium_cpld_ctrl::ON,
true, /* LED on */
true, /* PA on */
true, /* AMP on */
true, /* Myk on */
- true /* defer commit */
+ true /* defer commit */
);
// Leaving PA on since we want shorter tx settling time.
- _cpld->set_tx_atr_bits(
- chan,
+ _cpld->set_tx_atr_bits(chan,
magnesium_cpld_ctrl::IDLE,
false, /* LED off */
true, /* PA on */
true, /* AMP on */
- true, /* Myk on */
- false /* don't defer commit */
+ true, /* Myk on */
+ false /* don't defer commit */
);
};
}
-void magnesium_radio_ctrl_impl::_update_rx_freq_switches(
- const double freq,
+void magnesium_radio_ctrl_impl::_update_rx_freq_switches(const double freq,
const bool bypass_lnas,
- const magnesium_cpld_ctrl::chan_sel_t chan_sel
-) {
+ const magnesium_cpld_ctrl::chan_sel_t chan_sel)
+{
UHD_LOG_TRACE(unique_id(),
- "Update all RX freq related switches. f=" << freq << " Hz, "
- "bypass LNAS: " << (bypass_lnas ? "Yes" : "No") << ", chan=" << chan_sel
- );
- auto rx_sw2 = magnesium_cpld_ctrl::RX_SW2_BYPASSPATHTOSWITCH6;
- auto rx_sw3 = magnesium_cpld_ctrl::RX_SW3_SHUTDOWNSW3;
- auto rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2100X2850MHZFROM;
- auto rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER1100X1575MHZFROM;
- auto rx_sw6 = magnesium_cpld_ctrl::RX_SW6_BYPASSPATHFROMSWITCH2;
- const auto band = _map_freq_to_rx_band(freq);
+ "Update all RX freq related switches. f=" << freq
+ << " Hz, "
+ "bypass LNAS: "
+ << (bypass_lnas ? "Yes" : "No")
+ << ", chan=" << chan_sel);
+ auto rx_sw2 = magnesium_cpld_ctrl::RX_SW2_BYPASSPATHTOSWITCH6;
+ auto rx_sw3 = magnesium_cpld_ctrl::RX_SW3_SHUTDOWNSW3;
+ auto rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2100X2850MHZFROM;
+ auto rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER1100X1575MHZFROM;
+ auto rx_sw6 = magnesium_cpld_ctrl::RX_SW6_BYPASSPATHFROMSWITCH2;
+ const auto band = _map_freq_to_rx_band(freq);
const bool is_lowband = (band == rx_band::LOWBAND);
- const auto select_lowband_mixer_path = is_lowband ?
- magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_LOBAND :
- magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_BYPASS;
+ const auto select_lowband_mixer_path =
+ is_lowband ? magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_LOBAND
+ : magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_BYPASS;
const bool enable_lowband_mixer = is_lowband;
const bool rx_lna1_enable =
- not bypass_lnas and (
- band == rx_band::BAND4 or
- band == rx_band::BAND5 or
- band == rx_band::BAND6);
+ not bypass_lnas
+ and (band == rx_band::BAND4 or band == rx_band::BAND5 or band == rx_band::BAND6);
const bool rx_lna2_enable = not bypass_lnas and not rx_lna1_enable;
UHD_LOG_TRACE(unique_id(),
- " Enabling LNA1: " << (rx_lna1_enable ? "Yes" : "No") <<
- " Enabling LNA2: " << (rx_lna2_enable ? "Yes" : "No"));
+ " Enabling LNA1: " << (rx_lna1_enable ? "Yes" : "No")
+ << " Enabling LNA2: " << (rx_lna2_enable ? "Yes" : "No"));
// All the defaults are OK when using the bypass path.
if (not bypass_lnas) {
- switch(band) {
- case rx_band::LOWBAND:
- case rx_band::BAND0:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0490LPMHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0490LPMHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
- break;
- case rx_band::BAND1:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0440X0530MHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
- break;
- case rx_band::BAND2:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0650X1000MHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0650X1000MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
- break;
- case rx_band::BAND3:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER1100X1575MHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER1100X1575MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
- break;
- case rx_band::BAND4:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER1600X2250MHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER1600X2250MHZFROM;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
- break;
- case rx_band::BAND5:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER2100X2850MHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2100X2850MHZFROM;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
- break;
- case rx_band::BAND6:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_UPPERFILTERBANKTOSWITCH4;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_SHUTDOWNSW3;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
- break;
- case rx_band::INVALID_BAND:
- UHD_LOG_ERROR(unique_id(),
- "Cannot map RX frequency to band: " << freq);
- break;
- default:
- UHD_THROW_INVALID_CODE_PATH();
+ switch (band) {
+ case rx_band::LOWBAND:
+ case rx_band::BAND0:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0490LPMHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0490LPMHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
+ break;
+ case rx_band::BAND1:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0440X0530MHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
+ break;
+ case rx_band::BAND2:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0650X1000MHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0650X1000MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
+ break;
+ case rx_band::BAND3:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER1100X1575MHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER1100X1575MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
+ break;
+ case rx_band::BAND4:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER1600X2250MHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER1600X2250MHZFROM;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
+ break;
+ case rx_band::BAND5:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER2100X2850MHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2100X2850MHZFROM;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
+ break;
+ case rx_band::BAND6:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_UPPERFILTERBANKTOSWITCH4;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_SHUTDOWNSW3;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
+ break;
+ case rx_band::INVALID_BAND:
+ UHD_LOG_ERROR(unique_id(), "Cannot map RX frequency to band: " << freq);
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
- _cpld->set_rx_lna_atr_bits(
- chan_sel,
+ _cpld->set_rx_lna_atr_bits(chan_sel,
magnesium_cpld_ctrl::ANY,
rx_lna1_enable,
rx_lna2_enable,
true /* defer commit */
);
- _cpld->set_rx_switches(
- chan_sel,
+ _cpld->set_rx_switches(chan_sel,
rx_sw2,
rx_sw3,
rx_sw4,
rx_sw5,
rx_sw6,
select_lowband_mixer_path,
- enable_lowband_mixer
- );
+ enable_lowband_mixer);
}
-void magnesium_radio_ctrl_impl::_update_tx_freq_switches(
- const double freq,
+void magnesium_radio_ctrl_impl::_update_tx_freq_switches(const double freq,
const bool bypass_amp,
- const magnesium_cpld_ctrl::chan_sel_t chan_sel
-){
+ const magnesium_cpld_ctrl::chan_sel_t chan_sel)
+{
UHD_LOG_TRACE(unique_id(),
- "Update all TX freq related switches. f=" << freq << " Hz, "
- "bypass amp: " << (bypass_amp ? "Yes" : "No") << ", chan=" << chan_sel
- );
- auto tx_sw1 = magnesium_cpld_ctrl::TX_SW1_SHUTDOWNTXSW1;
- auto tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP6400MHZ;
- auto tx_sw3 = magnesium_cpld_ctrl::TX_SW3_BYPASSPATHTOTRXSW;
- const auto band = _map_freq_to_tx_band(freq);
+ "Update all TX freq related switches. f=" << freq
+ << " Hz, "
+ "bypass amp: "
+ << (bypass_amp ? "Yes" : "No")
+ << ", chan=" << chan_sel);
+ auto tx_sw1 = magnesium_cpld_ctrl::TX_SW1_SHUTDOWNTXSW1;
+ auto tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP6400MHZ;
+ auto tx_sw3 = magnesium_cpld_ctrl::TX_SW3_BYPASSPATHTOTRXSW;
+ const auto band = _map_freq_to_tx_band(freq);
const bool is_lowband = (band == tx_band::LOWBAND);
- const auto select_lowband_mixer_path = is_lowband ?
- magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_LOBAND :
- magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_BYPASS;
+ const auto select_lowband_mixer_path =
+ is_lowband ? magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_LOBAND
+ : magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_BYPASS;
const bool enable_lowband_mixer = is_lowband;
// Defaults are fine for bypassing the amp stage
if (bypass_amp) {
_sw_trx[chan_sel] = magnesium_cpld_ctrl::SW_TRX_BYPASSPATHTOTXSW3;
} else {
- // Set filters based on frequency
- switch(band) {
- case tx_band::LOWBAND:
- _sw_trx[chan_sel] =
- magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
- tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP0800MHZ;
- tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP0800MHZ;
- tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
- break;
- case tx_band::BAND0:
- _sw_trx[chan_sel] =
- magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
- tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP0800MHZ;
- tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP0800MHZ;
- tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
- break;
- case tx_band::BAND1:
- _sw_trx[chan_sel] =
- magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
- tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP1700MHZ;
- tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP1700MHZ;
- tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
- break;
- case tx_band::BAND2:
- _sw_trx[chan_sel] =
- magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
- tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP3400MHZ;
- tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP3400MHZ;
- tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
- break;
- case tx_band::BAND3:
- _sw_trx[chan_sel] =
- magnesium_cpld_ctrl::SW_TRX_FROMTXUPPERFILTERBANKLP6400MHZ;
- tx_sw1 = magnesium_cpld_ctrl::TX_SW1_SHUTDOWNTXSW1;
- tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP6400MHZ;
- tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
- break;
- case tx_band::INVALID_BAND:
- UHD_LOG_ERROR(unique_id(),
- "Cannot map TX frequency to band: " << freq);
- break;
- default:
- UHD_THROW_INVALID_CODE_PATH();
+ // Set filters based on frequency
+ switch (band) {
+ case tx_band::LOWBAND:
+ _sw_trx[chan_sel] = magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
+ tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP0800MHZ;
+ tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP0800MHZ;
+ tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
+ break;
+ case tx_band::BAND0:
+ _sw_trx[chan_sel] = magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
+ tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP0800MHZ;
+ tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP0800MHZ;
+ tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
+ break;
+ case tx_band::BAND1:
+ _sw_trx[chan_sel] = magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
+ tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP1700MHZ;
+ tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP1700MHZ;
+ tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
+ break;
+ case tx_band::BAND2:
+ _sw_trx[chan_sel] = magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
+ tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP3400MHZ;
+ tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP3400MHZ;
+ tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
+ break;
+ case tx_band::BAND3:
+ _sw_trx[chan_sel] =
+ magnesium_cpld_ctrl::SW_TRX_FROMTXUPPERFILTERBANKLP6400MHZ;
+ tx_sw1 = magnesium_cpld_ctrl::TX_SW1_SHUTDOWNTXSW1;
+ tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP6400MHZ;
+ tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
+ break;
+ case tx_band::INVALID_BAND:
+ UHD_LOG_ERROR(unique_id(), "Cannot map TX frequency to band: " << freq);
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
_cpld->set_trx_sw_atr_bits(
- chan_sel,
- magnesium_cpld_ctrl::ON,
- _sw_trx[chan_sel],
- true /* defer commit */
+ chan_sel, magnesium_cpld_ctrl::ON, _sw_trx[chan_sel], true /* defer commit */
);
- _cpld->set_tx_switches(
- chan_sel,
+ _cpld->set_tx_switches(chan_sel,
tx_sw1,
tx_sw2,
tx_sw3,
select_lowband_mixer_path,
enable_lowband_mixer,
- magnesium_cpld_ctrl::ON
- );
+ magnesium_cpld_ctrl::ON);
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_gain.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_gain.cpp
index e58e1706e..1370fde3a 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_gain.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_gain.cpp
@@ -4,9 +4,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "magnesium_radio_ctrl_impl.hpp"
-#include "magnesium_gain_table.hpp"
#include "magnesium_constants.hpp"
+#include "magnesium_gain_table.hpp"
+#include "magnesium_radio_ctrl_impl.hpp"
#include <uhd/utils/log.hpp>
using namespace uhd;
@@ -15,72 +15,69 @@ using namespace uhd::rfnoc;
using namespace magnesium;
double magnesium_radio_ctrl_impl::_set_all_gain(
- const double gain,
- const double freq,
- const size_t chan,
- const direction_t dir
-) {
+ const double gain, const double freq, const size_t chan, const direction_t dir)
+{
UHD_LOG_TRACE(unique_id(),
- __func__ << "(gain=" << gain << "dB, "
- "freq=" << freq << " Hz, "
- "chan=" << chan << ", "
- "dir=" << dir);
+ __func__ << "(gain=" << gain
+ << "dB, "
+ "freq="
+ << freq
+ << " Hz, "
+ "chan="
+ << chan
+ << ", "
+ "dir="
+ << dir);
const size_t ad9371_chan = chan;
- auto chan_sel = static_cast<magnesium_cpld_ctrl::chan_sel_t>(chan);
- gain_tuple_t gain_tuple = (dir == RX_DIRECTION) ?
- get_rx_gain_tuple(gain, _map_freq_to_rx_band(freq)):
- get_tx_gain_tuple(gain, _map_freq_to_tx_band(freq));
+ auto chan_sel = static_cast<magnesium_cpld_ctrl::chan_sel_t>(chan);
+ gain_tuple_t gain_tuple = (dir == RX_DIRECTION)
+ ? get_rx_gain_tuple(gain, _map_freq_to_rx_band(freq))
+ : get_tx_gain_tuple(gain, _map_freq_to_tx_band(freq));
- if (_gain_profile[dir] == "manual"){
+ if (_gain_profile[dir] == "manual") {
UHD_LOG_TRACE(unique_id(), "Manual gain mode. Getting gain from property tree.");
- gain_tuple = {
- DSA_MAX_GAIN - _dsa_att[dir],
- ((dir == RX_DIRECTION) ? AD9371_MAX_RX_GAIN : AD9371_MAX_TX_GAIN) - _ad9371_att[dir],
+ gain_tuple = {DSA_MAX_GAIN - _dsa_att[dir],
+ ((dir == RX_DIRECTION) ? AD9371_MAX_RX_GAIN : AD9371_MAX_TX_GAIN)
+ - _ad9371_att[dir],
_amp_bypass[dir]};
- }else if (_gain_profile[dir] == "default"){
+ } else if (_gain_profile[dir] == "default") {
UHD_LOG_TRACE(unique_id(), "Getting gain from gain table.");
- }else {
- UHD_LOG_ERROR(unique_id(), "Unsupported gain mode: " << _gain_profile[dir])
+ } else {
+ UHD_LOG_ERROR(unique_id(), "Unsupported gain mode: " << _gain_profile[dir])
}
const double ad9371_gain =
- ((dir == RX_DIRECTION) ? AD9371_MAX_RX_GAIN : AD9371_MAX_TX_GAIN)
+ ((dir == RX_DIRECTION) ? AD9371_MAX_RX_GAIN : AD9371_MAX_TX_GAIN)
- gain_tuple.ad9371_att;
UHD_LOG_TRACE(unique_id(),
- "AD9371 attenuation==" << gain_tuple.ad9371_att << " dB, "
- "AD9371 gain==" << ad9371_gain << " dB, "
- "DSA attenuation == " << gain_tuple.dsa_att << " dB."
- );
+ "AD9371 attenuation==" << gain_tuple.ad9371_att
+ << " dB, "
+ "AD9371 gain=="
+ << ad9371_gain
+ << " dB, "
+ "DSA attenuation == "
+ << gain_tuple.dsa_att << " dB.");
_ad9371->set_gain(ad9371_gain, ad9371_chan, dir);
_dsa_set_att(gain_tuple.dsa_att, chan, dir);
if (dir == RX_DIRECTION or dir == DX_DIRECTION) {
- _all_rx_gain = gain;
+ _all_rx_gain = gain;
_rx_bypass_lnas = gain_tuple.bypass;
- _update_rx_freq_switches(
- this->get_rx_frequency(chan),
- _rx_bypass_lnas,
- chan_sel
- );
+ _update_rx_freq_switches(this->get_rx_frequency(chan), _rx_bypass_lnas, chan_sel);
}
if (dir == TX_DIRECTION or dir == DX_DIRECTION) {
- _all_tx_gain = gain;
+ _all_tx_gain = gain;
_tx_bypass_amp = gain_tuple.bypass;
- _update_tx_freq_switches(
- this->get_tx_frequency(chan),
- _tx_bypass_amp,
- chan_sel
- );
+ _update_tx_freq_switches(this->get_tx_frequency(chan), _tx_bypass_amp, chan_sel);
}
return gain;
}
double magnesium_radio_ctrl_impl::_get_all_gain(
- const size_t /* chan */,
- const direction_t dir
-) {
+ const size_t /* chan */, const direction_t dir)
+{
UHD_LOG_TRACE(unique_id(), "Getting all gain ");
if (dir == RX_DIRECTION) {
- return _all_rx_gain;
+ return _all_rx_gain;
}
return _all_tx_gain;
}
@@ -89,14 +86,12 @@ double magnesium_radio_ctrl_impl::_get_all_gain(
* DSA Controls
*****************************************************************************/
double magnesium_radio_ctrl_impl::_dsa_set_att(
- const double att,
- const size_t chan,
- const direction_t dir
-) {
+ const double att, const size_t chan, const direction_t dir)
+{
UHD_LOG_TRACE(unique_id(),
- __func__ <<
- "(att=" << "att dB, chan=" << chan << ", dir=" << dir << ")")
- const uint32_t dsa_val = 2*att;
+ __func__ << "(att="
+ << "att dB, chan=" << chan << ", dir=" << dir << ")")
+ const uint32_t dsa_val = 2 * att;
_set_dsa_val(chan, dir, dsa_val);
if (dir == RX_DIRECTION or dir == DX_DIRECTION) {
@@ -109,33 +104,29 @@ double magnesium_radio_ctrl_impl::_dsa_set_att(
}
double magnesium_radio_ctrl_impl::_dsa_get_att(
- const size_t /*chan*/,
- const direction_t dir
-) {
+ const size_t /*chan*/, const direction_t dir)
+{
if (dir == RX_DIRECTION) {
- return _dsa_rx_att;
+ return _dsa_rx_att;
}
return _dsa_tx_att;
}
void magnesium_radio_ctrl_impl::_set_dsa_val(
- const size_t chan,
- const direction_t dir,
- const uint32_t dsa_val
-) {
+ const size_t chan, const direction_t dir, const uint32_t dsa_val)
+{
// The DSA register holds 12 bits. The lower 6 bits are for RX, the upper
// 6 bits are for TX.
- if (dir == RX_DIRECTION or dir == DX_DIRECTION){
+ if (dir == RX_DIRECTION or dir == DX_DIRECTION) {
UHD_LOG_TRACE(unique_id(),
__func__ << "(chan=" << chan << ", dir=RX"
- << ", dsa_val=" << dsa_val << ")")
+ << ", dsa_val=" << dsa_val << ")")
_gpio[chan]->set_gpio_out(dsa_val, 0x003F);
}
- if (dir == TX_DIRECTION or dir == DX_DIRECTION){
+ if (dir == TX_DIRECTION or dir == DX_DIRECTION) {
UHD_LOG_TRACE(unique_id(),
__func__ << "(chan=" << chan << ", dir=TX"
- << ", dsa_val=" << dsa_val << ")")
- _gpio[chan]->set_gpio_out(dsa_val<<6, 0x0FC0);
+ << ", dsa_val=" << dsa_val << ")")
+ _gpio[chan]->set_gpio_out(dsa_val << 6, 0x0FC0);
}
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
index 952cebdf8..c216b0777 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
@@ -7,20 +7,20 @@
#include "magnesium_radio_ctrl_impl.hpp"
#include "magnesium_constants.hpp"
#include "magnesium_gain_table.hpp"
-#include <uhd/utils/log.hpp>
+#include <uhd/exception.hpp>
#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/transport/chdr.hpp>
-#include <uhd/utils/algorithm.hpp>
-#include <uhd/utils/math.hpp>
#include <uhd/types/direction.hpp>
#include <uhd/types/eeprom.hpp>
-#include <uhd/exception.hpp>
+#include <uhd/utils/algorithm.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/math.hpp>
#include <boost/algorithm/string.hpp>
-#include <boost/make_shared.hpp>
#include <boost/format.hpp>
-#include <sstream>
+#include <boost/make_shared.hpp>
#include <cmath>
#include <cstdlib>
+#include <sstream>
using namespace uhd;
using namespace uhd::usrp;
@@ -28,76 +28,69 @@ using namespace uhd::rfnoc;
using namespace uhd::math::fp_compare;
namespace {
- /**************************************************************************
- * ADF4351 Controls
- *************************************************************************/
- /*!
- * \param lo_iface Reference to the LO object
- * \param freq Frequency (in Hz) of the tone to be generated from the LO
- * \param ref_clock_freq Frequency (in Hz) of the reference clock at the
- * PLL input of the LO
- * \param int_n_mode Integer-N mode on or off
- */
- double _lo_set_frequency(
- adf435x_iface::sptr lo_iface,
- const double freq,
- const double ref_clock_freq,
- const bool int_n_mode
- ) {
- UHD_LOG_TRACE("MG/ADF4351",
- "Attempting to tune low band LO to " << freq <<
- " Hz with ref clock freq " << ref_clock_freq);
- lo_iface->set_feedback_select(adf435x_iface::FB_SEL_DIVIDED);
- lo_iface->set_reference_freq(ref_clock_freq);
- lo_iface->set_prescaler(adf435x_iface::PRESCALER_4_5);
- const double actual_freq = lo_iface->set_frequency(freq, int_n_mode);
- lo_iface->set_output_power(
- adf435x_iface::RF_OUTPUT_A,
- adf435x_iface::OUTPUT_POWER_2DBM
- );
- lo_iface->set_output_power(
- adf435x_iface::RF_OUTPUT_B,
- adf435x_iface::OUTPUT_POWER_2DBM
- );
- lo_iface->set_charge_pump_current(
- adf435x_iface::CHARGE_PUMP_CURRENT_0_31MA);
- return actual_freq;
- }
-
- /*! Configure and enable LO
- *
- * Will tune it to requested frequency and enable outputs.
- *
- * \param lo_iface Reference to the LO object
- * \param lo_freq Frequency (in Hz) of the tone to be generated from the LO
- * \param ref_clock_freq Frequency (in Hz) of the reference clock at the
- * PLL input of the LO
- * \param int_n_mode Integer-N mode on or off
- * \returns the actual frequency the LO is running at
- */
- double _lo_enable(
- adf435x_iface::sptr lo_iface,
- const double lo_freq,
- const double ref_clock_freq,
- const bool int_n_mode
- ) {
- const double actual_lo_freq =
- _lo_set_frequency(lo_iface, lo_freq, ref_clock_freq, int_n_mode);
- lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_A, true);
- lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_B, true);
- lo_iface->commit();
- return actual_lo_freq;
- }
+/**************************************************************************
+ * ADF4351 Controls
+ *************************************************************************/
+/*!
+ * \param lo_iface Reference to the LO object
+ * \param freq Frequency (in Hz) of the tone to be generated from the LO
+ * \param ref_clock_freq Frequency (in Hz) of the reference clock at the
+ * PLL input of the LO
+ * \param int_n_mode Integer-N mode on or off
+ */
+double _lo_set_frequency(adf435x_iface::sptr lo_iface,
+ const double freq,
+ const double ref_clock_freq,
+ const bool int_n_mode)
+{
+ UHD_LOG_TRACE("MG/ADF4351",
+ "Attempting to tune low band LO to " << freq << " Hz with ref clock freq "
+ << ref_clock_freq);
+ lo_iface->set_feedback_select(adf435x_iface::FB_SEL_DIVIDED);
+ lo_iface->set_reference_freq(ref_clock_freq);
+ lo_iface->set_prescaler(adf435x_iface::PRESCALER_4_5);
+ const double actual_freq = lo_iface->set_frequency(freq, int_n_mode);
+ lo_iface->set_output_power(
+ adf435x_iface::RF_OUTPUT_A, adf435x_iface::OUTPUT_POWER_2DBM);
+ lo_iface->set_output_power(
+ adf435x_iface::RF_OUTPUT_B, adf435x_iface::OUTPUT_POWER_2DBM);
+ lo_iface->set_charge_pump_current(adf435x_iface::CHARGE_PUMP_CURRENT_0_31MA);
+ return actual_freq;
+}
+
+/*! Configure and enable LO
+ *
+ * Will tune it to requested frequency and enable outputs.
+ *
+ * \param lo_iface Reference to the LO object
+ * \param lo_freq Frequency (in Hz) of the tone to be generated from the LO
+ * \param ref_clock_freq Frequency (in Hz) of the reference clock at the
+ * PLL input of the LO
+ * \param int_n_mode Integer-N mode on or off
+ * \returns the actual frequency the LO is running at
+ */
+double _lo_enable(adf435x_iface::sptr lo_iface,
+ const double lo_freq,
+ const double ref_clock_freq,
+ const bool int_n_mode)
+{
+ const double actual_lo_freq =
+ _lo_set_frequency(lo_iface, lo_freq, ref_clock_freq, int_n_mode);
+ lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_A, true);
+ lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_B, true);
+ lo_iface->commit();
+ return actual_lo_freq;
+}
- /*! Disable LO
- */
- void _lo_disable(adf435x_iface::sptr lo_iface)
- {
- lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_A, false);
- lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_B, false);
- lo_iface->commit();
- }
+/*! Disable LO
+ */
+void _lo_disable(adf435x_iface::sptr lo_iface)
+{
+ lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_A, false);
+ lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_B, false);
+ lo_iface->commit();
}
+} // namespace
/******************************************************************************
@@ -107,10 +100,9 @@ UHD_RFNOC_RADIO_BLOCK_CONSTRUCTOR(magnesium_radio_ctrl)
{
UHD_LOG_TRACE(unique_id(), "Entering magnesium_radio_ctrl_impl ctor...");
const char radio_slot_name[2] = {'A', 'B'};
- _radio_slot = radio_slot_name[get_block_id().get_block_count()];
+ _radio_slot = radio_slot_name[get_block_id().get_block_count()];
UHD_LOG_TRACE(unique_id(), "Radio slot: " << _radio_slot);
- _rpc_prefix =
- (_radio_slot == "A") ? "db_0_" : "db_1_";
+ _rpc_prefix = (_radio_slot == "A") ? "db_0_" : "db_1_";
_init_defaults();
_init_peripherals();
@@ -135,17 +127,16 @@ double magnesium_radio_ctrl_impl::set_rate(double requested_rate)
const double rate = rates.clip(requested_rate);
if (!math::frequencies_are_equal(requested_rate, rate)) {
- UHD_LOG_WARNING(unique_id(),
- "Coercing requested sample rate from " << (requested_rate/1e6) <<
- " to " << (rate/1e6)
- );
+ UHD_LOG_WARNING(unique_id(),
+ "Coercing requested sample rate from " << (requested_rate / 1e6) << " to "
+ << (rate / 1e6));
}
const double current_rate = get_rate();
if (math::frequencies_are_equal(current_rate, rate)) {
- UHD_LOG_DEBUG(unique_id(),
- "Rate is already at " << rate << ". Skipping set_rate()");
- return current_rate;
+ UHD_LOG_DEBUG(
+ unique_id(), "Rate is already at " << rate << ". Skipping set_rate()");
+ return current_rate;
}
std::lock_guard<std::mutex> l(_set_lock);
@@ -159,84 +150,72 @@ double magnesium_radio_ctrl_impl::set_rate(double requested_rate)
set_tx_frequency(get_tx_frequency(0), 0);
// Gain and bandwidth need to be looped:
for (size_t radio_idx = 0; radio_idx < _get_num_radios(); radio_idx++) {
- set_rx_gain(get_rx_gain(radio_idx), radio_idx);
- set_tx_gain(get_rx_gain(radio_idx), radio_idx);
- set_rx_bandwidth(get_rx_bandwidth(radio_idx), radio_idx);
- set_tx_bandwidth(get_tx_bandwidth(radio_idx), radio_idx);
+ set_rx_gain(get_rx_gain(radio_idx), radio_idx);
+ set_tx_gain(get_rx_gain(radio_idx), radio_idx);
+ set_rx_bandwidth(get_rx_bandwidth(radio_idx), radio_idx);
+ set_tx_bandwidth(get_tx_bandwidth(radio_idx), radio_idx);
}
radio_ctrl_impl::set_rate(new_rate);
return new_rate;
}
-void magnesium_radio_ctrl_impl::set_tx_antenna(
- const std::string &ant,
- const size_t chan
-) {
+void magnesium_radio_ctrl_impl::set_tx_antenna(const std::string& ant, const size_t chan)
+{
if (ant != get_tx_antenna(chan)) {
- throw uhd::value_error(str(
- boost::format("[%s] Requesting invalid TX antenna value: %s")
- % unique_id()
- % ant
- ));
+ throw uhd::value_error(
+ str(boost::format("[%s] Requesting invalid TX antenna value: %s")
+ % unique_id() % ant));
}
// We can't actually set the TX antenna, so let's stop here.
}
-void magnesium_radio_ctrl_impl::set_rx_antenna(
- const std::string &ant,
- const size_t chan
-) {
+void magnesium_radio_ctrl_impl::set_rx_antenna(const std::string& ant, const size_t chan)
+{
UHD_ASSERT_THROW(chan <= MAGNESIUM_NUM_CHANS);
- if (std::find(MAGNESIUM_RX_ANTENNAS.begin(),
- MAGNESIUM_RX_ANTENNAS.end(),
- ant) == MAGNESIUM_RX_ANTENNAS.end()) {
- throw uhd::value_error(str(
- boost::format("[%s] Requesting invalid RX antenna value: %s")
- % unique_id()
- % ant
- ));
- }
- UHD_LOG_TRACE(unique_id(),
- "Setting RX antenna to " << ant << " for chan " << chan);
- magnesium_cpld_ctrl::chan_sel_t chan_sel =
- chan == 0 ? magnesium_cpld_ctrl::CHAN1 : magnesium_cpld_ctrl::CHAN2;
+ if (std::find(MAGNESIUM_RX_ANTENNAS.begin(), MAGNESIUM_RX_ANTENNAS.end(), ant)
+ == MAGNESIUM_RX_ANTENNAS.end()) {
+ throw uhd::value_error(
+ str(boost::format("[%s] Requesting invalid RX antenna value: %s")
+ % unique_id() % ant));
+ }
+ UHD_LOG_TRACE(unique_id(), "Setting RX antenna to " << ant << " for chan " << chan);
+ magnesium_cpld_ctrl::chan_sel_t chan_sel = chan == 0 ? magnesium_cpld_ctrl::CHAN1
+ : magnesium_cpld_ctrl::CHAN2;
_update_atr_switches(chan_sel, RX_DIRECTION, ant);
radio_ctrl_impl::set_rx_antenna(ant, chan);
}
double magnesium_radio_ctrl_impl::set_tx_frequency(
- const double req_freq,
- const size_t chan
-) {
+ const double req_freq, const size_t chan)
+{
const double freq = MAGNESIUM_FREQ_RANGE.clip(req_freq);
- UHD_LOG_TRACE(unique_id(),
- "set_tx_frequency(f=" << freq << ", chan=" << chan << ")");
- _desired_rf_freq[TX_DIRECTION]=freq;
+ UHD_LOG_TRACE(unique_id(), "set_tx_frequency(f=" << freq << ", chan=" << chan << ")");
+ _desired_rf_freq[TX_DIRECTION] = freq;
std::lock_guard<std::mutex> l(_set_lock);
// We need to set the switches on both channels, because they share an LO.
// This way, if we tune channel 0 it will not put channel 1 into a bad
// state.
_update_tx_freq_switches(freq, _tx_bypass_amp, magnesium_cpld_ctrl::BOTH);
- const std::string ad9371_source = this->get_tx_lo_source(MAGNESIUM_LO1, chan);
+ const std::string ad9371_source = this->get_tx_lo_source(MAGNESIUM_LO1, chan);
const std::string adf4351_source = this->get_tx_lo_source(MAGNESIUM_LO2, chan);
UHD_ASSERT_THROW(adf4351_source == "internal");
double coerced_if_freq = freq;
if (_map_freq_to_tx_band(freq) == tx_band::LOWBAND) {
- _is_low_band[TX_DIRECTION] = true;
+ _is_low_band[TX_DIRECTION] = true;
const double desired_low_freq = MAGNESIUM_TX_IF_FREQ - freq;
coerced_if_freq =
- this->_set_tx_lo_freq(adf4351_source, MAGNESIUM_LO2, desired_low_freq, chan) + freq;
+ this->_set_tx_lo_freq(adf4351_source, MAGNESIUM_LO2, desired_low_freq, chan)
+ + freq;
UHD_LOG_TRACE(unique_id(), "coerced_if_freq = " << coerced_if_freq);
} else {
_is_low_band[TX_DIRECTION] = false;
_lo_disable(_tx_lo);
}
// external LO required to tune at 2xdesired_frequency.
- const double desired_if_freq = (ad9371_source == "internal") ?
- coerced_if_freq :
- 2*coerced_if_freq;
+ const double desired_if_freq = (ad9371_source == "internal") ? coerced_if_freq
+ : 2 * coerced_if_freq;
this->_set_tx_lo_freq(ad9371_source, MAGNESIUM_LO1, desired_if_freq, chan);
this->_update_freq(chan, TX_DIRECTION);
@@ -245,81 +224,69 @@ double magnesium_radio_ctrl_impl::set_tx_frequency(
}
void magnesium_radio_ctrl_impl::_update_gain(
- const size_t chan,
- const uhd::direction_t dir
-) {
- const std::string fe =
- (dir == TX_DIRECTION) ? "tx_frontends" : "rx_frontends";
- const double freq = (dir == TX_DIRECTION) ?
- this->get_tx_frequency(chan) :
- this->get_rx_frequency(chan);
+ const size_t chan, const uhd::direction_t dir)
+{
+ const std::string fe = (dir == TX_DIRECTION) ? "tx_frontends" : "rx_frontends";
+ const double freq = (dir == TX_DIRECTION) ? this->get_tx_frequency(chan)
+ : this->get_rx_frequency(chan);
this->_set_all_gain(this->_get_all_gain(chan, dir), freq, chan, dir);
}
void magnesium_radio_ctrl_impl::_update_freq(
- const size_t chan,
- const uhd::direction_t dir
-) {
- const std::string ad9371_source = dir == TX_DIRECTION ?
- this->get_tx_lo_source(MAGNESIUM_LO1, chan) :
- this->get_rx_lo_source(MAGNESIUM_LO1, chan)
- ;
-
- const double ad9371_freq = ad9371_source == "external" ?
- _ad9371_freq[dir]/2 :
- _ad9371_freq[dir]
- ;
- const double rf_freq = _is_low_band[dir] ?
- ad9371_freq - _adf4351_freq[dir] :
- ad9371_freq
- ;
-
- UHD_LOG_TRACE(unique_id(),
- "RF freq = " << rf_freq);
- UHD_ASSERT_THROW(fp_compare_epsilon<double>(rf_freq) >= 0);
- UHD_ASSERT_THROW(
- fp_compare_epsilon<double>(std::abs(rf_freq - _desired_rf_freq[dir])) <= _master_clock_rate/2);
- if (dir == RX_DIRECTION){
+ const size_t chan, const uhd::direction_t dir)
+{
+ const std::string ad9371_source = dir == TX_DIRECTION
+ ? this->get_tx_lo_source(MAGNESIUM_LO1, chan)
+ : this->get_rx_lo_source(MAGNESIUM_LO1, chan);
+
+ const double ad9371_freq = ad9371_source == "external" ? _ad9371_freq[dir] / 2
+ : _ad9371_freq[dir];
+ const double rf_freq = _is_low_band[dir] ? ad9371_freq - _adf4351_freq[dir]
+ : ad9371_freq;
+
+ UHD_LOG_TRACE(unique_id(), "RF freq = " << rf_freq);
+ UHD_ASSERT_THROW(fp_compare_epsilon<double>(rf_freq) >= 0);
+ UHD_ASSERT_THROW(fp_compare_epsilon<double>(std::abs(rf_freq - _desired_rf_freq[dir]))
+ <= _master_clock_rate / 2);
+ if (dir == RX_DIRECTION) {
radio_ctrl_impl::set_rx_frequency(rf_freq, chan);
- }else if (dir == TX_DIRECTION){
+ } else if (dir == TX_DIRECTION) {
radio_ctrl_impl::set_tx_frequency(rf_freq, chan);
- }else{
+ } else {
UHD_THROW_INVALID_CODE_PATH();
}
}
double magnesium_radio_ctrl_impl::set_rx_frequency(
- const double req_freq,
- const size_t chan
-) {
+ const double req_freq, const size_t chan)
+{
const double freq = MAGNESIUM_FREQ_RANGE.clip(req_freq);
- UHD_LOG_TRACE(unique_id(),
- "set_rx_frequency(f=" << freq << ", chan=" << chan << ")");
- _desired_rf_freq[RX_DIRECTION]=freq;
+ UHD_LOG_TRACE(unique_id(), "set_rx_frequency(f=" << freq << ", chan=" << chan << ")");
+ _desired_rf_freq[RX_DIRECTION] = freq;
std::lock_guard<std::mutex> l(_set_lock);
// We need to set the switches on both channels, because they share an LO.
// This way, if we tune channel 0 it will not put channel 1 into a bad
// state.
_update_rx_freq_switches(freq, _rx_bypass_lnas, magnesium_cpld_ctrl::BOTH);
- const std::string ad9371_source = this->get_rx_lo_source(MAGNESIUM_LO1, chan);
+ const std::string ad9371_source = this->get_rx_lo_source(MAGNESIUM_LO1, chan);
const std::string adf4351_source = this->get_rx_lo_source(MAGNESIUM_LO2, chan);
UHD_ASSERT_THROW(adf4351_source == "internal");
double coerced_if_freq = freq;
if (_map_freq_to_rx_band(freq) == rx_band::LOWBAND) {
- _is_low_band[RX_DIRECTION] = true;
+ _is_low_band[RX_DIRECTION] = true;
const double desired_low_freq = MAGNESIUM_RX_IF_FREQ - freq;
coerced_if_freq =
- this->_set_rx_lo_freq(adf4351_source, MAGNESIUM_LO2, desired_low_freq, chan) + freq;
+ this->_set_rx_lo_freq(adf4351_source, MAGNESIUM_LO2, desired_low_freq, chan)
+ + freq;
UHD_LOG_TRACE(unique_id(), "coerced_if_freq = " << coerced_if_freq);
} else {
_is_low_band[RX_DIRECTION] = false;
_lo_disable(_rx_lo);
}
// external LO required to tune at 2xdesired_frequency.
- const double desired_if_freq = ad9371_source == "internal" ?
- coerced_if_freq :
- 2*coerced_if_freq;
+ const double desired_if_freq = ad9371_source == "internal" ? coerced_if_freq
+ : 2 * coerced_if_freq;
this->_set_rx_lo_freq(ad9371_source, MAGNESIUM_LO1, desired_if_freq, chan);
@@ -329,25 +296,20 @@ double magnesium_radio_ctrl_impl::set_rx_frequency(
return radio_ctrl_impl::get_rx_frequency(chan);
}
-double magnesium_radio_ctrl_impl::get_tx_frequency(
- const size_t chan)
+double magnesium_radio_ctrl_impl::get_tx_frequency(const size_t chan)
{
- UHD_LOG_TRACE(unique_id(),
- "get_tx_frequency(chan=" << chan << ")");
+ UHD_LOG_TRACE(unique_id(), "get_tx_frequency(chan=" << chan << ")");
return radio_ctrl_impl::get_tx_frequency(chan);
}
-double magnesium_radio_ctrl_impl::get_rx_frequency(
- const size_t chan)
+double magnesium_radio_ctrl_impl::get_rx_frequency(const size_t chan)
{
- UHD_LOG_TRACE(unique_id(),
- "get_rx_frequency(chan=" << chan << ")");
+ UHD_LOG_TRACE(unique_id(), "get_rx_frequency(chan=" << chan << ")");
return radio_ctrl_impl::get_rx_frequency(chan);
}
double magnesium_radio_ctrl_impl::set_rx_bandwidth(
- const double bandwidth,
- const size_t chan
-) {
+ const double bandwidth, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
_ad9371->set_bandwidth(bandwidth, chan, RX_DIRECTION);
// FIXME: setting analog bandwidth on AD9371 take no effect.
@@ -359,9 +321,8 @@ double magnesium_radio_ctrl_impl::set_rx_bandwidth(
}
double magnesium_radio_ctrl_impl::set_tx_bandwidth(
- const double bandwidth,
- const size_t chan
-) {
+ const double bandwidth, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
_ad9371->set_bandwidth(bandwidth, chan, TX_DIRECTION);
// FIXME: setting analog bandwidth on AD9371 take no effect.
@@ -369,182 +330,155 @@ double magnesium_radio_ctrl_impl::set_tx_bandwidth(
UHD_LOG_WARNING(unique_id(),
"set_tx_bandwidth take no effect on AD9371. "
"Default analog bandwidth is 100MHz");
- return AD9371_TX_MAX_BANDWIDTH ;
+ return AD9371_TX_MAX_BANDWIDTH;
}
-double magnesium_radio_ctrl_impl::set_tx_gain(
- const double gain,
- const size_t chan
-) {
+double magnesium_radio_ctrl_impl::set_tx_gain(const double gain, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
- UHD_LOG_TRACE(unique_id(),
- "set_tx_gain(gain=" << gain << ", chan=" << chan << ")");
- const double coerced_gain = _set_all_gain(
- gain,
- this->get_tx_frequency(chan),
- chan,
- TX_DIRECTION
- );
+ UHD_LOG_TRACE(unique_id(), "set_tx_gain(gain=" << gain << ", chan=" << chan << ")");
+ const double coerced_gain =
+ _set_all_gain(gain, this->get_tx_frequency(chan), chan, TX_DIRECTION);
radio_ctrl_impl::set_tx_gain(coerced_gain, chan);
return coerced_gain;
}
double magnesium_radio_ctrl_impl::_set_tx_gain(
- const std::string &name,
- const double gain,
- const size_t chan
-) {
+ const std::string& name, const double gain, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
UHD_LOG_TRACE(unique_id(),
"_set_tx_gain(name=" << name << ", gain=" << gain << ", chan=" << chan << ")");
- UHD_LOG_TRACE(unique_id(),
+ UHD_LOG_TRACE(unique_id(),
"_set_tx_gain(name=" << name << ", gain=" << gain << ", chan=" << chan << ")");
double clip_gain = 0;
- if (name == MAGNESIUM_GAIN1){
+ if (name == MAGNESIUM_GAIN1) {
clip_gain = uhd::clip(gain, AD9371_MIN_TX_GAIN, AD9371_MAX_TX_GAIN);
_ad9371_att[TX_DIRECTION] = clip_gain;
- }else if (name == MAGNESIUM_GAIN2){
- clip_gain = uhd::clip(gain, DSA_MIN_GAIN, DSA_MAX_GAIN);
+ } else if (name == MAGNESIUM_GAIN2) {
+ clip_gain = uhd::clip(gain, DSA_MIN_GAIN, DSA_MAX_GAIN);
_dsa_att[TX_DIRECTION] = clip_gain;
- }else if (name == MAGNESIUM_AMP){
- clip_gain = gain > 0.0 ? AMP_MAX_GAIN: AMP_MIN_GAIN;
+ } else if (name == MAGNESIUM_AMP) {
+ clip_gain = gain > 0.0 ? AMP_MAX_GAIN : AMP_MIN_GAIN;
_amp_bypass[TX_DIRECTION] = clip_gain == 0.0;
- }else {
+ } else {
throw uhd::value_error("Could not find gain element " + name);
}
- UHD_LOG_TRACE(unique_id(),
- "_set_tx_gain calling update gain");
- this->_set_all_gain(
- this->_get_all_gain(chan, TX_DIRECTION),
+ UHD_LOG_TRACE(unique_id(), "_set_tx_gain calling update gain");
+ this->_set_all_gain(this->_get_all_gain(chan, TX_DIRECTION),
this->get_tx_frequency(chan),
chan,
- TX_DIRECTION
- );
+ TX_DIRECTION);
return clip_gain;
}
double magnesium_radio_ctrl_impl::_get_tx_gain(
- const std::string &name,
- const size_t /*chan*/
-) {
+ const std::string& name, const size_t /*chan*/
+)
+{
std::lock_guard<std::mutex> l(_set_lock);
- if (name == MAGNESIUM_GAIN1){
+ if (name == MAGNESIUM_GAIN1) {
return _ad9371_att[TX_DIRECTION];
- }else if (name == MAGNESIUM_GAIN2){
+ } else if (name == MAGNESIUM_GAIN2) {
return _dsa_att[TX_DIRECTION];
- }else if (name == MAGNESIUM_AMP){
- return _amp_bypass[TX_DIRECTION]? AMP_MIN_GAIN : AMP_MAX_GAIN;
- }else {
+ } else if (name == MAGNESIUM_AMP) {
+ return _amp_bypass[TX_DIRECTION] ? AMP_MIN_GAIN : AMP_MAX_GAIN;
+ } else {
throw uhd::value_error("Could not find gain element " + name);
}
}
-double magnesium_radio_ctrl_impl::set_rx_gain(
- const double gain,
- const size_t chan
-) {
+double magnesium_radio_ctrl_impl::set_rx_gain(const double gain, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
- UHD_LOG_TRACE(unique_id(),
- "set_rx_gain(gain=" << gain << ", chan=" << chan << ")");
- const double coerced_gain = _set_all_gain(
- gain,
- this->get_rx_frequency(chan),
- chan,
- RX_DIRECTION
- );
+ UHD_LOG_TRACE(unique_id(), "set_rx_gain(gain=" << gain << ", chan=" << chan << ")");
+ const double coerced_gain =
+ _set_all_gain(gain, this->get_rx_frequency(chan), chan, RX_DIRECTION);
radio_ctrl_impl::set_rx_gain(coerced_gain, chan);
return coerced_gain;
}
double magnesium_radio_ctrl_impl::_set_rx_gain(
- const std::string &name,
- const double gain,
- const size_t chan
-) {
+ const std::string& name, const double gain, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
UHD_LOG_TRACE(unique_id(),
"_set_rx_gain(name=" << name << ", gain=" << gain << ", chan=" << chan << ")");
double clip_gain = 0;
- if (name == MAGNESIUM_GAIN1){
+ if (name == MAGNESIUM_GAIN1) {
clip_gain = uhd::clip(gain, AD9371_MIN_RX_GAIN, AD9371_MAX_RX_GAIN);
_ad9371_att[RX_DIRECTION] = clip_gain;
- }else if (name == MAGNESIUM_GAIN2){
- clip_gain = uhd::clip(gain, DSA_MIN_GAIN, DSA_MAX_GAIN);
+ } else if (name == MAGNESIUM_GAIN2) {
+ clip_gain = uhd::clip(gain, DSA_MIN_GAIN, DSA_MAX_GAIN);
_dsa_att[RX_DIRECTION] = clip_gain;
- }else if (name == MAGNESIUM_AMP){
- clip_gain = gain > 0.0 ? AMP_MAX_GAIN: AMP_MIN_GAIN;
+ } else if (name == MAGNESIUM_AMP) {
+ clip_gain = gain > 0.0 ? AMP_MAX_GAIN : AMP_MIN_GAIN;
_amp_bypass[RX_DIRECTION] = clip_gain == 0.0;
- }else {
+ } else {
throw uhd::value_error("Could not find gain element " + name);
}
- UHD_LOG_TRACE(unique_id(),
- "_set_rx_gain calling update gain");
- this->_set_all_gain(
- this->_get_all_gain(chan, RX_DIRECTION),
+ UHD_LOG_TRACE(unique_id(), "_set_rx_gain calling update gain");
+ this->_set_all_gain(this->_get_all_gain(chan, RX_DIRECTION),
this->get_rx_frequency(chan),
chan,
- RX_DIRECTION
- );
+ RX_DIRECTION);
return clip_gain; // not really any coreced here (only clip) for individual gain
}
double magnesium_radio_ctrl_impl::_get_rx_gain(
- const std::string &name,
- const size_t /*chan*/
-) {
+ const std::string& name, const size_t /*chan*/
+)
+{
std::lock_guard<std::mutex> l(_set_lock);
- if (name == MAGNESIUM_GAIN1){
+ if (name == MAGNESIUM_GAIN1) {
return _ad9371_att[RX_DIRECTION];
- }else if (name == MAGNESIUM_GAIN2){
+ } else if (name == MAGNESIUM_GAIN2) {
return _dsa_att[RX_DIRECTION];
- }else if (name == MAGNESIUM_AMP){
- return _amp_bypass[RX_DIRECTION]? AMP_MIN_GAIN : AMP_MAX_GAIN;
- }else{
+ } else if (name == MAGNESIUM_AMP) {
+ return _amp_bypass[RX_DIRECTION] ? AMP_MIN_GAIN : AMP_MAX_GAIN;
+ } else {
throw uhd::value_error("Could not find gain element " + name);
}
}
-std::vector<std::string> magnesium_radio_ctrl_impl::get_rx_lo_names(
- const size_t /*chan*/
-) {
- return std::vector<std::string> {MAGNESIUM_LO1, MAGNESIUM_LO2};
+std::vector<std::string> magnesium_radio_ctrl_impl::get_rx_lo_names(const size_t /*chan*/
+)
+{
+ return std::vector<std::string>{MAGNESIUM_LO1, MAGNESIUM_LO2};
}
std::vector<std::string> magnesium_radio_ctrl_impl::get_rx_lo_sources(
- const std::string &name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO2){
- return std::vector<std::string> { "internal" };
- }else if (name == MAGNESIUM_LO1){
- return std::vector<std::string> { "internal", "external" };
- }else {
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO2) {
+ return std::vector<std::string>{"internal"};
+ } else if (name == MAGNESIUM_LO1) {
+ return std::vector<std::string>{"internal", "external"};
+ } else {
throw uhd::value_error("Could not find LO stage " + name);
- }
+ }
}
freq_range_t magnesium_radio_ctrl_impl::get_rx_lo_freq_range(
- const std::string & name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO1){
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO1) {
return freq_range_t{ADF4351_MIN_FREQ, ADF4351_MAX_FREQ};
- }
- else if(name == MAGNESIUM_LO2){
+ } else if (name == MAGNESIUM_LO2) {
return freq_range_t{AD9371_MIN_FREQ, AD9371_MAX_FREQ};
- }
- else {
+ } else {
throw uhd::value_error("Could not find LO stage " + name);
}
}
void magnesium_radio_ctrl_impl::set_rx_lo_source(
- const std::string &src,
- const std::string &name,
- const size_t /*chan*/
-) {
- //TODO: checking what options are there
+ const std::string& src, const std::string& name, const size_t /*chan*/
+)
+{
+ // TODO: checking what options are there
std::lock_guard<std::mutex> l(_set_lock);
UHD_LOG_TRACE(unique_id(), "Setting RX LO " << name << " to " << src);
@@ -552,180 +486,179 @@ void magnesium_radio_ctrl_impl::set_rx_lo_source(
_ad9371->set_lo_source(src, RX_DIRECTION);
} else {
UHD_LOG_ERROR(unique_id(),
- "RX LO " << name << " does not support setting source to " << src);
+ "RX LO " << name << " does not support setting source to " << src);
}
}
const std::string magnesium_radio_ctrl_impl::get_rx_lo_source(
- const std::string &name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO1){
- //TODO: should we use this from cache?
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO1) {
+ // TODO: should we use this from cache?
return _ad9371->get_lo_source(RX_DIRECTION);
}
return "internal";
}
-double magnesium_radio_ctrl_impl::_set_rx_lo_freq(
- const std::string source,
+double magnesium_radio_ctrl_impl::_set_rx_lo_freq(const std::string source,
const std::string name,
const double freq,
- const size_t chan
-){
+ const size_t chan)
+{
double coerced_lo_freq = freq;
- if (source != "internal"){
- UHD_LOG_WARNING(unique_id(), "LO source is not internal. This set frequency will be ignored");
- if(name == MAGNESIUM_LO1){
+ if (source != "internal") {
+ UHD_LOG_WARNING(
+ unique_id(), "LO source is not internal. This set frequency will be ignored");
+ if (name == MAGNESIUM_LO1) {
// handle ad9371 external LO case
- coerced_lo_freq = freq;
+ coerced_lo_freq = freq;
_ad9371_freq[RX_DIRECTION] = coerced_lo_freq;
}
- }else {
- if(name == MAGNESIUM_LO1){
- coerced_lo_freq = _ad9371->set_frequency(freq, chan, RX_DIRECTION);
+ } else {
+ if (name == MAGNESIUM_LO1) {
+ coerced_lo_freq = _ad9371->set_frequency(freq, chan, RX_DIRECTION);
_ad9371_freq[RX_DIRECTION] = coerced_lo_freq;
- }else if (name == MAGNESIUM_LO2 ){
+ } else if (name == MAGNESIUM_LO2) {
// TODO: no hardcode the init_n_mode
- coerced_lo_freq = _lo_enable(_rx_lo, freq, _master_clock_rate, false);
+ coerced_lo_freq = _lo_enable(_rx_lo, freq, _master_clock_rate, false);
_adf4351_freq[RX_DIRECTION] = coerced_lo_freq;
- }else {
- UHD_LOG_WARNING(unique_id(), "There's no LO with this name of "<<name << " in the system. This set rx lo freq will be ignored");
+ } else {
+ UHD_LOG_WARNING(unique_id(),
+ "There's no LO with this name of "
+ << name << " in the system. This set rx lo freq will be ignored");
};
}
return coerced_lo_freq;
}
double magnesium_radio_ctrl_impl::set_rx_lo_freq(
- double freq,
- const std::string &name,
- const size_t chan
-) {
- UHD_LOG_TRACE(unique_id(), "Setting rx lo frequency for " <<name << " with freq = " <<freq);
+ double freq, const std::string& name, const size_t chan)
+{
+ UHD_LOG_TRACE(
+ unique_id(), "Setting rx lo frequency for " << name << " with freq = " << freq);
std::lock_guard<std::mutex> l(_set_lock);
- std::string source = this->get_rx_lo_source(name, chan);
+ std::string source = this->get_rx_lo_source(name, chan);
const double coerced_lo_freq = this->_set_rx_lo_freq(source, name, freq, chan);
- this->_update_freq(chan,RX_DIRECTION);
- this->_update_gain(chan,RX_DIRECTION);
+ this->_update_freq(chan, RX_DIRECTION);
+ this->_update_gain(chan, RX_DIRECTION);
return coerced_lo_freq;
}
double magnesium_radio_ctrl_impl::get_rx_lo_freq(
- const std::string & name,
- const size_t chan
-) {
-
- UHD_LOG_TRACE(unique_id(),"Getting rx lo frequency for " <<name);
- std::string source = this->get_rx_lo_source(name,chan);
- if(name == MAGNESIUM_LO1){
+ const std::string& name, const size_t chan)
+{
+ UHD_LOG_TRACE(unique_id(), "Getting rx lo frequency for " << name);
+ std::string source = this->get_rx_lo_source(name, chan);
+ if (name == MAGNESIUM_LO1) {
return _ad9371_freq[RX_DIRECTION];
- }else if (name == "adf4531" ){
+ } else if (name == "adf4531") {
return _adf4351_freq[RX_DIRECTION];
- }else {
- UHD_LOG_ERROR(unique_id(), "There's no LO with this name of "<<name << " in the system. This set rx lo freq will be ignored");
+ } else {
+ UHD_LOG_ERROR(unique_id(),
+ "There's no LO with this name of "
+ << name << " in the system. This set rx lo freq will be ignored");
}
UHD_THROW_INVALID_CODE_PATH();
}
-//TX LO
-std::vector<std::string> magnesium_radio_ctrl_impl::get_tx_lo_names(
- const size_t /*chan*/
-) {
- return std::vector<std::string> {MAGNESIUM_LO1, MAGNESIUM_LO2};
+// TX LO
+std::vector<std::string> magnesium_radio_ctrl_impl::get_tx_lo_names(const size_t /*chan*/
+)
+{
+ return std::vector<std::string>{MAGNESIUM_LO1, MAGNESIUM_LO2};
}
std::vector<std::string> magnesium_radio_ctrl_impl::get_tx_lo_sources(
- const std::string &name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO2){
- return std::vector<std::string> { "internal" };
- }else if (name == MAGNESIUM_LO1){
- return std::vector<std::string> { "internal", "external" };
- }else {
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO2) {
+ return std::vector<std::string>{"internal"};
+ } else if (name == MAGNESIUM_LO1) {
+ return std::vector<std::string>{"internal", "external"};
+ } else {
throw uhd::value_error("Could not find LO stage " + name);
- }
+ }
}
freq_range_t magnesium_radio_ctrl_impl::get_tx_lo_freq_range(
- const std::string &name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO2){
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO2) {
return freq_range_t{ADF4351_MIN_FREQ, ADF4351_MAX_FREQ};
- }
- else if(name == MAGNESIUM_LO1){
+ } else if (name == MAGNESIUM_LO1) {
return freq_range_t{AD9371_MIN_FREQ, AD9371_MAX_FREQ};
- }
- else {
+ } else {
throw uhd::value_error("Could not find LO stage " + name);
}
}
void magnesium_radio_ctrl_impl::set_tx_lo_source(
- const std::string &src,
- const std::string &name,
- const size_t /*chan*/
-) {
- //TODO: checking what options are there
+ const std::string& src, const std::string& name, const size_t /*chan*/
+)
+{
+ // TODO: checking what options are there
std::lock_guard<std::mutex> l(_set_lock);
UHD_LOG_TRACE(unique_id(), "Setting TX LO " << name << " to " << src);
if (name == MAGNESIUM_LO1) {
_ad9371->set_lo_source(src, TX_DIRECTION);
} else {
UHD_LOG_ERROR(unique_id(),
- "TX LO " << name << " does not support setting source to " << src);
+ "TX LO " << name << " does not support setting source to " << src);
}
}
const std::string magnesium_radio_ctrl_impl::get_tx_lo_source(
- const std::string &name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO1){
- //TODO: should we use this from cache?
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO1) {
+ // TODO: should we use this from cache?
return _ad9371->get_lo_source(TX_DIRECTION);
}
return "internal";
}
-double magnesium_radio_ctrl_impl::_set_tx_lo_freq(
- const std::string source,
+double magnesium_radio_ctrl_impl::_set_tx_lo_freq(const std::string source,
const std::string name,
const double freq,
- const size_t chan
-){
+ const size_t chan)
+{
double coerced_lo_freq = freq;
- if (source != "internal"){
- UHD_LOG_WARNING(unique_id(), "LO source is not internal. This set frequency will be ignored");
- if(name == MAGNESIUM_LO1){
+ if (source != "internal") {
+ UHD_LOG_WARNING(
+ unique_id(), "LO source is not internal. This set frequency will be ignored");
+ if (name == MAGNESIUM_LO1) {
// handle ad9371 external LO case
- coerced_lo_freq = freq;
+ coerced_lo_freq = freq;
_ad9371_freq[TX_DIRECTION] = coerced_lo_freq;
}
- }else {
- if(name == MAGNESIUM_LO1){
- coerced_lo_freq = _ad9371->set_frequency(freq, chan, TX_DIRECTION);
+ } else {
+ if (name == MAGNESIUM_LO1) {
+ coerced_lo_freq = _ad9371->set_frequency(freq, chan, TX_DIRECTION);
_ad9371_freq[TX_DIRECTION] = coerced_lo_freq;
- }else if (name == MAGNESIUM_LO2 ){
+ } else if (name == MAGNESIUM_LO2) {
// TODO: no hardcode the int_n_mode
const bool int_n_mode = false;
coerced_lo_freq = _lo_enable(_tx_lo, freq, _master_clock_rate, int_n_mode);
_adf4351_freq[TX_DIRECTION] = coerced_lo_freq;
- }else {
- UHD_LOG_WARNING(unique_id(), "There's no LO with this name of "<<name << " in the system. This set tx lo freq will be ignored");
+ } else {
+ UHD_LOG_WARNING(unique_id(),
+ "There's no LO with this name of "
+ << name << " in the system. This set tx lo freq will be ignored");
};
}
return coerced_lo_freq;
}
double magnesium_radio_ctrl_impl::set_tx_lo_freq(
- double freq,
- const std::string &name,
- const size_t chan
-) {
- UHD_LOG_TRACE(unique_id(), "Setting tx lo frequency for " <<name << " with freq = " <<freq);
- std::string source = this->get_tx_lo_source(name,chan);
+ double freq, const std::string& name, const size_t chan)
+{
+ UHD_LOG_TRACE(
+ unique_id(), "Setting tx lo frequency for " << name << " with freq = " << freq);
+ std::string source = this->get_tx_lo_source(name, chan);
const double return_freq = this->_set_tx_lo_freq(source, name, freq, chan);
this->_update_freq(chan, TX_DIRECTION);
this->_update_gain(chan, TX_DIRECTION);
@@ -733,61 +666,56 @@ double magnesium_radio_ctrl_impl::set_tx_lo_freq(
}
double magnesium_radio_ctrl_impl::get_tx_lo_freq(
- const std::string & name,
- const size_t chan
-) {
- UHD_LOG_TRACE(unique_id(),"Getting tx lo frequency for " <<name);
- std::string source = this->get_tx_lo_source(name,chan);
- if(name == MAGNESIUM_LO1){
+ const std::string& name, const size_t chan)
+{
+ UHD_LOG_TRACE(unique_id(), "Getting tx lo frequency for " << name);
+ std::string source = this->get_tx_lo_source(name, chan);
+ if (name == MAGNESIUM_LO1) {
return _ad9371_freq[TX_DIRECTION];
- }else if (name == MAGNESIUM_LO2){
+ } else if (name == MAGNESIUM_LO2) {
return _adf4351_freq[TX_DIRECTION];
- }else {
- UHD_LOG_ERROR(unique_id(), "There's no LO with this name of "<<name << " in the system.");
+ } else {
+ UHD_LOG_ERROR(
+ unique_id(), "There's no LO with this name of " << name << " in the system.");
};
UHD_THROW_INVALID_CODE_PATH();
}
-
size_t magnesium_radio_ctrl_impl::get_chan_from_dboard_fe(
- const std::string &fe, const direction_t /* dir */
-) {
+ const std::string& fe, const direction_t /* dir */
+)
+{
return boost::lexical_cast<size_t>(fe);
}
std::string magnesium_radio_ctrl_impl::get_dboard_fe_from_chan(
- const size_t chan,
- const direction_t /* dir */
-) {
+ const size_t chan, const direction_t /* dir */
+)
+{
return std::to_string(chan);
}
void magnesium_radio_ctrl_impl::set_rpc_client(
- uhd::rpc_client::sptr rpcc,
- const uhd::device_addr_t &block_args
-) {
- _rpcc = rpcc;
+ uhd::rpc_client::sptr rpcc, const uhd::device_addr_t& block_args)
+{
+ _rpcc = rpcc;
_block_args = block_args;
UHD_LOG_TRACE(unique_id(), "Instantiating AD9371 control object...");
_ad9371 = magnesium_ad9371_iface::uptr(
- new magnesium_ad9371_iface(
- _rpcc,
- (_radio_slot == "A") ? 0 : 1
- )
- );
+ new magnesium_ad9371_iface(_rpcc, (_radio_slot == "A") ? 0 : 1));
if (block_args.has_key("identify")) {
const std::string identify_val = block_args.get("identify");
- int identify_duration = std::atoi(identify_val.c_str());
+ int identify_duration = std::atoi(identify_val.c_str());
if (identify_duration == 0) {
identify_duration = 5;
}
UHD_LOG_INFO(unique_id(),
"Running LED identification process for " << identify_duration
- << " seconds.");
+ << " seconds.");
_identify_with_leds(identify_duration);
}
@@ -795,68 +723,60 @@ void magnesium_radio_ctrl_impl::set_rpc_client(
// in arguments from the device args. So if block_args contains a
// master_clock_rate key, then it should better be whatever the device is
// configured to do.
- _master_clock_rate = _rpcc->request_with_token<double>(
- _rpc_prefix + "get_master_clock_rate");
+ _master_clock_rate =
+ _rpcc->request_with_token<double>(_rpc_prefix + "get_master_clock_rate");
if (block_args.cast<double>("master_clock_rate", _master_clock_rate)
- != _master_clock_rate) {
+ != _master_clock_rate) {
throw uhd::runtime_error(str(
boost::format("Master clock rate mismatch. Device returns %f MHz, "
"but should have been %f MHz.")
% (_master_clock_rate / 1e6)
- % (block_args.cast<double>(
- "master_clock_rate", _master_clock_rate) / 1e6)
- ));
+ % (block_args.cast<double>("master_clock_rate", _master_clock_rate) / 1e6)));
}
- UHD_LOG_DEBUG(unique_id(),
- "Master Clock Rate is: " << (_master_clock_rate / 1e6) << " MHz.");
+ UHD_LOG_DEBUG(
+ unique_id(), "Master Clock Rate is: " << (_master_clock_rate / 1e6) << " MHz.");
radio_ctrl_impl::set_rate(_master_clock_rate);
// EEPROM paths subject to change FIXME
const size_t db_idx = get_block_id().get_block_count();
_tree->access<eeprom_map_t>(_root_path / "eeprom")
- .add_coerced_subscriber([this, db_idx](const eeprom_map_t& db_eeprom){
+ .add_coerced_subscriber([this, db_idx](const eeprom_map_t& db_eeprom) {
this->_rpcc->notify_with_token("set_db_eeprom", db_idx, db_eeprom);
})
- .set_publisher([this, db_idx](){
- return this->_rpcc->request_with_token<eeprom_map_t>(
- "get_db_eeprom", db_idx
- );
- })
- ;
+ .set_publisher([this, db_idx]() {
+ return this->_rpcc->request_with_token<eeprom_map_t>("get_db_eeprom", db_idx);
+ });
// Init sensors
- for (const auto &dir : std::vector<direction_t>{RX_DIRECTION, TX_DIRECTION}) {
+ for (const auto& dir : std::vector<direction_t>{RX_DIRECTION, TX_DIRECTION}) {
for (size_t chan_idx = 0; chan_idx < MAGNESIUM_NUM_CHANS; chan_idx++) {
_init_mpm_sensors(dir, chan_idx);
}
}
}
-bool magnesium_radio_ctrl_impl::get_lo_lock_status(
- const direction_t dir
-) {
- if (not (bool(_rpcc))) {
- UHD_LOG_DEBUG(unique_id(),
- "Reported no LO lock due to lack of RPC connection.");
+bool magnesium_radio_ctrl_impl::get_lo_lock_status(const direction_t dir)
+{
+ if (not(bool(_rpcc))) {
+ UHD_LOG_DEBUG(unique_id(), "Reported no LO lock due to lack of RPC connection.");
return false;
}
const std::string trx = (dir == RX_DIRECTION) ? "rx" : "tx";
- const size_t chan = 0; // They're the same after all
- const double freq = (dir == RX_DIRECTION) ?
- get_rx_frequency(chan) :
- get_tx_frequency(chan);
+ const size_t chan = 0; // They're the same after all
+ const double freq = (dir == RX_DIRECTION) ? get_rx_frequency(chan)
+ : get_tx_frequency(chan);
- bool lo_lock = _rpcc->request_with_token<bool>(
- _rpc_prefix + "get_ad9371_lo_lock", trx);
+ bool lo_lock =
+ _rpcc->request_with_token<bool>(_rpc_prefix + "get_ad9371_lo_lock", trx);
UHD_LOG_TRACE(unique_id(),
"AD9371 " << trx << " LO reports lock: " << (lo_lock ? "Yes" : "No"));
if (lo_lock and _map_freq_to_rx_band(freq) == rx_band::LOWBAND) {
- lo_lock = lo_lock && _rpcc->request_with_token<bool>(
- _rpc_prefix + "get_lowband_lo_lock", trx);
+ lo_lock =
+ lo_lock
+ && _rpcc->request_with_token<bool>(_rpc_prefix + "get_lowband_lo_lock", trx);
UHD_LOG_TRACE(unique_id(),
- "ADF4351 " << trx << " LO reports lock: "
- << (lo_lock ? "Yes" : "No"));
+ "ADF4351 " << trx << " LO reports lock: " << (lo_lock ? "Yes" : "No"));
}
return lo_lock;
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
index 3d35206ed..dcadb5dea 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
@@ -11,20 +11,19 @@
#ifndef INCLUDED_LIBUHD_RFNOC_MAGNESIUM_RADIO_CTRL_IMPL_HPP
#define INCLUDED_LIBUHD_RFNOC_MAGNESIUM_RADIO_CTRL_IMPL_HPP
+#include "magnesium_ad9371_iface.hpp"
#include "magnesium_cpld_ctrl.hpp"
#include "magnesium_cpld_regs.hpp"
-#include "magnesium_ad9371_iface.hpp"
#include <uhd/types/serial.hpp>
#include <uhd/usrp/dboard_manager.hpp>
#include <uhd/usrp/gpio_defs.hpp>
-#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
-#include <uhdlib/rfnoc/rpc_block_ctrl.hpp>
#include <uhdlib/rfnoc/radio_ctrl_impl.hpp>
+#include <uhdlib/rfnoc/rpc_block_ctrl.hpp>
#include <uhdlib/usrp/common/adf435x.hpp>
+#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
#include <mutex>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief RFNoC block / daughterboard driver for a "Magnesium" daughterboard.
*
@@ -49,14 +48,7 @@ public:
};
//! Frequency bands for TX. Bands are a function of the analog filter banks
- enum class tx_band {
- INVALID_BAND,
- LOWBAND,
- BAND0,
- BAND1,
- BAND2,
- BAND3
- };
+ enum class tx_band { INVALID_BAND, LOWBAND, BAND0, BAND1, BAND2, BAND3 };
/************************************************************************
* Structors
@@ -71,8 +63,8 @@ public:
// not reimplemented here
double set_rate(double rate);
- void set_tx_antenna(const std::string &ant, const size_t chan);
- void set_rx_antenna(const std::string &ant, const size_t chan);
+ void set_tx_antenna(const std::string& ant, const size_t chan);
+ void set_rx_antenna(const std::string& ant, const size_t chan);
double set_tx_frequency(const double freq, const size_t chan);
double set_rx_frequency(const double freq, const size_t chan);
@@ -84,90 +76,59 @@ public:
// RX LO
std::vector<std::string> get_rx_lo_names(const size_t chan);
std::vector<std::string> get_rx_lo_sources(
- const std::string &name,
- const size_t chan
- );
- freq_range_t get_rx_lo_freq_range(
- const std::string &name,
- const size_t chan
- );
+ const std::string& name, const size_t chan);
+ freq_range_t get_rx_lo_freq_range(const std::string& name, const size_t chan);
void set_rx_lo_source(
- const std::string &src,
- const std::string &name,
- const size_t chan
- );
- const std::string get_rx_lo_source(
- const std::string &name,
- const size_t chan
- );
-
- double set_rx_lo_freq(
- double freq,
- const std::string &name,
- const size_t chan
- );
- double get_rx_lo_freq(const std::string &name, const size_t chan);
+ const std::string& src, const std::string& name, const size_t chan);
+ const std::string get_rx_lo_source(const std::string& name, const size_t chan);
+
+ double set_rx_lo_freq(double freq, const std::string& name, const size_t chan);
+ double get_rx_lo_freq(const std::string& name, const size_t chan);
// TX LO
std::vector<std::string> get_tx_lo_names(const size_t chan);
std::vector<std::string> get_tx_lo_sources(
- const std::string &name,
- const size_t chan
- );
- freq_range_t get_tx_lo_freq_range(
- const std::string &name,
- const size_t chan
- );
+ const std::string& name, const size_t chan);
+ freq_range_t get_tx_lo_freq_range(const std::string& name, const size_t chan);
void set_tx_lo_source(
- const std::string &src,
- const std::string &name,
- const size_t chan
- );
- const std::string get_tx_lo_source(
- const std::string &name,
- const size_t chan
- );
-
- double set_tx_lo_freq(
- double freq,
- const std::string &name,
- const size_t chan
- );
- double get_tx_lo_freq(const std::string &name, const size_t chan);
+ const std::string& src, const std::string& name, const size_t chan);
+ const std::string get_tx_lo_source(const std::string& name, const size_t chan);
+
+ double set_tx_lo_freq(double freq, const std::string& name, const size_t chan);
+ double get_tx_lo_freq(const std::string& name, const size_t chan);
// gain
double set_tx_gain(const double gain, const size_t chan);
double set_rx_gain(const double gain, const size_t chan);
- void set_tx_gain_source(const std::string& src, const std::string& name, const size_t chan);
+ void set_tx_gain_source(
+ const std::string& src, const std::string& name, const size_t chan);
std::string get_tx_gain_source(const std::string& name, const size_t chan);
- void set_rx_gain_source(const std::string& src, const std::string& name, const size_t chan);
+ void set_rx_gain_source(
+ const std::string& src, const std::string& name, const size_t chan);
std::string get_rx_gain_source(const std::string& name, const size_t chan);
- size_t get_chan_from_dboard_fe(const std::string &fe, const direction_t dir);
+ size_t get_chan_from_dboard_fe(const std::string& fe, const direction_t dir);
std::string get_dboard_fe_from_chan(const size_t chan, const direction_t dir);
- void set_rpc_client(
- uhd::rpc_client::sptr rpcc,
- const uhd::device_addr_t &block_args
- );
+ void set_rpc_client(uhd::rpc_client::sptr rpcc, const uhd::device_addr_t& block_args);
private:
/**************************************************************************
* Helpers
*************************************************************************/
//! Set tx gain on each gain element
- double _set_tx_gain(const std::string &name, const double gain, const size_t chan);
+ double _set_tx_gain(const std::string& name, const double gain, const size_t chan);
//! Set rx gain on each gain element
- double _set_rx_gain(const std::string &name, const double gain, const size_t chan);
+ double _set_rx_gain(const std::string& name, const double gain, const size_t chan);
//! Get tx gain on each gain element
- double _get_tx_gain(const std::string &name, const size_t chan);
+ double _get_tx_gain(const std::string& name, const size_t chan);
//! Get rx gain on each gain element
- double _get_rx_gain(const std::string &name, const size_t chan);
+ double _get_rx_gain(const std::string& name, const size_t chan);
//! Initialize all the peripherals connected to this block
void _init_peripherals();
@@ -176,18 +137,12 @@ private:
void _init_defaults();
//! Init a subtree for the RF frontends
- void _init_frontend_subtree(
- uhd::property_tree::sptr subtree,
- const size_t chan_idx
- );
+ void _init_frontend_subtree(uhd::property_tree::sptr subtree, const size_t chan_idx);
//! Initialize property tree
void _init_prop_tree();
- void _init_mpm_sensors(
- const direction_t dir,
- const size_t chan_idx
- );
+ void _init_mpm_sensors(const direction_t dir, const size_t chan_idx);
//! Map a frequency in Hz to an rx_band value. Will return
// rx_band::INVALID_BAND if the frequency is out of range.
@@ -201,92 +156,57 @@ private:
*************************************************************************/
//! Return LO lock status. Factors in current band (low/high) and
// direction (TX/RX)
- bool get_lo_lock_status(
- const direction_t dir
- );
+ bool get_lo_lock_status(const direction_t dir);
/**************************************************************************
* Gain Controls (implemented in magnesium_radio_ctrl_gain.cpp)
*************************************************************************/
//! Set the attenuation of the DSA
- double _dsa_set_att(
- const double att,
- const size_t chan,
- const direction_t dir
- );
+ double _dsa_set_att(const double att, const size_t chan, const direction_t dir);
- double _dsa_get_att(
- const size_t chan,
- const direction_t dir
- );
+ double _dsa_get_att(const size_t chan, const direction_t dir);
//! Write the DSA word
- void _set_dsa_val(
- const size_t chan,
- const direction_t dir,
- const uint32_t dsa_val
- );
+ void _set_dsa_val(const size_t chan, const direction_t dir, const uint32_t dsa_val);
double _set_all_gain(
- const double gain,
- const double freq,
- const size_t chan,
- const direction_t dir
- );
+ const double gain, const double freq, const size_t chan, const direction_t dir);
- double _get_all_gain(
- const size_t chan,
- const direction_t dir
- );
+ double _get_all_gain(const size_t chan, const direction_t dir);
void _update_gain(const size_t chan, direction_t dir);
- void _update_freq(
- const size_t chan,
- const uhd::direction_t dir
- );
+ void _update_freq(const size_t chan, const uhd::direction_t dir);
/**************************************************************************
* CPLD Controls (implemented in magnesium_radio_ctrl_cpld.cpp)
*************************************************************************/
//! Blink the front-panel LEDs for \p identify_duration, then reset CPLD
// and resume normal operation.
- void _identify_with_leds(
- const int identify_duration
- );
+ void _identify_with_leds(const int identify_duration);
- void _update_rx_freq_switches(
- const double freq,
+ void _update_rx_freq_switches(const double freq,
const bool bypass_lnas,
- const magnesium_cpld_ctrl::chan_sel_t chan_sel
- );
+ const magnesium_cpld_ctrl::chan_sel_t chan_sel);
- void _update_tx_freq_switches(
- const double freq,
+ void _update_tx_freq_switches(const double freq,
const bool bypass_amps,
- const magnesium_cpld_ctrl::chan_sel_t chan_sel
- );
+ const magnesium_cpld_ctrl::chan_sel_t chan_sel);
- void _update_atr_switches(
- const magnesium_cpld_ctrl::chan_sel_t chan,
+ void _update_atr_switches(const magnesium_cpld_ctrl::chan_sel_t chan,
const direction_t dir,
- const std::string &ant
- );
+ const std::string& ant);
- double _set_rx_lo_freq(
- const std::string source,
+ double _set_rx_lo_freq(const std::string source,
const std::string name,
const double freq,
- const size_t chan
- );
+ const size_t chan);
- double _set_tx_lo_freq(
- const std::string source,
+ double _set_tx_lo_freq(const std::string source,
const std::string name,
const double freq,
- const size_t chan
- );
+ const size_t chan);
/**************************************************************************
* Private attributes
*************************************************************************/
@@ -334,30 +254,37 @@ private:
//! Sampling rate, and also ref clock frequency for the lowband LOs.
double _master_clock_rate = 1.0;
- //! Desired RF frequency
- std::map<direction_t,double> _desired_rf_freq = { {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9} };
+ //! Desired RF frequency
+ std::map<direction_t, double> _desired_rf_freq = {
+ {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9}};
//! Coerced adf4351 frequency
//! Coerced ad9371 frequency
- std::map<direction_t,double> _ad9371_freq = { {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9} };
+ std::map<direction_t, double> _ad9371_freq = {
+ {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9}};
//! Coerced adf4351 frequency
- std::map<direction_t,double> _adf4351_freq = { {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9} };
+ std::map<direction_t, double> _adf4351_freq = {
+ {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9}};
//! Low band enable
- std::map<direction_t,bool> _is_low_band = { {RX_DIRECTION, false}, {TX_DIRECTION, false} };
+ std::map<direction_t, bool> _is_low_band = {
+ {RX_DIRECTION, false}, {TX_DIRECTION, false}};
//! AD9371 gain
- double _ad9371_rx_gain = 0.0;
- double _ad9371_tx_gain = 0.0;
- std::map<direction_t,double> _ad9371_att = { {RX_DIRECTION, 0.0}, {TX_DIRECTION, 0.0} };
+ double _ad9371_rx_gain = 0.0;
+ double _ad9371_tx_gain = 0.0;
+ std::map<direction_t, double> _ad9371_att = {
+ {RX_DIRECTION, 0.0}, {TX_DIRECTION, 0.0}};
//! DSA attenuation
- double _dsa_rx_att = 0.0;
- double _dsa_tx_att = 0.0;
- std::map<direction_t,double> _dsa_att = { {RX_DIRECTION, 0.0}, {TX_DIRECTION, 0.0} };
+ double _dsa_rx_att = 0.0;
+ double _dsa_tx_att = 0.0;
+ std::map<direction_t, double> _dsa_att = {{RX_DIRECTION, 0.0}, {TX_DIRECTION, 0.0}};
//! amp gain
- std::map<direction_t,bool> _amp_bypass = { {RX_DIRECTION, true}, {TX_DIRECTION, true} };
+ std::map<direction_t, bool> _amp_bypass = {
+ {RX_DIRECTION, true}, {TX_DIRECTION, true}};
//! All gain
double _all_rx_gain = 0.0;
double _all_tx_gain = 0.0;
//! Gain profile
- std::map<direction_t,std::string> _gain_profile = { {RX_DIRECTION, "default"}, {TX_DIRECTION, "default"} };
+ std::map<direction_t, std::string> _gain_profile = {
+ {RX_DIRECTION, "default"}, {TX_DIRECTION, "default"}};
bool _rx_bypass_lnas = true;
bool _tx_bypass_amp = true;
@@ -367,11 +294,11 @@ private:
{magnesium_cpld_ctrl::CHAN1,
magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1},
{magnesium_cpld_ctrl::CHAN2,
- magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1}
- };
+ magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1}};
//! RX LO SOURCE
- // NOTE for magnesium only ad9371 LO that can be connected to the external LO so we only need one var here
+ // NOTE for magnesium only ad9371 LO that can be connected to the external LO so we
+ // only need one var here
std::string _rx_lo_source = "internal";
}; /* class radio_ctrl_impl */
@@ -379,4 +306,3 @@ private:
}} /* namespace uhd::rfnoc */
#endif /* INCLUDED_LIBUHD_RFNOC_MAGNESIUM_RADIO_CTRL_IMPL_HPP */
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp
index 901bb1474..422b07ebb 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp
@@ -4,40 +4,32 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "magnesium_radio_ctrl_impl.hpp"
#include "magnesium_constants.hpp"
-#include <uhd/utils/log.hpp>
+#include "magnesium_radio_ctrl_impl.hpp"
+#include <uhd/transport/chdr.hpp>
#include <uhd/types/eeprom.hpp>
#include <uhd/types/sensors.hpp>
-#include <uhd/transport/chdr.hpp>
+#include <uhd/utils/log.hpp>
#include <uhdlib/usrp/cores/spi_core_3000.hpp>
-#include <vector>
-#include <string>
#include <boost/algorithm/string.hpp>
-#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/case_conv.hpp>
+#include <boost/algorithm/string/split.hpp>
+#include <string>
+#include <vector>
using namespace uhd;
using namespace uhd::rfnoc;
namespace {
- enum slave_select_t {
- SEN_CPLD = 1,
- SEN_TX_LO = 2,
- SEN_RX_LO = 4,
- SEN_PHASE_DAC = 8
- };
-
- constexpr double MAGNESIUM_DEFAULT_FREQ = 2.5e9; // Hz
- constexpr double MAGNESIUM_DEFAULT_BANDWIDTH = 100e6; // Hz
- constexpr char MAGNESIUM_DEFAULT_RX_ANTENNA[] = "RX2";
- constexpr char MAGNESIUM_DEFAULT_TX_ANTENNA[] = "TX/RX";
-
- //! Magnesium gain profile options
- const std::vector<std::string> MAGNESIUM_GP_OPTIONS = {
- "manual",
- "default"
- };
-}
+enum slave_select_t { SEN_CPLD = 1, SEN_TX_LO = 2, SEN_RX_LO = 4, SEN_PHASE_DAC = 8 };
+
+constexpr double MAGNESIUM_DEFAULT_FREQ = 2.5e9; // Hz
+constexpr double MAGNESIUM_DEFAULT_BANDWIDTH = 100e6; // Hz
+constexpr char MAGNESIUM_DEFAULT_RX_ANTENNA[] = "RX2";
+constexpr char MAGNESIUM_DEFAULT_TX_ANTENNA[] = "TX/RX";
+
+//! Magnesium gain profile options
+const std::vector<std::string> MAGNESIUM_GP_OPTIONS = {"manual", "default"};
+} // namespace
//! Helper function to extract single value of port number.
//
@@ -45,32 +37,34 @@ namespace {
// This function convert the format of attribute "Radio_N_M"
// to a single value port number = N*number_of_port_per_radio + M
-uint32_t extract_port_number(std::string radio_src_string, uhd::property_tree::sptr ptree){
+uint32_t extract_port_number(std::string radio_src_string, uhd::property_tree::sptr ptree)
+{
std::string s_val = "0";
std::vector<std::string> radio_strings;
- boost::algorithm::split(
- radio_strings,
+ boost::algorithm::split(radio_strings,
radio_src_string,
boost::is_any_of("_/"),
boost::token_compress_on);
boost::to_lower(radio_strings[0]);
- if (radio_strings.size()<3) {
- throw uhd::runtime_error(str(boost::format("%s is an invalid GPIO source string.") % radio_src_string));
+ if (radio_strings.size() < 3) {
+ throw uhd::runtime_error(str(
+ boost::format("%s is an invalid GPIO source string.") % radio_src_string));
}
size_t radio_num = std::stoi(radio_strings[1]);
- size_t port_num = std::stoi(radio_strings[2]);
+ size_t port_num = std::stoi(radio_strings[2]);
if (radio_strings[0] != "radio") {
- throw uhd::runtime_error("Front panel GPIO bank can only accept a radio block as its driver.");
+ throw uhd::runtime_error(
+ "Front panel GPIO bank can only accept a radio block as its driver.");
}
- std::string radio_port_out = "Radio_"+ radio_strings[1] + "/ports/out";
- std::string radio_port_path = radio_port_out + "/"+ radio_strings[2];
- auto found = ptree->exists(fs_path("xbar")/ radio_port_path);
- if (not found){
- throw uhd::runtime_error(str(boost::format(
- "Could not find radio port %s.\n") % radio_port_path));
+ std::string radio_port_out = "Radio_" + radio_strings[1] + "/ports/out";
+ std::string radio_port_path = radio_port_out + "/" + radio_strings[2];
+ auto found = ptree->exists(fs_path("xbar") / radio_port_path);
+ if (not found) {
+ throw uhd::runtime_error(
+ str(boost::format("Could not find radio port %s.\n") % radio_port_path));
}
- size_t port_size = ptree->list(fs_path("xbar")/ radio_port_out).size();
- return radio_num*port_size + port_num;
+ size_t port_size = ptree->list(fs_path("xbar") / radio_port_out).size();
+ return radio_num * port_size + port_num;
}
void magnesium_radio_ctrl_impl::_init_defaults()
@@ -80,8 +74,7 @@ void magnesium_radio_ctrl_impl::_init_defaults()
const size_t num_tx_chans = get_input_ports().size();
UHD_LOG_TRACE(unique_id(),
- "Num TX chans: " << num_tx_chans
- << " Num RX chans: " << num_rx_chans);
+ "Num TX chans: " << num_tx_chans << " Num RX chans: " << num_rx_chans);
for (size_t chan = 0; chan < num_rx_chans; chan++) {
radio_ctrl_impl::set_rx_frequency(MAGNESIUM_DEFAULT_FREQ, chan);
@@ -104,8 +97,7 @@ void magnesium_radio_ctrl_impl::_init_defaults()
const size_t default_spp =
(_tree->access<size_t>("mtu/recv").get() - max_bytes_header)
/ (2 * sizeof(int16_t));
- UHD_LOG_DEBUG(unique_id(),
- "Setting default spp to " << default_spp);
+ UHD_LOG_DEBUG(unique_id(), "Setting default spp to " << default_spp);
_tree->access<int>(get_arg_path("spp") / "value").set(default_spp);
}
@@ -113,606 +105,453 @@ void magnesium_radio_ctrl_impl::_init_peripherals()
{
UHD_LOG_TRACE(unique_id(), "Initializing peripherals...");
UHD_LOG_TRACE(unique_id(), "Initializing SPI core...");
- _spi = spi_core_3000::make(_get_ctrl(0),
- regs::sr_addr(regs::SPI),
- regs::rb_addr(regs::RB_SPI)
- );
+ _spi = spi_core_3000::make(
+ _get_ctrl(0), regs::sr_addr(regs::SPI), regs::rb_addr(regs::RB_SPI));
UHD_LOG_TRACE(unique_id(), "Initializing CPLD...");
UHD_LOG_TRACE(unique_id(), "Creating new CPLD object...");
spi_config_t spi_config;
spi_config.use_custom_divider = true;
- spi_config.divider = 125;
- spi_config.mosi_edge = spi_config_t::EDGE_RISE;
- spi_config.miso_edge = spi_config_t::EDGE_FALL;
+ spi_config.divider = 125;
+ spi_config.mosi_edge = spi_config_t::EDGE_RISE;
+ spi_config.miso_edge = spi_config_t::EDGE_FALL;
UHD_LOG_TRACE(unique_id(), "Making CPLD object...");
_cpld = std::make_shared<magnesium_cpld_ctrl>(
- [this, spi_config](const uint32_t transaction){ // Write functor
- this->_spi->write_spi(
- SEN_CPLD,
- spi_config,
- transaction,
- 24
- );
+ [this, spi_config](const uint32_t transaction) { // Write functor
+ this->_spi->write_spi(SEN_CPLD, spi_config, transaction, 24);
},
- [this, spi_config](const uint32_t transaction){ // Read functor
- return this->_spi->read_spi(
- SEN_CPLD,
- spi_config,
- transaction,
- 24
- );
- }
- );
+ [this, spi_config](const uint32_t transaction) { // Read functor
+ return this->_spi->read_spi(SEN_CPLD, spi_config, transaction, 24);
+ });
_update_atr_switches(
- magnesium_cpld_ctrl::BOTH,
- DX_DIRECTION,
- radio_ctrl_impl::get_rx_antenna(0)
- );
+ magnesium_cpld_ctrl::BOTH, DX_DIRECTION, radio_ctrl_impl::get_rx_antenna(0));
UHD_LOG_TRACE(unique_id(), "Initializing TX LO...");
- _tx_lo = adf435x_iface::make_adf4351(
- [this](const std::vector<uint32_t> transactions){
- for (const uint32_t transaction: transactions) {
- this->_spi->write_spi(
- SEN_TX_LO,
- spi_config_t::EDGE_RISE,
- transaction,
- 32
- );
- }
+ _tx_lo = adf435x_iface::make_adf4351([this](
+ const std::vector<uint32_t> transactions) {
+ for (const uint32_t transaction : transactions) {
+ this->_spi->write_spi(SEN_TX_LO, spi_config_t::EDGE_RISE, transaction, 32);
}
- );
+ });
UHD_LOG_TRACE(unique_id(), "Initializing RX LO...");
- _rx_lo = adf435x_iface::make_adf4351(
- [this](const std::vector<uint32_t> transactions){
- for (const uint32_t transaction: transactions) {
- this->_spi->write_spi(
- SEN_RX_LO,
- spi_config_t::EDGE_RISE,
- transaction,
- 32
- );
- }
+ _rx_lo = adf435x_iface::make_adf4351([this](
+ const std::vector<uint32_t> transactions) {
+ for (const uint32_t transaction : transactions) {
+ this->_spi->write_spi(SEN_RX_LO, spi_config_t::EDGE_RISE, transaction, 32);
}
- );
+ });
_gpio.clear(); // Following the as-if rule, this can get optimized out
for (size_t radio_idx = 0; radio_idx < _get_num_radios(); radio_idx++) {
- UHD_LOG_TRACE(unique_id(),
- "Initializing GPIOs for channel " << radio_idx);
- _gpio.emplace_back(
- usrp::gpio_atr::gpio_atr_3000::make(
- _get_ctrl(radio_idx),
- regs::sr_addr(regs::GPIO),
- regs::rb_addr(regs::RB_DB_GPIO)
- )
- );
+ UHD_LOG_TRACE(unique_id(), "Initializing GPIOs for channel " << radio_idx);
+ _gpio.emplace_back(usrp::gpio_atr::gpio_atr_3000::make(_get_ctrl(radio_idx),
+ regs::sr_addr(regs::GPIO),
+ regs::rb_addr(regs::RB_DB_GPIO)));
// DSA and AD9371 gain bits do *not* toggle on ATR modes. If we ever
// connect anything else to this core, we might need to set_atr_mode()
// to MODE_ATR on those bits. For now, all bits simply do what they're
// told, and don't toggle on RX/TX state changes.
- _gpio.back()->set_atr_mode(
- usrp::gpio_atr::MODE_GPIO, // Disable ATR mode
- usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL
- );
- _gpio.back()->set_gpio_ddr(
- usrp::gpio_atr::DDR_OUTPUT, // Make all GPIOs outputs
- usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL
- );
+ _gpio.back()->set_atr_mode(usrp::gpio_atr::MODE_GPIO, // Disable ATR mode
+ usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
+ _gpio.back()->set_gpio_ddr(usrp::gpio_atr::DDR_OUTPUT, // Make all GPIOs outputs
+ usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
}
UHD_LOG_TRACE(unique_id(), "Initializing front-panel GPIO control...")
_fp_gpio = usrp::gpio_atr::gpio_atr_3000::make(
- _get_ctrl(0),
- regs::sr_addr(regs::FP_GPIO),
- regs::rb_addr(regs::RB_FP_GPIO)
- );
+ _get_ctrl(0), regs::sr_addr(regs::FP_GPIO), regs::rb_addr(regs::RB_FP_GPIO));
}
void magnesium_radio_ctrl_impl::_init_frontend_subtree(
- uhd::property_tree::sptr subtree,
- const size_t chan_idx
-) {
+ uhd::property_tree::sptr subtree, const size_t chan_idx)
+{
const fs_path tx_fe_path = fs_path("tx_frontends") / chan_idx;
const fs_path rx_fe_path = fs_path("rx_frontends") / chan_idx;
UHD_LOG_TRACE(unique_id(),
- "Adding non-RFNoC block properties for channel " << chan_idx <<
- " to prop tree path " << tx_fe_path << " and " << rx_fe_path);
+ "Adding non-RFNoC block properties for channel "
+ << chan_idx << " to prop tree path " << tx_fe_path << " and " << rx_fe_path);
// TX Standard attributes
subtree->create<std::string>(tx_fe_path / "name")
- .set(str(boost::format("Magnesium")))
- ;
- subtree->create<std::string>(tx_fe_path / "connection")
- .set("IQ")
- ;
+ .set(str(boost::format("Magnesium")));
+ subtree->create<std::string>(tx_fe_path / "connection").set("IQ");
// RX Standard attributes
subtree->create<std::string>(rx_fe_path / "name")
- .set(str(boost::format("Magnesium")))
- ;
- subtree->create<std::string>(rx_fe_path / "connection")
- .set("IQ")
- ;
+ .set(str(boost::format("Magnesium")));
+ subtree->create<std::string>(rx_fe_path / "connection").set("IQ");
// TX Antenna
subtree->create<std::string>(tx_fe_path / "antenna" / "value")
- .add_coerced_subscriber([this, chan_idx](const std::string &ant){
+ .add_coerced_subscriber([this, chan_idx](const std::string& ant) {
this->set_tx_antenna(ant, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_tx_antenna(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_tx_antenna(chan_idx); });
subtree->create<std::vector<std::string>>(tx_fe_path / "antenna" / "options")
.set({MAGNESIUM_DEFAULT_TX_ANTENNA})
- .add_coerced_subscriber([](const std::vector<std::string> &){
- throw uhd::runtime_error(
- "Attempting to update antenna options!");
- })
- ;
+ .add_coerced_subscriber([](const std::vector<std::string>&) {
+ throw uhd::runtime_error("Attempting to update antenna options!");
+ });
// RX Antenna
subtree->create<std::string>(rx_fe_path / "antenna" / "value")
- .add_coerced_subscriber([this, chan_idx](const std::string &ant){
+ .add_coerced_subscriber([this, chan_idx](const std::string& ant) {
this->set_rx_antenna(ant, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_rx_antenna(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_rx_antenna(chan_idx); });
subtree->create<std::vector<std::string>>(rx_fe_path / "antenna" / "options")
.set(MAGNESIUM_RX_ANTENNAS)
- .add_coerced_subscriber([](const std::vector<std::string> &){
- throw uhd::runtime_error(
- "Attempting to update antenna options!");
- })
- ;
+ .add_coerced_subscriber([](const std::vector<std::string>&) {
+ throw uhd::runtime_error("Attempting to update antenna options!");
+ });
// TX frequency
subtree->create<double>(tx_fe_path / "freq" / "value")
- .set_coercer([this, chan_idx](const double freq){
+ .set_coercer([this, chan_idx](const double freq) {
return this->set_tx_frequency(freq, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_tx_frequency(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_tx_frequency(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "freq" / "range")
.set(meta_range_t(MAGNESIUM_MIN_FREQ, MAGNESIUM_MAX_FREQ, 1.0))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update freq range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update freq range!");
+ });
// RX frequency
subtree->create<double>(rx_fe_path / "freq" / "value")
- .set_coercer([this, chan_idx](const double freq){
+ .set_coercer([this, chan_idx](const double freq) {
return this->set_rx_frequency(freq, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_rx_frequency(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_rx_frequency(chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "freq" / "range")
.set(meta_range_t(MAGNESIUM_MIN_FREQ, MAGNESIUM_MAX_FREQ, 1.0))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update freq range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update freq range!");
+ });
// TX bandwidth
subtree->create<double>(tx_fe_path / "bandwidth" / "value")
.set(AD9371_TX_MAX_BANDWIDTH)
- .set_coercer([this, chan_idx](const double bw){
+ .set_coercer([this, chan_idx](const double bw) {
return this->set_tx_bandwidth(bw, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_tx_bandwidth(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_tx_bandwidth(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "bandwidth" / "range")
.set(meta_range_t(AD9371_TX_MIN_BANDWIDTH, AD9371_TX_MAX_BANDWIDTH))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update bandwidth range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update bandwidth range!");
+ });
// RX bandwidth
subtree->create<double>(rx_fe_path / "bandwidth" / "value")
.set(AD9371_RX_MAX_BANDWIDTH)
- .set_coercer([this, chan_idx](const double bw){
+ .set_coercer([this, chan_idx](const double bw) {
return this->set_rx_bandwidth(bw, chan_idx);
- })
- ;
+ });
subtree->create<meta_range_t>(rx_fe_path / "bandwidth" / "range")
.set(meta_range_t(AD9371_RX_MIN_BANDWIDTH, AD9371_RX_MAX_BANDWIDTH))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update bandwidth range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update bandwidth range!");
+ });
// TX gains
subtree->create<double>(tx_fe_path / "gains" / "all" / "value")
- .set_coercer([this, chan_idx](const double gain){
- return this->set_tx_gain(gain, chan_idx);
- })
- .set_publisher([this, chan_idx](){
- return radio_ctrl_impl::get_tx_gain(chan_idx);
- })
- ;
+ .set_coercer([this, chan_idx](
+ const double gain) { return this->set_tx_gain(gain, chan_idx); })
+ .set_publisher(
+ [this, chan_idx]() { return radio_ctrl_impl::get_tx_gain(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "gains" / "all" / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[TX_DIRECTION] == "manual") {
return meta_range_t(0.0, 0.0, 0.0);
} else {
- return meta_range_t(
- ALL_TX_MIN_GAIN,
- ALL_TX_MAX_GAIN,
- ALL_TX_GAIN_STEP
- );
+ return meta_range_t(ALL_TX_MIN_GAIN, ALL_TX_MAX_GAIN, ALL_TX_GAIN_STEP);
}
- })
- ;
+ });
subtree->create<std::vector<std::string>>(tx_fe_path / "gains/all/profile/options")
.set({"manual", "default"});
subtree->create<std::string>(tx_fe_path / "gains/all/profile/value")
- .set_coercer([this](const std::string& profile){
+ .set_coercer([this](const std::string& profile) {
std::string return_profile = profile;
- if (std::find(MAGNESIUM_GP_OPTIONS.begin(),
- MAGNESIUM_GP_OPTIONS.end(),
- profile
- ) == MAGNESIUM_GP_OPTIONS.end())
- {
+ if (std::find(
+ MAGNESIUM_GP_OPTIONS.begin(), MAGNESIUM_GP_OPTIONS.end(), profile)
+ == MAGNESIUM_GP_OPTIONS.end()) {
return_profile = "default";
}
_gain_profile[TX_DIRECTION] = return_profile;
return return_profile;
})
- .set_publisher([this](){
- return _gain_profile[TX_DIRECTION];
- })
- ;
+ .set_publisher([this]() { return _gain_profile[TX_DIRECTION]; });
// RX gains
subtree->create<double>(rx_fe_path / "gains" / "all" / "value")
- .set_coercer([this, chan_idx](const double gain){
- return this->set_rx_gain(gain, chan_idx);
- })
- .set_publisher([this, chan_idx](){
- return radio_ctrl_impl::get_rx_gain(chan_idx);
- })
- ;
+ .set_coercer([this, chan_idx](
+ const double gain) { return this->set_rx_gain(gain, chan_idx); })
+ .set_publisher(
+ [this, chan_idx]() { return radio_ctrl_impl::get_rx_gain(chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "gains" / "all" / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[RX_DIRECTION] == "manual") {
return meta_range_t(0.0, 0.0, 0.0);
} else {
- return meta_range_t(
- ALL_RX_MIN_GAIN,
- ALL_RX_MAX_GAIN,
- ALL_RX_GAIN_STEP
- );
+ return meta_range_t(ALL_RX_MIN_GAIN, ALL_RX_MAX_GAIN, ALL_RX_GAIN_STEP);
}
- })
- ;
+ });
- subtree->create<std::vector<std::string> >(rx_fe_path / "gains/all/profile/options")
- .set(MAGNESIUM_GP_OPTIONS);
+ subtree->create<std::vector<std::string>>(rx_fe_path / "gains/all/profile/options")
+ .set(MAGNESIUM_GP_OPTIONS);
subtree->create<std::string>(rx_fe_path / "gains/all/profile/value")
- .set_coercer([this](const std::string& profile){
+ .set_coercer([this](const std::string& profile) {
std::string return_profile = profile;
- if (std::find(MAGNESIUM_GP_OPTIONS.begin(),
- MAGNESIUM_GP_OPTIONS.end(),
- profile
- ) == MAGNESIUM_GP_OPTIONS.end())
- {
+ if (std::find(
+ MAGNESIUM_GP_OPTIONS.begin(), MAGNESIUM_GP_OPTIONS.end(), profile)
+ == MAGNESIUM_GP_OPTIONS.end()) {
return_profile = "default";
}
_gain_profile[RX_DIRECTION] = return_profile;
return return_profile;
})
- .set_publisher([this](){
- return _gain_profile[RX_DIRECTION];
- })
- ;
+ .set_publisher([this]() { return _gain_profile[RX_DIRECTION]; });
// TX mykonos attenuation
subtree->create<double>(tx_fe_path / "gains" / MAGNESIUM_GAIN1 / "value")
- .set_coercer([this, chan_idx](const double gain){
+ .set_coercer([this, chan_idx](const double gain) {
return _set_tx_gain(MAGNESIUM_GAIN1, gain, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->_get_tx_gain(MAGNESIUM_GAIN1, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_tx_gain(MAGNESIUM_GAIN1, chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "gains" / MAGNESIUM_GAIN1 / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[TX_DIRECTION] == "manual") {
return meta_range_t(
- AD9371_MIN_TX_GAIN,
- AD9371_MAX_TX_GAIN,
- AD9371_TX_GAIN_STEP
- );
+ AD9371_MIN_TX_GAIN, AD9371_MAX_TX_GAIN, AD9371_TX_GAIN_STEP);
} else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
- // TX DSA
+ });
+ // TX DSA
subtree->create<double>(tx_fe_path / "gains" / MAGNESIUM_GAIN2 / "value")
- .set_coercer([this, chan_idx](const double gain){
+ .set_coercer([this, chan_idx](const double gain) {
return this->_set_tx_gain(MAGNESIUM_GAIN2, gain, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->_get_tx_gain(MAGNESIUM_GAIN2, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_tx_gain(MAGNESIUM_GAIN2, chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "gains" / MAGNESIUM_GAIN2 / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[TX_DIRECTION] == "manual") {
return meta_range_t(DSA_MIN_GAIN, DSA_MAX_GAIN, DSA_GAIN_STEP);
- }else{
+ } else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
- //TX amp
+ });
+ // TX amp
subtree->create<double>(tx_fe_path / "gains" / MAGNESIUM_AMP / "value")
.set_coercer([this, chan_idx](const double gain) {
return this->_set_tx_gain(MAGNESIUM_AMP, gain, chan_idx);
})
- .set_publisher([this, chan_idx]() {
- return this->_get_tx_gain(MAGNESIUM_AMP, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_tx_gain(MAGNESIUM_AMP, chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "gains" / MAGNESIUM_AMP / "range")
- .add_coerced_subscriber([](const meta_range_t &) {
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[TX_DIRECTION] == "manual") {
return meta_range_t(AMP_MIN_GAIN, AMP_MAX_GAIN, AMP_GAIN_STEP);
- }else{
+ } else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
+ });
// RX mykonos attenuation
subtree->create<double>(rx_fe_path / "gains" / MAGNESIUM_GAIN1 / "value")
- .set_coercer([this, chan_idx](const double gain){
- UHD_VAR(gain);
+ .set_coercer([this, chan_idx](const double gain) {
+ UHD_VAR(gain);
return this->_set_rx_gain(MAGNESIUM_GAIN1, gain, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->_get_rx_gain(MAGNESIUM_GAIN1, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_rx_gain(MAGNESIUM_GAIN1, chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "gains" / MAGNESIUM_GAIN1 / "range")
- .add_coerced_subscriber([](const meta_range_t &) {
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[RX_DIRECTION] == "manual") {
return meta_range_t(
- AD9371_MIN_RX_GAIN,
- AD9371_MAX_RX_GAIN,
- AD9371_RX_GAIN_STEP
- );
+ AD9371_MIN_RX_GAIN, AD9371_MAX_RX_GAIN, AD9371_RX_GAIN_STEP);
} else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
- //RX DSA
+ });
+ // RX DSA
subtree->create<double>(rx_fe_path / "gains" / MAGNESIUM_GAIN2 / "value")
.set_coercer([this, chan_idx](const double gain) {
UHD_VAR(gain);
return this->_set_rx_gain(MAGNESIUM_GAIN2, gain, chan_idx);
})
- .set_publisher([this, chan_idx]() {
- return this->_get_rx_gain(MAGNESIUM_GAIN2, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_rx_gain(MAGNESIUM_GAIN2, chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "gains" / MAGNESIUM_GAIN2 / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[RX_DIRECTION] == "manual") {
return meta_range_t(DSA_MIN_GAIN, DSA_MAX_GAIN, DSA_MAX_GAIN);
- }else{
+ } else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
+ });
- //RX amp
+ // RX amp
subtree->create<double>(rx_fe_path / "gains" / MAGNESIUM_AMP / "value")
.set_coercer([this, chan_idx](const double gain) {
return this->_set_rx_gain(MAGNESIUM_AMP, gain, chan_idx);
})
- .set_publisher([this, chan_idx]() {
- return this->_get_rx_gain(MAGNESIUM_AMP, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_rx_gain(MAGNESIUM_AMP, chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "gains" / MAGNESIUM_AMP / "range")
- .add_coerced_subscriber([](const meta_range_t &) {
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[RX_DIRECTION] == "manual") {
return meta_range_t(AMP_MIN_GAIN, AMP_MAX_GAIN, AMP_GAIN_STEP);
- }else{
+ } else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
+ });
// TX LO lock sensor //////////////////////////////////////////////////////
// Note: The lowband and AD9371 LO lock sensors are generated
// programmatically in set_rpc_client(). The actual lo_locked publisher is
// also set there.
subtree->create<sensor_value_t>(tx_fe_path / "sensors" / "lo_locked")
- .set(sensor_value_t("all_los", false, "locked", "unlocked"))
- .add_coerced_subscriber([](const sensor_value_t &){
- throw uhd::runtime_error(
- "Attempting to write to sensor!");
+ .set(sensor_value_t("all_los", false, "locked", "unlocked"))
+ .add_coerced_subscriber([](const sensor_value_t&) {
+ throw uhd::runtime_error("Attempting to write to sensor!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
return sensor_value_t(
- "all_los",
- this->get_lo_lock_status(TX_DIRECTION),
- "locked", "unlocked"
- );
- })
- ;
+ "all_los", this->get_lo_lock_status(TX_DIRECTION), "locked", "unlocked");
+ });
// RX LO lock sensor (see not on TX LO lock sensor)
subtree->create<sensor_value_t>(rx_fe_path / "sensors" / "lo_locked")
- .set(sensor_value_t("all_los", false, "locked", "unlocked"))
- .add_coerced_subscriber([](const sensor_value_t &){
- throw uhd::runtime_error(
- "Attempting to write to sensor!");
+ .set(sensor_value_t("all_los", false, "locked", "unlocked"))
+ .add_coerced_subscriber([](const sensor_value_t&) {
+ throw uhd::runtime_error("Attempting to write to sensor!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
return sensor_value_t(
- "all_los",
- this->get_lo_lock_status(RX_DIRECTION),
- "locked", "unlocked"
- );
- })
- ;
- //LO Specific
- //RX LO
- subtree->create<meta_range_t>(rx_fe_path / "los"/MAGNESIUM_LO1/"freq/range")
- .set_publisher([this,chan_idx](){
+ "all_los", this->get_lo_lock_status(RX_DIRECTION), "locked", "unlocked");
+ });
+ // LO Specific
+ // RX LO
+ subtree->create<meta_range_t>(rx_fe_path / "los" / MAGNESIUM_LO1 / "freq/range")
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_freq_range(MAGNESIUM_LO1, chan_idx);
- })
- ;
- subtree->create<std::vector<std::string>>(rx_fe_path / "los"/MAGNESIUM_LO1/"source/options")
- .set_publisher([this,chan_idx](){
+ });
+ subtree
+ ->create<std::vector<std::string>>(
+ rx_fe_path / "los" / MAGNESIUM_LO1 / "source/options")
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_sources(MAGNESIUM_LO1, chan_idx);
+ });
+ subtree->create<std::string>(rx_fe_path / "los" / MAGNESIUM_LO1 / "source/value")
+ .add_coerced_subscriber([this, chan_idx](std::string src) {
+ this->set_rx_lo_source(src, MAGNESIUM_LO1, chan_idx);
})
- ;
- subtree->create<std::string>(rx_fe_path / "los"/MAGNESIUM_LO1/"source/value")
- .add_coerced_subscriber([this,chan_idx](std::string src){
- this->set_rx_lo_source(src, MAGNESIUM_LO1,chan_idx);
- })
- .set_publisher([this,chan_idx](){
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_source(MAGNESIUM_LO1, chan_idx);
- })
- ;
- subtree->create<double>(rx_fe_path / "los"/MAGNESIUM_LO1/"freq/value")
- .set_publisher([this,chan_idx](){
- return this->get_rx_lo_freq(MAGNESIUM_LO1, chan_idx);
- })
- .set_coercer([this,chan_idx](const double freq){
+ });
+ subtree->create<double>(rx_fe_path / "los" / MAGNESIUM_LO1 / "freq/value")
+ .set_publisher(
+ [this, chan_idx]() { return this->get_rx_lo_freq(MAGNESIUM_LO1, chan_idx); })
+ .set_coercer([this, chan_idx](const double freq) {
return this->set_rx_lo_freq(freq, MAGNESIUM_LO1, chan_idx);
- })
- ;
+ });
- subtree->create<meta_range_t>(rx_fe_path / "los"/MAGNESIUM_LO2/"freq/range")
- .set_publisher([this,chan_idx](){
+ subtree->create<meta_range_t>(rx_fe_path / "los" / MAGNESIUM_LO2 / "freq/range")
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_freq_range(MAGNESIUM_LO2, chan_idx);
- })
- ;
- subtree->create<std::vector<std::string>>(rx_fe_path / "los"/MAGNESIUM_LO2/"source/options")
- .set_publisher([this,chan_idx](){
+ });
+ subtree
+ ->create<std::vector<std::string>>(
+ rx_fe_path / "los" / MAGNESIUM_LO2 / "source/options")
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_sources(MAGNESIUM_LO2, chan_idx);
- })
- ;
+ });
- subtree->create<std::string>(rx_fe_path / "los"/MAGNESIUM_LO2/"source/value")
- .add_coerced_subscriber([this,chan_idx](std::string src){
+ subtree->create<std::string>(rx_fe_path / "los" / MAGNESIUM_LO2 / "source/value")
+ .add_coerced_subscriber([this, chan_idx](std::string src) {
this->set_rx_lo_source(src, MAGNESIUM_LO2, chan_idx);
})
- .set_publisher([this,chan_idx](){
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_source(MAGNESIUM_LO2, chan_idx);
- })
- ;
- subtree->create<double>(rx_fe_path / "los"/MAGNESIUM_LO2/"freq/value")
- .set_publisher([this,chan_idx](){
- return this->get_rx_lo_freq(MAGNESIUM_LO2, chan_idx);
- })
- .set_coercer([this,chan_idx](double freq){
+ });
+ subtree->create<double>(rx_fe_path / "los" / MAGNESIUM_LO2 / "freq/value")
+ .set_publisher(
+ [this, chan_idx]() { return this->get_rx_lo_freq(MAGNESIUM_LO2, chan_idx); })
+ .set_coercer([this, chan_idx](double freq) {
return this->set_rx_lo_freq(freq, MAGNESIUM_LO2, chan_idx);
});
- //TX LO
- subtree->create<meta_range_t>(tx_fe_path / "los"/MAGNESIUM_LO1/"freq/range")
- .set_publisher([this,chan_idx](){
+ // TX LO
+ subtree->create<meta_range_t>(tx_fe_path / "los" / MAGNESIUM_LO1 / "freq/range")
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_freq_range(MAGNESIUM_LO1, chan_idx);
- })
- ;
- subtree->create<std::vector<std::string>>(tx_fe_path / "los"/MAGNESIUM_LO1/"source/options")
- .set_publisher([this,chan_idx](){
+ });
+ subtree
+ ->create<std::vector<std::string>>(
+ tx_fe_path / "los" / MAGNESIUM_LO1 / "source/options")
+ .set_publisher([this, chan_idx]() {
return this->get_tx_lo_sources(MAGNESIUM_LO1, chan_idx);
- })
- ;
- subtree->create<std::string>(tx_fe_path / "los"/MAGNESIUM_LO1/"source/value")
- .add_coerced_subscriber([this,chan_idx](std::string src){
+ });
+ subtree->create<std::string>(tx_fe_path / "los" / MAGNESIUM_LO1 / "source/value")
+ .add_coerced_subscriber([this, chan_idx](std::string src) {
this->set_tx_lo_source(src, MAGNESIUM_LO1, chan_idx);
})
- .set_publisher([this,chan_idx](){
+ .set_publisher([this, chan_idx]() {
return this->get_tx_lo_source(MAGNESIUM_LO1, chan_idx);
- })
- ;
- subtree->create<double>(tx_fe_path / "los"/MAGNESIUM_LO1/"freq/value ")
- .set_publisher([this,chan_idx](){
- return this->get_tx_lo_freq(MAGNESIUM_LO1, chan_idx);
- })
- .set_coercer([this,chan_idx](double freq){
+ });
+ subtree->create<double>(tx_fe_path / "los" / MAGNESIUM_LO1 / "freq/value ")
+ .set_publisher(
+ [this, chan_idx]() { return this->get_tx_lo_freq(MAGNESIUM_LO1, chan_idx); })
+ .set_coercer([this, chan_idx](double freq) {
return this->set_tx_lo_freq(freq, MAGNESIUM_LO1, chan_idx);
- })
- ;
+ });
- subtree->create<meta_range_t>(tx_fe_path / "los"/MAGNESIUM_LO2/"freq/range")
- .set_publisher([this,chan_idx](){
- return this->get_tx_lo_freq_range(MAGNESIUM_LO2,chan_idx);
- })
- ;
- subtree->create<std::vector<std::string>>(tx_fe_path / "los"/MAGNESIUM_LO2/"source/options")
- .set_publisher([this,chan_idx](){
+ subtree->create<meta_range_t>(tx_fe_path / "los" / MAGNESIUM_LO2 / "freq/range")
+ .set_publisher([this, chan_idx]() {
+ return this->get_tx_lo_freq_range(MAGNESIUM_LO2, chan_idx);
+ });
+ subtree
+ ->create<std::vector<std::string>>(
+ tx_fe_path / "los" / MAGNESIUM_LO2 / "source/options")
+ .set_publisher([this, chan_idx]() {
return this->get_tx_lo_sources(MAGNESIUM_LO2, chan_idx);
- })
- ;
+ });
- subtree->create<std::string>(tx_fe_path / "los"/MAGNESIUM_LO2/"source/value")
- .add_coerced_subscriber([this,chan_idx](std::string src){
+ subtree->create<std::string>(tx_fe_path / "los" / MAGNESIUM_LO2 / "source/value")
+ .add_coerced_subscriber([this, chan_idx](std::string src) {
this->set_tx_lo_source(src, MAGNESIUM_LO2, chan_idx);
})
- .set_publisher([this,chan_idx](){
+ .set_publisher([this, chan_idx]() {
return this->get_tx_lo_source(MAGNESIUM_LO2, chan_idx);
- })
- ;
- subtree->create<double>(tx_fe_path / "los"/MAGNESIUM_LO2/"freq/value")
- .set_publisher([this,chan_idx](){
- return this->get_tx_lo_freq(MAGNESIUM_LO2, chan_idx);
- })
- .set_coercer([this,chan_idx](double freq){
+ });
+ subtree->create<double>(tx_fe_path / "los" / MAGNESIUM_LO2 / "freq/value")
+ .set_publisher(
+ [this, chan_idx]() { return this->get_tx_lo_freq(MAGNESIUM_LO2, chan_idx); })
+ .set_coercer([this, chan_idx](double freq) {
return this->set_tx_lo_freq(freq, MAGNESIUM_LO2, chan_idx);
});
}
@@ -721,13 +560,11 @@ void magnesium_radio_ctrl_impl::_init_prop_tree()
{
const fs_path fe_base = fs_path("dboards") / _radio_slot;
for (size_t chan_idx = 0; chan_idx < MAGNESIUM_NUM_CHANS; chan_idx++) {
- this->_init_frontend_subtree(
- _tree->subtree(fe_base), chan_idx);
+ this->_init_frontend_subtree(_tree->subtree(fe_base), chan_idx);
}
// EEPROM paths subject to change FIXME
- _tree->create<eeprom_map_t>(_root_path / "eeprom")
- .set(eeprom_map_t());
+ _tree->create<eeprom_map_t>(_root_path / "eeprom").set(eeprom_map_t());
// TODO change codec names
_tree->create<int>("rx_codecs" / _radio_slot / "gains");
@@ -736,94 +573,108 @@ void magnesium_radio_ctrl_impl::_init_prop_tree()
_tree->create<std::string>("tx_codecs" / _radio_slot / "name").set("AD9371 Dual DAC");
// TODO remove this dirty hack
- if (not _tree->exists("tick_rate"))
- {
- _tree->create<double>("tick_rate")
- .set_publisher([this](){ return this->get_rate(); })
- ;
+ if (not _tree->exists("tick_rate")) {
+ _tree->create<double>("tick_rate").set_publisher([this]() {
+ return this->get_rate();
+ });
}
// *****FP_GPIO************************
- for(const auto& attr: usrp::gpio_atr::gpio_attr_map) {
- if (not _tree->exists(fs_path("gpio") / "FP0" / attr.second)){
- switch (attr.first){
+ for (const auto& attr : usrp::gpio_atr::gpio_attr_map) {
+ if (not _tree->exists(fs_path("gpio") / "FP0" / attr.second)) {
+ switch (attr.first) {
case usrp::gpio_atr::GPIO_SRC:
- //FIXME: move this creation of this branch of ptree out side of radio impl;
- // since there's no data dependency between radio and SRC setting for FP0
- _tree->create<std::vector<std::string>>(fs_path("gpio") / "FP0" / attr.second)
- .set(std::vector<std::string>(
- 32,
- usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this, attr](
- const std::vector<std::string> str_val){
- uint32_t radio_src_value = 0;
- uint32_t master_value = 0;
- for(size_t i = 0 ; i<str_val.size(); i++){
- if(str_val[i] == "PS"){
- master_value += 1<<i;;
- }else{
- auto port_num = extract_port_number(str_val[i],_tree);
- radio_src_value =(1<<(2*i))*port_num + radio_src_value;
+ // FIXME: move this creation of this branch of ptree out side of
+ // radio impl;
+ // since there's no data dependency between radio and SRC setting for
+ // FP0
+ _tree
+ ->create<std::vector<std::string>>(
+ fs_path("gpio") / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber(
+ [this, attr](const std::vector<std::string> str_val) {
+ uint32_t radio_src_value = 0;
+ uint32_t master_value = 0;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ if (str_val[i] == "PS") {
+ master_value += 1 << i;
+ ;
+ } else {
+ auto port_num =
+ extract_port_number(str_val[i], _tree);
+ radio_src_value =
+ (1 << (2 * i)) * port_num + radio_src_value;
+ }
}
- }
- _rpcc->notify_with_token("set_fp_gpio_master", master_value);
- _rpcc->notify_with_token("set_fp_gpio_radio_src", radio_src_value);
- });
- break;
+ _rpcc->notify_with_token(
+ "set_fp_gpio_master", master_value);
+ _rpcc->notify_with_token(
+ "set_fp_gpio_radio_src", radio_src_value);
+ });
+ break;
case usrp::gpio_atr::GPIO_CTRL:
case usrp::gpio_atr::GPIO_DDR:
- _tree->create<std::vector<std::string>>(fs_path("gpio") / "FP0" / attr.second)
- .set(std::vector<std::string>(
- 32,
- usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this, attr](
- const std::vector<std::string> str_val){
- uint32_t val = 0;
- for(size_t i = 0 ; i < str_val.size() ; i++){
- val += usrp::gpio_atr::gpio_attr_value_pair.at(attr.second).at(str_val[i])<<i;
- }
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ _tree
+ ->create<std::vector<std::string>>(
+ fs_path("gpio") / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber(
+ [this, attr](const std::vector<std::string> str_val) {
+ uint32_t val = 0;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ val += usrp::gpio_atr::gpio_attr_value_pair
+ .at(attr.second)
+ .at(str_val[i])
+ << i;
+ }
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
break;
- case usrp::gpio_atr::GPIO_READBACK:{
+ case usrp::gpio_atr::GPIO_READBACK: {
_tree->create<uint32_t>(fs_path("gpio") / "FP0" / attr.second)
- .set_publisher([this](){
- return _fp_gpio->read_gpio();
- }
- );
- }
- break;
+ .set_publisher([this]() { return _fp_gpio->read_gpio(); });
+ } break;
default:
_tree->create<uint32_t>(fs_path("gpio") / "FP0" / attr.second)
- .set(0)
- .add_coerced_subscriber([this, attr](const uint32_t val){
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ .set(0)
+ .add_coerced_subscriber([this, attr](const uint32_t val) {
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
}
- }else{
- switch (attr.first){
+ } else {
+ switch (attr.first) {
case usrp::gpio_atr::GPIO_SRC:
- break;
+ break;
case usrp::gpio_atr::GPIO_CTRL:
case usrp::gpio_atr::GPIO_DDR:
- _tree->access<std::vector<std::string>>(fs_path("gpio") / "FP0" / attr.second)
- .set(std::vector<std::string>(32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this, attr](const std::vector<std::string> str_val){
- uint32_t val = 0;
- for(size_t i = 0 ; i < str_val.size() ; i++){
- val += usrp::gpio_atr::gpio_attr_value_pair.at(attr.second).at(str_val[i])<<i;
- }
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ _tree
+ ->access<std::vector<std::string>>(
+ fs_path("gpio") / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber(
+ [this, attr](const std::vector<std::string> str_val) {
+ uint32_t val = 0;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ val += usrp::gpio_atr::gpio_attr_value_pair
+ .at(attr.second)
+ .at(str_val[i])
+ << i;
+ }
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
break;
case usrp::gpio_atr::GPIO_READBACK:
break;
default:
_tree->access<uint32_t>(fs_path("gpio") / "FP0" / attr.second)
- .set(0)
- .add_coerced_subscriber([this, attr](const uint32_t val){
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ .set(0)
+ .add_coerced_subscriber([this, attr](const uint32_t val) {
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
}
}
}
@@ -831,34 +682,27 @@ void magnesium_radio_ctrl_impl::_init_prop_tree()
void magnesium_radio_ctrl_impl::_init_mpm_sensors(
- const direction_t dir,
- const size_t chan_idx
-) {
+ const direction_t dir, const size_t chan_idx)
+{
const std::string trx = (dir == RX_DIRECTION) ? "RX" : "TX";
- const fs_path fe_path =
- fs_path("dboards") / _radio_slot /
- (dir == RX_DIRECTION ? "rx_frontends" : "tx_frontends") / chan_idx;
- auto sensor_list =
- _rpcc->request_with_token<std::vector<std::string>>(
- this->_rpc_prefix + "get_sensors", trx);
+ const fs_path fe_path = fs_path("dboards") / _radio_slot
+ / (dir == RX_DIRECTION ? "rx_frontends" : "tx_frontends")
+ / chan_idx;
+ auto sensor_list = _rpcc->request_with_token<std::vector<std::string>>(
+ this->_rpc_prefix + "get_sensors", trx);
UHD_LOG_TRACE(unique_id(),
- "Chan " << chan_idx << ": Found "
- << sensor_list.size() << " " << trx << " sensors.");
- for (const auto &sensor_name : sensor_list) {
- UHD_LOG_TRACE(unique_id(),
- "Adding " << trx << " sensor " << sensor_name);
+ "Chan " << chan_idx << ": Found " << sensor_list.size() << " " << trx
+ << " sensors.");
+ for (const auto& sensor_name : sensor_list) {
+ UHD_LOG_TRACE(unique_id(), "Adding " << trx << " sensor " << sensor_name);
_tree->create<sensor_value_t>(fe_path / "sensors" / sensor_name)
- .add_coerced_subscriber([](const sensor_value_t &){
- throw uhd::runtime_error(
- "Attempting to write to sensor!");
+ .add_coerced_subscriber([](const sensor_value_t&) {
+ throw uhd::runtime_error("Attempting to write to sensor!");
})
- .set_publisher([this, trx, sensor_name, chan_idx](){
+ .set_publisher([this, trx, sensor_name, chan_idx]() {
return sensor_value_t(
this->_rpcc->request_with_token<sensor_value_t::sensor_map_t>(
- this->_rpc_prefix + "get_sensor",
- trx, sensor_name, chan_idx)
- );
- })
- ;
+ this->_rpc_prefix + "get_sensor", trx, sensor_name, chan_idx));
+ });
}
}
diff --git a/host/lib/usrp/dboard/neon/neon_ad9361_iface.cpp b/host/lib/usrp/dboard/neon/neon_ad9361_iface.cpp
index e19f890ca..a9cf28fc2 100644
--- a/host/lib/usrp/dboard/neon/neon_ad9361_iface.cpp
+++ b/host/lib/usrp/dboard/neon/neon_ad9361_iface.cpp
@@ -14,38 +14,33 @@ using namespace uhd;
class neon_ad9361_iface : public ad9361_ctrl
{
public:
- neon_ad9361_iface(
- rpc_client::sptr rpcc
- ) : _rpcc(rpcc)
- , _rpc_prefix("db_0_")
- , _log_prefix("AD9361")
+ neon_ad9361_iface(rpc_client::sptr rpcc)
+ : _rpcc(rpcc), _rpc_prefix("db_0_"), _log_prefix("AD9361")
{
- UHD_LOG_TRACE(_log_prefix,
- "Initialized controls with RPC prefix " << _rpc_prefix);
+ UHD_LOG_TRACE(
+ _log_prefix, "Initialized controls with RPC prefix " << _rpc_prefix);
}
- double set_bw_filter(const std::string &which, const double bw)
+ double set_bw_filter(const std::string& which, const double bw)
{
return _rpcc->request_with_token<double>(
this->_rpc_prefix + "set_bw_filter", which, bw);
}
- double set_gain(const std::string &which, const double value)
+ double set_gain(const std::string& which, const double value)
{
return _rpcc->request_with_token<double>(
this->_rpc_prefix + "set_gain", which, value);
}
- void set_agc(const std::string &which, bool enable)
+ void set_agc(const std::string& which, bool enable)
{
- _rpcc->request_with_token<void>(
- this->_rpc_prefix + "set_agc", which, enable);
+ _rpcc->request_with_token<void>(this->_rpc_prefix + "set_agc", which, enable);
}
- void set_agc_mode(const std::string &which, const std::string &mode)
+ void set_agc_mode(const std::string& which, const std::string& mode)
{
- _rpcc->request_with_token<void>(
- this->_rpc_prefix + "set_agc_mode", which, mode);
+ _rpcc->request_with_token<void>(this->_rpc_prefix + "set_agc_mode", which, mode);
}
double set_clock_rate(const double rate)
@@ -60,43 +55,41 @@ public:
this->_rpc_prefix + "set_active_chains", tx1, tx2, rx1, rx2);
}
- double tune(const std::string &which, const double value)
+ double tune(const std::string& which, const double value)
{
return _rpcc->request_with_token<double>(
this->_rpc_prefix + "tune", which, value);
}
- void set_dc_offset_auto(const std::string &which, const bool on)
+ void set_dc_offset_auto(const std::string& which, const bool on)
{
_rpcc->request_with_token<void>(
this->_rpc_prefix + "set_dc_offset_auto", which, on);
}
- void set_timing_mode(const std::string &timing_mode)
+ void set_timing_mode(const std::string& timing_mode)
{
_rpcc->request_with_token<void>(
this->_rpc_prefix + "set_timing_mode", timing_mode);
}
- void set_iq_balance_auto(const std::string &which, const bool on)
+ void set_iq_balance_auto(const std::string& which, const bool on)
{
_rpcc->request_with_token<void>(
this->_rpc_prefix + "set_iq_balance_auto", which, on);
}
- double get_freq(const std::string &which)
+ double get_freq(const std::string& which)
{
- return _rpcc->request_with_token<double>(
- this->_rpc_prefix + "get_freq", which);
+ return _rpcc->request_with_token<double>(this->_rpc_prefix + "get_freq", which);
}
void data_port_loopback(const bool on)
{
- _rpcc->request_with_token<void>(
- this->_rpc_prefix + "data_port_loopback", on);
+ _rpcc->request_with_token<void>(this->_rpc_prefix + "data_port_loopback", on);
}
- sensor_value_t get_rssi(const std::string &which)
+ sensor_value_t get_rssi(const std::string& which)
{
return sensor_value_t(_rpcc->request_with_token<sensor_value_t::sensor_map_t>(
this->_rpc_prefix + "get_rssi", which));
@@ -108,23 +101,25 @@ public:
this->_rpc_prefix + "get_temperature"));
}
- std::vector<std::string> get_filter_names(const std::string &which)
+ std::vector<std::string> get_filter_names(const std::string& which)
{
return _rpcc->request_with_token<std::vector<std::string>>(
this->_rpc_prefix + "get_filter_names", which);
}
- filter_info_base::sptr get_filter(const std::string &/*which*/,
- const std::string &/*filter_name*/)
+ filter_info_base::sptr get_filter(
+ const std::string& /*which*/, const std::string& /*filter_name*/)
{
- throw uhd::runtime_error("ad9361_ctrl::get_filter is not supported over an RPC connection");
+ throw uhd::runtime_error(
+ "ad9361_ctrl::get_filter is not supported over an RPC connection");
}
- void set_filter(const std::string &/*which*/,
- const std::string &/*filter_name*/,
- const filter_info_base::sptr /*filter*/)
+ void set_filter(const std::string& /*which*/,
+ const std::string& /*filter_name*/,
+ const filter_info_base::sptr /*filter*/)
{
- throw uhd::runtime_error("ad9361_ctrl::set_filter is not supported over an RPC connection");
+ throw uhd::runtime_error(
+ "ad9361_ctrl::set_filter is not supported over an RPC connection");
}
void output_digital_test_tone(bool enb)
@@ -150,13 +145,11 @@ ad9361_ctrl::sptr make_rpc(rpc_client::sptr rpcc)
return ad9361_ctrl::sptr(new neon_ad9361_iface(rpcc));
}
-/*! Helper function to convert direction and channel to the 'which' required by most Catalina
- driver functions */
+/*! Helper function to convert direction and channel to the 'which' required by most
+ Catalina driver functions */
std::string get_which_ad9361_chain(const direction_t dir, const size_t chan)
{
UHD_ASSERT_THROW(dir == RX_DIRECTION or dir == TX_DIRECTION);
UHD_ASSERT_THROW(chan == 0 or chan == 1);
- return str(boost::format("%s%d")
- % (dir == RX_DIRECTION ? "RX" : "TX")
- % (chan + 1));
+ return str(boost::format("%s%d") % (dir == RX_DIRECTION ? "RX" : "TX") % (chan + 1));
}
diff --git a/host/lib/usrp/dboard/neon/neon_bands.cpp b/host/lib/usrp/dboard/neon/neon_bands.cpp
index 25aa0a181..303d2801d 100644
--- a/host/lib/usrp/dboard/neon/neon_bands.cpp
+++ b/host/lib/usrp/dboard/neon/neon_bands.cpp
@@ -4,8 +4,8 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "neon_radio_ctrl_impl.hpp"
#include "neon_constants.hpp"
+#include "neon_radio_ctrl_impl.hpp"
#include <uhd/utils/math.hpp>
/*
@@ -51,54 +51,55 @@ using namespace uhd::rfnoc;
using namespace uhd::math::fp_compare;
namespace {
- /* Note on the RX filter bank:
- *
- * The RX path has 7 bands, which we call LB_B2, B3, .. HB same as
- * the schematic.
- *
- * The following constants define lower cutoff frequencies for each band.
- * LB_B2 does not have a lower cutoff frequency, it is implied by
- * AD9361_MIN_FREQ. NEON_RX_BAND1_MIN_FREQ is the cutover frequency
- * for switching from LB_B2 to LB_B3, and so on.
- *
- * Bands 1-6 have both high- and low-pass filters (effectively band
- * passes). Frequencies need to be chosen to allow as much of the full
- * bandwidth through unattenuated.
- */
- constexpr double NEON_RX_LB_BAND3_MIN_FREQ = 450e6;
- constexpr double NEON_RX_LB_BAND4_MIN_FREQ = 700e6;
- constexpr double NEON_RX_LB_BAND5_MIN_FREQ = 1200e6;
- constexpr double NEON_RX_LB_BAND6_MIN_FREQ = 1800e6;
- constexpr double NEON_RX_LB_BAND7_MIN_FREQ = 2350e6;
- constexpr double NEON_RX_HB_MIN_FREQ = 2600e6;
+/* Note on the RX filter bank:
+ *
+ * The RX path has 7 bands, which we call LB_B2, B3, .. HB same as
+ * the schematic.
+ *
+ * The following constants define lower cutoff frequencies for each band.
+ * LB_B2 does not have a lower cutoff frequency, it is implied by
+ * AD9361_MIN_FREQ. NEON_RX_BAND1_MIN_FREQ is the cutover frequency
+ * for switching from LB_B2 to LB_B3, and so on.
+ *
+ * Bands 1-6 have both high- and low-pass filters (effectively band
+ * passes). Frequencies need to be chosen to allow as much of the full
+ * bandwidth through unattenuated.
+ */
+constexpr double NEON_RX_LB_BAND3_MIN_FREQ = 450e6;
+constexpr double NEON_RX_LB_BAND4_MIN_FREQ = 700e6;
+constexpr double NEON_RX_LB_BAND5_MIN_FREQ = 1200e6;
+constexpr double NEON_RX_LB_BAND6_MIN_FREQ = 1800e6;
+constexpr double NEON_RX_LB_BAND7_MIN_FREQ = 2350e6;
+constexpr double NEON_RX_HB_MIN_FREQ = 2600e6;
- /* Note on the TX filter bank:
- *
- * The TX path has 9 bands, which we name according to the schematic.
- *
- * The following constants define lower cutoff frequencies for each band.
- * LB_80 does not have a lower cutoff frequency, it is implied by
- * AD9361_MIN_FREQ. NEON_TX_LB_160_MIN_FREQ is the cutover frequency
- * for switching from LB_80 to LB_160, and so on.
- *
- * On current Neon revisions, all filters on the TX filter bank are
- * low pass filters (no high pass filters).
- * Frequencies need to be chosen to allow as much of the full bandwidth
- * through unattenuated (so don't go all the way up to the cutoff frequency
- * of that filter).
- */
- constexpr double NEON_TX_LB_160_MIN_FREQ = 117.7e6;
- constexpr double NEON_TX_LB_225_MIN_FREQ = 178.2e6;
- constexpr double NEON_TX_LB_400_MIN_FREQ = 284.3e6;
- constexpr double NEON_TX_LB_575_MIN_FREQ = 453.7e6;
- constexpr double NEON_TX_LB_1000_MIN_FREQ = 723.8e6;
- constexpr double NEON_TX_LB_1700_MIN_FREQ = 1154.9e6;
- constexpr double NEON_TX_LB_2750_MIN_FREQ = 1842.6e6;
- constexpr double NEON_TX_HB_MIN_FREQ = 2940.0e6;
-}
+/* Note on the TX filter bank:
+ *
+ * The TX path has 9 bands, which we name according to the schematic.
+ *
+ * The following constants define lower cutoff frequencies for each band.
+ * LB_80 does not have a lower cutoff frequency, it is implied by
+ * AD9361_MIN_FREQ. NEON_TX_LB_160_MIN_FREQ is the cutover frequency
+ * for switching from LB_80 to LB_160, and so on.
+ *
+ * On current Neon revisions, all filters on the TX filter bank are
+ * low pass filters (no high pass filters).
+ * Frequencies need to be chosen to allow as much of the full bandwidth
+ * through unattenuated (so don't go all the way up to the cutoff frequency
+ * of that filter).
+ */
+constexpr double NEON_TX_LB_160_MIN_FREQ = 117.7e6;
+constexpr double NEON_TX_LB_225_MIN_FREQ = 178.2e6;
+constexpr double NEON_TX_LB_400_MIN_FREQ = 284.3e6;
+constexpr double NEON_TX_LB_575_MIN_FREQ = 453.7e6;
+constexpr double NEON_TX_LB_1000_MIN_FREQ = 723.8e6;
+constexpr double NEON_TX_LB_1700_MIN_FREQ = 1154.9e6;
+constexpr double NEON_TX_LB_2750_MIN_FREQ = 1842.6e6;
+constexpr double NEON_TX_HB_MIN_FREQ = 2940.0e6;
+} // namespace
-neon_radio_ctrl_impl::rx_band
-neon_radio_ctrl_impl::_map_freq_to_rx_band(const double freq) {
+neon_radio_ctrl_impl::rx_band neon_radio_ctrl_impl::_map_freq_to_rx_band(
+ const double freq)
+{
neon_radio_ctrl_impl::rx_band band;
if (fp_compare_epsilon<double>(freq) < AD9361_RX_MIN_FREQ) {
@@ -124,8 +125,9 @@ neon_radio_ctrl_impl::_map_freq_to_rx_band(const double freq) {
return band;
}
-neon_radio_ctrl_impl::tx_band
-neon_radio_ctrl_impl::_map_freq_to_tx_band(const double freq) {
+neon_radio_ctrl_impl::tx_band neon_radio_ctrl_impl::_map_freq_to_tx_band(
+ const double freq)
+{
neon_radio_ctrl_impl::tx_band band;
if (fp_compare_epsilon<double>(freq) < AD9361_TX_MIN_FREQ) {
@@ -154,4 +156,3 @@ neon_radio_ctrl_impl::_map_freq_to_tx_band(const double freq) {
return band;
}
-
diff --git a/host/lib/usrp/dboard/neon/neon_constants.hpp b/host/lib/usrp/dboard/neon/neon_constants.hpp
index 58e5244fc..42cfb6579 100644
--- a/host/lib/usrp/dboard/neon/neon_constants.hpp
+++ b/host/lib/usrp/dboard/neon/neon_constants.hpp
@@ -7,16 +7,16 @@
#ifndef INCLUDED_LIBUHD_NEON_CONSTANTS_HPP
#define INCLUDED_LIBUHD_NEON_CONSTANTS_HPP
-#include <vector>
-#include <string>
#include <cstddef>
+#include <string>
+#include <vector>
-static constexpr size_t FPGPIO_MASTER_RADIO = 0;
-static constexpr size_t TOTAL_RADIO_PORTS = 2;
-static constexpr double AD9361_RX_MIN_BANDWIDTH = 20.0e6; // HZ
+static constexpr size_t FPGPIO_MASTER_RADIO = 0;
+static constexpr size_t TOTAL_RADIO_PORTS = 2;
+static constexpr double AD9361_RX_MIN_BANDWIDTH = 20.0e6; // HZ
static constexpr double AD9361_RX_MAX_BANDWIDTH = 40.0e6; // HZ
-static constexpr double AD9361_TX_MIN_BANDWIDTH = 20.0e6; // HZ
+static constexpr double AD9361_TX_MIN_BANDWIDTH = 20.0e6; // HZ
static constexpr double AD9361_TX_MAX_BANDWIDTH = 40.0e6; // HZ
static constexpr double AD9361_TX_MIN_FREQ = 47.0e6; // Hz
@@ -27,27 +27,25 @@ static constexpr double AD9361_RX_MAX_FREQ = 6.0e9; // Hz
static constexpr double NEON_RADIO_RATE = 16e6; // Hz
-static constexpr double AD9361_MIN_RX_GAIN = 0.0; // dB
-static constexpr double AD9361_MAX_RX_GAIN = 76; // dB
+static constexpr double AD9361_MIN_RX_GAIN = 0.0; // dB
+static constexpr double AD9361_MAX_RX_GAIN = 76; // dB
static constexpr double AD9361_RX_GAIN_STEP = 1.0; // dB
-static constexpr double AD9361_MIN_TX_GAIN = 0.0; // dB
-static constexpr double AD9361_MAX_TX_GAIN = 89.75; // dB
+static constexpr double AD9361_MIN_TX_GAIN = 0.0; // dB
+static constexpr double AD9361_MAX_TX_GAIN = 89.75; // dB
static constexpr double AD9361_TX_GAIN_STEP = 0.25; // dB
-static constexpr bool NEON_DEFAULT_AUTO_DC_OFFSET = true;
+static constexpr bool NEON_DEFAULT_AUTO_DC_OFFSET = true;
static constexpr bool NEON_DEFAULT_AUTO_IQ_BALANCE = true;
-static constexpr bool NEON_DEFAULT_AGC_ENABLE = false;
+static constexpr bool NEON_DEFAULT_AGC_ENABLE = false;
-static constexpr double NEON_DEFAULT_GAIN = 0.0;
-static constexpr double NEON_DEFAULT_FREQ = 2.4e9; // Hz
-static constexpr double NEON_DEFAULT_BANDWIDTH = 40e6; // Hz
-static constexpr char NEON_DEFAULT_RX_ANTENNA[] = "RX2";
-static constexpr char NEON_DEFAULT_TX_ANTENNA[] = "TX/RX";
+static constexpr double NEON_DEFAULT_GAIN = 0.0;
+static constexpr double NEON_DEFAULT_FREQ = 2.4e9; // Hz
+static constexpr double NEON_DEFAULT_BANDWIDTH = 40e6; // Hz
+static constexpr char NEON_DEFAULT_RX_ANTENNA[] = "RX2";
+static constexpr char NEON_DEFAULT_TX_ANTENNA[] = "TX/RX";
-static const std::vector<std::string> NEON_RX_ANTENNAS = {
- "RX2", "TX/RX"
-};
+static const std::vector<std::string> NEON_RX_ANTENNAS = {"RX2", "TX/RX"};
static constexpr size_t NEON_NUM_CHANS = 2;
diff --git a/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.cpp b/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.cpp
index 71e467848..d8fabcee0 100644
--- a/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.cpp
+++ b/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.cpp
@@ -7,20 +7,20 @@
#include "neon_radio_ctrl_impl.hpp"
#include "neon_constants.hpp"
#include "neon_regs.hpp"
-#include <uhd/utils/log.hpp>
+#include <uhd/exception.hpp>
#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/transport/chdr.hpp>
-#include <uhd/utils/algorithm.hpp>
-#include <uhd/utils/math.hpp>
#include <uhd/types/direction.hpp>
#include <uhd/types/eeprom.hpp>
-#include <uhd/exception.hpp>
+#include <uhd/utils/algorithm.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/math.hpp>
#include <boost/algorithm/string.hpp>
-#include <boost/make_shared.hpp>
#include <boost/format.hpp>
-#include <sstream>
+#include <boost/make_shared.hpp>
#include <cmath>
#include <cstdlib>
+#include <sstream>
using namespace uhd;
using namespace uhd::usrp;
@@ -34,7 +34,7 @@ UHD_RFNOC_RADIO_BLOCK_CONSTRUCTOR(neon_radio_ctrl)
{
UHD_LOG_TRACE(unique_id(), "Entering neon_radio_ctrl_impl ctor...");
const char radio_slot_name[1] = {'A'};
- _radio_slot = radio_slot_name[get_block_id().get_block_count()];
+ _radio_slot = radio_slot_name[get_block_id().get_block_count()];
UHD_LOG_TRACE(unique_id(), "Radio slot: " << _radio_slot);
_rpc_prefix = "db_0_";
@@ -58,38 +58,39 @@ bool neon_radio_ctrl_impl::check_radio_config()
// mapping of frontend to radio perif index
static const size_t FE0 = 0;
static const size_t FE1 = 1;
- const size_t num_rx = _is_streamer_active(RX_DIRECTION, FE0) + _is_streamer_active(RX_DIRECTION, FE1);
- const size_t num_tx = _is_streamer_active(TX_DIRECTION, FE0) + _is_streamer_active(TX_DIRECTION, FE1);
+ const size_t num_rx =
+ _is_streamer_active(RX_DIRECTION, FE0) + _is_streamer_active(RX_DIRECTION, FE1);
+ const size_t num_tx =
+ _is_streamer_active(TX_DIRECTION, FE0) + _is_streamer_active(TX_DIRECTION, FE1);
- //setup the active chains in the codec
+ // setup the active chains in the codec
if ((num_rx + num_tx) == 0) {
// Ensure at least one RX chain is enabled so AD9361 outputs a sample clock
this->set_streaming_mode(false, false, true, false);
} else {
- this->set_streaming_mode(
- _is_streamer_active(TX_DIRECTION, FE0),
- _is_streamer_active(TX_DIRECTION, FE1),
- _is_streamer_active(RX_DIRECTION, FE0),
- _is_streamer_active(RX_DIRECTION, FE1)
- );
+ this->set_streaming_mode(_is_streamer_active(TX_DIRECTION, FE0),
+ _is_streamer_active(TX_DIRECTION, FE1),
+ _is_streamer_active(RX_DIRECTION, FE0),
+ _is_streamer_active(RX_DIRECTION, FE1));
}
return true;
}
-void neon_radio_ctrl_impl::set_streaming_mode(const bool tx1, const bool tx2, const bool rx1, const bool rx2)
+void neon_radio_ctrl_impl::set_streaming_mode(
+ const bool tx1, const bool tx2, const bool rx1, const bool rx2)
{
UHD_LOG_TRACE(unique_id(), "Setting up streaming ...")
const size_t num_rx = rx1 + rx2;
const size_t num_tx = tx1 + tx2;
- //setup the active chains in the codec
+ // setup the active chains in the codec
_ad9361->set_active_chains(tx1, tx2, rx1, rx2);
const std::string TIMING_MODE_2R2T = "2R2T";
const std::string TIMING_MODE_1R1T = "1R1T";
- const std::string MIMO = "MIMO"; // 2R2T
- const std::string SISO_TX1 = "SISO_TX1"; // 1R1T
- const std::string SISO_TX0 = "SISO_TX0"; // 1R1T
+ const std::string MIMO = "MIMO"; // 2R2T
+ const std::string SISO_TX1 = "SISO_TX1"; // 1R1T
+ const std::string SISO_TX0 = "SISO_TX0"; // 1R1T
// setup 1R1T/2R2T mode in catalina and fpga
// The Catalina interface in the fpga needs to know which TX channel to use for
// the data on the LVDS lines.
@@ -107,11 +108,11 @@ void neon_radio_ctrl_impl::set_streaming_mode(const bool tx1, const bool tx2, co
}
}
-void neon_radio_ctrl_impl::set_channel_mode(const std::string &channel_mode)
+void neon_radio_ctrl_impl::set_channel_mode(const std::string& channel_mode)
{
- //MIMO for 2R2T mode for 2 channels
- //SISO_TX1 for 1R1T mode for 1 channel - TX1
- //SISO_TX0 for 1R1T mode for 1 channel - TX0
+ // MIMO for 2R2T mode for 2 channels
+ // SISO_TX1 for 1R1T mode for 1 channel - TX1
+ // SISO_TX0 for 1R1T mode for 1 channel - TX0
_rpcc->request_with_token<void>("set_channel_mode", channel_mode);
}
@@ -127,9 +128,8 @@ void neon_radio_ctrl_impl::set_channel_mode(const std::string &channel_mode)
Note: This currently only tests 2R2T mode
*/
void neon_radio_ctrl_impl::loopback_self_test(
- std::function<void(uint32_t)> poker_functor,
- std::function<uint64_t()> peeker_functor
-) {
+ std::function<void(uint32_t)> poker_functor, std::function<uint64_t()> peeker_functor)
+{
// Save current rate before running this test
const double current_rate = this->get_rate();
// Set 2R2T mode, stream on all channels
@@ -139,7 +139,7 @@ void neon_radio_ctrl_impl::loopback_self_test(
// Put AD936x in loopback mode
_ad9361->data_port_loopback(true);
UHD_LOG_INFO(unique_id(), "Performing CODEC loopback test... ");
- size_t hash = size_t(time(NULL));
+ size_t hash = size_t(time(NULL));
constexpr size_t loopback_count = 100;
// Allow some time for AD936x to enter loopback mode.
@@ -150,27 +150,26 @@ void neon_radio_ctrl_impl::loopback_self_test(
// Sleeping 1ms is far more than enough.
std::this_thread::sleep_for(std::chrono::milliseconds(1));
- for (size_t i = 0; i < loopback_count; i++)
- {
+ for (size_t i = 0; i < loopback_count; i++) {
// Create test word
boost::hash_combine(hash, i);
const uint32_t word32 = uint32_t(hash) & 0xfff0fff0;
- //const uint32_t word32 = 0xCA00C100;
+ // const uint32_t word32 = 0xCA00C100;
// Write test word to codec_idle idle register (on TX side)
poker_functor(word32);
// Read back values - TX is lower 32-bits and RX is upper 32-bits
const uint64_t rb_word64 = peeker_functor();
- const uint32_t rb_tx = uint32_t(rb_word64 >> 32);
- const uint32_t rb_rx = uint32_t(rb_word64 & 0xffffffff);
+ const uint32_t rb_tx = uint32_t(rb_word64 >> 32);
+ const uint32_t rb_rx = uint32_t(rb_word64 & 0xffffffff);
// Compare TX and RX values to test word
bool test_fail = word32 != rb_tx or word32 != rb_rx;
- if(test_fail)
- {
- UHD_LOG_WARNING(unique_id(), "CODEC loopback test failed! "
- << boost::format("Expected: 0x%08X Received (TX/RX): 0x%08X/0x%08X")
- % word32 % rb_tx % rb_rx);
+ if (test_fail) {
+ UHD_LOG_WARNING(unique_id(),
+ "CODEC loopback test failed! "
+ << boost::format("Expected: 0x%08X Received (TX/RX): 0x%08X/0x%08X")
+ % word32 % rb_tx % rb_rx);
throw uhd::runtime_error("CODEC loopback test failed.");
}
}
@@ -189,63 +188,50 @@ void neon_radio_ctrl_impl::loopback_self_test(
double neon_radio_ctrl_impl::set_rate(const double rate)
{
std::lock_guard<std::mutex> l(_set_lock);
- UHD_LOG_DEBUG(unique_id(), "Asking for clock rate " << rate/1e6 << " MHz\n");
+ UHD_LOG_DEBUG(unique_id(), "Asking for clock rate " << rate / 1e6 << " MHz\n");
double actual_tick_rate = _ad9361->set_clock_rate(rate);
- UHD_LOG_DEBUG(unique_id(), "Actual clock rate " << actual_tick_rate/1e6 << " MHz\n");
+ UHD_LOG_DEBUG(
+ unique_id(), "Actual clock rate " << actual_tick_rate / 1e6 << " MHz\n");
radio_ctrl_impl::set_rate(rate);
return rate;
}
-void neon_radio_ctrl_impl::set_tx_antenna(
- const std::string &ant,
- const size_t chan
-) {
+void neon_radio_ctrl_impl::set_tx_antenna(const std::string& ant, const size_t chan)
+{
if (ant != get_tx_antenna(chan)) {
- throw uhd::value_error(str(
- boost::format("[%s] Requesting invalid TX antenna value: %s")
- % unique_id()
- % ant
- ));
+ throw uhd::value_error(
+ str(boost::format("[%s] Requesting invalid TX antenna value: %s")
+ % unique_id() % ant));
}
radio_ctrl_impl::set_tx_antenna(ant, chan);
// We can't actually set the TX antenna, so let's stop here.
}
-void neon_radio_ctrl_impl::set_rx_antenna(
- const std::string &ant,
- const size_t chan
-) {
+void neon_radio_ctrl_impl::set_rx_antenna(const std::string& ant, const size_t chan)
+{
UHD_ASSERT_THROW(chan <= NEON_NUM_CHANS);
- if (std::find(NEON_RX_ANTENNAS.begin(),
- NEON_RX_ANTENNAS.end(),
- ant) == NEON_RX_ANTENNAS.end()) {
- throw uhd::value_error(str(
- boost::format("[%s] Requesting invalid RX antenna value: %s")
- % unique_id()
- % ant
- ));
+ if (std::find(NEON_RX_ANTENNAS.begin(), NEON_RX_ANTENNAS.end(), ant)
+ == NEON_RX_ANTENNAS.end()) {
+ throw uhd::value_error(
+ str(boost::format("[%s] Requesting invalid RX antenna value: %s")
+ % unique_id() % ant));
}
- UHD_LOG_TRACE(unique_id(),
- "Setting RX antenna to " << ant << " for chan " << chan);
+ UHD_LOG_TRACE(unique_id(), "Setting RX antenna to " << ant << " for chan " << chan);
radio_ctrl_impl::set_rx_antenna(ant, chan);
_set_atr_bits(chan);
}
-double neon_radio_ctrl_impl::set_tx_frequency(
- const double freq,
- const size_t chan
-) {
- UHD_LOG_TRACE(unique_id(),
- "set_tx_frequency(f=" << freq << ", chan=" << chan << ")");
+double neon_radio_ctrl_impl::set_tx_frequency(const double freq, const size_t chan)
+{
+ UHD_LOG_TRACE(unique_id(), "set_tx_frequency(f=" << freq << ", chan=" << chan << ")");
std::lock_guard<std::mutex> l(_set_lock);
double clipped_freq = uhd::clip(freq, AD9361_TX_MIN_FREQ, AD9361_TX_MAX_FREQ);
- double coerced_freq = _ad9361->tune(
- get_which_ad9361_chain(TX_DIRECTION, chan),
- clipped_freq);
+ double coerced_freq =
+ _ad9361->tune(get_which_ad9361_chain(TX_DIRECTION, chan), clipped_freq);
radio_ctrl_impl::set_tx_frequency(coerced_freq, chan);
// Front-end switching
_set_atr_bits(chan);
@@ -253,19 +239,15 @@ double neon_radio_ctrl_impl::set_tx_frequency(
return coerced_freq;
}
-double neon_radio_ctrl_impl::set_rx_frequency(
- const double freq,
- const size_t chan
-) {
- UHD_LOG_TRACE(unique_id(),
- "set_rx_frequency(f=" << freq << ", chan=" << chan << ")");
+double neon_radio_ctrl_impl::set_rx_frequency(const double freq, const size_t chan)
+{
+ UHD_LOG_TRACE(unique_id(), "set_rx_frequency(f=" << freq << ", chan=" << chan << ")");
std::lock_guard<std::mutex> l(_set_lock);
double clipped_freq = uhd::clip(freq, AD9361_RX_MIN_FREQ, AD9361_RX_MAX_FREQ);
- double coerced_freq = _ad9361->tune(
- get_which_ad9361_chain(RX_DIRECTION, chan),
- clipped_freq);
+ double coerced_freq =
+ _ad9361->tune(get_which_ad9361_chain(RX_DIRECTION, chan), clipped_freq);
radio_ctrl_impl::set_rx_frequency(coerced_freq, chan);
// Front-end switching
_set_atr_bits(chan);
@@ -273,63 +255,48 @@ double neon_radio_ctrl_impl::set_rx_frequency(
return coerced_freq;
}
-double neon_radio_ctrl_impl::set_rx_bandwidth(
- const double bandwidth,
- const size_t chan
-) {
+double neon_radio_ctrl_impl::set_rx_bandwidth(const double bandwidth, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
- double clipped_bw = _ad9361->set_bw_filter(
- get_which_ad9361_chain(RX_DIRECTION, chan),
- bandwidth);
+ double clipped_bw =
+ _ad9361->set_bw_filter(get_which_ad9361_chain(RX_DIRECTION, chan), bandwidth);
return radio_ctrl_impl::set_rx_bandwidth(clipped_bw, chan);
}
-double neon_radio_ctrl_impl::set_tx_bandwidth(
- const double bandwidth,
- const size_t chan
-) {
+double neon_radio_ctrl_impl::set_tx_bandwidth(const double bandwidth, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
- double clipped_bw = _ad9361->set_bw_filter(
- get_which_ad9361_chain(TX_DIRECTION, chan),
- bandwidth);
+ double clipped_bw =
+ _ad9361->set_bw_filter(get_which_ad9361_chain(TX_DIRECTION, chan), bandwidth);
return radio_ctrl_impl::set_tx_bandwidth(clipped_bw, chan);
}
-double neon_radio_ctrl_impl::set_tx_gain(
- const double gain,
- const size_t chan
-) {
+double neon_radio_ctrl_impl::set_tx_gain(const double gain, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
- UHD_LOG_TRACE(unique_id(),
- "set_tx_gain(gain=" << gain << ", chan=" << chan << ")");
+ UHD_LOG_TRACE(unique_id(), "set_tx_gain(gain=" << gain << ", chan=" << chan << ")");
double clip_gain = uhd::clip(gain, AD9361_MIN_TX_GAIN, AD9361_MAX_TX_GAIN);
- _ad9361->set_gain(
- get_which_ad9361_chain(TX_DIRECTION, chan),
- clip_gain);
+ _ad9361->set_gain(get_which_ad9361_chain(TX_DIRECTION, chan), clip_gain);
radio_ctrl_impl::set_tx_gain(clip_gain, chan);
return clip_gain;
}
-double neon_radio_ctrl_impl::set_rx_gain(
- const double gain,
- const size_t chan
-) {
+double neon_radio_ctrl_impl::set_rx_gain(const double gain, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
- UHD_LOG_TRACE(unique_id(),
- "set_rx_gain(gain=" << gain << ", chan=" << chan << ")");
+ UHD_LOG_TRACE(unique_id(), "set_rx_gain(gain=" << gain << ", chan=" << chan << ")");
double clip_gain = uhd::clip(gain, AD9361_MIN_RX_GAIN, AD9361_MAX_RX_GAIN);
- _ad9361->set_gain(
- get_which_ad9361_chain(RX_DIRECTION, chan),
- clip_gain);
+ _ad9361->set_gain(get_which_ad9361_chain(RX_DIRECTION, chan), clip_gain);
radio_ctrl_impl::set_rx_gain(clip_gain, chan);
return clip_gain;
}
size_t neon_radio_ctrl_impl::get_chan_from_dboard_fe(
- const std::string &fe, const direction_t /* dir */
-) {
+ const std::string& fe, const direction_t /* dir */
+)
+{
const size_t chan = boost::lexical_cast<size_t>(fe);
- if (chan > _get_num_radios()-1) {
+ if (chan > _get_num_radios() - 1) {
UHD_LOG_WARNING(unique_id(),
boost::format("Invalid channel determined from dboard frontend %s.") % fe);
}
@@ -337,122 +304,107 @@ size_t neon_radio_ctrl_impl::get_chan_from_dboard_fe(
}
std::string neon_radio_ctrl_impl::get_dboard_fe_from_chan(
- const size_t chan,
- const direction_t /* dir */
-) {
+ const size_t chan, const direction_t /* dir */
+)
+{
return std::to_string(chan);
}
void neon_radio_ctrl_impl::set_rpc_client(
- uhd::rpc_client::sptr rpcc,
- const uhd::device_addr_t &block_args
-) {
- _rpcc = rpcc;
+ uhd::rpc_client::sptr rpcc, const uhd::device_addr_t& block_args)
+{
+ _rpcc = rpcc;
_block_args = block_args;
UHD_LOG_TRACE(unique_id(), "Instantiating AD9361 control object...");
_ad9361 = make_rpc(_rpcc);
UHD_LOG_TRACE(unique_id(), "Setting Catalina Defaults... ");
- //Initialize catalina
+ // Initialize catalina
this->_init_codec();
if (block_args.has_key("identify")) {
const std::string identify_val = block_args.get("identify");
- int identify_duration = std::atoi(identify_val.c_str());
+ int identify_duration = std::atoi(identify_val.c_str());
if (identify_duration == 0) {
identify_duration = 5;
}
UHD_LOG_INFO(unique_id(),
"Running LED identification process for " << identify_duration
- << " seconds.");
+ << " seconds.");
_identify_with_leds(identify_duration);
}
// Note: MCR gets set during the init() call (prior to this), which takes
// in arguments from the device args. So if block_args contains a
// master_clock_rate key, then it should better be whatever the device is
// configured to do.
- _master_clock_rate = _rpcc->request_with_token<double>(
- _rpc_prefix + "get_master_clock_rate");
+ _master_clock_rate =
+ _rpcc->request_with_token<double>(_rpc_prefix + "get_master_clock_rate");
if (block_args.cast<double>("master_clock_rate", _master_clock_rate)
- != _master_clock_rate) {
+ != _master_clock_rate) {
throw uhd::runtime_error(str(
boost::format("Master clock rate mismatch. Device returns %f MHz, "
"but should have been %f MHz.")
% (_master_clock_rate / 1e6)
- % (block_args.cast<double>(
- "master_clock_rate", _master_clock_rate) / 1e6)
- ));
-
+ % (block_args.cast<double>("master_clock_rate", _master_clock_rate) / 1e6)));
}
- UHD_LOG_DEBUG(unique_id(),
- "Master Clock Rate is: " << (_master_clock_rate / 1e6) << " MHz.");
+ UHD_LOG_DEBUG(
+ unique_id(), "Master Clock Rate is: " << (_master_clock_rate / 1e6) << " MHz.");
this->set_rate(_master_clock_rate);
// Loopback test
for (size_t chan = 0; chan < _get_num_radios(); chan++) {
loopback_self_test(
- [this, chan](const uint32_t value){
- this->sr_write(regs::CODEC_IDLE, value, chan);
- },
- [this, chan](){
+ [this, chan](
+ const uint32_t value) { this->sr_write(regs::CODEC_IDLE, value, chan); },
+ [this, chan]() {
return this->user_reg_read64(regs::RB_CODEC_READBACK, chan);
- }
- );
+ });
}
const size_t db_idx = get_block_id().get_block_count();
_tree->access<eeprom_map_t>(_root_path / "eeprom")
- .add_coerced_subscriber([this, db_idx](const eeprom_map_t& db_eeprom){
+ .add_coerced_subscriber([this, db_idx](const eeprom_map_t& db_eeprom) {
this->_rpcc->notify_with_token("set_db_eeprom", db_idx, db_eeprom);
})
- .set_publisher([this, db_idx](){
- return this->_rpcc->request_with_token<eeprom_map_t>(
- "get_db_eeprom", db_idx
- );
- })
- ;
+ .set_publisher([this, db_idx]() {
+ return this->_rpcc->request_with_token<eeprom_map_t>("get_db_eeprom", db_idx);
+ });
// Init sensors
- for (const auto &dir : std::vector<direction_t>{RX_DIRECTION, TX_DIRECTION}) {
+ for (const auto& dir : std::vector<direction_t>{RX_DIRECTION, TX_DIRECTION}) {
for (size_t chan_idx = 0; chan_idx < NEON_NUM_CHANS; chan_idx++) {
_init_mpm_sensors(dir, chan_idx);
}
}
}
-bool neon_radio_ctrl_impl::get_lo_lock_status(
- const direction_t dir
-) {
- if (not (bool(_rpcc))) {
- UHD_LOG_DEBUG(unique_id(),
- "Reported no LO lock due to lack of RPC connection.");
+bool neon_radio_ctrl_impl::get_lo_lock_status(const direction_t dir)
+{
+ if (not(bool(_rpcc))) {
+ UHD_LOG_DEBUG(unique_id(), "Reported no LO lock due to lack of RPC connection.");
return false;
}
const std::string trx = (dir == RX_DIRECTION) ? "rx" : "tx";
- bool lo_lock = _rpcc->request_with_token<bool>(
- _rpc_prefix + "get_ad9361_lo_lock", trx);
+ bool lo_lock =
+ _rpcc->request_with_token<bool>(_rpc_prefix + "get_ad9361_lo_lock", trx);
UHD_LOG_TRACE(unique_id(),
"AD9361 " << trx << " LO reports lock: " << (lo_lock ? "Yes" : "No"));
return lo_lock;
}
-void neon_radio_ctrl_impl::_set_atr_bits(
- const size_t chan
-) {
- const auto rx_freq = radio_ctrl_impl::get_rx_frequency(chan);
- const auto tx_freq = radio_ctrl_impl::get_tx_frequency(chan);
- const auto rx_ant = radio_ctrl_impl::get_rx_antenna(chan);
- const uint32_t rx_regs = _get_rx_switches(chan, rx_freq, rx_ant);
- const uint32_t tx_regs = _get_tx_switches(chan, tx_freq);
- const uint32_t idle_regs = TX_AMP_OFF << TX_AMP_SHIFT |
- TRX1_SW_TX_HB << TRX_SW_SHIFT |
- TX_SW2_LB_80 << TX_SW2_SHIFT |
- TX_SW1_LB_80 << TX_SW1_SHIFT |
- RX_SW3_OFF << RX_SW3_SHIFT |
- RX_SW2_OFF << RX_SW2_SHIFT |
- RX_SW1_OFF << RX_SW1_SHIFT;
+void neon_radio_ctrl_impl::_set_atr_bits(const size_t chan)
+{
+ const auto rx_freq = radio_ctrl_impl::get_rx_frequency(chan);
+ const auto tx_freq = radio_ctrl_impl::get_tx_frequency(chan);
+ const auto rx_ant = radio_ctrl_impl::get_rx_antenna(chan);
+ const uint32_t rx_regs = _get_rx_switches(chan, rx_freq, rx_ant);
+ const uint32_t tx_regs = _get_tx_switches(chan, tx_freq);
+ const uint32_t idle_regs = TX_AMP_OFF << TX_AMP_SHIFT | TRX1_SW_TX_HB << TRX_SW_SHIFT
+ | TX_SW2_LB_80 << TX_SW2_SHIFT
+ | TX_SW1_LB_80 << TX_SW1_SHIFT | RX_SW3_OFF << RX_SW3_SHIFT
+ | RX_SW2_OFF << RX_SW2_SHIFT | RX_SW1_OFF << RX_SW1_SHIFT;
_db_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_IDLE, idle_regs);
_db_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_RX_ONLY, rx_regs);
@@ -462,21 +414,21 @@ void neon_radio_ctrl_impl::_set_atr_bits(
// The LED signal names are reversed, but are consistent with the schematic
const int idle_led = 0;
const bool is_txrx = rx_ant == "TX/RX";
- const int rx_led = 1 << TRX_LED_GRN_SHIFT;
- const int tx_led = 1 << TX_LED_RED_SHIFT;
+ const int rx_led = 1 << TRX_LED_GRN_SHIFT;
+ const int tx_led = 1 << TX_LED_RED_SHIFT;
const int txrx_led = 1 << RX_LED_GRN_SHIFT;
_leds_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_IDLE, idle_led);
- _leds_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_RX_ONLY, is_txrx ? txrx_led : rx_led);
+ _leds_gpio[chan]->set_atr_reg(
+ usrp::gpio_atr::ATR_REG_RX_ONLY, is_txrx ? txrx_led : rx_led);
_leds_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_TX_ONLY, tx_led);
_leds_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_FULL_DUPLEX, rx_led | tx_led);
}
-void neon_radio_ctrl_impl::_identify_with_leds(
- const int identify_duration
-) {
- auto end_time = std::chrono::steady_clock::now()
- + std::chrono::seconds(identify_duration);
+void neon_radio_ctrl_impl::_identify_with_leds(const int identify_duration)
+{
+ auto end_time =
+ std::chrono::steady_clock::now() + std::chrono::seconds(identify_duration);
bool led_state = true;
while (std::chrono::steady_clock::now() < end_time) {
// Add update_leds
@@ -485,141 +437,126 @@ void neon_radio_ctrl_impl::_identify_with_leds(
}
}
-uint32_t neon_radio_ctrl_impl::_get_tx_switches(
- const size_t chan,
- const double freq
-) {
-
- UHD_LOG_TRACE(unique_id(),
- "Update all TX freq related switches. f=" << freq << " Hz, "
- );
+uint32_t neon_radio_ctrl_impl::_get_tx_switches(const size_t chan, const double freq)
+{
+ UHD_LOG_TRACE(
+ unique_id(), "Update all TX freq related switches. f=" << freq << " Hz, ");
auto tx_sw1 = TX_SW1_LB_160;
auto tx_sw2 = TX_SW2_LB_160;
- auto trx_sw = (chan == 0) ? TRX1_SW_TX_LB: TRX2_SW_TX_LB;
+ auto trx_sw = (chan == 0) ? TRX1_SW_TX_LB : TRX2_SW_TX_LB;
auto tx_amp = TX_AMP_LF_ON;
const auto band = _map_freq_to_tx_band(freq);
- switch(band) {
- case tx_band::LB_80:
- tx_sw1 = TX_SW1_LB_80;
- tx_sw2 = TX_SW2_LB_80;
- break;
- case tx_band::LB_160:
- tx_sw1 = TX_SW1_LB_160;
- tx_sw2 = TX_SW2_LB_160;
- break;
- case tx_band::LB_225:
- tx_sw1 = TX_SW1_LB_225;
- tx_sw2 = TX_SW2_LB_225;
- break;
- case tx_band::LB_400:
- tx_sw1 = TX_SW1_LB_400;
- tx_sw2 = TX_SW2_LB_400;
- break;
- case tx_band::LB_575:
- tx_sw1 = TX_SW1_LB_575;
- tx_sw2 = TX_SW2_LB_575;
- break;
- case tx_band::LB_1000:
- tx_sw1 = TX_SW1_LB_1000;
- tx_sw2 = TX_SW2_LB_1000;
- break;
- case tx_band::LB_1700:
- tx_sw1 = TX_SW1_LB_1700;
- tx_sw2 = TX_SW2_LB_1700;
- break;
- case tx_band::LB_2750:
- tx_sw1 = TX_SW1_LB_2750;
- tx_sw2 = TX_SW2_LB_2750;
- break;
- case tx_band::HB:
- trx_sw = (chan == 0) ? TRX1_SW_TX_HB: TRX2_SW_TX_HB;
- tx_amp = TX_AMP_HF_ON;
- break;
- case tx_band::INVALID_BAND:
- UHD_LOG_ERROR(unique_id(),
- "Cannot map TX frequency to band: " << freq);
- UHD_THROW_INVALID_CODE_PATH();
- break;
+ switch (band) {
+ case tx_band::LB_80:
+ tx_sw1 = TX_SW1_LB_80;
+ tx_sw2 = TX_SW2_LB_80;
+ break;
+ case tx_band::LB_160:
+ tx_sw1 = TX_SW1_LB_160;
+ tx_sw2 = TX_SW2_LB_160;
+ break;
+ case tx_band::LB_225:
+ tx_sw1 = TX_SW1_LB_225;
+ tx_sw2 = TX_SW2_LB_225;
+ break;
+ case tx_band::LB_400:
+ tx_sw1 = TX_SW1_LB_400;
+ tx_sw2 = TX_SW2_LB_400;
+ break;
+ case tx_band::LB_575:
+ tx_sw1 = TX_SW1_LB_575;
+ tx_sw2 = TX_SW2_LB_575;
+ break;
+ case tx_band::LB_1000:
+ tx_sw1 = TX_SW1_LB_1000;
+ tx_sw2 = TX_SW2_LB_1000;
+ break;
+ case tx_band::LB_1700:
+ tx_sw1 = TX_SW1_LB_1700;
+ tx_sw2 = TX_SW2_LB_1700;
+ break;
+ case tx_band::LB_2750:
+ tx_sw1 = TX_SW1_LB_2750;
+ tx_sw2 = TX_SW2_LB_2750;
+ break;
+ case tx_band::HB:
+ trx_sw = (chan == 0) ? TRX1_SW_TX_HB : TRX2_SW_TX_HB;
+ tx_amp = TX_AMP_HF_ON;
+ break;
+ case tx_band::INVALID_BAND:
+ UHD_LOG_ERROR(unique_id(), "Cannot map TX frequency to band: " << freq);
+ UHD_THROW_INVALID_CODE_PATH();
+ break;
}
- auto tx_regs = tx_amp << TX_AMP_SHIFT |
- trx_sw << TRX_SW_SHIFT |
- tx_sw2 << TX_SW2_SHIFT |
- tx_sw1 << TX_SW1_SHIFT;
+ auto tx_regs = tx_amp << TX_AMP_SHIFT | trx_sw << TRX_SW_SHIFT
+ | tx_sw2 << TX_SW2_SHIFT | tx_sw1 << TX_SW1_SHIFT;
return tx_regs;
}
uint32_t neon_radio_ctrl_impl::_get_rx_switches(
- const size_t chan,
- const double freq,
- const std::string &ant
-){
- UHD_LOG_TRACE(unique_id(),
- "Update all RX freq related switches. f=" << freq << " Hz, "
- );
+ const size_t chan, const double freq, const std::string& ant)
+{
+ UHD_LOG_TRACE(
+ unique_id(), "Update all RX freq related switches. f=" << freq << " Hz, ");
// Default to OFF
auto rx_sw1 = RX_SW1_OFF;
auto rx_sw2 = RX_SW2_OFF;
auto rx_sw3 = RX_SW3_OFF;
- auto trx_sw = (chan == 0) ? TRX1_SW_RX: TRX2_SW_RX;
+ auto trx_sw = (chan == 0) ? TRX1_SW_RX : TRX2_SW_RX;
if (ant == "TX/RX") {
rx_sw3 = RX_SW3_HBRX_LBTRX;
- trx_sw = (chan == 0) ? TRX1_SW_RX: TRX2_SW_RX;
- }
- else if (ant == "RX2") {
+ trx_sw = (chan == 0) ? TRX1_SW_RX : TRX2_SW_RX;
+ } else if (ant == "RX2") {
rx_sw3 = RX_SW3_HBTRX_LBRX;
// Set TRX switch to TX when receiving on RX2
trx_sw = TRX1_SW_TX_HB;
}
const auto band = _map_freq_to_rx_band(freq);
- switch(band) {
- case rx_band::LB_B2:
- rx_sw1 = RX_SW1_LB_B2;
- rx_sw2 = RX_SW2_LB_B2;
- break;
- case rx_band::LB_B3:
- rx_sw1 = RX_SW1_LB_B3;
- rx_sw2 = RX_SW2_LB_B3;
- break;
- case rx_band::LB_B4:
- rx_sw1 = RX_SW1_LB_B4;
- rx_sw2 = RX_SW2_LB_B4;
- break;
- case rx_band::LB_B5:
- rx_sw1 = RX_SW1_LB_B5;
- rx_sw2 = RX_SW2_LB_B5;
- break;
- case rx_band::LB_B6:
- rx_sw1 = RX_SW1_LB_B6;
- rx_sw2 = RX_SW2_LB_B6;
- break;
- case rx_band::LB_B7:
- rx_sw1 = RX_SW1_LB_B7;
- rx_sw2 = RX_SW2_LB_B7;
- break;
- case rx_band::HB:
- rx_sw1 = RX_SW1_OFF;
- rx_sw2 = RX_SW2_OFF;
- if (ant == "TX/RX") {
- rx_sw3 = RX_SW3_HBTRX_LBRX;
- }
- else if (ant == "RX2") {
- rx_sw3 = RX_SW3_HBRX_LBTRX;
- }
- break;
- case rx_band::INVALID_BAND:
- UHD_LOG_ERROR(unique_id(),
- "Cannot map RX frequency to band: " << freq);
- UHD_THROW_INVALID_CODE_PATH();
- break;
+ switch (band) {
+ case rx_band::LB_B2:
+ rx_sw1 = RX_SW1_LB_B2;
+ rx_sw2 = RX_SW2_LB_B2;
+ break;
+ case rx_band::LB_B3:
+ rx_sw1 = RX_SW1_LB_B3;
+ rx_sw2 = RX_SW2_LB_B3;
+ break;
+ case rx_band::LB_B4:
+ rx_sw1 = RX_SW1_LB_B4;
+ rx_sw2 = RX_SW2_LB_B4;
+ break;
+ case rx_band::LB_B5:
+ rx_sw1 = RX_SW1_LB_B5;
+ rx_sw2 = RX_SW2_LB_B5;
+ break;
+ case rx_band::LB_B6:
+ rx_sw1 = RX_SW1_LB_B6;
+ rx_sw2 = RX_SW2_LB_B6;
+ break;
+ case rx_band::LB_B7:
+ rx_sw1 = RX_SW1_LB_B7;
+ rx_sw2 = RX_SW2_LB_B7;
+ break;
+ case rx_band::HB:
+ rx_sw1 = RX_SW1_OFF;
+ rx_sw2 = RX_SW2_OFF;
+ if (ant == "TX/RX") {
+ rx_sw3 = RX_SW3_HBTRX_LBRX;
+ } else if (ant == "RX2") {
+ rx_sw3 = RX_SW3_HBRX_LBTRX;
+ }
+ break;
+ case rx_band::INVALID_BAND:
+ UHD_LOG_ERROR(unique_id(), "Cannot map RX frequency to band: " << freq);
+ UHD_THROW_INVALID_CODE_PATH();
+ break;
}
- auto rx_regs = trx_sw << TRX_SW_SHIFT |
- rx_sw3 << RX_SW3_SHIFT |
- rx_sw2 << RX_SW2_SHIFT |
- rx_sw1 << RX_SW1_SHIFT;
+ auto rx_regs = trx_sw << TRX_SW_SHIFT | rx_sw3 << RX_SW3_SHIFT
+ | rx_sw2 << RX_SW2_SHIFT | rx_sw1 << RX_SW1_SHIFT;
return rx_regs;
}
diff --git a/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.hpp b/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.hpp
index ac7fd70e9..88d1eed73 100644
--- a/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.hpp
+++ b/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.hpp
@@ -11,13 +11,12 @@
#include <uhd/types/serial.hpp>
#include <uhd/usrp/dboard_manager.hpp>
#include <uhd/usrp/gpio_defs.hpp>
-#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
-#include <uhdlib/rfnoc/rpc_block_ctrl.hpp>
#include <uhdlib/rfnoc/radio_ctrl_impl.hpp>
+#include <uhdlib/rfnoc/rpc_block_ctrl.hpp>
+#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
#include <mutex>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Provide access to an Magnesium radio.
*/
@@ -27,16 +26,7 @@ public:
typedef boost::shared_ptr<neon_radio_ctrl_impl> sptr;
//! Frequency bands for RX. Bands are a function of the analog filter banks
- enum class rx_band {
- INVALID_BAND,
- LB_B2,
- LB_B3,
- LB_B4,
- LB_B5,
- LB_B6,
- LB_B7,
- HB
- };
+ enum class rx_band { INVALID_BAND, LB_B2, LB_B3, LB_B4, LB_B5, LB_B6, LB_B7, HB };
//! Frequency bands for TX. Bands are a function of the analog filter banks
enum class tx_band {
@@ -56,37 +46,28 @@ public:
* ATR/ Switches Types
*************************************************************************/
//! ATR state
- enum atr_state_t {
- IDLE,
- RX_ONLY,
- TX_ONLY,
- FULL_DUPLEX
- };
+ enum atr_state_t { IDLE, RX_ONLY, TX_ONLY, FULL_DUPLEX };
//! Channel select:
- enum chan_sel_t {
- CHAN1,
- CHAN2,
- BOTH
- };
+ enum chan_sel_t { CHAN1, CHAN2, BOTH };
enum tx_sw1_t {
- TX_SW1_LB_80 = 3,
- TX_SW1_LB_160 = 7,
- TX_SW1_LB_225 = 1,
- TX_SW1_LB_400 = 5,
- TX_SW1_LB_575 = 2,
+ TX_SW1_LB_80 = 3,
+ TX_SW1_LB_160 = 7,
+ TX_SW1_LB_225 = 1,
+ TX_SW1_LB_400 = 5,
+ TX_SW1_LB_575 = 2,
TX_SW1_LB_1000 = 6,
TX_SW1_LB_1700 = 0,
TX_SW1_LB_2750 = 4
};
enum tx_sw2_t {
- TX_SW2_LB_80 = 7,
- TX_SW2_LB_160 = 3,
- TX_SW2_LB_225 = 5,
- TX_SW2_LB_400 = 1,
- TX_SW2_LB_575 = 6,
+ TX_SW2_LB_80 = 7,
+ TX_SW2_LB_160 = 3,
+ TX_SW2_LB_225 = 5,
+ TX_SW2_LB_400 = 1,
+ TX_SW2_LB_575 = 6,
TX_SW2_LB_1000 = 2,
TX_SW2_LB_1700 = 4,
TX_SW2_LB_2750 = 0
@@ -95,10 +76,10 @@ public:
enum trx_sw_t {
TRX1_SW_TX_HB = 2,
TRX1_SW_TX_LB = 1,
- TRX1_SW_RX = 4,
+ TRX1_SW_RX = 4,
TRX2_SW_TX_HB = 2,
TRX2_SW_TX_LB = 4,
- TRX2_SW_RX = 1
+ TRX2_SW_RX = 1
};
enum rx_sw1_t {
@@ -108,7 +89,7 @@ public:
RX_SW1_LB_B5 = 3,
RX_SW1_LB_B6 = 0,
RX_SW1_LB_B7 = 1,
- RX_SW1_OFF = 7
+ RX_SW1_OFF = 7
};
@@ -119,20 +100,16 @@ public:
RX_SW2_LB_B5 = 2,
RX_SW2_LB_B6 = 1,
RX_SW2_LB_B7 = 0,
- RX_SW2_OFF = 7
+ RX_SW2_OFF = 7
};
enum rx_sw3_t {
RX_SW3_HBRX_LBTRX = 1,
RX_SW3_HBTRX_LBRX = 2,
- RX_SW3_OFF = 0 //or 3
+ RX_SW3_OFF = 0 // or 3
};
- enum tx_amp_t {
- TX_AMP_HF_ON = 2,
- TX_AMP_LF_ON = 1,
- TX_AMP_OFF = 3
- };
+ enum tx_amp_t { TX_AMP_HF_ON = 2, TX_AMP_LF_ON = 1, TX_AMP_OFF = 3 };
/************************************************************************
* Structors
@@ -149,10 +126,11 @@ public:
virtual bool check_radio_config();
//! Set which channel mode is used
- void set_channel_mode(const std::string &channel_mode);
+ void set_channel_mode(const std::string& channel_mode);
//! Set streaming mode - active chains, channel_mode, timing_mode
- void set_streaming_mode(const bool tx1, const bool tx2, const bool rx1, const bool rx2);
+ void set_streaming_mode(
+ const bool tx1, const bool tx2, const bool rx1, const bool rx2);
/*! Run a loopback self test.
*
@@ -163,19 +141,18 @@ public:
*
* \param iface An interface to the associated radio control core
* \param iface The radio control core's address to write the loopback value
- * \param iface The radio control core's readback address to read back the returned value
+ * \param iface The radio control core's readback address to read back the returned
+ * value
*
* \throws a uhd::runtime_error if the loopback value didn't match.
*/
- void loopback_self_test(
- std::function<void(uint32_t)> poker_functor,
- std::function<uint64_t()> peeker_functor
- );
+ void loopback_self_test(std::function<void(uint32_t)> poker_functor,
+ std::function<uint64_t()> peeker_functor);
double set_rate(const double rate);
- void set_tx_antenna(const std::string &ant, const size_t chan);
- void set_rx_antenna(const std::string &ant, const size_t chan);
+ void set_tx_antenna(const std::string& ant, const size_t chan);
+ void set_rx_antenna(const std::string& ant, const size_t chan);
double set_tx_frequency(const double freq, const size_t chan);
double set_rx_frequency(const double freq, const size_t chan);
@@ -186,13 +163,10 @@ public:
double set_tx_gain(const double gain, const size_t chan);
double set_rx_gain(const double gain, const size_t chan);
- size_t get_chan_from_dboard_fe(const std::string &fe, const direction_t dir);
+ size_t get_chan_from_dboard_fe(const std::string& fe, const direction_t dir);
std::string get_dboard_fe_from_chan(const size_t chan, const direction_t dir);
- void set_rpc_client(
- uhd::rpc_client::sptr rpcc,
- const uhd::device_addr_t &block_args
- );
+ void set_rpc_client(uhd::rpc_client::sptr rpcc, const uhd::device_addr_t& block_args);
private:
/**************************************************************************
@@ -205,10 +179,7 @@ private:
void _init_defaults();
//! Init a subtree for the RF frontends
- void _init_frontend_subtree(
- uhd::property_tree::sptr subtree,
- const size_t chan_idx
- );
+ void _init_frontend_subtree(uhd::property_tree::sptr subtree, const size_t chan_idx);
//! Initialize Catalina defaults
void _init_codec();
@@ -216,10 +187,7 @@ private:
//! Initialize property tree
void _init_prop_tree();
- void _init_mpm_sensors(
- const direction_t dir,
- const size_t chan_idx
- );
+ void _init_mpm_sensors(const direction_t dir, const size_t chan_idx);
//! Map a frequency in Hz to an rx_band value. Will return
// rx_band::INVALID_BAND if the frequency is out of range.
@@ -233,33 +201,21 @@ private:
*************************************************************************/
//! Return LO lock status. Factors in current band (low/high) and
// direction (TX/RX)
- bool get_lo_lock_status(
- const direction_t dir
- );
+ bool get_lo_lock_status(const direction_t dir);
/**************************************************************************
* Misc Controls
*************************************************************************/
//! Blink the front-panel LEDs for \p identify_duration,
// and resume normal operation.
- void _identify_with_leds(
- const int identify_duration
- );
+ void _identify_with_leds(const int identify_duration);
uint32_t _get_rx_switches(
- const size_t chan,
- const double freq,
- const std::string &ant
- );
+ const size_t chan, const double freq, const std::string& ant);
- uint32_t _get_tx_switches(
- const size_t chan,
- const double freq
- );
+ uint32_t _get_tx_switches(const size_t chan, const double freq);
- void _set_atr_bits(
- const size_t chan
- );
+ void _set_atr_bits(const size_t chan);
/**************************************************************************
* Private attributes
@@ -283,7 +239,7 @@ private:
uhd::spi_iface::sptr _spi;
//! Reference to the AD9361 controls
- //neon_ad9361_iface::uptr _ad9361;
+ // neon_ad9361_iface::uptr _ad9361;
ad9361_ctrl::sptr _ad9361;
//! ATR controls. These control the AD9361 gain
@@ -305,4 +261,3 @@ private:
}} /* namespace uhd::rfnoc */
#endif /* INCLUDED_LIBUHD_RFNOC_NEON_RADIO_CTRL_IMPL_HPP */
-
diff --git a/host/lib/usrp/dboard/neon/neon_radio_ctrl_init.cpp b/host/lib/usrp/dboard/neon/neon_radio_ctrl_init.cpp
index c71fd0169..783f0c7b2 100644
--- a/host/lib/usrp/dboard/neon/neon_radio_ctrl_init.cpp
+++ b/host/lib/usrp/dboard/neon/neon_radio_ctrl_init.cpp
@@ -4,17 +4,17 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "neon_radio_ctrl_impl.hpp"
#include "neon_constants.hpp"
-#include <uhd/utils/log.hpp>
+#include "neon_radio_ctrl_impl.hpp"
+#include <uhd/transport/chdr.hpp>
#include <uhd/types/eeprom.hpp>
#include <uhd/types/sensors.hpp>
-#include <uhd/transport/chdr.hpp>
+#include <uhd/utils/log.hpp>
#include <boost/algorithm/string.hpp>
-#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/case_conv.hpp>
-#include <vector>
+#include <boost/algorithm/string/split.hpp>
#include <string>
+#include <vector>
using namespace uhd;
using namespace uhd::rfnoc;
@@ -25,32 +25,35 @@ using namespace uhd::rfnoc;
// This function convert the format of attribute "Radio_N_M"
// to a single value port number = N*number_of_port_per_radio + M
-uint32_t _extract_port_number(std::string radio_src_string, uhd::property_tree::sptr ptree){
+uint32_t _extract_port_number(
+ std::string radio_src_string, uhd::property_tree::sptr ptree)
+{
std::string s_val = "0";
std::vector<std::string> radio_strings;
- boost::algorithm::split(
- radio_strings,
+ boost::algorithm::split(radio_strings,
radio_src_string,
boost::is_any_of("_/"),
boost::token_compress_on);
boost::to_lower(radio_strings[0]);
- if (radio_strings.size()<3) {
- throw uhd::runtime_error(str(boost::format("%s is an invalid GPIO source string.") % radio_src_string));
+ if (radio_strings.size() < 3) {
+ throw uhd::runtime_error(str(
+ boost::format("%s is an invalid GPIO source string.") % radio_src_string));
}
size_t radio_num = std::stoi(radio_strings[1]);
- size_t port_num = std::stoi(radio_strings[2]);
+ size_t port_num = std::stoi(radio_strings[2]);
if (radio_strings[0] != "radio") {
- throw uhd::runtime_error("Front panel GPIO bank can only accept a radio block as its driver.");
+ throw uhd::runtime_error(
+ "Front panel GPIO bank can only accept a radio block as its driver.");
}
- std::string radio_port_out = "Radio_"+ radio_strings[1] + "/ports/out";
- std::string radio_port_path = radio_port_out + "/"+ radio_strings[2];
- auto found = ptree->exists(fs_path("xbar")/ radio_port_path);
- if (not found){
- throw uhd::runtime_error(str(boost::format(
- "Could not find radio port %s.\n") % radio_port_path));
+ std::string radio_port_out = "Radio_" + radio_strings[1] + "/ports/out";
+ std::string radio_port_path = radio_port_out + "/" + radio_strings[2];
+ auto found = ptree->exists(fs_path("xbar") / radio_port_path);
+ if (not found) {
+ throw uhd::runtime_error(
+ str(boost::format("Could not find radio port %s.\n") % radio_port_path));
}
- size_t port_size = ptree->list(fs_path("xbar")/ radio_port_out).size();
- return radio_num*port_size + port_num;
+ size_t port_size = ptree->list(fs_path("xbar") / radio_port_out).size();
+ return radio_num * port_size + port_num;
}
void neon_radio_ctrl_impl::_init_defaults()
@@ -60,8 +63,7 @@ void neon_radio_ctrl_impl::_init_defaults()
const size_t num_tx_chans = get_input_ports().size();
UHD_LOG_TRACE(unique_id(),
- "Num TX chans: " << num_tx_chans
- << " Num RX chans: " << num_rx_chans);
+ "Num TX chans: " << num_tx_chans << " Num RX chans: " << num_rx_chans);
for (size_t chan = 0; chan < num_rx_chans; chan++) {
radio_ctrl_impl::set_rx_frequency(NEON_DEFAULT_FREQ, chan);
@@ -83,8 +85,7 @@ void neon_radio_ctrl_impl::_init_defaults()
const size_t default_spp =
(_tree->access<size_t>("mtu/recv").get() - max_bytes_header)
/ (2 * sizeof(int16_t));
- UHD_LOG_DEBUG(unique_id(),
- "Setting default spp to " << default_spp);
+ UHD_LOG_DEBUG(unique_id(), "Setting default spp to " << default_spp);
_tree->access<int>(get_arg_path("spp") / "value").set(default_spp);
}
@@ -92,255 +93,181 @@ void neon_radio_ctrl_impl::_init_peripherals()
{
UHD_LOG_TRACE(unique_id(), "Initializing peripherals...");
- _db_gpio.clear(); // Following the as-if rule, this can get optimized out
+ _db_gpio.clear(); // Following the as-if rule, this can get optimized out
for (size_t radio_idx = 0; radio_idx < _get_num_radios(); radio_idx++) {
- UHD_LOG_TRACE(unique_id(),
- "Initializing GPIOs for channel " << radio_idx);
- _db_gpio.emplace_back(
- usrp::gpio_atr::gpio_atr_3000::make_write_only(
- _get_ctrl(radio_idx),
- regs::sr_addr(regs::GPIO)
- )
- );
- _db_gpio[radio_idx]->set_atr_mode(usrp::gpio_atr::MODE_ATR, usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
+ UHD_LOG_TRACE(unique_id(), "Initializing GPIOs for channel " << radio_idx);
+ _db_gpio.emplace_back(usrp::gpio_atr::gpio_atr_3000::make_write_only(
+ _get_ctrl(radio_idx), regs::sr_addr(regs::GPIO)));
+ _db_gpio[radio_idx]->set_atr_mode(
+ usrp::gpio_atr::MODE_ATR, usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
}
- _leds_gpio.clear(); // Following the as-if rule, this can get optimized out
+ _leds_gpio.clear(); // Following the as-if rule, this can get optimized out
for (size_t radio_idx = 0; radio_idx < _get_num_radios(); radio_idx++) {
- UHD_LOG_TRACE(unique_id(),
- "Initializing GPIOs for channel " << radio_idx);
- _leds_gpio.emplace_back(
- usrp::gpio_atr::gpio_atr_3000::make_write_only(
- _get_ctrl(radio_idx),
- regs::sr_addr(regs::LEDS)
- )
- );
+ UHD_LOG_TRACE(unique_id(), "Initializing GPIOs for channel " << radio_idx);
+ _leds_gpio.emplace_back(usrp::gpio_atr::gpio_atr_3000::make_write_only(
+ _get_ctrl(radio_idx), regs::sr_addr(regs::LEDS)));
- _leds_gpio[radio_idx]->set_atr_mode(usrp::gpio_atr::MODE_ATR, usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
+ _leds_gpio[radio_idx]->set_atr_mode(
+ usrp::gpio_atr::MODE_ATR, usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
}
UHD_LOG_TRACE(unique_id(), "Initializing front-panel GPIO control...")
_fp_gpio = usrp::gpio_atr::gpio_atr_3000::make(
- _get_ctrl(0),
- regs::sr_addr(regs::FP_GPIO),
- regs::rb_addr(regs::RB_FP_GPIO)
- );
+ _get_ctrl(0), regs::sr_addr(regs::FP_GPIO), regs::rb_addr(regs::RB_FP_GPIO));
}
void neon_radio_ctrl_impl::_init_frontend_subtree(
- uhd::property_tree::sptr subtree,
- const size_t chan_idx
-) {
+ uhd::property_tree::sptr subtree, const size_t chan_idx)
+{
const fs_path tx_fe_path = fs_path("tx_frontends") / chan_idx;
const fs_path rx_fe_path = fs_path("rx_frontends") / chan_idx;
UHD_LOG_TRACE(unique_id(),
- "Adding non-RFNoC block properties for channel " << chan_idx <<
- " to prop tree path " << tx_fe_path << " and " << rx_fe_path);
+ "Adding non-RFNoC block properties for channel "
+ << chan_idx << " to prop tree path " << tx_fe_path << " and " << rx_fe_path);
// TX Standard attributes
- subtree->create<std::string>(tx_fe_path / "name")
- .set(str(boost::format("Neon")))
- ;
- subtree->create<std::string>(tx_fe_path / "connection")
- .set("IQ")
- ;
+ subtree->create<std::string>(tx_fe_path / "name").set(str(boost::format("Neon")));
+ subtree->create<std::string>(tx_fe_path / "connection").set("IQ");
// RX Standard attributes
- subtree->create<std::string>(rx_fe_path / "name")
- .set(str(boost::format("Neon")))
- ;
- subtree->create<std::string>(rx_fe_path / "connection")
- .set("IQ")
- ;
+ subtree->create<std::string>(rx_fe_path / "name").set(str(boost::format("Neon")));
+ subtree->create<std::string>(rx_fe_path / "connection").set("IQ");
// TX Antenna
subtree->create<std::string>(tx_fe_path / "antenna" / "value")
- .add_coerced_subscriber([this, chan_idx](const std::string &ant){
+ .add_coerced_subscriber([this, chan_idx](const std::string& ant) {
this->set_tx_antenna(ant, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_tx_antenna(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_tx_antenna(chan_idx); });
subtree->create<std::vector<std::string>>(tx_fe_path / "antenna" / "options")
.set({NEON_DEFAULT_TX_ANTENNA})
- .add_coerced_subscriber([](const std::vector<std::string> &){
- throw uhd::runtime_error(
- "Attempting to update antenna options!");
- })
- ;
+ .add_coerced_subscriber([](const std::vector<std::string>&) {
+ throw uhd::runtime_error("Attempting to update antenna options!");
+ });
// RX Antenna
subtree->create<std::string>(rx_fe_path / "antenna" / "value")
- .add_coerced_subscriber([this, chan_idx](const std::string &ant){
+ .add_coerced_subscriber([this, chan_idx](const std::string& ant) {
this->set_rx_antenna(ant, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_rx_antenna(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_rx_antenna(chan_idx); });
subtree->create<std::vector<std::string>>(rx_fe_path / "antenna" / "options")
.set(NEON_RX_ANTENNAS)
- .add_coerced_subscriber([](const std::vector<std::string> &){
- throw uhd::runtime_error(
- "Attempting to update antenna options!");
- })
- ;
+ .add_coerced_subscriber([](const std::vector<std::string>&) {
+ throw uhd::runtime_error("Attempting to update antenna options!");
+ });
// TX frequency
subtree->create<double>(tx_fe_path / "freq" / "value")
- .set_coercer([this, chan_idx](const double freq){
+ .set_coercer([this, chan_idx](const double freq) {
return this->set_tx_frequency(freq, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_tx_frequency(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_tx_frequency(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "freq" / "range")
.set(meta_range_t(AD9361_TX_MIN_FREQ, AD9361_TX_MAX_FREQ, 1.0))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update freq range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update freq range!");
+ });
// RX frequency
subtree->create<double>(rx_fe_path / "freq" / "value")
- .set_coercer([this, chan_idx](const double freq){
+ .set_coercer([this, chan_idx](const double freq) {
return this->set_rx_frequency(freq, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_rx_frequency(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_rx_frequency(chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "freq" / "range")
.set(meta_range_t(AD9361_RX_MIN_FREQ, AD9361_RX_MAX_FREQ, 1.0))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update freq range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update freq range!");
+ });
// TX bandwidth
subtree->create<double>(tx_fe_path / "bandwidth" / "value")
.set(AD9361_TX_MAX_BANDWIDTH)
- .set_coercer([this, chan_idx](const double bw){
+ .set_coercer([this, chan_idx](const double bw) {
return this->set_tx_bandwidth(bw, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_tx_bandwidth(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_tx_bandwidth(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "bandwidth" / "range")
.set(meta_range_t(AD9361_TX_MIN_BANDWIDTH, AD9361_TX_MAX_BANDWIDTH))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update bandwidth range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update bandwidth range!");
+ });
// RX bandwidth
subtree->create<double>(rx_fe_path / "bandwidth" / "value")
.set(AD9361_RX_MAX_BANDWIDTH)
- .set_coercer([this, chan_idx](const double bw){
+ .set_coercer([this, chan_idx](const double bw) {
return this->set_rx_bandwidth(bw, chan_idx);
- })
- ;
+ });
subtree->create<meta_range_t>(rx_fe_path / "bandwidth" / "range")
.set(meta_range_t(AD9361_RX_MIN_BANDWIDTH, AD9361_RX_MAX_BANDWIDTH))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update bandwidth range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update bandwidth range!");
+ });
// TX gains
const std::vector<std::string> tx_gain_names = ad9361_ctrl::get_gain_names("TX1");
for (auto tx_gain_name : tx_gain_names) {
subtree->create<double>(tx_fe_path / "gains" / tx_gain_name / "value")
- .set_coercer([this, chan_idx](const double gain){
+ .set_coercer([this, chan_idx](const double gain) {
return this->set_tx_gain(gain, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return radio_ctrl_impl::get_tx_gain(chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return radio_ctrl_impl::get_tx_gain(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "gains" / tx_gain_name / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
- return meta_range_t(
- AD9361_MIN_TX_GAIN,
- AD9361_MAX_TX_GAIN,
- AD9361_TX_GAIN_STEP
- );
- })
- ;
+ .set_publisher([this]() {
+ return meta_range_t(
+ AD9361_MIN_TX_GAIN, AD9361_MAX_TX_GAIN, AD9361_TX_GAIN_STEP);
+ });
}
// RX gains
const std::vector<std::string> rx_gain_names = ad9361_ctrl::get_gain_names("RX1");
for (auto rx_gain_name : rx_gain_names) {
subtree->create<double>(rx_fe_path / "gains" / rx_gain_name / "value")
- .set_coercer([this, chan_idx](const double gain){
+ .set_coercer([this, chan_idx](const double gain) {
return this->set_rx_gain(gain, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return radio_ctrl_impl::get_rx_gain(chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return radio_ctrl_impl::get_rx_gain(chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "gains" / rx_gain_name / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
return meta_range_t(
- AD9361_MIN_RX_GAIN,
- AD9361_MAX_RX_GAIN,
- AD9361_RX_GAIN_STEP
- );
- })
- ;
+ AD9361_MIN_RX_GAIN, AD9361_MAX_RX_GAIN, AD9361_RX_GAIN_STEP);
+ });
}
// TX LO lock sensor //////////////////////////////////////////////////////
// Note: The AD9361 LO lock sensors are generated programmatically in
// set_rpc_client(). The actual lo_locked publisher is also set there.
subtree->create<sensor_value_t>(tx_fe_path / "sensors" / "lo_locked")
- .set(sensor_value_t("all_los", false, "locked", "unlocked"))
- .add_coerced_subscriber([](const sensor_value_t &){
- throw uhd::runtime_error(
- "Attempting to write to sensor!");
+ .set(sensor_value_t("all_los", false, "locked", "unlocked"))
+ .add_coerced_subscriber([](const sensor_value_t&) {
+ throw uhd::runtime_error("Attempting to write to sensor!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
return sensor_value_t(
- "all_los",
- this->get_lo_lock_status(TX_DIRECTION),
- "locked", "unlocked"
- );
- })
- ;
+ "all_los", this->get_lo_lock_status(TX_DIRECTION), "locked", "unlocked");
+ });
// RX LO lock sensor (see not on TX LO lock sensor)
subtree->create<sensor_value_t>(rx_fe_path / "sensors" / "lo_locked")
- .set(sensor_value_t("all_los", false, "locked", "unlocked"))
- .add_coerced_subscriber([](const sensor_value_t &){
- throw uhd::runtime_error(
- "Attempting to write to sensor!");
+ .set(sensor_value_t("all_los", false, "locked", "unlocked"))
+ .add_coerced_subscriber([](const sensor_value_t&) {
+ throw uhd::runtime_error("Attempting to write to sensor!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
return sensor_value_t(
- "all_los",
- this->get_lo_lock_status(RX_DIRECTION),
- "locked", "unlocked"
- );
- })
- ;
+ "all_los", this->get_lo_lock_status(RX_DIRECTION), "locked", "unlocked");
+ });
}
void neon_radio_ctrl_impl::_init_prop_tree()
{
const fs_path fe_base = fs_path("dboards") / _radio_slot;
for (size_t chan_idx = 0; chan_idx < NEON_NUM_CHANS; chan_idx++) {
- this->_init_frontend_subtree(
- _tree->subtree(fe_base), chan_idx);
+ this->_init_frontend_subtree(_tree->subtree(fe_base), chan_idx);
}
- _tree->create<eeprom_map_t>(_root_path / "eeprom")
- .set(eeprom_map_t());
+ _tree->create<eeprom_map_t>(_root_path / "eeprom").set(eeprom_map_t());
_tree->create<int>("rx_codecs" / _radio_slot / "gains");
_tree->create<int>("tx_codecs" / _radio_slot / "gains");
@@ -349,98 +276,108 @@ void neon_radio_ctrl_impl::_init_prop_tree()
if (not _tree->exists("tick_rate")) {
_tree->create<double>("tick_rate")
- .set_coercer([this](double tick_rate){
- return this->set_rate(tick_rate);
- })
- .set_publisher([this](){
- return this->get_rate();
- })
- ;
+ .set_coercer([this](double tick_rate) { return this->set_rate(tick_rate); })
+ .set_publisher([this]() { return this->get_rate(); });
} else {
UHD_LOG_WARNING(unique_id(), "Cannot set tick_rate again");
}
// *****FP_GPIO************************
- for(const auto& attr: usrp::gpio_atr::gpio_attr_map) {
- if (not _tree->exists(fs_path("gpio") / "FP0" / attr.second)){
- switch (attr.first){
+ for (const auto& attr : usrp::gpio_atr::gpio_attr_map) {
+ if (not _tree->exists(fs_path("gpio") / "FP0" / attr.second)) {
+ switch (attr.first) {
case usrp::gpio_atr::GPIO_SRC:
- //FIXME: move this creation of this branch of ptree out side of radio impl;
- // since there's no data dependency between radio and SRC setting for FP0
- _tree->create<std::vector<std::string>>(fs_path("gpio") / "FP0" / attr.second)
- .set(std::vector<std::string>(
- 32,
- usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this, attr](
- const std::vector<std::string> str_val){
- uint32_t radio_src_value = 0;
- uint32_t master_value = 0;
- for(size_t i = 0 ; i<str_val.size(); i++){
- if(str_val[i] == "PS"){
- master_value += 1<<i;;
- }else{
- auto port_num = _extract_port_number(str_val[i],_tree);
- radio_src_value =(1<<(2*i))*port_num + radio_src_value;
+ // FIXME: move this creation of this branch of ptree out side of
+ // radio impl;
+ // since there's no data dependency between radio and SRC setting for
+ // FP0
+ _tree
+ ->create<std::vector<std::string>>(
+ fs_path("gpio") / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber(
+ [this, attr](const std::vector<std::string> str_val) {
+ uint32_t radio_src_value = 0;
+ uint32_t master_value = 0;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ if (str_val[i] == "PS") {
+ master_value += 1 << i;
+ ;
+ } else {
+ auto port_num =
+ _extract_port_number(str_val[i], _tree);
+ radio_src_value =
+ (1 << (2 * i)) * port_num + radio_src_value;
+ }
}
- }
- _rpcc->notify_with_token("set_fp_gpio_master", master_value);
- _rpcc->notify_with_token("set_fp_gpio_radio_src", radio_src_value);
- });
- break;
+ _rpcc->notify_with_token(
+ "set_fp_gpio_master", master_value);
+ _rpcc->notify_with_token(
+ "set_fp_gpio_radio_src", radio_src_value);
+ });
+ break;
case usrp::gpio_atr::GPIO_CTRL:
case usrp::gpio_atr::GPIO_DDR:
- _tree->create<std::vector<std::string>>(fs_path("gpio") / "FP0" / attr.second)
- .set(std::vector<std::string>(
- 32,
- usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this, attr](
- const std::vector<std::string> str_val){
- uint32_t val = 0;
- for(size_t i = 0 ; i < str_val.size() ; i++){
- val += usrp::gpio_atr::gpio_attr_value_pair.at(attr.second).at(str_val[i])<<i;
- }
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ _tree
+ ->create<std::vector<std::string>>(
+ fs_path("gpio") / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber(
+ [this, attr](const std::vector<std::string> str_val) {
+ uint32_t val = 0;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ val += usrp::gpio_atr::gpio_attr_value_pair
+ .at(attr.second)
+ .at(str_val[i])
+ << i;
+ }
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
break;
- case usrp::gpio_atr::GPIO_READBACK:{
+ case usrp::gpio_atr::GPIO_READBACK: {
_tree->create<uint32_t>(fs_path("gpio") / "FP0" / attr.second)
- .set_publisher([this](){
- return _fp_gpio->read_gpio();
- }
- );
- }
- break;
+ .set_publisher([this]() { return _fp_gpio->read_gpio(); });
+ } break;
default:
_tree->create<uint32_t>(fs_path("gpio") / "FP0" / attr.second)
- .set(0)
- .add_coerced_subscriber([this, attr](const uint32_t val){
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ .set(0)
+ .add_coerced_subscriber([this, attr](const uint32_t val) {
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
}
- }else{
- switch (attr.first){
+ } else {
+ switch (attr.first) {
case usrp::gpio_atr::GPIO_SRC:
- break;
+ break;
case usrp::gpio_atr::GPIO_CTRL:
case usrp::gpio_atr::GPIO_DDR:
- _tree->access<std::vector<std::string>>(fs_path("gpio") / "FP0" / attr.second)
- .set(std::vector<std::string>(32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this, attr](const std::vector<std::string> str_val){
- uint32_t val = 0;
- for(size_t i = 0 ; i < str_val.size() ; i++){
- val += usrp::gpio_atr::gpio_attr_value_pair.at(attr.second).at(str_val[i])<<i;
- }
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ _tree
+ ->access<std::vector<std::string>>(
+ fs_path("gpio") / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber(
+ [this, attr](const std::vector<std::string> str_val) {
+ uint32_t val = 0;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ val += usrp::gpio_atr::gpio_attr_value_pair
+ .at(attr.second)
+ .at(str_val[i])
+ << i;
+ }
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
break;
case usrp::gpio_atr::GPIO_READBACK:
break;
default:
_tree->access<uint32_t>(fs_path("gpio") / "FP0" / attr.second)
- .set(0)
- .add_coerced_subscriber([this, attr](const uint32_t val){
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ .set(0)
+ .add_coerced_subscriber([this, attr](const uint32_t val) {
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
}
}
}
@@ -464,35 +401,27 @@ void neon_radio_ctrl_impl::_init_codec()
}
}
-void neon_radio_ctrl_impl::_init_mpm_sensors(
- const direction_t dir,
- const size_t chan_idx
-) {
+void neon_radio_ctrl_impl::_init_mpm_sensors(const direction_t dir, const size_t chan_idx)
+{
const std::string trx = (dir == RX_DIRECTION) ? "RX" : "TX";
- const fs_path fe_path =
- fs_path("dboards") / _radio_slot /
- (dir == RX_DIRECTION ? "rx_frontends" : "tx_frontends") / chan_idx;
- auto sensor_list =
- _rpcc->request_with_token<std::vector<std::string>>(
- this->_rpc_prefix + "get_sensors", trx);
+ const fs_path fe_path = fs_path("dboards") / _radio_slot
+ / (dir == RX_DIRECTION ? "rx_frontends" : "tx_frontends")
+ / chan_idx;
+ auto sensor_list = _rpcc->request_with_token<std::vector<std::string>>(
+ this->_rpc_prefix + "get_sensors", trx);
UHD_LOG_TRACE(unique_id(),
- "Chan " << chan_idx << ": Found "
- << sensor_list.size() << " " << trx << " sensors.");
- for (const auto &sensor_name : sensor_list) {
- UHD_LOG_TRACE(unique_id(),
- "Adding " << trx << " sensor " << sensor_name);
+ "Chan " << chan_idx << ": Found " << sensor_list.size() << " " << trx
+ << " sensors.");
+ for (const auto& sensor_name : sensor_list) {
+ UHD_LOG_TRACE(unique_id(), "Adding " << trx << " sensor " << sensor_name);
_tree->create<sensor_value_t>(fe_path / "sensors" / sensor_name)
- .add_coerced_subscriber([](const sensor_value_t &){
- throw uhd::runtime_error(
- "Attempting to write to sensor!");
+ .add_coerced_subscriber([](const sensor_value_t&) {
+ throw uhd::runtime_error("Attempting to write to sensor!");
})
- .set_publisher([this, trx, sensor_name, chan_idx](){
+ .set_publisher([this, trx, sensor_name, chan_idx]() {
return sensor_value_t(
this->_rpcc->request_with_token<sensor_value_t::sensor_map_t>(
- this->_rpc_prefix + "get_sensor",
- trx, sensor_name, chan_idx)
- );
- })
- ;
+ this->_rpc_prefix + "get_sensor", trx, sensor_name, chan_idx));
+ });
}
}
diff --git a/host/lib/usrp/dboard/neon/neon_regs.hpp b/host/lib/usrp/dboard/neon/neon_regs.hpp
index 39ceca01c..d1ff940c6 100644
--- a/host/lib/usrp/dboard/neon/neon_regs.hpp
+++ b/host/lib/usrp/dboard/neon/neon_regs.hpp
@@ -10,17 +10,16 @@
#include <uhd/config.hpp>
#include <cstdint>
-static const uint32_t TX_AMP_SHIFT = 17;
-static const uint32_t TRX_SW_SHIFT = 14;
-static const uint32_t RX_SW1_SHIFT = 0;
-static const uint32_t RX_SW2_SHIFT = 3;
-static const uint32_t RX_SW3_SHIFT = 6;
-static const uint32_t TX_SW1_SHIFT = 8;
-static const uint32_t TX_SW2_SHIFT = 11;
+static const uint32_t TX_AMP_SHIFT = 17;
+static const uint32_t TRX_SW_SHIFT = 14;
+static const uint32_t RX_SW1_SHIFT = 0;
+static const uint32_t RX_SW2_SHIFT = 3;
+static const uint32_t RX_SW3_SHIFT = 6;
+static const uint32_t TX_SW1_SHIFT = 8;
+static const uint32_t TX_SW2_SHIFT = 11;
-static const uint32_t TRX_LED_GRN_SHIFT = 0;
+static const uint32_t TRX_LED_GRN_SHIFT = 0;
static const uint32_t TX_LED_RED_SHIFT = 1;
static const uint32_t RX_LED_GRN_SHIFT = 2;
#endif /* INCLUDED_NEON_REGS_HPP */
-
diff --git a/host/lib/usrp/device3/device3_flow_ctrl.hpp b/host/lib/usrp/device3/device3_flow_ctrl.hpp
index 50081543a..535d7fbac 100644
--- a/host/lib/usrp/device3/device3_flow_ctrl.hpp
+++ b/host/lib/usrp/device3/device3_flow_ctrl.hpp
@@ -8,10 +8,10 @@
#define INCLUDED_DEVICE3_FLOW_CTRL_HPP
#include "device3_impl.hpp"
-#include <uhd/utils/log.hpp>
-#include <uhd/types/sid.hpp>
-#include <uhd/transport/zero_copy.hpp>
#include <uhd/transport/vrt_if_packet.hpp>
+#include <uhd/transport/zero_copy.hpp>
+#include <uhd/types/sid.hpp>
+#include <uhd/utils/log.hpp>
#include <boost/shared_ptr.hpp>
namespace uhd { namespace usrp {
@@ -19,12 +19,14 @@ namespace uhd { namespace usrp {
//! Stores the state of RX flow control
struct rx_fc_cache_t
{
- rx_fc_cache_t():
- interval(0),
- last_byte_count(0),
- total_bytes_consumed(0),
- total_packets_consumed(0),
- seq_num(0) {}
+ rx_fc_cache_t()
+ : interval(0)
+ , last_byte_count(0)
+ , total_bytes_consumed(0)
+ , total_packets_consumed(0)
+ , seq_num(0)
+ {
+ }
//! Flow control interval in bytes
size_t interval;
@@ -40,117 +42,112 @@ struct rx_fc_cache_t
uhd::transport::zero_copy_if::sptr xport;
std::function<uint32_t(uint32_t)> to_host;
std::function<uint32_t(uint32_t)> from_host;
- std::function<void(const uint32_t *packet_buff, uhd::transport::vrt::if_packet_info_t &)> unpack;
- std::function<void(uint32_t *packet_buff, uhd::transport::vrt::if_packet_info_t &)> pack;
+ std::function<void(
+ const uint32_t* packet_buff, uhd::transport::vrt::if_packet_info_t&)>
+ unpack;
+ std::function<void(uint32_t* packet_buff, uhd::transport::vrt::if_packet_info_t&)>
+ pack;
};
/*! Send out RX flow control packets.
-*
-* This function handles updating the counters for the consumed
-* bytes and packets, determines if a flow control message is
-* is necessary, and sends one if it is. Passing a nullptr for
-* the buff parameter will skip the counter update.
-*
-* \param fc_cache RX flow control state information
-* \param buff Receive buffer. Setting to nullptr will
-* skip the counter update.
-*/
+ *
+ * This function handles updating the counters for the consumed
+ * bytes and packets, determines if a flow control message is
+ * is necessary, and sends one if it is. Passing a nullptr for
+ * the buff parameter will skip the counter update.
+ *
+ * \param fc_cache RX flow control state information
+ * \param buff Receive buffer. Setting to nullptr will
+ * skip the counter update.
+ */
inline bool rx_flow_ctrl(
- boost::shared_ptr<rx_fc_cache_t> fc_cache,
- uhd::transport::managed_buffer::sptr buff
-) {
+ boost::shared_ptr<rx_fc_cache_t> fc_cache, uhd::transport::managed_buffer::sptr buff)
+{
// If the caller supplied a buffer
- if (buff)
- {
+ if (buff) {
// Unpack the header
uhd::transport::vrt::if_packet_info_t packet_info;
- packet_info.num_packet_words32 = buff->size()/sizeof(uint32_t);
- const uint32_t *pkt = buff->cast<const uint32_t *>();
+ packet_info.num_packet_words32 = buff->size() / sizeof(uint32_t);
+ const uint32_t* pkt = buff->cast<const uint32_t*>();
try {
fc_cache->unpack(pkt, packet_info);
- }
- catch(const std::exception &ex)
- {
+ } catch (const std::exception& ex) {
// Log and ignore
- UHD_LOGGER_ERROR("RX FLOW CTRL") << "Error unpacking packet: " << ex.what() << std::endl;
+ UHD_LOGGER_ERROR("RX FLOW CTRL")
+ << "Error unpacking packet: " << ex.what() << std::endl;
return true;
}
// Update counters assuming the buffer is a consumed packet
- if (not packet_info.error)
- {
+ if (not packet_info.error) {
fc_cache->total_bytes_consumed += buff->size();
fc_cache->total_packets_consumed++;
}
}
// Just return if there is no need to send a flow control packet
- if (fc_cache->total_bytes_consumed - fc_cache->last_byte_count < fc_cache->interval)
- {
+ if (fc_cache->total_bytes_consumed - fc_cache->last_byte_count < fc_cache->interval) {
return true;
}
// Time to send a flow control packet
// Get a send buffer
- uhd::transport::managed_send_buffer::sptr fc_buff = fc_cache->xport->get_send_buff(0.0);
+ uhd::transport::managed_send_buffer::sptr fc_buff =
+ fc_cache->xport->get_send_buff(0.0);
if (not fc_buff) {
throw uhd::runtime_error("rx_flowctrl timed out getting a send buffer");
}
- uint32_t *pkt = fc_buff->cast<uint32_t *>();
+ uint32_t* pkt = fc_buff->cast<uint32_t*>();
- //load packet info
+ // load packet info
uhd::transport::vrt::if_packet_info_t packet_info;
packet_info.packet_type = uhd::transport::vrt::if_packet_info_t::PACKET_TYPE_FC;
packet_info.num_payload_words32 = uhd::usrp::DEVICE3_FC_PACKET_LEN_IN_WORDS32;
- packet_info.num_payload_bytes = packet_info.num_payload_words32*sizeof(uint32_t);
- packet_info.packet_count = fc_cache->seq_num++;
- packet_info.sob = false;
- packet_info.eob = false;
- packet_info.error = false;
- packet_info.fc_ack = false;
- packet_info.sid = fc_cache->sid.get();
- packet_info.has_sid = true;
- packet_info.has_cid = false;
- packet_info.has_tsi = false;
- packet_info.has_tsf = false;
- packet_info.has_tlr = false;
+ packet_info.num_payload_bytes = packet_info.num_payload_words32 * sizeof(uint32_t);
+ packet_info.packet_count = fc_cache->seq_num++;
+ packet_info.sob = false;
+ packet_info.eob = false;
+ packet_info.error = false;
+ packet_info.fc_ack = false;
+ packet_info.sid = fc_cache->sid.get();
+ packet_info.has_sid = true;
+ packet_info.has_cid = false;
+ packet_info.has_tsi = false;
+ packet_info.has_tsf = false;
+ packet_info.has_tlr = false;
// Load Header:
fc_cache->pack(pkt, packet_info);
// Load Payload: Packet count, and byte count
- pkt[packet_info.num_header_words32+uhd::usrp::DEVICE3_FC_PACKET_COUNT_OFFSET] =
+ pkt[packet_info.num_header_words32 + uhd::usrp::DEVICE3_FC_PACKET_COUNT_OFFSET] =
fc_cache->from_host(fc_cache->total_packets_consumed);
- pkt[packet_info.num_header_words32+uhd::usrp::DEVICE3_FC_BYTE_COUNT_OFFSET] =
+ pkt[packet_info.num_header_words32 + uhd::usrp::DEVICE3_FC_BYTE_COUNT_OFFSET] =
fc_cache->from_host(fc_cache->total_bytes_consumed);
- //send the buffer over the interface
- fc_buff->commit(sizeof(uint32_t)*(packet_info.num_packet_words32));
+ // send the buffer over the interface
+ fc_buff->commit(sizeof(uint32_t) * (packet_info.num_packet_words32));
- //update byte count
+ // update byte count
fc_cache->last_byte_count = fc_cache->total_bytes_consumed;
return true;
}
/*! Handle RX flow control ACK packets.
-*
-*/
+ *
+ */
inline void handle_rx_flowctrl_ack(
- boost::shared_ptr<rx_fc_cache_t> fc_cache,
- const uint32_t *payload
-) {
- const uint32_t pkt_count = fc_cache->to_host(payload[0]);
+ boost::shared_ptr<rx_fc_cache_t> fc_cache, const uint32_t* payload)
+{
+ const uint32_t pkt_count = fc_cache->to_host(payload[0]);
const uint32_t byte_count = fc_cache->to_host(payload[1]);
- if (fc_cache->total_bytes_consumed != byte_count)
- {
+ if (fc_cache->total_bytes_consumed != byte_count) {
UHD_LOGGER_DEBUG("device3")
<< "oh noes: byte_count==" << byte_count
- << " total_bytes_consumed==" << fc_cache->total_bytes_consumed
- << std::hex << " sid==" << fc_cache->sid << std::dec
- << std::endl
- ;
+ << " total_bytes_consumed==" << fc_cache->total_bytes_consumed << std::hex
+ << " sid==" << fc_cache->sid << std::dec << std::endl;
}
- fc_cache->total_bytes_consumed = byte_count;
+ fc_cache->total_bytes_consumed = byte_count;
fc_cache->total_packets_consumed = pkt_count; // guess we need a pkt offset too?
// This will send a flow control packet if there is a significant discrepancy
@@ -160,14 +157,16 @@ inline void handle_rx_flowctrl_ack(
//! Stores the state of TX flow control
struct tx_fc_cache_t
{
- tx_fc_cache_t(uint32_t capacity):
- last_byte_ack(0),
- last_seq_ack(0),
- byte_count(0),
- pkt_count(0),
- window_size(capacity),
- fc_ack_seqnum(0),
- fc_received(false) {}
+ tx_fc_cache_t(uint32_t capacity)
+ : last_byte_ack(0)
+ , last_seq_ack(0)
+ , byte_count(0)
+ , pkt_count(0)
+ , window_size(capacity)
+ , fc_ack_seqnum(0)
+ , fc_received(false)
+ {
+ }
uint32_t last_byte_ack;
uint32_t last_seq_ack;
@@ -178,26 +177,28 @@ struct tx_fc_cache_t
bool fc_received;
std::function<uint32_t(uint32_t)> to_host;
std::function<uint32_t(uint32_t)> from_host;
- std::function<void(const uint32_t *packet_buff, uhd::transport::vrt::if_packet_info_t &)> unpack;
- std::function<void(uint32_t *packet_buff, uhd::transport::vrt::if_packet_info_t &)> pack;
+ std::function<void(
+ const uint32_t* packet_buff, uhd::transport::vrt::if_packet_info_t&)>
+ unpack;
+ std::function<void(uint32_t* packet_buff, uhd::transport::vrt::if_packet_info_t&)>
+ pack;
};
-inline bool tx_flow_ctrl(
- boost::shared_ptr<tx_fc_cache_t> fc_cache,
+inline bool tx_flow_ctrl(boost::shared_ptr<tx_fc_cache_t> fc_cache,
uhd::transport::zero_copy_if::sptr xport,
- uhd::transport::managed_buffer::sptr buff
-) {
- while (true)
- {
+ uhd::transport::managed_buffer::sptr buff)
+{
+ while (true) {
// If there is space
- if (fc_cache->window_size - (fc_cache->byte_count - fc_cache->last_byte_ack) >= buff->size())
- {
+ if (fc_cache->window_size - (fc_cache->byte_count - fc_cache->last_byte_ack)
+ >= buff->size()) {
// All is good - packet will be sent
fc_cache->byte_count += buff->size();
// Round up to nearest word
- if (fc_cache->byte_count % uhd::usrp::DEVICE3_LINE_SIZE)
- {
- fc_cache->byte_count += uhd::usrp::DEVICE3_LINE_SIZE - (fc_cache->byte_count % uhd::usrp::DEVICE3_LINE_SIZE);
+ if (fc_cache->byte_count % uhd::usrp::DEVICE3_LINE_SIZE) {
+ fc_cache->byte_count +=
+ uhd::usrp::DEVICE3_LINE_SIZE
+ - (fc_cache->byte_count % uhd::usrp::DEVICE3_LINE_SIZE);
}
fc_cache->pkt_count++;
return true;
@@ -205,33 +206,33 @@ inline bool tx_flow_ctrl(
// Look for a flow control message to update the space available in the buffer.
uhd::transport::managed_recv_buffer::sptr buff = xport->get_recv_buff(0.1);
- if (buff)
- {
+ if (buff) {
uhd::transport::vrt::if_packet_info_t if_packet_info;
- if_packet_info.num_packet_words32 = buff->size()/sizeof(uint32_t);
- const uint32_t *packet_buff = buff->cast<const uint32_t *>();
+ if_packet_info.num_packet_words32 = buff->size() / sizeof(uint32_t);
+ const uint32_t* packet_buff = buff->cast<const uint32_t*>();
try {
fc_cache->unpack(packet_buff, if_packet_info);
- }
- catch(const std::exception &ex)
- {
- UHD_LOGGER_ERROR("TX FLOW CTRL") << "Error unpacking flow control packet: " << ex.what() << std::endl;
+ } catch (const std::exception& ex) {
+ UHD_LOGGER_ERROR("TX FLOW CTRL")
+ << "Error unpacking flow control packet: " << ex.what() << std::endl;
continue;
}
- if (if_packet_info.packet_type != uhd::transport::vrt::if_packet_info_t::PACKET_TYPE_FC)
- {
- UHD_LOGGER_ERROR("TX FLOW CTRL") << "Unexpected packet received by flow control handler: " << if_packet_info.packet_type << std::endl;
+ if (if_packet_info.packet_type
+ != uhd::transport::vrt::if_packet_info_t::PACKET_TYPE_FC) {
+ UHD_LOGGER_ERROR("TX FLOW CTRL")
+ << "Unexpected packet received by flow control handler: "
+ << if_packet_info.packet_type << std::endl;
continue;
}
- const uint32_t *payload = &packet_buff[if_packet_info.num_header_words32];
- const uint32_t pkt_count = fc_cache->to_host(payload[0]);
+ const uint32_t* payload = &packet_buff[if_packet_info.num_header_words32];
+ const uint32_t pkt_count = fc_cache->to_host(payload[0]);
const uint32_t byte_count = fc_cache->to_host(payload[1]);
// update the amount of space
fc_cache->last_byte_ack = byte_count;
- fc_cache->last_seq_ack = pkt_count;
+ fc_cache->last_seq_ack = pkt_count;
fc_cache->fc_received = true;
}
@@ -239,13 +240,11 @@ inline bool tx_flow_ctrl(
return false;
}
-inline void tx_flow_ctrl_ack(
- boost::shared_ptr<tx_fc_cache_t> fc_cache,
+inline void tx_flow_ctrl_ack(boost::shared_ptr<tx_fc_cache_t> fc_cache,
uhd::transport::zero_copy_if::sptr send_xport,
- uhd::sid_t send_sid
-) {
- if (not fc_cache->fc_received)
- {
+ uhd::sid_t send_sid)
+{
+ if (not fc_cache->fc_received) {
return;
}
@@ -256,42 +255,42 @@ inline void tx_flow_ctrl_ack(
UHD_LOGGER_ERROR("tx_flow_ctrl_ack") << "timed out getting a send buffer";
return;
}
- uint32_t *pkt = fc_buff->cast<uint32_t *>();
+ uint32_t* pkt = fc_buff->cast<uint32_t*>();
// Load packet info
uhd::transport::vrt::if_packet_info_t packet_info;
packet_info.packet_type = uhd::transport::vrt::if_packet_info_t::PACKET_TYPE_ACK;
packet_info.num_payload_words32 = uhd::usrp::DEVICE3_FC_PACKET_LEN_IN_WORDS32;
- packet_info.num_payload_bytes = packet_info.num_payload_words32*sizeof(uint32_t);
- packet_info.packet_count = fc_cache->fc_ack_seqnum++;
- packet_info.sob = false;
- packet_info.eob = true;
- packet_info.error = false;
- packet_info.fc_ack = false;
- packet_info.sid = send_sid.get();
- packet_info.has_sid = true;
- packet_info.has_cid = false;
- packet_info.has_tsi = false;
- packet_info.has_tsf = false;
- packet_info.has_tlr = false;
+ packet_info.num_payload_bytes = packet_info.num_payload_words32 * sizeof(uint32_t);
+ packet_info.packet_count = fc_cache->fc_ack_seqnum++;
+ packet_info.sob = false;
+ packet_info.eob = true;
+ packet_info.error = false;
+ packet_info.fc_ack = false;
+ packet_info.sid = send_sid.get();
+ packet_info.has_sid = true;
+ packet_info.has_cid = false;
+ packet_info.has_tsi = false;
+ packet_info.has_tsf = false;
+ packet_info.has_tlr = false;
// Load Header:
fc_cache->pack(pkt, packet_info);
// Update counters to include this packet
- size_t fc_ack_pkt_size = sizeof(uint32_t)*(packet_info.num_packet_words32);
+ size_t fc_ack_pkt_size = sizeof(uint32_t) * (packet_info.num_packet_words32);
fc_cache->byte_count += fc_ack_pkt_size;
// Round up to nearest word
- if (fc_cache->byte_count % uhd::usrp::DEVICE3_LINE_SIZE)
- {
- fc_cache->byte_count += uhd::usrp::DEVICE3_LINE_SIZE - (fc_cache->byte_count % uhd::usrp::DEVICE3_LINE_SIZE);
+ if (fc_cache->byte_count % uhd::usrp::DEVICE3_LINE_SIZE) {
+ fc_cache->byte_count += uhd::usrp::DEVICE3_LINE_SIZE
+ - (fc_cache->byte_count % uhd::usrp::DEVICE3_LINE_SIZE);
}
fc_cache->pkt_count++;
// Load Payload: Packet count, and byte count
- pkt[packet_info.num_header_words32+uhd::usrp::DEVICE3_FC_PACKET_COUNT_OFFSET] =
+ pkt[packet_info.num_header_words32 + uhd::usrp::DEVICE3_FC_PACKET_COUNT_OFFSET] =
fc_cache->from_host(fc_cache->pkt_count);
- pkt[packet_info.num_header_words32+uhd::usrp::DEVICE3_FC_BYTE_COUNT_OFFSET] =
+ pkt[packet_info.num_header_words32 + uhd::usrp::DEVICE3_FC_BYTE_COUNT_OFFSET] =
fc_cache->from_host(fc_cache->byte_count);
// Send the buffer over the interface
@@ -301,6 +300,6 @@ inline void tx_flow_ctrl_ack(
fc_cache->fc_received = false;
}
-}};
+}}; // namespace uhd::usrp
#endif /* INCLUDED_DEVICE3_FLOW_CTRL_HPP */
diff --git a/host/lib/usrp/device3/device3_impl.cpp b/host/lib/usrp/device3/device3_impl.cpp
index 5705d6a84..d636b3338 100644
--- a/host/lib/usrp/device3/device3_impl.cpp
+++ b/host/lib/usrp/device3/device3_impl.cpp
@@ -6,10 +6,10 @@
//
#include "device3_impl.hpp"
-#include <uhd/utils/log.hpp>
#include <uhd/rfnoc/block_ctrl_base.hpp>
-#include <uhdlib/rfnoc/graph_impl.hpp>
+#include <uhd/utils/log.hpp>
#include <uhdlib/rfnoc/ctrl_iface.hpp>
+#include <uhdlib/rfnoc/graph_impl.hpp>
#include <boost/make_shared.hpp>
#include <algorithm>
@@ -18,21 +18,20 @@ using namespace uhd::usrp;
device3_impl::device3_impl()
{
_type = uhd::device::USRP;
- _async_md.reset(new async_md_type(1000/*messages deep*/));
+ _async_md.reset(new async_md_type(1000 /*messages deep*/));
_tree = uhd::property_tree::make();
};
//! Returns true if the integer value stored in lhs is smaller than that in rhs
-bool _compare_string_indexes(const std::string &lhs, const std::string &rhs)
+bool _compare_string_indexes(const std::string& lhs, const std::string& rhs)
{
return boost::lexical_cast<size_t>(lhs) < boost::lexical_cast<size_t>(rhs);
}
-void device3_impl::merge_channel_defs(
- const std::vector<uhd::rfnoc::block_id_t> &chan_ids,
- const std::vector<uhd::device_addr_t> &chan_args,
- const uhd::direction_t dir
-) {
+void device3_impl::merge_channel_defs(const std::vector<uhd::rfnoc::block_id_t>& chan_ids,
+ const std::vector<uhd::device_addr_t>& chan_args,
+ const uhd::direction_t dir)
+{
UHD_ASSERT_THROW(chan_ids.size() == chan_args.size());
if (dir == uhd::DX_DIRECTION) {
merge_channel_defs(chan_ids, chan_args, RX_DIRECTION);
@@ -40,7 +39,8 @@ void device3_impl::merge_channel_defs(
return;
}
- uhd::fs_path chans_root = uhd::fs_path("/channels/") / (dir == RX_DIRECTION ? "rx" : "tx");
+ uhd::fs_path chans_root =
+ uhd::fs_path("/channels/") / (dir == RX_DIRECTION ? "rx" : "tx");
// Store the new positions of the channels:
std::vector<size_t> chan_idxs;
@@ -54,18 +54,23 @@ void device3_impl::merge_channel_defs(
// 2. Cycle through existing channels to find out where to merge
// the new channels. Rules are:
// - The order of chan_ids must be preserved
- // - All block indices that are in chan_ids may be overwritten in the channel definition
+ // - All block indices that are in chan_ids may be overwritten in the channel
+ // definition
// - If the channels in chan_ids are not yet in the property tree channel list,
// they are appended.
- for(const std::string &chan_idx: curr_channels) {
+ for (const std::string& chan_idx : curr_channels) {
if (_tree->exists(chans_root / chan_idx)) {
- rfnoc::block_id_t chan_block_id = _tree->access<rfnoc::block_id_t>(chans_root / chan_idx).get();
- if (std::find(chan_ids.begin(), chan_ids.end(), chan_block_id) != chan_ids.end()) {
+ rfnoc::block_id_t chan_block_id =
+ _tree->access<rfnoc::block_id_t>(chans_root / chan_idx).get();
+ if (std::find(chan_ids.begin(), chan_ids.end(), chan_block_id)
+ != chan_ids.end()) {
chan_idxs.push_back(boost::lexical_cast<size_t>(chan_idx));
}
}
}
- size_t last_chan_idx = curr_channels.empty() ? 0 : (boost::lexical_cast<size_t>(curr_channels.back()) + 1);
+ size_t last_chan_idx = curr_channels.empty()
+ ? 0
+ : (boost::lexical_cast<size_t>(curr_channels.back()) + 1);
while (chan_idxs.size() < chan_ids.size()) {
chan_idxs.push_back(last_chan_idx);
last_chan_idx++;
@@ -80,27 +85,28 @@ void device3_impl::merge_channel_defs(
if (not _tree->exists(chans_root / chan_idxs[i] / "args")) {
_tree->create<uhd::device_addr_t>(chans_root / chan_idxs[i] / "args");
}
- _tree->access<uhd::device_addr_t>(chans_root / chan_idxs[i] / "args").set(chan_args[i]);
+ _tree->access<uhd::device_addr_t>(chans_root / chan_idxs[i] / "args")
+ .set(chan_args[i]);
}
}
/***********************************************************************
* RFNoC-Specific
**********************************************************************/
-void device3_impl::enumerate_rfnoc_blocks(
- size_t device_index,
- size_t n_blocks,
- size_t base_port,
- const uhd::sid_t &base_sid,
- uhd::device_addr_t transport_args
-) {
+void device3_impl::enumerate_rfnoc_blocks(size_t device_index,
+ size_t n_blocks,
+ size_t base_port,
+ const uhd::sid_t& base_sid,
+ uhd::device_addr_t transport_args)
+{
// entries that are already connected to this block
uhd::sid_t ctrl_sid = base_sid;
- uhd::property_tree::sptr subtree = _tree->subtree(uhd::fs_path("/mboards") / device_index);
+ uhd::property_tree::sptr subtree =
+ _tree->subtree(uhd::fs_path("/mboards") / device_index);
// 1) Clean property tree entries
// TODO put this back once radios are actual rfnoc blocks!!!!!!
- //if (subtree->exists("xbar")) {
- //subtree->remove("xbar");
+ // if (subtree->exists("xbar")) {
+ // subtree->remove("xbar");
//}
// 2) Destroy existing block controllers
// TODO: Clear out all the old block control classes
@@ -109,40 +115,27 @@ void device3_impl::enumerate_rfnoc_blocks(
// First, make a transport for port number zero, because we always need that:
ctrl_sid.set_dst_xbarport(base_port + i);
ctrl_sid.set_dst_blockport(0);
- both_xports_t xport = this->make_transport(
- ctrl_sid,
- CTRL,
- transport_args
- );
+ both_xports_t xport = this->make_transport(ctrl_sid, CTRL, transport_args);
UHD_LOG_TRACE("DEVICE3",
str(boost::format("Setting up NoC-Shell Control for port #0 (SID: %s)...")
- % xport.send_sid.to_pp_string_hex())
- );
- uhd::rfnoc::ctrl_iface::sptr ctrl = uhd::rfnoc::ctrl_iface::make(
- xport,
- str(boost::format("CE_%02d_Port_%02X")
- % i
- % ctrl_sid.get_dst_endpoint())
- );
- uint64_t noc_id = ctrl->send_cmd_pkt(
- uhd::rfnoc::SR_READBACK,
- uhd::rfnoc::SR_READBACK_REG_ID,
- true
- );
- UHD_LOG_DEBUG("DEVICE3", str(
- boost::format("Port 0x%02X: Found NoC-Block with ID %016X.")
- % int(ctrl_sid.get_dst_endpoint())
- % noc_id
- ));
+ % xport.send_sid.to_pp_string_hex()));
+ uhd::rfnoc::ctrl_iface::sptr ctrl = uhd::rfnoc::ctrl_iface::make(xport,
+ str(boost::format("CE_%02d_Port_%02X") % i % ctrl_sid.get_dst_endpoint()));
+ uint64_t noc_id = ctrl->send_cmd_pkt(
+ uhd::rfnoc::SR_READBACK, uhd::rfnoc::SR_READBACK_REG_ID, true);
+ UHD_LOG_DEBUG("DEVICE3",
+ str(boost::format("Port 0x%02X: Found NoC-Block with ID %016X.")
+ % int(ctrl_sid.get_dst_endpoint()) % noc_id));
uhd::rfnoc::make_args_t make_args;
- uhd::rfnoc::blockdef::sptr block_def = uhd::rfnoc::blockdef::make_from_noc_id(noc_id);
+ uhd::rfnoc::blockdef::sptr block_def =
+ uhd::rfnoc::blockdef::make_from_noc_id(noc_id);
if (not block_def) {
UHD_LOG_WARNING("DEVICE3",
"No block definition found, using default block configuration "
- "for block with NOC ID: " + str(boost::format("0x%08X") % noc_id)
- );
- block_def = uhd::rfnoc::blockdef::make_from_noc_id(
- uhd::rfnoc::DEFAULT_NOC_ID);
+ "for block with NOC ID: "
+ + str(boost::format("0x%08X") % noc_id));
+ block_def =
+ uhd::rfnoc::blockdef::make_from_noc_id(uhd::rfnoc::DEFAULT_NOC_ID);
}
UHD_ASSERT_THROW(block_def);
make_args.ctrl_ifaces[0] = ctrl;
@@ -151,71 +144,59 @@ void device3_impl::enumerate_rfnoc_blocks(
continue;
}
ctrl_sid.set_dst_blockport(port_number);
- both_xports_t xport1 = this->make_transport(
- ctrl_sid,
- CTRL,
- transport_args
- );
- UHD_LOG_TRACE("DEVICE3", str(
- boost::format("Setting up NoC-Shell Control for port #%d "
+ both_xports_t xport1 = this->make_transport(ctrl_sid, CTRL, transport_args);
+ UHD_LOG_TRACE("DEVICE3",
+ str(boost::format("Setting up NoC-Shell Control for port #%d "
"(SID: %s)...")
- % port_number
- % xport1.send_sid.to_pp_string_hex()
- ));
- uhd::rfnoc::ctrl_iface::sptr ctrl1 = uhd::rfnoc::ctrl_iface::make(
- xport1,
- str(boost::format("CE_%02d_Port_%02X") % i % ctrl_sid.get_dst_endpoint())
- );
+ % port_number % xport1.send_sid.to_pp_string_hex()));
+ uhd::rfnoc::ctrl_iface::sptr ctrl1 = uhd::rfnoc::ctrl_iface::make(xport1,
+ str(boost::format("CE_%02d_Port_%02X") % i
+ % ctrl_sid.get_dst_endpoint()));
make_args.ctrl_ifaces[port_number] = ctrl1;
}
UHD_LOG_TRACE("DEVICE3",
- "All control transports successfully created for block with ID " <<
- str(boost::format("0x%08X") % noc_id)
- );
+ "All control transports successfully created for block with ID "
+ << str(boost::format("0x%08X") % noc_id));
make_args.base_address = xport.send_sid.get_dst();
make_args.device_index = device_index;
- make_args.tree = subtree;
- { //Critical section for block_ctrl vector access
+ make_args.tree = subtree;
+ { // Critical section for block_ctrl vector access
boost::lock_guard<boost::mutex> lock(_block_ctrl_mutex);
- _rfnoc_block_ctrl.push_back(uhd::rfnoc::block_ctrl_base::make(make_args, noc_id));
+ _rfnoc_block_ctrl.push_back(
+ uhd::rfnoc::block_ctrl_base::make(make_args, noc_id));
}
}
}
-uhd::rfnoc::graph::sptr device3_impl::create_graph(const std::string &name)
+uhd::rfnoc::graph::sptr device3_impl::create_graph(const std::string& name)
{
// Create an async message handler
- UHD_LOGGER_TRACE("DEVICE3") << "Creating async message handler for graph `" << name << "'...";
- // FIXME: right now this only can only handle source sid of 0 and xbar local addr of 2.
- // This is ok for now because that most of our device has xbard local addr hardcode to 2.
+ UHD_LOGGER_TRACE("DEVICE3")
+ << "Creating async message handler for graph `" << name << "'...";
+ // FIXME: right now this only can only handle source sid of 0 and xbar local addr
+ // of 2. This is ok for now because that most of our device has xbard local addr
+ // hardcode to 2.
sid_t async_sid(0);
async_sid.set_dst_addr(2);
- both_xports_t async_xports = make_transport(
- async_sid,
- ASYNC_MSG,
- //FIXME: only get rx_hints from mb index of 0
- get_rx_hints(0)
- );
+ both_xports_t async_xports = make_transport(async_sid,
+ ASYNC_MSG,
+ // FIXME: only get rx_hints from mb index of 0
+ get_rx_hints(0));
UHD_LOGGER_TRACE("DEVICE3") << " Async transport ready." << std::endl;
uhd::rfnoc::async_msg_handler::sptr async_msg_handler =
- uhd::rfnoc::async_msg_handler::make(
- async_xports.recv,
- async_xports.send,
- async_xports.send_sid,
- async_xports.endianness
- );
- UHD_LOGGER_TRACE("DEVICE3") << "Async message has address " << async_xports.send_sid << std::endl;
+ uhd::rfnoc::async_msg_handler::make(async_xports.recv,
+ async_xports.send,
+ async_xports.send_sid,
+ async_xports.endianness);
+ UHD_LOGGER_TRACE("DEVICE3")
+ << "Async message has address " << async_xports.send_sid << std::endl;
// Create the graph
UHD_LOGGER_TRACE("DEVICE3") << "Creating graph `" << name << "'..." << std::endl;
uhd::rfnoc::graph::sptr graph = boost::make_shared<uhd::rfnoc::graph_impl>(
- name,
- shared_from_this(),
- async_msg_handler
- );
+ name, shared_from_this(), async_msg_handler);
return graph;
}
-
diff --git a/host/lib/usrp/device3/device3_impl.hpp b/host/lib/usrp/device3/device3_impl.hpp
index e82597b9b..3bf6f6111 100644
--- a/host/lib/usrp/device3/device3_impl.hpp
+++ b/host/lib/usrp/device3/device3_impl.hpp
@@ -11,20 +11,20 @@
#ifndef INCLUDED_DEVICE3_IMPL_HPP
#define INCLUDED_DEVICE3_IMPL_HPP
+#include "../../transport/super_recv_packet_handler.hpp"
+#include "../../transport/super_send_packet_handler.hpp"
+#include <uhd/device3.hpp>
#include <uhd/transport/bounded_buffer.hpp>
-#include <uhd/transport/vrt_if_packet.hpp>
#include <uhd/transport/chdr.hpp>
+#include <uhd/transport/vrt_if_packet.hpp>
#include <uhd/transport/zero_copy.hpp>
-#include <uhd/types/sid.hpp>
-#include <uhd/types/metadata.hpp>
-#include <uhd/types/endianness.hpp>
#include <uhd/types/direction.hpp>
+#include <uhd/types/endianness.hpp>
+#include <uhd/types/metadata.hpp>
+#include <uhd/types/sid.hpp>
#include <uhd/utils/tasks.hpp>
-#include <uhd/device3.hpp>
-#include "../../transport/super_send_packet_handler.hpp"
-#include "../../transport/super_recv_packet_handler.hpp"
-#include <uhdlib/rfnoc/tx_stream_terminator.hpp>
#include <uhdlib/rfnoc/rx_stream_terminator.hpp>
+#include <uhdlib/rfnoc/tx_stream_terminator.hpp>
#include <uhdlib/rfnoc/xports.hpp>
namespace uhd { namespace usrp {
@@ -32,31 +32,33 @@ namespace uhd { namespace usrp {
/***********************************************************************
* Default settings (any device3 may override these)
**********************************************************************/
-static const size_t DEVICE3_RX_FC_REQUEST_FREQ = 32; //per flow-control window
-static const size_t DEVICE3_TX_FC_RESPONSE_FREQ = 8;
-static const size_t DEVICE3_FC_PACKET_LEN_IN_WORDS32 = 2;
-static const size_t DEVICE3_FC_PACKET_COUNT_OFFSET = 0;
-static const size_t DEVICE3_FC_BYTE_COUNT_OFFSET = 1;
-static const size_t DEVICE3_LINE_SIZE = 8;
-
-static const size_t DEVICE3_TX_MAX_HDR_LEN = uhd::transport::vrt::chdr::max_if_hdr_words64 * sizeof(uint64_t); // Bytes
-static const size_t DEVICE3_RX_MAX_HDR_LEN = uhd::transport::vrt::chdr::max_if_hdr_words64 * sizeof(uint64_t); // Bytes
-
-// This class manages the lifetime of the TX async message handler task, transports, and terminator
+static const size_t DEVICE3_RX_FC_REQUEST_FREQ = 32; // per flow-control window
+static const size_t DEVICE3_TX_FC_RESPONSE_FREQ = 8;
+static const size_t DEVICE3_FC_PACKET_LEN_IN_WORDS32 = 2;
+static const size_t DEVICE3_FC_PACKET_COUNT_OFFSET = 0;
+static const size_t DEVICE3_FC_BYTE_COUNT_OFFSET = 1;
+static const size_t DEVICE3_LINE_SIZE = 8;
+
+static const size_t DEVICE3_TX_MAX_HDR_LEN =
+ uhd::transport::vrt::chdr::max_if_hdr_words64 * sizeof(uint64_t); // Bytes
+static const size_t DEVICE3_RX_MAX_HDR_LEN =
+ uhd::transport::vrt::chdr::max_if_hdr_words64 * sizeof(uint64_t); // Bytes
+
+// This class manages the lifetime of the TX async message handler task, transports, and
+// terminator
class device3_send_packet_streamer : public uhd::transport::sph::send_packet_streamer
{
public:
- device3_send_packet_streamer(
- const size_t max_num_samps,
- const uhd::rfnoc::tx_stream_terminator::sptr terminator,
- const both_xports_t data_xport,
- const both_xports_t async_msg_xport
- ) :
- uhd::transport::sph::send_packet_streamer(max_num_samps),
- _terminator(terminator),
- _data_xport(data_xport),
- _async_msg_xport(async_msg_xport)
- {}
+ device3_send_packet_streamer(const size_t max_num_samps,
+ const uhd::rfnoc::tx_stream_terminator::sptr terminator,
+ const both_xports_t data_xport,
+ const both_xports_t async_msg_xport)
+ : uhd::transport::sph::send_packet_streamer(max_num_samps)
+ , _terminator(terminator)
+ , _data_xport(data_xport)
+ , _async_msg_xport(async_msg_xport)
+ {
+ }
~device3_send_packet_streamer()
{
@@ -81,18 +83,19 @@ private:
std::vector<task::sptr> _tx_async_msg_tasks;
};
-// This class manages the lifetime of the RX transports and terminator and provides access to both
+// This class manages the lifetime of the RX transports and terminator and provides access
+// to both
class device3_recv_packet_streamer : public uhd::transport::sph::recv_packet_streamer
{
public:
- device3_recv_packet_streamer(
- const size_t max_num_samps,
- const uhd::rfnoc::rx_stream_terminator::sptr terminator,
- const both_xports_t xport
- ) :
- uhd::transport::sph::recv_packet_streamer(max_num_samps),
- _terminator(terminator),
- _xport(xport) {}
+ device3_recv_packet_streamer(const size_t max_num_samps,
+ const uhd::rfnoc::rx_stream_terminator::sptr terminator,
+ const both_xports_t xport)
+ : uhd::transport::sph::recv_packet_streamer(max_num_samps)
+ , _terminator(terminator)
+ , _xport(xport)
+ {
+ }
~device3_recv_packet_streamer() {}
@@ -111,7 +114,8 @@ private:
both_xports_t _xport;
};
-class device3_impl : public uhd::device3, public boost::enable_shared_from_this<device3_impl>
+class device3_impl : public uhd::device3,
+ public boost::enable_shared_from_this<device3_impl>
{
public:
/***********************************************************************
@@ -120,14 +124,9 @@ public:
typedef uhd::transport::bounded_buffer<uhd::async_metadata_t> async_md_type;
//! The purpose of a transport
- enum xport_type_t {
- CTRL = 0,
- ASYNC_MSG,
- TX_DATA,
- RX_DATA
- };
+ enum xport_type_t { CTRL = 0, ASYNC_MSG, TX_DATA, RX_DATA };
- enum xport_t {AXI, ETH, PCIE};
+ enum xport_t { AXI, ETH, PCIE };
//! Stores all streaming-related options
struct stream_options_t
@@ -145,20 +144,21 @@ public:
, rx_max_len_hdr(DEVICE3_RX_MAX_HDR_LEN)
, rx_fc_request_freq(DEVICE3_RX_FC_REQUEST_FREQ)
, tx_fc_response_freq(DEVICE3_TX_FC_RESPONSE_FREQ)
- {}
+ {
+ }
};
/***********************************************************************
* I/O Interface
**********************************************************************/
- uhd::tx_streamer::sptr get_tx_stream(const uhd::stream_args_t &);
- uhd::rx_streamer::sptr get_rx_stream(const uhd::stream_args_t &);
- bool recv_async_msg(uhd::async_metadata_t &async_metadata, double timeout);
+ uhd::tx_streamer::sptr get_tx_stream(const uhd::stream_args_t&);
+ uhd::rx_streamer::sptr get_rx_stream(const uhd::stream_args_t&);
+ bool recv_async_msg(uhd::async_metadata_t& async_metadata, double timeout);
/***********************************************************************
* Other public APIs
**********************************************************************/
- rfnoc::graph::sptr create_graph(const std::string &name="");
+ rfnoc::graph::sptr create_graph(const std::string& name = "");
protected:
/***********************************************************************
@@ -172,10 +172,10 @@ protected:
**********************************************************************/
// The 'rate' argument is so we can use these as subscribers to rate changes
public: // TODO make these protected again
- void update_rx_streamers(double rate=-1.0);
- void update_tx_streamers(double rate=-1.0);
-protected:
+ void update_rx_streamers(double rate = -1.0);
+ void update_tx_streamers(double rate = -1.0);
+protected:
/***********************************************************************
* Transport-related
**********************************************************************/
@@ -187,17 +187,21 @@ protected:
* The source address in this value is not considered, only the
* destination address.
* \param xport_type Specify which kind of transport this is.
- * \param args Additional arguments for the transport generation. See \ref page_transport
- * for valid arguments.
+ * \param args Additional arguments for the transport generation. See \ref
+ * page_transport for valid arguments.
*/
- virtual uhd::both_xports_t make_transport(
- const uhd::sid_t &address,
+ virtual uhd::both_xports_t make_transport(const uhd::sid_t& address,
const xport_type_t xport_type,
- const uhd::device_addr_t& args
- ) = 0;
+ const uhd::device_addr_t& args) = 0;
- virtual uhd::device_addr_t get_tx_hints(size_t) { return uhd::device_addr_t(); }
- virtual uhd::device_addr_t get_rx_hints(size_t) { return uhd::device_addr_t(); }
+ virtual uhd::device_addr_t get_tx_hints(size_t)
+ {
+ return uhd::device_addr_t();
+ }
+ virtual uhd::device_addr_t get_rx_hints(size_t)
+ {
+ return uhd::device_addr_t();
+ }
//! Is called after a streamer is generated
virtual void post_streamer_hooks(uhd::direction_t) {}
@@ -216,29 +220,25 @@ protected:
* \param chan_args New channel args. Must have same length as chan_ids.
*
*/
- void merge_channel_defs(
- const std::vector<rfnoc::block_id_t> &chan_ids,
- const std::vector<uhd::device_addr_t> &chan_args,
- const uhd::direction_t dir
- );
+ void merge_channel_defs(const std::vector<rfnoc::block_id_t>& chan_ids,
+ const std::vector<uhd::device_addr_t>& chan_args,
+ const uhd::direction_t dir);
/***********************************************************************
* RFNoC-Specific
**********************************************************************/
- void enumerate_rfnoc_blocks(
- size_t device_index,
- size_t n_blocks,
- size_t base_port,
- const uhd::sid_t &base_sid,
- uhd::device_addr_t transport_args
- );
+ void enumerate_rfnoc_blocks(size_t device_index,
+ size_t n_blocks,
+ size_t base_port,
+ const uhd::sid_t& base_sid,
+ uhd::device_addr_t transport_args);
/***********************************************************************
* Members
**********************************************************************/
// TODO: Maybe move these to private
- uhd::dict<std::string, boost::weak_ptr<uhd::rx_streamer> > _rx_streamers;
- uhd::dict<std::string, boost::weak_ptr<uhd::tx_streamer> > _tx_streamers;
+ uhd::dict<std::string, boost::weak_ptr<uhd::rx_streamer>> _rx_streamers;
+ uhd::dict<std::string, boost::weak_ptr<uhd::tx_streamer>> _tx_streamers;
private:
/***********************************************************************
diff --git a/host/lib/usrp/device3/device3_io_impl.cpp b/host/lib/usrp/device3/device3_io_impl.cpp
index 7afa2ace0..c0f91368d 100644
--- a/host/lib/usrp/device3/device3_io_impl.cpp
+++ b/host/lib/usrp/device3/device3_io_impl.cpp
@@ -7,16 +7,16 @@
// Provides streaming-related functions which are used by device3 objects.
-#include "device3_impl.hpp"
#include "device3_flow_ctrl.hpp"
+#include "device3_impl.hpp"
#include <uhd/rfnoc/constants.hpp>
-#include <uhd/rfnoc/source_block_ctrl_base.hpp>
+#include <uhd/rfnoc/radio_ctrl.hpp>
+#include <uhd/rfnoc/rate_node_ctrl.hpp>
#include <uhd/rfnoc/sink_block_ctrl_base.hpp>
+#include <uhd/rfnoc/source_block_ctrl_base.hpp>
+#include <uhd/transport/zero_copy_flow_ctrl.hpp>
#include <uhd/utils/byteswap.hpp>
#include <uhd/utils/log.hpp>
-#include <uhd/rfnoc/rate_node_ctrl.hpp>
-#include <uhd/rfnoc/radio_ctrl.hpp>
-#include <uhd/transport/zero_copy_flow_ctrl.hpp>
#include <uhdlib/rfnoc/rx_stream_terminator.hpp>
#include <uhdlib/rfnoc/tx_stream_terminator.hpp>
#include <uhdlib/usrp/common/async_packet_handler.hpp>
@@ -32,7 +32,7 @@ using namespace uhd::transport;
/***********************************************************************
* Helper functions for get_?x_stream()
**********************************************************************/
-static uhd::stream_args_t sanitize_stream_args(const uhd::stream_args_t &args_)
+static uhd::stream_args_t sanitize_stream_args(const uhd::stream_args_t& args_)
{
uhd::stream_args_t args = args_;
if (args.channels.empty()) {
@@ -42,31 +42,33 @@ static uhd::stream_args_t sanitize_stream_args(const uhd::stream_args_t &args_)
return args;
}
-static void check_stream_sig_compatible(const rfnoc::stream_sig_t &stream_sig, stream_args_t &args, const std::string &tx_rx)
+static void check_stream_sig_compatible(
+ const rfnoc::stream_sig_t& stream_sig, stream_args_t& args, const std::string& tx_rx)
{
if (args.otw_format.empty()) {
if (stream_sig.item_type.empty()) {
- throw uhd::runtime_error(str(
- boost::format("[%s Streamer] No otw_format defined!") % tx_rx
- ));
+ throw uhd::runtime_error(
+ str(boost::format("[%s Streamer] No otw_format defined!") % tx_rx));
} else {
args.otw_format = stream_sig.item_type;
}
- } else if (not stream_sig.item_type.empty() and stream_sig.item_type != args.otw_format) {
- throw uhd::runtime_error(str(
- boost::format("[%s Streamer] Conflicting OTW types defined: args.otw_format = '%s' <=> stream_sig.item_type = '%s'")
- % tx_rx % args.otw_format % stream_sig.item_type
- ));
+ } else if (not stream_sig.item_type.empty()
+ and stream_sig.item_type != args.otw_format) {
+ throw uhd::runtime_error(
+ str(boost::format("[%s Streamer] Conflicting OTW types defined: "
+ "args.otw_format = '%s' <=> stream_sig.item_type = '%s'")
+ % tx_rx % args.otw_format % stream_sig.item_type));
}
const size_t bpi = convert::get_bytes_per_item(args.otw_format); // bytes per item
if (stream_sig.packet_size) {
if (args.args.has_key("spp")) {
size_t args_spp = args.args.cast<size_t>("spp", 0);
if (args_spp * bpi != stream_sig.packet_size) {
- throw uhd::runtime_error(str(
- boost::format("[%s Streamer] Conflicting packet sizes defined: args yields %d bytes but stream_sig.packet_size is %d bytes")
- % tx_rx % (args_spp * bpi) % stream_sig.packet_size
- ));
+ throw uhd::runtime_error(
+ str(boost::format(
+ "[%s Streamer] Conflicting packet sizes defined: args yields "
+ "%d bytes but stream_sig.packet_size is %d bytes")
+ % tx_rx % (args_spp * bpi) % stream_sig.packet_size));
}
} else {
args.args["spp"] = str(boost::format("%d") % (stream_sig.packet_size / bpi));
@@ -82,19 +84,18 @@ static void check_stream_sig_compatible(const rfnoc::stream_sig_t &stream_sig, s
*
* \param args_ Stream args.
* \param[out] chan_list The list of channels in the correct order.
- * \param[out] chan_args Channel args for every channel. `chan_args.size() == chan_list.size()`
+ * \param[out] chan_args Channel args for every channel. `chan_args.size() ==
+ * chan_list.size()`
*/
-void generate_channel_list(
- const uhd::stream_args_t &args_,
- std::vector<uhd::rfnoc::block_id_t> &chan_list,
- std::vector<device_addr_t> &chan_args
-) {
+void generate_channel_list(const uhd::stream_args_t& args_,
+ std::vector<uhd::rfnoc::block_id_t>& chan_list,
+ std::vector<device_addr_t>& chan_args)
+{
uhd::stream_args_t args = args_;
std::vector<uhd::rfnoc::block_id_t> chan_list_(args.channels.size());
std::vector<device_addr_t> chan_args_(args.channels.size());
- for (size_t i = 0; i < args.channels.size(); i++)
- {
+ for (size_t i = 0; i < args.channels.size(); i++) {
// Extract block ID
size_t chan_idx = args.channels[i];
std::string key = str(boost::format("block_id%d") % chan_idx);
@@ -103,10 +104,10 @@ void generate_channel_list(
} else if (args.args.has_key("block_id")) {
chan_list_[i] = args.args["block_id"];
} else {
- throw uhd::runtime_error(str(
- boost::format("Cannot create streamers: No block_id specified for channel %d.")
- % chan_idx
- ));
+ throw uhd::runtime_error(
+ str(boost::format(
+ "Cannot create streamers: No block_id specified for channel %d.")
+ % chan_idx));
}
// Split off known channel specific args
@@ -125,7 +126,7 @@ void generate_channel_list(
}
// Add all remaining args to all channel args
- for(device_addr_t &chan_arg: chan_args_) {
+ for (device_addr_t& chan_arg : chan_args_) {
chan_arg = chan_arg.to_string() + "," + args.args.to_string();
}
@@ -154,25 +155,20 @@ void generate_channel_list(
* \returns The size of the flow control window in number of packets
*/
static size_t get_rx_flow_control_window(
- size_t pkt_size,
- size_t sw_buff_size,
- const device_addr_t& rx_args
-) {
+ size_t pkt_size, size_t sw_buff_size, const device_addr_t& rx_args)
+{
double fullness_factor = rx_args.cast<double>(
- "recv_buff_fullness",
- uhd::rfnoc::DEFAULT_FC_RX_SW_BUFF_FULL_FACTOR
- );
+ "recv_buff_fullness", uhd::rfnoc::DEFAULT_FC_RX_SW_BUFF_FULL_FACTOR);
if (fullness_factor < 0.01 || fullness_factor > 1) {
- throw uhd::value_error("recv_buff_fullness must be in [0.01, 1] inclusive (1% to 100%)");
+ throw uhd::value_error(
+ "recv_buff_fullness must be in [0.01, 1] inclusive (1% to 100%)");
}
size_t window_in_bytes = (static_cast<size_t>(sw_buff_size * fullness_factor));
if (rx_args.has_key("max_recv_window")) {
window_in_bytes = std::min(
- window_in_bytes,
- rx_args.cast<size_t>("max_recv_window", window_in_bytes)
- );
+ window_in_bytes, rx_args.cast<size_t>("max_recv_window", window_in_bytes));
}
if (window_in_bytes < pkt_size) {
throw uhd::value_error("recv_buff_size must be larger than the recv_frame_size.");
@@ -200,32 +196,28 @@ struct async_tx_info_t
*
* This is run inside a uhd::task as long as this streamer lives.
*/
-static void handle_tx_async_msgs(
- boost::shared_ptr<async_tx_info_t> async_info,
- zero_copy_if::sptr xport,
- uint32_t (*to_host)(uint32_t),
- void (*unpack)(const uint32_t *packet_buff, vrt::if_packet_info_t &),
- boost::function<double(void)> get_tick_rate
-) {
+static void handle_tx_async_msgs(boost::shared_ptr<async_tx_info_t> async_info,
+ zero_copy_if::sptr xport,
+ uint32_t (*to_host)(uint32_t),
+ void (*unpack)(const uint32_t* packet_buff, vrt::if_packet_info_t&),
+ boost::function<double(void)> get_tick_rate)
+{
managed_recv_buffer::sptr buff = xport->get_recv_buff();
- if (not buff)
- {
+ if (not buff) {
return;
}
- //extract packet info
+ // extract packet info
vrt::if_packet_info_t if_packet_info;
- if_packet_info.num_packet_words32 = buff->size()/sizeof(uint32_t);
- const uint32_t *packet_buff = buff->cast<const uint32_t *>();
+ if_packet_info.num_packet_words32 = buff->size() / sizeof(uint32_t);
+ const uint32_t* packet_buff = buff->cast<const uint32_t*>();
- //unpacking can fail
- try
- {
+ // unpacking can fail
+ try {
unpack(packet_buff, if_packet_info);
- }
- catch(const std::exception &ex)
- {
- UHD_LOGGER_ERROR("STREAMER") << "Error parsing async message packet: " << ex.what() ;
+ } catch (const std::exception& ex) {
+ UHD_LOGGER_ERROR("STREAMER")
+ << "Error parsing async message packet: " << ex.what();
return;
}
@@ -234,21 +226,20 @@ static void handle_tx_async_msgs(
tick_rate = 1;
}
- //fill in the async metadata
+ // fill in the async metadata
async_metadata_t metadata;
- load_metadata_from_buff(
- to_host,
- metadata,
- if_packet_info,
- packet_buff,
- tick_rate,
- async_info->stream_channel
- );
+ load_metadata_from_buff(to_host,
+ metadata,
+ if_packet_info,
+ packet_buff,
+ tick_rate,
+ async_info->stream_channel);
// Filter out any flow control messages and cache the rest
- if (metadata.event_code == DEVICE3_ASYNC_EVENT_CODE_FLOW_CTRL)
- {
- UHD_LOGGER_ERROR("TX ASYNC MSG") << "Unexpected flow control message found in async message handling" << std::endl;
+ if (metadata.event_code == DEVICE3_ASYNC_EVENT_CODE_FLOW_CTRL) {
+ UHD_LOGGER_ERROR("TX ASYNC MSG")
+ << "Unexpected flow control message found in async message handling"
+ << std::endl;
} else {
async_info->async_queue->push_with_pop_on_full(metadata);
metadata.channel = async_info->device_channel;
@@ -257,9 +248,7 @@ static void handle_tx_async_msgs(
}
}
-bool device3_impl::recv_async_msg(
- async_metadata_t &async_metadata, double timeout
-)
+bool device3_impl::recv_async_msg(async_metadata_t& async_metadata, double timeout)
{
return _async_md->pop_with_timed_wait(async_metadata, timeout);
}
@@ -269,10 +258,11 @@ bool device3_impl::recv_async_msg(
**********************************************************************/
void device3_impl::update_rx_streamers(double /* rate */)
{
- for(const std::string &block_id: _rx_streamers.keys()) {
+ for (const std::string& block_id : _rx_streamers.keys()) {
UHD_RX_STREAMER_LOG() << "updating RX streamer to " << block_id;
boost::shared_ptr<device3_recv_packet_streamer> my_streamer =
- boost::dynamic_pointer_cast<device3_recv_packet_streamer>(_rx_streamers[block_id].lock());
+ boost::dynamic_pointer_cast<device3_recv_packet_streamer>(
+ _rx_streamers[block_id].lock());
if (my_streamer) {
double tick_rate = my_streamer->get_terminator()->get_tick_rate();
if (tick_rate == rfnoc::tick_node_ctrl::RATE_UNDEFINED) {
@@ -285,9 +275,11 @@ void device3_impl::update_rx_streamers(double /* rate */)
}
double scaling = my_streamer->get_terminator()->get_output_scale_factor();
if (scaling == rfnoc::scalar_node_ctrl::SCALE_UNDEFINED) {
- scaling = 1/32767.;
+ scaling = 1 / 32767.;
}
- UHD_RX_STREAMER_LOG() << " New tick_rate == " << tick_rate << " New samp_rate == " << samp_rate << " New scaling == " << scaling ;
+ UHD_RX_STREAMER_LOG()
+ << " New tick_rate == " << tick_rate
+ << " New samp_rate == " << samp_rate << " New scaling == " << scaling;
my_streamer->set_tick_rate(tick_rate);
my_streamer->set_samp_rate(samp_rate);
@@ -296,7 +288,7 @@ void device3_impl::update_rx_streamers(double /* rate */)
}
}
-rx_streamer::sptr device3_impl::get_rx_stream(const stream_args_t &args_)
+rx_streamer::sptr device3_impl::get_rx_stream(const stream_args_t& args_)
{
boost::mutex::scoped_lock lock(_transport_setup_mutex);
stream_args_t args = sanitize_stream_args(args_);
@@ -312,88 +304,83 @@ rx_streamer::sptr device3_impl::get_rx_stream(const stream_args_t &args_)
// The terminator's lifetime is coupled to the streamer.
// There is only one terminator. If the streamer has multiple channels,
// it will be connected to each upstream block.
- rfnoc::rx_stream_terminator::sptr recv_terminator = rfnoc::rx_stream_terminator::make();
- for (size_t stream_i = 0; stream_i < chan_list.size(); stream_i++)
- {
+ rfnoc::rx_stream_terminator::sptr recv_terminator =
+ rfnoc::rx_stream_terminator::make();
+ for (size_t stream_i = 0; stream_i < chan_list.size(); stream_i++) {
// First, configure blocks and create transport
// Get block ID and mb index
uhd::rfnoc::block_id_t block_id = chan_list[stream_i];
- UHD_RX_STREAMER_LOG() << "chan " << stream_i << " connecting to " << block_id ;
+ UHD_RX_STREAMER_LOG() << "chan " << stream_i << " connecting to " << block_id;
// Update args so args.args is always valid for this particular channel:
- args.args = chan_args[stream_i];
+ args.args = chan_args[stream_i];
size_t mb_index = block_id.get_device_no();
- size_t suggested_block_port = args.args.cast<size_t>("block_port", rfnoc::ANY_PORT);
+ size_t suggested_block_port =
+ args.args.cast<size_t>("block_port", rfnoc::ANY_PORT);
// Access to this channel's block control
uhd::rfnoc::source_block_ctrl_base::sptr blk_ctrl =
- boost::dynamic_pointer_cast<uhd::rfnoc::source_block_ctrl_base>(get_block_ctrl(block_id));
+ boost::dynamic_pointer_cast<uhd::rfnoc::source_block_ctrl_base>(
+ get_block_ctrl(block_id));
// Connect the terminator with this channel's block.
size_t block_port = blk_ctrl->connect_downstream(
- recv_terminator,
- suggested_block_port,
- args.args
- );
+ recv_terminator, suggested_block_port, args.args);
const size_t terminator_port = recv_terminator->connect_upstream(blk_ctrl);
blk_ctrl->set_downstream_port(block_port, terminator_port);
recv_terminator->set_upstream_port(terminator_port, block_port);
// Check if the block connection is compatible (spp and item type)
- check_stream_sig_compatible(blk_ctrl->get_output_signature(block_port), args, "RX");
+ check_stream_sig_compatible(
+ blk_ctrl->get_output_signature(block_port), args, "RX");
// Setup the DSP transport hints
device_addr_t rx_hints = get_rx_hints(mb_index);
- //allocate sid and create transport
+ // allocate sid and create transport
uhd::sid_t stream_address = blk_ctrl->get_address(block_port);
- UHD_RX_STREAMER_LOG() << "creating rx stream " << rx_hints.to_string() ;
+ UHD_RX_STREAMER_LOG() << "creating rx stream " << rx_hints.to_string();
both_xports_t xport = make_transport(stream_address, RX_DATA, rx_hints);
- UHD_RX_STREAMER_LOG() << std::hex << "data_sid = " << xport.send_sid << std::dec << " actual recv_buff_size = " << xport.recv_buff_size;
+ UHD_RX_STREAMER_LOG() << std::hex << "data_sid = " << xport.send_sid << std::dec
+ << " actual recv_buff_size = " << xport.recv_buff_size;
// Configure the block
// Flow control setup
const size_t pkt_size = xport.recv->get_recv_frame_size();
// Leave one pkt_size space for overrun packets - TODO make this obsolete
- const size_t fc_window = get_rx_flow_control_window(pkt_size, xport.recv_buff_size, rx_hints) - pkt_size;
- const size_t fc_handle_window = std::max<size_t>(1, fc_window / stream_options.rx_fc_request_freq);
- UHD_RX_STREAMER_LOG()<< "Flow Control Window = " << (fc_window) << ", Flow Control Handler Window = " << fc_handle_window;
- blk_ctrl->configure_flow_control_out(
- true,
+ const size_t fc_window =
+ get_rx_flow_control_window(pkt_size, xport.recv_buff_size, rx_hints)
+ - pkt_size;
+ const size_t fc_handle_window =
+ std::max<size_t>(1, fc_window / stream_options.rx_fc_request_freq);
+ UHD_RX_STREAMER_LOG() << "Flow Control Window = " << (fc_window)
+ << ", Flow Control Handler Window = " << fc_handle_window;
+ blk_ctrl->configure_flow_control_out(true,
fc_window,
- rx_hints.cast<size_t>("recv_pkt_limit", 0), // On rfnoc-devel, update e300_impl::get_rx_hints() to set this to 32
- block_port
- );
+ rx_hints.cast<size_t>("recv_pkt_limit",
+ 0), // On rfnoc-devel, update e300_impl::get_rx_hints() to set this to 32
+ block_port);
// Add flow control transport
boost::shared_ptr<rx_fc_cache_t> fc_cache(new rx_fc_cache_t());
- fc_cache->sid = xport.send_sid;
- fc_cache->xport = xport.send;
+ fc_cache->sid = xport.send_sid;
+ fc_cache->xport = xport.send;
fc_cache->interval = fc_handle_window;
- if (xport.endianness == ENDIANNESS_BIG)
- {
- fc_cache->to_host = uhd::ntohx<uint32_t>;
+ if (xport.endianness == ENDIANNESS_BIG) {
+ fc_cache->to_host = uhd::ntohx<uint32_t>;
fc_cache->from_host = uhd::htonx<uint32_t>;
- fc_cache->pack = vrt::chdr::if_hdr_pack_be;
- fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
- }
- else
- {
- fc_cache->to_host = uhd::wtohx<uint32_t>;
+ fc_cache->pack = vrt::chdr::if_hdr_pack_be;
+ fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
+ } else {
+ fc_cache->to_host = uhd::wtohx<uint32_t>;
fc_cache->from_host = uhd::htowx<uint32_t>;
- fc_cache->pack = vrt::chdr::if_hdr_pack_le;
- fc_cache->unpack = vrt::chdr::if_hdr_unpack_le;
+ fc_cache->pack = vrt::chdr::if_hdr_pack_le;
+ fc_cache->unpack = vrt::chdr::if_hdr_unpack_le;
}
- xport.recv = zero_copy_flow_ctrl::make
- (
- xport.recv,
- NULL,
- [fc_cache](managed_buffer::sptr buff) {
- return rx_flow_ctrl(
- fc_cache,
- buff);
- }
- );
+ xport.recv = zero_copy_flow_ctrl::make(
+ xport.recv, NULL, [fc_cache](managed_buffer::sptr buff) {
+ return rx_flow_ctrl(fc_cache, buff);
+ });
// Configure the block
// Note: We need to set_destination() after writing to SR_CLEAR_TX_FC.
@@ -406,36 +393,41 @@ rx_streamer::sptr device3_impl::get_rx_stream(const stream_args_t &args_)
blk_ctrl->set_destination(xport.send_sid.get_src(), block_port);
// Configure routing for responses
- blk_ctrl->sr_write(uhd::rfnoc::SR_RESP_OUT_DST_SID, xport.send_sid.get_src(), block_port);
- UHD_RX_STREAMER_LOG() << "resp_out_dst_sid == " << xport.send_sid.get_src() ;
+ blk_ctrl->sr_write(
+ uhd::rfnoc::SR_RESP_OUT_DST_SID, xport.send_sid.get_src(), block_port);
+ UHD_RX_STREAMER_LOG() << "resp_out_dst_sid == " << xport.send_sid.get_src();
// Find all upstream radio nodes and set their response in SID to the host
- std::vector<boost::shared_ptr<uhd::rfnoc::radio_ctrl> > upstream_radio_nodes = blk_ctrl->find_upstream_node<uhd::rfnoc::radio_ctrl>();
- UHD_RX_STREAMER_LOG() << "Number of upstream radio nodes: " << upstream_radio_nodes.size();
- for(const boost::shared_ptr<uhd::rfnoc::radio_ctrl> &node: upstream_radio_nodes) {
- node->sr_write(uhd::rfnoc::SR_RESP_OUT_DST_SID, xport.send_sid.get_src(), block_port);
+ std::vector<boost::shared_ptr<uhd::rfnoc::radio_ctrl>> upstream_radio_nodes =
+ blk_ctrl->find_upstream_node<uhd::rfnoc::radio_ctrl>();
+ UHD_RX_STREAMER_LOG() << "Number of upstream radio nodes: "
+ << upstream_radio_nodes.size();
+ for (const boost::shared_ptr<uhd::rfnoc::radio_ctrl>& node :
+ upstream_radio_nodes) {
+ node->sr_write(
+ uhd::rfnoc::SR_RESP_OUT_DST_SID, xport.send_sid.get_src(), block_port);
}
// Second, configure the streamer
- //make the new streamer given the samples per packet
- if (not my_streamer)
- {
- // To calculate the max number of samples per packet, we assume the maximum header length
- // to avoid fragmentation should the entire header be used.
- const size_t bpp = pkt_size - stream_options.rx_max_len_hdr; // bytes per packet
- const size_t bpi = convert::get_bytes_per_item(args.otw_format); // bytes per item
- const size_t spp = std::min(args.args.cast<size_t>("spp", bpp/bpi), bpp/bpi); // samples per packet
- UHD_RX_STREAMER_LOG() << "spp == " << spp ;
+ // make the new streamer given the samples per packet
+ if (not my_streamer) {
+ // To calculate the max number of samples per packet, we assume the maximum
+ // header length to avoid fragmentation should the entire header be used.
+ const size_t bpp =
+ pkt_size - stream_options.rx_max_len_hdr; // bytes per packet
+ const size_t bpi =
+ convert::get_bytes_per_item(args.otw_format); // bytes per item
+ const size_t spp = std::min(args.args.cast<size_t>("spp", bpp / bpi),
+ bpp / bpi); // samples per packet
+ UHD_RX_STREAMER_LOG() << "spp == " << spp;
my_streamer = boost::make_shared<device3_recv_packet_streamer>(
- spp,
- recv_terminator,
- xport);
+ spp, recv_terminator, xport);
my_streamer->resize(chan_list.size());
}
- //init some streamer stuff
+ // init some streamer stuff
std::string conv_endianness;
if (xport.endianness == ENDIANNESS_BIG) {
my_streamer->set_vrt_unpacker(&vrt::chdr::if_hdr_unpack_be);
@@ -445,63 +437,51 @@ rx_streamer::sptr device3_impl::get_rx_stream(const stream_args_t &args_)
conv_endianness = "le";
}
- //set the converter
+ // set the converter
uhd::convert::id_type id;
- id.input_format = args.otw_format + "_item32_" + conv_endianness;
- id.num_inputs = 1;
+ id.input_format = args.otw_format + "_item32_" + conv_endianness;
+ id.num_inputs = 1;
id.output_format = args.cpu_format;
- id.num_outputs = 1;
+ id.num_outputs = 1;
my_streamer->set_converter(id);
// Give the streamer a functor to handle flow control ACK messages
my_streamer->set_xport_handle_flowctrl_ack(
- stream_i,
- [fc_cache](const uint32_t *payload) {
- handle_rx_flowctrl_ack(
- fc_cache,
- payload
- );
- }
- );
+ stream_i, [fc_cache](const uint32_t* payload) {
+ handle_rx_flowctrl_ack(fc_cache, payload);
+ });
- //Give the streamer a functor to get the recv_buffer
- my_streamer->set_xport_chan_get_buff(
- stream_i,
- [xport](double timeout) {
- return xport.recv->get_recv_buff(timeout);
- },
+ // Give the streamer a functor to get the recv_buffer
+ my_streamer->set_xport_chan_get_buff(stream_i,
+ [xport](double timeout) { return xport.recv->get_recv_buff(timeout); },
true /*flush*/
);
- //Give the streamer a functor to handle overruns
- //bind requires a weak_ptr to break the a streamer->streamer circular dependency
- //Using "this" is OK because we know that this device3_impl will outlive the streamer
+ // Give the streamer a functor to handle overruns
+ // bind requires a weak_ptr to break the a streamer->streamer circular dependency
+ // Using "this" is OK because we know that this device3_impl will outlive the
+ // streamer
boost::weak_ptr<uhd::rx_streamer> weak_ptr(my_streamer);
my_streamer->set_overflow_handler(
- stream_i,
- [recv_terminator, weak_ptr, stream_i]() {
- recv_terminator->handle_overrun(
- weak_ptr,
- stream_i);
- }
- );
+ stream_i, [recv_terminator, weak_ptr, stream_i]() {
+ recv_terminator->handle_overrun(weak_ptr, stream_i);
+ });
- //Give the streamer a functor issue stream cmd
+ // Give the streamer a functor issue stream cmd
my_streamer->set_issue_stream_cmd(
- stream_i,
- [blk_ctrl, block_port](const stream_cmd_t& stream_cmd) {
+ stream_i, [blk_ctrl, block_port](const stream_cmd_t& stream_cmd) {
blk_ctrl->issue_stream_cmd(stream_cmd, block_port);
- }
- );
+ });
}
// Notify all blocks in this chain that they are connected to an active streamer
recv_terminator->set_rx_streamer(true, 0);
- // Store a weak pointer to prevent a streamer->device3_impl->streamer circular dependency.
- // Note that we store the streamer only once, and use its terminator's
- // ID to do so.
- _rx_streamers[recv_terminator->unique_id()] = boost::weak_ptr<uhd::rx_streamer>(my_streamer);
+ // Store a weak pointer to prevent a streamer->device3_impl->streamer circular
+ // dependency. Note that we store the streamer only once, and use its terminator's ID
+ // to do so.
+ _rx_streamers[recv_terminator->unique_id()] =
+ boost::weak_ptr<uhd::rx_streamer>(my_streamer);
// Sets tick rate, samp rate and scaling on this streamer.
// A registered terminator is required to do this.
@@ -516,10 +496,11 @@ rx_streamer::sptr device3_impl::get_rx_stream(const stream_args_t &args_)
**********************************************************************/
void device3_impl::update_tx_streamers(double /* rate */)
{
- for(const std::string &block_id: _tx_streamers.keys()) {
+ for (const std::string& block_id : _tx_streamers.keys()) {
UHD_TX_STREAMER_LOG() << "updating TX streamer: " << block_id;
boost::shared_ptr<device3_send_packet_streamer> my_streamer =
- boost::dynamic_pointer_cast<device3_send_packet_streamer>(_tx_streamers[block_id].lock());
+ boost::dynamic_pointer_cast<device3_send_packet_streamer>(
+ _tx_streamers[block_id].lock());
if (my_streamer) {
double tick_rate = my_streamer->get_terminator()->get_tick_rate();
if (tick_rate == rfnoc::tick_node_ctrl::RATE_UNDEFINED) {
@@ -533,7 +514,9 @@ void device3_impl::update_tx_streamers(double /* rate */)
if (scaling == rfnoc::scalar_node_ctrl::SCALE_UNDEFINED) {
scaling = 32767.;
}
- UHD_TX_STREAMER_LOG() << "New tick_rate == " << tick_rate << " New samp_rate == " << samp_rate << " New scaling == " << scaling ;
+ UHD_TX_STREAMER_LOG()
+ << "New tick_rate == " << tick_rate << " New samp_rate == " << samp_rate
+ << " New scaling == " << scaling;
my_streamer->set_tick_rate(tick_rate);
my_streamer->set_samp_rate(samp_rate);
my_streamer->set_scale_factor(scaling);
@@ -541,7 +524,7 @@ void device3_impl::update_tx_streamers(double /* rate */)
}
}
-tx_streamer::sptr device3_impl::get_tx_stream(const uhd::stream_args_t &args_)
+tx_streamer::sptr device3_impl::get_tx_stream(const uhd::stream_args_t& args_)
{
boost::mutex::scoped_lock lock(_transport_setup_mutex);
stream_args_t args = sanitize_stream_args(args_);
@@ -552,108 +535,111 @@ tx_streamer::sptr device3_impl::get_tx_stream(const uhd::stream_args_t &args_)
generate_channel_list(args, chan_list, chan_args);
// Note: All 'args.args' are merged into chan_args now.
- //shared async queue for all channels in streamer
- boost::shared_ptr<async_md_type> async_md(new async_md_type(1000/*messages deep*/));
+ // shared async queue for all channels in streamer
+ boost::shared_ptr<async_md_type> async_md(new async_md_type(1000 /*messages deep*/));
// II. Iterate over all channels
boost::shared_ptr<device3_send_packet_streamer> my_streamer;
// The terminator's lifetime is coupled to the streamer.
// There is only one terminator. If the streamer has multiple channels,
// it will be connected to each downstream block.
- rfnoc::tx_stream_terminator::sptr send_terminator = rfnoc::tx_stream_terminator::make();
- for (size_t stream_i = 0; stream_i < chan_list.size(); stream_i++)
- {
+ rfnoc::tx_stream_terminator::sptr send_terminator =
+ rfnoc::tx_stream_terminator::make();
+ for (size_t stream_i = 0; stream_i < chan_list.size(); stream_i++) {
// First, configure the downstream blocks and create the transports
// Get block ID and mb index
uhd::rfnoc::block_id_t block_id = chan_list[stream_i];
// Update args so args.args is always valid for this particular channel:
- args.args = chan_args[stream_i];
+ args.args = chan_args[stream_i];
size_t mb_index = block_id.get_device_no();
- size_t suggested_block_port = args.args.cast<size_t>("block_port", rfnoc::ANY_PORT);
+ size_t suggested_block_port =
+ args.args.cast<size_t>("block_port", rfnoc::ANY_PORT);
// Access to this channel's block control
uhd::rfnoc::sink_block_ctrl_base::sptr blk_ctrl =
- boost::dynamic_pointer_cast<uhd::rfnoc::sink_block_ctrl_base>(get_block_ctrl(block_id));
+ boost::dynamic_pointer_cast<uhd::rfnoc::sink_block_ctrl_base>(
+ get_block_ctrl(block_id));
// Connect the terminator with this channel's block.
// This will throw if the connection is not possible.
- size_t block_port = blk_ctrl->connect_upstream(
- send_terminator,
- suggested_block_port,
- args.args
- );
+ size_t block_port =
+ blk_ctrl->connect_upstream(send_terminator, suggested_block_port, args.args);
const size_t terminator_port = send_terminator->connect_downstream(blk_ctrl);
blk_ctrl->set_upstream_port(block_port, terminator_port);
send_terminator->set_downstream_port(terminator_port, block_port);
// Check if the block connection is compatible (spp and item type)
- check_stream_sig_compatible(blk_ctrl->get_input_signature(block_port), args, "TX");
+ check_stream_sig_compatible(
+ blk_ctrl->get_input_signature(block_port), args, "TX");
// Setup the dsp transport hints
device_addr_t tx_hints = get_tx_hints(mb_index);
const size_t fifo_size = blk_ctrl->get_fifo_size(block_port);
// Allocate sid and create transport
uhd::sid_t stream_address = blk_ctrl->get_address(block_port);
- UHD_TX_STREAMER_LOG() << "creating tx stream " << tx_hints.to_string() ;
+ UHD_TX_STREAMER_LOG() << "creating tx stream " << tx_hints.to_string();
both_xports_t xport = make_transport(stream_address, TX_DATA, tx_hints);
- both_xports_t async_xport = make_transport(stream_address, ASYNC_MSG, device_addr_t(""));
- UHD_TX_STREAMER_LOG() << std::hex << "data_sid = " << xport.send_sid << std::dec ;
+ both_xports_t async_xport =
+ make_transport(stream_address, ASYNC_MSG, device_addr_t(""));
+ UHD_TX_STREAMER_LOG() << std::hex << "data_sid = " << xport.send_sid << std::dec;
// Configure flow control
// This disables the FC module's output, do this before configuring flow control
blk_ctrl->sr_write(uhd::rfnoc::SR_CLEAR_RX_FC, 0x1, block_port);
blk_ctrl->sr_write(uhd::rfnoc::SR_CLEAR_RX_FC, 0x0, block_port);
// Configure flow control on downstream block
- const size_t fc_window = std::min(tx_hints.cast<size_t>("send_buff_size", fifo_size), fifo_size);
- const size_t fc_handle_window = std::max<size_t>(1, fc_window / stream_options.tx_fc_response_freq);
- UHD_TX_STREAMER_LOG() << "Flow Control Window = " << fc_window << ", Flow Control Handler Window = " << fc_handle_window ;
- blk_ctrl->configure_flow_control_in(
- fc_handle_window, /*bytes*/
- block_port
- );
+ const size_t fc_window =
+ std::min(tx_hints.cast<size_t>("send_buff_size", fifo_size), fifo_size);
+ const size_t fc_handle_window =
+ std::max<size_t>(1, fc_window / stream_options.tx_fc_response_freq);
+ UHD_TX_STREAMER_LOG() << "Flow Control Window = " << fc_window
+ << ", Flow Control Handler Window = " << fc_handle_window;
+ blk_ctrl->configure_flow_control_in(fc_handle_window, /*bytes*/
+ block_port);
// Add flow control transport
boost::shared_ptr<tx_fc_cache_t> fc_cache(new tx_fc_cache_t(fc_window));
- if (xport.endianness == ENDIANNESS_BIG)
- {
- fc_cache->to_host = uhd::ntohx<uint32_t>;
+ if (xport.endianness == ENDIANNESS_BIG) {
+ fc_cache->to_host = uhd::ntohx<uint32_t>;
fc_cache->from_host = uhd::htonx<uint32_t>;
- fc_cache->pack = vrt::chdr::if_hdr_pack_be;
- fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
+ fc_cache->pack = vrt::chdr::if_hdr_pack_be;
+ fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
} else {
- fc_cache->to_host = uhd::wtohx<uint32_t>;
+ fc_cache->to_host = uhd::wtohx<uint32_t>;
fc_cache->from_host = uhd::htowx<uint32_t>;
- fc_cache->pack = vrt::chdr::if_hdr_pack_le;
- fc_cache->unpack = vrt::chdr::if_hdr_unpack_le;
+ fc_cache->pack = vrt::chdr::if_hdr_pack_le;
+ fc_cache->unpack = vrt::chdr::if_hdr_unpack_le;
}
- xport.send = zero_copy_flow_ctrl::make(
- xport.send,
+ xport.send = zero_copy_flow_ctrl::make(xport.send,
[fc_cache, xport](managed_buffer::sptr buff) {
- return tx_flow_ctrl(
- fc_cache,
- xport.recv,
- buff);
+ return tx_flow_ctrl(fc_cache, xport.recv, buff);
},
- NULL
- );
+ NULL);
// Configure return path for async messages
- blk_ctrl->sr_write(uhd::rfnoc::SR_RESP_IN_DST_SID, async_xport.recv_sid.get_dst(), block_port);
- UHD_TX_STREAMER_LOG() << "resp_in_dst_sid == " << boost::format("0x%04X") % xport.recv_sid.get_dst() ;
+ blk_ctrl->sr_write(
+ uhd::rfnoc::SR_RESP_IN_DST_SID, async_xport.recv_sid.get_dst(), block_port);
+ UHD_TX_STREAMER_LOG() << "resp_in_dst_sid == "
+ << boost::format("0x%04X") % xport.recv_sid.get_dst();
// FIXME: Once there is a better way to map the radio block and port
// to the channel or another way to receive asynchronous messages that
// is not in-band, this should be removed.
- if (args.args.has_key("radio_id") and args.args.has_key("radio_port"))
- {
+ if (args.args.has_key("radio_id") and args.args.has_key("radio_port")) {
// Find downstream radio node and set the response SID to the host
uhd::rfnoc::block_id_t radio_id(args.args["radio_id"]);
size_t radio_port = args.args.cast<size_t>("radio_port", 0);
- std::vector<boost::shared_ptr<uhd::rfnoc::radio_ctrl> > downstream_radio_nodes = blk_ctrl->find_downstream_node<uhd::rfnoc::radio_ctrl>();
- UHD_TX_STREAMER_LOG() << "Number of downstream radio nodes: " << downstream_radio_nodes.size();
- for(const boost::shared_ptr<uhd::rfnoc::radio_ctrl> &node: downstream_radio_nodes) {
+ std::vector<boost::shared_ptr<uhd::rfnoc::radio_ctrl>>
+ downstream_radio_nodes =
+ blk_ctrl->find_downstream_node<uhd::rfnoc::radio_ctrl>();
+ UHD_TX_STREAMER_LOG()
+ << "Number of downstream radio nodes: " << downstream_radio_nodes.size();
+ for (const boost::shared_ptr<uhd::rfnoc::radio_ctrl>& node :
+ downstream_radio_nodes) {
if (node->get_block_id() == radio_id) {
- node->sr_write(uhd::rfnoc::SR_RESP_IN_DST_SID, async_xport.recv_sid.get_dst(), radio_port);
+ node->sr_write(uhd::rfnoc::SR_RESP_IN_DST_SID,
+ async_xport.recv_sid.get_dst(),
+ radio_port);
}
}
} else {
@@ -663,34 +649,41 @@ tx_streamer::sptr device3_impl::get_tx_stream(const uhd::stream_args_t &args_)
// is not the same as the block_port. It should be removed as
// soon as possible.
// Find all downstream radio nodes and set their response SID to the host
- std::vector<boost::shared_ptr<uhd::rfnoc::radio_ctrl> > downstream_radio_nodes = blk_ctrl->find_downstream_node<uhd::rfnoc::radio_ctrl>();
- UHD_TX_STREAMER_LOG() << "Number of downstream radio nodes: " << downstream_radio_nodes.size();
- for(const boost::shared_ptr<uhd::rfnoc::radio_ctrl> &node: downstream_radio_nodes) {
- node->sr_write(uhd::rfnoc::SR_RESP_IN_DST_SID, async_xport.recv_sid.get_dst(), block_port);
+ std::vector<boost::shared_ptr<uhd::rfnoc::radio_ctrl>>
+ downstream_radio_nodes =
+ blk_ctrl->find_downstream_node<uhd::rfnoc::radio_ctrl>();
+ UHD_TX_STREAMER_LOG()
+ << "Number of downstream radio nodes: " << downstream_radio_nodes.size();
+ for (const boost::shared_ptr<uhd::rfnoc::radio_ctrl>& node :
+ downstream_radio_nodes) {
+ node->sr_write(uhd::rfnoc::SR_RESP_IN_DST_SID,
+ async_xport.recv_sid.get_dst(),
+ block_port);
}
}
- // Second, configure the streamer now that the blocks and transports are configured
-
- //make the new streamer given the samples per packet
- if (not my_streamer)
- {
- // To calculate the max number of samples per packet, we assume the maximum header length
- // to avoid fragmentation should the entire header be used.
- const size_t bpp = tx_hints.cast<size_t>("bpp", xport.send->get_send_frame_size()) - stream_options.tx_max_len_hdr;
- const size_t bpi = convert::get_bytes_per_item(args.otw_format); // bytes per item
- const size_t spp = std::min(args.args.cast<size_t>("spp", bpp/bpi), bpp/bpi); // samples per packet
- UHD_TX_STREAMER_LOG() << "spp == " << spp ;
+ // Second, configure the streamer now that the blocks and transports are
+ // configured
+
+ // make the new streamer given the samples per packet
+ if (not my_streamer) {
+ // To calculate the max number of samples per packet, we assume the maximum
+ // header length to avoid fragmentation should the entire header be used.
+ const size_t bpp =
+ tx_hints.cast<size_t>("bpp", xport.send->get_send_frame_size())
+ - stream_options.tx_max_len_hdr;
+ const size_t bpi =
+ convert::get_bytes_per_item(args.otw_format); // bytes per item
+ const size_t spp = std::min(args.args.cast<size_t>("spp", bpp / bpi),
+ bpp / bpi); // samples per packet
+ UHD_TX_STREAMER_LOG() << "spp == " << spp;
my_streamer = boost::make_shared<device3_send_packet_streamer>(
- spp,
- send_terminator,
- xport,
- async_xport);
+ spp, send_terminator, xport, async_xport);
my_streamer->resize(chan_list.size());
}
- //init some streamer stuff
+ // init some streamer stuff
std::string conv_endianness;
if (xport.endianness == ENDIANNESS_BIG) {
my_streamer->set_vrt_packer(&vrt::chdr::if_hdr_pack_be);
@@ -700,69 +693,57 @@ tx_streamer::sptr device3_impl::get_tx_stream(const uhd::stream_args_t &args_)
conv_endianness = "le";
}
- //set the converter
+ // set the converter
uhd::convert::id_type id;
- id.input_format = args.cpu_format;
- id.num_inputs = 1;
+ id.input_format = args.cpu_format;
+ id.num_inputs = 1;
id.output_format = args.otw_format + "_item32_" + conv_endianness;
- id.num_outputs = 1;
+ id.num_outputs = 1;
my_streamer->set_converter(id);
boost::shared_ptr<async_tx_info_t> async_tx_info(new async_tx_info_t());
- async_tx_info->stream_channel = args.channels[stream_i];
- async_tx_info->device_channel = mb_index;
- async_tx_info->async_queue = async_md;
+ async_tx_info->stream_channel = args.channels[stream_i];
+ async_tx_info->device_channel = mb_index;
+ async_tx_info->async_queue = async_md;
async_tx_info->old_async_queue = _async_md;
- task::sptr async_task = task::make(
- [async_tx_info, async_xport, xport, send_terminator]() {
- handle_tx_async_msgs(
- async_tx_info,
- async_xport.recv,
- xport.endianness == ENDIANNESS_BIG ? uhd::ntohx<uint32_t> : uhd::wtohx<uint32_t>,
- xport.endianness == ENDIANNESS_BIG ? vrt::chdr::if_hdr_unpack_be : vrt::chdr::if_hdr_unpack_le,
- [send_terminator]() {return send_terminator->get_tick_rate();}
- );
- }
- );
+ task::sptr async_task =
+ task::make([async_tx_info, async_xport, xport, send_terminator]() {
+ handle_tx_async_msgs(async_tx_info,
+ async_xport.recv,
+ xport.endianness == ENDIANNESS_BIG ? uhd::ntohx<uint32_t>
+ : uhd::wtohx<uint32_t>,
+ xport.endianness == ENDIANNESS_BIG ? vrt::chdr::if_hdr_unpack_be
+ : vrt::chdr::if_hdr_unpack_le,
+ [send_terminator]() { return send_terminator->get_tick_rate(); });
+ });
my_streamer->add_async_msg_task(async_task);
- //Give the streamer a functor to get the send buffer
- my_streamer->set_xport_chan_get_buff(
- stream_i,
- [xport](const double timeout) {
- return xport.send->get_send_buff(timeout);
- }
- );
- //Give the streamer a functor handled received async messages
+ // Give the streamer a functor to get the send buffer
+ my_streamer->set_xport_chan_get_buff(stream_i,
+ [xport](const double timeout) { return xport.send->get_send_buff(timeout); });
+ // Give the streamer a functor handled received async messages
my_streamer->set_async_receiver(
[async_md](uhd::async_metadata_t& md, const double timeout) {
return async_md->pop_with_timed_wait(md, timeout);
- }
- );
+ });
my_streamer->set_xport_chan_sid(stream_i, true, xport.send_sid);
// CHDR does not support trailers
my_streamer->set_enable_trailer(false);
- my_streamer->set_xport_chan_post_send_cb(
- stream_i,
- [fc_cache, xport]() {
- tx_flow_ctrl_ack(
- fc_cache,
- xport.send,
- xport.send_sid
- );
- }
- );
+ my_streamer->set_xport_chan_post_send_cb(stream_i, [fc_cache, xport]() {
+ tx_flow_ctrl_ack(fc_cache, xport.send, xport.send_sid);
+ });
}
// Notify all blocks in this chain that they are connected to an active streamer
send_terminator->set_tx_streamer(true, 0);
- // Store a weak pointer to prevent a streamer->device3_impl->streamer circular dependency.
- // Note that we store the streamer only once, and use its terminator's
- // ID to do so.
- _tx_streamers[send_terminator->unique_id()] = boost::weak_ptr<uhd::tx_streamer>(my_streamer);
+ // Store a weak pointer to prevent a streamer->device3_impl->streamer circular
+ // dependency. Note that we store the streamer only once, and use its terminator's ID
+ // to do so.
+ _tx_streamers[send_terminator->unique_id()] =
+ boost::weak_ptr<uhd::tx_streamer>(my_streamer);
// Sets tick rate, samp rate and scaling on this streamer
// A registered terminator is required to do this.
@@ -771,5 +752,3 @@ tx_streamer::sptr device3_impl::get_tx_stream(const uhd::stream_args_t &args_)
post_streamer_hooks(TX_DIRECTION);
return my_streamer;
}
-
-
diff --git a/host/lib/usrp/mpmd/mpmd_devices.hpp b/host/lib/usrp/mpmd/mpmd_devices.hpp
index ab0cc1271..9cc046037 100644
--- a/host/lib/usrp/mpmd/mpmd_devices.hpp
+++ b/host/lib/usrp/mpmd/mpmd_devices.hpp
@@ -8,8 +8,8 @@
#ifndef INCLUDED_MPMD_DEVICES_HPP
#define INCLUDED_MPMD_DEVICES_HPP
-#include <vector>
#include <string>
+#include <vector>
static constexpr char MPM_CATCHALL_DEVICE_TYPE[] = "mpm";
diff --git a/host/lib/usrp/mpmd/mpmd_find.cpp b/host/lib/usrp/mpmd/mpmd_find.cpp
index 26230e396..5d2406b30 100644
--- a/host/lib/usrp/mpmd/mpmd_find.cpp
+++ b/host/lib/usrp/mpmd/mpmd_find.cpp
@@ -6,11 +6,11 @@
// find-related code for MPM devices
-#include "mpmd_impl.hpp"
#include "mpmd_devices.hpp"
-#include <uhd/types/device_addr.hpp>
-#include <uhd/transport/udp_simple.hpp>
+#include "mpmd_impl.hpp"
#include <uhd/transport/if_addrs.hpp>
+#include <uhd/transport/udp_simple.hpp>
+#include <uhd/types/device_addr.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/asio.hpp>
#include <future>
@@ -19,60 +19,50 @@ using namespace uhd;
using namespace uhd::mpmd;
namespace {
- //! How long we wait for discovery responses (in seconds)
- constexpr double MPMD_FIND_TIMEOUT = 0.5;
- constexpr char MPMD_CHDR_REACHABILITY_KEY[] = "reachable";
- constexpr char MPMD_CHDR_REACHABILITY_NEGATIVE[] = "No";
- //! The preamble for any response on the discovery port. Can be used to
- // verify that the response is actually an MPM device.
- constexpr char MPM_DISC_RESPONSE_PREAMBLE[] = "USRP-MPM";
-
- device_addr_t flag_dev_as_unreachable(const device_addr_t& device_args)
- {
- device_addr_t flagged_device_args(device_args);
- flagged_device_args[MPMD_CHDR_REACHABILITY_KEY] =
- MPMD_CHDR_REACHABILITY_NEGATIVE;
- return flagged_device_args;
- }
+//! How long we wait for discovery responses (in seconds)
+constexpr double MPMD_FIND_TIMEOUT = 0.5;
+constexpr char MPMD_CHDR_REACHABILITY_KEY[] = "reachable";
+constexpr char MPMD_CHDR_REACHABILITY_NEGATIVE[] = "No";
+//! The preamble for any response on the discovery port. Can be used to
+// verify that the response is actually an MPM device.
+constexpr char MPM_DISC_RESPONSE_PREAMBLE[] = "USRP-MPM";
+
+device_addr_t flag_dev_as_unreachable(const device_addr_t& device_args)
+{
+ device_addr_t flagged_device_args(device_args);
+ flagged_device_args[MPMD_CHDR_REACHABILITY_KEY] = MPMD_CHDR_REACHABILITY_NEGATIVE;
+ return flagged_device_args;
}
+} // namespace
device_addrs_t mpmd_find_with_addr(
- const std::string& mgmt_addr,
- const device_addr_t& hint_
-) {
+ const std::string& mgmt_addr, const device_addr_t& hint_)
+{
UHD_ASSERT_THROW(not mgmt_addr.empty());
const std::string mpm_discovery_port = hint_.get(
- mpmd_impl::MPM_DISCOVERY_PORT_KEY,
- std::to_string(mpmd_impl::MPM_DISCOVERY_PORT)
- );
- UHD_LOG_DEBUG("MPMD",
- "Discovering MPM devices on port " << mpm_discovery_port);
+ mpmd_impl::MPM_DISCOVERY_PORT_KEY, std::to_string(mpmd_impl::MPM_DISCOVERY_PORT));
+ UHD_LOG_DEBUG("MPMD", "Discovering MPM devices on port " << mpm_discovery_port);
device_addrs_t addrs;
- transport::udp_simple::sptr comm = transport::udp_simple::make_broadcast(
- mgmt_addr, mpm_discovery_port);
- comm->send(
- boost::asio::buffer(
- mpmd_impl::MPM_DISCOVERY_CMD.c_str(),
- mpmd_impl::MPM_DISCOVERY_CMD.size()
- )
- );
+ transport::udp_simple::sptr comm =
+ transport::udp_simple::make_broadcast(mgmt_addr, mpm_discovery_port);
+ comm->send(boost::asio::buffer(
+ mpmd_impl::MPM_DISCOVERY_CMD.c_str(), mpmd_impl::MPM_DISCOVERY_CMD.size()));
while (true) {
const size_t MAX_MTU = 8000;
- char buff[MAX_MTU] = {};
- const size_t nbytes = comm->recv(
- boost::asio::buffer(buff, MAX_MTU),
- MPMD_FIND_TIMEOUT
- );
+ char buff[MAX_MTU] = {};
+ const size_t nbytes =
+ comm->recv(boost::asio::buffer(buff, MAX_MTU), MPMD_FIND_TIMEOUT);
if (nbytes == 0) {
break;
}
- const char* reply = (const char*)buff;
+ const char* reply = (const char*)buff;
std::string reply_string = std::string(reply);
std::vector<std::string> result;
- boost::algorithm::split(result, reply_string,
- [](const char& in) { return in == ';'; },
- boost::token_compress_on);
+ boost::algorithm::split(result,
+ reply_string,
+ [](const char& in) { return in == ';'; },
+ boost::token_compress_on);
if (result.empty()) {
continue;
}
@@ -86,9 +76,8 @@ device_addrs_t mpmd_find_with_addr(
// remove external iface addrs if executed directly on device
bool external_iface = false;
for (const auto& addr : transport::get_if_addrs()) {
- if ((addr.inet == comm->get_recv_addr()) &&
- recv_addr !=
- boost::asio::ip::address_v4::loopback().to_string()) {
+ if ((addr.inet == comm->get_recv_addr())
+ && recv_addr != boost::asio::ip::address_v4::loopback().to_string()) {
external_iface = true;
break;
}
@@ -100,41 +89,40 @@ device_addrs_t mpmd_find_with_addr(
// Create result to return
device_addr_t new_addr;
new_addr[xport::MGMT_ADDR_KEY] = recv_addr;
- new_addr["type"] = "mpmd"; // hwd will overwrite this
+ new_addr["type"] = "mpmd"; // hwd will overwrite this
// remove ident string and put other informations into device_args dict
result.erase(result.begin());
// parse key-value pairs in the discovery string and add them to the
// device_args
for (const auto& el : result) {
std::vector<std::string> value;
- boost::algorithm::split(value, el,
- [](const char& in) { return in == '='; },
- boost::token_compress_on);
+ boost::algorithm::split(value,
+ el,
+ [](const char& in) { return in == '='; },
+ boost::token_compress_on);
if (value[0] != xport::MGMT_ADDR_KEY) {
new_addr[value[0]] = value[1];
}
}
// filter the discovered device below by matching optional keys
- if (
- (not hint_.has_key("name") or hint_["name"] == new_addr["name"])
- and (not hint_.has_key("serial") or hint_["serial"] == new_addr["serial"])
- and (not hint_.has_key("type") or hint_["type"] == new_addr["type"] or hint_["type"] == MPM_CATCHALL_DEVICE_TYPE)
- and (not hint_.has_key("product") or hint_["product"] == new_addr["product"])
- ){
- UHD_LOG_TRACE("MPMD FIND",
- "Found device that matches hints: " << new_addr.to_string());
+ if ((not hint_.has_key("name") or hint_["name"] == new_addr["name"])
+ and (not hint_.has_key("serial") or hint_["serial"] == new_addr["serial"])
+ and (not hint_.has_key("type") or hint_["type"] == new_addr["type"]
+ or hint_["type"] == MPM_CATCHALL_DEVICE_TYPE)
+ and (not hint_.has_key("product")
+ or hint_["product"] == new_addr["product"])) {
+ UHD_LOG_TRACE(
+ "MPMD FIND", "Found device that matches hints: " << new_addr.to_string());
addrs.push_back(new_addr);
} else {
- UHD_LOG_DEBUG("MPMD FIND",
- "Found device, but does not match hint: " << recv_addr
- );
+ UHD_LOG_DEBUG(
+ "MPMD FIND", "Found device, but does not match hint: " << recv_addr);
}
}
return addrs;
};
-
// Implements scenario 1) (see below)
device_addrs_t mpmd_find_with_addrs(const device_addrs_t& hints)
{
@@ -142,10 +130,9 @@ device_addrs_t mpmd_find_with_addrs(const device_addrs_t& hints)
device_addrs_t found_devices;
found_devices.reserve(hints.size());
for (const auto& hint : hints) {
- if (not (hint.has_key(xport::FIRST_ADDR_KEY) or
- hint.has_key(xport::MGMT_ADDR_KEY))) {
- UHD_LOG_DEBUG("MPMD FIND",
- "No address given in hint " << hint.to_string());
+ if (not(hint.has_key(xport::FIRST_ADDR_KEY)
+ or hint.has_key(xport::MGMT_ADDR_KEY))) {
+ UHD_LOG_DEBUG("MPMD FIND", "No address given in hint " << hint.to_string());
continue;
}
const std::string mgmt_addr =
@@ -154,13 +141,12 @@ device_addrs_t mpmd_find_with_addrs(const device_addrs_t& hints)
if (reply_addrs.size() > 1) {
UHD_LOG_ERROR("MPMD",
"Could not resolve device hint \"" << hint.to_string()
- << "\" to a unique device.");
+ << "\" to a unique device.");
continue;
} else if (reply_addrs.empty()) {
continue;
}
- UHD_LOG_TRACE("MPMD FIND",
- "Device responded: " << reply_addrs[0].to_string());
+ UHD_LOG_TRACE("MPMD FIND", "Device responded: " << reply_addrs[0].to_string());
found_devices.push_back(reply_addrs[0]);
}
if (found_devices.size() == 0) {
@@ -175,17 +161,14 @@ device_addrs_t mpmd_find_with_addrs(const device_addrs_t& hints)
device_addrs_t mpmd_find_with_bcast(const device_addr_t& hint)
{
device_addrs_t addrs;
- UHD_LOG_TRACE("MPMD FIND",
- "Broadcasting on all available interfaces to find MPM devices.");
+ UHD_LOG_TRACE(
+ "MPMD FIND", "Broadcasting on all available interfaces to find MPM devices.");
std::vector<std::future<device_addrs_t>> task_list;
for (const auto& if_addr : transport::get_if_addrs()) {
task_list.emplace_back(std::async(std::launch::async,
- [if_addr, hint](){
- return mpmd_find_with_addr(if_addr.bcast, hint);
- }
- ));
+ [if_addr, hint]() { return mpmd_find_with_addr(if_addr.bcast, hint); }));
}
- for (auto &task : task_list) {
+ for (auto& task : task_list) {
auto reply_addrs = task.get();
addrs.insert(addrs.begin(), reply_addrs.begin(), reply_addrs.end());
}
@@ -212,21 +195,19 @@ device_addrs_t mpmd_find(const device_addr_t& hint_)
{
device_addrs_t hints = separate_device_addr(hint_);
if (hint_.has_key("type")) {
- if (std::find(MPM_DEVICE_TYPES.cbegin(),
- MPM_DEVICE_TYPES.cend(),
- hint_["type"]) == MPM_DEVICE_TYPES.cend()) {
- UHD_LOG_TRACE("MPMD FIND",
- "Returning early, type does not match an MPM device.");
+ if (std::find(MPM_DEVICE_TYPES.cbegin(), MPM_DEVICE_TYPES.cend(), hint_["type"])
+ == MPM_DEVICE_TYPES.cend()) {
+ UHD_LOG_TRACE(
+ "MPMD FIND", "Returning early, type does not match an MPM device.");
return {};
}
}
- UHD_LOG_TRACE("MPMD FIND",
- "Finding with " << hints.size() << " different hint(s).");
+ UHD_LOG_TRACE("MPMD FIND", "Finding with " << hints.size() << " different hint(s).");
// Scenario 1): User gave us at least one address
- if (not hints.empty() and
- (hints[0].has_key(xport::FIRST_ADDR_KEY) or
- hints[0].has_key(xport::MGMT_ADDR_KEY))) {
+ if (not hints.empty()
+ and (hints[0].has_key(xport::FIRST_ADDR_KEY)
+ or hints[0].has_key(xport::MGMT_ADDR_KEY))) {
// Note: We don't try and connect to the devices in this mode, because
// we only get here if the user specified addresses, and we assume she
// knows what she's doing.
@@ -238,33 +219,31 @@ device_addrs_t mpmd_find(const device_addr_t& hint_)
hints.resize(1);
}
const auto bcast_mpm_devs = mpmd_find_with_bcast(hints[0]);
- UHD_LOG_TRACE("MPMD FIND",
- "Found " << bcast_mpm_devs.size() << " device via broadcast.");
+ UHD_LOG_TRACE(
+ "MPMD FIND", "Found " << bcast_mpm_devs.size() << " device via broadcast.");
const bool find_all = hint_.has_key(mpmd_impl::MPM_FINDALL_KEY);
if (find_all) {
UHD_LOG_TRACE("MPMD FIND",
- "User provided " << mpmd_impl::MPM_FINDALL_KEY << ", will not "
- "check devices for CHDR accessibility.");
+ "User provided " << mpmd_impl::MPM_FINDALL_KEY
+ << ", will not "
+ "check devices for CHDR accessibility.");
}
// Filter found devices for those that we can actually talk to via CHDR
device_addrs_t filtered_mpm_devs;
- for (const auto &mpm_dev : bcast_mpm_devs) {
- const auto reachable_device_addr =
- mpmd_mboard_impl::is_device_reachable(mpm_dev);
+ for (const auto& mpm_dev : bcast_mpm_devs) {
+ const auto reachable_device_addr = mpmd_mboard_impl::is_device_reachable(mpm_dev);
if (bool(reachable_device_addr)) {
filtered_mpm_devs.push_back(reachable_device_addr.get());
} else if (find_all) {
- filtered_mpm_devs.emplace_back(
- flag_dev_as_unreachable(mpm_dev)
- );
+ filtered_mpm_devs.emplace_back(flag_dev_as_unreachable(mpm_dev));
}
}
if (filtered_mpm_devs.empty() and not bcast_mpm_devs.empty()) {
UHD_LOG_INFO("MPMD FIND",
"Found MPM devices, but none are reachable for a UHD session. "
- "Specify " << mpmd_impl::MPM_FINDALL_KEY << " to find all devices."
- );
+ "Specify "
+ << mpmd_impl::MPM_FINDALL_KEY << " to find all devices.");
}
return filtered_mpm_devs;
diff --git a/host/lib/usrp/mpmd/mpmd_image_loader.cpp b/host/lib/usrp/mpmd/mpmd_image_loader.cpp
index e0b85f897..7553b1df4 100644
--- a/host/lib/usrp/mpmd/mpmd_image_loader.cpp
+++ b/host/lib/usrp/mpmd/mpmd_image_loader.cpp
@@ -7,66 +7,68 @@
#include "mpmd_impl.hpp"
#include <uhd/config.hpp>
#include <uhd/device.hpp>
-#include <uhd/image_loader.hpp>
#include <uhd/exception.hpp>
-#include <uhd/types/eeprom.hpp>
+#include <uhd/image_loader.hpp>
#include <uhd/types/component_file.hpp>
+#include <uhd/types/eeprom.hpp>
#include <uhd/utils/paths.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/filesystem/convenience.hpp>
-#include <sstream>
-#include <string>
#include <fstream>
#include <iterator>
+#include <sstream>
#include <streambuf>
+#include <string>
using namespace uhd;
-namespace uhd{ namespace /*anon*/{
- const size_t MD5LEN = 32; // Length of a MD5 hash in chars
+namespace uhd { namespace /*anon*/ {
+const size_t MD5LEN = 32; // Length of a MD5 hash in chars
/*
* Helper function to generate a component_file_t using the input ID and path to file.
*/
uhd::usrp::component_file_t generate_component(
- const std::string& id,
- const std::string& filepath
-) {
+ const std::string& id, const std::string& filepath)
+{
uhd::usrp::component_file_t component_file;
// Add an ID to the metadata
component_file.metadata["id"] = id;
- UHD_LOG_TRACE("MPMD IMAGE LOADER",
- "Component ID added to the component dictionary: " << id);
+ UHD_LOG_TRACE(
+ "MPMD IMAGE LOADER", "Component ID added to the component dictionary: " << id);
// Add the filename to the metadata
// Remove the path to the filename
- component_file.metadata["filename"] = boost::filesystem::path(filepath).filename().string();
+ component_file.metadata["filename"] =
+ boost::filesystem::path(filepath).filename().string();
UHD_LOG_TRACE("MPMD IMAGE LOADER",
- "Component filename added to the component dictionary: " << filepath);
+ "Component filename added to the component dictionary: " << filepath);
// Add the hash, if a hash file exists
const std::string component_hash_filepath = filepath + ".md5";
- std::ifstream component_hash_ifstream(component_hash_filepath.c_str(), std::ios::binary);
+ std::ifstream component_hash_ifstream(
+ component_hash_filepath.c_str(), std::ios::binary);
std::string component_hash;
if (component_hash_ifstream.is_open()) {
// TODO: Verify that the hash read is valid, ie only contains 0-9a-f.
component_hash.resize(MD5LEN);
- component_hash_ifstream.read( &component_hash[0], MD5LEN );
+ component_hash_ifstream.read(&component_hash[0], MD5LEN);
component_hash_ifstream.close();
component_file.metadata["md5"] = component_hash;
UHD_LOG_TRACE("MPMD IMAGE LOADER",
- "Added component file hash to the component dictionary.");
+ "Added component file hash to the component dictionary.");
} else {
// If there is no hash file, don't worry about it too much
- UHD_LOG_DEBUG("MPMD IMAGE LOADER", "Could not open component file hash file: "
- << component_hash_filepath);
+ UHD_LOG_DEBUG("MPMD IMAGE LOADER",
+ "Could not open component file hash file: " << component_hash_filepath);
}
- // Read the component file image into a structure suitable to sent as a binary string to MPM
+ // Read the component file image into a structure suitable to sent as a binary string
+ // to MPM
std::vector<uint8_t> data;
std::ifstream component_ifstream(filepath.c_str(), std::ios::binary);
if (component_ifstream.is_open()) {
- data.insert( data.begin(),
- std::istreambuf_iterator<char>(component_ifstream),
- std::istreambuf_iterator<char>());
+ data.insert(data.begin(),
+ std::istreambuf_iterator<char>(component_ifstream),
+ std::istreambuf_iterator<char>());
component_ifstream.close();
} else {
const std::string err_msg("Component file does not exist: " + filepath);
@@ -79,7 +81,8 @@ uhd::usrp::component_file_t generate_component(
/*
* Function to be registered with uhd_image_loader
*/
-static bool mpmd_image_loader(const image_loader::image_loader_args_t &image_loader_args){
+static bool mpmd_image_loader(const image_loader::image_loader_args_t& image_loader_args)
+{
// See if any MPM devices with the given args are found
device_addr_t find_hint = image_loader_args.args;
find_hint.set("find_all", "1"); // We need to find all devices
@@ -94,7 +97,7 @@ static bool mpmd_image_loader(const image_loader::image_loader_args_t &image_loa
device_addr_t dev_addr(devs[0]);
dev_addr["skip_init"] = "1";
// Make the device
- uhd::device::sptr usrp = uhd::device::make(dev_addr, uhd::device::USRP);
+ uhd::device::sptr usrp = uhd::device::make(dev_addr, uhd::device::USRP);
uhd::property_tree::sptr tree = usrp->get_tree();
// Generate the component files
@@ -107,44 +110,44 @@ static bool mpmd_image_loader(const image_loader::image_loader_args_t &image_loa
if (boost::filesystem::exists(image_loader_args.fpga_path)) {
return image_loader_args.fpga_path;
} else {
- throw uhd::runtime_error(str(
- boost::format("FPGA file provided does not exist: %s")
- % image_loader_args.fpga_path
- ));
+ throw uhd::runtime_error(
+ str(boost::format("FPGA file provided does not exist: %s")
+ % image_loader_args.fpga_path));
}
}
// Otherwise, we need to generate one
else {
/*
- * The user can specify an FPGA type (HG, XG, AA), rather than a filename. If the user
- * does not specify one, this will default to the type currently on the device. If this
- * cannot be determined, then the user is forced to specify a filename.
- */
+ * The user can specify an FPGA type (HG, XG, AA), rather than a filename. If
+ * the user does not specify one, this will default to the type currently on
+ * the device. If this cannot be determined, then the user is forced to
+ * specify a filename.
+ */
const auto fpga_type = [image_loader_args, tree]() -> std::string {
- // If the user didn't provide a type, use the type of currently loaded image on
- // the device
+ // If the user didn't provide a type, use the type of currently loaded
+ // image on the device
if (image_loader_args.args.has_key("fpga")) {
return image_loader_args.args.get("fpga");
} else if (tree->exists("/mboards/0/components/fpga")) {
- // Pull the FPGA info from the property tree
- // The getter should return a vector of a single component_file_t,
- // so grab the metadata from that
- auto fpga_metadata =
- tree->access<uhd::usrp::component_files_t>(
- "/mboards/0/components/fpga").get()[0].metadata;
- return fpga_metadata.get("type", "");
- // TODO: Do we want to pull the type from the filename if its not
- // available in the metadata directly?
+ // Pull the FPGA info from the property tree
+ // The getter should return a vector of a single component_file_t,
+ // so grab the metadata from that
+ auto fpga_metadata = tree->access<uhd::usrp::component_files_t>(
+ "/mboards/0/components/fpga")
+ .get()[0]
+ .metadata;
+ return fpga_metadata.get("type", "");
+ // TODO: Do we want to pull the type from the filename if its not
+ // available in the metadata directly?
}
return "";
}(); // generate_fpga_type lambda function
UHD_LOG_TRACE("MPMD IMAGE LOADER", "FPGA type: " << fpga_type);
- if(!dev_addr.has_key("product") or fpga_type == ""){
+ if (!dev_addr.has_key("product") or fpga_type == "") {
throw uhd::runtime_error(
- "Found a device but could not auto-generate an image filename.");
- }
- else {
+ "Found a device but could not auto-generate an image filename.");
+ } else {
return find_image_path(
str(boost::format("usrp_%s_fpga_%s.bit")
% (boost::algorithm::to_lower_copy(dev_addr["product"]))
@@ -157,9 +160,11 @@ static bool mpmd_image_loader(const image_loader::image_loader_args_t &image_loa
all_component_files.push_back(comp_fpga);
// DTS component struct
// First, we need to determine the name
- const std::string base_name = boost::filesystem::change_extension(fpga_path, "").string();
+ const std::string base_name =
+ boost::filesystem::change_extension(fpga_path, "").string();
if (base_name == fpga_path) {
- const std::string err_msg("Can't cut extension from FPGA filename... " + fpga_path);
+ const std::string err_msg(
+ "Can't cut extension from FPGA filename... " + fpga_path);
throw uhd::runtime_error(err_msg);
}
const std::string dts_path = base_name + ".dts";
@@ -176,20 +181,24 @@ static bool mpmd_image_loader(const image_loader::image_loader_args_t &image_loa
// Call RPC to update the component
UHD_LOG_INFO("MPMD IMAGE LOADER", "Starting update. This may take a while.");
- tree->access<uhd::usrp::component_files_t>("/mboards/0/components/fpga").set(all_component_files);
+ tree->access<uhd::usrp::component_files_t>("/mboards/0/components/fpga")
+ .set(all_component_files);
UHD_LOG_INFO("MPMD IMAGE LOADER", "Update component function succeeded.");
return true;
}
-}} //namespace uhd::/*anon*/
+}} // namespace uhd::
-UHD_STATIC_BLOCK(register_mpm_image_loader){
+UHD_STATIC_BLOCK(register_mpm_image_loader)
+{
// TODO: Update recovery instructions
- const std::string recovery_instructions = "Aborting. Your USRP MPM-enabled device's update may or may not have\n"
- "completed. The contents of the image files may have been corrupted.\n"
- "Please verify those files as soon as possible.";
+ const std::string recovery_instructions =
+ "Aborting. Your USRP MPM-enabled device's update may or may not have\n"
+ "completed. The contents of the image files may have been corrupted.\n"
+ "Please verify those files as soon as possible.";
- //TODO: 'n3xx' doesn't really fit the MPM abstraction, but this is simpler for the time being
+ // TODO: 'n3xx' doesn't really fit the MPM abstraction, but this is simpler for the
+ // time being
image_loader::register_image_loader("n3xx", mpmd_image_loader, recovery_instructions);
image_loader::register_image_loader("e3xx", mpmd_image_loader, recovery_instructions);
}
diff --git a/host/lib/usrp/mpmd/mpmd_impl.cpp b/host/lib/usrp/mpmd/mpmd_impl.cpp
index 87e911e17..b8ce6cabd 100644
--- a/host/lib/usrp/mpmd/mpmd_impl.cpp
+++ b/host/lib/usrp/mpmd/mpmd_impl.cpp
@@ -5,189 +5,166 @@
//
#include "mpmd_impl.hpp"
-#include <../device3/device3_impl.hpp>
#include <uhd/exception.hpp>
-#include <uhd/utils/static.hpp>
-#include <uhd/utils/tasks.hpp>
-#include <uhd/types/sensors.hpp>
-#include <uhd/types/eeprom.hpp>
#include <uhd/types/component_file.hpp>
+#include <uhd/types/eeprom.hpp>
+#include <uhd/types/sensors.hpp>
#include <uhd/usrp/mboard_eeprom.hpp>
-#include <uhdlib/rfnoc/rpc_block_ctrl.hpp>
+#include <uhd/utils/static.hpp>
+#include <uhd/utils/tasks.hpp>
#include <uhdlib/rfnoc/radio_ctrl_impl.hpp>
+#include <uhdlib/rfnoc/rpc_block_ctrl.hpp>
+#include <../device3/device3_impl.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/asio.hpp>
#include <boost/make_shared.hpp>
#include <boost/thread.hpp>
+#include <future>
#include <memory>
#include <mutex>
#include <random>
#include <string>
-#include <vector>
-#include <future>
#include <thread>
+#include <vector>
using namespace uhd;
using namespace uhd::mpmd;
namespace {
- /*************************************************************************
- * Local constants
- ************************************************************************/
- const size_t MPMD_CROSSBAR_MAX_LADDR = 255;
- //! Most pessimistic time for a CHDR query to go to device and back
- const double MPMD_CHDR_MAX_RTT = 0.02;
- //! MPM Compatibility number
- const std::vector<size_t> MPM_COMPAT_NUM = {1, 2};
+/*************************************************************************
+ * Local constants
+ ************************************************************************/
+const size_t MPMD_CROSSBAR_MAX_LADDR = 255;
+//! Most pessimistic time for a CHDR query to go to device and back
+const double MPMD_CHDR_MAX_RTT = 0.02;
+//! MPM Compatibility number
+const std::vector<size_t> MPM_COMPAT_NUM = {1, 2};
- /*************************************************************************
- * Helper functions
- ************************************************************************/
- void reset_time_synchronized(uhd::property_tree::sptr tree)
- {
- const size_t n_mboards = tree->list("/mboards").size();
- UHD_LOGGER_DEBUG("MPMD")
- << "Synchronizing " << n_mboards <<" timekeepers...";
- auto get_time_last_pps = [tree](){
- return tree->access<time_spec_t>(
- fs_path("/mboards/0/time/pps")
- ).get();
- };
- auto end_time = std::chrono::steady_clock::now()
- + std::chrono::milliseconds(1100);
- auto time_last_pps = get_time_last_pps();
- UHD_LOG_DEBUG("MPMD", "Waiting for PPS clock edge...");
- while (time_last_pps == get_time_last_pps())
- {
- if (std::chrono::steady_clock::now() > end_time) {
- throw uhd::runtime_error(
- "Board 0 may not be getting a PPS signal!\n"
- "No PPS detected within the time interval.\n"
- "See the application notes for your device.\n"
- );
- }
- std::this_thread::sleep_for(std::chrono::milliseconds(10));
- }
- UHD_LOG_DEBUG("MPMD", "Setting all timekeepers to 0...");
- for (size_t mboard_idx = 0; mboard_idx < n_mboards; mboard_idx++) {
- tree->access<time_spec_t>(
- fs_path("/mboards") / mboard_idx / "time" / "pps"
- ).set(time_spec_t(0.0));
+/*************************************************************************
+ * Helper functions
+ ************************************************************************/
+void reset_time_synchronized(uhd::property_tree::sptr tree)
+{
+ const size_t n_mboards = tree->list("/mboards").size();
+ UHD_LOGGER_DEBUG("MPMD") << "Synchronizing " << n_mboards << " timekeepers...";
+ auto get_time_last_pps = [tree]() {
+ return tree->access<time_spec_t>(fs_path("/mboards/0/time/pps")).get();
+ };
+ auto end_time = std::chrono::steady_clock::now() + std::chrono::milliseconds(1100);
+ auto time_last_pps = get_time_last_pps();
+ UHD_LOG_DEBUG("MPMD", "Waiting for PPS clock edge...");
+ while (time_last_pps == get_time_last_pps()) {
+ if (std::chrono::steady_clock::now() > end_time) {
+ throw uhd::runtime_error("Board 0 may not be getting a PPS signal!\n"
+ "No PPS detected within the time interval.\n"
+ "See the application notes for your device.\n");
}
+ std::this_thread::sleep_for(std::chrono::milliseconds(10));
+ }
+ UHD_LOG_DEBUG("MPMD", "Setting all timekeepers to 0...");
+ for (size_t mboard_idx = 0; mboard_idx < n_mboards; mboard_idx++) {
+ tree->access<time_spec_t>(fs_path("/mboards") / mboard_idx / "time" / "pps")
+ .set(time_spec_t(0.0));
+ }
- UHD_LOG_DEBUG("MPMD", "Waiting for next PPS edge...");
- std::this_thread::sleep_for(std::chrono::seconds(1));
+ UHD_LOG_DEBUG("MPMD", "Waiting for next PPS edge...");
+ std::this_thread::sleep_for(std::chrono::seconds(1));
- UHD_LOG_DEBUG("MPMD", "Verifying all timekeepers are aligned...");
- auto get_time_now = [tree](const size_t mb_index){
- return tree->access<time_spec_t>(
- fs_path("/mboards") / mb_index / "time/now"
- ).get();
- };
- for (size_t m = 1; m < n_mboards; m++){
- time_spec_t time_0 = get_time_now(0);
- time_spec_t time_i = get_time_now(m);
- if (time_i < time_0
- or (time_i - time_0) > time_spec_t(MPMD_CHDR_MAX_RTT)) {
- UHD_LOGGER_WARNING("MULTI_USRP") << boost::format(
- "Detected time deviation between board %d and board 0.\n"
- "Board 0 time is %f seconds.\n"
- "Board %d time is %f seconds.\n"
- ) % m % time_0.get_real_secs() % m % time_i.get_real_secs();
- }
+ UHD_LOG_DEBUG("MPMD", "Verifying all timekeepers are aligned...");
+ auto get_time_now = [tree](const size_t mb_index) {
+ return tree->access<time_spec_t>(fs_path("/mboards") / mb_index / "time/now")
+ .get();
+ };
+ for (size_t m = 1; m < n_mboards; m++) {
+ time_spec_t time_0 = get_time_now(0);
+ time_spec_t time_i = get_time_now(m);
+ if (time_i < time_0 or (time_i - time_0) > time_spec_t(MPMD_CHDR_MAX_RTT)) {
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << boost::format("Detected time deviation between board %d and board 0.\n"
+ "Board 0 time is %f seconds.\n"
+ "Board %d time is %f seconds.\n")
+ % m % time_0.get_real_secs() % m % time_i.get_real_secs();
}
}
+}
- /*! Throw an exception if compat numbers don't match.
- *
- * \param component Name of the component for which we're checking the
- * compat number (for logging and exceptions strings).
- * \param expected Tuple of 2 integers representing MAJOR.MINOR compat
- * number.
- * \param actual Tuple of 2 integers representing MAJOR.MINOR compat
- * number.
- * \param advice_on_failure A string that is appended to the error message
- * when compat number mismatches have occurred.
- */
- void assert_compat_number_throw(
- const std::string &component,
- const std::vector<size_t> &expected,
- const std::vector<size_t> &actual,
- const std::string& advice_on_failure=""
- ) {
- UHD_ASSERT_THROW(expected.size() == 2);
- UHD_ASSERT_THROW(actual.size() == 2);
- UHD_LOGGER_TRACE("MPMD")
- << "Checking " << component << " compat number. Expected: "
- << expected[0] << "." << expected[1]
- << " Actual: "
- << actual[0] << "." << actual[1]
- ;
+/*! Throw an exception if compat numbers don't match.
+ *
+ * \param component Name of the component for which we're checking the
+ * compat number (for logging and exceptions strings).
+ * \param expected Tuple of 2 integers representing MAJOR.MINOR compat
+ * number.
+ * \param actual Tuple of 2 integers representing MAJOR.MINOR compat
+ * number.
+ * \param advice_on_failure A string that is appended to the error message
+ * when compat number mismatches have occurred.
+ */
+void assert_compat_number_throw(const std::string& component,
+ const std::vector<size_t>& expected,
+ const std::vector<size_t>& actual,
+ const std::string& advice_on_failure = "")
+{
+ UHD_ASSERT_THROW(expected.size() == 2);
+ UHD_ASSERT_THROW(actual.size() == 2);
+ UHD_LOGGER_TRACE("MPMD") << "Checking " << component
+ << " compat number. Expected: " << expected[0] << "."
+ << expected[1] << " Actual: " << actual[0] << "."
+ << actual[1];
- if (actual[0] != expected[0]) {
- const std::string err_msg =
- str(boost::format("%s major compat number mismatch. "
- "Expected: %i.%i Actual: %i.%i.%s%s")
- % component
- % expected[0] % expected[1]
- % actual[0] % actual[1]
- % (advice_on_failure.empty() ? "" : " ")
- % advice_on_failure);
- UHD_LOG_ERROR("MPMD", err_msg);
- throw uhd::runtime_error(err_msg);
- }
- if (actual[1] < expected[1]) {
- const std::string err_msg =
- str(boost::format("%s minor compat number mismatch. "
- "Expected: %i.%i Actual: %i.%i.%s%s")
- % component
- % expected[0] % expected[1]
- % actual[0] % actual[1]
- % (advice_on_failure.empty() ? "" : " ")
- % advice_on_failure);
- UHD_LOG_ERROR("MPMD", err_msg);
- throw uhd::runtime_error(err_msg);
- }
- if (actual[1] > expected[1]) {
- const std::string err_msg =
- str(boost::format("%s minor compat number mismatch. "
- "Expected: %i.%i Actual: %i.%i")
- % component
- % expected[0] % expected[1]
- % actual[0] % actual[1]);
- UHD_LOG_WARNING("MPMD", err_msg);
- }
+ if (actual[0] != expected[0]) {
+ const std::string err_msg =
+ str(boost::format("%s major compat number mismatch. "
+ "Expected: %i.%i Actual: %i.%i.%s%s")
+ % component % expected[0] % expected[1] % actual[0] % actual[1]
+ % (advice_on_failure.empty() ? "" : " ") % advice_on_failure);
+ UHD_LOG_ERROR("MPMD", err_msg);
+ throw uhd::runtime_error(err_msg);
+ }
+ if (actual[1] < expected[1]) {
+ const std::string err_msg =
+ str(boost::format("%s minor compat number mismatch. "
+ "Expected: %i.%i Actual: %i.%i.%s%s")
+ % component % expected[0] % expected[1] % actual[0] % actual[1]
+ % (advice_on_failure.empty() ? "" : " ") % advice_on_failure);
+ UHD_LOG_ERROR("MPMD", err_msg);
+ throw uhd::runtime_error(err_msg);
+ }
+ if (actual[1] > expected[1]) {
+ const std::string err_msg =
+ str(boost::format("%s minor compat number mismatch. "
+ "Expected: %i.%i Actual: %i.%i")
+ % component % expected[0] % expected[1] % actual[0] % actual[1]);
+ UHD_LOG_WARNING("MPMD", err_msg);
}
}
+} // namespace
/*****************************************************************************
* Static class attributes
****************************************************************************/
-const std::string mpmd_impl::MPM_FINDALL_KEY = "find_all";
-const size_t mpmd_impl::MPM_DISCOVERY_PORT = 49600;
-const std::string mpmd_impl::MPM_DISCOVERY_PORT_KEY = "discovery_port";
-const size_t mpmd_impl::MPM_RPC_PORT = 49601;
-const std::string mpmd_impl::MPM_RPC_PORT_KEY = "rpc_port";
+const std::string mpmd_impl::MPM_FINDALL_KEY = "find_all";
+const size_t mpmd_impl::MPM_DISCOVERY_PORT = 49600;
+const std::string mpmd_impl::MPM_DISCOVERY_PORT_KEY = "discovery_port";
+const size_t mpmd_impl::MPM_RPC_PORT = 49601;
+const std::string mpmd_impl::MPM_RPC_PORT_KEY = "rpc_port";
const std::string mpmd_impl::MPM_RPC_GET_LAST_ERROR_CMD = "get_last_error";
-const std::string mpmd_impl::MPM_DISCOVERY_CMD = "MPM-DISC";
-const std::string mpmd_impl::MPM_ECHO_CMD = "MPM-ECHO";
+const std::string mpmd_impl::MPM_DISCOVERY_CMD = "MPM-DISC";
+const std::string mpmd_impl::MPM_ECHO_CMD = "MPM-ECHO";
/*****************************************************************************
* Structors
****************************************************************************/
mpmd_impl::mpmd_impl(const device_addr_t& device_args)
- : usrp::device3_impl()
- , _device_args(device_args)
+ : usrp::device3_impl(), _device_args(device_args)
{
const device_addrs_t mb_args = separate_device_addr(device_args);
- const size_t num_mboards = mb_args.size();
+ const size_t num_mboards = mb_args.size();
_mb.reserve(num_mboards);
const bool serialize_init = device_args.has_key("serialize_init");
- const bool skip_init = device_args.has_key("skip_init");
- UHD_LOGGER_INFO("MPMD")
- << "Initializing " << num_mboards << " device(s) "
- << (serialize_init ? "serially " : "in parallel ")
- << "with args: " << device_args.to_string();
+ const bool skip_init = device_args.has_key("skip_init");
+ UHD_LOGGER_INFO("MPMD") << "Initializing " << num_mboards << " device(s) "
+ << (serialize_init ? "serially " : "in parallel ")
+ << "with args: " << device_args.to_string();
// First, claim all the devices (so we own them and no one else can claim
// them).
@@ -202,8 +179,8 @@ mpmd_impl::mpmd_impl(const device_addr_t& device_args)
// can run _mb[*]->init() in parallel on all the _mb.
// This can *not* be parallelized.
std::vector<size_t> base_xport_addr(num_mboards, 2); // Starts at 2 [sic]
- for (size_t mb_i = 0; mb_i < num_mboards-1; ++mb_i) {
- base_xport_addr[mb_i+1] = base_xport_addr[mb_i] + _mb[mb_i]->num_xbars;
+ for (size_t mb_i = 0; mb_i < num_mboards - 1; ++mb_i) {
+ base_xport_addr[mb_i + 1] = base_xport_addr[mb_i] + _mb[mb_i]->num_xbars;
}
if (not skip_init) {
@@ -260,35 +237,28 @@ mpmd_impl::~mpmd_impl()
/*****************************************************************************
* Private methods
****************************************************************************/
-mpmd_mboard_impl::uptr mpmd_impl::claim_and_make(
- const uhd::device_addr_t& device_args
-) {
+mpmd_mboard_impl::uptr mpmd_impl::claim_and_make(const uhd::device_addr_t& device_args)
+{
const std::string rpc_addr = device_args.get(xport::MGMT_ADDR_KEY);
- UHD_LOGGER_DEBUG("MPMD")
- << "Device args: `" << device_args.to_string()
- << "'. RPC address: " << rpc_addr
- ;
+ UHD_LOGGER_DEBUG("MPMD") << "Device args: `" << device_args.to_string()
+ << "'. RPC address: " << rpc_addr;
if (rpc_addr.empty()) {
UHD_LOG_ERROR("MPMD",
"Could not determine RPC address from device args: "
- << device_args.to_string());
+ << device_args.to_string());
throw uhd::runtime_error("Could not determine device RPC address.");
}
return mpmd_mboard_impl::make(device_args, rpc_addr);
}
void mpmd_impl::setup_mb(
- mpmd_mboard_impl *mb,
- const size_t mb_index,
- const size_t base_xport_addr
-) {
- assert_compat_number_throw(
- "MPM",
+ mpmd_mboard_impl* mb, const size_t mb_index, const size_t base_xport_addr)
+{
+ assert_compat_number_throw("MPM",
MPM_COMPAT_NUM,
mb->rpc->request<std::vector<size_t>>("get_mpm_compat_num"),
- "Please update the version of MPM on your USRP device."
- );
+ "Please update the version of MPM on your USRP device.");
UHD_LOG_DEBUG("MPMD", "Initializing mboard " << mb_index);
mb->init();
@@ -297,94 +267,83 @@ void mpmd_impl::setup_mb(
}
}
-void mpmd_impl::setup_rfnoc_blocks(
- mpmd_mboard_impl* mb,
+void mpmd_impl::setup_rfnoc_blocks(mpmd_mboard_impl* mb,
const size_t mb_index,
- const uhd::device_addr_t& ctrl_xport_args
-) {
- UHD_LOG_TRACE("MPMD",
- "Mboard " << mb_index << " reports " << mb->num_xbars << " crossbar(s)."
- );
+ const uhd::device_addr_t& ctrl_xport_args)
+{
+ UHD_LOG_TRACE(
+ "MPMD", "Mboard " << mb_index << " reports " << mb->num_xbars << " crossbar(s).");
// TODO: The args apply to all xbars, which may or may not be true
for (size_t xbar_index = 0; xbar_index < mb->num_xbars; xbar_index++) {
// Pull the number of blocks and base port from the args, if available.
// Otherwise, get the values from MPM.
- const size_t num_blocks = ctrl_xport_args.has_key("rfnoc_num_blocks")
- ? ctrl_xport_args.cast<size_t>("rfnoc_num_blocks", 0)
- : mb->rpc->request<size_t>("get_num_blocks", xbar_index);
- const size_t base_port = ctrl_xport_args.has_key("rfnoc_base_port")
- ? ctrl_xport_args.cast<size_t>("rfnoc_base_port", 0)
- : mb->rpc->request<size_t>("get_base_port", xbar_index);
+ const size_t num_blocks =
+ ctrl_xport_args.has_key("rfnoc_num_blocks")
+ ? ctrl_xport_args.cast<size_t>("rfnoc_num_blocks", 0)
+ : mb->rpc->request<size_t>("get_num_blocks", xbar_index);
+ const size_t base_port =
+ ctrl_xport_args.has_key("rfnoc_base_port")
+ ? ctrl_xport_args.cast<size_t>("rfnoc_base_port", 0)
+ : mb->rpc->request<size_t>("get_base_port", xbar_index);
const size_t local_addr = mb->get_xbar_local_addr(xbar_index);
UHD_LOGGER_TRACE("MPMD")
<< "Enumerating RFNoC blocks for xbar " << xbar_index
- << ". Total blocks: " << num_blocks
- << " Base port: " << base_port
- << " Local address: " << local_addr
- ;
- if (ctrl_xport_args.has_key("rfnoc_num_blocks") or
- ctrl_xport_args.has_key("rfnoc_base_port")) {
+ << ". Total blocks: " << num_blocks << " Base port: " << base_port
+ << " Local address: " << local_addr;
+ if (ctrl_xport_args.has_key("rfnoc_num_blocks")
+ or ctrl_xport_args.has_key("rfnoc_base_port")) {
// TODO: Remove this warning once we're confident this is
// (relatively) safe and useful. Also add documentation to
// usrp_n3xx.dox
UHD_LOGGER_WARNING("MPMD")
<< "Overriding default RFNoC configuration. You are using an "
<< "experimental development feature, which may go away in "
- << "future versions."
- ;
+ << "future versions.";
}
try {
- enumerate_rfnoc_blocks(
- mb_index,
- num_blocks,
- base_port,
- uhd::sid_t(0, 0, local_addr, 0),
- ctrl_xport_args
- );
- } catch (const std::exception &ex) {
- UHD_LOGGER_ERROR("MPMD")
- << "Failure during block enumeration: "
- << ex.what();
+ enumerate_rfnoc_blocks(mb_index,
+ num_blocks,
+ base_port,
+ uhd::sid_t(0, 0, local_addr, 0),
+ ctrl_xport_args);
+ } catch (const std::exception& ex) {
+ UHD_LOGGER_ERROR("MPMD") << "Failure during block enumeration: " << ex.what();
throw uhd::runtime_error("Failed to run enumerate_rfnoc_blocks()");
}
}
}
void mpmd_impl::setup_rpc_blocks(
- const device_addr_t &block_args,
- const bool serialize_init
-) {
+ const device_addr_t& block_args, const bool serialize_init)
+{
std::vector<std::future<void>> task_list;
// If we don't force async, most compilers, at least now, will default to
// deferred.
- const auto launch_policy = serialize_init ?
- std::launch::deferred :
- std::launch::async;
+ const auto launch_policy = serialize_init ? std::launch::deferred
+ : std::launch::async;
// Preload all the tasks (they might start running on emplace_back)
- for (const auto &block_ctrl: _rfnoc_block_ctrl) {
+ for (const auto& block_ctrl : _rfnoc_block_ctrl) {
auto rpc_block_id = block_ctrl->get_block_id();
if (has_block<uhd::rfnoc::rpc_block_ctrl>(rpc_block_id)) {
const size_t mboard_idx = rpc_block_id.get_device_no();
auto rpc_block_ctrl =
get_block_ctrl<uhd::rfnoc::rpc_block_ctrl>(rpc_block_id);
auto rpc_sptr = _mb[mboard_idx]->rpc;
- task_list.emplace_back(std::async(launch_policy,
- [rpc_block_id, rpc_block_ctrl, &block_args, rpc_sptr](){
+ task_list.emplace_back(std::async(
+ launch_policy, [rpc_block_id, rpc_block_ctrl, &block_args, rpc_sptr]() {
UHD_LOGGER_DEBUG("MPMD")
<< "Adding RPC access to block: " << rpc_block_id
- << " Block args: " << block_args.to_string()
- ;
+ << " Block args: " << block_args.to_string();
rpc_block_ctrl->set_rpc_client(rpc_sptr, block_args);
- }
- ));
+ }));
}
}
// Execute all the calls to set_rpc_client(), either concurrently, or
// serially
- for (auto &task : task_list) {
+ for (auto& task : task_list) {
task.get();
}
}
diff --git a/host/lib/usrp/mpmd/mpmd_impl.hpp b/host/lib/usrp/mpmd/mpmd_impl.hpp
index e9d942c9d..f3328dc6f 100644
--- a/host/lib/usrp/mpmd/mpmd_impl.hpp
+++ b/host/lib/usrp/mpmd/mpmd_impl.hpp
@@ -7,14 +7,14 @@
#ifndef INCLUDED_MPMD_IMPL_HPP
#define INCLUDED_MPMD_IMPL_HPP
-#include "mpmd_xport_mgr.hpp"
#include "../device3/device3_impl.hpp"
+#include "mpmd_xport_mgr.hpp"
+#include <uhd/property_tree.hpp>
#include <uhd/stream.hpp>
+#include <uhd/transport/muxed_zero_copy_if.hpp>
#include <uhd/types/device_addr.hpp>
#include <uhd/types/dict.hpp>
#include <uhd/utils/tasks.hpp>
-#include <uhd/transport/muxed_zero_copy_if.hpp>
-#include <uhd/property_tree.hpp>
#include <uhdlib/utils/rpc.hpp>
#include <boost/optional.hpp>
#include <map>
@@ -24,16 +24,16 @@
* RPC timeout constants for MPMD
************************************************************************/
//! Time between reclaims (ms)
-static constexpr size_t MPMD_RECLAIM_INTERVAL_MS = 1000;
+static constexpr size_t MPMD_RECLAIM_INTERVAL_MS = 1000;
//! Default timeout value for the init() RPC call (ms)
-static constexpr size_t MPMD_DEFAULT_INIT_TIMEOUT = 120000;
+static constexpr size_t MPMD_DEFAULT_INIT_TIMEOUT = 120000;
//! Default timeout value for RPC calls (ms)
-static constexpr size_t MPMD_DEFAULT_RPC_TIMEOUT = 2000;
+static constexpr size_t MPMD_DEFAULT_RPC_TIMEOUT = 2000;
//! Short timeout value for RPC calls (ms), used for calls that shouldn't
// take long. This value can be used to quickly determine a link status.
-static constexpr size_t MPMD_SHORT_RPC_TIMEOUT = 2000;
+static constexpr size_t MPMD_SHORT_RPC_TIMEOUT = 2000;
//! Claimer loop timeout value for RPC calls (ms).
-static constexpr size_t MPMD_CLAIMER_RPC_TIMEOUT = 10000;
+static constexpr size_t MPMD_CLAIMER_RPC_TIMEOUT = 10000;
namespace uhd { namespace mpmd {
@@ -41,9 +41,9 @@ namespace uhd { namespace mpmd {
*/
class mpmd_mboard_impl
{
- public:
+public:
/*** Types ***************************************************************/
- using uptr = std::unique_ptr<mpmd_mboard_impl>;
+ using uptr = std::unique_ptr<mpmd_mboard_impl>;
using dev_info = std::map<std::string, std::string>;
/*** Static helper *******************************************************/
@@ -53,8 +53,7 @@ class mpmd_mboard_impl
* \param device_addr Device args. Must contain an mgmt_addr.
*/
static boost::optional<device_addr_t> is_device_reachable(
- const device_addr_t& device_addr
- );
+ const device_addr_t& device_addr);
/*** Structors ***********************************************************/
/*! Ctor: Claim device or throw an exception on failure.
@@ -64,10 +63,7 @@ class mpmd_mboard_impl
* \param mb_args Device args that pertain to this motherboard
* \param ip_addr RPC client will attempt to connect to this IP address
*/
- mpmd_mboard_impl(
- const uhd::device_addr_t &mb_args,
- const std::string& ip_addr
- );
+ mpmd_mboard_impl(const uhd::device_addr_t& mb_args, const std::string& ip_addr);
~mpmd_mboard_impl();
/*** Factory *************************************************************/
@@ -75,10 +71,7 @@ class mpmd_mboard_impl
* \param mb_args Device args that pertain to this motherboard
* \param ip_addr RPC client will attempt to connect to this IP address
*/
- static uptr make(
- const uhd::device_addr_t &mb_args,
- const std::string& addr
- );
+ static uptr make(const uhd::device_addr_t& mb_args, const std::string& addr);
/*** Init ****************************************************************/
void init();
@@ -112,7 +105,8 @@ class mpmd_mboard_impl
void set_xbar_local_addr(const size_t xbar_index, const size_t local_addr);
//! Return the local address of a given crossbar
- size_t get_xbar_local_addr(const size_t xbar_index) const {
+ size_t get_xbar_local_addr(const size_t xbar_index) const
+ {
return xbar_local_addrs.at(xbar_index);
}
@@ -126,11 +120,9 @@ class mpmd_mboard_impl
// \param sid The full SID of this transport (UHD to device)
// \param xport_type Transport type (CTRL, RX_DATA, ...)
// \param args Any kind of args passed in via get_?x_stream()
- uhd::both_xports_t make_transport(
- const sid_t& sid,
+ uhd::both_xports_t make_transport(const sid_t& sid,
usrp::device3_impl::xport_type_t xport_type,
- const uhd::device_addr_t& args
- );
+ const uhd::device_addr_t& args);
size_t get_mtu(const uhd::direction_t dir) const;
@@ -138,7 +130,7 @@ class mpmd_mboard_impl
uhd::device_addr_t get_rx_hints() const;
uhd::device_addr_t get_tx_hints() const;
- private:
+private:
/*! Reference to the RPC client that handles claiming
*/
uhd::rpc_client::sptr _claim_rpc;
@@ -152,21 +144,18 @@ class mpmd_mboard_impl
*/
bool claim();
- /*! Set RPC client timeout value
- *
- * \param timeout_ms time limit (in ms) that a rpc client waits for a single call
- */
- void set_rpcc_timeout(
- const uint64_t timeout_ms
- );
+ /*! Set RPC client timeout value
+ *
+ * \param timeout_ms time limit (in ms) that a rpc client waits for a single call
+ */
+ void set_rpcc_timeout(const uint64_t timeout_ms);
- uhd::task::sptr claim_device_and_make_task(
- );
+ uhd::task::sptr claim_device_and_make_task();
/*! Read out the log buffer from the MPM device and send it to native
* logging system.
*/
- void dump_logs(const bool dump_to_null=false);
+ void dump_logs(const bool dump_to_null = false);
/*************************************************************************
* Private attributes
@@ -224,10 +213,10 @@ public:
* API
************************************************************************/
uhd::both_xports_t make_transport(const uhd::sid_t&,
- uhd::usrp::device3_impl::xport_type_t,
- const uhd::device_addr_t&);
+ uhd::usrp::device3_impl::xport_type_t,
+ const uhd::device_addr_t&);
- private:
+private:
uhd::device_addr_t get_rx_hints(size_t mb_index);
uhd::device_addr_t get_tx_hints(size_t mb_index);
@@ -238,9 +227,7 @@ public:
*
* Does not initialize the device (see setup_mb() for that).
*/
- mpmd_mboard_impl::uptr claim_and_make(
- const uhd::device_addr_t& dev_args
- );
+ mpmd_mboard_impl::uptr claim_and_make(const uhd::device_addr_t& dev_args);
/*! Initialize a single motherboard
*
@@ -253,23 +240,15 @@ public:
*
*/
void setup_mb(
- mpmd_mboard_impl *mb,
- const size_t mb_index,
- const size_t base_xport_addr
- );
+ mpmd_mboard_impl* mb, const size_t mb_index, const size_t base_xport_addr);
//! Setup all RFNoC blocks running on mboard \p mb_i
void setup_rfnoc_blocks(
- mpmd_mboard_impl* mb,
- const size_t mb_i,
- const uhd::device_addr_t& block_args
- );
+ mpmd_mboard_impl* mb, const size_t mb_i, const uhd::device_addr_t& block_args);
//! Configure all blocks that require access to an RPC client
void setup_rpc_blocks(
- const uhd::device_addr_t &block_args,
- const bool serialize_init
- );
+ const uhd::device_addr_t& block_args, const bool serialize_init);
/*! Return the index of the motherboard given the local address of a
* crossbar
@@ -283,10 +262,7 @@ public:
* \param mb Reference to the actual device
*/
static void init_property_tree(
- uhd::property_tree::sptr tree,
- fs_path mb_path,
- mpmd_mboard_impl *mb
- );
+ uhd::property_tree::sptr tree, fs_path mb_path, mpmd_mboard_impl* mb);
/*************************************************************************
diff --git a/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp b/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp
index a49651f10..261b6f2aa 100644
--- a/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp
+++ b/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp
@@ -5,209 +5,166 @@
//
#include "mpmd_impl.hpp"
-#include <uhd/utils/safe_call.hpp>
-#include <uhd/utils/log.hpp>
#include <uhd/transport/udp_simple.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/safe_call.hpp>
#include <chrono>
#include <thread>
namespace {
- /*************************************************************************
- * Local constants
- ************************************************************************/
- //! Timeout for pings (seconds).
- constexpr double MPMD_PING_TIMEOUT = 0.1;
- //! Default session ID (MPM will recognize a session by this name)
- const std::string MPMD_DEFAULT_SESSION_ID = "UHD";
- //! Key to initialize a ping/measurement latency test
- const std::string MPMD_MEAS_LATENCY_KEY = "measure_rpc_latency";
- //! Duration of a latency measurement test
- constexpr size_t MPMD_MEAS_LATENCY_DURATION = 1000;
-
- using log_buf_t = std::vector<std::map<std::string, std::string>>;
-
-
- /*************************************************************************
- * Helper functions
- ************************************************************************/
- /*! Return true if we can MPM ping a device via discovery service.
- */
- bool is_pingable(const std::string& ip_addr, const std::string& udp_port)
- {
- auto udp = uhd::transport::udp_simple::make_broadcast(
- ip_addr,
- udp_port
- );
- const std::string send_buf(
- uhd::mpmd::mpmd_impl::MPM_ECHO_CMD + " ping"
- );
- std::vector<uint8_t> recv_buf;
- recv_buf.resize(send_buf.size(), ' ');
- udp->send(boost::asio::buffer(send_buf.c_str(), send_buf.size()));
- const size_t len =
- udp->recv(boost::asio::buffer(recv_buf), MPMD_PING_TIMEOUT);
- if (len == 0) {
- UHD_LOG_TRACE("MPMD",
- "Received no MPM ping, assuming device is unreachable.");
- return false;
- }
- if (len != send_buf.size()) {
- UHD_LOG_DEBUG("MPMD",
- "Received bad return packet on MPM ping. Assuming endpoint"
- " is not a valid MPM device.");
- return false;
- }
- if (std::memcmp(
- (void *) &recv_buf[0],
- (void *) &send_buf[0],
- send_buf.size()) != 0) {
- UHD_LOG_DEBUG("MPMD",
- "Received invalid return packet on MPM ping. Assuming endpoint"
- " is not a valid MPM device.");
- return false;
- }
- return true;
+/*************************************************************************
+ * Local constants
+ ************************************************************************/
+//! Timeout for pings (seconds).
+constexpr double MPMD_PING_TIMEOUT = 0.1;
+//! Default session ID (MPM will recognize a session by this name)
+const std::string MPMD_DEFAULT_SESSION_ID = "UHD";
+//! Key to initialize a ping/measurement latency test
+const std::string MPMD_MEAS_LATENCY_KEY = "measure_rpc_latency";
+//! Duration of a latency measurement test
+constexpr size_t MPMD_MEAS_LATENCY_DURATION = 1000;
+
+using log_buf_t = std::vector<std::map<std::string, std::string>>;
+
+
+/*************************************************************************
+ * Helper functions
+ ************************************************************************/
+/*! Return true if we can MPM ping a device via discovery service.
+ */
+bool is_pingable(const std::string& ip_addr, const std::string& udp_port)
+{
+ auto udp = uhd::transport::udp_simple::make_broadcast(ip_addr, udp_port);
+ const std::string send_buf(uhd::mpmd::mpmd_impl::MPM_ECHO_CMD + " ping");
+ std::vector<uint8_t> recv_buf;
+ recv_buf.resize(send_buf.size(), ' ');
+ udp->send(boost::asio::buffer(send_buf.c_str(), send_buf.size()));
+ const size_t len = udp->recv(boost::asio::buffer(recv_buf), MPMD_PING_TIMEOUT);
+ if (len == 0) {
+ UHD_LOG_TRACE("MPMD", "Received no MPM ping, assuming device is unreachable.");
+ return false;
}
-
- /*! Call init() on an MPM device.
- */
- void init_device(
- uhd::rpc_client::sptr rpc,
- const uhd::device_addr_t mb_args
- ) {
- auto init_status =
- rpc->request_with_token<std::vector<std::string>>(
- MPMD_DEFAULT_INIT_TIMEOUT, "get_init_status");
- if (init_status[0] != "true") {
- throw uhd::runtime_error(
- std::string("Device is in bad state: ") + init_status[1]
- );
- }
-
- // TODO maybe put this somewhere else?
- const std::set<std::string> key_blacklist{
- "serial", "claimed", "type", "rev", "addr"
- };
- std::map<std::string, std::string> mpm_device_args;
- for (const auto &key : mb_args.keys()) {
- if (not key_blacklist.count(key)) {
- mpm_device_args[key] = mb_args[key];
- }
- }
- if (not rpc->request_with_token<bool>(MPMD_DEFAULT_INIT_TIMEOUT, "init", mpm_device_args)) {
- throw uhd::runtime_error("Failed to initialize device.");
- }
+ if (len != send_buf.size()) {
+ UHD_LOG_DEBUG("MPMD",
+ "Received bad return packet on MPM ping. Assuming endpoint"
+ " is not a valid MPM device.");
+ return false;
+ }
+ if (std::memcmp((void*)&recv_buf[0], (void*)&send_buf[0], send_buf.size()) != 0) {
+ UHD_LOG_DEBUG("MPMD",
+ "Received invalid return packet on MPM ping. Assuming endpoint"
+ " is not a valid MPM device.");
+ return false;
}
+ return true;
+}
- void measure_rpc_latency(
- uhd::rpc_client::sptr rpc,
- const size_t duration_ms=MPMD_MEAS_LATENCY_DURATION
- ) {
- const double alpha = 0.99;
- const std::string payload = "1234567890";
- auto measure_once = [payload, rpc](){
- const auto start = std::chrono::steady_clock::now();
- rpc->request<std::string>("ping", payload);
- return (double) std::chrono::duration_cast<std::chrono::microseconds>(
- std::chrono::steady_clock::now() - start
- ).count();
- };
+/*! Call init() on an MPM device.
+ */
+void init_device(uhd::rpc_client::sptr rpc, const uhd::device_addr_t mb_args)
+{
+ auto init_status = rpc->request_with_token<std::vector<std::string>>(
+ MPMD_DEFAULT_INIT_TIMEOUT, "get_init_status");
+ if (init_status[0] != "true") {
+ throw uhd::runtime_error(
+ std::string("Device is in bad state: ") + init_status[1]);
+ }
- double max_latency = measure_once();
- double avg_latency = max_latency;
-
- auto end_time = std::chrono::steady_clock::now()
- + std::chrono::milliseconds(duration_ms);
- size_t ctr = 1;
- while (std::chrono::steady_clock::now() < end_time) {
- const auto duration = measure_once();
- max_latency = std::max(max_latency, duration);
- avg_latency = avg_latency * alpha + (1-alpha) * duration;
- ctr++;
- // Light throttle:
- std::this_thread::sleep_for(std::chrono::milliseconds(1));
+ // TODO maybe put this somewhere else?
+ const std::set<std::string> key_blacklist{"serial", "claimed", "type", "rev", "addr"};
+ std::map<std::string, std::string> mpm_device_args;
+ for (const auto& key : mb_args.keys()) {
+ if (not key_blacklist.count(key)) {
+ mpm_device_args[key] = mb_args[key];
}
-
- UHD_LOG_INFO("MPMD",
- "RPC latency (coarse estimate): Avg = " << avg_latency << " us, "
- "Max = " << max_latency
- << ", n = " << ctr);
}
+ if (not rpc->request_with_token<bool>(
+ MPMD_DEFAULT_INIT_TIMEOUT, "init", mpm_device_args)) {
+ throw uhd::runtime_error("Failed to initialize device.");
+ }
+}
- /*! Forward entries from a list of dictionaries to UHD's native logging
- * system.
- */
- void forward_logs(log_buf_t&& log_buf)
- {
- for (const auto &log_record : log_buf) {
- if (log_record.count("levelname") == 0 or \
- log_record.count("message") == 0) {
- UHD_LOG_ERROR("MPMD",
- "Invalid logging structure returned from MPM device!");
- continue;
- }
- if (log_record.at("levelname") == "TRACE") {
- UHD_LOG_TRACE(
- log_record.at("name"),
- log_record.at("message")
- );
- }
- else if (log_record.at("levelname") == "DEBUG") {
- UHD_LOG_DEBUG(
- log_record.at("name"),
- log_record.at("message")
- );
- }
- else if (log_record.at("levelname") == "INFO") {
- UHD_LOG_INFO(
- log_record.at("name"),
- log_record.at("message")
- );
- }
- else if (log_record.at("levelname") == "WARNING") {
- UHD_LOG_WARNING(
- log_record.at("name"),
- log_record.at("message")
- );
- }
- else if (log_record.at("levelname") == "ERROR") {
- UHD_LOG_ERROR(
- log_record.at("name"),
- log_record.at("message")
- );
- }
- else if (log_record.at("levelname") == "CRITICAL") {
- UHD_LOG_FATAL(
- log_record.at("name"),
- log_record.at("message")
- );
- } else {
- UHD_LOG_ERROR("MPMD",
- "Invalid log level returned from MPM device: "
- "`" << log_record.at("levelname") << "'");
- }
- }
+void measure_rpc_latency(
+ uhd::rpc_client::sptr rpc, const size_t duration_ms = MPMD_MEAS_LATENCY_DURATION)
+{
+ const double alpha = 0.99;
+ const std::string payload = "1234567890";
+ auto measure_once = [payload, rpc]() {
+ const auto start = std::chrono::steady_clock::now();
+ rpc->request<std::string>("ping", payload);
+ return (double)std::chrono::duration_cast<std::chrono::microseconds>(
+ std::chrono::steady_clock::now() - start)
+ .count();
+ };
+
+ double max_latency = measure_once();
+ double avg_latency = max_latency;
+
+ auto end_time =
+ std::chrono::steady_clock::now() + std::chrono::milliseconds(duration_ms);
+ size_t ctr = 1;
+ while (std::chrono::steady_clock::now() < end_time) {
+ const auto duration = measure_once();
+ max_latency = std::max(max_latency, duration);
+ avg_latency = avg_latency * alpha + (1 - alpha) * duration;
+ ctr++;
+ // Light throttle:
+ std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
- /*! Return a new rpc_client with given addr and mb args
- */
- uhd::rpc_client::sptr make_mpm_rpc_client(
- const std::string& rpc_server_addr,
- const uhd::device_addr_t& mb_args,
- const size_t timeout_ms = MPMD_DEFAULT_RPC_TIMEOUT
- ){
- return uhd::rpc_client::make(
- rpc_server_addr,
- mb_args.cast<size_t>(
- uhd::mpmd::mpmd_impl::MPM_RPC_PORT_KEY,
- uhd::mpmd::mpmd_impl::MPM_RPC_PORT
- ),
- timeout_ms,
- uhd::mpmd::mpmd_impl::MPM_RPC_GET_LAST_ERROR_CMD);
+ UHD_LOG_INFO("MPMD",
+ "RPC latency (coarse estimate): Avg = " << avg_latency
+ << " us, "
+ "Max = "
+ << max_latency << ", n = " << ctr);
+}
+
+/*! Forward entries from a list of dictionaries to UHD's native logging
+ * system.
+ */
+void forward_logs(log_buf_t&& log_buf)
+{
+ for (const auto& log_record : log_buf) {
+ if (log_record.count("levelname") == 0 or log_record.count("message") == 0) {
+ UHD_LOG_ERROR("MPMD", "Invalid logging structure returned from MPM device!");
+ continue;
+ }
+ if (log_record.at("levelname") == "TRACE") {
+ UHD_LOG_TRACE(log_record.at("name"), log_record.at("message"));
+ } else if (log_record.at("levelname") == "DEBUG") {
+ UHD_LOG_DEBUG(log_record.at("name"), log_record.at("message"));
+ } else if (log_record.at("levelname") == "INFO") {
+ UHD_LOG_INFO(log_record.at("name"), log_record.at("message"));
+ } else if (log_record.at("levelname") == "WARNING") {
+ UHD_LOG_WARNING(log_record.at("name"), log_record.at("message"));
+ } else if (log_record.at("levelname") == "ERROR") {
+ UHD_LOG_ERROR(log_record.at("name"), log_record.at("message"));
+ } else if (log_record.at("levelname") == "CRITICAL") {
+ UHD_LOG_FATAL(log_record.at("name"), log_record.at("message"));
+ } else {
+ UHD_LOG_ERROR("MPMD",
+ "Invalid log level returned from MPM device: "
+ "`" << log_record.at("levelname")
+ << "'");
+ }
}
+}
+/*! Return a new rpc_client with given addr and mb args
+ */
+uhd::rpc_client::sptr make_mpm_rpc_client(const std::string& rpc_server_addr,
+ const uhd::device_addr_t& mb_args,
+ const size_t timeout_ms = MPMD_DEFAULT_RPC_TIMEOUT)
+{
+ return uhd::rpc_client::make(rpc_server_addr,
+ mb_args.cast<size_t>(
+ uhd::mpmd::mpmd_impl::MPM_RPC_PORT_KEY, uhd::mpmd::mpmd_impl::MPM_RPC_PORT),
+ timeout_ms,
+ uhd::mpmd::mpmd_impl::MPM_RPC_GET_LAST_ERROR_CMD);
}
+} // namespace
+
using namespace uhd;
using namespace uhd::mpmd;
@@ -215,22 +172,20 @@ using namespace uhd::mpmd;
* Static Helpers
*****************************************************************************/
boost::optional<device_addr_t> mpmd_mboard_impl::is_device_reachable(
- const device_addr_t &device_addr
-) {
- UHD_LOG_TRACE("MPMD",
- "Checking accessibility of device `" << device_addr.to_string()
- << "'");
+ const device_addr_t& device_addr)
+{
+ UHD_LOG_TRACE(
+ "MPMD", "Checking accessibility of device `" << device_addr.to_string() << "'");
UHD_ASSERT_THROW(device_addr.has_key(xport::MGMT_ADDR_KEY));
const std::string rpc_addr = device_addr.get(xport::MGMT_ADDR_KEY);
- const size_t rpc_port = device_addr.cast<size_t>(
- mpmd_impl::MPM_RPC_PORT_KEY,
- mpmd_impl::MPM_RPC_PORT
- );
+ const size_t rpc_port =
+ device_addr.cast<size_t>(mpmd_impl::MPM_RPC_PORT_KEY, mpmd_impl::MPM_RPC_PORT);
auto rpcc = uhd::rpc_client::make(rpc_addr, rpc_port);
// 1) Read back device info
dev_info device_info_dict;
try {
- device_info_dict = rpcc->request<dev_info>(MPMD_SHORT_RPC_TIMEOUT, "get_device_info");
+ device_info_dict =
+ rpcc->request<dev_info>(MPMD_SHORT_RPC_TIMEOUT, "get_device_info");
} catch (const uhd::runtime_error& e) {
UHD_LOG_ERROR("MPMD", e.what());
} catch (...) {
@@ -240,8 +195,8 @@ boost::optional<device_addr_t> mpmd_mboard_impl::is_device_reachable(
return boost::optional<device_addr_t>();
}
// 2) Check for local device
- if (device_info_dict.count("connection") and
- device_info_dict.at("connection") == "local") {
+ if (device_info_dict.count("connection")
+ and device_info_dict.at("connection") == "local") {
UHD_LOG_TRACE("MPMD", "Device is local, flagging as reachable.");
return boost::optional<device_addr_t>(device_addr);
}
@@ -254,46 +209,43 @@ boost::optional<device_addr_t> mpmd_mboard_impl::is_device_reachable(
continue;
}
const std::string chdr_addr = device_info_dict.at(addr_key);
- UHD_LOG_TRACE("MPMD",
- "Checking reachability via network addr " << chdr_addr);
+ UHD_LOG_TRACE("MPMD", "Checking reachability via network addr " << chdr_addr);
try {
// First do an MPM ping -- there is some issue with rpclib that can
// lead to indefinite timeouts
- const std::string mpm_discovery_port = device_addr.get(
- mpmd_impl::MPM_DISCOVERY_PORT_KEY,
- std::to_string(mpmd_impl::MPM_DISCOVERY_PORT)
- );
+ const std::string mpm_discovery_port =
+ device_addr.get(mpmd_impl::MPM_DISCOVERY_PORT_KEY,
+ std::to_string(mpmd_impl::MPM_DISCOVERY_PORT));
if (!is_pingable(chdr_addr, mpm_discovery_port)) {
- UHD_LOG_TRACE("MPMD",
- "Cannot MPM ping, assuming device is unreachable.");
+ UHD_LOG_TRACE("MPMD", "Cannot MPM ping, assuming device is unreachable.");
continue;
}
- UHD_LOG_TRACE("MPMD",
- "Was able to ping device, trying RPC connection.");
+ UHD_LOG_TRACE("MPMD", "Was able to ping device, trying RPC connection.");
auto chdr_rpcc = uhd::rpc_client::make(chdr_addr, rpc_port);
- auto dev_info_chdr = chdr_rpcc->request<dev_info>(MPMD_SHORT_RPC_TIMEOUT, "get_device_info");
+ auto dev_info_chdr =
+ chdr_rpcc->request<dev_info>(MPMD_SHORT_RPC_TIMEOUT, "get_device_info");
if (dev_info_chdr["serial"] != device_info_dict["serial"]) {
- UHD_LOG_DEBUG("MPMD", boost::format(
- "Connected to CHDR interface, but got wrong device. "
- "Tried to reach serial %s, got %s")
- % device_info_dict["serial"] % dev_info_chdr["serial"]);
+ UHD_LOG_DEBUG("MPMD",
+ boost::format("Connected to CHDR interface, but got wrong device. "
+ "Tried to reach serial %s, got %s")
+ % device_info_dict["serial"] % dev_info_chdr["serial"]);
return boost::optional<device_addr_t>();
} else {
- UHD_LOG_TRACE("MPMD", boost::format(
- "Reachable device matches expected device (serial=%s)")
- % device_info_dict["serial"] );
+ UHD_LOG_TRACE("MPMD",
+ boost::format("Reachable device matches expected device (serial=%s)")
+ % device_info_dict["serial"]);
}
device_addr_t device_addr_copy = device_addr;
- device_addr_copy["addr"] = chdr_addr;
+ device_addr_copy["addr"] = chdr_addr;
return boost::optional<device_addr_t>(device_addr_copy);
} catch (...) {
- UHD_LOG_DEBUG("MPMD",
- "Failed to reach device on network addr " << chdr_addr << ".");
+ UHD_LOG_DEBUG(
+ "MPMD", "Failed to reach device on network addr " << chdr_addr << ".");
}
}
// If everything fails, we probably can't talk to this chap.
- UHD_LOG_TRACE("MPMD",
- "All reachability checks failed -- assuming device is not reachable.");
+ UHD_LOG_TRACE(
+ "MPMD", "All reachability checks failed -- assuming device is not reachable.");
return boost::optional<device_addr_t>();
}
@@ -301,9 +253,8 @@ boost::optional<device_addr_t> mpmd_mboard_impl::is_device_reachable(
* Structors
****************************************************************************/
mpmd_mboard_impl::mpmd_mboard_impl(
- const device_addr_t &mb_args_,
- const std::string& rpc_server_addr
-) : mb_args(mb_args_)
+ const device_addr_t& mb_args_, const std::string& rpc_server_addr)
+ : mb_args(mb_args_)
, rpc(make_mpm_rpc_client(rpc_server_addr, mb_args_))
, num_xbars(rpc->request<size_t>("get_num_xbars"))
, _claim_rpc(make_mpm_rpc_client(rpc_server_addr, mb_args, MPMD_CLAIMER_RPC_TIMEOUT))
@@ -311,12 +262,9 @@ mpmd_mboard_impl::mpmd_mboard_impl(
, xbar_local_addrs(num_xbars, 0xFF)
, _xport_mgr(xport::mpmd_xport_mgr::make(mb_args))
{
- UHD_LOGGER_TRACE("MPMD")
- << "Initializing mboard, connecting to RPC server address: "
- << rpc_server_addr
- << " mboard args: " << mb_args.to_string()
- << " number of crossbars: " << num_xbars
- ;
+ UHD_LOGGER_TRACE("MPMD") << "Initializing mboard, connecting to RPC server address: "
+ << rpc_server_addr << " mboard args: " << mb_args.to_string()
+ << " number of crossbars: " << num_xbars;
_claimer_task = claim_device_and_make_task();
if (mb_args_.has_key(MPMD_MEAS_LATENCY_KEY)) {
@@ -325,23 +273,21 @@ mpmd_mboard_impl::mpmd_mboard_impl(
/// Get device info
const auto device_info_dict = rpc->request<dev_info>("get_device_info");
- for (const auto &info_pair : device_info_dict) {
+ for (const auto& info_pair : device_info_dict) {
device_info[info_pair.first] = info_pair.second;
}
- UHD_LOGGER_TRACE("MPMD")
- << "MPM reports device info: " << device_info.to_string();
+ UHD_LOGGER_TRACE("MPMD") << "MPM reports device info: " << device_info.to_string();
/// Get dboard info
- const auto dboards_info =
- rpc->request<std::vector<dev_info>>("get_dboard_info");
+ const auto dboards_info = rpc->request<std::vector<dev_info>>("get_dboard_info");
UHD_ASSERT_THROW(this->dboard_info.size() == 0);
- for (const auto &dboard_info_dict : dboards_info) {
+ for (const auto& dboard_info_dict : dboards_info) {
uhd::device_addr_t this_db_info;
- for (const auto &info_pair : dboard_info_dict) {
+ for (const auto& info_pair : dboard_info_dict) {
this_db_info[info_pair.first] = info_pair.second;
}
UHD_LOGGER_TRACE("MPMD")
- << "MPM reports dboard info for slot " << this->dboard_info.size()
- << ": " << this_db_info.to_string();
+ << "MPM reports dboard info for slot " << this->dboard_info.size() << ": "
+ << this_db_info.to_string();
this->dboard_info.push_back(this_db_info);
}
}
@@ -353,11 +299,9 @@ mpmd_mboard_impl::~mpmd_mboard_impl()
} catch (...) {
UHD_LOG_WARNING("MPMD", "Could not flush log queue on exit!");
}
- UHD_SAFE_CALL(
- if (not rpc->request_with_token<bool>("unclaim")) {
- UHD_LOG_WARNING("MPMD", "Failure to ack unclaim!");
- }
- );
+ UHD_SAFE_CALL(if (not rpc->request_with_token<bool>("unclaim")) {
+ UHD_LOG_WARNING("MPMD", "Failure to ack unclaim!");
+ });
}
/*****************************************************************************
@@ -373,52 +317,42 @@ void mpmd_mboard_impl::init()
* API
****************************************************************************/
void mpmd_mboard_impl::set_xbar_local_addr(
- const size_t xbar_index,
- const size_t local_addr
-) {
- UHD_ASSERT_THROW(rpc->request_with_token<bool>("set_xbar_local_addr", xbar_index, local_addr));
+ const size_t xbar_index, const size_t local_addr)
+{
+ UHD_ASSERT_THROW(
+ rpc->request_with_token<bool>("set_xbar_local_addr", xbar_index, local_addr));
UHD_ASSERT_THROW(xbar_index < xbar_local_addrs.size());
xbar_local_addrs.at(xbar_index) = local_addr;
}
-uhd::both_xports_t mpmd_mboard_impl::make_transport(
- const sid_t& sid,
- usrp::device3_impl::xport_type_t xport_type,
- const uhd::device_addr_t& xport_args
-) {
- const std::string xport_type_str = [xport_type](){
+uhd::both_xports_t mpmd_mboard_impl::make_transport(const sid_t& sid,
+ usrp::device3_impl::xport_type_t xport_type,
+ const uhd::device_addr_t& xport_args)
+{
+ const std::string xport_type_str = [xport_type]() {
switch (xport_type) {
- case mpmd_impl::CTRL:
- return "CTRL";
- case mpmd_impl::ASYNC_MSG:
- return "ASYNC_MSG";
- case mpmd_impl::RX_DATA:
- return "RX_DATA";
- case mpmd_impl::TX_DATA:
- return "TX_DATA";
- default:
- UHD_THROW_INVALID_CODE_PATH();
+ case mpmd_impl::CTRL:
+ return "CTRL";
+ case mpmd_impl::ASYNC_MSG:
+ return "ASYNC_MSG";
+ case mpmd_impl::RX_DATA:
+ return "RX_DATA";
+ case mpmd_impl::TX_DATA:
+ return "TX_DATA";
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
};
}();
- UHD_LOGGER_TRACE("MPMD")
- << __func__ << "(): Creating new transport of type: "
- << xport_type_str
- ;
+ UHD_LOGGER_TRACE("MPMD") << __func__
+ << "(): Creating new transport of type: " << xport_type_str;
using namespace uhd::mpmd::xport;
const auto xport_info_list =
rpc->request_with_token<mpmd_xport_mgr::xport_info_list_t>(
- "request_xport",
- sid.get_dst(),
- sid.get_src(),
- xport_type_str
- );
- UHD_LOGGER_TRACE("MPMD")
- << __func__
- << "(): request_xport() gave us " << xport_info_list.size()
- << " option(s)."
- ;
+ "request_xport", sid.get_dst(), sid.get_src(), xport_type_str);
+ UHD_LOGGER_TRACE("MPMD") << __func__ << "(): request_xport() gave us "
+ << xport_info_list.size() << " option(s).";
if (xport_info_list.empty()) {
UHD_LOG_ERROR("MPMD", "No viable transport path found!");
throw uhd::runtime_error("No viable transport path found!");
@@ -426,15 +360,9 @@ uhd::both_xports_t mpmd_mboard_impl::make_transport(
xport::mpmd_xport_mgr::xport_info_t xport_info_out;
auto xports = _xport_mgr->make_transport(
- xport_info_list,
- xport_type,
- xport_args,
- xport_info_out
- );
+ xport_info_list, xport_type, xport_args, xport_info_out);
- if (not rpc->request_with_token<bool>(
- "commit_xport",
- xport_info_out)) {
+ if (not rpc->request_with_token<bool>("commit_xport", xport_info_out)) {
UHD_LOG_ERROR("MPMD", "Failed to create UDP transport!");
throw uhd::runtime_error("commit_xport() failed!");
}
@@ -474,11 +402,10 @@ bool mpmd_mboard_impl::claim()
}
}
-uhd::task::sptr mpmd_mboard_impl::claim_device_and_make_task(
-) {
- auto rpc_token = _claim_rpc->request<std::string>("claim",
- mb_args.get("session_id", MPMD_DEFAULT_SESSION_ID)
- );
+uhd::task::sptr mpmd_mboard_impl::claim_device_and_make_task()
+{
+ auto rpc_token = _claim_rpc->request<std::string>(
+ "claim", mb_args.get("session_id", MPMD_DEFAULT_SESSION_ID));
if (rpc_token.empty()) {
throw uhd::value_error("mpmd device claiming failed!");
}
@@ -493,8 +420,7 @@ uhd::task::sptr mpmd_mboard_impl::claim_device_and_make_task(
};
this->dump_logs();
std::this_thread::sleep_until(
- now + std::chrono::milliseconds(MPMD_RECLAIM_INTERVAL_MS)
- );
+ now + std::chrono::milliseconds(MPMD_RECLAIM_INTERVAL_MS));
});
}
@@ -514,12 +440,10 @@ void mpmd_mboard_impl::dump_logs(const bool dump_to_null)
* Factory
****************************************************************************/
mpmd_mboard_impl::uptr mpmd_mboard_impl::make(
- const uhd::device_addr_t &mb_args,
- const std::string& addr
-) {
+ const uhd::device_addr_t& mb_args, const std::string& addr)
+{
mpmd_mboard_impl::uptr mb =
mpmd_mboard_impl::uptr(new mpmd_mboard_impl(mb_args, addr));
// implicit move
return mb;
}
-
diff --git a/host/lib/usrp/mpmd/mpmd_prop_tree.cpp b/host/lib/usrp/mpmd/mpmd_prop_tree.cpp
index 27893341d..e4ebee5ac 100644
--- a/host/lib/usrp/mpmd/mpmd_prop_tree.cpp
+++ b/host/lib/usrp/mpmd/mpmd_prop_tree.cpp
@@ -9,91 +9,86 @@
#include "mpmd_impl.hpp"
#include <uhd/property_tree.hpp>
#include <uhd/types/component_file.hpp>
-#include <uhd/types/sensors.hpp>
#include <uhd/types/eeprom.hpp>
+#include <uhd/types/sensors.hpp>
#include <uhd/usrp/mboard_eeprom.hpp>
using namespace uhd;
using namespace uhd::mpmd;
namespace {
- //! Timeout value for the update_component RPC call (ms)
- constexpr size_t MPMD_UPDATE_COMPONENT_TIMEOUT = 20000;
+//! Timeout value for the update_component RPC call (ms)
+constexpr size_t MPMD_UPDATE_COMPONENT_TIMEOUT = 20000;
- /*! Update a component using all required files. For example, when updating the FPGA image
- * (.bit or .bin), users can provide a new overlay image (DTS) to apply in addition.
- *
- * \param comps Vector of component files to be updated
- * \param mb Reference to the actual device
- */
- uhd::usrp::component_files_t _update_component(
- const uhd::usrp::component_files_t& comps,
- mpmd_mboard_impl *mb
- ) {
- // Construct the arguments to update component
- std::vector<std::vector<uint8_t>> all_data;
- std::vector<std::map<std::string, std::string>> all_metadata;
- // Also construct a copy of just the metadata to store in the property tree
- uhd::usrp::component_files_t all_comps_copy;
+/*! Update a component using all required files. For example, when updating the FPGA image
+ * (.bit or .bin), users can provide a new overlay image (DTS) to apply in addition.
+ *
+ * \param comps Vector of component files to be updated
+ * \param mb Reference to the actual device
+ */
+uhd::usrp::component_files_t _update_component(
+ const uhd::usrp::component_files_t& comps, mpmd_mboard_impl* mb)
+{
+ // Construct the arguments to update component
+ std::vector<std::vector<uint8_t>> all_data;
+ std::vector<std::map<std::string, std::string>> all_metadata;
+ // Also construct a copy of just the metadata to store in the property tree
+ uhd::usrp::component_files_t all_comps_copy;
- for (const auto& comp : comps) {
- // Make a map for update components args
- std::map<std::string, std::string> metadata;
- // Make a component copy to add to the property tree
- uhd::usrp::component_file_t comp_copy;
- // Copy the metadata
- for (const auto& key : comp.metadata.keys()) {
- metadata[key] = comp.metadata[key];
- comp_copy.metadata[key] = comp.metadata[key];
- }
- // Copy to the update component args
- all_data.push_back(comp.data);
- all_metadata.push_back(metadata);
- // Copy to the property tree
- all_comps_copy.push_back(comp_copy);
+ for (const auto& comp : comps) {
+ // Make a map for update components args
+ std::map<std::string, std::string> metadata;
+ // Make a component copy to add to the property tree
+ uhd::usrp::component_file_t comp_copy;
+ // Copy the metadata
+ for (const auto& key : comp.metadata.keys()) {
+ metadata[key] = comp.metadata[key];
+ comp_copy.metadata[key] = comp.metadata[key];
}
-
- // Now call update component
- const size_t update_component_timeout = MPMD_UPDATE_COMPONENT_TIMEOUT * comps.size();
- mb->rpc->notify_with_token(update_component_timeout,
- "update_component", all_metadata, all_data);
- return all_comps_copy;
+ // Copy to the update component args
+ all_data.push_back(comp.data);
+ all_metadata.push_back(metadata);
+ // Copy to the property tree
+ all_comps_copy.push_back(comp_copy);
}
- /*
- * Query the device to get the metadata for desired component
- *
- * \param comp_name String component name
- * \param mb Reference to the actual device
- * \return component files containing the component metadata
- */
- uhd::usrp::component_files_t _get_component_info(
- const std::string &comp_name,
- mpmd_mboard_impl *mb
- ) {
- UHD_LOG_TRACE("MPMD", "Getting component info for " << comp_name);
- const auto component_metadata = mb->rpc->request<std::map<std::string, std::string>>(
- "get_component_info", comp_name);
- // Copy the contents of the component metadata into a object we can return
- uhd::usrp::component_file_t return_component;
- auto &return_metadata = return_component.metadata;
- for (auto item : component_metadata) {
- return_metadata[item.first] = item.second;
- }
- return uhd::usrp::component_files_t {return_component};
+ // Now call update component
+ const size_t update_component_timeout = MPMD_UPDATE_COMPONENT_TIMEOUT * comps.size();
+ mb->rpc->notify_with_token(
+ update_component_timeout, "update_component", all_metadata, all_data);
+ return all_comps_copy;
+}
+
+/*
+ * Query the device to get the metadata for desired component
+ *
+ * \param comp_name String component name
+ * \param mb Reference to the actual device
+ * \return component files containing the component metadata
+ */
+uhd::usrp::component_files_t _get_component_info(
+ const std::string& comp_name, mpmd_mboard_impl* mb)
+{
+ UHD_LOG_TRACE("MPMD", "Getting component info for " << comp_name);
+ const auto component_metadata = mb->rpc->request<std::map<std::string, std::string>>(
+ "get_component_info", comp_name);
+ // Copy the contents of the component metadata into a object we can return
+ uhd::usrp::component_file_t return_component;
+ auto& return_metadata = return_component.metadata;
+ for (auto item : component_metadata) {
+ return_metadata[item.first] = item.second;
}
+ return uhd::usrp::component_files_t{return_component};
}
+} // namespace
void mpmd_impl::init_property_tree(
- uhd::property_tree::sptr tree,
- fs_path mb_path,
- mpmd_mboard_impl *mb
-) {
+ uhd::property_tree::sptr tree, fs_path mb_path, mpmd_mboard_impl* mb)
+{
/*** Device info ****************************************************/
if (not tree->exists("/name")) {
- tree->create<std::string>("/name")
- .set(mb->device_info.get("description", "Unknown MPM device"))
- ;
+ tree->create<std::string>("/name").set(
+ mb->device_info.get("description", "Unknown MPM device"));
}
tree->create<std::string>(mb_path / "name")
.set(mb->device_info.get("name", "UNKNOWN"));
@@ -111,143 +106,98 @@ void mpmd_impl::init_property_tree(
/*** Clocking *******************************************************/
tree->create<std::string>(mb_path / "clock_source/value")
- .add_coerced_subscriber([mb](const std::string &clock_source){
- mb->rpc->notify_with_token(MPMD_DEFAULT_INIT_TIMEOUT, "set_clock_source", clock_source);
+ .add_coerced_subscriber([mb](const std::string& clock_source) {
+ mb->rpc->notify_with_token(
+ MPMD_DEFAULT_INIT_TIMEOUT, "set_clock_source", clock_source);
})
- .set_publisher([mb](){
- return mb->rpc->request_with_token<std::string>(
- "get_clock_source"
- );
- })
- ;
- tree->create<std::vector<std::string>>(
- mb_path / "clock_source/options")
- .set_publisher([mb](){
+ .set_publisher([mb]() {
+ return mb->rpc->request_with_token<std::string>("get_clock_source");
+ });
+ tree->create<std::vector<std::string>>(mb_path / "clock_source/options")
+ .set_publisher([mb]() {
return mb->rpc->request_with_token<std::vector<std::string>>(
- "get_clock_sources"
- );
- })
- ;
+ "get_clock_sources");
+ });
tree->create<std::string>(mb_path / "time_source/value")
- .add_coerced_subscriber([mb](const std::string &time_source){
- mb->rpc->notify_with_token(MPMD_DEFAULT_INIT_TIMEOUT, "set_time_source", time_source);
+ .add_coerced_subscriber([mb](const std::string& time_source) {
+ mb->rpc->notify_with_token(
+ MPMD_DEFAULT_INIT_TIMEOUT, "set_time_source", time_source);
})
- .set_publisher([mb](){
- return mb->rpc->request_with_token<std::string>(
- "get_time_source"
- );
- })
- ;
- tree->create<std::vector<std::string>>(
- mb_path / "time_source/options")
- .set_publisher([mb](){
+ .set_publisher([mb]() {
+ return mb->rpc->request_with_token<std::string>("get_time_source");
+ });
+ tree->create<std::vector<std::string>>(mb_path / "time_source/options")
+ .set_publisher([mb]() {
return mb->rpc->request_with_token<std::vector<std::string>>(
- "get_time_sources"
- );
- })
- ;
+ "get_time_sources");
+ });
/*** Sensors ********************************************************/
auto sensor_list =
- mb->rpc->request_with_token<std::vector<std::string>>(
- "get_mb_sensors"
- );
- UHD_LOG_DEBUG("MPMD",
- "Found " << sensor_list.size() << " motherboard sensors."
- );
+ mb->rpc->request_with_token<std::vector<std::string>>("get_mb_sensors");
+ UHD_LOG_DEBUG("MPMD", "Found " << sensor_list.size() << " motherboard sensors.");
for (const auto& sensor_name : sensor_list) {
- UHD_LOG_TRACE("MPMD",
- "Adding motherboard sensor `" << sensor_name << "'"
- );
- tree->create<sensor_value_t>(
- mb_path / "sensors" / sensor_name)
- .set_publisher([mb, sensor_name](){
+ UHD_LOG_TRACE("MPMD", "Adding motherboard sensor `" << sensor_name << "'");
+ tree->create<sensor_value_t>(mb_path / "sensors" / sensor_name)
+ .set_publisher([mb, sensor_name]() {
auto sensor_val = sensor_value_t(
mb->rpc->request_with_token<sensor_value_t::sensor_map_t>(
- MPMD_DEFAULT_INIT_TIMEOUT, "get_mb_sensor", sensor_name
- )
- );
+ MPMD_DEFAULT_INIT_TIMEOUT, "get_mb_sensor", sensor_name));
return sensor_val;
})
- .set_coercer([](const sensor_value_t &){
- throw uhd::runtime_error(
- "Trying to write read-only sensor value!"
- );
+ .set_coercer([](const sensor_value_t&) {
+ throw uhd::runtime_error("Trying to write read-only sensor value!");
return sensor_value_t("", "", "");
- })
- ;
+ });
}
/*** EEPROM *********************************************************/
tree->create<uhd::usrp::mboard_eeprom_t>(mb_path / "eeprom")
- .add_coerced_subscriber([mb](const uhd::usrp::mboard_eeprom_t& mb_eeprom){
+ .add_coerced_subscriber([mb](const uhd::usrp::mboard_eeprom_t& mb_eeprom) {
eeprom_map_t eeprom_map;
for (const auto& key : mb_eeprom.keys()) {
- eeprom_map[key] = std::vector<uint8_t>(
- mb_eeprom[key].cbegin(),
- mb_eeprom[key].cend()
- );
+ eeprom_map[key] =
+ std::vector<uint8_t>(mb_eeprom[key].cbegin(), mb_eeprom[key].cend());
}
- mb->rpc->notify_with_token(MPMD_DEFAULT_INIT_TIMEOUT, "set_mb_eeprom", eeprom_map);
+ mb->rpc->notify_with_token(
+ MPMD_DEFAULT_INIT_TIMEOUT, "set_mb_eeprom", eeprom_map);
})
- .set_publisher([mb](){
+ .set_publisher([mb]() {
auto mb_eeprom =
mb->rpc->request_with_token<std::map<std::string, std::string>>(
- "get_mb_eeprom"
- );
+ "get_mb_eeprom");
uhd::usrp::mboard_eeprom_t mb_eeprom_dict(
- mb_eeprom.cbegin(), mb_eeprom.cend()
- );
+ mb_eeprom.cbegin(), mb_eeprom.cend());
return mb_eeprom_dict;
- })
- ;
+ });
/*** Updateable Components ******************************************/
std::vector<std::string> updateable_components =
- mb->rpc->request<std::vector<std::string>>(
- "list_updateable_components"
- );
+ mb->rpc->request<std::vector<std::string>>("list_updateable_components");
// TODO: Check the 'id' against the registered property
UHD_LOG_DEBUG("MPMD",
- "Found " << updateable_components.size() << " updateable motherboard components."
- );
+ "Found " << updateable_components.size()
+ << " updateable motherboard components.");
for (const auto& comp_name : updateable_components) {
- UHD_LOG_TRACE("MPMD",
- "Adding motherboard component: " << comp_name);
+ UHD_LOG_TRACE("MPMD", "Adding motherboard component: " << comp_name);
tree->create<uhd::usrp::component_files_t>(mb_path / "components" / comp_name)
- .set_coercer([mb](const uhd::usrp::component_files_t& comp_files){
- return _update_component(
- comp_files,
- mb
- );
+ .set_coercer([mb](const uhd::usrp::component_files_t& comp_files) {
+ return _update_component(comp_files, mb);
})
- .set_publisher([mb, comp_name](){
- return _get_component_info(
- comp_name,
- mb
- );
- })
- ; // Done adding component to property tree
+ .set_publisher([mb, comp_name]() {
+ return _get_component_info(comp_name, mb);
+ }); // Done adding component to property tree
}
/*** MTUs ***********************************************************/
tree->create<size_t>(mb_path / "mtu/recv")
- .add_coerced_subscriber([](const size_t){
- throw uhd::runtime_error(
- "Attempting to write read-only value (MTU)!");
- })
- .set_publisher([mb](){
- return mb->get_mtu(uhd::RX_DIRECTION);
+ .add_coerced_subscriber([](const size_t) {
+ throw uhd::runtime_error("Attempting to write read-only value (MTU)!");
})
- ;
+ .set_publisher([mb]() { return mb->get_mtu(uhd::RX_DIRECTION); });
tree->create<size_t>(mb_path / "mtu/send")
- .add_coerced_subscriber([](const size_t){
- throw uhd::runtime_error(
- "Attempting to write read-only value (MTU)!");
+ .add_coerced_subscriber([](const size_t) {
+ throw uhd::runtime_error("Attempting to write read-only value (MTU)!");
})
- .set_publisher([mb](){
- return mb->get_mtu(uhd::TX_DIRECTION);
- })
- ;
+ .set_publisher([mb]() { return mb->get_mtu(uhd::TX_DIRECTION); });
}
-
diff --git a/host/lib/usrp/mpmd/mpmd_xport.cpp b/host/lib/usrp/mpmd/mpmd_xport.cpp
index e697b6e80..3ef6a074c 100644
--- a/host/lib/usrp/mpmd/mpmd_xport.cpp
+++ b/host/lib/usrp/mpmd/mpmd_xport.cpp
@@ -26,52 +26,37 @@ uhd::device_addr_t mpmd_impl::get_tx_hints(size_t mb_index)
size_t mpmd_impl::identify_mboard_by_xbar_addr(const size_t xbar_addr) const
{
for (size_t mb_index = 0; mb_index < _mb.size(); mb_index++) {
- for (size_t xbar_index = 0;
- xbar_index < _mb[mb_index]->num_xbars;
- xbar_index++) {
+ for (size_t xbar_index = 0; xbar_index < _mb[mb_index]->num_xbars; xbar_index++) {
if (_mb.at(mb_index)->get_xbar_local_addr(xbar_index) == xbar_addr) {
return mb_index;
}
}
}
- throw uhd::lookup_error(str(
- boost::format("Cannot identify mboard for crossbar address %d")
- % xbar_addr
- ));
+ throw uhd::lookup_error(
+ str(boost::format("Cannot identify mboard for crossbar address %d") % xbar_addr));
}
-both_xports_t mpmd_impl::make_transport(
- const sid_t& dst_address,
- usrp::device3_impl::xport_type_t xport_type,
- const uhd::device_addr_t& args
-) {
- const size_t mb_index =
- identify_mboard_by_xbar_addr(dst_address.get_dst_addr());
+both_xports_t mpmd_impl::make_transport(const sid_t& dst_address,
+ usrp::device3_impl::xport_type_t xport_type,
+ const uhd::device_addr_t& args)
+{
+ const size_t mb_index = identify_mboard_by_xbar_addr(dst_address.get_dst_addr());
- const sid_t sid(
- 0, 0, // Not actually an address, more of an 'ignore me' value
+ const sid_t sid(0,
+ 0, // Not actually an address, more of an 'ignore me' value
dst_address.get_dst_addr(),
- dst_address.get_dst_endpoint()
- );
- UHD_LOGGER_TRACE("MPMD")
- << "Creating new transport to mboard: " << mb_index
- << " SID: " << sid.to_pp_string_hex()
- << " User-defined xport args: " << args.to_string()
- ;
-
- both_xports_t xports = _mb[mb_index]->make_transport(
- sid,
- xport_type,
- args
- );
- UHD_LOGGER_TRACE("MPMD")
- << "xport info: send_sid==" << xports.send_sid.to_pp_string_hex()
- << " recv_sid==" << xports.recv_sid.to_pp_string_hex()
- << " endianness=="
- << (xports.endianness == uhd::ENDIANNESS_BIG ? "BE" : "LE")
- << " recv_buff_size==" << xports.recv_buff_size
- << " send_buff_size==" << xports.send_buff_size
- ;
+ dst_address.get_dst_endpoint());
+ UHD_LOGGER_TRACE("MPMD") << "Creating new transport to mboard: " << mb_index
+ << " SID: " << sid.to_pp_string_hex()
+ << " User-defined xport args: " << args.to_string();
+
+ both_xports_t xports = _mb[mb_index]->make_transport(sid, xport_type, args);
+ UHD_LOGGER_TRACE("MPMD") << "xport info: send_sid=="
+ << xports.send_sid.to_pp_string_hex()
+ << " recv_sid==" << xports.recv_sid.to_pp_string_hex()
+ << " endianness=="
+ << (xports.endianness == uhd::ENDIANNESS_BIG ? "BE" : "LE")
+ << " recv_buff_size==" << xports.recv_buff_size
+ << " send_buff_size==" << xports.send_buff_size;
return xports;
}
-
diff --git a/host/lib/usrp/mpmd/mpmd_xport_ctrl_base.hpp b/host/lib/usrp/mpmd/mpmd_xport_ctrl_base.hpp
index 78ffeaf1b..a7fff9262 100644
--- a/host/lib/usrp/mpmd/mpmd_xport_ctrl_base.hpp
+++ b/host/lib/usrp/mpmd/mpmd_xport_ctrl_base.hpp
@@ -7,8 +7,8 @@
#ifndef INCLUDED_MPMD_XPORT_CTRL_BASE_HPP
#define INCLUDED_MPMD_XPORT_CTRL_BASE_HPP
-#include "mpmd_xport_mgr.hpp"
#include "../device3/device3_impl.hpp"
+#include "mpmd_xport_mgr.hpp"
#include <uhd/types/device_addr.hpp>
#include <memory>
@@ -29,20 +29,14 @@ public:
* \param xport_type CTRL, ASYNC_MSG, ... (see xport_type_t)
* \param xport_args Additional arguments. These can come from the user.
*/
- virtual both_xports_t make_transport(
- mpmd_xport_mgr::xport_info_t& xport_info,
+ virtual both_xports_t make_transport(mpmd_xport_mgr::xport_info_t& xport_info,
const usrp::device3_impl::xport_type_t xport_type,
- const uhd::device_addr_t& xport_args
- ) = 0;
+ const uhd::device_addr_t& xport_args) = 0;
//! Assert if an xport_info is even valid/feasible/available
- virtual bool is_valid(
- const mpmd_xport_mgr::xport_info_t& xport_info
- ) const = 0;
+ virtual bool is_valid(const mpmd_xport_mgr::xport_info_t& xport_info) const = 0;
- virtual size_t get_mtu(
- const uhd::direction_t dir
- ) const = 0;
+ virtual size_t get_mtu(const uhd::direction_t dir) const = 0;
};
}}} /* namespace uhd::mpmd::xport */
diff --git a/host/lib/usrp/mpmd/mpmd_xport_ctrl_liberio.cpp b/host/lib/usrp/mpmd/mpmd_xport_ctrl_liberio.cpp
index 13ecea5e9..7efe2bb9a 100644
--- a/host/lib/usrp/mpmd/mpmd_xport_ctrl_liberio.cpp
+++ b/host/lib/usrp/mpmd/mpmd_xport_ctrl_liberio.cpp
@@ -14,42 +14,41 @@ using namespace uhd::mpmd::xport;
namespace {
- //! Max frame size of a control packet in bytes
- const size_t LIBERIO_CTRL_FRAME_MAX_SIZE = 128;
- //! Max frame size of an async message packet in bytes
- const size_t LIBERIO_ASYNC_FRAME_MAX_SIZE = 256;
- //! Max frame size of a flow control packet in bytes
- const size_t LIBERIO_FC_FRAME_MAX_SIZE = 64;
- //! The max MTU will be this number times the page size
- const size_t LIBERIO_PAGES_PER_BUF = 2;
- //! Number of descriptors that liberio allocates (receive)
- const size_t LIBERIO_NUM_RECV_FRAMES = 128;
- //! Number of descriptors that liberio allocates (send)
- const size_t LIBERIO_NUM_SEND_FRAMES = 128;
-
- uint32_t extract_sid_from_pkt(void* pkt, size_t) {
- return uhd::sid_t(uhd::wtohx(static_cast<const uint32_t*>(pkt)[1]))
- .get_dst();
- }
-
+//! Max frame size of a control packet in bytes
+const size_t LIBERIO_CTRL_FRAME_MAX_SIZE = 128;
+//! Max frame size of an async message packet in bytes
+const size_t LIBERIO_ASYNC_FRAME_MAX_SIZE = 256;
+//! Max frame size of a flow control packet in bytes
+const size_t LIBERIO_FC_FRAME_MAX_SIZE = 64;
+//! The max MTU will be this number times the page size
+const size_t LIBERIO_PAGES_PER_BUF = 2;
+//! Number of descriptors that liberio allocates (receive)
+const size_t LIBERIO_NUM_RECV_FRAMES = 128;
+//! Number of descriptors that liberio allocates (send)
+const size_t LIBERIO_NUM_SEND_FRAMES = 128;
+
+uint32_t extract_sid_from_pkt(void* pkt, size_t)
+{
+ return uhd::sid_t(uhd::wtohx(static_cast<const uint32_t*>(pkt)[1])).get_dst();
}
-mpmd_xport_ctrl_liberio::mpmd_xport_ctrl_liberio(
- const uhd::device_addr_t& mb_args
-) : _mb_args(mb_args)
- , _recv_args(filter_args(mb_args, "recv"))
- , _send_args(filter_args(mb_args, "send"))
+} // namespace
+
+mpmd_xport_ctrl_liberio::mpmd_xport_ctrl_liberio(const uhd::device_addr_t& mb_args)
+ : _mb_args(mb_args)
+ , _recv_args(filter_args(mb_args, "recv"))
+ , _send_args(filter_args(mb_args, "send"))
{
// nop
}
-uhd::both_xports_t
-mpmd_xport_ctrl_liberio::make_transport(
- mpmd_xport_mgr::xport_info_t &xport_info,
- const usrp::device3_impl::xport_type_t xport_type,
- const uhd::device_addr_t& /*xport_args_*/
-) {
+uhd::both_xports_t mpmd_xport_ctrl_liberio::make_transport(
+ mpmd_xport_mgr::xport_info_t& xport_info,
+ const usrp::device3_impl::xport_type_t xport_type,
+ const uhd::device_addr_t& /*xport_args_*/
+)
+{
transport::zero_copy_xport_params default_buff_args;
/* default ones for RX / TX, override below */
@@ -75,8 +74,8 @@ mpmd_xport_ctrl_liberio::make_transport(
both_xports_t xports;
xports.endianness = uhd::ENDIANNESS_LITTLE;
- xports.send_sid = sid_t(xport_info["send_sid"]);
- xports.recv_sid = xports.send_sid.reversed();
+ xports.send_sid = sid_t(xport_info["send_sid"]);
+ xports.recv_sid = xports.send_sid.reversed();
// this is kinda ghetto: scale buffer for muxed xports since we share the
// buffer...
@@ -87,7 +86,7 @@ mpmd_xport_ctrl_liberio::make_transport(
divisor = 4;
- //if (xport_info["muxed"] == "True") {
+ // if (xport_info["muxed"] == "True") {
//// FIXME tbw
//}
if (xport_type == usrp::device3_impl::CTRL) {
@@ -95,8 +94,8 @@ mpmd_xport_ctrl_liberio::make_transport(
if (not _ctrl_dma_xport) {
default_buff_args.send_frame_size = LIBERIO_CTRL_FRAME_MAX_SIZE;
default_buff_args.recv_frame_size = LIBERIO_CTRL_FRAME_MAX_SIZE;
- _ctrl_dma_xport = make_muxed_liberio_xport(tx_dev, rx_dev,
- default_buff_args, int(divisor));
+ _ctrl_dma_xport =
+ make_muxed_liberio_xport(tx_dev, rx_dev, default_buff_args, int(divisor));
}
UHD_LOGGER_TRACE("MPMD")
@@ -107,58 +106,52 @@ mpmd_xport_ctrl_liberio::make_transport(
if (not _async_msg_dma_xport) {
default_buff_args.send_frame_size = LIBERIO_ASYNC_FRAME_MAX_SIZE;
default_buff_args.recv_frame_size = LIBERIO_ASYNC_FRAME_MAX_SIZE;
- _async_msg_dma_xport = make_muxed_liberio_xport(
- tx_dev, rx_dev, default_buff_args, int(divisor));
+ _async_msg_dma_xport =
+ make_muxed_liberio_xport(tx_dev, rx_dev, default_buff_args, int(divisor));
}
UHD_LOGGER_TRACE("MPMD")
<< "making (muxed) stream with num " << xports.recv_sid.get_dst();
- xports.recv =
- _async_msg_dma_xport->make_stream(xports.recv_sid.get_dst());
+ xports.recv = _async_msg_dma_xport->make_stream(xports.recv_sid.get_dst());
} else {
- xports.recv = transport::liberio_zero_copy::make(
- tx_dev, rx_dev, default_buff_args);
+ xports.recv =
+ transport::liberio_zero_copy::make(tx_dev, rx_dev, default_buff_args);
}
transport::udp_zero_copy::buff_params buff_params;
- buff_params.recv_buff_size =
- float(default_buff_args.recv_frame_size) *
- float(default_buff_args.num_recv_frames) / divisor;
- buff_params.send_buff_size =
- float(default_buff_args.send_frame_size) *
- float(default_buff_args.num_send_frames) / divisor;
+ buff_params.recv_buff_size = float(default_buff_args.recv_frame_size)
+ * float(default_buff_args.num_recv_frames) / divisor;
+ buff_params.send_buff_size = float(default_buff_args.send_frame_size)
+ * float(default_buff_args.num_send_frames) / divisor;
// Finish both_xports_t object and return:
xports.recv_buff_size = buff_params.recv_buff_size;
xports.send_buff_size = buff_params.send_buff_size;
- xports.send = xports.recv;
+ xports.send = xports.recv;
return xports;
}
bool mpmd_xport_ctrl_liberio::is_valid(
- const mpmd_xport_mgr::xport_info_t& xport_info
-) const {
+ const mpmd_xport_mgr::xport_info_t& xport_info) const
+{
return xport_info.at("type") == "liberio";
}
-size_t mpmd_xport_ctrl_liberio::get_mtu(
- const uhd::direction_t /* dir */
-) const {
+size_t mpmd_xport_ctrl_liberio::get_mtu(const uhd::direction_t /* dir */
+ ) const
+{
return LIBERIO_PAGES_PER_BUF * getpagesize();
}
uhd::transport::muxed_zero_copy_if::sptr
-mpmd_xport_ctrl_liberio::make_muxed_liberio_xport(
- const std::string &tx_dev,
- const std::string &rx_dev,
- const uhd::transport::zero_copy_xport_params &buff_args,
- const size_t max_muxed_ports
-) {
- auto base_xport = transport::liberio_zero_copy::make(
- tx_dev, rx_dev, buff_args);
+mpmd_xport_ctrl_liberio::make_muxed_liberio_xport(const std::string& tx_dev,
+ const std::string& rx_dev,
+ const uhd::transport::zero_copy_xport_params& buff_args,
+ const size_t max_muxed_ports)
+{
+ auto base_xport = transport::liberio_zero_copy::make(tx_dev, rx_dev, buff_args);
return uhd::transport::muxed_zero_copy_if::make(
- base_xport, extract_sid_from_pkt, max_muxed_ports);
+ base_xport, extract_sid_from_pkt, max_muxed_ports);
}
-
diff --git a/host/lib/usrp/mpmd/mpmd_xport_ctrl_liberio.hpp b/host/lib/usrp/mpmd/mpmd_xport_ctrl_liberio.hpp
index 9bea12aa3..5f635e7e7 100644
--- a/host/lib/usrp/mpmd/mpmd_xport_ctrl_liberio.hpp
+++ b/host/lib/usrp/mpmd/mpmd_xport_ctrl_liberio.hpp
@@ -7,10 +7,10 @@
#ifndef INCLUDED_MPMD_XPORT_ctrl_liberio_HPP
#define INCLUDED_MPMD_XPORT_ctrl_liberio_HPP
-#include "mpmd_xport_ctrl_base.hpp"
-#include <uhd/types/device_addr.hpp>
#include "../device3/device3_impl.hpp"
+#include "mpmd_xport_ctrl_base.hpp"
#include <uhd/transport/muxed_zero_copy_if.hpp>
+#include <uhd/types/device_addr.hpp>
namespace uhd { namespace mpmd { namespace xport {
@@ -19,34 +19,25 @@ namespace uhd { namespace mpmd { namespace xport {
class mpmd_xport_ctrl_liberio : public mpmd_xport_ctrl_base
{
public:
- mpmd_xport_ctrl_liberio(
- const uhd::device_addr_t& mb_args
- );
+ mpmd_xport_ctrl_liberio(const uhd::device_addr_t& mb_args);
/*! Open DMA interface to kernel (and thus to FPGA DMA engine)
*/
- both_xports_t make_transport(
- mpmd_xport_mgr::xport_info_t& xport_info,
+ both_xports_t make_transport(mpmd_xport_mgr::xport_info_t& xport_info,
const usrp::device3_impl::xport_type_t xport_type,
- const uhd::device_addr_t& xport_args
- );
+ const uhd::device_addr_t& xport_args);
- bool is_valid(
- const mpmd_xport_mgr::xport_info_t& xport_info
- ) const;
+ bool is_valid(const mpmd_xport_mgr::xport_info_t& xport_info) const;
- size_t get_mtu(
- const uhd::direction_t dir
- ) const ;
+ size_t get_mtu(const uhd::direction_t dir) const;
private:
/*! Create a muxed liberio transport for control packets */
uhd::transport::muxed_zero_copy_if::sptr make_muxed_liberio_xport(
- const std::string &tx_dev,
- const std::string &rx_dev,
- const uhd::transport::zero_copy_xport_params &buff_args,
- const size_t max_muxed_ports
- );
+ const std::string& tx_dev,
+ const std::string& rx_dev,
+ const uhd::transport::zero_copy_xport_params& buff_args,
+ const size_t max_muxed_ports);
const uhd::device_addr_t _mb_args;
const uhd::dict<std::string, std::string> _recv_args;
diff --git a/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.cpp b/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.cpp
index ee48235ee..df02b183f 100644
--- a/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.cpp
+++ b/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.cpp
@@ -4,12 +4,12 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include "mpmd_xport_ctrl_udp.hpp"
#include "mpmd_impl.hpp"
#include "mpmd_xport_mgr.hpp"
-#include "mpmd_xport_ctrl_udp.hpp"
-#include <uhd/transport/udp_zero_copy.hpp>
-#include <uhd/transport/udp_simple.hpp>
#include <uhd/transport/udp_constants.hpp>
+#include <uhd/transport/udp_simple.hpp>
+#include <uhd/transport/udp_zero_copy.hpp>
using namespace uhd;
@@ -17,244 +17,216 @@ using namespace uhd::mpmd::xport;
namespace {
- #if defined(UHD_PLATFORM_MACOS) || defined(UHD_PLATFORM_BSD)
- //! Size of the host-side socket buffer for RX
- const size_t MPMD_RX_SW_BUFF_SIZE_ETH = 0x100000; // 1Mib
- #elif defined(UHD_PLATFORM_LINUX) || defined(UHD_PLATFORM_WIN32)
- //! Size of the host-side socket buffer for RX
- // For an ~8k frame size any size >32MiB is just wasted buffer space
- const size_t MPMD_RX_SW_BUFF_SIZE_ETH = 0x2000000; // 32 MiB
- #endif
+#if defined(UHD_PLATFORM_MACOS) || defined(UHD_PLATFORM_BSD)
+//! Size of the host-side socket buffer for RX
+const size_t MPMD_RX_SW_BUFF_SIZE_ETH = 0x100000; // 1Mib
+#elif defined(UHD_PLATFORM_LINUX) || defined(UHD_PLATFORM_WIN32)
+//! Size of the host-side socket buffer for RX
+// For an ~8k frame size any size >32MiB is just wasted buffer space
+const size_t MPMD_RX_SW_BUFF_SIZE_ETH = 0x2000000; // 32 MiB
+#endif
- //! Maximum CHDR packet size in bytes
- const size_t MPMD_10GE_DATA_FRAME_MAX_SIZE = 4000;
+//! Maximum CHDR packet size in bytes
+const size_t MPMD_10GE_DATA_FRAME_MAX_SIZE = 4000;
- //! Maximum CHDR packet size in bytes
- const size_t MPMD_10GE_ASYNCMSG_FRAME_MAX_SIZE = 1472;
+//! Maximum CHDR packet size in bytes
+const size_t MPMD_10GE_ASYNCMSG_FRAME_MAX_SIZE = 1472;
- //! Number of send/recv frames
- const size_t MPMD_ETH_NUM_FRAMES = 32;
+//! Number of send/recv frames
+const size_t MPMD_ETH_NUM_FRAMES = 32;
- //!
- const double MPMD_BUFFER_FILL_RATE = 20.0e-3; // s
- //! For MTU discovery, the time we wait for a packet before calling it
- // oversized (seconds).
- const double MPMD_MTU_DISCOVERY_TIMEOUT = 0.02;
+//!
+const double MPMD_BUFFER_FILL_RATE = 20.0e-3; // s
+//! For MTU discovery, the time we wait for a packet before calling it
+// oversized (seconds).
+const double MPMD_MTU_DISCOVERY_TIMEOUT = 0.02;
- //TODO: move these to appropriate header file for all other devices
- const size_t MAX_RATE_1GIGE = 1e9 / 8; // byte/s
- const size_t MAX_RATE_10GIGE = 10e9 / 8; // byte/s
+// TODO: move these to appropriate header file for all other devices
+const size_t MAX_RATE_1GIGE = 1e9 / 8; // byte/s
+const size_t MAX_RATE_10GIGE = 10e9 / 8; // byte/s
- std::vector<std::string> get_addrs_from_mb_args(
- const uhd::device_addr_t& mb_args
- ) {
- // mb_args must always include addr
- if (not mb_args.has_key(FIRST_ADDR_KEY)) {
- throw uhd::runtime_error("The " + FIRST_ADDR_KEY + " key must be specified in "
- "device args to create an Ethernet transport to an RFNoC block");
- }
- std::vector<std::string> addrs{mb_args[FIRST_ADDR_KEY]};
- if (mb_args.has_key(SECOND_ADDR_KEY)){
- addrs.push_back(mb_args[SECOND_ADDR_KEY]);
- }
- return addrs;
+std::vector<std::string> get_addrs_from_mb_args(const uhd::device_addr_t& mb_args)
+{
+ // mb_args must always include addr
+ if (not mb_args.has_key(FIRST_ADDR_KEY)) {
+ throw uhd::runtime_error(
+ "The " + FIRST_ADDR_KEY
+ + " key must be specified in "
+ "device args to create an Ethernet transport to an RFNoC block");
}
+ std::vector<std::string> addrs{mb_args[FIRST_ADDR_KEY]};
+ if (mb_args.has_key(SECOND_ADDR_KEY)) {
+ addrs.push_back(mb_args[SECOND_ADDR_KEY]);
+ }
+ return addrs;
+}
- /*! Do a binary search to discover MTU
- *
- * Uses the MPM echo service to figure out MTU. We simply send a bunch of
- * packets and see if they come back until we converged on the path MTU.
- * The end result must lie between \p min_frame_size and \p max_frame_size.
- *
- * \param address IP address
- * \param port UDP port (yeah it's a string!)
- * \param min_frame_size Minimum frame size, initialize algorithm to start
- * with this value
- * \param max_frame_size Maximum frame size, initialize algorithm to start
- * with this value
- * \param echo_timeout Timeout value in seconds. For frame sizes that
- * exceed the MTU, we don't expect a response, and this
- * is the amount of time we'll wait before we assume
- * the frame size exceeds the MTU.
- */
- size_t discover_mtu(
- const std::string &address,
- const std::string &port,
- size_t min_frame_size,
- size_t max_frame_size,
- const double echo_timeout = 0.020
- ) {
- const size_t echo_prefix_offset =
- uhd::mpmd::mpmd_impl::MPM_ECHO_CMD.size();
- const size_t mtu_hdr_len = echo_prefix_offset + 10;
- UHD_ASSERT_THROW(min_frame_size < max_frame_size);
- UHD_ASSERT_THROW(min_frame_size % 4 == 0);
- UHD_ASSERT_THROW(max_frame_size % 4 == 0);
- UHD_ASSERT_THROW(min_frame_size >= echo_prefix_offset + mtu_hdr_len);
- using namespace uhd::transport;
- // The return port will probably differ from the discovery port, so we
- // need a "broadcast" UDP connection; using make_connected() would
- // drop packets
- udp_simple::sptr udp = udp_simple::make_broadcast(address, port);
- std::string send_buf(uhd::mpmd::mpmd_impl::MPM_ECHO_CMD);
- send_buf.resize(max_frame_size, '#');
- UHD_ASSERT_THROW(send_buf.size() == max_frame_size);
- std::vector<uint8_t> recv_buf;
- recv_buf.resize(max_frame_size, ' ');
-
- // Little helper to check returned packets match the sent ones
- auto require_bufs_match = [&recv_buf, &send_buf, mtu_hdr_len](
- const size_t len
- ){
- if (len < mtu_hdr_len or std::memcmp(
- (void *) &recv_buf[0],
- (void *) &send_buf[0],
- mtu_hdr_len
- ) != 0) {
- throw uhd::runtime_error("Unexpected content of MTU "
- "discovery return packet!");
- }
- };
- UHD_LOG_TRACE("MPMD", "Determining UDP MTU... ");
- size_t seq_no = 0;
- while (min_frame_size < max_frame_size) {
- // Only test multiples of 4 bytes!
- const size_t test_frame_size =
- (max_frame_size/2 + min_frame_size/2 + 3) & ~size_t(3);
- // Encode sequence number and current size in the string, makes it
- // easy to debug in code or Wireshark. Is also used for identifying
- // response packets.
- std::sprintf(
- &send_buf[echo_prefix_offset],
- ";%04lu,%04lu",
- seq_no++,
- test_frame_size
- );
- UHD_LOG_TRACE("MPMD", "Testing frame size " << test_frame_size);
- udp->send(boost::asio::buffer(&send_buf[0], test_frame_size));
-
- const size_t len =
- udp->recv(boost::asio::buffer(recv_buf), echo_timeout);
- if (len == 0) {
- // Nothing received, so this is probably too big
- max_frame_size = test_frame_size - 4;
- } else if (len >= test_frame_size) {
- // Size went through, so bump the minimum
- require_bufs_match(len);
- min_frame_size = test_frame_size;
- } else if (len < test_frame_size) {
- // This is an odd case. Something must have snipped the packet
- // on the way back. Still, we'll just back off and try
- // something smaller.
- UHD_LOG_DEBUG("MPMD",
- "Unexpected packet truncation during MTU discovery.");
- require_bufs_match(len);
- max_frame_size = len;
- }
+/*! Do a binary search to discover MTU
+ *
+ * Uses the MPM echo service to figure out MTU. We simply send a bunch of
+ * packets and see if they come back until we converged on the path MTU.
+ * The end result must lie between \p min_frame_size and \p max_frame_size.
+ *
+ * \param address IP address
+ * \param port UDP port (yeah it's a string!)
+ * \param min_frame_size Minimum frame size, initialize algorithm to start
+ * with this value
+ * \param max_frame_size Maximum frame size, initialize algorithm to start
+ * with this value
+ * \param echo_timeout Timeout value in seconds. For frame sizes that
+ * exceed the MTU, we don't expect a response, and this
+ * is the amount of time we'll wait before we assume
+ * the frame size exceeds the MTU.
+ */
+size_t discover_mtu(const std::string& address,
+ const std::string& port,
+ size_t min_frame_size,
+ size_t max_frame_size,
+ const double echo_timeout = 0.020)
+{
+ const size_t echo_prefix_offset = uhd::mpmd::mpmd_impl::MPM_ECHO_CMD.size();
+ const size_t mtu_hdr_len = echo_prefix_offset + 10;
+ UHD_ASSERT_THROW(min_frame_size < max_frame_size);
+ UHD_ASSERT_THROW(min_frame_size % 4 == 0);
+ UHD_ASSERT_THROW(max_frame_size % 4 == 0);
+ UHD_ASSERT_THROW(min_frame_size >= echo_prefix_offset + mtu_hdr_len);
+ using namespace uhd::transport;
+ // The return port will probably differ from the discovery port, so we
+ // need a "broadcast" UDP connection; using make_connected() would
+ // drop packets
+ udp_simple::sptr udp = udp_simple::make_broadcast(address, port);
+ std::string send_buf(uhd::mpmd::mpmd_impl::MPM_ECHO_CMD);
+ send_buf.resize(max_frame_size, '#');
+ UHD_ASSERT_THROW(send_buf.size() == max_frame_size);
+ std::vector<uint8_t> recv_buf;
+ recv_buf.resize(max_frame_size, ' ');
+
+ // Little helper to check returned packets match the sent ones
+ auto require_bufs_match = [&recv_buf, &send_buf, mtu_hdr_len](const size_t len) {
+ if (len < mtu_hdr_len
+ or std::memcmp((void*)&recv_buf[0], (void*)&send_buf[0], mtu_hdr_len) != 0) {
+ throw uhd::runtime_error("Unexpected content of MTU "
+ "discovery return packet!");
+ }
+ };
+ UHD_LOG_TRACE("MPMD", "Determining UDP MTU... ");
+ size_t seq_no = 0;
+ while (min_frame_size < max_frame_size) {
+ // Only test multiples of 4 bytes!
+ const size_t test_frame_size = (max_frame_size / 2 + min_frame_size / 2 + 3)
+ & ~size_t(3);
+ // Encode sequence number and current size in the string, makes it
+ // easy to debug in code or Wireshark. Is also used for identifying
+ // response packets.
+ std::sprintf(
+ &send_buf[echo_prefix_offset], ";%04lu,%04lu", seq_no++, test_frame_size);
+ UHD_LOG_TRACE("MPMD", "Testing frame size " << test_frame_size);
+ udp->send(boost::asio::buffer(&send_buf[0], test_frame_size));
+
+ const size_t len = udp->recv(boost::asio::buffer(recv_buf), echo_timeout);
+ if (len == 0) {
+ // Nothing received, so this is probably too big
+ max_frame_size = test_frame_size - 4;
+ } else if (len >= test_frame_size) {
+ // Size went through, so bump the minimum
+ require_bufs_match(len);
+ min_frame_size = test_frame_size;
+ } else if (len < test_frame_size) {
+ // This is an odd case. Something must have snipped the packet
+ // on the way back. Still, we'll just back off and try
+ // something smaller.
+ UHD_LOG_DEBUG("MPMD", "Unexpected packet truncation during MTU discovery.");
+ require_bufs_match(len);
+ max_frame_size = len;
}
- UHD_LOG_DEBUG("MPMD",
- "Path MTU for address " << address << ": " << min_frame_size);
- return min_frame_size;
}
-
+ UHD_LOG_DEBUG("MPMD", "Path MTU for address " << address << ": " << min_frame_size);
+ return min_frame_size;
}
+} // namespace
+
-mpmd_xport_ctrl_udp::mpmd_xport_ctrl_udp(
- const uhd::device_addr_t& mb_args
-) : _mb_args(mb_args)
- , _recv_args(filter_args(mb_args, "recv"))
- , _send_args(filter_args(mb_args, "send"))
- , _available_addrs(get_addrs_from_mb_args(mb_args))
- , _mtu(MPMD_10GE_DATA_FRAME_MAX_SIZE)
+mpmd_xport_ctrl_udp::mpmd_xport_ctrl_udp(const uhd::device_addr_t& mb_args)
+ : _mb_args(mb_args)
+ , _recv_args(filter_args(mb_args, "recv"))
+ , _send_args(filter_args(mb_args, "send"))
+ , _available_addrs(get_addrs_from_mb_args(mb_args))
+ , _mtu(MPMD_10GE_DATA_FRAME_MAX_SIZE)
{
const std::string mpm_discovery_port = _mb_args.get(
- mpmd_impl::MPM_DISCOVERY_PORT_KEY,
- std::to_string(mpmd_impl::MPM_DISCOVERY_PORT)
- );
- auto discover_mtu_for_ip = [mpm_discovery_port](const std::string &ip_addr){
- return discover_mtu(
- ip_addr,
+ mpmd_impl::MPM_DISCOVERY_PORT_KEY, std::to_string(mpmd_impl::MPM_DISCOVERY_PORT));
+ auto discover_mtu_for_ip = [mpm_discovery_port](const std::string& ip_addr) {
+ return discover_mtu(ip_addr,
mpm_discovery_port,
- IP_PROTOCOL_MIN_MTU_SIZE-IP_PROTOCOL_UDP_PLUS_IP_HEADER,
+ IP_PROTOCOL_MIN_MTU_SIZE - IP_PROTOCOL_UDP_PLUS_IP_HEADER,
MPMD_10GE_DATA_FRAME_MAX_SIZE,
- MPMD_MTU_DISCOVERY_TIMEOUT
- );
+ MPMD_MTU_DISCOVERY_TIMEOUT);
};
- for (const auto &ip_addr : _available_addrs) {
+ for (const auto& ip_addr : _available_addrs) {
_mtu = std::min(_mtu, discover_mtu_for_ip(ip_addr));
}
}
-uhd::both_xports_t
-mpmd_xport_ctrl_udp::make_transport(
- mpmd_xport_mgr::xport_info_t &xport_info,
- const usrp::device3_impl::xport_type_t xport_type,
- const uhd::device_addr_t& xport_args_
-) {
+uhd::both_xports_t mpmd_xport_ctrl_udp::make_transport(
+ mpmd_xport_mgr::xport_info_t& xport_info,
+ const usrp::device3_impl::xport_type_t xport_type,
+ const uhd::device_addr_t& xport_args_)
+{
auto xport_args = xport_args_;
if (xport_type == usrp::device3_impl::RX_DATA
- and not xport_args.has_key("recv_buff_size")) {
- xport_args["recv_buff_size"] =
- std::to_string(MPMD_RX_SW_BUFF_SIZE_ETH);
+ and not xport_args.has_key("recv_buff_size")) {
+ xport_args["recv_buff_size"] = std::to_string(MPMD_RX_SW_BUFF_SIZE_ETH);
}
size_t link_speed = MAX_RATE_1GIGE;
- if(xport_info.count("link_speed") == 0)
- {
+ if (xport_info.count("link_speed") == 0) {
UHD_LOG_WARNING("MPMD",
"Could not determine link speed; using 1GibE max speed of "
- << MAX_RATE_1GIGE);
- }
- else{
- link_speed = xport_info.at("link_speed") == "10000"?
- MAX_RATE_10GIGE:
- MAX_RATE_1GIGE;
+ << MAX_RATE_1GIGE);
+ } else {
+ link_speed = xport_info.at("link_speed") == "10000" ? MAX_RATE_10GIGE
+ : MAX_RATE_1GIGE;
}
transport::zero_copy_xport_params default_buff_args;
// Create actual UDP transport
default_buff_args.recv_frame_size = get_mtu(uhd::RX_DIRECTION);
- default_buff_args.recv_buff_size = link_speed * MPMD_BUFFER_FILL_RATE;
- default_buff_args.send_buff_size = link_speed * MPMD_BUFFER_FILL_RATE;
+ default_buff_args.recv_buff_size = link_speed * MPMD_BUFFER_FILL_RATE;
+ default_buff_args.send_buff_size = link_speed * MPMD_BUFFER_FILL_RATE;
if (xport_type == usrp::device3_impl::ASYNC_MSG) {
default_buff_args.send_frame_size = MPMD_10GE_ASYNCMSG_FRAME_MAX_SIZE;
- }else{
+ } else {
default_buff_args.send_frame_size = get_mtu(uhd::TX_DIRECTION);
}
transport::udp_zero_copy::buff_params buff_params;
- auto recv = transport::udp_zero_copy::make(
- xport_info["ipv4"],
+ auto recv = transport::udp_zero_copy::make(xport_info["ipv4"],
xport_info["port"],
default_buff_args,
buff_params,
- xport_args
- );
- const uint16_t port = recv->get_local_port();
+ xport_args);
+ const uint16_t port = recv->get_local_port();
const std::string src_ip_addr = recv->get_local_addr();
- xport_info["src_port"] = std::to_string(port);
- xport_info["src_ipv4"] = src_ip_addr;
+ xport_info["src_port"] = std::to_string(port);
+ xport_info["src_ipv4"] = src_ip_addr;
// Create both_xports_t object and finish:
both_xports_t xports;
- xports.endianness = uhd::ENDIANNESS_BIG;
- xports.send_sid = sid_t(xport_info["send_sid"]);
- xports.recv_sid = xports.send_sid.reversed();
+ xports.endianness = uhd::ENDIANNESS_BIG;
+ xports.send_sid = sid_t(xport_info["send_sid"]);
+ xports.recv_sid = xports.send_sid.reversed();
xports.recv_buff_size = buff_params.recv_buff_size;
xports.send_buff_size = buff_params.send_buff_size;
- xports.recv = recv; // Note: This is a type cast!
- xports.send = recv; // This too
+ xports.recv = recv; // Note: This is a type cast!
+ xports.send = recv; // This too
return xports;
}
-bool mpmd_xport_ctrl_udp::is_valid(
- const mpmd_xport_mgr::xport_info_t& xport_info
-) const {
+bool mpmd_xport_ctrl_udp::is_valid(const mpmd_xport_mgr::xport_info_t& xport_info) const
+{
return std::find(
- _available_addrs.cbegin(),
- _available_addrs.cend(),
- xport_info.at("ipv4")
- ) != _available_addrs.cend();
+ _available_addrs.cbegin(), _available_addrs.cend(), xport_info.at("ipv4"))
+ != _available_addrs.cend();
}
size_t mpmd_xport_ctrl_udp::get_mtu(const uhd::direction_t /*dir*/) const
diff --git a/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.hpp b/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.hpp
index ff7e69361..86301bb2a 100644
--- a/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.hpp
+++ b/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.hpp
@@ -7,9 +7,9 @@
#ifndef INCLUDED_MPMD_XPORT_ctrl_udp_HPP
#define INCLUDED_MPMD_XPORT_ctrl_udp_HPP
+#include "../device3/device3_impl.hpp"
#include "mpmd_xport_ctrl_base.hpp"
#include <uhd/types/device_addr.hpp>
-#include "../device3/device3_impl.hpp"
namespace uhd { namespace mpmd { namespace xport {
@@ -20,23 +20,15 @@ namespace uhd { namespace mpmd { namespace xport {
class mpmd_xport_ctrl_udp : public mpmd_xport_ctrl_base
{
public:
- mpmd_xport_ctrl_udp(
- const uhd::device_addr_t& mb_args
- );
+ mpmd_xport_ctrl_udp(const uhd::device_addr_t& mb_args);
- both_xports_t make_transport(
- mpmd_xport_mgr::xport_info_t& xport_info,
+ both_xports_t make_transport(mpmd_xport_mgr::xport_info_t& xport_info,
const usrp::device3_impl::xport_type_t xport_type,
- const uhd::device_addr_t& xport_args
- );
+ const uhd::device_addr_t& xport_args);
- bool is_valid(
- const mpmd_xport_mgr::xport_info_t& xport_info
- ) const;
+ bool is_valid(const mpmd_xport_mgr::xport_info_t& xport_info) const;
- size_t get_mtu(
- const uhd::direction_t dir
- ) const;
+ size_t get_mtu(const uhd::direction_t dir) const;
private:
const uhd::device_addr_t _mb_args;
diff --git a/host/lib/usrp/mpmd/mpmd_xport_mgr.cpp b/host/lib/usrp/mpmd/mpmd_xport_mgr.cpp
index a4109b51d..c2200c66a 100644
--- a/host/lib/usrp/mpmd/mpmd_xport_mgr.cpp
+++ b/host/lib/usrp/mpmd/mpmd_xport_mgr.cpp
@@ -4,18 +4,17 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "mpmd_impl.hpp"
#include "mpmd_xport_mgr.hpp"
+#include "mpmd_impl.hpp"
#include "mpmd_xport_ctrl_base.hpp"
#include "mpmd_xport_ctrl_udp.hpp"
#ifdef HAVE_LIBERIO
-# include "mpmd_xport_ctrl_liberio.hpp"
+# include "mpmd_xport_ctrl_liberio.hpp"
#endif
uhd::dict<std::string, std::string> uhd::mpmd::xport::filter_args(
- const uhd::device_addr_t& args,
- const std::string& prefix
-) {
+ const uhd::device_addr_t& args, const std::string& prefix)
+{
uhd::dict<std::string, std::string> filtered_args;
for (const std::string& key : args.keys()) {
if (key.find(prefix) != std::string::npos) {
@@ -31,9 +30,7 @@ using namespace uhd::mpmd::xport;
class mpmd_xport_mgr_impl : public mpmd_xport_mgr
{
public:
- mpmd_xport_mgr_impl(
- const uhd::device_addr_t& mb_args
- ) : _mb_args(mb_args)
+ mpmd_xport_mgr_impl(const uhd::device_addr_t& mb_args) : _mb_args(mb_args)
{
// nop
}
@@ -41,36 +38,30 @@ public:
/**************************************************************************
* API (see mpmd_xport_mgr.hpp)
*************************************************************************/
- uhd::both_xports_t make_transport(
- const xport_info_list_t &xport_info_list,
+ uhd::both_xports_t make_transport(const xport_info_list_t& xport_info_list,
const uhd::usrp::device3_impl::xport_type_t xport_type,
const uhd::device_addr_t& xport_args,
- xport_info_t& xport_info_out
- ) {
- for (const auto &xport_info : xport_info_list) {
+ xport_info_t& xport_info_out)
+ {
+ for (const auto& xport_info : xport_info_list) {
require_xport_mgr(xport_info.at("type"));
}
// Run our incredibly smart selection algorithm
- xport_info_out = select_xport_option(xport_info_list);
+ xport_info_out = select_xport_option(xport_info_list);
const std::string xport_medium = xport_info_out.at("type");
- UHD_LOG_TRACE("MPMD",
- __func__ << "(): xport medium is " << xport_medium);
+ UHD_LOG_TRACE("MPMD", __func__ << "(): xport medium is " << xport_medium);
UHD_ASSERT_THROW(_xport_ctrls.count(xport_medium) > 0);
UHD_ASSERT_THROW(_xport_ctrls.at(xport_medium));
// When we've picked our preferred option, pass it to the transport
// implementation for execution:
- return _xport_ctrls.at(xport_medium)->make_transport(
- xport_info_out,
- xport_type,
- xport_args
- );
+ return _xport_ctrls.at(xport_medium)
+ ->make_transport(xport_info_out, xport_type, xport_args);
}
- size_t get_mtu(
- const uhd::direction_t dir
- ) const {
+ size_t get_mtu(const uhd::direction_t dir) const
+ {
if (_xport_ctrls.empty()) {
UHD_LOG_WARNING("MPMD",
"Cannot determine MTU, no transport controls have been "
@@ -79,7 +70,7 @@ public:
}
size_t mtu = ~size_t(0);
- for (const auto &xport_ctrl_pair : _xport_ctrls) {
+ for (const auto& xport_ctrl_pair : _xport_ctrls) {
mtu = std::min(mtu, xport_ctrl_pair.second->get_mtu(dir));
}
@@ -99,21 +90,20 @@ private:
* \returns One element of \p xport_info_list based on a selection
* algorithm.
*/
- xport_info_t select_xport_option(
- const xport_info_list_t &xport_info_list
- ) const {
+ xport_info_t select_xport_option(const xport_info_list_t& xport_info_list) const
+ {
for (const auto& xport_info : xport_info_list) {
const std::string xport_medium = xport_info.at("type");
- if (_xport_ctrls.count(xport_medium) != 0 and
- _xport_ctrls.at(xport_medium) and
- _xport_ctrls.at(xport_medium)->is_valid(xport_info)) {
+ if (_xport_ctrls.count(xport_medium) != 0 and _xport_ctrls.at(xport_medium)
+ and _xport_ctrls.at(xport_medium)->is_valid(xport_info)) {
return xport_info;
}
}
- throw uhd::runtime_error("Could not select a transport option! "
- "Either a transport hint was not specified or the specified "
- "hint does not support communication with RFNoC blocks.");
+ throw uhd::runtime_error(
+ "Could not select a transport option! "
+ "Either a transport hint was not specified or the specified "
+ "hint does not support communication with RFNoC blocks.");
}
//! Create an instance of an xport manager implementation
@@ -121,22 +111,17 @@ private:
// \param xport_medium "UDP" or "liberio"
// \param mb_args Device args
mpmd_xport_ctrl_base::uptr make_mgr_impl(
- const std::string &xport_medium,
- const uhd::device_addr_t& mb_args
- ) const {
+ const std::string& xport_medium, const uhd::device_addr_t& mb_args) const
+ {
if (xport_medium == "UDP") {
- return mpmd_xport_ctrl_base::uptr(
- new mpmd_xport_ctrl_udp(mb_args)
- );
+ return mpmd_xport_ctrl_base::uptr(new mpmd_xport_ctrl_udp(mb_args));
#ifdef HAVE_LIBERIO
} else if (xport_medium == "liberio") {
- return mpmd_xport_ctrl_base::uptr(
- new mpmd_xport_ctrl_liberio(mb_args)
- );
+ return mpmd_xport_ctrl_base::uptr(new mpmd_xport_ctrl_liberio(mb_args));
#endif
} else {
- UHD_LOG_WARNING("MPMD",
- "Cannot instantiate transport medium " << xport_medium);
+ UHD_LOG_WARNING(
+ "MPMD", "Cannot instantiate transport medium " << xport_medium);
return nullptr;
}
}
@@ -150,11 +135,11 @@ private:
// \param xport_medium Type of transport, e.g. "UDP", "liberio", ...
//
// \throws uhd::key_error if \p xport_medium is not known or registered
- void require_xport_mgr(const std::string &xport_medium)
+ void require_xport_mgr(const std::string& xport_medium)
{
if (_xport_ctrls.count(xport_medium) == 0) {
- UHD_LOG_TRACE("MPMD",
- "Instantiating transport manager `" << xport_medium << "'");
+ UHD_LOG_TRACE(
+ "MPMD", "Instantiating transport manager `" << xport_medium << "'");
auto mgr_impl = make_mgr_impl(xport_medium, _mb_args);
if (mgr_impl) {
_xport_ctrls[xport_medium] = std::move(mgr_impl);
@@ -174,9 +159,7 @@ private:
const uhd::device_addr_t _mb_args;
};
-mpmd_xport_mgr::uptr mpmd_xport_mgr::make(
- const uhd::device_addr_t& mb_args
-) {
+mpmd_xport_mgr::uptr mpmd_xport_mgr::make(const uhd::device_addr_t& mb_args)
+{
return mpmd_xport_mgr::uptr(new mpmd_xport_mgr_impl(mb_args));
}
-
diff --git a/host/lib/usrp/mpmd/mpmd_xport_mgr.hpp b/host/lib/usrp/mpmd/mpmd_xport_mgr.hpp
index 72700e69a..3d96e5ec6 100644
--- a/host/lib/usrp/mpmd/mpmd_xport_mgr.hpp
+++ b/host/lib/usrp/mpmd/mpmd_xport_mgr.hpp
@@ -9,10 +9,10 @@
#include "../device3/device3_impl.hpp"
#include <uhd/types/dict.hpp>
-#include <memory>
#include <map>
-#include <vector>
+#include <memory>
#include <string>
+#include <vector>
namespace uhd { namespace mpmd { namespace xport {
@@ -21,11 +21,11 @@ namespace uhd { namespace mpmd { namespace xport {
*/
//! Ethernet address for management and RPC communication
-const std::string MGMT_ADDR_KEY = "mgmt_addr";
+const std::string MGMT_ADDR_KEY = "mgmt_addr";
//! Primary Ethernet address for streaming and RFNoC communication
-const std::string FIRST_ADDR_KEY = "addr";
+const std::string FIRST_ADDR_KEY = "addr";
//! Secondary Ethernet address for streaming and RFNoC communication
-const std::string SECOND_ADDR_KEY = "second_addr";
+const std::string SECOND_ADDR_KEY = "second_addr";
/*! Return filtered subset from a device_addr_t
*
@@ -36,9 +36,7 @@ const std::string SECOND_ADDR_KEY = "second_addr";
* \param prefix Key prefix to match against
*/
uhd::dict<std::string, std::string> filter_args(
- const uhd::device_addr_t& args,
- const std::string& prefix
-);
+ const uhd::device_addr_t& args, const std::string& prefix);
/*! MPMD Transport Manager
*
@@ -50,8 +48,8 @@ uhd::dict<std::string, std::string> filter_args(
class mpmd_xport_mgr
{
public:
- using uptr = std::unique_ptr<mpmd_xport_mgr>;
- using xport_info_t = std::map<std::string, std::string>;
+ using uptr = std::unique_ptr<mpmd_xport_mgr>;
+ using xport_info_t = std::map<std::string, std::string>;
using xport_info_list_t = std::vector<std::map<std::string, std::string>>;
virtual ~mpmd_xport_mgr() {}
@@ -65,9 +63,7 @@ public:
* \throws uhd::key_error if \p xport_medium is not supported. The ctor of
* the underlying class that is requested can also throw.
*/
- static uptr make(
- const uhd::device_addr_t& mb_args
- );
+ static uptr make(const uhd::device_addr_t& mb_args);
/*! Create a transports object
*
@@ -94,18 +90,14 @@ public:
* The latter needs to get sent back to MPM to complete the
* transport handshake.
*/
- virtual both_xports_t make_transport(
- const xport_info_list_t &xport_info_list,
+ virtual both_xports_t make_transport(const xport_info_list_t& xport_info_list,
const usrp::device3_impl::xport_type_t xport_type,
const uhd::device_addr_t& xport_args,
- xport_info_t& xport_info_out
- ) = 0;
+ xport_info_t& xport_info_out) = 0;
/*! Return the path MTU for whatever this manager lets us do
*/
- virtual size_t get_mtu(
- const uhd::direction_t dir
- ) const = 0;
+ virtual size_t get_mtu(const uhd::direction_t dir) const = 0;
};
}}} /* namespace uhd::mpmd::xport */
diff --git a/host/lib/usrp/x300/x300_adc_ctrl.cpp b/host/lib/usrp/x300/x300_adc_ctrl.cpp
index b8101753f..26c1d85ff 100644
--- a/host/lib/usrp/x300/x300_adc_ctrl.cpp
+++ b/host/lib/usrp/x300/x300_adc_ctrl.cpp
@@ -7,14 +7,15 @@
#include "x300_adc_ctrl.hpp"
#include "ads62p48_regs.hpp"
+#include <uhd/exception.hpp>
#include <uhd/types/ranges.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/safe_call.hpp>
-#include <uhd/exception.hpp>
using namespace uhd;
-x300_adc_ctrl::~x300_adc_ctrl(void){
+x300_adc_ctrl::~x300_adc_ctrl(void)
+{
/* NOP */
}
@@ -24,26 +25,26 @@ x300_adc_ctrl::~x300_adc_ctrl(void){
class x300_adc_ctrl_impl : public x300_adc_ctrl
{
public:
- x300_adc_ctrl_impl(uhd::spi_iface::sptr iface, const size_t slaveno):
- _iface(iface), _slaveno(slaveno)
+ x300_adc_ctrl_impl(uhd::spi_iface::sptr iface, const size_t slaveno)
+ : _iface(iface), _slaveno(slaveno)
{
init();
}
void init()
{
- //power-up adc
- _ads62p48_regs.reset = 1;
- this->send_ads62p48_reg(0x00); //issue a reset to the ADC
- _ads62p48_regs.reset = 0;
+ // power-up adc
+ _ads62p48_regs.reset = 1;
+ this->send_ads62p48_reg(0x00); // issue a reset to the ADC
+ _ads62p48_regs.reset = 0;
_ads62p48_regs.enable_low_speed_mode = 0;
- _ads62p48_regs.ref = ads62p48_regs_t::REF_INTERNAL;
- _ads62p48_regs.standby = ads62p48_regs_t::STANDBY_NORMAL;
- _ads62p48_regs.power_down = ads62p48_regs_t::POWER_DOWN_NORMAL;
- _ads62p48_regs.lvds_cmos = ads62p48_regs_t::LVDS_CMOS_DDR_LVDS;
- _ads62p48_regs.channel_control = ads62p48_regs_t::CHANNEL_CONTROL_INDEPENDENT;
- _ads62p48_regs.data_format = ads62p48_regs_t::DATA_FORMAT_2S_COMPLIMENT;
+ _ads62p48_regs.ref = ads62p48_regs_t::REF_INTERNAL;
+ _ads62p48_regs.standby = ads62p48_regs_t::STANDBY_NORMAL;
+ _ads62p48_regs.power_down = ads62p48_regs_t::POWER_DOWN_NORMAL;
+ _ads62p48_regs.lvds_cmos = ads62p48_regs_t::LVDS_CMOS_DDR_LVDS;
+ _ads62p48_regs.channel_control = ads62p48_regs_t::CHANNEL_CONTROL_INDEPENDENT;
+ _ads62p48_regs.data_format = ads62p48_regs_t::DATA_FORMAT_2S_COMPLIMENT;
_ads62p48_regs.clk_out_pos_edge = ads62p48_regs_t::CLK_OUT_POS_EDGE_MINUS4_26;
_ads62p48_regs.clk_out_neg_edge = ads62p48_regs_t::CLK_OUT_NEG_EDGE_MINUS4_26;
@@ -67,7 +68,6 @@ public:
this->send_ads62p48_reg(0x6a);
this->send_ads62p48_reg(0x75);
this->send_ads62p48_reg(0x76);
-
}
void reset()
@@ -75,31 +75,42 @@ public:
init();
}
- double set_gain(const double &gain)
+ double set_gain(const double& gain)
{
const meta_range_t gain_range = meta_range_t(0, 6.0, 0.5);
- const int gain_bits = int((gain_range.clip(gain)*2.0) + 0.5);
- _ads62p48_regs.gain_chA = gain_bits;
- _ads62p48_regs.gain_chB = gain_bits;
+ const int gain_bits = int((gain_range.clip(gain) * 2.0) + 0.5);
+ _ads62p48_regs.gain_chA = gain_bits;
+ _ads62p48_regs.gain_chB = gain_bits;
this->send_ads62p48_reg(0x55);
this->send_ads62p48_reg(0x68);
- return gain_bits/2;
+ return gain_bits / 2;
}
- void set_test_word(const std::string &patterna, const std::string &patternb, const uint32_t num)
+ void set_test_word(
+ const std::string& patterna, const std::string& patternb, const uint32_t num)
{
- _ads62p48_regs.custom_pattern_low = num & 0xff;
+ _ads62p48_regs.custom_pattern_low = num & 0xff;
_ads62p48_regs.custom_pattern_high = num >> 8;
- if (patterna == "ones") _ads62p48_regs.test_patterns_chA = ads62p48_regs_t::TEST_PATTERNS_CHA_ONES;
- if (patterna == "zeros") _ads62p48_regs.test_patterns_chA = ads62p48_regs_t::TEST_PATTERNS_CHA_ZEROS;
- if (patterna == "custom") _ads62p48_regs.test_patterns_chA = ads62p48_regs_t::TEST_PATTERNS_CHA_CUSTOM;
- if (patterna == "ramp") _ads62p48_regs.test_patterns_chA = ads62p48_regs_t::TEST_PATTERNS_CHA_RAMP;
- if (patterna == "normal") _ads62p48_regs.test_patterns_chA = ads62p48_regs_t::TEST_PATTERNS_CHA_NORMAL;
- if (patternb == "ones") _ads62p48_regs.test_patterns_chB = ads62p48_regs_t::TEST_PATTERNS_CHB_ONES;
- if (patternb == "zeros") _ads62p48_regs.test_patterns_chB = ads62p48_regs_t::TEST_PATTERNS_CHB_ZEROS;
- if (patternb == "custom") _ads62p48_regs.test_patterns_chB = ads62p48_regs_t::TEST_PATTERNS_CHB_CUSTOM;
- if (patterna == "ramp") _ads62p48_regs.test_patterns_chB = ads62p48_regs_t::TEST_PATTERNS_CHB_RAMP;
- if (patterna == "normal") _ads62p48_regs.test_patterns_chB = ads62p48_regs_t::TEST_PATTERNS_CHB_NORMAL;
+ if (patterna == "ones")
+ _ads62p48_regs.test_patterns_chA = ads62p48_regs_t::TEST_PATTERNS_CHA_ONES;
+ if (patterna == "zeros")
+ _ads62p48_regs.test_patterns_chA = ads62p48_regs_t::TEST_PATTERNS_CHA_ZEROS;
+ if (patterna == "custom")
+ _ads62p48_regs.test_patterns_chA = ads62p48_regs_t::TEST_PATTERNS_CHA_CUSTOM;
+ if (patterna == "ramp")
+ _ads62p48_regs.test_patterns_chA = ads62p48_regs_t::TEST_PATTERNS_CHA_RAMP;
+ if (patterna == "normal")
+ _ads62p48_regs.test_patterns_chA = ads62p48_regs_t::TEST_PATTERNS_CHA_NORMAL;
+ if (patternb == "ones")
+ _ads62p48_regs.test_patterns_chB = ads62p48_regs_t::TEST_PATTERNS_CHB_ONES;
+ if (patternb == "zeros")
+ _ads62p48_regs.test_patterns_chB = ads62p48_regs_t::TEST_PATTERNS_CHB_ZEROS;
+ if (patternb == "custom")
+ _ads62p48_regs.test_patterns_chB = ads62p48_regs_t::TEST_PATTERNS_CHB_CUSTOM;
+ if (patterna == "ramp")
+ _ads62p48_regs.test_patterns_chB = ads62p48_regs_t::TEST_PATTERNS_CHB_RAMP;
+ if (patterna == "normal")
+ _ads62p48_regs.test_patterns_chB = ads62p48_regs_t::TEST_PATTERNS_CHB_NORMAL;
this->send_ads62p48_reg(0x51);
this->send_ads62p48_reg(0x52);
this->send_ads62p48_reg(0x62);
@@ -109,10 +120,7 @@ public:
~x300_adc_ctrl_impl(void)
{
_ads62p48_regs.power_down = ads62p48_regs_t::POWER_DOWN_GLOBAL;
- UHD_SAFE_CALL
- (
- this->send_ads62p48_reg(0x40);
- )
+ UHD_SAFE_CALL(this->send_ads62p48_reg(0x40);)
}
private:
diff --git a/host/lib/usrp/x300/x300_adc_ctrl.hpp b/host/lib/usrp/x300/x300_adc_ctrl.hpp
index eb29dd28f..106d79eed 100644
--- a/host/lib/usrp/x300/x300_adc_ctrl.hpp
+++ b/host/lib/usrp/x300/x300_adc_ctrl.hpp
@@ -27,9 +27,10 @@ public:
*/
static sptr make(uhd::spi_iface::sptr iface, const size_t slaveno);
- virtual double set_gain(const double &) = 0;
+ virtual double set_gain(const double&) = 0;
- virtual void set_test_word(const std::string &patterna, const std::string &patternb, const uint32_t = 0) = 0;
+ virtual void set_test_word(
+ const std::string& patterna, const std::string& patternb, const uint32_t = 0) = 0;
virtual void reset(void) = 0;
};
diff --git a/host/lib/usrp/x300/x300_clock_ctrl.cpp b/host/lib/usrp/x300/x300_clock_ctrl.cpp
index 93e02ca7d..a867a9138 100644
--- a/host/lib/usrp/x300/x300_clock_ctrl.cpp
+++ b/host/lib/usrp/x300/x300_clock_ctrl.cpp
@@ -5,32 +5,43 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "lmk04816_regs.hpp"
#include "x300_clock_ctrl.hpp"
+#include "lmk04816_regs.hpp"
#include "x300_defaults.hpp"
-#include <uhd/utils/safe_call.hpp>
#include <uhd/utils/math.hpp>
+#include <uhd/utils/safe_call.hpp>
#include <stdint.h>
#include <boost/format.hpp>
#include <boost/math/special_functions/round.hpp>
-#include <stdexcept>
#include <cmath>
#include <cstdlib>
+#include <stdexcept>
-static const double X300_REF_CLK_OUT_RATE = 10e6;
+static const double X300_REF_CLK_OUT_RATE = 10e6;
static const uint16_t X300_MAX_CLKOUT_DIV = 1045;
-constexpr double MIN_VCO_FREQ = 2370e6;
-constexpr double MAX_VCO_FREQ = 2600e6;
-constexpr double VCXO_FREQ = 96.0e6; // VCXO runs at 96MHz
-constexpr int VCXO_PLL2_N = 2; // Assume that the PLL2 N predivider is set to /2.
-
-struct x300_clk_delays {
- x300_clk_delays() :
- fpga_dly_ns(0.0),adc_dly_ns(0.0),dac_dly_ns(0.0),db_rx_dly_ns(0.0),db_tx_dly_ns(0.0)
- {}
- x300_clk_delays(double fpga, double adc, double dac, double db_rx, double db_tx) :
- fpga_dly_ns(fpga),adc_dly_ns(adc),dac_dly_ns(dac),db_rx_dly_ns(db_rx),db_tx_dly_ns(db_tx)
- {}
+constexpr double MIN_VCO_FREQ = 2370e6;
+constexpr double MAX_VCO_FREQ = 2600e6;
+constexpr double VCXO_FREQ = 96.0e6; // VCXO runs at 96MHz
+constexpr int VCXO_PLL2_N = 2; // Assume that the PLL2 N predivider is set to /2.
+
+struct x300_clk_delays
+{
+ x300_clk_delays()
+ : fpga_dly_ns(0.0)
+ , adc_dly_ns(0.0)
+ , dac_dly_ns(0.0)
+ , db_rx_dly_ns(0.0)
+ , db_tx_dly_ns(0.0)
+ {
+ }
+ x300_clk_delays(double fpga, double adc, double dac, double db_rx, double db_tx)
+ : fpga_dly_ns(fpga)
+ , adc_dly_ns(adc)
+ , dac_dly_ns(dac)
+ , db_rx_dly_ns(db_rx)
+ , db_tx_dly_ns(db_tx)
+ {
+ }
double fpga_dly_ns;
double adc_dly_ns;
@@ -51,14 +62,14 @@ static const x300_clk_delays X300_REV7_CLK_DELAYS = x300_clk_delays(
using namespace uhd;
using namespace uhd::math::fp_compare;
-x300_clock_ctrl::~x300_clock_ctrl(void){
+x300_clock_ctrl::~x300_clock_ctrl(void)
+{
/* NOP */
}
-class x300_clock_ctrl_impl : public x300_clock_ctrl {
-
+class x300_clock_ctrl_impl : public x300_clock_ctrl
+{
public:
-
~x300_clock_ctrl_impl(void) {}
x300_clock_ctrl_impl(uhd::spi_iface::sptr spiface,
@@ -66,18 +77,19 @@ public:
const size_t hw_rev,
const double master_clock_rate,
const double dboard_clock_rate,
- const double system_ref_rate):
- _spiface(spiface),
- _slaveno(static_cast<int>(slaveno)),
- _hw_rev(hw_rev),
- _master_clock_rate(master_clock_rate),
- _dboard_clock_rate(dboard_clock_rate),
- _system_ref_rate(system_ref_rate)
+ const double system_ref_rate)
+ : _spiface(spiface)
+ , _slaveno(static_cast<int>(slaveno))
+ , _hw_rev(hw_rev)
+ , _master_clock_rate(master_clock_rate)
+ , _dboard_clock_rate(dboard_clock_rate)
+ , _system_ref_rate(system_ref_rate)
{
init();
}
- void reset_clocks() {
+ void reset_clocks()
+ {
_lmk04816_regs.RESET = lmk04816_regs_t::RESET_RESET;
this->write_regs(0);
_lmk04816_regs.RESET = lmk04816_regs_t::RESET_NO_RESET;
@@ -90,52 +102,56 @@ public:
sync_clocks();
}
- void sync_clocks(void) {
- //soft sync:
- //put the sync IO into output mode - FPGA must be input
- //write low, then write high - this triggers a soft sync
+ void sync_clocks(void)
+ {
+ // soft sync:
+ // put the sync IO into output mode - FPGA must be input
+ // write low, then write high - this triggers a soft sync
_lmk04816_regs.SYNC_POL_INV = lmk04816_regs_t::SYNC_POL_INV_SYNC_LOW;
this->write_regs(11);
_lmk04816_regs.SYNC_POL_INV = lmk04816_regs_t::SYNC_POL_INV_SYNC_HIGH;
this->write_regs(11);
}
- double get_master_clock_rate(void) {
+ double get_master_clock_rate(void)
+ {
return _master_clock_rate;
}
- double get_sysref_clock_rate(void) {
+ double get_sysref_clock_rate(void)
+ {
return _system_ref_rate;
}
- double get_refout_clock_rate(void) {
- //We support only one reference output rate
+ double get_refout_clock_rate(void)
+ {
+ // We support only one reference output rate
return X300_REF_CLK_OUT_RATE;
}
- void set_dboard_rate(const x300_clock_which_t which, double rate) {
- uint16_t div = uint16_t(_vco_freq / rate);
- uint16_t *reg = NULL;
- uint8_t addr = 0xFF;
+ void set_dboard_rate(const x300_clock_which_t which, double rate)
+ {
+ uint16_t div = uint16_t(_vco_freq / rate);
+ uint16_t* reg = NULL;
+ uint8_t addr = 0xFF;
// Make sure requested rate is an even divisor of the VCO frequency
if (not math::frequencies_are_equal(_vco_freq / div, rate))
throw uhd::value_error("invalid dboard rate requested");
- switch (which)
- {
- case X300_CLOCK_WHICH_DB0_RX:
- case X300_CLOCK_WHICH_DB1_RX:
- reg = &_lmk04816_regs.CLKout2_3_DIV;
- addr = 1;
- break;
- case X300_CLOCK_WHICH_DB0_TX:
- case X300_CLOCK_WHICH_DB1_TX:
- reg = &_lmk04816_regs.CLKout4_5_DIV;
- addr = 2;
- break;
- default:
- UHD_THROW_INVALID_CODE_PATH();
+ switch (which) {
+ case X300_CLOCK_WHICH_DB0_RX:
+ case X300_CLOCK_WHICH_DB1_RX:
+ reg = &_lmk04816_regs.CLKout2_3_DIV;
+ addr = 1;
+ break;
+ case X300_CLOCK_WHICH_DB0_TX:
+ case X300_CLOCK_WHICH_DB1_TX:
+ reg = &_lmk04816_regs.CLKout4_5_DIV;
+ addr = 2;
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
if (*reg == div)
@@ -143,13 +159,15 @@ public:
// Since the clock rate on one daughter board cannot be changed without
// affecting the other daughter board, don't allow it.
- throw uhd::not_implemented_error("x3xx set dboard clock rate does not support changing the clock rate");
+ throw uhd::not_implemented_error(
+ "x3xx set dboard clock rate does not support changing the clock rate");
// This is open source code and users may need to enable this function
// to support other daughterboards. If so, comment out the line above
// that throws the error and allow the program to reach the code below.
- // The LMK04816 datasheet says the register must be written twice if SYNC is enabled
+ // The LMK04816 datasheet says the register must be written twice if SYNC is
+ // enabled
*reg = div;
write_regs(addr);
write_regs(addr);
@@ -159,18 +177,17 @@ public:
double get_dboard_rate(const x300_clock_which_t which)
{
double rate = 0.0;
- switch (which)
- {
- case X300_CLOCK_WHICH_DB0_RX:
- case X300_CLOCK_WHICH_DB1_RX:
- rate = _vco_freq / _lmk04816_regs.CLKout2_3_DIV;
- break;
- case X300_CLOCK_WHICH_DB0_TX:
- case X300_CLOCK_WHICH_DB1_TX:
- rate = _vco_freq / _lmk04816_regs.CLKout4_5_DIV;
- break;
- default:
- UHD_THROW_INVALID_CODE_PATH();
+ switch (which) {
+ case X300_CLOCK_WHICH_DB0_RX:
+ case X300_CLOCK_WHICH_DB1_RX:
+ rate = _vco_freq / _lmk04816_regs.CLKout2_3_DIV;
+ break;
+ case X300_CLOCK_WHICH_DB0_TX:
+ case X300_CLOCK_WHICH_DB1_TX:
+ rate = _vco_freq / _lmk04816_regs.CLKout4_5_DIV;
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
return rate;
}
@@ -178,49 +195,63 @@ public:
std::vector<double> get_dboard_rates(const x300_clock_which_t)
{
std::vector<double> rates;
- for (size_t div = size_t(_vco_freq / _master_clock_rate); div <= X300_MAX_CLKOUT_DIV; div++)
+ for (size_t div = size_t(_vco_freq / _master_clock_rate);
+ div <= X300_MAX_CLKOUT_DIV;
+ div++)
rates.push_back(_vco_freq / div);
return rates;
}
void enable_dboard_clock(const x300_clock_which_t which, const bool enable)
{
- switch (which)
- {
- case X300_CLOCK_WHICH_DB0_RX:
- if (enable != (_lmk04816_regs.CLKout2_TYPE == lmk04816_regs_t::CLKOUT2_TYPE_LVPECL_700MVPP))
- {
- _lmk04816_regs.CLKout2_TYPE = enable ? lmk04816_regs_t::CLKOUT2_TYPE_LVPECL_700MVPP : lmk04816_regs_t::CLKOUT2_TYPE_P_DOWN;
- write_regs(6);
- }
- break;
- case X300_CLOCK_WHICH_DB1_RX:
- if (enable != (_lmk04816_regs.CLKout3_TYPE == lmk04816_regs_t::CLKOUT3_TYPE_LVPECL_700MVPP))
- {
- _lmk04816_regs.CLKout3_TYPE = enable ? lmk04816_regs_t::CLKOUT3_TYPE_LVPECL_700MVPP : lmk04816_regs_t::CLKOUT3_TYPE_P_DOWN;
- write_regs(6);
- }
- break;
- case X300_CLOCK_WHICH_DB0_TX:
- if (enable != (_lmk04816_regs.CLKout5_TYPE == lmk04816_regs_t::CLKOUT5_TYPE_LVPECL_700MVPP))
- {
- _lmk04816_regs.CLKout5_TYPE = enable ? lmk04816_regs_t::CLKOUT5_TYPE_LVPECL_700MVPP : lmk04816_regs_t::CLKOUT5_TYPE_P_DOWN;
- write_regs(7);
- }
- break;
- case X300_CLOCK_WHICH_DB1_TX:
- if (enable != (_lmk04816_regs.CLKout4_TYPE == lmk04816_regs_t::CLKOUT4_TYPE_LVPECL_700MVPP))
- {
- _lmk04816_regs.CLKout4_TYPE = enable ? lmk04816_regs_t::CLKOUT4_TYPE_LVPECL_700MVPP : lmk04816_regs_t::CLKOUT4_TYPE_P_DOWN;
- write_regs(7);
- }
- break;
- default:
- UHD_THROW_INVALID_CODE_PATH();
+ switch (which) {
+ case X300_CLOCK_WHICH_DB0_RX:
+ if (enable
+ != (_lmk04816_regs.CLKout2_TYPE
+ == lmk04816_regs_t::CLKOUT2_TYPE_LVPECL_700MVPP)) {
+ _lmk04816_regs.CLKout2_TYPE =
+ enable ? lmk04816_regs_t::CLKOUT2_TYPE_LVPECL_700MVPP
+ : lmk04816_regs_t::CLKOUT2_TYPE_P_DOWN;
+ write_regs(6);
+ }
+ break;
+ case X300_CLOCK_WHICH_DB1_RX:
+ if (enable
+ != (_lmk04816_regs.CLKout3_TYPE
+ == lmk04816_regs_t::CLKOUT3_TYPE_LVPECL_700MVPP)) {
+ _lmk04816_regs.CLKout3_TYPE =
+ enable ? lmk04816_regs_t::CLKOUT3_TYPE_LVPECL_700MVPP
+ : lmk04816_regs_t::CLKOUT3_TYPE_P_DOWN;
+ write_regs(6);
+ }
+ break;
+ case X300_CLOCK_WHICH_DB0_TX:
+ if (enable
+ != (_lmk04816_regs.CLKout5_TYPE
+ == lmk04816_regs_t::CLKOUT5_TYPE_LVPECL_700MVPP)) {
+ _lmk04816_regs.CLKout5_TYPE =
+ enable ? lmk04816_regs_t::CLKOUT5_TYPE_LVPECL_700MVPP
+ : lmk04816_regs_t::CLKOUT5_TYPE_P_DOWN;
+ write_regs(7);
+ }
+ break;
+ case X300_CLOCK_WHICH_DB1_TX:
+ if (enable
+ != (_lmk04816_regs.CLKout4_TYPE
+ == lmk04816_regs_t::CLKOUT4_TYPE_LVPECL_700MVPP)) {
+ _lmk04816_regs.CLKout4_TYPE =
+ enable ? lmk04816_regs_t::CLKOUT4_TYPE_LVPECL_700MVPP
+ : lmk04816_regs_t::CLKOUT4_TYPE_P_DOWN;
+ write_regs(7);
+ }
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
- void set_ref_out(const bool enable) {
+ void set_ref_out(const bool enable)
+ {
// TODO Implement divider configuration to allow for configurable output
// rates
if (enable)
@@ -230,44 +261,48 @@ public:
this->write_regs(8);
}
- void write_regs(uint8_t addr) {
+ void write_regs(uint8_t addr)
+ {
uint32_t data = _lmk04816_regs.get_reg(addr);
- _spiface->write_spi(_slaveno, spi_config_t::EDGE_RISE, data,32);
+ _spiface->write_spi(_slaveno, spi_config_t::EDGE_RISE, data, 32);
}
- double set_clock_delay(const x300_clock_which_t which, const double delay_ns, const bool resync = true) {
- //All dividers have are delayed by 5 taps by default. The delay
- //set by this function is relative to the 5 tap delay
- static const uint16_t DDLY_MIN_TAPS = 5;
- static const uint16_t DDLY_MAX_TAPS = 522; //Extended mode
+ double set_clock_delay(
+ const x300_clock_which_t which, const double delay_ns, const bool resync = true)
+ {
+ // All dividers have are delayed by 5 taps by default. The delay
+ // set by this function is relative to the 5 tap delay
+ static const uint16_t DDLY_MIN_TAPS = 5;
+ static const uint16_t DDLY_MAX_TAPS = 522; // Extended mode
- //The resolution and range of the analog delay is fixed
+ // The resolution and range of the analog delay is fixed
static const double ADLY_RES_NS = 0.025;
static const double ADLY_MIN_NS = 0.500;
static const double ADLY_MAX_NS = 0.975;
- //Each digital tap delays the clock by one VCO period
- double vco_period_ns = 1.0e9/_vco_freq;
- double half_vco_period_ns = vco_period_ns/2.0;
+ // Each digital tap delays the clock by one VCO period
+ double vco_period_ns = 1.0e9 / _vco_freq;
+ double half_vco_period_ns = vco_period_ns / 2.0;
- //Implement as much of the requested delay using digital taps. Whatever is leftover
- //will be made up using the analog delay element and the half-cycle digital tap.
- //A caveat here is that the analog delay starts at ADLY_MIN_NS, so we need to back off
- //by that much when coming up with the digital taps so that the difference can be made
- //up using the analog delay.
+ // Implement as much of the requested delay using digital taps. Whatever is
+ // leftover will be made up using the analog delay element and the half-cycle
+ // digital tap. A caveat here is that the analog delay starts at ADLY_MIN_NS, so
+ // we need to back off by that much when coming up with the digital taps so that
+ // the difference can be made up using the analog delay.
uint16_t ddly_taps = 0;
if (delay_ns < ADLY_MIN_NS) {
- ddly_taps = static_cast<uint16_t>(std::floor((delay_ns)/vco_period_ns));
+ ddly_taps = static_cast<uint16_t>(std::floor((delay_ns) / vco_period_ns));
} else {
- ddly_taps = static_cast<uint16_t>(std::floor((delay_ns-ADLY_MIN_NS)/vco_period_ns));
+ ddly_taps = static_cast<uint16_t>(
+ std::floor((delay_ns - ADLY_MIN_NS) / vco_period_ns));
}
double leftover_delay = delay_ns - (vco_period_ns * ddly_taps);
- //Compute settings
- uint16_t ddly_value = ddly_taps + DDLY_MIN_TAPS;
- bool adly_en = false;
- uint8_t adly_value = 0;
- uint8_t half_shift_en = 0;
+ // Compute settings
+ uint16_t ddly_value = ddly_taps + DDLY_MIN_TAPS;
+ bool adly_en = false;
+ uint8_t adly_value = 0;
+ uint8_t half_shift_en = 0;
if (ddly_value > DDLY_MAX_TAPS) {
throw uhd::value_error("set_clock_delay: Requested delay is out of range.");
@@ -275,172 +310,203 @@ public:
double coerced_delay = (vco_period_ns * ddly_taps);
if (leftover_delay > ADLY_MAX_NS) {
- //The VCO is running too slowly for us to compensate the digital delay difference using
- //analog delay. Do the best we can.
- adly_en = true;
- adly_value = static_cast<uint8_t>(boost::math::round((ADLY_MAX_NS-ADLY_MIN_NS)/ADLY_RES_NS));
+ // The VCO is running too slowly for us to compensate the digital delay
+ // difference using analog delay. Do the best we can.
+ adly_en = true;
+ adly_value = static_cast<uint8_t>(
+ boost::math::round((ADLY_MAX_NS - ADLY_MIN_NS) / ADLY_RES_NS));
coerced_delay += ADLY_MAX_NS;
} else if (leftover_delay >= ADLY_MIN_NS && leftover_delay <= ADLY_MAX_NS) {
- //The leftover delay can be compensated by the analog delay up to the analog delay resolution
- adly_en = true;
- adly_value = static_cast<uint8_t>(boost::math::round((leftover_delay-ADLY_MIN_NS)/ADLY_RES_NS));
- coerced_delay += ADLY_MIN_NS+(ADLY_RES_NS*adly_value);
- } else if (leftover_delay >= (ADLY_MIN_NS - half_vco_period_ns) && leftover_delay < ADLY_MIN_NS) {
- //The leftover delay if less than the minimum supported analog delay but if we move the digital
- //delay back by half a VCO cycle then it will be in the range of the analog delay. So do that!
- adly_en = true;
- adly_value = static_cast<uint8_t>(boost::math::round((leftover_delay+half_vco_period_ns-ADLY_MIN_NS)/ADLY_RES_NS));
+ // The leftover delay can be compensated by the analog delay up to the analog
+ // delay resolution
+ adly_en = true;
+ adly_value = static_cast<uint8_t>(
+ boost::math::round((leftover_delay - ADLY_MIN_NS) / ADLY_RES_NS));
+ coerced_delay += ADLY_MIN_NS + (ADLY_RES_NS * adly_value);
+ } else if (leftover_delay >= (ADLY_MIN_NS - half_vco_period_ns)
+ && leftover_delay < ADLY_MIN_NS) {
+ // The leftover delay if less than the minimum supported analog delay but if
+ // we move the digital delay back by half a VCO cycle then it will be in the
+ // range of the analog delay. So do that!
+ adly_en = true;
+ adly_value = static_cast<uint8_t>(boost::math::round(
+ (leftover_delay + half_vco_period_ns - ADLY_MIN_NS) / ADLY_RES_NS));
half_shift_en = 1;
- coerced_delay += ADLY_MIN_NS+(ADLY_RES_NS*adly_value)-half_vco_period_ns;
+ coerced_delay +=
+ ADLY_MIN_NS + (ADLY_RES_NS * adly_value) - half_vco_period_ns;
} else {
- //Even after moving the digital delay back by half a cycle, we cannot make up the difference
- //so give up on compensating for the difference from the digital delay tap.
- //If control reaches here then the value of leftover_delay is possible very small and will still
- //be close to what the client requested.
+ // Even after moving the digital delay back by half a cycle, we cannot make up
+ // the difference so give up on compensating for the difference from the
+ // digital delay tap. If control reaches here then the value of leftover_delay
+ // is possible very small and will still be close to what the client
+ // requested.
}
- UHD_LOG_DEBUG("X300", boost::format("x300_clock_ctrl::set_clock_delay: Which=%d, Requested=%f, Digital Taps=%d, Half Shift=%d, Analog Delay=%d (%s), Coerced Delay=%fns"
- ) % which % delay_ns % ddly_value % (half_shift_en?"ON":"OFF") % ((int)adly_value) % (adly_en?"ON":"OFF") % coerced_delay)
-
- //Apply settings
- switch (which)
- {
- case X300_CLOCK_WHICH_FPGA:
- _lmk04816_regs.CLKout0_1_DDLY = ddly_value;
- _lmk04816_regs.CLKout0_1_HS = half_shift_en;
- if (adly_en) {
- _lmk04816_regs.CLKout0_ADLY_SEL = lmk04816_regs_t::CLKOUT0_ADLY_SEL_D_BOTH;
- _lmk04816_regs.CLKout1_ADLY_SEL = lmk04816_regs_t::CLKOUT1_ADLY_SEL_D_BOTH;
- _lmk04816_regs.CLKout0_1_ADLY = adly_value;
- } else {
- _lmk04816_regs.CLKout0_ADLY_SEL = lmk04816_regs_t::CLKOUT0_ADLY_SEL_D_PD;
- _lmk04816_regs.CLKout1_ADLY_SEL = lmk04816_regs_t::CLKOUT1_ADLY_SEL_D_PD;
- }
- write_regs(0);
- write_regs(6);
- _delays.fpga_dly_ns = coerced_delay;
- break;
- case X300_CLOCK_WHICH_DB0_RX:
- case X300_CLOCK_WHICH_DB1_RX:
- _lmk04816_regs.CLKout2_3_DDLY = ddly_value;
- _lmk04816_regs.CLKout2_3_HS = half_shift_en;
- if (adly_en) {
- _lmk04816_regs.CLKout2_ADLY_SEL = lmk04816_regs_t::CLKOUT2_ADLY_SEL_D_BOTH;
- _lmk04816_regs.CLKout3_ADLY_SEL = lmk04816_regs_t::CLKOUT3_ADLY_SEL_D_BOTH;
- _lmk04816_regs.CLKout2_3_ADLY = adly_value;
- } else {
- _lmk04816_regs.CLKout2_ADLY_SEL = lmk04816_regs_t::CLKOUT2_ADLY_SEL_D_PD;
- _lmk04816_regs.CLKout3_ADLY_SEL = lmk04816_regs_t::CLKOUT3_ADLY_SEL_D_PD;
- }
- write_regs(1);
- write_regs(6);
- _delays.db_rx_dly_ns = coerced_delay;
- break;
- case X300_CLOCK_WHICH_DB0_TX:
- case X300_CLOCK_WHICH_DB1_TX:
- _lmk04816_regs.CLKout4_5_DDLY = ddly_value;
- _lmk04816_regs.CLKout4_5_HS = half_shift_en;
- if (adly_en) {
- _lmk04816_regs.CLKout4_ADLY_SEL = lmk04816_regs_t::CLKOUT4_ADLY_SEL_D_BOTH;
- _lmk04816_regs.CLKout5_ADLY_SEL = lmk04816_regs_t::CLKOUT5_ADLY_SEL_D_BOTH;
- _lmk04816_regs.CLKout4_5_ADLY = adly_value;
- } else {
- _lmk04816_regs.CLKout4_ADLY_SEL = lmk04816_regs_t::CLKOUT4_ADLY_SEL_D_PD;
- _lmk04816_regs.CLKout5_ADLY_SEL = lmk04816_regs_t::CLKOUT5_ADLY_SEL_D_PD;
- }
- write_regs(2);
- write_regs(7);
- _delays.db_tx_dly_ns = coerced_delay;
- break;
- case X300_CLOCK_WHICH_DAC0:
- case X300_CLOCK_WHICH_DAC1:
- _lmk04816_regs.CLKout6_7_DDLY = ddly_value;
- _lmk04816_regs.CLKout6_7_HS = half_shift_en;
- if (adly_en) {
- _lmk04816_regs.CLKout6_ADLY_SEL = lmk04816_regs_t::CLKOUT6_ADLY_SEL_D_BOTH;
- _lmk04816_regs.CLKout7_ADLY_SEL = lmk04816_regs_t::CLKOUT7_ADLY_SEL_D_BOTH;
- _lmk04816_regs.CLKout6_7_ADLY = adly_value;
- } else {
- _lmk04816_regs.CLKout6_ADLY_SEL = lmk04816_regs_t::CLKOUT6_ADLY_SEL_D_PD;
- _lmk04816_regs.CLKout7_ADLY_SEL = lmk04816_regs_t::CLKOUT7_ADLY_SEL_D_PD;
- }
- write_regs(3);
- write_regs(7);
- _delays.dac_dly_ns = coerced_delay;
- break;
- case X300_CLOCK_WHICH_ADC0:
- case X300_CLOCK_WHICH_ADC1:
- _lmk04816_regs.CLKout8_9_DDLY = ddly_value;
- _lmk04816_regs.CLKout8_9_HS = half_shift_en;
- if (adly_en) {
- _lmk04816_regs.CLKout8_ADLY_SEL = lmk04816_regs_t::CLKOUT8_ADLY_SEL_D_BOTH;
- _lmk04816_regs.CLKout9_ADLY_SEL = lmk04816_regs_t::CLKOUT9_ADLY_SEL_D_BOTH;
- _lmk04816_regs.CLKout8_9_ADLY = adly_value;
- } else {
- _lmk04816_regs.CLKout8_ADLY_SEL = lmk04816_regs_t::CLKOUT8_ADLY_SEL_D_PD;
- _lmk04816_regs.CLKout9_ADLY_SEL = lmk04816_regs_t::CLKOUT9_ADLY_SEL_D_PD;
- }
- write_regs(4);
- write_regs(8);
- _delays.adc_dly_ns = coerced_delay;
- break;
- default:
- throw uhd::value_error("set_clock_delay: Requested source is invalid.");
+ UHD_LOG_DEBUG("X300",
+ boost::format(
+ "x300_clock_ctrl::set_clock_delay: Which=%d, Requested=%f, Digital "
+ "Taps=%d, Half Shift=%d, Analog Delay=%d (%s), Coerced Delay=%fns")
+ % which % delay_ns % ddly_value % (half_shift_en ? "ON" : "OFF")
+ % ((int)adly_value) % (adly_en ? "ON" : "OFF") % coerced_delay)
+
+ // Apply settings
+ switch (which) {
+ case X300_CLOCK_WHICH_FPGA:
+ _lmk04816_regs.CLKout0_1_DDLY = ddly_value;
+ _lmk04816_regs.CLKout0_1_HS = half_shift_en;
+ if (adly_en) {
+ _lmk04816_regs.CLKout0_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT0_ADLY_SEL_D_BOTH;
+ _lmk04816_regs.CLKout1_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT1_ADLY_SEL_D_BOTH;
+ _lmk04816_regs.CLKout0_1_ADLY = adly_value;
+ } else {
+ _lmk04816_regs.CLKout0_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT0_ADLY_SEL_D_PD;
+ _lmk04816_regs.CLKout1_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT1_ADLY_SEL_D_PD;
+ }
+ write_regs(0);
+ write_regs(6);
+ _delays.fpga_dly_ns = coerced_delay;
+ break;
+ case X300_CLOCK_WHICH_DB0_RX:
+ case X300_CLOCK_WHICH_DB1_RX:
+ _lmk04816_regs.CLKout2_3_DDLY = ddly_value;
+ _lmk04816_regs.CLKout2_3_HS = half_shift_en;
+ if (adly_en) {
+ _lmk04816_regs.CLKout2_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT2_ADLY_SEL_D_BOTH;
+ _lmk04816_regs.CLKout3_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT3_ADLY_SEL_D_BOTH;
+ _lmk04816_regs.CLKout2_3_ADLY = adly_value;
+ } else {
+ _lmk04816_regs.CLKout2_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT2_ADLY_SEL_D_PD;
+ _lmk04816_regs.CLKout3_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT3_ADLY_SEL_D_PD;
+ }
+ write_regs(1);
+ write_regs(6);
+ _delays.db_rx_dly_ns = coerced_delay;
+ break;
+ case X300_CLOCK_WHICH_DB0_TX:
+ case X300_CLOCK_WHICH_DB1_TX:
+ _lmk04816_regs.CLKout4_5_DDLY = ddly_value;
+ _lmk04816_regs.CLKout4_5_HS = half_shift_en;
+ if (adly_en) {
+ _lmk04816_regs.CLKout4_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT4_ADLY_SEL_D_BOTH;
+ _lmk04816_regs.CLKout5_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT5_ADLY_SEL_D_BOTH;
+ _lmk04816_regs.CLKout4_5_ADLY = adly_value;
+ } else {
+ _lmk04816_regs.CLKout4_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT4_ADLY_SEL_D_PD;
+ _lmk04816_regs.CLKout5_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT5_ADLY_SEL_D_PD;
+ }
+ write_regs(2);
+ write_regs(7);
+ _delays.db_tx_dly_ns = coerced_delay;
+ break;
+ case X300_CLOCK_WHICH_DAC0:
+ case X300_CLOCK_WHICH_DAC1:
+ _lmk04816_regs.CLKout6_7_DDLY = ddly_value;
+ _lmk04816_regs.CLKout6_7_HS = half_shift_en;
+ if (adly_en) {
+ _lmk04816_regs.CLKout6_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT6_ADLY_SEL_D_BOTH;
+ _lmk04816_regs.CLKout7_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT7_ADLY_SEL_D_BOTH;
+ _lmk04816_regs.CLKout6_7_ADLY = adly_value;
+ } else {
+ _lmk04816_regs.CLKout6_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT6_ADLY_SEL_D_PD;
+ _lmk04816_regs.CLKout7_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT7_ADLY_SEL_D_PD;
+ }
+ write_regs(3);
+ write_regs(7);
+ _delays.dac_dly_ns = coerced_delay;
+ break;
+ case X300_CLOCK_WHICH_ADC0:
+ case X300_CLOCK_WHICH_ADC1:
+ _lmk04816_regs.CLKout8_9_DDLY = ddly_value;
+ _lmk04816_regs.CLKout8_9_HS = half_shift_en;
+ if (adly_en) {
+ _lmk04816_regs.CLKout8_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT8_ADLY_SEL_D_BOTH;
+ _lmk04816_regs.CLKout9_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT9_ADLY_SEL_D_BOTH;
+ _lmk04816_regs.CLKout8_9_ADLY = adly_value;
+ } else {
+ _lmk04816_regs.CLKout8_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT8_ADLY_SEL_D_PD;
+ _lmk04816_regs.CLKout9_ADLY_SEL =
+ lmk04816_regs_t::CLKOUT9_ADLY_SEL_D_PD;
+ }
+ write_regs(4);
+ write_regs(8);
+ _delays.adc_dly_ns = coerced_delay;
+ break;
+ default:
+ throw uhd::value_error("set_clock_delay: Requested source is invalid.");
}
- //Delays are applied only on a sync event
- if (resync) sync_clocks();
+ // Delays are applied only on a sync event
+ if (resync)
+ sync_clocks();
return coerced_delay;
}
- double get_clock_delay(const x300_clock_which_t which) {
- switch (which)
- {
- case X300_CLOCK_WHICH_FPGA:
- return _delays.fpga_dly_ns;
- case X300_CLOCK_WHICH_DB0_RX:
- case X300_CLOCK_WHICH_DB1_RX:
- return _delays.db_rx_dly_ns;
- case X300_CLOCK_WHICH_DB0_TX:
- case X300_CLOCK_WHICH_DB1_TX:
- return _delays.db_tx_dly_ns;
- case X300_CLOCK_WHICH_DAC0:
- case X300_CLOCK_WHICH_DAC1:
- return _delays.dac_dly_ns;
- case X300_CLOCK_WHICH_ADC0:
- case X300_CLOCK_WHICH_ADC1:
- return _delays.adc_dly_ns;
- default:
- throw uhd::value_error("get_clock_delay: Requested source is invalid.");
+ double get_clock_delay(const x300_clock_which_t which)
+ {
+ switch (which) {
+ case X300_CLOCK_WHICH_FPGA:
+ return _delays.fpga_dly_ns;
+ case X300_CLOCK_WHICH_DB0_RX:
+ case X300_CLOCK_WHICH_DB1_RX:
+ return _delays.db_rx_dly_ns;
+ case X300_CLOCK_WHICH_DB0_TX:
+ case X300_CLOCK_WHICH_DB1_TX:
+ return _delays.db_tx_dly_ns;
+ case X300_CLOCK_WHICH_DAC0:
+ case X300_CLOCK_WHICH_DAC1:
+ return _delays.dac_dly_ns;
+ case X300_CLOCK_WHICH_ADC0:
+ case X300_CLOCK_WHICH_ADC1:
+ return _delays.adc_dly_ns;
+ default:
+ throw uhd::value_error("get_clock_delay: Requested source is invalid.");
}
}
private:
-
double autoset_pll2_config(const double output_freq)
{
// VCXO runs at 96MHz, assume PLL2 reference doubler is enabled
const double ref = VCXO_FREQ * 2;
const int lowest_vcodiv = static_cast<int>(std::ceil(MIN_VCO_FREQ / output_freq));
- const int highest_vcodiv = static_cast<int>(std::floor(MAX_VCO_FREQ / output_freq));
+ const int highest_vcodiv =
+ static_cast<int>(std::floor(MAX_VCO_FREQ / output_freq));
// Find the PLL2 configuration with the lowest frequency error, favoring
// higher phase comparison frequencies.
- double best_error = 1e10;
- double best_mcr = 0.0;
+ double best_error = 1e10;
+ double best_mcr = 0.0;
double best_vco_freq = _vco_freq;
- int best_N = _lmk04816_regs.PLL2_N_30;
- int best_R = _lmk04816_regs.PLL2_R_28;
+ int best_N = _lmk04816_regs.PLL2_N_30;
+ int best_R = _lmk04816_regs.PLL2_R_28;
for (int vcodiv = lowest_vcodiv; vcodiv <= highest_vcodiv; vcodiv++) {
const double try_vco_freq = vcodiv * output_freq;
// Start at R=2: with a min value of 2 for R, we don't have to worry
// about exceeding the maximum phase comparison frequency for PLL2.
- for (int r = 2; r <= 50; r++)
- {
+ for (int r = 2; r <= 50; r++) {
// Note: We could accomplish somewhat higher resolution if we change
// the N predivider to odd values as well, and we may be able to get
// better spur performance by balancing the predivider and the
@@ -449,56 +515,60 @@ private:
boost::math::round((r * try_vco_freq) / (VCXO_PLL2_N * ref)));
const double actual_mcr = (ref * VCXO_PLL2_N * n) / (vcodiv * r);
- const double error = std::abs(actual_mcr - output_freq);
+ const double error = std::abs(actual_mcr - output_freq);
if (error < best_error) {
- best_error = error;
- best_mcr = actual_mcr;
+ best_error = error;
+ best_mcr = actual_mcr;
best_vco_freq = try_vco_freq;
- best_N = n;
- best_R = r;
+ best_N = n;
+ best_R = r;
}
}
}
UHD_ASSERT_THROW(best_mcr > 0.0);
- _vco_freq = best_vco_freq;
+ _vco_freq = best_vco_freq;
_lmk04816_regs.PLL2_N_30 = best_N;
_lmk04816_regs.PLL2_R_28 = best_R;
_lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_2A;
if (fp_compare_epsilon<double>(best_error) > 0.0) {
UHD_LOGGER_WARNING("X300")
- << boost::format("Attempted master clock rate %0.2f MHz, got %0.2f MHz")
- % (output_freq / 1e6) % (best_mcr / 1e6);
+ << boost::format("Attempted master clock rate %0.2f MHz, got %0.2f MHz")
+ % (output_freq / 1e6) % (best_mcr / 1e6);
}
- UHD_LOGGER_TRACE("X300") << boost::format(
- "Using automatic LMK04816 PLL2 config: N=%d, R=%d, VCO=%0.2f MHz, MCR=%0.2f MHz")
- % _lmk04816_regs.PLL2_N_30 % _lmk04816_regs.PLL2_R_28
- % (_vco_freq / 1e6) % (best_mcr / 1e6);
+ UHD_LOGGER_TRACE("X300")
+ << boost::format("Using automatic LMK04816 PLL2 config: N=%d, R=%d, "
+ "VCO=%0.2f MHz, MCR=%0.2f MHz")
+ % _lmk04816_regs.PLL2_N_30 % _lmk04816_regs.PLL2_R_28
+ % (_vco_freq / 1e6) % (best_mcr / 1e6);
return best_mcr;
}
- void init() {
+ void init()
+ {
/* The X3xx has two primary rates. The first is the
* _system_ref_rate, which is sourced from the "clock_source"/"value" field
- * of the property tree, and whose value can be 10e6, 11.52e6, 23.04e6, or 30.72e6.
- * The _system_ref_rate is the input to the clocking system, and
- * what comes out is a disciplined master clock running at the
- * _master_clock_rate. As such, only certain combinations of
- * system reference rates and master clock rates are supported.
- * Additionally, a subset of these will operate in "zero delay" mode. */
-
- enum opmode_t { INVALID,
- m10M_200M_NOZDEL, // used for debug purposes only
- m10M_200M_ZDEL, // Normal mode
- m11_52M_184_32M_ZDEL, // LTE with 11.52 MHz ref
- m23_04M_184_32M_ZDEL, // LTE with 23.04 MHz ref
- m30_72M_184_32M_ZDEL, // LTE with external ref, aka CPRI Mode
- m10M_184_32M_NOZDEL, // LTE with 10 MHz ref
- m10M_120M_ZDEL, // NI USRP 120 MHz Clocking
- m10M_AUTO_NOZDEL }; // automatic for arbitrary clock from 10MHz ref
+ * of the property tree, and whose value can be 10e6, 11.52e6, 23.04e6,
+ * or 30.72e6. The _system_ref_rate is the input to the clocking system, and what
+ * comes out is a disciplined master clock running at the _master_clock_rate. As
+ * such, only certain combinations of system reference rates and master clock
+ * rates are supported. Additionally, a subset of these will operate in "zero
+ * delay" mode. */
+
+ enum opmode_t {
+ INVALID,
+ m10M_200M_NOZDEL, // used for debug purposes only
+ m10M_200M_ZDEL, // Normal mode
+ m11_52M_184_32M_ZDEL, // LTE with 11.52 MHz ref
+ m23_04M_184_32M_ZDEL, // LTE with 23.04 MHz ref
+ m30_72M_184_32M_ZDEL, // LTE with external ref, aka CPRI Mode
+ m10M_184_32M_NOZDEL, // LTE with 10 MHz ref
+ m10M_120M_ZDEL, // NI USRP 120 MHz Clocking
+ m10M_AUTO_NOZDEL
+ }; // automatic for arbitrary clock from 10MHz ref
/* The default clocking mode is 10MHz reference generating a 200 MHz master
* clock, in zero-delay mode. */
@@ -515,61 +585,61 @@ private:
} else if (math::frequencies_are_equal(_master_clock_rate, 120e6)) {
/* 10MHz reference, 120 MHz master clock rate, Zero Delay */
clocking_mode = m10M_120M_ZDEL;
- } else if (
- fp_compare_epsilon<double>(_master_clock_rate) >= uhd::usrp::x300::MIN_TICK_RATE
- && fp_compare_epsilon<double>(_master_clock_rate) <= uhd::usrp::x300::MAX_TICK_RATE
- ) {
+ } else if (fp_compare_epsilon<double>(_master_clock_rate)
+ >= uhd::usrp::x300::MIN_TICK_RATE
+ && fp_compare_epsilon<double>(_master_clock_rate)
+ <= uhd::usrp::x300::MAX_TICK_RATE) {
/* 10MHz reference, attempt to automatically configure PLL
* for arbitrary master clock rate, Zero Delay */
- UHD_LOGGER_WARNING("X300")
- << "Using automatic master clock PLL config. This is an experimental feature.";
+ UHD_LOGGER_WARNING("X300") << "Using automatic master clock PLL config. "
+ "This is an experimental feature.";
clocking_mode = m10M_AUTO_NOZDEL;
} else {
- throw uhd::runtime_error(str(
- boost::format("Invalid master clock rate: %.2f MHz.\n"
- "Valid master clock rates when using a %f MHz reference clock are:\n"
- "120 MHz, 184.32 MHz and 200 MHz.")
- % (_master_clock_rate / 1e6) % (_system_ref_rate / 1e6)
- ));
+ throw uhd::runtime_error(
+ str(boost::format("Invalid master clock rate: %.2f MHz.\n"
+ "Valid master clock rates when using a %f MHz "
+ "reference clock are:\n"
+ "120 MHz, 184.32 MHz and 200 MHz.")
+ % (_master_clock_rate / 1e6) % (_system_ref_rate / 1e6)));
}
} else if (math::frequencies_are_equal(_system_ref_rate, 11.52e6)) {
if (math::frequencies_are_equal(_master_clock_rate, 184.32e6)) {
/* 11.52MHz reference, 184.32 MHz master clock out, Zero Delay */
clocking_mode = m11_52M_184_32M_ZDEL;
} else {
- throw uhd::runtime_error(str(
- boost::format("Invalid master clock rate: %.2f MHz.\n"
- "Valid master clock rate when using a %.2f MHz reference clock is: 184.32 MHz.")
- % (_master_clock_rate / 1e6) % (_system_ref_rate / 1e6)
- ));
+ throw uhd::runtime_error(
+ str(boost::format("Invalid master clock rate: %.2f MHz.\n"
+ "Valid master clock rate when using a %.2f MHz "
+ "reference clock is: 184.32 MHz.")
+ % (_master_clock_rate / 1e6) % (_system_ref_rate / 1e6)));
}
} else if (math::frequencies_are_equal(_system_ref_rate, 23.04e6)) {
if (math::frequencies_are_equal(_master_clock_rate, 184.32e6)) {
/* 11.52MHz reference, 184.32 MHz master clock out, Zero Delay */
clocking_mode = m23_04M_184_32M_ZDEL;
} else {
- throw uhd::runtime_error(str(
- boost::format("Invalid master clock rate: %.2f MHz.\n"
- "Valid master clock rate when using a %.2f MHz reference clock is: 184.32 MHz.")
- % (_master_clock_rate / 1e6) % (_system_ref_rate / 1e6)
- ));
+ throw uhd::runtime_error(
+ str(boost::format("Invalid master clock rate: %.2f MHz.\n"
+ "Valid master clock rate when using a %.2f MHz "
+ "reference clock is: 184.32 MHz.")
+ % (_master_clock_rate / 1e6) % (_system_ref_rate / 1e6)));
}
} else if (math::frequencies_are_equal(_system_ref_rate, 30.72e6)) {
if (math::frequencies_are_equal(_master_clock_rate, 184.32e6)) {
/* 30.72MHz reference, 184.32 MHz master clock out, Zero Delay */
clocking_mode = m30_72M_184_32M_ZDEL;
} else {
- throw uhd::runtime_error(str(
- boost::format("Invalid master clock rate: %.2f MHz.\n"
- "Valid master clock rate when using a %.2f MHz reference clock is: 184.32 MHz.")
- % (_master_clock_rate / 1e6) % (_system_ref_rate / 1e6)
- ));
+ throw uhd::runtime_error(
+ str(boost::format("Invalid master clock rate: %.2f MHz.\n"
+ "Valid master clock rate when using a %.2f MHz "
+ "reference clock is: 184.32 MHz.")
+ % (_master_clock_rate / 1e6) % (_system_ref_rate / 1e6)));
}
} else {
- throw uhd::runtime_error(str(
- boost::format("Invalid system reference rate: %.2f MHz.\nValid reference frequencies are: 10 MHz, 30.72 MHz.")
- % (_system_ref_rate / 1e6)
- ));
+ throw uhd::runtime_error(
+ str(boost::format("Invalid system reference rate: %.2f MHz.\nValid "
+ "reference frequencies are: 10 MHz, 30.72 MHz.")
+ % (_system_ref_rate / 1e6)));
}
UHD_ASSERT_THROW(clocking_mode != INVALID);
@@ -583,29 +653,29 @@ private:
* architecture. Please refer to the datasheet for more information. */
switch (clocking_mode) {
case m10M_200M_NOZDEL:
- _vco_freq = 2400e6;
+ _vco_freq = 2400e6;
_lmk04816_regs.MODE = lmk04816_regs_t::MODE_DUAL_INT;
// PLL1 - 2 MHz compare frequency
- _lmk04816_regs.PLL1_N_28 = 48;
- _lmk04816_regs.PLL1_R_27 = 5;
+ _lmk04816_regs.PLL1_N_28 = 48;
+ _lmk04816_regs.PLL1_R_27 = 5;
_lmk04816_regs.PLL1_CP_GAIN_27 = lmk04816_regs_t::PLL1_CP_GAIN_27_100UA;
// PLL2 - 48 MHz compare frequency
- _lmk04816_regs.PLL2_N_30 = 25;
- _lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_2A;
- _lmk04816_regs.PLL2_R_28 = 4;
+ _lmk04816_regs.PLL2_N_30 = 25;
+ _lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_2A;
+ _lmk04816_regs.PLL2_R_28 = 4;
_lmk04816_regs.PLL2_CP_GAIN_26 = lmk04816_regs_t::PLL2_CP_GAIN_26_3200UA;
break;
case m10M_200M_ZDEL:
- _vco_freq = 2400e6;
+ _vco_freq = 2400e6;
_lmk04816_regs.MODE = lmk04816_regs_t::MODE_DUAL_INT_ZER_DELAY;
// PLL1 - 2 MHz compare frequency
- _lmk04816_regs.PLL1_N_28 = 5;
- _lmk04816_regs.PLL1_R_27 = 5;
+ _lmk04816_regs.PLL1_N_28 = 5;
+ _lmk04816_regs.PLL1_R_27 = 5;
_lmk04816_regs.PLL1_CP_GAIN_27 = lmk04816_regs_t::PLL1_CP_GAIN_27_1600UA;
// PLL2 - 96 MHz compare frequency
@@ -613,26 +683,28 @@ private:
_lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_5;
_lmk04816_regs.PLL2_R_28 = 2;
- if(_hw_rev <= 4)
- _lmk04816_regs.PLL2_CP_GAIN_26 = lmk04816_regs_t::PLL2_CP_GAIN_26_1600UA;
+ if (_hw_rev <= 4)
+ _lmk04816_regs.PLL2_CP_GAIN_26 =
+ lmk04816_regs_t::PLL2_CP_GAIN_26_1600UA;
else
- _lmk04816_regs.PLL2_CP_GAIN_26 = lmk04816_regs_t::PLL2_CP_GAIN_26_400UA;
+ _lmk04816_regs.PLL2_CP_GAIN_26 =
+ lmk04816_regs_t::PLL2_CP_GAIN_26_400UA;
break;
case m10M_184_32M_NOZDEL:
- _vco_freq = 2580.48e6;
+ _vco_freq = 2580.48e6;
_lmk04816_regs.MODE = lmk04816_regs_t::MODE_DUAL_INT;
// PLL1 - 2 MHz compare frequency
- _lmk04816_regs.PLL1_N_28 = 48;
- _lmk04816_regs.PLL1_R_27 = 5;
+ _lmk04816_regs.PLL1_N_28 = 48;
+ _lmk04816_regs.PLL1_R_27 = 5;
_lmk04816_regs.PLL1_CP_GAIN_27 = lmk04816_regs_t::PLL1_CP_GAIN_27_100UA;
// PLL2 - 7.68 MHz compare frequency
- _lmk04816_regs.PLL2_N_30 = 168;
- _lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_2A;
- _lmk04816_regs.PLL2_R_28 = 25;
+ _lmk04816_regs.PLL2_N_30 = 168;
+ _lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_2A;
+ _lmk04816_regs.PLL2_R_28 = 25;
_lmk04816_regs.PLL2_CP_GAIN_26 = lmk04816_regs_t::PLL2_CP_GAIN_26_3200UA;
_lmk04816_regs.PLL2_R3_LF = lmk04816_regs_t::PLL2_R3_LF_4KILO_OHM;
@@ -644,18 +716,18 @@ private:
break;
case m11_52M_184_32M_ZDEL:
- _vco_freq = 2580.48e6;
+ _vco_freq = 2580.48e6;
_lmk04816_regs.MODE = lmk04816_regs_t::MODE_DUAL_INT_ZER_DELAY;
// PLL1 - 1.92 MHz compare frequency
- _lmk04816_regs.PLL1_N_28 = 6;
- _lmk04816_regs.PLL1_R_27 = 6;
+ _lmk04816_regs.PLL1_N_28 = 6;
+ _lmk04816_regs.PLL1_R_27 = 6;
_lmk04816_regs.PLL1_CP_GAIN_27 = lmk04816_regs_t::PLL1_CP_GAIN_27_100UA;
// PLL2 - 7.68 MHz compare frequency
- _lmk04816_regs.PLL2_N_30 = 168;
- _lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_2A;
- _lmk04816_regs.PLL2_R_28 = 25;
+ _lmk04816_regs.PLL2_N_30 = 168;
+ _lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_2A;
+ _lmk04816_regs.PLL2_R_28 = 25;
_lmk04816_regs.PLL2_CP_GAIN_26 = lmk04816_regs_t::PLL2_CP_GAIN_26_3200UA;
_lmk04816_regs.PLL2_R3_LF = lmk04816_regs_t::PLL2_R3_LF_1KILO_OHM;
@@ -667,18 +739,18 @@ private:
break;
case m23_04M_184_32M_ZDEL:
- _vco_freq = 2580.48e6;
+ _vco_freq = 2580.48e6;
_lmk04816_regs.MODE = lmk04816_regs_t::MODE_DUAL_INT_ZER_DELAY;
// PLL1 - 1.92 MHz compare frequency
- _lmk04816_regs.PLL1_N_28 = 12;
- _lmk04816_regs.PLL1_R_27 = 12;
+ _lmk04816_regs.PLL1_N_28 = 12;
+ _lmk04816_regs.PLL1_R_27 = 12;
_lmk04816_regs.PLL1_CP_GAIN_27 = lmk04816_regs_t::PLL1_CP_GAIN_27_100UA;
// PLL2 - 7.68 MHz compare frequency
- _lmk04816_regs.PLL2_N_30 = 168;
- _lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_2A;
- _lmk04816_regs.PLL2_R_28 = 25;
+ _lmk04816_regs.PLL2_N_30 = 168;
+ _lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_2A;
+ _lmk04816_regs.PLL2_R_28 = 25;
_lmk04816_regs.PLL2_CP_GAIN_26 = lmk04816_regs_t::PLL2_CP_GAIN_26_3200UA;
_lmk04816_regs.PLL2_R3_LF = lmk04816_regs_t::PLL2_R3_LF_1KILO_OHM;
@@ -690,18 +762,18 @@ private:
break;
case m30_72M_184_32M_ZDEL:
- _vco_freq = 2580.48e6;
+ _vco_freq = 2580.48e6;
_lmk04816_regs.MODE = lmk04816_regs_t::MODE_DUAL_INT_ZER_DELAY;
// PLL1 - 2.048 MHz compare frequency
- _lmk04816_regs.PLL1_N_28 = 15;
- _lmk04816_regs.PLL1_R_27 = 15;
+ _lmk04816_regs.PLL1_N_28 = 15;
+ _lmk04816_regs.PLL1_R_27 = 15;
_lmk04816_regs.PLL1_CP_GAIN_27 = lmk04816_regs_t::PLL1_CP_GAIN_27_100UA;
// PLL2 - 7.68 MHz compare frequency
- _lmk04816_regs.PLL2_N_30 = 168;
- _lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_2A;
- _lmk04816_regs.PLL2_R_28 = 25;
+ _lmk04816_regs.PLL2_N_30 = 168;
+ _lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_2A;
+ _lmk04816_regs.PLL2_R_28 = 25;
_lmk04816_regs.PLL2_CP_GAIN_26 = lmk04816_regs_t::PLL2_CP_GAIN_26_3200UA;
_lmk04816_regs.PLL2_R3_LF = lmk04816_regs_t::PLL2_R3_LF_1KILO_OHM;
@@ -713,12 +785,12 @@ private:
break;
case m10M_120M_ZDEL:
- _vco_freq = 2400e6;
+ _vco_freq = 2400e6;
_lmk04816_regs.MODE = lmk04816_regs_t::MODE_DUAL_INT_ZER_DELAY;
// PLL1 - 2 MHz compare frequency
- _lmk04816_regs.PLL1_N_28 = 5;
- _lmk04816_regs.PLL1_R_27 = 5;
+ _lmk04816_regs.PLL1_N_28 = 5;
+ _lmk04816_regs.PLL1_R_27 = 5;
_lmk04816_regs.PLL1_CP_GAIN_27 = lmk04816_regs_t::PLL1_CP_GAIN_27_100UA;
// PLL2 - 96 MHz compare frequency
@@ -726,10 +798,12 @@ private:
_lmk04816_regs.PLL2_P_30 = lmk04816_regs_t::PLL2_P_30_DIV_5;
_lmk04816_regs.PLL2_R_28 = 2;
- if(_hw_rev <= 4)
- _lmk04816_regs.PLL2_CP_GAIN_26 = lmk04816_regs_t::PLL2_CP_GAIN_26_1600UA;
+ if (_hw_rev <= 4)
+ _lmk04816_regs.PLL2_CP_GAIN_26 =
+ lmk04816_regs_t::PLL2_CP_GAIN_26_1600UA;
else
- _lmk04816_regs.PLL2_CP_GAIN_26 = lmk04816_regs_t::PLL2_CP_GAIN_26_400UA;
+ _lmk04816_regs.PLL2_CP_GAIN_26 =
+ lmk04816_regs_t::PLL2_CP_GAIN_26_400UA;
break;
@@ -737,8 +811,8 @@ private:
_lmk04816_regs.MODE = lmk04816_regs_t::MODE_DUAL_INT;
// PLL1 - 2MHz compare frequency
- _lmk04816_regs.PLL1_N_28 = 48;
- _lmk04816_regs.PLL1_R_27 = 5;
+ _lmk04816_regs.PLL1_N_28 = 48;
+ _lmk04816_regs.PLL1_R_27 = 5;
_lmk04816_regs.PLL1_CP_GAIN_27 = lmk04816_regs_t::PLL1_CP_GAIN_27_100UA;
// PLL2 - this call will set _vco_freq and PLL2 P/N/R registers.
@@ -751,11 +825,11 @@ private:
break;
};
- uint16_t master_clock_div = static_cast<uint16_t>(
- std::ceil(_vco_freq / _master_clock_rate));
+ uint16_t master_clock_div =
+ static_cast<uint16_t>(std::ceil(_vco_freq / _master_clock_rate));
- uint16_t dboard_div = static_cast<uint16_t>(
- std::ceil(_vco_freq / _dboard_clock_rate));
+ uint16_t dboard_div =
+ static_cast<uint16_t>(std::ceil(_vco_freq / _dboard_clock_rate));
/* Reset the LMK clock controller. */
_lmk04816_regs.RESET = lmk04816_regs_t::RESET_RESET;
@@ -770,13 +844,13 @@ private:
this->write_regs(0);
// Register 1
- _lmk04816_regs.CLKout2_3_PD = lmk04816_regs_t::CLKOUT2_3_PD_POWER_UP;
+ _lmk04816_regs.CLKout2_3_PD = lmk04816_regs_t::CLKOUT2_3_PD_POWER_UP;
_lmk04816_regs.CLKout2_3_DIV = dboard_div;
// Register 2
- _lmk04816_regs.CLKout4_5_PD = lmk04816_regs_t::CLKOUT4_5_PD_POWER_UP;
+ _lmk04816_regs.CLKout4_5_PD = lmk04816_regs_t::CLKOUT4_5_PD_POWER_UP;
_lmk04816_regs.CLKout4_5_DIV = dboard_div;
// Register 3
- _lmk04816_regs.CLKout6_7_DIV = master_clock_div;
+ _lmk04816_regs.CLKout6_7_DIV = master_clock_div;
_lmk04816_regs.CLKout6_7_OSCin_Sel = lmk04816_regs_t::CLKOUT6_7_OSCIN_SEL_VCO;
// Register 4
_lmk04816_regs.CLKout8_9_DIV = master_clock_div;
@@ -786,39 +860,55 @@ private:
static_cast<uint16_t>(std::ceil(_vco_freq / _system_ref_rate));
// Register 6
- _lmk04816_regs.CLKout0_TYPE = lmk04816_regs_t::CLKOUT0_TYPE_LVDS; //FPGA
- _lmk04816_regs.CLKout1_TYPE = lmk04816_regs_t::CLKOUT1_TYPE_P_DOWN; //CPRI feedback clock, use LVDS
- _lmk04816_regs.CLKout2_TYPE = lmk04816_regs_t::CLKOUT2_TYPE_LVPECL_700MVPP; //DB_0_RX
- _lmk04816_regs.CLKout3_TYPE = lmk04816_regs_t::CLKOUT3_TYPE_LVPECL_700MVPP; //DB_1_RX
+ _lmk04816_regs.CLKout0_TYPE = lmk04816_regs_t::CLKOUT0_TYPE_LVDS; // FPGA
+ _lmk04816_regs.CLKout1_TYPE =
+ lmk04816_regs_t::CLKOUT1_TYPE_P_DOWN; // CPRI feedback clock, use LVDS
+ _lmk04816_regs.CLKout2_TYPE =
+ lmk04816_regs_t::CLKOUT2_TYPE_LVPECL_700MVPP; // DB_0_RX
+ _lmk04816_regs.CLKout3_TYPE =
+ lmk04816_regs_t::CLKOUT3_TYPE_LVPECL_700MVPP; // DB_1_RX
// Register 7
- _lmk04816_regs.CLKout4_TYPE = lmk04816_regs_t::CLKOUT4_TYPE_LVPECL_700MVPP; //DB_1_TX
- _lmk04816_regs.CLKout5_TYPE = lmk04816_regs_t::CLKOUT5_TYPE_LVPECL_700MVPP; //DB_0_TX
- _lmk04816_regs.CLKout6_TYPE = lmk04816_regs_t::CLKOUT6_TYPE_LVPECL_700MVPP; //DB0_DAC
- _lmk04816_regs.CLKout7_TYPE = lmk04816_regs_t::CLKOUT7_TYPE_LVPECL_700MVPP; //DB1_DAC
- _lmk04816_regs.CLKout8_TYPE = lmk04816_regs_t::CLKOUT8_TYPE_LVPECL_700MVPP; //DB0_ADC
+ _lmk04816_regs.CLKout4_TYPE =
+ lmk04816_regs_t::CLKOUT4_TYPE_LVPECL_700MVPP; // DB_1_TX
+ _lmk04816_regs.CLKout5_TYPE =
+ lmk04816_regs_t::CLKOUT5_TYPE_LVPECL_700MVPP; // DB_0_TX
+ _lmk04816_regs.CLKout6_TYPE =
+ lmk04816_regs_t::CLKOUT6_TYPE_LVPECL_700MVPP; // DB0_DAC
+ _lmk04816_regs.CLKout7_TYPE =
+ lmk04816_regs_t::CLKOUT7_TYPE_LVPECL_700MVPP; // DB1_DAC
+ _lmk04816_regs.CLKout8_TYPE =
+ lmk04816_regs_t::CLKOUT8_TYPE_LVPECL_700MVPP; // DB0_ADC
// Register 8
- _lmk04816_regs.CLKout9_TYPE = lmk04816_regs_t::CLKOUT9_TYPE_LVPECL_700MVPP; //DB1_ADC
- _lmk04816_regs.CLKout10_TYPE = lmk04816_regs_t::CLKOUT10_TYPE_LVDS; //REF_CLKOUT
- _lmk04816_regs.CLKout11_TYPE = lmk04816_regs_t::CLKOUT11_TYPE_P_DOWN; //Debug header, use LVPECL
+ _lmk04816_regs.CLKout9_TYPE =
+ lmk04816_regs_t::CLKOUT9_TYPE_LVPECL_700MVPP; // DB1_ADC
+ _lmk04816_regs.CLKout10_TYPE = lmk04816_regs_t::CLKOUT10_TYPE_LVDS; // REF_CLKOUT
+ _lmk04816_regs.CLKout11_TYPE =
+ lmk04816_regs_t::CLKOUT11_TYPE_P_DOWN; // Debug header, use LVPECL
// Register 10
- _lmk04816_regs.EN_OSCout0 = lmk04816_regs_t::EN_OSCOUT0_DISABLED; //Debug header
- _lmk04816_regs.FEEDBACK_MUX = 5; //use output 10 (REF OUT) for feedback
+ _lmk04816_regs.EN_OSCout0 = lmk04816_regs_t::EN_OSCOUT0_DISABLED; // Debug header
+ _lmk04816_regs.FEEDBACK_MUX = 5; // use output 10 (REF OUT) for feedback
_lmk04816_regs.EN_FEEDBACK_MUX = lmk04816_regs_t::EN_FEEDBACK_MUX_ENABLED;
// Register 11
// MODE set in individual cases above
_lmk04816_regs.SYNC_QUAL = lmk04816_regs_t::SYNC_QUAL_FB_MUX;
- _lmk04816_regs.EN_SYNC = lmk04816_regs_t::EN_SYNC_ENABLE;
- _lmk04816_regs.NO_SYNC_CLKout0_1 = lmk04816_regs_t::NO_SYNC_CLKOUT0_1_CLOCK_XY_SYNC;
- _lmk04816_regs.NO_SYNC_CLKout2_3 = lmk04816_regs_t::NO_SYNC_CLKOUT2_3_CLOCK_XY_SYNC;
- _lmk04816_regs.NO_SYNC_CLKout4_5 = lmk04816_regs_t::NO_SYNC_CLKOUT4_5_CLOCK_XY_SYNC;
- _lmk04816_regs.NO_SYNC_CLKout6_7 = lmk04816_regs_t::NO_SYNC_CLKOUT6_7_CLOCK_XY_SYNC;
- _lmk04816_regs.NO_SYNC_CLKout8_9 = lmk04816_regs_t::NO_SYNC_CLKOUT8_9_CLOCK_XY_SYNC;
- _lmk04816_regs.NO_SYNC_CLKout10_11 = lmk04816_regs_t::NO_SYNC_CLKOUT10_11_CLOCK_XY_SYNC;
+ _lmk04816_regs.EN_SYNC = lmk04816_regs_t::EN_SYNC_ENABLE;
+ _lmk04816_regs.NO_SYNC_CLKout0_1 =
+ lmk04816_regs_t::NO_SYNC_CLKOUT0_1_CLOCK_XY_SYNC;
+ _lmk04816_regs.NO_SYNC_CLKout2_3 =
+ lmk04816_regs_t::NO_SYNC_CLKOUT2_3_CLOCK_XY_SYNC;
+ _lmk04816_regs.NO_SYNC_CLKout4_5 =
+ lmk04816_regs_t::NO_SYNC_CLKOUT4_5_CLOCK_XY_SYNC;
+ _lmk04816_regs.NO_SYNC_CLKout6_7 =
+ lmk04816_regs_t::NO_SYNC_CLKOUT6_7_CLOCK_XY_SYNC;
+ _lmk04816_regs.NO_SYNC_CLKout8_9 =
+ lmk04816_regs_t::NO_SYNC_CLKOUT8_9_CLOCK_XY_SYNC;
+ _lmk04816_regs.NO_SYNC_CLKout10_11 =
+ lmk04816_regs_t::NO_SYNC_CLKOUT10_11_CLOCK_XY_SYNC;
_lmk04816_regs.SYNC_TYPE = lmk04816_regs_t::SYNC_TYPE_INPUT;
// Register 12
@@ -826,14 +916,18 @@ private:
/* Input Clock Configurations */
// Register 13
- _lmk04816_regs.EN_CLKin0 = lmk04816_regs_t::EN_CLKIN0_NO_VALID_USE; // This is not connected
- _lmk04816_regs.EN_CLKin2 = lmk04816_regs_t::EN_CLKIN2_NO_VALID_USE; // Used only for CPRI
+ _lmk04816_regs.EN_CLKin0 =
+ lmk04816_regs_t::EN_CLKIN0_NO_VALID_USE; // This is not connected
+ _lmk04816_regs.EN_CLKin2 =
+ lmk04816_regs_t::EN_CLKIN2_NO_VALID_USE; // Used only for CPRI
_lmk04816_regs.Status_CLKin1_MUX = lmk04816_regs_t::STATUS_CLKIN1_MUX_UWIRE_RB;
_lmk04816_regs.CLKin_Select_MODE = lmk04816_regs_t::CLKIN_SELECT_MODE_CLKIN1_MAN;
- _lmk04816_regs.HOLDOVER_MUX = lmk04816_regs_t::HOLDOVER_MUX_PLL1_R;
+ _lmk04816_regs.HOLDOVER_MUX = lmk04816_regs_t::HOLDOVER_MUX_PLL1_R;
// Register 14
- _lmk04816_regs.Status_CLKin1_TYPE = lmk04816_regs_t::STATUS_CLKIN1_TYPE_OUT_PUSH_PULL;
- _lmk04816_regs.Status_CLKin0_TYPE = lmk04816_regs_t::STATUS_CLKIN0_TYPE_OUT_PUSH_PULL;
+ _lmk04816_regs.Status_CLKin1_TYPE =
+ lmk04816_regs_t::STATUS_CLKIN1_TYPE_OUT_PUSH_PULL;
+ _lmk04816_regs.Status_CLKin0_TYPE =
+ lmk04816_regs_t::STATUS_CLKIN0_TYPE_OUT_PUSH_PULL;
// Register 26
// PLL2_CP_GAIN_26 set above in individual cases
@@ -848,7 +942,8 @@ private:
// PLL1_N_28 and PLL2_R_28 are set in the individual cases above
// Register 29
- _lmk04816_regs.PLL2_N_CAL_29 = _lmk04816_regs.PLL2_N_30; // N_CAL should always match N
+ _lmk04816_regs.PLL2_N_CAL_29 =
+ _lmk04816_regs.PLL2_N_30; // N_CAL should always match N
_lmk04816_regs.OSCin_FREQ_29 = lmk04816_regs_t::OSCIN_FREQ_29_63_TO_127MHZ;
// Register 30
@@ -861,12 +956,18 @@ private:
_delays = X300_REV0_6_CLK_DELAYS;
}
- //Apply delay values
- set_clock_delay(X300_CLOCK_WHICH_FPGA, _delays.fpga_dly_ns, false);
- set_clock_delay(X300_CLOCK_WHICH_DB0_RX, _delays.db_rx_dly_ns, false); //Sets both Ch0 and Ch1
- set_clock_delay(X300_CLOCK_WHICH_DB0_TX, _delays.db_tx_dly_ns, false); //Sets both Ch0 and Ch1
- set_clock_delay(X300_CLOCK_WHICH_ADC0, _delays.adc_dly_ns, false); //Sets both Ch0 and Ch1
- set_clock_delay(X300_CLOCK_WHICH_DAC0, _delays.dac_dly_ns, false); //Sets both Ch0 and Ch1
+ // Apply delay values
+ set_clock_delay(X300_CLOCK_WHICH_FPGA, _delays.fpga_dly_ns, false);
+ set_clock_delay(X300_CLOCK_WHICH_DB0_RX,
+ _delays.db_rx_dly_ns,
+ false); // Sets both Ch0 and Ch1
+ set_clock_delay(X300_CLOCK_WHICH_DB0_TX,
+ _delays.db_tx_dly_ns,
+ false); // Sets both Ch0 and Ch1
+ set_clock_delay(
+ X300_CLOCK_WHICH_ADC0, _delays.adc_dly_ns, false); // Sets both Ch0 and Ch1
+ set_clock_delay(
+ X300_CLOCK_WHICH_DAC0, _delays.dac_dly_ns, false); // Sets both Ch0 and Ch1
/* Write the configuration values into the LMK */
for (uint8_t i = 1; i <= 16; ++i) {
@@ -879,24 +980,25 @@ private:
this->sync_clocks();
}
- const spi_iface::sptr _spiface;
- const int _slaveno;
- const size_t _hw_rev;
+ const spi_iface::sptr _spiface;
+ const int _slaveno;
+ const size_t _hw_rev;
// This is technically constant, but it can be coerced during initialization
- double _master_clock_rate;
- const double _dboard_clock_rate;
- const double _system_ref_rate;
- lmk04816_regs_t _lmk04816_regs;
- double _vco_freq;
- x300_clk_delays _delays;
+ double _master_clock_rate;
+ const double _dboard_clock_rate;
+ const double _system_ref_rate;
+ lmk04816_regs_t _lmk04816_regs;
+ double _vco_freq;
+ x300_clk_delays _delays;
};
x300_clock_ctrl::sptr x300_clock_ctrl::make(uhd::spi_iface::sptr spiface,
- const size_t slaveno,
- const size_t hw_rev,
- const double master_clock_rate,
- const double dboard_clock_rate,
- const double system_ref_rate) {
- return sptr(new x300_clock_ctrl_impl(spiface, slaveno, hw_rev,
- master_clock_rate, dboard_clock_rate, system_ref_rate));
+ const size_t slaveno,
+ const size_t hw_rev,
+ const double master_clock_rate,
+ const double dboard_clock_rate,
+ const double system_ref_rate)
+{
+ return sptr(new x300_clock_ctrl_impl(
+ spiface, slaveno, hw_rev, master_clock_rate, dboard_clock_rate, system_ref_rate));
}
diff --git a/host/lib/usrp/x300/x300_clock_ctrl.hpp b/host/lib/usrp/x300/x300_clock_ctrl.hpp
index 3ab8b45f9..609464ca0 100644
--- a/host/lib/usrp/x300/x300_clock_ctrl.hpp
+++ b/host/lib/usrp/x300/x300_clock_ctrl.hpp
@@ -13,8 +13,7 @@
#include <boost/utility.hpp>
-enum x300_clock_which_t
-{
+enum x300_clock_which_t {
X300_CLOCK_WHICH_ADC0,
X300_CLOCK_WHICH_ADC1,
X300_CLOCK_WHICH_DAC0,
@@ -29,17 +28,16 @@ enum x300_clock_which_t
class x300_clock_ctrl : boost::noncopyable
{
public:
-
typedef boost::shared_ptr<x300_clock_ctrl> sptr;
virtual ~x300_clock_ctrl(void) = 0;
static sptr make(uhd::spi_iface::sptr spiface,
- const size_t slaveno,
- const size_t hw_rev,
- const double master_clock_rate,
- const double dboard_clock_rate,
- const double system_ref_rate);
+ const size_t slaveno,
+ const size_t hw_rev,
+ const double master_clock_rate,
+ const double dboard_clock_rate,
+ const double system_ref_rate);
/*! Get the master clock rate of the device.
* \return the clock frequency in Hz
@@ -78,7 +76,8 @@ public:
* \param enable true=enable, false=disable
* \return a list of clock rates in Hz
*/
- virtual void enable_dboard_clock(const x300_clock_which_t which, const bool enable) = 0;
+ virtual void enable_dboard_clock(
+ const x300_clock_which_t which, const bool enable) = 0;
/*! Turn the reference output on/off
* \param true = on, false = off
@@ -92,7 +91,9 @@ public:
* \return the actual delay value set
* \throw exception when which invalid or delay_ns out of range
*/
- virtual double set_clock_delay(const x300_clock_which_t which, const double delay_ns, const bool resync = true) = 0;
+ virtual double set_clock_delay(const x300_clock_which_t which,
+ const double delay_ns,
+ const bool resync = true) = 0;
/*! Get the clock delay for the given clock divider.
* \param which which clock
diff --git a/host/lib/usrp/x300/x300_dac_ctrl.cpp b/host/lib/usrp/x300/x300_dac_ctrl.cpp
index a9df96002..f951a44a2 100644
--- a/host/lib/usrp/x300/x300_dac_ctrl.cpp
+++ b/host/lib/usrp/x300/x300_dac_ctrl.cpp
@@ -7,11 +7,11 @@
#include "x300_dac_ctrl.hpp"
#include "x300_regs.hpp"
-#include <uhdlib/utils/system_time.hpp>
+#include <uhd/exception.hpp>
#include <uhd/types/time_spec.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/safe_call.hpp>
-#include <uhd/exception.hpp>
+#include <uhdlib/utils/system_time.hpp>
#include <boost/format.hpp>
#include <chrono>
#include <thread>
@@ -22,10 +22,12 @@ using namespace uhd;
#define write_ad9146_reg(addr, data) \
_iface->write_spi(_slaveno, spi_config_t::EDGE_RISE, ((addr) << 8) | (data), 16)
-#define read_ad9146_reg(addr) \
- (_iface->read_spi(_slaveno, spi_config_t::EDGE_RISE, ((addr) << 8) | (1 << 15), 16) & 0xff)
+#define read_ad9146_reg(addr) \
+ (_iface->read_spi(_slaveno, spi_config_t::EDGE_RISE, ((addr) << 8) | (1 << 15), 16) \
+ & 0xff)
-x300_dac_ctrl::~x300_dac_ctrl(void){
+x300_dac_ctrl::~x300_dac_ctrl(void)
+{
/* NOP */
}
@@ -35,38 +37,41 @@ x300_dac_ctrl::~x300_dac_ctrl(void){
class x300_dac_ctrl_impl : public x300_dac_ctrl
{
public:
- x300_dac_ctrl_impl(uhd::spi_iface::sptr iface, const size_t slaveno, const double refclk):
- _iface(iface), _slaveno(static_cast<int>(slaveno)), _refclk(refclk)
+ x300_dac_ctrl_impl(
+ uhd::spi_iface::sptr iface, const size_t slaveno, const double refclk)
+ : _iface(iface), _slaveno(static_cast<int>(slaveno)), _refclk(refclk)
{
- //Power up all DAC subsystems
- write_ad9146_reg(0x01, 0x10); //Up: I DAC, Q DAC, Receiver, Voltage Ref, Clocks
- write_ad9146_reg(0x02, 0x00); //No extended delays. Up: Voltage Ref, PLL, DAC, FIFO, Filters
+ // Power up all DAC subsystems
+ write_ad9146_reg(0x01, 0x10); // Up: I DAC, Q DAC, Receiver, Voltage Ref, Clocks
+ write_ad9146_reg(
+ 0x02, 0x00); // No extended delays. Up: Voltage Ref, PLL, DAC, FIFO, Filters
reset();
}
~x300_dac_ctrl_impl(void)
{
- UHD_SAFE_CALL
- (
- //Power down all DAC subsystems
- write_ad9146_reg(0x01, 0xEF); //Down: I DAC, Q DAC, Receiver, Voltage Ref, Clocks
- write_ad9146_reg(0x02, 0x1F); //No extended delays. Down: Voltage Ref, PLL, DAC, FIFO, Filters
+ UHD_SAFE_CALL(
+ // Power down all DAC subsystems
+ write_ad9146_reg(
+ 0x01, 0xEF); // Down: I DAC, Q DAC, Receiver, Voltage Ref, Clocks
+ write_ad9146_reg(0x02,
+ 0x1F); // No extended delays. Down: Voltage Ref, PLL, DAC, FIFO, Filters
)
}
void reset()
{
- //ADI recommendations:
+ // ADI recommendations:
//- soft reset the chip before configuration
//- put the chip in sleep mode during configuration and wake it up when done
//- configure synchronization settings when sleeping
_soft_reset();
_sleep_mode(true);
_init();
- //We run backend sync regardless of whether we need to sync multiple DACs
- //because we use the internal DAC FIFO to meet system synchronous timing
- //and we need to guarantee that the FIFO is not empty.
+ // We run backend sync regardless of whether we need to sync multiple DACs
+ // because we use the internal DAC FIFO to meet system synchronous timing
+ // and we need to guarantee that the FIFO is not empty.
_backend_sync();
_sleep_mode(false);
}
@@ -78,20 +83,20 @@ public:
_check_pll();
_check_dac_sync();
return;
- } catch (...) {}
+ } catch (...) {
+ }
std::string err_str;
// Try 3 times to sync before giving up
- for (size_t retries = 0; retries < 3; retries++)
- {
+ for (size_t retries = 0; retries < 3; retries++) {
try {
_sleep_mode(true);
_init();
_backend_sync();
_sleep_mode(false);
return;
- } catch (const uhd::runtime_error &e) {
+ } catch (const uhd::runtime_error& e) {
err_str = e.what();
}
}
@@ -114,23 +119,23 @@ public:
//
void _init()
{
- write_ad9146_reg(0x1e, 0x01); //Datasheet: "Set 1 for proper operation"
- write_ad9146_reg(0x06, 0xFF); //Clear all event flags
+ write_ad9146_reg(0x1e, 0x01); // Datasheet: "Set 1 for proper operation"
+ write_ad9146_reg(0x06, 0xFF); // Clear all event flags
// Calculate N0 to be VCO friendly.
// Aim for VCO between 1 and 2GHz, assert otherwise.
const int N1 = 4;
int N0_val, N0;
- for (N0_val = 0; N0_val < 3; N0_val++)
- {
- N0 = (1 << N0_val); //1, 2, 4
- if ((_refclk * N0 * N1) >= 1e9) break;
+ for (N0_val = 0; N0_val < 3; N0_val++) {
+ N0 = (1 << N0_val); // 1, 2, 4
+ if ((_refclk * N0 * N1) >= 1e9)
+ break;
}
UHD_ASSERT_THROW((_refclk * N0 * N1) >= 1e9);
UHD_ASSERT_THROW((_refclk * N0 * N1) <= 2e9);
// Start PLL
- write_ad9146_reg(0x06, 0xC0); //Clear PLL event flags
+ write_ad9146_reg(0x06, 0xC0); // Clear PLL event flags
write_ad9146_reg(0x0C, 0xD1); // Narrow PLL loop filter, Midrange charge pump.
write_ad9146_reg(0x0D, 0xD1 | (N0_val << 2)); // N1=4, N2=16, N0 as calculated
write_ad9146_reg(0x0A, 0xCF); // Auto init VCO band training as per datasheet
@@ -149,7 +154,7 @@ public:
// - First transaction goes into low bits
// - Second transaction goes into high bits
// therefore, we want Q to go first (bit 6 == 1)
- write_ad9146_reg(0x03, (1 << 6)); //2s comp, i first, byte mode
+ write_ad9146_reg(0x03, (1 << 6)); // 2s comp, i first, byte mode
// Configure interpolation filters
write_ad9146_reg(0x1C, 0x00); // Configure HB1
@@ -165,31 +170,33 @@ public:
//
void _backend_sync(void)
{
- write_ad9146_reg(0x10, 0x40); // Disable SYNC mode to reset state machines.
+ write_ad9146_reg(0x10, 0x40); // Disable SYNC mode to reset state machines.
- //SYNC Settings:
+ // SYNC Settings:
//- SYNC = Enabled
//- Data Rate Mode: Synchronize at the rate at which data is consumed and not at
// the granularity of the FIFO
//- Falling edge sync: For the X300, DACCLK is generated using RefClk. Within the
// DAC, the RefClk is sampled by DACCLK to sync interpolation
// stages across multiple DACs. To ensure that we capture the
- // RefClk when it is not transitioning, we sample on the falling
- // edge of DACCLK
+ // RefClk when it is not transitioning, we sample on the
+ // falling edge of DACCLK
//- Averaging = MAX
- write_ad9146_reg(0x10, 0xC7); // Enable SYNC mode. Falling edge sync. Averaging set to 128.
+ write_ad9146_reg(
+ 0x10, 0xC7); // Enable SYNC mode. Falling edge sync. Averaging set to 128.
- //Wait for backend SYNC state machine to lock before proceeding. This guarantees that the
- //inputs and output of the FIFO have synchronized clocks
+ // Wait for backend SYNC state machine to lock before proceeding. This guarantees
+ // that the inputs and output of the FIFO have synchronized clocks
_check_dac_sync();
- //FIFO write pointer offset
- //One of ADI's requirements to use data-rate synchronization in PLL mode is to meet
- //setup and hold times for RefClk -> DCI clock which we *do not* currently meet in
- //the FPGA. The DCI clock reaches a full RefClk cycle later which results in the
- //FIFO popping before the first push. This results in a steady-state FIFO fullness
- //of pointer - 1. To reach the optimal FIFO fullness of 4 we set the pointer to 5.
- //FIXME: At some point we should meet timing on this interface
+ // FIFO write pointer offset
+ // One of ADI's requirements to use data-rate synchronization in PLL mode is to
+ // meet setup and hold times for RefClk -> DCI clock which we *do not* currently
+ // meet in the FPGA. The DCI clock reaches a full RefClk cycle later which results
+ // in the FIFO popping before the first push. This results in a steady-state FIFO
+ // fullness of pointer - 1. To reach the optimal FIFO fullness of 4 we set the
+ // pointer to 5.
+ // FIXME: At some point we should meet timing on this interface
write_ad9146_reg(0x17, 0x05);
// We are requesting a soft FIFO align just to put the FIFO
@@ -204,22 +211,23 @@ public:
//
void _check_pll()
{
- //Clear PLL event flags
+ // Clear PLL event flags
write_ad9146_reg(0x06, 0xC0);
// Verify PLL is Locked. 1 sec timeout.
// NOTE: Data sheet inconsistent about which pins give PLL lock status. FIXME!
const time_spec_t exit_time = uhd::get_system_time() + time_spec_t(1.0);
- while (true)
- {
+ while (true) {
const size_t reg_e = read_ad9146_reg(0x0E); // PLL Status (Expect bit 7 = 1)
- const size_t reg_6 = read_ad9146_reg(0x06); // Event Flags (Expect bit 7 = 0 and bit 6 = 1)
+ const size_t reg_6 =
+ read_ad9146_reg(0x06); // Event Flags (Expect bit 7 = 0 and bit 6 = 1)
if ((((reg_e >> 7) & 0x1) == 0x1) && (((reg_6 >> 6) & 0x3) == 0x1))
break;
if (exit_time < uhd::get_system_time())
- throw uhd::runtime_error("x300_dac_ctrl: timeout waiting for DAC PLL to lock");
- if (reg_6 & (1 << 7)) // Lock lost?
- write_ad9146_reg(0x06, 0xC0); // Clear PLL event flags
+ throw uhd::runtime_error(
+ "x300_dac_ctrl: timeout waiting for DAC PLL to lock");
+ if (reg_6 & (1 << 7)) // Lock lost?
+ write_ad9146_reg(0x06, 0xC0); // Clear PLL event flags
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
@@ -234,21 +242,25 @@ public:
write_ad9146_reg(0x12, 0x00);
const time_spec_t exit_time = uhd::get_system_time() + time_spec_t(1.0);
- while (true)
- {
- std::this_thread::sleep_for(std::chrono::milliseconds(1)); // wait for sync to complete
- const size_t reg_12 = read_ad9146_reg(0x12); // Sync Status (Expect bit 7 = 0, bit 6 = 1)
- const size_t reg_6 = read_ad9146_reg(0x06); // Event Flags (Expect bit 5 = 0 and bit 4 = 1)
+ while (true) {
+ std::this_thread::sleep_for(
+ std::chrono::milliseconds(1)); // wait for sync to complete
+ const size_t reg_12 =
+ read_ad9146_reg(0x12); // Sync Status (Expect bit 7 = 0, bit 6 = 1)
+ const size_t reg_6 =
+ read_ad9146_reg(0x06); // Event Flags (Expect bit 5 = 0 and bit 4 = 1)
if ((((reg_12 >> 6) & 0x3) == 0x1) && (((reg_6 >> 4) & 0x3) == 0x1))
break;
if (exit_time < uhd::get_system_time())
- throw uhd::runtime_error("x300_dac_ctrl: timeout waiting for backend synchronization");
+ throw uhd::runtime_error(
+ "x300_dac_ctrl: timeout waiting for backend synchronization");
if (reg_6 & (1 << 5))
- write_ad9146_reg(0x06, 0x30); // Clear Sync event flags
+ write_ad9146_reg(0x06, 0x30); // Clear Sync event flags
#ifdef X300_DAC_RETRY_BACKEND_SYNC
- if (reg_12 & (1 << 7)) { // Sync acquired and lost?
- write_ad9146_reg(0x10, 0xC7); // Enable SYNC mode. Falling edge sync. Averaging set to 128.
- write_ad9146_reg(0x12, 0x00); // Clear Sync event flags
+ if (reg_12 & (1 << 7)) { // Sync acquired and lost?
+ write_ad9146_reg(0x10,
+ 0xC7); // Enable SYNC mode. Falling edge sync. Averaging set to 128.
+ write_ad9146_reg(0x12, 0x00); // Clear Sync event flags
}
#endif
}
@@ -262,7 +274,11 @@ public:
// Register 0x19 has a thermometer indicator of the FIFO depth
const size_t reg_19 = read_ad9146_reg(0x19);
if ((reg_19 & 0xFF) != 0xF) {
- std::string msg((boost::format("x300_dac_ctrl: front-end sync failed. unexpected FIFO depth [0x%x]") % (reg_19 & 0xFF)).str());
+ std::string msg(
+ (boost::format(
+ "x300_dac_ctrl: front-end sync failed. unexpected FIFO depth [0x%x]")
+ % (reg_19 & 0xFF))
+ .str());
if (failure_is_fatal) {
throw uhd::runtime_error(msg);
} else {
@@ -273,10 +289,10 @@ public:
void _sleep_mode(bool sleep)
{
- uint8_t sleep_val = sleep ? (1<<7) : 0x00;
- //Set sleep word and default fullscale value
- write_ad9146_reg(0x41, sleep_val | 0x01); //I DAC
- write_ad9146_reg(0x45, sleep_val | 0x01); //Q DAC
+ uint8_t sleep_val = sleep ? (1 << 7) : 0x00;
+ // Set sleep word and default fullscale value
+ write_ad9146_reg(0x41, sleep_val | 0x01); // I DAC
+ write_ad9146_reg(0x45, sleep_val | 0x01); // Q DAC
}
void _soft_reset()
@@ -294,7 +310,8 @@ private:
/***********************************************************************
* Public make function for the DAC control
**********************************************************************/
-x300_dac_ctrl::sptr x300_dac_ctrl::make(uhd::spi_iface::sptr iface, const size_t slaveno, const double clock_rate)
+x300_dac_ctrl::sptr x300_dac_ctrl::make(
+ uhd::spi_iface::sptr iface, const size_t slaveno, const double clock_rate)
{
return sptr(new x300_dac_ctrl_impl(iface, slaveno, clock_rate));
}
diff --git a/host/lib/usrp/x300/x300_dac_ctrl.hpp b/host/lib/usrp/x300/x300_dac_ctrl.hpp
index 0ef99011b..74dba0cb4 100644
--- a/host/lib/usrp/x300/x300_dac_ctrl.hpp
+++ b/host/lib/usrp/x300/x300_dac_ctrl.hpp
@@ -25,7 +25,8 @@ public:
* \param spiface the interface to spi
* \return a new codec control object
*/
- static sptr make(uhd::spi_iface::sptr iface, const size_t slaveno, const double clock_rate);
+ static sptr make(
+ uhd::spi_iface::sptr iface, const size_t slaveno, const double clock_rate);
// ! Reset the DAC
virtual void reset(void) = 0;
diff --git a/host/lib/usrp/x300/x300_dboard_iface.cpp b/host/lib/usrp/x300/x300_dboard_iface.cpp
index 6986ee8ab..36e430985 100644
--- a/host/lib/usrp/x300/x300_dboard_iface.cpp
+++ b/host/lib/usrp/x300/x300_dboard_iface.cpp
@@ -18,14 +18,13 @@ using namespace boost::assign;
/***********************************************************************
* Structors
**********************************************************************/
-x300_dboard_iface::x300_dboard_iface(const x300_dboard_iface_config_t &config):
- _config(config)
+x300_dboard_iface::x300_dboard_iface(const x300_dboard_iface_config_t& config)
+ : _config(config)
{
- //reset the aux dacs
+ // reset the aux dacs
_dac_regs[UNIT_RX] = ad5623_regs_t();
_dac_regs[UNIT_TX] = ad5623_regs_t();
- for(unit_t unit: _dac_regs.keys())
- {
+ for (unit_t unit : _dac_regs.keys()) {
_dac_regs[unit].data = 1;
_dac_regs[unit].addr = ad5623_regs_t::ADDR_ALL;
_dac_regs[unit].cmd = ad5623_regs_t::CMD_RESET;
@@ -41,11 +40,8 @@ x300_dboard_iface::x300_dboard_iface(const x300_dboard_iface_config_t &config):
x300_dboard_iface::~x300_dboard_iface(void)
{
- UHD_SAFE_CALL
- (
- this->set_clock_enabled(UNIT_RX, false);
- this->set_clock_enabled(UNIT_TX, false);
- )
+ UHD_SAFE_CALL(this->set_clock_enabled(UNIT_RX, false);
+ this->set_clock_enabled(UNIT_TX, false);)
}
/***********************************************************************
@@ -53,14 +49,14 @@ x300_dboard_iface::~x300_dboard_iface(void)
**********************************************************************/
void x300_dboard_iface::set_clock_rate(unit_t unit, double rate)
{
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
// Just return if the requested rate is already set
if (std::abs(_clock_rates[unit] - rate) < std::numeric_limits<double>::epsilon())
return;
- switch(unit)
- {
+ switch (unit) {
case UNIT_RX:
_config.clock->set_dboard_rate(_config.which_rx_clk, rate);
break;
@@ -70,20 +66,21 @@ void x300_dboard_iface::set_clock_rate(unit_t unit, double rate)
default:
UHD_THROW_INVALID_CODE_PATH();
}
- _clock_rates[unit] = rate; //set to shadow
+ _clock_rates[unit] = rate; // set to shadow
}
double x300_dboard_iface::get_clock_rate(unit_t unit)
{
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
- return _clock_rates[unit]; //get from shadow
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
+ return _clock_rates[unit]; // get from shadow
}
std::vector<double> x300_dboard_iface::get_clock_rates(unit_t unit)
{
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
- switch(unit)
- {
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
+ switch (unit) {
case UNIT_RX:
return _config.clock->get_dboard_rates(_config.which_rx_clk);
case UNIT_TX:
@@ -95,9 +92,9 @@ std::vector<double> x300_dboard_iface::get_clock_rates(unit_t unit)
void x300_dboard_iface::set_clock_enabled(unit_t unit, bool enb)
{
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
- switch(unit)
- {
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
+ switch (unit) {
case UNIT_RX:
return _config.clock->enable_dboard_clock(_config.which_rx_clk, enb);
case UNIT_TX:
@@ -109,7 +106,8 @@ void x300_dboard_iface::set_clock_enabled(unit_t unit, bool enb)
double x300_dboard_iface::get_codec_rate(unit_t unit)
{
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
return _config.clock->get_master_clock_rate();
}
@@ -126,7 +124,8 @@ uint32_t x300_dboard_iface::get_pin_ctrl(unit_t unit)
return _config.gpio->get_pin_ctrl(unit);
}
-void x300_dboard_iface::set_atr_reg(unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask)
+void x300_dboard_iface::set_atr_reg(
+ unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask)
{
_config.gpio->set_atr_reg(unit, reg, value, mask);
}
@@ -165,34 +164,33 @@ uint32_t x300_dboard_iface::read_gpio(unit_t unit)
* SPI
**********************************************************************/
void x300_dboard_iface::write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
-){
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits)
+{
uint32_t slave = 0;
- if (unit == UNIT_TX) slave |= _config.tx_spi_slaveno;
- if (unit == UNIT_RX) slave |= _config.rx_spi_slaveno;
+ if (unit == UNIT_TX)
+ slave |= _config.tx_spi_slaveno;
+ if (unit == UNIT_RX)
+ slave |= _config.rx_spi_slaveno;
_config.spi->write_spi(int(slave), config, data, num_bits);
}
uint32_t x300_dboard_iface::read_write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
-){
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits)
+{
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
return _config.spi->read_spi(
- (unit==dboard_iface::UNIT_TX)?_config.tx_spi_slaveno:_config.rx_spi_slaveno,
- config, data, num_bits);
+ (unit == dboard_iface::UNIT_TX) ? _config.tx_spi_slaveno : _config.rx_spi_slaveno,
+ config,
+ data,
+ num_bits);
}
/***********************************************************************
* I2C
**********************************************************************/
-void x300_dboard_iface::write_i2c(uint16_t addr, const byte_vector_t &bytes)
+void x300_dboard_iface::write_i2c(uint16_t addr, const byte_vector_t& bytes)
{
return _config.i2c->write_i2c(addr, bytes);
}
@@ -207,76 +205,67 @@ byte_vector_t x300_dboard_iface::read_i2c(uint16_t addr, size_t num_bytes)
**********************************************************************/
void x300_dboard_iface::_write_aux_dac(unit_t unit)
{
- static const uhd::dict<unit_t, int> unit_to_spi_dac = map_list_of
- (UNIT_RX, DB_RX_LSDAC_SEN)
- (UNIT_TX, DB_TX_LSDAC_SEN)
- ;
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+ static const uhd::dict<unit_t, int> unit_to_spi_dac =
+ map_list_of(UNIT_RX, DB_RX_LSDAC_SEN)(UNIT_TX, DB_TX_LSDAC_SEN);
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
_config.spi->write_spi(
- unit_to_spi_dac[unit], spi_config_t::EDGE_FALL,
- _dac_regs[unit].get_reg(), 24
- );
+ unit_to_spi_dac[unit], spi_config_t::EDGE_FALL, _dac_regs[unit].get_reg(), 24);
}
void x300_dboard_iface::write_aux_dac(unit_t unit, aux_dac_t which, double value)
{
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
- _dac_regs[unit].data = boost::math::iround(4095*value/3.3);
- _dac_regs[unit].cmd = ad5623_regs_t::CMD_WR_UP_DAC_CHAN_N;
+ _dac_regs[unit].data = boost::math::iround(4095 * value / 3.3);
+ _dac_regs[unit].cmd = ad5623_regs_t::CMD_WR_UP_DAC_CHAN_N;
typedef uhd::dict<aux_dac_t, ad5623_regs_t::addr_t> aux_dac_to_addr;
- static const uhd::dict<unit_t, aux_dac_to_addr> unit_to_which_to_addr = map_list_of
- (UNIT_RX, map_list_of
- (AUX_DAC_A, ad5623_regs_t::ADDR_DAC_A)
- (AUX_DAC_B, ad5623_regs_t::ADDR_DAC_B)
- (AUX_DAC_C, ad5623_regs_t::ADDR_DAC_B)
- (AUX_DAC_D, ad5623_regs_t::ADDR_DAC_A)
- )
- (UNIT_TX, map_list_of
- (AUX_DAC_A, ad5623_regs_t::ADDR_DAC_A)
- (AUX_DAC_B, ad5623_regs_t::ADDR_DAC_B)
- (AUX_DAC_C, ad5623_regs_t::ADDR_DAC_B)
- (AUX_DAC_D, ad5623_regs_t::ADDR_DAC_A)
- )
- ;
+ static const uhd::dict<unit_t, aux_dac_to_addr> unit_to_which_to_addr =
+ map_list_of(UNIT_RX,
+ map_list_of(AUX_DAC_A, ad5623_regs_t::ADDR_DAC_A)(AUX_DAC_B,
+ ad5623_regs_t::ADDR_DAC_B)(AUX_DAC_C, ad5623_regs_t::ADDR_DAC_B)(
+ AUX_DAC_D, ad5623_regs_t::ADDR_DAC_A))(UNIT_TX,
+ map_list_of(AUX_DAC_A, ad5623_regs_t::ADDR_DAC_A)(AUX_DAC_B,
+ ad5623_regs_t::ADDR_DAC_B)(AUX_DAC_C, ad5623_regs_t::ADDR_DAC_B)(
+ AUX_DAC_D, ad5623_regs_t::ADDR_DAC_A));
_dac_regs[unit].addr = unit_to_which_to_addr[unit][which];
this->_write_aux_dac(unit);
}
double x300_dboard_iface::read_aux_adc(unit_t unit, aux_adc_t which)
{
- static const uhd::dict<unit_t, int> unit_to_spi_adc = map_list_of
- (UNIT_RX, DB_RX_LSADC_SEN)
- (UNIT_TX, DB_TX_LSADC_SEN)
- ;
+ static const uhd::dict<unit_t, int> unit_to_spi_adc =
+ map_list_of(UNIT_RX, DB_RX_LSADC_SEN)(UNIT_TX, DB_TX_LSADC_SEN);
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
- //setup spi config args
+ // setup spi config args
spi_config_t config;
config.mosi_edge = spi_config_t::EDGE_FALL;
config.miso_edge = spi_config_t::EDGE_RISE;
- //setup the spi registers
+ // setup the spi registers
ad7922_regs_t ad7922_regs;
- switch(which){
- case AUX_ADC_A: ad7922_regs.mod = 0; break;
- case AUX_ADC_B: ad7922_regs.mod = 1; break;
- } ad7922_regs.chn = ad7922_regs.mod; //normal mode: mod == chn
+ switch (which) {
+ case AUX_ADC_A:
+ ad7922_regs.mod = 0;
+ break;
+ case AUX_ADC_B:
+ ad7922_regs.mod = 1;
+ break;
+ }
+ ad7922_regs.chn = ad7922_regs.mod; // normal mode: mod == chn
- //write and read spi
- _config.spi->write_spi(
- unit_to_spi_adc[unit], config,
- ad7922_regs.get_reg(), 16
- );
- ad7922_regs.set_reg(uint16_t(_config.spi->read_spi(
- unit_to_spi_adc[unit], config,
- ad7922_regs.get_reg(), 16
- )));
-
- //convert to voltage and return
- return 3.3*ad7922_regs.result/4095;
+ // write and read spi
+ _config.spi->write_spi(unit_to_spi_adc[unit], config, ad7922_regs.get_reg(), 16);
+ ad7922_regs.set_reg(uint16_t(
+ _config.spi->read_spi(unit_to_spi_adc[unit], config, ad7922_regs.get_reg(), 16)));
+
+ // convert to voltage and return
+ return 3.3 * ad7922_regs.result / 4095;
}
uhd::time_spec_t x300_dboard_iface::get_command_time()
@@ -290,15 +279,13 @@ void x300_dboard_iface::set_command_time(const uhd::time_spec_t& t)
}
void x300_dboard_iface::add_rx_fe(
- const std::string& fe_name,
- rx_frontend_core_3000::sptr fe_core)
+ const std::string& fe_name, rx_frontend_core_3000::sptr fe_core)
{
_rx_fes[fe_name] = fe_core;
}
void x300_dboard_iface::set_fe_connection(
- unit_t unit, const std::string& fe_name,
- const fe_connection_t& fe_conn)
+ unit_t unit, const std::string& fe_name, const fe_connection_t& fe_conn)
{
if (unit == UNIT_RX) {
if (_rx_fes.has_key(fe_name)) {
diff --git a/host/lib/usrp/x300/x300_dboard_iface.hpp b/host/lib/usrp/x300/x300_dboard_iface.hpp
index f41bb3d42..713c90748 100644
--- a/host/lib/usrp/x300/x300_dboard_iface.hpp
+++ b/host/lib/usrp/x300/x300_dboard_iface.hpp
@@ -8,41 +8,41 @@
#ifndef INCLUDED_X300_DBOARD_IFACE_HPP
#define INCLUDED_X300_DBOARD_IFACE_HPP
+#include "ad5623_regs.hpp" //aux dac
+#include "ad7922_regs.hpp" //aux adc
#include "x300_clock_ctrl.hpp"
-#include <uhdlib/usrp/cores/spi_core_3000.hpp>
-#include <uhdlib/usrp/cores/i2c_core_100_wb32.hpp>
+#include <uhd/types/dict.hpp>
+#include <uhd/usrp/dboard_iface.hpp>
#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
+#include <uhdlib/usrp/cores/i2c_core_100_wb32.hpp>
#include <uhdlib/usrp/cores/rx_frontend_core_3000.hpp>
-#include "ad7922_regs.hpp" //aux adc
-#include "ad5623_regs.hpp" //aux dac
-#include <uhd/usrp/dboard_iface.hpp>
-#include <uhd/types/dict.hpp>
+#include <uhdlib/usrp/cores/spi_core_3000.hpp>
struct x300_dboard_iface_config_t
{
uhd::usrp::gpio_atr::db_gpio_atr_3000::sptr gpio;
- spi_core_3000::sptr spi;
- size_t rx_spi_slaveno;
- size_t tx_spi_slaveno;
- uhd::i2c_iface::sptr i2c;
- x300_clock_ctrl::sptr clock;
- x300_clock_which_t which_rx_clk;
- x300_clock_which_t which_tx_clk;
- uint8_t dboard_slot;
- uhd::timed_wb_iface::sptr cmd_time_ctrl;
+ spi_core_3000::sptr spi;
+ size_t rx_spi_slaveno;
+ size_t tx_spi_slaveno;
+ uhd::i2c_iface::sptr i2c;
+ x300_clock_ctrl::sptr clock;
+ x300_clock_which_t which_rx_clk;
+ x300_clock_which_t which_tx_clk;
+ uint8_t dboard_slot;
+ uhd::timed_wb_iface::sptr cmd_time_ctrl;
};
class x300_dboard_iface : public uhd::usrp::dboard_iface
{
public:
- x300_dboard_iface(const x300_dboard_iface_config_t &config);
+ x300_dboard_iface(const x300_dboard_iface_config_t& config);
~x300_dboard_iface(void);
inline special_props_t get_special_props(void)
{
special_props_t props;
props.soft_clock_divider = false;
- props.mangle_i2c_addrs = (_config.dboard_slot == 1);
+ props.mangle_i2c_addrs = (_config.dboard_slot == 1);
return props;
}
@@ -51,7 +51,8 @@ public:
void set_pin_ctrl(unit_t unit, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_pin_ctrl(unit_t unit);
- void set_atr_reg(unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask = 0xffffffff);
+ void set_atr_reg(
+ unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_atr_reg(unit_t unit, atr_reg_t reg);
void set_gpio_ddr(unit_t unit, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_gpio_ddr(unit_t unit);
@@ -62,7 +63,7 @@ public:
void set_command_time(const uhd::time_spec_t& t);
uhd::time_spec_t get_command_time(void);
- void write_i2c(uint16_t, const uhd::byte_vector_t &);
+ void write_i2c(uint16_t, const uhd::byte_vector_t&);
uhd::byte_vector_t read_i2c(uint16_t, size_t);
void set_clock_rate(unit_t, double);
@@ -72,21 +73,12 @@ public:
double get_codec_rate(unit_t);
void write_spi(
- unit_t unit,
- const uhd::spi_config_t &config,
- uint32_t data,
- size_t num_bits
- );
+ unit_t unit, const uhd::spi_config_t& config, uint32_t data, size_t num_bits);
uint32_t read_write_spi(
- unit_t unit,
- const uhd::spi_config_t &config,
- uint32_t data,
- size_t num_bits
- );
+ unit_t unit, const uhd::spi_config_t& config, uint32_t data, size_t num_bits);
void set_fe_connection(
- unit_t unit, const std::string& name,
- const uhd::usrp::fe_connection_t& fe_conn);
+ unit_t unit, const std::string& name, const uhd::usrp::fe_connection_t& fe_conn);
// X300 can set the FE connection on the RX side
bool has_set_fe_connection(const unit_t unit) override
@@ -94,9 +86,7 @@ public:
return unit == UNIT_RX;
}
- void add_rx_fe(
- const std::string& fe_name,
- rx_frontend_core_3000::sptr fe_core);
+ void add_rx_fe(const std::string& fe_name, rx_frontend_core_3000::sptr fe_core);
private:
const x300_dboard_iface_config_t _config;
@@ -107,5 +97,4 @@ private:
};
-
#endif /* INCLUDED_X300_DBOARD_IFACE_HPP */
diff --git a/host/lib/usrp/x300/x300_defaults.hpp b/host/lib/usrp/x300/x300_defaults.hpp
index aa8d1b688..2e242f24f 100644
--- a/host/lib/usrp/x300/x300_defaults.hpp
+++ b/host/lib/usrp/x300/x300_defaults.hpp
@@ -7,103 +7,100 @@
#ifndef INCLUDED_X300_DEFAULTS_HPP
#define INCLUDED_X300_DEFAULTS_HPP
-#include <uhd/transport/udp_simple.hpp> //mtu
#include "../device3/device3_impl.hpp"
+#include <uhd/transport/udp_simple.hpp> //mtu
#include <string>
-
-namespace uhd {
-namespace usrp {
-namespace x300 {
+namespace uhd { namespace usrp { namespace x300 {
static constexpr size_t NIUSRPRIO_DEFAULT_RPC_PORT = 5444;
static constexpr uint32_t RADIO_DEST_PREFIX_TX = 0;
-static constexpr size_t XB_DST_E0 = 0;
-static constexpr size_t XB_DST_E1 = 1;
-static constexpr size_t XB_DST_PCI = 2;
-static constexpr size_t XB_DST_R0 = 3; // Radio 0 -> Slot A
-static constexpr size_t XB_DST_R1 = 4; // Radio 1 -> Slot B
-static constexpr size_t XB_DST_CE0 = 5;
+static constexpr size_t XB_DST_E0 = 0;
+static constexpr size_t XB_DST_E1 = 1;
+static constexpr size_t XB_DST_PCI = 2;
+static constexpr size_t XB_DST_R0 = 3; // Radio 0 -> Slot A
+static constexpr size_t XB_DST_R1 = 4; // Radio 1 -> Slot B
+static constexpr size_t XB_DST_CE0 = 5;
-static constexpr size_t SRC_ADDR0 = 0;
-static constexpr size_t SRC_ADDR1 = 1;
-static constexpr size_t DST_ADDR = 2;
+static constexpr size_t SRC_ADDR0 = 0;
+static constexpr size_t SRC_ADDR1 = 1;
+static constexpr size_t DST_ADDR = 2;
-static constexpr double DEFAULT_TICK_RATE = 200e6; // Hz
-static constexpr double MAX_TICK_RATE = 200e6; // Hz
-static constexpr double MIN_TICK_RATE = 184.32e6; // Hz
-static constexpr double BUS_CLOCK_RATE = 187.5e6; // Hz
+static constexpr double DEFAULT_TICK_RATE = 200e6; // Hz
+static constexpr double MAX_TICK_RATE = 200e6; // Hz
+static constexpr double MIN_TICK_RATE = 184.32e6; // Hz
+static constexpr double BUS_CLOCK_RATE = 187.5e6; // Hz
-static const std::string FW_FILE_NAME = "usrp_x300_fw.bin";
+static const std::string FW_FILE_NAME = "usrp_x300_fw.bin";
// Clock & Time-related defaults
static const std::string DEFAULT_CLOCK_SOURCE = "internal";
static const std::string DEFAULT_TIME_SOURCE = "internal";
-static const bool DEFAULT_TIME_OUTPUT = true;
+static const bool DEFAULT_TIME_OUTPUT = true;
static const std::vector<std::string> CLOCK_SOURCE_OPTIONS{
- "internal",
- "external",
- "gpsdo"
-};
+ "internal", "external", "gpsdo"};
static const std::vector<std::string> TIME_SOURCE_OPTIONS{
- "internal",
- "external",
- "gpsdo"
-};
+ "internal", "external", "gpsdo"};
static const std::vector<double> EXTERNAL_FREQ_OPTIONS{10e6, 30.72e6, 200e6};
-static constexpr size_t RX_SW_BUFF_SIZE_ETH = 0x2000000;//32MiB For an ~8k frame size any size >32MiB is just wasted buffer space
-static constexpr size_t RX_SW_BUFF_SIZE_ETH_MACOS = 0x100000; //1Mib
-
-//The FIFO closest to the DMA controller is 1023 elements deep for RX and 1029 elements deep for TX
-//where an element is 8 bytes. The buffers (number of frames * frame size) must be aligned to the
-//memory page size. For the control, we are getting lucky because 64 frames * 256 bytes each aligns
-//with the typical page size of 4096 bytes. Since most page sizes are 4096 bytes or some multiple of
-//that, keep the number of frames * frame size aligned to it.
-static constexpr size_t PCIE_RX_DATA_FRAME_SIZE = 4096; //bytes
-static constexpr size_t PCIE_RX_DATA_NUM_FRAMES = 4096;
-static constexpr size_t PCIE_TX_DATA_FRAME_SIZE = 4096; //bytes
-static constexpr size_t PCIE_TX_DATA_NUM_FRAMES = 4096;
-static constexpr size_t PCIE_MSG_FRAME_SIZE = 256; //bytes
-static constexpr size_t PCIE_MSG_NUM_FRAMES = 64;
-static constexpr size_t PCIE_MAX_CHANNELS = 6;
-static constexpr size_t PCIE_MAX_MUXED_CTRL_XPORTS = 32;
-static constexpr size_t PCIE_MAX_MUXED_ASYNC_XPORTS = 4;
-
-static const size_t DATA_FRAME_MAX_SIZE = 8000; // CHDR packet size in bytes
-static const size_t XGE_DATA_FRAME_SEND_SIZE = 4000; // Reduced to make sure flow control packets are not blocked for too long at high rates
-static const size_t XGE_DATA_FRAME_RECV_SIZE = 8000;
-static const size_t GE_DATA_FRAME_SEND_SIZE = 1472;
-static const size_t GE_DATA_FRAME_RECV_SIZE = 1472;
-
-static const size_t ETH_MSG_FRAME_SIZE = uhd::transport::udp_simple::mtu; //bytes
+static constexpr size_t RX_SW_BUFF_SIZE_ETH =
+ 0x2000000; // 32MiB For an ~8k frame size any size >32MiB is just wasted buffer
+ // space
+static constexpr size_t RX_SW_BUFF_SIZE_ETH_MACOS = 0x100000; // 1Mib
+
+// The FIFO closest to the DMA controller is 1023 elements deep for RX and 1029 elements
+// deep for TX where an element is 8 bytes. The buffers (number of frames * frame size)
+// must be aligned to the memory page size. For the control, we are getting lucky because
+// 64 frames * 256 bytes each aligns with the typical page size of 4096 bytes. Since most
+// page sizes are 4096 bytes or some multiple of that, keep the number of frames * frame
+// size aligned to it.
+static constexpr size_t PCIE_RX_DATA_FRAME_SIZE = 4096; // bytes
+static constexpr size_t PCIE_RX_DATA_NUM_FRAMES = 4096;
+static constexpr size_t PCIE_TX_DATA_FRAME_SIZE = 4096; // bytes
+static constexpr size_t PCIE_TX_DATA_NUM_FRAMES = 4096;
+static constexpr size_t PCIE_MSG_FRAME_SIZE = 256; // bytes
+static constexpr size_t PCIE_MSG_NUM_FRAMES = 64;
+static constexpr size_t PCIE_MAX_CHANNELS = 6;
+static constexpr size_t PCIE_MAX_MUXED_CTRL_XPORTS = 32;
+static constexpr size_t PCIE_MAX_MUXED_ASYNC_XPORTS = 4;
+
+static const size_t DATA_FRAME_MAX_SIZE = 8000; // CHDR packet size in bytes
+static const size_t XGE_DATA_FRAME_SEND_SIZE =
+ 4000; // Reduced to make sure flow control packets are not blocked for too long at
+ // high rates
+static const size_t XGE_DATA_FRAME_RECV_SIZE = 8000;
+static const size_t GE_DATA_FRAME_SEND_SIZE = 1472;
+static const size_t GE_DATA_FRAME_RECV_SIZE = 1472;
+
+static const size_t ETH_MSG_FRAME_SIZE = uhd::transport::udp_simple::mtu; // bytes
// MTU throttling for ethernet/TX (see above):
static constexpr size_t ETH_DATA_FRAME_MAX_TX_SIZE = 8000;
-static constexpr double RECV_OFFLOAD_BUFFER_TIMEOUT = 0.1; //seconds
-static constexpr double THREAD_BUFFER_TIMEOUT = 0.1; // Time in seconds
+static constexpr double RECV_OFFLOAD_BUFFER_TIMEOUT = 0.1; // seconds
+static constexpr double THREAD_BUFFER_TIMEOUT = 0.1; // Time in seconds
-static constexpr size_t ETH_MSG_NUM_FRAMES = 64;
-static constexpr size_t ETH_DATA_NUM_FRAMES = 32;
-static constexpr double DEFAULT_SYSREF_RATE = 10e6;
+static constexpr size_t ETH_MSG_NUM_FRAMES = 64;
+static constexpr size_t ETH_DATA_NUM_FRAMES = 32;
+static constexpr double DEFAULT_SYSREF_RATE = 10e6;
// Limit the number of initialization threads
-static const size_t MAX_INIT_THREADS = 10;
-
-static const size_t MAX_RATE_PCIE = 800000000; // bytes/s
-static const size_t MAX_RATE_10GIGE = (size_t)( // bytes/s
- 10e9 / 8 * // wire speed multiplied by percentage of packets that is sample data
- ( float(DATA_FRAME_MAX_SIZE - uhd::usrp::DEVICE3_TX_MAX_HDR_LEN) /
- float(DATA_FRAME_MAX_SIZE + 8 /* UDP header */ + 20 /* Ethernet header length */ )));
-static const size_t MAX_RATE_1GIGE = (size_t)( // bytes/s
- 10e9 / 8 * // wire speed multiplied by percentage of packets that is sample data
- ( float(GE_DATA_FRAME_RECV_SIZE - uhd::usrp::DEVICE3_TX_MAX_HDR_LEN) /
- float(GE_DATA_FRAME_RECV_SIZE + 8 /* UDP header */ + 20 /* Ethernet header length */ )));
+static const size_t MAX_INIT_THREADS = 10;
+
+static const size_t MAX_RATE_PCIE = 800000000; // bytes/s
+static const size_t MAX_RATE_10GIGE = (size_t)( // bytes/s
+ 10e9 / 8 * // wire speed multiplied by percentage of packets that is sample data
+ (float(DATA_FRAME_MAX_SIZE - uhd::usrp::DEVICE3_TX_MAX_HDR_LEN)
+ / float(DATA_FRAME_MAX_SIZE
+ + 8 /* UDP header */ + 20 /* Ethernet header length */)));
+static const size_t MAX_RATE_1GIGE = (size_t)( // bytes/s
+ 10e9 / 8 * // wire speed multiplied by percentage of packets that is sample data
+ (float(GE_DATA_FRAME_RECV_SIZE - uhd::usrp::DEVICE3_TX_MAX_HDR_LEN)
+ / float(GE_DATA_FRAME_RECV_SIZE
+ + 8 /* UDP header */ + 20 /* Ethernet header length */)));
}}} /* namespace uhd::usrp::x300 */
#endif /* INCLUDED_X300_DEFAULTS_HPP */
-
diff --git a/host/lib/usrp/x300/x300_device_args.hpp b/host/lib/usrp/x300/x300_device_args.hpp
index db1a01212..bdb3762af 100644
--- a/host/lib/usrp/x300/x300_device_args.hpp
+++ b/host/lib/usrp/x300/x300_device_args.hpp
@@ -7,8 +7,8 @@
#ifndef INCLUDED_X300_DEV_ARGS_HPP
#define INCLUDED_X300_DEV_ARGS_HPP
-#include "x300_impl.hpp"
#include "x300_defaults.hpp"
+#include "x300_impl.hpp"
#include <uhdlib/usrp/constrained_device_args.hpp>
namespace uhd { namespace usrp { namespace x300 {
@@ -16,97 +16,116 @@ namespace uhd { namespace usrp { namespace x300 {
class x300_device_args_t : public constrained_device_args_t
{
public:
- x300_device_args_t():
- _master_clock_rate("master_clock_rate", DEFAULT_TICK_RATE),
- _dboard_clock_rate("dboard_clock_rate", -1),
- _system_ref_rate("system_ref_rate", DEFAULT_SYSREF_RATE),
- _clock_source("clock_source", DEFAULT_CLOCK_SOURCE),
- _time_source("time_source", DEFAULT_TIME_SOURCE),
- _first_addr("addr", ""),
- _second_addr("second_addr", ""),
- _resource("resource", ""),
- _self_cal_adc_delay("self_cal_adc_delay", false),
- _ext_adc_self_test("ext_adc_self_test", false),
- _ext_adc_self_test_duration("ext_adc_self_test", 30.0),
- _recover_mb_eeprom("recover_mb_eeprom", false),
- _ignore_cal_file("ignore_cal_file", false),
- _niusrprio_rpc_port("niusrprio_rpc_port", NIUSRPRIO_DEFAULT_RPC_PORT),
- _has_fw_file("fw", false),
- _fw_file("fw", ""),
- _blank_eeprom("blank_eeprom", false),
- _enable_tx_dual_eth("enable_tx_dual_eth", false)
+ x300_device_args_t()
+ : _master_clock_rate("master_clock_rate", DEFAULT_TICK_RATE)
+ , _dboard_clock_rate("dboard_clock_rate", -1)
+ , _system_ref_rate("system_ref_rate", DEFAULT_SYSREF_RATE)
+ , _clock_source("clock_source", DEFAULT_CLOCK_SOURCE)
+ , _time_source("time_source", DEFAULT_TIME_SOURCE)
+ , _first_addr("addr", "")
+ , _second_addr("second_addr", "")
+ , _resource("resource", "")
+ , _self_cal_adc_delay("self_cal_adc_delay", false)
+ , _ext_adc_self_test("ext_adc_self_test", false)
+ , _ext_adc_self_test_duration("ext_adc_self_test", 30.0)
+ , _recover_mb_eeprom("recover_mb_eeprom", false)
+ , _ignore_cal_file("ignore_cal_file", false)
+ , _niusrprio_rpc_port("niusrprio_rpc_port", NIUSRPRIO_DEFAULT_RPC_PORT)
+ , _has_fw_file("fw", false)
+ , _fw_file("fw", "")
+ , _blank_eeprom("blank_eeprom", false)
+ , _enable_tx_dual_eth("enable_tx_dual_eth", false)
{
// nop
}
- double get_master_clock_rate() const {
+ double get_master_clock_rate() const
+ {
return _master_clock_rate.get();
}
- double get_dboard_clock_rate() const {
+ double get_dboard_clock_rate() const
+ {
return _dboard_clock_rate.get();
}
- double get_system_ref_rate() const {
+ double get_system_ref_rate() const
+ {
return _system_ref_rate.get();
}
- std::string get_clock_source() const {
+ std::string get_clock_source() const
+ {
return _clock_source.get();
}
- std::string get_time_source() const {
+ std::string get_time_source() const
+ {
return _time_source.get();
}
- std::string get_first_addr() const {
+ std::string get_first_addr() const
+ {
return _first_addr.get();
}
- std::string get_second_addr() const {
+ std::string get_second_addr() const
+ {
return _second_addr.get();
}
- bool get_self_cal_adc_delay() const {
+ bool get_self_cal_adc_delay() const
+ {
return _self_cal_adc_delay.get();
}
- bool get_ext_adc_self_test() const {
+ bool get_ext_adc_self_test() const
+ {
return _ext_adc_self_test.get();
}
- double get_ext_adc_self_test_duration() const {
+ double get_ext_adc_self_test_duration() const
+ {
return _ext_adc_self_test_duration.get();
}
- bool get_recover_mb_eeprom() const {
+ bool get_recover_mb_eeprom() const
+ {
return _recover_mb_eeprom.get();
}
- bool get_ignore_cal_file() const {
+ bool get_ignore_cal_file() const
+ {
return _ignore_cal_file.get();
}
// must be a number in the string
// default NIUSRPRIO_DEFAULT_RPC_PORT
- std::string get_niusrprio_rpc_port() const {
+ std::string get_niusrprio_rpc_port() const
+ {
return std::to_string(_niusrprio_rpc_port.get());
}
- std::string get_resource() const {
+ std::string get_resource() const
+ {
return _resource.get();
}
// must be valid file, key == fw, default x300::FW_FILE_NAME
- std::string get_fw_file() const {
+ std::string get_fw_file() const
+ {
return _fw_file.get();
}
// true if the key is set
- bool has_fw_file() const {
+ bool has_fw_file() const
+ {
return _has_fw_file.get();
}
- bool get_blank_eeprom() const {
+ bool get_blank_eeprom() const
+ {
return _blank_eeprom.get();
}
- bool get_enable_tx_dual_eth() const {
+ bool get_enable_tx_dual_eth() const
+ {
return _enable_tx_dual_eth.get();
}
- inline virtual std::string to_string() const {
- return _master_clock_rate.to_string() + ", " +
- "";
+ inline virtual std::string to_string() const
+ {
+ return _master_clock_rate.to_string() + ", " + "";
}
private:
- virtual void _parse(const device_addr_t& dev_args) {
- //Extract parameters from dev_args
+ virtual void _parse(const device_addr_t& dev_args)
+ {
+ // Extract parameters from dev_args
#define PARSE_DEFAULT(arg) parse_arg_default(dev_args, arg);
PARSE_DEFAULT(_master_clock_rate)
if (dev_args.has_key(_master_clock_rate.key())) {
@@ -118,14 +137,12 @@ private:
// Some daughterboards may require other rates, but this default
// works best for all newer daughterboards (i.e. CBX, WBX, SBX,
// UBX, and TwinRX).
- if (_master_clock_rate.get() >= MIN_TICK_RATE &&
- _master_clock_rate.get() <= MAX_TICK_RATE) {
+ if (_master_clock_rate.get() >= MIN_TICK_RATE
+ && _master_clock_rate.get() <= MAX_TICK_RATE) {
_dboard_clock_rate.set(_master_clock_rate.get() / 4);
} else {
- throw uhd::value_error(
- "Can't infer daughterboard clock rate. Specify "
- "dboard_clk_rate in the device args."
- );
+ throw uhd::value_error("Can't infer daughterboard clock rate. Specify "
+ "dboard_clk_rate in the device args.");
}
}
PARSE_DEFAULT(_system_ref_rate)
@@ -152,11 +169,11 @@ private:
PARSE_DEFAULT(_fw_file);
}
PARSE_DEFAULT(_blank_eeprom)
- if (dev_args.has_key("enable_tx_dual_eth")){
+ if (dev_args.has_key("enable_tx_dual_eth")) {
_enable_tx_dual_eth.set(true);
}
- //Sanity check params
+ // Sanity check params
_enforce_range(_master_clock_rate, MIN_TICK_RATE, MAX_TICK_RATE);
_enforce_discrete(_system_ref_rate, EXTERNAL_FREQ_OPTIONS);
_enforce_discrete(_clock_source, CLOCK_SOURCE_OPTIONS);
@@ -164,26 +181,26 @@ private:
// TODO: If _fw_file is set, make sure it's actually a file
}
- constrained_device_args_t::num_arg<double> _master_clock_rate;
- constrained_device_args_t::num_arg<double> _dboard_clock_rate;
- constrained_device_args_t::num_arg<double> _system_ref_rate;
- constrained_device_args_t::str_arg<false> _clock_source;
- constrained_device_args_t::str_arg<false> _time_source;
- constrained_device_args_t::str_arg<false> _first_addr;
- constrained_device_args_t::str_arg<false> _second_addr;
- constrained_device_args_t::str_arg<true> _resource;
- constrained_device_args_t::bool_arg _self_cal_adc_delay;
- constrained_device_args_t::bool_arg _ext_adc_self_test;
- constrained_device_args_t::num_arg<double> _ext_adc_self_test_duration;
- constrained_device_args_t::bool_arg _recover_mb_eeprom;
- constrained_device_args_t::bool_arg _ignore_cal_file;
- constrained_device_args_t::num_arg<size_t> _niusrprio_rpc_port;
- constrained_device_args_t::bool_arg _has_fw_file;
- constrained_device_args_t::str_arg<true> _fw_file;
- constrained_device_args_t::bool_arg _blank_eeprom;
- constrained_device_args_t::bool_arg _enable_tx_dual_eth;
+ constrained_device_args_t::num_arg<double> _master_clock_rate;
+ constrained_device_args_t::num_arg<double> _dboard_clock_rate;
+ constrained_device_args_t::num_arg<double> _system_ref_rate;
+ constrained_device_args_t::str_arg<false> _clock_source;
+ constrained_device_args_t::str_arg<false> _time_source;
+ constrained_device_args_t::str_arg<false> _first_addr;
+ constrained_device_args_t::str_arg<false> _second_addr;
+ constrained_device_args_t::str_arg<true> _resource;
+ constrained_device_args_t::bool_arg _self_cal_adc_delay;
+ constrained_device_args_t::bool_arg _ext_adc_self_test;
+ constrained_device_args_t::num_arg<double> _ext_adc_self_test_duration;
+ constrained_device_args_t::bool_arg _recover_mb_eeprom;
+ constrained_device_args_t::bool_arg _ignore_cal_file;
+ constrained_device_args_t::num_arg<size_t> _niusrprio_rpc_port;
+ constrained_device_args_t::bool_arg _has_fw_file;
+ constrained_device_args_t::str_arg<true> _fw_file;
+ constrained_device_args_t::bool_arg _blank_eeprom;
+ constrained_device_args_t::bool_arg _enable_tx_dual_eth;
};
-}}} //namespace
+}}} // namespace uhd::usrp::x300
-#endif //INCLUDED_X300_DEV_ARGS_HPP
+#endif // INCLUDED_X300_DEV_ARGS_HPP
diff --git a/host/lib/usrp/x300/x300_fw_ctrl.cpp b/host/lib/usrp/x300/x300_fw_ctrl.cpp
index 21c64b509..cbe48bfe8 100644
--- a/host/lib/usrp/x300/x300_fw_ctrl.cpp
+++ b/host/lib/usrp/x300/x300_fw_ctrl.cpp
@@ -5,18 +5,18 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/types/wb_iface.hpp>
#include "x300_fw_common.h"
+#include "x300_regs.hpp"
+#include <uhd/exception.hpp>
+#include <uhd/transport/nirio/niriok_proxy.h>
+#include <uhd/transport/nirio/status.h>
#include <uhd/transport/udp_simple.hpp>
+#include <uhd/types/wb_iface.hpp>
#include <uhd/utils/byteswap.hpp>
#include <uhd/utils/log.hpp>
-#include <uhd/exception.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/format.hpp>
#include <boost/thread/mutex.hpp>
-#include <uhd/transport/nirio/status.h>
-#include <uhd/transport/nirio/niriok_proxy.h>
-#include "x300_regs.hpp"
-#include <boost/date_time/posix_time/posix_time.hpp>
#include <chrono>
#include <thread>
@@ -26,7 +26,7 @@ using namespace uhd::niusrprio;
class x300_ctrl_iface : public wb_iface
{
public:
- enum {num_retries = 3};
+ enum { num_retries = 3 };
x300_ctrl_iface(bool enable_errors = true) : errors(enable_errors)
{
@@ -41,39 +41,37 @@ public:
void poke32(const wb_addr_type addr, const uint32_t data)
{
- for (size_t i = 1; i <= num_retries; i++)
- {
+ for (size_t i = 1; i <= num_retries; i++) {
boost::mutex::scoped_lock lock(reg_access);
- try
- {
+ try {
return this->__poke32(addr, data);
- }
- catch(const uhd::io_error &ex)
- {
- std::string error_msg = str(boost::format(
- "%s: x300 fw communication failure #%u\n%s") % __loc_info() % i % ex.what());
- if (errors) UHD_LOGGER_ERROR("X300") << error_msg ;
- if (i == num_retries) throw uhd::io_error(error_msg);
+ } catch (const uhd::io_error& ex) {
+ std::string error_msg =
+ str(boost::format("%s: x300 fw communication failure #%u\n%s")
+ % __loc_info() % i % ex.what());
+ if (errors)
+ UHD_LOGGER_ERROR("X300") << error_msg;
+ if (i == num_retries)
+ throw uhd::io_error(error_msg);
}
}
}
uint32_t peek32(const wb_addr_type addr)
{
- for (size_t i = 1; i <= num_retries; i++)
- {
+ for (size_t i = 1; i <= num_retries; i++) {
boost::mutex::scoped_lock lock(reg_access);
- try
- {
+ try {
uint32_t data = this->__peek32(addr);
return data;
- }
- catch(const uhd::io_error &ex)
- {
- std::string error_msg = str(boost::format(
- "%s: x300 fw communication failure #%u\n%s") % __loc_info() % i % ex.what());
- if (errors) UHD_LOGGER_ERROR("X300") << error_msg ;
- if (i == num_retries) throw uhd::io_error(error_msg);
+ } catch (const uhd::io_error& ex) {
+ std::string error_msg =
+ str(boost::format("%s: x300 fw communication failure #%u\n%s")
+ % __loc_info() % i % ex.what());
+ if (errors)
+ UHD_LOGGER_ERROR("X300") << error_msg;
+ if (i == num_retries)
+ throw uhd::io_error(error_msg);
}
}
return 0;
@@ -83,9 +81,9 @@ protected:
bool errors;
virtual void __poke32(const wb_addr_type addr, const uint32_t data) = 0;
- virtual uint32_t __peek32(const wb_addr_type addr) = 0;
- virtual void __flush() = 0;
- virtual std::string __loc_info() = 0;
+ virtual uint32_t __peek32(const wb_addr_type addr) = 0;
+ virtual void __flush() = 0;
+ virtual std::string __loc_info() = 0;
boost::mutex reg_access;
};
@@ -97,39 +95,40 @@ protected:
class x300_ctrl_iface_enet : public x300_ctrl_iface
{
public:
- x300_ctrl_iface_enet(uhd::transport::udp_simple::sptr udp, bool enable_errors = true):
- x300_ctrl_iface(enable_errors), udp(udp), seq(0)
+ x300_ctrl_iface_enet(uhd::transport::udp_simple::sptr udp, bool enable_errors = true)
+ : x300_ctrl_iface(enable_errors), udp(udp), seq(0)
{
- try
- {
+ try {
this->peek32(0);
+ } catch (...) {
}
- catch(...){}
}
protected:
virtual void __poke32(const wb_addr_type addr, const uint32_t data)
{
- //load request struct
+ // load request struct
x300_fw_comms_t request = x300_fw_comms_t();
- request.flags = uhd::htonx<uint32_t>(X300_FW_COMMS_FLAGS_ACK | X300_FW_COMMS_FLAGS_POKE32);
+ request.flags =
+ uhd::htonx<uint32_t>(X300_FW_COMMS_FLAGS_ACK | X300_FW_COMMS_FLAGS_POKE32);
request.sequence = uhd::htonx<uint32_t>(seq++);
- request.addr = uhd::htonx(addr);
- request.data = uhd::htonx(data);
+ request.addr = uhd::htonx(addr);
+ request.data = uhd::htonx(data);
- //send request
+ // send request
__flush();
udp->send(boost::asio::buffer(&request, sizeof(request)));
- //recv reply
+ // recv reply
x300_fw_comms_t reply = x300_fw_comms_t();
const size_t nbytes = udp->recv(boost::asio::buffer(&reply, sizeof(reply)), 1.0);
- if (nbytes == 0) throw uhd::io_error("x300 fw poke32 - reply timed out");
+ if (nbytes == 0)
+ throw uhd::io_error("x300 fw poke32 - reply timed out");
- //sanity checks
+ // sanity checks
const size_t flags = uhd::ntohx<uint32_t>(reply.flags);
UHD_ASSERT_THROW(nbytes == sizeof(reply));
- UHD_ASSERT_THROW(not (flags & X300_FW_COMMS_FLAGS_ERROR));
+ UHD_ASSERT_THROW(not(flags & X300_FW_COMMS_FLAGS_ERROR));
UHD_ASSERT_THROW(flags & X300_FW_COMMS_FLAGS_POKE32);
UHD_ASSERT_THROW(flags & X300_FW_COMMS_FLAGS_ACK);
UHD_ASSERT_THROW(reply.sequence == request.sequence);
@@ -139,39 +138,42 @@ protected:
virtual uint32_t __peek32(const wb_addr_type addr)
{
- //load request struct
+ // load request struct
x300_fw_comms_t request = x300_fw_comms_t();
- request.flags = uhd::htonx<uint32_t>(X300_FW_COMMS_FLAGS_ACK | X300_FW_COMMS_FLAGS_PEEK32);
+ request.flags =
+ uhd::htonx<uint32_t>(X300_FW_COMMS_FLAGS_ACK | X300_FW_COMMS_FLAGS_PEEK32);
request.sequence = uhd::htonx<uint32_t>(seq++);
- request.addr = uhd::htonx(addr);
- request.data = 0;
+ request.addr = uhd::htonx(addr);
+ request.data = 0;
- //send request
+ // send request
__flush();
udp->send(boost::asio::buffer(&request, sizeof(request)));
- //recv reply
+ // recv reply
x300_fw_comms_t reply = x300_fw_comms_t();
const size_t nbytes = udp->recv(boost::asio::buffer(&reply, sizeof(reply)), 1.0);
- if (nbytes == 0) throw uhd::io_error("x300 fw peek32 - reply timed out");
+ if (nbytes == 0)
+ throw uhd::io_error("x300 fw peek32 - reply timed out");
- //sanity checks
+ // sanity checks
const size_t flags = uhd::ntohx<uint32_t>(reply.flags);
UHD_ASSERT_THROW(nbytes == sizeof(reply));
- UHD_ASSERT_THROW(not (flags & X300_FW_COMMS_FLAGS_ERROR));
+ UHD_ASSERT_THROW(not(flags & X300_FW_COMMS_FLAGS_ERROR));
UHD_ASSERT_THROW(flags & X300_FW_COMMS_FLAGS_PEEK32);
UHD_ASSERT_THROW(flags & X300_FW_COMMS_FLAGS_ACK);
UHD_ASSERT_THROW(reply.sequence == request.sequence);
UHD_ASSERT_THROW(reply.addr == request.addr);
- //return result!
+ // return result!
return uhd::ntohx<uint32_t>(reply.data);
}
virtual void __flush(void)
{
char buff[X300_FW_COMMS_MTU] = {};
- while (udp->recv(boost::asio::buffer(buff), 0.0)){} //flush
+ while (udp->recv(boost::asio::buffer(buff), 0.0)) {
+ } // flush
}
virtual std::string __loc_info(void)
@@ -191,61 +193,66 @@ private:
class x300_ctrl_iface_pcie : public x300_ctrl_iface
{
public:
- x300_ctrl_iface_pcie(niriok_proxy::sptr drv_proxy, bool enable_errors = true):
- x300_ctrl_iface(enable_errors), _drv_proxy(drv_proxy)
+ x300_ctrl_iface_pcie(niriok_proxy::sptr drv_proxy, bool enable_errors = true)
+ : x300_ctrl_iface(enable_errors), _drv_proxy(drv_proxy)
{
nirio_status status = 0;
- nirio_status_chain(_drv_proxy->set_attribute(RIO_ADDRESS_SPACE, BUS_INTERFACE), status);
+ nirio_status_chain(
+ _drv_proxy->set_attribute(RIO_ADDRESS_SPACE, BUS_INTERFACE), status);
- //Verify that the Ettus FPGA loaded in the device. This may not be true if the
- //user is switching to UHD after using LabVIEW FPGA.
+ // Verify that the Ettus FPGA loaded in the device. This may not be true if the
+ // user is switching to UHD after using LabVIEW FPGA.
uint32_t pcie_fpga_signature = 0;
_drv_proxy->peek(FPGA_PCIE_SIG_REG, pcie_fpga_signature);
if (pcie_fpga_signature != FPGA_X3xx_SIG_VALUE)
- throw uhd::io_error("cannot create x300_ctrl_iface_pcie. incorrect/no fpga image");
+ throw uhd::io_error(
+ "cannot create x300_ctrl_iface_pcie. incorrect/no fpga image");
- //Also, poll on the ZPU_STATUS bit to ensure all the state machines in the FPGA are
- //ready to accept register transaction requests.
+ // Also, poll on the ZPU_STATUS bit to ensure all the state machines in the FPGA
+ // are ready to accept register transaction requests.
uint32_t reg_data = 0xffffffff;
- boost::posix_time::ptime start_time = boost::posix_time::microsec_clock::local_time();
+ boost::posix_time::ptime start_time =
+ boost::posix_time::microsec_clock::local_time();
boost::posix_time::time_duration elapsed;
do {
- std::this_thread::sleep_for(std::chrono::microseconds(500)); //Avoid flooding the bus
+ std::this_thread::sleep_for(
+ std::chrono::microseconds(500)); // Avoid flooding the bus
elapsed = boost::posix_time::microsec_clock::local_time() - start_time;
- nirio_status_chain(_drv_proxy->peek(PCIE_ZPU_STATUS_REG(0), reg_data), status);
- } while (
- nirio_status_not_fatal(status) &&
- (reg_data & PCIE_ZPU_STATUS_SUSPENDED) &&
- elapsed.total_milliseconds() < INIT_TIMEOUT_IN_MS);
+ nirio_status_chain(
+ _drv_proxy->peek(PCIE_ZPU_STATUS_REG(0), reg_data), status);
+ } while (nirio_status_not_fatal(status) && (reg_data & PCIE_ZPU_STATUS_SUSPENDED)
+ && elapsed.total_milliseconds() < INIT_TIMEOUT_IN_MS);
nirio_status_to_exception(status, "Could not initialize x300_ctrl_iface_pcie.");
- try
- {
+ try {
this->peek32(0);
+ } catch (...) {
}
- catch(...){}
}
protected:
virtual void __poke32(const wb_addr_type addr, const uint32_t data)
{
nirio_status status = 0;
- uint32_t reg_data = 0xffffffff;
- boost::posix_time::ptime start_time = boost::posix_time::microsec_clock::local_time();
+ uint32_t reg_data = 0xffffffff;
+ boost::posix_time::ptime start_time =
+ boost::posix_time::microsec_clock::local_time();
boost::posix_time::time_duration elapsed;
nirio_status_chain(_drv_proxy->poke(PCIE_ZPU_DATA_REG(addr), data), status);
if (nirio_status_not_fatal(status)) {
do {
- std::this_thread::sleep_for(std::chrono::microseconds(50)); //Avoid flooding the bus
+ std::this_thread::sleep_for(
+ std::chrono::microseconds(50)); // Avoid flooding the bus
elapsed = boost::posix_time::microsec_clock::local_time() - start_time;
- nirio_status_chain(_drv_proxy->peek(PCIE_ZPU_STATUS_REG(addr), reg_data), status);
+ nirio_status_chain(
+ _drv_proxy->peek(PCIE_ZPU_STATUS_REG(addr), reg_data), status);
} while (
- nirio_status_not_fatal(status) &&
- ((reg_data & (PCIE_ZPU_STATUS_BUSY | PCIE_ZPU_STATUS_SUSPENDED)) != 0) &&
- elapsed.total_milliseconds() < READ_TIMEOUT_IN_MS);
+ nirio_status_not_fatal(status)
+ && ((reg_data & (PCIE_ZPU_STATUS_BUSY | PCIE_ZPU_STATUS_SUSPENDED)) != 0)
+ && elapsed.total_milliseconds() < READ_TIMEOUT_IN_MS);
}
if (nirio_status_fatal(status))
@@ -257,20 +264,24 @@ protected:
virtual uint32_t __peek32(const wb_addr_type addr)
{
nirio_status status = 0;
- uint32_t reg_data = 0xffffffff;
- boost::posix_time::ptime start_time = boost::posix_time::microsec_clock::local_time();
+ uint32_t reg_data = 0xffffffff;
+ boost::posix_time::ptime start_time =
+ boost::posix_time::microsec_clock::local_time();
boost::posix_time::time_duration elapsed;
- nirio_status_chain(_drv_proxy->poke(PCIE_ZPU_READ_REG(addr), PCIE_ZPU_READ_START), status);
+ nirio_status_chain(
+ _drv_proxy->poke(PCIE_ZPU_READ_REG(addr), PCIE_ZPU_READ_START), status);
if (nirio_status_not_fatal(status)) {
do {
- std::this_thread::sleep_for(std::chrono::microseconds(50)); //Avoid flooding the bus
+ std::this_thread::sleep_for(
+ std::chrono::microseconds(50)); // Avoid flooding the bus
elapsed = boost::posix_time::microsec_clock::local_time() - start_time;
- nirio_status_chain(_drv_proxy->peek(PCIE_ZPU_STATUS_REG(addr), reg_data), status);
+ nirio_status_chain(
+ _drv_proxy->peek(PCIE_ZPU_STATUS_REG(addr), reg_data), status);
} while (
- nirio_status_not_fatal(status) &&
- ((reg_data & (PCIE_ZPU_STATUS_BUSY | PCIE_ZPU_STATUS_SUSPENDED)) != 0) &&
- elapsed.total_milliseconds() < READ_TIMEOUT_IN_MS);
+ nirio_status_not_fatal(status)
+ && ((reg_data & (PCIE_ZPU_STATUS_BUSY | PCIE_ZPU_STATUS_SUSPENDED)) != 0)
+ && elapsed.total_milliseconds() < READ_TIMEOUT_IN_MS);
}
nirio_status_chain(_drv_proxy->peek(PCIE_ZPU_DATA_REG(addr), reg_data), status);
@@ -298,12 +309,14 @@ private:
static const uint32_t INIT_TIMEOUT_IN_MS = 5000;
};
-wb_iface::sptr x300_make_ctrl_iface_enet(uhd::transport::udp_simple::sptr udp, bool enable_errors = true)
+wb_iface::sptr x300_make_ctrl_iface_enet(
+ uhd::transport::udp_simple::sptr udp, bool enable_errors = true)
{
return wb_iface::sptr(new x300_ctrl_iface_enet(udp, enable_errors));
}
-wb_iface::sptr x300_make_ctrl_iface_pcie(niriok_proxy::sptr drv_proxy, bool enable_errors = true)
+wb_iface::sptr x300_make_ctrl_iface_pcie(
+ niriok_proxy::sptr drv_proxy, bool enable_errors = true)
{
return wb_iface::sptr(new x300_ctrl_iface_pcie(drv_proxy, enable_errors));
}
diff --git a/host/lib/usrp/x300/x300_fw_uart.cpp b/host/lib/usrp/x300/x300_fw_uart.cpp
index 912d977ed..0dde87da5 100644
--- a/host/lib/usrp/x300/x300_fw_uart.cpp
+++ b/host/lib/usrp/x300/x300_fw_uart.cpp
@@ -6,11 +6,11 @@
//
#include "x300_impl.hpp"
-#include <uhd/types/wb_iface.hpp>
#include "x300_regs.hpp"
-#include <uhd/utils/log.hpp>
-#include <uhd/types/serial.hpp>
#include <uhd/exception.hpp>
+#include <uhd/types/serial.hpp>
+#include <uhd/types/wb_iface.hpp>
+#include <uhd/utils/log.hpp>
#include <boost/format.hpp>
#include <chrono>
@@ -18,44 +18,42 @@ using namespace uhd;
struct x300_uart_iface : uart_iface
{
- x300_uart_iface(wb_iface::sptr iface):
- _iface(iface),
- rxoffset(0),
- txword32(0),
- _last_device_rxoffset(0)
+ x300_uart_iface(wb_iface::sptr iface)
+ : _iface(iface), rxoffset(0), txword32(0), _last_device_rxoffset(0)
{
- txoffset = _iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_TX_INDEX));
+ txoffset =
+ _iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_TX_INDEX));
rxpool = _iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_RX_ADDR));
txpool = _iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_TX_ADDR));
- poolsize = _iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_WORDS32));
+ poolsize =
+ _iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_WORDS32));
_rxcache.resize(poolsize);
- //this->write_uart("HELLO UART\n");
- //this->read_uart(0.1);
+ // this->write_uart("HELLO UART\n");
+ // this->read_uart(0.1);
}
void putchar(const char ch)
{
- const int shift = ((txoffset%4) * 8);
- if (shift == 0) txword32 = 0;
+ const int shift = ((txoffset % 4) * 8);
+ if (shift == 0)
+ txword32 = 0;
txword32 |= uint32_t(ch) << shift;
// Write out full 32 bit words or whatever we have if end of string
- if (txoffset % 4 == 3 or ch == '\n')
- {
- _iface->poke32(SR_ADDR(txpool, txoffset/4), txword32);
+ if (txoffset % 4 == 3 or ch == '\n') {
+ _iface->poke32(SR_ADDR(txpool, txoffset / 4), txword32);
}
- txoffset = (txoffset + 1) % (poolsize*4);
- if (ch == '\n')
- {
+ txoffset = (txoffset + 1) % (poolsize * 4);
+ if (ch == '\n') {
// Tell the X300 to write the string
- _iface->poke32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_TX_INDEX), txoffset);
+ _iface->poke32(
+ SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_TX_INDEX), txoffset);
}
}
- void write_uart(const std::string &buff)
+ void write_uart(const std::string& buff)
{
boost::mutex::scoped_lock lock(_write_mutex);
- for(const char ch: buff)
- {
+ for (const char ch : buff) {
this->putchar(ch);
}
}
@@ -65,60 +63,57 @@ struct x300_uart_iface : uart_iface
if (rxoffset == _last_device_rxoffset)
return -1;
- int ret = static_cast<int>(_rxcache[((rxoffset)/4) % poolsize] >> ((rxoffset%4)*8) & 0xFF);
+ int ret = static_cast<int>(
+ _rxcache[((rxoffset) / 4) % poolsize] >> ((rxoffset % 4) * 8) & 0xFF);
rxoffset++;
return ret;
}
void update_cache(void)
{
- uint32_t device_rxoffset = _iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_RX_INDEX));
+ uint32_t device_rxoffset =
+ _iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_RX_INDEX));
uint32_t delta = device_rxoffset - rxoffset;
- while (delta)
- {
- if (delta >= poolsize*4)
- {
+ while (delta) {
+ if (delta >= poolsize * 4) {
// all the data is new - reload the entire cache
- for (uint32_t i = 0; i < poolsize; i++)
- {
+ for (uint32_t i = 0; i < poolsize; i++) {
_rxcache[i] = _iface->peek32(SR_ADDR(rxpool, i));
}
// set the head to the same character as the current device
// offset (tail) one loop earlier
- rxoffset = device_rxoffset - (poolsize*4);
+ rxoffset = device_rxoffset - (poolsize * 4);
// set the tail to the current device offset
_last_device_rxoffset = device_rxoffset;
// the string at the head is a partial, so skip it
- for (int c = getchar(); c != '\n' and c != -1; c = getchar()) {}
+ for (int c = getchar(); c != '\n' and c != -1; c = getchar()) {
+ }
// clear the partial string in the buffer, if any
_rxbuff.clear();
- }
- else if (rxoffset == _last_device_rxoffset)
- {
+ } else if (rxoffset == _last_device_rxoffset) {
// new data was added - refresh the portion of the cache that was updated
- for (uint32_t i = (_last_device_rxoffset/4) % poolsize;
- i != ((device_rxoffset/4)+1) % poolsize;
- i = (i+1) % poolsize)
- {
+ for (uint32_t i = (_last_device_rxoffset / 4) % poolsize;
+ i != ((device_rxoffset / 4) + 1) % poolsize;
+ i = (i + 1) % poolsize) {
_rxcache[i] = _iface->peek32(SR_ADDR(rxpool, i));
}
// set the tail to the current device offset
_last_device_rxoffset = device_rxoffset;
- }
- else
- {
- // there is new data, but we aren't done with what we have - check back later
+ } else {
+ // there is new data, but we aren't done with what we have - check back
+ // later
break;
}
// check again to see if anything changed while we were updating the cache
- device_rxoffset = _iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_RX_INDEX));
+ device_rxoffset =
+ _iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_UART_RX_INDEX));
delta = device_rxoffset - rxoffset;
}
}
@@ -126,26 +121,22 @@ struct x300_uart_iface : uart_iface
std::string read_uart(double timeout)
{
boost::mutex::scoped_lock lock(_read_mutex);
- const auto exit_time =
- std::chrono::steady_clock::now()
- + std::chrono::microseconds(int64_t(timeout*1e6));
+ const auto exit_time = std::chrono::steady_clock::now()
+ + std::chrono::microseconds(int64_t(timeout * 1e6));
std::string buff;
- while (true)
- {
+ while (true) {
// Update cache
this->update_cache();
// Get available characters
- for (int ch = this->getchar(); ch != -1; ch = this->getchar())
- {
+ for (int ch = this->getchar(); ch != -1; ch = this->getchar()) {
// store character to buffer
_rxbuff.append(1, ch);
// newline found - return string
- if (ch == '\n')
- {
+ if (ch == '\n') {
buff.swap(_rxbuff);
return buff;
}
diff --git a/host/lib/usrp/x300/x300_image_loader.cpp b/host/lib/usrp/x300/x300_image_loader.cpp
index 4e2c9e580..5cb1f1b85 100644
--- a/host/lib/usrp/x300/x300_image_loader.cpp
+++ b/host/lib/usrp/x300/x300_image_loader.cpp
@@ -5,28 +5,25 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <fstream>
-#include <vector>
-
-#include <boost/algorithm/string.hpp>
-#include <boost/filesystem.hpp>
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/xml_parser.hpp>
-
+#include "cdecode.h"
+#include "x300_fw_common.h"
+#include "x300_impl.hpp"
#include <uhd/config.hpp>
#include <uhd/device.hpp>
-#include <uhd/image_loader.hpp>
#include <uhd/exception.hpp>
-#include <uhd/transport/udp_simple.hpp>
+#include <uhd/image_loader.hpp>
#include <uhd/transport/nirio/niusrprio_session.h>
#include <uhd/transport/nirio/status.h>
+#include <uhd/transport/udp_simple.hpp>
#include <uhd/utils/byteswap.hpp>
#include <uhd/utils/paths.hpp>
#include <uhd/utils/static.hpp>
-
-#include "x300_impl.hpp"
-#include "x300_fw_common.h"
-#include "cdecode.h"
+#include <boost/algorithm/string.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/xml_parser.hpp>
+#include <fstream>
+#include <vector>
namespace fs = boost::filesystem;
@@ -50,65 +47,81 @@ using namespace uhd::transport;
/*
* Bitstream header pattern
*/
-static const uint8_t X300_FPGA_BIT_HEADER[] =
-{
- 0x00, 0x09, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0,
- 0x0f, 0xf0, 0x00, 0x00, 0x01, 0x61, 0x00
-};
+static const uint8_t X300_FPGA_BIT_HEADER[] = {0x00,
+ 0x09,
+ 0x0f,
+ 0xf0,
+ 0x0f,
+ 0xf0,
+ 0x0f,
+ 0xf0,
+ 0x0f,
+ 0xf0,
+ 0x00,
+ 0x00,
+ 0x01,
+ 0x61,
+ 0x00};
/*
* Packet structure
*/
-typedef struct {
+typedef struct
+{
uint32_t flags;
uint32_t sector;
uint32_t index;
uint32_t size;
union {
- uint8_t data8[X300_PACKET_SIZE_BYTES];
- uint16_t data16[X300_PACKET_SIZE_BYTES/2];
+ uint8_t data8[X300_PACKET_SIZE_BYTES];
+ uint16_t data16[X300_PACKET_SIZE_BYTES / 2];
};
} x300_fpga_update_data_t;
/*
* X-Series burn session
*/
-typedef struct {
- bool found;
- bool ethernet;
- bool configure; // Reload FPGA after burning to flash (Ethernet only)
- bool verify; // Device will verify the download along the way (Ethernet only)
- bool download; // Host will read the FPGA image on the device to a file
- bool lvbitx;
- uhd::device_addr_t dev_addr;
- std::string ip_addr;
- std::string fpga_type;
- std::string resource;
- std::string filepath;
- std::string outpath;
- std::string rpc_port;
- udp_simple::sptr write_xport;
- udp_simple::sptr read_xport;
- size_t size;
- uint8_t data_in[udp_simple::mtu];
- std::vector<char> bitstream; // .bin image extracted from .lvbitx file
+typedef struct
+{
+ bool found;
+ bool ethernet;
+ bool configure; // Reload FPGA after burning to flash (Ethernet only)
+ bool verify; // Device will verify the download along the way (Ethernet only)
+ bool download; // Host will read the FPGA image on the device to a file
+ bool lvbitx;
+ uhd::device_addr_t dev_addr;
+ std::string ip_addr;
+ std::string fpga_type;
+ std::string resource;
+ std::string filepath;
+ std::string outpath;
+ std::string rpc_port;
+ udp_simple::sptr write_xport;
+ udp_simple::sptr read_xport;
+ size_t size;
+ uint8_t data_in[udp_simple::mtu];
+ std::vector<char> bitstream; // .bin image extracted from .lvbitx file
} x300_session_t;
/*
* Extract the .bin image from the given LVBITX file.
*/
-static void extract_from_lvbitx(x300_session_t &session){
- boost::property_tree::ptree pt;
- boost::property_tree::xml_parser::read_xml(session.filepath.c_str(), pt,
- boost::property_tree::xml_parser::no_comments |
- boost::property_tree::xml_parser::trim_whitespace);
+static void extract_from_lvbitx(x300_session_t& session)
+{
+ boost::property_tree::ptree pt;
+ boost::property_tree::xml_parser::read_xml(session.filepath.c_str(),
+ pt,
+ boost::property_tree::xml_parser::no_comments
+ | boost::property_tree::xml_parser::trim_whitespace);
const std::string encoded_bitstream(pt.get<std::string>("Bitfile.Bitstream"));
std::vector<char> decoded_bitstream(encoded_bitstream.size());
base64_decodestate decode_state;
base64_init_decodestate(&decode_state);
const size_t decoded_size = base64_decode_block(encoded_bitstream.c_str(),
- encoded_bitstream.size(), &decoded_bitstream.front(), &decode_state);
+ encoded_bitstream.size(),
+ &decoded_bitstream.front(),
+ &decode_state);
decoded_bitstream.resize(decoded_size);
session.bitstream.swap(decoded_bitstream);
@@ -118,118 +131,122 @@ static void extract_from_lvbitx(x300_session_t &session){
/*
* Validate X300 image and extract if LVBITX.
*/
-static void x300_validate_image(x300_session_t &session){
- if(not fs::exists(session.filepath)){
- throw uhd::runtime_error(str(boost::format("Could not find image at path \"%s\".")
- % session.filepath));
+static void x300_validate_image(x300_session_t& session)
+{
+ if (not fs::exists(session.filepath)) {
+ throw uhd::runtime_error(str(
+ boost::format("Could not find image at path \"%s\".") % session.filepath));
}
std::string extension = fs::extension(session.filepath);
- session.lvbitx = (extension == ".lvbitx");
+ session.lvbitx = (extension == ".lvbitx");
- if(session.lvbitx){
+ if (session.lvbitx) {
extract_from_lvbitx(session);
- if(session.size > X300_FPGA_BIN_SIZE_BYTES){
- throw uhd::runtime_error(str(boost::format("The specified FPGA image is too large: %d vs. %d")
- % session.size % X300_FPGA_BIN_SIZE_BYTES));
+ if (session.size > X300_FPGA_BIN_SIZE_BYTES) {
+ throw uhd::runtime_error(
+ str(boost::format("The specified FPGA image is too large: %d vs. %d")
+ % session.size % X300_FPGA_BIN_SIZE_BYTES));
}
/*
* PCIe burning just takes a filepath, even for a .lvbitx file,
* so just extract it to validate the size.
*/
- if(!session.ethernet) session.bitstream.clear();
- }
- else if(extension == ".bin" or extension == ".bit"){
+ if (!session.ethernet)
+ session.bitstream.clear();
+ } else if (extension == ".bin" or extension == ".bit") {
uint32_t max_size = (extension == ".bin") ? X300_FPGA_BIN_SIZE_BYTES
- : X300_FPGA_BIT_SIZE_BYTES;
+ : X300_FPGA_BIT_SIZE_BYTES;
session.size = fs::file_size(session.filepath);
- if(session.size > max_size){
- throw uhd::runtime_error(str(boost::format("The specified FPGA image is too large: %d vs. %d")
- % session.size % max_size));
+ if (session.size > max_size) {
+ throw uhd::runtime_error(
+ str(boost::format("The specified FPGA image is too large: %d vs. %d")
+ % session.size % max_size));
return;
}
- }
- else{
- throw uhd::runtime_error(str(boost::format("Invalid extension \"%s\". Extension must be .bin, .bit, or .lvbitx.")
- % extension));
+ } else {
+ throw uhd::runtime_error(
+ str(boost::format(
+ "Invalid extension \"%s\". Extension must be .bin, .bit, or .lvbitx.")
+ % extension));
}
}
-static void x300_setup_session(x300_session_t &session,
- const device_addr_t &args,
- const std::string &filepath,
- const std::string &outpath){
+static void x300_setup_session(x300_session_t& session,
+ const device_addr_t& args,
+ const std::string& filepath,
+ const std::string& outpath)
+{
device_addrs_t devs = x300_find(args);
- if(devs.size() == 0){
+ if (devs.size() == 0) {
session.found = false;
return;
- }
- else if(devs.size() > 1){
- std::string err_msg = "Could not resolve given args to a single X-Series device.\n"
- "Applicable devices:\n";
-
- for(const uhd::device_addr_t &dev: devs){
- std::string identifier = dev.has_key("addr") ? "addr"
- : "resource";
-
- err_msg += str(boost::format(" * %s (%s=%s)\n")
- % dev.get("product", "X3XX")
- % identifier
- % dev.get(identifier));
+ } else if (devs.size() > 1) {
+ std::string err_msg =
+ "Could not resolve given args to a single X-Series device.\n"
+ "Applicable devices:\n";
+
+ for (const uhd::device_addr_t& dev : devs) {
+ std::string identifier = dev.has_key("addr") ? "addr" : "resource";
+
+ err_msg += str(boost::format(" * %s (%s=%s)\n") % dev.get("product", "X3XX")
+ % identifier % dev.get(identifier));
}
- err_msg += "\nSpecify one of these devices with the given args to load an image onto it.";
+ err_msg += "\nSpecify one of these devices with the given args to load an image "
+ "onto it.";
throw uhd::runtime_error(err_msg);
}
- session.found = true;
+ session.found = true;
session.dev_addr = devs[0];
session.ethernet = session.dev_addr.has_key("addr");
- if(session.ethernet){
- session.ip_addr = session.dev_addr["addr"];
- session.configure = args.has_key("configure");
- session.write_xport = udp_simple::make_connected(session.ip_addr,
- BOOST_STRINGIZE(X300_FPGA_PROG_UDP_PORT));
- session.read_xport = udp_simple::make_connected(session.ip_addr,
- BOOST_STRINGIZE(X300_FPGA_READ_UDP_PORT));
- session.verify = args.has_key("verify");
+ if (session.ethernet) {
+ session.ip_addr = session.dev_addr["addr"];
+ session.configure = args.has_key("configure");
+ session.write_xport = udp_simple::make_connected(
+ session.ip_addr, BOOST_STRINGIZE(X300_FPGA_PROG_UDP_PORT));
+ session.read_xport = udp_simple::make_connected(
+ session.ip_addr, BOOST_STRINGIZE(X300_FPGA_READ_UDP_PORT));
+ session.verify = args.has_key("verify");
session.download = args.has_key("download");
- }
- else{
+ } else {
session.resource = session.dev_addr["resource"];
session.rpc_port = args.get("rpc-port", "5444");
}
/*
- * The user can specify an FPGA type (1G, HGS, XGS), rather than a filename. If the user
- * does not specify one, this will default to the type currently on the device. If this
- * cannot be determined, then the user is forced to specify a filename.
+ * The user can specify an FPGA type (1G, HGS, XGS), rather than a filename. If the
+ * user does not specify one, this will default to the type currently on the device.
+ * If this cannot be determined, then the user is forced to specify a filename.
*/
session.fpga_type = args.get("fpga", session.dev_addr.get("fpga", ""));
- if(filepath == ""){
- if(!session.dev_addr.has_key("product") or session.fpga_type == ""){
- throw uhd::runtime_error("Found a device but could not auto-generate an image filename.");
- }
- else session.filepath = find_image_path(str(boost::format("usrp_%s_fpga_%s.bit")
- % (to_lower_copy(session.dev_addr["product"]))
- % session.fpga_type));
- }
- else session.filepath = filepath;
+ if (filepath == "") {
+ if (!session.dev_addr.has_key("product") or session.fpga_type == "") {
+ throw uhd::runtime_error(
+ "Found a device but could not auto-generate an image filename.");
+ } else
+ session.filepath = find_image_path(
+ str(boost::format("usrp_%s_fpga_%s.bit")
+ % (to_lower_copy(session.dev_addr["product"])) % session.fpga_type));
+ } else
+ session.filepath = filepath;
/*
* The user can specify an output image path, or UHD will use the
* system temporary path by default
*/
- if(outpath == ""){
- if(!session.dev_addr.has_key("product") or session.fpga_type == ""){
- throw uhd::runtime_error("Found a device but could not auto-generate an image filename.");
+ if (outpath == "") {
+ if (!session.dev_addr.has_key("product") or session.fpga_type == "") {
+ throw uhd::runtime_error(
+ "Found a device but could not auto-generate an image filename.");
}
- std::string filename = str(boost::format("usrp_%s_fpga_%s")
- % (to_lower_copy(session.dev_addr["product"]))
- % session.fpga_type);
+ std::string filename =
+ str(boost::format("usrp_%s_fpga_%s")
+ % (to_lower_copy(session.dev_addr["product"])) % session.fpga_type);
session.outpath = get_tmp_path() + "/" + filename;
} else {
@@ -244,172 +261,180 @@ static void x300_setup_session(x300_session_t &session,
* Ethernet communication functions
*/
static UHD_INLINE size_t x300_send_and_recv(udp_simple::sptr xport,
- uint32_t pkt_code,
- x300_fpga_update_data_t *pkt_out,
- uint8_t* data){
+ uint32_t pkt_code,
+ x300_fpga_update_data_t* pkt_out,
+ uint8_t* data)
+{
pkt_out->flags = uhd::htonx<uint32_t>(pkt_code);
xport->send(boost::asio::buffer(pkt_out, sizeof(*pkt_out)));
return xport->recv(boost::asio::buffer(data, udp_simple::mtu), UDP_TIMEOUT);
}
-static UHD_INLINE bool x300_recv_ok(const x300_fpga_update_data_t *pkt_in,
- size_t len){
- return (len > 0 and
- ((ntohl(pkt_in->flags) & X300_FPGA_PROG_FLAGS_ERROR) != X300_FPGA_PROG_FLAGS_ERROR));
+static UHD_INLINE bool x300_recv_ok(const x300_fpga_update_data_t* pkt_in, size_t len)
+{
+ return (len > 0
+ and ((ntohl(pkt_in->flags) & X300_FPGA_PROG_FLAGS_ERROR)
+ != X300_FPGA_PROG_FLAGS_ERROR));
}
// Image data needs to be bitswapped
-static UHD_INLINE void x300_bitswap(uint8_t *num){
+static UHD_INLINE void x300_bitswap(uint8_t* num)
+{
*num = ((*num & 0xF0) >> 4) | ((*num & 0x0F) << 4);
*num = ((*num & 0xCC) >> 2) | ((*num & 0x33) << 2);
*num = ((*num & 0xAA) >> 1) | ((*num & 0x55) << 1);
}
-static void x300_ethernet_load(x300_session_t &session){
-
+static void x300_ethernet_load(x300_session_t& session)
+{
// UDP receive buffer
x300_fpga_update_data_t pkt_out;
- const x300_fpga_update_data_t *pkt_in = reinterpret_cast<const x300_fpga_update_data_t*>(session.data_in);
+ const x300_fpga_update_data_t* pkt_in =
+ reinterpret_cast<const x300_fpga_update_data_t*>(session.data_in);
// Initialize write session
uint32_t flags = X300_FPGA_PROG_FLAGS_ACK | X300_FPGA_PROG_FLAGS_INIT;
- size_t len = x300_send_and_recv(session.write_xport, flags, &pkt_out, session.data_in);
- if(x300_recv_ok(pkt_in, len)){
+ size_t len =
+ x300_send_and_recv(session.write_xport, flags, &pkt_out, session.data_in);
+ if (x300_recv_ok(pkt_in, len)) {
std::cout << "-- Initializing FPGA loading..." << std::flush;
- }
- else if(len == 0){
+ } else if (len == 0) {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else{
+ } else {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Device reported an error during initialization.");
}
std::cout << "successful." << std::endl;
- if(session.verify){
- std::cout << "-- NOTE: Device is verifying the image it is receiving, increasing the loading time." << std::endl;
+ if (session.verify) {
+ std::cout << "-- NOTE: Device is verifying the image it is receiving, increasing "
+ "the loading time."
+ << std::endl;
}
size_t current_pos = 0;
- size_t sectors = (session.size / X300_FLASH_SECTOR_SIZE);
+ size_t sectors = (session.size / X300_FLASH_SECTOR_SIZE);
std::ifstream image(session.filepath.c_str(), std::ios::binary);
// Each sector
- for(size_t i = 0; i < session.size; i += X300_FLASH_SECTOR_SIZE){
-
+ for (size_t i = 0; i < session.size; i += X300_FLASH_SECTOR_SIZE) {
// Print progress percentage at beginning of each sector
std::cout << boost::format("\r-- Loading %s FPGA image: %d%% (%d/%d sectors)")
- % session.fpga_type
- % (int(double(i) / double(session.size) * 100.0))
- % (i / X300_FLASH_SECTOR_SIZE)
- % sectors
- << std::flush;
+ % session.fpga_type
+ % (int(double(i) / double(session.size) * 100.0))
+ % (i / X300_FLASH_SECTOR_SIZE) % sectors
+ << std::flush;
// Each packet
- for(size_t j = i; (j < session.size and j < (i+X300_FLASH_SECTOR_SIZE)); j += X300_PACKET_SIZE_BYTES){
+ for (size_t j = i; (j < session.size and j < (i + X300_FLASH_SECTOR_SIZE));
+ j += X300_PACKET_SIZE_BYTES) {
flags = X300_FPGA_PROG_FLAGS_ACK;
- if(j == i) flags |= X300_FPGA_PROG_FLAGS_ERASE; // Erase at beginning of sector
- if(session.verify) flags |= X300_FPGA_PROG_FLAGS_VERIFY;
+ if (j == i)
+ flags |= X300_FPGA_PROG_FLAGS_ERASE; // Erase at beginning of sector
+ if (session.verify)
+ flags |= X300_FPGA_PROG_FLAGS_VERIFY;
// Set burn location
- pkt_out.sector = htonx<uint32_t>(X300_FPGA_SECTOR_START + (i/X300_FLASH_SECTOR_SIZE));
- pkt_out.index = htonx<uint32_t>((j % X300_FLASH_SECTOR_SIZE) / 2);
- pkt_out.size = htonx<uint32_t>(X300_PACKET_SIZE_BYTES / 2);
+ pkt_out.sector =
+ htonx<uint32_t>(X300_FPGA_SECTOR_START + (i / X300_FLASH_SECTOR_SIZE));
+ pkt_out.index = htonx<uint32_t>((j % X300_FLASH_SECTOR_SIZE) / 2);
+ pkt_out.size = htonx<uint32_t>(X300_PACKET_SIZE_BYTES / 2);
// Read next piece of image
memset(pkt_out.data8, 0, X300_PACKET_SIZE_BYTES);
- if(session.lvbitx){
- memcpy(pkt_out.data8, &session.bitstream[current_pos], X300_PACKET_SIZE_BYTES);
+ if (session.lvbitx) {
+ memcpy(pkt_out.data8,
+ &session.bitstream[current_pos],
+ X300_PACKET_SIZE_BYTES);
current_pos += X300_PACKET_SIZE_BYTES;
- }
- else{
+ } else {
image.read((char*)pkt_out.data8, X300_PACKET_SIZE_BYTES);
}
// Data must be bitswapped and byteswapped
- for(size_t k = 0; k < X300_PACKET_SIZE_BYTES; k++){
+ for (size_t k = 0; k < X300_PACKET_SIZE_BYTES; k++) {
x300_bitswap(&pkt_out.data8[k]);
}
- for(size_t k = 0; k < (X300_PACKET_SIZE_BYTES/2); k++){
+ for (size_t k = 0; k < (X300_PACKET_SIZE_BYTES / 2); k++) {
pkt_out.data16[k] = htonx<uint16_t>(pkt_out.data16[k]);
}
- len = x300_send_and_recv(session.write_xport, flags, &pkt_out, session.data_in);
- if(len == 0){
- if(!session.lvbitx) image.close();
+ len =
+ x300_send_and_recv(session.write_xport, flags, &pkt_out, session.data_in);
+ if (len == 0) {
+ if (!session.lvbitx)
+ image.close();
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else if((ntohl(pkt_in->flags) & X300_FPGA_PROG_FLAGS_ERROR)){
- if(!session.lvbitx) image.close();
+ } else if ((ntohl(pkt_in->flags) & X300_FPGA_PROG_FLAGS_ERROR)) {
+ if (!session.lvbitx)
+ image.close();
throw uhd::runtime_error("Device reported an error.");
}
}
}
- if(!session.lvbitx){
+ if (!session.lvbitx) {
image.close();
}
std::cout << boost::format("\r-- Loading %s FPGA image: 100%% (%d/%d sectors)")
- % session.fpga_type
- % sectors
- % sectors
- << std::endl;
+ % session.fpga_type % sectors % sectors
+ << std::endl;
// Cleanup
- if(!session.lvbitx) image.close();
- flags = (X300_FPGA_PROG_FLAGS_CLEANUP | X300_FPGA_PROG_FLAGS_ACK);
+ if (!session.lvbitx)
+ image.close();
+ flags = (X300_FPGA_PROG_FLAGS_CLEANUP | X300_FPGA_PROG_FLAGS_ACK);
pkt_out.sector = pkt_out.index = pkt_out.size = 0;
memset(pkt_out.data8, 0, X300_PACKET_SIZE_BYTES);
std::cout << "-- Finalizing image load..." << std::flush;
len = x300_send_and_recv(session.write_xport, flags, &pkt_out, session.data_in);
- if(len == 0){
+ if (len == 0) {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else if((ntohl(pkt_in->flags) & X300_FPGA_PROG_FLAGS_ERROR)){
+ } else if ((ntohl(pkt_in->flags) & X300_FPGA_PROG_FLAGS_ERROR)) {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Device reported an error during cleanup.");
- }
- else std::cout << "successful." << std::endl;
+ } else
+ std::cout << "successful." << std::endl;
// Save new FPGA image (if option set)
- if(session.configure){
+ if (session.configure) {
flags = (X300_FPGA_PROG_CONFIGURE | X300_FPGA_PROG_FLAGS_ACK);
x300_send_and_recv(session.write_xport, flags, &pkt_out, session.data_in);
std::cout << "-- Saving image onto device..." << std::flush;
- if(len == 0){
+ if (len == 0) {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else if((ntohl(pkt_in->flags) & X300_FPGA_PROG_FLAGS_ERROR)){
+ } else if ((ntohl(pkt_in->flags) & X300_FPGA_PROG_FLAGS_ERROR)) {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Device reported an error while saving the image.");
- }
- else std::cout << "successful." << std::endl;
+ } else
+ std::cout << "successful." << std::endl;
}
- std::cout << str(boost::format("Power-cycle the USRP %s to use the new image.") % session.dev_addr.get("product", "")) << std::endl;
+ std::cout << str(boost::format("Power-cycle the USRP %s to use the new image.")
+ % session.dev_addr.get("product", ""))
+ << std::endl;
}
-static void x300_ethernet_read(x300_session_t &session){
-
+static void x300_ethernet_read(x300_session_t& session)
+{
// UDP receive buffer
x300_fpga_update_data_t pkt_out;
memset(pkt_out.data8, 0, X300_PACKET_SIZE_BYTES);
- x300_fpga_update_data_t *pkt_in = reinterpret_cast<x300_fpga_update_data_t*>(session.data_in);
+ x300_fpga_update_data_t* pkt_in =
+ reinterpret_cast<x300_fpga_update_data_t*>(session.data_in);
// Initialize read session
uint32_t flags = X300_FPGA_READ_FLAGS_ACK | X300_FPGA_READ_FLAGS_INIT;
size_t len = x300_send_and_recv(session.read_xport, flags, &pkt_out, session.data_in);
- if(x300_recv_ok(pkt_in, len)){
+ if (x300_recv_ok(pkt_in, len)) {
std::cout << "-- Initializing FPGA reading..." << std::flush;
- }
- else if(len == 0){
+ } else if (len == 0) {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else{
+ } else {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Device reported an error during initialization.");
}
@@ -426,83 +451,79 @@ static void x300_ethernet_read(x300_session_t &session){
pkt_out.size = htonx<uint32_t>(X300_PACKET_SIZE_BYTES / 2);
len = x300_send_and_recv(session.read_xport, flags, &pkt_out, session.data_in);
- if(len == 0){
+ if (len == 0) {
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else if((ntohl(pkt_in->flags) & X300_FPGA_READ_FLAGS_ERROR)){
+ } else if ((ntohl(pkt_in->flags) & X300_FPGA_READ_FLAGS_ERROR)) {
throw uhd::runtime_error("Device reported an error.");
}
// Data must be bitswapped and byteswapped
- for(size_t k = 0; k < X300_PACKET_SIZE_BYTES; k++){
+ for (size_t k = 0; k < X300_PACKET_SIZE_BYTES; k++) {
x300_bitswap(&pkt_in->data8[k]);
}
- for(size_t k = 0; k < (X300_PACKET_SIZE_BYTES/2); k++){
+ for (size_t k = 0; k < (X300_PACKET_SIZE_BYTES / 2); k++) {
pkt_in->data16[k] = htonx<uint16_t>(pkt_in->data16[k]);
}
// Assume the largest size first
size_t image_size = X300_FPGA_BIT_SIZE_BYTES;
- size_t sectors = (image_size / X300_FLASH_SECTOR_SIZE);
+ size_t sectors = (image_size / X300_FLASH_SECTOR_SIZE);
std::string extension(".bit");
// Check for the beginning header sequence to determine
// the total amount of data (.bit vs .bin) on the flash
// The .bit file format includes header information not part of a .bin
- for (size_t i = 0; i < sizeof(X300_FPGA_BIT_HEADER); i++)
- {
- if (pkt_in->data8[i] != X300_FPGA_BIT_HEADER[i])
- {
- std::cout << "-- No *.bit header detected, FPGA image is a raw stream (*.bin)!" << std::endl;
+ for (size_t i = 0; i < sizeof(X300_FPGA_BIT_HEADER); i++) {
+ if (pkt_in->data8[i] != X300_FPGA_BIT_HEADER[i]) {
+ std::cout
+ << "-- No *.bit header detected, FPGA image is a raw stream (*.bin)!"
+ << std::endl;
image_size = X300_FPGA_BIN_SIZE_BYTES;
- sectors = (image_size / X300_FLASH_SECTOR_SIZE);
- extension = std::string(".bin");
+ sectors = (image_size / X300_FLASH_SECTOR_SIZE);
+ extension = std::string(".bin");
break;
}
}
session.outpath += extension;
std::ofstream image(session.outpath.c_str(), std::ios::binary);
- std::cout << boost::format("-- Output FPGA file: %s\n")
- % session.outpath;
+ std::cout << boost::format("-- Output FPGA file: %s\n") % session.outpath;
// Write the first packet
image.write((char*)pkt_in->data8, X300_PACKET_SIZE_BYTES);
// Each sector
size_t pkt_count = X300_PACKET_SIZE_BYTES;
- for(size_t i = 0; i < image_size; i += X300_FLASH_SECTOR_SIZE){
-
+ for (size_t i = 0; i < image_size; i += X300_FLASH_SECTOR_SIZE) {
// Once we determine the image size, print the progress percentage
std::cout << boost::format("\r-- Reading %s FPGA image: %d%% (%d/%d sectors)")
- % session.fpga_type
- % (int(double(i) / double(image_size) * 100.0))
- % (i / X300_FLASH_SECTOR_SIZE)
- % sectors
+ % session.fpga_type
+ % (int(double(i) / double(image_size) * 100.0))
+ % (i / X300_FLASH_SECTOR_SIZE) % sectors
<< std::flush;
// Each packet
- while (pkt_count < image_size and pkt_count < (i + X300_FLASH_SECTOR_SIZE))
- {
+ while (pkt_count < image_size and pkt_count < (i + X300_FLASH_SECTOR_SIZE)) {
// Set burn location
- pkt_out.sector = htonx<uint32_t>(X300_FPGA_SECTOR_START + (i/X300_FLASH_SECTOR_SIZE));
- pkt_out.index = htonx<uint32_t>((pkt_count % X300_FLASH_SECTOR_SIZE) / 2);
+ pkt_out.sector =
+ htonx<uint32_t>(X300_FPGA_SECTOR_START + (i / X300_FLASH_SECTOR_SIZE));
+ pkt_out.index = htonx<uint32_t>((pkt_count % X300_FLASH_SECTOR_SIZE) / 2);
- len = x300_send_and_recv(session.read_xport, flags, &pkt_out, session.data_in);
- if(len == 0){
+ len =
+ x300_send_and_recv(session.read_xport, flags, &pkt_out, session.data_in);
+ if (len == 0) {
image.close();
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else if((ntohl(pkt_in->flags) & X300_FPGA_READ_FLAGS_ERROR)){
+ } else if ((ntohl(pkt_in->flags) & X300_FPGA_READ_FLAGS_ERROR)) {
image.close();
throw uhd::runtime_error("Device reported an error.");
}
// Data must be bitswapped and byteswapped
- for(size_t k = 0; k < X300_PACKET_SIZE_BYTES; k++){
+ for (size_t k = 0; k < X300_PACKET_SIZE_BYTES; k++) {
x300_bitswap(&pkt_in->data8[k]);
}
- for(size_t k = 0; k < (X300_PACKET_SIZE_BYTES/2); k++){
+ for (size_t k = 0; k < (X300_PACKET_SIZE_BYTES / 2); k++) {
pkt_in->data16[k] = htonx<uint16_t>(pkt_in->data16[k]);
}
@@ -510,8 +531,7 @@ static void x300_ethernet_read(x300_session_t &session){
// If this is the last packet, get rid of the extra zero padding
// due to packet size
size_t nbytes = X300_PACKET_SIZE_BYTES;
- if (pkt_count > (image_size - X300_PACKET_SIZE_BYTES))
- {
+ if (pkt_count > (image_size - X300_PACKET_SIZE_BYTES)) {
nbytes = (image_size - pkt_count);
}
@@ -526,85 +546,94 @@ static void x300_ethernet_read(x300_session_t &session){
}
std::cout << boost::format("\r-- Reading %s FPGA image: 100%% (%d/%d sectors)")
- % session.fpga_type
- % sectors
- % sectors
+ % session.fpga_type % sectors % sectors
<< std::endl;
// Cleanup
image.close();
- flags = (X300_FPGA_READ_FLAGS_CLEANUP | X300_FPGA_READ_FLAGS_ACK);
+ flags = (X300_FPGA_READ_FLAGS_CLEANUP | X300_FPGA_READ_FLAGS_ACK);
pkt_out.sector = pkt_out.index = pkt_out.size = 0;
memset(pkt_out.data8, 0, X300_PACKET_SIZE_BYTES);
std::cout << "-- Finalizing image read for verification..." << std::flush;
len = x300_send_and_recv(session.read_xport, flags, &pkt_out, session.data_in);
- if(len == 0){
+ if (len == 0) {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else if((ntohl(pkt_in->flags) & X300_FPGA_READ_FLAGS_ERROR)){
+ } else if ((ntohl(pkt_in->flags) & X300_FPGA_READ_FLAGS_ERROR)) {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Device reported an error during cleanup.");
- }
- else std::cout << "successful image read." << std::endl;
+ } else
+ std::cout << "successful image read." << std::endl;
}
-static void x300_pcie_load(x300_session_t &session){
-
- std::cout << boost::format("\r-- Loading %s FPGA image (this will take 5-10 minutes)...")
- % session.fpga_type
- << std::flush;
+static void x300_pcie_load(x300_session_t& session)
+{
+ std::cout << boost::format(
+ "\r-- Loading %s FPGA image (this will take 5-10 minutes)...")
+ % session.fpga_type
+ << std::flush;
nirio_status status = NiRio_Status_Success;
niusrprio::niusrprio_session fpga_session(session.resource, session.rpc_port);
- nirio_status_chain(fpga_session.download_bitstream_to_flash(session.filepath), status);
+ nirio_status_chain(
+ fpga_session.download_bitstream_to_flash(session.filepath), status);
- if(nirio_status_fatal(status)){
+ if (nirio_status_fatal(status)) {
std::cout << "failed." << std::endl;
- niusrprio::nirio_status_to_exception(status, "NI-RIO reported the following error:");
- }
- else std::cout << "successful." << std::endl;
- std::cout << str(boost::format("Power-cycle the USRP %s to use the new image.") % session.dev_addr.get("product", "")) << std::endl;
+ niusrprio::nirio_status_to_exception(
+ status, "NI-RIO reported the following error:");
+ } else
+ std::cout << "successful." << std::endl;
+ std::cout << str(boost::format("Power-cycle the USRP %s to use the new image.")
+ % session.dev_addr.get("product", ""))
+ << std::endl;
}
-static bool x300_image_loader(const image_loader::image_loader_args_t &image_loader_args){
+static bool x300_image_loader(const image_loader::image_loader_args_t& image_loader_args)
+{
// See if any X3x0 with the given args is found
device_addrs_t devs = x300_find(image_loader_args.args);
- if (devs.size() == 0) return false;
+ if (devs.size() == 0)
+ return false;
x300_session_t session;
x300_setup_session(session,
- image_loader_args.args,
- image_loader_args.fpga_path,
- image_loader_args.out_path);
+ image_loader_args.args,
+ image_loader_args.fpga_path,
+ image_loader_args.out_path);
- if(!session.found) return false;
+ if (!session.found)
+ return false;
std::cout << boost::format("Unit: USRP %s (%s, %s)\nFPGA Image: %s\n")
- % session.dev_addr["product"]
- % session.dev_addr["serial"]
- % session.dev_addr[session.ethernet ? "addr" : "resource"]
- % session.filepath;
+ % session.dev_addr["product"] % session.dev_addr["serial"]
+ % session.dev_addr[session.ethernet ? "addr" : "resource"]
+ % session.filepath;
// Download the FPGA image to a file
- if(image_loader_args.download) {
+ if (image_loader_args.download) {
std::cout << "Attempting to download the FPGA image ..." << std::endl;
x300_ethernet_read(session);
}
- if (not image_loader_args.load_fpga) return true;
+ if (not image_loader_args.load_fpga)
+ return true;
- if (session.ethernet) x300_ethernet_load(session);
- else x300_pcie_load(session);
+ if (session.ethernet)
+ x300_ethernet_load(session);
+ else
+ x300_pcie_load(session);
return true;
}
-UHD_STATIC_BLOCK(register_x300_image_loader){
- std::string recovery_instructions = "Aborting. Your USRP X-Series device will likely be unusable. Visit\n"
- "http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_jtag\n"
- "for details on restoring your device.";
+UHD_STATIC_BLOCK(register_x300_image_loader)
+{
+ std::string recovery_instructions =
+ "Aborting. Your USRP X-Series device will likely be unusable. Visit\n"
+ "http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_jtag\n"
+ "for details on restoring your device.";
image_loader::register_image_loader("x300", x300_image_loader, recovery_instructions);
}
diff --git a/host/lib/usrp/x300/x300_impl.cpp b/host/lib/usrp/x300/x300_impl.cpp
index 7d2ce6b28..ed6678761 100644
--- a/host/lib/usrp/x300/x300_impl.cpp
+++ b/host/lib/usrp/x300/x300_impl.cpp
@@ -7,29 +7,28 @@
#include "x300_impl.hpp"
#include "x300_lvbitx.hpp"
-#include "x310_lvbitx.hpp"
#include "x300_mb_eeprom_iface.hpp"
-#include <uhdlib/usrp/common/apply_corrections.hpp>
-#include <uhd/utils/static.hpp>
-#include <uhd/utils/log.hpp>
-#include <uhd/utils/paths.hpp>
-#include <uhd/utils/safe_call.hpp>
-#include <uhd/usrp/subdev_spec.hpp>
+#include "x310_lvbitx.hpp"
#include <uhd/transport/if_addrs.hpp>
-#include <uhd/transport/udp_zero_copy.hpp>
+#include <uhd/transport/nirio/niusrprio_session.h>
+#include <uhd/transport/nirio_zero_copy.hpp>
#include <uhd/transport/udp_constants.hpp>
+#include <uhd/transport/udp_zero_copy.hpp>
#include <uhd/transport/zero_copy_recv_offload.hpp>
-#include <uhd/transport/nirio_zero_copy.hpp>
-#include <uhd/transport/nirio/niusrprio_session.h>
-#include <uhd/utils/platform.hpp>
#include <uhd/types/sid.hpp>
+#include <uhd/usrp/subdev_spec.hpp>
+#include <uhd/utils/log.hpp>
#include <uhd/utils/math.hpp>
-
+#include <uhd/utils/paths.hpp>
+#include <uhd/utils/platform.hpp>
+#include <uhd/utils/safe_call.hpp>
+#include <uhd/utils/static.hpp>
+#include <uhdlib/usrp/common/apply_corrections.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/asio.hpp>
#include <boost/make_shared.hpp>
-#include <fstream>
#include <chrono>
+#include <fstream>
#include <thread>
using namespace uhd;
@@ -45,27 +44,28 @@ namespace asio = boost::asio;
/******************************************************************************
* Helpers
*****************************************************************************/
-static std::string get_fpga_option(wb_iface::sptr zpu_ctrl) {
- //Possible options:
- //1G = {0:1G, 1:1G} w/ DRAM, HG = {0:1G, 1:10G} w/ DRAM, XG = {0:10G, 1:10G} w/ DRAM
- //HA = {0:1G, 1:Aurora} w/ DRAM, XA = {0:10G, 1:Aurora} w/ DRAM
+static std::string get_fpga_option(wb_iface::sptr zpu_ctrl)
+{
+ // Possible options:
+ // 1G = {0:1G, 1:1G} w/ DRAM, HG = {0:1G, 1:10G} w/ DRAM, XG = {0:10G, 1:10G} w/
+ // DRAM HA = {0:1G, 1:Aurora} w/ DRAM, XA = {0:10G, 1:Aurora} w/ DRAM
std::string option;
uint32_t sfp0_type = zpu_ctrl->peek32(SR_ADDR(SET0_BASE, ZPU_RB_SFP0_TYPE));
uint32_t sfp1_type = zpu_ctrl->peek32(SR_ADDR(SET0_BASE, ZPU_RB_SFP1_TYPE));
- if (sfp0_type == RB_SFP_1G_ETH and sfp1_type == RB_SFP_1G_ETH) {
+ if (sfp0_type == RB_SFP_1G_ETH and sfp1_type == RB_SFP_1G_ETH) {
option = "1G";
- } else if (sfp0_type == RB_SFP_1G_ETH and sfp1_type == RB_SFP_10G_ETH) {
+ } else if (sfp0_type == RB_SFP_1G_ETH and sfp1_type == RB_SFP_10G_ETH) {
option = "HG";
- } else if (sfp0_type == RB_SFP_10G_ETH and sfp1_type == RB_SFP_10G_ETH) {
+ } else if (sfp0_type == RB_SFP_10G_ETH and sfp1_type == RB_SFP_10G_ETH) {
option = "XG";
- } else if (sfp0_type == RB_SFP_1G_ETH and sfp1_type == RB_SFP_AURORA) {
+ } else if (sfp0_type == RB_SFP_1G_ETH and sfp1_type == RB_SFP_AURORA) {
option = "HA";
- } else if (sfp0_type == RB_SFP_10G_ETH and sfp1_type == RB_SFP_AURORA) {
+ } else if (sfp0_type == RB_SFP_10G_ETH and sfp1_type == RB_SFP_AURORA) {
option = "XA";
} else {
- option = "HG"; //Default
+ option = "HG"; // Default
}
return option;
}
@@ -73,153 +73,150 @@ static std::string get_fpga_option(wb_iface::sptr zpu_ctrl) {
namespace {
- /*! Return the correct motherboard type for a given product ID
- *
- * Note: In previous versions, we had two different mappings for PCIe and
- * Ethernet in case the PIDs would conflict, but they never did and it was
- * thus consolidated into one.
- */
- x300_impl::x300_mboard_t map_pid_to_mb_type(const uint32_t pid)
- {
- switch (pid) {
- case X300_USRP_PCIE_SSID_ADC_33:
- case X300_USRP_PCIE_SSID_ADC_18:
- return x300_impl::USRP_X300_MB;
- case X310_USRP_PCIE_SSID_ADC_33:
- case X310_2940R_40MHz_PCIE_SSID_ADC_33:
- case X310_2940R_120MHz_PCIE_SSID_ADC_33:
- case X310_2942R_40MHz_PCIE_SSID_ADC_33:
- case X310_2942R_120MHz_PCIE_SSID_ADC_33:
- case X310_2943R_40MHz_PCIE_SSID_ADC_33:
- case X310_2943R_120MHz_PCIE_SSID_ADC_33:
- case X310_2944R_40MHz_PCIE_SSID_ADC_33:
- case X310_2950R_40MHz_PCIE_SSID_ADC_33:
- case X310_2950R_120MHz_PCIE_SSID_ADC_33:
- case X310_2952R_40MHz_PCIE_SSID_ADC_33:
- case X310_2952R_120MHz_PCIE_SSID_ADC_33:
- case X310_2953R_40MHz_PCIE_SSID_ADC_33:
- case X310_2953R_120MHz_PCIE_SSID_ADC_33:
- case X310_2954R_40MHz_PCIE_SSID_ADC_33:
- case X310_USRP_PCIE_SSID_ADC_18:
- case X310_2940R_40MHz_PCIE_SSID_ADC_18:
- case X310_2940R_120MHz_PCIE_SSID_ADC_18:
- case X310_2942R_40MHz_PCIE_SSID_ADC_18:
- case X310_2942R_120MHz_PCIE_SSID_ADC_18:
- case X310_2943R_40MHz_PCIE_SSID_ADC_18:
- case X310_2943R_120MHz_PCIE_SSID_ADC_18:
- case X310_2944R_40MHz_PCIE_SSID_ADC_18:
- case X310_2945R_PCIE_SSID_ADC_18:
- case X310_2950R_40MHz_PCIE_SSID_ADC_18:
- case X310_2950R_120MHz_PCIE_SSID_ADC_18:
- case X310_2952R_40MHz_PCIE_SSID_ADC_18:
- case X310_2952R_120MHz_PCIE_SSID_ADC_18:
- case X310_2953R_40MHz_PCIE_SSID_ADC_18:
- case X310_2953R_120MHz_PCIE_SSID_ADC_18:
- case X310_2954R_40MHz_PCIE_SSID_ADC_18:
- case X310_2955R_PCIE_SSID_ADC_18:
- return x300_impl::USRP_X310_MB;
- case X310_2974_PCIE_SSID_ADC_18:
- return x300_impl::USRP_X310_MB_NI_2974;
- default:
- return x300_impl::UNKNOWN;
- }
- UHD_THROW_INVALID_CODE_PATH();
+/*! Return the correct motherboard type for a given product ID
+ *
+ * Note: In previous versions, we had two different mappings for PCIe and
+ * Ethernet in case the PIDs would conflict, but they never did and it was
+ * thus consolidated into one.
+ */
+x300_impl::x300_mboard_t map_pid_to_mb_type(const uint32_t pid)
+{
+ switch (pid) {
+ case X300_USRP_PCIE_SSID_ADC_33:
+ case X300_USRP_PCIE_SSID_ADC_18:
+ return x300_impl::USRP_X300_MB;
+ case X310_USRP_PCIE_SSID_ADC_33:
+ case X310_2940R_40MHz_PCIE_SSID_ADC_33:
+ case X310_2940R_120MHz_PCIE_SSID_ADC_33:
+ case X310_2942R_40MHz_PCIE_SSID_ADC_33:
+ case X310_2942R_120MHz_PCIE_SSID_ADC_33:
+ case X310_2943R_40MHz_PCIE_SSID_ADC_33:
+ case X310_2943R_120MHz_PCIE_SSID_ADC_33:
+ case X310_2944R_40MHz_PCIE_SSID_ADC_33:
+ case X310_2950R_40MHz_PCIE_SSID_ADC_33:
+ case X310_2950R_120MHz_PCIE_SSID_ADC_33:
+ case X310_2952R_40MHz_PCIE_SSID_ADC_33:
+ case X310_2952R_120MHz_PCIE_SSID_ADC_33:
+ case X310_2953R_40MHz_PCIE_SSID_ADC_33:
+ case X310_2953R_120MHz_PCIE_SSID_ADC_33:
+ case X310_2954R_40MHz_PCIE_SSID_ADC_33:
+ case X310_USRP_PCIE_SSID_ADC_18:
+ case X310_2940R_40MHz_PCIE_SSID_ADC_18:
+ case X310_2940R_120MHz_PCIE_SSID_ADC_18:
+ case X310_2942R_40MHz_PCIE_SSID_ADC_18:
+ case X310_2942R_120MHz_PCIE_SSID_ADC_18:
+ case X310_2943R_40MHz_PCIE_SSID_ADC_18:
+ case X310_2943R_120MHz_PCIE_SSID_ADC_18:
+ case X310_2944R_40MHz_PCIE_SSID_ADC_18:
+ case X310_2945R_PCIE_SSID_ADC_18:
+ case X310_2950R_40MHz_PCIE_SSID_ADC_18:
+ case X310_2950R_120MHz_PCIE_SSID_ADC_18:
+ case X310_2952R_40MHz_PCIE_SSID_ADC_18:
+ case X310_2952R_120MHz_PCIE_SSID_ADC_18:
+ case X310_2953R_40MHz_PCIE_SSID_ADC_18:
+ case X310_2953R_120MHz_PCIE_SSID_ADC_18:
+ case X310_2954R_40MHz_PCIE_SSID_ADC_18:
+ case X310_2955R_PCIE_SSID_ADC_18:
+ return x300_impl::USRP_X310_MB;
+ case X310_2974_PCIE_SSID_ADC_18:
+ return x300_impl::USRP_X310_MB_NI_2974;
+ default:
+ return x300_impl::UNKNOWN;
}
+ UHD_THROW_INVALID_CODE_PATH();
+}
- /*! Map the motherboard type to a product name
- */
- std::string map_mb_type_to_product_name(
- const x300_impl::x300_mboard_t mb_type,
- const std::string& default_name="")
- {
- switch (mb_type) {
- case x300_impl::USRP_X300_MB:
- return "X300";
- case x300_impl::USRP_X310_MB:
- return "X310";
- case x300_impl::USRP_X310_MB_NI_2974:
- return "NI-2974";
- default:
- return default_name;
- }
+/*! Map the motherboard type to a product name
+ */
+std::string map_mb_type_to_product_name(
+ const x300_impl::x300_mboard_t mb_type, const std::string& default_name = "")
+{
+ switch (mb_type) {
+ case x300_impl::USRP_X300_MB:
+ return "X300";
+ case x300_impl::USRP_X310_MB:
+ return "X310";
+ case x300_impl::USRP_X310_MB_NI_2974:
+ return "NI-2974";
+ default:
+ return default_name;
}
+}
-} /* namespace anon */
+} // namespace
/***********************************************************************
* Discovery over the udp and pcie transport
**********************************************************************/
//@TODO: Refactor the find functions to collapse common code for ethernet and PCIe
-static device_addrs_t x300_find_with_addr(const device_addr_t &hint)
+static device_addrs_t x300_find_with_addr(const device_addr_t& hint)
{
- udp_simple::sptr comm = udp_simple::make_broadcast(
- hint["addr"], BOOST_STRINGIZE(X300_FW_COMMS_UDP_PORT));
+ udp_simple::sptr comm =
+ udp_simple::make_broadcast(hint["addr"], BOOST_STRINGIZE(X300_FW_COMMS_UDP_PORT));
- //load request struct
+ // load request struct
x300_fw_comms_t request = x300_fw_comms_t();
- request.flags = uhd::htonx<uint32_t>(X300_FW_COMMS_FLAGS_ACK);
- request.sequence = uhd::htonx<uint32_t>(std::rand());
+ request.flags = uhd::htonx<uint32_t>(X300_FW_COMMS_FLAGS_ACK);
+ request.sequence = uhd::htonx<uint32_t>(std::rand());
- //send request
+ // send request
comm->send(asio::buffer(&request, sizeof(request)));
- //loop for replies until timeout
+ // loop for replies until timeout
device_addrs_t addrs;
- while (true)
- {
+ while (true) {
char buff[X300_FW_COMMS_MTU] = {};
- const size_t nbytes = comm->recv(asio::buffer(buff), 0.050);
- if (nbytes == 0) break;
- const x300_fw_comms_t *reply = (const x300_fw_comms_t *)buff;
- if (request.flags != reply->flags) continue;
- if (request.sequence != reply->sequence) continue;
+ const size_t nbytes = comm->recv(asio::buffer(buff), 0.050);
+ if (nbytes == 0)
+ break;
+ const x300_fw_comms_t* reply = (const x300_fw_comms_t*)buff;
+ if (request.flags != reply->flags)
+ continue;
+ if (request.sequence != reply->sequence)
+ continue;
device_addr_t new_addr;
new_addr["type"] = "x300";
new_addr["addr"] = comm->get_recv_addr();
- //Attempt to read the name from the EEPROM and perform filtering.
- //This operation can throw due to compatibility mismatch.
- try
- {
+ // Attempt to read the name from the EEPROM and perform filtering.
+ // This operation can throw due to compatibility mismatch.
+ try {
wb_iface::sptr zpu_ctrl = x300_make_ctrl_iface_enet(
- udp_simple::make_connected(new_addr["addr"],
- BOOST_STRINGIZE(X300_FW_COMMS_UDP_PORT)),
+ udp_simple::make_connected(
+ new_addr["addr"], BOOST_STRINGIZE(X300_FW_COMMS_UDP_PORT)),
false /* Suppress timeout errors */
);
new_addr["fpga"] = get_fpga_option(zpu_ctrl);
- i2c_core_100_wb32::sptr zpu_i2c = i2c_core_100_wb32::make(zpu_ctrl, I2C1_BASE);
- x300_mb_eeprom_iface::sptr eeprom_iface = x300_mb_eeprom_iface::make(zpu_ctrl, zpu_i2c);
- const mboard_eeprom_t mb_eeprom =
- x300_impl::get_mb_eeprom(eeprom_iface);
- if (mb_eeprom.size() == 0 or x300_impl::claim_status(zpu_ctrl) == x300_impl::CLAIMED_BY_OTHER)
- {
+ i2c_core_100_wb32::sptr zpu_i2c =
+ i2c_core_100_wb32::make(zpu_ctrl, I2C1_BASE);
+ x300_mb_eeprom_iface::sptr eeprom_iface =
+ x300_mb_eeprom_iface::make(zpu_ctrl, zpu_i2c);
+ const mboard_eeprom_t mb_eeprom = x300_impl::get_mb_eeprom(eeprom_iface);
+ if (mb_eeprom.size() == 0
+ or x300_impl::claim_status(zpu_ctrl) == x300_impl::CLAIMED_BY_OTHER) {
// Skip device claimed by another process
continue;
}
- new_addr["name"] = mb_eeprom["name"];
- new_addr["serial"] = mb_eeprom["serial"];
+ new_addr["name"] = mb_eeprom["name"];
+ new_addr["serial"] = mb_eeprom["serial"];
const std::string product_name = map_mb_type_to_product_name(
x300_impl::get_mb_type_from_eeprom(mb_eeprom));
if (!product_name.empty()) {
new_addr["product"] = product_name;
}
- }
- catch(const std::exception &)
- {
- //set these values as empty string so the device may still be found
- //and the filter's below can still operate on the discovered device
- new_addr["name"] = "";
+ } catch (const std::exception&) {
+ // set these values as empty string so the device may still be found
+ // and the filter's below can still operate on the discovered device
+ new_addr["name"] = "";
new_addr["serial"] = "";
}
- //filter the discovered device below by matching optional keys
- if (
- (not hint.has_key("name") or hint["name"] == new_addr["name"]) and
- (not hint.has_key("serial") or hint["serial"] == new_addr["serial"]) and
- (not hint.has_key("product") or hint["product"] == new_addr["product"])
- ){
+ // filter the discovered device below by matching optional keys
+ if ((not hint.has_key("name") or hint["name"] == new_addr["name"])
+ and (not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
+ and (not hint.has_key("product") or hint["product"] == new_addr["product"])) {
addrs.push_back(new_addr);
}
}
@@ -228,13 +225,13 @@ static device_addrs_t x300_find_with_addr(const device_addr_t &hint)
}
-//We need a zpu xport registry to ensure synchronization between the static finder method
-//and the instances of the x300_impl class.
-typedef uhd::dict< std::string, boost::weak_ptr<wb_iface> > pcie_zpu_iface_registry_t;
+// We need a zpu xport registry to ensure synchronization between the static finder method
+// and the instances of the x300_impl class.
+typedef uhd::dict<std::string, boost::weak_ptr<wb_iface>> pcie_zpu_iface_registry_t;
UHD_SINGLETON_FCN(pcie_zpu_iface_registry_t, get_pcie_zpu_iface_registry)
static boost::mutex pcie_zpu_iface_registry_mutex;
-static device_addrs_t x300_find_pcie(const device_addr_t &hint, bool explicit_query)
+static device_addrs_t x300_find_pcie(const device_addr_t& hint, bool explicit_query)
{
std::string rpc_port_name(std::to_string(NIUSRPRIO_DEFAULT_RPC_PORT));
if (hint.has_key("niusrpriorpc_port")) {
@@ -244,12 +241,13 @@ static device_addrs_t x300_find_pcie(const device_addr_t &hint, bool explicit_qu
device_addrs_t addrs;
niusrprio_session::device_info_vtr dev_info_vtr;
nirio_status status = niusrprio_session::enumerate(rpc_port_name, dev_info_vtr);
- if (explicit_query) nirio_status_to_exception(status, "x300_find_pcie: Error enumerating NI-RIO devices.");
+ if (explicit_query)
+ nirio_status_to_exception(
+ status, "x300_find_pcie: Error enumerating NI-RIO devices.");
- for(niusrprio_session::device_info &dev_info: dev_info_vtr)
- {
+ for (niusrprio_session::device_info& dev_info : dev_info_vtr) {
device_addr_t new_addr;
- new_addr["type"] = "x300";
+ new_addr["type"] = "x300";
new_addr["resource"] = dev_info.resource_name;
std::string resource_d(dev_info.resource_name);
boost::to_upper(resource_d);
@@ -262,157 +260,154 @@ static device_addrs_t x300_find_pcie(const device_addr_t &hint, bool explicit_qu
new_addr["product"] = product_name;
}
- niriok_proxy::sptr kernel_proxy = niriok_proxy::make_and_open(dev_info.interface_path);
+ niriok_proxy::sptr kernel_proxy =
+ niriok_proxy::make_and_open(dev_info.interface_path);
- //Attempt to read the name from the EEPROM and perform filtering.
- //This operation can throw due to compatibility mismatch.
- try
- {
- //This block could throw an exception if the user is switching to using UHD
- //after LabVIEW FPGA. In that case, skip reading the name and serial and pick
- //a default FPGA flavor. During make, a new image will be loaded and everything
- //will be OK
+ // Attempt to read the name from the EEPROM and perform filtering.
+ // This operation can throw due to compatibility mismatch.
+ try {
+ // This block could throw an exception if the user is switching to using UHD
+ // after LabVIEW FPGA. In that case, skip reading the name and serial and pick
+ // a default FPGA flavor. During make, a new image will be loaded and
+ // everything will be OK
wb_iface::sptr zpu_ctrl;
- //Hold on to the registry mutex as long as zpu_ctrl is alive
- //to prevent any use by different threads while enumerating
+ // Hold on to the registry mutex as long as zpu_ctrl is alive
+ // to prevent any use by different threads while enumerating
boost::mutex::scoped_lock lock(pcie_zpu_iface_registry_mutex);
if (get_pcie_zpu_iface_registry().has_key(resource_d)) {
zpu_ctrl = get_pcie_zpu_iface_registry()[resource_d].lock();
- if (!zpu_ctrl)
- {
+ if (!zpu_ctrl) {
get_pcie_zpu_iface_registry().pop(resource_d);
}
}
// if the registry didn't have a key OR that key was an orphaned weak_ptr
- if (!zpu_ctrl)
- {
- zpu_ctrl = x300_make_ctrl_iface_pcie(kernel_proxy, false /* suppress timeout errors */);
- //We don't put this zpu_ctrl in the registry because we need
- //a persistent niriok_proxy associated with the object
+ if (!zpu_ctrl) {
+ zpu_ctrl = x300_make_ctrl_iface_pcie(
+ kernel_proxy, false /* suppress timeout errors */);
+ // We don't put this zpu_ctrl in the registry because we need
+ // a persistent niriok_proxy associated with the object
}
- //Attempt to autodetect the FPGA type
+ // Attempt to autodetect the FPGA type
if (not hint.has_key("fpga")) {
new_addr["fpga"] = get_fpga_option(zpu_ctrl);
}
- i2c_core_100_wb32::sptr zpu_i2c = i2c_core_100_wb32::make(zpu_ctrl, I2C1_BASE);
- x300_mb_eeprom_iface::sptr eeprom_iface = x300_mb_eeprom_iface::make(zpu_ctrl, zpu_i2c);
- const mboard_eeprom_t mb_eeprom =
- x300_impl::get_mb_eeprom(eeprom_iface);
- if (mb_eeprom.size() == 0 or x300_impl::claim_status(zpu_ctrl) == x300_impl::CLAIMED_BY_OTHER)
- {
+ i2c_core_100_wb32::sptr zpu_i2c =
+ i2c_core_100_wb32::make(zpu_ctrl, I2C1_BASE);
+ x300_mb_eeprom_iface::sptr eeprom_iface =
+ x300_mb_eeprom_iface::make(zpu_ctrl, zpu_i2c);
+ const mboard_eeprom_t mb_eeprom = x300_impl::get_mb_eeprom(eeprom_iface);
+ if (mb_eeprom.size() == 0
+ or x300_impl::claim_status(zpu_ctrl) == x300_impl::CLAIMED_BY_OTHER) {
// Skip device claimed by another process
continue;
}
- new_addr["name"] = mb_eeprom["name"];
+ new_addr["name"] = mb_eeprom["name"];
new_addr["serial"] = mb_eeprom["serial"];
- }
- catch(const std::exception &)
- {
- //set these values as empty string so the device may still be found
- //and the filter's below can still operate on the discovered device
+ } catch (const std::exception&) {
+ // set these values as empty string so the device may still be found
+ // and the filter's below can still operate on the discovered device
if (not hint.has_key("fpga")) {
new_addr["fpga"] = "HG";
}
- new_addr["name"] = "";
+ new_addr["name"] = "";
new_addr["serial"] = "";
}
- //filter the discovered device below by matching optional keys
+ // filter the discovered device below by matching optional keys
std::string resource_i = hint.has_key("resource") ? hint["resource"] : "";
boost::to_upper(resource_i);
- if (
- (not hint.has_key("resource") or resource_i == resource_d) and
- (not hint.has_key("name") or hint["name"] == new_addr["name"]) and
- (not hint.has_key("serial") or hint["serial"] == new_addr["serial"]) and
- (not hint.has_key("product") or hint["product"] == new_addr["product"])
- ){
+ if ((not hint.has_key("resource") or resource_i == resource_d)
+ and (not hint.has_key("name") or hint["name"] == new_addr["name"])
+ and (not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
+ and (not hint.has_key("product") or hint["product"] == new_addr["product"])) {
addrs.push_back(new_addr);
}
}
return addrs;
}
-device_addrs_t x300_find(const device_addr_t &hint_)
+device_addrs_t x300_find(const device_addr_t& hint_)
{
- //handle the multi-device discovery
+ // handle the multi-device discovery
device_addrs_t hints = separate_device_addr(hint_);
- if (hints.size() > 1)
- {
+ if (hints.size() > 1) {
device_addrs_t found_devices;
std::string error_msg;
- for(const device_addr_t &hint_i: hints)
- {
+ for (const device_addr_t& hint_i : hints) {
device_addrs_t found_devices_i = x300_find(hint_i);
- if (found_devices_i.size() != 1) error_msg += str(boost::format(
- "Could not resolve device hint \"%s\" to a single device."
- ) % hint_i.to_string());
- else found_devices.push_back(found_devices_i[0]);
+ if (found_devices_i.size() != 1)
+ error_msg +=
+ str(boost::format(
+ "Could not resolve device hint \"%s\" to a single device.")
+ % hint_i.to_string());
+ else
+ found_devices.push_back(found_devices_i[0]);
}
- if (found_devices.empty()) return device_addrs_t();
- if (not error_msg.empty()) throw uhd::value_error(error_msg);
+ if (found_devices.empty())
+ return device_addrs_t();
+ if (not error_msg.empty())
+ throw uhd::value_error(error_msg);
return device_addrs_t(1, combine_device_addrs(found_devices));
}
- //initialize the hint for a single device case
+ // initialize the hint for a single device case
UHD_ASSERT_THROW(hints.size() <= 1);
- hints.resize(1); //in case it was empty
+ hints.resize(1); // in case it was empty
device_addr_t hint = hints[0];
device_addrs_t addrs;
- if (hint.has_key("type") and hint["type"] != "x300") return addrs;
+ if (hint.has_key("type") and hint["type"] != "x300")
+ return addrs;
- //use the address given
- if (hint.has_key("addr"))
- {
+ // use the address given
+ if (hint.has_key("addr")) {
device_addrs_t reply_addrs;
- try
- {
+ try {
reply_addrs = x300_find_with_addr(hint);
- }
- catch(const std::exception &ex)
- {
- UHD_LOGGER_ERROR("X300") << "X300 Network discovery error " << ex.what() ;
- }
- catch(...)
- {
- UHD_LOGGER_ERROR("X300") << "X300 Network discovery unknown error " ;
+ } catch (const std::exception& ex) {
+ UHD_LOGGER_ERROR("X300") << "X300 Network discovery error " << ex.what();
+ } catch (...) {
+ UHD_LOGGER_ERROR("X300") << "X300 Network discovery unknown error ";
}
return reply_addrs;
}
- if (!hint.has_key("resource"))
- {
- //otherwise, no address was specified, send a broadcast on each interface
- for(const if_addrs_t &if_addrs: get_if_addrs())
- {
- //avoid the loopback device
- if (if_addrs.inet == asio::ip::address_v4::loopback().to_string()) continue;
+ if (!hint.has_key("resource")) {
+ // otherwise, no address was specified, send a broadcast on each interface
+ for (const if_addrs_t& if_addrs : get_if_addrs()) {
+ // avoid the loopback device
+ if (if_addrs.inet == asio::ip::address_v4::loopback().to_string())
+ continue;
- //create a new hint with this broadcast address
+ // create a new hint with this broadcast address
device_addr_t new_hint = hint;
- new_hint["addr"] = if_addrs.bcast;
+ new_hint["addr"] = if_addrs.bcast;
- //call discover with the new hint and append results
+ // call discover with the new hint and append results
device_addrs_t new_addrs = x300_find(new_hint);
- //if we are looking for a serial, only add the one device with a matching serial
+ // if we are looking for a serial, only add the one device with a matching
+ // serial
if (hint.has_key("serial")) {
- bool found_serial = false; //signal to break out of the interface loop
- for (device_addrs_t::iterator new_addr_it=new_addrs.begin(); new_addr_it != new_addrs.end(); new_addr_it++) {
+ bool found_serial = false; // signal to break out of the interface loop
+ for (device_addrs_t::iterator new_addr_it = new_addrs.begin();
+ new_addr_it != new_addrs.end();
+ new_addr_it++) {
if ((*new_addr_it)["serial"] == hint["serial"]) {
addrs.insert(addrs.begin(), *new_addr_it);
found_serial = true;
break;
}
}
- if (found_serial) break;
+ if (found_serial)
+ break;
} else {
// Otherwise, add all devices we find
addrs.insert(addrs.begin(), new_addrs.begin(), new_addrs.end());
@@ -421,7 +416,8 @@ device_addrs_t x300_find(const device_addr_t &hint_)
}
device_addrs_t pcie_addrs = x300_find_pcie(hint, hint.has_key("resource"));
- if (not pcie_addrs.empty()) addrs.insert(addrs.end(), pcie_addrs.begin(), pcie_addrs.end());
+ if (not pcie_addrs.empty())
+ addrs.insert(addrs.end(), pcie_addrs.begin(), pcie_addrs.end());
return addrs;
}
@@ -429,7 +425,7 @@ device_addrs_t x300_find(const device_addr_t &hint_)
/***********************************************************************
* Make
**********************************************************************/
-static device::sptr x300_make(const device_addr_t &device_addr)
+static device::sptr x300_make(const device_addr_t& device_addr)
{
return device::sptr(new x300_impl(device_addr));
}
@@ -439,33 +435,33 @@ UHD_STATIC_BLOCK(register_x300_device)
device::register_device(&x300_find, &x300_make, device::USRP);
}
-static void x300_load_fw(wb_iface::sptr fw_reg_ctrl, const std::string &file_name)
+static void x300_load_fw(wb_iface::sptr fw_reg_ctrl, const std::string& file_name)
{
UHD_LOGGER_INFO("X300") << "Loading firmware " << file_name;
- //load file into memory
+ // load file into memory
std::ifstream fw_file(file_name.c_str());
- uint32_t fw_file_buff[X300_FW_NUM_BYTES/sizeof(uint32_t)];
- fw_file.read((char *)fw_file_buff, sizeof(fw_file_buff));
+ uint32_t fw_file_buff[X300_FW_NUM_BYTES / sizeof(uint32_t)];
+ fw_file.read((char*)fw_file_buff, sizeof(fw_file_buff));
fw_file.close();
- //Poke the fw words into the WB boot loader
+ // Poke the fw words into the WB boot loader
fw_reg_ctrl->poke32(SR_ADDR(BOOT_LDR_BASE, BL_ADDRESS), 0);
- for (size_t i = 0; i < X300_FW_NUM_BYTES; i+=sizeof(uint32_t))
- {
- //@TODO: FIXME: Since x300_ctrl_iface acks each write and traps exceptions, the first try for the last word
- // written will print an error because it triggers a FW reload and fails to reply.
- fw_reg_ctrl->poke32(SR_ADDR(BOOT_LDR_BASE, BL_DATA), uhd::byteswap(fw_file_buff[i/sizeof(uint32_t)]));
+ for (size_t i = 0; i < X300_FW_NUM_BYTES; i += sizeof(uint32_t)) {
+ //@TODO: FIXME: Since x300_ctrl_iface acks each write and traps exceptions, the
+ // first try for the last word
+ // written will print an error because it triggers a FW reload and
+ // fails to reply.
+ fw_reg_ctrl->poke32(SR_ADDR(BOOT_LDR_BASE, BL_DATA),
+ uhd::byteswap(fw_file_buff[i / sizeof(uint32_t)]));
}
- //Wait for fimrware to reboot. 3s is an upper bound
+ // Wait for fimrware to reboot. 3s is an upper bound
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
- UHD_LOGGER_INFO("X300") << "Firmware loaded!" ;
+ UHD_LOGGER_INFO("X300") << "Firmware loaded!";
}
-x300_impl::x300_impl(const uhd::device_addr_t &dev_addr)
- : device3_impl()
- , _sid_framer(0)
+x300_impl::x300_impl(const uhd::device_addr_t& dev_addr) : device3_impl(), _sid_framer(0)
{
UHD_LOGGER_INFO("X300") << "X300 initialization sequence...";
_tree->create<std::string>("/name").set("X-Series Device");
@@ -475,8 +471,7 @@ x300_impl::x300_impl(const uhd::device_addr_t &dev_addr)
// Serialize the initialization process
if (dev_addr.has_key("serialize_init") or device_args.size() == 1) {
- for (size_t i = 0; i < device_args.size(); i++)
- {
+ for (size_t i = 0; i < device_args.size(); i++) {
this->setup_mb(i, device_args[i]);
}
return;
@@ -486,26 +481,22 @@ x300_impl::x300_impl(const uhd::device_addr_t &dev_addr)
// Initialize groups of USRPs in parallel
size_t total_usrps = device_args.size();
size_t num_usrps = 0;
- while (num_usrps < total_usrps)
- {
+ while (num_usrps < total_usrps) {
size_t init_usrps = std::min(total_usrps - num_usrps, x300::MAX_INIT_THREADS);
boost::thread_group setup_threads;
- for (size_t i = 0; i < init_usrps; i++)
- {
+ for (size_t i = 0; i < init_usrps; i++) {
const size_t index = num_usrps + i;
- setup_threads.create_thread([this, index, device_args](){
+ setup_threads.create_thread([this, index, device_args]() {
this->setup_mb(index, device_args[index]);
});
}
setup_threads.join_all();
num_usrps += init_usrps;
}
-
}
void x300_impl::mboard_members_t::discover_eth(
- const mboard_eeprom_t mb_eeprom,
- const std::vector<std::string> &ip_addrs)
+ const mboard_eeprom_t mb_eeprom, const std::vector<std::string>& ip_addrs)
{
// Clear any previous addresses added
eth_conns.clear();
@@ -517,16 +508,19 @@ void x300_impl::mboard_members_t::discover_eth(
const std::string key = "ip-addr" + boost::to_string(i);
// Show a warning if there exists duplicate addresses in the mboard eeprom
- if (std::find(mb_eeprom_addrs.begin(), mb_eeprom_addrs.end(), mb_eeprom[key]) != mb_eeprom_addrs.end()) {
- UHD_LOGGER_WARNING("X300") << str(boost::format(
- "Duplicate IP address %s found in mboard EEPROM. "
- "Device may not function properly. View and reprogram the values "
- "using the usrp_burn_mb_eeprom utility.") % mb_eeprom[key]);
+ if (std::find(mb_eeprom_addrs.begin(), mb_eeprom_addrs.end(), mb_eeprom[key])
+ != mb_eeprom_addrs.end()) {
+ UHD_LOGGER_WARNING("X300") << str(
+ boost::format(
+ "Duplicate IP address %s found in mboard EEPROM. "
+ "Device may not function properly. View and reprogram the values "
+ "using the usrp_burn_mb_eeprom utility.")
+ % mb_eeprom[key]);
}
mb_eeprom_addrs.push_back(mb_eeprom[key]);
}
- for(const std::string& addr: ip_addrs) {
+ for (const std::string& addr : ip_addrs) {
x300_eth_conn_t conn_iface;
conn_iface.addr = addr;
conn_iface.type = X300_IFACE_NONE;
@@ -537,10 +531,12 @@ void x300_impl::mboard_members_t::discover_eth(
if (addr == mb_eeprom_addrs[i]) {
// Choose the interface based on the index parity
if (i % 2 == 0) {
- conn_iface.type = X300_IFACE_ETH0;
- conn_iface.link_rate = loaded_fpga_image == "HG" ? x300::MAX_RATE_1GIGE : x300::MAX_RATE_10GIGE;
+ conn_iface.type = X300_IFACE_ETH0;
+ conn_iface.link_rate = loaded_fpga_image == "HG"
+ ? x300::MAX_RATE_1GIGE
+ : x300::MAX_RATE_10GIGE;
} else {
- conn_iface.type = X300_IFACE_ETH1;
+ conn_iface.type = X300_IFACE_ETH1;
conn_iface.link_rate = x300::MAX_RATE_10GIGE;
}
break;
@@ -550,45 +546,49 @@ void x300_impl::mboard_members_t::discover_eth(
// Check default IP addresses if we couldn't
// determine the IP from the mboard eeprom
if (conn_iface.type == X300_IFACE_NONE) {
- UHD_LOGGER_WARNING("X300") << str(boost::format(
- "Address %s not found in mboard EEPROM. Address may be wrong or "
- "the EEPROM may be corrupt. Attempting to continue with default "
- "IP addresses.") % conn_iface.addr
- );
-
- if (addr == boost::asio::ip::address_v4(
- uint32_t(X300_DEFAULT_IP_ETH0_1G)).to_string()) {
- conn_iface.type = X300_IFACE_ETH0;
+ UHD_LOGGER_WARNING("X300") << str(
+ boost::format(
+ "Address %s not found in mboard EEPROM. Address may be wrong or "
+ "the EEPROM may be corrupt. Attempting to continue with default "
+ "IP addresses.")
+ % conn_iface.addr);
+
+ if (addr
+ == boost::asio::ip::address_v4(uint32_t(X300_DEFAULT_IP_ETH0_1G))
+ .to_string()) {
+ conn_iface.type = X300_IFACE_ETH0;
conn_iface.link_rate = x300::MAX_RATE_1GIGE;
- } else if (addr == boost::asio::ip::address_v4(
- uint32_t(X300_DEFAULT_IP_ETH1_1G)).to_string()) {
- conn_iface.type = X300_IFACE_ETH1;
+ } else if (addr
+ == boost::asio::ip::address_v4(uint32_t(X300_DEFAULT_IP_ETH1_1G))
+ .to_string()) {
+ conn_iface.type = X300_IFACE_ETH1;
conn_iface.link_rate = x300::MAX_RATE_1GIGE;
- } else if (addr == boost::asio::ip::address_v4(
- uint32_t(X300_DEFAULT_IP_ETH0_10G)).to_string()) {
- conn_iface.type = X300_IFACE_ETH0;
+ } else if (addr
+ == boost::asio::ip::address_v4(uint32_t(X300_DEFAULT_IP_ETH0_10G))
+ .to_string()) {
+ conn_iface.type = X300_IFACE_ETH0;
conn_iface.link_rate = x300::MAX_RATE_10GIGE;
- } else if (addr == boost::asio::ip::address_v4(
- uint32_t(X300_DEFAULT_IP_ETH1_10G)).to_string()) {
- conn_iface.type = X300_IFACE_ETH1;
+ } else if (addr
+ == boost::asio::ip::address_v4(uint32_t(X300_DEFAULT_IP_ETH1_10G))
+ .to_string()) {
+ conn_iface.type = X300_IFACE_ETH1;
conn_iface.link_rate = x300::MAX_RATE_10GIGE;
} else {
- throw uhd::assertion_error(str(boost::format(
- "X300 Initialization Error: Failed to match address %s with "
- "any addresses for the device. Please check the address.")
- % conn_iface.addr
- ));
+ throw uhd::assertion_error(
+ str(boost::format(
+ "X300 Initialization Error: Failed to match address %s with "
+ "any addresses for the device. Please check the address.")
+ % conn_iface.addr));
}
}
// Save to a vector of connections
if (conn_iface.type != X300_IFACE_NONE) {
// Check the address before we add it
- try
- {
+ try {
wb_iface::sptr zpu_ctrl = x300_make_ctrl_iface_enet(
- udp_simple::make_connected(conn_iface.addr,
- BOOST_STRINGIZE(X300_FW_COMMS_UDP_PORT)),
+ udp_simple::make_connected(
+ conn_iface.addr, BOOST_STRINGIZE(X300_FW_COMMS_UDP_PORT)),
false /* Suppress timeout errors */
);
@@ -597,42 +597,40 @@ void x300_impl::mboard_members_t::discover_eth(
}
// If the address does not work, throw an error
- catch(std::exception &)
- {
- throw uhd::io_error(str(boost::format(
- "X300 Initialization Error: Invalid address %s")
- % conn_iface.addr));
+ catch (std::exception&) {
+ throw uhd::io_error(
+ str(boost::format("X300 Initialization Error: Invalid address %s")
+ % conn_iface.addr));
}
eth_conns.push_back(conn_iface);
}
}
if (eth_conns.size() == 0)
- throw uhd::assertion_error("X300 Initialization Error: No ethernet interfaces specified.");
+ throw uhd::assertion_error(
+ "X300 Initialization Error: No ethernet interfaces specified.");
}
-void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
+void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t& dev_addr)
{
- const fs_path mb_path = fs_path("/mboards") / mb_i;
- mboard_members_t &mb = _mb[mb_i];
+ const fs_path mb_path = fs_path("/mboards") / mb_i;
+ mboard_members_t& mb = _mb[mb_i];
mb.initialization_done = false;
const std::string thread_id(
- boost::lexical_cast<std::string>(boost::this_thread::get_id())
- );
+ boost::lexical_cast<std::string>(boost::this_thread::get_id()));
const std::string thread_msg(
- "Thread ID " + thread_id + " for motherboard "
- + std::to_string(mb_i)
- );
+ "Thread ID " + thread_id + " for motherboard " + std::to_string(mb_i));
mb.args.parse(dev_addr);
std::vector<std::string> eth_addrs;
// Not choosing eth0 based on resource might cause user issues
- std::string eth0_addr = dev_addr.has_key("resource") ? dev_addr["resource"] : dev_addr["addr"];
+ std::string eth0_addr = dev_addr.has_key("resource") ? dev_addr["resource"]
+ : dev_addr["addr"];
eth_addrs.push_back(eth0_addr);
- mb.next_src_addr = 0; //Host source address for blocks
+ mb.next_src_addr = 0; // Host source address for blocks
mb.next_tx_src_addr = 0;
mb.next_rx_src_addr = 0;
if (not mb.args.get_second_addr().empty()) {
@@ -649,19 +647,18 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
init.addr = eth_addrs[0];
mb.eth_conns.push_back(init);
- mb.xport_path = dev_addr.has_key("resource") ? "nirio" : "eth";
+ mb.xport_path = dev_addr.has_key("resource") ? "nirio" : "eth";
mb.if_pkt_is_big_endian = mb.xport_path != "nirio";
- if (mb.xport_path == "nirio")
- {
+ if (mb.xport_path == "nirio") {
nirio_status status = 0;
const std::string rpc_port_name = mb.args.get_niusrprio_rpc_port();
UHD_LOGGER_INFO("X300")
<< boost::format("Connecting to niusrpriorpc at localhost:%s...")
- % rpc_port_name;
+ % rpc_port_name;
- //Instantiate the correct lvbitx object
+ // Instantiate the correct lvbitx object
nifpga_lvbitx::sptr lvbitx;
switch (get_mb_type_from_pcie(mb.args.get_resource(), rpc_port_name)) {
case USRP_X300_MB:
@@ -672,85 +669,95 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
lvbitx.reset(new x310_lvbitx(dev_addr["fpga"]));
break;
default:
- nirio_status_to_exception(status, "Motherboard detection error. Please ensure that you \
+ nirio_status_to_exception(
+ status, "Motherboard detection error. Please ensure that you \
have a valid USRP X3x0, NI USRP-294xR, NI USRP-295xR or NI USRP-2974 device and that all the device \
drivers have loaded successfully.");
}
- //Load the lvbitx onto the device
- UHD_LOGGER_INFO("X300") << boost::format("Using LVBITX bitfile %s...") % lvbitx->get_bitfile_path();
- mb.rio_fpga_interface.reset(new niusrprio_session(dev_addr["resource"], rpc_port_name));
- nirio_status_chain(mb.rio_fpga_interface->open(lvbitx, dev_addr.has_key("download-fpga")), status);
+ // Load the lvbitx onto the device
+ UHD_LOGGER_INFO("X300")
+ << boost::format("Using LVBITX bitfile %s...") % lvbitx->get_bitfile_path();
+ mb.rio_fpga_interface.reset(
+ new niusrprio_session(dev_addr["resource"], rpc_port_name));
+ nirio_status_chain(
+ mb.rio_fpga_interface->open(lvbitx, dev_addr.has_key("download-fpga")),
+ status);
nirio_status_to_exception(status, "x300_impl: Could not initialize RIO session.");
- //Tell the quirks object which FIFOs carry TX stream data
- const uint32_t tx_data_fifos[2] = {x300::RADIO_DEST_PREFIX_TX, x300::RADIO_DEST_PREFIX_TX + 3};
- mb.rio_fpga_interface->get_kernel_proxy()->get_rio_quirks().register_tx_streams(tx_data_fifos, 2);
+ // Tell the quirks object which FIFOs carry TX stream data
+ const uint32_t tx_data_fifos[2] = {
+ x300::RADIO_DEST_PREFIX_TX, x300::RADIO_DEST_PREFIX_TX + 3};
+ mb.rio_fpga_interface->get_kernel_proxy()->get_rio_quirks().register_tx_streams(
+ tx_data_fifos, 2);
_tree->create<size_t>(mb_path / "mtu/recv").set(x300::PCIE_RX_DATA_FRAME_SIZE);
_tree->create<size_t>(mb_path / "mtu/send").set(x300::PCIE_TX_DATA_FRAME_SIZE);
_tree->create<double>(mb_path / "link_max_rate").set(x300::MAX_RATE_PCIE);
}
- for(const std::string &key: dev_addr.keys())
- {
- if (key.find("recv") != std::string::npos) mb.recv_args[key] = dev_addr[key];
- if (key.find("send") != std::string::npos) mb.send_args[key] = dev_addr[key];
+ for (const std::string& key : dev_addr.keys()) {
+ if (key.find("recv") != std::string::npos)
+ mb.recv_args[key] = dev_addr[key];
+ if (key.find("send") != std::string::npos)
+ mb.send_args[key] = dev_addr[key];
}
- //create basic communication
+ // create basic communication
UHD_LOGGER_DEBUG("X300") << "Setting up basic communication...";
if (mb.xport_path == "nirio") {
boost::mutex::scoped_lock lock(pcie_zpu_iface_registry_mutex);
if (get_pcie_zpu_iface_registry().has_key(mb.get_pri_eth().addr)) {
- throw uhd::assertion_error("Someone else has a ZPU transport to the device open. Internal error!");
+ throw uhd::assertion_error(
+ "Someone else has a ZPU transport to the device open. Internal error!");
} else {
- mb.zpu_ctrl = x300_make_ctrl_iface_pcie(mb.rio_fpga_interface->get_kernel_proxy());
- get_pcie_zpu_iface_registry()[mb.get_pri_eth().addr] = boost::weak_ptr<wb_iface>(mb.zpu_ctrl);
+ mb.zpu_ctrl =
+ x300_make_ctrl_iface_pcie(mb.rio_fpga_interface->get_kernel_proxy());
+ get_pcie_zpu_iface_registry()[mb.get_pri_eth().addr] =
+ boost::weak_ptr<wb_iface>(mb.zpu_ctrl);
}
} else {
mb.zpu_ctrl = x300_make_ctrl_iface_enet(udp_simple::make_connected(
- mb.get_pri_eth().addr, BOOST_STRINGIZE(X300_FW_COMMS_UDP_PORT)));
+ mb.get_pri_eth().addr, BOOST_STRINGIZE(X300_FW_COMMS_UDP_PORT)));
}
// Claim device
if (not try_to_claim(mb.zpu_ctrl)) {
throw uhd::runtime_error("Failed to claim device");
}
- mb.claimer_task = uhd::task::make([this, mb](){
- this->claimer_loop(mb.zpu_ctrl);
- }, "x300_claimer");
+ mb.claimer_task = uhd::task::make(
+ [this, mb]() { this->claimer_loop(mb.zpu_ctrl); }, "x300_claimer");
- //extract the FW path for the X300
- //and live load fw over ethernet link
+ // extract the FW path for the X300
+ // and live load fw over ethernet link
if (mb.args.has_fw_file()) {
- const std::string x300_fw_image =
- find_image_path(mb.args.get_fw_file());
+ const std::string x300_fw_image = find_image_path(mb.args.get_fw_file());
x300_load_fw(mb.zpu_ctrl, x300_fw_image);
}
- //check compat numbers
- //check fpga compat before fw compat because the fw is a subset of the fpga image
+ // check compat numbers
+ // check fpga compat before fw compat because the fw is a subset of the fpga image
this->check_fpga_compat(mb_path, mb);
this->check_fw_compat(mb_path, mb);
mb.fw_regmap = boost::make_shared<fw_regmap_t>();
mb.fw_regmap->initialize(*mb.zpu_ctrl.get(), true);
- //store which FPGA image is loaded
+ // store which FPGA image is loaded
mb.loaded_fpga_image = get_fpga_option(mb.zpu_ctrl);
- //low speed perif access
- mb.zpu_spi = spi_core_3000::make(mb.zpu_ctrl, SR_ADDR(SET0_BASE, ZPU_SR_SPI),
- SR_ADDR(SET0_BASE, ZPU_RB_SPI));
+ // low speed perif access
+ mb.zpu_spi = spi_core_3000::make(
+ mb.zpu_ctrl, SR_ADDR(SET0_BASE, ZPU_SR_SPI), SR_ADDR(SET0_BASE, ZPU_RB_SPI));
mb.zpu_i2c = i2c_core_100_wb32::make(mb.zpu_ctrl, I2C1_BASE);
- mb.zpu_i2c->set_clock_rate(x300::BUS_CLOCK_RATE/2);
+ mb.zpu_i2c->set_clock_rate(x300::BUS_CLOCK_RATE / 2);
////////////////////////////////////////////////////////////////////
// print network routes mapping
////////////////////////////////////////////////////////////////////
/*
- const uint32_t routes_addr = mb.zpu_ctrl->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_ROUTE_MAP_ADDR));
- const uint32_t routes_len = mb.zpu_ctrl->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_ROUTE_MAP_LEN));
+ const uint32_t routes_addr = mb.zpu_ctrl->peek32(SR_ADDR(X300_FW_SHMEM_BASE,
+ X300_FW_SHMEM_ROUTE_MAP_ADDR)); const uint32_t routes_len =
+ mb.zpu_ctrl->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_ROUTE_MAP_LEN));
UHD_VAR(routes_len);
for (size_t i = 0; i < routes_len; i+=1)
{
@@ -778,29 +785,28 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
}
const mboard_eeprom_t mb_eeprom = get_mb_eeprom(eeprom16);
- _tree->create<mboard_eeprom_t>(mb_path / "eeprom")
+ _tree
+ ->create<mboard_eeprom_t>(mb_path / "eeprom")
// Initialize the property with a current copy of the EEPROM contents
.set(mb_eeprom)
// Whenever this property is written, update the chip
- .add_coerced_subscriber(
- [this, eeprom16](const mboard_eeprom_t &mb_eeprom){
- this->set_mb_eeprom(eeprom16, mb_eeprom);
- }
- )
- ;
+ .add_coerced_subscriber([this, eeprom16](const mboard_eeprom_t& mb_eeprom) {
+ this->set_mb_eeprom(eeprom16, mb_eeprom);
+ });
if (mb.args.get_recover_mb_eeprom()) {
- UHD_LOGGER_WARNING("X300") << "UHD is operating in EEPROM Recovery Mode which disables hardware version "
- "checks.\nOperating in this mode may cause hardware damage and unstable "
- "radio performance!";
+ UHD_LOGGER_WARNING("X300")
+ << "UHD is operating in EEPROM Recovery Mode which disables hardware version "
+ "checks.\nOperating in this mode may cause hardware damage and unstable "
+ "radio performance!";
return;
}
////////////////////////////////////////////////////////////////////
// parse the product number
////////////////////////////////////////////////////////////////////
- const std::string product_name = map_mb_type_to_product_name(
- get_mb_type_from_eeprom(mb_eeprom), "X300?");
+ const std::string product_name =
+ map_mb_type_to_product_name(get_mb_type_from_eeprom(mb_eeprom), "X300?");
if (product_name == "X300?") {
if (not mb.args.get_recover_mb_eeprom()) {
throw uhd::runtime_error(
@@ -818,7 +824,7 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
////////////////////////////////////////////////////////////////////
// discover ethernet interfaces, frame sizes, and link rates
////////////////////////////////////////////////////////////////////
- if (mb.xport_path == "eth" ) {
+ if (mb.xport_path == "eth") {
double link_max_rate = 0.0;
// Discover ethernet interfaces
@@ -836,101 +842,104 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
* multiple transmission units - this is why the limits passed into the
* 'determine_max_frame_size' function are actually frame sizes. */
frame_size_t req_max_frame_size;
- req_max_frame_size.recv_frame_size = (mb.recv_args.has_key("recv_frame_size")) \
- ? boost::lexical_cast<size_t>(mb.recv_args["recv_frame_size"]) \
- : x300::DATA_FRAME_MAX_SIZE;
- req_max_frame_size.send_frame_size = (mb.send_args.has_key("send_frame_size")) \
- ? boost::lexical_cast<size_t>(mb.send_args["send_frame_size"]) \
- : x300::DATA_FRAME_MAX_SIZE;
-
- #if defined UHD_PLATFORM_LINUX
- const std::string mtu_tool("ip link");
- #elif defined UHD_PLATFORM_WIN32
- const std::string mtu_tool("netsh");
- #else
- const std::string mtu_tool("ifconfig");
- #endif
+ req_max_frame_size.recv_frame_size =
+ (mb.recv_args.has_key("recv_frame_size"))
+ ? boost::lexical_cast<size_t>(mb.recv_args["recv_frame_size"])
+ : x300::DATA_FRAME_MAX_SIZE;
+ req_max_frame_size.send_frame_size =
+ (mb.send_args.has_key("send_frame_size"))
+ ? boost::lexical_cast<size_t>(mb.send_args["send_frame_size"])
+ : x300::DATA_FRAME_MAX_SIZE;
+
+#if defined UHD_PLATFORM_LINUX
+ const std::string mtu_tool("ip link");
+#elif defined UHD_PLATFORM_WIN32
+ const std::string mtu_tool("netsh");
+#else
+ const std::string mtu_tool("ifconfig");
+#endif
// Detect the frame size on the path to the USRP
try {
- frame_size_t pri_frame_sizes = determine_max_frame_size(
- eth_addrs.at(0), req_max_frame_size
- );
+ frame_size_t pri_frame_sizes =
+ determine_max_frame_size(eth_addrs.at(0), req_max_frame_size);
_max_frame_sizes = pri_frame_sizes;
if (eth_addrs.size() > 1) {
- frame_size_t sec_frame_sizes = determine_max_frame_size(
- eth_addrs.at(1), req_max_frame_size
- );
+ frame_size_t sec_frame_sizes =
+ determine_max_frame_size(eth_addrs.at(1), req_max_frame_size);
// Choose the minimum of the max frame sizes
// to ensure we don't exceed any one of the links' MTU
_max_frame_sizes.recv_frame_size = std::min(
- pri_frame_sizes.recv_frame_size,
- sec_frame_sizes.recv_frame_size
- );
+ pri_frame_sizes.recv_frame_size, sec_frame_sizes.recv_frame_size);
_max_frame_sizes.send_frame_size = std::min(
- pri_frame_sizes.send_frame_size,
- sec_frame_sizes.send_frame_size
- );
+ pri_frame_sizes.send_frame_size, sec_frame_sizes.send_frame_size);
}
- } catch(std::exception &e) {
- UHD_LOGGER_ERROR("X300") << e.what() ;
+ } catch (std::exception& e) {
+ UHD_LOGGER_ERROR("X300") << e.what();
}
if ((mb.recv_args.has_key("recv_frame_size"))
- && (req_max_frame_size.recv_frame_size > _max_frame_sizes.recv_frame_size)) {
+ && (req_max_frame_size.recv_frame_size > _max_frame_sizes.recv_frame_size)) {
UHD_LOGGER_WARNING("X300")
- << boost::format("You requested a receive frame size of (%lu) but your NIC's max frame size is (%lu).")
- % req_max_frame_size.recv_frame_size
- % _max_frame_sizes.recv_frame_size
- << boost::format("Please verify your NIC's MTU setting using '%s' or set the recv_frame_size argument appropriately.")
- % mtu_tool
- << "UHD will use the auto-detected max frame size for this connection."
- ;
+ << boost::format("You requested a receive frame size of (%lu) but your "
+ "NIC's max frame size is (%lu).")
+ % req_max_frame_size.recv_frame_size
+ % _max_frame_sizes.recv_frame_size
+ << boost::format("Please verify your NIC's MTU setting using '%s' or set "
+ "the recv_frame_size argument appropriately.")
+ % mtu_tool
+ << "UHD will use the auto-detected max frame size for this connection.";
}
if ((mb.send_args.has_key("send_frame_size"))
- && (req_max_frame_size.send_frame_size > _max_frame_sizes.send_frame_size)) {
+ && (req_max_frame_size.send_frame_size > _max_frame_sizes.send_frame_size)) {
UHD_LOGGER_WARNING("X300")
- << boost::format("You requested a send frame size of (%lu) but your NIC's max frame size is (%lu).")
- % req_max_frame_size.send_frame_size
- % _max_frame_sizes.send_frame_size
- << boost::format("Please verify your NIC's MTU setting using '%s' or set the send_frame_size argument appropriately.")
- % mtu_tool
- << "UHD will use the auto-detected max frame size for this connection."
- ;
+ << boost::format("You requested a send frame size of (%lu) but your "
+ "NIC's max frame size is (%lu).")
+ % req_max_frame_size.send_frame_size
+ % _max_frame_sizes.send_frame_size
+ << boost::format("Please verify your NIC's MTU setting using '%s' or set "
+ "the send_frame_size argument appropriately.")
+ % mtu_tool
+ << "UHD will use the auto-detected max frame size for this connection.";
}
// Check frame sizes
- for (auto conn : mb.eth_conns)
- {
+ for (auto conn : mb.eth_conns) {
link_max_rate += conn.link_rate;
- size_t rec_send_frame_size = conn.link_rate == x300::MAX_RATE_1GIGE ? x300::GE_DATA_FRAME_SEND_SIZE : x300::XGE_DATA_FRAME_SEND_SIZE;
- size_t rec_recv_frame_size = conn.link_rate == x300::MAX_RATE_1GIGE ? x300::GE_DATA_FRAME_RECV_SIZE : x300::XGE_DATA_FRAME_RECV_SIZE;
+ size_t rec_send_frame_size = conn.link_rate == x300::MAX_RATE_1GIGE
+ ? x300::GE_DATA_FRAME_SEND_SIZE
+ : x300::XGE_DATA_FRAME_SEND_SIZE;
+ size_t rec_recv_frame_size = conn.link_rate == x300::MAX_RATE_1GIGE
+ ? x300::GE_DATA_FRAME_RECV_SIZE
+ : x300::XGE_DATA_FRAME_RECV_SIZE;
- if (_max_frame_sizes.send_frame_size < rec_send_frame_size)
- {
+ if (_max_frame_sizes.send_frame_size < rec_send_frame_size) {
UHD_LOGGER_WARNING("X300")
- << boost::format("For the %s connection, UHD recommends a send frame size of at least %lu for best\nperformance, but your configuration will only allow %lu.")
- % conn.addr
- % rec_send_frame_size
- % _max_frame_sizes.send_frame_size
- << "This may negatively impact your maximum achievable sample rate.\nCheck the MTU on the interface and/or the send_frame_size argument."
- ;
+ << boost::format("For the %s connection, UHD recommends a send frame "
+ "size of at least %lu for best\nperformance, but "
+ "your configuration will only allow %lu.")
+ % conn.addr % rec_send_frame_size
+ % _max_frame_sizes.send_frame_size
+ << "This may negatively impact your maximum achievable sample "
+ "rate.\nCheck the MTU on the interface and/or the send_frame_size "
+ "argument.";
}
- if (_max_frame_sizes.recv_frame_size < rec_recv_frame_size)
- {
+ if (_max_frame_sizes.recv_frame_size < rec_recv_frame_size) {
UHD_LOGGER_WARNING("X300")
- << boost::format("For the %s connection, UHD recommends a receive frame size of at least %lu for best\nperformance, but your configuration will only allow %lu.")
- % conn.addr
- % rec_recv_frame_size
- % _max_frame_sizes.recv_frame_size
- << "This may negatively impact your maximum achievable sample rate.\nCheck the MTU on the interface and/or the recv_frame_size argument."
- ;
+ << boost::format("For the %s connection, UHD recommends a receive "
+ "frame size of at least %lu for best\nperformance, "
+ "but your configuration will only allow %lu.")
+ % conn.addr % rec_recv_frame_size
+ % _max_frame_sizes.recv_frame_size
+ << "This may negatively impact your maximum achievable sample "
+ "rate.\nCheck the MTU on the interface and/or the recv_frame_size "
+ "argument.";
}
}
@@ -943,40 +952,48 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
// read hardware revision and compatibility number
////////////////////////////////////////////////////////////////////
mb.hw_rev = 0;
- if(mb_eeprom.has_key("revision") and not mb_eeprom["revision"].empty()) {
+ if (mb_eeprom.has_key("revision") and not mb_eeprom["revision"].empty()) {
try {
mb.hw_rev = boost::lexical_cast<size_t>(mb_eeprom["revision"]);
- } catch(...) {
- throw uhd::runtime_error("Revision in EEPROM is invalid! Please reprogram your EEPROM.");
+ } catch (...) {
+ throw uhd::runtime_error(
+ "Revision in EEPROM is invalid! Please reprogram your EEPROM.");
}
} else {
throw uhd::runtime_error("No revision detected. MB EEPROM must be reprogrammed!");
}
size_t hw_rev_compat = 0;
- if (mb.hw_rev >= 7) { //Revision compat was added with revision 7
- if (mb_eeprom.has_key("revision_compat") and not mb_eeprom["revision_compat"].empty()) {
+ if (mb.hw_rev >= 7) { // Revision compat was added with revision 7
+ if (mb_eeprom.has_key("revision_compat")
+ and not mb_eeprom["revision_compat"].empty()) {
try {
hw_rev_compat = boost::lexical_cast<size_t>(mb_eeprom["revision_compat"]);
- } catch(...) {
- throw uhd::runtime_error("Revision compat in EEPROM is invalid! Please reprogram your EEPROM.");
+ } catch (...) {
+ throw uhd::runtime_error("Revision compat in EEPROM is invalid! Please "
+ "reprogram your EEPROM.");
}
} else {
- throw uhd::runtime_error("No revision compat detected. MB EEPROM must be reprogrammed!");
+ throw uhd::runtime_error(
+ "No revision compat detected. MB EEPROM must be reprogrammed!");
}
} else {
- //For older HW just assume that revision_compat = revision
+ // For older HW just assume that revision_compat = revision
hw_rev_compat = mb.hw_rev;
}
if (hw_rev_compat > X300_REVISION_COMPAT) {
- throw uhd::runtime_error(str(boost::format(
- "Hardware is too new for this software. Please upgrade to a driver that supports hardware revision %d.")
- % mb.hw_rev));
- } else if (mb.hw_rev < X300_REVISION_MIN) { //Compare min against the revision (and not compat) to give us more leeway for partial support for a compat
- throw uhd::runtime_error(str(boost::format(
- "Software is too new for this hardware. Please downgrade to a driver that supports hardware revision %d.")
- % mb.hw_rev));
+ throw uhd::runtime_error(
+ str(boost::format("Hardware is too new for this software. Please upgrade to "
+ "a driver that supports hardware revision %d.")
+ % mb.hw_rev));
+ } else if (mb.hw_rev < X300_REVISION_MIN) { // Compare min against the revision (and
+ // not compat) to give us more leeway for
+ // partial support for a compat
+ throw uhd::runtime_error(
+ str(boost::format("Software is too new for this hardware. Please downgrade "
+ "to a driver that supports hardware revision %d.")
+ % mb.hw_rev));
}
////////////////////////////////////////////////////////////////////
@@ -984,63 +1001,55 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
////////////////////////////////////////////////////////////////////
UHD_LOGGER_DEBUG("X300") << "Setting up RF frontend clocking...";
- //Initialize clock control registers. NOTE: This does not configure the LMK yet.
+ // Initialize clock control registers. NOTE: This does not configure the LMK yet.
mb.clock = x300_clock_ctrl::make(mb.zpu_spi,
1 /*slaveno*/,
mb.hw_rev,
mb.args.get_master_clock_rate(),
mb.args.get_dboard_clock_rate(),
- mb.args.get_system_ref_rate()
- );
+ mb.args.get_system_ref_rate());
mb.fw_regmap->ref_freq_reg.write(
- fw_regmap_t::ref_freq_reg_t::REF_FREQ,
- uint32_t(mb.args.get_system_ref_rate())
- );
+ fw_regmap_t::ref_freq_reg_t::REF_FREQ, uint32_t(mb.args.get_system_ref_rate()));
- //Initialize clock source to use internal reference and generate
- //a valid radio clock. This may change after configuration is done.
- //This will configure the LMK and wait for lock
+ // Initialize clock source to use internal reference and generate
+ // a valid radio clock. This may change after configuration is done.
+ // This will configure the LMK and wait for lock
update_clock_source(mb, mb.args.get_clock_source());
////////////////////////////////////////////////////////////////////
// create clock properties
////////////////////////////////////////////////////////////////////
- _tree->create<double>(mb_path / "master_clock_rate")
- .set_publisher([mb](){ return mb.clock->get_master_clock_rate(); })
- ;
+ _tree->create<double>(mb_path / "master_clock_rate").set_publisher([mb]() {
+ return mb.clock->get_master_clock_rate();
+ });
- UHD_LOGGER_INFO("X300")
- << "Radio 1x clock: " << (mb.clock->get_master_clock_rate()/1e6)
- << " MHz";
+ UHD_LOGGER_INFO("X300") << "Radio 1x clock: "
+ << (mb.clock->get_master_clock_rate() / 1e6) << " MHz";
////////////////////////////////////////////////////////////////////
// Create the GPSDO control
////////////////////////////////////////////////////////////////////
static const uint32_t dont_look_for_gpsdo = 0x1234abcdul;
- //otherwise if not disabled, look for the internal GPSDO
- if (mb.zpu_ctrl->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_GPSDO_STATUS)) != dont_look_for_gpsdo)
- {
+ // otherwise if not disabled, look for the internal GPSDO
+ if (mb.zpu_ctrl->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_GPSDO_STATUS))
+ != dont_look_for_gpsdo) {
UHD_LOG_DEBUG("X300", "Detecting internal GPSDO....");
try {
// gps_ctrl will print its own log statements if a GPSDO was found
mb.gps = gps_ctrl::make(x300_make_uart_iface(mb.zpu_ctrl));
- }
- catch(std::exception &e) {
+ } catch (std::exception& e) {
UHD_LOGGER_ERROR("X300")
<< "An error occurred making GPSDO control: " << e.what();
}
if (mb.gps and mb.gps->gps_detected()) {
- for(const std::string& name : mb.gps->get_sensors()) {
+ for (const std::string& name : mb.gps->get_sensors()) {
_tree->create<sensor_value_t>(mb_path / "sensors" / name)
- .set_publisher([&mb, name](){
- return mb.gps->get_sensor(name);
- })
- ;
+ .set_publisher([&mb, name]() { return mb.gps->get_sensor(name); });
}
- }
- else {
- mb.zpu_ctrl->poke32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_GPSDO_STATUS), dont_look_for_gpsdo);
+ } else {
+ mb.zpu_ctrl->poke32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_GPSDO_STATUS),
+ dont_look_for_gpsdo);
}
}
@@ -1049,97 +1058,88 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
////////////////////////////////////////////////////////////////////
_tree->create<std::string>(mb_path / "time_source" / "value")
.set(mb.args.get_time_source())
- .add_coerced_subscriber([this, &mb](const std::string& time_source){
+ .add_coerced_subscriber([this, &mb](const std::string& time_source) {
this->update_time_source(mb, time_source);
- })
- ;
- static const std::vector<std::string> time_sources =
- {"internal", "external", "gpsdo"};
+ });
+ static const std::vector<std::string> time_sources = {
+ "internal", "external", "gpsdo"};
_tree->create<std::vector<std::string>>(mb_path / "time_source" / "options")
.set(time_sources);
- //setup the time output, default to ON
+ // setup the time output, default to ON
_tree->create<bool>(mb_path / "time_source" / "output")
- .add_coerced_subscriber([this, &mb](const bool time_output){
+ .add_coerced_subscriber([this, &mb](const bool time_output) {
this->set_time_source_out(mb, time_output);
})
- .set(true)
- ;
+ .set(true);
////////////////////////////////////////////////////////////////////
// setup clock sources and properties
////////////////////////////////////////////////////////////////////
_tree->create<std::string>(mb_path / "clock_source" / "value")
.set(mb.args.get_clock_source())
- .add_coerced_subscriber([this, &mb](const std::string& clock_source){
+ .add_coerced_subscriber([this, &mb](const std::string& clock_source) {
this->update_clock_source(mb, clock_source);
- })
- ;
- static const std::vector<std::string> clock_source_options =
- {"internal", "external", "gpsdo"};
+ });
+ static const std::vector<std::string> clock_source_options = {
+ "internal", "external", "gpsdo"};
_tree->create<std::vector<std::string>>(mb_path / "clock_source" / "options")
.set(clock_source_options);
- //setup external reference options. default to 10 MHz input reference
+ // setup external reference options. default to 10 MHz input reference
_tree->create<std::string>(mb_path / "clock_source" / "external");
- _tree->create<std::vector<double>>(mb_path / "clock_source" / "external" / "freq" / "options")
+ _tree
+ ->create<std::vector<double>>(
+ mb_path / "clock_source" / "external" / "freq" / "options")
.set(x300::EXTERNAL_FREQ_OPTIONS);
_tree->create<double>(mb_path / "clock_source" / "external" / "value")
.set(mb.clock->get_sysref_clock_rate());
// FIXME the external clock source settings need to be more robust
- //setup the clock output, default to ON
+ // setup the clock output, default to ON
_tree->create<bool>(mb_path / "clock_source" / "output")
- .add_coerced_subscriber([&mb](const bool clock_output){
- mb.clock->set_ref_out(clock_output);
- })
- ;
+ .add_coerced_subscriber(
+ [&mb](const bool clock_output) { mb.clock->set_ref_out(clock_output); });
// Initialize tick rate (must be done before setting time)
// Note: The master tick rate can't be changed at runtime!
const double master_clock_rate = mb.clock->get_master_clock_rate();
_tree->create<double>(mb_path / "tick_rate")
- .set_coercer([master_clock_rate](const double rate){
+ .set_coercer([master_clock_rate](const double rate) {
// The contract of multi_usrp::set_master_clock_rate() is to coerce
// and not throw, so we'll follow that behaviour here.
if (!uhd::math::frequencies_are_equal(rate, master_clock_rate)) {
- UHD_LOGGER_WARNING("X300") <<
- "Cannot update master clock rate! X300 Series does not "
- "allow changing the clock rate during runtime."
- ;
+ UHD_LOGGER_WARNING("X300")
+ << "Cannot update master clock rate! X300 Series does not "
+ "allow changing the clock rate during runtime.";
}
return master_clock_rate;
})
- .add_coerced_subscriber([this](const double rate){
- this->update_tx_streamers(rate);
- })
- .add_coerced_subscriber([this](const double rate){
- this->update_rx_streamers(rate);
- })
- .set(master_clock_rate)
- ;
+ .add_coerced_subscriber(
+ [this](const double rate) { this->update_tx_streamers(rate); })
+ .add_coerced_subscriber(
+ [this](const double rate) { this->update_rx_streamers(rate); })
+ .set(master_clock_rate);
////////////////////////////////////////////////////////////////////
// and do the misc mboard sensors
////////////////////////////////////////////////////////////////////
_tree->create<sensor_value_t>(mb_path / "sensors" / "ref_locked")
- .set_publisher([this, &mb](){ return this->get_ref_locked(mb); });
+ .set_publisher([this, &mb]() { return this->get_ref_locked(mb); });
//////////////// RFNOC /////////////////
const size_t n_rfnoc_blocks = mb.zpu_ctrl->peek32(SR_ADDR(SET0_BASE, ZPU_RB_NUM_CE));
- enumerate_rfnoc_blocks(
- mb_i,
+ enumerate_rfnoc_blocks(mb_i,
n_rfnoc_blocks,
x300::XB_DST_PCI + 1, /* base port */
uhd::sid_t(x300::SRC_ADDR0, 0, x300::DST_ADDR + mb_i, 0),
- dev_addr
- );
+ dev_addr);
//////////////// RFNOC /////////////////
// If we have a radio, we must configure its codec control:
const std::string radio_blockid_hint = str(boost::format("%d/Radio") % mb_i);
std::vector<rfnoc::block_id_t> radio_ids =
- find_blocks<rfnoc::x300_radio_ctrl_impl>(radio_blockid_hint);
+ find_blocks<rfnoc::x300_radio_ctrl_impl>(radio_blockid_hint);
if (not radio_ids.empty()) {
if (radio_ids.size() > 2) {
UHD_LOGGER_WARNING("X300")
@@ -1147,33 +1147,31 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
radio_ids.resize(2);
}
- for(const rfnoc::block_id_t &id: radio_ids) {
- rfnoc::x300_radio_ctrl_impl::sptr radio(get_block_ctrl<rfnoc::x300_radio_ctrl_impl>(id));
+ for (const rfnoc::block_id_t& id : radio_ids) {
+ rfnoc::x300_radio_ctrl_impl::sptr radio(
+ get_block_ctrl<rfnoc::x300_radio_ctrl_impl>(id));
mb.radios.push_back(radio);
- radio->setup_radio(
- mb.zpu_i2c,
- mb.clock,
- mb.args.get_ignore_cal_file(),
- mb.args.get_self_cal_adc_delay()
- );
+ radio->setup_radio(mb.zpu_i2c,
+ mb.clock,
+ mb.args.get_ignore_cal_file(),
+ mb.args.get_self_cal_adc_delay());
}
////////////////////////////////////////////////////////////////////
// ADC test and cal
////////////////////////////////////////////////////////////////////
if (mb.args.get_self_cal_adc_delay()) {
- rfnoc::x300_radio_ctrl_impl::self_cal_adc_xfer_delay(
- mb.radios, mb.clock,
- [this, &mb](const double timeout){
- return this->wait_for_clk_locked(mb, fw_regmap_t::clk_status_reg_t::LMK_LOCK, timeout);
+ rfnoc::x300_radio_ctrl_impl::self_cal_adc_xfer_delay(mb.radios,
+ mb.clock,
+ [this, &mb](const double timeout) {
+ return this->wait_for_clk_locked(
+ mb, fw_regmap_t::clk_status_reg_t::LMK_LOCK, timeout);
},
true /* Apply ADC delay */);
}
if (mb.args.get_ext_adc_self_test()) {
rfnoc::x300_radio_ctrl_impl::extended_adc_test(
- mb.radios,
- mb.args.get_ext_adc_self_test_duration()
- );
+ mb.radios, mb.args.get_ext_adc_self_test_duration());
} else {
for (size_t i = 0; i < mb.radios.size(); i++) {
mb.radios.at(i)->self_test_adc();
@@ -1188,8 +1186,7 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
}
} else {
- UHD_LOGGER_INFO("X300")
- << "No Radio Block found. Assuming radio-less operation.";
+ UHD_LOGGER_INFO("X300") << "No Radio Block found. Assuming radio-less operation.";
} /* end of radio block(s) initialization */
mb.initialization_done = true;
@@ -1197,30 +1194,27 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr)
x300_impl::~x300_impl(void)
{
- try
- {
- for(mboard_members_t &mb: _mb)
- {
- //kill the claimer task and unclaim the device
+ try {
+ for (mboard_members_t& mb : _mb) {
+ // kill the claimer task and unclaim the device
mb.claimer_task.reset();
- { //Critical section
+ { // Critical section
boost::mutex::scoped_lock lock(pcie_zpu_iface_registry_mutex);
release(mb.zpu_ctrl);
- //If the process is killed, the entire registry will disappear so we
- //don't need to worry about unclean shutdowns here.
+ // If the process is killed, the entire registry will disappear so we
+ // don't need to worry about unclean shutdowns here.
if (get_pcie_zpu_iface_registry().has_key(mb.get_pri_eth().addr)) {
get_pcie_zpu_iface_registry().pop(mb.get_pri_eth().addr);
}
}
}
- }
- catch(...)
- {
+ } catch (...) {
UHD_SAFE_CALL(throw;)
}
}
-uint32_t x300_impl::mboard_members_t::allocate_pcie_dma_chan(const uhd::sid_t &tx_sid, const xport_type_t xport_type)
+uint32_t x300_impl::mboard_members_t::allocate_pcie_dma_chan(
+ const uhd::sid_t& tx_sid, const xport_type_t xport_type)
{
static const uint32_t CTRL_CHANNEL = 0;
static const uint32_t ASYNC_MSG_CHANNEL = 1;
@@ -1236,28 +1230,29 @@ uint32_t x300_impl::mboard_members_t::allocate_pcie_dma_chan(const uhd::sid_t &t
if (_dma_chan_pool.count(raw_sid) == 0) {
size_t channel = _dma_chan_pool.size() + FIRST_DATA_CHANNEL;
if (channel > x300::PCIE_MAX_CHANNELS) {
- throw uhd::runtime_error("Trying to allocate more DMA channels than are available");
+ throw uhd::runtime_error(
+ "Trying to allocate more DMA channels than are available");
}
_dma_chan_pool[raw_sid] = channel;
UHD_LOGGER_DEBUG("X300")
- << "Assigning PCIe DMA channel " << _dma_chan_pool[raw_sid]
- << " to SID " << tx_sid.to_pp_string_hex();
+ << "Assigning PCIe DMA channel " << _dma_chan_pool[raw_sid] << " to SID "
+ << tx_sid.to_pp_string_hex();
}
return _dma_chan_pool[raw_sid];
}
}
-static uint32_t extract_sid_from_pkt(void* pkt, size_t) {
+static uint32_t extract_sid_from_pkt(void* pkt, size_t)
+{
return uhd::sid_t(uhd::wtohx(static_cast<const uint32_t*>(pkt)[1])).get_dst();
}
-static uhd::transport::muxed_zero_copy_if::sptr make_muxed_pcie_msg_xport
-(
+static uhd::transport::muxed_zero_copy_if::sptr make_muxed_pcie_msg_xport(
uhd::niusrprio::niusrprio_session::sptr rio_fpga_interface,
uint32_t dma_channel_num,
- size_t max_muxed_ports
-) {
+ size_t max_muxed_ports)
+{
zero_copy_xport_params buff_args;
buff_args.send_frame_size = x300::PCIE_MSG_FRAME_SIZE;
buff_args.recv_frame_size = x300::PCIE_MSG_FRAME_SIZE;
@@ -1265,77 +1260,70 @@ static uhd::transport::muxed_zero_copy_if::sptr make_muxed_pcie_msg_xport
buff_args.num_recv_frames = x300::PCIE_MSG_NUM_FRAMES * max_muxed_ports;
zero_copy_if::sptr base_xport = nirio_zero_copy::make(
- rio_fpga_interface, dma_channel_num,
- buff_args, uhd::device_addr_t());
+ rio_fpga_interface, dma_channel_num, buff_args, uhd::device_addr_t());
return muxed_zero_copy_if::make(base_xport, extract_sid_from_pkt, max_muxed_ports);
}
-uhd::both_xports_t x300_impl::make_transport(
- const uhd::sid_t &address,
+uhd::both_xports_t x300_impl::make_transport(const uhd::sid_t& address,
const xport_type_t xport_type,
- const uhd::device_addr_t& args
-) {
- const size_t mb_index = address.get_dst_addr() - x300::DST_ADDR;
- mboard_members_t &mb = _mb[mb_index];
- const uhd::device_addr_t& xport_args = (xport_type == CTRL) ? uhd::device_addr_t() : args;
+ const uhd::device_addr_t& args)
+{
+ const size_t mb_index = address.get_dst_addr() - x300::DST_ADDR;
+ mboard_members_t& mb = _mb[mb_index];
+ const uhd::device_addr_t& xport_args = (xport_type == CTRL) ? uhd::device_addr_t()
+ : args;
zero_copy_xport_params default_buff_args;
both_xports_t xports;
xports.endianness = mb.if_pkt_is_big_endian ? ENDIANNESS_BIG : ENDIANNESS_LITTLE;
if (mb.xport_path == "nirio") {
- xports.send_sid = this->allocate_sid(mb, address, x300::SRC_ADDR0, x300::XB_DST_PCI);
+ xports.send_sid =
+ this->allocate_sid(mb, address, x300::SRC_ADDR0, x300::XB_DST_PCI);
xports.recv_sid = xports.send_sid.reversed();
uint32_t dma_channel_num = mb.allocate_pcie_dma_chan(xports.send_sid, xport_type);
if (xport_type == CTRL) {
- //Transport for control stream
+ // Transport for control stream
if (not mb.ctrl_dma_xport) {
- //One underlying DMA channel will handle
- //all control traffic
- mb.ctrl_dma_xport = make_muxed_pcie_msg_xport(
- mb.rio_fpga_interface,
+ // One underlying DMA channel will handle
+ // all control traffic
+ mb.ctrl_dma_xport = make_muxed_pcie_msg_xport(mb.rio_fpga_interface,
dma_channel_num,
x300::PCIE_MAX_MUXED_CTRL_XPORTS);
}
- //Create a virtual control transport
+ // Create a virtual control transport
xports.recv = mb.ctrl_dma_xport->make_stream(xports.recv_sid.get_dst());
} else if (xport_type == ASYNC_MSG) {
- //Transport for async message stream
+ // Transport for async message stream
if (not mb.async_msg_dma_xport) {
- //One underlying DMA channel will handle
- //all async message traffic
- mb.async_msg_dma_xport = make_muxed_pcie_msg_xport(
- mb.rio_fpga_interface,
+ // One underlying DMA channel will handle
+ // all async message traffic
+ mb.async_msg_dma_xport = make_muxed_pcie_msg_xport(mb.rio_fpga_interface,
dma_channel_num,
x300::PCIE_MAX_MUXED_ASYNC_XPORTS);
}
- //Create a virtual async message transport
+ // Create a virtual async message transport
xports.recv = mb.async_msg_dma_xport->make_stream(xports.recv_sid.get_dst());
} else {
- //Transport for data stream
- default_buff_args.send_frame_size =
- (xport_type == TX_DATA)
- ? x300::PCIE_TX_DATA_FRAME_SIZE
- : x300::PCIE_MSG_FRAME_SIZE;
-
- default_buff_args.recv_frame_size =
- (xport_type == RX_DATA)
- ? x300::PCIE_RX_DATA_FRAME_SIZE
- : x300::PCIE_MSG_FRAME_SIZE;
-
- default_buff_args.num_send_frames =
- (xport_type == TX_DATA)
- ? x300::PCIE_TX_DATA_NUM_FRAMES
- : x300::PCIE_MSG_NUM_FRAMES;
+ // Transport for data stream
+ default_buff_args.send_frame_size = (xport_type == TX_DATA)
+ ? x300::PCIE_TX_DATA_FRAME_SIZE
+ : x300::PCIE_MSG_FRAME_SIZE;
- default_buff_args.num_recv_frames =
- (xport_type == RX_DATA)
- ? x300::PCIE_RX_DATA_NUM_FRAMES
- : x300::PCIE_MSG_NUM_FRAMES;
+ default_buff_args.recv_frame_size = (xport_type == RX_DATA)
+ ? x300::PCIE_RX_DATA_FRAME_SIZE
+ : x300::PCIE_MSG_FRAME_SIZE;
+
+ default_buff_args.num_send_frames = (xport_type == TX_DATA)
+ ? x300::PCIE_TX_DATA_NUM_FRAMES
+ : x300::PCIE_MSG_NUM_FRAMES;
+
+ default_buff_args.num_recv_frames = (xport_type == RX_DATA)
+ ? x300::PCIE_RX_DATA_NUM_FRAMES
+ : x300::PCIE_MSG_NUM_FRAMES;
xports.recv = nirio_zero_copy::make(
- mb.rio_fpga_interface, dma_channel_num,
- default_buff_args, xport_args);
+ mb.rio_fpga_interface, dma_channel_num, default_buff_args, xport_args);
}
xports.send = xports.recv;
@@ -1344,23 +1332,27 @@ uhd::both_xports_t x300_impl::make_transport(
// - Upper 16 bits: Destination address (e.g. 0.0)
// - Lower 16 bits: DMA channel
uint32_t router_config_word = (xports.recv_sid.get_dst() << 16) | dma_channel_num;
- mb.rio_fpga_interface->get_kernel_proxy()->poke(PCIE_ROUTER_REG(0), router_config_word);
+ mb.rio_fpga_interface->get_kernel_proxy()->poke(
+ PCIE_ROUTER_REG(0), router_config_word);
- //For the nirio transport, buffer size is depends on the frame size and num frames
- xports.recv_buff_size = xports.recv->get_num_recv_frames() * xports.recv->get_recv_frame_size();
- xports.send_buff_size = xports.send->get_num_send_frames() * xports.send->get_send_frame_size();
+ // For the nirio transport, buffer size is depends on the frame size and num
+ // frames
+ xports.recv_buff_size =
+ xports.recv->get_num_recv_frames() * xports.recv->get_recv_frame_size();
+ xports.send_buff_size =
+ xports.send->get_num_send_frames() * xports.send->get_send_frame_size();
} else if (mb.xport_path == "eth") {
// Decide on the IP/Interface pair based on the endpoint index
- size_t &next_src_addr =
- xport_type == TX_DATA ? mb.next_tx_src_addr :
- xport_type == RX_DATA ? mb.next_rx_src_addr :
- mb.next_src_addr;
- x300_eth_conn_t conn = mb.eth_conns[next_src_addr];
- const uint32_t xbar_src_addr =
- next_src_addr==0 ? x300::SRC_ADDR0 : x300::SRC_ADDR1;
- const uint32_t xbar_src_dst =
- conn.type==X300_IFACE_ETH0 ? x300::XB_DST_E0 : x300::XB_DST_E1;
+ size_t& next_src_addr = xport_type == TX_DATA
+ ? mb.next_tx_src_addr
+ : xport_type == RX_DATA ? mb.next_rx_src_addr
+ : mb.next_src_addr;
+ x300_eth_conn_t conn = mb.eth_conns[next_src_addr];
+ const uint32_t xbar_src_addr = next_src_addr == 0 ? x300::SRC_ADDR0
+ : x300::SRC_ADDR1;
+ const uint32_t xbar_src_dst = conn.type == X300_IFACE_ETH0 ? x300::XB_DST_E0
+ : x300::XB_DST_E1;
// Do not increment src addr for tx_data by default, using dual ethernet
// with the DMA FIFO causes sequence errors to DMA FIFO bandwidth
@@ -1373,119 +1365,125 @@ uhd::both_xports_t x300_impl::make_transport(
xports.recv_sid = xports.send_sid.reversed();
// Set size and number of frames
- size_t system_max_send_frame_size = (size_t) _max_frame_sizes.send_frame_size;
- size_t system_max_recv_frame_size = (size_t) _max_frame_sizes.recv_frame_size;
- default_buff_args.send_frame_size = std::min(system_max_send_frame_size, x300::ETH_MSG_FRAME_SIZE);
- default_buff_args.recv_frame_size = std::min(system_max_recv_frame_size, x300::ETH_MSG_FRAME_SIZE);
+ size_t system_max_send_frame_size = (size_t)_max_frame_sizes.send_frame_size;
+ size_t system_max_recv_frame_size = (size_t)_max_frame_sizes.recv_frame_size;
+ default_buff_args.send_frame_size =
+ std::min(system_max_send_frame_size, x300::ETH_MSG_FRAME_SIZE);
+ default_buff_args.recv_frame_size =
+ std::min(system_max_recv_frame_size, x300::ETH_MSG_FRAME_SIZE);
default_buff_args.send_buff_size = conn.link_rate / 50; // 20ms
- default_buff_args.recv_buff_size = std::max(conn.link_rate / 50, x300::ETH_MSG_NUM_FRAMES * x300::ETH_MSG_FRAME_SIZE); // enough to hold greater of 20ms or number of msg frames
- if (xport_type == TX_DATA)
- {
- size_t default_frame_size = conn.link_rate == x300::MAX_RATE_1GIGE ? x300::GE_DATA_FRAME_SEND_SIZE : x300::XGE_DATA_FRAME_SEND_SIZE;
- default_buff_args.send_frame_size = args.cast<size_t>("send_frame_size", std::min(default_frame_size, system_max_send_frame_size));
- if (default_buff_args.send_frame_size > system_max_send_frame_size)
- {
+ default_buff_args.recv_buff_size = std::max(conn.link_rate / 50,
+ x300::ETH_MSG_NUM_FRAMES
+ * x300::ETH_MSG_FRAME_SIZE); // enough to hold greater of 20ms or number
+ // of msg frames
+ if (xport_type == TX_DATA) {
+ size_t default_frame_size = conn.link_rate == x300::MAX_RATE_1GIGE
+ ? x300::GE_DATA_FRAME_SEND_SIZE
+ : x300::XGE_DATA_FRAME_SEND_SIZE;
+ default_buff_args.send_frame_size = args.cast<size_t>("send_frame_size",
+ std::min(default_frame_size, system_max_send_frame_size));
+ if (default_buff_args.send_frame_size > system_max_send_frame_size) {
UHD_LOGGER_WARNING("X300")
- << boost::format("Requested send_frame_size of %d exceeds the maximum allowed on the %s connection. Using %d.")
- % default_buff_args.send_frame_size
- % conn.addr
- % system_max_send_frame_size
- ;
+ << boost::format("Requested send_frame_size of %d exceeds the "
+ "maximum allowed on the %s connection. Using %d.")
+ % default_buff_args.send_frame_size % conn.addr
+ % system_max_send_frame_size;
default_buff_args.send_frame_size = system_max_send_frame_size;
}
- }
- else if (xport_type == RX_DATA)
- {
- size_t default_frame_size = conn.link_rate == x300::MAX_RATE_1GIGE ? x300::GE_DATA_FRAME_RECV_SIZE : x300::XGE_DATA_FRAME_RECV_SIZE;
- default_buff_args.recv_frame_size = args.cast<size_t>("recv_frame_size", std::min(default_frame_size, system_max_recv_frame_size));
- if (default_buff_args.recv_frame_size > system_max_recv_frame_size)
- {
+ } else if (xport_type == RX_DATA) {
+ size_t default_frame_size = conn.link_rate == x300::MAX_RATE_1GIGE
+ ? x300::GE_DATA_FRAME_RECV_SIZE
+ : x300::XGE_DATA_FRAME_RECV_SIZE;
+ default_buff_args.recv_frame_size = args.cast<size_t>("recv_frame_size",
+ std::min(default_frame_size, system_max_recv_frame_size));
+ if (default_buff_args.recv_frame_size > system_max_recv_frame_size) {
UHD_LOGGER_WARNING("X300")
- << boost::format("Requested recv_frame_size of %d exceeds the maximum allowed on the %s connection. Using %d.")
- % default_buff_args.recv_frame_size
- % conn.addr
- % system_max_recv_frame_size
- ;
+ << boost::format("Requested recv_frame_size of %d exceeds the "
+ "maximum allowed on the %s connection. Using %d.")
+ % default_buff_args.recv_frame_size % conn.addr
+ % system_max_recv_frame_size;
default_buff_args.recv_frame_size = system_max_recv_frame_size;
}
- default_buff_args.num_recv_frames = 2; // set some buffers so the offload thread actually offloads the socket I/O
+ default_buff_args.num_recv_frames =
+ 2; // set some buffers so the offload thread actually offloads the socket
+ // I/O
}
- //make a new transport - fpga has no idea how to talk to us on this yet
+ // make a new transport - fpga has no idea how to talk to us on this yet
udp_zero_copy::buff_params buff_params;
- xports.recv = udp_zero_copy::make(
- conn.addr,
- BOOST_STRINGIZE(X300_VITA_UDP_PORT),
- default_buff_args,
- buff_params,
- xport_args);
+ xports.recv = udp_zero_copy::make(conn.addr,
+ BOOST_STRINGIZE(X300_VITA_UDP_PORT),
+ default_buff_args,
+ buff_params,
+ xport_args);
// Create a threaded transport for the receive chain only
// Note that this shouldn't affect PCIe
if (xport_type == RX_DATA) {
xports.recv = zero_copy_recv_offload::make(
- xports.recv,
- x300::RECV_OFFLOAD_BUFFER_TIMEOUT
- );
+ xports.recv, x300::RECV_OFFLOAD_BUFFER_TIMEOUT);
}
xports.send = xports.recv;
- //For the UDP transport the buffer size is the size of the socket buffer
- //in the kernel
+ // For the UDP transport the buffer size is the size of the socket buffer
+ // in the kernel
xports.recv_buff_size = buff_params.recv_buff_size;
xports.send_buff_size = buff_params.send_buff_size;
- //clear the ethernet dispatcher's udp port
- //NOT clearing this, the dispatcher is now intelligent
+ // clear the ethernet dispatcher's udp port
+ // NOT clearing this, the dispatcher is now intelligent
//_zpu_ctrl->poke32(SR_ADDR(SET0_BASE, (ZPU_SR_ETHINT0+8+3)), 0);
- //send a mini packet with SID into the ZPU
- //ZPU will reprogram the ethernet framer
- UHD_LOGGER_DEBUG("X300") << "programming packet for new xport on "
- << conn.addr << " sid " << xports.send_sid ;
- //YES, get a __send__ buffer from the __recv__ socket
+ // send a mini packet with SID into the ZPU
+ // ZPU will reprogram the ethernet framer
+ UHD_LOGGER_DEBUG("X300") << "programming packet for new xport on " << conn.addr
+ << " sid " << xports.send_sid;
+ // YES, get a __send__ buffer from the __recv__ socket
//-- this is the only way to program the framer for recv:
managed_send_buffer::sptr buff = xports.recv->get_send_buff();
- buff->cast<uint32_t *>()[0] = 0; //eth dispatch looks for != 0
- buff->cast<uint32_t *>()[1] = uhd::htonx(xports.send_sid.get());
+ buff->cast<uint32_t*>()[0] = 0; // eth dispatch looks for != 0
+ buff->cast<uint32_t*>()[1] = uhd::htonx(xports.send_sid.get());
buff->commit(8);
buff.reset();
- //reprogram the ethernet dispatcher's udp port (should be safe to always set)
- UHD_LOGGER_TRACE("X300")
- << "reprogram the ethernet dispatcher's udp port" ;
- mb.zpu_ctrl->poke32(SR_ADDR(SET0_BASE, (ZPU_SR_ETHINT0+8+3)), X300_VITA_UDP_PORT);
- mb.zpu_ctrl->poke32(SR_ADDR(SET0_BASE, (ZPU_SR_ETHINT1+8+3)), X300_VITA_UDP_PORT);
+ // reprogram the ethernet dispatcher's udp port (should be safe to always set)
+ UHD_LOGGER_TRACE("X300") << "reprogram the ethernet dispatcher's udp port";
+ mb.zpu_ctrl->poke32(
+ SR_ADDR(SET0_BASE, (ZPU_SR_ETHINT0 + 8 + 3)), X300_VITA_UDP_PORT);
+ mb.zpu_ctrl->poke32(
+ SR_ADDR(SET0_BASE, (ZPU_SR_ETHINT1 + 8 + 3)), X300_VITA_UDP_PORT);
- //Do a peek to an arbitrary address to guarantee that the
- //ethernet framer has been programmed before we return.
+ // Do a peek to an arbitrary address to guarantee that the
+ // ethernet framer has been programmed before we return.
mb.zpu_ctrl->peek32(0);
}
return xports;
}
-uhd::sid_t x300_impl::allocate_sid(
- mboard_members_t &mb,
- const uhd::sid_t &address,
- const uint32_t src_addr,
- const uint32_t src_dst
-) {
+uhd::sid_t x300_impl::allocate_sid(mboard_members_t& mb,
+ const uhd::sid_t& address,
+ const uint32_t src_addr,
+ const uint32_t src_dst)
+{
uhd::sid_t sid = address;
sid.set_src_addr(src_addr);
- sid.set_src_endpoint(_sid_framer++); //increment for next setup
+ sid.set_src_endpoint(_sid_framer++); // increment for next setup
// TODO Move all of this setup_mb()
// Program the X300 to recognise it's own local address.
mb.zpu_ctrl->poke32(SR_ADDR(SET0_BASE, ZPU_SR_XB_LOCAL), address.get_dst_addr());
- // Program CAM entry for outgoing packets matching a X300 resource (for example a Radio)
- // This type of packet matches the XB_LOCAL address and is looked up in the upper half of the CAM
- mb.zpu_ctrl->poke32(SR_ADDR(SETXB_BASE, 256 + address.get_dst_endpoint()), address.get_dst_xbarport());
+ // Program CAM entry for outgoing packets matching a X300 resource (for example a
+ // Radio) This type of packet matches the XB_LOCAL address and is looked up in the
+ // upper half of the CAM
+ mb.zpu_ctrl->poke32(SR_ADDR(SETXB_BASE, 256 + address.get_dst_endpoint()),
+ address.get_dst_xbarport());
// Program CAM entry for returning packets to us (for example GR host via Eth0)
- // This type of packet does not match the XB_LOCAL address and is looked up in the lower half of the CAM
+ // This type of packet does not match the XB_LOCAL address and is looked up in the
+ // lower half of the CAM
mb.zpu_ctrl->poke32(SR_ADDR(SETXB_BASE, 0 + src_addr), src_dst);
- UHD_LOGGER_TRACE("X300") << "done router config for sid " << sid ;
+ UHD_LOGGER_TRACE("X300") << "done router config for sid " << sid;
return sid;
}
@@ -1493,95 +1491,123 @@ uhd::sid_t x300_impl::allocate_sid(
/***********************************************************************
* clock and time control logic
**********************************************************************/
-void x300_impl::set_time_source_out(mboard_members_t &mb, const bool enb)
+void x300_impl::set_time_source_out(mboard_members_t& mb, const bool enb)
{
- mb.fw_regmap->clock_ctrl_reg.write(fw_regmap_t::clk_ctrl_reg_t::PPS_OUT_EN, enb?1:0);
+ mb.fw_regmap->clock_ctrl_reg.write(
+ fw_regmap_t::clk_ctrl_reg_t::PPS_OUT_EN, enb ? 1 : 0);
}
-void x300_impl::update_clock_source(mboard_members_t &mb, const std::string &source)
+void x300_impl::update_clock_source(mboard_members_t& mb, const std::string& source)
{
- //Optimize for the case when the current source is internal and we are trying
- //to set it to internal. This is the only case where we are guaranteed that
- //the clock has not gone away so we can skip setting the MUX and reseting the LMK.
- const bool reconfigure_clks = (mb.current_refclk_src != "internal") or (source != "internal");
+ // Optimize for the case when the current source is internal and we are trying
+ // to set it to internal. This is the only case where we are guaranteed that
+ // the clock has not gone away so we can skip setting the MUX and reseting the LMK.
+ const bool reconfigure_clks = (mb.current_refclk_src != "internal")
+ or (source != "internal");
if (reconfigure_clks) {
- //Update the clock MUX on the motherboard to select the requested source
+ // Update the clock MUX on the motherboard to select the requested source
if (source == "internal") {
- mb.fw_regmap->clock_ctrl_reg.set(fw_regmap_t::clk_ctrl_reg_t::CLK_SOURCE, fw_regmap_t::clk_ctrl_reg_t::SRC_INTERNAL);
+ mb.fw_regmap->clock_ctrl_reg.set(fw_regmap_t::clk_ctrl_reg_t::CLK_SOURCE,
+ fw_regmap_t::clk_ctrl_reg_t::SRC_INTERNAL);
mb.fw_regmap->clock_ctrl_reg.set(fw_regmap_t::clk_ctrl_reg_t::TCXO_EN, 1);
} else if (source == "external") {
- mb.fw_regmap->clock_ctrl_reg.set(fw_regmap_t::clk_ctrl_reg_t::CLK_SOURCE, fw_regmap_t::clk_ctrl_reg_t::SRC_EXTERNAL);
+ mb.fw_regmap->clock_ctrl_reg.set(fw_regmap_t::clk_ctrl_reg_t::CLK_SOURCE,
+ fw_regmap_t::clk_ctrl_reg_t::SRC_EXTERNAL);
mb.fw_regmap->clock_ctrl_reg.set(fw_regmap_t::clk_ctrl_reg_t::TCXO_EN, 0);
} else if (source == "gpsdo") {
- mb.fw_regmap->clock_ctrl_reg.set(fw_regmap_t::clk_ctrl_reg_t::CLK_SOURCE, fw_regmap_t::clk_ctrl_reg_t::SRC_GPSDO);
+ mb.fw_regmap->clock_ctrl_reg.set(fw_regmap_t::clk_ctrl_reg_t::CLK_SOURCE,
+ fw_regmap_t::clk_ctrl_reg_t::SRC_GPSDO);
mb.fw_regmap->clock_ctrl_reg.set(fw_regmap_t::clk_ctrl_reg_t::TCXO_EN, 0);
} else {
throw uhd::key_error("update_clock_source: unknown source: " + source);
}
mb.fw_regmap->clock_ctrl_reg.flush();
- //Reset the LMK to make sure it re-locks to the new reference
+ // Reset the LMK to make sure it re-locks to the new reference
mb.clock->reset_clocks();
}
- //Wait for the LMK to lock (always, as a sanity check that the clock is useable)
- //* Currently the LMK can take as long as 30 seconds to lock to a reference but we don't
+ // Wait for the LMK to lock (always, as a sanity check that the clock is useable)
+ //* Currently the LMK can take as long as 30 seconds to lock to a reference but we
+ // don't
//* want to wait that long during initialization.
- //TODO: Need to verify timeout and settings to make sure lock can be achieved in < 1.0 seconds
+ // TODO: Need to verify timeout and settings to make sure lock can be achieved in
+ // < 1.0 seconds
double timeout = mb.initialization_done ? 30.0 : 1.0;
- //The programming code in x300_clock_ctrl is not compatible with revs <= 4 and may
- //lead to locking issues. So, disable the ref-locked check for older (unsupported) boards.
+ // The programming code in x300_clock_ctrl is not compatible with revs <= 4 and may
+ // lead to locking issues. So, disable the ref-locked check for older (unsupported)
+ // boards.
if (mb.hw_rev > 4) {
- if (not wait_for_clk_locked(mb, fw_regmap_t::clk_status_reg_t::LMK_LOCK, timeout)) {
- //failed to lock on reference
+ if (not wait_for_clk_locked(
+ mb, fw_regmap_t::clk_status_reg_t::LMK_LOCK, timeout)) {
+ // failed to lock on reference
if (mb.initialization_done) {
- throw uhd::runtime_error((boost::format("Reference Clock PLL failed to lock to %s source.") % source).str());
+ throw uhd::runtime_error(
+ (boost::format("Reference Clock PLL failed to lock to %s source.")
+ % source)
+ .str());
} else {
- //TODO: Re-enable this warning when we figure out a reliable lock time
- //UHD_LOGGER_WARNING("X300") << "Reference clock failed to lock to " + source + " during device initialization. " <<
- // "Check for the lock before operation or ignore this warning if using another clock source." ;
+ // TODO: Re-enable this warning when we figure out a reliable lock time
+ // UHD_LOGGER_WARNING("X300") << "Reference clock failed to lock to " +
+ // source + " during device initialization. " <<
+ // "Check for the lock before operation or ignore this warning if using
+ // another clock source." ;
}
}
}
if (reconfigure_clks) {
- //Reset the radio clock PLL in the FPGA
- mb.zpu_ctrl->poke32(SR_ADDR(SET0_BASE, ZPU_SR_SW_RST), ZPU_SR_SW_RST_RADIO_CLK_PLL);
+ // Reset the radio clock PLL in the FPGA
+ mb.zpu_ctrl->poke32(
+ SR_ADDR(SET0_BASE, ZPU_SR_SW_RST), ZPU_SR_SW_RST_RADIO_CLK_PLL);
mb.zpu_ctrl->poke32(SR_ADDR(SET0_BASE, ZPU_SR_SW_RST), 0);
- //Wait for radio clock PLL to lock
- if (not wait_for_clk_locked(mb, fw_regmap_t::clk_status_reg_t::RADIO_CLK_LOCK, 0.01)) {
- throw uhd::runtime_error((boost::format("Reference Clock PLL in FPGA failed to lock to %s source.") % source).str());
+ // Wait for radio clock PLL to lock
+ if (not wait_for_clk_locked(
+ mb, fw_regmap_t::clk_status_reg_t::RADIO_CLK_LOCK, 0.01)) {
+ throw uhd::runtime_error(
+ (boost::format("Reference Clock PLL in FPGA failed to lock to %s source.")
+ % source)
+ .str());
}
- //Reset the IDELAYCTRL used to calibrate the data interface delays
- mb.zpu_ctrl->poke32(SR_ADDR(SET0_BASE, ZPU_SR_SW_RST), ZPU_SR_SW_RST_ADC_IDELAYCTRL);
+ // Reset the IDELAYCTRL used to calibrate the data interface delays
+ mb.zpu_ctrl->poke32(
+ SR_ADDR(SET0_BASE, ZPU_SR_SW_RST), ZPU_SR_SW_RST_ADC_IDELAYCTRL);
mb.zpu_ctrl->poke32(SR_ADDR(SET0_BASE, ZPU_SR_SW_RST), 0);
- //Wait for the ADC IDELAYCTRL to be ready
- if (not wait_for_clk_locked(mb, fw_regmap_t::clk_status_reg_t::IDELAYCTRL_LOCK, 0.01)) {
- throw uhd::runtime_error((boost::format("ADC Calibration Clock in FPGA failed to lock to %s source.") % source).str());
+ // Wait for the ADC IDELAYCTRL to be ready
+ if (not wait_for_clk_locked(
+ mb, fw_regmap_t::clk_status_reg_t::IDELAYCTRL_LOCK, 0.01)) {
+ throw uhd::runtime_error(
+ (boost::format(
+ "ADC Calibration Clock in FPGA failed to lock to %s source.")
+ % source)
+ .str());
}
// Reset ADCs and DACs
- for(rfnoc::x300_radio_ctrl_impl::sptr r: mb.radios) {
+ for (rfnoc::x300_radio_ctrl_impl::sptr r : mb.radios) {
r->reset_codec();
}
}
- //Update cache value
+ // Update cache value
mb.current_refclk_src = source;
}
-void x300_impl::update_time_source(mboard_members_t &mb, const std::string &source)
+void x300_impl::update_time_source(mboard_members_t& mb, const std::string& source)
{
if (source == "internal") {
- mb.fw_regmap->clock_ctrl_reg.write(fw_regmap_t::clk_ctrl_reg_t::PPS_SELECT, fw_regmap_t::clk_ctrl_reg_t::SRC_INTERNAL);
+ mb.fw_regmap->clock_ctrl_reg.write(fw_regmap_t::clk_ctrl_reg_t::PPS_SELECT,
+ fw_regmap_t::clk_ctrl_reg_t::SRC_INTERNAL);
} else if (source == "external") {
- mb.fw_regmap->clock_ctrl_reg.write(fw_regmap_t::clk_ctrl_reg_t::PPS_SELECT, fw_regmap_t::clk_ctrl_reg_t::SRC_EXTERNAL);
+ mb.fw_regmap->clock_ctrl_reg.write(fw_regmap_t::clk_ctrl_reg_t::PPS_SELECT,
+ fw_regmap_t::clk_ctrl_reg_t::SRC_EXTERNAL);
} else if (source == "gpsdo") {
- mb.fw_regmap->clock_ctrl_reg.write(fw_regmap_t::clk_ctrl_reg_t::PPS_SELECT, fw_regmap_t::clk_ctrl_reg_t::SRC_GPSDO);
+ mb.fw_regmap->clock_ctrl_reg.write(fw_regmap_t::clk_ctrl_reg_t::PPS_SELECT,
+ fw_regmap_t::clk_ctrl_reg_t::SRC_GPSDO);
} else {
throw uhd::key_error("update_time_source: unknown source: " + source);
}
@@ -1589,15 +1615,17 @@ void x300_impl::update_time_source(mboard_members_t &mb, const std::string &sour
/* TODO - Implement intelligent PPS detection
//check for valid pps
if (!is_pps_present(mb)) {
- throw uhd::runtime_error((boost::format("The %d PPS was not detected. Please check the PPS source and try again.") % source).str());
+ throw uhd::runtime_error((boost::format("The %d PPS was not detected. Please
+ check the PPS source and try again.") % source).str());
}
*/
}
-void x300_impl::sync_times(mboard_members_t &mb, const uhd::time_spec_t& t)
+void x300_impl::sync_times(mboard_members_t& mb, const uhd::time_spec_t& t)
{
- std::vector<rfnoc::block_id_t> radio_ids = find_blocks<rfnoc::x300_radio_ctrl_impl>("Radio");
- for(const rfnoc::block_id_t &id: radio_ids) {
+ std::vector<rfnoc::block_id_t> radio_ids =
+ find_blocks<rfnoc::x300_radio_ctrl_impl>("Radio");
+ for (const rfnoc::block_id_t& id : radio_ids) {
get_block_ctrl<rfnoc::x300_radio_ctrl_impl>(id)->set_time_sync(t);
}
@@ -1608,9 +1636,8 @@ void x300_impl::sync_times(mboard_members_t &mb, const uhd::time_spec_t& t)
bool x300_impl::wait_for_clk_locked(mboard_members_t& mb, uint32_t which, double timeout)
{
- const auto timeout_time =
- std::chrono::steady_clock::now()
- + std::chrono::milliseconds(int64_t(timeout * 1000));
+ const auto timeout_time = std::chrono::steady_clock::now()
+ + std::chrono::milliseconds(int64_t(timeout * 1000));
do {
if (mb.fw_regmap->clock_status_reg.read(which) == 1) {
return true;
@@ -1618,16 +1645,21 @@ bool x300_impl::wait_for_clk_locked(mboard_members_t& mb, uint32_t which, double
std::this_thread::sleep_for(std::chrono::milliseconds(1));
} while (std::chrono::steady_clock::now() < timeout_time);
- //Check one last time
- return (mb.fw_regmap->clock_status_reg.read(which)==1);
+ // Check one last time
+ return (mb.fw_regmap->clock_status_reg.read(which) == 1);
}
sensor_value_t x300_impl::get_ref_locked(mboard_members_t& mb)
{
mb.fw_regmap->clock_status_reg.refresh();
- const bool lock = (mb.fw_regmap->clock_status_reg.get(fw_regmap_t::clk_status_reg_t::LMK_LOCK)==1) &&
- (mb.fw_regmap->clock_status_reg.get(fw_regmap_t::clk_status_reg_t::RADIO_CLK_LOCK)==1) &&
- (mb.fw_regmap->clock_status_reg.get(fw_regmap_t::clk_status_reg_t::IDELAYCTRL_LOCK)==1);
+ const bool lock =
+ (mb.fw_regmap->clock_status_reg.get(fw_regmap_t::clk_status_reg_t::LMK_LOCK) == 1)
+ && (mb.fw_regmap->clock_status_reg.get(
+ fw_regmap_t::clk_status_reg_t::RADIO_CLK_LOCK)
+ == 1)
+ && (mb.fw_regmap->clock_status_reg.get(
+ fw_regmap_t::clk_status_reg_t::IDELAYCTRL_LOCK)
+ == 1);
return sensor_value_t("Ref", lock, "locked", "unlocked");
}
@@ -1635,11 +1667,13 @@ bool x300_impl::is_pps_present(mboard_members_t& mb)
{
// The ZPU_RB_CLK_STATUS_PPS_DETECT bit toggles with each rising edge of the PPS.
// We monitor it for up to 1.5 seconds looking for it to toggle.
- uint32_t pps_detect = mb.fw_regmap->clock_status_reg.read(fw_regmap_t::clk_status_reg_t::PPS_DETECT);
- for (int i = 0; i < 15; i++)
- {
+ uint32_t pps_detect =
+ mb.fw_regmap->clock_status_reg.read(fw_regmap_t::clk_status_reg_t::PPS_DETECT);
+ for (int i = 0; i < 15; i++) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
- if (pps_detect != mb.fw_regmap->clock_status_reg.read(fw_regmap_t::clk_status_reg_t::PPS_DETECT))
+ if (pps_detect
+ != mb.fw_regmap->clock_status_reg.read(
+ fw_regmap_t::clk_status_reg_t::PPS_DETECT))
return true;
}
return false;
@@ -1658,22 +1692,18 @@ void x300_impl::claimer_loop(wb_iface::sptr iface)
x300_impl::claim_status_t x300_impl::claim_status(wb_iface::sptr iface)
{
claim_status_t claim_status = CLAIMED_BY_OTHER; // Default to most restrictive
- auto timeout_time =
- std::chrono::steady_clock::now()
- + std::chrono::seconds(1);
- while (std::chrono::steady_clock::now() < timeout_time)
- {
- //If timed out, then device is definitely unclaimed
- if (iface->peek32(X300_FW_SHMEM_ADDR(X300_FW_SHMEM_CLAIM_STATUS)) == 0)
- {
+ auto timeout_time = std::chrono::steady_clock::now() + std::chrono::seconds(1);
+ while (std::chrono::steady_clock::now() < timeout_time) {
+ // If timed out, then device is definitely unclaimed
+ if (iface->peek32(X300_FW_SHMEM_ADDR(X300_FW_SHMEM_CLAIM_STATUS)) == 0) {
claim_status = UNCLAIMED;
break;
}
- //otherwise check claim src to determine if another thread with the same src has claimed the device
+ // otherwise check claim src to determine if another thread with the same src has
+ // claimed the device
uint32_t hash = iface->peek32(X300_FW_SHMEM_ADDR(X300_FW_SHMEM_CLAIM_SRC));
- if (hash == 0)
- {
+ if (hash == 0) {
// A non-zero claim status and an empty hash means the claim might
// be in the process of being released. This is possible because
// older firmware takes a long time to update the status. Wait and
@@ -1696,20 +1726,17 @@ void x300_impl::claim(wb_iface::sptr iface)
bool x300_impl::try_to_claim(wb_iface::sptr iface, long timeout_ms)
{
const auto timeout_time =
- std::chrono::steady_clock::now()
- + std::chrono::milliseconds(timeout_ms);
- while (1)
- {
+ std::chrono::steady_clock::now() + std::chrono::milliseconds(timeout_ms);
+ while (1) {
claim_status_t status = claim_status(iface);
- if (status == UNCLAIMED)
- {
+ if (status == UNCLAIMED) {
claim(iface);
- // It takes the claimer 10ms to update status, so wait 20ms before verifying claim
+ // It takes the claimer 10ms to update status, so wait 20ms before verifying
+ // claim
std::this_thread::sleep_for(std::chrono::milliseconds(20));
continue;
}
- if (status == CLAIMED_BY_US)
- {
+ if (status == CLAIMED_BY_US) {
break;
}
if (std::chrono::steady_clock::now() > timeout_time) {
@@ -1730,57 +1757,62 @@ void x300_impl::release(wb_iface::sptr iface)
/***********************************************************************
* Frame size detection
**********************************************************************/
-x300_impl::frame_size_t x300_impl::determine_max_frame_size(const std::string &addr,
- const frame_size_t &user_frame_size)
+x300_impl::frame_size_t x300_impl::determine_max_frame_size(
+ const std::string& addr, const frame_size_t& user_frame_size)
{
- udp_simple::sptr udp = udp_simple::make_connected(addr,
- BOOST_STRINGIZE(X300_MTU_DETECT_UDP_PORT));
+ udp_simple::sptr udp =
+ udp_simple::make_connected(addr, BOOST_STRINGIZE(X300_MTU_DETECT_UDP_PORT));
- std::vector<uint8_t> buffer(std::max(user_frame_size.recv_frame_size, user_frame_size.send_frame_size));
- x300_mtu_t *request = reinterpret_cast<x300_mtu_t *>(&buffer.front());
- static const double echo_timeout = 0.020; //20 ms
+ std::vector<uint8_t> buffer(
+ std::max(user_frame_size.recv_frame_size, user_frame_size.send_frame_size));
+ x300_mtu_t* request = reinterpret_cast<x300_mtu_t*>(&buffer.front());
+ static const double echo_timeout = 0.020; // 20 ms
- //test holler - check if its supported in this fw version
+ // test holler - check if its supported in this fw version
request->flags = uhd::htonx<uint32_t>(X300_MTU_DETECT_ECHO_REQUEST);
- request->size = uhd::htonx<uint32_t>(sizeof(x300_mtu_t));
+ request->size = uhd::htonx<uint32_t>(sizeof(x300_mtu_t));
udp->send(boost::asio::buffer(buffer, sizeof(x300_mtu_t)));
udp->recv(boost::asio::buffer(buffer), echo_timeout);
if (!(uhd::ntohx<uint32_t>(request->flags) & X300_MTU_DETECT_ECHO_REPLY))
throw uhd::not_implemented_error("Holler protocol not implemented");
- //Reducing range of (min,max) by setting max value to 10gig max_frame_size as larger sizes are not supported
+ // Reducing range of (min,max) by setting max value to 10gig max_frame_size as larger
+ // sizes are not supported
size_t min_recv_frame_size = sizeof(x300_mtu_t);
- size_t max_recv_frame_size = std::min(user_frame_size.recv_frame_size, x300::DATA_FRAME_MAX_SIZE) & size_t(~3);
+ size_t max_recv_frame_size =
+ std::min(user_frame_size.recv_frame_size, x300::DATA_FRAME_MAX_SIZE) & size_t(~3);
size_t min_send_frame_size = sizeof(x300_mtu_t);
- size_t max_send_frame_size = std::min(user_frame_size.send_frame_size, x300::DATA_FRAME_MAX_SIZE) & size_t(~3);
+ size_t max_send_frame_size =
+ std::min(user_frame_size.send_frame_size, x300::DATA_FRAME_MAX_SIZE) & size_t(~3);
UHD_LOGGER_DEBUG("X300") << "Determining maximum frame size... ";
- while (min_recv_frame_size < max_recv_frame_size)
- {
- size_t test_frame_size = (max_recv_frame_size/2 + min_recv_frame_size/2 + 3) & ~3;
+ while (min_recv_frame_size < max_recv_frame_size) {
+ size_t test_frame_size = (max_recv_frame_size / 2 + min_recv_frame_size / 2 + 3)
+ & ~3;
- request->flags = uhd::htonx<uint32_t>(X300_MTU_DETECT_ECHO_REQUEST);
- request->size = uhd::htonx<uint32_t>(test_frame_size);
- udp->send(boost::asio::buffer(buffer, sizeof(x300_mtu_t)));
+ request->flags = uhd::htonx<uint32_t>(X300_MTU_DETECT_ECHO_REQUEST);
+ request->size = uhd::htonx<uint32_t>(test_frame_size);
+ udp->send(boost::asio::buffer(buffer, sizeof(x300_mtu_t)));
- size_t len = udp->recv(boost::asio::buffer(buffer), echo_timeout);
+ size_t len = udp->recv(boost::asio::buffer(buffer), echo_timeout);
- if (len >= test_frame_size)
- min_recv_frame_size = test_frame_size;
- else
- max_recv_frame_size = test_frame_size - 4;
+ if (len >= test_frame_size)
+ min_recv_frame_size = test_frame_size;
+ else
+ max_recv_frame_size = test_frame_size - 4;
}
- if(min_recv_frame_size < IP_PROTOCOL_MIN_MTU_SIZE-IP_PROTOCOL_UDP_PLUS_IP_HEADER) {
- throw uhd::runtime_error("System receive MTU size is less than the minimum required by the IP protocol.");
+ if (min_recv_frame_size < IP_PROTOCOL_MIN_MTU_SIZE - IP_PROTOCOL_UDP_PLUS_IP_HEADER) {
+ throw uhd::runtime_error("System receive MTU size is less than the minimum "
+ "required by the IP protocol.");
}
- while (min_send_frame_size < max_send_frame_size)
- {
- size_t test_frame_size = (max_send_frame_size/2 + min_send_frame_size/2 + 3) & ~3;
+ while (min_send_frame_size < max_send_frame_size) {
+ size_t test_frame_size = (max_send_frame_size / 2 + min_send_frame_size / 2 + 3)
+ & ~3;
request->flags = uhd::htonx<uint32_t>(X300_MTU_DETECT_ECHO_REQUEST);
- request->size = uhd::htonx<uint32_t>(sizeof(x300_mtu_t));
+ request->size = uhd::htonx<uint32_t>(sizeof(x300_mtu_t));
udp->send(boost::asio::buffer(buffer, test_frame_size));
size_t len = udp->recv(boost::asio::buffer(buffer), echo_timeout);
@@ -1793,8 +1825,9 @@ x300_impl::frame_size_t x300_impl::determine_max_frame_size(const std::string &a
max_send_frame_size = test_frame_size - 4;
}
- if(min_send_frame_size < IP_PROTOCOL_MIN_MTU_SIZE-IP_PROTOCOL_UDP_PLUS_IP_HEADER) {
- throw uhd::runtime_error("System send MTU size is less than the minimum required by the IP protocol.");
+ if (min_send_frame_size < IP_PROTOCOL_MIN_MTU_SIZE - IP_PROTOCOL_UDP_PLUS_IP_HEADER) {
+ throw uhd::runtime_error(
+ "System send MTU size is less than the minimum required by the IP protocol.");
}
frame_size_t frame_size;
@@ -1803,8 +1836,8 @@ x300_impl::frame_size_t x300_impl::determine_max_frame_size(const std::string &a
// of the recv and send frame sizes.
frame_size.recv_frame_size = std::min(min_recv_frame_size, min_send_frame_size);
frame_size.send_frame_size = std::min(min_recv_frame_size, min_send_frame_size);
- UHD_LOGGER_INFO("X300")
- << "Maximum frame size: " << frame_size.send_frame_size << " bytes.";
+ UHD_LOGGER_INFO("X300") << "Maximum frame size: " << frame_size.send_frame_size
+ << " bytes.";
return frame_size;
}
@@ -1812,10 +1845,8 @@ x300_impl::frame_size_t x300_impl::determine_max_frame_size(const std::string &a
* compat checks
**********************************************************************/
-void x300_impl::check_fw_compat(
- const fs_path &mb_path,
- const mboard_members_t &members
-) {
+void x300_impl::check_fw_compat(const fs_path& mb_path, const mboard_members_t& members)
+{
auto iface = members.zpu_ctrl;
const uint32_t compat_num =
iface->peek32(SR_ADDR(X300_FW_SHMEM_BASE, X300_FW_SHMEM_COMPAT_NUM));
@@ -1826,78 +1857,75 @@ void x300_impl::check_fw_compat(
const std::string image_loader_path =
(fs::path(uhd::get_pkg_path()) / "bin" / "uhd_image_loader").string();
const std::string image_loader_cmd =
- str(boost::format("\"%s\" --args=\"type=x300,%s=%s\"")
- % image_loader_path
- % (members.xport_path == "eth" ? "addr"
- : "resource")
- % members.get_pri_eth().addr);
-
- throw uhd::runtime_error(str(boost::format(
- "Expected firmware compatibility number %d, but got %d:\n"
- "The FPGA/firmware image on your device is not compatible with this host code build.\n"
- "Download the appropriate FPGA images for this version of UHD.\n"
- "%s\n\n"
- "Then burn a new image to the on-board flash storage of your\n"
- "USRP X3xx device using the image loader utility. "
- "Use this command:\n\n%s\n\n"
- "For more information, refer to the UHD manual:\n\n"
- " http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_flash"
- ) % int(X300_FW_COMPAT_MAJOR) % compat_major
- % print_utility_error("uhd_images_downloader.py")
- % image_loader_cmd));
+ str(boost::format("\"%s\" --args=\"type=x300,%s=%s\"") % image_loader_path
+ % (members.xport_path == "eth" ? "addr" : "resource")
+ % members.get_pri_eth().addr);
+
+ throw uhd::runtime_error(
+ str(boost::format(
+ "Expected firmware compatibility number %d, but got %d:\n"
+ "The FPGA/firmware image on your device is not compatible with this "
+ "host code build.\n"
+ "Download the appropriate FPGA images for this version of UHD.\n"
+ "%s\n\n"
+ "Then burn a new image to the on-board flash storage of your\n"
+ "USRP X3xx device using the image loader utility. "
+ "Use this command:\n\n%s\n\n"
+ "For more information, refer to the UHD manual:\n\n"
+ " http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_flash")
+ % int(X300_FW_COMPAT_MAJOR) % compat_major
+ % print_utility_error("uhd_images_downloader.py") % image_loader_cmd));
}
_tree->create<std::string>(mb_path / "fw_version")
.set(str(boost::format("%u.%u") % compat_major % compat_minor));
}
-void x300_impl::check_fpga_compat(const fs_path &mb_path, const mboard_members_t &members)
+void x300_impl::check_fpga_compat(const fs_path& mb_path, const mboard_members_t& members)
{
uint32_t compat_num = members.zpu_ctrl->peek32(SR_ADDR(SET0_BASE, ZPU_RB_COMPAT_NUM));
uint32_t compat_major = (compat_num >> 16);
uint32_t compat_minor = (compat_num & 0xffff);
- if (compat_major != X300_FPGA_COMPAT_MAJOR)
- {
- std::string image_loader_path = (fs::path(uhd::get_pkg_path()) / "bin" / "uhd_image_loader").string();
- std::string image_loader_cmd = str(boost::format("\"%s\" --args=\"type=x300,%s=%s\"")
- % image_loader_path
- % (members.xport_path == "eth" ? "addr"
- : "resource")
- % members.get_pri_eth().addr);
-
- throw uhd::runtime_error(str(boost::format(
- "Expected FPGA compatibility number %d, but got %d:\n"
- "The FPGA image on your device is not compatible with this host code build.\n"
- "Download the appropriate FPGA images for this version of UHD.\n"
- "%s\n\n"
- "Then burn a new image to the on-board flash storage of your\n"
- "USRP X3xx device using the image loader utility. Use this command:\n\n%s\n\n"
- "For more information, refer to the UHD manual:\n\n"
- " http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_flash"
- ) % int(X300_FPGA_COMPAT_MAJOR) % compat_major
- % print_utility_error("uhd_images_downloader.py")
- % image_loader_cmd));
+ if (compat_major != X300_FPGA_COMPAT_MAJOR) {
+ std::string image_loader_path =
+ (fs::path(uhd::get_pkg_path()) / "bin" / "uhd_image_loader").string();
+ std::string image_loader_cmd =
+ str(boost::format("\"%s\" --args=\"type=x300,%s=%s\"") % image_loader_path
+ % (members.xport_path == "eth" ? "addr" : "resource")
+ % members.get_pri_eth().addr);
+
+ throw uhd::runtime_error(
+ str(boost::format(
+ "Expected FPGA compatibility number %d, but got %d:\n"
+ "The FPGA image on your device is not compatible with this host code "
+ "build.\n"
+ "Download the appropriate FPGA images for this version of UHD.\n"
+ "%s\n\n"
+ "Then burn a new image to the on-board flash storage of your\n"
+ "USRP X3xx device using the image loader utility. Use this "
+ "command:\n\n%s\n\n"
+ "For more information, refer to the UHD manual:\n\n"
+ " http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_flash")
+ % int(X300_FPGA_COMPAT_MAJOR) % compat_major
+ % print_utility_error("uhd_images_downloader.py") % image_loader_cmd));
}
- _tree->create<std::string>(mb_path / "fpga_version").set(str(boost::format("%u.%u")
- % compat_major % compat_minor));
-
- const uint32_t git_hash = members.zpu_ctrl->peek32(SR_ADDR(SET0_BASE,
- ZPU_RB_GIT_HASH));
- const std::string git_hash_str = str(
- boost::format("%07x%s")
- % (git_hash & 0x0FFFFFFF)
- % ((git_hash & 0xF0000000) ? "-dirty" : "")
- );
+ _tree->create<std::string>(mb_path / "fpga_version")
+ .set(str(boost::format("%u.%u") % compat_major % compat_minor));
+
+ const uint32_t git_hash =
+ members.zpu_ctrl->peek32(SR_ADDR(SET0_BASE, ZPU_RB_GIT_HASH));
+ const std::string git_hash_str = str(boost::format("%07x%s") % (git_hash & 0x0FFFFFFF)
+ % ((git_hash & 0xF0000000) ? "-dirty" : ""));
_tree->create<std::string>(mb_path / "fpga_version_hash").set(git_hash_str);
UHD_LOG_DEBUG("X300",
"Using FPGA version: " << compat_major << "." << compat_minor
- << " git hash: " << git_hash_str);
+ << " git hash: " << git_hash_str);
}
x300_impl::x300_mboard_t x300_impl::get_mb_type_from_pcie(
- const std::string& resource, const std::string& rpc_port)
+ const std::string& resource, const std::string& rpc_port)
{
- //Detect the PCIe product ID to distinguish between X300 and X310
+ // Detect the PCIe product ID to distinguish between X300 and X310
nirio_status status = NiRio_Status_Success;
uint32_t pid;
niriok_proxy::sptr discovery_proxy =
@@ -1911,20 +1939,18 @@ x300_impl::x300_mboard_t x300_impl::get_mb_type_from_pcie(
}
}
- UHD_LOGGER_WARNING("X300") <<
- "NI-RIO Error -- unable to determine motherboard type!";
+ UHD_LOGGER_WARNING("X300") << "NI-RIO Error -- unable to determine motherboard type!";
return UNKNOWN;
}
x300_impl::x300_mboard_t x300_impl::get_mb_type_from_eeprom(
- const uhd::usrp::mboard_eeprom_t& mb_eeprom)
+ const uhd::usrp::mboard_eeprom_t& mb_eeprom)
{
- if (not mb_eeprom["product"].empty())
- {
+ if (not mb_eeprom["product"].empty()) {
uint16_t product_num = 0;
try {
product_num = boost::lexical_cast<uint16_t>(mb_eeprom["product"]);
- } catch (const boost::bad_lexical_cast &) {
+ } catch (const boost::bad_lexical_cast&) {
product_num = 0;
}
diff --git a/host/lib/usrp/x300/x300_impl.hpp b/host/lib/usrp/x300/x300_impl.hpp
index 9de68a697..c58440d54 100644
--- a/host/lib/usrp/x300/x300_impl.hpp
+++ b/host/lib/usrp/x300/x300_impl.hpp
@@ -8,36 +8,34 @@
#ifndef INCLUDED_X300_IMPL_HPP
#define INCLUDED_X300_IMPL_HPP
-#include "x300_radio_ctrl_impl.hpp"
+#include "../device3/device3_impl.hpp"
#include "x300_clock_ctrl.hpp"
-#include "x300_fw_common.h"
-#include "x300_regs.hpp"
#include "x300_defaults.hpp"
#include "x300_device_args.hpp"
-
-#include "../device3/device3_impl.hpp"
+#include "x300_fw_common.h"
+#include "x300_radio_ctrl_impl.hpp"
+#include "x300_regs.hpp"
#include <uhd/property_tree.hpp>
-#include <uhd/usrp/mboard_eeprom.hpp>
-#include <uhd/usrp/subdev_spec.hpp>
-#include <uhd/types/sensors.hpp>
-#include <uhd/transport/udp_simple.hpp> //mtu
-#include <uhd/usrp/gps_ctrl.hpp>
+#include <uhd/transport/muxed_zero_copy_if.hpp>
#include <uhd/transport/nirio/niusrprio_session.h>
+#include <uhd/transport/udp_simple.hpp> //mtu
#include <uhd/transport/vrt_if_packet.hpp>
-#include <uhd/transport/muxed_zero_copy_if.hpp>
+#include <uhd/types/sensors.hpp>
+#include <uhd/usrp/gps_ctrl.hpp>
+#include <uhd/usrp/mboard_eeprom.hpp>
+#include <uhd/usrp/subdev_spec.hpp>
///////////// RFNOC /////////////////////
#include <uhd/rfnoc/block_ctrl.hpp>
///////////// RFNOC /////////////////////
-#include <uhdlib/usrp/cores/i2c_core_100_wb32.hpp>
#include <uhdlib/usrp/common/recv_packet_demuxer_3000.hpp>
+#include <uhdlib/usrp/cores/i2c_core_100_wb32.hpp>
#include <boost/dynamic_bitset.hpp>
#include <boost/weak_ptr.hpp>
#include <atomic>
// Ethernet ports
-enum x300_eth_iface_t
-{
+enum x300_eth_iface_t {
X300_IFACE_NONE = 0,
X300_IFACE_ETH0 = 1,
X300_IFACE_ETH1 = 2,
@@ -53,47 +51,46 @@ struct x300_eth_conn_t
uhd::uart_iface::sptr x300_make_uart_iface(uhd::wb_iface::sptr iface);
-uhd::wb_iface::sptr x300_make_ctrl_iface_enet(uhd::transport::udp_simple::sptr udp, bool enable_errors = true);
-uhd::wb_iface::sptr x300_make_ctrl_iface_pcie(uhd::niusrprio::niriok_proxy::sptr drv_proxy, bool enable_errors = true);
+uhd::wb_iface::sptr x300_make_ctrl_iface_enet(
+ uhd::transport::udp_simple::sptr udp, bool enable_errors = true);
+uhd::wb_iface::sptr x300_make_ctrl_iface_pcie(
+ uhd::niusrprio::niriok_proxy::sptr drv_proxy, bool enable_errors = true);
-uhd::device_addrs_t x300_find(const uhd::device_addr_t &hint_);
+uhd::device_addrs_t x300_find(const uhd::device_addr_t& hint_);
class x300_impl : public uhd::usrp::device3_impl
{
public:
-
- x300_impl(const uhd::device_addr_t &);
- void setup_mb(const size_t which, const uhd::device_addr_t &);
+ x300_impl(const uhd::device_addr_t&);
+ void setup_mb(const size_t which, const uhd::device_addr_t&);
~x300_impl(void);
// device claim functions
- enum claim_status_t {UNCLAIMED, CLAIMED_BY_US, CLAIMED_BY_OTHER};
+ enum claim_status_t { UNCLAIMED, CLAIMED_BY_US, CLAIMED_BY_OTHER };
static claim_status_t claim_status(uhd::wb_iface::sptr iface);
static void claim(uhd::wb_iface::sptr iface);
static bool try_to_claim(uhd::wb_iface::sptr iface, long timeout = 2000);
static void release(uhd::wb_iface::sptr iface);
- enum x300_mboard_t {
- USRP_X300_MB, USRP_X310_MB, USRP_X310_MB_NI_2974, UNKNOWN
- };
- static x300_mboard_t get_mb_type_from_pcie(const std::string& resource, const std::string& rpc_port);
- static x300_mboard_t get_mb_type_from_eeprom(const uhd::usrp::mboard_eeprom_t& mb_eeprom);
+ enum x300_mboard_t { USRP_X300_MB, USRP_X310_MB, USRP_X310_MB_NI_2974, UNKNOWN };
+ static x300_mboard_t get_mb_type_from_pcie(
+ const std::string& resource, const std::string& rpc_port);
+ static x300_mboard_t get_mb_type_from_eeprom(
+ const uhd::usrp::mboard_eeprom_t& mb_eeprom);
//! Read out the on-board EEPROM, convert to dict, and return
static uhd::usrp::mboard_eeprom_t get_mb_eeprom(uhd::i2c_iface::sptr i2c);
protected:
- void subdev_to_blockid(
- const uhd::usrp::subdev_spec_pair_t &spec, const size_t mb_i,
- uhd::rfnoc::block_id_t &block_id, uhd::device_addr_t &block_args
- );
+ void subdev_to_blockid(const uhd::usrp::subdev_spec_pair_t& spec,
+ const size_t mb_i,
+ uhd::rfnoc::block_id_t& block_id,
+ uhd::device_addr_t& block_args);
uhd::usrp::subdev_spec_pair_t blockid_to_subdev(
- const uhd::rfnoc::block_id_t &blockid, const uhd::device_addr_t &block_args
- );
+ const uhd::rfnoc::block_id_t& blockid, const uhd::device_addr_t& block_args);
private:
-
- //vector of member objects per motherboard
+ // vector of member objects per motherboard
struct mboard_members_t
{
uhd::usrp::x300::x300_device_args_t args;
@@ -109,7 +106,7 @@ private:
// Discover the ethernet connections per motherboard
void discover_eth(const uhd::usrp::mboard_eeprom_t mb_eeprom,
- const std::vector<std::string> &ip_addrs);
+ const std::vector<std::string>& ip_addrs);
// Get the primary ethernet connection
inline const x300_eth_conn_t& get_pri_eth() const
@@ -120,20 +117,20 @@ private:
uhd::device_addr_t send_args;
uhd::device_addr_t recv_args;
bool if_pkt_is_big_endian;
- uhd::niusrprio::niusrprio_session::sptr rio_fpga_interface;
+ uhd::niusrprio::niusrprio_session::sptr rio_fpga_interface;
- //perifs in the zpu
+ // perifs in the zpu
uhd::wb_iface::sptr zpu_ctrl;
spi_core_3000::sptr zpu_spi;
i2c_core_100_wb32::sptr zpu_i2c;
- //other perifs on mboard
+ // other perifs on mboard
x300_clock_ctrl::sptr clock;
uhd::gps_ctrl::sptr gps;
uhd::usrp::x300::fw_regmap_t::sptr fw_regmap;
- //which FPGA image is loaded
+ // which FPGA image is loaded
std::string loaded_fpga_image;
size_t hw_rev;
@@ -154,25 +151,23 @@ private:
*
* Note the SID is always the transmit SID (i.e. from host to device).
*/
- uint32_t allocate_pcie_dma_chan(const uhd::sid_t &tx_sid, const xport_type_t xport_type);
+ uint32_t allocate_pcie_dma_chan(
+ const uhd::sid_t& tx_sid, const xport_type_t xport_type);
};
std::vector<mboard_members_t> _mb;
- //task for periodically reclaiming the device from others
+ // task for periodically reclaiming the device from others
void claimer_loop(uhd::wb_iface::sptr);
std::atomic<size_t> _sid_framer;
- uhd::sid_t allocate_sid(
- mboard_members_t &mb,
- const uhd::sid_t &address,
+ uhd::sid_t allocate_sid(mboard_members_t& mb,
+ const uhd::sid_t& address,
const uint32_t src_addr,
const uint32_t src_dst);
- uhd::both_xports_t make_transport(
- const uhd::sid_t &address,
+ uhd::both_xports_t make_transport(const uhd::sid_t& address,
const xport_type_t xport_type,
- const uhd::device_addr_t& args
- );
+ const uhd::device_addr_t& args);
struct frame_size_t
{
@@ -186,24 +181,25 @@ private:
* to the device and see which packet sizes actually work. This way, we can take
* switches etc. into account which might live between the device and the host.
*/
- frame_size_t determine_max_frame_size(const std::string &addr, const frame_size_t &user_mtu);
+ frame_size_t determine_max_frame_size(
+ const std::string& addr, const frame_size_t& user_mtu);
////////////////////////////////////////////////////////////////////
//
- //Caching for transport interface re-use -- like sharing a DMA.
- //The cache is optionally used by make_transport by use-case.
- //The cache maps an ID string to a transport-ish object.
- //The ID string identifies a purpose for the transport.
+ // Caching for transport interface re-use -- like sharing a DMA.
+ // The cache is optionally used by make_transport by use-case.
+ // The cache maps an ID string to a transport-ish object.
+ // The ID string identifies a purpose for the transport.
//
- //For recv, there is a demux cache, which maps a ID string
- //to a recv demux object. When a demux is used, the underlying transport
- //must never be used outside of the demux. Use demux->make_proxy(sid).
+ // For recv, there is a demux cache, which maps a ID string
+ // to a recv demux object. When a demux is used, the underlying transport
+ // must never be used outside of the demux. Use demux->make_proxy(sid).
//
uhd::dict<std::string, uhd::usrp::recv_packet_demuxer_3000::sptr> _demux_cache;
//
- //For send, there is a shared send xport, which maps an ID string
- //to a transport capable of sending buffers. Send transports
- //can be shared amongst multiple callers, unlike recv.
+ // For send, there is a shared send xport, which maps an ID string
+ // to a transport capable of sending buffers. Send transports
+ // can be shared amongst multiple callers, unlike recv.
//
uhd::dict<std::string, uhd::transport::zero_copy_if::sptr> _send_cache;
//
@@ -214,10 +210,10 @@ private:
bool _ignore_cal_file;
void update_clock_control(mboard_members_t&);
- void initialize_clock_control(mboard_members_t &mb);
+ void initialize_clock_control(mboard_members_t& mb);
void set_time_source_out(mboard_members_t&, const bool);
- void update_clock_source(mboard_members_t&, const std::string &);
- void update_time_source(mboard_members_t&, const std::string &);
+ void update_clock_source(mboard_members_t&, const std::string&);
+ void update_time_source(mboard_members_t&, const std::string&);
void sync_times(mboard_members_t&, const uhd::time_spec_t&);
uhd::sensor_value_t get_ref_locked(mboard_members_t& mb);
@@ -225,13 +221,10 @@ private:
bool is_pps_present(mboard_members_t& mb);
//! Write the contents of an EEPROM dict to the on-board EEPROM
- void set_mb_eeprom(
- uhd::i2c_iface::sptr i2c,
- const uhd::usrp::mboard_eeprom_t &
- );
+ void set_mb_eeprom(uhd::i2c_iface::sptr i2c, const uhd::usrp::mboard_eeprom_t&);
- void check_fw_compat(const uhd::fs_path &mb_path, const mboard_members_t &members);
- void check_fpga_compat(const uhd::fs_path &mb_path, const mboard_members_t &members);
+ void check_fw_compat(const uhd::fs_path& mb_path, const mboard_members_t& members);
+ void check_fpga_compat(const uhd::fs_path& mb_path, const mboard_members_t& members);
/// More IO stuff
uhd::device_addr_t get_tx_hints(size_t mb_index);
diff --git a/host/lib/usrp/x300/x300_io_impl.cpp b/host/lib/usrp/x300/x300_io_impl.cpp
index d833b3715..07e93173a 100644
--- a/host/lib/usrp/x300/x300_io_impl.cpp
+++ b/host/lib/usrp/x300/x300_io_impl.cpp
@@ -5,8 +5,8 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "x300_regs.hpp"
#include "x300_impl.hpp"
+#include "x300_regs.hpp"
using namespace uhd;
using namespace uhd::usrp;
@@ -35,7 +35,7 @@ void x300_impl::post_streamer_hooks(direction_t dir)
// Loop through all tx streamers. Find all radios connected to one
// streamer. Sync those.
- for(const boost::weak_ptr<uhd::tx_streamer> &streamer_w: _tx_streamers.vals()) {
+ for (const boost::weak_ptr<uhd::tx_streamer>& streamer_w : _tx_streamers.vals()) {
const boost::shared_ptr<device3_send_packet_streamer> streamer =
boost::dynamic_pointer_cast<device3_send_packet_streamer>(streamer_w.lock());
if (not streamer) {
@@ -43,13 +43,15 @@ void x300_impl::post_streamer_hooks(direction_t dir)
}
std::vector<rfnoc::x300_radio_ctrl_impl::sptr> radio_ctrl_blks =
- streamer->get_terminator()->find_downstream_node<rfnoc::x300_radio_ctrl_impl>();
+ streamer->get_terminator()
+ ->find_downstream_node<rfnoc::x300_radio_ctrl_impl>();
try {
- //UHD_LOGGER_INFO("X300") << "[X300] syncing " << radio_ctrl_blks.size() << " radios " ;
+ // UHD_LOGGER_INFO("X300") << "[X300] syncing " << radio_ctrl_blks.size() << "
+ // radios " ;
rfnoc::x300_radio_ctrl_impl::synchronize_dacs(radio_ctrl_blks);
- }
- catch(const uhd::io_error &ex) {
- throw uhd::io_error(str(boost::format("Failed to sync DACs! %s ") % ex.what()));
+ } catch (const uhd::io_error& ex) {
+ throw uhd::io_error(
+ str(boost::format("Failed to sync DACs! %s ") % ex.what()));
}
}
}
diff --git a/host/lib/usrp/x300/x300_mb_eeprom.cpp b/host/lib/usrp/x300/x300_mb_eeprom.cpp
index b3ebf6101..663f4c9db 100644
--- a/host/lib/usrp/x300/x300_mb_eeprom.cpp
+++ b/host/lib/usrp/x300/x300_mb_eeprom.cpp
@@ -5,38 +5,38 @@
//
#include "x300_impl.hpp"
-#include <uhdlib/utils/eeprom_utils.hpp>
-#include <uhd/usrp/mboard_eeprom.hpp>
#include <uhd/types/serial.hpp>
+#include <uhd/usrp/mboard_eeprom.hpp>
+#include <uhdlib/utils/eeprom_utils.hpp>
namespace {
- const uint8_t X300_EEPROM_ADDR = 0x50;
-
- struct x300_eeprom_map
- {
- //identifying numbers
- unsigned char revision[2];
- unsigned char product[2];
- unsigned char revision_compat[2];
- uint8_t _pad0[2];
-
- //all the mac addrs
- uint8_t mac_addr0[6];
- uint8_t _pad1[2];
- uint8_t mac_addr1[6];
- uint8_t _pad2[2];
-
- //all the IP addrs
- uint32_t gateway;
- uint32_t subnet[4];
- uint32_t ip_addr[4];
- uint8_t _pad3[16];
-
- //names and serials
- unsigned char name[NAME_MAX_LEN];
- unsigned char serial[SERIAL_LEN];
- };
-}
+const uint8_t X300_EEPROM_ADDR = 0x50;
+
+struct x300_eeprom_map
+{
+ // identifying numbers
+ unsigned char revision[2];
+ unsigned char product[2];
+ unsigned char revision_compat[2];
+ uint8_t _pad0[2];
+
+ // all the mac addrs
+ uint8_t mac_addr0[6];
+ uint8_t _pad1[2];
+ uint8_t mac_addr1[6];
+ uint8_t _pad2[2];
+
+ // all the IP addrs
+ uint32_t gateway;
+ uint32_t subnet[4];
+ uint32_t ip_addr[4];
+ uint8_t _pad3[16];
+
+ // names and serials
+ unsigned char name[NAME_MAX_LEN];
+ unsigned char serial[SERIAL_LEN];
+};
+} // namespace
using namespace uhd;
using uhd::usrp::mboard_eeprom_t;
@@ -51,170 +51,150 @@ mboard_eeprom_t x300_impl::get_mb_eeprom(uhd::i2c_iface::sptr iface)
return mb_eeprom;
}
- //extract the revision number
+ // extract the revision number
mb_eeprom["revision"] = uint16_bytes_to_string(
- byte_vector_t(
- bytes.begin() + offsetof(x300_eeprom_map, revision),
- bytes.begin() + (offsetof(x300_eeprom_map, revision)+2))
- );
+ byte_vector_t(bytes.begin() + offsetof(x300_eeprom_map, revision),
+ bytes.begin() + (offsetof(x300_eeprom_map, revision) + 2)));
- //extract the revision compat number
+ // extract the revision compat number
mb_eeprom["revision_compat"] = uint16_bytes_to_string(
- byte_vector_t(
- bytes.begin() + offsetof(x300_eeprom_map, revision_compat),
- bytes.begin() + (offsetof(x300_eeprom_map, revision_compat)+2))
- );
+ byte_vector_t(bytes.begin() + offsetof(x300_eeprom_map, revision_compat),
+ bytes.begin() + (offsetof(x300_eeprom_map, revision_compat) + 2)));
- //extract the product code
+ // extract the product code
mb_eeprom["product"] = uint16_bytes_to_string(
- byte_vector_t(
- bytes.begin() + offsetof(x300_eeprom_map, product),
- bytes.begin() + (offsetof(x300_eeprom_map, product)+2))
- );
+ byte_vector_t(bytes.begin() + offsetof(x300_eeprom_map, product),
+ bytes.begin() + (offsetof(x300_eeprom_map, product) + 2)));
- //extract the mac addresses
+ // extract the mac addresses
mb_eeprom["mac-addr0"] = mac_addr_t::from_bytes(
- byte_vector_t(
- bytes.begin() + offsetof(x300_eeprom_map, mac_addr0),
- bytes.begin() + (offsetof(x300_eeprom_map, mac_addr0)+6))
- ).to_string();
+ byte_vector_t(bytes.begin() + offsetof(x300_eeprom_map, mac_addr0),
+ bytes.begin() + (offsetof(x300_eeprom_map, mac_addr0) + 6)))
+ .to_string();
mb_eeprom["mac-addr1"] = mac_addr_t::from_bytes(
- byte_vector_t(
- bytes.begin() + offsetof(x300_eeprom_map, mac_addr1),
- bytes.begin() + (offsetof(x300_eeprom_map, mac_addr1)+6))
- ).to_string();
+ byte_vector_t(bytes.begin() + offsetof(x300_eeprom_map, mac_addr1),
+ bytes.begin() + (offsetof(x300_eeprom_map, mac_addr1) + 6)))
+ .to_string();
- //extract the ip addresses
+ // extract the ip addresses
boost::asio::ip::address_v4::bytes_type ip_addr_bytes;
- byte_copy(
- byte_vector_t(
- bytes.begin() + offsetof(x300_eeprom_map, gateway),
- bytes.begin() + (offsetof(x300_eeprom_map, gateway)+4)),
- ip_addr_bytes
- );
+ byte_copy(byte_vector_t(bytes.begin() + offsetof(x300_eeprom_map, gateway),
+ bytes.begin() + (offsetof(x300_eeprom_map, gateway) + 4)),
+ ip_addr_bytes);
mb_eeprom["gateway"] = boost::asio::ip::address_v4(ip_addr_bytes).to_string();
- for (size_t i = 0; i < 4; i++)
- {
- const std::string n(1, char(i)+'0');
+ for (size_t i = 0; i < 4; i++) {
+ const std::string n(1, char(i) + '0');
byte_copy(
- byte_vector_t(
- bytes.begin() + (offsetof(x300_eeprom_map, ip_addr)+(i*4)),
- bytes.begin() + (offsetof(x300_eeprom_map, ip_addr)+(i*4)+4)),
- ip_addr_bytes
- );
- mb_eeprom["ip-addr"+n] = boost::asio::ip::address_v4(ip_addr_bytes).to_string();
+ byte_vector_t(bytes.begin() + (offsetof(x300_eeprom_map, ip_addr) + (i * 4)),
+ bytes.begin() + (offsetof(x300_eeprom_map, ip_addr) + (i * 4) + 4)),
+ ip_addr_bytes);
+ mb_eeprom["ip-addr" + n] = boost::asio::ip::address_v4(ip_addr_bytes).to_string();
byte_copy(
- byte_vector_t(
- bytes.begin() + (offsetof(x300_eeprom_map, subnet)+(i*4)),
- bytes.begin() + (offsetof(x300_eeprom_map, subnet)+(i*4)+4)),
- ip_addr_bytes
- );
- mb_eeprom["subnet"+n] = boost::asio::ip::address_v4(ip_addr_bytes).to_string();
+ byte_vector_t(bytes.begin() + (offsetof(x300_eeprom_map, subnet) + (i * 4)),
+ bytes.begin() + (offsetof(x300_eeprom_map, subnet) + (i * 4) + 4)),
+ ip_addr_bytes);
+ mb_eeprom["subnet" + n] = boost::asio::ip::address_v4(ip_addr_bytes).to_string();
}
- //extract the serial
- mb_eeprom["serial"] = bytes_to_string(
- byte_vector_t(
- bytes.begin() + offsetof(x300_eeprom_map, serial),
- bytes.begin() + (offsetof(x300_eeprom_map, serial)+SERIAL_LEN))
- );
+ // extract the serial
+ mb_eeprom["serial"] =
+ bytes_to_string(byte_vector_t(bytes.begin() + offsetof(x300_eeprom_map, serial),
+ bytes.begin() + (offsetof(x300_eeprom_map, serial) + SERIAL_LEN)));
- //extract the name
- mb_eeprom["name"] = bytes_to_string(
- byte_vector_t(
- bytes.begin() + offsetof(x300_eeprom_map, name),
- bytes.begin() + (offsetof(x300_eeprom_map, name)+NAME_MAX_LEN))
- );
+ // extract the name
+ mb_eeprom["name"] =
+ bytes_to_string(byte_vector_t(bytes.begin() + offsetof(x300_eeprom_map, name),
+ bytes.begin() + (offsetof(x300_eeprom_map, name) + NAME_MAX_LEN)));
return mb_eeprom;
}
-void x300_impl::set_mb_eeprom(
- i2c_iface::sptr iface,
- const mboard_eeprom_t &mb_eeprom
-) {
+void x300_impl::set_mb_eeprom(i2c_iface::sptr iface, const mboard_eeprom_t& mb_eeprom)
+{
const mboard_eeprom_t curr_eeprom = get_mb_eeprom(iface);
// Check for duplicate MAC and IP addresses
- const std::vector<std::string> mac_keys{
- "mac-addr0",
- "mac-addr1"
- };
+ const std::vector<std::string> mac_keys{"mac-addr0", "mac-addr1"};
const std::vector<std::string> ip_keys{
- "ip-addr0",
- "ip-addr1",
- "ip-addr2",
- "ip-addr3"
- };
+ "ip-addr0", "ip-addr1", "ip-addr2", "ip-addr3"};
- //make sure there are no duplicate values
+ // make sure there are no duplicate values
if (check_for_duplicates<uhd::mac_addr_t>(
- "X300", mb_eeprom, curr_eeprom,"MAC address", mac_keys) or
- check_for_duplicates<boost::asio::ip::address_v4>(
- "X300", mb_eeprom, curr_eeprom, "IP address", ip_keys))
- {
+ "X300", mb_eeprom, curr_eeprom, "MAC address", mac_keys)
+ or check_for_duplicates<boost::asio::ip::address_v4>(
+ "X300", mb_eeprom, curr_eeprom, "IP address", ip_keys)) {
throw uhd::value_error(
"Duplicate values not permitted - write to EEPROM aborted");
}
- //parse the revision number
- if (mb_eeprom.has_key("revision")) iface->write_eeprom(
- X300_EEPROM_ADDR, offsetof(x300_eeprom_map, revision),
- string_to_uint16_bytes(mb_eeprom["revision"])
- );
-
- //parse the revision compat number
- if (mb_eeprom.has_key("revision_compat")) iface->write_eeprom(
- X300_EEPROM_ADDR, offsetof(x300_eeprom_map, revision_compat),
- string_to_uint16_bytes(mb_eeprom["revision_compat"])
- );
-
- //parse the product code
- if (mb_eeprom.has_key("product")) iface->write_eeprom(
- X300_EEPROM_ADDR, offsetof(x300_eeprom_map, product),
- string_to_uint16_bytes(mb_eeprom["product"])
- );
-
- //store the mac addresses
- if (mb_eeprom.has_key("mac-addr0")) iface->write_eeprom(
- X300_EEPROM_ADDR, offsetof(x300_eeprom_map, mac_addr0),
- mac_addr_t::from_string(mb_eeprom["mac-addr0"]).to_bytes()
- );
- if (mb_eeprom.has_key("mac-addr1")) iface->write_eeprom(
- X300_EEPROM_ADDR, offsetof(x300_eeprom_map, mac_addr1),
- mac_addr_t::from_string(mb_eeprom["mac-addr1"]).to_bytes()
- );
-
- //store the ip addresses
+ // parse the revision number
+ if (mb_eeprom.has_key("revision"))
+ iface->write_eeprom(X300_EEPROM_ADDR,
+ offsetof(x300_eeprom_map, revision),
+ string_to_uint16_bytes(mb_eeprom["revision"]));
+
+ // parse the revision compat number
+ if (mb_eeprom.has_key("revision_compat"))
+ iface->write_eeprom(X300_EEPROM_ADDR,
+ offsetof(x300_eeprom_map, revision_compat),
+ string_to_uint16_bytes(mb_eeprom["revision_compat"]));
+
+ // parse the product code
+ if (mb_eeprom.has_key("product"))
+ iface->write_eeprom(X300_EEPROM_ADDR,
+ offsetof(x300_eeprom_map, product),
+ string_to_uint16_bytes(mb_eeprom["product"]));
+
+ // store the mac addresses
+ if (mb_eeprom.has_key("mac-addr0"))
+ iface->write_eeprom(X300_EEPROM_ADDR,
+ offsetof(x300_eeprom_map, mac_addr0),
+ mac_addr_t::from_string(mb_eeprom["mac-addr0"]).to_bytes());
+ if (mb_eeprom.has_key("mac-addr1"))
+ iface->write_eeprom(X300_EEPROM_ADDR,
+ offsetof(x300_eeprom_map, mac_addr1),
+ mac_addr_t::from_string(mb_eeprom["mac-addr1"]).to_bytes());
+
+ // store the ip addresses
byte_vector_t ip_addr_bytes(4);
- if (mb_eeprom.has_key("gateway")){
- byte_copy(boost::asio::ip::address_v4::from_string(mb_eeprom["gateway"]).to_bytes(), ip_addr_bytes);
- iface->write_eeprom(X300_EEPROM_ADDR, offsetof(x300_eeprom_map, gateway), ip_addr_bytes);
+ if (mb_eeprom.has_key("gateway")) {
+ byte_copy(
+ boost::asio::ip::address_v4::from_string(mb_eeprom["gateway"]).to_bytes(),
+ ip_addr_bytes);
+ iface->write_eeprom(
+ X300_EEPROM_ADDR, offsetof(x300_eeprom_map, gateway), ip_addr_bytes);
}
- for (size_t i = 0; i < 4; i++)
- {
- const std::string n(1, char(i)+'0');
- if (mb_eeprom.has_key("ip-addr"+n)){
- byte_copy(boost::asio::ip::address_v4::from_string(mb_eeprom["ip-addr"+n]).to_bytes(), ip_addr_bytes);
- iface->write_eeprom(X300_EEPROM_ADDR, offsetof(x300_eeprom_map, ip_addr)+(i*4), ip_addr_bytes);
+ for (size_t i = 0; i < 4; i++) {
+ const std::string n(1, char(i) + '0');
+ if (mb_eeprom.has_key("ip-addr" + n)) {
+ byte_copy(boost::asio::ip::address_v4::from_string(mb_eeprom["ip-addr" + n])
+ .to_bytes(),
+ ip_addr_bytes);
+ iface->write_eeprom(X300_EEPROM_ADDR,
+ offsetof(x300_eeprom_map, ip_addr) + (i * 4),
+ ip_addr_bytes);
}
- if (mb_eeprom.has_key("subnet"+n)){
- byte_copy(boost::asio::ip::address_v4::from_string(mb_eeprom["subnet"+n]).to_bytes(), ip_addr_bytes);
- iface->write_eeprom(X300_EEPROM_ADDR, offsetof(x300_eeprom_map, subnet)+(i*4), ip_addr_bytes);
+ if (mb_eeprom.has_key("subnet" + n)) {
+ byte_copy(boost::asio::ip::address_v4::from_string(mb_eeprom["subnet" + n])
+ .to_bytes(),
+ ip_addr_bytes);
+ iface->write_eeprom(X300_EEPROM_ADDR,
+ offsetof(x300_eeprom_map, subnet) + (i * 4),
+ ip_addr_bytes);
}
}
- //store the serial
- if (mb_eeprom.has_key("serial")) iface->write_eeprom(
- X300_EEPROM_ADDR, offsetof(x300_eeprom_map, serial),
- string_to_bytes(mb_eeprom["serial"], SERIAL_LEN)
- );
-
- //store the name
- if (mb_eeprom.has_key("name")) iface->write_eeprom(
- X300_EEPROM_ADDR, offsetof(x300_eeprom_map, name),
- string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN)
- );
+ // store the serial
+ if (mb_eeprom.has_key("serial"))
+ iface->write_eeprom(X300_EEPROM_ADDR,
+ offsetof(x300_eeprom_map, serial),
+ string_to_bytes(mb_eeprom["serial"], SERIAL_LEN));
+
+ // store the name
+ if (mb_eeprom.has_key("name"))
+ iface->write_eeprom(X300_EEPROM_ADDR,
+ offsetof(x300_eeprom_map, name),
+ string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN));
}
diff --git a/host/lib/usrp/x300/x300_mb_eeprom_iface.cpp b/host/lib/usrp/x300/x300_mb_eeprom_iface.cpp
index 630e8ce2b..12022ec24 100644
--- a/host/lib/usrp/x300/x300_mb_eeprom_iface.cpp
+++ b/host/lib/usrp/x300/x300_mb_eeprom_iface.cpp
@@ -19,12 +19,12 @@
#include "x300_mb_eeprom_iface.hpp"
#include "x300_fw_common.h"
-#include "x300_regs.hpp"
#include "x300_impl.hpp"
+#include "x300_regs.hpp"
#include <uhd/exception.hpp>
-#include <uhd/utils/platform.hpp>
-#include <uhd/utils/log.hpp>
#include <uhd/utils/byteswap.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/platform.hpp>
#include <boost/thread.hpp>
using namespace uhd;
@@ -34,7 +34,6 @@ static const uint32_t X300_FW_SHMEM_IDENT_MIN_VERSION = 0x50001;
class x300_mb_eeprom_iface_impl : public x300_mb_eeprom_iface
{
public:
-
x300_mb_eeprom_iface_impl(wb_iface::sptr wb, i2c_iface::sptr i2c) : _wb(wb), _i2c(i2c)
{
_compat_num = _wb->peek32(X300_FW_SHMEM_ADDR(X300_FW_SHMEM_COMPAT_NUM));
@@ -50,14 +49,10 @@ public:
* \param addr the address
* \param buf the vector of bytes
*/
- void write_i2c(
- uint16_t addr,
- const byte_vector_t &buf
- )
+ void write_i2c(uint16_t addr, const byte_vector_t& buf)
{
UHD_ASSERT_THROW(addr == MBOARD_EEPROM_ADDR);
- if (x300_impl::claim_status(_wb) != x300_impl::CLAIMED_BY_US)
- {
+ if (x300_impl::claim_status(_wb) != x300_impl::CLAIMED_BY_US) {
throw uhd::io_error("Attempted to write MB EEPROM without claim to device.");
}
_i2c->write_i2c(addr, buf);
@@ -69,24 +64,18 @@ public:
* \param num_bytes number of bytes to read
* \return a vector of bytes
*/
- byte_vector_t read_i2c(
- uint16_t addr,
- size_t num_bytes
- )
+ byte_vector_t read_i2c(uint16_t addr, size_t num_bytes)
{
UHD_ASSERT_THROW(addr == MBOARD_EEPROM_ADDR);
byte_vector_t bytes;
- if (_compat_num > X300_FW_SHMEM_IDENT_MIN_VERSION)
- {
+ if (_compat_num > X300_FW_SHMEM_IDENT_MIN_VERSION) {
bytes = read_eeprom(addr, 0, num_bytes);
} else {
x300_impl::claim_status_t status = x300_impl::claim_status(_wb);
// Claim device before driving the I2C bus
- if (status == x300_impl::CLAIMED_BY_US or x300_impl::try_to_claim(_wb))
- {
+ if (status == x300_impl::CLAIMED_BY_US or x300_impl::try_to_claim(_wb)) {
bytes = _i2c->read_i2c(addr, num_bytes);
- if (status != x300_impl::CLAIMED_BY_US)
- {
+ if (status != x300_impl::CLAIMED_BY_US) {
// We didn't originally have the claim, so give it up
x300_impl::release(_wb);
}
@@ -101,15 +90,10 @@ public:
* \param offset byte offset
* \param buf the vector of bytes
*/
- void write_eeprom(
- uint16_t addr,
- uint16_t offset,
- const byte_vector_t &buf
- )
+ void write_eeprom(uint16_t addr, uint16_t offset, const byte_vector_t& buf)
{
UHD_ASSERT_THROW(addr == MBOARD_EEPROM_ADDR);
- if (x300_impl::claim_status(_wb) != x300_impl::CLAIMED_BY_US)
- {
+ if (x300_impl::claim_status(_wb) != x300_impl::CLAIMED_BY_US) {
throw uhd::io_error("Attempted to write MB EEPROM without claim to device.");
}
_i2c->write_eeprom(addr, offset, buf);
@@ -122,37 +106,31 @@ public:
* \param num_bytes number of bytes to read
* \return a vector of bytes
*/
- byte_vector_t read_eeprom(
- uint16_t addr,
- uint16_t offset,
- size_t num_bytes
- )
+ byte_vector_t read_eeprom(uint16_t addr, uint16_t offset, size_t num_bytes)
{
UHD_ASSERT_THROW(addr == MBOARD_EEPROM_ADDR);
byte_vector_t bytes;
x300_impl::claim_status_t status = x300_impl::claim_status(_wb);
- if (_compat_num >= X300_FW_SHMEM_IDENT_MIN_VERSION)
- {
+ if (_compat_num >= X300_FW_SHMEM_IDENT_MIN_VERSION) {
// Get MB EEPROM data from firmware memory
- if (num_bytes == 0) return bytes;
+ if (num_bytes == 0)
+ return bytes;
size_t bytes_read = 0;
- for (size_t word = offset / 4; bytes_read < num_bytes; word++)
- {
- uint32_t value = byteswap(_wb->peek32(X300_FW_SHMEM_ADDR(X300_FW_SHMEM_IDENT + word)));
- for (size_t byte = offset % 4; byte < 4 and bytes_read < num_bytes; byte++)
- {
+ for (size_t word = offset / 4; bytes_read < num_bytes; word++) {
+ uint32_t value =
+ byteswap(_wb->peek32(X300_FW_SHMEM_ADDR(X300_FW_SHMEM_IDENT + word)));
+ for (size_t byte = offset % 4; byte < 4 and bytes_read < num_bytes;
+ byte++) {
bytes.push_back(uint8_t((value >> (byte * 8)) & 0xff));
bytes_read++;
}
}
} else {
// Claim device before driving the I2C bus
- if (status == x300_impl::CLAIMED_BY_US or x300_impl::try_to_claim(_wb))
- {
+ if (status == x300_impl::CLAIMED_BY_US or x300_impl::try_to_claim(_wb)) {
bytes = _i2c->read_eeprom(addr, offset, num_bytes);
- if (status != x300_impl::CLAIMED_BY_US)
- {
+ if (status != x300_impl::CLAIMED_BY_US) {
// We didn't originally have the claim, so give it up
x300_impl::release(_wb);
}
@@ -173,8 +151,8 @@ x300_mb_eeprom_iface::~x300_mb_eeprom_iface(void)
/* NOP */
}
-x300_mb_eeprom_iface::sptr x300_mb_eeprom_iface::make(wb_iface::sptr wb, i2c_iface::sptr i2c)
+x300_mb_eeprom_iface::sptr x300_mb_eeprom_iface::make(
+ wb_iface::sptr wb, i2c_iface::sptr i2c)
{
return boost::make_shared<x300_mb_eeprom_iface_impl>(wb, i2c->eeprom16());
}
-
diff --git a/host/lib/usrp/x300/x300_mb_eeprom_iface.hpp b/host/lib/usrp/x300/x300_mb_eeprom_iface.hpp
index dfc1eea6d..d323d6359 100644
--- a/host/lib/usrp/x300/x300_mb_eeprom_iface.hpp
+++ b/host/lib/usrp/x300/x300_mb_eeprom_iface.hpp
@@ -10,9 +10,9 @@
#include <uhd/config.hpp>
#include <uhd/types/serial.hpp>
-#include <boost/utility.hpp>
-#include <boost/shared_ptr.hpp>
#include <uhd/types/wb_iface.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
class x300_mb_eeprom_iface : public uhd::i2c_iface
{
diff --git a/host/lib/usrp/x300/x300_radio_ctrl_impl.cpp b/host/lib/usrp/x300/x300_radio_ctrl_impl.cpp
index d0aadc55a..9057180e4 100644
--- a/host/lib/usrp/x300/x300_radio_ctrl_impl.cpp
+++ b/host/lib/usrp/x300/x300_radio_ctrl_impl.cpp
@@ -6,19 +6,19 @@
#include "x300_radio_ctrl_impl.hpp"
#include "x300_dboard_iface.hpp"
-#include <uhd/usrp/dboard_eeprom.hpp>
-#include <uhd/utils/log.hpp>
-#include <uhd/usrp/dboard_iface.hpp>
#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/transport/chdr.hpp>
+#include <uhd/usrp/dboard_eeprom.hpp>
+#include <uhd/usrp/dboard_iface.hpp>
+#include <uhd/utils/log.hpp>
#include <uhd/utils/math.hpp>
#include <uhd/utils/safe_call.hpp>
#include <uhdlib/rfnoc/wb_iface_adapter.hpp>
-#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
#include <uhdlib/usrp/common/apply_corrections.hpp>
+#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
#include <boost/algorithm/string.hpp>
-#include <boost/make_shared.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>
+#include <boost/make_shared.hpp>
#include <chrono>
#include <thread>
@@ -33,26 +33,26 @@ static const size_t IO_MASTER_RADIO = 0;
* Structors
***************************************************************************/
UHD_RFNOC_RADIO_BLOCK_CONSTRUCTOR(x300_radio_ctrl)
- , _ignore_cal_file(false)
+, _ignore_cal_file(false)
{
- UHD_RFNOC_BLOCK_TRACE() << "x300_radio_ctrl_impl::ctor() " ;
+ UHD_RFNOC_BLOCK_TRACE() << "x300_radio_ctrl_impl::ctor() ";
////////////////////////////////////////////////////////////////////
// Set up basic info
////////////////////////////////////////////////////////////////////
- _radio_type = (get_block_id().get_block_count() == 0) ? PRIMARY : SECONDARY;
- _radio_slot = (get_block_id().get_block_count() == 0) ? "A" : "B";
+ _radio_type = (get_block_id().get_block_count() == 0) ? PRIMARY : SECONDARY;
+ _radio_slot = (get_block_id().get_block_count() == 0) ? "A" : "B";
_radio_clk_rate = _tree->access<double>("master_clock_rate").get();
////////////////////////////////////////////////////////////////////
// Set up peripherals
////////////////////////////////////////////////////////////////////
wb_iface::sptr ctrl = _get_ctrl(IO_MASTER_RADIO);
- _regs = boost::make_shared<radio_regmap_t>(_radio_type==PRIMARY?0:1);
+ _regs = boost::make_shared<radio_regmap_t>(_radio_type == PRIMARY ? 0 : 1);
_regs->initialize(*ctrl, true);
- //Only Radio0 has the ADC/DAC reset bits. Those bits are reserved for Radio1
- if (_radio_type==PRIMARY) {
+ // Only Radio0 has the ADC/DAC reset bits. Those bits are reserved for Radio1
+ if (_radio_type == PRIMARY) {
_regs->misc_outs_reg.set(radio_regmap_t::misc_outs_reg_t::ADC_RESET, 1);
_regs->misc_outs_reg.set(radio_regmap_t::misc_outs_reg_t::DAC_RESET_N, 0);
_regs->misc_outs_reg.flush();
@@ -67,84 +67,100 @@ UHD_RFNOC_RADIO_BLOCK_CONSTRUCTOR(x300_radio_ctrl)
////////////////////////////////////////////////////////////////
_spi = spi_core_3000::make(ctrl,
regs::sr_addr(radio_ctrl_impl::regs::SPI),
- regs::rb_addr(radio_ctrl_impl::regs::RB_SPI)
- );
+ regs::rb_addr(radio_ctrl_impl::regs::RB_SPI));
_adc = x300_adc_ctrl::make(_spi, DB_ADC_SEN);
_dac = x300_dac_ctrl::make(_spi, DB_DAC_SEN, _radio_clk_rate);
- if (_radio_type==PRIMARY) {
- _fp_gpio = gpio_atr::gpio_atr_3000::make(ctrl,
- regs::sr_addr(regs::FP_GPIO),
- regs::rb_addr(regs::RB_FP_GPIO)
- );
- for(const gpio_atr::gpio_attr_map_t::value_type attr: gpio_atr::gpio_attr_map) {
- switch (attr.first){
+ if (_radio_type == PRIMARY) {
+ _fp_gpio = gpio_atr::gpio_atr_3000::make(
+ ctrl, regs::sr_addr(regs::FP_GPIO), regs::rb_addr(regs::RB_FP_GPIO));
+ for (const gpio_atr::gpio_attr_map_t::value_type attr : gpio_atr::gpio_attr_map) {
+ switch (attr.first) {
case usrp::gpio_atr::GPIO_SRC:
- _tree->create<std::vector<std::string>>(fs_path("gpio") / "FP0" / attr.second)
- .set(std::vector<std::string>(32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this](const std::vector<std::string>&){
- throw uhd::runtime_error("This device does not support setting the GPIO_SRC attribute.");
- });
+ _tree
+ ->create<std::vector<std::string>>(
+ fs_path("gpio") / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber([this](const std::vector<std::string>&) {
+ throw uhd::runtime_error("This device does not support "
+ "setting the GPIO_SRC attribute.");
+ });
break;
case usrp::gpio_atr::GPIO_CTRL:
case usrp::gpio_atr::GPIO_DDR:
- _tree->create<std::vector<std::string>>(fs_path("gpio") / "FP0" / attr.second)
- .set(std::vector<std::string>(32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this, attr](const std::vector<std::string> str_val){
- uint32_t val = 0;
- for(size_t i = 0 ; i < str_val.size() ; i++){
- val += usrp::gpio_atr::gpio_attr_value_pair.at(attr.second).at(str_val[i])<<i;
- }
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ _tree
+ ->create<std::vector<std::string>>(
+ fs_path("gpio") / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber(
+ [this, attr](const std::vector<std::string> str_val) {
+ uint32_t val = 0;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ val += usrp::gpio_atr::gpio_attr_value_pair
+ .at(attr.second)
+ .at(str_val[i])
+ << i;
+ }
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
break;
case usrp::gpio_atr::GPIO_READBACK:
_tree->create<uint32_t>(fs_path("gpio") / "FP0" / "READBACK")
- .set_publisher([this](){
- return _fp_gpio->read_gpio();
- });
+ .set_publisher([this]() { return _fp_gpio->read_gpio(); });
break;
default:
_tree->create<uint32_t>(fs_path("gpio") / "FP0" / attr.second)
- .set(0)
- .add_coerced_subscriber([this, attr](const uint32_t val){
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ .set(0)
+ .add_coerced_subscriber([this, attr](const uint32_t val) {
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
}
-
}
}
////////////////////////////////////////////////////////////////
// create legacy codec control objects
////////////////////////////////////////////////////////////////
- _tree->create<int>("rx_codecs" / _radio_slot / "gains"); //phony property so this dir exists
- _tree->create<int>("tx_codecs" / _radio_slot / "gains"); //phony property so this dir exists
+ _tree->create<int>(
+ "rx_codecs" / _radio_slot / "gains"); // phony property so this dir exists
+ _tree->create<int>(
+ "tx_codecs" / _radio_slot / "gains"); // phony property so this dir exists
_tree->create<std::string>("rx_codecs" / _radio_slot / "name").set("ads62p48");
_tree->create<std::string>("tx_codecs" / _radio_slot / "name").set("ad9146");
- _tree->create<meta_range_t>("rx_codecs" / _radio_slot / "gains" / "digital" / "range").set(meta_range_t(0, 6.0, 0.5));
+ _tree->create<meta_range_t>("rx_codecs" / _radio_slot / "gains" / "digital" / "range")
+ .set(meta_range_t(0, 6.0, 0.5));
_tree->create<double>("rx_codecs" / _radio_slot / "gains" / "digital" / "value")
- .add_coerced_subscriber(boost::bind(&x300_adc_ctrl::set_gain, _adc, _1)).set(0)
- ;
+ .add_coerced_subscriber(boost::bind(&x300_adc_ctrl::set_gain, _adc, _1))
+ .set(0);
////////////////////////////////////////////////////////////////
// create front-end objects
////////////////////////////////////////////////////////////////
for (size_t i = 0; i < _get_num_radios(); i++) {
- _leds[i] = gpio_atr::gpio_atr_3000::make_write_only(_get_ctrl(i), regs::sr_addr(regs::LEDS));
- _leds[i]->set_atr_mode(usrp::gpio_atr::MODE_ATR, usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
+ _leds[i] = gpio_atr::gpio_atr_3000::make_write_only(
+ _get_ctrl(i), regs::sr_addr(regs::LEDS));
+ _leds[i]->set_atr_mode(
+ usrp::gpio_atr::MODE_ATR, usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
- _rx_fe_map[i].core = rx_frontend_core_3000::make(_get_ctrl(i), regs::sr_addr(x300_regs::RX_FE_BASE));
+ _rx_fe_map[i].core = rx_frontend_core_3000::make(
+ _get_ctrl(i), regs::sr_addr(x300_regs::RX_FE_BASE));
_rx_fe_map[i].core->set_adc_rate(_radio_clk_rate);
_rx_fe_map[i].core->set_dc_offset(rx_frontend_core_3000::DEFAULT_DC_OFFSET_VALUE);
- _rx_fe_map[i].core->set_dc_offset_auto(rx_frontend_core_3000::DEFAULT_DC_OFFSET_ENABLE);
- _rx_fe_map[i].core->populate_subtree(_tree->subtree(_root_path / "rx_fe_corrections" / i));
+ _rx_fe_map[i].core->set_dc_offset_auto(
+ rx_frontend_core_3000::DEFAULT_DC_OFFSET_ENABLE);
+ _rx_fe_map[i].core->populate_subtree(
+ _tree->subtree(_root_path / "rx_fe_corrections" / i));
- _tx_fe_map[i].core = tx_frontend_core_200::make(_get_ctrl(i), regs::sr_addr(x300_regs::TX_FE_BASE));
+ _tx_fe_map[i].core = tx_frontend_core_200::make(
+ _get_ctrl(i), regs::sr_addr(x300_regs::TX_FE_BASE));
_tx_fe_map[i].core->set_dc_offset(tx_frontend_core_200::DEFAULT_DC_OFFSET_VALUE);
- _tx_fe_map[i].core->set_iq_balance(tx_frontend_core_200::DEFAULT_IQ_BALANCE_VALUE);
- _tx_fe_map[i].core->populate_subtree(_tree->subtree(_root_path / "tx_fe_corrections" / i));
+ _tx_fe_map[i].core->set_iq_balance(
+ tx_frontend_core_200::DEFAULT_IQ_BALANCE_VALUE);
+ _tx_fe_map[i].core->populate_subtree(
+ _tree->subtree(_root_path / "tx_fe_corrections" / i));
////////////////////////////////////////////////////////////////
// Bind the daughterboard command time to the motherboard level property
@@ -152,16 +168,19 @@ UHD_RFNOC_RADIO_BLOCK_CONSTRUCTOR(x300_radio_ctrl)
if (_tree->exists(fs_path("time") / "cmd")) {
_tree->access<time_spec_t>(fs_path("time") / "cmd")
- .add_coerced_subscriber(boost::bind(&x300_radio_ctrl_impl::set_fe_cmd_time, this, _1, i));
+ .add_coerced_subscriber(
+ boost::bind(&x300_radio_ctrl_impl::set_fe_cmd_time, this, _1, i));
}
}
////////////////////////////////////////////////////////////////
// Update default SPP (overwrites the default value from the XML file)
////////////////////////////////////////////////////////////////
- const size_t max_bytes_header = uhd::transport::vrt::chdr::max_if_hdr_words64 * sizeof(uint64_t);
- const size_t default_spp = (_tree->access<size_t>("mtu/recv").get() - max_bytes_header)
- / (2 * sizeof(int16_t));
+ const size_t max_bytes_header =
+ uhd::transport::vrt::chdr::max_if_hdr_words64 * sizeof(uint64_t);
+ const size_t default_spp =
+ (_tree->access<size_t>("mtu/recv").get() - max_bytes_header)
+ / (2 * sizeof(int16_t));
_tree->access<int>(get_arg_path("spp") / "value").set(default_spp);
}
@@ -173,21 +192,19 @@ x300_radio_ctrl_impl::~x300_radio_ctrl_impl()
_tree->remove(fs_path("tx_codecs" / _radio_slot));
_tree->remove(_root_path / "rx_fe_corrections");
_tree->remove(_root_path / "tx_fe_corrections");
- if (_radio_type==PRIMARY) {
- for(const gpio_atr::gpio_attr_map_t::value_type attr: gpio_atr::gpio_attr_map) {
+ if (_radio_type == PRIMARY) {
+ for (const gpio_atr::gpio_attr_map_t::value_type attr :
+ gpio_atr::gpio_attr_map) {
_tree->remove(fs_path("gpio") / "FP0" / attr.second);
}
}
// Reset peripherals
- if (_radio_type==PRIMARY) {
+ if (_radio_type == PRIMARY) {
_regs->misc_outs_reg.set(radio_regmap_t::misc_outs_reg_t::ADC_RESET, 1);
_regs->misc_outs_reg.set(radio_regmap_t::misc_outs_reg_t::DAC_RESET_N, 0);
- }
- _regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::DAC_ENABLED, 0);
- _regs->misc_outs_reg.flush();
- )
-
+ } _regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::DAC_ENABLED, 0);
+ _regs->misc_outs_reg.flush();)
}
/****************************************************************************
@@ -197,102 +214,129 @@ double x300_radio_ctrl_impl::set_rate(double rate)
{
const double actual_rate = get_rate();
if (not uhd::math::frequencies_are_equal(rate, actual_rate)) {
- UHD_LOGGER_WARNING("X300 RADIO") << "Requesting invalid sampling rate from device: " << rate/1e6 << " MHz. Actual rate is: " << actual_rate/1e6 << " MHz." ;
+ UHD_LOGGER_WARNING("X300 RADIO")
+ << "Requesting invalid sampling rate from device: " << rate / 1e6
+ << " MHz. Actual rate is: " << actual_rate / 1e6 << " MHz.";
}
// On X3x0, tick rate can't actually be changed at runtime
return actual_rate;
}
-void x300_radio_ctrl_impl::set_fe_cmd_time(const time_spec_t &time, const size_t chan)
+void x300_radio_ctrl_impl::set_fe_cmd_time(const time_spec_t& time, const size_t chan)
{
- if (_tree->exists(fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name / "time" / "cmd"))) {
- _tree->access<time_spec_t>(
- fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name / "time" / "cmd")
- ).set(time);
+ if (_tree->exists(fs_path("dboards" / _radio_slot / "rx_frontends"
+ / _rx_fe_map.at(chan).db_fe_name / "time" / "cmd"))) {
+ _tree
+ ->access<time_spec_t>(
+ fs_path("dboards" / _radio_slot / "rx_frontends"
+ / _rx_fe_map.at(chan).db_fe_name / "time" / "cmd"))
+ .set(time);
}
}
-void x300_radio_ctrl_impl::set_tx_antenna(const std::string &ant, const size_t chan)
+void x300_radio_ctrl_impl::set_tx_antenna(const std::string& ant, const size_t chan)
{
- _tree->access<std::string>(
- fs_path("dboards" / _radio_slot / "tx_frontends" / _tx_fe_map.at(chan).db_fe_name / "antenna" / "value")
- ).set(ant);
+ _tree
+ ->access<std::string>(
+ fs_path("dboards" / _radio_slot / "tx_frontends"
+ / _tx_fe_map.at(chan).db_fe_name / "antenna" / "value"))
+ .set(ant);
}
std::string x300_radio_ctrl_impl::get_tx_antenna(const size_t chan)
{
- return _tree->access<std::string>(
- fs_path("dboards" / _radio_slot / "tx_frontends" / _tx_fe_map.at(chan).db_fe_name / "antenna" / "value")
- ).get();
+ return _tree
+ ->access<std::string>(
+ fs_path("dboards" / _radio_slot / "tx_frontends"
+ / _tx_fe_map.at(chan).db_fe_name / "antenna" / "value"))
+ .get();
}
-void x300_radio_ctrl_impl::set_rx_antenna(const std::string &ant, const size_t chan)
+void x300_radio_ctrl_impl::set_rx_antenna(const std::string& ant, const size_t chan)
{
- _tree->access<std::string>(
- fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name / "antenna" / "value")
- ).set(ant);
+ _tree
+ ->access<std::string>(
+ fs_path("dboards" / _radio_slot / "rx_frontends"
+ / _rx_fe_map.at(chan).db_fe_name / "antenna" / "value"))
+ .set(ant);
}
std::string x300_radio_ctrl_impl::get_rx_antenna(const size_t chan)
{
- return _tree->access<std::string>(
- fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name / "antenna" / "value")
- ).get();
+ return _tree
+ ->access<std::string>(
+ fs_path("dboards" / _radio_slot / "rx_frontends"
+ / _rx_fe_map.at(chan).db_fe_name / "antenna" / "value"))
+ .get();
}
double x300_radio_ctrl_impl::set_tx_frequency(const double freq, const size_t chan)
{
- return _tree->access<double>(
- fs_path("dboards" / _radio_slot / "tx_frontends" / _tx_fe_map.at(chan).db_fe_name / "freq" / "value")
- ).set(freq).get();
+ return _tree
+ ->access<double>(fs_path("dboards" / _radio_slot / "tx_frontends"
+ / _tx_fe_map.at(chan).db_fe_name / "freq" / "value"))
+ .set(freq)
+ .get();
}
double x300_radio_ctrl_impl::get_tx_frequency(const size_t chan)
{
- return _tree->access<double>(
- fs_path("dboards" / _radio_slot / "tx_frontends" / _tx_fe_map.at(chan).db_fe_name / "freq" / "value")
- ).get();
+ return _tree
+ ->access<double>(fs_path("dboards" / _radio_slot / "tx_frontends"
+ / _tx_fe_map.at(chan).db_fe_name / "freq" / "value"))
+ .get();
}
double x300_radio_ctrl_impl::set_rx_frequency(const double freq, const size_t chan)
{
- return _tree->access<double>(
- fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name / "freq" / "value")
- ).set(freq).get();
+ return _tree
+ ->access<double>(fs_path("dboards" / _radio_slot / "rx_frontends"
+ / _rx_fe_map.at(chan).db_fe_name / "freq" / "value"))
+ .set(freq)
+ .get();
}
double x300_radio_ctrl_impl::get_rx_frequency(const size_t chan)
{
- return _tree->access<double>(
- fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name / "freq" / "value")
- ).get();
+ return _tree
+ ->access<double>(fs_path("dboards" / _radio_slot / "rx_frontends"
+ / _rx_fe_map.at(chan).db_fe_name / "freq" / "value"))
+ .get();
}
double x300_radio_ctrl_impl::set_rx_bandwidth(const double bandwidth, const size_t chan)
{
- return _tree->access<double>(
- fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name / "bandwidth" / "value")
- ).set(bandwidth).get();
+ return _tree
+ ->access<double>(
+ fs_path("dboards" / _radio_slot / "rx_frontends"
+ / _rx_fe_map.at(chan).db_fe_name / "bandwidth" / "value"))
+ .set(bandwidth)
+ .get();
}
double x300_radio_ctrl_impl::get_rx_bandwidth(const size_t chan)
{
- return _tree->access<double>(
- fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name / "bandwidth" / "value")
- ).get();
+ return _tree
+ ->access<double>(
+ fs_path("dboards" / _radio_slot / "rx_frontends"
+ / _rx_fe_map.at(chan).db_fe_name / "bandwidth" / "value"))
+ .get();
}
double x300_radio_ctrl_impl::set_tx_gain(const double gain, const size_t chan)
{
- //TODO: This is extremely hacky!
- fs_path path("dboards" / _radio_slot / "tx_frontends" / _tx_fe_map.at(chan).db_fe_name / "gains");
+ // TODO: This is extremely hacky!
+ fs_path path("dboards" / _radio_slot / "tx_frontends" / _tx_fe_map.at(chan).db_fe_name
+ / "gains");
std::vector<std::string> gain_stages = _tree->list(path);
if (gain_stages.size() == 1) {
- const double actual_gain = _tree->access<double>(path / gain_stages[0] / "value").set(gain).get();
+ const double actual_gain =
+ _tree->access<double>(path / gain_stages[0] / "value").set(gain).get();
radio_ctrl_impl::set_tx_gain(actual_gain, chan);
return gain;
} else {
- UHD_LOGGER_WARNING("X300 RADIO") << "set_tx_gain: could not apply gain for this daughterboard.";
+ UHD_LOGGER_WARNING("X300 RADIO")
+ << "set_tx_gain: could not apply gain for this daughterboard.";
radio_ctrl_impl::set_tx_gain(0.0, chan);
return 0.0;
}
@@ -300,15 +344,18 @@ double x300_radio_ctrl_impl::set_tx_gain(const double gain, const size_t chan)
double x300_radio_ctrl_impl::set_rx_gain(const double gain, const size_t chan)
{
- //TODO: This is extremely hacky!
- fs_path path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name / "gains");
+ // TODO: This is extremely hacky!
+ fs_path path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name
+ / "gains");
std::vector<std::string> gain_stages = _tree->list(path);
if (gain_stages.size() == 1) {
- const double actual_gain = _tree->access<double>(path / gain_stages[0] / "value").set(gain).get();
+ const double actual_gain =
+ _tree->access<double>(path / gain_stages[0] / "value").set(gain).get();
radio_ctrl_impl::set_rx_gain(actual_gain, chan);
return gain;
} else {
- UHD_LOGGER_WARNING("X300 RADIO") << "set_rx_gain: could not apply gain for this daughterboard.";
+ UHD_LOGGER_WARNING("X300 RADIO")
+ << "set_rx_gain: could not apply gain for this daughterboard.";
radio_ctrl_impl::set_tx_gain(0.0, chan);
return 0.0;
}
@@ -317,79 +364,105 @@ double x300_radio_ctrl_impl::set_rx_gain(const double gain, const size_t chan)
std::vector<std::string> x300_radio_ctrl_impl::get_rx_lo_names(const size_t chan)
{
- fs_path rx_fe_fe_root = fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
+ fs_path rx_fe_fe_root = fs_path(
+ "dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
std::vector<std::string> lo_names;
if (_tree->exists(rx_fe_fe_root / "los")) {
- for(const std::string &name: _tree->list(rx_fe_fe_root / "los")) {
+ for (const std::string& name : _tree->list(rx_fe_fe_root / "los")) {
lo_names.push_back(name);
}
}
return lo_names;
}
-std::vector<std::string> x300_radio_ctrl_impl::get_rx_lo_sources(const std::string &name, const size_t chan)
+std::vector<std::string> x300_radio_ctrl_impl::get_rx_lo_sources(
+ const std::string& name, const size_t chan)
{
- fs_path rx_fe_fe_root = fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
+ fs_path rx_fe_fe_root = fs_path(
+ "dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
if (_tree->exists(rx_fe_fe_root / "los")) {
if (name == ALL_LOS) {
if (_tree->exists(rx_fe_fe_root / "los" / ALL_LOS)) {
- //Special value ALL_LOS support atomically sets the source for all LOs
- return _tree->access< std::vector<std::string> >(rx_fe_fe_root / "los" / ALL_LOS / "source" / "options").get();
+ // Special value ALL_LOS support atomically sets the source for all LOs
+ return _tree
+ ->access<std::vector<std::string>>(
+ rx_fe_fe_root / "los" / ALL_LOS / "source" / "options")
+ .get();
} else {
return std::vector<std::string>();
}
} else {
if (_tree->exists(rx_fe_fe_root / "los")) {
- return _tree->access< std::vector<std::string> >(rx_fe_fe_root / "los" / name / "source" / "options").get();
+ return _tree
+ ->access<std::vector<std::string>>(
+ rx_fe_fe_root / "los" / name / "source" / "options")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
}
} else {
// If the daughterboard doesn't expose it's LO(s) then it can only be internal
- return std::vector<std::string> (1, "internal");
+ return std::vector<std::string>(1, "internal");
}
}
-void x300_radio_ctrl_impl::set_rx_lo_source(const std::string &src, const std::string &name, const size_t chan)
+void x300_radio_ctrl_impl::set_rx_lo_source(
+ const std::string& src, const std::string& name, const size_t chan)
{
- fs_path rx_fe_fe_root = fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
+ fs_path rx_fe_fe_root = fs_path(
+ "dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
if (_tree->exists(rx_fe_fe_root / "los")) {
if (name == ALL_LOS) {
if (_tree->exists(rx_fe_fe_root / "los" / ALL_LOS)) {
- //Special value ALL_LOS support atomically sets the source for all LOs
- _tree->access<std::string>(rx_fe_fe_root / "los" / ALL_LOS / "source" / "value").set(src);
+ // Special value ALL_LOS support atomically sets the source for all LOs
+ _tree
+ ->access<std::string>(
+ rx_fe_fe_root / "los" / ALL_LOS / "source" / "value")
+ .set(src);
} else {
- for(const std::string &n: _tree->list(rx_fe_fe_root / "los")) {
+ for (const std::string& n : _tree->list(rx_fe_fe_root / "los")) {
this->set_rx_lo_source(src, n, chan);
}
}
} else {
if (_tree->exists(rx_fe_fe_root / "los")) {
- _tree->access<std::string>(rx_fe_fe_root / "los" / name / "source" / "value").set(src);
+ _tree
+ ->access<std::string>(
+ rx_fe_fe_root / "los" / name / "source" / "value")
+ .set(src);
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
}
} else {
- throw uhd::runtime_error("This device does not support manual configuration of LOs");
+ throw uhd::runtime_error(
+ "This device does not support manual configuration of LOs");
}
}
-const std::string x300_radio_ctrl_impl::get_rx_lo_source(const std::string &name, const size_t chan)
+const std::string x300_radio_ctrl_impl::get_rx_lo_source(
+ const std::string& name, const size_t chan)
{
- fs_path rx_fe_fe_root = fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
+ fs_path rx_fe_fe_root = fs_path(
+ "dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
if (_tree->exists(rx_fe_fe_root / "los")) {
if (name == ALL_LOS) {
- //Special value ALL_LOS support atomically sets the source for all LOs
- return _tree->access<std::string>(rx_fe_fe_root / "los" / ALL_LOS / "source" / "value").get();
+ // Special value ALL_LOS support atomically sets the source for all LOs
+ return _tree
+ ->access<std::string>(
+ rx_fe_fe_root / "los" / ALL_LOS / "source" / "value")
+ .get();
} else {
if (_tree->exists(rx_fe_fe_root / "los")) {
- return _tree->access<std::string>(rx_fe_fe_root / "los" / name / "source" / "value").get();
+ return _tree
+ ->access<std::string>(
+ rx_fe_fe_root / "los" / name / "source" / "value")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -400,17 +473,20 @@ const std::string x300_radio_ctrl_impl::get_rx_lo_source(const std::string &name
}
}
-void x300_radio_ctrl_impl::set_rx_lo_export_enabled(bool enabled, const std::string &name, const size_t chan)
+void x300_radio_ctrl_impl::set_rx_lo_export_enabled(
+ bool enabled, const std::string& name, const size_t chan)
{
- fs_path rx_fe_fe_root = fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
+ fs_path rx_fe_fe_root = fs_path(
+ "dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
if (_tree->exists(rx_fe_fe_root / "los")) {
if (name == ALL_LOS) {
if (_tree->exists(rx_fe_fe_root / "los" / ALL_LOS)) {
- //Special value ALL_LOS support atomically sets the source for all LOs
- _tree->access<bool>(rx_fe_fe_root / "los" / ALL_LOS / "export").set(enabled);
+ // Special value ALL_LOS support atomically sets the source for all LOs
+ _tree->access<bool>(rx_fe_fe_root / "los" / ALL_LOS / "export")
+ .set(enabled);
} else {
- for(const std::string &n: _tree->list(rx_fe_fe_root / "los")) {
+ for (const std::string& n : _tree->list(rx_fe_fe_root / "los")) {
this->set_rx_lo_export_enabled(enabled, n, chan);
}
}
@@ -422,17 +498,20 @@ void x300_radio_ctrl_impl::set_rx_lo_export_enabled(bool enabled, const std::str
}
}
} else {
- throw uhd::runtime_error("This device does not support manual configuration of LOs");
+ throw uhd::runtime_error(
+ "This device does not support manual configuration of LOs");
}
}
-bool x300_radio_ctrl_impl::get_rx_lo_export_enabled(const std::string &name, const size_t chan)
+bool x300_radio_ctrl_impl::get_rx_lo_export_enabled(
+ const std::string& name, const size_t chan)
{
- fs_path rx_fe_fe_root = fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
+ fs_path rx_fe_fe_root = fs_path(
+ "dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
if (_tree->exists(rx_fe_fe_root / "los")) {
if (name == ALL_LOS) {
- //Special value ALL_LOS support atomically sets the source for all LOs
+ // Special value ALL_LOS support atomically sets the source for all LOs
return _tree->access<bool>(rx_fe_fe_root / "los" / ALL_LOS / "export").get();
} else {
if (_tree->exists(rx_fe_fe_root / "los")) {
@@ -447,56 +526,73 @@ bool x300_radio_ctrl_impl::get_rx_lo_export_enabled(const std::string &name, con
}
}
-double x300_radio_ctrl_impl::set_rx_lo_freq(double freq, const std::string &name, const size_t chan)
+double x300_radio_ctrl_impl::set_rx_lo_freq(
+ double freq, const std::string& name, const size_t chan)
{
- fs_path rx_fe_fe_root = fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
+ fs_path rx_fe_fe_root = fs_path(
+ "dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
if (_tree->exists(rx_fe_fe_root / "los")) {
if (name == ALL_LOS) {
- throw uhd::runtime_error("LO frequency must be set for each stage individually");
+ throw uhd::runtime_error(
+ "LO frequency must be set for each stage individually");
} else {
if (_tree->exists(rx_fe_fe_root / "los")) {
- _tree->access<double>(rx_fe_fe_root / "los" / name / "freq" / "value").set(freq);
- return _tree->access<double>(rx_fe_fe_root / "los" / name / "freq" / "value").get();
+ _tree->access<double>(rx_fe_fe_root / "los" / name / "freq" / "value")
+ .set(freq);
+ return _tree
+ ->access<double>(rx_fe_fe_root / "los" / name / "freq" / "value")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
}
} else {
- throw uhd::runtime_error("This device does not support manual configuration of LOs");
+ throw uhd::runtime_error(
+ "This device does not support manual configuration of LOs");
}
}
-double x300_radio_ctrl_impl::get_rx_lo_freq(const std::string &name, const size_t chan)
+double x300_radio_ctrl_impl::get_rx_lo_freq(const std::string& name, const size_t chan)
{
- fs_path rx_fe_fe_root = fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
+ fs_path rx_fe_fe_root = fs_path(
+ "dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
if (_tree->exists(rx_fe_fe_root / "los")) {
if (name == ALL_LOS) {
- throw uhd::runtime_error("LO frequency must be retrieved for each stage individually");
+ throw uhd::runtime_error(
+ "LO frequency must be retrieved for each stage individually");
} else {
if (_tree->exists(rx_fe_fe_root / "los")) {
- return _tree->access<double>(rx_fe_fe_root / "los" / name / "freq" / "value").get();
+ return _tree
+ ->access<double>(rx_fe_fe_root / "los" / name / "freq" / "value")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
}
} else {
// Return actual RF frequency if the daughterboard doesn't expose it's LO(s)
- return _tree->access<double>(rx_fe_fe_root / "freq" /" value").get();
+ return _tree->access<double>(rx_fe_fe_root / "freq" / " value").get();
}
}
-freq_range_t x300_radio_ctrl_impl::get_rx_lo_freq_range(const std::string &name, const size_t chan)
+freq_range_t x300_radio_ctrl_impl::get_rx_lo_freq_range(
+ const std::string& name, const size_t chan)
{
- fs_path rx_fe_fe_root = fs_path("dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
+ fs_path rx_fe_fe_root = fs_path(
+ "dboards" / _radio_slot / "rx_frontends" / _rx_fe_map.at(chan).db_fe_name);
if (_tree->exists(rx_fe_fe_root / "los")) {
if (name == ALL_LOS) {
- throw uhd::runtime_error("LO frequency range must be retrieved for each stage individually");
+ throw uhd::runtime_error(
+ "LO frequency range must be retrieved for each stage individually");
} else {
if (_tree->exists(rx_fe_fe_root / "los")) {
- return _tree->access<freq_range_t>(rx_fe_fe_root / "los" / name / "freq" / "range").get();
+ return _tree
+ ->access<freq_range_t>(
+ rx_fe_fe_root / "los" / name / "freq" / "range")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -508,21 +604,19 @@ freq_range_t x300_radio_ctrl_impl::get_rx_lo_freq_range(const std::string &name,
}
template <typename map_type>
-static size_t _get_chan_from_map(std::map<size_t, map_type> map, const std::string &fe)
+static size_t _get_chan_from_map(std::map<size_t, map_type> map, const std::string& fe)
{
for (auto it = map.begin(); it != map.end(); ++it) {
if (it->second.db_fe_name == fe) {
return it->first;
}
-
}
- throw uhd::runtime_error(str(
- boost::format("Invalid daughterboard frontend name: %s")
- % fe
- ));
+ throw uhd::runtime_error(
+ str(boost::format("Invalid daughterboard frontend name: %s") % fe));
}
-size_t x300_radio_ctrl_impl::get_chan_from_dboard_fe(const std::string &fe, const uhd::direction_t direction)
+size_t x300_radio_ctrl_impl::get_chan_from_dboard_fe(
+ const std::string& fe, const uhd::direction_t direction)
{
switch (direction) {
case uhd::TX_DIRECTION:
@@ -534,7 +628,8 @@ size_t x300_radio_ctrl_impl::get_chan_from_dboard_fe(const std::string &fe, cons
}
}
-std::string x300_radio_ctrl_impl::get_dboard_fe_from_chan(const size_t chan, const uhd::direction_t direction)
+std::string x300_radio_ctrl_impl::get_dboard_fe_from_chan(
+ const size_t chan, const uhd::direction_t direction)
{
switch (direction) {
case uhd::TX_DIRECTION:
@@ -565,61 +660,83 @@ double x300_radio_ctrl_impl::get_output_samp_rate(size_t chan)
std::vector<std::string> x300_radio_ctrl_impl::get_gpio_banks() const
{
std::vector<std::string> banks{"RX", "TX"};
- // These pairs are the same, but RXA/TXA are from pre-rfnoc era and are kept for backward compat:
- banks.push_back("RX"+_radio_slot);
- banks.push_back("TX"+_radio_slot);
+ // These pairs are the same, but RXA/TXA are from pre-rfnoc era and are kept for
+ // backward compat:
+ banks.push_back("RX" + _radio_slot);
+ banks.push_back("TX" + _radio_slot);
if (_fp_gpio) {
banks.push_back("FP0");
}
return banks;
}
-void x300_radio_ctrl_impl::set_gpio_attr(
- const std::string &bank,
- const std::string &attr,
- const uint32_t value,
- const uint32_t mask
-) {
+void x300_radio_ctrl_impl::set_gpio_attr(const std::string& bank,
+ const std::string& attr,
+ const uint32_t value,
+ const uint32_t mask)
+{
if (bank == "FP0" and _fp_gpio) {
- const uint32_t current = _tree->access<uint32_t>(fs_path("gpio") / bank / attr).get();
+ const uint32_t current =
+ _tree->access<uint32_t>(fs_path("gpio") / bank / attr).get();
const uint32_t new_value = (current & ~mask) | (value & mask);
_tree->access<uint32_t>(fs_path("gpio") / bank / attr).set(new_value);
return;
}
- if (bank.size() > 2 and bank[1] == 'X')
- {
- const std::string name = bank.substr(2);
- const dboard_iface::unit_t unit = (bank[0] == 'R')? dboard_iface::UNIT_RX : dboard_iface::UNIT_TX;
- dboard_iface::sptr iface = _tree->access<dboard_iface::sptr>(fs_path("dboards") / name / "iface").get();
- if (attr == "CTRL") iface->set_pin_ctrl(unit, uint16_t(value), uint16_t(mask));
- if (attr == "DDR") iface->set_gpio_ddr(unit, uint16_t(value), uint16_t(mask));
- if (attr == "OUT") iface->set_gpio_out(unit, uint16_t(value), uint16_t(mask));
- if (attr == "ATR_0X") iface->set_atr_reg(unit, gpio_atr::ATR_REG_IDLE, uint16_t(value), uint16_t(mask));
- if (attr == "ATR_RX") iface->set_atr_reg(unit, gpio_atr::ATR_REG_RX_ONLY, uint16_t(value), uint16_t(mask));
- if (attr == "ATR_TX") iface->set_atr_reg(unit, gpio_atr::ATR_REG_TX_ONLY, uint16_t(value), uint16_t(mask));
- if (attr == "ATR_XX") iface->set_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX, uint16_t(value), uint16_t(mask));
+ if (bank.size() > 2 and bank[1] == 'X') {
+ const std::string name = bank.substr(2);
+ const dboard_iface::unit_t unit = (bank[0] == 'R') ? dboard_iface::UNIT_RX
+ : dboard_iface::UNIT_TX;
+ dboard_iface::sptr iface =
+ _tree->access<dboard_iface::sptr>(fs_path("dboards") / name / "iface").get();
+ if (attr == "CTRL")
+ iface->set_pin_ctrl(unit, uint16_t(value), uint16_t(mask));
+ if (attr == "DDR")
+ iface->set_gpio_ddr(unit, uint16_t(value), uint16_t(mask));
+ if (attr == "OUT")
+ iface->set_gpio_out(unit, uint16_t(value), uint16_t(mask));
+ if (attr == "ATR_0X")
+ iface->set_atr_reg(
+ unit, gpio_atr::ATR_REG_IDLE, uint16_t(value), uint16_t(mask));
+ if (attr == "ATR_RX")
+ iface->set_atr_reg(
+ unit, gpio_atr::ATR_REG_RX_ONLY, uint16_t(value), uint16_t(mask));
+ if (attr == "ATR_TX")
+ iface->set_atr_reg(
+ unit, gpio_atr::ATR_REG_TX_ONLY, uint16_t(value), uint16_t(mask));
+ if (attr == "ATR_XX")
+ iface->set_atr_reg(
+ unit, gpio_atr::ATR_REG_FULL_DUPLEX, uint16_t(value), uint16_t(mask));
}
}
uint32_t x300_radio_ctrl_impl::get_gpio_attr(
- const std::string &bank,
- const std::string &attr
-) {
+ const std::string& bank, const std::string& attr)
+{
if (bank == "FP0" and _fp_gpio) {
return uint32_t(_tree->access<uint64_t>(fs_path("gpio") / bank / attr).get());
}
if (bank.size() > 2 and bank[1] == 'X') {
- const std::string name = bank.substr(2);
- const dboard_iface::unit_t unit = (bank[0] == 'R')? dboard_iface::UNIT_RX : dboard_iface::UNIT_TX;
- dboard_iface::sptr iface = _tree->access<dboard_iface::sptr>(fs_path("dboards") / name / "iface").get();
- if (attr == "CTRL") return iface->get_pin_ctrl(unit);
- if (attr == "DDR") return iface->get_gpio_ddr(unit);
- if (attr == "OUT") return iface->get_gpio_out(unit);
- if (attr == "ATR_0X") return iface->get_atr_reg(unit, gpio_atr::ATR_REG_IDLE);
- if (attr == "ATR_RX") return iface->get_atr_reg(unit, gpio_atr::ATR_REG_RX_ONLY);
- if (attr == "ATR_TX") return iface->get_atr_reg(unit, gpio_atr::ATR_REG_TX_ONLY);
- if (attr == "ATR_XX") return iface->get_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX);
- if (attr == "READBACK") return iface->read_gpio(unit);
+ const std::string name = bank.substr(2);
+ const dboard_iface::unit_t unit = (bank[0] == 'R') ? dboard_iface::UNIT_RX
+ : dboard_iface::UNIT_TX;
+ dboard_iface::sptr iface =
+ _tree->access<dboard_iface::sptr>(fs_path("dboards") / name / "iface").get();
+ if (attr == "CTRL")
+ return iface->get_pin_ctrl(unit);
+ if (attr == "DDR")
+ return iface->get_gpio_ddr(unit);
+ if (attr == "OUT")
+ return iface->get_gpio_out(unit);
+ if (attr == "ATR_0X")
+ return iface->get_atr_reg(unit, gpio_atr::ATR_REG_IDLE);
+ if (attr == "ATR_RX")
+ return iface->get_atr_reg(unit, gpio_atr::ATR_REG_RX_ONLY);
+ if (attr == "ATR_TX")
+ return iface->get_atr_reg(unit, gpio_atr::ATR_REG_TX_ONLY);
+ if (attr == "ATR_XX")
+ return iface->get_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX);
+ if (attr == "READBACK")
+ return iface->read_gpio(unit);
}
return 0;
}
@@ -627,11 +744,10 @@ uint32_t x300_radio_ctrl_impl::get_gpio_attr(
/****************************************************************************
* Radio control and setup
***************************************************************************/
-void x300_radio_ctrl_impl::setup_radio(
- uhd::i2c_iface::sptr zpu_i2c,
- x300_clock_ctrl::sptr clock,
- bool ignore_cal_file,
- bool verbose)
+void x300_radio_ctrl_impl::setup_radio(uhd::i2c_iface::sptr zpu_i2c,
+ x300_clock_ctrl::sptr clock,
+ bool ignore_cal_file,
+ bool verbose)
{
_self_cal_adc_capture_delay(verbose);
_ignore_cal_file = ignore_cal_file;
@@ -644,57 +760,56 @@ void x300_radio_ctrl_impl::setup_radio(
static const size_t TX_EEPROM_ADDR = 0x4;
static const size_t GDB_EEPROM_ADDR = 0x1;
const static std::vector<size_t> EEPROM_ADDRS{
- RX_EEPROM_ADDR,
- TX_EEPROM_ADDR,
- GDB_EEPROM_ADDR
- };
+ RX_EEPROM_ADDR, TX_EEPROM_ADDR, GDB_EEPROM_ADDR};
const static std::vector<std::string> EEPROM_PATHS{
- "rx_eeprom",
- "tx_eeprom",
- "gdb_eeprom"
- };
+ "rx_eeprom", "tx_eeprom", "gdb_eeprom"};
const size_t DB_OFFSET = (_radio_slot == "A") ? 0x0 : 0x2;
- const fs_path db_path = ("dboards" / _radio_slot);
+ const fs_path db_path = ("dboards" / _radio_slot);
for (size_t i = 0; i < EEPROM_ADDRS.size(); i++) {
const size_t addr = EEPROM_ADDRS[i] + DB_OFFSET;
- //Load EEPROM
+ // Load EEPROM
_db_eeproms[addr].load(*zpu_i2c, BASE_ADDR | addr);
- //Add to tree
+ // Add to tree
_tree->create<dboard_eeprom_t>(db_path / EEPROM_PATHS[i])
.set(_db_eeproms[addr])
.add_coerced_subscriber(boost::bind(&x300_radio_ctrl_impl::_set_db_eeprom,
- this, zpu_i2c, (BASE_ADDR | addr), _1));
+ this,
+ zpu_i2c,
+ (BASE_ADDR | addr),
+ _1));
}
- //create a new dboard interface
+ // create a new dboard interface
x300_dboard_iface_config_t db_config;
db_config.gpio = gpio_atr::db_gpio_atr_3000::make(_get_ctrl(IO_MASTER_RADIO),
radio_ctrl_impl::regs::sr_addr(radio_ctrl_impl::regs::GPIO),
- radio_ctrl_impl::regs::rb_addr(radio_ctrl_impl::regs::RB_DB_GPIO)
- );
- db_config.spi = _spi;
+ radio_ctrl_impl::regs::rb_addr(radio_ctrl_impl::regs::RB_DB_GPIO));
+ db_config.spi = _spi;
db_config.rx_spi_slaveno = DB_RX_SEN;
db_config.tx_spi_slaveno = DB_TX_SEN;
- db_config.i2c = zpu_i2c;
- db_config.clock = clock;
- db_config.which_rx_clk = (_radio_slot == "A") ? X300_CLOCK_WHICH_DB0_RX : X300_CLOCK_WHICH_DB1_RX;
- db_config.which_tx_clk = (_radio_slot == "A") ? X300_CLOCK_WHICH_DB0_TX : X300_CLOCK_WHICH_DB1_TX;
- db_config.dboard_slot = (_radio_slot == "A")? 0 : 1;
+ db_config.i2c = zpu_i2c;
+ db_config.clock = clock;
+ db_config.which_rx_clk = (_radio_slot == "A") ? X300_CLOCK_WHICH_DB0_RX
+ : X300_CLOCK_WHICH_DB1_RX;
+ db_config.which_tx_clk = (_radio_slot == "A") ? X300_CLOCK_WHICH_DB0_TX
+ : X300_CLOCK_WHICH_DB1_TX;
+ db_config.dboard_slot = (_radio_slot == "A") ? 0 : 1;
db_config.cmd_time_ctrl = _get_ctrl(IO_MASTER_RADIO);
- //create a new dboard manager
- boost::shared_ptr<x300_dboard_iface> db_iface = boost::make_shared<x300_dboard_iface>(db_config);
- _db_manager = dboard_manager::make(
- _db_eeproms[RX_EEPROM_ADDR + DB_OFFSET],
+ // create a new dboard manager
+ boost::shared_ptr<x300_dboard_iface> db_iface =
+ boost::make_shared<x300_dboard_iface>(db_config);
+ _db_manager = dboard_manager::make(_db_eeproms[RX_EEPROM_ADDR + DB_OFFSET],
_db_eeproms[TX_EEPROM_ADDR + DB_OFFSET],
_db_eeproms[GDB_EEPROM_ADDR + DB_OFFSET],
- db_iface, _tree->subtree(db_path),
+ db_iface,
+ _tree->subtree(db_path),
true // defer daughterboard intitialization
);
size_t rx_chan = 0, tx_chan = 0;
- for(const std::string& fe: _db_manager->get_rx_frontends()) {
+ for (const std::string& fe : _db_manager->get_rx_frontends()) {
if (rx_chan >= _get_num_radios()) {
break;
}
@@ -702,12 +817,14 @@ void x300_radio_ctrl_impl::setup_radio(
db_iface->add_rx_fe(fe, _rx_fe_map[rx_chan].core);
const fs_path fe_path(db_path / "rx_frontends" / fe);
const std::string conn = _tree->access<std::string>(fe_path / "connection").get();
- const double if_freq = (_tree->exists(fe_path / "if_freq/value")) ?
- _tree->access<double>(fe_path / "if_freq/value").get() : 0.0;
+ const double if_freq =
+ (_tree->exists(fe_path / "if_freq/value"))
+ ? _tree->access<double>(fe_path / "if_freq/value").get()
+ : 0.0;
_rx_fe_map[rx_chan].core->set_fe_connection(usrp::fe_connection_t(conn, if_freq));
rx_chan++;
}
- for(const std::string& fe: _db_manager->get_tx_frontends()) {
+ for (const std::string& fe : _db_manager->get_tx_frontends()) {
if (tx_chan >= _get_num_radios()) {
break;
}
@@ -722,40 +839,63 @@ void x300_radio_ctrl_impl::setup_radio(
// Initialize the daughterboards now that frontend cores and connections exist
_db_manager->initialize_dboards();
- //now that dboard is created -- register into rx antenna event
+ // now that dboard is created -- register into rx antenna event
if (not _rx_fe_map.empty()) {
for (size_t i = 0; i < _get_num_radios(); i++) {
- if (_tree->exists(db_path / "rx_frontends" / _rx_fe_map[i].db_fe_name / "antenna" / "value")) {
- // We need a desired subscriber for antenna/value because the experts don't coerce that property.
- _tree->access<std::string>(db_path / "rx_frontends" / _rx_fe_map[i].db_fe_name / "antenna" / "value")
- .add_desired_subscriber(boost::bind(&x300_radio_ctrl_impl::_update_atr_leds, this, _1, i));
- _update_atr_leds(_tree->access<std::string>
- (db_path / "rx_frontends" / _rx_fe_map[i].db_fe_name / "antenna" / "value").get(), i);
+ if (_tree->exists(db_path / "rx_frontends" / _rx_fe_map[i].db_fe_name
+ / "antenna" / "value")) {
+ // We need a desired subscriber for antenna/value because the experts
+ // don't coerce that property.
+ _tree
+ ->access<std::string>(db_path / "rx_frontends"
+ / _rx_fe_map[i].db_fe_name / "antenna"
+ / "value")
+ .add_desired_subscriber(boost::bind(
+ &x300_radio_ctrl_impl::_update_atr_leds, this, _1, i));
+ _update_atr_leds(_tree
+ ->access<std::string>(db_path / "rx_frontends"
+ / _rx_fe_map[i].db_fe_name
+ / "antenna" / "value")
+ .get(),
+ i);
} else {
- _update_atr_leds("", i); //init anyway, even if never called
+ _update_atr_leds("", i); // init anyway, even if never called
}
}
}
- //bind frontend corrections to the dboard freq props
+ // bind frontend corrections to the dboard freq props
const fs_path db_tx_fe_path = db_path / "tx_frontends";
if (not _tx_fe_map.empty()) {
for (size_t i = 0; i < _get_num_radios(); i++) {
- if (_tree->exists(db_tx_fe_path / _tx_fe_map[i].db_fe_name / "freq" / "value")) {
- _tree->access<double>(db_tx_fe_path / _tx_fe_map[i].db_fe_name / "freq" / "value")
- .add_coerced_subscriber(boost::bind(&x300_radio_ctrl_impl::set_tx_fe_corrections, this, db_path,
- _root_path / "tx_fe_corrections" / _tx_fe_map[i].db_fe_name, _1));
+ if (_tree->exists(
+ db_tx_fe_path / _tx_fe_map[i].db_fe_name / "freq" / "value")) {
+ _tree
+ ->access<double>(
+ db_tx_fe_path / _tx_fe_map[i].db_fe_name / "freq" / "value")
+ .add_coerced_subscriber(
+ boost::bind(&x300_radio_ctrl_impl::set_tx_fe_corrections,
+ this,
+ db_path,
+ _root_path / "tx_fe_corrections" / _tx_fe_map[i].db_fe_name,
+ _1));
}
}
}
const fs_path db_rx_fe_path = db_path / "rx_frontends";
if (not _rx_fe_map.empty()) {
for (size_t i = 0; i < _get_num_radios(); i++) {
- if (_tree->exists(db_rx_fe_path / _tx_fe_map[i].db_fe_name / "freq" / "value")) {
- _tree->access<double>(db_rx_fe_path / _tx_fe_map[i].db_fe_name / "freq" / "value")
- .add_coerced_subscriber(boost::bind(&x300_radio_ctrl_impl::set_rx_fe_corrections, this, db_path,
- _root_path / "rx_fe_corrections" / _tx_fe_map[i].db_fe_name,
- _1));
+ if (_tree->exists(
+ db_rx_fe_path / _tx_fe_map[i].db_fe_name / "freq" / "value")) {
+ _tree
+ ->access<double>(
+ db_rx_fe_path / _tx_fe_map[i].db_fe_name / "freq" / "value")
+ .add_coerced_subscriber(
+ boost::bind(&x300_radio_ctrl_impl::set_rx_fe_corrections,
+ this,
+ db_path,
+ _root_path / "rx_fe_corrections" / _tx_fe_map[i].db_fe_name,
+ _1));
}
}
}
@@ -764,7 +904,7 @@ void x300_radio_ctrl_impl::setup_radio(
// Set tick rate
////////////////////////////////////////////////////////////////
const double tick_rate = get_output_samp_rate(0);
- if (_radio_type==PRIMARY) {
+ if (_radio_type == PRIMARY) {
// Slot A is the highlander timekeeper
_tree->access<double>("tick_rate").set(tick_rate);
}
@@ -772,20 +912,16 @@ void x300_radio_ctrl_impl::setup_radio(
}
void x300_radio_ctrl_impl::set_rx_fe_corrections(
- const fs_path &db_path,
- const fs_path &rx_fe_corr_path,
- const double lo_freq
-) {
+ const fs_path& db_path, const fs_path& rx_fe_corr_path, const double lo_freq)
+{
if (not _ignore_cal_file) {
apply_rx_fe_corrections(_tree, db_path, rx_fe_corr_path, lo_freq);
}
}
void x300_radio_ctrl_impl::set_tx_fe_corrections(
- const fs_path &db_path,
- const fs_path &tx_fe_corr_path,
- const double lo_freq
-) {
+ const fs_path& db_path, const fs_path& tx_fe_corr_path, const double lo_freq)
+{
if (not _ignore_cal_file) {
apply_tx_fe_corrections(_tree, db_path, tx_fe_corr_path, lo_freq);
}
@@ -793,7 +929,7 @@ void x300_radio_ctrl_impl::set_tx_fe_corrections(
void x300_radio_ctrl_impl::reset_codec()
{
- if (_radio_type==PRIMARY) { //ADC/DAC reset lines only exist in Radio0
+ if (_radio_type == PRIMARY) { // ADC/DAC reset lines only exist in Radio0
_regs->misc_outs_reg.set(radio_regmap_t::misc_outs_reg_t::ADC_RESET, 1);
_regs->misc_outs_reg.set(radio_regmap_t::misc_outs_reg_t::DAC_RESET_N, 0);
_regs->misc_outs_reg.flush();
@@ -809,29 +945,34 @@ void x300_radio_ctrl_impl::reset_codec()
void x300_radio_ctrl_impl::self_test_adc(uint32_t ramp_time_ms)
{
- //Bypass all front-end corrections
+ // Bypass all front-end corrections
for (size_t i = 0; i < _get_num_radios(); i++) {
_rx_fe_map[i].core->bypass_all(true);
}
- //Test basic patterns
- _adc->set_test_word("ones", "ones"); _check_adc(0xfffcfffc);
- _adc->set_test_word("zeros", "zeros"); _check_adc(0x00000000);
- _adc->set_test_word("ones", "zeros"); _check_adc(0xfffc0000);
- _adc->set_test_word("zeros", "ones"); _check_adc(0x0000fffc);
+ // Test basic patterns
+ _adc->set_test_word("ones", "ones");
+ _check_adc(0xfffcfffc);
+ _adc->set_test_word("zeros", "zeros");
+ _check_adc(0x00000000);
+ _adc->set_test_word("ones", "zeros");
+ _check_adc(0xfffc0000);
+ _adc->set_test_word("zeros", "ones");
+ _check_adc(0x0000fffc);
for (size_t k = 0; k < 14; k++) {
_adc->set_test_word("zeros", "custom", 1 << k);
- _check_adc(1 << (k+2));
+ _check_adc(1 << (k + 2));
}
for (size_t k = 0; k < 14; k++) {
_adc->set_test_word("custom", "zeros", 1 << k);
- _check_adc(1 << (k+18));
+ _check_adc(1 << (k + 18));
}
- //Turn on ramp pattern test
+ // Turn on ramp pattern test
_adc->set_test_word("ramp", "ramp");
_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
- //Sleep added for SPI transactions to finish and ramp to start before checker is enabled.
+ // Sleep added for SPI transactions to finish and ramp to start before checker is
+ // enabled.
std::this_thread::sleep_for(std::chrono::microseconds(1000));
_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 1);
@@ -855,37 +996,46 @@ void x300_radio_ctrl_impl::self_test_adc(uint32_t ramp_time_ms)
else
q_status = "Not Locked!";
- //Return to normal mode
+ // Return to normal mode
_adc->set_test_word("normal", "normal");
if ((i_status != "Good") or (q_status != "Good")) {
throw uhd::runtime_error(
- (boost::format("ADC self-test failed for %s. Ramp checker status: {ADC_A=%s, ADC_B=%s}")%unique_id()%i_status%q_status).str());
+ (boost::format(
+ "ADC self-test failed for %s. Ramp checker status: {ADC_A=%s, ADC_B=%s}")
+ % unique_id() % i_status % q_status)
+ .str());
}
- //Restore front-end corrections
+ // Restore front-end corrections
for (size_t i = 0; i < _get_num_radios(); i++) {
_rx_fe_map[i].core->bypass_all(false);
}
}
-void x300_radio_ctrl_impl::extended_adc_test(const std::vector<x300_radio_ctrl_impl::sptr>& radios, double duration_s)
+void x300_radio_ctrl_impl::extended_adc_test(
+ const std::vector<x300_radio_ctrl_impl::sptr>& radios, double duration_s)
{
static const size_t SECS_PER_ITER = 5;
- UHD_LOGGER_INFO("X300 RADIO") << boost::format("Running Extended ADC Self-Test (Duration=%.0fs, %ds/iteration)...")
- % duration_s % SECS_PER_ITER;
+ UHD_LOGGER_INFO("X300 RADIO")
+ << boost::format(
+ "Running Extended ADC Self-Test (Duration=%.0fs, %ds/iteration)...")
+ % duration_s % SECS_PER_ITER;
- size_t num_iters = static_cast<size_t>(ceil(duration_s/SECS_PER_ITER));
+ size_t num_iters = static_cast<size_t>(ceil(duration_s / SECS_PER_ITER));
size_t num_failures = 0;
for (size_t iter = 0; iter < num_iters; iter++) {
- //Run self-test
- UHD_LOGGER_INFO("X300 RADIO") << boost::format("Extended ADC Self-Test Iteration %06d... ") % (iter+1);
+ // Run self-test
+ UHD_LOGGER_INFO("X300 RADIO")
+ << boost::format("Extended ADC Self-Test Iteration %06d... ") % (iter + 1);
try {
for (size_t i = 0; i < radios.size(); i++) {
- radios[i]->self_test_adc((SECS_PER_ITER*1000)/radios.size());
+ radios[i]->self_test_adc((SECS_PER_ITER * 1000) / radios.size());
}
- UHD_LOGGER_INFO("X300 RADIO") << boost::format("Extended ADC Self-Test Iteration %06d passed ") % (iter+1);
- } catch(std::exception &e) {
+ UHD_LOGGER_INFO("X300 RADIO")
+ << boost::format("Extended ADC Self-Test Iteration %06d passed ")
+ % (iter + 1);
+ } catch (std::exception& e) {
num_failures++;
UHD_LOGGER_ERROR("X300 RADIO") << e.what();
}
@@ -894,75 +1044,82 @@ void x300_radio_ctrl_impl::extended_adc_test(const std::vector<x300_radio_ctrl_i
UHD_LOGGER_INFO("X300 RADIO") << "Extended ADC Self-Test PASSED";
} else {
throw uhd::runtime_error(
- (boost::format("Extended ADC Self-Test FAILED!!! (%d/%d failures)\n") % num_failures % num_iters).str());
+ (boost::format("Extended ADC Self-Test FAILED!!! (%d/%d failures)\n")
+ % num_failures % num_iters)
+ .str());
}
}
-void x300_radio_ctrl_impl::synchronize_dacs(const std::vector<x300_radio_ctrl_impl::sptr>& radios)
+void x300_radio_ctrl_impl::synchronize_dacs(
+ const std::vector<x300_radio_ctrl_impl::sptr>& radios)
{
- if (radios.size() < 2) return; //Nothing to synchronize
+ if (radios.size() < 2)
+ return; // Nothing to synchronize
//**PRECONDITION**
- //This function assumes that all the VITA times in "radios" are synchronized
- //to a common reference. Currently, this function is called in get_tx_stream
- //which also has the same precondition.
+ // This function assumes that all the VITA times in "radios" are synchronized
+ // to a common reference. Currently, this function is called in get_tx_stream
+ // which also has the same precondition.
- //Get a rough estimate of the cumulative command latency
+ // Get a rough estimate of the cumulative command latency
boost::posix_time::ptime t_start = boost::posix_time::microsec_clock::local_time();
for (size_t i = 0; i < radios.size(); i++) {
- radios[i]->user_reg_read64(regs::RB_TIME_NOW); //Discard value. We are just timing the call
+ radios[i]->user_reg_read64(
+ regs::RB_TIME_NOW); // Discard value. We are just timing the call
}
boost::posix_time::time_duration t_elapsed =
boost::posix_time::microsec_clock::local_time() - t_start;
- //Add 100% of headroom + uncertainty to the command time
- uint64_t t_sync_us = (t_elapsed.total_microseconds() * 2) + 16000 /*Scheduler latency*/;
+ // Add 100% of headroom + uncertainty to the command time
+ uint64_t t_sync_us =
+ (t_elapsed.total_microseconds() * 2) + 16000 /*Scheduler latency*/;
std::string err_str;
- //Try to sync 3 times before giving up
- for (size_t attempt = 0; attempt < 3; attempt++)
- {
- try
- {
- //Reinitialize and resync all DACs
+ // Try to sync 3 times before giving up
+ for (size_t attempt = 0; attempt < 3; attempt++) {
+ try {
+ // Reinitialize and resync all DACs
for (size_t i = 0; i < radios.size(); i++) {
radios[i]->_dac->sync();
}
- //Set tick rate and make sure FRAMEP/N is 0
+ // Set tick rate and make sure FRAMEP/N is 0
for (size_t i = 0; i < radios.size(); i++) {
- radios[i]->set_command_tick_rate(radios[i]->_radio_clk_rate, IO_MASTER_RADIO);
- radios[i]->_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::DAC_SYNC, 0);
+ radios[i]->set_command_tick_rate(
+ radios[i]->_radio_clk_rate, IO_MASTER_RADIO);
+ radios[i]->_regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::DAC_SYNC, 0);
}
- //Pick radios[0] as the time reference.
- uhd::time_spec_t sync_time =
- radios[0]->_time64->get_time_now() + uhd::time_spec_t(((double)t_sync_us)/1e6);
+ // Pick radios[0] as the time reference.
+ uhd::time_spec_t sync_time = radios[0]->_time64->get_time_now()
+ + uhd::time_spec_t(((double)t_sync_us) / 1e6);
- //Send the sync command
+ // Send the sync command
for (size_t i = 0; i < radios.size(); i++) {
radios[i]->set_command_time(sync_time, IO_MASTER_RADIO);
- //Arm FRAMEP/N sync pulse by asserting a rising edge
- radios[i]->_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::DAC_SYNC, 1);
+ // Arm FRAMEP/N sync pulse by asserting a rising edge
+ radios[i]->_regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::DAC_SYNC, 1);
}
- //Reset FRAMEP/N to 0 after 2 clock cycles
+ // Reset FRAMEP/N to 0 after 2 clock cycles
for (size_t i = 0; i < radios.size(); i++) {
- radios[i]->set_command_time(sync_time + (2.0 / radios[i]->_radio_clk_rate), IO_MASTER_RADIO);
- radios[i]->_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::DAC_SYNC, 0);
+ radios[i]->set_command_time(
+ sync_time + (2.0 / radios[i]->_radio_clk_rate), IO_MASTER_RADIO);
+ radios[i]->_regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::DAC_SYNC, 0);
radios[i]->set_command_time(uhd::time_spec_t(0.0), IO_MASTER_RADIO);
}
- //Wait and check status
+ // Wait and check status
std::this_thread::sleep_for(std::chrono::microseconds(t_sync_us));
for (size_t i = 0; i < radios.size(); i++) {
radios[i]->_dac->verify_sync();
}
return;
- }
- catch (const uhd::runtime_error &e)
- {
+ } catch (const uhd::runtime_error& e) {
err_str = e.what();
UHD_LOGGER_TRACE("X300 RADIO") << "Retrying DAC synchronization: " << err_str;
}
@@ -978,144 +1135,165 @@ double x300_radio_ctrl_impl::self_cal_adc_xfer_delay(
{
UHD_LOGGER_INFO("X300 RADIO") << "Running ADC transfer delay self-cal: ";
- //Effective resolution of the self-cal.
+ // Effective resolution of the self-cal.
static const size_t NUM_DELAY_STEPS = 100;
- double master_clk_period = (1.0e9 / clock->get_master_clock_rate()); //in ns
- double delay_start = 0.0;
- double delay_range = 2 * master_clk_period;
- double delay_incr = delay_range / NUM_DELAY_STEPS;
+ double master_clk_period = (1.0e9 / clock->get_master_clock_rate()); // in ns
+ double delay_start = 0.0;
+ double delay_range = 2 * master_clk_period;
+ double delay_incr = delay_range / NUM_DELAY_STEPS;
double cached_clk_delay = clock->get_clock_delay(X300_CLOCK_WHICH_ADC0);
- double fpga_clk_delay = clock->get_clock_delay(X300_CLOCK_WHICH_FPGA);
+ double fpga_clk_delay = clock->get_clock_delay(X300_CLOCK_WHICH_FPGA);
- //Iterate through several values of delays and measure ADC data integrity
- std::vector< std::pair<double,bool> > results;
+ // Iterate through several values of delays and measure ADC data integrity
+ std::vector<std::pair<double, bool>> results;
for (size_t i = 0; i < NUM_DELAY_STEPS; i++) {
- //Delay the ADC clock (will set both Ch0 and Ch1 delays)
- double delay = clock->set_clock_delay(X300_CLOCK_WHICH_ADC0, delay_incr*i + delay_start);
+ // Delay the ADC clock (will set both Ch0 and Ch1 delays)
+ double delay =
+ clock->set_clock_delay(X300_CLOCK_WHICH_ADC0, delay_incr * i + delay_start);
wait_for_clk_locked(0.1);
uint32_t err_code = 0;
for (size_t r = 0; r < radios.size(); r++) {
- //Test each channel (I and Q) individually so as to not accidentally trigger
- //on the data from the other channel if there is a swap
+ // Test each channel (I and Q) individually so as to not accidentally trigger
+ // on the data from the other channel if there is a swap
// -- Test I Channel --
- //Put ADC in ramp test mode. Tie the other channel to all ones.
+ // Put ADC in ramp test mode. Tie the other channel to all ones.
radios[r]->_adc->set_test_word("ramp", "ones");
- //Turn on the pattern checker in the FPGA. It will lock when it sees a zero
- //and count deviations from the expected value
- radios[r]->_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
- radios[r]->_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 1);
- //50ms @ 200MHz = 10 million samples
+ // Turn on the pattern checker in the FPGA. It will lock when it sees a zero
+ // and count deviations from the expected value
+ radios[r]->_regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
+ radios[r]->_regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 1);
+ // 50ms @ 200MHz = 10 million samples
std::this_thread::sleep_for(std::chrono::milliseconds(50));
- if (radios[r]->_regs->misc_ins_reg.read(radio_regmap_t::misc_ins_reg_t::ADC_CHECKER1_I_LOCKED)) {
- err_code += radios[r]->_regs->misc_ins_reg.get(radio_regmap_t::misc_ins_reg_t::ADC_CHECKER1_I_ERROR);
+ if (radios[r]->_regs->misc_ins_reg.read(
+ radio_regmap_t::misc_ins_reg_t::ADC_CHECKER1_I_LOCKED)) {
+ err_code += radios[r]->_regs->misc_ins_reg.get(
+ radio_regmap_t::misc_ins_reg_t::ADC_CHECKER1_I_ERROR);
} else {
- err_code += 100; //Increment error code by 100 to indicate no lock
+ err_code += 100; // Increment error code by 100 to indicate no lock
}
// -- Test Q Channel --
- //Put ADC in ramp test mode. Tie the other channel to all ones.
+ // Put ADC in ramp test mode. Tie the other channel to all ones.
radios[r]->_adc->set_test_word("ones", "ramp");
- //Turn on the pattern checker in the FPGA. It will lock when it sees a zero
- //and count deviations from the expected value
- radios[r]->_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
- radios[r]->_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 1);
- //50ms @ 200MHz = 10 million samples
+ // Turn on the pattern checker in the FPGA. It will lock when it sees a zero
+ // and count deviations from the expected value
+ radios[r]->_regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
+ radios[r]->_regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 1);
+ // 50ms @ 200MHz = 10 million samples
std::this_thread::sleep_for(std::chrono::milliseconds(50));
- if (radios[r]->_regs->misc_ins_reg.read(radio_regmap_t::misc_ins_reg_t::ADC_CHECKER1_Q_LOCKED)) {
- err_code += radios[r]->_regs->misc_ins_reg.get(radio_regmap_t::misc_ins_reg_t::ADC_CHECKER1_Q_ERROR);
+ if (radios[r]->_regs->misc_ins_reg.read(
+ radio_regmap_t::misc_ins_reg_t::ADC_CHECKER1_Q_LOCKED)) {
+ err_code += radios[r]->_regs->misc_ins_reg.get(
+ radio_regmap_t::misc_ins_reg_t::ADC_CHECKER1_Q_ERROR);
} else {
- err_code += 100; //Increment error code by 100 to indicate no lock
+ err_code += 100; // Increment error code by 100 to indicate no lock
}
}
- //UHD_LOGGER_INFO("X300 RADIO") << (boost::format("XferDelay=%fns, Error=%d") % delay % err_code);
- results.push_back(std::pair<double,bool>(delay, err_code==0));
+ // UHD_LOGGER_INFO("X300 RADIO") << (boost::format("XferDelay=%fns, Error=%d") %
+ // delay % err_code);
+ results.push_back(std::pair<double, bool>(delay, err_code == 0));
}
- //Calculate the valid window
+ // Calculate the valid window
int win_start_idx = -1, win_stop_idx = -1, cur_start_idx = -1, cur_stop_idx = -1;
for (size_t i = 0; i < results.size(); i++) {
- std::pair<double,bool>& item = results[i];
- if (item.second) { //If data is stable
- if (cur_start_idx == -1) { //This is the first window
+ std::pair<double, bool>& item = results[i];
+ if (item.second) { // If data is stable
+ if (cur_start_idx == -1) { // This is the first window
cur_start_idx = i;
- cur_stop_idx = i;
- } else { //We are extending the window
+ cur_stop_idx = i;
+ } else { // We are extending the window
cur_stop_idx = i;
}
} else {
- if (cur_start_idx == -1) { //We haven't yet seen valid data
- //Do nothing
- } else if (win_start_idx == -1) { //We passed the first valid window
+ if (cur_start_idx == -1) { // We haven't yet seen valid data
+ // Do nothing
+ } else if (win_start_idx == -1) { // We passed the first valid window
win_start_idx = cur_start_idx;
- win_stop_idx = cur_stop_idx;
- } else { //Update cached window if current window is larger
- double cur_win_len = results[cur_stop_idx].first - results[cur_start_idx].first;
- double cached_win_len = results[win_stop_idx].first - results[win_start_idx].first;
+ win_stop_idx = cur_stop_idx;
+ } else { // Update cached window if current window is larger
+ double cur_win_len =
+ results[cur_stop_idx].first - results[cur_start_idx].first;
+ double cached_win_len =
+ results[win_stop_idx].first - results[win_start_idx].first;
if (cur_win_len > cached_win_len) {
win_start_idx = cur_start_idx;
- win_stop_idx = cur_stop_idx;
+ win_stop_idx = cur_stop_idx;
}
}
- //Reset current window
+ // Reset current window
cur_start_idx = -1;
- cur_stop_idx = -1;
+ cur_stop_idx = -1;
}
}
if (win_start_idx == -1) {
- throw uhd::runtime_error("self_cal_adc_xfer_delay: Self calibration failed. Convergence error.");
+ throw uhd::runtime_error(
+ "self_cal_adc_xfer_delay: Self calibration failed. Convergence error.");
}
- double win_center = (results[win_stop_idx].first + results[win_start_idx].first) / 2.0;
+ double win_center =
+ (results[win_stop_idx].first + results[win_start_idx].first) / 2.0;
double win_length = results[win_stop_idx].first - results[win_start_idx].first;
- if (win_length < master_clk_period/4) {
- throw uhd::runtime_error("self_cal_adc_xfer_delay: Self calibration failed. Valid window too narrow.");
+ if (win_length < master_clk_period / 4) {
+ throw uhd::runtime_error(
+ "self_cal_adc_xfer_delay: Self calibration failed. Valid window too narrow.");
}
- //Cycle slip the relative delay by a clock cycle to prevent sample misalignment
- //fpga_clk_delay > 0 and 0 < win_center < 2*(1/MCR) so one cycle slip is all we need
- bool cycle_slip = (win_center-fpga_clk_delay >= master_clk_period);
+ // Cycle slip the relative delay by a clock cycle to prevent sample misalignment
+ // fpga_clk_delay > 0 and 0 < win_center < 2*(1/MCR) so one cycle slip is all we need
+ bool cycle_slip = (win_center - fpga_clk_delay >= master_clk_period);
if (cycle_slip) {
win_center -= master_clk_period;
}
if (apply_delay) {
- //Apply delay
- win_center = clock->set_clock_delay(X300_CLOCK_WHICH_ADC0, win_center); //Sets ADC0 and ADC1
+ // Apply delay
+ win_center = clock->set_clock_delay(
+ X300_CLOCK_WHICH_ADC0, win_center); // Sets ADC0 and ADC1
wait_for_clk_locked(0.1);
- //Validate
+ // Validate
for (size_t r = 0; r < radios.size(); r++) {
radios[r]->self_test_adc(2000);
}
} else {
- //Restore delay
- clock->set_clock_delay(X300_CLOCK_WHICH_ADC0, cached_clk_delay); //Sets ADC0 and ADC1
+ // Restore delay
+ clock->set_clock_delay(
+ X300_CLOCK_WHICH_ADC0, cached_clk_delay); // Sets ADC0 and ADC1
}
- //Teardown
+ // Teardown
for (size_t r = 0; r < radios.size(); r++) {
radios[r]->_adc->set_test_word("normal", "normal");
- radios[r]->_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
+ radios[r]->_regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
}
- UHD_LOGGER_INFO("X300 RADIO") << (boost::format("ADC transfer delay self-cal done (FPGA->ADC=%.3fns%s, Window=%.3fns)") %
- (win_center-fpga_clk_delay) % (cycle_slip?" +cyc":"") % win_length);
+ UHD_LOGGER_INFO("X300 RADIO")
+ << (boost::format(
+ "ADC transfer delay self-cal done (FPGA->ADC=%.3fns%s, Window=%.3fns)")
+ % (win_center - fpga_clk_delay) % (cycle_slip ? " +cyc" : "")
+ % win_length);
return win_center;
}
/****************************************************************************
* Helpers
***************************************************************************/
-void x300_radio_ctrl_impl::_update_atr_leds(const std::string &rx_ant, const size_t chan)
+void x300_radio_ctrl_impl::_update_atr_leds(const std::string& rx_ant, const size_t chan)
{
// The "RX1" port is used by TwinRX and the "TX/RX" port is used by all
// other full-duplex dboards. We need to handle both here.
const bool is_txrx = (rx_ant == "TX/RX" or rx_ant == "RX1");
- const int TXRX_RX = (1 << 0);
- const int TXRX_TX = (1 << 1);
- const int RX2_RX = (1 << 2);
+ const int TXRX_RX = (1 << 0);
+ const int TXRX_TX = (1 << 1);
+ const int RX2_RX = (1 << 2);
_leds.at(chan)->set_atr_reg(gpio_atr::ATR_REG_IDLE, 0);
_leds.at(chan)->set_atr_reg(gpio_atr::ATR_REG_RX_ONLY, is_txrx ? TXRX_RX : RX2_RX);
_leds.at(chan)->set_atr_reg(gpio_atr::ATR_REG_TX_ONLY, TXRX_TX);
@@ -1124,76 +1302,91 @@ void x300_radio_ctrl_impl::_update_atr_leds(const std::string &rx_ant, const siz
void x300_radio_ctrl_impl::_self_cal_adc_capture_delay(bool print_status)
{
- if (print_status) UHD_LOGGER_INFO("X300 RADIO") << "Running ADC capture delay self-cal...";
+ if (print_status)
+ UHD_LOGGER_INFO("X300 RADIO") << "Running ADC capture delay self-cal...";
- static const uint32_t NUM_DELAY_STEPS = 32; //The IDELAYE2 element has 32 steps
- static const uint32_t NUM_RETRIES = 2; //Retry self-cal if it fails in warmup situations
- static const int32_t MIN_WINDOW_LEN = 4;
+ static const uint32_t NUM_DELAY_STEPS = 32; // The IDELAYE2 element has 32 steps
+ static const uint32_t NUM_RETRIES =
+ 2; // Retry self-cal if it fails in warmup situations
+ static const int32_t MIN_WINDOW_LEN = 4;
int32_t win_start = -1, win_stop = -1;
uint32_t iter = 0;
while (iter++ < NUM_RETRIES) {
for (uint32_t dly_tap = 0; dly_tap < NUM_DELAY_STEPS; dly_tap++) {
- //Apply delay
- _regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_DATA_DLY_VAL, dly_tap);
- _regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_DATA_DLY_STB, 1);
- _regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_DATA_DLY_STB, 0);
+ // Apply delay
+ _regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_DATA_DLY_VAL, dly_tap);
+ _regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_DATA_DLY_STB, 1);
+ _regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_DATA_DLY_STB, 0);
uint32_t err_code = 0;
// -- Test I Channel --
- //Put ADC in ramp test mode. Tie the other channel to all ones.
+ // Put ADC in ramp test mode. Tie the other channel to all ones.
_adc->set_test_word("ramp", "ones");
- //Turn on the pattern checker in the FPGA. It will lock when it sees a zero
- //and count deviations from the expected value
- _regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
- _regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 1);
- //5ms @ 200MHz = 1 million samples
+ // Turn on the pattern checker in the FPGA. It will lock when it sees a zero
+ // and count deviations from the expected value
+ _regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
+ _regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 1);
+ // 5ms @ 200MHz = 1 million samples
std::this_thread::sleep_for(std::chrono::milliseconds(5));
- if (_regs->misc_ins_reg.read(radio_regmap_t::misc_ins_reg_t::ADC_CHECKER0_I_LOCKED)) {
- err_code += _regs->misc_ins_reg.get(radio_regmap_t::misc_ins_reg_t::ADC_CHECKER0_I_ERROR);
+ if (_regs->misc_ins_reg.read(
+ radio_regmap_t::misc_ins_reg_t::ADC_CHECKER0_I_LOCKED)) {
+ err_code += _regs->misc_ins_reg.get(
+ radio_regmap_t::misc_ins_reg_t::ADC_CHECKER0_I_ERROR);
} else {
- err_code += 100; //Increment error code by 100 to indicate no lock
+ err_code += 100; // Increment error code by 100 to indicate no lock
}
// -- Test Q Channel --
- //Put ADC in ramp test mode. Tie the other channel to all ones.
+ // Put ADC in ramp test mode. Tie the other channel to all ones.
_adc->set_test_word("ones", "ramp");
- //Turn on the pattern checker in the FPGA. It will lock when it sees a zero
- //and count deviations from the expected value
- _regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
- _regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 1);
- //5ms @ 200MHz = 1 million samples
+ // Turn on the pattern checker in the FPGA. It will lock when it sees a zero
+ // and count deviations from the expected value
+ _regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
+ _regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 1);
+ // 5ms @ 200MHz = 1 million samples
std::this_thread::sleep_for(std::chrono::milliseconds(5));
- if (_regs->misc_ins_reg.read(radio_regmap_t::misc_ins_reg_t::ADC_CHECKER0_Q_LOCKED)) {
- err_code += _regs->misc_ins_reg.get(radio_regmap_t::misc_ins_reg_t::ADC_CHECKER0_Q_ERROR);
+ if (_regs->misc_ins_reg.read(
+ radio_regmap_t::misc_ins_reg_t::ADC_CHECKER0_Q_LOCKED)) {
+ err_code += _regs->misc_ins_reg.get(
+ radio_regmap_t::misc_ins_reg_t::ADC_CHECKER0_Q_ERROR);
} else {
- err_code += 100; //Increment error code by 100 to indicate no lock
+ err_code += 100; // Increment error code by 100 to indicate no lock
}
if (err_code == 0) {
- if (win_start == -1) { //This is the first window
+ if (win_start == -1) { // This is the first window
win_start = dly_tap;
- win_stop = dly_tap;
- } else { //We are extending the window
+ win_stop = dly_tap;
+ } else { // We are extending the window
win_stop = dly_tap;
}
} else {
- if (win_start != -1) { //A valid window turned invalid
+ if (win_start != -1) { // A valid window turned invalid
if (win_stop - win_start >= MIN_WINDOW_LEN) {
- break; //Valid window found
+ break; // Valid window found
} else {
- win_start = -1; //Reset window
+ win_start = -1; // Reset window
}
}
}
- //UHD_LOGGER_INFO("X300 RADIO") << (boost::format("CapTap=%d, Error=%d") % dly_tap % err_code);
+ // UHD_LOGGER_INFO("X300 RADIO") << (boost::format("CapTap=%d, Error=%d") %
+ // dly_tap % err_code);
}
- //Retry the self-cal if it fails
- if ((win_start == -1 || (win_stop - win_start) < MIN_WINDOW_LEN) && iter < NUM_RETRIES /*not last iteration*/) {
+ // Retry the self-cal if it fails
+ if ((win_start == -1 || (win_stop - win_start) < MIN_WINDOW_LEN)
+ && iter < NUM_RETRIES /*not last iteration*/) {
win_start = -1;
- win_stop = -1;
+ win_stop = -1;
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
} else {
break;
@@ -1203,46 +1396,55 @@ void x300_radio_ctrl_impl::_self_cal_adc_capture_delay(bool print_status)
_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_CHECKER_ENABLED, 0);
if (win_start == -1) {
- throw uhd::runtime_error("self_cal_adc_capture_delay: Self calibration failed. Convergence error.");
+ throw uhd::runtime_error(
+ "self_cal_adc_capture_delay: Self calibration failed. Convergence error.");
}
- if (win_stop-win_start < MIN_WINDOW_LEN) {
- throw uhd::runtime_error("self_cal_adc_capture_delay: Self calibration failed. Valid window too narrow.");
+ if (win_stop - win_start < MIN_WINDOW_LEN) {
+ throw uhd::runtime_error("self_cal_adc_capture_delay: Self calibration failed. "
+ "Valid window too narrow.");
}
uint32_t ideal_tap = (win_stop + win_start) / 2;
- _regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_DATA_DLY_VAL, ideal_tap);
+ _regs->misc_outs_reg.write(
+ radio_regmap_t::misc_outs_reg_t::ADC_DATA_DLY_VAL, ideal_tap);
_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_DATA_DLY_STB, 1);
_regs->misc_outs_reg.write(radio_regmap_t::misc_outs_reg_t::ADC_DATA_DLY_STB, 0);
if (print_status) {
- double tap_delay = (1.0e12 / _radio_clk_rate) / (2*32); //in ps
- UHD_LOGGER_INFO("X300 RADIO") << boost::format("ADC capture delay self-cal done (Tap=%d, Window=%d, TapDelay=%.3fps, Iter=%d)") % ideal_tap % (win_stop-win_start) % tap_delay % iter;
+ double tap_delay = (1.0e12 / _radio_clk_rate) / (2 * 32); // in ps
+ UHD_LOGGER_INFO("X300 RADIO")
+ << boost::format("ADC capture delay self-cal done (Tap=%d, Window=%d, "
+ "TapDelay=%.3fps, Iter=%d)")
+ % ideal_tap % (win_stop - win_start) % tap_delay % iter;
}
}
void x300_radio_ctrl_impl::_check_adc(const uint32_t val)
{
- //Wait for previous control transaction to flush
+ // Wait for previous control transaction to flush
user_reg_read64(regs::RB_TEST);
- //Wait for ADC test pattern to propagate
+ // Wait for ADC test pattern to propagate
std::this_thread::sleep_for(std::chrono::microseconds(5));
- //Read value of RX readback register and verify
- uint32_t adc_rb = static_cast<uint32_t>(user_reg_read64(regs::RB_TEST)>>32);
- adc_rb ^= 0xfffc0000; //adapt for I inversion in FPGA
+ // Read value of RX readback register and verify
+ uint32_t adc_rb = static_cast<uint32_t>(user_reg_read64(regs::RB_TEST) >> 32);
+ adc_rb ^= 0xfffc0000; // adapt for I inversion in FPGA
if (val != adc_rb) {
throw uhd::runtime_error(
- (boost::format("ADC self-test failed for %s. (Exp=0x%x, Got=0x%x)")%unique_id()%val%adc_rb).str());
+ (boost::format("ADC self-test failed for %s. (Exp=0x%x, Got=0x%x)")
+ % unique_id() % val % adc_rb)
+ .str());
}
}
-void x300_radio_ctrl_impl::_set_db_eeprom(i2c_iface::sptr i2c, const size_t addr, const uhd::usrp::dboard_eeprom_t &db_eeprom)
+void x300_radio_ctrl_impl::_set_db_eeprom(
+ i2c_iface::sptr i2c, const size_t addr, const uhd::usrp::dboard_eeprom_t& db_eeprom)
{
db_eeprom.store(*i2c, addr);
_db_eeproms[addr] = db_eeprom;
}
-void x300_radio_ctrl_impl::_set_command_time(const time_spec_t &spec, const size_t port)
+void x300_radio_ctrl_impl::_set_command_time(const time_spec_t& spec, const size_t port)
{
set_fe_cmd_time(spec, port);
}
@@ -1251,15 +1453,16 @@ void x300_radio_ctrl_impl::_set_command_time(const time_spec_t &spec, const size
***************************************************************************/
bool x300_radio_ctrl_impl::check_radio_config()
{
- UHD_RFNOC_BLOCK_TRACE() << "x300_radio_ctrl_impl::check_radio_config() " ;
+ UHD_RFNOC_BLOCK_TRACE() << "x300_radio_ctrl_impl::check_radio_config() ";
const fs_path rx_fe_path = fs_path("dboards" / _radio_slot / "rx_frontends");
for (size_t chan = 0; chan < _num_rx_channels; chan++) {
if (_tree->exists(rx_fe_path / _rx_fe_map.at(chan).db_fe_name / "enabled")) {
const bool chan_active = _is_streamer_active(uhd::RX_DIRECTION, chan);
if (chan_active) {
- _tree->access<bool>(rx_fe_path / _rx_fe_map.at(chan).db_fe_name / "enabled")
- .set(chan_active)
- ;
+ _tree
+ ->access<bool>(
+ rx_fe_path / _rx_fe_map.at(chan).db_fe_name / "enabled")
+ .set(chan_active);
}
}
}
@@ -1269,9 +1472,10 @@ bool x300_radio_ctrl_impl::check_radio_config()
if (_tree->exists(tx_fe_path / _tx_fe_map.at(chan).db_fe_name / "enabled")) {
const bool chan_active = _is_streamer_active(uhd::TX_DIRECTION, chan);
if (chan_active) {
- _tree->access<bool>(tx_fe_path / _tx_fe_map.at(chan).db_fe_name / "enabled")
- .set(chan_active)
- ;
+ _tree
+ ->access<bool>(
+ tx_fe_path / _tx_fe_map.at(chan).db_fe_name / "enabled")
+ .set(chan_active);
}
}
}
diff --git a/host/lib/usrp/x300/x300_radio_ctrl_impl.hpp b/host/lib/usrp/x300/x300_radio_ctrl_impl.hpp
index 7b02f2cf1..7cc0ea18d 100644
--- a/host/lib/usrp/x300/x300_radio_ctrl_impl.hpp
+++ b/host/lib/usrp/x300/x300_radio_ctrl_impl.hpp
@@ -8,8 +8,8 @@
#ifndef INCLUDED_LIBUHD_RFNOC_X300_RADIO_CTRL_IMPL_HPP
#define INCLUDED_LIBUHD_RFNOC_X300_RADIO_CTRL_IMPL_HPP
-#include "x300_clock_ctrl.hpp"
#include "x300_adc_ctrl.hpp"
+#include "x300_clock_ctrl.hpp"
#include "x300_dac_ctrl.hpp"
#include "x300_regs.hpp"
#include <uhd/usrp/dboard_eeprom.hpp>
@@ -17,11 +17,10 @@
#include <uhd/usrp/gpio_defs.hpp>
#include <uhdlib/rfnoc/radio_ctrl_impl.hpp>
#include <uhdlib/usrp/cores/rx_frontend_core_3000.hpp>
-#include <uhdlib/usrp/cores/tx_frontend_core_200.hpp>
#include <uhdlib/usrp/cores/spi_core_3000.hpp>
+#include <uhdlib/usrp/cores/tx_frontend_core_200.hpp>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Provide access to an X300 radio.
*/
@@ -41,8 +40,8 @@ public:
***********************************************************************/
double set_rate(double rate);
- void set_tx_antenna(const std::string &ant, const size_t chan);
- void set_rx_antenna(const std::string &ant, const size_t chan);
+ void set_tx_antenna(const std::string& ant, const size_t chan);
+ void set_rx_antenna(const std::string& ant, const size_t chan);
std::string get_tx_antenna(const size_t chan);
std::string get_rx_antenna(const size_t chan);
@@ -57,24 +56,30 @@ public:
double set_rx_gain(const double gain, const size_t chan);
std::vector<std::string> get_rx_lo_names(const size_t chan);
- std::vector<std::string> get_rx_lo_sources(const std::string &name, const size_t chan);
- freq_range_t get_rx_lo_freq_range(const std::string &name, const size_t chan);
+ std::vector<std::string> get_rx_lo_sources(
+ const std::string& name, const size_t chan);
+ freq_range_t get_rx_lo_freq_range(const std::string& name, const size_t chan);
- void set_rx_lo_source(const std::string &src, const std::string &name, const size_t chan);
- const std::string get_rx_lo_source(const std::string &name, const size_t chan);
+ void set_rx_lo_source(
+ const std::string& src, const std::string& name, const size_t chan);
+ const std::string get_rx_lo_source(const std::string& name, const size_t chan);
- void set_rx_lo_export_enabled(bool enabled, const std::string &name, const size_t chan);
- bool get_rx_lo_export_enabled(const std::string &name, const size_t chan);
+ void set_rx_lo_export_enabled(
+ bool enabled, const std::string& name, const size_t chan);
+ bool get_rx_lo_export_enabled(const std::string& name, const size_t chan);
- double set_rx_lo_freq(double freq, const std::string &name, const size_t chan);
- double get_rx_lo_freq(const std::string &name, const size_t chan);
+ double set_rx_lo_freq(double freq, const std::string& name, const size_t chan);
+ double get_rx_lo_freq(const std::string& name, const size_t chan);
- size_t get_chan_from_dboard_fe(const std::string &fe, const direction_t dir);
+ size_t get_chan_from_dboard_fe(const std::string& fe, const direction_t dir);
std::string get_dboard_fe_from_chan(const size_t chan, const direction_t dir);
std::vector<std::string> get_gpio_banks() const;
- void set_gpio_attr(const std::string &bank, const std::string &attr, const uint32_t value, const uint32_t mask);
- uint32_t get_gpio_attr(const std::string &bank, const std::string &attr);
+ void set_gpio_attr(const std::string& bank,
+ const std::string& attr,
+ const uint32_t value,
+ const uint32_t mask);
+ uint32_t get_gpio_attr(const std::string& bank, const std::string& attr);
double get_output_samp_rate(size_t port);
@@ -83,23 +88,19 @@ public:
***********************************************************************/
/*! Set up the radio. No API calls may be made before this one.
*/
- void setup_radio(
- uhd::i2c_iface::sptr zpu_i2c,
+ void setup_radio(uhd::i2c_iface::sptr zpu_i2c,
x300_clock_ctrl::sptr clock,
bool ignore_cal_file,
- bool verbose
- );
+ bool verbose);
void reset_codec();
- void self_test_adc(
- uint32_t ramp_time_ms = 100);
+ void self_test_adc(uint32_t ramp_time_ms = 100);
static void extended_adc_test(
const std::vector<x300_radio_ctrl_impl::sptr>&, double duration_s);
- static void synchronize_dacs(
- const std::vector<x300_radio_ctrl_impl::sptr>& radios);
+ static void synchronize_dacs(const std::vector<x300_radio_ctrl_impl::sptr>& radios);
static double self_cal_adc_xfer_delay(
const std::vector<x300_radio_ctrl_impl::sptr>& radios,
@@ -111,21 +112,25 @@ protected:
virtual bool check_radio_config();
private:
- class radio_regmap_t : public uhd::soft_regmap_t {
+ class radio_regmap_t : public uhd::soft_regmap_t
+ {
public:
typedef boost::shared_ptr<radio_regmap_t> sptr;
- class misc_outs_reg_t : public uhd::soft_reg32_wo_t {
+ class misc_outs_reg_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(DAC_ENABLED, /*width*/ 1, /*shift*/ 0); //[0]
- UHD_DEFINE_SOFT_REG_FIELD(DAC_RESET_N, /*width*/ 1, /*shift*/ 1); //[1]
- UHD_DEFINE_SOFT_REG_FIELD(ADC_RESET, /*width*/ 1, /*shift*/ 2); //[2]
- UHD_DEFINE_SOFT_REG_FIELD(ADC_DATA_DLY_STB, /*width*/ 1, /*shift*/ 3); //[3]
- UHD_DEFINE_SOFT_REG_FIELD(ADC_DATA_DLY_VAL, /*width*/ 5, /*shift*/ 4); //[8:4]
- UHD_DEFINE_SOFT_REG_FIELD(ADC_CHECKER_ENABLED, /*width*/ 1, /*shift*/ 9); //[9]
- UHD_DEFINE_SOFT_REG_FIELD(DAC_SYNC, /*width*/ 1, /*shift*/ 10); //[10]
-
- misc_outs_reg_t(): uhd::soft_reg32_wo_t(regs::sr_addr(regs::MISC_OUTS)) {
- //Initial values
+ UHD_DEFINE_SOFT_REG_FIELD(DAC_ENABLED, /*width*/ 1, /*shift*/ 0); //[0]
+ UHD_DEFINE_SOFT_REG_FIELD(DAC_RESET_N, /*width*/ 1, /*shift*/ 1); //[1]
+ UHD_DEFINE_SOFT_REG_FIELD(ADC_RESET, /*width*/ 1, /*shift*/ 2); //[2]
+ UHD_DEFINE_SOFT_REG_FIELD(ADC_DATA_DLY_STB, /*width*/ 1, /*shift*/ 3); //[3]
+ UHD_DEFINE_SOFT_REG_FIELD(ADC_DATA_DLY_VAL, /*width*/ 5, /*shift*/ 4); //[8:4]
+ UHD_DEFINE_SOFT_REG_FIELD(
+ ADC_CHECKER_ENABLED, /*width*/ 1, /*shift*/ 9); //[9]
+ UHD_DEFINE_SOFT_REG_FIELD(DAC_SYNC, /*width*/ 1, /*shift*/ 10); //[10]
+
+ misc_outs_reg_t() : uhd::soft_reg32_wo_t(regs::sr_addr(regs::MISC_OUTS))
+ {
+ // Initial values
set(DAC_ENABLED, 0);
set(DAC_RESET_N, 0);
set(ADC_RESET, 0);
@@ -136,77 +141,96 @@ private:
}
} misc_outs_reg;
- class misc_ins_reg_t : public uhd::soft_reg64_ro_t {
+ class misc_ins_reg_t : public uhd::soft_reg64_ro_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(ADC_CHECKER0_Q_LOCKED, /*width*/ 1, /*shift*/ 32); //[0]
- UHD_DEFINE_SOFT_REG_FIELD(ADC_CHECKER0_I_LOCKED, /*width*/ 1, /*shift*/ 33); //[1]
- UHD_DEFINE_SOFT_REG_FIELD(ADC_CHECKER1_Q_LOCKED, /*width*/ 1, /*shift*/ 34); //[2]
- UHD_DEFINE_SOFT_REG_FIELD(ADC_CHECKER1_I_LOCKED, /*width*/ 1, /*shift*/ 35); //[3]
- UHD_DEFINE_SOFT_REG_FIELD(ADC_CHECKER0_Q_ERROR, /*width*/ 1, /*shift*/ 36); //[4]
- UHD_DEFINE_SOFT_REG_FIELD(ADC_CHECKER0_I_ERROR, /*width*/ 1, /*shift*/ 37); //[5]
- UHD_DEFINE_SOFT_REG_FIELD(ADC_CHECKER1_Q_ERROR, /*width*/ 1, /*shift*/ 38); //[6]
- UHD_DEFINE_SOFT_REG_FIELD(ADC_CHECKER1_I_ERROR, /*width*/ 1, /*shift*/ 39); //[7]
-
- misc_ins_reg_t(): uhd::soft_reg64_ro_t(regs::rb_addr(regs::RB_MISC_IO)) { }
+ UHD_DEFINE_SOFT_REG_FIELD(
+ ADC_CHECKER0_Q_LOCKED, /*width*/ 1, /*shift*/ 32); //[0]
+ UHD_DEFINE_SOFT_REG_FIELD(
+ ADC_CHECKER0_I_LOCKED, /*width*/ 1, /*shift*/ 33); //[1]
+ UHD_DEFINE_SOFT_REG_FIELD(
+ ADC_CHECKER1_Q_LOCKED, /*width*/ 1, /*shift*/ 34); //[2]
+ UHD_DEFINE_SOFT_REG_FIELD(
+ ADC_CHECKER1_I_LOCKED, /*width*/ 1, /*shift*/ 35); //[3]
+ UHD_DEFINE_SOFT_REG_FIELD(
+ ADC_CHECKER0_Q_ERROR, /*width*/ 1, /*shift*/ 36); //[4]
+ UHD_DEFINE_SOFT_REG_FIELD(
+ ADC_CHECKER0_I_ERROR, /*width*/ 1, /*shift*/ 37); //[5]
+ UHD_DEFINE_SOFT_REG_FIELD(
+ ADC_CHECKER1_Q_ERROR, /*width*/ 1, /*shift*/ 38); //[6]
+ UHD_DEFINE_SOFT_REG_FIELD(
+ ADC_CHECKER1_I_ERROR, /*width*/ 1, /*shift*/ 39); //[7]
+
+ misc_ins_reg_t() : uhd::soft_reg64_ro_t(regs::rb_addr(regs::RB_MISC_IO)) {}
} misc_ins_reg;
- radio_regmap_t(int radio_num) : soft_regmap_t("radio" + std::to_string(radio_num) + "_regmap") {
+ radio_regmap_t(int radio_num)
+ : soft_regmap_t("radio" + std::to_string(radio_num) + "_regmap")
+ {
add_to_map(misc_outs_reg, "misc_outs_reg", PRIVATE);
add_to_map(misc_ins_reg, "misc_ins_reg", PRIVATE);
}
};
- struct x300_regs {
- static const uint32_t TX_FE_BASE = 224;
- static const uint32_t RX_FE_BASE = 232;
+ struct x300_regs
+ {
+ static const uint32_t TX_FE_BASE = 224;
+ static const uint32_t RX_FE_BASE = 232;
};
- void _update_atr_leds(const std::string &rx_ant, const size_t chan);
+ void _update_atr_leds(const std::string& rx_ant, const size_t chan);
void _self_cal_adc_capture_delay(bool print_status);
void _check_adc(const uint32_t val);
- void _set_db_eeprom(uhd::i2c_iface::sptr i2c, const size_t, const uhd::usrp::dboard_eeprom_t &);
+ void _set_db_eeprom(
+ uhd::i2c_iface::sptr i2c, const size_t, const uhd::usrp::dboard_eeprom_t&);
- void set_rx_fe_corrections(const uhd::fs_path &db_path, const uhd::fs_path &rx_fe_corr_path, const double lo_freq);
- void set_tx_fe_corrections(const uhd::fs_path &db_path, const uhd::fs_path &tx_fe_corr_path, const double lo_freq);
+ void set_rx_fe_corrections(const uhd::fs_path& db_path,
+ const uhd::fs_path& rx_fe_corr_path,
+ const double lo_freq);
+ void set_tx_fe_corrections(const uhd::fs_path& db_path,
+ const uhd::fs_path& tx_fe_corr_path,
+ const double lo_freq);
- void _set_command_time(const uhd::time_spec_t &spec, const size_t port);
- void set_fe_cmd_time(const time_spec_t &time, const size_t chan);
+ void _set_command_time(const uhd::time_spec_t& spec, const size_t port);
+ void set_fe_cmd_time(const time_spec_t& time, const size_t chan);
private: // members
enum radio_connection_t { PRIMARY, SECONDARY };
- radio_connection_t _radio_type;
- std::string _radio_slot;
+ radio_connection_t _radio_type;
+ std::string _radio_slot;
//! Radio clock rate is the rate at which the ADC and DAC are running at.
// Not necessarily this block's sampling rate (tick rate).
- double _radio_clk_rate;
+ double _radio_clk_rate;
- radio_regmap_t::sptr _regs;
- std::map<size_t, usrp::gpio_atr::gpio_atr_3000::sptr> _leds;
- spi_core_3000::sptr _spi;
- x300_adc_ctrl::sptr _adc;
- x300_dac_ctrl::sptr _dac;
- usrp::gpio_atr::gpio_atr_3000::sptr _fp_gpio;
+ radio_regmap_t::sptr _regs;
+ std::map<size_t, usrp::gpio_atr::gpio_atr_3000::sptr> _leds;
+ spi_core_3000::sptr _spi;
+ x300_adc_ctrl::sptr _adc;
+ x300_dac_ctrl::sptr _dac;
+ usrp::gpio_atr::gpio_atr_3000::sptr _fp_gpio;
std::map<size_t, usrp::dboard_eeprom_t> _db_eeproms;
- usrp::dboard_manager::sptr _db_manager;
+ usrp::dboard_manager::sptr _db_manager;
- struct rx_fe_perif {
- std::string name;
- std::string db_fe_name;
+ struct rx_fe_perif
+ {
+ std::string name;
+ std::string db_fe_name;
rx_frontend_core_3000::sptr core;
};
- struct tx_fe_perif {
- std::string name;
- std::string db_fe_name;
- tx_frontend_core_200::sptr core;
+ struct tx_fe_perif
+ {
+ std::string name;
+ std::string db_fe_name;
+ tx_frontend_core_200::sptr core;
};
- std::map<size_t, rx_fe_perif> _rx_fe_map;
- std::map<size_t, tx_fe_perif> _tx_fe_map;
+ std::map<size_t, rx_fe_perif> _rx_fe_map;
+ std::map<size_t, tx_fe_perif> _tx_fe_map;
bool _ignore_cal_file;
diff --git a/host/lib/usrp/x300/x300_regs.hpp b/host/lib/usrp/x300/x300_regs.hpp
index 5fdc89979..d2677c05e 100644
--- a/host/lib/usrp/x300/x300_regs.hpp
+++ b/host/lib/usrp/x300/x300_regs.hpp
@@ -9,22 +9,22 @@
#define INCLUDED_X300_REGS_HPP
#include <uhd/config.hpp>
-#include <stdint.h>
#include <uhd/utils/soft_register.hpp>
+#include <stdint.h>
-static const int BL_ADDRESS = 0;
-static const int BL_DATA = 1;
+static const int BL_ADDRESS = 0;
+static const int BL_DATA = 1;
-//wishbone settings map - relevant to host code
-#define SET0_BASE 0xa000
-#define SETXB_BASE 0xb000
+// wishbone settings map - relevant to host code
+#define SET0_BASE 0xa000
+#define SETXB_BASE 0xb000
#define BOOT_LDR_BASE 0xfa00
-#define I2C0_BASE 0xfe00
-#define I2C1_BASE 0xff00
+#define I2C0_BASE 0xfe00
+#define I2C1_BASE 0xff00
#define SR_ADDR(base, offset) ((base) + (offset)*4)
-//I2C1 device addresses
-#define MBOARD_EEPROM_ADDR 0x50
+// I2C1 device addresses
+#define MBOARD_EEPROM_ADDR 0x50
static const int ZPU_SR_LEDS = 00;
static const int ZPU_SR_SW_RST = 01;
@@ -37,11 +37,11 @@ static const int ZPU_SR_ETHINT1 = 56;
static const int ZPU_SR_DRAM_FIFO0 = 72;
static const int ZPU_SR_DRAM_FIFO1 = 80;
-//reset bits
-#define ZPU_SR_SW_RST_ETH_PHY (1<<0)
-#define ZPU_SR_SW_RST_RADIO_RST (1<<1)
-#define ZPU_SR_SW_RST_RADIO_CLK_PLL (1<<2)
-#define ZPU_SR_SW_RST_ADC_IDELAYCTRL (1<<3)
+// reset bits
+#define ZPU_SR_SW_RST_ETH_PHY (1 << 0)
+#define ZPU_SR_SW_RST_RADIO_RST (1 << 1)
+#define ZPU_SR_SW_RST_RADIO_CLK_PLL (1 << 2)
+#define ZPU_SR_SW_RST_ADC_IDELAYCTRL (1 << 3)
static const int ZPU_RB_SPI = 2;
static const int ZPU_RB_CLK_STATUS = 3;
@@ -55,23 +55,23 @@ static const uint32_t RB_SFP_1G_ETH = 0;
static const uint32_t RB_SFP_10G_ETH = 1;
static const uint32_t RB_SFP_AURORA = 2;
-//spi slaves on radio
-#define DB_DAC_SEN (1 << 7)
-#define DB_ADC_SEN (1 << 6)
+// spi slaves on radio
+#define DB_DAC_SEN (1 << 7)
+#define DB_ADC_SEN (1 << 6)
#define DB_RX_LSADC_SEN (1 << 5)
#define DB_RX_LSDAC_SEN (1 << 4)
#define DB_TX_LSADC_SEN (1 << 3)
#define DB_TX_LSDAC_SEN (1 << 2)
-#define DB_RX_SEN (1 << 1)
-#define DB_TX_SEN (1 << 0)
+#define DB_RX_SEN (1 << 1)
+#define DB_TX_SEN (1 << 0)
//-------------------------------------------------------------------
// PCIe Registers
//-------------------------------------------------------------------
-static const uint32_t X300_PCIE_VID = 0x1093;
-static const uint32_t X300_PCIE_PID = 0xC4C4;
-//Rev 0-6 motherboard/PCIe IDs (ADC driven at 3.3V)
+static const uint32_t X300_PCIE_VID = 0x1093;
+static const uint32_t X300_PCIE_PID = 0xC4C4;
+// Rev 0-6 motherboard/PCIe IDs (ADC driven at 3.3V)
static const uint32_t X300_USRP_PCIE_SSID_ADC_33 = 0x7736;
static const uint32_t X310_USRP_PCIE_SSID_ADC_33 = 0x76CA;
static const uint32_t X310_2940R_40MHz_PCIE_SSID_ADC_33 = 0x772B;
@@ -88,7 +88,7 @@ static const uint32_t X310_2952R_120MHz_PCIE_SSID_ADC_33 = 0x77FF;
static const uint32_t X310_2953R_40MHz_PCIE_SSID_ADC_33 = 0x7731;
static const uint32_t X310_2953R_120MHz_PCIE_SSID_ADC_33 = 0x7800;
static const uint32_t X310_2954R_40MHz_PCIE_SSID_ADC_33 = 0x7732;
-//Rev 7+ motherboard/PCIe IDs (ADCs driven at 1.8V)
+// Rev 7+ motherboard/PCIe IDs (ADCs driven at 1.8V)
static const uint32_t X300_USRP_PCIE_SSID_ADC_18 = 0x7861;
static const uint32_t X310_USRP_PCIE_SSID_ADC_18 = 0x7862;
static const uint32_t X310_2940R_40MHz_PCIE_SSID_ADC_18 = 0x7853;
@@ -109,10 +109,10 @@ static const uint32_t X310_2954R_40MHz_PCIE_SSID_ADC_18 = 0x785A;
static const uint32_t X310_2955R_PCIE_SSID_ADC_18 = 0x78F0;
static const uint32_t X310_2974_PCIE_SSID_ADC_18 = 0x799B;
-static const uint32_t FPGA_X3xx_SIG_VALUE = 0x58333030;
+static const uint32_t FPGA_X3xx_SIG_VALUE = 0x58333030;
-static const uint32_t PCIE_FPGA_ADDR_BASE = 0xC0000;
-#define PCIE_FPGA_REG(X) (PCIE_FPGA_ADDR_BASE + (X))
+static const uint32_t PCIE_FPGA_ADDR_BASE = 0xC0000;
+#define PCIE_FPGA_REG(X) (PCIE_FPGA_ADDR_BASE + (X))
static const uint32_t FPGA_PCIE_SIG_REG = PCIE_FPGA_REG(0x0000);
static const uint32_t FPGA_CNTR_LO_REG = PCIE_FPGA_REG(0x0004);
@@ -124,38 +124,40 @@ static const uint32_t FPGA_USR_SIG_REG_SIZE = 16;
static const uint32_t FPGA_STATUS_DMA_ACTIVE_MASK = 0x3F3F0000;
-static const uint32_t PCIE_TX_DMA_REG_BASE = PCIE_FPGA_REG(0x0200);
-static const uint32_t PCIE_RX_DMA_REG_BASE = PCIE_FPGA_REG(0x0400);
-
-static const uint32_t DMA_REG_GRP_SIZE = 16;
-static const uint32_t DMA_CTRL_STATUS_REG = 0x0;
-static const uint32_t DMA_FRAME_SIZE_REG = 0x4;
-static const uint32_t DMA_SAMPLE_COUNT_REG = 0x8;
-static const uint32_t DMA_PKT_COUNT_REG = 0xC;
-
-#define PCIE_TX_DMA_REG(REG, CHAN) (PCIE_TX_DMA_REG_BASE + ((CHAN)*DMA_REG_GRP_SIZE) + (REG))
-#define PCIE_RX_DMA_REG(REG, CHAN) (PCIE_RX_DMA_REG_BASE + ((CHAN)*DMA_REG_GRP_SIZE) + (REG))
-
-static const uint32_t DMA_CTRL_DISABLED = 0x00000000;
-static const uint32_t DMA_CTRL_ENABLED = 0x00000002;
-static const uint32_t DMA_CTRL_CLEAR_STB = 0x00000001;
-static const uint32_t DMA_CTRL_SW_BUF_U64 = (3 << 4);
-static const uint32_t DMA_CTRL_SW_BUF_U32 = (2 << 4);
-static const uint32_t DMA_CTRL_SW_BUF_U16 = (1 << 4);
-static const uint32_t DMA_CTRL_SW_BUF_U8 = (0 << 4);
-static const uint32_t DMA_STATUS_ERROR = 0x00000001;
-static const uint32_t DMA_STATUS_BUSY = 0x00000002;
-
-static const uint32_t PCIE_ROUTER_REG_BASE = PCIE_FPGA_REG(0x0500);
-#define PCIE_ROUTER_REG(X) (PCIE_ROUTER_REG_BASE + (X))
-
-static const uint32_t PCIE_ZPU_DATA_BASE = 0x30000;
-static const uint32_t PCIE_ZPU_READ_BASE = 0x20000; //Trig and Status share the same base
-static const uint32_t PCIE_ZPU_STATUS_BASE = 0x20000;
-
-#define PCIE_ZPU_DATA_REG(X) (PCIE_FPGA_REG(PCIE_ZPU_DATA_BASE) + (X))
-#define PCIE_ZPU_READ_REG(X) (PCIE_FPGA_REG(PCIE_ZPU_READ_BASE) + (X))
-#define PCIE_ZPU_STATUS_REG(X) (PCIE_FPGA_REG(PCIE_ZPU_STATUS_BASE) + (X))
+static const uint32_t PCIE_TX_DMA_REG_BASE = PCIE_FPGA_REG(0x0200);
+static const uint32_t PCIE_RX_DMA_REG_BASE = PCIE_FPGA_REG(0x0400);
+
+static const uint32_t DMA_REG_GRP_SIZE = 16;
+static const uint32_t DMA_CTRL_STATUS_REG = 0x0;
+static const uint32_t DMA_FRAME_SIZE_REG = 0x4;
+static const uint32_t DMA_SAMPLE_COUNT_REG = 0x8;
+static const uint32_t DMA_PKT_COUNT_REG = 0xC;
+
+#define PCIE_TX_DMA_REG(REG, CHAN) \
+ (PCIE_TX_DMA_REG_BASE + ((CHAN)*DMA_REG_GRP_SIZE) + (REG))
+#define PCIE_RX_DMA_REG(REG, CHAN) \
+ (PCIE_RX_DMA_REG_BASE + ((CHAN)*DMA_REG_GRP_SIZE) + (REG))
+
+static const uint32_t DMA_CTRL_DISABLED = 0x00000000;
+static const uint32_t DMA_CTRL_ENABLED = 0x00000002;
+static const uint32_t DMA_CTRL_CLEAR_STB = 0x00000001;
+static const uint32_t DMA_CTRL_SW_BUF_U64 = (3 << 4);
+static const uint32_t DMA_CTRL_SW_BUF_U32 = (2 << 4);
+static const uint32_t DMA_CTRL_SW_BUF_U16 = (1 << 4);
+static const uint32_t DMA_CTRL_SW_BUF_U8 = (0 << 4);
+static const uint32_t DMA_STATUS_ERROR = 0x00000001;
+static const uint32_t DMA_STATUS_BUSY = 0x00000002;
+
+static const uint32_t PCIE_ROUTER_REG_BASE = PCIE_FPGA_REG(0x0500);
+#define PCIE_ROUTER_REG(X) (PCIE_ROUTER_REG_BASE + (X))
+
+static const uint32_t PCIE_ZPU_DATA_BASE = 0x30000;
+static const uint32_t PCIE_ZPU_READ_BASE = 0x20000; // Trig and Status share the same base
+static const uint32_t PCIE_ZPU_STATUS_BASE = 0x20000;
+
+#define PCIE_ZPU_DATA_REG(X) (PCIE_FPGA_REG(PCIE_ZPU_DATA_BASE) + (X))
+#define PCIE_ZPU_READ_REG(X) (PCIE_FPGA_REG(PCIE_ZPU_READ_BASE) + (X))
+#define PCIE_ZPU_STATUS_REG(X) (PCIE_FPGA_REG(PCIE_ZPU_STATUS_BASE) + (X))
static const uint32_t PCIE_ZPU_READ_START = 0x0;
static const uint32_t PCIE_ZPU_READ_CLOBBER = 0x80000000;
@@ -166,63 +168,72 @@ static const uint32_t PCIE_ZPU_STATUS_SUSPENDED = 0x80000000;
// Register Maps
//-------------------------------------------------------------------
namespace uhd { namespace usrp { namespace x300 {
- class fw_regmap_t : public uhd::soft_regmap_t {
+class fw_regmap_t : public uhd::soft_regmap_t
+{
+public:
+ typedef boost::shared_ptr<fw_regmap_t> sptr;
+
+ class clk_ctrl_reg_t : public uhd::soft_reg32_wo_t
+ {
public:
- typedef boost::shared_ptr<fw_regmap_t> sptr;
-
- class clk_ctrl_reg_t : public uhd::soft_reg32_wo_t {
- public:
- UHD_DEFINE_SOFT_REG_FIELD(CLK_SOURCE, /*width*/ 2, /*shift*/ 0); //[1:0]
- UHD_DEFINE_SOFT_REG_FIELD(PPS_SELECT, /*width*/ 2, /*shift*/ 2); //[3:2]
- UHD_DEFINE_SOFT_REG_FIELD(PPS_OUT_EN, /*width*/ 1, /*shift*/ 4); //[4]
- UHD_DEFINE_SOFT_REG_FIELD(TCXO_EN, /*width*/ 1, /*shift*/ 5); //[5]
- UHD_DEFINE_SOFT_REG_FIELD(GPSDO_PWR_EN, /*width*/ 1, /*shift*/ 6); //[6]
- UHD_DEFINE_SOFT_REG_FIELD(TIME_SYNC, /*width*/ 1, /*shift*/ 7); //[7]
-
- static const uint32_t SRC_EXTERNAL = 0x0;
- static const uint32_t SRC_INTERNAL = 0x2;
- static const uint32_t SRC_GPSDO = 0x3;
-
- clk_ctrl_reg_t(): uhd::soft_reg32_wo_t(SR_ADDR(SET0_BASE, ZPU_SR_CLOCK_CTRL)) {
- //Initial values
- set(CLK_SOURCE, SRC_INTERNAL);
- set(PPS_SELECT, SRC_INTERNAL);
- set(PPS_OUT_EN, 0);
- set(TCXO_EN, 1);
- set(GPSDO_PWR_EN, 1); //GPSDO power always ON
- set(TIME_SYNC, 0);
- }
- } clock_ctrl_reg;
-
- class clk_status_reg_t : public uhd::soft_reg32_ro_t {
- public:
- UHD_DEFINE_SOFT_REG_FIELD(LMK_STATUS, /*width*/ 2, /*shift*/ 0); //[1:0]
- UHD_DEFINE_SOFT_REG_FIELD(LMK_LOCK, /*width*/ 1, /*shift*/ 2); //[2]
- UHD_DEFINE_SOFT_REG_FIELD(LMK_HOLDOVER, /*width*/ 1, /*shift*/ 3); //[3]
- UHD_DEFINE_SOFT_REG_FIELD(PPS_DETECT, /*width*/ 1, /*shift*/ 4); //[4]
- UHD_DEFINE_SOFT_REG_FIELD(RADIO_CLK_LOCK, /*width*/ 1, /*shift*/ 5); //[5]
- UHD_DEFINE_SOFT_REG_FIELD(IDELAYCTRL_LOCK, /*width*/ 1, /*shift*/ 6); //[6]
-
- clk_status_reg_t(): uhd::soft_reg32_ro_t(SR_ADDR(SET0_BASE, ZPU_RB_CLK_STATUS)) {}
- } clock_status_reg;
-
- class ref_freq_reg_t : public uhd::soft_reg32_wo_t {
- public:
- UHD_DEFINE_SOFT_REG_FIELD(REF_FREQ, /*width*/ 32, /*shift*/ 0);
-
- ref_freq_reg_t(): uhd::soft_reg32_wo_t(SR_ADDR(SET0_BASE, ZPU_SR_REF_FREQ)) {
- //Initial values
- set(REF_FREQ, 10000000);
- }
- } ref_freq_reg;
-
- fw_regmap_t() : soft_regmap_t("fw_regmap") {
- add_to_map(clock_ctrl_reg, "clock_ctrl_reg", PUBLIC);
- add_to_map(clock_status_reg, "clock_status_reg", PUBLIC);
- add_to_map(ref_freq_reg, "ref_freq_reg", PUBLIC);
+ UHD_DEFINE_SOFT_REG_FIELD(CLK_SOURCE, /*width*/ 2, /*shift*/ 0); //[1:0]
+ UHD_DEFINE_SOFT_REG_FIELD(PPS_SELECT, /*width*/ 2, /*shift*/ 2); //[3:2]
+ UHD_DEFINE_SOFT_REG_FIELD(PPS_OUT_EN, /*width*/ 1, /*shift*/ 4); //[4]
+ UHD_DEFINE_SOFT_REG_FIELD(TCXO_EN, /*width*/ 1, /*shift*/ 5); //[5]
+ UHD_DEFINE_SOFT_REG_FIELD(GPSDO_PWR_EN, /*width*/ 1, /*shift*/ 6); //[6]
+ UHD_DEFINE_SOFT_REG_FIELD(TIME_SYNC, /*width*/ 1, /*shift*/ 7); //[7]
+
+ static const uint32_t SRC_EXTERNAL = 0x0;
+ static const uint32_t SRC_INTERNAL = 0x2;
+ static const uint32_t SRC_GPSDO = 0x3;
+
+ clk_ctrl_reg_t() : uhd::soft_reg32_wo_t(SR_ADDR(SET0_BASE, ZPU_SR_CLOCK_CTRL))
+ {
+ // Initial values
+ set(CLK_SOURCE, SRC_INTERNAL);
+ set(PPS_SELECT, SRC_INTERNAL);
+ set(PPS_OUT_EN, 0);
+ set(TCXO_EN, 1);
+ set(GPSDO_PWR_EN, 1); // GPSDO power always ON
+ set(TIME_SYNC, 0);
}
- };
+ } clock_ctrl_reg;
+
+ class clk_status_reg_t : public uhd::soft_reg32_ro_t
+ {
+ public:
+ UHD_DEFINE_SOFT_REG_FIELD(LMK_STATUS, /*width*/ 2, /*shift*/ 0); //[1:0]
+ UHD_DEFINE_SOFT_REG_FIELD(LMK_LOCK, /*width*/ 1, /*shift*/ 2); //[2]
+ UHD_DEFINE_SOFT_REG_FIELD(LMK_HOLDOVER, /*width*/ 1, /*shift*/ 3); //[3]
+ UHD_DEFINE_SOFT_REG_FIELD(PPS_DETECT, /*width*/ 1, /*shift*/ 4); //[4]
+ UHD_DEFINE_SOFT_REG_FIELD(RADIO_CLK_LOCK, /*width*/ 1, /*shift*/ 5); //[5]
+ UHD_DEFINE_SOFT_REG_FIELD(IDELAYCTRL_LOCK, /*width*/ 1, /*shift*/ 6); //[6]
+
+ clk_status_reg_t() : uhd::soft_reg32_ro_t(SR_ADDR(SET0_BASE, ZPU_RB_CLK_STATUS))
+ {
+ }
+ } clock_status_reg;
+
+ class ref_freq_reg_t : public uhd::soft_reg32_wo_t
+ {
+ public:
+ UHD_DEFINE_SOFT_REG_FIELD(REF_FREQ, /*width*/ 32, /*shift*/ 0);
+
+ ref_freq_reg_t() : uhd::soft_reg32_wo_t(SR_ADDR(SET0_BASE, ZPU_SR_REF_FREQ))
+ {
+ // Initial values
+ set(REF_FREQ, 10000000);
+ }
+ } ref_freq_reg;
+
+ fw_regmap_t() : soft_regmap_t("fw_regmap")
+ {
+ add_to_map(clock_ctrl_reg, "clock_ctrl_reg", PUBLIC);
+ add_to_map(clock_status_reg, "clock_status_reg", PUBLIC);
+ add_to_map(ref_freq_reg, "ref_freq_reg", PUBLIC);
+ }
+};
-}}}
+}}} // namespace uhd::usrp::x300
#endif /* INCLUDED_X300_REGS_HPP */
diff --git a/host/tests/addr_test.cpp b/host/tests/addr_test.cpp
index 9819df1a5..03608d723 100644
--- a/host/tests/addr_test.cpp
+++ b/host/tests/addr_test.cpp
@@ -5,15 +5,16 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
-#include <uhd/types/mac_addr.hpp>
#include <uhd/types/device_addr.hpp>
+#include <uhd/types/mac_addr.hpp>
#include <uhd/usrp/dboard_id.hpp>
#include <boost/assign/list_of.hpp>
+#include <boost/test/unit_test.hpp>
#include <algorithm>
#include <iostream>
-BOOST_AUTO_TEST_CASE(test_mac_addr){
+BOOST_AUTO_TEST_CASE(test_mac_addr)
+{
std::cout << "Testing mac addr..." << std::endl;
const std::string mac_addr_str("00:01:23:45:67:89");
uhd::mac_addr_t mac_addr = uhd::mac_addr_t::from_string(mac_addr_str);
@@ -22,39 +23,40 @@ BOOST_AUTO_TEST_CASE(test_mac_addr){
BOOST_CHECK_EQUAL(mac_addr_str, mac_addr.to_string());
}
-BOOST_AUTO_TEST_CASE(test_device_addr){
+BOOST_AUTO_TEST_CASE(test_device_addr)
+{
std::cout << "Testing device addr..." << std::endl;
- //load the device address with something
+ // load the device address with something
uhd::device_addr_t dev_addr;
dev_addr["key1"] = "val1";
dev_addr["key1"] = "val1";
dev_addr["key3"] = "";
- //convert to and from args string
+ // convert to and from args string
std::cout << "Pretty Print: " << std::endl << dev_addr.to_pp_string();
std::string args_str = dev_addr.to_string();
std::cout << "Args String: " << args_str << std::endl;
uhd::device_addr_t new_dev_addr(args_str);
- //they should be the same size
+ // they should be the same size
BOOST_REQUIRE_EQUAL(dev_addr.size(), new_dev_addr.size());
- //the keys should match
+ // the keys should match
std::vector<std::string> old_dev_addr_keys = dev_addr.keys();
std::vector<std::string> new_dev_addr_keys = new_dev_addr.keys();
- BOOST_CHECK_EQUAL_COLLECTIONS(
- old_dev_addr_keys.begin(), old_dev_addr_keys.end(),
- new_dev_addr_keys.begin(), new_dev_addr_keys.end()
- );
+ BOOST_CHECK_EQUAL_COLLECTIONS(old_dev_addr_keys.begin(),
+ old_dev_addr_keys.end(),
+ new_dev_addr_keys.begin(),
+ new_dev_addr_keys.end());
- //the vals should match
+ // the vals should match
std::vector<std::string> old_dev_addr_vals = dev_addr.vals();
std::vector<std::string> new_dev_addr_vals = new_dev_addr.vals();
- BOOST_CHECK_EQUAL_COLLECTIONS(
- old_dev_addr_vals.begin(), old_dev_addr_vals.end(),
- new_dev_addr_vals.begin(), new_dev_addr_vals.end()
- );
+ BOOST_CHECK_EQUAL_COLLECTIONS(old_dev_addr_vals.begin(),
+ old_dev_addr_vals.end(),
+ new_dev_addr_vals.begin(),
+ new_dev_addr_vals.end());
uhd::device_addr_t dev_addr_lhs1("key1=val1,key2=val2");
dev_addr_lhs1.update(uhd::device_addr_t("key2=val2x,key3=val3"), false);
@@ -64,7 +66,8 @@ BOOST_AUTO_TEST_CASE(test_device_addr){
std::cout << "Merged: " << dev_addr_lhs1.to_string() << std::endl;
}
-BOOST_AUTO_TEST_CASE(test_dboard_id){
+BOOST_AUTO_TEST_CASE(test_dboard_id)
+{
std::cout << "Testing dboard id..." << std::endl;
using namespace uhd::usrp;
@@ -76,7 +79,8 @@ BOOST_AUTO_TEST_CASE(test_dboard_id){
std::cout << "Pretty Print: " << std::endl << dboard_id_t::none().to_pp_string();
}
-BOOST_AUTO_TEST_CASE(test_map_device_addr){
+BOOST_AUTO_TEST_CASE(test_map_device_addr)
+{
std::map<std::string, std::string> dev_addr_map;
dev_addr_map["key1"] = "val1";
dev_addr_map["key2"] = "val2";
diff --git a/host/tests/block_id_test.cpp b/host/tests/block_id_test.cpp
index 51be3a2a2..7c068e4d2 100644
--- a/host/tests/block_id_test.cpp
+++ b/host/tests/block_id_test.cpp
@@ -5,14 +5,15 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <iostream>
-#include <boost/test/unit_test.hpp>
#include <uhd/exception.hpp>
#include <uhd/rfnoc/block_id.hpp>
+#include <boost/test/unit_test.hpp>
+#include <iostream>
using namespace uhd::rfnoc;
-BOOST_AUTO_TEST_CASE(test_block_id) {
+BOOST_AUTO_TEST_CASE(test_block_id)
+{
BOOST_CHECK(block_id_t::is_valid_block_id("00/Filter_1"));
BOOST_CHECK(not block_id_t::is_valid_block_id("0/MAG_SQUARE"));
BOOST_CHECK(block_id_t::is_valid_blockname("FilterFoo"));
@@ -45,7 +46,8 @@ BOOST_AUTO_TEST_CASE(test_block_id) {
BOOST_CHECK(not block_id.set_block_name("Foo_Bar"));
BOOST_CHECK_EQUAL(block_id.get_device_no(), 17);
- BOOST_CHECK_EQUAL(block_id.get_block_name(), "FooBar"); // Is unchanged because invalid
+ BOOST_CHECK_EQUAL(
+ block_id.get_block_name(), "FooBar"); // Is unchanged because invalid
BOOST_CHECK_EQUAL(block_id.get_block_count(), 11);
block_id++;
@@ -82,7 +84,8 @@ BOOST_AUTO_TEST_CASE(test_block_id) {
BOOST_CHECK(not other_block_id.match("2093ksdjfflsdkjf"));
}
-BOOST_AUTO_TEST_CASE(test_block_id_set) {
+BOOST_AUTO_TEST_CASE(test_block_id_set)
+{
// test set()
block_id_t block_id_for_set(5, "Blockname", 9);
block_id_for_set.set("FirFilter");
@@ -99,9 +102,10 @@ BOOST_AUTO_TEST_CASE(test_block_id_set) {
BOOST_CHECK_EQUAL(block_id_for_set.get_block_count(), 3);
}
-BOOST_AUTO_TEST_CASE(test_block_id_cmp) {
+BOOST_AUTO_TEST_CASE(test_block_id_cmp)
+{
BOOST_CHECK(block_id_t("0/FFT_1") == block_id_t("0/FFT_1"));
BOOST_CHECK(block_id_t("0/FFT_1") != block_id_t("1/FFT_1"));
BOOST_CHECK(block_id_t("0/FFT_1") < block_id_t("1/aaaaaaaaa_0"));
- BOOST_CHECK(not (block_id_t("0/FFT_1") > block_id_t("1/aaaaaaaaa_0")));
+ BOOST_CHECK(not(block_id_t("0/FFT_1") > block_id_t("1/aaaaaaaaa_0")));
}
diff --git a/host/tests/blockdef_test.cpp b/host/tests/blockdef_test.cpp
index bc513bebd..7a663f514 100644
--- a/host/tests/blockdef_test.cpp
+++ b/host/tests/blockdef_test.cpp
@@ -5,30 +5,28 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <iostream>
-#include <map>
+#include <uhd/rfnoc/blockdef.hpp>
#include <stdint.h>
-#include <boost/test/unit_test.hpp>
#include <boost/format.hpp>
-#include <uhd/rfnoc/blockdef.hpp>
+#include <boost/test/unit_test.hpp>
+#include <iostream>
+#include <map>
using namespace uhd::rfnoc;
-BOOST_AUTO_TEST_CASE(test_lookup) {
- const std::map<uint64_t, std::string> blocknames{
- {0, "NullSrcSink"},
+BOOST_AUTO_TEST_CASE(test_lookup)
+{
+ const std::map<uint64_t, std::string> blocknames{{0, "NullSrcSink"},
{0xFF70000000000000, "FFT"},
{0xF112000000000001, "FIR"},
{0xF1F0000000000000, "FIFO"},
{0xD053000000000000, "Window"},
- {0x5CC0000000000000, "SchmidlCox"}
- };
+ {0x5CC0000000000000, "SchmidlCox"}};
std::cout << blocknames.size() << std::endl;
for (const auto block : blocknames) {
- std::cout << "Testing " << block.second
- << " => " << str(boost::format("%016X") % block.first)
- << std::endl;
+ std::cout << "Testing " << block.second << " => "
+ << str(boost::format("%016X") % block.first) << std::endl;
auto block_definition = blockdef::make_from_noc_id(block.first);
// If the previous function fails, it'll return a NULL pointer
BOOST_REQUIRE(block_definition);
@@ -37,10 +35,11 @@ BOOST_AUTO_TEST_CASE(test_lookup) {
}
}
-BOOST_AUTO_TEST_CASE(test_ports) {
+BOOST_AUTO_TEST_CASE(test_ports)
+{
// Create an FFT:
blockdef::sptr block_definition = blockdef::make_from_noc_id(0xFF70000000000000);
- blockdef::ports_t in_ports = block_definition->get_input_ports();
+ blockdef::ports_t in_ports = block_definition->get_input_ports();
BOOST_REQUIRE_EQUAL(in_ports.size(), 1);
BOOST_CHECK_EQUAL(in_ports[0]["name"], "in");
BOOST_CHECK_EQUAL(in_ports[0]["type"], "sc16");
@@ -57,20 +56,22 @@ BOOST_AUTO_TEST_CASE(test_ports) {
BOOST_CHECK_EQUAL(block_definition->get_all_port_numbers()[0], 0);
}
-BOOST_AUTO_TEST_CASE(test_args) {
+BOOST_AUTO_TEST_CASE(test_args)
+{
// Create an FFT:
blockdef::sptr block_definition = blockdef::make_from_noc_id(0xFF70000000000000);
- blockdef::args_t args = block_definition->get_args();
+ blockdef::args_t args = block_definition->get_args();
BOOST_REQUIRE_EQUAL(args.size(), 7);
BOOST_CHECK_EQUAL(args[0]["name"], "spp");
BOOST_CHECK_EQUAL(args[0]["type"], "int");
BOOST_CHECK_EQUAL(args[0]["value"], "256");
}
-BOOST_AUTO_TEST_CASE(test_regs) {
+BOOST_AUTO_TEST_CASE(test_regs)
+{
// Create an FFT:
blockdef::sptr block_definition = blockdef::make_from_noc_id(0xFF70000000000000);
- blockdef::registers_t sregs = block_definition->get_settings_registers();
+ blockdef::registers_t sregs = block_definition->get_settings_registers();
BOOST_REQUIRE_EQUAL(sregs.size(), 6);
BOOST_CHECK_EQUAL(sregs["FFT_RESET"], 131);
BOOST_CHECK_EQUAL(sregs["FFT_SIZE_LOG2"], 132);
@@ -80,4 +81,3 @@ BOOST_AUTO_TEST_CASE(test_regs) {
BOOST_CHECK_EQUAL(user_regs["RB_FFT_RESET"], 0);
BOOST_CHECK_EQUAL(user_regs["RB_MAGNITUDE_OUT"], 1);
}
-
diff --git a/host/tests/buffer_test.cpp b/host/tests/buffer_test.cpp
index b2659a86b..ef4c68ff2 100644
--- a/host/tests/buffer_test.cpp
+++ b/host/tests/buffer_test.cpp
@@ -5,26 +5,27 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/transport/bounded_buffer.hpp>
#include <boost/assign/list_of.hpp>
+#include <boost/test/unit_test.hpp>
using namespace boost::assign;
using namespace uhd::transport;
-static const double timeout = 0.01/*secs*/;
+static const double timeout = 0.01 /*secs*/;
-BOOST_AUTO_TEST_CASE(test_bounded_buffer_with_timed_wait){
+BOOST_AUTO_TEST_CASE(test_bounded_buffer_with_timed_wait)
+{
bounded_buffer<int> bb(3);
- //push elements, check for timeout
+ // push elements, check for timeout
BOOST_CHECK(bb.push_with_timed_wait(0, timeout));
BOOST_CHECK(bb.push_with_timed_wait(1, timeout));
BOOST_CHECK(bb.push_with_timed_wait(2, timeout));
BOOST_CHECK(not bb.push_with_timed_wait(3, timeout));
int val;
- //pop elements, check for timeout and check values
+ // pop elements, check for timeout and check values
BOOST_CHECK(bb.pop_with_timed_wait(val, timeout));
BOOST_CHECK_EQUAL(val, 0);
BOOST_CHECK(bb.pop_with_timed_wait(val, timeout));
@@ -34,17 +35,18 @@ BOOST_AUTO_TEST_CASE(test_bounded_buffer_with_timed_wait){
BOOST_CHECK(not bb.pop_with_timed_wait(val, timeout));
}
-BOOST_AUTO_TEST_CASE(test_bounded_buffer_with_pop_on_full){
+BOOST_AUTO_TEST_CASE(test_bounded_buffer_with_pop_on_full)
+{
bounded_buffer<int> bb(3);
- //push elements, check for timeout
+ // push elements, check for timeout
BOOST_CHECK(bb.push_with_pop_on_full(0));
BOOST_CHECK(bb.push_with_pop_on_full(1));
BOOST_CHECK(bb.push_with_pop_on_full(2));
BOOST_CHECK(not bb.push_with_pop_on_full(3));
int val;
- //pop elements, check for timeout and check values
+ // pop elements, check for timeout and check values
BOOST_CHECK(bb.pop_with_timed_wait(val, timeout));
BOOST_CHECK_EQUAL(val, 1);
BOOST_CHECK(bb.pop_with_timed_wait(val, timeout));
diff --git a/host/tests/byteswap_test.cpp b/host/tests/byteswap_test.cpp
index c006de169..4cc04f484 100644
--- a/host/tests/byteswap_test.cpp
+++ b/host/tests/byteswap_test.cpp
@@ -5,25 +5,27 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/utils/byteswap.hpp>
+#include <boost/test/unit_test.hpp>
-BOOST_AUTO_TEST_CASE(test_byteswap16){
+BOOST_AUTO_TEST_CASE(test_byteswap16)
+{
uint16_t x = 0x0123;
uint16_t y = 0x2301;
BOOST_CHECK_EQUAL(uhd::byteswap(x), y);
}
-BOOST_AUTO_TEST_CASE(test_byteswap32){
+BOOST_AUTO_TEST_CASE(test_byteswap32)
+{
uint32_t x = 0x01234567;
uint32_t y = 0x67452301;
BOOST_CHECK_EQUAL(uhd::byteswap(x), y);
}
-BOOST_AUTO_TEST_CASE(test_byteswap64){
- //split up 64 bit constants to avoid long-long compiler warnings
+BOOST_AUTO_TEST_CASE(test_byteswap64)
+{
+ // split up 64 bit constants to avoid long-long compiler warnings
uint64_t x = 0x01234567 | (uint64_t(0x89abcdef) << 32);
uint64_t y = 0xefcdab89 | (uint64_t(0x67452301) << 32);
BOOST_CHECK_EQUAL(uhd::byteswap(x), y);
}
-
diff --git a/host/tests/cal_container_test.cpp b/host/tests/cal_container_test.cpp
index 559a674c1..4957b0b0d 100644
--- a/host/tests/cal_container_test.cpp
+++ b/host/tests/cal_container_test.cpp
@@ -7,10 +7,10 @@
#include <uhd/cal/power_container.hpp>
#include <uhd/exception.hpp>
-#include <boost/test/unit_test.hpp>
#include <boost/shared_ptr.hpp>
-#include <vector>
+#include <boost/test/unit_test.hpp>
#include <fstream>
+#include <vector>
using namespace uhd;
using namespace uhd::cal;
@@ -18,8 +18,9 @@ using namespace uhd::cal;
static const double eps = 1e-8;
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_power_container_bilinear){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_power_container_bilinear)
+{
+ ////////////////////////////////////////////////////////////////////////
// Create the data container
power_container::sptr container = power_container::make();
@@ -51,8 +52,9 @@ BOOST_AUTO_TEST_CASE(test_power_container_bilinear){
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_power_temp_container){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_power_temp_container)
+{
+ ////////////////////////////////////////////////////////////////////////
// Create the data container
power_container::sptr container = power_container::make();
@@ -80,8 +82,9 @@ BOOST_AUTO_TEST_CASE(test_power_temp_container){
}
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_power_container_metadata){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_power_container_metadata)
+{
+ ////////////////////////////////////////////////////////////////////////
// Create the data container
power_container::sptr container = power_container::make();
@@ -90,7 +93,7 @@ BOOST_AUTO_TEST_CASE(test_power_container_metadata){
base_container::metadata_t data;
std::string fake_serial = "F2A432";
- data["x300"] = fake_serial;
+ data["x300"] = fake_serial;
// Add some metadata
container->add_metadata(data);
@@ -102,8 +105,9 @@ BOOST_AUTO_TEST_CASE(test_power_container_metadata){
}
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_power_serialization){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_power_serialization)
+{
+ ////////////////////////////////////////////////////////////////////////
// Create the data container
power_container::sptr container = power_container::make();
@@ -112,7 +116,7 @@ BOOST_AUTO_TEST_CASE(test_power_serialization){
base_container::metadata_t data;
std::string fake_serial = "F2A432";
- data["x300"] = fake_serial;
+ data["x300"] = fake_serial;
// Add some metadata
container->add_metadata(data);
@@ -167,8 +171,9 @@ BOOST_AUTO_TEST_CASE(test_power_serialization){
}
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_interp_singular){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_interp_singular)
+{
+ ////////////////////////////////////////////////////////////////////////
// Create the data container
power_container::sptr container = power_container::make();
diff --git a/host/tests/cast_test.cpp b/host/tests/cast_test.cpp
index d1357459e..296574b48 100644
--- a/host/tests/cast_test.cpp
+++ b/host/tests/cast_test.cpp
@@ -5,19 +5,18 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <iostream>
-#include <boost/test/unit_test.hpp>
-#include <stdint.h>
#include <uhd/utils/cast.hpp>
+#include <stdint.h>
+#include <boost/test/unit_test.hpp>
+#include <iostream>
-BOOST_AUTO_TEST_CASE(test_mac_addr){
- std::string in = "0x0100";
+BOOST_AUTO_TEST_CASE(test_mac_addr)
+{
+ std::string in = "0x0100";
uint16_t correct_result = 256;
- uint16_t x = uhd::cast::hexstr_cast<uint16_t>(in);
- //uint16_t x = uhd::cast::hexstr_cast(in);
- std::cout
- << "Testing hex -> uint16_t conversion. "
- << in << " == " << std::hex << x << "?" << std::endl;
+ uint16_t x = uhd::cast::hexstr_cast<uint16_t>(in);
+ // uint16_t x = uhd::cast::hexstr_cast(in);
+ std::cout << "Testing hex -> uint16_t conversion. " << in << " == " << std::hex << x
+ << "?" << std::endl;
BOOST_CHECK_EQUAL(x, correct_result);
}
-
diff --git a/host/tests/chdr_test.cpp b/host/tests/chdr_test.cpp
index 11daca521..595d7011a 100644
--- a/host/tests/chdr_test.cpp
+++ b/host/tests/chdr_test.cpp
@@ -7,128 +7,131 @@
#include <uhd/transport/chdr.hpp>
#include <uhd/utils/byteswap.hpp>
-#include <boost/test/unit_test.hpp>
#include <boost/format.hpp>
+#include <boost/test/unit_test.hpp>
#include <cstdlib>
#include <iostream>
using namespace uhd::transport::vrt;
-static void pack_and_unpack(
- if_packet_info_t &if_packet_info_in
-){
+static void pack_and_unpack(if_packet_info_t& if_packet_info_in)
+{
// Temp buffer for packed packet
uint32_t packet_buff[2048] = {0};
// Check input (must not be lazy)
- BOOST_REQUIRE(
- (if_packet_info_in.num_payload_words32 == 0 and if_packet_info_in.num_payload_bytes == 0)
- or
- (if_packet_info_in.num_payload_words32 != 0 and if_packet_info_in.num_payload_bytes != 0)
- );
+ BOOST_REQUIRE((if_packet_info_in.num_payload_words32 == 0
+ and if_packet_info_in.num_payload_bytes == 0)
+ or (if_packet_info_in.num_payload_words32 != 0
+ and if_packet_info_in.num_payload_bytes != 0));
if (if_packet_info_in.num_payload_words32) {
- BOOST_REQUIRE(if_packet_info_in.num_payload_bytes <= 4 * if_packet_info_in.num_payload_words32);
- BOOST_REQUIRE(if_packet_info_in.num_payload_bytes > 4*(if_packet_info_in.num_payload_words32-1));
+ BOOST_REQUIRE(if_packet_info_in.num_payload_bytes
+ <= 4 * if_packet_info_in.num_payload_words32);
+ BOOST_REQUIRE(if_packet_info_in.num_payload_bytes
+ > 4 * (if_packet_info_in.num_payload_words32 - 1));
}
- //pack metadata into a vrt header
- chdr::if_hdr_pack_be(
- packet_buff, if_packet_info_in
- );
+ // pack metadata into a vrt header
+ chdr::if_hdr_pack_be(packet_buff, if_packet_info_in);
std::cout << std::endl;
uint32_t header_bits = (uhd::ntohx(packet_buff[0]) >> 28);
std::cout << boost::format("header bits = 0b%d%d%d%d") % ((header_bits & 8) > 0)
- % ((header_bits & 4) > 0)
- % ((header_bits & 2) > 0)
- % ((header_bits & 1) > 0) << std::endl;
- for (size_t i = 0; i < 5; i++)
- {
- std::cout << boost::format("packet_buff[%u] = 0x%08x") % i % uhd::ntohx(packet_buff[i]) << std::endl;
+ % ((header_bits & 4) > 0) % ((header_bits & 2) > 0)
+ % ((header_bits & 1) > 0)
+ << std::endl;
+ for (size_t i = 0; i < 5; i++) {
+ std::cout << boost::format("packet_buff[%u] = 0x%08x") % i
+ % uhd::ntohx(packet_buff[i])
+ << std::endl;
}
if_packet_info_t if_packet_info_out;
// Must be set a-priori as per contract
if_packet_info_out.num_packet_words32 = if_packet_info_in.num_packet_words32;
- //unpack the vrt header back into metadata
- chdr::if_hdr_unpack_be(
- packet_buff, if_packet_info_out
- );
+ // unpack the vrt header back into metadata
+ chdr::if_hdr_unpack_be(packet_buff, if_packet_info_out);
- //check the the unpacked metadata is the same
+ // check the the unpacked metadata is the same
BOOST_CHECK_EQUAL(if_packet_info_in.packet_count, if_packet_info_out.packet_count);
- BOOST_CHECK_EQUAL(if_packet_info_in.num_header_words32, if_packet_info_out.num_header_words32);
- BOOST_CHECK_EQUAL(if_packet_info_in.num_payload_words32, if_packet_info_out.num_payload_words32);
+ BOOST_CHECK_EQUAL(
+ if_packet_info_in.num_header_words32, if_packet_info_out.num_header_words32);
+ BOOST_CHECK_EQUAL(
+ if_packet_info_in.num_payload_words32, if_packet_info_out.num_payload_words32);
BOOST_CHECK(if_packet_info_out.has_sid);
BOOST_CHECK_EQUAL(if_packet_info_in.sid, if_packet_info_out.sid);
BOOST_CHECK(if_packet_info_out.has_sid);
BOOST_CHECK_EQUAL(if_packet_info_in.has_tsf, if_packet_info_out.has_tsf);
- if (if_packet_info_in.has_tsf and if_packet_info_out.has_tsf){
+ if (if_packet_info_in.has_tsf and if_packet_info_out.has_tsf) {
BOOST_CHECK_EQUAL(if_packet_info_in.tsf, if_packet_info_out.tsf);
}
}
-BOOST_AUTO_TEST_CASE(test_with_chdr){
+BOOST_AUTO_TEST_CASE(test_with_chdr)
+{
if_packet_info_t if_packet_info;
- if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_DATA;
- if_packet_info.eob = false;
- if_packet_info.packet_count = 7;
- if_packet_info.has_tsf = true;
- if_packet_info.tsf = 0x1234567890ABCDEFull;
- if_packet_info.sid = 0xAABBCCDD;
+ if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_DATA;
+ if_packet_info.eob = false;
+ if_packet_info.packet_count = 7;
+ if_packet_info.has_tsf = true;
+ if_packet_info.tsf = 0x1234567890ABCDEFull;
+ if_packet_info.sid = 0xAABBCCDD;
if_packet_info.num_payload_words32 = 24;
- if_packet_info.num_payload_bytes = 95;
+ if_packet_info.num_payload_bytes = 95;
pack_and_unpack(if_packet_info);
}
-BOOST_AUTO_TEST_CASE(test_with_chdr_fc){
+BOOST_AUTO_TEST_CASE(test_with_chdr_fc)
+{
if_packet_info_t if_packet_info;
- if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_FC;
- if_packet_info.eob = false;
- if_packet_info.packet_count = 19;
- if_packet_info.has_tsf = false;
- if_packet_info.tsf = 0x1234567890ABCDEFull;
- if_packet_info.sid = 0xAABBCCDD;
+ if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_FC;
+ if_packet_info.eob = false;
+ if_packet_info.packet_count = 19;
+ if_packet_info.has_tsf = false;
+ if_packet_info.tsf = 0x1234567890ABCDEFull;
+ if_packet_info.sid = 0xAABBCCDD;
if_packet_info.num_payload_words32 = 4;
- if_packet_info.num_payload_bytes = 16;
+ if_packet_info.num_payload_bytes = 16;
pack_and_unpack(if_packet_info);
}
-BOOST_AUTO_TEST_CASE(test_with_chdr_cmd){
+BOOST_AUTO_TEST_CASE(test_with_chdr_cmd)
+{
if_packet_info_t if_packet_info;
- if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_CMD;
- if_packet_info.packet_count = 19;
- if_packet_info.has_tsf = true;
- if_packet_info.tsf = 0x1234567890ABCDEFull;
- if_packet_info.sid = 0xAABBCCDD;
+ if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_CMD;
+ if_packet_info.packet_count = 19;
+ if_packet_info.has_tsf = true;
+ if_packet_info.tsf = 0x1234567890ABCDEFull;
+ if_packet_info.sid = 0xAABBCCDD;
if_packet_info.num_payload_words32 = 4;
- if_packet_info.num_payload_bytes = 16;
+ if_packet_info.num_payload_bytes = 16;
pack_and_unpack(if_packet_info);
}
-BOOST_AUTO_TEST_CASE(test_with_chdr_resp){
+BOOST_AUTO_TEST_CASE(test_with_chdr_resp)
+{
if_packet_info_t if_packet_info;
- if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_RESP;
- if_packet_info.packet_count = 123;
- if_packet_info.has_tsf = false;
- if_packet_info.tsf = 0x1234567890ABCDEFull;
- if_packet_info.sid = 0xAABBCCDD;
+ if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_RESP;
+ if_packet_info.packet_count = 123;
+ if_packet_info.has_tsf = false;
+ if_packet_info.tsf = 0x1234567890ABCDEFull;
+ if_packet_info.sid = 0xAABBCCDD;
if_packet_info.num_payload_words32 = 4;
- if_packet_info.num_payload_bytes = 16;
+ if_packet_info.num_payload_bytes = 16;
pack_and_unpack(if_packet_info);
}
-BOOST_AUTO_TEST_CASE(test_with_chdr_err){
+BOOST_AUTO_TEST_CASE(test_with_chdr_err)
+{
if_packet_info_t if_packet_info;
- if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_ERROR;
- if_packet_info.packet_count = 1928;
- if_packet_info.eob = false;
- if_packet_info.error = false; // Needs to be set explicitly
- if_packet_info.has_tsf = false;
- if_packet_info.tsf = 0x1234567890ABCDEFull;
- if_packet_info.sid = 0xAABBCCDD;
+ if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_ERROR;
+ if_packet_info.packet_count = 1928;
+ if_packet_info.eob = false;
+ if_packet_info.error = false; // Needs to be set explicitly
+ if_packet_info.has_tsf = false;
+ if_packet_info.tsf = 0x1234567890ABCDEFull;
+ if_packet_info.sid = 0xAABBCCDD;
if_packet_info.num_payload_words32 = 4;
- if_packet_info.num_payload_bytes = 16;
+ if_packet_info.num_payload_bytes = 16;
pack_and_unpack(if_packet_info);
}
-
diff --git a/host/tests/common/mock_ctrl_iface_impl.cpp b/host/tests/common/mock_ctrl_iface_impl.cpp
index 0e80ef9a0..e8560ad9e 100644
--- a/host/tests/common/mock_ctrl_iface_impl.cpp
+++ b/host/tests/common/mock_ctrl_iface_impl.cpp
@@ -7,16 +7,19 @@
#include "mock_ctrl_iface_impl.hpp"
static const uint64_t TEST_NOC_ID = 0xAAAABBBBCCCCDDDD;
-uint64_t mock_ctrl_iface_impl::send_cmd_pkt(
- const size_t addr,
- const size_t data,
- const bool readback,
- const uint64_t /* timestamp */
-) {
+uint64_t mock_ctrl_iface_impl::send_cmd_pkt(const size_t addr,
+ const size_t data,
+ const bool readback,
+ const uint64_t /* timestamp */
+)
+{
if (not readback) {
- std::cout << str(boost::format("[MOCK] poke to addr: %016X, data == %016X") % addr % data) << std::endl;
+ std::cout << str(boost::format("[MOCK] poke to addr: %016X, data == %016X") % addr
+ % data)
+ << std::endl;
} else {
- std::cout << str(boost::format("[MOCK] peek64 to addr: %016X") % data) << std::endl;
+ std::cout << str(boost::format("[MOCK] peek64 to addr: %016X") % data)
+ << std::endl;
switch (data) {
case uhd::rfnoc::SR_READBACK_REG_ID:
return TEST_NOC_ID;
@@ -25,8 +28,8 @@ uint64_t mock_ctrl_iface_impl::send_cmd_pkt(
case uhd::rfnoc::SR_READBACK_REG_USER:
return 0x0123456789ABCDEF;
case uhd::rfnoc::SR_READBACK_COMPAT:
- return uhd::rfnoc::NOC_SHELL_COMPAT_MAJOR << 32 |
- uhd::rfnoc::NOC_SHELL_COMPAT_MINOR;
+ return uhd::rfnoc::NOC_SHELL_COMPAT_MAJOR << 32
+ | uhd::rfnoc::NOC_SHELL_COMPAT_MINOR;
default:
return 0;
}
diff --git a/host/tests/common/mock_ctrl_iface_impl.hpp b/host/tests/common/mock_ctrl_iface_impl.hpp
index 8d2aafed6..ad60d32ef 100644
--- a/host/tests/common/mock_ctrl_iface_impl.hpp
+++ b/host/tests/common/mock_ctrl_iface_impl.hpp
@@ -10,21 +10,18 @@
#include <uhd/rfnoc/constants.hpp>
#include <uhdlib/rfnoc/ctrl_iface.hpp>
-#include <boost/thread/mutex.hpp>
-#include <boost/thread/thread.hpp>
-#include <boost/format.hpp>
#include <boost/bind.hpp>
+#include <boost/format.hpp>
#include <boost/make_shared.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/thread.hpp>
#include <queue>
class mock_ctrl_iface_impl : public uhd::rfnoc::ctrl_iface
{
-
- uint64_t send_cmd_pkt(
- const size_t addr,
- const size_t data,
- const bool readback=false,
- const uint64_t timestamp=0
- );
+ uint64_t send_cmd_pkt(const size_t addr,
+ const size_t data,
+ const bool readback = false,
+ const uint64_t timestamp = 0);
};
#endif /* INCLUDED_MOCK_CTRL_IFACE_IMPL_HPP */ \ No newline at end of file
diff --git a/host/tests/common/mock_zero_copy.cpp b/host/tests/common/mock_zero_copy.cpp
index bc49c3f10..0843a0274 100644
--- a/host/tests/common/mock_zero_copy.cpp
+++ b/host/tests/common/mock_zero_copy.cpp
@@ -10,18 +10,19 @@
using namespace uhd::transport;
-mock_zero_copy::mock_zero_copy(
- vrt::if_packet_info_t::link_type_t link_type,
+mock_zero_copy::mock_zero_copy(vrt::if_packet_info_t::link_type_t link_type,
size_t recv_frame_size,
- size_t send_frame_size
-) : _link_type(link_type)
- , _recv_frame_size(recv_frame_size)
- , _send_frame_size(send_frame_size) {
+ size_t send_frame_size)
+ : _link_type(link_type)
+ , _recv_frame_size(recv_frame_size)
+ , _send_frame_size(send_frame_size)
+{
}
-uhd::transport::managed_recv_buffer::sptr mock_zero_copy::get_recv_buff(double) {
+uhd::transport::managed_recv_buffer::sptr mock_zero_copy::get_recv_buff(double)
+{
if (_simulate_io_error) {
- throw uhd::io_error("IO error exception"); //simulate an IO error
+ throw uhd::io_error("IO error exception"); // simulate an IO error
}
if (_rx_mems.empty()) {
return uhd::transport::managed_recv_buffer::sptr(); // timeout
@@ -38,20 +39,22 @@ uhd::transport::managed_recv_buffer::sptr mock_zero_copy::get_recv_buff(double)
return mrb;
}
-uhd::transport::managed_send_buffer::sptr mock_zero_copy::get_send_buff(double) {
+uhd::transport::managed_send_buffer::sptr mock_zero_copy::get_send_buff(double)
+{
if (not _reuse_send_memory or _tx_mems.size() == 0) {
- _tx_mems.push_back(
- boost::shared_array<uint8_t>(new uint8_t[_send_frame_size]));
+ _tx_mems.push_back(boost::shared_array<uint8_t>(new uint8_t[_send_frame_size]));
_tx_lens.push_back(_send_frame_size);
}
return _msb.get_new(_tx_mems.back(), &_tx_lens.back());
}
-void mock_zero_copy::set_reuse_recv_memory(bool reuse_recv) {
+void mock_zero_copy::set_reuse_recv_memory(bool reuse_recv)
+{
_reuse_recv_memory = reuse_recv;
}
-void mock_zero_copy::set_reuse_send_memory(bool reuse_send) {
+void mock_zero_copy::set_reuse_send_memory(bool reuse_send)
+{
_reuse_send_memory = reuse_send;
}
diff --git a/host/tests/common/mock_zero_copy.hpp b/host/tests/common/mock_zero_copy.hpp
index 8d27c9b46..60e5f4659 100644
--- a/host/tests/common/mock_zero_copy.hpp
+++ b/host/tests/common/mock_zero_copy.hpp
@@ -7,18 +7,17 @@
#ifndef INCLUDED_MOCK_XPORT_HPP
#define INCLUDED_MOCK_XPORT_HPP
-#include <uhdlib/rfnoc/xports.hpp>
+#include <uhd/exception.hpp>
#include <uhd/transport/chdr.hpp>
#include <uhd/transport/vrt_if_packet.hpp>
#include <uhd/transport/zero_copy.hpp>
#include <uhd/types/endianness.hpp>
#include <uhd/types/sid.hpp>
-#include <uhd/exception.hpp>
#include <uhd/utils/byteswap.hpp>
-#include <uhd/exception.hpp>
+#include <uhdlib/rfnoc/xports.hpp>
#include <boost/make_shared.hpp>
-#include <boost/shared_ptr.hpp>
#include <boost/shared_array.hpp>
+#include <boost/shared_ptr.hpp>
#include <list>
#include <vector>
@@ -36,89 +35,101 @@ static constexpr size_t DEFAULT_RECV_FRAME_SIZE = 1024;
/***********************************************************************
* Dummy managed buffers for testing
**********************************************************************/
-class mock_msb : public uhd::transport::managed_send_buffer {
- public:
- void release(void) { /* nop */
+class mock_msb : public uhd::transport::managed_send_buffer
+{
+public:
+ void release(void)
+ { /* nop */
}
- sptr get_new(boost::shared_array<uint8_t> mem, size_t* len) {
+ sptr get_new(boost::shared_array<uint8_t> mem, size_t* len)
+ {
_mem = mem;
return make(this, mem.get(), *len);
}
- private:
+private:
boost::shared_array<uint8_t> _mem;
};
-class mock_mrb : public uhd::transport::managed_recv_buffer {
- public:
- void release(void) { /* nop */
+class mock_mrb : public uhd::transport::managed_recv_buffer
+{
+public:
+ void release(void)
+ { /* nop */
}
- sptr get_new(boost::shared_array<uint8_t> mem, size_t len) {
+ sptr get_new(boost::shared_array<uint8_t> mem, size_t len)
+ {
_mem = mem;
return make(this, _mem.get(), len);
}
- private:
+private:
boost::shared_array<uint8_t> _mem;
};
-class mock_zero_copy : public uhd::transport::zero_copy_if {
- public:
+class mock_zero_copy : public uhd::transport::zero_copy_if
+{
+public:
typedef boost::shared_ptr<mock_zero_copy> sptr;
- mock_zero_copy(
- uhd::transport::vrt::if_packet_info_t::link_type_t type,
+ mock_zero_copy(uhd::transport::vrt::if_packet_info_t::link_type_t type,
size_t recv_frame_size = DEFAULT_RECV_FRAME_SIZE,
- size_t send_frame_size = DEFAULT_SEND_FRAME_SIZE
- );
+ size_t send_frame_size = DEFAULT_SEND_FRAME_SIZE);
uhd::transport::managed_recv_buffer::sptr get_recv_buff(double);
uhd::transport::managed_send_buffer::sptr get_send_buff(double);
- size_t get_num_recv_frames(void) const { return 1; }
- size_t get_num_send_frames(void) const { return 1; }
- size_t get_recv_frame_size(void) const { return _recv_frame_size; }
- size_t get_send_frame_size(void) const { return _send_frame_size; }
+ size_t get_num_recv_frames(void) const
+ {
+ return 1;
+ }
+ size_t get_num_send_frames(void) const
+ {
+ return 1;
+ }
+ size_t get_recv_frame_size(void) const
+ {
+ return _recv_frame_size;
+ }
+ size_t get_send_frame_size(void) const
+ {
+ return _send_frame_size;
+ }
template <typename T>
- void push_back_packet(
- uhd::transport::vrt::if_packet_info_t& ifpi,
+ void push_back_packet(uhd::transport::vrt::if_packet_info_t& ifpi,
const std::vector<T>& otw_data = std::vector<T>(),
- uhd::endianness_t endianness = uhd::ENDIANNESS_BIG);
+ uhd::endianness_t endianness = uhd::ENDIANNESS_BIG);
void set_reuse_recv_memory(bool reuse_recv);
void set_reuse_send_memory(bool reuse_send);
- void set_simulate_io_error(bool status) { _simulate_io_error = status; }
+ void set_simulate_io_error(bool status)
+ {
+ _simulate_io_error = status;
+ }
template <typename T, uhd::endianness_t endianness = uhd::ENDIANNESS_BIG>
void push_back_recv_packet(
- uhd::transport::vrt::if_packet_info_t& ifpi,
- const std::vector<T>& otw_data
- );
+ uhd::transport::vrt::if_packet_info_t& ifpi, const std::vector<T>& otw_data);
template <uhd::endianness_t endianness = uhd::ENDIANNESS_BIG>
void push_back_inline_message_packet(
- uhd::transport::vrt::if_packet_info_t& ifpi,
- const uint32_t message
- );
+ uhd::transport::vrt::if_packet_info_t& ifpi, const uint32_t message);
template <uhd::endianness_t endianness = uhd::ENDIANNESS_BIG>
void push_back_flow_ctrl_packet(
uhd::transport::vrt::if_packet_info_t::packet_type_t type,
uint32_t packet_count,
- uint32_t byte_count
- );
+ uint32_t byte_count);
template <uhd::endianness_t endianness = uhd::ENDIANNESS_BIG>
- void pop_send_packet(
- uhd::transport::vrt::if_packet_info_t &ifpi
- );
+ void pop_send_packet(uhd::transport::vrt::if_packet_info_t& ifpi);
- private:
+private:
std::list<boost::shared_array<uint8_t>> _tx_mems;
std::list<size_t> _tx_lens;
@@ -136,27 +147,23 @@ class mock_zero_copy : public uhd::transport::zero_copy_if {
bool _reuse_recv_memory = false;
bool _reuse_send_memory = false;
-
};
template <typename T, uhd::endianness_t endianness>
void mock_zero_copy::push_back_recv_packet(
- uhd::transport::vrt::if_packet_info_t& ifpi,
- const std::vector<T>& otw_data
-) {
+ uhd::transport::vrt::if_packet_info_t& ifpi, const std::vector<T>& otw_data)
+{
using namespace uhd::transport;
UHD_ASSERT_THROW(
- ifpi.num_payload_words32 * sizeof(uint32_t)
- == otw_data.size() * sizeof(T));
+ ifpi.num_payload_words32 * sizeof(uint32_t) == otw_data.size() * sizeof(T));
const size_t max_hdr_len =
- _link_type == vrt::if_packet_info_t::LINK_TYPE_CHDR ?
- vrt::chdr::max_if_hdr_words64*sizeof(uint64_t) :
- (vrt::max_if_hdr_words32 + 1/*tlr*/)*sizeof(uint32_t);
+ _link_type == vrt::if_packet_info_t::LINK_TYPE_CHDR
+ ? vrt::chdr::max_if_hdr_words64 * sizeof(uint64_t)
+ : (vrt::max_if_hdr_words32 + 1 /*tlr*/) * sizeof(uint32_t);
- const size_t max_pkt_len =
- ifpi.num_payload_words32*sizeof(uint32_t)+max_hdr_len;
+ const size_t max_pkt_len = ifpi.num_payload_words32 * sizeof(uint32_t) + max_hdr_len;
UHD_ASSERT_THROW(max_pkt_len <= _recv_frame_size);
@@ -168,15 +175,13 @@ void mock_zero_copy::push_back_recv_packet(
if (endianness == uhd::ENDIANNESS_BIG) {
if (_link_type == vrt::if_packet_info_t::LINK_TYPE_CHDR) {
uhd::transport::vrt::chdr::if_hdr_pack_be(rx_buff_ptr, ifpi);
- }
- else {
+ } else {
uhd::transport::vrt::if_hdr_pack_be(rx_buff_ptr, ifpi);
}
} else {
if (_link_type == vrt::if_packet_info_t::LINK_TYPE_CHDR) {
uhd::transport::vrt::chdr::if_hdr_pack_le(rx_buff_ptr, ifpi);
- }
- else {
+ } else {
uhd::transport::vrt::if_hdr_pack_le(rx_buff_ptr, ifpi);
}
}
@@ -184,42 +189,37 @@ void mock_zero_copy::push_back_recv_packet(
// Copy data
uint32_t* data_ptr = (rx_buff_ptr + ifpi.num_header_words32);
std::copy(otw_data.begin(), otw_data.end(), reinterpret_cast<T*>(data_ptr));
- _rx_lens.push_back(ifpi.num_packet_words32*sizeof(uint32_t));
+ _rx_lens.push_back(ifpi.num_packet_words32 * sizeof(uint32_t));
}
template <uhd::endianness_t endianness>
void mock_zero_copy::push_back_inline_message_packet(
- uhd::transport::vrt::if_packet_info_t& ifpi,
- const uint32_t message
-) {
- const std::vector<uint32_t> data { message | uhd::byteswap(message) };
+ uhd::transport::vrt::if_packet_info_t& ifpi, const uint32_t message)
+{
+ const std::vector<uint32_t> data{message | uhd::byteswap(message)};
push_back_recv_packet<uint32_t, endianness>(ifpi, data);
}
template <uhd::endianness_t endianness>
-void mock_zero_copy::pop_send_packet(
- uhd::transport::vrt::if_packet_info_t &ifpi
-) {
+void mock_zero_copy::pop_send_packet(uhd::transport::vrt::if_packet_info_t& ifpi)
+{
using namespace uhd::transport;
- ifpi.num_packet_words32 = _tx_lens.front()/sizeof(uint32_t);
+ ifpi.num_packet_words32 = _tx_lens.front() / sizeof(uint32_t);
- uint32_t* tx_buff_ptr = reinterpret_cast<uint32_t *>(_tx_mems.front().get());
+ uint32_t* tx_buff_ptr = reinterpret_cast<uint32_t*>(_tx_mems.front().get());
if (endianness == uhd::ENDIANNESS_BIG) {
if (_link_type == vrt::if_packet_info_t::LINK_TYPE_CHDR) {
uhd::transport::vrt::chdr::if_hdr_unpack_be(tx_buff_ptr, ifpi);
- }
- else {
+ } else {
uhd::transport::vrt::if_hdr_unpack_be(tx_buff_ptr, ifpi);
}
- }
- else {
+ } else {
if (_link_type == vrt::if_packet_info_t::LINK_TYPE_CHDR) {
uhd::transport::vrt::chdr::if_hdr_unpack_le(tx_buff_ptr, ifpi);
- }
- else {
+ } else {
uhd::transport::vrt::if_hdr_unpack_le(tx_buff_ptr, ifpi);
}
}
@@ -231,14 +231,12 @@ template <uhd::endianness_t endianness>
void mock_zero_copy::push_back_flow_ctrl_packet(
uhd::transport::vrt::if_packet_info_t::packet_type_t type,
uint32_t packet_count,
- uint32_t byte_count
-)
+ uint32_t byte_count)
{
using namespace uhd::transport;
- UHD_ASSERT_THROW(
- type == vrt::if_packet_info_t::PACKET_TYPE_FC or
- type == vrt::if_packet_info_t::PACKET_TYPE_ACK);
+ UHD_ASSERT_THROW(type == vrt::if_packet_info_t::PACKET_TYPE_FC
+ or type == vrt::if_packet_info_t::PACKET_TYPE_ACK);
// Only implemented for chdr packets currently
UHD_ASSERT_THROW(_link_type == vrt::if_packet_info_t::LINK_TYPE_CHDR);
@@ -246,18 +244,17 @@ void mock_zero_copy::push_back_flow_ctrl_packet(
const size_t packet_len_in_words32 = 2;
vrt::if_packet_info_t ifpi;
- ifpi.packet_type = type;
+ ifpi.packet_type = type;
ifpi.num_payload_words32 = packet_len_in_words32;
- ifpi.num_payload_bytes = ifpi.num_payload_words32*sizeof(uint32_t);
- ifpi.has_tsf = false;
+ ifpi.num_payload_bytes = ifpi.num_payload_words32 * sizeof(uint32_t);
+ ifpi.has_tsf = false;
std::vector<uint32_t> data(packet_len_in_words32, 0);
if (endianness == uhd::ENDIANNESS_BIG) {
data[0] = uhd::ntohx(packet_count);
data[1] = uhd::ntohx(byte_count);
- }
- else {
+ } else {
data[0] = uhd::wtohx(packet_count);
data[1] = uhd::wtohx(byte_count);
}
diff --git a/host/tests/config_parser_test.cpp b/host/tests/config_parser_test.cpp
index ef1686a11..2016776a7 100644
--- a/host/tests/config_parser_test.cpp
+++ b/host/tests/config_parser_test.cpp
@@ -5,93 +5,68 @@
//
#include <uhdlib/utils/config_parser.hpp>
-#include <boost/test/unit_test.hpp>
#include <boost/assign/list_of.hpp>
-#include <fstream>
+#include <boost/test/unit_test.hpp>
#include <cstdio>
+#include <fstream>
const std::string INI1_FILENAME = "test1.ini";
-const std::string INI1 =
- "[section1]\n"
- "key1=value1\n"
- "key2=4\n"
- "\n"
- "; This is a comment\n"
- "[section2]\n"
- "key3=value with spaces\n"
- "key4= leading and trailing spaces \n"
-;
+const std::string INI1 = "[section1]\n"
+ "key1=value1\n"
+ "key2=4\n"
+ "\n"
+ "; This is a comment\n"
+ "[section2]\n"
+ "key3=value with spaces\n"
+ "key4= leading and trailing spaces \n";
const std::string INI2_FILENAME = "test2.ini";
-const std::string INI2 =
- "[section2]\n"
- "key3=value with even more spaces\n"
- "\n"
- "[section3]\n"
- "key4=\"with quotes\"\n";
+const std::string INI2 = "[section2]\n"
+ "key3=value with even more spaces\n"
+ "\n"
+ "[section3]\n"
+ "key4=\"with quotes\"\n";
namespace {
- //! Create files that can be read by the CUT
- void make_config_parsers()
- {
- std::ofstream ini1(INI1_FILENAME);
- ini1 << INI1 << std::endl;
- ini1.close();
- std::ofstream ini2(INI2_FILENAME);
- ini2 << INI2 << std::endl;
- ini2.close();
- }
+//! Create files that can be read by the CUT
+void make_config_parsers()
+{
+ std::ofstream ini1(INI1_FILENAME);
+ ini1 << INI1 << std::endl;
+ ini1.close();
+ std::ofstream ini2(INI2_FILENAME);
+ ini2 << INI2 << std::endl;
+ ini2.close();
+}
- //! Tidy up after us
- void cleanup_config_parsers()
- {
- std::remove(INI1_FILENAME.c_str());
- std::remove(INI2_FILENAME.c_str());
- }
+//! Tidy up after us
+void cleanup_config_parsers()
+{
+ std::remove(INI1_FILENAME.c_str());
+ std::remove(INI2_FILENAME.c_str());
}
+} // namespace
-BOOST_AUTO_TEST_CASE(test_config_parser){
+BOOST_AUTO_TEST_CASE(test_config_parser)
+{
make_config_parsers();
uhd::config_parser I(INI1_FILENAME);
BOOST_CHECK_EQUAL(I.sections().size(), 2);
BOOST_CHECK_EQUAL(I.options("section1").size(), 2);
+ BOOST_CHECK_EQUAL(I.get<std::string>("section1", "key1"), "value1");
+ BOOST_CHECK_EQUAL(I.get<int>("section1", "key2"), 4);
+ BOOST_CHECK_EQUAL(I.get<std::string>("section2", "key3"), "value with spaces");
BOOST_CHECK_EQUAL(
- I.get<std::string>("section1", "key1"),
- "value1"
- );
+ I.get<std::string>("section2", "key4"), "leading and trailing spaces");
BOOST_CHECK_EQUAL(
- I.get<int>("section1", "key2"),
- 4
- );
- BOOST_CHECK_EQUAL(
- I.get<std::string>("section2", "key3"),
- "value with spaces"
- );
- BOOST_CHECK_EQUAL(
- I.get<std::string>("section2", "key4"),
- "leading and trailing spaces"
- );
- BOOST_CHECK_EQUAL(
- I.get<std::string>("section2", "non_existent_key", "default"),
- "default"
- );
+ I.get<std::string>("section2", "non_existent_key", "default"), "default");
BOOST_REQUIRE_THROW(
- I.get<std::string>("section2", "non_existent_key"),
- uhd::key_error
- );
+ I.get<std::string>("section2", "non_existent_key"), uhd::key_error);
I.read_file(INI2_FILENAME);
BOOST_CHECK_EQUAL(
- I.get<std::string>("section2", "key3"),
- "value with even more spaces"
- );
- BOOST_CHECK_EQUAL(
- I.get<std::string>("section1", "key1"),
- "value1"
- );
- BOOST_CHECK_EQUAL(
- I.get<std::string>("section3", "key4"),
- "\"with quotes\""
- );
+ I.get<std::string>("section2", "key3"), "value with even more spaces");
+ BOOST_CHECK_EQUAL(I.get<std::string>("section1", "key1"), "value1");
+ BOOST_CHECK_EQUAL(I.get<std::string>("section3", "key4"), "\"with quotes\"");
cleanup_config_parsers();
}
diff --git a/host/tests/constrained_device_args_test.cpp b/host/tests/constrained_device_args_test.cpp
index 318315739..2fe7e5c16 100644
--- a/host/tests/constrained_device_args_test.cpp
+++ b/host/tests/constrained_device_args_test.cpp
@@ -4,101 +4,93 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhdlib/usrp/constrained_device_args.hpp>
+#include <boost/test/unit_test.hpp>
#include <iostream>
using uhd::usrp::constrained_device_args_t;
namespace {
- enum test_enum_t { VALUE1, VALUE2, VALUE3=4 };
+enum test_enum_t { VALUE1, VALUE2, VALUE3 = 4 };
- static constexpr double MAX_DOUBLE_ARG = 1e6;
- static constexpr double MIN_DOUBLE_ARG = 0.125;
+static constexpr double MAX_DOUBLE_ARG = 1e6;
+static constexpr double MIN_DOUBLE_ARG = 0.125;
- static constexpr double DEFAULT_DOUBLE_ARG = 2.25;
- static constexpr size_t DEFAULT_SIZE_T_ARG = 42;
- static constexpr bool DEFAULT_BOOL_ARG = true;
- static constexpr test_enum_t DEFAULT_ENUM_ARG = VALUE1;
+static constexpr double DEFAULT_DOUBLE_ARG = 2.25;
+static constexpr size_t DEFAULT_SIZE_T_ARG = 42;
+static constexpr bool DEFAULT_BOOL_ARG = true;
+static constexpr test_enum_t DEFAULT_ENUM_ARG = VALUE1;
- class test_device_args_t : public constrained_device_args_t
+class test_device_args_t : public constrained_device_args_t
+{
+public:
+ test_device_args_t() {}
+ test_device_args_t(const std::string& dev_args)
{
- public:
- test_device_args_t() {}
- test_device_args_t(const std::string& dev_args) { parse(dev_args); }
+ parse(dev_args);
+ }
- double get_double_arg() const {
- return _double_arg.get();
- }
- size_t get_size_t_arg() const {
- return _size_t_arg.get();
- }
- bool get_bool_arg() const {
- return _bool_arg.get();
- }
- test_enum_t get_enum_arg() const {
- return _enum_arg.get();
- }
+ double get_double_arg() const
+ {
+ return _double_arg.get();
+ }
+ size_t get_size_t_arg() const
+ {
+ return _size_t_arg.get();
+ }
+ bool get_bool_arg() const
+ {
+ return _bool_arg.get();
+ }
+ test_enum_t get_enum_arg() const
+ {
+ return _enum_arg.get();
+ }
- inline virtual std::string to_string() const {
- return _double_arg.to_string() + ", " +
- _size_t_arg.to_string() + ", " +
- _bool_arg.to_string() + ", " +
- _enum_arg.to_string();
- }
- private:
- virtual void _parse(const uhd::device_addr_t& dev_args) {
- if (dev_args.has_key(_double_arg.key()))
- _double_arg.parse(dev_args[_double_arg.key()]);
- if (dev_args.has_key(_size_t_arg.key()))
- _size_t_arg.parse(dev_args[_size_t_arg.key()]);
- if (dev_args.has_key(_bool_arg.key()))
- _bool_arg.parse(dev_args[_bool_arg.key()]);
- if (dev_args.has_key(_enum_arg.key()))
- _enum_arg.parse(dev_args[_enum_arg.key()]);
- _enforce_range(_double_arg, MIN_DOUBLE_ARG, MAX_DOUBLE_ARG);
- }
+ inline virtual std::string to_string() const
+ {
+ return _double_arg.to_string() + ", " + _size_t_arg.to_string() + ", "
+ + _bool_arg.to_string() + ", " + _enum_arg.to_string();
+ }
- constrained_device_args_t::num_arg<double> _double_arg
- {"double_arg", DEFAULT_DOUBLE_ARG};
- constrained_device_args_t::num_arg<size_t> _size_t_arg
- {"size_t_arg", DEFAULT_SIZE_T_ARG};
- constrained_device_args_t::bool_arg _bool_arg
- {"bool_arg", DEFAULT_BOOL_ARG};
- constrained_device_args_t::enum_arg<test_enum_t> _enum_arg
- {"enum_arg", DEFAULT_ENUM_ARG,
- {{"value1", VALUE1}, {"value2", VALUE2}, {"VALUE3", VALUE3}}};
- };
+private:
+ virtual void _parse(const uhd::device_addr_t& dev_args)
+ {
+ if (dev_args.has_key(_double_arg.key()))
+ _double_arg.parse(dev_args[_double_arg.key()]);
+ if (dev_args.has_key(_size_t_arg.key()))
+ _size_t_arg.parse(dev_args[_size_t_arg.key()]);
+ if (dev_args.has_key(_bool_arg.key()))
+ _bool_arg.parse(dev_args[_bool_arg.key()]);
+ if (dev_args.has_key(_enum_arg.key()))
+ _enum_arg.parse(dev_args[_enum_arg.key()]);
+ _enforce_range(_double_arg, MIN_DOUBLE_ARG, MAX_DOUBLE_ARG);
+ }
-}
+ constrained_device_args_t::num_arg<double> _double_arg{
+ "double_arg", DEFAULT_DOUBLE_ARG};
+ constrained_device_args_t::num_arg<size_t> _size_t_arg{
+ "size_t_arg", DEFAULT_SIZE_T_ARG};
+ constrained_device_args_t::bool_arg _bool_arg{"bool_arg", DEFAULT_BOOL_ARG};
+ constrained_device_args_t::enum_arg<test_enum_t> _enum_arg{"enum_arg",
+ DEFAULT_ENUM_ARG,
+ {{"value1", VALUE1}, {"value2", VALUE2}, {"VALUE3", VALUE3}}};
+};
-BOOST_AUTO_TEST_CASE(test_constrained_device_args) {
+} // namespace
+
+BOOST_AUTO_TEST_CASE(test_constrained_device_args)
+{
test_device_args_t test_dev_args("double_arg=3.5,bool_arg=0,foo=bar");
BOOST_CHECK_EQUAL(test_dev_args.get_double_arg(), 3.5);
- BOOST_CHECK_EQUAL(
- test_dev_args.get_size_t_arg(),
- DEFAULT_SIZE_T_ARG
- );
+ BOOST_CHECK_EQUAL(test_dev_args.get_size_t_arg(), DEFAULT_SIZE_T_ARG);
BOOST_CHECK_EQUAL(test_dev_args.get_bool_arg(), false);
- BOOST_CHECK_EQUAL(
- test_dev_args.get_enum_arg(),
- DEFAULT_ENUM_ARG
- );
- BOOST_REQUIRE_THROW(
- test_dev_args.parse("double_arg=2e6"),
- uhd::value_error
- ); // Note: test_dev_args is now in a bad state until we fix it!
- test_dev_args.parse("double_arg=2.6"),
- test_dev_args.parse("enum_arg=vaLue2");
- BOOST_CHECK_EQUAL(
- test_dev_args.get_enum_arg(),
- VALUE2
- );
+ BOOST_CHECK_EQUAL(test_dev_args.get_enum_arg(), DEFAULT_ENUM_ARG);
+ BOOST_REQUIRE_THROW(test_dev_args.parse("double_arg=2e6"),
+ uhd::value_error); // Note: test_dev_args is now in a bad state until we fix it!
+ test_dev_args.parse("double_arg=2.6"), test_dev_args.parse("enum_arg=vaLue2");
+ BOOST_CHECK_EQUAL(test_dev_args.get_enum_arg(), VALUE2);
test_dev_args.parse("enum_arg=VALUE3");
- BOOST_CHECK_EQUAL(
- test_dev_args.get_enum_arg(),
- VALUE3
- );
+ BOOST_CHECK_EQUAL(test_dev_args.get_enum_arg(), VALUE3);
}
-
diff --git a/host/tests/convert_test.cpp b/host/tests/convert_test.cpp
index 862e02073..67409e310 100644
--- a/host/tests/convert_test.cpp
+++ b/host/tests/convert_test.cpp
@@ -6,52 +6,54 @@
//
#include <uhd/convert.hpp>
-#include <boost/test/unit_test.hpp>
#include <stdint.h>
+#include <boost/test/unit_test.hpp>
#include <complex>
-#include <vector>
#include <cstdlib>
#include <iostream>
+#include <vector>
using namespace uhd;
-//typedefs for complex types
+// typedefs for complex types
typedef std::complex<int16_t> sc16_t;
typedef std::complex<float> fc32_t;
typedef std::complex<double> fc64_t;
-#define MY_CHECK_CLOSE(a, b, f) { \
- BOOST_CHECK_MESSAGE(std::abs((a)-(b)) < f, "\n\t" << #a << " (" << (a) << ") error " << #b << " (" << (b) << ")"); \
-}
+#define MY_CHECK_CLOSE(a, b, f) \
+ { \
+ BOOST_CHECK_MESSAGE(std::abs((a) - (b)) < f, \
+ "\n\t" << #a << " (" << (a) << ") error " << #b << " (" << (b) << ")"); \
+ }
/***********************************************************************
* Loopback runner:
* convert input buffer into intermediate buffer
* convert intermediate buffer into output buffer
**********************************************************************/
-template <typename Range> static void loopback(
- size_t nsamps,
- convert::id_type &in_id,
- convert::id_type &out_id,
- const Range &input,
- Range &output,
- const int prio_in = -1,
- const int prio_out = -1
-){
- //make this buffer large enough for all test types
+template <typename Range>
+static void loopback(size_t nsamps,
+ convert::id_type& in_id,
+ convert::id_type& out_id,
+ const Range& input,
+ Range& output,
+ const int prio_in = -1,
+ const int prio_out = -1)
+{
+ // make this buffer large enough for all test types
std::vector<uint64_t> interm(nsamps);
- std::vector<const void *> input0(1, &input[0]), input1(1, &interm[0]);
- std::vector<void *> output0(1, &interm[0]), output1(1, &output[0]);
+ std::vector<const void*> input0(1, &input[0]), input1(1, &interm[0]);
+ std::vector<void*> output0(1, &interm[0]), output1(1, &output[0]);
- //convert to intermediate type
+ // convert to intermediate type
convert::converter::sptr c0 = convert::get_converter(in_id, prio_in)();
c0->set_scalar(32767.);
c0->conv(input0, output0, nsamps);
- //convert back to host type
+ // convert back to host type
convert::converter::sptr c1 = convert::get_converter(out_id, prio_out)();
- c1->set_scalar(1/32767.);
+ c1->set_scalar(1 / 32767.);
c1->conv(input1, output1, nsamps);
}
@@ -59,46 +61,51 @@ template <typename Range> static void loopback(
* Test short conversion
**********************************************************************/
static void test_convert_types_sc16(
- size_t nsamps, convert::id_type &id, const int extra_div = 1, int mask = 0xffff
-){
- //fill the input samples
+ size_t nsamps, convert::id_type& id, const int extra_div = 1, int mask = 0xffff)
+{
+ // fill the input samples
std::vector<sc16_t> input(nsamps), output(nsamps);
- for(sc16_t &in: input) in = sc16_t(
- short((float((std::rand())/(double(RAND_MAX)/2)) - 1)*32767/extra_div) & mask,
- short((float((std::rand())/(double(RAND_MAX)/2)) - 1)*32767/extra_div) & mask
- );
-
- //run the loopback and test
- convert::id_type in_id = id;
+ for (sc16_t& in : input)
+ in = sc16_t(
+ short((float((std::rand()) / (double(RAND_MAX) / 2)) - 1) * 32767 / extra_div)
+ & mask,
+ short((float((std::rand()) / (double(RAND_MAX) / 2)) - 1) * 32767 / extra_div)
+ & mask);
+
+ // run the loopback and test
+ convert::id_type in_id = id;
convert::id_type out_id = id;
std::swap(out_id.input_format, out_id.output_format);
std::swap(out_id.num_inputs, out_id.num_outputs);
loopback(nsamps, in_id, out_id, input, output);
- BOOST_CHECK_EQUAL_COLLECTIONS(input.begin(), input.end(), output.begin(), output.end());
+ BOOST_CHECK_EQUAL_COLLECTIONS(
+ input.begin(), input.end(), output.begin(), output.end());
}
-BOOST_AUTO_TEST_CASE(test_convert_types_be_sc16){
+BOOST_AUTO_TEST_CASE(test_convert_types_be_sc16)
+{
convert::id_type id;
- id.input_format = "sc16";
- id.num_inputs = 1;
+ id.input_format = "sc16";
+ id.num_inputs = 1;
id.output_format = "sc16_item32_be";
- id.num_outputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ // try various lengths to test edge cases
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_sc16(nsamps, id);
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_le_sc16){
+BOOST_AUTO_TEST_CASE(test_convert_types_le_sc16)
+{
convert::id_type id;
- id.input_format = "sc16";
- id.num_inputs = 1;
+ id.input_format = "sc16";
+ id.num_inputs = 1;
id.output_format = "sc16_item32_le";
- id.num_outputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ // try various lengths to test edge cases
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_sc16(nsamps, id);
}
}
@@ -108,90 +115,90 @@ BOOST_AUTO_TEST_CASE(test_convert_types_le_sc16){
**********************************************************************/
template <typename data_type>
static void test_convert_types_for_floats(
- size_t nsamps, convert::id_type &id, const double extra_scale = 1.0
-){
+ size_t nsamps, convert::id_type& id, const double extra_scale = 1.0)
+{
typedef typename data_type::value_type value_type;
- //fill the input samples
+ // fill the input samples
std::vector<data_type> input(nsamps), output(nsamps);
- for(data_type &in: input) in = data_type(
- ((std::rand()/(value_type(RAND_MAX)/2)) - 1)*float(extra_scale),
- ((std::rand()/(value_type(RAND_MAX)/2)) - 1)*float(extra_scale)
- );
+ for (data_type& in : input)
+ in = data_type(
+ ((std::rand() / (value_type(RAND_MAX) / 2)) - 1) * float(extra_scale),
+ ((std::rand() / (value_type(RAND_MAX) / 2)) - 1) * float(extra_scale));
- //run the loopback and test
- convert::id_type in_id = id;
+ // run the loopback and test
+ convert::id_type in_id = id;
convert::id_type out_id = id;
std::swap(out_id.input_format, out_id.output_format);
std::swap(out_id.num_inputs, out_id.num_outputs);
- //make a list of all prio: best/generic combos
+ // make a list of all prio: best/generic combos
typedef std::pair<int, int> int_pair_t;
const std::vector<int_pair_t> prios{
- int_pair_t(0, 0),
- int_pair_t(-1, 0),
- int_pair_t(0, -1),
- int_pair_t(-1, -1)
- };
-
- //loopback foreach prio combo (generic vs best)
- for (const auto &prio : prios) {
+ int_pair_t(0, 0), int_pair_t(-1, 0), int_pair_t(0, -1), int_pair_t(-1, -1)};
+
+ // loopback foreach prio combo (generic vs best)
+ for (const auto& prio : prios) {
loopback(nsamps, in_id, out_id, input, output, prio.first, prio.second);
- for (size_t i = 0; i < nsamps; i++){
- MY_CHECK_CLOSE(input[i].real(), output[i].real(), value_type(1./(1 << 14)));
- MY_CHECK_CLOSE(input[i].imag(), output[i].imag(), value_type(1./(1 << 14)));
+ for (size_t i = 0; i < nsamps; i++) {
+ MY_CHECK_CLOSE(input[i].real(), output[i].real(), value_type(1. / (1 << 14)));
+ MY_CHECK_CLOSE(input[i].imag(), output[i].imag(), value_type(1. / (1 << 14)));
}
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_be_fc32){
+BOOST_AUTO_TEST_CASE(test_convert_types_be_fc32)
+{
convert::id_type id;
- id.input_format = "fc32";
- id.num_inputs = 1;
+ id.input_format = "fc32";
+ id.num_inputs = 1;
id.output_format = "sc16_item32_be";
- id.num_outputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ // try various lengths to test edge cases
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_for_floats<fc32_t>(nsamps, id);
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_le_fc32){
+BOOST_AUTO_TEST_CASE(test_convert_types_le_fc32)
+{
convert::id_type id;
- id.input_format = "fc32";
- id.num_inputs = 1;
+ id.input_format = "fc32";
+ id.num_inputs = 1;
id.output_format = "sc16_item32_le";
- id.num_outputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ // try various lengths to test edge cases
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_for_floats<fc32_t>(nsamps, id);
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_be_fc64){
+BOOST_AUTO_TEST_CASE(test_convert_types_be_fc64)
+{
convert::id_type id;
- id.input_format = "fc64";
- id.num_inputs = 1;
+ id.input_format = "fc64";
+ id.num_inputs = 1;
id.output_format = "sc16_item32_be";
- id.num_outputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ // try various lengths to test edge cases
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_for_floats<fc64_t>(nsamps, id);
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_le_fc64){
+BOOST_AUTO_TEST_CASE(test_convert_types_le_fc64)
+{
convert::id_type id;
- id.input_format = "fc64";
- id.num_inputs = 1;
+ id.input_format = "fc64";
+ id.num_inputs = 1;
id.output_format = "sc16_item32_le";
- id.num_outputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ // try various lengths to test edge cases
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_for_floats<fc64_t>(nsamps, id);
}
}
@@ -200,53 +207,57 @@ BOOST_AUTO_TEST_CASE(test_convert_types_le_fc64){
* Test float to/from sc12 conversion loopback
**********************************************************************/
-BOOST_AUTO_TEST_CASE(test_convert_types_le_sc12_with_fc32){
+BOOST_AUTO_TEST_CASE(test_convert_types_le_sc12_with_fc32)
+{
convert::id_type id;
- id.input_format = "fc32";
- id.num_inputs = 1;
+ id.input_format = "fc32";
+ id.num_inputs = 1;
id.output_format = "sc12_item32_le";
- id.num_outputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
- test_convert_types_for_floats<fc32_t>(nsamps, id, 1./16);
+ // try various lengths to test edge cases
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
+ test_convert_types_for_floats<fc32_t>(nsamps, id, 1. / 16);
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_be_sc12_with_fc32){
+BOOST_AUTO_TEST_CASE(test_convert_types_be_sc12_with_fc32)
+{
convert::id_type id;
- id.input_format = "fc32";
- id.num_inputs = 1;
+ id.input_format = "fc32";
+ id.num_inputs = 1;
id.output_format = "sc12_item32_be";
- id.num_outputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
- test_convert_types_for_floats<fc32_t>(nsamps, id, 1./16);
+ // try various lengths to test edge cases
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
+ test_convert_types_for_floats<fc32_t>(nsamps, id, 1. / 16);
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_le_sc16_and_sc12){
+BOOST_AUTO_TEST_CASE(test_convert_types_le_sc16_and_sc12)
+{
convert::id_type id;
id.input_format = "sc16";
- id.num_inputs = 1;
- id.num_outputs = 1;
+ id.num_inputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "sc12_item32_le";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_sc16(nsamps, id, 1, 0xfff0);
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_be_sc16_and_sc12){
+BOOST_AUTO_TEST_CASE(test_convert_types_be_sc16_and_sc12)
+{
convert::id_type id;
id.input_format = "sc16";
- id.num_inputs = 1;
- id.num_outputs = 1;
+ id.num_inputs = 1;
+ id.num_outputs = 1;
id.output_format = "sc12_item32_be";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_sc16(nsamps, id, 1, 0xfff0);
}
}
@@ -255,28 +266,30 @@ BOOST_AUTO_TEST_CASE(test_convert_types_be_sc16_and_sc12){
* Test float to/from fc32 conversion loopback
**********************************************************************/
-BOOST_AUTO_TEST_CASE(test_convert_types_le_fc32_with_fc32){
+BOOST_AUTO_TEST_CASE(test_convert_types_le_fc32_with_fc32)
+{
convert::id_type id;
- id.input_format = "fc32";
- id.num_inputs = 1;
+ id.input_format = "fc32";
+ id.num_inputs = 1;
id.output_format = "fc32_item32_le";
- id.num_outputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ // try various lengths to test edge cases
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_for_floats<fc32_t>(nsamps, id);
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_be_fc32_with_fc32){
+BOOST_AUTO_TEST_CASE(test_convert_types_be_fc32_with_fc32)
+{
convert::id_type id;
- id.input_format = "fc32";
- id.num_inputs = 1;
+ id.input_format = "fc32";
+ id.num_inputs = 1;
id.output_format = "fc32_item32_be";
- id.num_outputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ // try various lengths to test edge cases
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_for_floats<fc32_t>(nsamps, id);
}
}
@@ -284,149 +297,151 @@ BOOST_AUTO_TEST_CASE(test_convert_types_be_fc32_with_fc32){
/***********************************************************************
* Test float to short conversion loopback
**********************************************************************/
-BOOST_AUTO_TEST_CASE(test_convert_types_fc32_to_sc16){
+BOOST_AUTO_TEST_CASE(test_convert_types_fc32_to_sc16)
+{
convert::id_type in_id;
- in_id.input_format = "fc32";
- in_id.num_inputs = 1;
+ in_id.input_format = "fc32";
+ in_id.num_inputs = 1;
in_id.output_format = "sc16_item32_le";
- in_id.num_outputs = 1;
+ in_id.num_outputs = 1;
convert::id_type out_id;
- out_id.input_format = "sc16_item32_le";
- out_id.num_inputs = 1;
+ out_id.input_format = "sc16_item32_le";
+ out_id.num_inputs = 1;
out_id.output_format = "sc16";
- out_id.num_outputs = 1;
+ out_id.num_outputs = 1;
const size_t nsamps = 13;
std::vector<fc32_t> input(nsamps);
- for(fc32_t &in: input) in = fc32_t(
- (std::rand()/(RAND_MAX/2.0)) - 1,
- (std::rand()/(RAND_MAX/2.0)) - 1
- );
+ for (fc32_t& in : input)
+ in = fc32_t(
+ (std::rand() / (RAND_MAX / 2.0)) - 1, (std::rand() / (RAND_MAX / 2.0)) - 1);
std::vector<uint32_t> interm(nsamps);
std::vector<sc16_t> output(nsamps);
- std::vector<const void *> input0(1, &input[0]), input1(1, &interm[0]);
- std::vector<void *> output0(1, &interm[0]), output1(1, &output[0]);
+ std::vector<const void*> input0(1, &input[0]), input1(1, &interm[0]);
+ std::vector<void*> output0(1, &interm[0]), output1(1, &output[0]);
- //convert float to intermediate
+ // convert float to intermediate
convert::converter::sptr c0 = convert::get_converter(in_id)();
c0->set_scalar(32767.);
c0->conv(input0, output0, nsamps);
- //convert intermediate to short
+ // convert intermediate to short
convert::converter::sptr c1 = convert::get_converter(out_id)();
- c1->set_scalar(1/32767.);
+ c1->set_scalar(1 / 32767.);
c1->conv(input1, output1, nsamps);
- //test that the inputs and outputs match
- for (size_t i = 0; i < nsamps; i++){
- MY_CHECK_CLOSE(input[i].real(), output[i].real()/float(32767), float(0.01));
- MY_CHECK_CLOSE(input[i].imag(), output[i].imag()/float(32767), float(0.01));
+ // test that the inputs and outputs match
+ for (size_t i = 0; i < nsamps; i++) {
+ MY_CHECK_CLOSE(input[i].real(), output[i].real() / float(32767), float(0.01));
+ MY_CHECK_CLOSE(input[i].imag(), output[i].imag() / float(32767), float(0.01));
}
}
/***********************************************************************
* Test short to float conversion loopback
**********************************************************************/
-BOOST_AUTO_TEST_CASE(test_convert_types_sc16_to_fc32){
+BOOST_AUTO_TEST_CASE(test_convert_types_sc16_to_fc32)
+{
convert::id_type in_id;
- in_id.input_format = "sc16";
- in_id.num_inputs = 1;
+ in_id.input_format = "sc16";
+ in_id.num_inputs = 1;
in_id.output_format = "sc16_item32_le";
- in_id.num_outputs = 1;
+ in_id.num_outputs = 1;
convert::id_type out_id;
- out_id.input_format = "sc16_item32_le";
- out_id.num_inputs = 1;
+ out_id.input_format = "sc16_item32_le";
+ out_id.num_inputs = 1;
out_id.output_format = "fc32";
- out_id.num_outputs = 1;
+ out_id.num_outputs = 1;
const size_t nsamps = 13;
std::vector<sc16_t> input(nsamps);
- for(sc16_t &in: input) in = sc16_t(
- std::rand()-(RAND_MAX/2),
- std::rand()-(RAND_MAX/2)
- );
+ for (sc16_t& in : input)
+ in = sc16_t(std::rand() - (RAND_MAX / 2), std::rand() - (RAND_MAX / 2));
std::vector<uint32_t> interm(nsamps);
std::vector<fc32_t> output(nsamps);
- std::vector<const void *> input0(1, &input[0]), input1(1, &interm[0]);
- std::vector<void *> output0(1, &interm[0]), output1(1, &output[0]);
+ std::vector<const void*> input0(1, &input[0]), input1(1, &interm[0]);
+ std::vector<void*> output0(1, &interm[0]), output1(1, &output[0]);
- //convert short to intermediate
+ // convert short to intermediate
convert::converter::sptr c0 = convert::get_converter(in_id)();
c0->set_scalar(32767.);
c0->conv(input0, output0, nsamps);
- //convert intermediate to float
+ // convert intermediate to float
convert::converter::sptr c1 = convert::get_converter(out_id)();
- c1->set_scalar(1/32767.);
+ c1->set_scalar(1 / 32767.);
c1->conv(input1, output1, nsamps);
- //test that the inputs and outputs match
- for (size_t i = 0; i < nsamps; i++){
- MY_CHECK_CLOSE(input[i].real()/float(32767), output[i].real(), float(0.01));
- MY_CHECK_CLOSE(input[i].imag()/float(32767), output[i].imag(), float(0.01));
+ // test that the inputs and outputs match
+ for (size_t i = 0; i < nsamps; i++) {
+ MY_CHECK_CLOSE(input[i].real() / float(32767), output[i].real(), float(0.01));
+ MY_CHECK_CLOSE(input[i].imag() / float(32767), output[i].imag(), float(0.01));
}
}
/***********************************************************************
* Test sc8 conversions
**********************************************************************/
-BOOST_AUTO_TEST_CASE(test_convert_types_fc64_and_sc8){
+BOOST_AUTO_TEST_CASE(test_convert_types_fc64_and_sc8)
+{
convert::id_type id;
id.input_format = "fc64";
- id.num_inputs = 1;
- id.num_outputs = 1;
+ id.num_inputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "sc8_item32_le";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
- test_convert_types_for_floats<fc64_t>(nsamps, id, 1./256);
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
+ test_convert_types_for_floats<fc64_t>(nsamps, id, 1. / 256);
}
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "sc8_item32_be";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
- test_convert_types_for_floats<fc64_t>(nsamps, id, 1./256);
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
+ test_convert_types_for_floats<fc64_t>(nsamps, id, 1. / 256);
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_fc32_and_sc8){
+BOOST_AUTO_TEST_CASE(test_convert_types_fc32_and_sc8)
+{
convert::id_type id;
id.input_format = "fc32";
- id.num_inputs = 1;
- id.num_outputs = 1;
+ id.num_inputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "sc8_item32_le";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
- test_convert_types_for_floats<fc32_t>(nsamps, id, 1./256);
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
+ test_convert_types_for_floats<fc32_t>(nsamps, id, 1. / 256);
}
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "sc8_item32_be";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
- test_convert_types_for_floats<fc32_t>(nsamps, id, 1./256);
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
+ test_convert_types_for_floats<fc32_t>(nsamps, id, 1. / 256);
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_sc16_and_sc8){
+BOOST_AUTO_TEST_CASE(test_convert_types_sc16_and_sc8)
+{
convert::id_type id;
id.input_format = "sc16";
- id.num_inputs = 1;
- id.num_outputs = 1;
+ id.num_inputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "sc8_item32_le";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_sc16(nsamps, id, 256);
}
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "sc8_item32_be";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_sc16(nsamps, id, 256);
}
}
@@ -434,39 +449,41 @@ BOOST_AUTO_TEST_CASE(test_convert_types_sc16_and_sc8){
/***********************************************************************
* Test u8 conversion
**********************************************************************/
-static void test_convert_types_u8(
- size_t nsamps, convert::id_type &id
-){
- //fill the input samples
+static void test_convert_types_u8(size_t nsamps, convert::id_type& id)
+{
+ // fill the input samples
std::vector<uint8_t> input(nsamps), output(nsamps);
- for(uint8_t &in: input) in = uint8_t(std::rand() & 0xFF);
- //uint32_t d = 48;
- //for(uint8_t &in: input) in = d++;
+ for (uint8_t& in : input)
+ in = uint8_t(std::rand() & 0xFF);
+ // uint32_t d = 48;
+ // for(uint8_t &in: input) in = d++;
- //run the loopback and test
- convert::id_type in_id = id;
+ // run the loopback and test
+ convert::id_type in_id = id;
convert::id_type out_id = id;
std::swap(out_id.input_format, out_id.output_format);
std::swap(out_id.num_inputs, out_id.num_outputs);
loopback(nsamps, in_id, out_id, input, output);
- BOOST_CHECK_EQUAL_COLLECTIONS(input.begin(), input.end(), output.begin(), output.end());
+ BOOST_CHECK_EQUAL_COLLECTIONS(
+ input.begin(), input.end(), output.begin(), output.end());
}
-BOOST_AUTO_TEST_CASE(test_convert_types_u8_and_u8){
+BOOST_AUTO_TEST_CASE(test_convert_types_u8_and_u8)
+{
convert::id_type id;
id.input_format = "u8";
- id.num_inputs = 1;
- id.num_outputs = 1;
+ id.num_inputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "u8_item32_le";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_u8(nsamps, id);
}
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "u8_item32_be";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_u8(nsamps, id);
}
}
@@ -474,37 +491,39 @@ BOOST_AUTO_TEST_CASE(test_convert_types_u8_and_u8){
/***********************************************************************
* Test s8 conversion
**********************************************************************/
-static void test_convert_types_s8(
- size_t nsamps, convert::id_type &id
-){
- //fill the input samples
+static void test_convert_types_s8(size_t nsamps, convert::id_type& id)
+{
+ // fill the input samples
std::vector<int8_t> input(nsamps), output(nsamps);
- for(int8_t &in: input) in = int8_t(std::rand() & 0xFF);
+ for (int8_t& in : input)
+ in = int8_t(std::rand() & 0xFF);
- //run the loopback and test
- convert::id_type in_id = id;
+ // run the loopback and test
+ convert::id_type in_id = id;
convert::id_type out_id = id;
std::swap(out_id.input_format, out_id.output_format);
std::swap(out_id.num_inputs, out_id.num_outputs);
loopback(nsamps, in_id, out_id, input, output);
- BOOST_CHECK_EQUAL_COLLECTIONS(input.begin(), input.end(), output.begin(), output.end());
+ BOOST_CHECK_EQUAL_COLLECTIONS(
+ input.begin(), input.end(), output.begin(), output.end());
}
-BOOST_AUTO_TEST_CASE(test_convert_types_s8_and_s8){
+BOOST_AUTO_TEST_CASE(test_convert_types_s8_and_s8)
+{
convert::id_type id;
id.input_format = "s8";
- id.num_inputs = 1;
- id.num_outputs = 1;
+ id.num_inputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "s8_item32_le";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_s8(nsamps, id);
}
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "s8_item32_be";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_s8(nsamps, id);
}
}
@@ -512,37 +531,39 @@ BOOST_AUTO_TEST_CASE(test_convert_types_s8_and_s8){
/***********************************************************************
* Test s16 conversion
**********************************************************************/
-static void test_convert_types_s16(
- size_t nsamps, convert::id_type &id
-){
- //fill the input samples
+static void test_convert_types_s16(size_t nsamps, convert::id_type& id)
+{
+ // fill the input samples
std::vector<int16_t> input(nsamps), output(nsamps);
- for(int16_t &in: input) in = int16_t(std::rand() & 0xFFFF);
+ for (int16_t& in : input)
+ in = int16_t(std::rand() & 0xFFFF);
- //run the loopback and test
- convert::id_type in_id = id;
+ // run the loopback and test
+ convert::id_type in_id = id;
convert::id_type out_id = id;
std::swap(out_id.input_format, out_id.output_format);
std::swap(out_id.num_inputs, out_id.num_outputs);
loopback(nsamps, in_id, out_id, input, output);
- BOOST_CHECK_EQUAL_COLLECTIONS(input.begin(), input.end(), output.begin(), output.end());
+ BOOST_CHECK_EQUAL_COLLECTIONS(
+ input.begin(), input.end(), output.begin(), output.end());
}
-BOOST_AUTO_TEST_CASE(test_convert_types_s16_and_s16){
+BOOST_AUTO_TEST_CASE(test_convert_types_s16_and_s16)
+{
convert::id_type id;
id.input_format = "s16";
- id.num_inputs = 1;
- id.num_outputs = 1;
+ id.num_inputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "s16_item32_le";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_s16(nsamps, id);
}
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "s16_item32_be";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_s16(nsamps, id);
}
}
@@ -550,43 +571,42 @@ BOOST_AUTO_TEST_CASE(test_convert_types_s16_and_s16){
/***********************************************************************
* Test fc32 -> fc32 conversion
**********************************************************************/
-static void test_convert_types_fc32(
- size_t nsamps, convert::id_type &id
-){
- //fill the input samples
- std::vector< std::complex<float> > input(nsamps), output(nsamps);
- for(fc32_t &in: input) in = fc32_t(
- (std::rand()/float(RAND_MAX/2)) - 1,
- (std::rand()/float(RAND_MAX/2)) - 1
- );
-
- //run the loopback and test
- convert::id_type in_id = id;
+static void test_convert_types_fc32(size_t nsamps, convert::id_type& id)
+{
+ // fill the input samples
+ std::vector<std::complex<float>> input(nsamps), output(nsamps);
+ for (fc32_t& in : input)
+ in = fc32_t((std::rand() / float(RAND_MAX / 2)) - 1,
+ (std::rand() / float(RAND_MAX / 2)) - 1);
+
+ // run the loopback and test
+ convert::id_type in_id = id;
convert::id_type out_id = id;
std::swap(out_id.input_format, out_id.output_format);
std::swap(out_id.num_inputs, out_id.num_outputs);
loopback(nsamps, in_id, out_id, input, output);
- for (size_t i = 0; i < nsamps; i++){
- MY_CHECK_CLOSE(input[i].real(), output[i].real(), float(1./(1 << 16)));
- MY_CHECK_CLOSE(input[i].imag(), output[i].imag(), float(1./(1 << 16)));
+ for (size_t i = 0; i < nsamps; i++) {
+ MY_CHECK_CLOSE(input[i].real(), output[i].real(), float(1. / (1 << 16)));
+ MY_CHECK_CLOSE(input[i].imag(), output[i].imag(), float(1. / (1 << 16)));
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_fc32_and_fc32){
+BOOST_AUTO_TEST_CASE(test_convert_types_fc32_and_fc32)
+{
convert::id_type id;
id.input_format = "fc32";
- id.num_inputs = 1;
- id.num_outputs = 1;
+ id.num_inputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "fc32_item32_le";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_fc32(nsamps, id);
}
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "fc32_item32_be";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_fc32(nsamps, id);
}
}
@@ -594,39 +614,40 @@ BOOST_AUTO_TEST_CASE(test_convert_types_fc32_and_fc32){
/***********************************************************************
* Test f32 -> f32 conversion
**********************************************************************/
-static void test_convert_types_f32(
- size_t nsamps, convert::id_type &id
-){
- //fill the input samples
+static void test_convert_types_f32(size_t nsamps, convert::id_type& id)
+{
+ // fill the input samples
std::vector<float> input(nsamps), output(nsamps);
- for(float &in: input) in = float((float(std::rand())/float(RAND_MAX/2)) - 1);
+ for (float& in : input)
+ in = float((float(std::rand()) / float(RAND_MAX / 2)) - 1);
- //run the loopback and test
- convert::id_type in_id = id;
+ // run the loopback and test
+ convert::id_type in_id = id;
convert::id_type out_id = id;
std::swap(out_id.input_format, out_id.output_format);
std::swap(out_id.num_inputs, out_id.num_outputs);
loopback(nsamps, in_id, out_id, input, output);
- for (size_t i = 0; i < nsamps; i++){
- MY_CHECK_CLOSE(input[i], output[i], float(1./(1 << 16)));
+ for (size_t i = 0; i < nsamps; i++) {
+ MY_CHECK_CLOSE(input[i], output[i], float(1. / (1 << 16)));
}
}
-BOOST_AUTO_TEST_CASE(test_convert_types_f32_and_f32){
+BOOST_AUTO_TEST_CASE(test_convert_types_f32_and_f32)
+{
convert::id_type id;
id.input_format = "f32";
- id.num_inputs = 1;
- id.num_outputs = 1;
+ id.num_inputs = 1;
+ id.num_outputs = 1;
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "f32_item32_le";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_f32(nsamps, id);
}
- //try various lengths to test edge cases
+ // try various lengths to test edge cases
id.output_format = "f32_item32_be";
- for (size_t nsamps = 1; nsamps < 16; nsamps++){
+ for (size_t nsamps = 1; nsamps < 16; nsamps++) {
test_convert_types_f32(nsamps, id);
}
}
diff --git a/host/tests/device3_test.cpp b/host/tests/device3_test.cpp
index 71b3225e1..43f5fe45b 100644
--- a/host/tests/device3_test.cpp
+++ b/host/tests/device3_test.cpp
@@ -6,8 +6,8 @@
//
-#include "mock_zero_copy.hpp"
#include "mock_ctrl_iface_impl.hpp"
+#include "mock_zero_copy.hpp"
#include <uhd/device3.hpp>
#include <uhd/property_tree.hpp>
#include <uhd/rfnoc/block_ctrl.hpp>
@@ -20,17 +20,17 @@
#include <iostream>
-
using namespace uhd;
using namespace uhd::rfnoc;
using namespace uhd::transport::vrt;
-using uhd::transport::managed_send_buffer;
using uhd::transport::managed_recv_buffer;
+using uhd::transport::managed_send_buffer;
static const sid_t TEST_SID0 = 0x00000200; // 0.0.2.0
static const sid_t TEST_SID1 = 0x00000210; // 0.0.2.F
-uhd::both_xports_t make_mock_transport(const uhd::sid_t& tx_sid) {
+uhd::both_xports_t make_mock_transport(const uhd::sid_t& tx_sid)
+{
uhd::both_xports_t xports;
xports.send_sid = tx_sid;
xports.recv_sid = tx_sid.reversed();
@@ -42,60 +42,59 @@ uhd::both_xports_t make_mock_transport(const uhd::sid_t& tx_sid) {
}
// Mock-device
-class mock_device3_impl : public uhd::device3, public boost::enable_shared_from_this<mock_device3_impl>
+class mock_device3_impl : public uhd::device3,
+ public boost::enable_shared_from_this<mock_device3_impl>
{
- public:
+public:
mock_device3_impl()
{
_tree = uhd::property_tree::make();
_tree->create<std::string>("/name").set("Test Mock-Device3");
// We can re-use this:
std::map<size_t, ctrl_iface::sptr> ctrl_ifaces{
- {0, ctrl_iface::sptr(new mock_ctrl_iface_impl())}
- };
+ {0, ctrl_iface::sptr(new mock_ctrl_iface_impl())}};
// Add two block controls:
uhd::rfnoc::make_args_t make_args;
- make_args.ctrl_ifaces = ctrl_ifaces;
+ make_args.ctrl_ifaces = ctrl_ifaces;
make_args.base_address = TEST_SID0.get_dst();
make_args.device_index = 0;
- make_args.tree = _tree;
+ make_args.tree = _tree;
std::cout << "[MOCK] Generating block controls 1/2:" << std::endl;
- _rfnoc_block_ctrl.push_back( block_ctrl_base::make(make_args) );
+ _rfnoc_block_ctrl.push_back(block_ctrl_base::make(make_args));
std::cout << "[MOCK] Generating block controls 2/2:" << std::endl;
make_args.base_address = TEST_SID1.get_dst();
- _rfnoc_block_ctrl.push_back( block_ctrl::make(make_args) );
+ _rfnoc_block_ctrl.push_back(block_ctrl::make(make_args));
}
- rx_streamer::sptr get_rx_stream(const stream_args_t &args) {
+ rx_streamer::sptr get_rx_stream(const stream_args_t& args)
+ {
throw uhd::not_implemented_error(args.args.to_string());
}
- tx_streamer::sptr get_tx_stream(const stream_args_t &args) {
+ tx_streamer::sptr get_tx_stream(const stream_args_t& args)
+ {
throw uhd::not_implemented_error(args.args.to_string());
}
- bool recv_async_msg(async_metadata_t &async_metadata, double timeout) {
- throw uhd::not_implemented_error(str(boost::format("%d %f") % async_metadata.channel % timeout));
+ bool recv_async_msg(async_metadata_t& async_metadata, double timeout)
+ {
+ throw uhd::not_implemented_error(
+ str(boost::format("%d %f") % async_metadata.channel % timeout));
}
- rfnoc::graph::sptr create_graph(const std::string &name)
+ rfnoc::graph::sptr create_graph(const std::string& name)
{
sid_t async_sid(0);
async_sid.set_dst_addr(2);
auto async_xports = make_mock_transport(async_sid);
- auto async_msg_handler = uhd::rfnoc::async_msg_handler::make(
- async_xports.recv,
+ auto async_msg_handler = uhd::rfnoc::async_msg_handler::make(async_xports.recv,
async_xports.send,
async_xports.send_sid,
- async_xports.endianness
- );
- auto graph = boost::make_shared<uhd::rfnoc::graph_impl>(
- name,
- shared_from_this(),
- async_msg_handler
- );
+ async_xports.endianness);
+ auto graph = boost::make_shared<uhd::rfnoc::graph_impl>(
+ name, shared_from_this(), async_msg_handler);
return graph;
}
};
@@ -105,18 +104,21 @@ device3::sptr make_mock_device()
return device3::sptr(new mock_device3_impl());
}
-class mock_block_ctrl : public block_ctrl {
+class mock_block_ctrl : public block_ctrl
+{
int foo;
};
-BOOST_AUTO_TEST_CASE(test_device3) {
+BOOST_AUTO_TEST_CASE(test_device3)
+{
device3::sptr my_device = make_mock_device();
std::cout << "Checking block 0..." << std::endl;
BOOST_REQUIRE(my_device->find_blocks("Block").size());
std::cout << "Getting block 0..." << std::endl;
- block_ctrl_base::sptr block0 = my_device->get_block_ctrl(my_device->find_blocks("Block")[0]);
+ block_ctrl_base::sptr block0 =
+ my_device->get_block_ctrl(my_device->find_blocks("Block")[0]);
BOOST_REQUIRE(block0);
BOOST_CHECK_EQUAL(block0->get_block_id(), "0/Block_0");
@@ -130,7 +132,8 @@ BOOST_AUTO_TEST_CASE(test_device3) {
}
-BOOST_AUTO_TEST_CASE(test_device3_graph) {
+BOOST_AUTO_TEST_CASE(test_device3_graph)
+{
auto my_device = make_mock_device();
std::cout << "Start device3 test graph.." << std::endl;
std::cout << "Checking block 0..." << std::endl;
@@ -153,28 +156,33 @@ BOOST_AUTO_TEST_CASE(test_device3_graph) {
std::cout << "Connecting block_0 to block_1 ..." << std::endl;
graph->connect(block_id_t("0/Block_0"), 0, block_id_t("0/Block_1"), 0);
- BOOST_CHECK_EQUAL(block0->list_upstream_nodes().size(),0);
- BOOST_CHECK_EQUAL(block0->list_downstream_nodes().size(),1);
- BOOST_CHECK_EQUAL(block0->list_downstream_nodes()[0].lock()->unique_id(),"0/Block_1");
- BOOST_CHECK_EQUAL(block1->list_upstream_nodes().size(),1);
- BOOST_CHECK_EQUAL(block1->list_downstream_nodes().size(),0);
- BOOST_CHECK_EQUAL(block1->list_upstream_nodes()[0].lock()->unique_id(),"0/Block_0");
+ BOOST_CHECK_EQUAL(block0->list_upstream_nodes().size(), 0);
+ BOOST_CHECK_EQUAL(block0->list_downstream_nodes().size(), 1);
+ BOOST_CHECK_EQUAL(
+ block0->list_downstream_nodes()[0].lock()->unique_id(), "0/Block_1");
+ BOOST_CHECK_EQUAL(block1->list_upstream_nodes().size(), 1);
+ BOOST_CHECK_EQUAL(block1->list_downstream_nodes().size(), 0);
+ BOOST_CHECK_EQUAL(block1->list_upstream_nodes()[0].lock()->unique_id(), "0/Block_0");
}
-BOOST_AUTO_TEST_CASE(test_device3_cast) {
+BOOST_AUTO_TEST_CASE(test_device3_cast)
+{
device3::sptr my_device = make_mock_device();
std::cout << "Getting block 0..." << std::endl;
- block_ctrl::sptr block0 = my_device->get_block_ctrl<block_ctrl>(block_id_t("0/Block_0"));
+ block_ctrl::sptr block0 =
+ my_device->get_block_ctrl<block_ctrl>(block_id_t("0/Block_0"));
BOOST_REQUIRE(block0);
BOOST_CHECK_EQUAL(block0->get_block_id(), "0/Block_0");
std::cout << "Getting block 1..." << std::endl;
- block_ctrl_base::sptr block1 = my_device->get_block_ctrl<block_ctrl>(block_id_t("0/Block_1"));
+ block_ctrl_base::sptr block1 =
+ my_device->get_block_ctrl<block_ctrl>(block_id_t("0/Block_1"));
BOOST_CHECK_EQUAL(block1->get_block_id(), "0/Block_1");
}
-BOOST_AUTO_TEST_CASE(test_device3_fail) {
+BOOST_AUTO_TEST_CASE(test_device3_fail)
+{
device3::sptr my_device = make_mock_device();
BOOST_CHECK(not my_device->has_block(block_id_t("0/FooBarBlock_0")));
@@ -184,13 +192,10 @@ BOOST_AUTO_TEST_CASE(test_device3_fail) {
BOOST_CHECK(my_device->find_blocks<block_ctrl>("FooBarBlock").size() == 0);
BOOST_REQUIRE_THROW(
- my_device->get_block_ctrl(block_id_t("0/FooBarBlock_17")),
- uhd::lookup_error
- );
+ my_device->get_block_ctrl(block_id_t("0/FooBarBlock_17")), uhd::lookup_error);
BOOST_REQUIRE_THROW(
my_device->get_block_ctrl<mock_block_ctrl>(block_id_t("0/Block_1")),
- uhd::lookup_error
- );
+ uhd::lookup_error);
}
// vim: sw=4 et:
diff --git a/host/tests/dict_test.cpp b/host/tests/dict_test.cpp
index 53432d533..99fc2366c 100644
--- a/host/tests/dict_test.cpp
+++ b/host/tests/dict_test.cpp
@@ -5,15 +5,16 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/types/dict.hpp>
#include <boost/assign/list_of.hpp>
+#include <boost/test/unit_test.hpp>
-BOOST_AUTO_TEST_CASE(test_dict_init){
+BOOST_AUTO_TEST_CASE(test_dict_init)
+{
uhd::dict<int, int> d;
d[-1] = 3;
- d[0] = 4;
- d[1] = 5;
+ d[0] = 4;
+ d[1] = 5;
BOOST_CHECK(d.has_key(0));
BOOST_CHECK(not d.has_key(2));
BOOST_CHECK(d.keys()[1] == 0);
@@ -21,12 +22,9 @@ BOOST_AUTO_TEST_CASE(test_dict_init){
BOOST_CHECK_EQUAL(d[-1], 3);
}
-BOOST_AUTO_TEST_CASE(test_dict_assign){
- uhd::dict<int, int> d = boost::assign::map_list_of
- (-1, 3)
- (0, 4)
- (1, 5)
- ;
+BOOST_AUTO_TEST_CASE(test_dict_assign)
+{
+ uhd::dict<int, int> d = boost::assign::map_list_of(-1, 3)(0, 4)(1, 5);
BOOST_CHECK(d.has_key(0));
BOOST_CHECK(not d.has_key(2));
BOOST_CHECK(d.keys()[1] == 0);
@@ -34,12 +32,9 @@ BOOST_AUTO_TEST_CASE(test_dict_assign){
BOOST_CHECK_EQUAL(d[-1], 3);
}
-BOOST_AUTO_TEST_CASE(test_const_dict){
- const uhd::dict<int, int> d = boost::assign::map_list_of
- (-1, 3)
- (0, 4)
- (1, 5)
- ;
+BOOST_AUTO_TEST_CASE(test_const_dict)
+{
+ const uhd::dict<int, int> d = boost::assign::map_list_of(-1, 3)(0, 4)(1, 5);
BOOST_CHECK(d.has_key(0));
BOOST_CHECK(not d.has_key(2));
BOOST_CHECK(d.keys()[1] == 0);
@@ -48,12 +43,9 @@ BOOST_AUTO_TEST_CASE(test_const_dict){
BOOST_CHECK_THROW(d[2], std::exception);
}
-BOOST_AUTO_TEST_CASE(test_dict_pop){
- uhd::dict<int, int> d = boost::assign::map_list_of
- (-1, 3)
- (0, 4)
- (1, 5)
- ;
+BOOST_AUTO_TEST_CASE(test_dict_pop)
+{
+ uhd::dict<int, int> d = boost::assign::map_list_of(-1, 3)(0, 4)(1, 5);
BOOST_CHECK(d.has_key(0));
BOOST_CHECK_EQUAL(d.pop(0), 4);
BOOST_CHECK(not d.has_key(0));
@@ -63,24 +55,18 @@ BOOST_AUTO_TEST_CASE(test_dict_pop){
BOOST_AUTO_TEST_CASE(test_dict_update)
{
- uhd::dict<std::string, std::string> d1 = boost::assign::map_list_of
- ("key1", "val1")
- ("key2", "val2")
- ;
- uhd::dict<std::string, std::string> d2 = boost::assign::map_list_of
- ("key2", "val2x")
- ("key3", "val3")
- ;
+ uhd::dict<std::string, std::string> d1 =
+ boost::assign::map_list_of("key1", "val1")("key2", "val2");
+ uhd::dict<std::string, std::string> d2 =
+ boost::assign::map_list_of("key2", "val2x")("key3", "val3");
d1.update(d2, false /* don't throw cause of conflict */);
BOOST_CHECK_EQUAL(d1["key1"], "val1");
BOOST_CHECK_EQUAL(d1["key2"], "val2x");
BOOST_CHECK_EQUAL(d1["key3"], "val3");
- uhd::dict<std::string, std::string> d3 = boost::assign::map_list_of
- ("key1", "val1")
- ("key2", "val2")
- ;
+ uhd::dict<std::string, std::string> d3 =
+ boost::assign::map_list_of("key1", "val1")("key2", "val2");
BOOST_CHECK_THROW(d3.update(d2), uhd::value_error);
}
@@ -121,6 +107,6 @@ BOOST_AUTO_TEST_CASE(test_dict_equals)
BOOST_CHECK(d0 != d4);
BOOST_CHECK(d0 != d5);
// Redundant, but just to be sure
- BOOST_CHECK(not (d0 == d2));
- BOOST_CHECK(not (d0 == d3));
+ BOOST_CHECK(not(d0 == d2));
+ BOOST_CHECK(not(d0 == d3));
}
diff --git a/host/tests/dpdk_test.cpp b/host/tests/dpdk_test.cpp
index 8a4e51af7..43ef3d388 100644
--- a/host/tests/dpdk_test.cpp
+++ b/host/tests/dpdk_test.cpp
@@ -8,18 +8,18 @@
*/
-#include <cstdio>
-#include <cstdbool>
-#include <cstring>
-#include <unistd.h>
-#include <sys/time.h>
-#include <errno.h>
+#include "../transport/dpdk_zero_copy.hpp"
#include <arpa/inet.h>
+#include <errno.h>
#include <sched.h>
#include <sys/syscall.h>
-#include "../transport/dpdk_zero_copy.hpp"
+#include <sys/time.h>
+#include <unistd.h>
#include <boost/program_options.hpp>
#include <boost/regex.hpp>
+#include <cstdbool>
+#include <cstdio>
+#include <cstring>
#include <iostream>
static const boost::regex colons(":");
@@ -27,28 +27,30 @@ static const boost::regex colons(":");
namespace po = boost::program_options;
namespace {
- constexpr unsigned int NUM_MBUFS = 4095; /* Total number of mbufs in pool */
- constexpr unsigned int MBUF_CACHE_SIZE = 315; /* Size of cpu-local mbuf cache */
- constexpr unsigned int BURST_SIZE = 64; /* Maximum burst size for RX */
-
- constexpr unsigned int NUM_PORTS = 2; /* Number of NIC ports */
- constexpr unsigned int TX_CREDITS = 28; /* Number of TX credits */
- constexpr unsigned int RX_CREDITS = 64; /* Number of RX credits */
- constexpr unsigned int BENCH_SPP = 700; /* "Samples" per packet */
-}
+constexpr unsigned int NUM_MBUFS = 4095; /* Total number of mbufs in pool */
+constexpr unsigned int MBUF_CACHE_SIZE = 315; /* Size of cpu-local mbuf cache */
+constexpr unsigned int BURST_SIZE = 64; /* Maximum burst size for RX */
+
+constexpr unsigned int NUM_PORTS = 2; /* Number of NIC ports */
+constexpr unsigned int TX_CREDITS = 28; /* Number of TX credits */
+constexpr unsigned int RX_CREDITS = 64; /* Number of RX credits */
+constexpr unsigned int BENCH_SPP = 700; /* "Samples" per packet */
+} // namespace
-struct dpdk_test_args {
+struct dpdk_test_args
+{
unsigned int portid;
std::string src_port;
std::string dst_ip;
std::string dst_port;
- pthread_cond_t *cond;
+ pthread_cond_t* cond;
pthread_mutex_t mutex;
bool started;
int cpu;
};
-struct dpdk_test_stats {
+struct dpdk_test_stats
+{
uint32_t last_seqno;
uint32_t dropped_packets;
uint32_t lasts[16];
@@ -59,7 +61,7 @@ struct dpdk_test_stats {
};
-static void process_udp(int id, uint32_t *udp_data, struct dpdk_test_stats *stats)
+static void process_udp(int id, uint32_t* udp_data, struct dpdk_test_stats* stats)
{
if (udp_data[0] != stats[id].last_seqno + 1) {
stats[id].lasts[stats[id].dropped_packets & 0xf] = stats[id].last_seqno;
@@ -71,22 +73,24 @@ static void process_udp(int id, uint32_t *udp_data, struct dpdk_test_stats *stat
stats[id].last_ackno = udp_data[1];
}
-static void send_udp(uhd::transport::dpdk_zero_copy::sptr &stream, int id,
- bool fc_only, struct dpdk_test_stats *stats)
+static void send_udp(uhd::transport::dpdk_zero_copy::sptr& stream,
+ int id,
+ bool fc_only,
+ struct dpdk_test_stats* stats)
{
uhd::transport::managed_send_buffer::sptr mbuf = stream->get_send_buff(0);
if (mbuf.get() == nullptr) {
printf("Could not get TX buffer!\n");
return;
}
- auto *tx_data = mbuf->cast<uint32_t *>();
- tx_data[0] = fc_only ? stats[id].tx_seqno - 1 : stats[id].tx_seqno;
- tx_data[1] = stats[id].last_seqno;
+ auto* tx_data = mbuf->cast<uint32_t*>();
+ tx_data[0] = fc_only ? stats[id].tx_seqno - 1 : stats[id].tx_seqno;
+ tx_data[1] = stats[id].last_seqno;
if (!fc_only) {
- memset(&tx_data[2], stats[id].last_seqno, 8*BENCH_SPP);
- stats[id].tx_xfer += 8*BENCH_SPP;
+ memset(&tx_data[2], stats[id].last_seqno, 8 * BENCH_SPP);
+ stats[id].tx_xfer += 8 * BENCH_SPP;
}
- size_t num_bytes = 8 + (fc_only ? 0 : 8*BENCH_SPP);
+ size_t num_bytes = 8 + (fc_only ? 0 : 8 * BENCH_SPP);
mbuf->commit(num_bytes);
mbuf.reset();
@@ -95,18 +99,20 @@ static void send_udp(uhd::transport::dpdk_zero_copy::sptr &stream, int id,
}
}
-static void bench(uhd::transport::dpdk_zero_copy::sptr *stream, uint32_t nb_ports, double timeout)
+static void bench(
+ uhd::transport::dpdk_zero_copy::sptr* stream, uint32_t nb_ports, double timeout)
{
uint64_t total_xfer[NUM_PORTS];
uint32_t id;
- struct dpdk_test_stats *stats = (struct dpdk_test_stats *) malloc(sizeof(*stats)*nb_ports);
+ struct dpdk_test_stats* stats =
+ (struct dpdk_test_stats*)malloc(sizeof(*stats) * nb_ports);
for (id = 0; id < nb_ports; id++) {
- stats[id].tx_seqno = 1;
- stats[id].tx_xfer = 0;
- stats[id].last_ackno = 0;
- stats[id].last_seqno = 0;
+ stats[id].tx_seqno = 1;
+ stats[id].tx_xfer = 0;
+ stats[id].last_ackno = 0;
+ stats[id].last_seqno = 0;
stats[id].dropped_packets = 0;
- total_xfer[id] = 0;
+ total_xfer[id] = 0;
}
sleep(1);
struct timeval bench_start, bench_end;
@@ -115,8 +121,8 @@ static void bench(uhd::transport::dpdk_zero_copy::sptr *stream, uint32_t nb_port
* The test...
*/
uint64_t total_received = 0;
- uint32_t consec_no_rx = 0;
- while ((total_received / nb_ports) < 1000000 ) { //&& consec_no_rx < 10000) {
+ uint32_t consec_no_rx = 0;
+ while ((total_received / nb_ports) < 1000000) { //&& consec_no_rx < 10000) {
for (id = 0; id < nb_ports; id++) {
unsigned int nb_rx = 0;
uhd::transport::managed_recv_buffer::sptr bufs[BURST_SIZE];
@@ -132,7 +138,9 @@ static void bench(uhd::transport::dpdk_zero_copy::sptr *stream, uint32_t nb_port
consec_no_rx++;
if (consec_no_rx >= 100000) {
uint32_t skt_drops = stream[id]->get_drop_count();
- //printf("TX seq %d, TX ack %d, RX seq %d, %d drops!\n", stats[id].tx_seqno, stats[id].last_ackno, stats[id].last_seqno, skt_drops);
+ // printf("TX seq %d, TX ack %d, RX seq %d, %d drops!\n",
+ // stats[id].tx_seqno, stats[id].last_ackno, stats[id].last_seqno,
+ // skt_drops);
consec_no_rx = 0;
break;
}
@@ -143,7 +151,7 @@ static void bench(uhd::transport::dpdk_zero_copy::sptr *stream, uint32_t nb_port
for (unsigned int buf = 0; buf < nb_rx; buf++) {
total_xfer[id] += bufs[buf]->size();
- auto data = bufs[buf]->cast<uint32_t *>();
+ auto data = bufs[buf]->cast<uint32_t*>();
process_udp(id, data, stats);
}
@@ -153,15 +161,17 @@ static void bench(uhd::transport::dpdk_zero_copy::sptr *stream, uint32_t nb_port
for (id = 0; id < nb_ports; id++) {
/* TX portion */
uint32_t window_end = stats[id].last_ackno + TX_CREDITS;
- //uint32_t window_end = last_seqno[port] + TX_CREDITS;
+ // uint32_t window_end = last_seqno[port] + TX_CREDITS;
if (window_end <= stats[id].tx_seqno) {
if (consec_no_rx == 9999) {
send_udp(stream[id], id, true, stats);
}
- //send_udp(tx[id], id, true);
+ // send_udp(tx[id], id, true);
;
} else {
- for (unsigned int pktno = 0; (pktno < BURST_SIZE) && (stats[id].tx_seqno < window_end); pktno++) {
+ for (unsigned int pktno = 0;
+ (pktno < BURST_SIZE) && (stats[id].tx_seqno < window_end);
+ pktno++) {
send_udp(stream[id], id, false, stats);
}
}
@@ -174,13 +184,16 @@ static void bench(uhd::transport::dpdk_zero_copy::sptr *stream, uint32_t nb_port
printf("\n");
printf("Bytes received = %ld\n", total_xfer[id]);
printf("Bytes sent = %ld\n", stats[id].tx_xfer);
- printf("Time taken = %ld us\n", (bench_end.tv_sec - bench_start.tv_sec)*1000000 + (bench_end.tv_usec - bench_start.tv_usec));
- double elapsed_time = (bench_end.tv_sec - bench_start.tv_sec)*1000000 + (bench_end.tv_usec - bench_start.tv_usec);
+ printf("Time taken = %ld us\n",
+ (bench_end.tv_sec - bench_start.tv_sec) * 1000000
+ + (bench_end.tv_usec - bench_start.tv_usec));
+ double elapsed_time = (bench_end.tv_sec - bench_start.tv_sec) * 1000000
+ + (bench_end.tv_usec - bench_start.tv_usec);
elapsed_time *= 1.0e-6;
double elapsed_bytes = total_xfer[id];
- printf("RX Performance = %e Gbps\n", elapsed_bytes*8.0/1.0e9/elapsed_time);
+ printf("RX Performance = %e Gbps\n", elapsed_bytes * 8.0 / 1.0e9 / elapsed_time);
elapsed_bytes = stats[id].tx_xfer;
- printf("TX Performance = %e Gbps\n", elapsed_bytes*8.0/1.0e9/elapsed_time);
+ printf("TX Performance = %e Gbps\n", elapsed_bytes * 8.0 / 1.0e9 / elapsed_time);
uint32_t skt_drops = stream[id]->get_drop_count();
printf("Dropped %d packets\n", stats[id].dropped_packets);
printf("Socket reports dropped %d packets\n", skt_drops);
@@ -189,11 +202,10 @@ static void bench(uhd::transport::dpdk_zero_copy::sptr *stream, uint32_t nb_port
break;
printf("Last(%u), Recv(%u)\n", stats[id].lasts[i], stats[id].drops[i]);
}
- //printf("%d missed/dropped packets\n", errors);
+ // printf("%d missed/dropped packets\n", errors);
printf("\n");
}
free(stats);
-
}
static inline void set_cpu(pthread_t t, int cpu)
@@ -209,31 +221,29 @@ static inline void set_cpu(pthread_t t, int cpu)
}
}
-void *prepare_and_bench_blocking(void *arg)
+void* prepare_and_bench_blocking(void* arg)
{
- struct dpdk_test_args *args = (struct dpdk_test_args *) arg;
+ struct dpdk_test_args* args = (struct dpdk_test_args*)arg;
pthread_mutex_lock(&args->mutex);
pthread_t t = pthread_self();
set_cpu(t, args->cpu);
args->started = true;
pthread_cond_wait(args->cond, &args->mutex);
- auto &ctx = uhd::transport::uhd_dpdk_ctx::get();
+ auto& ctx = uhd::transport::uhd_dpdk_ctx::get();
uhd::transport::dpdk_zero_copy::sptr eth_data[1];
uhd::transport::zero_copy_xport_params buff_args;
buff_args.recv_frame_size = 8000;
buff_args.send_frame_size = 8000;
buff_args.num_send_frames = 8;
buff_args.num_recv_frames = 8;
- auto dev_addr = uhd::device_addr_t();
- eth_data[0] = uhd::transport::dpdk_zero_copy::make(
- ctx,
+ auto dev_addr = uhd::device_addr_t();
+ eth_data[0] = uhd::transport::dpdk_zero_copy::make(ctx,
args->portid,
args->dst_ip,
args->src_port,
args->dst_port,
buff_args,
- dev_addr
- );
+ dev_addr);
bench(eth_data, 1, 0.1);
return 0;
@@ -241,19 +251,19 @@ void *prepare_and_bench_blocking(void *arg)
void prepare_and_bench_polling(void)
{
- auto &ctx = uhd::transport::uhd_dpdk_ctx::get();
+ auto& ctx = uhd::transport::uhd_dpdk_ctx::get();
struct dpdk_test_args bench_args[2];
- bench_args[0].cond = NULL;
- bench_args[0].started = true;
- bench_args[0].portid = 0;
+ bench_args[0].cond = NULL;
+ bench_args[0].started = true;
+ bench_args[0].portid = 0;
bench_args[0].src_port = "0xBEE7";
- bench_args[0].dst_ip = "192.168.0.4";
+ bench_args[0].dst_ip = "192.168.0.4";
bench_args[0].dst_port = "0xBEE7";
- bench_args[1].cond = NULL;
- bench_args[1].started = true;
- bench_args[1].portid = 1;
+ bench_args[1].cond = NULL;
+ bench_args[1].started = true;
+ bench_args[1].portid = 1;
bench_args[1].src_port = "0xBEE7";
- bench_args[1].dst_ip = "192.168.0.3";
+ bench_args[1].dst_ip = "192.168.0.3";
bench_args[1].dst_port = "0xBEE7";
uhd::transport::dpdk_zero_copy::sptr eth_data[NUM_PORTS];
@@ -262,45 +272,43 @@ void prepare_and_bench_polling(void)
buff_args.send_frame_size = 8000;
buff_args.num_send_frames = 8;
buff_args.num_recv_frames = 8;
- auto dev_addr = uhd::device_addr_t();
+ auto dev_addr = uhd::device_addr_t();
for (unsigned int i = 0; i < NUM_PORTS; i++) {
- eth_data[i] = uhd::transport::dpdk_zero_copy::make(
- ctx,
+ eth_data[i] = uhd::transport::dpdk_zero_copy::make(ctx,
bench_args[i].portid,
bench_args[i].dst_ip,
bench_args[i].src_port,
bench_args[i].dst_port,
buff_args,
- dev_addr
- );
+ dev_addr);
}
bench(eth_data, NUM_PORTS, 0.0);
}
-int main(int argc, char **argv)
+int main(int argc, char** argv)
{
int retval, io0_cpu = 1, io1_cpu = 1, user0_cpu = 0, user1_cpu = 2;
std::string args, cpusets;
po::options_description desc("Allowed options");
- desc.add_options()
- ("help", "help message")
- ("args", po::value<std::string>(&args)->default_value(""), "UHD-DPDK args")
- ("polling-mode", "Use polling mode (single thread on own core)")
- ("cpusets", po::value<std::string>(&cpusets)->default_value(""), "which core(s) to use for a given thread (specify something like \"io0=1,io1=1,user0=0,user1=2\")")
- ;
+ desc.add_options()("help", "help message")(
+ "args", po::value<std::string>(&args)->default_value(""), "UHD-DPDK args")(
+ "polling-mode", "Use polling mode (single thread on own core)")("cpusets",
+ po::value<std::string>(&cpusets)->default_value(""),
+ "which core(s) to use for a given thread (specify something like "
+ "\"io0=1,io1=1,user0=0,user1=2\")");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
if (vm.count("help")) {
- std::cout << desc << std::endl;
- return 0;
+ std::cout << desc << std::endl;
+ return 0;
}
auto dpdk_args = uhd::device_addr_t(args);
- for (std::string &key : dpdk_args.keys()) {
+ for (std::string& key : dpdk_args.keys()) {
/* device_addr_t splits on commas, so we use colons and replace */
if (key == "corelist" || key == "coremap") {
dpdk_args[key] = boost::regex_replace(dpdk_args[key], colons, ",");
@@ -308,7 +316,7 @@ int main(int argc, char **argv)
}
auto cpuset_map = uhd::device_addr_t(cpusets);
- for (std::string &key : cpuset_map.keys()) {
+ for (std::string& key : cpuset_map.keys()) {
if (key == "io0") {
io0_cpu = std::stoi(cpuset_map[key], NULL, 0);
} else if (key == "io1") {
@@ -321,12 +329,12 @@ int main(int argc, char **argv)
}
int port_thread_mapping[2] = {io0_cpu, io1_cpu};
- auto &ctx = uhd::transport::uhd_dpdk_ctx::get();
+ auto& ctx = uhd::transport::uhd_dpdk_ctx::get();
ctx.init(dpdk_args, 2, &port_thread_mapping[0], NUM_MBUFS, MBUF_CACHE_SIZE, 9000);
- uint32_t eth_ip = htonl(0xc0a80003);
+ uint32_t eth_ip = htonl(0xc0a80003);
uint32_t eth_mask = htonl(0xffffff00);
- int status = ctx.set_ipv4_addr(0, eth_ip, eth_mask);
+ int status = ctx.set_ipv4_addr(0, eth_ip, eth_mask);
if (status) {
printf("Error while setting IP0: %d\n", status);
return status;
@@ -346,19 +354,19 @@ int main(int argc, char **argv)
struct dpdk_test_args bench_args[2];
pthread_mutex_init(&bench_args[0].mutex, NULL);
pthread_mutex_init(&bench_args[1].mutex, NULL);
- bench_args[0].cpu = user0_cpu;
- bench_args[0].cond = &cond;
- bench_args[0].started = false;
- bench_args[0].portid = 0;
+ bench_args[0].cpu = user0_cpu;
+ bench_args[0].cond = &cond;
+ bench_args[0].started = false;
+ bench_args[0].portid = 0;
bench_args[0].src_port = "0xBEE7";
- bench_args[0].dst_ip = "192.168.0.4";
+ bench_args[0].dst_ip = "192.168.0.4";
bench_args[0].dst_port = "0xBEE7";
- bench_args[1].cpu = user1_cpu;
- bench_args[1].cond = &cond;
- bench_args[1].started = false;
- bench_args[1].portid = 1;
+ bench_args[1].cpu = user1_cpu;
+ bench_args[1].cond = &cond;
+ bench_args[1].started = false;
+ bench_args[1].portid = 1;
bench_args[1].src_port = "0xBEE7";
- bench_args[1].dst_ip = "192.168.0.3";
+ bench_args[1].dst_ip = "192.168.0.3";
bench_args[1].dst_port = "0xBEE7";
pthread_t threads[2];
@@ -366,29 +374,29 @@ int main(int argc, char **argv)
pthread_create(&threads[1], NULL, prepare_and_bench_blocking, &bench_args[1]);
do {
- pthread_mutex_lock(&bench_args[0].mutex);
- if (bench_args[0].started)
- break;
- pthread_mutex_unlock(&bench_args[0].mutex);
+ pthread_mutex_lock(&bench_args[0].mutex);
+ if (bench_args[0].started)
+ break;
+ pthread_mutex_unlock(&bench_args[0].mutex);
} while (true);
pthread_mutex_unlock(&bench_args[0].mutex);
do {
- pthread_mutex_lock(&bench_args[1].mutex);
- if (bench_args[1].started)
- break;
- pthread_mutex_unlock(&bench_args[1].mutex);
+ pthread_mutex_lock(&bench_args[1].mutex);
+ if (bench_args[1].started)
+ break;
+ pthread_mutex_unlock(&bench_args[1].mutex);
} while (true);
pthread_mutex_unlock(&bench_args[1].mutex);
pthread_cond_broadcast(&cond);
- status = pthread_join(threads[0], (void **) &retval);
+ status = pthread_join(threads[0], (void**)&retval);
if (status) {
perror("Error while joining thread");
return status;
}
- status = pthread_join(threads[1], (void **) &retval);
+ status = pthread_join(threads[1], (void**)&retval);
if (status) {
perror("Error while joining thread");
return status;
diff --git a/host/tests/eeprom_utils_test.cpp b/host/tests/eeprom_utils_test.cpp
index 4407ad4e4..728b4b8b6 100644
--- a/host/tests/eeprom_utils_test.cpp
+++ b/host/tests/eeprom_utils_test.cpp
@@ -4,15 +4,19 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhdlib/utils/eeprom_utils.hpp>
#include <boost/assign/list_of.hpp>
+#include <boost/test/unit_test.hpp>
using namespace boost::assign;
-class upper_case_char {
+class upper_case_char
+{
public:
- upper_case_char(char ch) {value = ch;}
+ upper_case_char(char ch)
+ {
+ value = ch;
+ }
static upper_case_char from_string(std::string str)
{
return upper_case_char(toupper(str[0]));
@@ -21,36 +25,28 @@ public:
{
return std::string(1, value);
}
+
private:
char value;
};
BOOST_AUTO_TEST_CASE(test_eeprom_duplicate_check)
{
- const uhd::dict<std::string,std::string> curr_eeprom = map_list_of
- ("0","A")
- ("1","B")
- ("2","C")
- ;
- const uhd::dict<std::string,std::string> new_eeprom_no_dups = map_list_of
- ("0","d")
- ("1","e")
- ;
- const uhd::dict<std::string,std::string> new_eeprom_dups_in_curr = map_list_of
- ("0","b")
- ;
- const uhd::dict<std::string,std::string> new_eeprom_dups_in_new = map_list_of
- ("0","c")
- ("1","c")
- ;
- const uhd::dict<std::string,std::string> new_eeprom_dups_in_both = map_list_of
- ("0","b")
- ("1","B")
- ;
- const std::vector<std::string> keys = {"0","1","2"};
+ const uhd::dict<std::string, std::string> curr_eeprom =
+ map_list_of("0", "A")("1", "B")("2", "C");
+ const uhd::dict<std::string, std::string> new_eeprom_no_dups =
+ map_list_of("0", "d")("1", "e");
+ const uhd::dict<std::string, std::string> new_eeprom_dups_in_curr =
+ map_list_of("0", "b");
+ const uhd::dict<std::string, std::string> new_eeprom_dups_in_new =
+ map_list_of("0", "c")("1", "c");
+ const uhd::dict<std::string, std::string> new_eeprom_dups_in_both =
+ map_list_of("0", "b")("1", "B");
+ const std::vector<std::string> keys = {"0", "1", "2"};
BOOST_CHECK_EQUAL(check_for_duplicates<upper_case_char>(
- "TEST", new_eeprom_no_dups, curr_eeprom, "Test Value", keys), false);
+ "TEST", new_eeprom_no_dups, curr_eeprom, "Test Value", keys),
+ false);
BOOST_CHECK(check_for_duplicates<upper_case_char>(
"TEST", new_eeprom_dups_in_curr, curr_eeprom, "Test Value", keys));
BOOST_CHECK(check_for_duplicates<upper_case_char>(
diff --git a/host/tests/error_c_test.cpp b/host/tests/error_c_test.cpp
index a60abe289..c697ebac7 100644
--- a/host/tests/error_c_test.cpp
+++ b/host/tests/error_c_test.cpp
@@ -7,11 +7,10 @@
#include <uhd/error.h>
#include <uhd/types/dict.hpp>
-
-#include <boost/test/unit_test.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/assign.hpp>
#include <boost/format.hpp>
+#include <boost/test/unit_test.hpp>
/*
* Test our conversions from exceptions to C-level UHD error codes.
@@ -19,97 +18,93 @@
* to test our C++ macro, which returns the error code.
*/
-typedef struct {
+typedef struct
+{
std::string last_error;
} dummy_handle_t;
template <typename error_type>
-UHD_INLINE uhd_error throw_uhd_exception(dummy_handle_t *handle, const uhd::exception* except){
- UHD_SAFE_C_SAVE_ERROR(handle,
- throw *dynamic_cast<const error_type*>(except);
- )
+UHD_INLINE uhd_error throw_uhd_exception(
+ dummy_handle_t* handle, const uhd::exception* except)
+{
+ UHD_SAFE_C_SAVE_ERROR(handle, throw *dynamic_cast<const error_type*>(except);)
}
-UHD_INLINE uhd_error throw_boost_exception(dummy_handle_t *handle){
- UHD_SAFE_C_SAVE_ERROR(handle,
+UHD_INLINE uhd_error throw_boost_exception(dummy_handle_t* handle)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ handle,
std::runtime_error except("This is a std::runtime_error, thrown by Boost.");
- BOOST_THROW_EXCEPTION(except);
- )
+ BOOST_THROW_EXCEPTION(except);)
}
-UHD_INLINE uhd_error throw_std_exception(dummy_handle_t *handle){
- UHD_SAFE_C_SAVE_ERROR(handle,
- throw std::runtime_error("This is a std::runtime_error.");
- )
+UHD_INLINE uhd_error throw_std_exception(dummy_handle_t* handle)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ handle, throw std::runtime_error("This is a std::runtime_error.");)
}
-UHD_INLINE uhd_error throw_unknown_exception(dummy_handle_t *handle){
- UHD_SAFE_C_SAVE_ERROR(handle,
- throw 1;
- )
+UHD_INLINE uhd_error throw_unknown_exception(dummy_handle_t* handle)
+{
+ UHD_SAFE_C_SAVE_ERROR(handle, throw 1;)
}
// There are enough non-standard names that we can't just use a conversion function
static const uhd::dict<std::string, std::string> pretty_exception_names =
- boost::assign::map_list_of
- ("assertion_error", "AssertionError")
- ("lookup_error", "LookupError")
- ("index_error", "LookupError: IndexError")
- ("key_error", "LookupError: KeyError")
- ("type_error", "TypeError")
- ("value_error", "ValueError")
- ("runtime_error", "RuntimeError")
- ("not_implemented_error", "RuntimeError: NotImplementedError")
- ("usb_error", "RuntimeError: USBError 1")
- ("environment_error", "EnvironmentError")
- ("io_error", "EnvironmentError: IOError")
- ("os_error", "EnvironmentError: OSError")
- ("system_error", "SystemError")
- ;
-
-#define UHD_TEST_CHECK_ERROR_CODE(cpp_exception_type, c_error_code) \
- expected_msg = str(boost::format("This is a uhd::%s.") % BOOST_STRINGIZE(cpp_exception_type)); \
- uhd::cpp_exception_type cpp_exception_type ## _foo(expected_msg); \
- error_code = throw_uhd_exception<uhd::cpp_exception_type>(&handle, &cpp_exception_type ## _foo); \
- BOOST_CHECK_EQUAL(error_code, c_error_code); \
- expected_msg = str(boost::format("%s: %s") \
+ boost::assign::map_list_of("assertion_error", "AssertionError")(
+ "lookup_error", "LookupError")("index_error", "LookupError: IndexError")(
+ "key_error", "LookupError: KeyError")("type_error", "TypeError")("value_error",
+ "ValueError")("runtime_error", "RuntimeError")("not_implemented_error",
+ "RuntimeError: NotImplementedError")("usb_error", "RuntimeError: USBError 1")(
+ "environment_error", "EnvironmentError")("io_error", "EnvironmentError: IOError")(
+ "os_error", "EnvironmentError: OSError")("system_error", "SystemError");
+
+#define UHD_TEST_CHECK_ERROR_CODE(cpp_exception_type, c_error_code) \
+ expected_msg = \
+ str(boost::format("This is a uhd::%s.") % BOOST_STRINGIZE(cpp_exception_type)); \
+ uhd::cpp_exception_type cpp_exception_type##_foo(expected_msg); \
+ error_code = throw_uhd_exception<uhd::cpp_exception_type>( \
+ &handle, &cpp_exception_type##_foo); \
+ BOOST_CHECK_EQUAL(error_code, c_error_code); \
+ expected_msg = str(boost::format("%s: %s") \
% pretty_exception_names.get(BOOST_STRINGIZE(cpp_exception_type)) \
- % expected_msg); \
- BOOST_CHECK_EQUAL(handle.last_error, expected_msg); \
+ % expected_msg); \
+ BOOST_CHECK_EQUAL(handle.last_error, expected_msg); \
BOOST_CHECK_EQUAL(get_c_global_error_string(), expected_msg);
// uhd::usb_error has a different constructor
-#define UHD_TEST_CHECK_USB_ERROR_CODE() \
- expected_msg = "This is a uhd::usb_error."; \
- uhd::usb_error usb_error_foo(1, expected_msg); \
- error_code = throw_uhd_exception<uhd::usb_error>(&handle, &usb_error_foo); \
- BOOST_CHECK_EQUAL(error_code, UHD_ERROR_USB); \
- expected_msg = str(boost::format("%s: %s") \
- % pretty_exception_names.get("usb_error") \
- % expected_msg); \
- BOOST_CHECK_EQUAL(handle.last_error, expected_msg); \
+#define UHD_TEST_CHECK_USB_ERROR_CODE() \
+ expected_msg = "This is a uhd::usb_error."; \
+ uhd::usb_error usb_error_foo(1, expected_msg); \
+ error_code = throw_uhd_exception<uhd::usb_error>(&handle, &usb_error_foo); \
+ BOOST_CHECK_EQUAL(error_code, UHD_ERROR_USB); \
+ expected_msg = str(boost::format("%s: %s") % pretty_exception_names.get("usb_error") \
+ % expected_msg); \
+ BOOST_CHECK_EQUAL(handle.last_error, expected_msg); \
BOOST_CHECK_EQUAL(get_c_global_error_string(), expected_msg);
-BOOST_AUTO_TEST_CASE(test_uhd_exception){
+BOOST_AUTO_TEST_CASE(test_uhd_exception)
+{
dummy_handle_t handle;
std::string expected_msg;
uhd_error error_code;
- UHD_TEST_CHECK_ERROR_CODE(assertion_error, UHD_ERROR_ASSERTION);
- UHD_TEST_CHECK_ERROR_CODE(lookup_error, UHD_ERROR_LOOKUP);
- UHD_TEST_CHECK_ERROR_CODE(index_error, UHD_ERROR_INDEX);
- UHD_TEST_CHECK_ERROR_CODE(key_error, UHD_ERROR_KEY);
- UHD_TEST_CHECK_ERROR_CODE(type_error, UHD_ERROR_TYPE);
- UHD_TEST_CHECK_ERROR_CODE(value_error, UHD_ERROR_VALUE);
- UHD_TEST_CHECK_ERROR_CODE(runtime_error, UHD_ERROR_RUNTIME);
+ UHD_TEST_CHECK_ERROR_CODE(assertion_error, UHD_ERROR_ASSERTION);
+ UHD_TEST_CHECK_ERROR_CODE(lookup_error, UHD_ERROR_LOOKUP);
+ UHD_TEST_CHECK_ERROR_CODE(index_error, UHD_ERROR_INDEX);
+ UHD_TEST_CHECK_ERROR_CODE(key_error, UHD_ERROR_KEY);
+ UHD_TEST_CHECK_ERROR_CODE(type_error, UHD_ERROR_TYPE);
+ UHD_TEST_CHECK_ERROR_CODE(value_error, UHD_ERROR_VALUE);
+ UHD_TEST_CHECK_ERROR_CODE(runtime_error, UHD_ERROR_RUNTIME);
UHD_TEST_CHECK_ERROR_CODE(not_implemented_error, UHD_ERROR_NOT_IMPLEMENTED);
- UHD_TEST_CHECK_ERROR_CODE(io_error, UHD_ERROR_IO);
- UHD_TEST_CHECK_ERROR_CODE(os_error, UHD_ERROR_OS);
- UHD_TEST_CHECK_ERROR_CODE(system_error, UHD_ERROR_SYSTEM);
+ UHD_TEST_CHECK_ERROR_CODE(io_error, UHD_ERROR_IO);
+ UHD_TEST_CHECK_ERROR_CODE(os_error, UHD_ERROR_OS);
+ UHD_TEST_CHECK_ERROR_CODE(system_error, UHD_ERROR_SYSTEM);
UHD_TEST_CHECK_USB_ERROR_CODE();
}
-BOOST_AUTO_TEST_CASE(test_boost_exception){
+BOOST_AUTO_TEST_CASE(test_boost_exception)
+{
dummy_handle_t handle;
uhd_error error_code = throw_boost_exception(&handle);
@@ -117,7 +112,8 @@ BOOST_AUTO_TEST_CASE(test_boost_exception){
BOOST_CHECK_EQUAL(error_code, UHD_ERROR_BOOSTEXCEPT);
}
-BOOST_AUTO_TEST_CASE(test_std_exception){
+BOOST_AUTO_TEST_CASE(test_std_exception)
+{
dummy_handle_t handle;
uhd_error error_code = throw_std_exception(&handle);
@@ -125,7 +121,8 @@ BOOST_AUTO_TEST_CASE(test_std_exception){
BOOST_CHECK_EQUAL(handle.last_error, "This is a std::runtime_error.");
}
-BOOST_AUTO_TEST_CASE(test_unknown_exception){
+BOOST_AUTO_TEST_CASE(test_unknown_exception)
+{
dummy_handle_t handle;
uhd_error error_code = throw_unknown_exception(&handle);
diff --git a/host/tests/error_test.cpp b/host/tests/error_test.cpp
index b749ca6f4..62411e06d 100644
--- a/host/tests/error_test.cpp
+++ b/host/tests/error_test.cpp
@@ -5,79 +5,76 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/exception.hpp>
#include <uhd/utils/assert_has.hpp>
-#include <vector>
+#include <boost/test/unit_test.hpp>
#include <iostream>
+#include <vector>
-BOOST_AUTO_TEST_CASE(test_exception_methods){
- try{
+BOOST_AUTO_TEST_CASE(test_exception_methods)
+{
+ try {
throw uhd::assertion_error("your assertion failed: 1 != 2");
- }
- catch(const uhd::exception &e){
+ } catch (const uhd::exception& e) {
std::cout << "what: " << e.what() << std::endl;
std::cout << "code: " << e.code() << std::endl;
}
}
-BOOST_AUTO_TEST_CASE(test_assert_has){
+BOOST_AUTO_TEST_CASE(test_assert_has)
+{
std::vector<int> vec;
vec.push_back(2);
vec.push_back(3);
vec.push_back(5);
- //verify the uhd::has utility
+ // verify the uhd::has utility
BOOST_CHECK(uhd::has(vec, 2));
BOOST_CHECK(not uhd::has(vec, 1));
std::cout << "The output of the assert_has error:" << std::endl;
- try{
+ try {
uhd::assert_has(vec, 1, "prime");
- }
- catch(const std::exception &e){
+ } catch (const std::exception& e) {
std::cout << e.what() << std::endl;
}
}
-BOOST_AUTO_TEST_CASE(test_assert_throw){
+BOOST_AUTO_TEST_CASE(test_assert_throw)
+{
std::cout << "The output of the assert throw error:" << std::endl;
- try{
+ try {
UHD_ASSERT_THROW(2 + 2 == 5);
- }
- catch(const std::exception &e){
+ } catch (const std::exception& e) {
std::cout << e.what() << std::endl;
}
}
-BOOST_AUTO_TEST_CASE(test_exception_dynamic){
- uhd::exception *exception_clone;
+BOOST_AUTO_TEST_CASE(test_exception_dynamic)
+{
+ uhd::exception* exception_clone;
- //throw an exception and dynamically clone it
- try{
+ // throw an exception and dynamically clone it
+ try {
throw uhd::runtime_error("noooooo");
- }
- catch(const uhd::exception &e){
+ } catch (const uhd::exception& e) {
std::cout << e.what() << std::endl;
exception_clone = e.dynamic_clone();
}
- //now we dynamically re-throw the exception
- try{
+ // now we dynamically re-throw the exception
+ try {
exception_clone->dynamic_throw();
- }
- catch(const uhd::assertion_error &e){
+ } catch (const uhd::assertion_error& e) {
std::cout << e.what() << std::endl;
BOOST_CHECK(false);
- }
- catch(const uhd::runtime_error &e){
+ } catch (const uhd::runtime_error& e) {
std::cout << e.what() << std::endl;
BOOST_CHECK(true);
- }
- catch(const uhd::exception &e){
+ } catch (const uhd::exception& e) {
std::cout << e.what() << std::endl;
BOOST_CHECK(false);
}
- delete exception_clone; //manual cleanup
+ delete exception_clone; // manual cleanup
}
diff --git a/host/tests/expert_test.cpp b/host/tests/expert_test.cpp
index efd4f1d08..36a9ef03b 100644
--- a/host/tests/expert_test.cpp
+++ b/host/tests/expert_test.cpp
@@ -5,20 +5,21 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
-#include <boost/format.hpp>
-#include <boost/make_shared.hpp>
#include <uhd/property_tree.hpp>
#include <uhdlib/experts/expert_container.hpp>
#include <uhdlib/experts/expert_factory.hpp>
+#include <boost/format.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/test/unit_test.hpp>
#include <fstream>
using namespace uhd::experts;
-class worker1_t : public worker_node_t {
+class worker1_t : public worker_node_t
+{
public:
worker1_t(const node_retriever_t& db)
- : worker_node_t("A+B=C"), _a(db, "A/desired"), _b(db, "B"), _c(db, "C")
+ : worker_node_t("A+B=C"), _a(db, "A/desired"), _b(db, "B"), _c(db, "C")
{
bind_accessor(_a);
bind_accessor(_b);
@@ -26,7 +27,8 @@ public:
}
private:
- void resolve() {
+ void resolve()
+ {
_c = _a + _b;
}
@@ -37,10 +39,11 @@ private:
//=============================================================================
-class worker2_t : public worker_node_t {
+class worker2_t : public worker_node_t
+{
public:
worker2_t(const node_retriever_t& db)
- : worker_node_t("C*D=E"), _c(db, "C"), _d(db, "D"), _e(db, "E")
+ : worker_node_t("C*D=E"), _c(db, "C"), _d(db, "D"), _e(db, "E")
{
bind_accessor(_c);
bind_accessor(_d);
@@ -48,7 +51,8 @@ public:
}
private:
- void resolve() {
+ void resolve()
+ {
_e.set(_c.get() * _d.get());
}
@@ -59,17 +63,19 @@ private:
//=============================================================================
-class worker3_t : public worker_node_t {
+class worker3_t : public worker_node_t
+{
public:
worker3_t(const node_retriever_t& db)
- : worker_node_t("-B=F"), _b(db, "B"), _f(db, "F")
+ : worker_node_t("-B=F"), _b(db, "B"), _f(db, "F")
{
bind_accessor(_b);
bind_accessor(_f);
}
private:
- void resolve() {
+ void resolve()
+ {
_f.set(-_b.get());
}
@@ -79,10 +85,11 @@ private:
//=============================================================================
-class worker4_t : public worker_node_t {
+class worker4_t : public worker_node_t
+{
public:
worker4_t(const node_retriever_t& db)
- : worker_node_t("E-F=G"), _e(db, "E"), _f(db, "F"), _g(db, "G")
+ : worker_node_t("E-F=G"), _e(db, "E"), _f(db, "F"), _g(db, "G")
{
bind_accessor(_e);
bind_accessor(_f);
@@ -90,7 +97,8 @@ public:
}
private:
- void resolve() {
+ void resolve()
+ {
_g.set(_e.get() - _f.get());
}
@@ -101,17 +109,19 @@ private:
//=============================================================================
-class worker5_t : public worker_node_t {
+class worker5_t : public worker_node_t
+{
public:
worker5_t(const node_retriever_t& db, boost::shared_ptr<int> output)
- : worker_node_t("Consume_G"), _g(db, "G"), _c(db, "C"), _output(output)
+ : worker_node_t("Consume_G"), _g(db, "G"), _c(db, "C"), _output(output)
{
bind_accessor(_g);
-// bind_accessor(_c);
+ // bind_accessor(_c);
}
private:
- void resolve() {
+ void resolve()
+ {
*_output = _g;
}
@@ -121,82 +131,92 @@ private:
boost::shared_ptr<int> _output;
};
-class worker6_t : public worker_node_t {
+class worker6_t : public worker_node_t
+{
public:
- worker6_t() : worker_node_t("null_worker")
- {
- }
+ worker6_t() : worker_node_t("null_worker") {}
private:
- void resolve() {
- }
+ void resolve() {}
};
//=============================================================================
-#define DUMP_VARS \
- BOOST_TEST_MESSAGE( str(boost::format("### State = {A=%d%s, B=%d%s, C=%d%s, D=%d%s, E=%d%s, F=%d%s, G=%d%s}\n") % \
- nodeA.get() % (nodeA.is_dirty()?"*":"") % \
- nodeB.get() % (nodeB.is_dirty()?"*":"") % \
- nodeC.get() % (nodeC.is_dirty()?"*":"") % \
- nodeD.get() % (nodeD.is_dirty()?"*":"") % \
- nodeE.get() % (nodeE.is_dirty()?"*":"") % \
- nodeF.get() % (nodeF.is_dirty()?"*":"") % \
- nodeG.get() % (nodeG.is_dirty()?"*":"")) );
-
-#define VALIDATE_ALL_DEPENDENCIES \
- BOOST_CHECK(!nodeA.is_dirty()); \
- BOOST_CHECK(!nodeB.is_dirty()); \
- BOOST_CHECK(!nodeC.is_dirty()); \
- BOOST_CHECK(!nodeD.is_dirty()); \
- BOOST_CHECK(!nodeE.is_dirty()); \
- BOOST_CHECK(!nodeF.is_dirty()); \
- BOOST_CHECK(!nodeG.is_dirty()); \
+#define DUMP_VARS \
+ BOOST_TEST_MESSAGE(str( \
+ boost::format( \
+ "### State = {A=%d%s, B=%d%s, C=%d%s, D=%d%s, E=%d%s, F=%d%s, G=%d%s}\n") \
+ % nodeA.get() % (nodeA.is_dirty() ? "*" : "") % nodeB.get() \
+ % (nodeB.is_dirty() ? "*" : "") % nodeC.get() % (nodeC.is_dirty() ? "*" : "") \
+ % nodeD.get() % (nodeD.is_dirty() ? "*" : "") % nodeE.get() \
+ % (nodeE.is_dirty() ? "*" : "") % nodeF.get() % (nodeF.is_dirty() ? "*" : "") \
+ % nodeG.get() % (nodeG.is_dirty() ? "*" : "")));
+
+#define VALIDATE_ALL_DEPENDENCIES \
+ BOOST_CHECK(!nodeA.is_dirty()); \
+ BOOST_CHECK(!nodeB.is_dirty()); \
+ BOOST_CHECK(!nodeC.is_dirty()); \
+ BOOST_CHECK(!nodeD.is_dirty()); \
+ BOOST_CHECK(!nodeE.is_dirty()); \
+ BOOST_CHECK(!nodeF.is_dirty()); \
+ BOOST_CHECK(!nodeG.is_dirty()); \
BOOST_CHECK(nodeC.get() == nodeA.get() + nodeB.get()); \
BOOST_CHECK(nodeE.get() == nodeC.get() * nodeD.get()); \
- BOOST_CHECK(nodeF.get() == - nodeB.get()); \
+ BOOST_CHECK(nodeF.get() == -nodeB.get()); \
BOOST_CHECK(nodeG.get() == nodeE.get() - nodeF.get()); \
BOOST_CHECK(nodeG.get() == *final_output);
-BOOST_AUTO_TEST_CASE(test_experts){
- //Initialize container object
+BOOST_AUTO_TEST_CASE(test_experts)
+{
+ // Initialize container object
expert_container::sptr container = expert_factory::create_container("example");
- uhd::property_tree::sptr tree = uhd::property_tree::make();
+ uhd::property_tree::sptr tree = uhd::property_tree::make();
- //Output of expert tree
+ // Output of expert tree
boost::shared_ptr<int> final_output = boost::make_shared<int>();
- //Add data nodes to container
- expert_factory::add_dual_prop_node<int>(container, tree, "A", 0, uhd::experts::AUTO_RESOLVE_ON_WRITE);
+ // Add data nodes to container
+ expert_factory::add_dual_prop_node<int>(
+ container, tree, "A", 0, uhd::experts::AUTO_RESOLVE_ON_WRITE);
expert_factory::add_prop_node<int>(container, tree, "B", 0);
expert_factory::add_data_node<int>(container, "C", 0);
expert_factory::add_data_node<int>(container, "D", 1);
- expert_factory::add_prop_node<int>(container, tree, "E", 0, uhd::experts::AUTO_RESOLVE_ON_READ);
+ expert_factory::add_prop_node<int>(
+ container, tree, "E", 0, uhd::experts::AUTO_RESOLVE_ON_READ);
expert_factory::add_data_node<int>(container, "F", 0);
expert_factory::add_data_node<int>(container, "G", 0);
- //Add worker nodes to container
+ // Add worker nodes to container
expert_factory::add_worker_node<worker1_t>(container, container->node_retriever());
expert_factory::add_worker_node<worker2_t>(container, container->node_retriever());
expert_factory::add_worker_node<worker3_t>(container, container->node_retriever());
expert_factory::add_worker_node<worker4_t>(container, container->node_retriever());
- expert_factory::add_worker_node<worker5_t>(container, container->node_retriever(), final_output);
+ expert_factory::add_worker_node<worker5_t>(
+ container, container->node_retriever(), final_output);
expert_factory::add_worker_node<worker6_t>(container);
- //Once initialized, getting modify access to graph nodes is possible (by design) but extremely red-flaggy!
- //But we do it here to monitor things
- data_node_t<int>& nodeA = *(const_cast< data_node_t<int>* >(dynamic_cast< const data_node_t<int>* >(&container->node_retriever().lookup("A/desired"))));
- data_node_t<int>& nodeB = *(const_cast< data_node_t<int>* >(dynamic_cast< const data_node_t<int>* >(&container->node_retriever().lookup("B"))));
- data_node_t<int>& nodeC = *(const_cast< data_node_t<int>* >(dynamic_cast< const data_node_t<int>* >(&container->node_retriever().lookup("C"))));
- data_node_t<int>& nodeD = *(const_cast< data_node_t<int>* >(dynamic_cast< const data_node_t<int>* >(&container->node_retriever().lookup("D"))));
- data_node_t<int>& nodeE = *(const_cast< data_node_t<int>* >(dynamic_cast< const data_node_t<int>* >(&container->node_retriever().lookup("E"))));
- data_node_t<int>& nodeF = *(const_cast< data_node_t<int>* >(dynamic_cast< const data_node_t<int>* >(&container->node_retriever().lookup("F"))));
- data_node_t<int>& nodeG = *(const_cast< data_node_t<int>* >(dynamic_cast< const data_node_t<int>* >(&container->node_retriever().lookup("G"))));
+ // Once initialized, getting modify access to graph nodes is possible (by design) but
+ // extremely red-flaggy! But we do it here to monitor things
+ data_node_t<int>& nodeA =
+ *(const_cast<data_node_t<int>*>(dynamic_cast<const data_node_t<int>*>(
+ &container->node_retriever().lookup("A/desired"))));
+ data_node_t<int>& nodeB = *(const_cast<data_node_t<int>*>(
+ dynamic_cast<const data_node_t<int>*>(&container->node_retriever().lookup("B"))));
+ data_node_t<int>& nodeC = *(const_cast<data_node_t<int>*>(
+ dynamic_cast<const data_node_t<int>*>(&container->node_retriever().lookup("C"))));
+ data_node_t<int>& nodeD = *(const_cast<data_node_t<int>*>(
+ dynamic_cast<const data_node_t<int>*>(&container->node_retriever().lookup("D"))));
+ data_node_t<int>& nodeE = *(const_cast<data_node_t<int>*>(
+ dynamic_cast<const data_node_t<int>*>(&container->node_retriever().lookup("E"))));
+ data_node_t<int>& nodeF = *(const_cast<data_node_t<int>*>(
+ dynamic_cast<const data_node_t<int>*>(&container->node_retriever().lookup("F"))));
+ data_node_t<int>& nodeG = *(const_cast<data_node_t<int>*>(
+ dynamic_cast<const data_node_t<int>*>(&container->node_retriever().lookup("G"))));
DUMP_VARS
- //Ensure init behavior
+ // Ensure init behavior
BOOST_CHECK(nodeA.is_dirty());
BOOST_CHECK(nodeB.is_dirty());
BOOST_CHECK(nodeC.is_dirty());
@@ -205,18 +225,19 @@ BOOST_AUTO_TEST_CASE(test_experts){
BOOST_CHECK(nodeF.is_dirty());
BOOST_CHECK(nodeG.is_dirty());
container->resolve_all();
- VALIDATE_ALL_DEPENDENCIES //Ensure a default resolve
+ VALIDATE_ALL_DEPENDENCIES // Ensure a default resolve
- //Ensure basic node value propagation
- tree->access<int>("B").set(3);
- BOOST_CHECK(nodeB.get() == 3); //Ensure value propagated
- BOOST_CHECK(nodeB.is_dirty()); //Ensure that nothing got resolved...
+ // Ensure basic node value propagation
+ tree->access<int>("B")
+ .set(3);
+ BOOST_CHECK(nodeB.get() == 3); // Ensure value propagated
+ BOOST_CHECK(nodeB.is_dirty()); // Ensure that nothing got resolved...
container->resolve_all();
VALIDATE_ALL_DEPENDENCIES
- nodeD.set(2); //Hack for testing
+ nodeD.set(2); // Hack for testing
- //Ensure auto-resolve on write
+ // Ensure auto-resolve on write
tree->access<int>("A").set(200);
BOOST_CHECK(nodeC.get() == nodeA.get() + nodeB.get());
BOOST_CHECK(nodeE.get() == nodeC.get() * nodeD.get());
@@ -227,7 +248,7 @@ BOOST_AUTO_TEST_CASE(test_experts){
container->resolve_all();
VALIDATE_ALL_DEPENDENCIES
- //Ensure auto-resolve on read
+ // Ensure auto-resolve on read
tree->access<int>("E").get();
BOOST_CHECK(nodeC.get() == nodeA.get() + nodeB.get());
BOOST_CHECK(nodeE.get() == nodeC.get() * nodeD.get());
@@ -236,7 +257,7 @@ BOOST_AUTO_TEST_CASE(test_experts){
container->resolve_all(true);
VALIDATE_ALL_DEPENDENCIES
- //Resolve to/from
+ // Resolve to/from
tree->access<int>("A").set(-1);
container->resolve_to("C");
BOOST_CHECK(nodeC.get() == nodeA.get() + nodeB.get());
diff --git a/host/tests/fe_conn_test.cpp b/host/tests/fe_conn_test.cpp
index 34ebb7b33..bbf79835f 100644
--- a/host/tests/fe_conn_test.cpp
+++ b/host/tests/fe_conn_test.cpp
@@ -5,19 +5,20 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/usrp/fe_connection.hpp>
#include <uhd/exception.hpp>
+#include <uhd/usrp/fe_connection.hpp>
#include <boost/test/unit_test.hpp>
using namespace uhd::usrp;
-BOOST_AUTO_TEST_CASE(test_quardrature){
+BOOST_AUTO_TEST_CASE(test_quardrature)
+{
fe_connection_t IQ("IQ"), QI("QI"), IbQ("IbQ"), QbI("QbI"), QbIb("QbIb");
- BOOST_CHECK(IQ.get_sampling_mode()==fe_connection_t::QUADRATURE);
- BOOST_CHECK(QI.get_sampling_mode()==fe_connection_t::QUADRATURE);
- BOOST_CHECK(IbQ.get_sampling_mode()==fe_connection_t::QUADRATURE);
- BOOST_CHECK(QbI.get_sampling_mode()==fe_connection_t::QUADRATURE);
- BOOST_CHECK(QbIb.get_sampling_mode()==fe_connection_t::QUADRATURE);
+ BOOST_CHECK(IQ.get_sampling_mode() == fe_connection_t::QUADRATURE);
+ BOOST_CHECK(QI.get_sampling_mode() == fe_connection_t::QUADRATURE);
+ BOOST_CHECK(IbQ.get_sampling_mode() == fe_connection_t::QUADRATURE);
+ BOOST_CHECK(QbI.get_sampling_mode() == fe_connection_t::QUADRATURE);
+ BOOST_CHECK(QbIb.get_sampling_mode() == fe_connection_t::QUADRATURE);
BOOST_CHECK(not IQ.is_iq_swapped());
BOOST_CHECK(QI.is_iq_swapped());
@@ -38,12 +39,13 @@ BOOST_AUTO_TEST_CASE(test_quardrature){
BOOST_CHECK(QbIb.is_q_inverted());
}
-BOOST_AUTO_TEST_CASE(test_heterodyne){
+BOOST_AUTO_TEST_CASE(test_heterodyne)
+{
fe_connection_t II("II"), QQ("QQ"), IbIb("IbIb"), QbQb("QbQb");
- BOOST_CHECK(II.get_sampling_mode()==fe_connection_t::HETERODYNE);
- BOOST_CHECK(QQ.get_sampling_mode()==fe_connection_t::HETERODYNE);
- BOOST_CHECK(IbIb.get_sampling_mode()==fe_connection_t::HETERODYNE);
- BOOST_CHECK(QbQb.get_sampling_mode()==fe_connection_t::HETERODYNE);
+ BOOST_CHECK(II.get_sampling_mode() == fe_connection_t::HETERODYNE);
+ BOOST_CHECK(QQ.get_sampling_mode() == fe_connection_t::HETERODYNE);
+ BOOST_CHECK(IbIb.get_sampling_mode() == fe_connection_t::HETERODYNE);
+ BOOST_CHECK(QbQb.get_sampling_mode() == fe_connection_t::HETERODYNE);
BOOST_CHECK(not II.is_iq_swapped());
BOOST_CHECK(QQ.is_iq_swapped());
@@ -66,12 +68,13 @@ BOOST_AUTO_TEST_CASE(test_heterodyne){
BOOST_CHECK_THROW(fe_connection_t dummy("QbQ"), uhd::value_error);
}
-BOOST_AUTO_TEST_CASE(test_real){
+BOOST_AUTO_TEST_CASE(test_real)
+{
fe_connection_t I("I"), Q("Q"), Ib("Ib"), Qb("Qb");
- BOOST_CHECK(I.get_sampling_mode()==fe_connection_t::REAL);
- BOOST_CHECK(Q.get_sampling_mode()==fe_connection_t::REAL);
- BOOST_CHECK(Ib.get_sampling_mode()==fe_connection_t::REAL);
- BOOST_CHECK(Qb.get_sampling_mode()==fe_connection_t::REAL);
+ BOOST_CHECK(I.get_sampling_mode() == fe_connection_t::REAL);
+ BOOST_CHECK(Q.get_sampling_mode() == fe_connection_t::REAL);
+ BOOST_CHECK(Ib.get_sampling_mode() == fe_connection_t::REAL);
+ BOOST_CHECK(Qb.get_sampling_mode() == fe_connection_t::REAL);
BOOST_CHECK(not I.is_iq_swapped());
BOOST_CHECK(Q.is_iq_swapped());
@@ -89,7 +92,8 @@ BOOST_AUTO_TEST_CASE(test_real){
BOOST_CHECK(not Qb.is_q_inverted());
}
-BOOST_AUTO_TEST_CASE(test_invalid){
+BOOST_AUTO_TEST_CASE(test_invalid)
+{
BOOST_CHECK_THROW(fe_connection_t dummy("blah"), uhd::value_error);
BOOST_CHECK_THROW(fe_connection_t dummy("123456"), uhd::value_error);
BOOST_CHECK_THROW(fe_connection_t dummy("ii"), uhd::value_error);
diff --git a/host/tests/fp_compare_delta_test.cpp b/host/tests/fp_compare_delta_test.cpp
index 5023d660a..ae1f14281 100644
--- a/host/tests/fp_compare_delta_test.cpp
+++ b/host/tests/fp_compare_delta_test.cpp
@@ -10,20 +10,21 @@
using namespace uhd::math::fp_compare;
-BOOST_AUTO_TEST_CASE(fp_compare_delta_constructors) {
+BOOST_AUTO_TEST_CASE(fp_compare_delta_constructors)
+{
// Test default constructor
fp_compare_delta<float> alpha = fp_compare_delta<float>(7457392.0);
- fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value);
+ fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value);
BOOST_CHECK_EQUAL(alpha._value, beta._value);
BOOST_CHECK_EQUAL(alpha._delta, beta._delta);
// Test constructor with specified delta
- fp_compare_delta<float> foxtrot = fp_compare_delta<float>(alpha._value,
- uhd::math::SINGLE_PRECISION_DELTA);
- fp_compare_delta<float> gamma = fp_compare_delta<float>(alpha._value,
- 2 * uhd::math::SINGLE_PRECISION_DELTA);
+ fp_compare_delta<float> foxtrot =
+ fp_compare_delta<float>(alpha._value, uhd::math::SINGLE_PRECISION_DELTA);
+ fp_compare_delta<float> gamma =
+ fp_compare_delta<float>(alpha._value, 2 * uhd::math::SINGLE_PRECISION_DELTA);
BOOST_CHECK_EQUAL(alpha._delta, foxtrot._delta);
- BOOST_CHECK(not (alpha._delta == gamma._delta));
+ BOOST_CHECK(not(alpha._delta == gamma._delta));
// Test copy-constructor
fp_compare_delta<float> charlie = fp_compare_delta<float>(alpha);
@@ -36,19 +37,20 @@ BOOST_AUTO_TEST_CASE(fp_compare_delta_constructors) {
BOOST_CHECK_EQUAL(alpha._delta, delta._delta);
}
-BOOST_AUTO_TEST_CASE(double_compare_constructors) {
+BOOST_AUTO_TEST_CASE(double_compare_constructors)
+{
// Test default constructor
fp_compare_delta<double> alpha = fp_compare_delta<double>(45739210286.0101);
- fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value);
+ fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value);
BOOST_CHECK_EQUAL(alpha._value, beta._value);
BOOST_CHECK_EQUAL(alpha._delta, beta._delta);
// Test constructor with specified delta
- fp_compare_delta<double> foxtrot = fp_compare_delta<double>(alpha._value,
- uhd::math::DOUBLE_PRECISION_DELTA);
+ fp_compare_delta<double> foxtrot =
+ fp_compare_delta<double>(alpha._value, uhd::math::DOUBLE_PRECISION_DELTA);
fp_compare_delta<double> gamma = fp_compare_delta<double>(alpha._value, 2.0e-6);
BOOST_CHECK_EQUAL(alpha._delta, foxtrot._delta);
- BOOST_CHECK(not (alpha._delta == gamma._delta));
+ BOOST_CHECK(not(alpha._delta == gamma._delta));
// Test copy-constructor
fp_compare_delta<double> charlie = fp_compare_delta<double>(alpha);
@@ -61,56 +63,61 @@ BOOST_AUTO_TEST_CASE(double_compare_constructors) {
BOOST_CHECK_EQUAL(alpha._delta, delta._delta);
}
-BOOST_AUTO_TEST_CASE(float_equality_operators) {
+BOOST_AUTO_TEST_CASE(float_equality_operators)
+{
// Test basic equality operator
fp_compare_delta<float> alpha = fp_compare_delta<float>(1.0);
- fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value);
+ fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value);
BOOST_CHECK(alpha == beta);
BOOST_CHECK(alpha == float(alpha._value));
// Test equality edge case at difference = delta
- fp_compare_delta<float> charlie = fp_compare_delta<float>(alpha._value
- + uhd::math::SINGLE_PRECISION_DELTA);
- BOOST_CHECK(not (alpha == charlie));
- BOOST_CHECK(not (alpha == float(alpha._value + uhd::math::SINGLE_PRECISION_DELTA)));
+ fp_compare_delta<float> charlie =
+ fp_compare_delta<float>(alpha._value + uhd::math::SINGLE_PRECISION_DELTA);
+ BOOST_CHECK(not(alpha == charlie));
+ BOOST_CHECK(not(alpha == float(alpha._value + uhd::math::SINGLE_PRECISION_DELTA)));
}
-BOOST_AUTO_TEST_CASE(double_equality_operators) {
+BOOST_AUTO_TEST_CASE(double_equality_operators)
+{
// Test basic equality operator
fp_compare_delta<double> alpha = fp_compare_delta<double>(1.0);
- fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value);
+ fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value);
BOOST_CHECK(alpha == beta);
BOOST_CHECK(alpha == double(beta._value));
// Test equality edge case at delta = delta
- fp_compare_delta<double> charlie = fp_compare_delta<double>(alpha._value
- + uhd::math::DOUBLE_PRECISION_DELTA);
- BOOST_CHECK(not (alpha == charlie));
- BOOST_CHECK(not (alpha == double(alpha._value + uhd::math::DOUBLE_PRECISION_DELTA)));
+ fp_compare_delta<double> charlie =
+ fp_compare_delta<double>(alpha._value + uhd::math::DOUBLE_PRECISION_DELTA);
+ BOOST_CHECK(not(alpha == charlie));
+ BOOST_CHECK(not(alpha == double(alpha._value + uhd::math::DOUBLE_PRECISION_DELTA)));
}
-BOOST_AUTO_TEST_CASE(float_inequality_operators) {
+BOOST_AUTO_TEST_CASE(float_inequality_operators)
+{
// Test inequality operator, which is based on equality operator
fp_compare_delta<float> alpha = fp_compare_delta<float>(127.0f);
- fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value + 1.19e-3f);
+ fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value + 1.19e-3f);
BOOST_CHECK(alpha != beta);
BOOST_CHECK(alpha != float(alpha._value + 1.19e-3));
}
-BOOST_AUTO_TEST_CASE(double_inequality_operators) {
+BOOST_AUTO_TEST_CASE(double_inequality_operators)
+{
// Test inequality operator, which is based on equality operator
fp_compare_delta<double> alpha = fp_compare_delta<double>(1.0);
- fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value + 1.19e-5);
+ fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value + 1.19e-5);
BOOST_CHECK(alpha != beta);
BOOST_CHECK(alpha != double(alpha._value + 1.19e-5));
}
-BOOST_AUTO_TEST_CASE(float_lessthan_operators) {
+BOOST_AUTO_TEST_CASE(float_lessthan_operators)
+{
// Test less-than operator
fp_compare_delta<float> alpha = fp_compare_delta<float>(274192.7f);
- fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value - 0.2f);
+ fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value - 0.2f);
BOOST_CHECK(beta < alpha);
BOOST_CHECK(float(alpha._value - 0.2) < alpha);
@@ -118,14 +125,15 @@ BOOST_AUTO_TEST_CASE(float_lessthan_operators) {
// Confirm false less-than case
fp_compare_delta<float> charlie = fp_compare_delta<float>(alpha._value - 1.2f);
- BOOST_CHECK(not (alpha < charlie));
- BOOST_CHECK(not (alpha < float(alpha._value - 1.2f)));
+ BOOST_CHECK(not(alpha < charlie));
+ BOOST_CHECK(not(alpha < float(alpha._value - 1.2f)));
}
-BOOST_AUTO_TEST_CASE(double_lessthan_operators) {
+BOOST_AUTO_TEST_CASE(double_lessthan_operators)
+{
// Test less-than operator
fp_compare_delta<double> alpha = fp_compare_delta<double>(274192856.762312);
- fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value - 0.0002);
+ fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value - 0.0002);
BOOST_CHECK(beta < alpha);
BOOST_CHECK(double(alpha._value - 0.0002) < alpha);
@@ -133,14 +141,15 @@ BOOST_AUTO_TEST_CASE(double_lessthan_operators) {
// Confirm false less-than case
fp_compare_delta<double> charlie = fp_compare_delta<double>(alpha._value - 1.0012);
- BOOST_CHECK(not (alpha < charlie));
- BOOST_CHECK(not (alpha < double(alpha._value - 1.0012)));
+ BOOST_CHECK(not(alpha < charlie));
+ BOOST_CHECK(not(alpha < double(alpha._value - 1.0012)));
}
-BOOST_AUTO_TEST_CASE(float_lessthanequals_operators) {
+BOOST_AUTO_TEST_CASE(float_lessthanequals_operators)
+{
// Test that <= correctly reports for equal values
fp_compare_delta<float> alpha = fp_compare_delta<float>(827.3f);
- fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value);
+ fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value);
BOOST_CHECK(alpha <= beta);
BOOST_CHECK(alpha <= float(alpha._value));
@@ -152,10 +161,11 @@ BOOST_AUTO_TEST_CASE(float_lessthanequals_operators) {
BOOST_CHECK(float(alpha._value - 1.2) <= alpha);
}
-BOOST_AUTO_TEST_CASE(double_lessthanequals_operators) {
+BOOST_AUTO_TEST_CASE(double_lessthanequals_operators)
+{
// Test that <= correctly reports for equal values
fp_compare_delta<double> alpha = fp_compare_delta<double>(837652123.383764);
- fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value);
+ fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value);
BOOST_CHECK(alpha <= beta);
BOOST_CHECK(alpha <= double(alpha._value));
@@ -167,10 +177,11 @@ BOOST_AUTO_TEST_CASE(double_lessthanequals_operators) {
BOOST_CHECK(double(alpha._value - 0.0012) <= alpha);
}
-BOOST_AUTO_TEST_CASE(float_greaterthan_operators) {
+BOOST_AUTO_TEST_CASE(float_greaterthan_operators)
+{
// Test basic greater-than functionality
fp_compare_delta<float> alpha = fp_compare_delta<float>(98325.4f);
- fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value + 0.15f);
+ fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value + 0.15f);
BOOST_CHECK(beta > alpha);
BOOST_CHECK(float(alpha._value + 0.15) > alpha);
@@ -178,14 +189,15 @@ BOOST_AUTO_TEST_CASE(float_greaterthan_operators) {
// Test false greater-than case
fp_compare_delta<float> charlie = fp_compare_delta<float>(alpha._value + 1.2f);
- BOOST_CHECK(not (alpha > charlie));
- BOOST_CHECK(not (alpha > float(alpha._value + 1.2)));
+ BOOST_CHECK(not(alpha > charlie));
+ BOOST_CHECK(not(alpha > float(alpha._value + 1.2)));
}
-BOOST_AUTO_TEST_CASE(double_greaterthan_operators) {
+BOOST_AUTO_TEST_CASE(double_greaterthan_operators)
+{
// Test basic greater-than functionality
fp_compare_delta<double> alpha = fp_compare_delta<double>(643907213.428475);
- fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value + 0.0002);
+ fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value + 0.0002);
BOOST_CHECK(beta > alpha);
BOOST_CHECK(double(alpha._value + 0.0002) > alpha);
@@ -193,14 +205,15 @@ BOOST_AUTO_TEST_CASE(double_greaterthan_operators) {
// Test false greater-than case
fp_compare_delta<double> charlie = fp_compare_delta<double>(alpha._value + 0.0012);
- BOOST_CHECK(not (alpha > charlie));
- BOOST_CHECK(not (alpha > double(alpha._value + 0.0012)));
+ BOOST_CHECK(not(alpha > charlie));
+ BOOST_CHECK(not(alpha > double(alpha._value + 0.0012)));
}
-BOOST_AUTO_TEST_CASE(float_greaterthanequals_operators) {
+BOOST_AUTO_TEST_CASE(float_greaterthanequals_operators)
+{
// Test that >= correctly reports for equal values
fp_compare_delta<float> alpha = fp_compare_delta<float>(7834.89f);
- fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value);
+ fp_compare_delta<float> beta = fp_compare_delta<float>(alpha._value);
BOOST_CHECK(alpha >= beta);
BOOST_CHECK(alpha >= float(alpha._value));
@@ -212,10 +225,11 @@ BOOST_AUTO_TEST_CASE(float_greaterthanequals_operators) {
BOOST_CHECK(float(alpha._value + 4.8) >= alpha);
}
-BOOST_AUTO_TEST_CASE(double_greaterthanequals_operators) {
+BOOST_AUTO_TEST_CASE(double_greaterthanequals_operators)
+{
// Test that >= correctly reports for equal values
fp_compare_delta<double> alpha = fp_compare_delta<double>(737623834.89843);
- fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value);
+ fp_compare_delta<double> beta = fp_compare_delta<double>(alpha._value);
BOOST_CHECK(alpha >= beta);
BOOST_CHECK(alpha >= double(alpha._value));
@@ -227,16 +241,20 @@ BOOST_AUTO_TEST_CASE(double_greaterthanequals_operators) {
BOOST_CHECK(double(alpha._value + 3.0008) >= alpha);
}
-BOOST_AUTO_TEST_CASE(fp_compare_large_delta) {
- BOOST_CHECK(fp_compare_delta<double>(61440000.047870710492, 0.1) == 61440000.000000000000);
- BOOST_CHECK(fp_compare_delta<double>(61440000.047870710492, 0.1) <= 61440000.000000000000);
- BOOST_CHECK(fp_compare_delta<double>(61440000.047870710492, 0.1) >= 61440000.000000000000);
+BOOST_AUTO_TEST_CASE(fp_compare_large_delta)
+{
+ BOOST_CHECK(
+ fp_compare_delta<double>(61440000.047870710492, 0.1) == 61440000.000000000000);
+ BOOST_CHECK(
+ fp_compare_delta<double>(61440000.047870710492, 0.1) <= 61440000.000000000000);
+ BOOST_CHECK(
+ fp_compare_delta<double>(61440000.047870710492, 0.1) >= 61440000.000000000000);
BOOST_CHECK(fp_compare_delta<double>(1.0, 10.0) == 2.0);
}
-BOOST_AUTO_TEST_CASE(frequency_compare_function) {
-
+BOOST_AUTO_TEST_CASE(frequency_compare_function)
+{
BOOST_CHECK(uhd::math::frequencies_are_equal(6817333232.0, 6817333232.0));
BOOST_CHECK(!uhd::math::frequencies_are_equal(6817333233.0, 6817333232.0));
BOOST_CHECK(uhd::math::frequencies_are_equal(6817333232.1, 6817333232.1));
diff --git a/host/tests/fp_compare_epsilon_test.cpp b/host/tests/fp_compare_epsilon_test.cpp
index 5e5971586..0c2a7f1cb 100644
--- a/host/tests/fp_compare_epsilon_test.cpp
+++ b/host/tests/fp_compare_epsilon_test.cpp
@@ -10,19 +10,20 @@
using namespace uhd::math::fp_compare;
-BOOST_AUTO_TEST_CASE(fp_compare_epsilon_constructors) {
+BOOST_AUTO_TEST_CASE(fp_compare_epsilon_constructors)
+{
// Test default constructor
fp_compare_epsilon<float> alpha = fp_compare_epsilon<float>(7457392.0);
- fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value);
+ fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value);
BOOST_CHECK_EQUAL(alpha._value, beta._value);
BOOST_CHECK_EQUAL(alpha._epsilon, beta._epsilon);
// Test constructor with specified epsilon
- fp_compare_epsilon<float> foxtrot = fp_compare_epsilon<float>(alpha._value,
- uhd::math::SINGLE_PRECISION_EPSILON);
+ fp_compare_epsilon<float> foxtrot =
+ fp_compare_epsilon<float>(alpha._value, uhd::math::SINGLE_PRECISION_EPSILON);
fp_compare_epsilon<float> gamma = fp_compare_epsilon<float>(alpha._value, 2.0e-1f);
BOOST_CHECK_EQUAL(alpha._epsilon, foxtrot._epsilon);
- BOOST_CHECK(not (alpha._epsilon == gamma._epsilon));
+ BOOST_CHECK(not(alpha._epsilon == gamma._epsilon));
// Test copy-constructor
fp_compare_epsilon<float> charlie = fp_compare_epsilon<float>(alpha);
@@ -35,19 +36,20 @@ BOOST_AUTO_TEST_CASE(fp_compare_epsilon_constructors) {
BOOST_CHECK_EQUAL(alpha._epsilon, delta._epsilon);
}
-BOOST_AUTO_TEST_CASE(double_compare_constructors) {
+BOOST_AUTO_TEST_CASE(double_compare_constructors)
+{
// Test default constructor
fp_compare_epsilon<double> alpha = fp_compare_epsilon<double>(45739210286.0101);
- fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value);
+ fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value);
BOOST_CHECK_EQUAL(alpha._value, beta._value);
BOOST_CHECK_EQUAL(alpha._epsilon, beta._epsilon);
// Test constructor with specified epsilon
- fp_compare_epsilon<double> foxtrot = fp_compare_epsilon<double>(alpha._value,
- uhd::math::DOUBLE_PRECISION_EPSILON);
+ fp_compare_epsilon<double> foxtrot =
+ fp_compare_epsilon<double>(alpha._value, uhd::math::DOUBLE_PRECISION_EPSILON);
fp_compare_epsilon<double> gamma = fp_compare_epsilon<double>(alpha._value, 2.0e-6);
BOOST_CHECK_EQUAL(alpha._epsilon, foxtrot._epsilon);
- BOOST_CHECK(not (alpha._epsilon == gamma._epsilon));
+ BOOST_CHECK(not(alpha._epsilon == gamma._epsilon));
// Test copy-constructor
fp_compare_epsilon<double> charlie = fp_compare_epsilon<double>(alpha);
@@ -60,45 +62,48 @@ BOOST_AUTO_TEST_CASE(double_compare_constructors) {
BOOST_CHECK_EQUAL(alpha._epsilon, delta._epsilon);
}
-BOOST_AUTO_TEST_CASE(float_equality_operators) {
+BOOST_AUTO_TEST_CASE(float_equality_operators)
+{
// Test basic equality operator
fp_compare_epsilon<float> alpha = fp_compare_epsilon<float>(1.0);
- fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value);
+ fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value);
BOOST_CHECK(alpha == beta);
BOOST_CHECK(alpha == float(alpha._value));
// Test equality edge case at delta = epsilon
- fp_compare_epsilon<float> charlie = fp_compare_epsilon<float>(alpha._value
- + uhd::math::SINGLE_PRECISION_EPSILON);
- BOOST_CHECK(not (alpha == charlie));
- BOOST_CHECK(not (alpha == float(alpha._value + uhd::math::SINGLE_PRECISION_EPSILON)));
+ fp_compare_epsilon<float> charlie =
+ fp_compare_epsilon<float>(alpha._value + uhd::math::SINGLE_PRECISION_EPSILON);
+ BOOST_CHECK(not(alpha == charlie));
+ BOOST_CHECK(not(alpha == float(alpha._value + uhd::math::SINGLE_PRECISION_EPSILON)));
}
-BOOST_AUTO_TEST_CASE(double_equality_operators) {
+BOOST_AUTO_TEST_CASE(double_equality_operators)
+{
// Test basic equality operator
fp_compare_epsilon<double> alpha = fp_compare_epsilon<double>(1.0);
- fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value);
+ fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value);
BOOST_CHECK(alpha == beta);
BOOST_CHECK(alpha == double(beta._value));
// Test equality edge case at delta = epsilon
- fp_compare_epsilon<double> charlie = fp_compare_epsilon<double>(alpha._value
- + uhd::math::DOUBLE_PRECISION_EPSILON);
- BOOST_CHECK(not (alpha == charlie));
- BOOST_CHECK(not (alpha == double(alpha._value
- + uhd::math::DOUBLE_PRECISION_EPSILON)));
+ fp_compare_epsilon<double> charlie =
+ fp_compare_epsilon<double>(alpha._value + uhd::math::DOUBLE_PRECISION_EPSILON);
+ BOOST_CHECK(not(alpha == charlie));
+ BOOST_CHECK(not(alpha == double(alpha._value + uhd::math::DOUBLE_PRECISION_EPSILON)));
}
-BOOST_AUTO_TEST_CASE(float_inequality_operators) {
+BOOST_AUTO_TEST_CASE(float_inequality_operators)
+{
// Test inequality operator, which is based on equality operator
fp_compare_epsilon<float> alpha = fp_compare_epsilon<float>(127.0);
- fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value + 1.19e-5f);
+ fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value + 1.19e-5f);
BOOST_CHECK(alpha != beta);
BOOST_CHECK(alpha != float(alpha._value + 1.19e-5f));
}
-BOOST_AUTO_TEST_CASE(double_inequality_operators) {
+BOOST_AUTO_TEST_CASE(double_inequality_operators)
+{
// Test inequality operator, which is based on equality operator
fp_compare_epsilon<double> alpha = fp_compare_epsilon<double>(1.0);
fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value + 1.19e-10);
@@ -107,10 +112,11 @@ BOOST_AUTO_TEST_CASE(double_inequality_operators) {
BOOST_CHECK(alpha != double(alpha._value + 1.19e-10));
}
-BOOST_AUTO_TEST_CASE(float_lessthan_operators) {
+BOOST_AUTO_TEST_CASE(float_lessthan_operators)
+{
// Test less-than operator
fp_compare_epsilon<float> alpha = fp_compare_epsilon<float>(274192.7f);
- fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value - 0.15f);
+ fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value - 0.15f);
BOOST_CHECK(beta < alpha);
BOOST_CHECK(float(alpha._value - 0.15) < alpha);
@@ -118,29 +124,32 @@ BOOST_AUTO_TEST_CASE(float_lessthan_operators) {
// Confirm false less-than case
fp_compare_epsilon<float> charlie = fp_compare_epsilon<float>(alpha._value - 1.2f);
- BOOST_CHECK(not (alpha < charlie));
- BOOST_CHECK(not (alpha < float(alpha._value - 1.2f)));
+ BOOST_CHECK(not(alpha < charlie));
+ BOOST_CHECK(not(alpha < float(alpha._value - 1.2f)));
}
-BOOST_AUTO_TEST_CASE(double_lessthan_operators) {
+BOOST_AUTO_TEST_CASE(double_lessthan_operators)
+{
// Test less-than operator
fp_compare_epsilon<double> alpha = fp_compare_epsilon<double>(274192856.762312);
- fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value - 0.0002);
+ fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value - 0.0002);
BOOST_CHECK(beta < alpha);
BOOST_CHECK(double(alpha._value - 0.0002) < alpha);
// Confirm false less-than case
- fp_compare_epsilon<double> charlie = fp_compare_epsilon<double>(alpha._value - 1.0012);
+ fp_compare_epsilon<double> charlie =
+ fp_compare_epsilon<double>(alpha._value - 1.0012);
- BOOST_CHECK(not (alpha < charlie));
- BOOST_CHECK(not (alpha < double(alpha._value - 1.0012)));
+ BOOST_CHECK(not(alpha < charlie));
+ BOOST_CHECK(not(alpha < double(alpha._value - 1.0012)));
}
-BOOST_AUTO_TEST_CASE(float_lessthanequals_operators) {
+BOOST_AUTO_TEST_CASE(float_lessthanequals_operators)
+{
// Test that <= correctly reports for equal values
fp_compare_epsilon<float> alpha = fp_compare_epsilon<float>(827.3f);
- fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value);
+ fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value);
BOOST_CHECK(alpha <= beta);
BOOST_CHECK(alpha <= float(alpha._value));
@@ -152,25 +161,28 @@ BOOST_AUTO_TEST_CASE(float_lessthanequals_operators) {
BOOST_CHECK(float(alpha._value - 1.2) <= alpha);
}
-BOOST_AUTO_TEST_CASE(double_lessthanequals_operators) {
+BOOST_AUTO_TEST_CASE(double_lessthanequals_operators)
+{
// Test that <= correctly reports for equal values
fp_compare_epsilon<double> alpha = fp_compare_epsilon<double>(837652123.383764);
- fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value);
+ fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value);
BOOST_CHECK(alpha <= beta);
BOOST_CHECK(alpha <= double(alpha._value));
// Test that <= correctly reports for less-than values
- fp_compare_epsilon<double> charlie = fp_compare_epsilon<double>(alpha._value - 0.0012);
+ fp_compare_epsilon<double> charlie =
+ fp_compare_epsilon<double>(alpha._value - 0.0012);
BOOST_CHECK(charlie <= alpha);
BOOST_CHECK(double(alpha._value - 0.0012) <= alpha);
}
-BOOST_AUTO_TEST_CASE(float_greaterthan_operators) {
+BOOST_AUTO_TEST_CASE(float_greaterthan_operators)
+{
// Test basic greater-than functionality
fp_compare_epsilon<float> alpha = fp_compare_epsilon<float>(98325.4f);
- fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value + 0.15f);
+ fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value + 0.15f);
BOOST_CHECK(beta > alpha);
BOOST_CHECK(float(alpha._value + 0.15) > alpha);
@@ -178,29 +190,32 @@ BOOST_AUTO_TEST_CASE(float_greaterthan_operators) {
// Test false greater-than case
fp_compare_epsilon<float> charlie = fp_compare_epsilon<float>(alpha._value + 1.2f);
- BOOST_CHECK(not (alpha > charlie));
- BOOST_CHECK(not (alpha > float(alpha._value + 1.2f)));
+ BOOST_CHECK(not(alpha > charlie));
+ BOOST_CHECK(not(alpha > float(alpha._value + 1.2f)));
}
-BOOST_AUTO_TEST_CASE(double_greaterthan_operators) {
+BOOST_AUTO_TEST_CASE(double_greaterthan_operators)
+{
// Test basic greater-than functionality
fp_compare_epsilon<double> alpha = fp_compare_epsilon<double>(643907213.428475);
- fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value + 0.0002);
+ fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value + 0.0002);
BOOST_CHECK(beta > alpha);
BOOST_CHECK(double(alpha._value + 0.0002) > alpha);
// Test false greater-than case
- fp_compare_epsilon<double> charlie = fp_compare_epsilon<double>(alpha._value + 0.0012);
+ fp_compare_epsilon<double> charlie =
+ fp_compare_epsilon<double>(alpha._value + 0.0012);
- BOOST_CHECK(not (alpha > charlie));
- BOOST_CHECK(not (alpha > double(alpha._value + 0.0012)));
+ BOOST_CHECK(not(alpha > charlie));
+ BOOST_CHECK(not(alpha > double(alpha._value + 0.0012)));
}
-BOOST_AUTO_TEST_CASE(float_greaterthanequals_operators) {
+BOOST_AUTO_TEST_CASE(float_greaterthanequals_operators)
+{
// Test that >= correctly reports for equal values
fp_compare_epsilon<float> alpha = fp_compare_epsilon<float>(7834.89f);
- fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value);
+ fp_compare_epsilon<float> beta = fp_compare_epsilon<float>(alpha._value);
BOOST_CHECK(alpha >= beta);
BOOST_CHECK(alpha >= float(alpha._value));
@@ -212,16 +227,18 @@ BOOST_AUTO_TEST_CASE(float_greaterthanequals_operators) {
BOOST_CHECK(float(alpha._value + 4.8f) >= alpha);
}
-BOOST_AUTO_TEST_CASE(double_greaterthanequals_operators) {
+BOOST_AUTO_TEST_CASE(double_greaterthanequals_operators)
+{
// Test that >= correctly reports for equal values
fp_compare_epsilon<double> alpha = fp_compare_epsilon<double>(737623834.89843);
- fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value);
+ fp_compare_epsilon<double> beta = fp_compare_epsilon<double>(alpha._value);
BOOST_CHECK(alpha >= beta);
BOOST_CHECK(alpha >= double(alpha._value));
// Test that >= correctly reports for greater-than values
- fp_compare_epsilon<double> charlie = fp_compare_epsilon<double>(alpha._value + 3.0008);
+ fp_compare_epsilon<double> charlie =
+ fp_compare_epsilon<double>(alpha._value + 3.0008);
BOOST_CHECK(charlie >= alpha);
BOOST_CHECK(double(alpha._value + 3.0008) >= alpha);
diff --git a/host/tests/gain_group_test.cpp b/host/tests/gain_group_test.cpp
index b8c15b479..2608f292d 100644
--- a/host/tests/gain_group_test.cpp
+++ b/host/tests/gain_group_test.cpp
@@ -5,10 +5,10 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/utils/gain_group.hpp>
#include <boost/bind.hpp>
#include <boost/math/special_functions/round.hpp>
+#include <boost/test/unit_test.hpp>
#include <iostream>
#define rint(x) boost::math::iround(x)
@@ -18,56 +18,63 @@ using namespace uhd;
/***********************************************************************
* Define gain element classes with needed functions
**********************************************************************/
-class gain_element1{
+class gain_element1
+{
public:
-
- gain_range_t get_range(void){
+ gain_range_t get_range(void)
+ {
return gain_range_t(0, 90, 1);
}
- double get_value(void){
+ double get_value(void)
+ {
return _gain;
}
- void set_value(double gain){
+ void set_value(double gain)
+ {
double step = get_range().step();
- _gain = step*rint(gain/step);
+ _gain = step * rint(gain / step);
}
private:
double _gain;
};
-class gain_element2{
+class gain_element2
+{
public:
-
- gain_range_t get_range(void){
+ gain_range_t get_range(void)
+ {
return gain_range_t(-20, 10, 0.1);
}
- double get_value(void){
+ double get_value(void)
+ {
return _gain;
}
- void set_value(double gain){
+ void set_value(double gain)
+ {
double step = get_range().step();
- _gain = step*rint(gain/step);
+ _gain = step * rint(gain / step);
}
private:
double _gain;
};
-//create static instances of gain elements to be shared by the tests
+// create static instances of gain elements to be shared by the tests
static gain_element1 g1;
static gain_element2 g2;
-static gain_group::sptr get_gain_group(size_t pri1 = 0, size_t pri2 = 0){
- //create instance of gain group
+static gain_group::sptr get_gain_group(size_t pri1 = 0, size_t pri2 = 0)
+{
+ // create instance of gain group
gain_fcns_t gain_fcns;
gain_group::sptr gg(gain_group::make());
- //load gain group with function sets
+ // load gain group with function sets
gain_fcns.get_range = boost::bind(&gain_element1::get_range, &g1);
gain_fcns.get_value = boost::bind(&gain_element1::get_value, &g1);
gain_fcns.set_value = boost::bind(&gain_element1::set_value, &g1, _1);
@@ -86,10 +93,11 @@ static gain_group::sptr get_gain_group(size_t pri1 = 0, size_t pri2 = 0){
**********************************************************************/
static const double tolerance = 0.001;
-BOOST_AUTO_TEST_CASE(test_gain_group_overall){
+BOOST_AUTO_TEST_CASE(test_gain_group_overall)
+{
gain_group::sptr gg = get_gain_group();
- //test the overall stuff
+ // test the overall stuff
gg->set_value(80);
BOOST_CHECK_CLOSE(gg->get_value(), 80.0, tolerance);
BOOST_CHECK_CLOSE(gg->get_range().start(), -20.0, tolerance);
@@ -97,16 +105,17 @@ BOOST_AUTO_TEST_CASE(test_gain_group_overall){
BOOST_CHECK_CLOSE(gg->get_range().step(), 0.1, tolerance);
}
-BOOST_AUTO_TEST_CASE(test_gain_group_priority){
+BOOST_AUTO_TEST_CASE(test_gain_group_priority)
+{
gain_group::sptr gg = get_gain_group(0, 1);
- //test the overall stuff
+ // test the overall stuff
gg->set_value(80);
BOOST_CHECK_CLOSE(gg->get_value(), 80.0, tolerance);
BOOST_CHECK_CLOSE(gg->get_range().start(), -20.0, tolerance);
BOOST_CHECK_CLOSE(gg->get_range().stop(), 100.0, tolerance);
BOOST_CHECK_CLOSE(gg->get_range().step(), 0.1, tolerance);
- //test the the higher priority gain got filled first (gain 2)
+ // test the the higher priority gain got filled first (gain 2)
BOOST_CHECK_CLOSE(g2.get_value(), g2.get_range().stop(), tolerance);
}
diff --git a/host/tests/graph.hpp b/host/tests/graph.hpp
index 50a87d307..fb36ae510 100644
--- a/host/tests/graph.hpp
+++ b/host/tests/graph.hpp
@@ -15,23 +15,28 @@
#define MAKE_NODE(name) test_node::sptr name(new test_node(#name));
// Smallest possible test class
-class test_node : virtual public uhd::rfnoc::sink_node_ctrl, virtual public uhd::rfnoc::source_node_ctrl
+class test_node : virtual public uhd::rfnoc::sink_node_ctrl,
+ virtual public uhd::rfnoc::source_node_ctrl
{
public:
typedef boost::shared_ptr<test_node> sptr;
- test_node(const std::string &test_id) : _test_id(test_id) {};
+ test_node(const std::string& test_id) : _test_id(test_id){};
- void issue_stream_cmd(const uhd::stream_cmd_t &, const size_t) {/* nop */};
+ void issue_stream_cmd(const uhd::stream_cmd_t&, const size_t){/* nop */};
- std::string get_test_id() const { return _test_id; };
+ std::string get_test_id() const
+ {
+ return _test_id;
+ };
private:
const std::string _test_id;
}; /* class test_node */
-void connect_nodes(uhd::rfnoc::source_node_ctrl::sptr A, uhd::rfnoc::sink_node_ctrl::sptr B)
+void connect_nodes(
+ uhd::rfnoc::source_node_ctrl::sptr A, uhd::rfnoc::sink_node_ctrl::sptr B)
{
const size_t actual_src_port = A->connect_downstream(B);
const size_t actual_dst_port = B->connect_upstream(A);
diff --git a/host/tests/graph_search_test.cpp b/host/tests/graph_search_test.cpp
index 8d35b3b1a..932647d98 100644
--- a/host/tests/graph_search_test.cpp
+++ b/host/tests/graph_search_test.cpp
@@ -17,7 +17,7 @@ class result_node : public test_node
public:
typedef boost::shared_ptr<result_node> sptr;
- result_node(const std::string &test_id) : test_node(test_id) {};
+ result_node(const std::string& test_id) : test_node(test_id){};
}; /* class result_node */
@@ -49,12 +49,12 @@ BOOST_AUTO_TEST_CASE(test_simple_downstream_search)
connect_nodes(node_A, node_B1);
// We're still searching for test_node, so any downstream block will match
- std::vector< test_node::sptr > result = node_A->find_downstream_node<test_node>();
+ std::vector<test_node::sptr> result = node_A->find_downstream_node<test_node>();
BOOST_REQUIRE(result.size() == 2);
BOOST_CHECK(
- (result[0]->get_test_id() == "node_B0" and result[1]->get_test_id() == "node_B1") or
- (result[1]->get_test_id() == "node_B0" and result[0]->get_test_id() == "node_B1")
- );
+ (result[0]->get_test_id() == "node_B0" and result[1]->get_test_id() == "node_B1")
+ or (result[1]->get_test_id() == "node_B0"
+ and result[0]->get_test_id() == "node_B1"));
BOOST_CHECK(result[0] == node_B0 or result[0] == node_B1);
}
@@ -69,11 +69,11 @@ BOOST_AUTO_TEST_CASE(test_linear_downstream_search)
connect_nodes(node_B, node_C);
// This time, we search for result_node
- std::vector< result_node::sptr > result = node_A->find_downstream_node<result_node>();
+ std::vector<result_node::sptr> result = node_A->find_downstream_node<result_node>();
std::cout << "size: " << result.size() << std::endl;
BOOST_CHECK_EQUAL(result.size(), 1);
BOOST_CHECK_EQUAL(result[0]->get_test_id(), "node_B");
- for(const result_node::sptr &node: result) {
+ for (const result_node::sptr& node : result) {
std::cout << node->get_test_id() << std::endl;
}
}
@@ -99,9 +99,9 @@ BOOST_AUTO_TEST_CASE(test_multi_iter_downstream_search)
connect_nodes(node_C0, node_D0);
// This time, we search for result_node
- std::vector< result_node::sptr > result = node_A->find_downstream_node<result_node>();
+ std::vector<result_node::sptr> result = node_A->find_downstream_node<result_node>();
BOOST_REQUIRE(result.size() == 4);
- for(const result_node::sptr &node: result) {
+ for (const result_node::sptr& node : result) {
std::cout << node->get_test_id() << std::endl;
}
}
@@ -120,7 +120,8 @@ BOOST_AUTO_TEST_CASE(test_multi_iter_cycle_downstream_search)
// Slightly more complex graph:
connect_nodes(node_A, node_B0);
// This connection goes both ways, causing a cycle
- connect_nodes(node_A, node_B1); connect_nodes(node_B1, node_A);
+ connect_nodes(node_A, node_B1);
+ connect_nodes(node_B1, node_A);
connect_nodes(node_B0, node_C0);
connect_nodes(node_B0, node_C1);
connect_nodes(node_B1, node_C2);
@@ -128,9 +129,9 @@ BOOST_AUTO_TEST_CASE(test_multi_iter_cycle_downstream_search)
connect_nodes(node_C0, node_D0);
// This time, we search for result_node
- std::vector< result_node::sptr > result = node_A->find_downstream_node<result_node>();
+ std::vector<result_node::sptr> result = node_A->find_downstream_node<result_node>();
BOOST_REQUIRE(result.size() == 4);
- for(const result_node::sptr &node: result) {
+ for (const result_node::sptr& node : result) {
std::cout << node->get_test_id() << std::endl;
}
}
@@ -141,9 +142,10 @@ BOOST_AUTO_TEST_CASE(test_mini_cycle_downstream_and_upstream)
MAKE_NODE(node_B);
// Connect them in a loop
- connect_nodes(node_A, node_B); connect_nodes(node_B, node_A);
+ connect_nodes(node_A, node_B);
+ connect_nodes(node_B, node_A);
- std::vector< test_node::sptr > result;
+ std::vector<test_node::sptr> result;
result = node_A->find_downstream_node<test_node>();
BOOST_REQUIRE_EQUAL(result.size(), 1);
BOOST_REQUIRE(result[0] == node_B);
diff --git a/host/tests/log_test.cpp b/host/tests/log_test.cpp
index 5e3ce0199..d9eae09f1 100644
--- a/host/tests/log_test.cpp
+++ b/host/tests/log_test.cpp
@@ -5,34 +5,25 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/log_add.hpp>
+#include <boost/test/unit_test.hpp>
#include <iostream>
-BOOST_AUTO_TEST_CASE(test_messages){
+BOOST_AUTO_TEST_CASE(test_messages)
+{
UHD_LOG_FASTPATH("foo");
UHD_LOG_FASTPATH("bar");
uhd::log::set_log_level(uhd::log::debug);
uhd::log::set_console_level(uhd::log::info);
- uhd::log::add_logger("test",
- [](const uhd::log::logging_info &I){
- std::cout << "<TEST> " << I.message << std::endl;
- }
- );
+ uhd::log::add_logger("test", [](const uhd::log::logging_info& I) {
+ std::cout << "<TEST> " << I.message << std::endl;
+ });
uhd::log::set_logger_level("test", uhd::log::debug);
- UHD_LOGGER_DEBUG("logger_test") <<
- "This is a test print for a debug log."
- ;
- UHD_LOGGER_INFO("logger_test") <<
- "This is a test print for a info log."
- ;
- UHD_LOGGER_WARNING("logger_test") <<
- "This is a test print for a warning log."
- ;
- UHD_LOGGER_ERROR("logger_test") <<
- "This is a test print for an error log."
- ;
+ UHD_LOGGER_DEBUG("logger_test") << "This is a test print for a debug log.";
+ UHD_LOGGER_INFO("logger_test") << "This is a test print for a info log.";
+ UHD_LOGGER_WARNING("logger_test") << "This is a test print for a warning log.";
+ UHD_LOGGER_ERROR("logger_test") << "This is a test print for an error log.";
UHD_HERE();
const int x = 42;
UHD_VAR(x);
diff --git a/host/tests/math_test.cpp b/host/tests/math_test.cpp
index 131016091..ffdcbb086 100644
--- a/host/tests/math_test.cpp
+++ b/host/tests/math_test.cpp
@@ -5,15 +5,15 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
-#include <stdint.h>
#include <uhd/utils/math.hpp>
+#include <stdint.h>
+#include <boost/test/unit_test.hpp>
// NOTE: This is not the only math test case, see e.g. special tests
// for fp comparison.
-BOOST_AUTO_TEST_CASE(test_log2){
+BOOST_AUTO_TEST_CASE(test_log2)
+{
double y = uhd::math::log2(16.0);
BOOST_CHECK_EQUAL(y, 4.0);
}
-
diff --git a/host/tests/module_test.cpp b/host/tests/module_test.cpp
index 8914c56a1..c81d8563f 100644
--- a/host/tests/module_test.cpp
+++ b/host/tests/module_test.cpp
@@ -8,7 +8,8 @@
#include <uhd/utils/static.hpp>
#include <iostream>
-UHD_STATIC_BLOCK(module_test){
+UHD_STATIC_BLOCK(module_test)
+{
std::cout << "---------------------------------------" << std::endl;
std::cout << "-- Good news, everyone!" << std::endl;
std::cout << "-- The test module has been loaded." << std::endl;
diff --git a/host/tests/narrow_cast_test.cpp b/host/tests/narrow_cast_test.cpp
index c108c310e..3ea7db1bf 100644
--- a/host/tests/narrow_cast_test.cpp
+++ b/host/tests/narrow_cast_test.cpp
@@ -11,11 +11,12 @@
using namespace uhd;
-BOOST_AUTO_TEST_CASE(test_narrow){
+BOOST_AUTO_TEST_CASE(test_narrow)
+{
uint16_t x = 5;
- uint8_t y = narrow_cast<uint8_t>(x);
+ uint8_t y = narrow_cast<uint8_t>(x);
BOOST_CHECK_EQUAL(x, y);
- BOOST_CHECK_THROW(narrow<uint8_t>(uint16_t(1<<10)), narrowing_error);
+ BOOST_CHECK_THROW(narrow<uint8_t>(uint16_t(1 << 10)), narrowing_error);
BOOST_CHECK_THROW(narrow<uint8_t>(int8_t(-1)), narrowing_error);
}
diff --git a/host/tests/nocscript_common.hpp b/host/tests/nocscript_common.hpp
index 4176fec6f..ad254fa0e 100644
--- a/host/tests/nocscript_common.hpp
+++ b/host/tests/nocscript_common.hpp
@@ -11,15 +11,20 @@
using namespace uhd::rfnoc::nocscript;
// Some global defs to make tests easier to write
-expression_function::argtype_list_type one_int_arg = boost::assign::list_of(expression::TYPE_INT);
-expression_function::argtype_list_type two_int_args = boost::assign::list_of(expression::TYPE_INT)(expression::TYPE_INT);
-expression_function::argtype_list_type one_double_arg = boost::assign::list_of(expression::TYPE_DOUBLE);
-expression_function::argtype_list_type two_double_args = boost::assign::list_of(expression::TYPE_DOUBLE)(expression::TYPE_DOUBLE);
-expression_function::argtype_list_type one_bool_arg = boost::assign::list_of(expression::TYPE_BOOL);
-expression_function::argtype_list_type two_bool_args = boost::assign::list_of(expression::TYPE_BOOL)(expression::TYPE_BOOL);
+expression_function::argtype_list_type one_int_arg =
+ boost::assign::list_of(expression::TYPE_INT);
+expression_function::argtype_list_type two_int_args =
+ boost::assign::list_of(expression::TYPE_INT)(expression::TYPE_INT);
+expression_function::argtype_list_type one_double_arg =
+ boost::assign::list_of(expression::TYPE_DOUBLE);
+expression_function::argtype_list_type two_double_args =
+ boost::assign::list_of(expression::TYPE_DOUBLE)(expression::TYPE_DOUBLE);
+expression_function::argtype_list_type one_bool_arg =
+ boost::assign::list_of(expression::TYPE_BOOL);
+expression_function::argtype_list_type two_bool_args =
+ boost::assign::list_of(expression::TYPE_BOOL)(expression::TYPE_BOOL);
expression_function::argtype_list_type no_args;
expression_container::expr_list_type empty_arg_list;
#define E(x) expression_literal::make(x)
-
diff --git a/host/tests/nocscript_expr_test.cpp b/host/tests/nocscript_expr_test.cpp
index 19b4345c2..ed5f6598d 100644
--- a/host/tests/nocscript_expr_test.cpp
+++ b/host/tests/nocscript_expr_test.cpp
@@ -6,16 +6,15 @@
//
#include "../lib/rfnoc/nocscript/function_table.hpp"
-#include <boost/test/unit_test.hpp>
-#include <boost/test/floating_point_comparison.hpp>
+#include "nocscript_common.hpp"
#include <boost/bind.hpp>
-#include <boost/make_shared.hpp>
#include <boost/format.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/test/floating_point_comparison.hpp>
+#include <boost/test/unit_test.hpp>
#include <algorithm>
#include <iostream>
-#include "nocscript_common.hpp"
-
// We need this global variable for one of the later tests
int and_counter = 0;
@@ -65,15 +64,15 @@ BOOST_AUTO_TEST_CASE(test_literals)
BOOST_CHECK_EQUAL(literal_int_vec.infer_type(), expression::TYPE_INT_VECTOR);
std::vector<int> test_data{1, 2, 3};
std::vector<int> result = literal_int_vec.get_int_vector();
- BOOST_CHECK_EQUAL_COLLECTIONS(test_data.begin(), test_data.end(),
- result.begin(), result.end());
+ BOOST_CHECK_EQUAL_COLLECTIONS(
+ test_data.begin(), test_data.end(), result.begin(), result.end());
BOOST_REQUIRE_THROW(literal_int_vec.get_bool(), uhd::type_error);
BOOST_REQUIRE_THROW(literal_int_vec.get_int(), uhd::type_error);
}
// Need those for the variable testing:
-expression::type_t variable_get_type(const std::string &var_name)
+expression::type_t variable_get_type(const std::string& var_name)
{
if (var_name == "spp") {
std::cout << "Returning type for $spp..." << std::endl;
@@ -87,7 +86,7 @@ expression::type_t variable_get_type(const std::string &var_name)
throw uhd::syntax_error("Cannot infer type (unknown variable)");
}
-expression_literal variable_get_value(const std::string &var_name)
+expression_literal variable_get_value(const std::string& var_name)
{
if (var_name == "spp") {
std::cout << "Returning value for $spp..." << std::endl;
@@ -103,18 +102,14 @@ expression_literal variable_get_value(const std::string &var_name)
BOOST_AUTO_TEST_CASE(test_variables)
{
- BOOST_REQUIRE_THROW(
- expression_variable v_fail(
- "foo", // Invalid token
- boost::bind(&variable_get_type, _1), boost::bind(&variable_get_value, _1)
- ),
- uhd::assertion_error
- );
-
- expression_variable v(
- "$spp", // The token
- boost::bind(&variable_get_type, _1), // type-getter
- boost::bind(&variable_get_value, _1) // value-getter
+ BOOST_REQUIRE_THROW(expression_variable v_fail("foo", // Invalid token
+ boost::bind(&variable_get_type, _1),
+ boost::bind(&variable_get_value, _1)),
+ uhd::assertion_error);
+
+ expression_variable v("$spp", // The token
+ boost::bind(&variable_get_type, _1), // type-getter
+ boost::bind(&variable_get_value, _1) // value-getter
);
BOOST_CHECK_EQUAL(v.infer_type(), expression::TYPE_INT);
BOOST_CHECK_EQUAL(v.eval().get_int(), 5);
@@ -123,23 +118,21 @@ BOOST_AUTO_TEST_CASE(test_variables)
BOOST_AUTO_TEST_CASE(test_container)
{
// Create some sub-expressions:
- expression_literal::sptr l_true = E(true);
+ expression_literal::sptr l_true = E(true);
expression_literal::sptr l_false = E(false);
- expression_literal::sptr l_int = E(5);
+ expression_literal::sptr l_int = E(5);
BOOST_REQUIRE_EQUAL(l_false->get_bool(), false);
BOOST_REQUIRE_EQUAL(l_false->to_bool(), false);
- expression_variable::sptr l_boolvar = boost::make_shared<expression_variable>(
- "$is_true",
- boost::bind(&variable_get_type, _1),
- boost::bind(&variable_get_value, _1)
- );
+ expression_variable::sptr l_boolvar =
+ boost::make_shared<expression_variable>("$is_true",
+ boost::bind(&variable_get_type, _1),
+ boost::bind(&variable_get_value, _1));
// This will throw anytime it's evaluated:
- expression_variable::sptr l_failvar = boost::make_shared<expression_variable>(
- "$does_not_exist",
- boost::bind(&variable_get_type, _1),
- boost::bind(&variable_get_value, _1)
- );
+ expression_variable::sptr l_failvar =
+ boost::make_shared<expression_variable>("$does_not_exist",
+ boost::bind(&variable_get_type, _1),
+ boost::bind(&variable_get_value, _1));
expression_container c;
std::cout << "One true, OR: " << std::endl;
@@ -196,38 +189,32 @@ BOOST_AUTO_TEST_CASE(test_container)
// be defined for INT and DOUBLE
class functable_mockup_impl : public function_table
{
- public:
- functable_mockup_impl(void) {};
+public:
+ functable_mockup_impl(void){};
- bool function_exists(const std::string &name) const {
+ bool function_exists(const std::string& name) const
+ {
return name == "ADD" or name == "XOR" or name == "AND";
}
- bool function_exists(
- const std::string &name,
- const expression_function::argtype_list_type &arg_types
- ) const {
+ bool function_exists(const std::string& name,
+ const expression_function::argtype_list_type& arg_types) const
+ {
if (name == "ADD") {
- if (arg_types.size() == 2
- and arg_types[0] == expression::TYPE_DOUBLE
- and arg_types[1] == expression::TYPE_DOUBLE
- ) {
+ if (arg_types.size() == 2 and arg_types[0] == expression::TYPE_DOUBLE
+ and arg_types[1] == expression::TYPE_DOUBLE) {
return true;
}
- if (arg_types.size() == 2
- and arg_types[0] == expression::TYPE_INT
- and arg_types[1] == expression::TYPE_INT
- ) {
+ if (arg_types.size() == 2 and arg_types[0] == expression::TYPE_INT
+ and arg_types[1] == expression::TYPE_INT) {
return true;
}
return false;
}
if (name == "XOR" or name == "AND") {
- if (arg_types.size() == 2
- and arg_types[0] == expression::TYPE_BOOL
- and arg_types[1] == expression::TYPE_BOOL
- ) {
+ if (arg_types.size() == 2 and arg_types[0] == expression::TYPE_BOOL
+ and arg_types[1] == expression::TYPE_BOOL) {
return true;
}
return false;
@@ -236,15 +223,14 @@ class functable_mockup_impl : public function_table
return false;
}
- expression::type_t get_type(
- const std::string &name,
- const expression_function::argtype_list_type &arg_types
- ) const {
+ expression::type_t get_type(const std::string& name,
+ const expression_function::argtype_list_type& arg_types) const
+ {
if (not function_exists(name, arg_types)) {
- throw uhd::syntax_error(str(
- boost::format("[EXPR_TEXT] get_type(): Unknown function: %s, %d arguments")
- % name % arg_types.size()
- ));
+ throw uhd::syntax_error(
+ str(boost::format(
+ "[EXPR_TEXT] get_type(): Unknown function: %s, %d arguments")
+ % name % arg_types.size()));
}
if (name == "XOR" or name == "AND") {
@@ -256,58 +242,48 @@ class functable_mockup_impl : public function_table
UHD_THROW_INVALID_CODE_PATH();
}
- expression_literal eval(
- const std::string &name,
- const expression_function::argtype_list_type &arg_types,
- expression_container::expr_list_type &args
- ) {
+ expression_literal eval(const std::string& name,
+ const expression_function::argtype_list_type& arg_types,
+ expression_container::expr_list_type& args)
+ {
if (name == "XOR") {
- if (arg_types.size() != 2
- or args.size() != 2
+ if (arg_types.size() != 2 or args.size() != 2
or arg_types[0] != expression::TYPE_BOOL
or arg_types[1] != expression::TYPE_BOOL
or args[0]->infer_type() != expression::TYPE_BOOL
- or args[1]->infer_type() != expression::TYPE_BOOL
- ) {
+ or args[1]->infer_type() != expression::TYPE_BOOL) {
throw uhd::syntax_error("eval(): XOR type mismatch");
}
- return expression_literal(bool(
- args[0]->eval().get_bool() xor args[1]->eval().get_bool()
- ));
+ return expression_literal(
+ bool(args[0]->eval().get_bool() xor args[1]->eval().get_bool()));
}
if (name == "AND") {
- if (arg_types.size() != 2
- or args.size() != 2
+ if (arg_types.size() != 2 or args.size() != 2
or arg_types[0] != expression::TYPE_BOOL
or arg_types[1] != expression::TYPE_BOOL
or args[0]->infer_type() != expression::TYPE_BOOL
- or args[1]->infer_type() != expression::TYPE_BOOL
- ) {
+ or args[1]->infer_type() != expression::TYPE_BOOL) {
throw uhd::syntax_error("eval(): AND type mismatch");
}
std::cout << "Calling AND" << std::endl;
and_counter++;
- return expression_literal(bool(
- args[0]->eval().get_bool() and args[1]->eval().get_bool()
- ));
+ return expression_literal(
+ bool(args[0]->eval().get_bool() and args[1]->eval().get_bool()));
}
if (name == "ADD") {
if (args.size() != 2) {
throw uhd::syntax_error("eval(): ADD type mismatch");
}
- if ((args[0]->infer_type() == expression::TYPE_INT) and
- (args[1]->infer_type() == expression::TYPE_INT)) {
- return expression_literal(int(
- args[0]->eval().get_int() + args[1]->eval().get_int()
- ));
- }
- else if ((args[0]->infer_type() == expression::TYPE_DOUBLE) and
- (args[1]->infer_type() == expression::TYPE_DOUBLE)) {
- return expression_literal(double(
- args[0]->eval().get_double() + args[1]->eval().get_double()
- ));
+ if ((args[0]->infer_type() == expression::TYPE_INT)
+ and (args[1]->infer_type() == expression::TYPE_INT)) {
+ return expression_literal(
+ int(args[0]->eval().get_int() + args[1]->eval().get_int()));
+ } else if ((args[0]->infer_type() == expression::TYPE_DOUBLE)
+ and (args[1]->infer_type() == expression::TYPE_DOUBLE)) {
+ return expression_literal(
+ double(args[0]->eval().get_double() + args[1]->eval().get_double()));
}
throw uhd::syntax_error("eval(): ADD type mismatch");
}
@@ -315,13 +291,10 @@ class functable_mockup_impl : public function_table
}
// We don't actually need this
- void register_function(
- const std::string &,
- const function_table::function_ptr &,
- const expression::type_t,
- const expression_function::argtype_list_type &
- ) {};
-
+ void register_function(const std::string&,
+ const function_table::function_ptr&,
+ const expression::type_t,
+ const expression_function::argtype_list_type&){};
};
@@ -342,16 +315,20 @@ BOOST_AUTO_TEST_CASE(test_functable_mockup)
BOOST_CHECK(not functable.function_exists("XOR", no_args));
BOOST_CHECK_EQUAL(functable.get_type("ADD", two_int_args), expression::TYPE_INT);
- BOOST_CHECK_EQUAL(functable.get_type("ADD", two_double_args), expression::TYPE_DOUBLE);
+ BOOST_CHECK_EQUAL(
+ functable.get_type("ADD", two_double_args), expression::TYPE_DOUBLE);
BOOST_CHECK_EQUAL(functable.get_type("XOR", two_bool_args), expression::TYPE_BOOL);
expression_container::expr_list_type add_args_int{E(2), E(3)};
expression_container::expr_list_type add_args_dbl{E(2.25), E(5.0)};
expression_container::expr_list_type xor_args_bool{E(true), E(false)};
- BOOST_CHECK_EQUAL(functable.eval("ADD", two_int_args, add_args_int), expression_literal(5));
- BOOST_CHECK_EQUAL(functable.eval("ADD", two_double_args, add_args_dbl), expression_literal(7.25));
- BOOST_CHECK_EQUAL(functable.eval("XOR", two_bool_args, xor_args_bool), expression_literal(true));
+ BOOST_CHECK_EQUAL(
+ functable.eval("ADD", two_int_args, add_args_int), expression_literal(5));
+ BOOST_CHECK_EQUAL(
+ functable.eval("ADD", two_double_args, add_args_dbl), expression_literal(7.25));
+ BOOST_CHECK_EQUAL(
+ functable.eval("XOR", two_bool_args, xor_args_bool), expression_literal(true));
}
BOOST_AUTO_TEST_CASE(test_function_expression)
@@ -402,7 +379,7 @@ BOOST_AUTO_TEST_CASE(test_function_expression_laziness)
f3->add(E(false));
BOOST_CHECK(not f3->eval().get_bool());
- and_counter = 0;
+ and_counter = 0;
expression_function::sptr f1 = boost::make_shared<expression_function>("AND", ft);
f1->add(f2);
f1->add(f3);
@@ -417,14 +394,12 @@ BOOST_AUTO_TEST_CASE(test_sptrs)
BOOST_CHECK_EQUAL(c->infer_type(), expression::TYPE_BOOL);
BOOST_CHECK(c->eval().get_bool());
- expression_variable::sptr v = expression_variable::make(
- "$spp",
- boost::bind(&variable_get_type, _1), // type-getter
- boost::bind(&variable_get_value, _1) // value-getter
+ expression_variable::sptr v = expression_variable::make("$spp",
+ boost::bind(&variable_get_type, _1), // type-getter
+ boost::bind(&variable_get_value, _1) // value-getter
);
c->add(v);
BOOST_REQUIRE_EQUAL(c->infer_type(), expression::TYPE_INT);
BOOST_CHECK_EQUAL(c->eval().get_int(), 5);
}
-
diff --git a/host/tests/nocscript_ftable_test.cpp b/host/tests/nocscript_ftable_test.cpp
index 99ac2231a..36aa314f2 100644
--- a/host/tests/nocscript_ftable_test.cpp
+++ b/host/tests/nocscript_ftable_test.cpp
@@ -6,15 +6,14 @@
//
#include "../lib/rfnoc/nocscript/function_table.hpp"
-#include <boost/test/unit_test.hpp>
-#include <boost/test/floating_point_comparison.hpp>
+#include "nocscript_common.hpp"
#include <boost/bind.hpp>
#include <boost/make_shared.hpp>
+#include <boost/test/floating_point_comparison.hpp>
+#include <boost/test/unit_test.hpp>
#include <algorithm>
#include <iostream>
-#include "nocscript_common.hpp"
-
BOOST_AUTO_TEST_CASE(test_basic_funcs)
{
function_table::sptr ft = function_table::make();
@@ -49,7 +48,7 @@ BOOST_AUTO_TEST_CASE(test_basic_funcs)
BOOST_REQUIRE_EQUAL(ft->get_type("DIV", two_double_args), expression::TYPE_DOUBLE);
expression_literal e_div_d = ft->eval("DIV", two_double_args, two_double_values);
BOOST_REQUIRE_EQUAL(e_div_d.infer_type(), expression::TYPE_DOUBLE);
- BOOST_CHECK_CLOSE(e_div_d.get_double(), 2.0/3.0, 0.01);
+ BOOST_CHECK_CLOSE(e_div_d.get_double(), 2.0 / 3.0, 0.01);
BOOST_REQUIRE_EQUAL(ft->get_type("MODULO", two_int_args), expression::TYPE_INT);
expression_literal e_modulo_i = ft->eval("MODULO", two_int_args, two_int_values);
@@ -103,15 +102,11 @@ BOOST_AUTO_TEST_CASE(test_add_funcs)
BOOST_CHECK(not ft->function_exists("ADD_PLUS_2"));
expression_function::argtype_list_type add_int_args{
+ expression::TYPE_INT, expression::TYPE_INT};
+ ft->register_function("ADD_PLUS_2",
+ boost::bind(&add_plus2_int, _1),
expression::TYPE_INT,
- expression::TYPE_INT
- };
- ft->register_function(
- "ADD_PLUS_2",
- boost::bind(&add_plus2_int, _1),
- expression::TYPE_INT,
- add_int_args
- );
+ add_int_args);
BOOST_CHECK(ft->function_exists("ADD_PLUS_2"));
BOOST_CHECK(ft->function_exists("ADD_PLUS_2", add_int_args));
@@ -144,22 +139,16 @@ BOOST_AUTO_TEST_CASE(test_conditionals)
{
function_table::sptr ft = function_table::make();
ft->register_function(
- "DUMMY",
- boost::bind(&dummy_true, _1),
- expression::TYPE_BOOL,
- no_args
- );
+ "DUMMY", boost::bind(&dummy_true, _1), expression::TYPE_BOOL, no_args);
ft->register_function(
- "DUMMY_F",
- boost::bind(&dummy_false, _1),
- expression::TYPE_BOOL,
- no_args
- );
+ "DUMMY_F", boost::bind(&dummy_false, _1), expression::TYPE_BOOL, no_args);
BOOST_REQUIRE(ft->function_exists("DUMMY", no_args));
BOOST_REQUIRE(ft->function_exists("DUMMY_F", no_args));
- expression_function::sptr dummy_statement = boost::make_shared<expression_function>("DUMMY", ft);
- expression_function::sptr if_statement = boost::make_shared<expression_function>("IF", ft);
+ expression_function::sptr dummy_statement =
+ boost::make_shared<expression_function>("DUMMY", ft);
+ expression_function::sptr if_statement =
+ boost::make_shared<expression_function>("IF", ft);
if_statement->add(E(true));
if_statement->add(dummy_statement);
@@ -170,7 +159,8 @@ BOOST_AUTO_TEST_CASE(test_conditionals)
std::cout << "END." << std::endl;
std::cout << "Dummy statement should not run until END:" << std::endl;
- expression_function::sptr if_statement2 = boost::make_shared<expression_function>("IF", ft);
+ expression_function::sptr if_statement2 =
+ boost::make_shared<expression_function>("IF", ft);
if_statement2->add(E(false));
if_statement2->add(dummy_statement);
dummy_true_counter = 0;
@@ -178,12 +168,14 @@ BOOST_AUTO_TEST_CASE(test_conditionals)
BOOST_CHECK_EQUAL(dummy_true_counter, 0);
std::cout << "END." << std::endl;
- expression_function::sptr if_else_statement = boost::make_shared<expression_function>("IF_ELSE", ft);
- expression_function::sptr dummy_statement_f = boost::make_shared<expression_function>("DUMMY_F", ft);
+ expression_function::sptr if_else_statement =
+ boost::make_shared<expression_function>("IF_ELSE", ft);
+ expression_function::sptr dummy_statement_f =
+ boost::make_shared<expression_function>("DUMMY_F", ft);
if_else_statement->add(E(true));
if_else_statement->add(dummy_statement);
if_else_statement->add(dummy_statement_f);
- dummy_true_counter = 0;
+ dummy_true_counter = 0;
dummy_false_counter = 0;
std::cout << "Should execute dummy/true statement before END:" << std::endl;
BOOST_CHECK(if_else_statement->eval().get_bool());
@@ -191,11 +183,12 @@ BOOST_AUTO_TEST_CASE(test_conditionals)
BOOST_CHECK_EQUAL(dummy_false_counter, 0);
std::cout << "END." << std::endl;
- expression_function::sptr if_else_statement2 = boost::make_shared<expression_function>("IF_ELSE", ft);
+ expression_function::sptr if_else_statement2 =
+ boost::make_shared<expression_function>("IF_ELSE", ft);
if_else_statement2->add(E(false));
if_else_statement2->add(dummy_statement);
if_else_statement2->add(dummy_statement_f);
- dummy_true_counter = 0;
+ dummy_true_counter = 0;
dummy_false_counter = 0;
std::cout << "Should execute dummy/false statement before END:" << std::endl;
BOOST_CHECK(not if_else_statement2->eval().get_bool());
@@ -221,33 +214,35 @@ BOOST_AUTO_TEST_CASE(test_bitwise_funcs)
// Bitwise Math
int int_value1 = 0x2;
int int_value2 = 0x3;
- expression_container::expr_list_type two_int_values{
- E(int_value1),
- E(int_value2)
- };
+ expression_container::expr_list_type two_int_values{E(int_value1), E(int_value2)};
BOOST_REQUIRE_EQUAL(ft->get_type("SHIFT_RIGHT", two_int_args), expression::TYPE_INT);
- expression_literal e_shift_right = ft->eval("SHIFT_RIGHT", two_int_args, two_int_values);
+ expression_literal e_shift_right =
+ ft->eval("SHIFT_RIGHT", two_int_args, two_int_values);
BOOST_REQUIRE_EQUAL(e_shift_right.infer_type(), expression::TYPE_INT);
BOOST_CHECK_EQUAL(e_shift_right.get_int(), int_value1 >> int_value2);
BOOST_REQUIRE_EQUAL(ft->get_type("SHIFT_LEFT", two_int_args), expression::TYPE_INT);
- expression_literal e_shift_left = ft->eval("SHIFT_LEFT", two_int_args, two_int_values);
+ expression_literal e_shift_left =
+ ft->eval("SHIFT_LEFT", two_int_args, two_int_values);
BOOST_REQUIRE_EQUAL(e_shift_left.infer_type(), expression::TYPE_INT);
BOOST_CHECK_EQUAL(e_shift_left.get_int(), int_value1 << int_value2);
BOOST_REQUIRE_EQUAL(ft->get_type("BITWISE_AND", two_int_args), expression::TYPE_INT);
- expression_literal e_bitwise_and = ft->eval("BITWISE_AND", two_int_args, two_int_values);
+ expression_literal e_bitwise_and =
+ ft->eval("BITWISE_AND", two_int_args, two_int_values);
BOOST_REQUIRE_EQUAL(e_bitwise_and.infer_type(), expression::TYPE_INT);
BOOST_CHECK_EQUAL(e_bitwise_and.get_int(), int_value1 & int_value2);
BOOST_REQUIRE_EQUAL(ft->get_type("BITWISE_OR", two_int_args), expression::TYPE_INT);
- expression_literal e_bitwise_or = ft->eval("BITWISE_OR", two_int_args, two_int_values);
+ expression_literal e_bitwise_or =
+ ft->eval("BITWISE_OR", two_int_args, two_int_values);
BOOST_REQUIRE_EQUAL(e_bitwise_or.infer_type(), expression::TYPE_INT);
BOOST_CHECK_EQUAL(e_bitwise_or.get_int(), int_value1 | int_value2);
BOOST_REQUIRE_EQUAL(ft->get_type("BITWISE_XOR", two_int_args), expression::TYPE_INT);
- expression_literal e_bitwise_xor = ft->eval("BITWISE_XOR", two_int_args, two_int_values);
+ expression_literal e_bitwise_xor =
+ ft->eval("BITWISE_XOR", two_int_args, two_int_values);
BOOST_REQUIRE_EQUAL(e_bitwise_xor.infer_type(), expression::TYPE_INT);
BOOST_CHECK_EQUAL(e_bitwise_xor.get_int(), int_value1 ^ int_value2);
}
diff --git a/host/tests/nocscript_parser_test.cpp b/host/tests/nocscript_parser_test.cpp
index caa2ae6e0..eb9352995 100644
--- a/host/tests/nocscript_parser_test.cpp
+++ b/host/tests/nocscript_parser_test.cpp
@@ -7,21 +7,20 @@
#include "../lib/rfnoc/nocscript/function_table.hpp"
#include "../lib/rfnoc/nocscript/parser.hpp"
+#include "nocscript_common.hpp"
#include <uhd/exception.hpp>
-#include <boost/test/unit_test.hpp>
-#include <boost/test/floating_point_comparison.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/bind.hpp>
#include <boost/make_shared.hpp>
+#include <boost/test/floating_point_comparison.hpp>
+#include <boost/test/unit_test.hpp>
#include <algorithm>
#include <iostream>
-#include "nocscript_common.hpp"
-
const int SPP_VALUE = 64;
// Need those for the variable testing:
-expression::type_t variable_get_type(const std::string &var_name)
+expression::type_t variable_get_type(const std::string& var_name)
{
if (var_name == "spp") {
std::cout << "Returning type for $spp..." << std::endl;
@@ -35,7 +34,7 @@ expression::type_t variable_get_type(const std::string &var_name)
throw uhd::syntax_error("Cannot infer type (unknown variable)");
}
-expression_literal variable_get_value(const std::string &var_name)
+expression_literal variable_get_value(const std::string& var_name)
{
if (var_name == "spp") {
std::cout << "Returning value for $spp..." << std::endl;
@@ -49,13 +48,10 @@ expression_literal variable_get_value(const std::string &var_name)
throw uhd::syntax_error("Cannot read value (unknown variable)");
}
-#define SETUP_FT_AND_PARSER() \
+#define SETUP_FT_AND_PARSER() \
function_table::sptr ft = function_table::make(); \
- parser::sptr p = parser::make( \
- ft, \
- boost::bind(&variable_get_type, _1), \
- boost::bind(&variable_get_value, _1) \
- );
+ parser::sptr p = parser::make( \
+ ft, boost::bind(&variable_get_type, _1), boost::bind(&variable_get_value, _1));
BOOST_AUTO_TEST_CASE(test_fail)
{
@@ -79,11 +75,11 @@ BOOST_AUTO_TEST_CASE(test_adds_no_vars)
BOOST_REQUIRE(ft->function_exists("ADD"));
const std::string line("ADD(1, ADD(2, ADD(3, 4)))");
- expression::sptr e = p->create_expr_tree(line);
+ expression::sptr e = p->create_expr_tree(line);
expression_literal result = e->eval();
BOOST_REQUIRE_EQUAL(result.infer_type(), expression::TYPE_INT);
- BOOST_CHECK_EQUAL(result.get_int(), 1+2+3+4);
+ BOOST_CHECK_EQUAL(result.get_int(), 1 + 2 + 3 + 4);
}
BOOST_AUTO_TEST_CASE(test_adds_with_vars)
@@ -91,11 +87,11 @@ BOOST_AUTO_TEST_CASE(test_adds_with_vars)
SETUP_FT_AND_PARSER();
const std::string line("ADD(1, ADD(2, $spp))");
- expression::sptr e = p->create_expr_tree(line);
+ expression::sptr e = p->create_expr_tree(line);
expression_literal result = e->eval();
BOOST_REQUIRE_EQUAL(result.infer_type(), expression::TYPE_INT);
- BOOST_CHECK_EQUAL(result.get_int(), 1+2+SPP_VALUE);
+ BOOST_CHECK_EQUAL(result.get_int(), 1 + 2 + SPP_VALUE);
}
BOOST_AUTO_TEST_CASE(test_fft_check)
@@ -103,7 +99,7 @@ BOOST_AUTO_TEST_CASE(test_fft_check)
SETUP_FT_AND_PARSER();
const std::string line("GE($spp, 16) AND LE($spp, 4096) AND IS_PWR_OF_2($spp)");
- expression::sptr e = p->create_expr_tree(line);
+ expression::sptr e = p->create_expr_tree(line);
expression_literal result = e->eval();
BOOST_REQUIRE_EQUAL(result.infer_type(), expression::TYPE_BOOL);
@@ -135,11 +131,7 @@ BOOST_AUTO_TEST_CASE(test_multi_commmand)
SETUP_FT_AND_PARSER();
ft->register_function(
- "DUMMY",
- boost::bind(&dummy_false, _1),
- expression::TYPE_BOOL,
- no_args
- );
+ "DUMMY", boost::bind(&dummy_false, _1), expression::TYPE_BOOL, no_args);
dummy_false_counter = 0;
p->create_expr_tree("DUMMY(), DUMMY(), DUMMY()")->eval();
@@ -153,4 +145,3 @@ BOOST_AUTO_TEST_CASE(test_multi_commmand)
p->create_expr_tree("DUMMY() OR DUMMY() OR DUMMY()")->eval();
BOOST_CHECK_EQUAL(dummy_false_counter, 3);
}
-
diff --git a/host/tests/node_connect_test.cpp b/host/tests/node_connect_test.cpp
index dd3d8d08a..97d052a06 100644
--- a/host/tests/node_connect_test.cpp
+++ b/host/tests/node_connect_test.cpp
@@ -16,25 +16,22 @@ class source_node : public test_node
public:
typedef boost::shared_ptr<source_node> sptr;
- source_node(const std::string &test_id, size_t output_port)
- : test_node(test_id)
- , active_rx_streamer_on_port(0)
- , _output_port(output_port) {};
+ source_node(const std::string& test_id, size_t output_port)
+ : test_node(test_id), active_rx_streamer_on_port(0), _output_port(output_port){};
void set_rx_streamer(bool active, const size_t port)
{
if (active) {
- std::cout << "[source_node] Someone is registering a rx streamer on port " << port << std::endl;
+ std::cout << "[source_node] Someone is registering a rx streamer on port "
+ << port << std::endl;
active_rx_streamer_on_port = port;
}
}
size_t active_rx_streamer_on_port;
protected:
- size_t _request_output_port(
- const size_t,
- const uhd::device_addr_t &
- ) const {
+ size_t _request_output_port(const size_t, const uhd::device_addr_t&) const
+ {
return _output_port;
}
@@ -47,25 +44,22 @@ class sink_node : public test_node
public:
typedef boost::shared_ptr<sink_node> sptr;
- sink_node(const std::string &test_id, size_t input_port)
- : test_node(test_id)
- , active_tx_streamer_on_port(0)
- , _input_port(input_port) {};
+ sink_node(const std::string& test_id, size_t input_port)
+ : test_node(test_id), active_tx_streamer_on_port(0), _input_port(input_port){};
void set_tx_streamer(bool active, const size_t port)
{
if (active) {
- std::cout << "[sink_node] Someone is registering a tx streamer on port " << port << std::endl;
+ std::cout << "[sink_node] Someone is registering a tx streamer on port "
+ << port << std::endl;
active_tx_streamer_on_port = port;
}
}
size_t active_tx_streamer_on_port;
protected:
- size_t _request_input_port(
- const size_t,
- const uhd::device_addr_t &
- ) const {
+ size_t _request_input_port(const size_t, const uhd::device_addr_t&) const
+ {
return _input_port;
}
diff --git a/host/tests/packet_handler_benchmark.cpp b/host/tests/packet_handler_benchmark.cpp
index 37c6861bb..21e1430ae 100644
--- a/host/tests/packet_handler_benchmark.cpp
+++ b/host/tests/packet_handler_benchmark.cpp
@@ -11,16 +11,16 @@
// This should have very little effect on packet handler performance.
#define SRPH_DONT_CHECK_SEQUENCE 1
-#include "common/mock_zero_copy.hpp"
-#include "../lib/transport/super_send_packet_handler.hpp"
#include "../lib/transport/super_recv_packet_handler.hpp"
+#include "../lib/transport/super_send_packet_handler.hpp"
#include "../lib/usrp/device3/device3_flow_ctrl.hpp"
-#include <uhd/utils/safe_main.hpp>
-#include <uhd/utils/thread.hpp>
+#include "common/mock_zero_copy.hpp"
#include <uhd/convert.hpp>
#include <uhd/transport/chdr.hpp>
#include <uhd/transport/zero_copy.hpp>
#include <uhd/types/sid.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/program_options.hpp>
#include <chrono>
#include <vector>
@@ -29,18 +29,13 @@ namespace po = boost::program_options;
using namespace uhd::transport;
using namespace uhd::usrp;
-void benchmark_recv_packet_handler(
- const size_t spp,
- const std::string& format
-) {
- const size_t bpi = uhd::convert::get_bytes_per_item(format);
+void benchmark_recv_packet_handler(const size_t spp, const std::string& format)
+{
+ const size_t bpi = uhd::convert::get_bytes_per_item(format);
const size_t frame_size = bpi * spp + DEVICE3_RX_MAX_HDR_LEN;
- mock_zero_copy::sptr xport(
- new mock_zero_copy(
- vrt::if_packet_info_t::LINK_TYPE_CHDR,
- frame_size,
- frame_size));
+ mock_zero_copy::sptr xport(new mock_zero_copy(
+ vrt::if_packet_info_t::LINK_TYPE_CHDR, frame_size, frame_size));
xport->set_reuse_recv_memory(true);
@@ -51,38 +46,35 @@ void benchmark_recv_packet_handler(
uhd::convert::id_type id;
id.output_format = format;
- id.num_inputs = 1;
- id.input_format = "sc16_item32_be";
- id.num_outputs = 1;
+ id.num_inputs = 1;
+ id.input_format = "sc16_item32_be";
+ id.num_outputs = 1;
streamer.set_converter(id);
- streamer.set_xport_chan_get_buff(
- 0,
- [xport](double timeout) {
- return xport->get_recv_buff(timeout);
- },
+ streamer.set_xport_chan_get_buff(0,
+ [xport](double timeout) { return xport->get_recv_buff(timeout); },
false // flush
);
// Create packet for packet handler to read
vrt::if_packet_info_t packet_info;
- packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
packet_info.num_payload_words32 = spp;
- packet_info.num_payload_bytes = packet_info.num_payload_words32*sizeof(uint32_t);
- packet_info.has_tsf = true;
- packet_info.tsf = 1;
+ packet_info.num_payload_bytes = packet_info.num_payload_words32 * sizeof(uint32_t);
+ packet_info.has_tsf = true;
+ packet_info.tsf = 1;
std::vector<uint32_t> recv_data(spp, 0);
xport->push_back_recv_packet(packet_info, recv_data);
// Allocate buffer
- std::vector<uint8_t> buffer(spp*bpi);
+ std::vector<uint8_t> buffer(spp * bpi);
std::vector<void*> buffers;
buffers.push_back(buffer.data());
// Run benchmark
uhd::rx_metadata_t md;
- const auto start_time = std::chrono::steady_clock::now();
+ const auto start_time = std::chrono::steady_clock::now();
const size_t iterations = 1e7;
for (size_t i = 0; i < iterations; i++) {
@@ -90,29 +82,21 @@ void benchmark_recv_packet_handler(
}
const auto end_time = std::chrono::steady_clock::now();
- const std::chrono::duration<double> elapsed_time(end_time-start_time);
+ const std::chrono::duration<double> elapsed_time(end_time - start_time);
const double time_per_packet = elapsed_time.count() / iterations;
- std::cout << format << ": "
- << time_per_packet / spp * 1e9
- << " ns/sample, "
- << time_per_packet * 1e9
- << " ns/packet\n";
+ std::cout << format << ": " << time_per_packet / spp * 1e9 << " ns/sample, "
+ << time_per_packet * 1e9 << " ns/packet\n";
}
void benchmark_send_packet_handler(
- const size_t spp,
- const std::string& format,
- bool use_time_spec
-) {
- const size_t bpi = uhd::convert::get_bytes_per_item(format);
+ const size_t spp, const std::string& format, bool use_time_spec)
+{
+ const size_t bpi = uhd::convert::get_bytes_per_item(format);
const size_t frame_size = bpi * spp + DEVICE3_TX_MAX_HDR_LEN;
- mock_zero_copy::sptr xport(
- new mock_zero_copy(
- vrt::if_packet_info_t::LINK_TYPE_CHDR,
- frame_size,
- frame_size));
+ mock_zero_copy::sptr xport(new mock_zero_copy(
+ vrt::if_packet_info_t::LINK_TYPE_CHDR, frame_size, frame_size));
xport->set_reuse_send_memory(true);
@@ -120,21 +104,18 @@ void benchmark_send_packet_handler(
streamer.set_vrt_packer(&vrt::chdr::if_hdr_pack_be);
uhd::convert::id_type id;
- id.input_format = format;
- id.num_inputs = 1;
+ id.input_format = format;
+ id.num_inputs = 1;
id.output_format = "sc16_item32_be";
- id.num_outputs = 1;
+ id.num_outputs = 1;
streamer.set_converter(id);
streamer.set_enable_trailer(false);
streamer.set_xport_chan_get_buff(
- 0,
- [xport](double timeout) {
- return xport->get_send_buff(timeout);
- });
+ 0, [xport](double timeout) { return xport->get_send_buff(timeout); });
// Allocate buffer
- std::vector<uint8_t> buffer(spp*bpi);
+ std::vector<uint8_t> buffer(spp * bpi);
std::vector<void*> buffers;
buffers.push_back(buffer.data());
@@ -142,7 +123,7 @@ void benchmark_send_packet_handler(
uhd::tx_metadata_t md;
md.has_time_spec = use_time_spec;
- const auto start_time = std::chrono::steady_clock::now();
+ const auto start_time = std::chrono::steady_clock::now();
const size_t iterations = 1e7;
for (size_t i = 0; i < iterations; i++) {
@@ -153,44 +134,38 @@ void benchmark_send_packet_handler(
}
const auto end_time = std::chrono::steady_clock::now();
- const std::chrono::duration<double> elapsed_time(end_time-start_time);
+ const std::chrono::duration<double> elapsed_time(end_time - start_time);
const double time_per_packet = elapsed_time.count() / iterations;
- std::cout << format << ": "
- << time_per_packet / spp * 1e9
- << " ns/sample, "
- << time_per_packet * 1e9
- << " ns/packet\n";
+ std::cout << format << ": " << time_per_packet / spp * 1e9 << " ns/sample, "
+ << time_per_packet * 1e9 << " ns/packet\n";
}
-void benchmark_device3_rx_flow_ctrl(
- bool send_flow_control_packet
-) {
+void benchmark_device3_rx_flow_ctrl(bool send_flow_control_packet)
+{
// Arbitrary sizes
constexpr uint32_t fc_window = 10000;
- mock_zero_copy::sptr xport(
- new mock_zero_copy(
- vrt::if_packet_info_t::LINK_TYPE_CHDR));
+ mock_zero_copy::sptr xport(new mock_zero_copy(vrt::if_packet_info_t::LINK_TYPE_CHDR));
xport->set_reuse_recv_memory(true);
xport->set_reuse_send_memory(true);
boost::shared_ptr<rx_fc_cache_t> fc_cache(new rx_fc_cache_t());
- fc_cache->to_host = uhd::ntohx<uint32_t>;
+ fc_cache->to_host = uhd::ntohx<uint32_t>;
fc_cache->from_host = uhd::htonx<uint32_t>;
- fc_cache->pack = vrt::chdr::if_hdr_pack_be;
- fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
- fc_cache->xport = xport;
- fc_cache->interval = fc_window;
+ fc_cache->pack = vrt::chdr::if_hdr_pack_be;
+ fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
+ fc_cache->xport = xport;
+ fc_cache->interval = fc_window;
// Create data buffer to pass to flow control function. Number of payload
// words is arbitrary, just has to fit in the buffer.
vrt::if_packet_info_t packet_info;
- packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
packet_info.num_payload_words32 = 100;
- packet_info.num_payload_bytes = packet_info.num_payload_words32*sizeof(uint32_t);
- packet_info.has_tsf = false;
+ packet_info.num_payload_bytes = packet_info.num_payload_words32 * sizeof(uint32_t);
+ packet_info.has_tsf = false;
std::vector<uint32_t> recv_data(packet_info.num_payload_words32, 0);
xport->push_back_recv_packet(packet_info, recv_data);
@@ -203,46 +178,44 @@ void benchmark_device3_rx_flow_ctrl(
constexpr size_t iterations = 1e7;
for (size_t i = 0; i < iterations; i++) {
- fc_cache->total_bytes_consumed = send_flow_control_packet? fc_window:0;
- fc_cache->last_byte_count = 0;
+ fc_cache->total_bytes_consumed = send_flow_control_packet ? fc_window : 0;
+ fc_cache->last_byte_count = 0;
rx_flow_ctrl(fc_cache, recv_buffer);
}
const auto end_time = std::chrono::steady_clock::now();
- const std::chrono::duration<double> elapsed_time(end_time-start_time);
+ const std::chrono::duration<double> elapsed_time(end_time - start_time);
- std::cout << elapsed_time.count() / iterations * 1e9
- << " ns per call\n";
+ std::cout << elapsed_time.count() / iterations * 1e9 << " ns per call\n";
}
-void benchmark_device3_handle_rx_flow_ctrl_ack() {
+void benchmark_device3_handle_rx_flow_ctrl_ack()
+{
// Arbitrary sizes
constexpr uint32_t fc_window = 10000;
- mock_zero_copy::sptr xport(
- new mock_zero_copy(
- vrt::if_packet_info_t::LINK_TYPE_CHDR));
+ mock_zero_copy::sptr xport(new mock_zero_copy(vrt::if_packet_info_t::LINK_TYPE_CHDR));
xport->set_reuse_recv_memory(true);
xport->set_reuse_send_memory(true);
boost::shared_ptr<rx_fc_cache_t> fc_cache(new rx_fc_cache_t());
- fc_cache->to_host = uhd::ntohx<uint32_t>;
- fc_cache->from_host = uhd::htonx<uint32_t>;
- fc_cache->pack = vrt::chdr::if_hdr_pack_be;
- fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
- fc_cache->xport = xport;
- fc_cache->interval = fc_window;
+ fc_cache->to_host = uhd::ntohx<uint32_t>;
+ fc_cache->from_host = uhd::htonx<uint32_t>;
+ fc_cache->pack = vrt::chdr::if_hdr_pack_be;
+ fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
+ fc_cache->xport = xport;
+ fc_cache->interval = fc_window;
fc_cache->total_bytes_consumed = 100;
// Payload should contain packet count and byte count
std::vector<uint32_t> payload_data;
- payload_data.push_back(fc_cache->to_host(10)); // packet count
+ payload_data.push_back(fc_cache->to_host(10)); // packet count
payload_data.push_back(fc_cache->to_host(100)); // byte count
// Run benchmark
- const auto start_time = std::chrono::steady_clock::now();
+ const auto start_time = std::chrono::steady_clock::now();
constexpr size_t iterations = 1e7;
for (size_t i = 0; i < iterations; i++) {
@@ -250,75 +223,66 @@ void benchmark_device3_handle_rx_flow_ctrl_ack() {
}
const auto end_time = std::chrono::steady_clock::now();
- const std::chrono::duration<double> elapsed_time(end_time-start_time);
+ const std::chrono::duration<double> elapsed_time(end_time - start_time);
- std::cout << elapsed_time.count() / iterations * 1e9
- << " ns per call\n";
+ std::cout << elapsed_time.count() / iterations * 1e9 << " ns per call\n";
}
-void benchmark_device3_tx_flow_ctrl(
- bool send_flow_control_packet
-) {
+void benchmark_device3_tx_flow_ctrl(bool send_flow_control_packet)
+{
// Arbitrary sizes
constexpr uint32_t fc_window = 10000;
- mock_zero_copy::sptr xport(
- new mock_zero_copy(
- vrt::if_packet_info_t::LINK_TYPE_CHDR));
+ mock_zero_copy::sptr xport(new mock_zero_copy(vrt::if_packet_info_t::LINK_TYPE_CHDR));
xport->set_reuse_recv_memory(true);
- boost::shared_ptr<tx_fc_cache_t>
- fc_cache(new tx_fc_cache_t(fc_window));
+ boost::shared_ptr<tx_fc_cache_t> fc_cache(new tx_fc_cache_t(fc_window));
- fc_cache->to_host = uhd::ntohx<uint32_t>;
+ fc_cache->to_host = uhd::ntohx<uint32_t>;
fc_cache->from_host = uhd::htonx<uint32_t>;
- fc_cache->pack = vrt::chdr::if_hdr_pack_be;
- fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
+ fc_cache->pack = vrt::chdr::if_hdr_pack_be;
+ fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
xport->push_back_flow_ctrl_packet(
- vrt::if_packet_info_t::PACKET_TYPE_FC,
- 1 /*packet*/,
- fc_window /*bytes*/);
+ vrt::if_packet_info_t::PACKET_TYPE_FC, 1 /*packet*/, fc_window /*bytes*/);
// Run benchmark
- const auto start_time = std::chrono::steady_clock::now();
- constexpr size_t iterations = 1e7;
+ const auto start_time = std::chrono::steady_clock::now();
+ constexpr size_t iterations = 1e7;
managed_send_buffer::sptr send_buffer = xport->get_send_buff(0.0);
for (size_t i = 0; i < iterations; i++) {
- fc_cache->byte_count = send_flow_control_packet? fc_window:0;
+ fc_cache->byte_count = send_flow_control_packet ? fc_window : 0;
fc_cache->last_byte_ack = 0;
tx_flow_ctrl(fc_cache, xport, send_buffer);
}
const auto end_time = std::chrono::steady_clock::now();
- const std::chrono::duration<double> elapsed_time(end_time-start_time);
+ const std::chrono::duration<double> elapsed_time(end_time - start_time);
- std::cout << elapsed_time.count() / iterations * 1e9
- << " ns per call\n";
+ std::cout << elapsed_time.count() / iterations * 1e9 << " ns per call\n";
}
-void benchmark_device3_tx_flow_ctrl_ack() {
+void benchmark_device3_tx_flow_ctrl_ack()
+{
// Arbitrary sizes
constexpr uint32_t fc_window = 10000;
- mock_zero_copy::sptr xport(
- new mock_zero_copy(
- vrt::if_packet_info_t::LINK_TYPE_CHDR));
+ mock_zero_copy::sptr xport(new mock_zero_copy(vrt::if_packet_info_t::LINK_TYPE_CHDR));
xport->set_reuse_send_memory(true);
boost::shared_ptr<tx_fc_cache_t> fc_cache(new tx_fc_cache_t(fc_window));
- fc_cache->to_host = uhd::ntohx<uint32_t>;
+ fc_cache->to_host = uhd::ntohx<uint32_t>;
fc_cache->from_host = uhd::htonx<uint32_t>;
- fc_cache->pack = vrt::chdr::if_hdr_pack_be;
- fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
+ fc_cache->pack = vrt::chdr::if_hdr_pack_be;
+ fc_cache->unpack = vrt::chdr::if_hdr_unpack_be;
// Run benchmark
- const auto start_time = std::chrono::steady_clock::now();
+ const auto start_time = std::chrono::steady_clock::now();
constexpr size_t iterations = 1e7;
uhd::sid_t send_sid;
@@ -330,18 +294,15 @@ void benchmark_device3_tx_flow_ctrl_ack() {
}
const auto end_time = std::chrono::steady_clock::now();
- const std::chrono::duration<double> elapsed_time(end_time-start_time);
+ const std::chrono::duration<double> elapsed_time(end_time - start_time);
- std::cout << elapsed_time.count() / iterations * 1e9
- << " ns per call\n";
+ std::cout << elapsed_time.count() / iterations * 1e9 << " ns per call\n";
}
-int UHD_SAFE_MAIN(int argc, char *argv[])
+int UHD_SAFE_MAIN(int argc, char* argv[])
{
po::options_description desc("Allowed options");
- desc.add_options()
- ("help", "help message")
- ;
+ desc.add_options()("help", "help message");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
@@ -350,17 +311,17 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
// Print the help message
if (vm.count("help")) {
std::cout << boost::format("UHD Packet Handler Benchmark %s") % desc << std::endl;
- std::cout <<
- " Benchmark of send and receive packet handlers and flow control\n"
- " functions. All benchmarks use mock transport objects. No\n"
- " parameters are needed to run this benchmark.\n"
- << std::endl;
+ std::cout
+ << " Benchmark of send and receive packet handlers and flow control\n"
+ " functions. All benchmarks use mock transport objects. No\n"
+ " parameters are needed to run this benchmark.\n"
+ << std::endl;
return EXIT_FAILURE;
}
uhd::set_thread_priority_safe();
- const char* formats[] = {"sc16", "fc32", "fc64" };
+ const char* formats[] = {"sc16", "fc32", "fc64"};
constexpr size_t rx_spp = 2000;
constexpr size_t tx_spp = 1000;
diff --git a/host/tests/paths_test.cpp b/host/tests/paths_test.cpp
index 0ccebd333..ef10414c7 100644
--- a/host/tests/paths_test.cpp
+++ b/host/tests/paths_test.cpp
@@ -8,12 +8,13 @@
#include <uhd/exception.hpp>
#include <uhd/utils/paths.hpp>
#include <uhdlib/utils/paths.hpp>
-#include <boost/test/unit_test.hpp>
#include <boost/filesystem/operations.hpp>
-#include <vector>
+#include <boost/test/unit_test.hpp>
#include <iostream>
+#include <vector>
-BOOST_AUTO_TEST_CASE(test_paths_expandvars) {
+BOOST_AUTO_TEST_CASE(test_paths_expandvars)
+{
#ifdef UHD_PLATFORM_WIN32
const std::string path_to_expand("\%programdata%/uhd/uhd.conf");
#else
@@ -21,8 +22,8 @@ BOOST_AUTO_TEST_CASE(test_paths_expandvars) {
#endif
const std::string expanded_path = uhd::path_expandvars(path_to_expand);
- std::cout << "Expanded path: " << path_to_expand << " -> "
- << expanded_path << std::endl;
+ std::cout << "Expanded path: " << path_to_expand << " -> " << expanded_path
+ << std::endl;
BOOST_CHECK(path_to_expand != expanded_path);
#ifdef UHD_PLATFORM_WIN32
@@ -35,13 +36,14 @@ BOOST_AUTO_TEST_CASE(test_paths_expandvars) {
}
-BOOST_AUTO_TEST_CASE(test_get_paths) {
+BOOST_AUTO_TEST_CASE(test_get_paths)
+{
using namespace uhd;
const std::string tmp_path = get_tmp_path();
const std::string app_path = get_app_path();
const std::string pkg_path = get_pkg_path();
- const auto module_paths = get_module_paths();
+ const auto module_paths = get_module_paths();
std::cout << "tmp_path: " << tmp_path << std::endl;
std::cout << "app_path: " << app_path << std::endl;
@@ -51,22 +53,14 @@ BOOST_AUTO_TEST_CASE(test_get_paths) {
}
const std::string images_dir_search_path = "";
- const std::string images_dir = get_images_dir(images_dir_search_path);
+ const std::string images_dir = get_images_dir(images_dir_search_path);
BOOST_REQUIRE_THROW(
- find_image_path("this_device_does_not_exist.bit", ""),
- uhd::io_error
- );
+ find_image_path("this_device_does_not_exist.bit", ""), uhd::io_error);
- const std::string utility_path = find_utility(
- "uhd_images_downloader"
- );
+ const std::string utility_path = find_utility("uhd_images_downloader");
std::cout << "utility_path: " << utility_path << std::endl;
- const std::string utility_error = print_utility_error(
- "uhd_images_downloader",
- "--help"
- );
+ const std::string utility_error =
+ print_utility_error("uhd_images_downloader", "--help");
std::cout << "utility_error: " << tmp_path << std::endl;
-
}
-
diff --git a/host/tests/property_test.cpp b/host/tests/property_test.cpp
index 3daeed510..b2086f288 100644
--- a/host/tests/property_test.cpp
+++ b/host/tests/property_test.cpp
@@ -5,22 +5,26 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/property_tree.hpp>
#include <boost/bind.hpp>
+#include <boost/test/unit_test.hpp>
#include <exception>
#include <iostream>
-struct coercer_type{
- int doit(int x){
+struct coercer_type
+{
+ int doit(int x)
+ {
return x & ~0x3;
}
};
-struct setter_type{
+struct setter_type
+{
setter_type() : _count(0), _x(0) {}
- void doit(int x){
+ void doit(int x)
+ {
_count++;
_x = x;
}
@@ -29,10 +33,12 @@ struct setter_type{
int _x;
};
-struct getter_type{
+struct getter_type
+{
getter_type() : _count(0), _x(0) {}
- int doit(void){
+ int doit(void)
+ {
_count++;
return _x;
}
@@ -41,9 +47,10 @@ struct getter_type{
int _x;
};
-BOOST_AUTO_TEST_CASE(test_prop_simple){
+BOOST_AUTO_TEST_CASE(test_prop_simple)
+{
uhd::property_tree::sptr tree = uhd::property_tree::make();
- uhd::property<int> &prop = tree->create<int>("/");
+ uhd::property<int>& prop = tree->create<int>("/");
BOOST_CHECK(prop.empty());
prop.set(0);
@@ -55,9 +62,10 @@ BOOST_AUTO_TEST_CASE(test_prop_simple){
BOOST_CHECK_EQUAL(prop.get(), 34);
}
-BOOST_AUTO_TEST_CASE(test_prop_with_desired_subscriber){
+BOOST_AUTO_TEST_CASE(test_prop_with_desired_subscriber)
+{
uhd::property_tree::sptr tree = uhd::property_tree::make();
- uhd::property<int> &prop = tree->create<int>("/");
+ uhd::property<int>& prop = tree->create<int>("/");
setter_type setter;
prop.add_desired_subscriber(boost::bind(&setter_type::doit, &setter, _1));
@@ -73,9 +81,10 @@ BOOST_AUTO_TEST_CASE(test_prop_with_desired_subscriber){
BOOST_CHECK_EQUAL(setter._x, 34);
}
-BOOST_AUTO_TEST_CASE(test_prop_with_coerced_subscriber){
+BOOST_AUTO_TEST_CASE(test_prop_with_coerced_subscriber)
+{
uhd::property_tree::sptr tree = uhd::property_tree::make();
- uhd::property<int> &prop = tree->create<int>("/");
+ uhd::property<int>& prop = tree->create<int>("/");
setter_type setter;
prop.add_coerced_subscriber(boost::bind(&setter_type::doit, &setter, _1));
@@ -91,9 +100,10 @@ BOOST_AUTO_TEST_CASE(test_prop_with_coerced_subscriber){
BOOST_CHECK_EQUAL(setter._x, 34);
}
-BOOST_AUTO_TEST_CASE(test_prop_manual_coercion){
+BOOST_AUTO_TEST_CASE(test_prop_manual_coercion)
+{
uhd::property_tree::sptr tree = uhd::property_tree::make();
- uhd::property<int> &prop = tree->create<int>("/", uhd::property_tree::MANUAL_COERCE);
+ uhd::property<int>& prop = tree->create<int>("/", uhd::property_tree::MANUAL_COERCE);
setter_type dsetter, csetter;
prop.add_desired_subscriber(boost::bind(&setter_type::doit, &dsetter, _1));
@@ -114,9 +124,10 @@ BOOST_AUTO_TEST_CASE(test_prop_manual_coercion){
BOOST_CHECK_EQUAL(csetter._x, 34);
}
-BOOST_AUTO_TEST_CASE(test_prop_with_publisher){
+BOOST_AUTO_TEST_CASE(test_prop_with_publisher)
+{
uhd::property_tree::sptr tree = uhd::property_tree::make();
- uhd::property<int> &prop = tree->create<int>("/");
+ uhd::property<int>& prop = tree->create<int>("/");
BOOST_CHECK(prop.empty());
getter_type getter;
@@ -124,17 +135,18 @@ BOOST_AUTO_TEST_CASE(test_prop_with_publisher){
BOOST_CHECK(not prop.empty());
getter._x = 42;
- prop.set(0); //should not change
+ prop.set(0); // should not change
BOOST_CHECK_EQUAL(prop.get(), 42);
getter._x = 34;
- prop.set(0); //should not change
+ prop.set(0); // should not change
BOOST_CHECK_EQUAL(prop.get(), 34);
}
-BOOST_AUTO_TEST_CASE(test_prop_with_publisher_and_subscriber){
+BOOST_AUTO_TEST_CASE(test_prop_with_publisher_and_subscriber)
+{
uhd::property_tree::sptr tree = uhd::property_tree::make();
- uhd::property<int> &prop = tree->create<int>("/");
+ uhd::property<int>& prop = tree->create<int>("/");
getter_type getter;
prop.set_publisher(boost::bind(&getter_type::doit, &getter));
@@ -153,9 +165,10 @@ BOOST_AUTO_TEST_CASE(test_prop_with_publisher_and_subscriber){
BOOST_CHECK_EQUAL(setter._x, 1);
}
-BOOST_AUTO_TEST_CASE(test_prop_with_coercion){
+BOOST_AUTO_TEST_CASE(test_prop_with_coercion)
+{
uhd::property_tree::sptr tree = uhd::property_tree::make();
- uhd::property<int> &prop = tree->create<int>("/");
+ uhd::property<int>& prop = tree->create<int>("/");
setter_type setter;
prop.add_coerced_subscriber(boost::bind(&setter_type::doit, &setter, _1));
@@ -172,7 +185,8 @@ BOOST_AUTO_TEST_CASE(test_prop_with_coercion){
BOOST_CHECK_EQUAL(setter._x, 32);
}
-BOOST_AUTO_TEST_CASE(test_prop_tree){
+BOOST_AUTO_TEST_CASE(test_prop_tree)
+{
uhd::property_tree::sptr tree = uhd::property_tree::make();
tree->create<int>("/test/prop0");
@@ -196,42 +210,43 @@ BOOST_AUTO_TEST_CASE(test_prop_tree){
tree->remove("/test");
BOOST_CHECK(not tree->exists("/test/prop0"));
BOOST_CHECK(not tree->exists("/test/prop1"));
-
}
-BOOST_AUTO_TEST_CASE(test_prop_subtree){
+BOOST_AUTO_TEST_CASE(test_prop_subtree)
+{
uhd::property_tree::sptr tree = uhd::property_tree::make();
tree->create<int>("/subdir1/subdir2");
- uhd::property_tree::sptr subtree1 = tree->subtree("/");
- const std::vector<std::string> tree_dirs1 = tree->list("/");
+ uhd::property_tree::sptr subtree1 = tree->subtree("/");
+ const std::vector<std::string> tree_dirs1 = tree->list("/");
const std::vector<std::string> subtree1_dirs = subtree1->list("");
- BOOST_CHECK_EQUAL_COLLECTIONS(tree_dirs1.begin(), tree_dirs1.end(), subtree1_dirs.begin(), subtree1_dirs.end());
+ BOOST_CHECK_EQUAL_COLLECTIONS(
+ tree_dirs1.begin(), tree_dirs1.end(), subtree1_dirs.begin(), subtree1_dirs.end());
- uhd::property_tree::sptr subtree2 = subtree1->subtree("subdir1");
- const std::vector<std::string> tree_dirs2 = tree->list("/subdir1");
+ uhd::property_tree::sptr subtree2 = subtree1->subtree("subdir1");
+ const std::vector<std::string> tree_dirs2 = tree->list("/subdir1");
const std::vector<std::string> subtree2_dirs = subtree2->list("");
- BOOST_CHECK_EQUAL_COLLECTIONS(tree_dirs2.begin(), tree_dirs2.end(), subtree2_dirs.begin(), subtree2_dirs.end());
-
+ BOOST_CHECK_EQUAL_COLLECTIONS(
+ tree_dirs2.begin(), tree_dirs2.end(), subtree2_dirs.begin(), subtree2_dirs.end());
}
BOOST_AUTO_TEST_CASE(test_prop_operators)
{
uhd::fs_path path1 = "/root/";
- path1 = path1 / "leaf";
+ path1 = path1 / "leaf";
BOOST_CHECK_EQUAL(path1, "/root/leaf");
uhd::fs_path path2 = "/root";
- path2 = path2 / "leaf";
+ path2 = path2 / "leaf";
BOOST_CHECK_EQUAL(path2, "/root/leaf");
uhd::fs_path path3 = "/root/";
- path3 = path3 / "/leaf/";
+ path3 = path3 / "/leaf/";
BOOST_CHECK_EQUAL(path3, "/root/leaf/");
uhd::fs_path path4 = "/root/";
- size_t x = 2;
- path4 = path4 / x;
+ size_t x = 2;
+ path4 = path4 / x;
BOOST_CHECK_EQUAL(path4, "/root/2");
}
diff --git a/host/tests/ranges_test.cpp b/host/tests/ranges_test.cpp
index fd6336a55..223560289 100644
--- a/host/tests/ranges_test.cpp
+++ b/host/tests/ranges_test.cpp
@@ -5,8 +5,8 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/types/ranges.hpp>
+#include <boost/test/unit_test.hpp>
#include <iostream>
using namespace uhd;
@@ -14,7 +14,8 @@ using namespace uhd;
static const double tolerance = 0.001; // %
-BOOST_AUTO_TEST_CASE(test_ranges_bounds){
+BOOST_AUTO_TEST_CASE(test_ranges_bounds)
+{
meta_range_t mr;
mr.push_back(range_t(-1.0, +1.0, 0.1));
BOOST_CHECK_CLOSE(mr.start(), -1.0, tolerance);
@@ -33,7 +34,8 @@ BOOST_AUTO_TEST_CASE(test_ranges_bounds){
BOOST_CHECK_CLOSE(mr[0].step(), 0.1, tolerance);
}
-BOOST_AUTO_TEST_CASE(test_ranges_clip){
+BOOST_AUTO_TEST_CASE(test_ranges_clip)
+{
meta_range_t mr;
mr.push_back(range_t(-1.0, +1.0, 0.1));
mr.push_back(range_t(40.0, 60.0, 1.0));
@@ -47,7 +49,8 @@ BOOST_AUTO_TEST_CASE(test_ranges_clip){
BOOST_CHECK_CLOSE(mr.clip(50.9, true), 51.0, tolerance);
}
-BOOST_AUTO_TEST_CASE(test_meta_range_t_ctor){
+BOOST_AUTO_TEST_CASE(test_meta_range_t_ctor)
+{
meta_range_t mr1(0.0, 10.0, 1.0);
BOOST_CHECK_CLOSE(mr1.clip(5.0), 5.0, tolerance);
BOOST_CHECK_CLOSE(mr1.clip(11.0), 10.0, tolerance);
@@ -64,7 +67,8 @@ BOOST_AUTO_TEST_CASE(test_meta_range_t_ctor){
BOOST_CHECK_CLOSE(mr3.clip(5.1, true), 5.1, tolerance);
}
-BOOST_AUTO_TEST_CASE(test_ranges_clip2){
+BOOST_AUTO_TEST_CASE(test_ranges_clip2)
+{
meta_range_t mr;
mr.push_back(range_t(1.));
mr.push_back(range_t(2.));
@@ -77,7 +81,8 @@ BOOST_AUTO_TEST_CASE(test_ranges_clip2){
BOOST_CHECK_CLOSE(mr.clip(4., true), 3., tolerance);
}
-BOOST_AUTO_TEST_CASE(test_ranges_compare){
+BOOST_AUTO_TEST_CASE(test_ranges_compare)
+{
range_t range(1);
range_t n_range(1);
range_t d_range(2);
diff --git a/host/tests/rate_node_test.cpp b/host/tests/rate_node_test.cpp
index f7e1bf30b..85502c325 100644
--- a/host/tests/rate_node_test.cpp
+++ b/host/tests/rate_node_test.cpp
@@ -18,7 +18,7 @@ class rate_aware_node : public test_node, public rate_node_ctrl
public:
typedef boost::shared_ptr<rate_aware_node> sptr;
- rate_aware_node(const std::string &test_id) : test_node(test_id) {};
+ rate_aware_node(const std::string& test_id) : test_node(test_id){};
}; /* class rate_aware_node */
@@ -28,10 +28,17 @@ class rate_setting_node : public test_node, public rate_node_ctrl
public:
typedef boost::shared_ptr<rate_setting_node> sptr;
- rate_setting_node(const std::string &test_id, double samp_rate) : test_node(test_id), _samp_rate(samp_rate) {};
+ rate_setting_node(const std::string& test_id, double samp_rate)
+ : test_node(test_id), _samp_rate(samp_rate){};
- double get_input_samp_rate(size_t) { return _samp_rate; };
- double get_output_samp_rate(size_t) { return _samp_rate; };
+ double get_input_samp_rate(size_t)
+ {
+ return _samp_rate;
+ };
+ double get_output_samp_rate(size_t)
+ {
+ return _samp_rate;
+ };
private:
double _samp_rate;
@@ -39,7 +46,8 @@ private:
}; /* class rate_setting_node */
#define MAKE_RATE_NODE(name) rate_aware_node::sptr name(new rate_aware_node(#name));
-#define MAKE_RATE_SETTING_NODE(name, rate) rate_setting_node::sptr name(new rate_setting_node(#name, rate));
+#define MAKE_RATE_SETTING_NODE(name, rate) \
+ rate_setting_node::sptr name(new rate_setting_node(#name, rate));
BOOST_AUTO_TEST_CASE(test_simplest_downstream_search)
{
@@ -126,4 +134,3 @@ BOOST_AUTO_TEST_CASE(test_skip_upstream_search)
double result_rate = node_C->get_output_samp_rate();
BOOST_CHECK_EQUAL(result_rate, test_rate);
}
-
diff --git a/host/tests/sensors_test.cpp b/host/tests/sensors_test.cpp
index 2136ca13b..925f1a711 100644
--- a/host/tests/sensors_test.cpp
+++ b/host/tests/sensors_test.cpp
@@ -4,20 +4,16 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/types/sensors.hpp>
+#include <boost/test/unit_test.hpp>
#include <map>
#include <string>
using uhd::sensor_value_t;
-BOOST_AUTO_TEST_CASE(test_sensor_bool) {
- auto sensor_bool = sensor_value_t(
- "bool_sensor",
- true,
- "true_unit",
- "false_unit"
- );
+BOOST_AUTO_TEST_CASE(test_sensor_bool)
+{
+ auto sensor_bool = sensor_value_t("bool_sensor", true, "true_unit", "false_unit");
BOOST_CHECK(sensor_bool.to_bool());
BOOST_CHECK_EQUAL(sensor_bool.unit, "true_unit");
@@ -34,11 +30,12 @@ BOOST_AUTO_TEST_CASE(test_sensor_bool) {
}
-BOOST_AUTO_TEST_CASE(test_sensor_real) {
- const double sens_val = 2.25;
+BOOST_AUTO_TEST_CASE(test_sensor_real)
+{
+ const double sens_val = 2.25;
const std::string sens_units = "floats";
- const std::string sens_name = "real_sensor";
- auto sensor_real = sensor_value_t(sens_name, sens_val, sens_units);
+ const std::string sens_name = "real_sensor";
+ auto sensor_real = sensor_value_t(sens_name, sens_val, sens_units);
BOOST_CHECK_EQUAL(sensor_real.to_real(), sens_val);
BOOST_CHECK_EQUAL(sensor_real.unit, sens_units);
@@ -54,11 +51,12 @@ BOOST_AUTO_TEST_CASE(test_sensor_real) {
BOOST_CHECK_EQUAL(sensor_real2.unit, sens_units);
}
-BOOST_AUTO_TEST_CASE(test_sensor_int) {
- const int sens_val = 5;
+BOOST_AUTO_TEST_CASE(test_sensor_int)
+{
+ const int sens_val = 5;
const std::string sens_units = "ints";
- const std::string sens_name = "int_sensor";
- auto sensor_int = sensor_value_t(sens_name, sens_val, sens_units);
+ const std::string sens_name = "int_sensor";
+ auto sensor_int = sensor_value_t(sens_name, sens_val, sens_units);
BOOST_CHECK_EQUAL(sensor_int.to_int(), sens_val);
BOOST_CHECK_EQUAL(sensor_int.unit, sens_units);
@@ -74,11 +72,12 @@ BOOST_AUTO_TEST_CASE(test_sensor_int) {
BOOST_CHECK_EQUAL(sensor_int2.unit, sens_units);
}
-BOOST_AUTO_TEST_CASE(test_sensor_string) {
- const std::string sens_val = "foo";
+BOOST_AUTO_TEST_CASE(test_sensor_string)
+{
+ const std::string sens_val = "foo";
const std::string sens_units = "strings";
- const std::string sens_name = "str_sensor";
- auto sensor_str = sensor_value_t(sens_name, sens_val, sens_units);
+ const std::string sens_name = "str_sensor";
+ auto sensor_str = sensor_value_t(sens_name, sens_val, sens_units);
BOOST_CHECK_EQUAL(sensor_str.value, sens_val);
BOOST_CHECK_EQUAL(sensor_str.unit, sens_units);
@@ -97,6 +96,4 @@ BOOST_AUTO_TEST_CASE(test_sensor_string) {
BOOST_CHECK_EQUAL(sensor_str2.value, sensor_str3.value);
BOOST_CHECK_EQUAL(sensor_str2.unit, sensor_str3.unit);
BOOST_CHECK_EQUAL(sensor_str2.type, sensor_str3.type);
-
}
-
diff --git a/host/tests/sid_t_test.cpp b/host/tests/sid_t_test.cpp
index 1e643e059..85d33c45e 100644
--- a/host/tests/sid_t_test.cpp
+++ b/host/tests/sid_t_test.cpp
@@ -5,15 +5,16 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include <uhd/exception.hpp>
+#include <uhd/types/sid.hpp>
+#include <boost/test/unit_test.hpp>
#include <iostream>
#include <sstream>
-#include <boost/test/unit_test.hpp>
-#include <uhd/types/sid.hpp>
-#include <uhd/exception.hpp>
using uhd::sid_t;
-BOOST_AUTO_TEST_CASE(test_sid_t) {
+BOOST_AUTO_TEST_CASE(test_sid_t)
+{
uint32_t sid_value = 0x01020310;
sid_t sid(sid_value);
@@ -29,7 +30,7 @@ BOOST_AUTO_TEST_CASE(test_sid_t) {
BOOST_CHECK_EQUAL(sid == sid, true);
BOOST_CHECK_EQUAL(sid == sid_value, true);
- uint32_t check_sid_val = (uint32_t) sid;
+ uint32_t check_sid_val = (uint32_t)sid;
BOOST_CHECK_EQUAL(check_sid_val, sid_value);
std::stringstream ss_dec;
@@ -46,20 +47,21 @@ BOOST_AUTO_TEST_CASE(test_sid_t) {
BOOST_CHECK_EQUAL(empty_sid.to_pp_string_hex(), "xx:xx>xx:xx");
BOOST_CHECK_EQUAL(empty_sid == sid, false);
BOOST_CHECK_EQUAL(empty_sid == sid_value, false);
- BOOST_CHECK_EQUAL((bool) empty_sid, false);
+ BOOST_CHECK_EQUAL((bool)empty_sid, false);
empty_sid = sid_value; // No longer empty
BOOST_CHECK_EQUAL(empty_sid.is_set(), true);
BOOST_CHECK_EQUAL(empty_sid == sid, true);
}
-BOOST_AUTO_TEST_CASE(test_sid_t_set) {
+BOOST_AUTO_TEST_CASE(test_sid_t_set)
+{
uint32_t sid_value = 0x0;
sid_t sid(sid_value);
sid.set(0x01020304);
BOOST_CHECK_EQUAL(sid.get(), (uint32_t)0x01020304);
- BOOST_CHECK_EQUAL(sid.get_src_addr(),(uint32_t)0x01);
+ BOOST_CHECK_EQUAL(sid.get_src_addr(), (uint32_t)0x01);
BOOST_CHECK_EQUAL(sid.get_src_endpoint(), (uint32_t)0x02);
BOOST_CHECK_EQUAL(sid.get_dst_addr(), (uint32_t)0x03);
BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), (uint32_t)0x04);
@@ -117,7 +119,8 @@ BOOST_AUTO_TEST_CASE(test_sid_t_set) {
BOOST_CHECK_EQUAL(sid.get(), (uint32_t)0x0cbc0a0b);
}
-BOOST_AUTO_TEST_CASE(test_sid_t_from_str) {
+BOOST_AUTO_TEST_CASE(test_sid_t_from_str)
+{
sid_t sid("1.2>3.4");
BOOST_CHECK_EQUAL(sid.get_src_addr(), (uint32_t)1);
BOOST_CHECK_EQUAL(sid.get_src_endpoint(), (uint32_t)2);
diff --git a/host/tests/soft_reg_test.cpp b/host/tests/soft_reg_test.cpp
index 8e53c61ca..2c1766cfe 100644
--- a/host/tests/soft_reg_test.cpp
+++ b/host/tests/soft_reg_test.cpp
@@ -9,21 +9,22 @@
using namespace uhd;
-BOOST_AUTO_TEST_CASE(test_soft_reg_field) {
+BOOST_AUTO_TEST_CASE(test_soft_reg_field)
+{
UHD_DEFINE_SOFT_REG_FIELD(test_reg1, /* width */ 1, /* shift */ 0);
BOOST_CHECK_EQUAL(soft_reg_field::width(test_reg1), 1);
BOOST_CHECK_EQUAL(soft_reg_field::shift(test_reg1), 0);
- BOOST_CHECK_EQUAL(soft_reg_field::mask<uint32_t>(test_reg1), 1<<0);
+ BOOST_CHECK_EQUAL(soft_reg_field::mask<uint32_t>(test_reg1), 1 << 0);
UHD_DEFINE_SOFT_REG_FIELD(test_reg2, /* width */ 5, /* shift */ 4);
BOOST_CHECK_EQUAL(soft_reg_field::width(test_reg2), 5);
BOOST_CHECK_EQUAL(soft_reg_field::shift(test_reg2), 4);
- BOOST_CHECK_EQUAL(soft_reg_field::mask<uint32_t>(test_reg2), 0x1F<<4);
+ BOOST_CHECK_EQUAL(soft_reg_field::mask<uint32_t>(test_reg2), 0x1F << 4);
UHD_DEFINE_SOFT_REG_FIELD(test_reg3, /* width */ 9, /* shift */ 0);
BOOST_CHECK_EQUAL(soft_reg_field::width(test_reg3), 9);
BOOST_CHECK_EQUAL(soft_reg_field::shift(test_reg3), 0);
- BOOST_CHECK_EQUAL(soft_reg_field::mask<uint8_t>(test_reg3), 0xFF);
+ BOOST_CHECK_EQUAL(soft_reg_field::mask<uint8_t>(test_reg3), 0xFF);
// This one is platform dependent:
UHD_DEFINE_SOFT_REG_FIELD(test_reg4, /* width */ 33, /* shift */ 0);
diff --git a/host/tests/sph_recv_test.cpp b/host/tests/sph_recv_test.cpp
index 705fd4f83..3c185d21a 100644
--- a/host/tests/sph_recv_test.cpp
+++ b/host/tests/sph_recv_test.cpp
@@ -5,14 +5,14 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
-#include "../lib/transport/super_recv_packet_handler.hpp"
#include "../common/mock_zero_copy.hpp"
-#include <boost/shared_array.hpp>
+#include "../lib/transport/super_recv_packet_handler.hpp"
#include <boost/bind.hpp>
+#include <boost/shared_array.hpp>
+#include <boost/test/unit_test.hpp>
#include <complex>
-#include <vector>
#include <list>
+#include <vector>
using namespace uhd::transport;
@@ -22,797 +22,775 @@ using namespace uhd::transport;
/***********************************************************************
* A dummy overflow handler for testing
**********************************************************************/
-struct overflow_handler_type{
- overflow_handler_type(void){
+struct overflow_handler_type
+{
+ overflow_handler_type(void)
+ {
num_overflow = 0;
}
- void handle(void){
+ void handle(void)
+ {
num_overflow++;
}
size_t num_overflow;
};
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_sph_recv_one_channel_normal){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_sph_recv_one_channel_normal)
+{
+ ////////////////////////////////////////////////////////////////////////
uhd::convert::id_type id;
- id.input_format = "sc16_item32_be";
- id.num_inputs = 1;
+ id.input_format = "sc16_item32_be";
+ id.num_inputs = 1;
id.output_format = "fc32";
- id.num_outputs = 1;
+ id.num_outputs = 1;
mock_zero_copy xport(vrt::if_packet_info_t::LINK_TYPE_VRLP);
vrt::if_packet_info_t ifpi;
- ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
ifpi.num_payload_words32 = 0;
- ifpi.packet_count = 0;
- ifpi.sob = true;
- ifpi.eob = false;
- ifpi.has_sid = false;
- ifpi.has_cid = false;
- ifpi.has_tsi = true;
- ifpi.has_tsf = true;
- ifpi.tsi = 0;
- ifpi.tsf = 0;
- ifpi.has_tlr = false;
-
- static const double TICK_RATE = 100e6;
- static const double SAMP_RATE = 10e6;
+ ifpi.packet_count = 0;
+ ifpi.sob = true;
+ ifpi.eob = false;
+ ifpi.has_sid = false;
+ ifpi.has_cid = false;
+ ifpi.has_tsi = true;
+ ifpi.has_tsf = true;
+ ifpi.tsi = 0;
+ ifpi.tsf = 0;
+ ifpi.has_tlr = false;
+
+ static const double TICK_RATE = 100e6;
+ static const double SAMP_RATE = 10e6;
static const size_t NUM_PKTS_TO_TEST = 30;
- //generate a bunch of packets
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
- ifpi.num_payload_words32 = 10 + i%10;
+ // generate a bunch of packets
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
+ ifpi.num_payload_words32 = 10 + i % 10;
std::vector<uint32_t> data(ifpi.num_payload_words32, 0);
xport.push_back_recv_packet(ifpi, data);
ifpi.packet_count++;
- ifpi.tsf += ifpi.num_payload_words32*size_t(TICK_RATE/SAMP_RATE);
+ ifpi.tsf += ifpi.num_payload_words32 * size_t(TICK_RATE / SAMP_RATE);
}
- //create the super receive packet handler
+ // create the super receive packet handler
uhd::transport::sph::recv_packet_handler handler(1);
handler.set_vrt_unpacker(&uhd::transport::vrt::if_hdr_unpack_be);
handler.set_tick_rate(TICK_RATE);
handler.set_samp_rate(SAMP_RATE);
handler.set_xport_chan_get_buff(
- 0,
- [&xport](double timeout) {
- return xport.get_recv_buff(timeout);
- });
+ 0, [&xport](double timeout) { return xport.get_recv_buff(timeout); });
handler.set_converter(id);
- //check the received packets
+ // check the received packets
size_t num_accum_samps = 0;
- std::vector<std::complex<float> > buff(20);
+ std::vector<std::complex<float>> buff(20);
uhd::rx_metadata_t metadata;
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
std::cout << "data check " << i << std::endl;
- size_t num_samps_ret = handler.recv(
- &buff.front(), buff.size(), metadata, 1.0, true
- );
+ size_t num_samps_ret =
+ handler.recv(&buff.front(), buff.size(), metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_NONE);
BOOST_CHECK(not metadata.more_fragments);
BOOST_CHECK(metadata.has_time_spec);
- BOOST_CHECK_TS_CLOSE(metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
- BOOST_CHECK_EQUAL(num_samps_ret, 10 + i%10);
+ BOOST_CHECK_TS_CLOSE(
+ metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
+ BOOST_CHECK_EQUAL(num_samps_ret, 10 + i % 10);
num_accum_samps += num_samps_ret;
}
- //subsequent receives should be a timeout
- for (size_t i = 0; i < 3; i++){
+ // subsequent receives should be a timeout
+ for (size_t i = 0; i < 3; i++) {
std::cout << "timeout check " << i << std::endl;
- handler.recv(
- &buff.front(), buff.size(), metadata, 1.0, true
- );
+ handler.recv(&buff.front(), buff.size(), metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_TIMEOUT);
}
- //simulate the transport failing
+ // simulate the transport failing
xport.set_simulate_io_error(true);
- BOOST_REQUIRE_THROW(handler.recv(&buff.front(), buff.size(), metadata, 1.0, true), uhd::io_error);
+ BOOST_REQUIRE_THROW(
+ handler.recv(&buff.front(), buff.size(), metadata, 1.0, true), uhd::io_error);
}
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_sph_recv_one_channel_sequence_error){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_sph_recv_one_channel_sequence_error)
+{
+ ////////////////////////////////////////////////////////////////////////
uhd::convert::id_type id;
- id.input_format = "sc16_item32_be";
- id.num_inputs = 1;
+ id.input_format = "sc16_item32_be";
+ id.num_inputs = 1;
id.output_format = "fc32";
- id.num_outputs = 1;
+ id.num_outputs = 1;
mock_zero_copy xport(vrt::if_packet_info_t::LINK_TYPE_VRLP);
vrt::if_packet_info_t ifpi;
- ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
ifpi.num_payload_words32 = 0;
- ifpi.packet_count = 0;
- ifpi.sob = true;
- ifpi.eob = false;
- ifpi.has_sid = false;
- ifpi.has_cid = false;
- ifpi.has_tsi = true;
- ifpi.has_tsf = true;
- ifpi.tsi = 0;
- ifpi.tsf = 0;
- ifpi.has_tlr = false;
-
- static const double TICK_RATE = 100e6;
- static const double SAMP_RATE = 10e6;
+ ifpi.packet_count = 0;
+ ifpi.sob = true;
+ ifpi.eob = false;
+ ifpi.has_sid = false;
+ ifpi.has_cid = false;
+ ifpi.has_tsi = true;
+ ifpi.has_tsf = true;
+ ifpi.tsi = 0;
+ ifpi.tsf = 0;
+ ifpi.has_tlr = false;
+
+ static const double TICK_RATE = 100e6;
+ static const double SAMP_RATE = 10e6;
static const size_t NUM_PKTS_TO_TEST = 30;
- //generate a bunch of packets
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
- ifpi.num_payload_words32 = 10 + i%10;
- if (i != NUM_PKTS_TO_TEST/2){ //simulate a lost packet
+ // generate a bunch of packets
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
+ ifpi.num_payload_words32 = 10 + i % 10;
+ if (i != NUM_PKTS_TO_TEST / 2) { // simulate a lost packet
std::vector<uint32_t> data(ifpi.num_payload_words32, 0);
xport.push_back_recv_packet(ifpi, data);
}
ifpi.packet_count++;
- ifpi.tsf += ifpi.num_payload_words32*size_t(TICK_RATE/SAMP_RATE);
+ ifpi.tsf += ifpi.num_payload_words32 * size_t(TICK_RATE / SAMP_RATE);
}
- //create the super receive packet handler
+ // create the super receive packet handler
sph::recv_packet_handler handler(1);
handler.set_vrt_unpacker(&vrt::if_hdr_unpack_be);
handler.set_tick_rate(TICK_RATE);
handler.set_samp_rate(SAMP_RATE);
handler.set_xport_chan_get_buff(
- 0,
- [&xport](double timeout) {
- return xport.get_recv_buff(timeout);
- }
- );
+ 0, [&xport](double timeout) { return xport.get_recv_buff(timeout); });
handler.set_converter(id);
- //check the received packets
+ // check the received packets
size_t num_accum_samps = 0;
- std::vector<std::complex<float> > buff(20);
+ std::vector<std::complex<float>> buff(20);
uhd::rx_metadata_t metadata;
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
std::cout << "data check " << i << std::endl;
- size_t num_samps_ret = handler.recv(
- &buff.front(), buff.size(), metadata, 1.0, true
- );
- if (i == NUM_PKTS_TO_TEST/2){
- //must get the soft overflow here
+ size_t num_samps_ret =
+ handler.recv(&buff.front(), buff.size(), metadata, 1.0, true);
+ if (i == NUM_PKTS_TO_TEST / 2) {
+ // must get the soft overflow here
BOOST_REQUIRE(metadata.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW);
BOOST_REQUIRE(metadata.out_of_sequence == true);
- BOOST_CHECK_TS_CLOSE(metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
- num_accum_samps += 10 + i%10;
- }
- else{
+ BOOST_CHECK_TS_CLOSE(metadata.time_spec,
+ uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
+ num_accum_samps += 10 + i % 10;
+ } else {
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_NONE);
BOOST_CHECK(not metadata.more_fragments);
BOOST_CHECK(metadata.has_time_spec);
- BOOST_CHECK_TS_CLOSE(metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
- BOOST_CHECK_EQUAL(num_samps_ret, 10 + i%10);
+ BOOST_CHECK_TS_CLOSE(metadata.time_spec,
+ uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
+ BOOST_CHECK_EQUAL(num_samps_ret, 10 + i % 10);
num_accum_samps += num_samps_ret;
}
}
- //subsequent receives should be a timeout
- for (size_t i = 0; i < 3; i++){
+ // subsequent receives should be a timeout
+ for (size_t i = 0; i < 3; i++) {
std::cout << "timeout check " << i << std::endl;
- handler.recv(
- &buff.front(), buff.size(), metadata, 1.0, true
- );
+ handler.recv(&buff.front(), buff.size(), metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_TIMEOUT);
}
- //simulate the transport failing
+ // simulate the transport failing
xport.set_simulate_io_error(true);
- BOOST_REQUIRE_THROW(handler.recv(&buff.front(), buff.size(), metadata, 1.0, true), uhd::io_error);
+ BOOST_REQUIRE_THROW(
+ handler.recv(&buff.front(), buff.size(), metadata, 1.0, true), uhd::io_error);
}
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_sph_recv_one_channel_inline_message){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_sph_recv_one_channel_inline_message)
+{
+ ////////////////////////////////////////////////////////////////////////
uhd::convert::id_type id;
- id.input_format = "sc16_item32_be";
- id.num_inputs = 1;
+ id.input_format = "sc16_item32_be";
+ id.num_inputs = 1;
id.output_format = "fc32";
- id.num_outputs = 1;
+ id.num_outputs = 1;
mock_zero_copy xport(vrt::if_packet_info_t::LINK_TYPE_VRLP);
vrt::if_packet_info_t ifpi;
- ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
ifpi.num_payload_words32 = 0;
- ifpi.packet_count = 0;
- ifpi.sob = true;
- ifpi.eob = false;
- ifpi.has_sid = false;
- ifpi.has_cid = false;
- ifpi.has_tsi = true;
- ifpi.has_tsf = true;
- ifpi.tsi = 0;
- ifpi.tsf = 0;
- ifpi.has_tlr = false;
-
- static const double TICK_RATE = 100e6;
- static const double SAMP_RATE = 10e6;
+ ifpi.packet_count = 0;
+ ifpi.sob = true;
+ ifpi.eob = false;
+ ifpi.has_sid = false;
+ ifpi.has_cid = false;
+ ifpi.has_tsi = true;
+ ifpi.has_tsf = true;
+ ifpi.tsi = 0;
+ ifpi.tsf = 0;
+ ifpi.has_tlr = false;
+
+ static const double TICK_RATE = 100e6;
+ static const double SAMP_RATE = 10e6;
static const size_t NUM_PKTS_TO_TEST = 30;
- //generate a bunch of packets
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
- ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
- ifpi.num_payload_words32 = 10 + i%10;
+ // generate a bunch of packets
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
+ ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ ifpi.num_payload_words32 = 10 + i % 10;
std::vector<uint32_t> data(ifpi.num_payload_words32, 0);
xport.push_back_recv_packet(ifpi, data);
ifpi.packet_count++;
- ifpi.tsf += ifpi.num_payload_words32*size_t(TICK_RATE/SAMP_RATE);
+ ifpi.tsf += ifpi.num_payload_words32 * size_t(TICK_RATE / SAMP_RATE);
- //simulate overflow
- if (i == NUM_PKTS_TO_TEST/2){
- ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_CONTEXT;
+ // simulate overflow
+ if (i == NUM_PKTS_TO_TEST / 2) {
+ ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_CONTEXT;
ifpi.num_payload_words32 = 1;
xport.push_back_inline_message_packet(
- ifpi,
- uhd::rx_metadata_t::ERROR_CODE_OVERFLOW);
+ ifpi, uhd::rx_metadata_t::ERROR_CODE_OVERFLOW);
}
}
- //create the super receive packet handler
+ // create the super receive packet handler
sph::recv_packet_handler handler(1);
handler.set_vrt_unpacker(&vrt::if_hdr_unpack_be);
handler.set_tick_rate(TICK_RATE);
handler.set_samp_rate(SAMP_RATE);
handler.set_xport_chan_get_buff(
- 0,
- [&xport](double timeout) {
- return xport.get_recv_buff(timeout);
- }
- );
+ 0, [&xport](double timeout) { return xport.get_recv_buff(timeout); });
handler.set_converter(id);
- //create an overflow handler
+ // create an overflow handler
overflow_handler_type overflow_handler;
- handler.set_overflow_handler(0, boost::bind(&overflow_handler_type::handle, &overflow_handler));
+ handler.set_overflow_handler(
+ 0, boost::bind(&overflow_handler_type::handle, &overflow_handler));
- //check the received packets
+ // check the received packets
size_t num_accum_samps = 0;
- std::vector<std::complex<float> > buff(20);
+ std::vector<std::complex<float>> buff(20);
uhd::rx_metadata_t metadata;
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
std::cout << "data check " << i << std::endl;
- size_t num_samps_ret = handler.recv(
- &buff.front(), buff.size(), metadata, 1.0, true
- );
+ size_t num_samps_ret =
+ handler.recv(&buff.front(), buff.size(), metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_NONE);
BOOST_CHECK(not metadata.more_fragments);
BOOST_CHECK(metadata.has_time_spec);
- BOOST_CHECK_TS_CLOSE(metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
- BOOST_CHECK_EQUAL(num_samps_ret, 10 + i%10);
+ BOOST_CHECK_TS_CLOSE(
+ metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
+ BOOST_CHECK_EQUAL(num_samps_ret, 10 + i % 10);
num_accum_samps += num_samps_ret;
- if (i == NUM_PKTS_TO_TEST/2){
- handler.recv(
- &buff.front(), buff.size(), metadata, 1.0, true
- );
+ if (i == NUM_PKTS_TO_TEST / 2) {
+ handler.recv(&buff.front(), buff.size(), metadata, 1.0, true);
std::cout << "metadata.error_code " << metadata.error_code << std::endl;
BOOST_REQUIRE(metadata.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW);
- BOOST_CHECK_TS_CLOSE(metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
+ BOOST_CHECK_TS_CLOSE(metadata.time_spec,
+ uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
BOOST_CHECK_EQUAL(overflow_handler.num_overflow, size_t(1));
}
}
- //subsequent receives should be a timeout
- for (size_t i = 0; i < 3; i++){
+ // subsequent receives should be a timeout
+ for (size_t i = 0; i < 3; i++) {
std::cout << "timeout check " << i << std::endl;
- handler.recv(
- &buff.front(), buff.size(), metadata, 1.0, true
- );
+ handler.recv(&buff.front(), buff.size(), metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_TIMEOUT);
}
- //simulate the transport failing
+ // simulate the transport failing
xport.set_simulate_io_error(true);
- BOOST_REQUIRE_THROW(handler.recv(&buff.front(), buff.size(), metadata, 1.0, true), uhd::io_error);
+ BOOST_REQUIRE_THROW(
+ handler.recv(&buff.front(), buff.size(), metadata, 1.0, true), uhd::io_error);
}
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_sph_recv_multi_channel_normal){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_sph_recv_multi_channel_normal)
+{
+ ////////////////////////////////////////////////////////////////////////
uhd::convert::id_type id;
- id.input_format = "sc16_item32_be";
- id.num_inputs = 1;
+ id.input_format = "sc16_item32_be";
+ id.num_inputs = 1;
id.output_format = "fc32";
- id.num_outputs = 1;
+ id.num_outputs = 1;
vrt::if_packet_info_t ifpi;
- ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
ifpi.num_payload_words32 = 0;
- ifpi.packet_count = 0;
- ifpi.sob = true;
- ifpi.eob = false;
- ifpi.has_sid = false;
- ifpi.has_cid = false;
- ifpi.has_tsi = true;
- ifpi.has_tsf = true;
- ifpi.tsi = 0;
- ifpi.tsf = 0;
- ifpi.has_tlr = false;
-
- static const double TICK_RATE = 100e6;
- static const double SAMP_RATE = 10e6;
- static const size_t NUM_PKTS_TO_TEST = 30;
+ ifpi.packet_count = 0;
+ ifpi.sob = true;
+ ifpi.eob = false;
+ ifpi.has_sid = false;
+ ifpi.has_cid = false;
+ ifpi.has_tsi = true;
+ ifpi.has_tsf = true;
+ ifpi.tsi = 0;
+ ifpi.tsf = 0;
+ ifpi.has_tlr = false;
+
+ static const double TICK_RATE = 100e6;
+ static const double SAMP_RATE = 10e6;
+ static const size_t NUM_PKTS_TO_TEST = 30;
static const size_t NUM_SAMPS_PER_BUFF = 20;
- static const size_t NCHANNELS = 4;
+ static const size_t NCHANNELS = 4;
std::vector<mock_zero_copy::sptr> xports;
for (size_t i = 0; i < NCHANNELS; i++) {
- xports.push_back(boost::make_shared<mock_zero_copy>(vrt::if_packet_info_t::LINK_TYPE_VRLP));
+ xports.push_back(
+ boost::make_shared<mock_zero_copy>(vrt::if_packet_info_t::LINK_TYPE_VRLP));
}
- //generate a bunch of packets
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
- ifpi.num_payload_words32 = 10 + i%10;
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ // generate a bunch of packets
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
+ ifpi.num_payload_words32 = 10 + i % 10;
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
std::vector<uint32_t> data(ifpi.num_payload_words32, 0);
xports[ch]->push_back_recv_packet(ifpi, data);
}
ifpi.packet_count++;
- ifpi.tsf += ifpi.num_payload_words32*size_t(TICK_RATE/SAMP_RATE);
+ ifpi.tsf += ifpi.num_payload_words32 * size_t(TICK_RATE / SAMP_RATE);
}
- //create the super receive packet handler
+ // create the super receive packet handler
sph::recv_packet_handler handler(NCHANNELS);
handler.set_vrt_unpacker(&vrt::if_hdr_unpack_be);
handler.set_tick_rate(TICK_RATE);
handler.set_samp_rate(SAMP_RATE);
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
mock_zero_copy::sptr xport = xports[ch];
handler.set_xport_chan_get_buff(
- ch,
- [xport](double timeout) {
- return xport->get_recv_buff(timeout);
- }
- );
+ ch, [xport](double timeout) { return xport->get_recv_buff(timeout); });
}
handler.set_converter(id);
- //check the received packets
+ // check the received packets
size_t num_accum_samps = 0;
- std::complex<float> mem[NUM_SAMPS_PER_BUFF*NCHANNELS];
- std::vector<std::complex<float> *> buffs(NCHANNELS);
- for (size_t ch = 0; ch < NCHANNELS; ch++){
- buffs[ch] = &mem[ch*NUM_SAMPS_PER_BUFF];
+ std::complex<float> mem[NUM_SAMPS_PER_BUFF * NCHANNELS];
+ std::vector<std::complex<float>*> buffs(NCHANNELS);
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
+ buffs[ch] = &mem[ch * NUM_SAMPS_PER_BUFF];
}
uhd::rx_metadata_t metadata;
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
std::cout << "data check " << i << std::endl;
- size_t num_samps_ret = handler.recv(
- buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true
- );
+ size_t num_samps_ret =
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_NONE);
BOOST_CHECK(not metadata.more_fragments);
BOOST_CHECK(metadata.has_time_spec);
- BOOST_CHECK_TS_CLOSE(metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
- BOOST_CHECK_EQUAL(num_samps_ret, 10 + i%10);
+ BOOST_CHECK_TS_CLOSE(
+ metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
+ BOOST_CHECK_EQUAL(num_samps_ret, 10 + i % 10);
num_accum_samps += num_samps_ret;
}
- //subsequent receives should be a timeout
- for (size_t i = 0; i < 3; i++){
+ // subsequent receives should be a timeout
+ for (size_t i = 0; i < 3; i++) {
std::cout << "timeout check " << i << std::endl;
- handler.recv(
- buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true
- );
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_TIMEOUT);
}
- //simulate the transport failing
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ // simulate the transport failing
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
xports[ch]->set_simulate_io_error(true);
}
- BOOST_REQUIRE_THROW(handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true), uhd::io_error);
+ BOOST_REQUIRE_THROW(
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true), uhd::io_error);
}
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_sph_recv_multi_channel_sequence_error){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_sph_recv_multi_channel_sequence_error)
+{
+ ////////////////////////////////////////////////////////////////////////
uhd::convert::id_type id;
- id.input_format = "sc16_item32_be";
- id.num_inputs = 1;
+ id.input_format = "sc16_item32_be";
+ id.num_inputs = 1;
id.output_format = "fc32";
- id.num_outputs = 1;
+ id.num_outputs = 1;
vrt::if_packet_info_t ifpi;
- ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
ifpi.num_payload_words32 = 0;
- ifpi.packet_count = 0;
- ifpi.sob = true;
- ifpi.eob = false;
- ifpi.has_sid = false;
- ifpi.has_cid = false;
- ifpi.has_tsi = true;
- ifpi.has_tsf = true;
- ifpi.tsi = 0;
- ifpi.tsf = 0;
- ifpi.has_tlr = false;
-
- static const double TICK_RATE = 100e6;
- static const double SAMP_RATE = 10e6;
- static const size_t NUM_PKTS_TO_TEST = 30;
+ ifpi.packet_count = 0;
+ ifpi.sob = true;
+ ifpi.eob = false;
+ ifpi.has_sid = false;
+ ifpi.has_cid = false;
+ ifpi.has_tsi = true;
+ ifpi.has_tsf = true;
+ ifpi.tsi = 0;
+ ifpi.tsf = 0;
+ ifpi.has_tlr = false;
+
+ static const double TICK_RATE = 100e6;
+ static const double SAMP_RATE = 10e6;
+ static const size_t NUM_PKTS_TO_TEST = 30;
static const size_t NUM_SAMPS_PER_BUFF = 20;
- static const size_t NCHANNELS = 4;
+ static const size_t NCHANNELS = 4;
std::vector<mock_zero_copy::sptr> xports;
for (size_t i = 0; i < NCHANNELS; i++) {
- xports.push_back(boost::make_shared<mock_zero_copy>(vrt::if_packet_info_t::LINK_TYPE_VRLP));
+ xports.push_back(
+ boost::make_shared<mock_zero_copy>(vrt::if_packet_info_t::LINK_TYPE_VRLP));
}
- //generate a bunch of packets
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
- ifpi.num_payload_words32 = 10 + i%10;
- for (size_t ch = 0; ch < NCHANNELS; ch++){
- if (i == NUM_PKTS_TO_TEST/2 and ch == 2){
- continue; //simulates a lost packet
+ // generate a bunch of packets
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
+ ifpi.num_payload_words32 = 10 + i % 10;
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
+ if (i == NUM_PKTS_TO_TEST / 2 and ch == 2) {
+ continue; // simulates a lost packet
}
std::vector<uint32_t> data(ifpi.num_payload_words32, 0);
xports[ch]->push_back_recv_packet(ifpi, data);
}
ifpi.packet_count++;
- ifpi.tsf += ifpi.num_payload_words32*size_t(TICK_RATE/SAMP_RATE);
+ ifpi.tsf += ifpi.num_payload_words32 * size_t(TICK_RATE / SAMP_RATE);
}
- //create the super receive packet handler
+ // create the super receive packet handler
sph::recv_packet_handler handler(NCHANNELS);
handler.set_vrt_unpacker(&vrt::if_hdr_unpack_be);
handler.set_tick_rate(TICK_RATE);
handler.set_samp_rate(SAMP_RATE);
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
mock_zero_copy::sptr xport = xports[ch];
handler.set_xport_chan_get_buff(
- ch,
- [xport](double timeout) {
- return xport->get_recv_buff(timeout);
- }
- );
+ ch, [xport](double timeout) { return xport->get_recv_buff(timeout); });
}
handler.set_converter(id);
- //check the received packets
+ // check the received packets
size_t num_accum_samps = 0;
- std::complex<float> mem[NUM_SAMPS_PER_BUFF*NCHANNELS];
- std::vector<std::complex<float> *> buffs(NCHANNELS);
- for (size_t ch = 0; ch < NCHANNELS; ch++){
- buffs[ch] = &mem[ch*NUM_SAMPS_PER_BUFF];
+ std::complex<float> mem[NUM_SAMPS_PER_BUFF * NCHANNELS];
+ std::vector<std::complex<float>*> buffs(NCHANNELS);
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
+ buffs[ch] = &mem[ch * NUM_SAMPS_PER_BUFF];
}
uhd::rx_metadata_t metadata;
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
std::cout << "data check " << i << std::endl;
- size_t num_samps_ret = handler.recv(
- buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true
- );
- if (i == NUM_PKTS_TO_TEST/2){
- //must get the soft overflow here
+ size_t num_samps_ret =
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true);
+ if (i == NUM_PKTS_TO_TEST / 2) {
+ // must get the soft overflow here
BOOST_REQUIRE(metadata.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW);
BOOST_REQUIRE(metadata.out_of_sequence == true);
- BOOST_CHECK_TS_CLOSE(metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
- num_accum_samps += 10 + i%10;
- }
- else{
+ BOOST_CHECK_TS_CLOSE(metadata.time_spec,
+ uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
+ num_accum_samps += 10 + i % 10;
+ } else {
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_NONE);
BOOST_CHECK(not metadata.more_fragments);
BOOST_CHECK(metadata.has_time_spec);
- BOOST_CHECK_TS_CLOSE(metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
- BOOST_CHECK_EQUAL(num_samps_ret, 10 + i%10);
+ BOOST_CHECK_TS_CLOSE(metadata.time_spec,
+ uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
+ BOOST_CHECK_EQUAL(num_samps_ret, 10 + i % 10);
num_accum_samps += num_samps_ret;
}
}
- //subsequent receives should be a timeout
- for (size_t i = 0; i < 3; i++){
+ // subsequent receives should be a timeout
+ for (size_t i = 0; i < 3; i++) {
std::cout << "timeout check " << i << std::endl;
- handler.recv(
- buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true
- );
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_TIMEOUT);
}
- //simulate the transport failing
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ // simulate the transport failing
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
xports[ch]->set_simulate_io_error(true);
}
- BOOST_REQUIRE_THROW(handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true), uhd::io_error);
+ BOOST_REQUIRE_THROW(
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true), uhd::io_error);
}
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_sph_recv_multi_channel_time_error){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_sph_recv_multi_channel_time_error)
+{
+ ////////////////////////////////////////////////////////////////////////
uhd::convert::id_type id;
- id.input_format = "sc16_item32_be";
- id.num_inputs = 1;
+ id.input_format = "sc16_item32_be";
+ id.num_inputs = 1;
id.output_format = "fc32";
- id.num_outputs = 1;
+ id.num_outputs = 1;
vrt::if_packet_info_t ifpi;
- ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
ifpi.num_payload_words32 = 0;
- ifpi.packet_count = 0;
- ifpi.sob = true;
- ifpi.eob = false;
- ifpi.has_sid = false;
- ifpi.has_cid = false;
- ifpi.has_tsi = true;
- ifpi.has_tsf = true;
- ifpi.tsi = 0;
- ifpi.tsf = 0;
- ifpi.has_tlr = false;
-
- static const double TICK_RATE = 100e6;
- static const double SAMP_RATE = 10e6;
- static const size_t NUM_PKTS_TO_TEST = 30;
+ ifpi.packet_count = 0;
+ ifpi.sob = true;
+ ifpi.eob = false;
+ ifpi.has_sid = false;
+ ifpi.has_cid = false;
+ ifpi.has_tsi = true;
+ ifpi.has_tsf = true;
+ ifpi.tsi = 0;
+ ifpi.tsf = 0;
+ ifpi.has_tlr = false;
+
+ static const double TICK_RATE = 100e6;
+ static const double SAMP_RATE = 10e6;
+ static const size_t NUM_PKTS_TO_TEST = 30;
static const size_t NUM_SAMPS_PER_BUFF = 20;
- static const size_t NCHANNELS = 4;
+ static const size_t NCHANNELS = 4;
std::vector<mock_zero_copy::sptr> xports;
for (size_t i = 0; i < NCHANNELS; i++) {
- xports.push_back(boost::make_shared<mock_zero_copy>(vrt::if_packet_info_t::LINK_TYPE_VRLP));
+ xports.push_back(
+ boost::make_shared<mock_zero_copy>(vrt::if_packet_info_t::LINK_TYPE_VRLP));
}
- //generate a bunch of packets
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
- ifpi.num_payload_words32 = 10 + i%10;
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ // generate a bunch of packets
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
+ ifpi.num_payload_words32 = 10 + i % 10;
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
std::vector<uint32_t> data(ifpi.num_payload_words32, 0);
xports[ch]->push_back_recv_packet(ifpi, data);
}
ifpi.packet_count++;
- ifpi.tsf += ifpi.num_payload_words32*size_t(TICK_RATE/SAMP_RATE);
- if (i == NUM_PKTS_TO_TEST/2){
- ifpi.tsf = 0; //simulate the user changing the time
+ ifpi.tsf += ifpi.num_payload_words32 * size_t(TICK_RATE / SAMP_RATE);
+ if (i == NUM_PKTS_TO_TEST / 2) {
+ ifpi.tsf = 0; // simulate the user changing the time
}
}
- //create the super receive packet handler
+ // create the super receive packet handler
sph::recv_packet_handler handler(NCHANNELS);
handler.set_vrt_unpacker(&vrt::if_hdr_unpack_be);
handler.set_tick_rate(TICK_RATE);
handler.set_samp_rate(SAMP_RATE);
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
mock_zero_copy::sptr xport = xports[ch];
handler.set_xport_chan_get_buff(
- ch,
- [xport](double timeout) {
- return xport->get_recv_buff(timeout);
- }
- );
+ ch, [xport](double timeout) { return xport->get_recv_buff(timeout); });
}
handler.set_converter(id);
- //check the received packets
+ // check the received packets
size_t num_accum_samps = 0;
- std::complex<float> mem[NUM_SAMPS_PER_BUFF*NCHANNELS];
- std::vector<std::complex<float> *> buffs(NCHANNELS);
- for (size_t ch = 0; ch < NCHANNELS; ch++){
- buffs[ch] = &mem[ch*NUM_SAMPS_PER_BUFF];
+ std::complex<float> mem[NUM_SAMPS_PER_BUFF * NCHANNELS];
+ std::vector<std::complex<float>*> buffs(NCHANNELS);
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
+ buffs[ch] = &mem[ch * NUM_SAMPS_PER_BUFF];
}
uhd::rx_metadata_t metadata;
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
std::cout << "data check " << i << std::endl;
- size_t num_samps_ret = handler.recv(
- buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true
- );
+ size_t num_samps_ret =
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_NONE);
BOOST_CHECK(not metadata.more_fragments);
BOOST_CHECK(metadata.has_time_spec);
- BOOST_CHECK_TS_CLOSE(metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
- BOOST_CHECK_EQUAL(num_samps_ret, 10 + i%10);
+ BOOST_CHECK_TS_CLOSE(
+ metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
+ BOOST_CHECK_EQUAL(num_samps_ret, 10 + i % 10);
num_accum_samps += num_samps_ret;
- if (i == NUM_PKTS_TO_TEST/2){
- num_accum_samps = 0; //simulate the user changing the time
+ if (i == NUM_PKTS_TO_TEST / 2) {
+ num_accum_samps = 0; // simulate the user changing the time
}
}
- //subsequent receives should be a timeout
- for (size_t i = 0; i < 3; i++){
+ // subsequent receives should be a timeout
+ for (size_t i = 0; i < 3; i++) {
std::cout << "timeout check " << i << std::endl;
- handler.recv(
- buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true
- );
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_TIMEOUT);
}
- //simulate the transport failing
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ // simulate the transport failing
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
xports[ch]->set_simulate_io_error(true);
}
- BOOST_REQUIRE_THROW(handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true), uhd::io_error);
+ BOOST_REQUIRE_THROW(
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true), uhd::io_error);
}
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_sph_recv_multi_channel_exception){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_sph_recv_multi_channel_exception)
+{
+ ////////////////////////////////////////////////////////////////////////
uhd::convert::id_type id;
- id.input_format = "sc16_item32_be";
- id.num_inputs = 1;
+ id.input_format = "sc16_item32_be";
+ id.num_inputs = 1;
id.output_format = "fc32";
- id.num_outputs = 1;
+ id.num_outputs = 1;
vrt::if_packet_info_t ifpi;
- ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
ifpi.num_payload_words32 = 0;
- ifpi.packet_count = 0;
- ifpi.sob = true;
- ifpi.eob = false;
- ifpi.has_sid = false;
- ifpi.has_cid = false;
- ifpi.has_tsi = true;
- ifpi.has_tsf = true;
- ifpi.tsi = 0;
- ifpi.tsf = 0;
- ifpi.has_tlr = false;
-
- static const double TICK_RATE = 100e6;
- static const double SAMP_RATE = 10e6;
- static const size_t NUM_PKTS_TO_TEST = 30;
+ ifpi.packet_count = 0;
+ ifpi.sob = true;
+ ifpi.eob = false;
+ ifpi.has_sid = false;
+ ifpi.has_cid = false;
+ ifpi.has_tsi = true;
+ ifpi.has_tsf = true;
+ ifpi.tsi = 0;
+ ifpi.tsf = 0;
+ ifpi.has_tlr = false;
+
+ static const double TICK_RATE = 100e6;
+ static const double SAMP_RATE = 10e6;
+ static const size_t NUM_PKTS_TO_TEST = 30;
static const size_t NUM_SAMPS_PER_BUFF = 20;
- static const size_t NCHANNELS = 4;
+ static const size_t NCHANNELS = 4;
std::vector<mock_zero_copy::sptr> xports;
for (size_t i = 0; i < NCHANNELS; i++) {
- xports.push_back(boost::make_shared<mock_zero_copy>(vrt::if_packet_info_t::LINK_TYPE_VRLP));
+ xports.push_back(
+ boost::make_shared<mock_zero_copy>(vrt::if_packet_info_t::LINK_TYPE_VRLP));
}
- //generate a bunch of packets
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
- ifpi.num_payload_words32 = 10 + i%10;
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ // generate a bunch of packets
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
+ ifpi.num_payload_words32 = 10 + i % 10;
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
std::vector<uint32_t> data(ifpi.num_payload_words32, 0);
xports[ch]->push_back_recv_packet(ifpi, data);
}
ifpi.packet_count++;
- ifpi.tsf += ifpi.num_payload_words32*size_t(TICK_RATE/SAMP_RATE);
- if (i == NUM_PKTS_TO_TEST/2){
- ifpi.tsf = 0; //simulate the user changing the time
+ ifpi.tsf += ifpi.num_payload_words32 * size_t(TICK_RATE / SAMP_RATE);
+ if (i == NUM_PKTS_TO_TEST / 2) {
+ ifpi.tsf = 0; // simulate the user changing the time
}
}
- //create the super receive packet handler
+ // create the super receive packet handler
sph::recv_packet_handler handler(NCHANNELS);
handler.set_vrt_unpacker(&vrt::if_hdr_unpack_be);
handler.set_tick_rate(TICK_RATE);
handler.set_samp_rate(SAMP_RATE);
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
mock_zero_copy::sptr xport = xports[ch];
handler.set_xport_chan_get_buff(
- ch,
- [xport](double timeout) {
- return xport->get_recv_buff(timeout);
- }
- );
+ ch, [xport](double timeout) { return xport->get_recv_buff(timeout); });
}
handler.set_converter(id);
- std::complex<float> mem[NUM_SAMPS_PER_BUFF*NCHANNELS];
- std::vector<std::complex<float> *> buffs(NCHANNELS);
- for (size_t ch = 0; ch < NCHANNELS; ch++){
- buffs[ch] = &mem[ch*NUM_SAMPS_PER_BUFF];
+ std::complex<float> mem[NUM_SAMPS_PER_BUFF * NCHANNELS];
+ std::vector<std::complex<float>*> buffs(NCHANNELS);
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
+ buffs[ch] = &mem[ch * NUM_SAMPS_PER_BUFF];
}
// simulate a failure on a channel (the last one)
uhd::rx_metadata_t metadata;
- xports[NCHANNELS-1]->set_simulate_io_error(true);
+ xports[NCHANNELS - 1]->set_simulate_io_error(true);
std::cout << "exception check" << std::endl;
- BOOST_REQUIRE_THROW(handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true), uhd::io_error);
+ BOOST_REQUIRE_THROW(
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true), uhd::io_error);
}
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_sph_recv_multi_channel_fragment){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_sph_recv_multi_channel_fragment)
+{
+ ////////////////////////////////////////////////////////////////////////
uhd::convert::id_type id;
- id.input_format = "sc16_item32_be";
- id.num_inputs = 1;
+ id.input_format = "sc16_item32_be";
+ id.num_inputs = 1;
id.output_format = "fc32";
- id.num_outputs = 1;
+ id.num_outputs = 1;
vrt::if_packet_info_t ifpi;
- ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ ifpi.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
ifpi.num_payload_words32 = 0;
- ifpi.packet_count = 0;
- ifpi.sob = true;
- ifpi.eob = false;
- ifpi.has_sid = false;
- ifpi.has_cid = false;
- ifpi.has_tsi = true;
- ifpi.has_tsf = true;
- ifpi.tsi = 0;
- ifpi.tsf = 0;
- ifpi.has_tlr = false;
-
- static const double TICK_RATE = 100e6;
- static const double SAMP_RATE = 10e6;
- static const size_t NUM_PKTS_TO_TEST = 30;
+ ifpi.packet_count = 0;
+ ifpi.sob = true;
+ ifpi.eob = false;
+ ifpi.has_sid = false;
+ ifpi.has_cid = false;
+ ifpi.has_tsi = true;
+ ifpi.has_tsf = true;
+ ifpi.tsi = 0;
+ ifpi.tsf = 0;
+ ifpi.has_tlr = false;
+
+ static const double TICK_RATE = 100e6;
+ static const double SAMP_RATE = 10e6;
+ static const size_t NUM_PKTS_TO_TEST = 30;
static const size_t NUM_SAMPS_PER_BUFF = 10;
- static const size_t NCHANNELS = 4;
+ static const size_t NCHANNELS = 4;
std::vector<mock_zero_copy::sptr> xports;
for (size_t i = 0; i < NCHANNELS; i++) {
- xports.push_back(boost::make_shared<mock_zero_copy>(vrt::if_packet_info_t::LINK_TYPE_VRLP));
+ xports.push_back(
+ boost::make_shared<mock_zero_copy>(vrt::if_packet_info_t::LINK_TYPE_VRLP));
}
- //generate a bunch of packets
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
- ifpi.num_payload_words32 = 10 + i%10;
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ // generate a bunch of packets
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
+ ifpi.num_payload_words32 = 10 + i % 10;
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
std::vector<uint32_t> data(ifpi.num_payload_words32, 0);
xports[ch]->push_back_recv_packet(ifpi, data);
}
ifpi.packet_count++;
- ifpi.tsf += ifpi.num_payload_words32*size_t(TICK_RATE/SAMP_RATE);
+ ifpi.tsf += ifpi.num_payload_words32 * size_t(TICK_RATE / SAMP_RATE);
}
- //create the super receive packet handler
+ // create the super receive packet handler
sph::recv_packet_handler handler(NCHANNELS);
handler.set_vrt_unpacker(&vrt::if_hdr_unpack_be);
handler.set_tick_rate(TICK_RATE);
handler.set_samp_rate(SAMP_RATE);
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
mock_zero_copy::sptr xport = xports[ch];
handler.set_xport_chan_get_buff(
- ch,
- [xport](double timeout) {
- return xport->get_recv_buff(timeout);
- }
- );
+ ch, [xport](double timeout) { return xport->get_recv_buff(timeout); });
}
handler.set_converter(id);
- //check the received packets
+ // check the received packets
size_t num_accum_samps = 0;
- std::complex<float> mem[NUM_SAMPS_PER_BUFF*NCHANNELS];
- std::vector<std::complex<float> *> buffs(NCHANNELS);
- for (size_t ch = 0; ch < NCHANNELS; ch++){
- buffs[ch] = &mem[ch*NUM_SAMPS_PER_BUFF];
+ std::complex<float> mem[NUM_SAMPS_PER_BUFF * NCHANNELS];
+ std::vector<std::complex<float>*> buffs(NCHANNELS);
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
+ buffs[ch] = &mem[ch * NUM_SAMPS_PER_BUFF];
}
uhd::rx_metadata_t metadata;
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
std::cout << "data check " << i << std::endl;
- size_t num_samps_ret = handler.recv(
- buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true
- );
+ size_t num_samps_ret =
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_NONE);
BOOST_CHECK(metadata.has_time_spec);
- BOOST_CHECK_TS_CLOSE(metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
+ BOOST_CHECK_TS_CLOSE(
+ metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
BOOST_CHECK_EQUAL(num_samps_ret, 10UL);
num_accum_samps += num_samps_ret;
- if (not metadata.more_fragments) continue;
+ if (not metadata.more_fragments)
+ continue;
- num_samps_ret = handler.recv(
- buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true
- );
+ num_samps_ret = handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_NONE);
BOOST_CHECK(not metadata.more_fragments);
BOOST_CHECK_EQUAL(metadata.fragment_offset, 10UL);
BOOST_CHECK(metadata.has_time_spec);
- BOOST_CHECK_TS_CLOSE(metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
- BOOST_CHECK_EQUAL(num_samps_ret, i%10);
+ BOOST_CHECK_TS_CLOSE(
+ metadata.time_spec, uhd::time_spec_t::from_ticks(num_accum_samps, SAMP_RATE));
+ BOOST_CHECK_EQUAL(num_samps_ret, i % 10);
num_accum_samps += num_samps_ret;
}
- //subsequent receives should be a timeout
- for (size_t i = 0; i < 3; i++){
+ // subsequent receives should be a timeout
+ for (size_t i = 0; i < 3; i++) {
std::cout << "timeout check " << i << std::endl;
- handler.recv(
- buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true
- );
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true);
BOOST_CHECK_EQUAL(metadata.error_code, uhd::rx_metadata_t::ERROR_CODE_TIMEOUT);
}
- //simulate the transport failing
- for (size_t ch = 0; ch < NCHANNELS; ch++){
+ // simulate the transport failing
+ for (size_t ch = 0; ch < NCHANNELS; ch++) {
xports[ch]->set_simulate_io_error(true);
}
- BOOST_REQUIRE_THROW(handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true), uhd::io_error);
+ BOOST_REQUIRE_THROW(
+ handler.recv(buffs, NUM_SAMPS_PER_BUFF, metadata, 1.0, true), uhd::io_error);
}
diff --git a/host/tests/sph_send_test.cpp b/host/tests/sph_send_test.cpp
index 2db80c8de..6de4c9ffa 100644
--- a/host/tests/sph_send_test.cpp
+++ b/host/tests/sph_send_test.cpp
@@ -5,14 +5,14 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
-#include "../lib/transport/super_send_packet_handler.hpp"
#include "../common/mock_zero_copy.hpp"
-#include <boost/shared_array.hpp>
+#include "../lib/transport/super_send_packet_handler.hpp"
#include <boost/bind.hpp>
+#include <boost/shared_array.hpp>
+#include <boost/test/unit_test.hpp>
#include <complex>
-#include <vector>
#include <list>
+#include <vector>
using namespace uhd::transport;
@@ -20,120 +20,110 @@ using namespace uhd::transport;
BOOST_CHECK_CLOSE((a).get_real_secs(), (b).get_real_secs(), 0.001)
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_sph_send_one_channel_one_packet_mode){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_sph_send_one_channel_one_packet_mode)
+{
+ ////////////////////////////////////////////////////////////////////////
uhd::convert::id_type id;
- id.input_format = "fc32";
- id.num_inputs = 1;
+ id.input_format = "fc32";
+ id.num_inputs = 1;
id.output_format = "sc16_item32_be";
- id.num_outputs = 1;
+ id.num_outputs = 1;
mock_zero_copy xport(vrt::if_packet_info_t::LINK_TYPE_VRLP);
- static const double TICK_RATE = 100e6;
- static const double SAMP_RATE = 10e6;
+ static const double TICK_RATE = 100e6;
+ static const double SAMP_RATE = 10e6;
static const size_t NUM_PKTS_TO_TEST = 30;
- //create the super send packet handler
+ // create the super send packet handler
sph::send_packet_handler handler(1);
handler.set_vrt_packer(&vrt::if_hdr_pack_be);
handler.set_tick_rate(TICK_RATE);
handler.set_samp_rate(SAMP_RATE);
handler.set_xport_chan_get_buff(
- 0,
- [&xport](double timeout) {
- return xport.get_send_buff(timeout);
- }
- );
+ 0, [&xport](double timeout) { return xport.get_send_buff(timeout); });
handler.set_converter(id);
handler.set_max_samples_per_packet(20);
- //allocate metadata and buffer
- std::vector<std::complex<float> > buff(20);
+ // allocate metadata and buffer
+ std::vector<std::complex<float>> buff(20);
uhd::tx_metadata_t metadata;
metadata.has_time_spec = true;
- metadata.time_spec = uhd::time_spec_t(0.0);
+ metadata.time_spec = uhd::time_spec_t(0.0);
- //generate the test data
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
+ // generate the test data
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
metadata.start_of_burst = (i == 0);
- metadata.end_of_burst = (i == NUM_PKTS_TO_TEST-1);
- const size_t num_sent = handler.send(
- &buff.front(), 10 + i%10, metadata, 1.0
- );
- BOOST_CHECK_EQUAL(num_sent, 10 + i%10);
+ metadata.end_of_burst = (i == NUM_PKTS_TO_TEST - 1);
+ const size_t num_sent = handler.send(&buff.front(), 10 + i % 10, metadata, 1.0);
+ BOOST_CHECK_EQUAL(num_sent, 10 + i % 10);
metadata.time_spec += uhd::time_spec_t(0, num_sent, SAMP_RATE);
}
- //check the sent packets
+ // check the sent packets
size_t num_accum_samps = 0;
vrt::if_packet_info_t ifpi;
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
std::cout << "data check " << i << std::endl;
xport.pop_send_packet(ifpi);
- BOOST_CHECK_EQUAL(ifpi.num_payload_words32, 10+i%10);
+ BOOST_CHECK_EQUAL(ifpi.num_payload_words32, 10 + i % 10);
BOOST_CHECK(ifpi.has_tsf);
- BOOST_CHECK_EQUAL(ifpi.tsf, num_accum_samps*TICK_RATE/SAMP_RATE);
+ BOOST_CHECK_EQUAL(ifpi.tsf, num_accum_samps * TICK_RATE / SAMP_RATE);
BOOST_CHECK_EQUAL(ifpi.sob, i == 0);
- BOOST_CHECK_EQUAL(ifpi.eob, i == NUM_PKTS_TO_TEST-1);
+ BOOST_CHECK_EQUAL(ifpi.eob, i == NUM_PKTS_TO_TEST - 1);
num_accum_samps += ifpi.num_payload_words32;
}
}
////////////////////////////////////////////////////////////////////////
-BOOST_AUTO_TEST_CASE(test_sph_send_one_channel_full_buffer_mode){
-////////////////////////////////////////////////////////////////////////
+BOOST_AUTO_TEST_CASE(test_sph_send_one_channel_full_buffer_mode)
+{
+ ////////////////////////////////////////////////////////////////////////
uhd::convert::id_type id;
- id.input_format = "fc32";
- id.num_inputs = 1;
+ id.input_format = "fc32";
+ id.num_inputs = 1;
id.output_format = "sc16_item32_be";
- id.num_outputs = 1;
+ id.num_outputs = 1;
mock_zero_copy xport(vrt::if_packet_info_t::LINK_TYPE_VRLP);
- static const double TICK_RATE = 100e6;
- static const double SAMP_RATE = 10e6;
+ static const double TICK_RATE = 100e6;
+ static const double SAMP_RATE = 10e6;
static const size_t NUM_PKTS_TO_TEST = 30;
- //create the super send packet handler
+ // create the super send packet handler
sph::send_packet_handler handler(1);
handler.set_vrt_packer(&vrt::if_hdr_pack_be);
handler.set_tick_rate(TICK_RATE);
handler.set_samp_rate(SAMP_RATE);
handler.set_xport_chan_get_buff(
- 0,
- [&xport](double timeout) {
- return xport.get_send_buff(timeout);
- }
- );
+ 0, [&xport](double timeout) { return xport.get_send_buff(timeout); });
handler.set_converter(id);
handler.set_max_samples_per_packet(20);
- //allocate metadata and buffer
- std::vector<std::complex<float> > buff(20*NUM_PKTS_TO_TEST);
+ // allocate metadata and buffer
+ std::vector<std::complex<float>> buff(20 * NUM_PKTS_TO_TEST);
uhd::tx_metadata_t metadata;
metadata.start_of_burst = true;
- metadata.end_of_burst = true;
- metadata.has_time_spec = true;
- metadata.time_spec = uhd::time_spec_t(0.0);
+ metadata.end_of_burst = true;
+ metadata.has_time_spec = true;
+ metadata.time_spec = uhd::time_spec_t(0.0);
- //generate the test data
- const size_t num_sent = handler.send(
- &buff.front(), buff.size(), metadata, 1.0
- );
+ // generate the test data
+ const size_t num_sent = handler.send(&buff.front(), buff.size(), metadata, 1.0);
BOOST_CHECK_EQUAL(num_sent, buff.size());
- //check the sent packets
+ // check the sent packets
size_t num_accum_samps = 0;
vrt::if_packet_info_t ifpi;
- for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
+ for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++) {
std::cout << "data check " << i << std::endl;
xport.pop_send_packet(ifpi);
BOOST_CHECK_EQUAL(ifpi.num_payload_words32, 20UL);
BOOST_CHECK(ifpi.has_tsf);
- BOOST_CHECK_EQUAL(ifpi.tsf, num_accum_samps*TICK_RATE/SAMP_RATE);
+ BOOST_CHECK_EQUAL(ifpi.tsf, num_accum_samps * TICK_RATE / SAMP_RATE);
BOOST_CHECK_EQUAL(ifpi.sob, i == 0);
- BOOST_CHECK_EQUAL(ifpi.eob, i == NUM_PKTS_TO_TEST-1);
+ BOOST_CHECK_EQUAL(ifpi.eob, i == NUM_PKTS_TO_TEST - 1);
num_accum_samps += ifpi.num_payload_words32;
}
}
diff --git a/host/tests/stream_sig_test.cpp b/host/tests/stream_sig_test.cpp
index 88344faf5..41c07c14f 100644
--- a/host/tests/stream_sig_test.cpp
+++ b/host/tests/stream_sig_test.cpp
@@ -5,14 +5,15 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <iostream>
-#include <boost/test/unit_test.hpp>
#include <uhd/exception.hpp>
#include <uhd/rfnoc/stream_sig.hpp>
+#include <boost/test/unit_test.hpp>
+#include <iostream>
using namespace uhd::rfnoc;
-BOOST_AUTO_TEST_CASE(test_stream_sig) {
+BOOST_AUTO_TEST_CASE(test_stream_sig)
+{
stream_sig_t stream_sig;
BOOST_CHECK_EQUAL(stream_sig.item_type, "");
@@ -26,7 +27,8 @@ BOOST_AUTO_TEST_CASE(test_stream_sig) {
std::cout << ss.str() << std::endl;
}
-BOOST_AUTO_TEST_CASE(test_stream_sig_compat) {
+BOOST_AUTO_TEST_CASE(test_stream_sig_compat)
+{
stream_sig_t upstream_sig;
stream_sig_t downstream_sig;
@@ -47,12 +49,13 @@ BOOST_AUTO_TEST_CASE(test_stream_sig_compat) {
BOOST_CHECK(stream_sig_t::is_compatible(upstream_sig, downstream_sig));
downstream_sig.item_type = "";
BOOST_CHECK(stream_sig_t::is_compatible(upstream_sig, downstream_sig));
- upstream_sig.item_type = "sc16";
+ upstream_sig.item_type = "sc16";
downstream_sig.item_type = "s8";
BOOST_CHECK(not stream_sig_t::is_compatible(upstream_sig, downstream_sig));
}
-BOOST_AUTO_TEST_CASE(test_stream_sig_types) {
+BOOST_AUTO_TEST_CASE(test_stream_sig_types)
+{
stream_sig_t stream_sig;
BOOST_CHECK_EQUAL(stream_sig.get_bytes_per_item(), 0);
stream_sig.item_type = "sc16";
diff --git a/host/tests/subdev_spec_test.cpp b/host/tests/subdev_spec_test.cpp
index b87981392..533e8f90d 100644
--- a/host/tests/subdev_spec_test.cpp
+++ b/host/tests/subdev_spec_test.cpp
@@ -5,34 +5,35 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/usrp/subdev_spec.hpp>
+#include <boost/test/unit_test.hpp>
#include <iostream>
-BOOST_AUTO_TEST_CASE(test_subdevice_spec){
+BOOST_AUTO_TEST_CASE(test_subdevice_spec)
+{
std::cout << "Testing subdevice specification..." << std::endl;
- //load the subdev spec with something
+ // load the subdev spec with something
uhd::usrp::subdev_spec_t sd_spec;
sd_spec.push_back(uhd::usrp::subdev_spec_pair_t("A", "AB"));
sd_spec.push_back(uhd::usrp::subdev_spec_pair_t("B", "AB"));
- //create a subdev_spec with something different
+ // create a subdev_spec with something different
uhd::usrp::subdev_spec_t diff_sd_spec;
diff_sd_spec.push_back(uhd::usrp::subdev_spec_pair_t("B", "BA"));
diff_sd_spec.push_back(uhd::usrp::subdev_spec_pair_t("B", "BA"));
- //convert to and from args string
+ // convert to and from args string
std::cout << "Pretty Print: " << std::endl << sd_spec.to_pp_string();
std::string markup_str = sd_spec.to_string();
std::cout << "Markup String: " << markup_str << std::endl;
uhd::usrp::subdev_spec_t new_sd_spec(markup_str);
- //they should be the same size
+ // they should be the same size
BOOST_REQUIRE_EQUAL(sd_spec.size(), new_sd_spec.size());
- //the contents should match
- for (size_t i = 0; i < sd_spec.size(); i++){
+ // the contents should match
+ for (size_t i = 0; i < sd_spec.size(); i++) {
BOOST_CHECK_EQUAL(sd_spec.at(i).db_name, new_sd_spec.at(i).db_name);
BOOST_CHECK_EQUAL(sd_spec.at(i).sd_name, new_sd_spec.at(i).sd_name);
diff --git a/host/tests/system_time_test.cpp b/host/tests/system_time_test.cpp
index 3fc759391..3f4f8a814 100644
--- a/host/tests/system_time_test.cpp
+++ b/host/tests/system_time_test.cpp
@@ -4,20 +4,21 @@
// SPDX-License-Identifier: GPL-3.0+
//
-#include <boost/test/unit_test.hpp>
-#include <uhd/types/time_spec.hpp>
#include "system_time.hpp"
-#include <iostream>
-#include <iomanip>
-#include <cstdint>
+#include <uhd/types/time_spec.hpp>
+#include <boost/test/unit_test.hpp>
#include <chrono>
+#include <cstdint>
+#include <iomanip>
+#include <iostream>
#include <thread>
-BOOST_AUTO_TEST_CASE(test_time_spec_get_system_time){
+BOOST_AUTO_TEST_CASE(test_time_spec_get_system_time)
+{
std::cout << "Testing time specification get system time..." << std::endl;
- //Not really checking for high resolution timing here,
- //just need to check that system time is minimally working.
+ // Not really checking for high resolution timing here,
+ // just need to check that system time is minimally working.
auto start = uhd::get_system_time();
std::this_thread::sleep_for(std::chrono::milliseconds(500));
@@ -27,7 +28,6 @@ BOOST_AUTO_TEST_CASE(test_time_spec_get_system_time){
std::cout << "start: " << start.get_real_secs() << std::endl;
std::cout << "stop: " << stop.get_real_secs() << std::endl;
std::cout << "diff: " << diff.get_real_secs() << std::endl;
- BOOST_CHECK(diff.get_real_secs() > 0); //assert positive
- BOOST_CHECK(diff.get_real_secs() < 1.0); //assert under 1s
+ BOOST_CHECK(diff.get_real_secs() > 0); // assert positive
+ BOOST_CHECK(diff.get_real_secs() < 1.0); // assert under 1s
}
-
diff --git a/host/tests/tasks_test.cpp b/host/tests/tasks_test.cpp
index f3bb07653..c236287e3 100644
--- a/host/tests/tasks_test.cpp
+++ b/host/tests/tasks_test.cpp
@@ -5,24 +5,24 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/utils/tasks.hpp>
-#include <thread>
+#include <boost/test/unit_test.hpp>
#include <chrono>
-#include <vector>
#include <iostream>
+#include <thread>
+#include <vector>
void test_tasks_sleep(size_t usecs)
{
std::this_thread::sleep_for(std::chrono::milliseconds(usecs));
}
-BOOST_AUTO_TEST_CASE(tasks_test) {
-
+BOOST_AUTO_TEST_CASE(tasks_test)
+{
static const size_t N_TASKS = 100;
std::vector<uhd::task::sptr> test_vec;
for (size_t i = 0; i < N_TASKS; i++) {
- test_vec.push_back(uhd::task::make([i](){ test_tasks_sleep(i); }));
+ test_vec.push_back(uhd::task::make([i]() { test_tasks_sleep(i); }));
}
}
diff --git a/host/tests/tick_node_test.cpp b/host/tests/tick_node_test.cpp
index 173481fb1..ccec67c43 100644
--- a/host/tests/tick_node_test.cpp
+++ b/host/tests/tick_node_test.cpp
@@ -18,7 +18,7 @@ class tick_aware_node : public test_node, public tick_node_ctrl
public:
typedef boost::shared_ptr<tick_aware_node> sptr;
- tick_aware_node(const std::string &test_id) : test_node(test_id) {};
+ tick_aware_node(const std::string& test_id) : test_node(test_id){};
}; /* class tick_aware_node */
@@ -28,10 +28,14 @@ class tick_setting_node : public test_node, public tick_node_ctrl
public:
typedef boost::shared_ptr<tick_setting_node> sptr;
- tick_setting_node(const std::string &test_id, double tick_rate) : test_node(test_id), _tick_rate(tick_rate) {};
+ tick_setting_node(const std::string& test_id, double tick_rate)
+ : test_node(test_id), _tick_rate(tick_rate){};
protected:
- double _get_tick_rate() { return _tick_rate; };
+ double _get_tick_rate()
+ {
+ return _tick_rate;
+ };
private:
const double _tick_rate;
@@ -39,7 +43,8 @@ private:
}; /* class tick_setting_node */
#define MAKE_TICK_NODE(name) tick_aware_node::sptr name(new tick_aware_node(#name));
-#define MAKE_TICK_SETTING_NODE(name, rate) tick_setting_node::sptr name(new tick_setting_node(#name, rate));
+#define MAKE_TICK_SETTING_NODE(name, rate) \
+ tick_setting_node::sptr name(new tick_setting_node(#name, rate));
BOOST_AUTO_TEST_CASE(test_simplest_downstream_search)
{
diff --git a/host/tests/time_spec_test.cpp b/host/tests/time_spec_test.cpp
index 89a5370bd..dee8d414e 100644
--- a/host/tests/time_spec_test.cpp
+++ b/host/tests/time_spec_test.cpp
@@ -5,14 +5,15 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/types/time_spec.hpp>
+#include <stdint.h>
+#include <boost/test/unit_test.hpp>
#include <boost/thread.hpp> //sleep
-#include <iostream>
#include <iomanip>
-#include <stdint.h>
+#include <iostream>
-BOOST_AUTO_TEST_CASE(test_time_spec_compare){
+BOOST_AUTO_TEST_CASE(test_time_spec_compare)
+{
std::cout << "Testing time specification compare..." << std::endl;
BOOST_CHECK(uhd::time_spec_t(2.0) == uhd::time_spec_t(2.0));
@@ -31,7 +32,8 @@ BOOST_AUTO_TEST_CASE(test_time_spec_compare){
#define CHECK_TS_EQUAL(lhs, rhs) \
BOOST_CHECK_CLOSE((lhs).get_real_secs(), (rhs).get_real_secs(), 0.001)
-BOOST_AUTO_TEST_CASE(test_time_spec_arithmetic){
+BOOST_AUTO_TEST_CASE(test_time_spec_arithmetic)
+{
std::cout << "Testing time specification arithmetic..." << std::endl;
CHECK_TS_EQUAL(uhd::time_spec_t(2.3) + uhd::time_spec_t(1.0), uhd::time_spec_t(3.3));
@@ -40,7 +42,8 @@ BOOST_AUTO_TEST_CASE(test_time_spec_arithmetic){
CHECK_TS_EQUAL(uhd::time_spec_t(1.0) - uhd::time_spec_t(2.3), uhd::time_spec_t(-1.3));
}
-BOOST_AUTO_TEST_CASE(test_time_spec_parts){
+BOOST_AUTO_TEST_CASE(test_time_spec_parts)
+{
std::cout << "Testing time specification parts..." << std::endl;
BOOST_CHECK_EQUAL(uhd::time_spec_t(1.1).get_full_secs(), 1);
@@ -52,7 +55,8 @@ BOOST_AUTO_TEST_CASE(test_time_spec_parts){
BOOST_CHECK_EQUAL(uhd::time_spec_t(-1.1).to_ticks(100), -110);
}
-BOOST_AUTO_TEST_CASE(test_time_spec_neg_values){
+BOOST_AUTO_TEST_CASE(test_time_spec_neg_values)
+{
uhd::time_spec_t ts1(0.3);
uhd::time_spec_t ts2(1, -0.9);
std::cout << "ts1 " << ts1.get_real_secs() << std::endl;
@@ -74,7 +78,7 @@ BOOST_AUTO_TEST_CASE(test_time_spec_neg_values){
BOOST_AUTO_TEST_CASE(test_time_large_ticks_to_time_spec)
{
std::cout << "sizeof(time_t) " << sizeof(time_t) << std::endl;
- const uint64_t ticks0 = uint64_t(100e6*1360217663.739296);
+ const uint64_t ticks0 = uint64_t(100e6 * 1360217663.739296);
const uhd::time_spec_t t0 = uhd::time_spec_t::from_ticks(ticks0, 100e6);
std::cout << "t0.get_real_secs() " << t0.get_real_secs() << std::endl;
std::cout << "t0.get_full_secs() " << t0.get_full_secs() << std::endl;
@@ -84,11 +88,11 @@ BOOST_AUTO_TEST_CASE(test_time_large_ticks_to_time_spec)
BOOST_AUTO_TEST_CASE(test_time_error_irrational_rate)
{
- static const double rate = 1625e3/6.0;
- const long long tick_in = 23423436291667ll;
+ static const double rate = 1625e3 / 6.0;
+ const long long tick_in = 23423436291667ll;
const uhd::time_spec_t ts = uhd::time_spec_t::from_ticks(tick_in, rate);
- const long long tick_out = ts.to_ticks(rate);
- const long long err = tick_in - tick_out;
+ const long long tick_out = ts.to_ticks(rate);
+ const long long err = tick_in - tick_out;
std::streamsize precision = std::cout.precision();
std::cout << std::setprecision(18);
diff --git a/host/tests/vrt_test.cpp b/host/tests/vrt_test.cpp
index 1b4df8fc7..ea639c65c 100644
--- a/host/tests/vrt_test.cpp
+++ b/host/tests/vrt_test.cpp
@@ -5,65 +5,63 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/test/unit_test.hpp>
#include <uhd/transport/vrt_if_packet.hpp>
#include <uhd/utils/byteswap.hpp>
#include <boost/format.hpp>
+#include <boost/test/unit_test.hpp>
#include <cstdlib>
#include <iostream>
using namespace uhd::transport;
-static void pack_and_unpack(
- vrt::if_packet_info_t &if_packet_info_in
-){
- if (if_packet_info_in.num_payload_bytes == 0)
- {
- if_packet_info_in.num_payload_bytes = if_packet_info_in.num_payload_words32 * sizeof(uint32_t);
+static void pack_and_unpack(vrt::if_packet_info_t& if_packet_info_in)
+{
+ if (if_packet_info_in.num_payload_bytes == 0) {
+ if_packet_info_in.num_payload_bytes =
+ if_packet_info_in.num_payload_words32 * sizeof(uint32_t);
}
uint32_t packet_buff[2048];
- //pack metadata into a vrt header
- vrt::if_hdr_pack_be(
- packet_buff, if_packet_info_in
- );
+ // pack metadata into a vrt header
+ vrt::if_hdr_pack_be(packet_buff, if_packet_info_in);
std::cout << std::endl;
- for (size_t i = 0; i < 5; i++)
- {
- std::cout << boost::format("packet_buff[%u] = 0x%.8x") % i % uhd::byteswap(packet_buff[i]) << std::endl;
+ for (size_t i = 0; i < 5; i++) {
+ std::cout << boost::format("packet_buff[%u] = 0x%.8x") % i
+ % uhd::byteswap(packet_buff[i])
+ << std::endl;
}
vrt::if_packet_info_t if_packet_info_out;
- if_packet_info_out.link_type = if_packet_info_in.link_type;
+ if_packet_info_out.link_type = if_packet_info_in.link_type;
if_packet_info_out.num_packet_words32 = if_packet_info_in.num_packet_words32;
- //unpack the vrt header back into metadata
- vrt::if_hdr_unpack_be(
- packet_buff, if_packet_info_out
- );
+ // unpack the vrt header back into metadata
+ vrt::if_hdr_unpack_be(packet_buff, if_packet_info_out);
- //check the the unpacked metadata is the same
+ // check the the unpacked metadata is the same
BOOST_CHECK_EQUAL(if_packet_info_in.packet_count, if_packet_info_out.packet_count);
- BOOST_CHECK_EQUAL(if_packet_info_in.num_header_words32, if_packet_info_out.num_header_words32);
- BOOST_CHECK_EQUAL(if_packet_info_in.num_payload_words32, if_packet_info_out.num_payload_words32);
+ BOOST_CHECK_EQUAL(
+ if_packet_info_in.num_header_words32, if_packet_info_out.num_header_words32);
+ BOOST_CHECK_EQUAL(
+ if_packet_info_in.num_payload_words32, if_packet_info_out.num_payload_words32);
BOOST_CHECK_EQUAL(if_packet_info_in.has_sid, if_packet_info_out.has_sid);
- if (if_packet_info_in.has_sid and if_packet_info_out.has_sid){
+ if (if_packet_info_in.has_sid and if_packet_info_out.has_sid) {
BOOST_CHECK_EQUAL(if_packet_info_in.sid, if_packet_info_out.sid);
}
BOOST_CHECK_EQUAL(if_packet_info_in.has_cid, if_packet_info_out.has_cid);
- if (if_packet_info_in.has_cid and if_packet_info_out.has_cid){
+ if (if_packet_info_in.has_cid and if_packet_info_out.has_cid) {
BOOST_CHECK_EQUAL(if_packet_info_in.cid, if_packet_info_out.cid);
}
BOOST_CHECK_EQUAL(if_packet_info_in.has_tsi, if_packet_info_out.has_tsi);
- if (if_packet_info_in.has_tsi and if_packet_info_out.has_tsi){
+ if (if_packet_info_in.has_tsi and if_packet_info_out.has_tsi) {
BOOST_CHECK_EQUAL(if_packet_info_in.tsi, if_packet_info_out.tsi);
}
BOOST_CHECK_EQUAL(if_packet_info_in.has_tsf, if_packet_info_out.has_tsf);
- if (if_packet_info_in.has_tsf and if_packet_info_out.has_tsf){
+ if (if_packet_info_in.has_tsf and if_packet_info_out.has_tsf) {
BOOST_CHECK_EQUAL(if_packet_info_in.tsf, if_packet_info_out.tsf);
}
BOOST_CHECK_EQUAL(if_packet_info_in.has_tlr, if_packet_info_out.has_tlr);
- if (if_packet_info_in.has_tlr and if_packet_info_out.has_tlr){
+ if (if_packet_info_in.has_tlr and if_packet_info_out.has_tlr) {
BOOST_CHECK_EQUAL(if_packet_info_in.tlr, if_packet_info_out.tlr);
}
}
@@ -73,102 +71,109 @@ static void pack_and_unpack(
* The trailer is not tested as it is not convenient to do so.
**********************************************************************/
-BOOST_AUTO_TEST_CASE(test_with_none){
+BOOST_AUTO_TEST_CASE(test_with_none)
+{
vrt::if_packet_info_t if_packet_info;
- if_packet_info.packet_count = 0;
- if_packet_info.has_sid = false;
- if_packet_info.has_cid = false;
- if_packet_info.has_tsi = false;
- if_packet_info.has_tsf = false;
- if_packet_info.has_tlr = false;
+ if_packet_info.packet_count = 0;
+ if_packet_info.has_sid = false;
+ if_packet_info.has_cid = false;
+ if_packet_info.has_tsi = false;
+ if_packet_info.has_tsf = false;
+ if_packet_info.has_tlr = false;
if_packet_info.num_payload_words32 = 0;
pack_and_unpack(if_packet_info);
}
-BOOST_AUTO_TEST_CASE(test_with_sid){
+BOOST_AUTO_TEST_CASE(test_with_sid)
+{
vrt::if_packet_info_t if_packet_info;
- if_packet_info.packet_count = 1;
- if_packet_info.has_sid = true;
- if_packet_info.has_cid = false;
- if_packet_info.has_tsi = false;
- if_packet_info.has_tsf = false;
- if_packet_info.has_tlr = false;
- if_packet_info.sid = std::rand();
+ if_packet_info.packet_count = 1;
+ if_packet_info.has_sid = true;
+ if_packet_info.has_cid = false;
+ if_packet_info.has_tsi = false;
+ if_packet_info.has_tsf = false;
+ if_packet_info.has_tlr = false;
+ if_packet_info.sid = std::rand();
if_packet_info.num_payload_words32 = 11;
pack_and_unpack(if_packet_info);
}
static const bool cid_enb = false;
-BOOST_AUTO_TEST_CASE(test_with_cid){
+BOOST_AUTO_TEST_CASE(test_with_cid)
+{
vrt::if_packet_info_t if_packet_info;
- if_packet_info.packet_count = 2;
- if_packet_info.has_sid = false;
- if_packet_info.has_cid = cid_enb;
- if_packet_info.has_tsi = false;
- if_packet_info.has_tsf = false;
- if_packet_info.has_tlr = false;
- if_packet_info.cid = std::rand();
+ if_packet_info.packet_count = 2;
+ if_packet_info.has_sid = false;
+ if_packet_info.has_cid = cid_enb;
+ if_packet_info.has_tsi = false;
+ if_packet_info.has_tsf = false;
+ if_packet_info.has_tlr = false;
+ if_packet_info.cid = std::rand();
if_packet_info.num_payload_words32 = 22;
pack_and_unpack(if_packet_info);
}
-BOOST_AUTO_TEST_CASE(test_with_time){
+BOOST_AUTO_TEST_CASE(test_with_time)
+{
vrt::if_packet_info_t if_packet_info;
- if_packet_info.packet_count = 3;
- if_packet_info.has_sid = false;
- if_packet_info.has_cid = false;
- if_packet_info.has_tsi = true;
- if_packet_info.has_tsf = true;
- if_packet_info.has_tlr = false;
- if_packet_info.tsi = std::rand();
- if_packet_info.tsf = std::rand();
+ if_packet_info.packet_count = 3;
+ if_packet_info.has_sid = false;
+ if_packet_info.has_cid = false;
+ if_packet_info.has_tsi = true;
+ if_packet_info.has_tsf = true;
+ if_packet_info.has_tlr = false;
+ if_packet_info.tsi = std::rand();
+ if_packet_info.tsf = std::rand();
if_packet_info.num_payload_words32 = 33;
pack_and_unpack(if_packet_info);
}
-BOOST_AUTO_TEST_CASE(test_with_all){
+BOOST_AUTO_TEST_CASE(test_with_all)
+{
vrt::if_packet_info_t if_packet_info;
- if_packet_info.packet_count = 4;
- if_packet_info.has_sid = true;
- if_packet_info.has_cid = cid_enb;
- if_packet_info.has_tsi = true;
- if_packet_info.has_tsf = true;
- if_packet_info.has_tlr = false;
- if_packet_info.sid = std::rand();
- if_packet_info.cid = std::rand();
- if_packet_info.tsi = std::rand();
- if_packet_info.tsf = std::rand();
+ if_packet_info.packet_count = 4;
+ if_packet_info.has_sid = true;
+ if_packet_info.has_cid = cid_enb;
+ if_packet_info.has_tsi = true;
+ if_packet_info.has_tsf = true;
+ if_packet_info.has_tlr = false;
+ if_packet_info.sid = std::rand();
+ if_packet_info.cid = std::rand();
+ if_packet_info.tsi = std::rand();
+ if_packet_info.tsf = std::rand();
if_packet_info.num_payload_words32 = 44;
pack_and_unpack(if_packet_info);
}
-BOOST_AUTO_TEST_CASE(test_with_vrlp){
+BOOST_AUTO_TEST_CASE(test_with_vrlp)
+{
vrt::if_packet_info_t if_packet_info;
- if_packet_info.link_type = vrt::if_packet_info_t::LINK_TYPE_VRLP;
- if_packet_info.packet_count = 3;
- if_packet_info.has_sid = true;
- if_packet_info.has_cid = false;
- if_packet_info.has_tsi = false;
- if_packet_info.has_tsf = true;
- if_packet_info.has_tlr = true;
- if_packet_info.tsi = std::rand();
- if_packet_info.tsf = std::rand();
+ if_packet_info.link_type = vrt::if_packet_info_t::LINK_TYPE_VRLP;
+ if_packet_info.packet_count = 3;
+ if_packet_info.has_sid = true;
+ if_packet_info.has_cid = false;
+ if_packet_info.has_tsi = false;
+ if_packet_info.has_tsf = true;
+ if_packet_info.has_tlr = true;
+ if_packet_info.tsi = std::rand();
+ if_packet_info.tsf = std::rand();
if_packet_info.num_payload_words32 = 42;
pack_and_unpack(if_packet_info);
}
-BOOST_AUTO_TEST_CASE(test_with_chdr){
+BOOST_AUTO_TEST_CASE(test_with_chdr)
+{
vrt::if_packet_info_t if_packet_info;
- if_packet_info.link_type = vrt::if_packet_info_t::LINK_TYPE_CHDR;
- if_packet_info.packet_count = 7;
- if_packet_info.has_sid = true;
- if_packet_info.has_cid = false;
- if_packet_info.has_tsi = false;
- if_packet_info.has_tsf = true;
- if_packet_info.has_tlr = false; //tlr not suported in CHDR
- if_packet_info.tsi = std::rand();
- if_packet_info.tsf = std::rand();
+ if_packet_info.link_type = vrt::if_packet_info_t::LINK_TYPE_CHDR;
+ if_packet_info.packet_count = 7;
+ if_packet_info.has_sid = true;
+ if_packet_info.has_cid = false;
+ if_packet_info.has_tsi = false;
+ if_packet_info.has_tsf = true;
+ if_packet_info.has_tlr = false; // tlr not suported in CHDR
+ if_packet_info.tsi = std::rand();
+ if_packet_info.tsf = std::rand();
if_packet_info.num_payload_words32 = 24;
pack_and_unpack(if_packet_info);
}
diff --git a/host/utils/b2xx_fx3_utils.cpp b/host/utils/b2xx_fx3_utils.cpp
index 75bb1a5bb..e723b904a 100644
--- a/host/utils/b2xx_fx3_utils.cpp
+++ b/host/utils/b2xx_fx3_utils.cpp
@@ -5,50 +5,47 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include <uhd/config.hpp>
+#include <uhd/exception.hpp>
+#include <uhd/transport/usb_control.hpp>
+#include <uhd/transport/usb_device_handle.hpp>
+#include <uhd/utils/paths.hpp>
+#include <b200_iface.hpp>
+#include <libusb.h>
+#include <stdint.h>
+#include <boost/filesystem.hpp>
+#include <boost/format.hpp>
+#include <boost/functional/hash.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/program_options.hpp>
+#include <chrono>
+#include <cmath>
#include <cstdlib>
#include <cstring>
-#include <iostream>
-#include <iomanip>
#include <fstream>
-#include <libusb.h>
+#include <iomanip>
+#include <iostream>
#include <sstream>
#include <string>
-#include <cmath>
-#include <cstring>
-#include <chrono>
#include <thread>
-#include <stdint.h>
-#include <boost/filesystem.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/format.hpp>
-#include <boost/program_options.hpp>
-#include <boost/functional/hash.hpp>
-
-#include <b200_iface.hpp>
-#include <uhd/config.hpp>
-#include <uhd/transport/usb_control.hpp>
-#include <uhd/transport/usb_device_handle.hpp>
-#include <uhd/exception.hpp>
-#include <uhd/utils/paths.hpp>
-
namespace po = boost::program_options;
namespace fs = boost::filesystem;
-struct vid_pid_t {
+struct vid_pid_t
+{
uint16_t vid;
uint16_t pid;
};
-const static vid_pid_t known_vid_pids[] = {
- {FX3_VID, FX3_DEFAULT_PID},
+const static vid_pid_t known_vid_pids[] = {{FX3_VID, FX3_DEFAULT_PID},
{FX3_VID, FX3_REENUM_PID},
{B200_VENDOR_ID, B200_PRODUCT_ID},
{B200_VENDOR_ID, B200MINI_PRODUCT_ID},
{B200_VENDOR_ID, B205MINI_PRODUCT_ID},
{B200_VENDOR_NI_ID, B200_PRODUCT_NI_ID},
- {B200_VENDOR_NI_ID, B210_PRODUCT_NI_ID}
-};
-const static std::vector<vid_pid_t> known_vid_pid_vector(known_vid_pids, known_vid_pids + (sizeof(known_vid_pids) / sizeof(known_vid_pids[0])));
+ {B200_VENDOR_NI_ID, B210_PRODUCT_NI_ID}};
+const static std::vector<vid_pid_t> known_vid_pid_vector(known_vid_pids,
+ known_vid_pids + (sizeof(known_vid_pids) / sizeof(known_vid_pids[0])));
static const size_t EEPROM_INIT_VALUE_VECTOR_SIZE = 8;
static uhd::byte_vector_t construct_eeprom_init_value_vector(uint16_t vid, uint16_t pid)
@@ -65,19 +62,25 @@ static uhd::byte_vector_t construct_eeprom_init_value_vector(uint16_t vid, uint1
return init_values;
}
-//!used with lexical cast to parse a hex string
-template <class T> struct to_hex{
+//! used with lexical cast to parse a hex string
+template <class T> struct to_hex
+{
T value;
- operator T() const {return value;}
- friend std::istream& operator>>(std::istream& in, to_hex& out){
+ operator T() const
+ {
+ return value;
+ }
+ friend std::istream& operator>>(std::istream& in, to_hex& out)
+ {
in >> std::hex >> out.value;
return in;
}
};
-//!parse hex-formatted ASCII text into an int
-uint16_t atoh(const std::string &string){
- if (string.substr(0, 2) == "0x"){
+//! parse hex-formatted ASCII text into an int
+uint16_t atoh(const std::string& string)
+{
+ if (string.substr(0, 2) == "0x") {
std::stringstream interpreter(string);
to_hex<uint16_t> hh;
interpreter >> hh;
@@ -98,42 +101,39 @@ int reset_usb()
/* Check each of the possible paths above to find which ones this system
* uses. */
- for(std::set<fs::path>::iterator found = path_list.begin();
- found != path_list.end(); ++found) {
-
- if(fs::exists(*found)) {
-
+ for (std::set<fs::path>::iterator found = path_list.begin(); found != path_list.end();
+ ++found) {
+ if (fs::exists(*found)) {
fs::path devpath = *found;
std::set<fs::path> globbed;
/* Now, glob all of the files in the directory. */
fs::directory_iterator end_itr;
- for(fs::directory_iterator itr(devpath); itr != end_itr; ++itr) {
+ for (fs::directory_iterator itr(devpath); itr != end_itr; ++itr) {
globbed.insert((*itr).path());
}
/* Check each file path string to see if it is a device file. */
- for(std::set<fs::path>::iterator it = globbed.begin();
- it != globbed.end(); ++it) {
-
+ for (std::set<fs::path>::iterator it = globbed.begin(); it != globbed.end();
+ ++it) {
std::string file = fs::path((*it).filename()).string();
if (file.length() < 5)
continue;
- if(file.compare(0, 5, "0000:") == 0) {
+ if (file.compare(0, 5, "0000:") == 0) {
/* Un-bind the device. */
- std::fstream unbind((devpath.string() + "unbind").c_str(),
- std::fstream::out);
+ std::fstream unbind(
+ (devpath.string() + "unbind").c_str(), std::fstream::out);
unbind << file;
unbind.close();
/* Re-bind the device. */
- std::cout << "Re-binding: " << file << " in "
- << devpath.string() << std::endl;
- std::fstream bind((devpath.string() + "bind").c_str(),
- std::fstream::out);
+ std::cout << "Re-binding: " << file << " in " << devpath.string()
+ << std::endl;
+ std::fstream bind(
+ (devpath.string() + "bind").c_str(), std::fstream::out);
bind << file;
bind.close();
}
@@ -144,7 +144,8 @@ int reset_usb()
return 0;
}
-uhd::transport::usb_device_handle::sptr open_device(const uint16_t vid, const uint16_t pid, const bool user_supplied = false)
+uhd::transport::usb_device_handle::sptr open_device(
+ const uint16_t vid, const uint16_t pid, const bool user_supplied = false)
{
std::vector<uhd::transport::usb_device_handle::sptr> handles;
uhd::transport::usb_device_handle::sptr handle;
@@ -152,60 +153,70 @@ uhd::transport::usb_device_handle::sptr open_device(const uint16_t vid, const ui
try {
// try caller's VID/PID first
- std::vector<uhd::transport::usb_device_handle::vid_pid_pair_t> vid_pid_pair_list(1,uhd::transport::usb_device_handle::vid_pid_pair_t(vid,pid));
+ std::vector<uhd::transport::usb_device_handle::vid_pid_pair_t> vid_pid_pair_list(
+ 1, uhd::transport::usb_device_handle::vid_pid_pair_t(vid, pid));
handles = uhd::transport::usb_device_handle::get_device_list(vid_pid_pair_list);
- if (handles.size() == 0)
- {
- if (user_supplied)
- {
- std::cerr << (boost::format("Failed to open device with VID 0x%04x and PID 0x%04x - trying other known VID/PIDs") % vid % pid).str() << std::endl;
+ if (handles.size() == 0) {
+ if (user_supplied) {
+ std::cerr << (boost::format("Failed to open device with VID 0x%04x and "
+ "PID 0x%04x - trying other known VID/PIDs")
+ % vid % pid)
+ .str()
+ << std::endl;
}
// try known VID/PIDs next
- for (size_t i = 0; handles.size() == 0 && i < known_vid_pid_vector.size(); i++)
- {
+ for (size_t i = 0; handles.size() == 0 && i < known_vid_pid_vector.size();
+ i++) {
vp = known_vid_pid_vector[i];
- handles = uhd::transport::usb_device_handle::get_device_list(vp.vid, vp.pid);
+ handles =
+ uhd::transport::usb_device_handle::get_device_list(vp.vid, vp.pid);
}
-
}
- if (handles.size() > 0)
- {
+ if (handles.size() > 0) {
handle = handles[0];
- std::cout << (boost::format("Device opened (VID=0x%04x,PID=0x%04x)") % vp.vid % vp.pid).str() << std::endl;
+ std::cout << (boost::format("Device opened (VID=0x%04x,PID=0x%04x)") % vp.vid
+ % vp.pid)
+ .str()
+ << std::endl;
}
if (!handle)
std::cerr << "Cannot open device" << std::endl;
- }
- catch(const std::exception &) {
+ } catch (const std::exception&) {
std::cerr << "Failed to communicate with the device!" << std::endl;
- #ifdef UHD_PLATFORM_WIN32
- std::cerr << "The necessary drivers are not installed. Read the UHD Transport Application Notes for details:\nhttp://files.ettus.com/manual/page_transport.html" << std::endl;
- #endif /* UHD_PLATFORM_WIN32 */
+#ifdef UHD_PLATFORM_WIN32
+ std::cerr << "The necessary drivers are not installed. Read the UHD Transport "
+ "Application Notes for "
+ "details:\nhttp://files.ettus.com/manual/page_transport.html"
+ << std::endl;
+#endif /* UHD_PLATFORM_WIN32 */
handle.reset();
}
return handle;
}
-b200_iface::sptr make_b200_iface(const uhd::transport::usb_device_handle::sptr &handle)
+b200_iface::sptr make_b200_iface(const uhd::transport::usb_device_handle::sptr& handle)
{
b200_iface::sptr b200;
try {
- uhd::transport::usb_control::sptr usb_ctrl = uhd::transport::usb_control::make(handle, 0);
+ uhd::transport::usb_control::sptr usb_ctrl =
+ uhd::transport::usb_control::make(handle, 0);
b200 = b200_iface::make(usb_ctrl);
if (!b200)
std::cerr << "Cannot create device interface" << std::endl;
- }
- catch(const std::exception &) {
+ } catch (const std::exception&) {
std::cerr << "Failed to communicate with the device!" << std::endl;
- #ifdef UHD_PLATFORM_WIN32
- std::cerr << "The necessary drivers are not installed. Read the UHD Transport Application Notes for details:\nhttp://files.ettus.com/manual/page_transport.html" << std::endl;
- #endif /* UHD_PLATFORM_WIN32 */
+#ifdef UHD_PLATFORM_WIN32
+ std::cerr << "The necessary drivers are not installed. Read the UHD Transport "
+ "Application Notes for "
+ "details:\nhttp://files.ettus.com/manual/page_transport.html"
+ << std::endl;
+#endif /* UHD_PLATFORM_WIN32 */
b200.reset();
}
@@ -216,7 +227,7 @@ int read_eeprom(b200_iface::sptr& b200, uhd::byte_vector_t& data)
{
try {
data = b200->read_eeprom(0x0, 0x0, 8);
- } catch (std::exception &e) {
+ } catch (std::exception& e) {
std::cerr << "Exception while reading EEPROM: " << e.what() << std::endl;
return -1;
}
@@ -227,8 +238,8 @@ int read_eeprom(b200_iface::sptr& b200, uhd::byte_vector_t& data)
int write_eeprom(b200_iface::sptr& b200, const uhd::byte_vector_t& data)
{
try {
- b200->write_eeprom(0x0, 0x0, data);
- } catch (std::exception &e) {
+ b200->write_eeprom(0x0, 0x0, data);
+ } catch (std::exception& e) {
std::cerr << "Exception while writing EEPROM: " << e.what() << std::endl;
return -1;
}
@@ -243,16 +254,17 @@ int verify_eeprom(b200_iface::sptr& b200, const uhd::byte_vector_t& data)
if (read_eeprom(b200, read_bytes))
return -1;
- if (data.size() != read_bytes.size())
- {
- std::cerr << "ERROR: Only able to verify first " << std::min(data.size(), read_bytes.size()) << " bytes." << std::endl;
+ if (data.size() != read_bytes.size()) {
+ std::cerr << "ERROR: Only able to verify first "
+ << std::min(data.size(), read_bytes.size()) << " bytes." << std::endl;
verified = false;
}
for (size_t i = 0; i < std::min(data.size(), read_bytes.size()); i++) {
if (data[i] != read_bytes[i]) {
verified = false;
- std::cerr << "Byte " << i << " Expected: " << data[i] << ", Got: " << read_bytes[i] << std::endl;
+ std::cerr << "Byte " << i << " Expected: " << data[i]
+ << ", Got: " << read_bytes[i] << std::endl;
}
}
@@ -285,39 +297,32 @@ int erase_eeprom(b200_iface::sptr& b200)
return 0;
}
-int32_t main(int32_t argc, char *argv[]) {
+int32_t main(int32_t argc, char* argv[])
+{
uint16_t vid, pid;
std::string pid_str, vid_str, fw_file, fpga_file, writevid_str, writepid_str;
bool user_supplied_vid_pid = false;
po::options_description visible("Allowed options");
- visible.add_options()
- ("help,h", "help message")
- ("vid,v", po::value<std::string>(&vid_str),
- "Specify VID of device to use.")
- ("pid,p", po::value<std::string>(&pid_str),
- "Specify PID of device to use.")
- ("speed,S", "Read back the USB mode currently in use.")
- ("reset-device,D", "Reset the B2xx Device.")
- ("reset-fpga,F", "Reset the FPGA (does not require re-programming.")
- ("reset-usb,U", "Reset the USB subsystem on your host computer.")
- ("load-fw,W", po::value<std::string>(&fw_file),
- "Load a firmware (hex) file into the FX3.")
- ("load-fpga,L", po::value<std::string>(&fpga_file),
- "Load a FPGA (bin) file into the FPGA.")
- ;
+ visible.add_options()("help,h", "help message")(
+ "vid,v", po::value<std::string>(&vid_str), "Specify VID of device to use.")(
+ "pid,p", po::value<std::string>(&pid_str), "Specify PID of device to use.")(
+ "speed,S", "Read back the USB mode currently in use.")(
+ "reset-device,D", "Reset the B2xx Device.")(
+ "reset-fpga,F", "Reset the FPGA (does not require re-programming.")(
+ "reset-usb,U", "Reset the USB subsystem on your host computer.")("load-fw,W",
+ po::value<std::string>(&fw_file),
+ "Load a firmware (hex) file into the FX3.")("load-fpga,L",
+ po::value<std::string>(&fpga_file),
+ "Load a FPGA (bin) file into the FPGA.");
// Hidden options provided for testing - use at your own risk!
po::options_description hidden("Hidden options");
- hidden.add_options()
- ("init-device,I", "Initialize a B2xx device.")
- ("uninit-device", "Uninitialize a B2xx device.")
- ("read-eeprom,R", "Read first 8 bytes of EEPROM")
- ("erase-eeprom,E", "Erase first 8 bytes of EEPROM")
- ("write-vid", po::value<std::string>(&writevid_str),
- "Write VID field of EEPROM")
- ("write-pid", po::value<std::string>(&writepid_str),
- "Write PID field of EEPROM");
+ hidden.add_options()("init-device,I", "Initialize a B2xx device.")("uninit-device",
+ "Uninitialize a B2xx device.")("read-eeprom,R", "Read first 8 bytes of EEPROM")(
+ "erase-eeprom,E", "Erase first 8 bytes of EEPROM")(
+ "write-vid", po::value<std::string>(&writevid_str), "Write VID field of EEPROM")(
+ "write-pid", po::value<std::string>(&writepid_str), "Write PID field of EEPROM");
po::options_description desc;
desc.add(visible);
@@ -328,16 +333,17 @@ int32_t main(int32_t argc, char *argv[]) {
try {
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- } catch (std::exception &e) {
+ } catch (std::exception& e) {
std::cerr << "Exception while parsing arguments: " << e.what() << std::endl;
std::cout << boost::format("B2xx Utility Program %s") % visible << std::endl;
return ~0;
}
- if (vm.count("help")){
+ if (vm.count("help")) {
try {
std::cout << boost::format("B2xx Utility Program %s") % visible << std::endl;
- } catch(...) {}
+ } catch (...) {
+ }
return ~0;
}
@@ -348,15 +354,14 @@ int32_t main(int32_t argc, char *argv[]) {
uhd::transport::usb_device_handle::sptr handle;
b200_iface::sptr b200;
- vid = B200_VENDOR_ID; // Default
- pid = B200_PRODUCT_ID; // Default
- if (vm.count("vid") && vm.count("pid"))
- {
+ vid = B200_VENDOR_ID; // Default
+ pid = B200_PRODUCT_ID; // Default
+ if (vm.count("vid") && vm.count("pid")) {
try {
vid = atoh(vid_str);
pid = atoh(pid_str);
- } catch (std::exception &e) {
- std::cerr << "Exception while parsing VID and PID: " << e.what() << std:: endl;
+ } catch (std::exception& e) {
+ std::cerr << "Exception while parsing VID and PID: " << e.what() << std::endl;
return ~0;
}
user_supplied_vid_pid = true;
@@ -374,14 +379,13 @@ int32_t main(int32_t argc, char *argv[]) {
return -1;
std::cout << " Control of B2xx granted..." << std::endl << std::endl;
- // if we are supposed to load a new firmware image and one already exists, reset the FX3 so we can load the new one
- if (vm.count("load-fw") && handle->firmware_loaded())
- {
+ // if we are supposed to load a new firmware image and one already exists, reset the
+ // FX3 so we can load the new one
+ if (vm.count("load-fw") && handle->firmware_loaded()) {
std::cout << "Overwriting existing firmware" << std::endl;
// before we reset, make sure we have a good firmware file
- if(!(fs::exists(fw_file)))
- {
+ if (!(fs::exists(fw_file))) {
std::cerr << "Invalid firmware filepath: " << fw_file << std::endl;
return -1;
}
@@ -389,14 +393,15 @@ int32_t main(int32_t argc, char *argv[]) {
// reset the device
try {
b200->reset_fx3();
- } catch (std::exception &e) {
+ } catch (std::exception& e) {
std::cerr << "Exception while reseting FX3: " << e.what() << std::endl;
}
// re-open device
b200.reset();
handle.reset();
- std::this_thread::sleep_for(std::chrono::seconds(2)); // wait 2 seconds for FX3 to reset
+ std::this_thread::sleep_for(
+ std::chrono::seconds(2)); // wait 2 seconds for FX3 to reset
handle = open_device(vid, pid);
if (!handle)
return -1;
@@ -406,19 +411,18 @@ int32_t main(int32_t argc, char *argv[]) {
}
// Check to make sure firmware is loaded
- if (!(handle->firmware_loaded()))
- {
+ if (!(handle->firmware_loaded())) {
std::cout << "Loading firmware" << std::endl;
if (fw_file.empty())
fw_file = uhd::find_image_path(B200_FW_FILE_NAME);
- if(fw_file.empty()) {
+ if (fw_file.empty()) {
std::cerr << "Firmware image not found!" << std::endl;
return -1;
}
- if(!(fs::exists(fw_file))) {
+ if (!(fs::exists(fw_file))) {
std::cerr << "Invalid filepath: " << fw_file << std::endl;
return -1;
}
@@ -426,7 +430,7 @@ int32_t main(int32_t argc, char *argv[]) {
// load firmware
try {
b200->load_firmware(fw_file);
- } catch (std::exception &e) {
+ } catch (std::exception& e) {
std::cerr << "Exception while loading firmware: " << e.what() << std::endl;
return ~0;
}
@@ -445,8 +449,7 @@ int32_t main(int32_t argc, char *argv[]) {
}
// Added for testing purposes - not exposed
- if (vm.count("read-eeprom"))
- {
+ if (vm.count("read-eeprom")) {
uhd::byte_vector_t data;
if (read_eeprom(b200, data))
@@ -459,8 +462,7 @@ int32_t main(int32_t argc, char *argv[]) {
}
// Added for testing purposes - not exposed
- if (vm.count("erase-eeprom"))
- {
+ if (vm.count("erase-eeprom")) {
if (erase_eeprom(b200))
return -1;
@@ -470,90 +472,90 @@ int32_t main(int32_t argc, char *argv[]) {
}
// Added for testing purposes - not exposed
- if (vm.count("uninit-device"))
- {
+ if (vm.count("uninit-device")) {
// erase EEPROM
erase_eeprom(b200);
- std::cout << "EEPROM uninitialized, resetting device..."
- << std::endl << std::endl;
+ std::cout << "EEPROM uninitialized, resetting device..." << std::endl
+ << std::endl;
// reset the device
try {
b200->reset_fx3();
- } catch (uhd::exception &e) {
+ } catch (uhd::exception& e) {
std::cerr << "Exception while resetting FX3: " << e.what() << std::endl;
return -1;
}
- std::cout << "Uninitialization Process Complete."
- << std::endl << std::endl;
+ std::cout << "Uninitialization Process Complete." << std::endl << std::endl;
return 0;
}
/* If we are initializing the device, the VID/PID should default to the
* Cypress VID/PID for the initial FW load, but we can initialize from any state. */
- if (vm.count("init-device"))
- {
+ if (vm.count("init-device")) {
uint16_t writevid = B200_VENDOR_ID;
uint16_t writepid = B200_PRODUCT_ID;
/* Now, initialize the device. */
- // Added for testing purposes - not exposed
- if (vm.count("write-vid") && vm.count("write-pid"))
- {
+ // Added for testing purposes - not exposed
+ if (vm.count("write-vid") && vm.count("write-pid")) {
try {
- writevid = atoh(writevid_str);
- writepid = atoh(writepid_str);
- } catch (std::exception &e) {
- std::cerr << "Exception while parsing write VID and PID: " << e.what() << std:: endl;
- return ~0;
+ writevid = atoh(writevid_str);
+ writepid = atoh(writepid_str);
+ } catch (std::exception& e) {
+ std::cerr << "Exception while parsing write VID and PID: " << e.what()
+ << std::endl;
+ return ~0;
}
}
std::cout << "Writing VID and PID to EEPROM..." << std::endl << std::endl;
- if (write_and_verify_eeprom(b200, construct_eeprom_init_value_vector(writevid, writepid))) return -1;
+ if (write_and_verify_eeprom(
+ b200, construct_eeprom_init_value_vector(writevid, writepid)))
+ return -1;
- std::cout << "EEPROM initialized, resetting device..."
- << std::endl << std::endl;
+ std::cout << "EEPROM initialized, resetting device..." << std::endl << std::endl;
/* Reset the device! */
try {
b200->reset_fx3();
- } catch (const std::exception &e) {
+ } catch (const std::exception& e) {
std::cerr << "Exception while resetting device: " << e.what() << std::endl;
return -1;
}
- std::cout << "Initialization Process Complete."
- << std::endl << std::endl;
+ std::cout << "Initialization Process Complete." << std::endl << std::endl;
return 0;
}
uint8_t data_buffer[16];
memset(data_buffer, 0x0, sizeof(data_buffer));
- if (vm.count("speed")){
+ if (vm.count("speed")) {
uint8_t speed;
- try {speed = b200->get_usb_speed();}
- catch (uhd::exception &e) {
+ try {
+ speed = b200->get_usb_speed();
+ } catch (uhd::exception& e) {
std::cerr << "Exception while getting USB speed: " << e.what() << std::endl;
return -1;
}
- std::cout << "Currently operating at USB " << (int) speed << std::endl;
+ std::cout << "Currently operating at USB " << (int)speed << std::endl;
}
if (vm.count("reset-device")) {
- try {b200->reset_fx3();}
- catch (uhd::exception &e) {
+ try {
+ b200->reset_fx3();
+ } catch (uhd::exception& e) {
std::cerr << "Exception while resetting FX3: " << e.what() << std::endl;
return -1;
}
} else if (vm.count("reset-fpga")) {
- try {b200->set_fpga_reset_pin(true);}
- catch (uhd::exception &e) {
+ try {
+ b200->set_fpga_reset_pin(true);
+ } catch (uhd::exception& e) {
std::cerr << "Exception while resetting FPGA: " << e.what() << std::endl;
return -1;
}
@@ -561,24 +563,24 @@ int32_t main(int32_t argc, char *argv[]) {
} else if (vm.count("load-fpga")) {
std::cout << "Loading FPGA image (" << fpga_file << ")" << std::endl;
uint32_t fx3_state;
- try {fx3_state = b200->load_fpga(fpga_file);} // returns 0 on success, or FX3 state on error
- catch (uhd::exception &e) {
+ try {
+ fx3_state = b200->load_fpga(fpga_file);
+ } // returns 0 on success, or FX3 state on error
+ catch (uhd::exception& e) {
std::cerr << "Exception while loading FPGA: " << e.what() << std::endl;
return ~0;
}
if (fx3_state != 0) {
- std::cerr << std::flush << "Error loading FPGA. FX3 state ("
- << fx3_state << "): " << b200_iface::fx3_state_string(fx3_state) << std::endl;
+ std::cerr << std::flush << "Error loading FPGA. FX3 state (" << fx3_state
+ << "): " << b200_iface::fx3_state_string(fx3_state) << std::endl;
return ~0;
}
- std::cout << "FPGA load complete, releasing USB interface..."
- << std::endl;
+ std::cout << "FPGA load complete, releasing USB interface..." << std::endl;
}
std::cout << "Operation complete! I did it! I did it!" << std::endl;
return 0;
}
-
diff --git a/host/utils/converter_benchmark.cpp b/host/utils/converter_benchmark.cpp
index cb8cce519..07aec9170 100644
--- a/host/utils/converter_benchmark.cpp
+++ b/host/utils/converter_benchmark.cpp
@@ -5,32 +5,30 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/safe_main.hpp>
-#include <uhd/types/dict.hpp>
#include <uhd/convert.hpp>
#include <uhd/exception.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/types/dict.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <stdint.h>
+#include <boost/algorithm/string.hpp>
#include <boost/format.hpp>
-#include <boost/timer.hpp>
#include <boost/lexical_cast.hpp>
-#include <boost/algorithm/string.hpp>
-#include <iostream>
+#include <boost/program_options.hpp>
+#include <boost/timer.hpp>
+#include <complex>
#include <iomanip>
+#include <iostream>
#include <map>
-#include <complex>
-#include <stdint.h>
namespace po = boost::program_options;
using namespace uhd::convert;
-enum buf_init_t {
- RANDOM, INC
-};
+enum buf_init_t { RANDOM, INC };
// Convert `sc16_item32_le' -> `sc16'
// Finds the first _ in format and returns the string
// until then. Returns the entire string if no _ is found.
-std::string format_to_type(const std::string &format)
+std::string format_to_type(const std::string& format)
{
std::string ret_val = "";
for (size_t i = 0; i < format.length(); i++) {
@@ -44,10 +42,8 @@ std::string format_to_type(const std::string &format)
}
void configure_conv(
- converter::sptr conv,
- const std::string &in_type,
- const std::string &out_type
-) {
+ converter::sptr conv, const std::string& in_type, const std::string& out_type)
+{
if (in_type == "sc16") {
if (out_type == "fc32") {
std::cout << "Setting scalar to 32767." << std::endl;
@@ -68,21 +64,19 @@ void configure_conv(
}
template <typename T>
-void init_random_vector_complex_float(std::vector<char> &buf_ptr, const size_t n_items)
+void init_random_vector_complex_float(std::vector<char>& buf_ptr, const size_t n_items)
{
- std::complex<T> * const buf = reinterpret_cast<std::complex<T> * const>(&buf_ptr[0]);
+ std::complex<T>* const buf = reinterpret_cast<std::complex<T>* const>(&buf_ptr[0]);
for (size_t i = 0; i < n_items; i++) {
buf[i] = std::complex<T>(
- T(std::rand()/(RAND_MAX/2.0) - 1),
- T(std::rand()/(RAND_MAX/2.0) - 1)
- );
+ T(std::rand() / (RAND_MAX / 2.0) - 1), T(std::rand() / (RAND_MAX / 2.0) - 1));
}
}
template <typename T>
-void init_random_vector_complex_int(std::vector<char> &buf_ptr, const size_t n_items)
+void init_random_vector_complex_int(std::vector<char>& buf_ptr, const size_t n_items)
{
- std::complex<T> * const buf = reinterpret_cast<std::complex<T> * const>(&buf_ptr[0]);
+ std::complex<T>* const buf = reinterpret_cast<std::complex<T>* const>(&buf_ptr[0]);
for (size_t i = 0; i < n_items; i++) {
buf[i] = std::complex<T>(T(std::rand()), T(std::rand()));
}
@@ -96,45 +90,45 @@ struct item32_sc12_3x
};
template <typename T>
-void init_random_vector_complex_sc12(std::vector<char> &buf_ptr, const size_t n_items)
+void init_random_vector_complex_sc12(std::vector<char>& buf_ptr, const size_t n_items)
{
- item32_sc12_3x *const buf = reinterpret_cast<item32_sc12_3x * const>(&buf_ptr[0]);
- if (n_items % 4) throw std::invalid_argument("");
+ item32_sc12_3x* const buf = reinterpret_cast<item32_sc12_3x* const>(&buf_ptr[0]);
+ if (n_items % 4)
+ throw std::invalid_argument("");
for (size_t i = 0; i < n_items / 4; i++) {
int16_t iq[8];
- for (auto &k : iq) k = rand() & 0xfff;
- buf[i].line0 = iq[0] << 20 | iq[1] << 8 | iq[2] >> 4;
+ for (auto& k : iq)
+ k = rand() & 0xfff;
+ buf[i].line0 = iq[0] << 20 | iq[1] << 8 | iq[2] >> 4;
buf[i].line1 = iq[2] << 28 | iq[3] << 16 | iq[4] << 4 | iq[5] >> 8;
buf[i].line2 = iq[5] << 24 | iq[6] << 12 | iq[7] << 0;
}
}
template <typename T>
-void init_random_vector_real_int(std::vector<char> &buf_ptr, size_t n_items)
+void init_random_vector_real_int(std::vector<char>& buf_ptr, size_t n_items)
{
- T * const buf = reinterpret_cast<T * const>(&buf_ptr[0]);
+ T* const buf = reinterpret_cast<T* const>(&buf_ptr[0]);
for (size_t i = 0; i < n_items; i++) {
buf[i] = T(std::rand());
}
}
// Fill a buffer with increasing numbers
-template <typename T>
-void init_inc_vector(std::vector<char> &buf_ptr, size_t n_items)
+template <typename T> void init_inc_vector(std::vector<char>& buf_ptr, size_t n_items)
{
- T * const buf = reinterpret_cast<T * const>(&buf_ptr[0]);
+ T* const buf = reinterpret_cast<T* const>(&buf_ptr[0]);
for (size_t i = 0; i < n_items; i++) {
buf[i] = T(i);
}
}
-void init_buffers(
- std::vector< std::vector<char> > &buf,
- const std::string &type,
- size_t bytes_per_item,
- buf_init_t buf_seed_mode
-) {
+void init_buffers(std::vector<std::vector<char>>& buf,
+ const std::string& type,
+ size_t bytes_per_item,
+ buf_init_t buf_seed_mode)
+{
if (buf.empty()) {
return;
}
@@ -144,26 +138,25 @@ void init_buffers(
if (buf_seed_mode == INC) {
for (size_t i = 0; i < buf.size(); i++) {
if (type == "sc8") {
- init_inc_vector< std::complex<int8_t> >(buf[i], n_items);
+ init_inc_vector<std::complex<int8_t>>(buf[i], n_items);
} else if (type == "sc16") {
- init_inc_vector< std::complex<int16_t> >(buf[i], n_items);
+ init_inc_vector<std::complex<int16_t>>(buf[i], n_items);
} else if (type == "sc32") {
- init_inc_vector< std::complex<int32_t> >(buf[i], n_items);
+ init_inc_vector<std::complex<int32_t>>(buf[i], n_items);
} else if (type == "fc32") {
- init_inc_vector< std::complex<float> >(buf[i], n_items);
+ init_inc_vector<std::complex<float>>(buf[i], n_items);
} else if (type == "fc64") {
- init_inc_vector< std::complex<double> >(buf[i], n_items);
+ init_inc_vector<std::complex<double>>(buf[i], n_items);
} else if (type == "s8") {
- init_inc_vector< int8_t >(buf[i], n_items);
+ init_inc_vector<int8_t>(buf[i], n_items);
} else if (type == "s16") {
- init_inc_vector< int16_t >(buf[i], n_items);
+ init_inc_vector<int16_t>(buf[i], n_items);
} else if (type == "item32") {
- init_inc_vector< uint32_t >(buf[i], n_items);
+ init_inc_vector<uint32_t>(buf[i], n_items);
init_random_vector_real_int<uint32_t>(buf[i], n_items);
} else {
- throw uhd::runtime_error(str(
- boost::format("Cannot handle data type: %s") % type
- ));
+ throw uhd::runtime_error(
+ str(boost::format("Cannot handle data type: %s") % type));
}
}
@@ -193,21 +186,19 @@ void init_buffers(
} else if (type == "item32") {
init_random_vector_real_int<uint32_t>(buf[i], n_items);
} else {
- throw uhd::runtime_error(str(
- boost::format("Cannot handle data type: %s") % type
- ));
+ throw uhd::runtime_error(
+ str(boost::format("Cannot handle data type: %s") % type));
}
}
}
// Returns time elapsed
-double run_benchmark(
- converter::sptr conv,
- const std::vector<const void *> &input_buf_refs,
- const std::vector<void *> &output_buf_refs,
- size_t n_items,
- size_t iterations
-) {
+double run_benchmark(converter::sptr conv,
+ const std::vector<const void*>& input_buf_refs,
+ const std::vector<void*>& output_buf_refs,
+ size_t n_items,
+ size_t iterations)
+{
boost::timer benchmark_timer;
for (size_t i = 0; i < iterations; i++) {
conv->conv(input_buf_refs, output_buf_refs, n_items);
@@ -215,71 +206,58 @@ double run_benchmark(
return benchmark_timer.elapsed();
}
-template <typename T>
-std::string void_ptr_to_hexstring(const void *v_ptr, size_t index)
+template <typename T> std::string void_ptr_to_hexstring(const void* v_ptr, size_t index)
{
- const T *ptr = reinterpret_cast<const T *>(v_ptr);
+ const T* ptr = reinterpret_cast<const T*>(v_ptr);
return str(boost::format("%X") % ptr[index]);
}
-std::string item_to_hexstring(
- const void *v_ptr,
- size_t index,
- const std::string &type
-) {
+std::string item_to_hexstring(const void* v_ptr, size_t index, const std::string& type)
+{
if (type == "fc32") {
return void_ptr_to_hexstring<uint64_t>(v_ptr, index);
- }
- else if (type == "sc16" || type == "item32") {
+ } else if (type == "sc16" || type == "item32") {
return void_ptr_to_hexstring<uint32_t>(v_ptr, index);
- }
- else if (type == "sc8" || type == "s16") {
+ } else if (type == "sc8" || type == "s16") {
return void_ptr_to_hexstring<uint16_t>(v_ptr, index);
- }
- else if (type == "u8") {
+ } else if (type == "u8") {
return void_ptr_to_hexstring<uint8_t>(v_ptr, index);
- }
- else {
+ } else {
return str(boost::format("<unhandled data type: %s>") % type);
}
}
std::string item_to_string(
- const void *v_ptr,
- size_t index,
- const std::string &type,
- const bool print_hex
-) {
+ const void* v_ptr, size_t index, const std::string& type, const bool print_hex)
+{
if (print_hex) {
return item_to_hexstring(v_ptr, index, type);
}
if (type == "sc16") {
- const std::complex<int16_t> *ptr = reinterpret_cast<const std::complex<int16_t> *>(v_ptr);
+ const std::complex<int16_t>* ptr =
+ reinterpret_cast<const std::complex<int16_t>*>(v_ptr);
return boost::lexical_cast<std::string>(ptr[index]);
- }
- else if (type == "sc8") {
- const std::complex<int8_t> *ptr = reinterpret_cast<const std::complex<int8_t> *>(v_ptr);
+ } else if (type == "sc8") {
+ const std::complex<int8_t>* ptr =
+ reinterpret_cast<const std::complex<int8_t>*>(v_ptr);
return boost::lexical_cast<std::string>(ptr[index]);
- }
- else if (type == "fc32") {
- const std::complex<float> *ptr = reinterpret_cast<const std::complex<float> *>(v_ptr);
+ } else if (type == "fc32") {
+ const std::complex<float>* ptr =
+ reinterpret_cast<const std::complex<float>*>(v_ptr);
return boost::lexical_cast<std::string>(ptr[index]);
- }
- else if (type == "item32") {
- const uint32_t *ptr = reinterpret_cast<const uint32_t *>(v_ptr);
+ } else if (type == "item32") {
+ const uint32_t* ptr = reinterpret_cast<const uint32_t*>(v_ptr);
return boost::lexical_cast<std::string>(ptr[index]);
- }
- else if (type == "s16") {
- const int16_t *ptr = reinterpret_cast<const int16_t *>(v_ptr);
+ } else if (type == "s16") {
+ const int16_t* ptr = reinterpret_cast<const int16_t*>(v_ptr);
return boost::lexical_cast<std::string>(ptr[index]);
- }
- else {
+ } else {
return str(boost::format("<unhandled data type: %s>") % type);
}
}
-int UHD_SAFE_MAIN(int argc, char *argv[])
+int UHD_SAFE_MAIN(int argc, char* argv[])
{
std::string in_format, out_format;
std::string priorities;
@@ -311,15 +289,19 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
- std::cout << boost::format("UHD Converter Benchmark Tool %s") % desc << std::endl << std::endl;
- std::cout << " Use this to benchmark or debug converters." << std::endl
- << " When using as a benchmark tool, it will output the execution time\n"
- " for every conversion run in CSV format to stdout. Every line between\n"
- " the output delimiters {{{ }}} is of the format: <PRIO>,<TIME IN MILLISECONDS>\n"
- " When using for converter debugging, every line is formatted as\n"
- " <INPUT_VALUE>,<OUTPUT_VALUE>\n" << std::endl;
+ // print the help message
+ if (vm.count("help")) {
+ std::cout << boost::format("UHD Converter Benchmark Tool %s") % desc << std::endl
+ << std::endl;
+ std::cout
+ << " Use this to benchmark or debug converters." << std::endl
+ << " When using as a benchmark tool, it will output the execution time\n"
+ " for every conversion run in CSV format to stdout. Every line between\n"
+ " the output delimiters {{{ }}} is of the format: <PRIO>,<TIME IN "
+ "MILLISECONDS>\n"
+ " When using for converter debugging, every line is formatted as\n"
+ " <INPUT_VALUE>,<OUTPUT_VALUE>\n"
+ << std::endl;
return EXIT_FAILURE;
}
@@ -329,7 +311,9 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
} else if (seed_mode == "random") {
buf_seed_mode = RANDOM;
} else {
- std::cout << "Invalid argument: --seed-mode must be either 'incremental' or 'random'." << std::endl;
+ std::cout
+ << "Invalid argument: --seed-mode must be either 'incremental' or 'random'."
+ << std::endl;
}
bool debug_mode = vm.count("debug-converter") > 0;
@@ -343,13 +327,13 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
converter_id.output_format = out_format;
converter_id.num_inputs = n_inputs;
converter_id.num_outputs = n_outputs;
- std::cout << "Requested converter format: " << converter_id.to_string()
- << std::endl;
+ std::cout << "Requested converter format: " << converter_id.to_string() << std::endl;
uhd::dict<priority_type, converter::sptr> conv_list;
if (priorities == "default" or priorities.empty()) {
try {
- conv_list[prio] = get_converter(converter_id, prio)(); // Can throw a uhd::key_error
- } catch(const uhd::key_error &) {
+ conv_list[prio] =
+ get_converter(converter_id, prio)(); // Can throw a uhd::key_error
+ } catch (const uhd::key_error&) {
std::cout << "No converters found." << std::endl;
return EXIT_FAILURE;
}
@@ -357,7 +341,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
for (priority_type i = 0; i < max_prio; i++) {
try {
// get_converter() returns a factory function, execute that immediately:
- converter::sptr conv_for_prio = get_converter(converter_id, i)(); // Can throw a uhd::key_error
+ converter::sptr conv_for_prio =
+ get_converter(converter_id, i)(); // Can throw a uhd::key_error
conv_list[i] = conv_for_prio;
} catch (...) {
continue;
@@ -365,15 +350,15 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
}
} else { // Assume that priorities contains a list of prios (e.g. 0,2,3)
std::vector<std::string> prios_in_list;
- boost::split(
- prios_in_list,
- priorities,
- boost::is_any_of(","), // Split at ,
- boost::token_compress_on // Avoid empty results
+ boost::split(prios_in_list,
+ priorities,
+ boost::is_any_of(","), // Split at ,
+ boost::token_compress_on // Avoid empty results
);
- for(const std::string &this_prio: prios_in_list) {
+ for (const std::string& this_prio : prios_in_list) {
size_t prio_index = boost::lexical_cast<size_t>(this_prio);
- converter::sptr conv_for_prio = get_converter(converter_id, prio_index)(); // Can throw a uhd::key_error
+ converter::sptr conv_for_prio =
+ get_converter(converter_id, prio_index)(); // Can throw a uhd::key_error
conv_list[prio_index] = conv_for_prio;
}
}
@@ -383,25 +368,27 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
// First, convert the types to plain types (e.g. sc16_item32_le -> sc16)
const std::string in_type = format_to_type(in_format);
const std::string out_type = format_to_type(out_format);
- const size_t in_size = get_bytes_per_item(in_type);
- const size_t out_size = get_bytes_per_item(out_type);
+ const size_t in_size = get_bytes_per_item(in_type);
+ const size_t out_size = get_bytes_per_item(out_type);
// Create the buffers and fill them with random data & zeros, respectively
- std::vector< std::vector<char> > input_buffers(n_inputs, std::vector<char>(in_size * n_samples, 0));
- std::vector< std::vector<char> > output_buffers(n_outputs, std::vector<char>(out_size * n_samples, 0));
+ std::vector<std::vector<char>> input_buffers(
+ n_inputs, std::vector<char>(in_size * n_samples, 0));
+ std::vector<std::vector<char>> output_buffers(
+ n_outputs, std::vector<char>(out_size * n_samples, 0));
init_buffers(input_buffers, in_type, in_size, buf_seed_mode);
// Create ref vectors for the converter:
- std::vector<const void *> input_buf_refs(n_inputs);
- std::vector<void *> output_buf_refs(n_outputs);
+ std::vector<const void*> input_buf_refs(n_inputs);
+ std::vector<void*> output_buf_refs(n_outputs);
for (size_t i = 0; i < n_inputs; i++) {
- input_buf_refs[i] = reinterpret_cast<const void *>(&input_buffers[i][0]);
+ input_buf_refs[i] = reinterpret_cast<const void*>(&input_buffers[i][0]);
}
for (size_t i = 0; i < n_outputs; i++) {
- output_buf_refs[i] = reinterpret_cast<void *>(&output_buffers[i][0]);
+ output_buf_refs[i] = reinterpret_cast<void*>(&output_buffers[i][0]);
}
/// Final configurations to the converter:
std::cout << "Configuring converters:" << std::endl;
- for(priority_type prio_i: conv_list.keys()) {
+ for (priority_type prio_i : conv_list.keys()) {
std::cout << "* [" << prio_i << "]: ";
configure_conv(conv_list[prio_i], in_type, out_type);
}
@@ -410,38 +397,33 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
std::cout << "{{{" << std::endl;
if (not debug_mode) {
std::cout << "prio,duration_ms,avg_duration_ms,n_samples,iterations" << std::endl;
- for(priority_type prio_i: conv_list.keys()) {
- double duration = run_benchmark(
- conv_list[prio_i],
- input_buf_refs,
- output_buf_refs,
- n_samples,
- iterations
- );
- std::cout << boost::format("%i,%d,%d,%d,%d")
- % prio_i
- % (duration * 1000)
- % (duration * 1000.0 / iterations)
- % n_samples
- % iterations
- << std::endl;
+ for (priority_type prio_i : conv_list.keys()) {
+ double duration = run_benchmark(conv_list[prio_i],
+ input_buf_refs,
+ output_buf_refs,
+ n_samples,
+ iterations);
+ std::cout << boost::format("%i,%d,%d,%d,%d") % prio_i % (duration * 1000)
+ % (duration * 1000.0 / iterations) % n_samples % iterations
+ << std::endl;
}
}
/// Or run debug mode, which runs one conversion and prints the results ////
if (debug_mode) {
// Only run on the first converter:
- run_benchmark(
- conv_list[conv_list.keys().at(0)],
+ run_benchmark(conv_list[conv_list.keys().at(0)],
input_buf_refs,
output_buf_refs,
n_samples,
- iterations
- );
+ iterations);
for (size_t i = 0; i < n_samples; i++) {
std::cout << item_to_string(input_buf_refs[0], i, in_type, vm.count("hex"))
<< ";"
- << item_to_string(reinterpret_cast< const void * >(output_buf_refs[0]), i, out_type, vm.count("hex"))
+ << item_to_string(reinterpret_cast<const void*>(output_buf_refs[0]),
+ i,
+ out_type,
+ vm.count("hex"))
<< std::endl;
}
}
diff --git a/host/utils/fx2_init_eeprom.cpp b/host/utils/fx2_init_eeprom.cpp
index 448652faf..e375b27f5 100644
--- a/host/utils/fx2_init_eeprom.cpp
+++ b/host/utils/fx2_init_eeprom.cpp
@@ -5,31 +5,32 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/safe_main.hpp>
+#include "b100_eeprom.h"
+#include "usrp1_eeprom.h"
#include <uhd/device.hpp>
#include <uhd/property_tree.hpp>
-#include <boost/program_options.hpp>
-#include <boost/format.hpp>
-#include <boost/filesystem.hpp>
+#include <uhd/utils/safe_main.hpp>
#include <boost/algorithm/string/predicate.hpp>
-#include <iostream>
+#include <boost/filesystem.hpp>
+#include <boost/format.hpp>
+#include <boost/program_options.hpp>
#include <fstream>
-#include "usrp1_eeprom.h"
-#include "b100_eeprom.h"
+#include <iostream>
#ifdef UHD_PLATFORM_LINUX
-#include <unistd.h> // syscall constants
-#include <fcntl.h> // O_NONBLOCK
-#include <sys/syscall.h>
-#include <cerrno>
-#include <cstring> // for std::strerror
-#endif //UHD_PLATFORM_LINUX
+# include <fcntl.h> // O_NONBLOCK
+# include <sys/syscall.h>
+# include <unistd.h> // syscall constants
+# include <cerrno>
+# include <cstring> // for std::strerror
+#endif // UHD_PLATFORM_LINUX
const std::string FX2_VENDOR_ID("0x04b4");
const std::string FX2_PRODUCT_ID("0x8613");
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
std::string type;
std::string image;
po::options_description desc("Allowed options");
@@ -47,97 +48,104 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("USRP EEPROM initialization %s") % desc << std::endl;
return EXIT_FAILURE;
}
#ifdef UHD_PLATFORM_LINUX
- //can't find an uninitialized usrp with this mystery usbtest in the way...
+ // can't find an uninitialized usrp with this mystery usbtest in the way...
std::string module("usbtest");
std::ifstream modules("/proc/modules");
bool module_found = false;
std::string module_line;
- while(std::getline(modules, module_line) && (!module_found)) {
+ while (std::getline(modules, module_line) && (!module_found)) {
module_found = boost::starts_with(module_line, module);
}
- if(module_found) {
- std::cout << boost::format("Found the '%s' module. Unloading it.\n" ) % module;
+ if (module_found) {
+ std::cout << boost::format("Found the '%s' module. Unloading it.\n") % module;
int fail = syscall(__NR_delete_module, module.c_str(), O_NONBLOCK);
- if(fail)
- std::cerr << ( boost::format("Removing the '%s' module failed with error '%s'.\n") % module % std::strerror(errno) );
+ if (fail)
+ std::cerr << (boost::format(
+ "Removing the '%s' module failed with error '%s'.\n")
+ % module % std::strerror(errno));
}
-#endif //UHD_PLATFORM_LINUX
+#endif // UHD_PLATFORM_LINUX
- //load the options into the address
+ // load the options into the address
uhd::device_addr_t device_addr;
device_addr["type"] = type;
- if(vm.count("vid") or vm.count("pid")) {
- if(not (vm.count("vid") and vm.count("pid") and vm.count("type"))) {
- std::cerr << "ERROR: Must specify vid, pid, and type if specifying any of the two former args" << std::endl;
+ if (vm.count("vid") or vm.count("pid")) {
+ if (not(vm.count("vid") and vm.count("pid") and vm.count("type"))) {
+ std::cerr << "ERROR: Must specify vid, pid, and type if specifying any of "
+ "the two former args"
+ << std::endl;
} else {
- device_addr["vid"] = vm["vid"].as<std::string>();
- device_addr["pid"] = vm["pid"].as<std::string>();
+ device_addr["vid"] = vm["vid"].as<std::string>();
+ device_addr["pid"] = vm["pid"].as<std::string>();
device_addr["type"] = vm["type"].as<std::string>();
}
} else {
device_addr["vid"] = FX2_VENDOR_ID;
device_addr["pid"] = FX2_PRODUCT_ID;
}
- if(vm.count("image")) {
- //if specified, use external image file
- image = vm["image"].as<std::string>();
+ if (vm.count("image")) {
+ // if specified, use external image file
+ image = vm["image"].as<std::string>();
} else {
- //if not specified, use built-ins; requires user to define type
- size_t image_len;
- unsigned const char* image_data;
+ // if not specified, use built-ins; requires user to define type
+ size_t image_len;
+ unsigned const char* image_data;
+
+ if (!vm.count("type")) {
+ std::cerr << boost::format("ERROR: Image file not specified and type of "
+ "device not given. Cannot use built-in images.\n");
+ return EXIT_FAILURE;
+ }
- if(!vm.count("type")) {
- std::cerr << boost::format("ERROR: Image file not specified and type of device not given. Cannot use built-in images.\n");
- return EXIT_FAILURE;
- }
-
- std::cout << boost::format("Using built-in image for \"%s\".\n") % type;
-
- if(vm["type"].as<std::string>() == "usrp1") {
- image_len = usrp1_eeprom_bin_len;
- image_data = usrp1_eeprom_bin;
- } else if(vm["type"].as<std::string>() == "b100") {
- image_len = b100_eeprom_bin_len;
- image_data = b100_eeprom_bin;
- } else {
- std::cerr << boost::format("ERROR: Unsupported device type \"%s\" specified and no EEPROM image file given.\n") % type;
- return EXIT_FAILURE;
- }
+ std::cout << boost::format("Using built-in image for \"%s\".\n") % type;
+
+ if (vm["type"].as<std::string>() == "usrp1") {
+ image_len = usrp1_eeprom_bin_len;
+ image_data = usrp1_eeprom_bin;
+ } else if (vm["type"].as<std::string>() == "b100") {
+ image_len = b100_eeprom_bin_len;
+ image_data = b100_eeprom_bin;
+ } else {
+ std::cerr << boost::format("ERROR: Unsupported device type \"%s\" specified "
+ "and no EEPROM image file given.\n")
+ % type;
+ return EXIT_FAILURE;
+ }
- //get temporary file name, and write image to that.
- image = boost::filesystem::unique_path().string();
- std::ofstream tmp_image(image, std::ofstream::binary);
- tmp_image.write((const char*)image_data, image_len);
- tmp_image.close();
+ // get temporary file name, and write image to that.
+ image = boost::filesystem::unique_path().string();
+ std::ofstream tmp_image(image, std::ofstream::binary);
+ tmp_image.write((const char*)image_data, image_len);
+ tmp_image.close();
}
- //find and create a control transport to do the writing.
+ // find and create a control transport to do the writing.
uhd::device_addrs_t found_addrs = uhd::device::find(device_addr, uhd::device::USRP);
- if (found_addrs.size() == 0){
+ if (found_addrs.size() == 0) {
std::cerr << "No USRP devices found" << std::endl;
return EXIT_FAILURE;
}
- for (size_t i = 0; i < found_addrs.size(); i++){
+ for (size_t i = 0; i < found_addrs.size(); i++) {
std::cout << "Writing EEPROM data..." << std::endl;
- //uhd::device_addrs_t devs = uhd::device::find(found_addrs[i]);
+ // uhd::device_addrs_t devs = uhd::device::find(found_addrs[i]);
uhd::device::sptr dev = uhd::device::make(found_addrs[i], uhd::device::USRP);
uhd::property_tree::sptr tree = dev->get_tree();
tree->access<std::string>("/mboards/0/load_eeprom").set(image);
}
- //delete temporary image file if we created one
- if(!vm.count("image")) {
- boost::filesystem::remove(image);
+ // delete temporary image file if we created one
+ if (!vm.count("image")) {
+ boost::filesystem::remove(image);
}
std::cout << "Power-cycle the usrp for the changes to take effect." << std::endl;
diff --git a/host/utils/latency/include/Responder.hpp b/host/utils/latency/include/Responder.hpp
index 0d690bcd6..81b5e84f9 100644
--- a/host/utils/latency/include/Responder.hpp
+++ b/host/utils/latency/include/Responder.hpp
@@ -8,279 +8,299 @@
#ifndef RESPONDER_H
#define RESPONDER_H
+#include <uhd/usrp/multi_usrp.hpp>
#include <curses.h>
-#include <map>
-#include <ctime>
#include <stdint.h>
-
-#include <uhd/usrp/multi_usrp.hpp>
+#include <ctime>
+#include <map>
using namespace std;
class Responder
{
- public:
- enum ReturnCodes
+public:
+ enum ReturnCodes {
+ RETCODE_OK = 0,
+ RETCODE_BAD_ARGS = -1,
+ RETCODE_RUNTIME_ERROR = -2,
+ RETCODE_UNKNOWN_EXCEPTION = -3,
+ RETCODE_RECEIVE_TIMEOUT = -4,
+ RETCODE_RECEIVE_FAILED = -5,
+ RETCODE_MANUAL_ABORT = -6,
+ RETCODE_BAD_PACKET = -7,
+ RETCODE_OVERFLOW = -8
+ };
+
+ struct Options
+ {
+ string device_args;
+ double delay;
+ double sample_rate;
+ double trigger_level;
+ float output_scale;
+ double response_duration;
+ double dc_offset_delay;
+ double init_delay;
+ double timeout;
+ size_t samps_per_buff;
+ size_t samps_per_packet;
+ double level_calibration_duration;
+ std::string test_title;
+ std::string stats_filename;
+ std::string stats_filename_prefix;
+ std::string stats_filename_suffix;
+ double delay_min;
+ double delay_max;
+ double delay_step;
+ double pulse_detection_threshold;
+ uint64_t test_iterations;
+ size_t end_test_after_success_count;
+ size_t skip_iterations;
+ double simulate_frequency;
+ double time_mul;
+ size_t flush_count;
+ size_t optimize_padding;
+ double rt_priority;
+ bool ignore_simulation_check;
+ bool test_iterations_is_sample_count;
+ bool skip_eob;
+ bool adjust_simulation_rate;
+ bool optimize_simulation_rate;
+ bool no_stats_file;
+ bool log_file;
+ bool batch_mode;
+ bool skip_if_results_exist;
+ bool skip_send;
+ bool combine_eob;
+ bool pause;
+ bool realtime;
+ float invert;
+ float output_value;
+ bool no_delay;
+ bool allow_late_bursts;
+
+ uint64_t level_calibration_count() const
{
- RETCODE_OK = 0,
- RETCODE_BAD_ARGS = -1,
- RETCODE_RUNTIME_ERROR = -2,
- RETCODE_UNKNOWN_EXCEPTION = -3,
- RETCODE_RECEIVE_TIMEOUT = -4,
- RETCODE_RECEIVE_FAILED = -5,
- RETCODE_MANUAL_ABORT = -6,
- RETCODE_BAD_PACKET = -7,
- RETCODE_OVERFLOW = -8
- };
-
- struct Options
- {
- string device_args;
- double delay;
- double sample_rate;
- double trigger_level;
- float output_scale;
- double response_duration;
- double dc_offset_delay;
- double init_delay;
- double timeout;
- size_t samps_per_buff;
- size_t samps_per_packet;
- double level_calibration_duration;
- std::string test_title;
- std::string stats_filename;
- std::string stats_filename_prefix;
- std::string stats_filename_suffix;
- double delay_min;
- double delay_max;
- double delay_step;
- double pulse_detection_threshold;
- uint64_t test_iterations;
- size_t end_test_after_success_count;
- size_t skip_iterations;
- double simulate_frequency;
- double time_mul;
- size_t flush_count;
- size_t optimize_padding;
- double rt_priority;
- bool ignore_simulation_check;
- bool test_iterations_is_sample_count;
- bool skip_eob;
- bool adjust_simulation_rate;
- bool optimize_simulation_rate;
- bool no_stats_file;
- bool log_file;
- bool batch_mode;
- bool skip_if_results_exist;
- bool skip_send;
- bool combine_eob;
- bool pause;
- bool realtime;
- float invert;
- float output_value;
- bool no_delay;
- bool allow_late_bursts;
-
- uint64_t level_calibration_count() const
- {
- return (uint64_t)(sample_rate * level_calibration_duration);
- }
+ return (uint64_t)(sample_rate * level_calibration_duration);
+ }
- uint64_t response_length() const
- {
- return (uint64_t)(sample_rate * response_duration);
- }
-
- uint64_t highest_delay_samples(const double delay) const
- {
- return (uint64_t)(delay * (double)sample_rate);
- }
-
- uint64_t simulate_duration(const double simulate_frequency) const
- {
- if(simulate_frequency > 0.0) {
- return (uint64_t)((double)sample_rate / simulate_frequency);
- }
- return 0;
- }
- };
-
- typedef struct Stats
+ uint64_t response_length() const
{
- double delay;
- uint64_t detected;
- uint64_t missed;
- uint64_t skipped;
- } STATS;
+ return (uint64_t)(sample_rate * response_duration);
+ }
- typedef std::map<uint64_t,STATS> StatsMap;
+ uint64_t highest_delay_samples(const double delay) const
+ {
+ return (uint64_t)(delay * (double)sample_rate);
+ }
- struct DebugInfo
+ uint64_t simulate_duration(const double simulate_frequency) const
{
- time_t start_time;
- time_t end_time;
- time_t start_time_test;
- time_t end_time_test;
- time_t first_send_timeout;
- };
- Responder(Options& opt);
- virtual ~Responder();
-
- // Main entry point after constructor.
- int run();
-
- int get_return_code(){return _return_code;}
-
- protected:
- private:
- // These 2 variables are used for ncurses output.
- WINDOW* _window;
- std::stringstream _ss;
- std::stringstream _ss_cerr;
-
- // struct which holds all arguments as constants settable from outside the class
- const Options _opt;
-
- string _stats_filename; // Specify name of statistics file
- string _stats_log_filename; // Specify name for log file.
- double _delay; // may be altered in all modes.
- size_t _samps_per_packet; // This is one of the options of interest. Find out how well it performs.
- double _delay_step; // may be altered in interactive mode
- double _simulate_frequency; // updated during automatic test iterations
-
- // additional attributes
- bool _allow_late_bursts; // may be altered in interactive mode
- bool _no_delay; // may be altered in interactive mode
-
- // dependent variables
- uint64_t _response_length;
- int64_t _init_delay_count;
- int64_t _dc_offset_countdown;
- int64_t _level_calibration_countdown;
- uint64_t _simulate_duration;
- uint64_t _original_simulate_duration;
-
- // these variables store test conditions
- uint64_t _num_total_samps; // printed on exit
- size_t _overruns; // printed on exit
- StatsMap _mapStats; // store results
- uint64_t _max_success; // < 0 --> write results to file
- int _return_code;
-
- // Hold USRP, streams and commands
- uhd::usrp::multi_usrp::sptr _usrp;
- uhd::tx_streamer::sptr _tx_stream;
- uhd::rx_streamer::sptr _rx_stream;
- uhd::stream_cmd_t _stream_cmd;
-
- // Keep track of number of timeouts.
- uint64_t _timeout_burst_count;
- uint64_t _timeout_eob_count;
-
- // Transmit attributes
- float* _pResponse;
-
- // Control print parameters.
- int _y_delay_pos;
- int _x_delay_pos; // Remember the cursor position of delay line
- uint64_t _last_overrun_count;
-
- // Hold debug info during test. Will be included in log file.
- DebugInfo _dbginfo;
-
- /*
- * Here are the class's member methods.
- */
- // These methods are used for ncurses output
- void create_ncurses_window();
- void FLUSH_SCREEN();
- void FLUSH_SCREEN_NL();
-
- // Variable calculation helpers
- inline uint64_t get_response_length(double sample_rate, double response_duration)
- {return (uint64_t)(sample_rate * response_duration);}
- int calculate_dependent_values();
-
- // make sure existing results are not overwritten accidently
- bool set_stats_filename(string test_id);
- bool check_for_existing_results();
-
- // Functions that may cause Responder to finish
- void register_stop_signal_handler();
- bool test_finished(size_t success_count);
- int test_step_finished(uint64_t trigger_count, uint64_t num_total_samps_test, STATS statsCurrent, size_t success_count);
-
- // Check if sent burst could be transmitted.
- bool tx_burst_is_late();
-
- // Handle receiver errors such as overflows.
- bool handle_rx_errors(uhd::rx_metadata_t::error_code_t err, size_t num_rx_samps);
-
- // In interactive mode, handle Responder control and output.
- bool handle_interactive_control();
- void print_interactive_msg(std::string msg);
-
- // calibration important for interactive mode with 2nd USRP connected.
- float calibrate_usrp_for_test_run();
-
- // Run actual test
- void run_test(float threshold = 0.0f );
-
- // Detect falling edge
- bool get_new_state(uint64_t total_samps, uint64_t simulate_duration, float val, float threshold);
- uint64_t detect_respond_pulse_count(STATS &statsCurrent, std::vector<std::complex<float> > &buff, uint64_t trigger_count, size_t num_rx_samps, float threshold, uhd::time_spec_t rx_time);
-
- // Hold test results till they are printed to a file
- void add_stats_to_results(STATS statsCurrent, double delay);
-
- // Control USRP and necessary streamers
- uhd::usrp::multi_usrp::sptr create_usrp_device();
- void set_usrp_rx_dc_offset(uhd::usrp::multi_usrp::sptr usrp, bool ena);
- void stop_usrp_stream();
- uhd::tx_streamer::sptr create_tx_streamer(uhd::usrp::multi_usrp::sptr usrp);
- uhd::rx_streamer::sptr create_rx_streamer(uhd::usrp::multi_usrp::sptr usrp);
-
- // Send burst and handle results.
- bool send_tx_burst(uhd::time_spec_t rx_time, size_t n);
- void handle_tx_timeout(int burst, int eob);
- float* alloc_response_buffer_with_data(uint64_t response_length);
- uhd::tx_metadata_t get_tx_metadata(uhd::time_spec_t rx_time, size_t n);
-
- // Control test parameters
- void update_and_print_parameters(const STATS& statsPrev, const double delay);
- double get_simulate_frequency(double delay, uint64_t response_length, uint64_t original_simulate_duration);
- double get_max_possible_frequency(uint64_t highest_delay_samples, uint64_t response_length);
-
- // Helper methods to print status during test.
- void print_init_test_status();
- void print_test_title();
- void print_usrp_status();
- void print_create_usrp_msg();
- void print_tx_stream_status();
- void print_rx_stream_status();
- void print_test_parameters();
- void print_formatted_delay_line(const uint64_t simulate_duration, const uint64_t old_simulate_duration, const STATS& statsPrev, const double delay, const double simulate_frequency);
- void print_overrun_msg();
- void print_error_msg(std::string msg);
- void print_timeout_msg();
- void print_final_statistics();
- void print_msg_and_wait(std::string msg);
- void print_msg(std::string msg);
-
- // Safe results of test to file.
- void write_statistics_to_file(StatsMap mapStats);
- void safe_write_statistics_to_file(StatsMap mapStats, uint64_t max_success, int return_code);
- void write_log_file();
-
- // Write debug info to log file if requested.
- void write_debug_info(ofstream& logs);
- std::string get_gmtime_string(time_t time);
- std::string enum2str(int return_code);
- std::vector<std::map<std::string,std::string> > read_eth_info();
- uhd::device_addr_t get_usrp_info();
- std::map<std::string, std::string> get_hw_info();
- std::string get_ip_subnet_addr(std::string ip);
+ if (simulate_frequency > 0.0) {
+ return (uint64_t)((double)sample_rate / simulate_frequency);
+ }
+ return 0;
+ }
+ };
+
+ typedef struct Stats
+ {
+ double delay;
+ uint64_t detected;
+ uint64_t missed;
+ uint64_t skipped;
+ } STATS;
+
+ typedef std::map<uint64_t, STATS> StatsMap;
+
+ struct DebugInfo
+ {
+ time_t start_time;
+ time_t end_time;
+ time_t start_time_test;
+ time_t end_time_test;
+ time_t first_send_timeout;
+ };
+ Responder(Options& opt);
+ virtual ~Responder();
+
+ // Main entry point after constructor.
+ int run();
+
+ int get_return_code()
+ {
+ return _return_code;
+ }
+
+protected:
+private:
+ // These 2 variables are used for ncurses output.
+ WINDOW* _window;
+ std::stringstream _ss;
+ std::stringstream _ss_cerr;
+
+ // struct which holds all arguments as constants settable from outside the class
+ const Options _opt;
+
+ string _stats_filename; // Specify name of statistics file
+ string _stats_log_filename; // Specify name for log file.
+ double _delay; // may be altered in all modes.
+ size_t _samps_per_packet; // This is one of the options of interest. Find out how well
+ // it performs.
+ double _delay_step; // may be altered in interactive mode
+ double _simulate_frequency; // updated during automatic test iterations
+
+ // additional attributes
+ bool _allow_late_bursts; // may be altered in interactive mode
+ bool _no_delay; // may be altered in interactive mode
+
+ // dependent variables
+ uint64_t _response_length;
+ int64_t _init_delay_count;
+ int64_t _dc_offset_countdown;
+ int64_t _level_calibration_countdown;
+ uint64_t _simulate_duration;
+ uint64_t _original_simulate_duration;
+
+ // these variables store test conditions
+ uint64_t _num_total_samps; // printed on exit
+ size_t _overruns; // printed on exit
+ StatsMap _mapStats; // store results
+ uint64_t _max_success; // < 0 --> write results to file
+ int _return_code;
+
+ // Hold USRP, streams and commands
+ uhd::usrp::multi_usrp::sptr _usrp;
+ uhd::tx_streamer::sptr _tx_stream;
+ uhd::rx_streamer::sptr _rx_stream;
+ uhd::stream_cmd_t _stream_cmd;
+
+ // Keep track of number of timeouts.
+ uint64_t _timeout_burst_count;
+ uint64_t _timeout_eob_count;
+
+ // Transmit attributes
+ float* _pResponse;
+
+ // Control print parameters.
+ int _y_delay_pos;
+ int _x_delay_pos; // Remember the cursor position of delay line
+ uint64_t _last_overrun_count;
+
+ // Hold debug info during test. Will be included in log file.
+ DebugInfo _dbginfo;
+
+ /*
+ * Here are the class's member methods.
+ */
+ // These methods are used for ncurses output
+ void create_ncurses_window();
+ void FLUSH_SCREEN();
+ void FLUSH_SCREEN_NL();
+
+ // Variable calculation helpers
+ inline uint64_t get_response_length(double sample_rate, double response_duration)
+ {
+ return (uint64_t)(sample_rate * response_duration);
+ }
+ int calculate_dependent_values();
+
+ // make sure existing results are not overwritten accidently
+ bool set_stats_filename(string test_id);
+ bool check_for_existing_results();
+
+ // Functions that may cause Responder to finish
+ void register_stop_signal_handler();
+ bool test_finished(size_t success_count);
+ int test_step_finished(uint64_t trigger_count,
+ uint64_t num_total_samps_test,
+ STATS statsCurrent,
+ size_t success_count);
+
+ // Check if sent burst could be transmitted.
+ bool tx_burst_is_late();
+
+ // Handle receiver errors such as overflows.
+ bool handle_rx_errors(uhd::rx_metadata_t::error_code_t err, size_t num_rx_samps);
+
+ // In interactive mode, handle Responder control and output.
+ bool handle_interactive_control();
+ void print_interactive_msg(std::string msg);
+
+ // calibration important for interactive mode with 2nd USRP connected.
+ float calibrate_usrp_for_test_run();
+
+ // Run actual test
+ void run_test(float threshold = 0.0f);
+
+ // Detect falling edge
+ bool get_new_state(
+ uint64_t total_samps, uint64_t simulate_duration, float val, float threshold);
+ uint64_t detect_respond_pulse_count(STATS& statsCurrent,
+ std::vector<std::complex<float>>& buff,
+ uint64_t trigger_count,
+ size_t num_rx_samps,
+ float threshold,
+ uhd::time_spec_t rx_time);
+
+ // Hold test results till they are printed to a file
+ void add_stats_to_results(STATS statsCurrent, double delay);
+
+ // Control USRP and necessary streamers
+ uhd::usrp::multi_usrp::sptr create_usrp_device();
+ void set_usrp_rx_dc_offset(uhd::usrp::multi_usrp::sptr usrp, bool ena);
+ void stop_usrp_stream();
+ uhd::tx_streamer::sptr create_tx_streamer(uhd::usrp::multi_usrp::sptr usrp);
+ uhd::rx_streamer::sptr create_rx_streamer(uhd::usrp::multi_usrp::sptr usrp);
+
+ // Send burst and handle results.
+ bool send_tx_burst(uhd::time_spec_t rx_time, size_t n);
+ void handle_tx_timeout(int burst, int eob);
+ float* alloc_response_buffer_with_data(uint64_t response_length);
+ uhd::tx_metadata_t get_tx_metadata(uhd::time_spec_t rx_time, size_t n);
+
+ // Control test parameters
+ void update_and_print_parameters(const STATS& statsPrev, const double delay);
+ double get_simulate_frequency(
+ double delay, uint64_t response_length, uint64_t original_simulate_duration);
+ double get_max_possible_frequency(
+ uint64_t highest_delay_samples, uint64_t response_length);
+
+ // Helper methods to print status during test.
+ void print_init_test_status();
+ void print_test_title();
+ void print_usrp_status();
+ void print_create_usrp_msg();
+ void print_tx_stream_status();
+ void print_rx_stream_status();
+ void print_test_parameters();
+ void print_formatted_delay_line(const uint64_t simulate_duration,
+ const uint64_t old_simulate_duration,
+ const STATS& statsPrev,
+ const double delay,
+ const double simulate_frequency);
+ void print_overrun_msg();
+ void print_error_msg(std::string msg);
+ void print_timeout_msg();
+ void print_final_statistics();
+ void print_msg_and_wait(std::string msg);
+ void print_msg(std::string msg);
+
+ // Safe results of test to file.
+ void write_statistics_to_file(StatsMap mapStats);
+ void safe_write_statistics_to_file(
+ StatsMap mapStats, uint64_t max_success, int return_code);
+ void write_log_file();
+
+ // Write debug info to log file if requested.
+ void write_debug_info(ofstream& logs);
+ std::string get_gmtime_string(time_t time);
+ std::string enum2str(int return_code);
+ std::vector<std::map<std::string, std::string>> read_eth_info();
+ uhd::device_addr_t get_usrp_info();
+ std::map<std::string, std::string> get_hw_info();
+ std::string get_ip_subnet_addr(std::string ip);
};
#endif // RESPONDER_H
diff --git a/host/utils/latency/lib/Responder.cpp b/host/utils/latency/lib/Responder.cpp
index 5597c0fcd..0d7a307dd 100644
--- a/host/utils/latency/lib/Responder.cpp
+++ b/host/utils/latency/lib/Responder.cpp
@@ -6,60 +6,55 @@
//
#include "Responder.hpp"
-
-#include <iostream>
-#include <iomanip>
-#include <fstream>
+#include <uhd/property_tree.hpp>
+#include <uhd/utils/thread.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/format.hpp>
+#include <boost/thread/condition_variable.hpp>
+#include <cmath>
#include <complex>
#include <csignal>
-#include <cmath>
+#include <fstream>
+#include <iomanip>
+#include <iostream>
#include <sstream>
-#include <boost/format.hpp>
-#include <boost/algorithm/string.hpp>
-#include <boost/thread/condition_variable.hpp>
-#include <boost/filesystem.hpp>
-#include <uhd/utils/thread.hpp>
-#include <uhd/property_tree.hpp>
-
const std::string _eth_file("eths_info.txt");
// Redirect output to stderr
-struct cerr_redirect {
- cerr_redirect( std::streambuf * new_buffer )
- : old( std::cerr.rdbuf( new_buffer ) )
- { }
+struct cerr_redirect
+{
+ cerr_redirect(std::streambuf* new_buffer) : old(std::cerr.rdbuf(new_buffer)) {}
- ~cerr_redirect( ) {
- std::cerr.rdbuf( old );
+ ~cerr_redirect()
+ {
+ std::cerr.rdbuf(old);
}
private:
- std::streambuf * old;
+ std::streambuf* old;
};
-
// Catch keyboard interrupts for clean manual abort
static bool s_stop_signal_called = false;
-static int s_signal = 0;
+static int s_signal = 0;
static void sig_int_handler(int signal)
{
s_stop_signal_called = true;
- s_signal = signal;
+ s_signal = signal;
}
// member of Responder to register sig int handler
-void
-Responder::register_stop_signal_handler()
+void Responder::register_stop_signal_handler()
{
std::signal(SIGINT, &sig_int_handler);
}
// For ncurses. Print everything in stream to screen
-void
-Responder::FLUSH_SCREEN()
+void Responder::FLUSH_SCREEN()
{
printw(_ss.str().c_str());
refresh();
@@ -67,13 +62,12 @@ Responder::FLUSH_SCREEN()
}
// Like FLUSH_SCREEN but with new line
-void
-Responder::FLUSH_SCREEN_NL()
+void Responder::FLUSH_SCREEN_NL()
{
do {
int y, x;
getyx(_window, y, x);
- if (x > 0){
+ if (x > 0) {
printw("\n");
y++;
}
@@ -82,33 +76,39 @@ Responder::FLUSH_SCREEN_NL()
}
// Constructor
-Responder::Responder( Options& opt)
- : _opt(opt),
- _stats_filename(opt.stats_filename),
- _delay(opt.delay),
- _samps_per_packet(opt.samps_per_packet),
- _delay_step(opt.delay_step),
- _simulate_frequency(opt.simulate_frequency),
- _allow_late_bursts(opt.allow_late_bursts),
- _no_delay(opt.no_delay),
- //Initialize atributes not given by Options
- _num_total_samps(0), // printed on exit
- _overruns(0), // printed on exit
- _max_success(0), // < 0 --> write results to file
- _return_code(RETCODE_OK),
- _stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS),
- _timeout_burst_count(0),
- _timeout_eob_count(0),
- _y_delay_pos(-1),
- _x_delay_pos(-1), // Remember the cursor position of delay line.
+Responder::Responder(Options& opt)
+ : _opt(opt)
+ , _stats_filename(opt.stats_filename)
+ , _delay(opt.delay)
+ , _samps_per_packet(opt.samps_per_packet)
+ , _delay_step(opt.delay_step)
+ , _simulate_frequency(opt.simulate_frequency)
+ , _allow_late_bursts(opt.allow_late_bursts)
+ , _no_delay(opt.no_delay)
+ ,
+ // Initialize atributes not given by Options
+ _num_total_samps(0)
+ , // printed on exit
+ _overruns(0)
+ , // printed on exit
+ _max_success(0)
+ , // < 0 --> write results to file
+ _return_code(RETCODE_OK)
+ , _stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS)
+ , _timeout_burst_count(0)
+ , _timeout_eob_count(0)
+ , _y_delay_pos(-1)
+ , _x_delay_pos(-1)
+ , // Remember the cursor position of delay line.
_last_overrun_count(0)
{
- time( &_dbginfo.start_time ); // for debugging
+ time(&_dbginfo.start_time); // for debugging
// Disable logging to console
uhd::log::set_console_level(uhd::log::off);
- if (uhd::set_thread_priority_safe(_opt.rt_priority, _opt.realtime) == false) // try to set realtime scheduling
+ if (uhd::set_thread_priority_safe(_opt.rt_priority, _opt.realtime)
+ == false) // try to set realtime scheduling
{
cerr << "Failed to set real-time" << endl;
}
@@ -120,16 +120,12 @@ Responder::Responder( Options& opt)
create_ncurses_window();
print_create_usrp_msg();
- try
- {
+ try {
_usrp = create_usrp_device();
- }
- catch (const std::runtime_error& e)
- {
- print_msg(e.what() );
+ } catch (const std::runtime_error& e) {
+ print_msg(e.what());
_return_code = RETCODE_RUNTIME_ERROR;
- }
- catch(...){
+ } catch (...) {
print_msg("unhandled ERROR");
_return_code = RETCODE_UNKNOWN_EXCEPTION;
print_msg_and_wait("create USRP device failed!\nPress key to abort test...");
@@ -141,12 +137,10 @@ Responder::Responder( Options& opt)
// ensure that filename is set
string test_id = _usrp->get_mboard_name();
- if (set_stats_filename(test_id) )
- {
+ if (set_stats_filename(test_id)) {
_return_code = RETCODE_BAD_ARGS; // make sure run() does return!
FLUSH_SCREEN();
- if (_opt.batch_mode == false)
- {
+ if (_opt.batch_mode == false) {
print_msg_and_wait("Press any key to end...");
}
return;
@@ -156,20 +150,19 @@ Responder::Responder( Options& opt)
register_stop_signal_handler();
}
-int
-Responder::calculate_dependent_values()
+int Responder::calculate_dependent_values()
{
- _response_length = _opt.response_length();
- _init_delay_count = (int64_t)(_opt.sample_rate * _opt.init_delay);
- _dc_offset_countdown = (int64_t)(_opt.sample_rate * _opt.dc_offset_delay);
+ _response_length = _opt.response_length();
+ _init_delay_count = (int64_t)(_opt.sample_rate * _opt.init_delay);
+ _dc_offset_countdown = (int64_t)(_opt.sample_rate * _opt.dc_offset_delay);
_level_calibration_countdown = (int64_t)_opt.level_calibration_count();
- _original_simulate_duration = _simulate_duration = _opt.simulate_duration(_simulate_frequency);
+ _original_simulate_duration = _simulate_duration =
+ _opt.simulate_duration(_simulate_frequency);
- if (_simulate_duration > 0)
- {
+ if (_simulate_duration > 0) {
// Skip settling period and calibration
- _init_delay_count = 0;
- _dc_offset_countdown = 0;
+ _init_delay_count = 0;
+ _dc_offset_countdown = 0;
_level_calibration_countdown = 0;
double highest_delay = 0.0;
@@ -179,70 +172,78 @@ Responder::calculate_dependent_values()
highest_delay = _delay;
uint64_t highest_delay_samples = _opt.highest_delay_samples(highest_delay);
- if ((highest_delay_samples + _response_length + _opt.flush_count) > _simulate_duration)
- {
- if (_opt.adjust_simulation_rate) // This is now done DURING the simulation based on active delay
+ if ((highest_delay_samples + _response_length + _opt.flush_count)
+ > _simulate_duration) {
+ if (_opt.adjust_simulation_rate) // This is now done DURING the simulation
+ // based on active delay
{
//_simulate_frequency = max_possible_rate;
- //_simulate_duration = (uint64_t)((double)sample_rate / _simulate_frequency);
- }
- else
- {
- cerr << boost::format("Highest delay and response duration will exceed the pulse simulation rate (%ld + %ld > %ld samples)") % highest_delay_samples % _response_length % _simulate_duration << endl;
- int max_possible_rate = (int) get_max_possible_frequency(highest_delay_samples, _response_length);
- double max_possible_delay = (double)(_simulate_duration - (_response_length + _opt.flush_count)) / (double)_opt.sample_rate;
- cerr << boost::format("Simulation rate must be less than %i Hz, or maximum delay must be less than %f s") % max_possible_rate % max_possible_delay << endl;
+ //_simulate_duration = (uint64_t)((double)sample_rate /
+ //_simulate_frequency);
+ } else {
+ cerr << boost::format(
+ "Highest delay and response duration will exceed the pulse "
+ "simulation rate (%ld + %ld > %ld samples)")
+ % highest_delay_samples % _response_length
+ % _simulate_duration
+ << endl;
+ int max_possible_rate = (int)get_max_possible_frequency(
+ highest_delay_samples, _response_length);
+ double max_possible_delay =
+ (double)(_simulate_duration - (_response_length + _opt.flush_count))
+ / (double)_opt.sample_rate;
+ cerr << boost::format("Simulation rate must be less than %i Hz, or "
+ "maximum delay must be less than %f s")
+ % max_possible_rate % max_possible_delay
+ << endl;
if (_opt.ignore_simulation_check == 0)
return RETCODE_BAD_ARGS;
}
}
- }
- else
- {
- boost::format fmt("Simulation frequency too high (%f Hz with sample_rate %f Msps)");
- fmt % _simulate_frequency % (_opt.sample_rate/1e6);
+ } else {
+ boost::format fmt(
+ "Simulation frequency too high (%f Hz with sample_rate %f Msps)");
+ fmt % _simulate_frequency % (_opt.sample_rate / 1e6);
cerr << fmt << endl;
return RETCODE_BAD_ARGS;
}
- if (_opt.test_iterations > 0) // Force certain settings during test mode
+ if (_opt.test_iterations > 0) // Force certain settings during test mode
{
- _no_delay = false;
+ _no_delay = false;
_allow_late_bursts = false;
- _delay = _opt.delay_min;
+ _delay = _opt.delay_min;
}
return RETCODE_OK; // default return code
}
// print test title to ncurses window
-void
-Responder::print_test_title()
+void Responder::print_test_title()
{
- if (_opt.test_title.empty() == false)
- {
+ if (_opt.test_title.empty() == false) {
std::string title(_opt.test_title);
boost::replace_all(title, "%", "%%");
print_msg(title + "\n");
}
}
-void
-Responder::print_usrp_status()
+void Responder::print_usrp_status()
{
std::string msg;
- msg += (boost::format("Using device:\n%s\n") % _usrp->get_pp_string() ).str();
- msg += (boost::format("Setting RX rate: %f Msps\n") % (_opt.sample_rate/1e6)).str();
- msg += (boost::format("Actual RX rate: %f Msps\n") % (_usrp->get_rx_rate()/1e6) ).str();
- msg += (boost::format("Setting TX rate: %f Msps\n") % (_opt.sample_rate/1e6) ).str();
- msg += (boost::format("Actual TX rate: %f Msps") % (_usrp->get_tx_rate()/1e6) ).str();
+ msg += (boost::format("Using device:\n%s\n") % _usrp->get_pp_string()).str();
+ msg += (boost::format("Setting RX rate: %f Msps\n") % (_opt.sample_rate / 1e6)).str();
+ msg += (boost::format("Actual RX rate: %f Msps\n") % (_usrp->get_rx_rate() / 1e6))
+ .str();
+ msg += (boost::format("Setting TX rate: %f Msps\n") % (_opt.sample_rate / 1e6)).str();
+ msg +=
+ (boost::format("Actual TX rate: %f Msps") % (_usrp->get_tx_rate() / 1e6)).str();
print_msg(msg);
print_tx_stream_status();
print_rx_stream_status();
}
-void
-Responder::print_test_parameters()
+void Responder::print_test_parameters()
{
// Some status output shoud be printed here!
size_t rx_max_num_samps = _rx_stream->get_max_num_samps();
@@ -250,52 +251,58 @@ Responder::print_test_parameters()
std::string msg;
msg += (boost::format("Samples per buffer: %d\n") % _opt.samps_per_buff).str();
- msg += (boost::format("Maximum number of samples: RX = %d, TX = %d\n") % rx_max_num_samps % tx_max_num_samps).str();
- msg += (boost::format("Response length: %ld samples (%f us)") % _response_length % (_opt.response_duration * 1e6) ).str();
+ msg += (boost::format("Maximum number of samples: RX = %d, TX = %d\n")
+ % rx_max_num_samps % tx_max_num_samps)
+ .str();
+ msg += (boost::format("Response length: %ld samples (%f us)") % _response_length
+ % (_opt.response_duration * 1e6))
+ .str();
if (_simulate_duration > 0)
- msg += (boost::format("\nSimulating pulses at %f Hz (every %ld samples)") % _simulate_frequency % _simulate_duration ).str();
+ msg += (boost::format("\nSimulating pulses at %f Hz (every %ld samples)")
+ % _simulate_frequency % _simulate_duration)
+ .str();
- if (_opt.test_iterations > 0)
- {
- msg += (boost::format("\nTest coverage: %f -> %f (%f steps)") % _opt.delay_min % _opt.delay_max % _opt.delay_step ).str();
+ if (_opt.test_iterations > 0) {
+ msg += (boost::format("\nTest coverage: %f -> %f (%f steps)") % _opt.delay_min
+ % _opt.delay_max % _opt.delay_step)
+ .str();
if (_opt.end_test_after_success_count > 0)
- msg += (boost::format("\nTesting will end after %d successful delays") % _opt.end_test_after_success_count ).str();
+ msg += (boost::format("\nTesting will end after %d successful delays")
+ % _opt.end_test_after_success_count)
+ .str();
}
- if ((_dc_offset_countdown == 0) && (_simulate_frequency == 0.0))
- {
+ if ((_dc_offset_countdown == 0) && (_simulate_frequency == 0.0)) {
msg += "\nDC offset disabled";
}
print_msg(msg);
}
-// e.g. B200 doesn't support this command. Check if possible and only set rx_dc_offset if available
-void
-Responder::set_usrp_rx_dc_offset(uhd::usrp::multi_usrp::sptr usrp, bool ena)
+// e.g. B200 doesn't support this command. Check if possible and only set rx_dc_offset if
+// available
+void Responder::set_usrp_rx_dc_offset(uhd::usrp::multi_usrp::sptr usrp, bool ena)
{
uhd::property_tree::sptr tree = usrp->get_device()->get_tree();
// FIXME: Path needs to be build in a programmatic way.
- bool dc_offset_exists = tree->exists( uhd::fs_path("/mboards/0/rx_frontends/A/dc_offset") );
- if(dc_offset_exists)
- {
+ bool dc_offset_exists =
+ tree->exists(uhd::fs_path("/mboards/0/rx_frontends/A/dc_offset"));
+ if (dc_offset_exists) {
usrp->set_rx_dc_offset(ena);
}
}
-void
-Responder::print_create_usrp_msg()
+void Responder::print_create_usrp_msg()
{
std::string msg("Creating the USRP device");
if (_opt.device_args.empty() == false)
- msg.append( (boost::format(" with args \"%s\"") % _opt.device_args ).str() );
+ msg.append((boost::format(" with args \"%s\"") % _opt.device_args).str());
msg.append("...");
print_msg(msg);
}
-uhd::usrp::multi_usrp::sptr
-Responder::create_usrp_device()
+uhd::usrp::multi_usrp::sptr Responder::create_usrp_device()
{
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(_opt.device_args);
usrp->set_rx_rate(_opt.sample_rate); // set the rx sample rate
@@ -307,22 +314,19 @@ Responder::create_usrp_device()
return usrp;
}
-uhd::rx_streamer::sptr
-Responder::create_rx_streamer(uhd::usrp::multi_usrp::sptr usrp)
+uhd::rx_streamer::sptr Responder::create_rx_streamer(uhd::usrp::multi_usrp::sptr usrp)
{
- uhd::stream_args_t stream_args("fc32"); //complex floats
- if (_samps_per_packet > 0)
- {
+ uhd::stream_args_t stream_args("fc32"); // complex floats
+ if (_samps_per_packet > 0) {
stream_args.args["spp"] = str(boost::format("%d") % _samps_per_packet);
}
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
- _samps_per_packet = rx_stream->get_max_num_samps();
+ _samps_per_packet = rx_stream->get_max_num_samps();
return rx_stream;
}
-void
-Responder::print_rx_stream_status()
+void Responder::print_rx_stream_status()
{
std::string msg;
msg += (boost::format("Samples per packet set to: %d\n") % _samps_per_packet).str();
@@ -332,27 +336,22 @@ Responder::print_rx_stream_status()
print_msg(msg);
}
-uhd::tx_streamer::sptr
-Responder::create_tx_streamer(uhd::usrp::multi_usrp::sptr usrp)
+uhd::tx_streamer::sptr Responder::create_tx_streamer(uhd::usrp::multi_usrp::sptr usrp)
{
- uhd::stream_args_t tx_stream_args("fc32"); //complex floats
- if (_allow_late_bursts == false)
- {
+ uhd::stream_args_t tx_stream_args("fc32"); // complex floats
+ if (_allow_late_bursts == false) {
tx_stream_args.args["underflow_policy"] = "next_burst";
}
uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(tx_stream_args);
return tx_stream;
}
-void
-Responder::print_tx_stream_status()
+void Responder::print_tx_stream_status()
{
std::string msg;
- if (_allow_late_bursts == false)
- {
+ if (_allow_late_bursts == false) {
msg += "Underflow policy set to drop late bursts";
- }
- else
+ } else
msg += "Underflow policy set to allow late bursts";
if (_opt.skip_send)
msg += "\nNOT sending bursts";
@@ -362,35 +361,36 @@ Responder::print_tx_stream_status()
}
// handle transmit timeouts properly
-void
-Responder::handle_tx_timeout(int burst, int eob)
+void Responder::handle_tx_timeout(int burst, int eob)
{
- if(_timeout_burst_count == 0 && _timeout_eob_count == 0)
- time( &_dbginfo.first_send_timeout );
+ if (_timeout_burst_count == 0 && _timeout_eob_count == 0)
+ time(&_dbginfo.first_send_timeout);
_timeout_burst_count += burst;
_timeout_eob_count += eob;
print_timeout_msg();
}
-void
-Responder::print_timeout_msg()
+void Responder::print_timeout_msg()
{
- move(_y_delay_pos+3, _x_delay_pos);
- print_msg( (boost::format("Send timeout, burst_count = %ld\teob_count = %ld\n") % _timeout_burst_count % _timeout_eob_count ).str() );
+ move(_y_delay_pos + 3, _x_delay_pos);
+ print_msg((boost::format("Send timeout, burst_count = %ld\teob_count = %ld\n")
+ % _timeout_burst_count % _timeout_eob_count)
+ .str());
}
uhd::tx_metadata_t Responder::get_tx_metadata(uhd::time_spec_t rx_time, size_t n)
{
uhd::tx_metadata_t tx_md;
tx_md.start_of_burst = true;
- tx_md.end_of_burst = false;
+ tx_md.end_of_burst = false;
if ((_opt.skip_eob == false) && (_opt.combine_eob)) {
tx_md.end_of_burst = true;
}
if (_no_delay == false) {
tx_md.has_time_spec = true;
- tx_md.time_spec = rx_time + uhd::time_spec_t(0, n, _opt.sample_rate) + uhd::time_spec_t(_delay);
+ tx_md.time_spec =
+ rx_time + uhd::time_spec_t(0, n, _opt.sample_rate) + uhd::time_spec_t(_delay);
} else {
tx_md.has_time_spec = false;
}
@@ -402,22 +402,25 @@ bool Responder::send_tx_burst(uhd::time_spec_t rx_time, size_t n)
if (_opt.skip_send == true) {
return false;
}
- //send a single packet
+ // send a single packet
uhd::tx_metadata_t tx_md = get_tx_metadata(rx_time, n);
- const size_t length_to_send = _response_length + (_opt.flush_count - (tx_md.end_of_burst ? 0 : 1));
+ const size_t length_to_send =
+ _response_length + (_opt.flush_count - (tx_md.end_of_burst ? 0 : 1));
- size_t num_tx_samps = _tx_stream->send(_pResponse, length_to_send, tx_md, _opt.timeout); // send pulse!
+ size_t num_tx_samps =
+ _tx_stream->send(_pResponse, length_to_send, tx_md, _opt.timeout); // send pulse!
if (num_tx_samps < length_to_send) {
handle_tx_timeout(1, 0);
}
if (_opt.skip_eob == false && _opt.combine_eob == false) {
tx_md.start_of_burst = false;
- tx_md.end_of_burst = true;
- tx_md.has_time_spec = false;
+ tx_md.end_of_burst = true;
+ tx_md.has_time_spec = false;
const size_t eob_length_to_send = 1;
- size_t eob_num_tx_samps = _tx_stream->send(&_pResponse[length_to_send], eob_length_to_send, tx_md); // send EOB
+ size_t eob_num_tx_samps = _tx_stream->send(
+ &_pResponse[length_to_send], eob_length_to_send, tx_md); // send EOB
if (eob_num_tx_samps < eob_length_to_send) {
handle_tx_timeout(0, 1);
}
@@ -427,61 +430,69 @@ bool Responder::send_tx_burst(uhd::time_spec_t rx_time, size_t n)
}
// ensure that stats_filename is not empty.
-bool
-Responder::set_stats_filename(string test_id)
+bool Responder::set_stats_filename(string test_id)
{
- if (_stats_filename.empty())
- {
+ if (_stats_filename.empty()) {
string file_friendly_test_id(test_id);
boost::replace_all(file_friendly_test_id, " ", "_");
- boost::format fmt = boost::format("%slatency-stats.id_%s-rate_%i-spb_%i-spp_%i%s") % _opt.stats_filename_prefix % file_friendly_test_id % (int)_opt.sample_rate % _opt.samps_per_buff % _samps_per_packet % _opt.stats_filename_suffix;
- _stats_filename = str(fmt) + ".txt";
+ boost::format fmt = boost::format("%slatency-stats.id_%s-rate_%i-spb_%i-spp_%i%s")
+ % _opt.stats_filename_prefix % file_friendly_test_id
+ % (int)_opt.sample_rate % _opt.samps_per_buff
+ % _samps_per_packet % _opt.stats_filename_suffix;
+ _stats_filename = str(fmt) + ".txt";
_stats_log_filename = str(fmt) + ".log";
}
return check_for_existing_results();
}
// Check if results file can be overwritten
-bool
-Responder::check_for_existing_results()
+bool Responder::check_for_existing_results()
{
bool ex = false;
- if ((_opt.skip_if_results_exist) && (boost::filesystem::exists(_stats_filename)))
- {
- print_msg( (boost::format("Skipping invocation as results file already exists: %s") % _stats_filename).str() );
+ if ((_opt.skip_if_results_exist) && (boost::filesystem::exists(_stats_filename))) {
+ print_msg((boost::format("Skipping invocation as results file already exists: %s")
+ % _stats_filename)
+ .str());
ex = true;
}
return ex;
}
// Allocate an array with a burst response
-float*
-Responder::alloc_response_buffer_with_data(uint64_t response_length) // flush_count, output_value, output_scale are const
+float* Responder::alloc_response_buffer_with_data(
+ uint64_t response_length) // flush_count, output_value, output_scale are const
{
float* pResponse = new float[(response_length + _opt.flush_count) * 2];
for (unsigned int i = 0; i < (response_length * 2); ++i)
pResponse[i] = _opt.output_value * _opt.output_scale;
- for (unsigned int i = (response_length * 2); i < ((response_length + _opt.flush_count) * 2); ++i)
+ for (unsigned int i = (response_length * 2);
+ i < ((response_length + _opt.flush_count) * 2);
+ ++i)
pResponse[i] = 0.0f;
return pResponse;
}
// print test parameters for current delay time
-void
-Responder::print_formatted_delay_line(const uint64_t simulate_duration, const uint64_t old_simulate_duration, const STATS& statsPrev, const double delay, const double simulate_frequency)
+void Responder::print_formatted_delay_line(const uint64_t simulate_duration,
+ const uint64_t old_simulate_duration,
+ const STATS& statsPrev,
+ const double delay,
+ const double simulate_frequency)
{
- if(_y_delay_pos < 0 || _x_delay_pos < 0){ // make sure it gets printed to the same position everytime
+ if (_y_delay_pos < 0
+ || _x_delay_pos < 0) { // make sure it gets printed to the same position everytime
getyx(_window, _y_delay_pos, _x_delay_pos);
}
double score = 0.0;
if (statsPrev.detected > 0)
- score = 100.0 * (double)(statsPrev.detected - statsPrev.missed) / (double)statsPrev.detected;
+ score = 100.0 * (double)(statsPrev.detected - statsPrev.missed)
+ / (double)statsPrev.detected;
std::string form;
boost::format fmt0("Delay now: %.6f (previous delay %.6f scored %.1f%% [%ld / %ld])");
- fmt0 % delay % statsPrev.delay % score % (statsPrev.detected - statsPrev.missed) % statsPrev.detected;
+ fmt0 % delay % statsPrev.delay % score % (statsPrev.detected - statsPrev.missed)
+ % statsPrev.detected;
form += fmt0.str();
- if (old_simulate_duration != simulate_duration)
- {
+ if (old_simulate_duration != simulate_duration) {
boost::format fmt1(" [Simulation rate now: %.1f Hz (%ld samples)]");
fmt1 % simulate_frequency % simulate_duration;
form = form + fmt1.str();
@@ -491,8 +502,7 @@ Responder::print_formatted_delay_line(const uint64_t simulate_duration, const ui
}
// print message and wait for user interaction
-void
-Responder::print_msg_and_wait(std::string msg)
+void Responder::print_msg_and_wait(std::string msg)
{
msg = "\n" + msg;
print_msg(msg);
@@ -502,114 +512,103 @@ Responder::print_msg_and_wait(std::string msg)
}
// print message to ncurses window
-void
-Responder::print_msg(std::string msg)
+void Responder::print_msg(std::string msg)
{
_ss << msg << endl;
FLUSH_SCREEN();
}
// Check if error occured during call to receive
-bool
-Responder::handle_rx_errors(uhd::rx_metadata_t::error_code_t err, size_t num_rx_samps)
+bool Responder::handle_rx_errors(
+ uhd::rx_metadata_t::error_code_t err, size_t num_rx_samps)
{
// handle errors
- if (err == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT)
- {
- std::string msg = (boost::format("Timeout while streaming (received %ld samples)") % _num_total_samps).str();
+ if (err == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT) {
+ std::string msg = (boost::format("Timeout while streaming (received %ld samples)")
+ % _num_total_samps)
+ .str();
print_error_msg(msg);
_return_code = RETCODE_RECEIVE_TIMEOUT;
return true;
- }
- else if (err == uhd::rx_metadata_t::ERROR_CODE_BAD_PACKET)
- {
- std::string msg = (boost::format("Bad packet (received %ld samples)") % _num_total_samps).str();
+ } else if (err == uhd::rx_metadata_t::ERROR_CODE_BAD_PACKET) {
+ std::string msg =
+ (boost::format("Bad packet (received %ld samples)") % _num_total_samps).str();
print_error_msg(msg);
_return_code = RETCODE_BAD_PACKET;
return true;
- }
- else if ((num_rx_samps == 0) && (err == uhd::rx_metadata_t::ERROR_CODE_NONE))
- {
+ } else if ((num_rx_samps == 0) && (err == uhd::rx_metadata_t::ERROR_CODE_NONE)) {
print_error_msg("Received no samples");
_return_code = RETCODE_RECEIVE_FAILED;
return true;
- }
- else if (err == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW)
- {
+ } else if (err == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW) {
++_overruns;
print_overrun_msg(); // update overrun info on console.
- }
- else if (err != uhd::rx_metadata_t::ERROR_CODE_NONE)
- {
- throw std::runtime_error(str(boost::format(
- "Unexpected error code 0x%x"
- ) % err));
+ } else if (err != uhd::rx_metadata_t::ERROR_CODE_NONE) {
+ throw std::runtime_error(str(boost::format("Unexpected error code 0x%x") % err));
}
return false;
}
// print overrun status message.
-void
-Responder::print_overrun_msg()
+void Responder::print_overrun_msg()
{
- if (_num_total_samps > (_last_overrun_count + (uint64_t)(_opt.sample_rate * 1.0)))
- {
+ if (_num_total_samps > (_last_overrun_count + (uint64_t)(_opt.sample_rate * 1.0))) {
int y, x, y_max, x_max;
getyx(_window, y, x);
getmaxyx(_window, y_max, x_max);
- move(y_max-1, 0);
- print_msg( (boost::format("Overruns: %d") % _overruns).str() );
+ move(y_max - 1, 0);
+ print_msg((boost::format("Overruns: %d") % _overruns).str());
move(y, x);
_last_overrun_count = _num_total_samps;
}
}
// print error message on last line of ncurses window
-void
-Responder::print_error_msg(std::string msg)
+void Responder::print_error_msg(std::string msg)
{
int y, x, y_max, x_max;
getyx(_window, y, x);
getmaxyx(_window, y_max, x_max);
- move(y_max-2, 0);
+ move(y_max - 2, 0);
clrtoeol();
print_msg(msg);
move(y, x);
}
// calculate simulate frequency
-double
-Responder::get_simulate_frequency(double delay, uint64_t response_length, uint64_t original_simulate_duration)
+double Responder::get_simulate_frequency(
+ double delay, uint64_t response_length, uint64_t original_simulate_duration)
{
- double simulate_frequency = _simulate_frequency;
+ double simulate_frequency = _simulate_frequency;
uint64_t highest_delay_samples = _opt.highest_delay_samples(delay);
- if ((_opt.optimize_simulation_rate) ||
- ((highest_delay_samples + response_length + _opt.flush_count) > original_simulate_duration))
- {
- simulate_frequency = get_max_possible_frequency(highest_delay_samples, response_length);
+ if ((_opt.optimize_simulation_rate)
+ || ((highest_delay_samples + response_length + _opt.flush_count)
+ > original_simulate_duration)) {
+ simulate_frequency =
+ get_max_possible_frequency(highest_delay_samples, response_length);
}
return simulate_frequency;
}
// calculate max possible simulate frequency
-double
-Responder::get_max_possible_frequency(uint64_t highest_delay_samples, uint64_t response_length) // only 2 args, others are all const!
+double Responder::get_max_possible_frequency(uint64_t highest_delay_samples,
+ uint64_t response_length) // only 2 args, others are all const!
{
- return std::floor((double)_opt.sample_rate / (double)(highest_delay_samples + response_length + _opt.flush_count + _opt.optimize_padding));
+ return std::floor((double)_opt.sample_rate
+ / (double)(highest_delay_samples + response_length
+ + _opt.flush_count + _opt.optimize_padding));
}
// Check if conditions to finish test are met.
-bool
-Responder::test_finished(size_t success_count)
+bool Responder::test_finished(size_t success_count)
{
- if (success_count == _opt.end_test_after_success_count)
- {
- print_msg( (boost::format("\nTest complete after %d successes.") % success_count).str() );
+ if (success_count == _opt.end_test_after_success_count) {
+ print_msg(
+ (boost::format("\nTest complete after %d successes.") % success_count).str());
return true;
}
- if (((_opt.delay_min <= _opt.delay_max) && (_delay >= _opt.delay_max)) ||
- ((_opt.delay_min > _opt.delay_max) && (_delay <= _opt.delay_max)))
- {
+ if (((_opt.delay_min <= _opt.delay_max) && (_delay >= _opt.delay_max))
+ || ((_opt.delay_min > _opt.delay_max) && (_delay <= _opt.delay_max))) {
print_msg("\nTest complete.");
return true;
}
@@ -617,45 +616,38 @@ Responder::test_finished(size_t success_count)
}
// handle keyboard input in interactive mode
-bool
-Responder::handle_interactive_control()
+bool Responder::handle_interactive_control()
{
std::string msg = "";
- int c = wgetch(_window);
- if (c > -1)
- {
+ int c = wgetch(_window);
+ if (c > -1) {
// UP/DOWN Keys control delay step width
- if ((c == KEY_DOWN) || (c == KEY_UP))
- {
+ if ((c == KEY_DOWN) || (c == KEY_UP)) {
double dMag = log10(_delay_step);
- int iMag = (int)floor(dMag);
+ int iMag = (int)floor(dMag);
iMag += ((c == KEY_UP) ? 1 : -1);
_delay_step = pow(10.0, iMag);
- msg += (boost::format("Step: %f") % _delay_step ).str();
+ msg += (boost::format("Step: %f") % _delay_step).str();
}
// LEFT/RIGHT Keys control absolute delay length
- if ((c == KEY_LEFT) || (c == KEY_RIGHT))
- {
+ if ((c == KEY_LEFT) || (c == KEY_RIGHT)) {
double step = _delay_step * ((c == KEY_RIGHT) ? 1 : -1);
if ((_delay + step) >= 0.0)
_delay += step;
msg += (boost::format("Delay: %f") % _delay).str();
}
// Enable/disable fixed delay <--> best effort mode
- if (c == 'd')
- {
+ if (c == 'd') {
_no_delay = !_no_delay;
if (_no_delay)
msg += "Delay disabled (best effort)";
else
msg += (boost::format("Delay: %f") % _delay).str();
- }
- else if (c == 'q') // exit test
+ } else if (c == 'q') // exit test
{
return true; // signal test to stop
- }
- else if (c == 'l') // change late burst policy
+ } else if (c == 'l') // change late burst policy
{
_allow_late_bursts = !_allow_late_bursts;
@@ -670,16 +662,13 @@ Responder::handle_interactive_control()
}
// print updated interactive control value
-void
-Responder::print_interactive_msg(std::string msg)
+void Responder::print_interactive_msg(std::string msg)
{
- if(msg != "")
- {
+ if (msg != "") {
// move cursor back to beginning of line
int y, x;
getyx(_window, y, x);
- if (x > 0)
- {
+ if (x > 0) {
move(y, 0);
clrtoeol();
}
@@ -689,36 +678,31 @@ Responder::print_interactive_msg(std::string msg)
}
// check if transmit burst is late
-bool
-Responder::tx_burst_is_late()
+bool Responder::tx_burst_is_late()
{
uhd::async_metadata_t async_md;
- if (_usrp->get_device()->recv_async_msg(async_md, 0))
- {
- if (async_md.event_code == uhd::async_metadata_t::EVENT_CODE_TIME_ERROR)
- {
+ if (_usrp->get_device()->recv_async_msg(async_md, 0)) {
+ if (async_md.event_code == uhd::async_metadata_t::EVENT_CODE_TIME_ERROR) {
return true;
}
}
return false;
}
-void
-Responder::create_ncurses_window()
+void Responder::create_ncurses_window()
{
_window = initscr();
- cbreak(); // Unbuffered key input, except for signals (cf. 'raw')
+ cbreak(); // Unbuffered key input, except for signals (cf. 'raw')
noecho();
nonl();
intrflush(_window, FALSE);
- keypad(_window, TRUE); // Enable function keys, arrow keys, ...
+ keypad(_window, TRUE); // Enable function keys, arrow keys, ...
nodelay(_window, 0);
timeout(0);
}
// print all fixed test parameters
-void
-Responder::print_init_test_status()
+void Responder::print_init_test_status()
{
// Clear the window and write new data.
erase();
@@ -740,30 +724,29 @@ Responder::print_init_test_status()
}
// in interactive mode with second usrp sending bursts. calibrate trigger level
-float
-Responder::calibrate_usrp_for_test_run()
+float Responder::calibrate_usrp_for_test_run()
{
bool calibration_finished = false;
- float threshold = 0.0f;
+ float threshold = 0.0f;
double ave_high = 0, ave_low = 0;
int ave_high_count = 0, ave_low_count = 0;
- bool level_calibration_stage_2 = false; // 1. stage = rough calibration ; 2. stage = fine calibration
+ bool level_calibration_stage_2 =
+ false; // 1. stage = rough calibration ; 2. stage = fine calibration
- std::vector<std::complex<float> > buff(_opt.samps_per_buff);
- while (not s_stop_signal_called && !calibration_finished && _return_code == RETCODE_OK)
- {
+ std::vector<std::complex<float>> buff(_opt.samps_per_buff);
+ while (
+ not s_stop_signal_called && !calibration_finished && _return_code == RETCODE_OK) {
uhd::rx_metadata_t rx_md;
- size_t num_rx_samps = _rx_stream->recv(&buff.front(), buff.size(), rx_md, _opt.timeout);
+ size_t num_rx_samps =
+ _rx_stream->recv(&buff.front(), buff.size(), rx_md, _opt.timeout);
// handle errors
- if(handle_rx_errors(rx_md.error_code, num_rx_samps) )
- {
+ if (handle_rx_errors(rx_md.error_code, num_rx_samps)) {
break;
}
// Wait for USRP for DC offset calibration
- if (_dc_offset_countdown > 0)
- {
+ if (_dc_offset_countdown > 0) {
_dc_offset_countdown -= (int64_t)num_rx_samps;
if (_dc_offset_countdown > 0)
continue;
@@ -772,8 +755,7 @@ Responder::calibrate_usrp_for_test_run()
}
// Wait for certain time to minimize POWER UP effects
- if (_init_delay_count > 0)
- {
+ if (_init_delay_count > 0) {
_init_delay_count -= (int64_t)num_rx_samps;
if (_init_delay_count > 0)
continue;
@@ -782,48 +764,35 @@ Responder::calibrate_usrp_for_test_run()
////////////////////////////////////////////////////////////
// detect falling edges and calibrate detection values
- if (_level_calibration_countdown > 0)
- {
- if (level_calibration_stage_2 == false)
- {
+ if (_level_calibration_countdown > 0) {
+ if (level_calibration_stage_2 == false) {
float average = 0.0f;
for (size_t n = 0; n < num_rx_samps; n++)
average += buff[n].real() * _opt.invert;
average /= (float)num_rx_samps;
- if (ave_low_count == 0)
- {
+ if (ave_low_count == 0) {
ave_low = average;
++ave_low_count;
- }
- else if (average < ave_low)
- {
+ } else if (average < ave_low) {
ave_low = average;
++ave_low_count;
}
- if (ave_high_count == 0)
- {
+ if (ave_high_count == 0) {
ave_high = average;
++ave_high_count;
- }
- else if (average > ave_high)
- {
+ } else if (average > ave_high) {
ave_high = average;
++ave_high_count;
}
- }
- else {
- for (size_t n = 0; n < num_rx_samps; n++)
- {
+ } else {
+ for (size_t n = 0; n < num_rx_samps; n++) {
float f = buff[n].real() * _opt.invert;
- if (f >= threshold)
- {
+ if (f >= threshold) {
ave_high += f;
ave_high_count++;
- }
- else
- {
+ } else {
ave_low += f;
ave_low_count++;
}
@@ -832,43 +801,51 @@ Responder::calibrate_usrp_for_test_run()
_level_calibration_countdown -= (int64_t)num_rx_samps;
- if (_level_calibration_countdown <= 0)
- {
- if (level_calibration_stage_2 == false)
- {
- level_calibration_stage_2 = true;
+ if (_level_calibration_countdown <= 0) {
+ if (level_calibration_stage_2 == false) {
+ level_calibration_stage_2 = true;
_level_calibration_countdown = _opt.level_calibration_count();
- threshold = ave_low + ((ave_high - ave_low) / 2.0);
- print_msg( (boost::format("Phase #1: Ave low: %.3f (#%d), ave high: %.3f (#%d), threshold: %.3f") % ave_low % ave_low_count % ave_high % ave_high_count % threshold).str() );
+ threshold = ave_low + ((ave_high - ave_low) / 2.0);
+ print_msg((boost::format("Phase #1: Ave low: %.3f (#%d), ave high: "
+ "%.3f (#%d), threshold: %.3f")
+ % ave_low % ave_low_count % ave_high % ave_high_count
+ % threshold)
+ .str());
ave_low_count = ave_high_count = 0;
ave_low = ave_high = 0.0f;
continue;
- }
- else
- {
+ } else {
ave_low /= (double)ave_low_count;
ave_high /= (double)ave_high_count;
threshold = ave_low + ((ave_high - ave_low) * _opt.trigger_level);
- print_msg( (boost::format("Phase #2: Ave low: %.3f (#%d), ave high: %.3f (#%d), threshold: %.3f\n") % ave_low % ave_low_count % ave_high % ave_high_count % threshold).str() );
-
- _stream_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS;
+ print_msg((boost::format("Phase #2: Ave low: %.3f (#%d), ave high: "
+ "%.3f (#%d), threshold: %.3f\n")
+ % ave_low % ave_low_count % ave_high % ave_high_count
+ % threshold)
+ .str());
+
+ _stream_cmd.stream_mode =
+ uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS;
_stream_cmd.stream_now = true;
_usrp->issue_stream_cmd(_stream_cmd);
double diff = std::abs(ave_high - ave_low);
- if (diff < _opt.pulse_detection_threshold)
- {
+ if (diff < _opt.pulse_detection_threshold) {
_return_code = RETCODE_BAD_ARGS;
- print_error_msg( (boost::format("Did not detect any pulses (difference %.6f < detection threshold %.6f)") % diff % _opt.pulse_detection_threshold).str() );
+ print_error_msg(
+ (boost::format("Did not detect any pulses (difference %.6f < "
+ "detection threshold %.6f)")
+ % diff % _opt.pulse_detection_threshold)
+ .str());
break;
}
- _stream_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS;
+ _stream_cmd.stream_mode =
+ uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS;
_stream_cmd.stream_now = true;
_usrp->issue_stream_cmd(_stream_cmd);
}
- }
- else
+ } else
continue;
} // calibration finished
calibration_finished = true;
@@ -877,86 +854,82 @@ Responder::calibrate_usrp_for_test_run()
}
// try to stop USRP properly after tests
-void
-Responder::stop_usrp_stream()
+void Responder::stop_usrp_stream()
{
- try
- {
- if (_usrp)
- {
+ try {
+ if (_usrp) {
_stream_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS;
- _stream_cmd.stream_now = true;
+ _stream_cmd.stream_now = true;
_usrp->issue_stream_cmd(_stream_cmd);
}
- }
- catch (...)
- {
+ } catch (...) {
//
}
}
// after each delay length update test parameters and print them
-void
-Responder::update_and_print_parameters(const STATS& statsPrev, const double delay)
+void Responder::update_and_print_parameters(const STATS& statsPrev, const double delay)
{
uint64_t old_simulate_duration = _simulate_duration;
- _simulate_frequency = get_simulate_frequency(delay, _response_length, _original_simulate_duration);
+ _simulate_frequency =
+ get_simulate_frequency(delay, _response_length, _original_simulate_duration);
_simulate_duration = _opt.simulate_duration(_simulate_frequency);
- print_formatted_delay_line(_simulate_duration, old_simulate_duration, statsPrev, delay, _simulate_frequency);
+ print_formatted_delay_line(
+ _simulate_duration, old_simulate_duration, statsPrev, delay, _simulate_frequency);
_timeout_burst_count = 0;
- _timeout_eob_count = 0;
+ _timeout_eob_count = 0;
}
// detect or simulate burst level.
-bool
-Responder::get_new_state(uint64_t total_samps, uint64_t simulate_duration, float val, float threshold)
+bool Responder::get_new_state(
+ uint64_t total_samps, uint64_t simulate_duration, float val, float threshold)
{
bool new_state = false;
if (simulate_duration > 0) // only simulated input bursts!
new_state = (((total_samps) % simulate_duration) == 0);
else
- new_state = (val >= threshold); // TODO: Just measure difference in fall
+ new_state = (val >= threshold); // TODO: Just measure difference in fall
return new_state;
}
// detect a pulse, respond to it and count number of pulses.
// statsCurrent holds parameters.
-uint64_t
-Responder::detect_respond_pulse_count(STATS &statsCurrent, std::vector<std::complex<float> > &buff, uint64_t trigger_count, size_t num_rx_samps, float threshold, uhd::time_spec_t rx_time)
+uint64_t Responder::detect_respond_pulse_count(STATS& statsCurrent,
+ std::vector<std::complex<float>>& buff,
+ uint64_t trigger_count,
+ size_t num_rx_samps,
+ float threshold,
+ uhd::time_spec_t rx_time)
{
// buff, threshold
bool input_state = false;
- for (size_t n = 0; n < num_rx_samps; n++)
- {
+ for (size_t n = 0; n < num_rx_samps; n++) {
float f = buff[n].real() * _opt.invert;
- bool new_state = get_new_state(_num_total_samps + n, _simulate_duration, f, threshold);
+ bool new_state =
+ get_new_state(_num_total_samps + n, _simulate_duration, f, threshold);
if ((new_state == false) && (input_state)) // == falling_edge
{
trigger_count++;
statsCurrent.detected++;
- if ((_opt.test_iterations > 0)
- && (_opt.skip_iterations > 0)
- && (statsCurrent.skipped == 0)
- && (_opt.skip_iterations == statsCurrent.detected))
- {
+ if ((_opt.test_iterations > 0) && (_opt.skip_iterations > 0)
+ && (statsCurrent.skipped == 0)
+ && (_opt.skip_iterations == statsCurrent.detected)) {
memset(&statsCurrent, 0x00, sizeof(STATS));
- statsCurrent.delay = _delay;
+ statsCurrent.delay = _delay;
statsCurrent.detected = 1;
- statsCurrent.skipped = _opt.skip_iterations;
+ statsCurrent.skipped = _opt.skip_iterations;
trigger_count = 1;
}
- if( !send_tx_burst(rx_time, n) )
- {
+ if (!send_tx_burst(rx_time, n)) {
statsCurrent.missed++;
}
- if(tx_burst_is_late() )
- {
+ if (tx_burst_is_late()) {
statsCurrent.missed++;
}
}
@@ -967,34 +940,33 @@ Responder::detect_respond_pulse_count(STATS &statsCurrent, std::vector<std::comp
}
// this is the actual "work" function. All the fun happens here
-void
-Responder::run_test(float threshold)
+void Responder::run_test(float threshold)
{
STATS statsCurrent; //, statsPrev;
memset(&statsCurrent, 0x00, sizeof(STATS));
- if (_opt.test_iterations > 0)
- {
+ if (_opt.test_iterations > 0) {
update_and_print_parameters(statsCurrent, _delay);
statsCurrent.delay = _opt.delay_min;
}
///////////////////////////////////////////////////////////////////////////
- uint64_t trigger_count = 0;
- size_t success_count = 0;
+ uint64_t trigger_count = 0;
+ size_t success_count = 0;
uint64_t num_total_samps_test = 0;
- std::vector<std::complex<float> > buff(_opt.samps_per_buff);
- while (not s_stop_signal_called && _return_code == RETCODE_OK)
- {
+ std::vector<std::complex<float>> buff(_opt.samps_per_buff);
+ while (not s_stop_signal_called && _return_code == RETCODE_OK) {
// get samples from rx stream.
uhd::rx_metadata_t rx_md;
- size_t num_rx_samps = _rx_stream->recv(&buff.front(), buff.size(), rx_md, _opt.timeout);
+ size_t num_rx_samps =
+ _rx_stream->recv(&buff.front(), buff.size(), rx_md, _opt.timeout);
// handle errors
- if(handle_rx_errors(rx_md.error_code, num_rx_samps) )
- {
+ if (handle_rx_errors(rx_md.error_code, num_rx_samps)) {
break;
}
- // detect falling edges, send respond pulse and check if response could be sent in time
- trigger_count = detect_respond_pulse_count(statsCurrent, buff, trigger_count, num_rx_samps, threshold, rx_md.time_spec);
+ // detect falling edges, send respond pulse and check if response could be sent in
+ // time
+ trigger_count = detect_respond_pulse_count(
+ statsCurrent, buff, trigger_count, num_rx_samps, threshold, rx_md.time_spec);
// increase counters for single test and overall test samples count.
_num_total_samps += num_rx_samps;
@@ -1003,40 +975,47 @@ Responder::run_test(float threshold)
// control section for interactive mode
if (_opt.test_iterations == 0) // == "interactive'
{
- if(handle_interactive_control() )
+ if (handle_interactive_control())
break;
}
// control section for test mode
if (_opt.test_iterations > 0) // == test mode / batch-mode
{
- int step_return = test_step_finished(trigger_count, num_total_samps_test, statsCurrent, success_count);
- if(step_return == -2) // == test is finished with all desired delay steps
+ int step_return = test_step_finished(
+ trigger_count, num_total_samps_test, statsCurrent, success_count);
+ if (step_return == -2) // == test is finished with all desired delay steps
break;
- else if(step_return == -1) // just continue test
+ else if (step_return == -1) // just continue test
continue;
else // test with one delay is finished
{
- success_count = (size_t) step_return;
- trigger_count = 0;
+ success_count = (size_t)step_return;
+ trigger_count = 0;
num_total_samps_test = 0;
- memset(&statsCurrent, 0x00, sizeof(STATS)); // reset current stats for next test iteration
+ memset(&statsCurrent,
+ 0x00,
+ sizeof(STATS)); // reset current stats for next test iteration
statsCurrent.delay = _delay;
}
} // end test mode control section
- }// exit outer loop after stop signal is called, test is finished or other break condition is met
+ } // exit outer loop after stop signal is called, test is finished or other break
+ // condition is met
if (s_stop_signal_called)
_return_code = RETCODE_MANUAL_ABORT;
}
// check if test with one specific delay is finished
-int
-Responder::test_step_finished(uint64_t trigger_count, uint64_t num_total_samps_test, STATS statsCurrent, size_t success_count)
+int Responder::test_step_finished(uint64_t trigger_count,
+ uint64_t num_total_samps_test,
+ STATS statsCurrent,
+ size_t success_count)
{
- if ( ((_opt.test_iterations_is_sample_count == false) && (trigger_count >= _opt.test_iterations)) ||
- ((_opt.test_iterations_is_sample_count) && (num_total_samps_test > _opt.test_iterations)) )
- {
+ if (((_opt.test_iterations_is_sample_count == false)
+ && (trigger_count >= _opt.test_iterations))
+ || ((_opt.test_iterations_is_sample_count)
+ && (num_total_samps_test > _opt.test_iterations))) {
add_stats_to_results(statsCurrent, _delay);
if (statsCurrent.missed == 0) // == NO late bursts
@@ -1044,7 +1023,7 @@ Responder::test_step_finished(uint64_t trigger_count, uint64_t num_total_samps_t
else
success_count = 0;
- if(test_finished(success_count) )
+ if (test_finished(success_count))
return -2; // test is completely finished
_delay += _delay_step; // increase delay by one step
@@ -1056,58 +1035,50 @@ Responder::test_step_finished(uint64_t trigger_count, uint64_t num_total_samps_t
}
// save test results
-void
-Responder::add_stats_to_results(STATS statsCurrent, double delay)
+void Responder::add_stats_to_results(STATS statsCurrent, double delay)
{
- _max_success = max(_max_success, (statsCurrent.detected - statsCurrent.missed)); // > 0 --> save results
- uint64_t key = (uint64_t)(delay * 1e6);
+ _max_success = max(_max_success,
+ (statsCurrent.detected - statsCurrent.missed)); // > 0 --> save results
+ uint64_t key = (uint64_t)(delay * 1e6);
_mapStats[key] = statsCurrent;
}
// run tests and handle errors
-int
-Responder::run()
+int Responder::run()
{
if (_return_code != RETCODE_OK)
return _return_code;
if (_opt.pause)
print_msg_and_wait("Press any key to begin...");
- time( &_dbginfo.start_time_test );
+ time(&_dbginfo.start_time_test);
// Put some info about the test on the console
print_init_test_status();
try {
- //setup streaming
+ // setup streaming
_stream_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS;
- _stream_cmd.stream_now = true;
+ _stream_cmd.stream_now = true;
_usrp->issue_stream_cmd(_stream_cmd);
- if( !_opt.batch_mode ){
+ if (!_opt.batch_mode) {
float threshold = calibrate_usrp_for_test_run();
- if (_return_code != RETCODE_OK)
- {
+ if (_return_code != RETCODE_OK) {
return _return_code;
}
run_test(threshold);
- }
- else
- {
+ } else {
run_test();
}
- }
- catch (const std::runtime_error& e)
- {
- print_msg(e.what() );
+ } catch (const std::runtime_error& e) {
+ print_msg(e.what());
_return_code = RETCODE_RUNTIME_ERROR;
- }
- catch (...)
- {
+ } catch (...) {
print_msg("Unhandled exception");
_return_code = RETCODE_UNKNOWN_EXCEPTION;
}
stop_usrp_stream();
- time( &_dbginfo.end_time_test );
+ time(&_dbginfo.end_time_test);
return (_return_code < 0 ? _return_code : _overruns);
}
@@ -1116,8 +1087,7 @@ Responder::run()
*/
// This method should print statistics after ncurses endwin.
-void
-Responder::print_final_statistics()
+void Responder::print_final_statistics()
{
cout << boost::format("Received %ld samples during test run") % _num_total_samps;
if (_overruns > 0)
@@ -1126,29 +1096,30 @@ Responder::print_final_statistics()
}
// safe test results to a log file if enabled
-void
-Responder::write_log_file()
+void Responder::write_log_file()
{
- try
- {
- if(_opt.log_file){
+ try {
+ if (_opt.log_file) {
std::map<std::string, std::string> hw_info = get_hw_info();
ofstream logs(_stats_log_filename.c_str());
logs << boost::format("title=%s") % _opt.test_title << endl;
- logs << boost::format("device=%s") % _usrp->get_mboard_name() << endl;
+ logs << boost::format("device=%s") % _usrp->get_mboard_name() << endl;
logs << boost::format("device_args=%s") % _opt.device_args << endl;
- logs << boost::format("type=%s") % hw_info["type"] << endl;
- if (hw_info.size() > 0)
- {
- logs << boost::format("usrp_addr=%s") % hw_info["usrp_addr"] << endl;
- logs << boost::format("usrp_name=%s") % hw_info["name"] << endl;
- logs << boost::format("serial=%s") % hw_info["serial"] << endl;
- logs << boost::format("host_interface=%s") % hw_info["interface"] << endl;
- logs << boost::format("host_addr=%s") % hw_info["host_addr"] << endl;
- logs << boost::format("host_mac=%s") % hw_info["mac"] << endl;
- logs << boost::format("host_vendor=%s (id=%s)") % hw_info["vendor"] % hw_info["vendor_id"] << endl;
- logs << boost::format("host_device=%s (id=%s)") % hw_info["device"] % hw_info["device_id"] << endl;
+ logs << boost::format("type=%s") % hw_info["type"] << endl;
+ if (hw_info.size() > 0) {
+ logs << boost::format("usrp_addr=%s") % hw_info["usrp_addr"] << endl;
+ logs << boost::format("usrp_name=%s") % hw_info["name"] << endl;
+ logs << boost::format("serial=%s") % hw_info["serial"] << endl;
+ logs << boost::format("host_interface=%s") % hw_info["interface"] << endl;
+ logs << boost::format("host_addr=%s") % hw_info["host_addr"] << endl;
+ logs << boost::format("host_mac=%s") % hw_info["mac"] << endl;
+ logs << boost::format("host_vendor=%s (id=%s)") % hw_info["vendor"]
+ % hw_info["vendor_id"]
+ << endl;
+ logs << boost::format("host_device=%s (id=%s)") % hw_info["device"]
+ % hw_info["device_id"]
+ << endl;
}
logs << boost::format("sample_rate=%f") % _opt.sample_rate << endl;
logs << boost::format("samps_per_buff=%i") % _opt.samps_per_buff << endl;
@@ -1158,97 +1129,113 @@ Responder::write_log_file()
logs << boost::format("delay_step=%f") % _delay_step << endl;
logs << boost::format("delay=%f") % _delay << endl;
logs << boost::format("init_delay=%f") % _opt.init_delay << endl;
- logs << boost::format("response_duration=%f") % _opt.response_duration << endl;
+ logs << boost::format("response_duration=%f") % _opt.response_duration
+ << endl;
logs << boost::format("response_length=%ld") % _response_length << endl;
logs << boost::format("timeout=%f") % _opt.timeout << endl;
- logs << boost::format("timeout_burst_count=%ld") % _timeout_burst_count << endl;
+ logs << boost::format("timeout_burst_count=%ld") % _timeout_burst_count
+ << endl;
logs << boost::format("timeout_eob_count=%f") % _timeout_eob_count << endl;
- logs << boost::format("allow_late_bursts=%s") % (_allow_late_bursts ? "yes" : "no") << endl;
+ logs << boost::format("allow_late_bursts=%s")
+ % (_allow_late_bursts ? "yes" : "no")
+ << endl;
logs << boost::format("skip_eob=%s") % (_opt.skip_eob ? "yes" : "no") << endl;
- logs << boost::format("combine_eob=%s") % (_opt.combine_eob ? "yes" : "no") << endl;
- logs << boost::format("skip_send=%s") % (_opt.skip_send ? "yes" : "no") << endl;
+ logs << boost::format("combine_eob=%s") % (_opt.combine_eob ? "yes" : "no")
+ << endl;
+ logs << boost::format("skip_send=%s") % (_opt.skip_send ? "yes" : "no")
+ << endl;
logs << boost::format("no_delay=%s") % (_no_delay ? "yes" : "no") << endl;
logs << boost::format("simulate_frequency=%f") % _simulate_frequency << endl;
logs << boost::format("simulate_duration=%ld") % _simulate_duration << endl;
- logs << boost::format("original_simulate_duration=%ld") % _original_simulate_duration << endl;
+ logs << boost::format("original_simulate_duration=%ld")
+ % _original_simulate_duration
+ << endl;
logs << boost::format("realtime=%s") % (_opt.realtime ? "yes" : "no") << endl;
logs << boost::format("rt_priority=%f") % _opt.rt_priority << endl;
logs << boost::format("test_iterations=%ld") % _opt.test_iterations << endl;
- logs << boost::format("end_test_after_success_count=%i") % _opt.end_test_after_success_count << endl;
+ logs << boost::format("end_test_after_success_count=%i")
+ % _opt.end_test_after_success_count
+ << endl;
logs << boost::format("skip_iterations=%i") % _opt.skip_iterations << endl;
logs << boost::format("overruns=%i") % _overruns << endl;
logs << boost::format("num_total_samps=%ld") % _num_total_samps << endl;
- logs << boost::format("return_code=%i\t(%s)") % _return_code % enum2str(_return_code) << endl;
+ logs << boost::format("return_code=%i\t(%s)") % _return_code
+ % enum2str(_return_code)
+ << endl;
logs << endl;
write_debug_info(logs);
-
}
- }
- catch(...)
- {
+ } catch (...) {
cerr << "Failed to write log file to: " << _stats_log_filename << endl;
}
}
// write debug info to log file
-void
-Responder::write_debug_info(ofstream& logs)
+void Responder::write_debug_info(ofstream& logs)
{
logs << endl << "%% DEBUG INFO %%" << endl;
- logs << boost::format("dbg_time_start=%s") % get_gmtime_string(_dbginfo.start_time) << endl;
- logs << boost::format("dbg_time_end=%s") % get_gmtime_string(_dbginfo.end_time) << endl;
- logs << boost::format("dbg_time_duration=%d") % difftime( _dbginfo.end_time, _dbginfo.start_time ) << endl;
- logs << boost::format("dbg_time_start_test=%s") % get_gmtime_string(_dbginfo.start_time_test) << endl;
- logs << boost::format("dbg_time_end_test=%s") % get_gmtime_string(_dbginfo.end_time_test) << endl;
- logs << boost::format("dbg_time_duration_test=%d") % difftime( _dbginfo.end_time_test, _dbginfo.start_time_test ) << endl;
- logs << boost::format("dbg_time_first_send_timeout=%s") % get_gmtime_string(_dbginfo.first_send_timeout) << endl;
+ logs << boost::format("dbg_time_start=%s") % get_gmtime_string(_dbginfo.start_time)
+ << endl;
+ logs << boost::format("dbg_time_end=%s") % get_gmtime_string(_dbginfo.end_time)
+ << endl;
+ logs << boost::format("dbg_time_duration=%d")
+ % difftime(_dbginfo.end_time, _dbginfo.start_time)
+ << endl;
+ logs << boost::format("dbg_time_start_test=%s")
+ % get_gmtime_string(_dbginfo.start_time_test)
+ << endl;
+ logs << boost::format("dbg_time_end_test=%s")
+ % get_gmtime_string(_dbginfo.end_time_test)
+ << endl;
+ logs << boost::format("dbg_time_duration_test=%d")
+ % difftime(_dbginfo.end_time_test, _dbginfo.start_time_test)
+ << endl;
+ logs << boost::format("dbg_time_first_send_timeout=%s")
+ % get_gmtime_string(_dbginfo.first_send_timeout)
+ << endl;
}
// convert a time string to desired format
-std::string
-Responder::get_gmtime_string(time_t time)
+std::string Responder::get_gmtime_string(time_t time)
{
tm* ftm;
- ftm = gmtime( &time );
+ ftm = gmtime(&time);
std::string strtime;
- strtime.append( (boost::format("%i") % (ftm->tm_year+1900) ).str() );
- strtime.append( (boost::format("-%02i") % ftm->tm_mon).str() );
- strtime.append( (boost::format("-%02i") % ftm->tm_mday).str() );
- strtime.append( (boost::format("-%02i") % ((ftm->tm_hour)) ).str() );
- strtime.append( (boost::format(":%02i") % ftm->tm_min).str() );
- strtime.append( (boost::format(":%02i") % ftm->tm_sec).str() );
+ strtime.append((boost::format("%i") % (ftm->tm_year + 1900)).str());
+ strtime.append((boost::format("-%02i") % ftm->tm_mon).str());
+ strtime.append((boost::format("-%02i") % ftm->tm_mday).str());
+ strtime.append((boost::format("-%02i") % ((ftm->tm_hour))).str());
+ strtime.append((boost::format(":%02i") % ftm->tm_min).str());
+ strtime.append((boost::format(":%02i") % ftm->tm_sec).str());
return strtime;
}
// read hardware info from file if available to include it in log file
-std::map<std::string, std::string>
-Responder::get_hw_info()
+std::map<std::string, std::string> Responder::get_hw_info()
{
std::map<std::string, std::string> result;
- std::vector<std::map<std::string,std::string> > eths = read_eth_info();
- if(eths.empty()){
+ std::vector<std::map<std::string, std::string>> eths = read_eth_info();
+ if (eths.empty()) {
return result;
}
uhd::device_addr_t usrp_info = get_usrp_info();
- std::string uaddr = get_ip_subnet_addr(usrp_info["addr"]);
+ std::string uaddr = get_ip_subnet_addr(usrp_info["addr"]);
- for(unsigned int i = 0 ; i < eths.size() ; i++ )
- {
- if(get_ip_subnet_addr(eths[i]["addr"]) == uaddr)
- {
- result["type"] = usrp_info["type"];
+ for (unsigned int i = 0; i < eths.size(); i++) {
+ if (get_ip_subnet_addr(eths[i]["addr"]) == uaddr) {
+ result["type"] = usrp_info["type"];
result["usrp_addr"] = usrp_info["addr"];
- result["name"] = usrp_info["name"];
- result["serial"] = usrp_info["serial"];
+ result["name"] = usrp_info["name"];
+ result["serial"] = usrp_info["serial"];
result["interface"] = eths[i]["interface"];
result["host_addr"] = eths[i]["addr"];
- result["mac"] = eths[i]["mac"];
- result["vendor"] = eths[i]["vendor"];
+ result["mac"] = eths[i]["mac"];
+ result["vendor"] = eths[i]["vendor"];
result["vendor_id"] = eths[i]["vendor_id"];
- result["device"] = eths[i]["device"];
+ result["device"] = eths[i]["device"];
result["device_id"] = eths[i]["device_id"];
break; // Use first item found. Imitate device discovery.
}
@@ -1258,138 +1245,124 @@ Responder::get_hw_info()
}
// subnet used to identify used network interface
-std::string
-Responder::get_ip_subnet_addr(std::string ip)
+std::string Responder::get_ip_subnet_addr(std::string ip)
{
return ip.substr(0, ip.rfind(".") + 1);
}
// get network interface info from file (should include all available interfaces)
-std::vector<std::map<std::string,std::string> >
-Responder::read_eth_info()
+std::vector<std::map<std::string, std::string>> Responder::read_eth_info()
{
const std::string eth_file(_eth_file);
- std::vector<std::map<std::string,std::string> > eths;
- try
- {
+ std::vector<std::map<std::string, std::string>> eths;
+ try {
ifstream eth_info(eth_file.c_str());
- if(!eth_info.is_open()){
+ if (!eth_info.is_open()) {
return eths;
}
const int len = 256;
char cline[len];
- for(; !eth_info.eof() ;)
- {
+ for (; !eth_info.eof();) {
eth_info.getline(cline, len);
std::string line(cline);
- if(line.find("## ETH Interface") != std::string::npos)
- {
+ if (line.find("## ETH Interface") != std::string::npos) {
eth_info.getline(cline, len);
std::string eth(cline);
-// cout << "interface=" << eth << endl;
- std::map<std::string,std::string> iface;
+ // cout << "interface=" << eth << endl;
+ std::map<std::string, std::string> iface;
iface["interface"] = eth;
eths.push_back(iface);
}
const std::string ipstr("\tip ");
- if(line.find(ipstr) != std::string::npos)
- {
- std::string ip( line.replace(line.begin(), line.begin()+ipstr.length(), "") );
-// cout << "ip=" << ip << endl;
+ if (line.find(ipstr) != std::string::npos) {
+ std::string ip(
+ line.replace(line.begin(), line.begin() + ipstr.length(), ""));
+ // cout << "ip=" << ip << endl;
eths.back()["addr"] = ip;
}
const std::string macstr("\tmac ");
- if(line.find(macstr) != std::string::npos)
- {
- std::string mac( line.replace(line.begin(), line.begin()+macstr.length(), "") );
-// cout << "mac=" << mac << endl;
+ if (line.find(macstr) != std::string::npos) {
+ std::string mac(
+ line.replace(line.begin(), line.begin() + macstr.length(), ""));
+ // cout << "mac=" << mac << endl;
eths.back()["mac"] = mac;
}
const std::string vstr("\t\tvendor ");
- if(line.find(vstr) != std::string::npos)
- {
- std::string vendor( line.replace(line.begin(), line.begin()+vstr.length(), "") );
- std::string vid( vendor.substr(0,6) );
+ if (line.find(vstr) != std::string::npos) {
+ std::string vendor(
+ line.replace(line.begin(), line.begin() + vstr.length(), ""));
+ std::string vid(vendor.substr(0, 6));
vendor.replace(0, 7, "");
-// cout << "id=" << vid << endl;
-// cout << "vendor=" << vendor << endl;
- eths.back()["vendor"] = vendor;
+ // cout << "id=" << vid << endl;
+ // cout << "vendor=" << vendor << endl;
+ eths.back()["vendor"] = vendor;
eths.back()["vendor_id"] = vid;
}
const std::string dstr("\t\tdevice ");
- if(line.find(dstr) != std::string::npos)
- {
- std::string device( line.replace(line.begin(), line.begin()+dstr.length(), "") );
- std::string did( device.substr(0,6) );
+ if (line.find(dstr) != std::string::npos) {
+ std::string device(
+ line.replace(line.begin(), line.begin() + dstr.length(), ""));
+ std::string did(device.substr(0, 6));
device.replace(0, 7, "");
-// cout << "id=" << did << endl;
-// cout << "device=" << device << endl;
- eths.back()["device"] = device;
+ // cout << "id=" << did << endl;
+ // cout << "device=" << device << endl;
+ eths.back()["device"] = device;
eths.back()["device_id"] = did;
}
}
- }
- catch(...)
- {
+ } catch (...) {
// nothing in yet
}
return eths;
}
// get info on used USRP
-uhd::device_addr_t
-Responder::get_usrp_info()
+uhd::device_addr_t Responder::get_usrp_info()
{
uhd::device_addrs_t device_addrs = uhd::device::find(_opt.device_args);
- uhd::device_addr_t device_addr = device_addrs[0];
+ uhd::device_addr_t device_addr = device_addrs[0];
return device_addr;
}
// write statistics of test run to file
-void
-Responder::write_statistics_to_file(StatsMap mapStats)
+void Responder::write_statistics_to_file(StatsMap mapStats)
{
- try
- {
+ try {
ofstream results(_stats_filename.c_str());
- for (StatsMap::iterator it = mapStats.begin(); it != mapStats.end(); ++it)
- {
+ for (StatsMap::iterator it = mapStats.begin(); it != mapStats.end(); ++it) {
STATS& stats = it->second;
- double d = 0.0;
+ double d = 0.0;
if (stats.detected > 0)
d = 1.0 - ((double)stats.missed / (double)stats.detected);
- cout << "\t" << setprecision(6) << stats.delay << "\t\t" << setprecision(6) << d << endl;
+ cout << "\t" << setprecision(6) << stats.delay << "\t\t" << setprecision(6)
+ << d << endl;
- results << (stats.delay * _opt.time_mul) << " " << setprecision(6) << d << endl;
+ results << (stats.delay * _opt.time_mul) << " " << setprecision(6) << d
+ << endl;
}
cout << "Statistics written to: " << _stats_filename << endl;
- }
- catch (...)
- {
+ } catch (...) {
cout << "Failed to write statistics to: " << _stats_filename << endl;
}
}
// make sure write files is intended
-void
-Responder::safe_write_statistics_to_file(StatsMap mapStats, uint64_t max_success, int return_code)
+void Responder::safe_write_statistics_to_file(
+ StatsMap mapStats, uint64_t max_success, int return_code)
{
- if ((_opt.test_iterations > 0) && (_stats_filename.empty() == false) && (_opt.no_stats_file == false))
- {
- if (mapStats.empty())
- {
+ if ((_opt.test_iterations > 0) && (_stats_filename.empty() == false)
+ && (_opt.no_stats_file == false)) {
+ if (mapStats.empty()) {
cout << "No results to output (not writing statistics file)" << endl;
- }
- else if ((max_success == 0) && (return_code == RETCODE_MANUAL_ABORT))
- {
- cout << "Aborted before a single successful timed burst (not writing statistics file)" << endl;
- }
- else
- {
+ } else if ((max_success == 0) && (return_code == RETCODE_MANUAL_ABORT)) {
+ cout << "Aborted before a single successful timed burst (not writing "
+ "statistics file)"
+ << endl;
+ } else {
write_statistics_to_file(mapStats);
}
write_log_file();
@@ -1400,10 +1373,10 @@ Responder::safe_write_statistics_to_file(StatsMap mapStats, uint64_t max_success
Responder::~Responder()
{
endwin();
- if(_pResponse != NULL){
+ if (_pResponse != NULL) {
delete[] _pResponse;
}
- time( &_dbginfo.end_time );
+ time(&_dbginfo.end_time);
// Print final info about test run
print_final_statistics();
// check conditions and write statistics to file
@@ -1412,21 +1385,27 @@ Responder::~Responder()
}
// make test output more helpful
-std::string
-Responder::enum2str(int return_code)
+std::string Responder::enum2str(int return_code)
{
- switch(return_code)
- {
- case RETCODE_OK: return "OK";
- case RETCODE_BAD_ARGS: return "BAD_ARGS";
- case RETCODE_RUNTIME_ERROR: return "RUNTIME_ERROR";
- case RETCODE_UNKNOWN_EXCEPTION: return "UNKNOWN_EXCEPTION";
- case RETCODE_RECEIVE_TIMEOUT: return "RECEIVE_TIMEOUT";
- case RETCODE_RECEIVE_FAILED: return "RECEIVE_FAILED";
- case RETCODE_MANUAL_ABORT: return "MANUAL_ABORT";
- case RETCODE_BAD_PACKET: return "BAD_PACKET";
- case RETCODE_OVERFLOW: return "OVERFLOW";
+ switch (return_code) {
+ case RETCODE_OK:
+ return "OK";
+ case RETCODE_BAD_ARGS:
+ return "BAD_ARGS";
+ case RETCODE_RUNTIME_ERROR:
+ return "RUNTIME_ERROR";
+ case RETCODE_UNKNOWN_EXCEPTION:
+ return "UNKNOWN_EXCEPTION";
+ case RETCODE_RECEIVE_TIMEOUT:
+ return "RECEIVE_TIMEOUT";
+ case RETCODE_RECEIVE_FAILED:
+ return "RECEIVE_FAILED";
+ case RETCODE_MANUAL_ABORT:
+ return "MANUAL_ABORT";
+ case RETCODE_BAD_PACKET:
+ return "BAD_PACKET";
+ case RETCODE_OVERFLOW:
+ return "OVERFLOW";
}
return "UNKNOWN";
}
-
diff --git a/host/utils/latency/responder.cpp b/host/utils/latency/responder.cpp
index 6216f15e6..fd47ad085 100644
--- a/host/utils/latency/responder.cpp
+++ b/host/utils/latency/responder.cpp
@@ -5,16 +5,15 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/program_options.hpp>
#include <uhd/utils/safe_main.hpp>
#include <Responder.hpp>
+#include <boost/program_options.hpp>
namespace po = boost::program_options;
static Responder::Options prog;
-po::options_description
-get_program_options_description()
+po::options_description get_program_options_description()
{
po::options_description desc("Allowed options");
// clang-format off
@@ -71,41 +70,40 @@ get_program_options_description()
return desc;
}
-void
-read_program_options(po::variables_map vm)
+void read_program_options(po::variables_map vm)
{
// read out given options
prog.realtime = (vm.count("no-realtime") == 0);
prog.delay_step = std::abs(prog.delay_step);
- if (prog.delay_min > prog.delay_max)
- {
+ if (prog.delay_min > prog.delay_max) {
prog.delay_step *= -1;
}
- prog.allow_late_bursts = (vm.count("allow-late") > 0);
+ prog.allow_late_bursts = (vm.count("allow-late") > 0);
prog.test_iterations_is_sample_count = (vm.count("test-duration") > 0);
- prog.invert = ((vm.count("invert") > 0) ? -1.0f : 1.0f);
- prog.output_value = ((vm.count("invert-output") > 0) ? -1.0f : 1.0f);
- prog.skip_eob = (vm.count("skip-eob") > 0);
- prog.no_delay = (vm.count("no-delay") > 0);
- prog.adjust_simulation_rate = (vm.count("adjust-simulation-rate") > 0);
+ prog.invert = ((vm.count("invert") > 0) ? -1.0f : 1.0f);
+ prog.output_value = ((vm.count("invert-output") > 0) ? -1.0f : 1.0f);
+ prog.skip_eob = (vm.count("skip-eob") > 0);
+ prog.no_delay = (vm.count("no-delay") > 0);
+ prog.adjust_simulation_rate = (vm.count("adjust-simulation-rate") > 0);
prog.optimize_simulation_rate = (vm.count("optimize-simulation-rate") > 0);
- prog.no_stats_file = (vm.count("no-stats-file") > 0);
- prog.log_file = (vm.count("log-file") > 0);
- prog.batch_mode = (vm.count("batch-mode") > 0);
- prog.skip_if_results_exist = (vm.count("skip-if-exists") > 0);
- prog.skip_send = (vm.count("disable-send") > 0);
- prog.combine_eob = (vm.count("combine-eob") > 0);
- prog.pause = (vm.count("pause") > 0);
- prog.ignore_simulation_check = vm.count("ignore-simulation-check");
+ prog.no_stats_file = (vm.count("no-stats-file") > 0);
+ prog.log_file = (vm.count("log-file") > 0);
+ prog.batch_mode = (vm.count("batch-mode") > 0);
+ prog.skip_if_results_exist = (vm.count("skip-if-exists") > 0);
+ prog.skip_send = (vm.count("disable-send") > 0);
+ prog.combine_eob = (vm.count("combine-eob") > 0);
+ prog.pause = (vm.count("pause") > 0);
+ prog.ignore_simulation_check = vm.count("ignore-simulation-check");
}
/*
* This is the MAIN function!
* UHD_SAFE_MAIN catches all errors and prints them to stderr.
*/
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
po::options_description desc = get_program_options_description();
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
@@ -113,13 +111,12 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
read_program_options(vm);
// Print help message instead of executing Responder.
- if (vm.count("help")){
+ if (vm.count("help")) {
cout << boost::format("UHD Latency Test %s") % desc;
return Responder::RETCODE_OK;
}
- //create a new instance of Responder and run it!
+ // create a new instance of Responder and run it!
boost::shared_ptr<Responder> my_responder(new Responder(prog));
return my_responder->run();
}
-
diff --git a/host/utils/octoclock_burn_eeprom.cpp b/host/utils/octoclock_burn_eeprom.cpp
index f98f526f6..6221c4e83 100644
--- a/host/utils/octoclock_burn_eeprom.cpp
+++ b/host/utils/octoclock_burn_eeprom.cpp
@@ -6,13 +6,13 @@
//
#include <uhd/device.hpp>
-#include <uhd/utils/safe_main.hpp>
-#include <uhd/usrp_clock/octoclock_eeprom.hpp>
#include <uhd/property_tree.hpp>
#include <uhd/types/device_addr.hpp>
+#include <uhd/usrp_clock/octoclock_eeprom.hpp>
+#include <uhd/utils/safe_main.hpp>
#include <boost/algorithm/string.hpp>
-#include <boost/program_options.hpp>
#include <boost/format.hpp>
+#include <boost/program_options.hpp>
#include <iostream>
#include <vector>
@@ -21,7 +21,8 @@ namespace po = boost::program_options;
using namespace uhd;
using namespace uhd::usrp_clock;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
std::string args, input_str, key, val;
po::options_description desc("Allowed options");
@@ -38,50 +39,60 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help") or (not vm.count("values") and not vm.count("read-all"))){
+ // print the help message
+ if (vm.count("help") or (not vm.count("values") and not vm.count("read-all"))) {
std::cout << boost::format("OctoClock Burn EEPROM %s") % desc << std::endl;
- std::cout << boost::format(
- "Omit the value argument to perform a readback,\n"
- "Or specify a new value to burn into the EEPROM.\n"
- ) << std::endl;
+ std::cout << boost::format("Omit the value argument to perform a readback,\n"
+ "Or specify a new value to burn into the EEPROM.\n")
+ << std::endl;
return EXIT_FAILURE;
}
std::cout << "Creating OctoClock device from args: " + args << std::endl;
- device::sptr oc = device::make(args, device::CLOCK);
+ device::sptr oc = device::make(args, device::CLOCK);
property_tree::sptr tree = oc->get_tree();
- octoclock_eeprom_t oc_eeprom = tree->access<octoclock_eeprom_t>("/mboards/0/eeprom").get();
+ octoclock_eeprom_t oc_eeprom =
+ tree->access<octoclock_eeprom_t>("/mboards/0/eeprom").get();
std::cout << std::endl;
std::vector<std::string> keys_vec, vals_vec;
- if(vm.count("read-all")) keys_vec = oc_eeprom.keys(); //Leaving vals_vec empty will force utility to only read
- else if(vm.count("values")){
- //uhd::device_addr_t properly parses input values
+ if (vm.count("read-all"))
+ keys_vec =
+ oc_eeprom.keys(); // Leaving vals_vec empty will force utility to only read
+ else if (vm.count("values")) {
+ // uhd::device_addr_t properly parses input values
device_addr_t vals(input_str);
keys_vec = vals.keys();
vals_vec = vals.vals();
- }
- else throw std::runtime_error("Must specify --values or --read-all option!");
+ } else
+ throw std::runtime_error("Must specify --values or --read-all option!");
std::cout << "Fetching current settings from EEPROM..." << std::endl;
- for(size_t i = 0; i < keys_vec.size(); i++){
- if (not oc_eeprom.has_key(keys_vec[i])){
- std::cerr << boost::format("Cannot find value for EEPROM[\"%s\"]") % keys_vec[i] << std::endl;
+ for (size_t i = 0; i < keys_vec.size(); i++) {
+ if (not oc_eeprom.has_key(keys_vec[i])) {
+ std::cerr << boost::format("Cannot find value for EEPROM[\"%s\"]")
+ % keys_vec[i]
+ << std::endl;
return EXIT_FAILURE;
}
- std::cout << boost::format(" EEPROM [\"%s\"] is \"%s\"") % keys_vec[i] % oc_eeprom[keys_vec[i]] << std::endl;
+ std::cout << boost::format(" EEPROM [\"%s\"] is \"%s\"") % keys_vec[i]
+ % oc_eeprom[keys_vec[i]]
+ << std::endl;
}
- if(!vm.count("read-all")){
+ if (!vm.count("read-all")) {
std::cout << std::endl;
- for(size_t i = 0; i < vals_vec.size(); i++){
- if(vals_vec[i] != ""){
+ for (size_t i = 0; i < vals_vec.size(); i++) {
+ if (vals_vec[i] != "") {
oc_eeprom[keys_vec[i]] = vals_vec[i];
- std::cout << boost::format("Setting EEPROM [\"%s\"] to \"%s\"...") % keys_vec[i] % vals_vec[i] << std::endl;
+ std::cout << boost::format("Setting EEPROM [\"%s\"] to \"%s\"...")
+ % keys_vec[i] % vals_vec[i]
+ << std::endl;
}
}
tree->access<octoclock_eeprom_t>("/mboards/0/eeprom").set(oc_eeprom);
}
- std::cout << std::endl << "Power-cycle your device to allow any changes to take effect." << std::endl;
+ std::cout << std::endl
+ << "Power-cycle your device to allow any changes to take effect."
+ << std::endl;
return EXIT_SUCCESS;
}
diff --git a/host/utils/query_gpsdo_sensors.cpp b/host/utils/query_gpsdo_sensors.cpp
index 6a3ecca13..4a8aa24d2 100644
--- a/host/utils/query_gpsdo_sensors.cpp
+++ b/host/utils/query_gpsdo_sensors.cpp
@@ -5,241 +5,270 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/paths.hpp>
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
-#include <uhd/utils/algorithm.hpp>
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/usrp_clock/multi_usrp_clock.hpp>
+#include <uhd/utils/algorithm.hpp>
+#include <uhd/utils/paths.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/filesystem.hpp>
-#include <boost/program_options.hpp>
#include <boost/format.hpp>
-#include <iostream>
-#include <complex>
-#include <string>
+#include <boost/program_options.hpp>
+#include <chrono>
#include <cmath>
-#include <ctime>
+#include <complex>
#include <cstdlib>
-#include <chrono>
+#include <ctime>
+#include <iostream>
+#include <string>
#include <thread>
namespace po = boost::program_options;
namespace fs = boost::filesystem;
-void print_notes(void) {
- // Helpful notes
- std::cout << boost::format("**************************************Helpful Notes on Clock/PPS Selection**************************************\n");
- std::cout << boost::format("As you can see, the default 10 MHz Reference and 1 PPS signals are now from the GPSDO.\n");
- std::cout << boost::format("If you would like to use the internal reference(TCXO) in other applications, you must configure that explicitly.\n");
- std::cout << boost::format("****************************************************************************************************************\n");
+void print_notes(void)
+{
+ // Helpful notes
+ std::cout << boost::format(
+ "**************************************Helpful Notes on Clock/PPS "
+ "Selection**************************************\n");
+ std::cout << boost::format("As you can see, the default 10 MHz Reference and 1 PPS "
+ "signals are now from the GPSDO.\n");
+ std::cout << boost::format(
+ "If you would like to use the internal reference(TCXO) in other applications, "
+ "you must configure that explicitly.\n");
+ std::cout << boost::format(
+ "********************************************************************************"
+ "********************************\n");
}
-int query_clock_sensors(const std::string &args) {
- std::cout << boost::format("\nCreating the clock device with: %s...\n") % args;
- uhd::usrp_clock::multi_usrp_clock::sptr clock = uhd::usrp_clock::multi_usrp_clock::make(args);
-
- //Verify GPS sensors are present
- std::vector<std::string> sensor_names = clock->get_sensor_names(0);
- if(std::find(sensor_names.begin(), sensor_names.end(), "gps_locked") == sensor_names.end()) {
- std::cout << boost::format("\ngps_locked sensor not found. This could mean that this unit does not have a GPSDO.\n\n");
- return EXIT_FAILURE;
- }
-
- // Print NMEA strings
- try {
- uhd::sensor_value_t gga_string = clock->get_sensor("gps_gpgga");
- uhd::sensor_value_t rmc_string = clock->get_sensor("gps_gprmc");
- uhd::sensor_value_t servo_string = clock->get_sensor("gps_servo");
- std::cout << boost::format("\nPrinting available NMEA strings:\n");
- std::cout << boost::format("%s\n%s\n") % gga_string.to_pp_string() % rmc_string.to_pp_string();
- std::cout << boost::format("\nPrinting GPS servo status:\n");
- std::cout << boost::format("%s\n\n") % servo_string.to_pp_string();
- } catch (const uhd::lookup_error &) {
- std::cout << "NMEA strings not implemented for this device." << std::endl;
- }
- std::cout << boost::format("GPS Epoch time: %.5f seconds\n") % clock->get_sensor("gps_time").to_real();
- std::cout << boost::format("PC Clock time: %.5f seconds\n") % time(NULL);
-
- //finished
- std::cout << boost::format("\nDone!\n\n");
-
- return EXIT_SUCCESS;
+int query_clock_sensors(const std::string& args)
+{
+ std::cout << boost::format("\nCreating the clock device with: %s...\n") % args;
+ uhd::usrp_clock::multi_usrp_clock::sptr clock =
+ uhd::usrp_clock::multi_usrp_clock::make(args);
+
+ // Verify GPS sensors are present
+ std::vector<std::string> sensor_names = clock->get_sensor_names(0);
+ if (std::find(sensor_names.begin(), sensor_names.end(), "gps_locked")
+ == sensor_names.end()) {
+ std::cout << boost::format("\ngps_locked sensor not found. This could mean that "
+ "this unit does not have a GPSDO.\n\n");
+ return EXIT_FAILURE;
+ }
+
+ // Print NMEA strings
+ try {
+ uhd::sensor_value_t gga_string = clock->get_sensor("gps_gpgga");
+ uhd::sensor_value_t rmc_string = clock->get_sensor("gps_gprmc");
+ uhd::sensor_value_t servo_string = clock->get_sensor("gps_servo");
+ std::cout << boost::format("\nPrinting available NMEA strings:\n");
+ std::cout << boost::format("%s\n%s\n") % gga_string.to_pp_string()
+ % rmc_string.to_pp_string();
+ std::cout << boost::format("\nPrinting GPS servo status:\n");
+ std::cout << boost::format("%s\n\n") % servo_string.to_pp_string();
+ } catch (const uhd::lookup_error&) {
+ std::cout << "NMEA strings not implemented for this device." << std::endl;
+ }
+ std::cout << boost::format("GPS Epoch time: %.5f seconds\n")
+ % clock->get_sensor("gps_time").to_real();
+ std::cout << boost::format("PC Clock time: %.5f seconds\n") % time(NULL);
+
+ // finished
+ std::cout << boost::format("\nDone!\n\n");
+
+ return EXIT_SUCCESS;
}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
- uhd::set_thread_priority_safe();
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
+ uhd::set_thread_priority_safe();
- std::string args;
+ std::string args;
- //Set up program options
- po::options_description desc("Allowed options");
- // clang-format off
+ // Set up program options
+ po::options_description desc("Allowed options");
+ // clang-format off
desc.add_options()
("help", "help message")
("args", po::value<std::string>(&args)->default_value(""), "Device address arguments specifying a single USRP")
("clock", "query a clock device's sensors")
;
- // clang-format on
- po::variables_map vm;
- po::store(po::parse_command_line(argc, argv, desc), vm);
- po::notify(vm);
-
- //Print the help message
- if (vm.count("help")) {
- std::cout << boost::format("Query GPSDO Sensors, try to lock the reference oscillator to the GPS disciplined clock, and set the device time to GPS time")
- << std::endl
- << std::endl
- << desc;
- return EXIT_FAILURE;
- }
-
- //If specified, query a clock device instead
- if(vm.count("clock")) {
- return query_clock_sensors(args);
- }
-
- //Create a USRP device
- std::cout << boost::format("\nCreating the USRP device with: %s...\n") % args;
- uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
- std::cout << boost::format("Using Device: %s\n") % usrp->get_pp_string();
-
- //Verify GPS sensors are present (i.e. EEPROM has been burnt)
- std::vector<std::string> sensor_names = usrp->get_mboard_sensor_names(0);
-
- if (std::find(sensor_names.begin(), sensor_names.end(), "gps_locked") == sensor_names.end()) {
- std::cout << boost::format("\ngps_locked sensor not found. This could mean that you have not installed the GPSDO correctly.\n\n");
- std::cout << boost::format("Visit one of these pages if the problem persists:\n");
- std::cout << boost::format(" * N2X0/E1X0: http://files.ettus.com/manual/page_gpsdo.html\n");
- std::cout << boost::format(" * X3X0: http://files.ettus.com/manual/page_gpsdo_x3x0.html\n\n");
- return EXIT_FAILURE;
- }
-
- bool ref_set_to_gpsdo = false;
-
- // Set clock source to gpsdo if supported
- if (uhd::has(usrp->get_clock_sources(0),"gpsdo"))
- {
- std::cout << "Setting the reference clock source to \"gpsdo\"..." << std::endl;
- usrp->set_clock_source("gpsdo");
- ref_set_to_gpsdo = true;
- }
- std::cout << "Clock source is now " << usrp->get_clock_source(0) << std::endl;
-
- // Set time source to gpsdo if supported
- if (uhd::has(usrp->get_time_sources(0),"gpsdo"))
- {
- std::cout << "Setting the reference clock source to \"gpsdo\"..." << std::endl;
- usrp->set_time_source("gpsdo");
- ref_set_to_gpsdo = true;
- }
- std::cout << "Time source is now " << usrp->get_time_source(0) << std::endl;
-
- if (not ref_set_to_gpsdo)
- {
- std::cerr << "ERROR: Unable to set clock or time reference to \"gpsdo\"" << std::endl;
- return EXIT_FAILURE;
- }
-
- //Check for ref lock
- if(std::find(sensor_names.begin(), sensor_names.end(), "ref_locked") != sensor_names.end()) {
- uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked",0);
- for (size_t i = 0; not ref_locked.to_bool() and i < 300; i++) {
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
- ref_locked = usrp->get_mboard_sensor("ref_locked",0);
- }
- if(not ref_locked.to_bool()) {
- std::cout << boost::format("USRP NOT Locked to Reference.\n");
- std::cout << boost::format("Double check installation instructions (N2X0/E1X0 only): https://www.ettus.com/content/files/gpsdo-kit_4.pdf\n\n");
- return EXIT_FAILURE;
- } else {
- std::cout << boost::format("USRP Locked to Reference.\n");
- }
- } else {
- std::cout << boost::format("ref_locked sensor not present on this board.\n");
- }
-
- print_notes();
-
- // The TCXO has a long warm up time, so wait up to 30 seconds for sensor data
- // to show up
- std::cout << "Waiting for the GPSDO to warm up..." << std::flush;
- auto end = std::chrono::steady_clock::now() + std::chrono::seconds(30);
- while (std::chrono::steady_clock::now() < end) {
- try {
- usrp->get_mboard_sensor("gps_locked", 0);
- break;
- } catch (std::exception &) {}
- std::this_thread::sleep_for(std::chrono::milliseconds(250));
- std::cout << "." << std::flush;
- }
- std::cout << std::endl;
- try {
- usrp->get_mboard_sensor("gps_locked", 0);
- } catch (std::exception &) {
- std::cout << "No response from GPSDO in 30 seconds" << std::endl;
- return EXIT_FAILURE;
- }
- std::cout << "The GPSDO is warmed up and talking." << std::endl;
-
- //Check for GPS lock
- uhd::sensor_value_t gps_locked = usrp->get_mboard_sensor("gps_locked",0);;
- if(not gps_locked.to_bool()) {
- std::cout << boost::format("\nGPS does not have lock. Wait a few minutes and try again.\n");
- std::cout << boost::format("NMEA strings and device time may not be accurate until lock is achieved.\n\n");
- } else {
- std::cout << boost::format("GPS Locked");
- }
-
- //Check PPS and compare UHD device time to GPS time
- uhd::sensor_value_t gps_time = usrp->get_mboard_sensor("gps_time");
- uhd::time_spec_t last_pps_time = usrp->get_time_last_pps();
-
- //we only care about the full seconds
- signed gps_seconds = gps_time.to_int();
- long long pps_seconds = last_pps_time.to_ticks(1.0);
-
- if(pps_seconds != gps_seconds) {
- std::cout << "\nTrying to align the device time to GPS time..."
- << std::endl;
-
- gps_time = usrp->get_mboard_sensor("gps_time");
-
- //set the device time to the GPS time
- //getting the GPS time returns just after the PPS edge, so just add a
- //second and set the device time at the next PPS edge
- usrp->set_time_next_pps(uhd::time_spec_t(gps_time.to_int() + 1.0));
- //allow some time to make sure the PPS has come…
- std::this_thread::sleep_for(std::chrono::milliseconds(1100));
- //…then ask
- gps_seconds = usrp->get_mboard_sensor("gps_time").to_int();
- pps_seconds = usrp->get_time_last_pps().to_ticks(1.0);
- }
-
- if (pps_seconds == gps_seconds) {
- std::cout << boost::format("GPS and UHD Device time are aligned.\n");
- } else {
- std::cout << boost::format("Could not align UHD Device time to GPS time. Giving up.\n");
- }
- std::cout << boost::format("last_pps: %ld vs gps: %ld.")
- % pps_seconds % gps_seconds
- << std::endl;
-
- //print NMEA strings
- try {
- uhd::sensor_value_t gga_string = usrp->get_mboard_sensor("gps_gpgga");
- uhd::sensor_value_t rmc_string = usrp->get_mboard_sensor("gps_gprmc");
- std::cout << boost::format("Printing available NMEA strings:\n");
- std::cout << boost::format("%s\n%s\n") % gga_string.to_pp_string() % rmc_string.to_pp_string();
- } catch (uhd::lookup_error&) {
- std::cout << "NMEA strings not implemented for this device." << std::endl;
- }
- std::cout << boost::format("GPS Epoch time at last PPS: %.5f seconds\n") % usrp->get_mboard_sensor("gps_time").to_real();
- std::cout << boost::format("UHD Device time last PPS: %.5f seconds\n") % (usrp->get_time_last_pps().get_real_secs());
- std::cout << boost::format("UHD Device time right now: %.5f seconds\n") % (usrp->get_time_now().get_real_secs());
- std::cout << boost::format("PC Clock time: %.5f seconds\n") % time(NULL);
-
- //finished
- std::cout << boost::format("\nDone!\n\n");
-
- return EXIT_SUCCESS;
+ // clang-format on
+ po::variables_map vm;
+ po::store(po::parse_command_line(argc, argv, desc), vm);
+ po::notify(vm);
+
+ // Print the help message
+ if (vm.count("help")) {
+ std::cout << boost::format(
+ "Query GPSDO Sensors, try to lock the reference oscillator to "
+ "the GPS disciplined clock, and set the device time to GPS time")
+ << std::endl
+ << std::endl
+ << desc;
+ return EXIT_FAILURE;
+ }
+
+ // If specified, query a clock device instead
+ if (vm.count("clock")) {
+ return query_clock_sensors(args);
+ }
+
+ // Create a USRP device
+ std::cout << boost::format("\nCreating the USRP device with: %s...\n") % args;
+ uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
+ std::cout << boost::format("Using Device: %s\n") % usrp->get_pp_string();
+
+ // Verify GPS sensors are present (i.e. EEPROM has been burnt)
+ std::vector<std::string> sensor_names = usrp->get_mboard_sensor_names(0);
+
+ if (std::find(sensor_names.begin(), sensor_names.end(), "gps_locked")
+ == sensor_names.end()) {
+ std::cout << boost::format("\ngps_locked sensor not found. This could mean that "
+ "you have not installed the GPSDO correctly.\n\n");
+ std::cout << boost::format("Visit one of these pages if the problem persists:\n");
+ std::cout << boost::format(
+ " * N2X0/E1X0: http://files.ettus.com/manual/page_gpsdo.html\n");
+ std::cout << boost::format(
+ " * X3X0: http://files.ettus.com/manual/page_gpsdo_x3x0.html\n\n");
+ return EXIT_FAILURE;
+ }
+
+ bool ref_set_to_gpsdo = false;
+
+ // Set clock source to gpsdo if supported
+ if (uhd::has(usrp->get_clock_sources(0), "gpsdo")) {
+ std::cout << "Setting the reference clock source to \"gpsdo\"..." << std::endl;
+ usrp->set_clock_source("gpsdo");
+ ref_set_to_gpsdo = true;
+ }
+ std::cout << "Clock source is now " << usrp->get_clock_source(0) << std::endl;
+
+ // Set time source to gpsdo if supported
+ if (uhd::has(usrp->get_time_sources(0), "gpsdo")) {
+ std::cout << "Setting the reference clock source to \"gpsdo\"..." << std::endl;
+ usrp->set_time_source("gpsdo");
+ ref_set_to_gpsdo = true;
+ }
+ std::cout << "Time source is now " << usrp->get_time_source(0) << std::endl;
+
+ if (not ref_set_to_gpsdo) {
+ std::cerr << "ERROR: Unable to set clock or time reference to \"gpsdo\""
+ << std::endl;
+ return EXIT_FAILURE;
+ }
+
+ // Check for ref lock
+ if (std::find(sensor_names.begin(), sensor_names.end(), "ref_locked")
+ != sensor_names.end()) {
+ uhd::sensor_value_t ref_locked = usrp->get_mboard_sensor("ref_locked", 0);
+ for (size_t i = 0; not ref_locked.to_bool() and i < 300; i++) {
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ ref_locked = usrp->get_mboard_sensor("ref_locked", 0);
+ }
+ if (not ref_locked.to_bool()) {
+ std::cout << boost::format("USRP NOT Locked to Reference.\n");
+ std::cout << boost::format(
+ "Double check installation instructions (N2X0/E1X0 only): "
+ "https://www.ettus.com/content/files/gpsdo-kit_4.pdf\n\n");
+ return EXIT_FAILURE;
+ } else {
+ std::cout << boost::format("USRP Locked to Reference.\n");
+ }
+ } else {
+ std::cout << boost::format("ref_locked sensor not present on this board.\n");
+ }
+
+ print_notes();
+
+ // The TCXO has a long warm up time, so wait up to 30 seconds for sensor data
+ // to show up
+ std::cout << "Waiting for the GPSDO to warm up..." << std::flush;
+ auto end = std::chrono::steady_clock::now() + std::chrono::seconds(30);
+ while (std::chrono::steady_clock::now() < end) {
+ try {
+ usrp->get_mboard_sensor("gps_locked", 0);
+ break;
+ } catch (std::exception&) {
+ }
+ std::this_thread::sleep_for(std::chrono::milliseconds(250));
+ std::cout << "." << std::flush;
+ }
+ std::cout << std::endl;
+ try {
+ usrp->get_mboard_sensor("gps_locked", 0);
+ } catch (std::exception&) {
+ std::cout << "No response from GPSDO in 30 seconds" << std::endl;
+ return EXIT_FAILURE;
+ }
+ std::cout << "The GPSDO is warmed up and talking." << std::endl;
+
+ // Check for GPS lock
+ uhd::sensor_value_t gps_locked = usrp->get_mboard_sensor("gps_locked", 0);
+ ;
+ if (not gps_locked.to_bool()) {
+ std::cout << boost::format(
+ "\nGPS does not have lock. Wait a few minutes and try again.\n");
+ std::cout << boost::format("NMEA strings and device time may not be accurate "
+ "until lock is achieved.\n\n");
+ } else {
+ std::cout << boost::format("GPS Locked");
+ }
+
+ // Check PPS and compare UHD device time to GPS time
+ uhd::sensor_value_t gps_time = usrp->get_mboard_sensor("gps_time");
+ uhd::time_spec_t last_pps_time = usrp->get_time_last_pps();
+
+ // we only care about the full seconds
+ signed gps_seconds = gps_time.to_int();
+ long long pps_seconds = last_pps_time.to_ticks(1.0);
+
+ if (pps_seconds != gps_seconds) {
+ std::cout << "\nTrying to align the device time to GPS time..." << std::endl;
+
+ gps_time = usrp->get_mboard_sensor("gps_time");
+
+ // set the device time to the GPS time
+ // getting the GPS time returns just after the PPS edge, so just add a
+ // second and set the device time at the next PPS edge
+ usrp->set_time_next_pps(uhd::time_spec_t(gps_time.to_int() + 1.0));
+ // allow some time to make sure the PPS has come…
+ std::this_thread::sleep_for(std::chrono::milliseconds(1100));
+ //…then ask
+ gps_seconds = usrp->get_mboard_sensor("gps_time").to_int();
+ pps_seconds = usrp->get_time_last_pps().to_ticks(1.0);
+ }
+
+ if (pps_seconds == gps_seconds) {
+ std::cout << boost::format("GPS and UHD Device time are aligned.\n");
+ } else {
+ std::cout << boost::format(
+ "Could not align UHD Device time to GPS time. Giving up.\n");
+ }
+ std::cout << boost::format("last_pps: %ld vs gps: %ld.") % pps_seconds % gps_seconds
+ << std::endl;
+
+ // print NMEA strings
+ try {
+ uhd::sensor_value_t gga_string = usrp->get_mboard_sensor("gps_gpgga");
+ uhd::sensor_value_t rmc_string = usrp->get_mboard_sensor("gps_gprmc");
+ std::cout << boost::format("Printing available NMEA strings:\n");
+ std::cout << boost::format("%s\n%s\n") % gga_string.to_pp_string()
+ % rmc_string.to_pp_string();
+ } catch (uhd::lookup_error&) {
+ std::cout << "NMEA strings not implemented for this device." << std::endl;
+ }
+ std::cout << boost::format("GPS Epoch time at last PPS: %.5f seconds\n")
+ % usrp->get_mboard_sensor("gps_time").to_real();
+ std::cout << boost::format("UHD Device time last PPS: %.5f seconds\n")
+ % (usrp->get_time_last_pps().get_real_secs());
+ std::cout << boost::format("UHD Device time right now: %.5f seconds\n")
+ % (usrp->get_time_now().get_real_secs());
+ std::cout << boost::format("PC Clock time: %.5f seconds\n") % time(NULL);
+
+ // finished
+ std::cout << boost::format("\nDone!\n\n");
+
+ return EXIT_SUCCESS;
}
diff --git a/host/utils/uhd_cal_rx_iq_balance.cpp b/host/utils/uhd_cal_rx_iq_balance.cpp
index d8c6a63da..a90e37651 100644
--- a/host/utils/uhd_cal_rx_iq_balance.cpp
+++ b/host/utils/uhd_cal_rx_iq_balance.cpp
@@ -6,21 +6,21 @@
//
#include "usrp_cal_utils.hpp"
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
-#include <uhd/utils/paths.hpp>
-#include <uhd/utils/algorithm.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/algorithm.hpp>
+#include <uhd/utils/paths.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
-#include <boost/thread/thread.hpp>
#include <boost/math/special_functions/round.hpp>
-#include <iostream>
-#include <complex>
+#include <boost/program_options.hpp>
+#include <boost/thread/thread.hpp>
+#include <chrono>
#include <cmath>
-#include <ctime>
+#include <complex>
#include <cstdlib>
-#include <chrono>
+#include <ctime>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
@@ -32,20 +32,19 @@ static void tx_thread(uhd::tx_streamer::sptr tx_stream, const double tx_wave_amp
{
uhd::set_thread_priority_safe();
- //setup variables and allocate buffer
+ // setup variables and allocate buffer
uhd::tx_metadata_t md;
md.has_time_spec = false;
- std::vector<samp_type> buff(tx_stream->get_max_num_samps()*10);
+ std::vector<samp_type> buff(tx_stream->get_max_num_samps() * 10);
- //fill buff and send until interrupted
- while (not boost::this_thread::interruption_requested())
- {
+ // fill buff and send until interrupted
+ while (not boost::this_thread::interruption_requested()) {
for (size_t i = 0; i < buff.size(); i++)
buff[i] = float(tx_wave_ampl);
tx_stream->send(&buff.front(), buff.size(), md);
}
- //send a mini EOB packet
+ // send a mini EOB packet
md.end_of_burst = true;
tx_stream->send("", 0, md);
}
@@ -53,21 +52,22 @@ static void tx_thread(uhd::tx_streamer::sptr tx_stream, const double tx_wave_amp
/***********************************************************************
* Tune RX and TX routine
**********************************************************************/
-static double tune_rx_and_tx(uhd::usrp::multi_usrp::sptr usrp, const double rx_lo_freq, const double tx_offset)
+static double tune_rx_and_tx(
+ uhd::usrp::multi_usrp::sptr usrp, const double rx_lo_freq, const double tx_offset)
{
- //tune the receiver with no cordic
+ // tune the receiver with no cordic
uhd::tune_request_t rx_tune_req(rx_lo_freq);
rx_tune_req.dsp_freq_policy = uhd::tune_request_t::POLICY_MANUAL;
- rx_tune_req.dsp_freq = 0;
+ rx_tune_req.dsp_freq = 0;
usrp->set_rx_freq(rx_tune_req);
- //tune the transmitter
- double tx_freq = usrp->get_rx_freq() + tx_offset;
+ // tune the transmitter
+ double tx_freq = usrp->get_rx_freq() + tx_offset;
double min_fe_tx_freq = usrp->get_fe_tx_freq_range().start();
double max_fe_tx_freq = usrp->get_fe_tx_freq_range().stop();
uhd::tune_request_t tx_tune_req(tx_freq);
tx_tune_req.dsp_freq_policy = uhd::tune_request_t::POLICY_MANUAL;
- tx_tune_req.dsp_freq = 0;
+ tx_tune_req.dsp_freq = 0;
if (tx_freq < min_fe_tx_freq)
tx_tune_req.dsp_freq = tx_freq - min_fe_tx_freq;
else if (tx_freq > max_fe_tx_freq)
@@ -82,7 +82,7 @@ static double tune_rx_and_tx(uhd::usrp::multi_usrp::sptr usrp, const double rx_l
/***********************************************************************
* Main
**********************************************************************/
-int UHD_SAFE_MAIN(int argc, char *argv[])
+int UHD_SAFE_MAIN(int argc, char* argv[])
{
std::string args, subdev, serial;
double tx_wave_ampl, tx_offset;
@@ -111,13 +111,16 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
- std::cout << boost::format("USRP Generate RX IQ Balance Calibration Table %s") % desc << std::endl;
- std::cout <<
- "This application measures leakage between RX and TX on a transceiver daughterboard to self-calibrate.\n"
- "Note: Not all daughterboards support this feature. Refer to the UHD manual for details.\n"
- << std::endl;
+ // print the help message
+ if (vm.count("help")) {
+ std::cout << boost::format("USRP Generate RX IQ Balance Calibration Table %s")
+ % desc
+ << std::endl;
+ std::cout << "This application measures leakage between RX and TX on a "
+ "transceiver daughterboard to self-calibrate.\n"
+ "Note: Not all daughterboards support this feature. Refer to the "
+ "UHD manual for details.\n"
+ << std::endl;
return EXIT_FAILURE;
}
@@ -127,143 +130,154 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
if (not vm.count("nsamps"))
nsamps = size_t(usrp->get_rx_rate() / default_fft_bin_size);
- //create a receive streamer
- uhd::stream_args_t stream_args("fc32"); //complex floats
+ // create a receive streamer
+ uhd::stream_args_t stream_args("fc32"); // complex floats
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
- //create a transmit streamer
+ // create a transmit streamer
uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(stream_args);
- //create a transmitter thread
+ // create a transmitter thread
boost::thread_group threads;
threads.create_thread(boost::bind(&tx_thread, tx_stream, tx_wave_ampl));
- //re-usable buffer for samples
+ // re-usable buffer for samples
std::vector<samp_type> buff;
- //store the results here
+ // store the results here
std::vector<result_t> results;
- if (not vm.count("freq_start")) freq_start = usrp->get_fe_rx_freq_range().start();
- if (not vm.count("freq_stop")) freq_stop = usrp->get_fe_tx_freq_range().stop();
+ if (not vm.count("freq_start"))
+ freq_start = usrp->get_fe_rx_freq_range().start();
+ if (not vm.count("freq_stop"))
+ freq_stop = usrp->get_fe_tx_freq_range().stop();
- //check start and stop frequencies
- if (freq_start < usrp->get_fe_rx_freq_range().start())
- {
- std::cerr << "freq_start must be " << usrp->get_fe_rx_freq_range().start() << " or greater for this daughter board" << std::endl;
+ // check start and stop frequencies
+ if (freq_start < usrp->get_fe_rx_freq_range().start()) {
+ std::cerr << "freq_start must be " << usrp->get_fe_rx_freq_range().start()
+ << " or greater for this daughter board" << std::endl;
return EXIT_FAILURE;
}
- if (freq_stop > usrp->get_fe_rx_freq_range().stop())
- {
- std::cerr << "freq_stop must be " << usrp->get_fe_rx_freq_range().stop() << " or less for this daughter board" << std::endl;
+ if (freq_stop > usrp->get_fe_rx_freq_range().stop()) {
+ std::cerr << "freq_stop must be " << usrp->get_fe_rx_freq_range().stop()
+ << " or less for this daughter board" << std::endl;
return EXIT_FAILURE;
}
- //check tx_offset
- double min_tx_offset = usrp->get_tx_freq_range().start() - usrp->get_fe_rx_freq_range().start();
- double max_tx_offset = usrp->get_tx_freq_range().stop() - usrp->get_fe_rx_freq_range().stop();
- if (tx_offset < min_tx_offset or tx_offset > max_tx_offset)
- {
+ // check tx_offset
+ double min_tx_offset =
+ usrp->get_tx_freq_range().start() - usrp->get_fe_rx_freq_range().start();
+ double max_tx_offset =
+ usrp->get_tx_freq_range().stop() - usrp->get_fe_rx_freq_range().stop();
+ if (tx_offset < min_tx_offset or tx_offset > max_tx_offset) {
std::cerr << "tx_offset must be between " << min_tx_offset << " and "
- << max_tx_offset << " for this daughter board" << std::endl;
+ << max_tx_offset << " for this daughter board" << std::endl;
return EXIT_FAILURE;
}
- std::cout << boost::format("Calibration frequency range: %d MHz -> %d MHz") % (freq_start/1e6) % (freq_stop/1e6) << std::endl;
+ std::cout << boost::format("Calibration frequency range: %d MHz -> %d MHz")
+ % (freq_start / 1e6) % (freq_stop / 1e6)
+ << std::endl;
size_t tx_error_count = 0;
- for (double rx_lo_i = freq_start; rx_lo_i <= freq_stop; rx_lo_i += freq_step)
- {
+ for (double rx_lo_i = freq_start; rx_lo_i <= freq_stop; rx_lo_i += freq_step) {
const double rx_lo = tune_rx_and_tx(usrp, rx_lo_i, tx_offset);
- //frequency constants for this tune event
+ // frequency constants for this tune event
const double actual_rx_rate = usrp->get_rx_rate();
const double actual_tx_freq = usrp->get_tx_freq();
const double actual_rx_freq = usrp->get_rx_freq();
- const double bb_tone_freq = actual_tx_freq - actual_rx_freq;
- const double bb_imag_freq = -bb_tone_freq;
+ const double bb_tone_freq = actual_tx_freq - actual_rx_freq;
+ const double bb_imag_freq = -bb_tone_freq;
- //reset RX IQ balance
+ // reset RX IQ balance
usrp->set_rx_iq_balance(0.0);
- //set optimal RX gain setting for this frequency
+ // set optimal RX gain setting for this frequency
set_optimal_rx_gain(usrp, rx_stream);
- //capture initial uncorrected value
+ // capture initial uncorrected value
capture_samples(usrp, rx_stream, buff, nsamps);
- const double initial_suppression = compute_tone_dbrms(buff, bb_tone_freq/actual_rx_rate) - compute_tone_dbrms(buff, bb_imag_freq/actual_rx_rate);
+ const double initial_suppression =
+ compute_tone_dbrms(buff, bb_tone_freq / actual_rx_rate)
+ - compute_tone_dbrms(buff, bb_imag_freq / actual_rx_rate);
- //bounds and results from searching
+ // bounds and results from searching
double phase_corr_start = -1.0;
- double phase_corr_stop = 1.0;
- double phase_corr_step = (phase_corr_stop - phase_corr_start)/(num_search_steps+1);
+ double phase_corr_stop = 1.0;
+ double phase_corr_step =
+ (phase_corr_stop - phase_corr_start) / (num_search_steps + 1);
double ampl_corr_start = -1.0;
- double ampl_corr_stop = 1.0;
- double ampl_corr_step = (ampl_corr_stop - ampl_corr_start)/(num_search_steps+1);
+ double ampl_corr_stop = 1.0;
+ double ampl_corr_step =
+ (ampl_corr_stop - ampl_corr_start) / (num_search_steps + 1);
double best_suppression = 0;
- double best_phase_corr = 0;
- double best_ampl_corr = 0;
- while (phase_corr_step >= precision or ampl_corr_step >= precision)
- {
- for (double phase_corr = phase_corr_start + phase_corr_step; phase_corr <= phase_corr_stop - phase_corr_step; phase_corr += phase_corr_step)
- {
- for (double ampl_corr = ampl_corr_start + ampl_corr_step; ampl_corr <= ampl_corr_stop - ampl_corr_step; ampl_corr += ampl_corr_step)
- {
+ double best_phase_corr = 0;
+ double best_ampl_corr = 0;
+ while (phase_corr_step >= precision or ampl_corr_step >= precision) {
+ for (double phase_corr = phase_corr_start + phase_corr_step;
+ phase_corr <= phase_corr_stop - phase_corr_step;
+ phase_corr += phase_corr_step) {
+ for (double ampl_corr = ampl_corr_start + ampl_corr_step;
+ ampl_corr <= ampl_corr_stop - ampl_corr_step;
+ ampl_corr += ampl_corr_step) {
const std::complex<double> correction(ampl_corr, phase_corr);
usrp->set_rx_iq_balance(correction);
- //receive some samples
+ // receive some samples
capture_samples(usrp, rx_stream, buff, nsamps);
- //check for TX errors in the current captured iteration
- if (has_tx_error(tx_stream)){
+ // check for TX errors in the current captured iteration
+ if (has_tx_error(tx_stream)) {
if (vm.count("verbose")) {
- std::cout
- << "[WARNING] TX error detected! "
- << "Repeating current iteration"
- << std::endl;
+ std::cout << "[WARNING] TX error detected! "
+ << "Repeating current iteration" << std::endl;
}
// Undo the correction step:
ampl_corr -= ampl_corr_step;
tx_error_count++;
if (tx_error_count >= MAX_NUM_TX_ERRORS) {
throw uhd::runtime_error(
- "Too many TX errors. Aborting calibration."
- );
+ "Too many TX errors. Aborting calibration.");
}
continue;
}
- const double tone_dbrms = compute_tone_dbrms(buff, bb_tone_freq/actual_rx_rate);
- const double imag_dbrms = compute_tone_dbrms(buff, bb_imag_freq/actual_rx_rate);
+ const double tone_dbrms =
+ compute_tone_dbrms(buff, bb_tone_freq / actual_rx_rate);
+ const double imag_dbrms =
+ compute_tone_dbrms(buff, bb_imag_freq / actual_rx_rate);
const double suppression = tone_dbrms - imag_dbrms;
- if (suppression > best_suppression)
- {
+ if (suppression > best_suppression) {
best_suppression = suppression;
- best_phase_corr = phase_corr;
- best_ampl_corr = ampl_corr;
+ best_phase_corr = phase_corr;
+ best_ampl_corr = ampl_corr;
}
}
}
phase_corr_start = best_phase_corr - phase_corr_step;
- phase_corr_stop = best_phase_corr + phase_corr_step;
- phase_corr_step = (phase_corr_stop - phase_corr_start)/(num_search_steps+1);
+ phase_corr_stop = best_phase_corr + phase_corr_step;
+ phase_corr_step =
+ (phase_corr_stop - phase_corr_start) / (num_search_steps + 1);
ampl_corr_start = best_ampl_corr - ampl_corr_step;
- ampl_corr_stop = best_ampl_corr + ampl_corr_step;
- ampl_corr_step = (ampl_corr_stop - ampl_corr_start)/(num_search_steps+1);
+ ampl_corr_stop = best_ampl_corr + ampl_corr_step;
+ ampl_corr_step = (ampl_corr_stop - ampl_corr_start) / (num_search_steps + 1);
}
- if (best_suppression > initial_suppression) //keep result
+ if (best_suppression > initial_suppression) // keep result
{
result_t result;
- result.freq = rx_lo;
+ result.freq = rx_lo;
result.real_corr = best_ampl_corr;
result.imag_corr = best_phase_corr;
- result.best = best_suppression;
- result.delta = best_suppression - initial_suppression;
+ result.best = best_suppression;
+ result.delta = best_suppression - initial_suppression;
results.push_back(result);
if (vm.count("verbose"))
- std::cout << boost::format("RX IQ: %f MHz: best suppression %f dB, corrected %f dB") % (rx_lo/1e6) % result.best % result.delta << std::endl;
+ std::cout << boost::format(
+ "RX IQ: %f MHz: best suppression %f dB, corrected %f dB")
+ % (rx_lo / 1e6) % result.best % result.delta
+ << std::endl;
else
std::cout << "." << std::flush;
}
@@ -273,9 +287,10 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
} // end for each frequency loop
std::cout << std::endl;
- //stop the transmitter
+ // stop the transmitter
threads.interrupt_all();
- std::this_thread::sleep_for(std::chrono::milliseconds(500)); //wait for threads to finish
+ std::this_thread::sleep_for(
+ std::chrono::milliseconds(500)); // wait for threads to finish
threads.join_all();
store_results(results, "RX", "rx", "iq", serial);
diff --git a/host/utils/uhd_cal_tx_dc_offset.cpp b/host/utils/uhd_cal_tx_dc_offset.cpp
index 6519cd9ec..f47b5e913 100644
--- a/host/utils/uhd_cal_tx_dc_offset.cpp
+++ b/host/utils/uhd_cal_tx_dc_offset.cpp
@@ -6,19 +6,19 @@
//
#include "usrp_cal_utils.hpp"
-#include <uhd/utils/thread.hpp>
-#include <uhd/utils/safe_main.hpp>
-#include <uhd/utils/paths.hpp>
-#include <uhd/utils/algorithm.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/algorithm.hpp>
+#include <uhd/utils/paths.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
#include <boost/format.hpp>
-#include <boost/thread/thread.hpp>
#include <boost/math/special_functions/round.hpp>
-#include <iostream>
+#include <boost/program_options.hpp>
+#include <boost/thread/thread.hpp>
+#include <chrono>
#include <complex>
#include <ctime>
-#include <chrono>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
@@ -26,33 +26,35 @@ namespace po = boost::program_options;
/***********************************************************************
* Transmit thread
**********************************************************************/
-static void tx_thread(uhd::usrp::multi_usrp::sptr usrp, uhd::tx_streamer::sptr tx_stream, const double tx_wave_freq, const double tx_wave_ampl)
+static void tx_thread(uhd::usrp::multi_usrp::sptr usrp,
+ uhd::tx_streamer::sptr tx_stream,
+ const double tx_wave_freq,
+ const double tx_wave_ampl)
{
uhd::set_thread_priority_safe();
// set max TX gain
usrp->set_tx_gain(usrp->get_tx_gain_range().stop());
- //setup variables and allocate buffer
+ // setup variables and allocate buffer
uhd::tx_metadata_t md;
md.has_time_spec = false;
- std::vector<samp_type> buff(tx_stream->get_max_num_samps()*10);
+ std::vector<samp_type> buff(tx_stream->get_max_num_samps() * 10);
- //values for the wave table lookup
- size_t index = 0;
+ // values for the wave table lookup
+ size_t index = 0;
const double tx_rate = usrp->get_tx_rate();
- const size_t step = boost::math::iround(wave_table_len * tx_wave_freq / tx_rate);
+ const size_t step = boost::math::iround(wave_table_len * tx_wave_freq / tx_rate);
wave_table table(tx_wave_ampl);
- //fill buff and send until interrupted
- while (not boost::this_thread::interruption_requested())
- {
+ // fill buff and send until interrupted
+ while (not boost::this_thread::interruption_requested()) {
for (size_t i = 0; i < buff.size(); i++)
buff[i] = table(index += step);
tx_stream->send(&buff.front(), buff.size(), md);
}
- //send a mini EOB packet
+ // send a mini EOB packet
md.end_of_burst = true;
tx_stream->send("", 0, md);
}
@@ -60,21 +62,22 @@ static void tx_thread(uhd::usrp::multi_usrp::sptr usrp, uhd::tx_streamer::sptr t
/***********************************************************************
* Tune RX and TX routine
**********************************************************************/
-static double tune_rx_and_tx(uhd::usrp::multi_usrp::sptr usrp, const double tx_lo_freq, const double rx_offset)
+static double tune_rx_and_tx(
+ uhd::usrp::multi_usrp::sptr usrp, const double tx_lo_freq, const double rx_offset)
{
- //tune the transmitter with no cordic
+ // tune the transmitter with no cordic
uhd::tune_request_t tx_tune_req(tx_lo_freq);
tx_tune_req.dsp_freq_policy = uhd::tune_request_t::POLICY_MANUAL;
- tx_tune_req.dsp_freq = 0;
+ tx_tune_req.dsp_freq = 0;
usrp->set_tx_freq(tx_tune_req);
- //tune the receiver
- double rx_freq = usrp->get_tx_freq() - rx_offset;
+ // tune the receiver
+ double rx_freq = usrp->get_tx_freq() - rx_offset;
double min_fe_rx_freq = usrp->get_fe_rx_freq_range().start();
double max_fe_rx_freq = usrp->get_fe_rx_freq_range().stop();
uhd::tune_request_t rx_tune_req(rx_freq);
rx_tune_req.dsp_freq_policy = uhd::tune_request_t::POLICY_MANUAL;
- rx_tune_req.dsp_freq = 0;
+ rx_tune_req.dsp_freq = 0;
if (rx_freq < min_fe_rx_freq)
rx_tune_req.dsp_freq = rx_freq - min_fe_rx_freq;
else if (rx_freq > max_fe_rx_freq)
@@ -89,7 +92,7 @@ static double tune_rx_and_tx(uhd::usrp::multi_usrp::sptr usrp, const double tx_l
/***********************************************************************
* Main
**********************************************************************/
-int UHD_SAFE_MAIN(int argc, char *argv[])
+int UHD_SAFE_MAIN(int argc, char* argv[])
{
std::string args, subdev, serial;
double tx_wave_freq, tx_wave_ampl, rx_offset;
@@ -119,13 +122,16 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
- std::cout << boost::format("USRP Generate TX DC Offset Calibration Table %s") % desc << std::endl;
- std::cout <<
- "This application measures leakage between RX and TX on a transceiver daughterboard to self-calibrate.\n"
- "Note: Not all daughterboards support this feature. Refer to the UHD manual for details.\n"
- << std::endl;
+ // print the help message
+ if (vm.count("help")) {
+ std::cout << boost::format("USRP Generate TX DC Offset Calibration Table %s")
+ % desc
+ << std::endl;
+ std::cout << "This application measures leakage between RX and TX on a "
+ "transceiver daughterboard to self-calibrate.\n"
+ "Note: Not all daughterboards support this feature. Refer to the "
+ "UHD manual for details.\n"
+ << std::endl;
return EXIT_FAILURE;
}
@@ -135,138 +141,145 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
if (not vm.count("nsamps"))
nsamps = size_t(usrp->get_rx_rate() / default_fft_bin_size);
- //create a receive streamer
- uhd::stream_args_t stream_args("fc32"); //complex floats
+ // create a receive streamer
+ uhd::stream_args_t stream_args("fc32"); // complex floats
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
- //create a transmit streamer
+ // create a transmit streamer
uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(stream_args);
- //create a transmitter thread
+ // create a transmitter thread
boost::thread_group threads;
- threads.create_thread(boost::bind(&tx_thread, usrp, tx_stream, tx_wave_freq, tx_wave_ampl));
+ threads.create_thread(
+ boost::bind(&tx_thread, usrp, tx_stream, tx_wave_freq, tx_wave_ampl));
- //re-usable buffer for samples
+ // re-usable buffer for samples
std::vector<samp_type> buff;
- //store the results here
+ // store the results here
std::vector<result_t> results;
- if (not vm.count("freq_start")) freq_start = usrp->get_fe_tx_freq_range().start();
- if (not vm.count("freq_stop")) freq_stop = usrp->get_fe_tx_freq_range().stop();
+ if (not vm.count("freq_start"))
+ freq_start = usrp->get_fe_tx_freq_range().start();
+ if (not vm.count("freq_stop"))
+ freq_stop = usrp->get_fe_tx_freq_range().stop();
- //check start and stop frequencies
- if (freq_start < usrp->get_fe_tx_freq_range().start())
- {
- std::cerr << "freq_start must be " << usrp->get_fe_tx_freq_range().start() << " or greater for this daughter board" << std::endl;
+ // check start and stop frequencies
+ if (freq_start < usrp->get_fe_tx_freq_range().start()) {
+ std::cerr << "freq_start must be " << usrp->get_fe_tx_freq_range().start()
+ << " or greater for this daughter board" << std::endl;
return EXIT_FAILURE;
}
- if (freq_stop > usrp->get_fe_tx_freq_range().stop())
- {
- std::cerr << "freq_stop must be " << usrp->get_fe_tx_freq_range().stop() << " or less for this daughter board" << std::endl;
+ if (freq_stop > usrp->get_fe_tx_freq_range().stop()) {
+ std::cerr << "freq_stop must be " << usrp->get_fe_tx_freq_range().stop()
+ << " or less for this daughter board" << std::endl;
return EXIT_FAILURE;
}
- //check rx_offset
- double min_rx_offset = usrp->get_rx_freq_range().start() - usrp->get_fe_tx_freq_range().start();
- double max_rx_offset = usrp->get_rx_freq_range().stop() - usrp->get_fe_tx_freq_range().stop();
- if (rx_offset < min_rx_offset or rx_offset > max_rx_offset)
- {
+ // check rx_offset
+ double min_rx_offset =
+ usrp->get_rx_freq_range().start() - usrp->get_fe_tx_freq_range().start();
+ double max_rx_offset =
+ usrp->get_rx_freq_range().stop() - usrp->get_fe_tx_freq_range().stop();
+ if (rx_offset < min_rx_offset or rx_offset > max_rx_offset) {
std::cerr << "rx_offset must be between " << min_rx_offset << " and "
- << max_rx_offset << " for this daughter board" << std::endl;
+ << max_rx_offset << " for this daughter board" << std::endl;
return EXIT_FAILURE;
}
- std::cout << boost::format("Calibration frequency range: %d MHz -> %d MHz") % (freq_start/1e6) % (freq_stop/1e6) << std::endl;
+ std::cout << boost::format("Calibration frequency range: %d MHz -> %d MHz")
+ % (freq_start / 1e6) % (freq_stop / 1e6)
+ << std::endl;
- //set RX gain
+ // set RX gain
usrp->set_rx_gain(0);
size_t tx_error_count = 0;
- for (double tx_lo_i = freq_start; tx_lo_i <= freq_stop; tx_lo_i += freq_step)
- {
+ for (double tx_lo_i = freq_start; tx_lo_i <= freq_stop; tx_lo_i += freq_step) {
const double tx_lo = tune_rx_and_tx(usrp, tx_lo_i, rx_offset);
- //frequency constants for this tune event
+ // frequency constants for this tune event
const double actual_rx_rate = usrp->get_rx_rate();
const double actual_tx_freq = usrp->get_tx_freq();
const double actual_rx_freq = usrp->get_rx_freq();
- const double bb_dc_freq = actual_tx_freq - actual_rx_freq;
+ const double bb_dc_freq = actual_tx_freq - actual_rx_freq;
- //reset TX DC offset
+ // reset TX DC offset
usrp->set_tx_dc_offset(std::complex<double>(0, 0));
- //capture initial uncorrected value
+ // capture initial uncorrected value
capture_samples(usrp, rx_stream, buff, nsamps);
- const double initial_dc_dbrms = compute_tone_dbrms(buff, bb_dc_freq/actual_rx_rate);
-
- //bounds and results from searching
- double i_corr_start = -1.0;
- double i_corr_stop = 1.0;
- double i_corr_step = (i_corr_stop - i_corr_start)/(num_search_steps+1);
- double q_corr_start = -1.0;
- double q_corr_stop = 1.0;
- double q_corr_step= (q_corr_stop - q_corr_start)/(num_search_steps+1);
+ const double initial_dc_dbrms =
+ compute_tone_dbrms(buff, bb_dc_freq / actual_rx_rate);
+
+ // bounds and results from searching
+ double i_corr_start = -1.0;
+ double i_corr_stop = 1.0;
+ double i_corr_step = (i_corr_stop - i_corr_start) / (num_search_steps + 1);
+ double q_corr_start = -1.0;
+ double q_corr_stop = 1.0;
+ double q_corr_step = (q_corr_stop - q_corr_start) / (num_search_steps + 1);
double best_dc_dbrms = initial_dc_dbrms;
- double best_i_corr = 0;
- double best_q_corr = 0;
- while (i_corr_step >= precision or q_corr_step >= precision)
- {
- for (double i_corr = i_corr_start + i_corr_step; i_corr <= i_corr_stop - i_corr_step; i_corr += i_corr_step)
- {
- for (double q_corr = q_corr_start + q_corr_step; q_corr <= q_corr_stop - q_corr_step; q_corr += q_corr_step)
- {
+ double best_i_corr = 0;
+ double best_q_corr = 0;
+ while (i_corr_step >= precision or q_corr_step >= precision) {
+ for (double i_corr = i_corr_start + i_corr_step;
+ i_corr <= i_corr_stop - i_corr_step;
+ i_corr += i_corr_step) {
+ for (double q_corr = q_corr_start + q_corr_step;
+ q_corr <= q_corr_stop - q_corr_step;
+ q_corr += q_corr_step) {
const std::complex<double> correction(i_corr, q_corr);
usrp->set_tx_dc_offset(correction);
- //receive some samples
+ // receive some samples
capture_samples(usrp, rx_stream, buff, nsamps);
- //check for TX errors in the current captured iteration
- if (has_tx_error(tx_stream)){
- std::cout
- << "[WARNING] TX error detected! "
- << "Repeating current iteration"
- << std::endl;
+ // check for TX errors in the current captured iteration
+ if (has_tx_error(tx_stream)) {
+ std::cout << "[WARNING] TX error detected! "
+ << "Repeating current iteration" << std::endl;
// Undo the Q correction step
q_corr -= q_corr_step;
tx_error_count++;
if (tx_error_count >= MAX_NUM_TX_ERRORS) {
throw uhd::runtime_error(
- "Too many TX errors. Aborting calibration."
- );
+ "Too many TX errors. Aborting calibration.");
}
continue;
}
- const double dc_dbrms = compute_tone_dbrms(buff, bb_dc_freq/actual_rx_rate);
+ const double dc_dbrms =
+ compute_tone_dbrms(buff, bb_dc_freq / actual_rx_rate);
- if (dc_dbrms < best_dc_dbrms)
- {
+ if (dc_dbrms < best_dc_dbrms) {
best_dc_dbrms = dc_dbrms;
- best_i_corr = i_corr;
- best_q_corr = q_corr;
+ best_i_corr = i_corr;
+ best_q_corr = q_corr;
}
}
}
i_corr_start = best_i_corr - i_corr_step;
- i_corr_stop = best_i_corr + i_corr_step;
- i_corr_step = (i_corr_stop - i_corr_start)/(num_search_steps+1);
+ i_corr_stop = best_i_corr + i_corr_step;
+ i_corr_step = (i_corr_stop - i_corr_start) / (num_search_steps + 1);
q_corr_start = best_q_corr - q_corr_step;
- q_corr_stop = best_q_corr + q_corr_step;
- q_corr_step = (q_corr_stop - q_corr_start)/(num_search_steps+1);
+ q_corr_stop = best_q_corr + q_corr_step;
+ q_corr_step = (q_corr_stop - q_corr_start) / (num_search_steps + 1);
}
- if (best_dc_dbrms < initial_dc_dbrms) //keep result
+ if (best_dc_dbrms < initial_dc_dbrms) // keep result
{
result_t result;
- result.freq = tx_lo;
+ result.freq = tx_lo;
result.real_corr = best_i_corr;
result.imag_corr = best_q_corr;
- result.best = best_dc_dbrms;
- result.delta = initial_dc_dbrms - best_dc_dbrms;
+ result.best = best_dc_dbrms;
+ result.delta = initial_dc_dbrms - best_dc_dbrms;
results.push_back(result);
if (vm.count("verbose"))
- std::cout << boost::format("TX DC: %f MHz: lowest offset %f dB, corrected %f dB") % (tx_lo/1e6) % result.best % result.delta << std::endl;
+ std::cout << boost::format(
+ "TX DC: %f MHz: lowest offset %f dB, corrected %f dB")
+ % (tx_lo / 1e6) % result.best % result.delta
+ << std::endl;
else
std::cout << "." << std::flush;
}
@@ -277,9 +290,10 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
std::cout << std::endl;
- //stop the transmitter
+ // stop the transmitter
threads.interrupt_all();
- std::this_thread::sleep_for(std::chrono::milliseconds(500)); //wait for threads to finish
+ std::this_thread::sleep_for(
+ std::chrono::milliseconds(500)); // wait for threads to finish
threads.join_all();
store_results(results, "TX", "tx", "dc", serial);
diff --git a/host/utils/uhd_cal_tx_iq_balance.cpp b/host/utils/uhd_cal_tx_iq_balance.cpp
index 4da5a1f96..2e7229fd3 100644
--- a/host/utils/uhd_cal_tx_iq_balance.cpp
+++ b/host/utils/uhd_cal_tx_iq_balance.cpp
@@ -6,16 +6,16 @@
//
#include "usrp_cal_utils.hpp"
-#include <uhd/utils/thread.hpp>
#include <uhd/utils/safe_main.hpp>
+#include <uhd/utils/thread.hpp>
+#include <boost/math/special_functions/round.hpp>
#include <boost/program_options.hpp>
#include <boost/thread/thread.hpp>
-#include <boost/math/special_functions/round.hpp>
-#include <iostream>
+#include <chrono>
#include <complex>
-#include <ctime>
#include <cstdlib>
-#include <chrono>
+#include <ctime>
+#include <iostream>
#include <thread>
namespace po = boost::program_options;
@@ -23,33 +23,35 @@ namespace po = boost::program_options;
/***********************************************************************
* Transmit thread
**********************************************************************/
-static void tx_thread(uhd::usrp::multi_usrp::sptr usrp, uhd::tx_streamer::sptr tx_stream, const double tx_wave_freq, const double tx_wave_ampl)
+static void tx_thread(uhd::usrp::multi_usrp::sptr usrp,
+ uhd::tx_streamer::sptr tx_stream,
+ const double tx_wave_freq,
+ const double tx_wave_ampl)
{
uhd::set_thread_priority_safe();
// set max TX gain
usrp->set_tx_gain(usrp->get_tx_gain_range().stop());
- //setup variables and allocate buffer
+ // setup variables and allocate buffer
uhd::tx_metadata_t md;
md.has_time_spec = false;
- std::vector<samp_type> buff(tx_stream->get_max_num_samps()*10);
+ std::vector<samp_type> buff(tx_stream->get_max_num_samps() * 10);
- //values for the wave table lookup
- size_t index = 0;
+ // values for the wave table lookup
+ size_t index = 0;
const double tx_rate = usrp->get_tx_rate();
- const size_t step = boost::math::iround(wave_table_len * tx_wave_freq / tx_rate);
+ const size_t step = boost::math::iround(wave_table_len * tx_wave_freq / tx_rate);
wave_table table(tx_wave_ampl);
- //fill buff and send until interrupted
- while (not boost::this_thread::interruption_requested())
- {
+ // fill buff and send until interrupted
+ while (not boost::this_thread::interruption_requested()) {
for (size_t i = 0; i < buff.size(); i++)
buff[i] = table(index += step);
tx_stream->send(&buff.front(), buff.size(), md);
}
- //send a mini EOB packet
+ // send a mini EOB packet
md.end_of_burst = true;
tx_stream->send("", 0, md);
}
@@ -57,21 +59,22 @@ static void tx_thread(uhd::usrp::multi_usrp::sptr usrp, uhd::tx_streamer::sptr t
/***********************************************************************
* Tune RX and TX routine
**********************************************************************/
-static double tune_rx_and_tx(uhd::usrp::multi_usrp::sptr usrp, const double tx_lo_freq, const double rx_offset)
+static double tune_rx_and_tx(
+ uhd::usrp::multi_usrp::sptr usrp, const double tx_lo_freq, const double rx_offset)
{
- //tune the transmitter with no cordic
+ // tune the transmitter with no cordic
uhd::tune_request_t tx_tune_req(tx_lo_freq);
tx_tune_req.dsp_freq_policy = uhd::tune_request_t::POLICY_MANUAL;
- tx_tune_req.dsp_freq = 0;
+ tx_tune_req.dsp_freq = 0;
usrp->set_tx_freq(tx_tune_req);
- //tune the receiver
- double rx_freq = usrp->get_tx_freq() - rx_offset;
+ // tune the receiver
+ double rx_freq = usrp->get_tx_freq() - rx_offset;
double min_fe_rx_freq = usrp->get_fe_rx_freq_range().start();
double max_fe_rx_freq = usrp->get_fe_rx_freq_range().stop();
uhd::tune_request_t rx_tune_req(rx_freq);
rx_tune_req.dsp_freq_policy = uhd::tune_request_t::POLICY_MANUAL;
- rx_tune_req.dsp_freq = 0;
+ rx_tune_req.dsp_freq = 0;
if (rx_freq < min_fe_rx_freq)
rx_tune_req.dsp_freq = rx_freq - min_fe_rx_freq;
else if (rx_freq > max_fe_rx_freq)
@@ -86,7 +89,7 @@ static double tune_rx_and_tx(uhd::usrp::multi_usrp::sptr usrp, const double tx_l
/***********************************************************************
* Main
**********************************************************************/
-int UHD_SAFE_MAIN(int argc, char *argv[])
+int UHD_SAFE_MAIN(int argc, char* argv[])
{
std::string args, subdev, serial;
double tx_wave_freq, tx_wave_ampl, rx_offset;
@@ -116,14 +119,16 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help"))
- {
- std::cout << boost::format("USRP Generate TX IQ Balance Calibration Table %s") % desc << std::endl;
- std::cout <<
- "This application measures leakage between RX and TX on a transceiver daughterboard to self-calibrate.\n"
- "Note: Not all daughterboards support this feature. Refer to the UHD manual for details.\n"
- << std::endl;
+ // print the help message
+ if (vm.count("help")) {
+ std::cout << boost::format("USRP Generate TX IQ Balance Calibration Table %s")
+ % desc
+ << std::endl;
+ std::cout << "This application measures leakage between RX and TX on a "
+ "transceiver daughterboard to self-calibrate.\n"
+ "Note: Not all daughterboards support this feature. Refer to the "
+ "UHD manual for details.\n"
+ << std::endl;
return EXIT_FAILURE;
}
@@ -133,140 +138,151 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
if (not vm.count("nsamps"))
nsamps = size_t(usrp->get_rx_rate() / default_fft_bin_size);
- //create a receive streamer
- uhd::stream_args_t stream_args("fc32"); //complex floats
+ // create a receive streamer
+ uhd::stream_args_t stream_args("fc32"); // complex floats
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
- //create a transmit streamer
+ // create a transmit streamer
uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(stream_args);
- //create a transmitter thread
+ // create a transmitter thread
boost::thread_group threads;
- threads.create_thread(boost::bind(&tx_thread, usrp, tx_stream, tx_wave_freq, tx_wave_ampl));
+ threads.create_thread(
+ boost::bind(&tx_thread, usrp, tx_stream, tx_wave_freq, tx_wave_ampl));
- //re-usable buffer for samples
+ // re-usable buffer for samples
std::vector<samp_type> buff;
- //store the results here
+ // store the results here
std::vector<result_t> results;
- if (not vm.count("freq_start")) freq_start = usrp->get_fe_tx_freq_range().start();
- if (not vm.count("freq_stop")) freq_stop = usrp->get_fe_tx_freq_range().stop();
+ if (not vm.count("freq_start"))
+ freq_start = usrp->get_fe_tx_freq_range().start();
+ if (not vm.count("freq_stop"))
+ freq_stop = usrp->get_fe_tx_freq_range().stop();
- //check start and stop frequencies
- if (freq_start < usrp->get_fe_tx_freq_range().start())
- {
- std::cerr << "freq_start must be " << usrp->get_fe_tx_freq_range().start() << " or greater for this daughter board" << std::endl;
+ // check start and stop frequencies
+ if (freq_start < usrp->get_fe_tx_freq_range().start()) {
+ std::cerr << "freq_start must be " << usrp->get_fe_tx_freq_range().start()
+ << " or greater for this daughter board" << std::endl;
return EXIT_FAILURE;
}
- if (freq_stop > usrp->get_fe_tx_freq_range().stop())
- {
- std::cerr << "freq_stop must be " << usrp->get_fe_tx_freq_range().stop() << " or less for this daughter board" << std::endl;
+ if (freq_stop > usrp->get_fe_tx_freq_range().stop()) {
+ std::cerr << "freq_stop must be " << usrp->get_fe_tx_freq_range().stop()
+ << " or less for this daughter board" << std::endl;
return EXIT_FAILURE;
}
- //check rx_offset
- double min_rx_offset = usrp->get_rx_freq_range().start() - usrp->get_fe_tx_freq_range().start();
- double max_rx_offset = usrp->get_rx_freq_range().stop() - usrp->get_fe_tx_freq_range().stop();
- if (rx_offset < min_rx_offset or rx_offset > max_rx_offset)
- {
+ // check rx_offset
+ double min_rx_offset =
+ usrp->get_rx_freq_range().start() - usrp->get_fe_tx_freq_range().start();
+ double max_rx_offset =
+ usrp->get_rx_freq_range().stop() - usrp->get_fe_tx_freq_range().stop();
+ if (rx_offset < min_rx_offset or rx_offset > max_rx_offset) {
std::cerr << "rx_offset must be between " << min_rx_offset << " and "
- << max_rx_offset << " for this daughter board" << std::endl;
+ << max_rx_offset << " for this daughter board" << std::endl;
return EXIT_FAILURE;
}
- std::cout << boost::format("Calibration frequency range: %d MHz -> %d MHz") % (freq_start/1e6) % (freq_stop/1e6) << std::endl;
+ std::cout << boost::format("Calibration frequency range: %d MHz -> %d MHz")
+ % (freq_start / 1e6) % (freq_stop / 1e6)
+ << std::endl;
size_t tx_error_count = 0;
- for (double tx_lo_i = freq_start; tx_lo_i <= freq_stop; tx_lo_i += freq_step)
- {
-
+ for (double tx_lo_i = freq_start; tx_lo_i <= freq_stop; tx_lo_i += freq_step) {
const double tx_lo = tune_rx_and_tx(usrp, tx_lo_i, rx_offset);
- //frequency constants for this tune event
+ // frequency constants for this tune event
const double actual_rx_rate = usrp->get_rx_rate();
const double actual_tx_freq = usrp->get_tx_freq();
const double actual_rx_freq = usrp->get_rx_freq();
- const double bb_tone_freq = actual_tx_freq + tx_wave_freq - actual_rx_freq;
- const double bb_imag_freq = actual_tx_freq - tx_wave_freq - actual_rx_freq;
+ const double bb_tone_freq = actual_tx_freq + tx_wave_freq - actual_rx_freq;
+ const double bb_imag_freq = actual_tx_freq - tx_wave_freq - actual_rx_freq;
- //reset TX IQ balance
+ // reset TX IQ balance
usrp->set_tx_iq_balance(0.0);
- //set optimal RX gain setting for this frequency
+ // set optimal RX gain setting for this frequency
set_optimal_rx_gain(usrp, rx_stream, tx_wave_freq);
- //capture initial uncorrected value
+ // capture initial uncorrected value
capture_samples(usrp, rx_stream, buff, nsamps);
- const double initial_suppression = compute_tone_dbrms(buff, bb_tone_freq/actual_rx_rate) - compute_tone_dbrms(buff, bb_imag_freq/actual_rx_rate);
+ const double initial_suppression =
+ compute_tone_dbrms(buff, bb_tone_freq / actual_rx_rate)
+ - compute_tone_dbrms(buff, bb_imag_freq / actual_rx_rate);
- //bounds and results from searching
+ // bounds and results from searching
double phase_corr_start = -1.0;
- double phase_corr_stop = 1.0;
- double phase_corr_step = (phase_corr_stop - phase_corr_start)/(num_search_steps+1);
+ double phase_corr_stop = 1.0;
+ double phase_corr_step =
+ (phase_corr_stop - phase_corr_start) / (num_search_steps + 1);
double ampl_corr_start = -1.0;
- double ampl_corr_stop = 1.0;
- double ampl_corr_step = (ampl_corr_stop - ampl_corr_start)/(num_search_steps+1);
+ double ampl_corr_stop = 1.0;
+ double ampl_corr_step =
+ (ampl_corr_stop - ampl_corr_start) / (num_search_steps + 1);
double best_suppression = 0;
- double best_phase_corr = 0;
- double best_ampl_corr = 0;
- while (phase_corr_step >= precision or ampl_corr_step >= precision)
- {
- for (double phase_corr = phase_corr_start + phase_corr_step; phase_corr <= phase_corr_stop - phase_corr_step; phase_corr += phase_corr_step)
- {
- for (double ampl_corr = ampl_corr_start + ampl_corr_step; ampl_corr <= ampl_corr_stop - ampl_corr_step; ampl_corr += ampl_corr_step)
- {
+ double best_phase_corr = 0;
+ double best_ampl_corr = 0;
+ while (phase_corr_step >= precision or ampl_corr_step >= precision) {
+ for (double phase_corr = phase_corr_start + phase_corr_step;
+ phase_corr <= phase_corr_stop - phase_corr_step;
+ phase_corr += phase_corr_step) {
+ for (double ampl_corr = ampl_corr_start + ampl_corr_step;
+ ampl_corr <= ampl_corr_stop - ampl_corr_step;
+ ampl_corr += ampl_corr_step) {
const std::complex<double> correction(ampl_corr, phase_corr);
usrp->set_tx_iq_balance(correction);
- //receive some samples
+ // receive some samples
capture_samples(usrp, rx_stream, buff, nsamps);
- //check for TX errors in the current captured iteration
- if (has_tx_error(tx_stream)){
- std::cout
- << "[WARNING] TX error detected! "
- << "Repeating current iteration"
- << std::endl;
+ // check for TX errors in the current captured iteration
+ if (has_tx_error(tx_stream)) {
+ std::cout << "[WARNING] TX error detected! "
+ << "Repeating current iteration" << std::endl;
// Undo ampl corr step
ampl_corr -= ampl_corr_step;
tx_error_count++;
if (tx_error_count >= MAX_NUM_TX_ERRORS) {
throw uhd::runtime_error(
- "Too many TX errors. Aborting calibration."
- );
+ "Too many TX errors. Aborting calibration.");
}
continue;
}
- const double tone_dbrms = compute_tone_dbrms(buff, bb_tone_freq/actual_rx_rate);
- const double imag_dbrms = compute_tone_dbrms(buff, bb_imag_freq/actual_rx_rate);
+ const double tone_dbrms =
+ compute_tone_dbrms(buff, bb_tone_freq / actual_rx_rate);
+ const double imag_dbrms =
+ compute_tone_dbrms(buff, bb_imag_freq / actual_rx_rate);
const double suppression = tone_dbrms - imag_dbrms;
- if (suppression > best_suppression)
- {
+ if (suppression > best_suppression) {
best_suppression = suppression;
- best_phase_corr = phase_corr;
- best_ampl_corr = ampl_corr;
+ best_phase_corr = phase_corr;
+ best_ampl_corr = ampl_corr;
}
}
}
phase_corr_start = best_phase_corr - phase_corr_step;
- phase_corr_stop = best_phase_corr + phase_corr_step;
- phase_corr_step = (phase_corr_stop - phase_corr_start)/(num_search_steps+1);
+ phase_corr_stop = best_phase_corr + phase_corr_step;
+ phase_corr_step =
+ (phase_corr_stop - phase_corr_start) / (num_search_steps + 1);
ampl_corr_start = best_ampl_corr - ampl_corr_step;
- ampl_corr_stop = best_ampl_corr + ampl_corr_step;
- ampl_corr_step = (ampl_corr_stop - ampl_corr_start)/(num_search_steps+1);
+ ampl_corr_stop = best_ampl_corr + ampl_corr_step;
+ ampl_corr_step = (ampl_corr_stop - ampl_corr_start) / (num_search_steps + 1);
}
- if (best_suppression > initial_suppression) //keep result
+ if (best_suppression > initial_suppression) // keep result
{
result_t result;
- result.freq = tx_lo;
+ result.freq = tx_lo;
result.real_corr = best_ampl_corr;
result.imag_corr = best_phase_corr;
- result.best = best_suppression;
- result.delta = best_suppression - initial_suppression;
+ result.best = best_suppression;
+ result.delta = best_suppression - initial_suppression;
results.push_back(result);
if (vm.count("verbose"))
- std::cout << boost::format("TX IQ: %f MHz: best suppression %f dB, corrected %f dB") % (tx_lo/1e6) % result.best % result.delta << std::endl;
+ std::cout << boost::format(
+ "TX IQ: %f MHz: best suppression %f dB, corrected %f dB")
+ % (tx_lo / 1e6) % result.best % result.delta
+ << std::endl;
else
std::cout << "." << std::flush;
}
@@ -276,13 +292,13 @@ int UHD_SAFE_MAIN(int argc, char *argv[])
}
std::cout << std::endl;
- //stop the transmitter
+ // stop the transmitter
threads.interrupt_all();
- std::this_thread::sleep_for(std::chrono::milliseconds(500)); //wait for threads to finish
+ std::this_thread::sleep_for(
+ std::chrono::milliseconds(500)); // wait for threads to finish
threads.join_all();
store_results(results, "TX", "tx", "iq", serial);
return EXIT_SUCCESS;
}
-
diff --git a/host/utils/uhd_config_info.cpp b/host/utils/uhd_config_info.cpp
index 2c29af214..784ca9ff2 100644
--- a/host/utils/uhd_config_info.cpp
+++ b/host/utils/uhd_config_info.cpp
@@ -5,16 +5,16 @@
//
#include <uhd/build_info.hpp>
-#include <uhd/version.hpp>
#include <uhd/utils/paths.hpp>
#include <uhd/utils/safe_main.hpp>
-
+#include <uhd/version.hpp>
#include <boost/format.hpp>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char* argv[]) {
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
// Program Options
po::options_description desc("Allowed Options");
// clang-format off
@@ -42,51 +42,53 @@ int UHD_SAFE_MAIN(int argc, char* argv[]) {
po::notify(vm);
// Print the help message
- if(vm.count("help") > 0) {
+ if (vm.count("help") > 0) {
std::cout << boost::format("UHD Config Info - %s") % desc << std::endl;
return EXIT_FAILURE;
}
bool print_all = (vm.count("print-all") > 0);
- if(vm.count("version") > 0 or print_all) {
+ if (vm.count("version") > 0 or print_all) {
std::cout << "UHD " << uhd::get_version_string() << std::endl;
}
- if(vm.count("build-date") > 0 or print_all) {
+ if (vm.count("build-date") > 0 or print_all) {
std::cout << "Build date: " << uhd::build_info::build_date() << std::endl;
}
- if(vm.count("c-compiler") > 0 or print_all) {
+ if (vm.count("c-compiler") > 0 or print_all) {
std::cout << "C compiler: " << uhd::build_info::c_compiler() << std::endl;
}
- if(vm.count("cxx-compiler") > 0 or print_all) {
+ if (vm.count("cxx-compiler") > 0 or print_all) {
std::cout << "C++ compiler: " << uhd::build_info::cxx_compiler() << std::endl;
}
- if(vm.count("c-flags") > 0 or print_all) {
+ if (vm.count("c-flags") > 0 or print_all) {
std::cout << "C flags: " << uhd::build_info::c_flags() << std::endl;
}
- if(vm.count("cxx-flags") > 0 or print_all) {
+ if (vm.count("cxx-flags") > 0 or print_all) {
std::cout << "C++ flags: " << uhd::build_info::cxx_flags() << std::endl;
}
- if(vm.count("enabled-components") > 0 or print_all) {
- std::cout << "Enabled components: " << uhd::build_info::enabled_components() << std::endl;
+ if (vm.count("enabled-components") > 0 or print_all) {
+ std::cout << "Enabled components: " << uhd::build_info::enabled_components()
+ << std::endl;
}
- if(vm.count("install-prefix") > 0 or print_all) {
+ if (vm.count("install-prefix") > 0 or print_all) {
std::cout << "Install prefix: " << uhd::build_info::install_prefix() << std::endl;
}
- if(vm.count("boost-version") > 0 or print_all) {
+ if (vm.count("boost-version") > 0 or print_all) {
std::cout << "Boost version: " << uhd::build_info::boost_version() << std::endl;
}
- if(vm.count("libusb-version") > 0 or print_all) {
+ if (vm.count("libusb-version") > 0 or print_all) {
std::string _libusb_version = uhd::build_info::libusb_version();
- std::cout << "Libusb version: " << (_libusb_version.empty() ? "N/A" : _libusb_version) << std::endl;
+ std::cout << "Libusb version: "
+ << (_libusb_version.empty() ? "N/A" : _libusb_version) << std::endl;
}
- if(vm.count("pkg-path") > 0 or print_all) {
+ if (vm.count("pkg-path") > 0 or print_all) {
std::cout << "Package path: " << uhd::get_pkg_path() << std::endl;
}
- if(vm.count("images-dir") > 0 or print_all) {
+ if (vm.count("images-dir") > 0 or print_all) {
std::cout << "Images directory: " << uhd::get_images_dir("") << std::endl;
}
- if(vm.count("abi-version") > 0 or print_all) {
+ if (vm.count("abi-version") > 0 or print_all) {
std::cout << "ABI version string: " << uhd::get_abi_string() << std::endl;
}
diff --git a/host/utils/uhd_find_devices.cpp b/host/utils/uhd_find_devices.cpp
index 504fafcf7..ad30b168c 100644
--- a/host/utils/uhd_find_devices.cpp
+++ b/host/utils/uhd_find_devices.cpp
@@ -5,29 +5,30 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/safe_main.hpp>
#include <uhd/device.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
#include <boost/format.hpp>
-#include <iostream>
+#include <boost/program_options.hpp>
#include <cstdlib>
+#include <iostream>
namespace {
- //! Conditionally append find_all=1 if the key isn't there yet
- uhd::device_addr_t append_findall(const uhd::device_addr_t& device_args)
- {
- uhd::device_addr_t new_device_args(device_args);
- if (!new_device_args.has_key("find_all")) {
- new_device_args["find_all"] = "1";
- }
-
- return new_device_args;
+//! Conditionally append find_all=1 if the key isn't there yet
+uhd::device_addr_t append_findall(const uhd::device_addr_t& device_args)
+{
+ uhd::device_addr_t new_device_args(device_args);
+ if (!new_device_args.has_key("find_all")) {
+ new_device_args["find_all"] = "1";
}
+
+ return new_device_args;
}
+} // namespace
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -40,35 +41,34 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD Find Devices %s") % desc << std::endl;
return EXIT_SUCCESS;
}
- //discover the usrps and print the results
+ // discover the usrps and print the results
const uhd::device_addr_t args(vm["args"].as<std::string>());
- uhd::device_addrs_t device_addrs =
- uhd::device::find(append_findall(args));
+ uhd::device_addrs_t device_addrs = uhd::device::find(append_findall(args));
if (device_addrs.empty()) {
std::cerr << "No UHD Devices Found" << std::endl;
return EXIT_FAILURE;
}
- typedef std::map<std::string, std::set<std::string> > device_multi_addrs_t;
+ typedef std::map<std::string, std::set<std::string>> device_multi_addrs_t;
typedef std::map<std::string, device_multi_addrs_t> device_addrs_filtered_t;
device_addrs_filtered_t found_devices;
for (auto it = device_addrs.begin(); it != device_addrs.end(); ++it) {
- std::string serial = (*it)["serial"];
+ std::string serial = (*it)["serial"];
found_devices[serial] = device_multi_addrs_t();
- for(std::string key: it->keys()) {
+ for (std::string key : it->keys()) {
if (key != "serial") {
found_devices[serial][key].insert(it->get(key));
}
}
for (auto sit = it + 1; sit != device_addrs.end();) {
if ((*sit)["serial"] == serial) {
- for(std::string key: sit->keys()) {
+ for (std::string key : sit->keys()) {
if (key != "serial") {
found_devices[serial][key].insert(sit->get(key));
}
@@ -82,19 +82,15 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
int i = 0;
for (auto dit = found_devices.begin(); dit != found_devices.end(); ++dit) {
- std::cout << "--------------------------------------------------"
- << std::endl;
+ std::cout << "--------------------------------------------------" << std::endl;
std::cout << "-- UHD Device " << i << std::endl;
- std::cout << "--------------------------------------------------"
- << std::endl;
+ std::cout << "--------------------------------------------------" << std::endl;
std::stringstream ss;
ss << "Device Address:" << std::endl;
ss << boost::format(" serial: %s") % dit->first << std::endl;
for (auto mit = dit->second.begin(); mit != dit->second.end(); ++mit) {
- for (auto vit = mit->second.begin(); vit != mit->second.end();
- ++vit) {
- ss << boost::format(" %s: %s") % mit->first % *vit
- << std::endl;
+ for (auto vit = mit->second.begin(); vit != mit->second.end(); ++vit) {
+ ss << boost::format(" %s: %s") % mit->first % *vit << std::endl;
}
}
std::cout << ss.str() << std::endl << std::endl;
diff --git a/host/utils/uhd_image_loader.cpp b/host/utils/uhd_image_loader.cpp
index 507a4ac87..57ad57958 100644
--- a/host/utils/uhd_image_loader.cpp
+++ b/host/utils/uhd_image_loader.cpp
@@ -5,47 +5,49 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <csignal>
-#include <cstdlib>
-#include <iostream>
-
-#include <boost/assign.hpp>
-#include <boost/filesystem.hpp>
-#include <boost/format.hpp>
-
#include <uhd/config.hpp>
#include <uhd/image_loader.hpp>
#include <uhd/types/device_addr.hpp>
#include <uhd/utils/safe_main.hpp>
+#include <boost/assign.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/format.hpp>
#include <boost/program_options.hpp>
+#include <csignal>
+#include <cstdlib>
+#include <iostream>
namespace fs = boost::filesystem;
namespace po = boost::program_options;
static std::string device_type = "";
-static int num_ctrl_c = 0;
+static int num_ctrl_c = 0;
/*
* If the user presses Ctrl+C, warn them that they may corrupt their device.
* If they press it again, provide instructions on restoring the device
* (if applicable) and exit.
*/
-void sigint_handler(int){
+void sigint_handler(int)
+{
num_ctrl_c++;
- if(num_ctrl_c == 1){
+ if (num_ctrl_c == 1) {
std::cout << std::endl
- << "Are you sure you want to abort? If you do, your device will likely" << std::endl
+ << "Are you sure you want to abort? If you do, your device will likely"
+ << std::endl
<< "be in an unstable or unusable state." << std::endl
- << "Press Ctrl+C again to abort." << std::endl << std::endl;
- }
- else{
- std::cout << std::endl << uhd::image_loader::get_recovery_instructions(device_type) << std::endl;
+ << "Press Ctrl+C again to abort." << std::endl
+ << std::endl;
+ } else {
+ std::cout << std::endl
+ << uhd::image_loader::get_recovery_instructions(device_type)
+ << std::endl;
exit(EXIT_FAILURE);
}
}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
-
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -65,10 +67,11 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::notify(vm);
// Help message
- if (vm.count("help")){
+ if (vm.count("help")) {
std::cout << "UHD Image Loader" << std::endl
<< std::endl
- << "Load firmware and/or FPGA images onto an Ettus Research device." << std::endl
+ << "Load firmware and/or FPGA images onto an Ettus Research device."
+ << std::endl
<< std::endl
<< desc << std::endl;
return EXIT_FAILURE;
@@ -77,49 +80,50 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
// Convert user options
uhd::image_loader::image_loader_args_t image_loader_args;
image_loader_args.args = vm["args"].as<std::string>();
- image_loader_args.load_firmware = (vm.count("no-fw") == 0);
- image_loader_args.load_fpga = (vm.count("no-fpga") == 0);
+ image_loader_args.load_firmware = (vm.count("no-fw") == 0);
+ image_loader_args.load_fpga = (vm.count("no-fpga") == 0);
image_loader_args.download = (vm.count("download") != 0);
image_loader_args.firmware_path = vm["fw-path"].as<std::string>();
image_loader_args.fpga_path = vm["fpga-path"].as<std::string>();
image_loader_args.out_path = vm["out-path"].as<std::string>();
// Force user to specify a device
- if(not image_loader_args.args.has_key("type")){
+ if (not image_loader_args.args.has_key("type")) {
throw uhd::runtime_error("You must specify a device type.");
}
// Clean up paths, if given
- if(image_loader_args.firmware_path != ""){
- #ifndef UHD_PLATFORM_WIN32
- if(image_loader_args.firmware_path.find("~") == 0){
- image_loader_args.firmware_path.replace(0,1,getenv("HOME"));
+ if (image_loader_args.firmware_path != "") {
+#ifndef UHD_PLATFORM_WIN32
+ if (image_loader_args.firmware_path.find("~") == 0) {
+ image_loader_args.firmware_path.replace(0, 1, getenv("HOME"));
}
- #endif /* UHD_PLATFORM_WIN32 */
- image_loader_args.firmware_path = fs::absolute(image_loader_args.firmware_path).string();
+#endif /* UHD_PLATFORM_WIN32 */
+ image_loader_args.firmware_path =
+ fs::absolute(image_loader_args.firmware_path).string();
}
- if(image_loader_args.fpga_path != ""){
- #ifndef UHD_PLATFORM_WIN32
- if(image_loader_args.fpga_path.find("~") == 0){
- image_loader_args.fpga_path.replace(0,1,getenv("HOME"));
+ if (image_loader_args.fpga_path != "") {
+#ifndef UHD_PLATFORM_WIN32
+ if (image_loader_args.fpga_path.find("~") == 0) {
+ image_loader_args.fpga_path.replace(0, 1, getenv("HOME"));
}
- #endif /* UHD_PLATFORM_WIN32 */
+#endif /* UHD_PLATFORM_WIN32 */
image_loader_args.fpga_path = fs::absolute(image_loader_args.fpga_path).string();
}
- if(image_loader_args.out_path != ""){
- #ifndef UHD_PLATFORM_WIN32
- if(image_loader_args.out_path.find("~") == 0){
- image_loader_args.out_path.replace(0,1,getenv("HOME"));
+ if (image_loader_args.out_path != "") {
+#ifndef UHD_PLATFORM_WIN32
+ if (image_loader_args.out_path.find("~") == 0) {
+ image_loader_args.out_path.replace(0, 1, getenv("HOME"));
}
- #endif /* UHD_PLATFORM_WIN32 */
+#endif /* UHD_PLATFORM_WIN32 */
image_loader_args.out_path = fs::absolute(image_loader_args.out_path).string();
}
// Detect which type of device we're working with
- device_type = image_loader_args.args.get("type","");
+ device_type = image_loader_args.args.get("type", "");
std::signal(SIGINT, &sigint_handler);
- if(not uhd::image_loader::load(image_loader_args)){
+ if (not uhd::image_loader::load(image_loader_args)) {
std::cerr << "No applicable UHD devices found" << std::endl;
return EXIT_FAILURE;
}
diff --git a/host/utils/uhd_usrp_probe.cpp b/host/utils/uhd_usrp_probe.cpp
index 3522b4148..8f60b211f 100644
--- a/host/utils/uhd_usrp_probe.cpp
+++ b/host/utils/uhd_usrp_probe.cpp
@@ -5,230 +5,303 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/safe_main.hpp>
-#include <uhd/version.hpp>
#include <uhd/device.hpp>
#include <uhd/device3.hpp>
-#include <uhd/types/ranges.hpp>
#include <uhd/property_tree.hpp>
-#include <boost/algorithm/string.hpp> //for split
+#include <uhd/types/ranges.hpp>
+#include <uhd/types/sensors.hpp>
+#include <uhd/usrp/dboard_eeprom.hpp>
#include <uhd/usrp/dboard_id.hpp>
#include <uhd/usrp/mboard_eeprom.hpp>
-#include <uhd/usrp/dboard_eeprom.hpp>
-#include <uhd/types/sensors.hpp>
-#include <boost/program_options.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/version.hpp>
+#include <boost/algorithm/string.hpp> //for split
#include <boost/format.hpp>
+#include <boost/program_options.hpp>
+#include <cstdlib>
#include <iostream>
#include <sstream>
#include <vector>
-#include <cstdlib>
namespace po = boost::program_options;
using namespace uhd;
-static std::string make_border(const std::string &text){
+static std::string make_border(const std::string& text)
+{
std::stringstream ss;
- ss << boost::format(" _____________________________________________________") << std::endl;
+ ss << boost::format(" _____________________________________________________")
+ << std::endl;
ss << boost::format(" /") << std::endl;
- std::vector<std::string> lines; boost::split(lines, text, boost::is_any_of("\n"));
- while (lines.back().empty()) lines.pop_back(); //strip trailing newlines
- if (lines.size()) lines[0] = " " + lines[0]; //indent the title line
- for(const std::string &line: lines){
+ std::vector<std::string> lines;
+ boost::split(lines, text, boost::is_any_of("\n"));
+ while (lines.back().empty())
+ lines.pop_back(); // strip trailing newlines
+ if (lines.size())
+ lines[0] = " " + lines[0]; // indent the title line
+ for (const std::string& line : lines) {
ss << boost::format("| %s") % line << std::endl;
}
- //ss << boost::format(" \\_____________________________________________________") << std::endl;
+ // ss << boost::format(" \\_____________________________________________________") <<
+ // std::endl;
return ss.str();
}
-static std::string get_dsp_pp_string(const std::string &type, property_tree::sptr tree, const fs_path &path){
+static std::string get_dsp_pp_string(
+ const std::string& type, property_tree::sptr tree, const fs_path& path)
+{
std::stringstream ss;
ss << boost::format("%s DSP: %s") % type % path.leaf() << std::endl;
ss << std::endl;
meta_range_t freq_range = tree->access<meta_range_t>(path / "freq/range").get();
- ss << boost::format("Freq range: %.3f to %.3f MHz") % (freq_range.start()/1e6) % (freq_range.stop()/1e6) << std::endl;;
+ ss << boost::format("Freq range: %.3f to %.3f MHz") % (freq_range.start() / 1e6)
+ % (freq_range.stop() / 1e6)
+ << std::endl;
+ ;
return ss.str();
}
-static std::string prop_names_to_pp_string(const std::vector<std::string> &prop_names){
- std::stringstream ss; size_t count = 0;
- for(const std::string &prop_name: prop_names){
- ss << ((count++)? ", " : "") << prop_name;
+static std::string prop_names_to_pp_string(const std::vector<std::string>& prop_names)
+{
+ std::stringstream ss;
+ size_t count = 0;
+ for (const std::string& prop_name : prop_names) {
+ ss << ((count++) ? ", " : "") << prop_name;
}
return ss.str();
}
-static std::string get_frontend_pp_string(const std::string &type, property_tree::sptr tree, const fs_path &path){
+static std::string get_frontend_pp_string(
+ const std::string& type, property_tree::sptr tree, const fs_path& path)
+{
std::stringstream ss;
ss << boost::format("%s Frontend: %s") % type % path.leaf() << std::endl;
- //ss << std::endl;
+ // ss << std::endl;
- ss << boost::format("Name: %s") % (tree->access<std::string>(path / "name").get()) << std::endl;
- ss << boost::format("Antennas: %s") % prop_names_to_pp_string(tree->access<std::vector<std::string> >(path / "antenna/options").get()) << std::endl;
- if (tree->exists(path/ "sensors")) {
- ss << boost::format("Sensors: %s") % prop_names_to_pp_string(tree->list(path / "sensors")) << std::endl;
+ ss << boost::format("Name: %s") % (tree->access<std::string>(path / "name").get())
+ << std::endl;
+ ss << boost::format("Antennas: %s")
+ % prop_names_to_pp_string(
+ tree->access<std::vector<std::string>>(path / "antenna/options")
+ .get())
+ << std::endl;
+ if (tree->exists(path / "sensors")) {
+ ss << boost::format("Sensors: %s")
+ % prop_names_to_pp_string(tree->list(path / "sensors"))
+ << std::endl;
}
meta_range_t freq_range = tree->access<meta_range_t>(path / "freq/range").get();
- ss << boost::format("Freq range: %.3f to %.3f MHz") % (freq_range.start()/1e6) % (freq_range.stop()/1e6) << std::endl;
+ ss << boost::format("Freq range: %.3f to %.3f MHz") % (freq_range.start() / 1e6)
+ % (freq_range.stop() / 1e6)
+ << std::endl;
std::vector<std::string> gain_names = tree->list(path / "gains");
- if (gain_names.size() == 0) ss << "Gain Elements: None" << std::endl;
- for(const std::string &name: gain_names){
- meta_range_t gain_range = tree->access<meta_range_t>(path / "gains" / name / "range").get();
- ss << boost::format("Gain range %s: %.1f to %.1f step %.1f dB") % name % gain_range.start() % gain_range.stop() % gain_range.step() << std::endl;
+ if (gain_names.size() == 0)
+ ss << "Gain Elements: None" << std::endl;
+ for (const std::string& name : gain_names) {
+ meta_range_t gain_range =
+ tree->access<meta_range_t>(path / "gains" / name / "range").get();
+ ss << boost::format("Gain range %s: %.1f to %.1f step %.1f dB") % name
+ % gain_range.start() % gain_range.stop() % gain_range.step()
+ << std::endl;
}
- if (tree->exists(path / "bandwidth" / "range"))
- {
- meta_range_t bw_range = tree->access<meta_range_t>(path / "bandwidth" / "range").get();
- ss << boost::format("Bandwidth range: %.1f to %.1f step %.1f Hz") % bw_range.start() % bw_range.stop() % bw_range.step() << std::endl;
+ if (tree->exists(path / "bandwidth" / "range")) {
+ meta_range_t bw_range =
+ tree->access<meta_range_t>(path / "bandwidth" / "range").get();
+ ss << boost::format("Bandwidth range: %.1f to %.1f step %.1f Hz")
+ % bw_range.start() % bw_range.stop() % bw_range.step()
+ << std::endl;
}
- ss << boost::format("Connection Type: %s") % (tree->access<std::string>(path / "connection").get()) << std::endl;
+ ss << boost::format("Connection Type: %s")
+ % (tree->access<std::string>(path / "connection").get())
+ << std::endl;
ss << boost::format("Uses LO offset: %s")
- % ((tree->exists(path / "use_lo_offset") and tree->access<bool>(path / "use_lo_offset").get())? "Yes" : "No")
+ % ((tree->exists(path / "use_lo_offset")
+ and tree->access<bool>(path / "use_lo_offset").get())
+ ? "Yes"
+ : "No")
<< std::endl;
return ss.str();
}
-static std::string get_codec_pp_string(const std::string &type, property_tree::sptr tree, const fs_path &path){
+static std::string get_codec_pp_string(
+ const std::string& type, property_tree::sptr tree, const fs_path& path)
+{
std::stringstream ss;
if (tree->exists(path / "name")) {
ss << boost::format("%s Codec: %s") % type % path.leaf() << std::endl;
- ss << boost::format("Name: %s") % (tree->access<std::string>(path / "name").get()) << std::endl;
+ ss << boost::format("Name: %s") % (tree->access<std::string>(path / "name").get())
+ << std::endl;
std::vector<std::string> gain_names = tree->list(path / "gains");
- if (gain_names.size() == 0) ss << "Gain Elements: None" << std::endl;
- for(const std::string &name: gain_names){
- meta_range_t gain_range = tree->access<meta_range_t>(path / "gains" / name / "range").get();
- ss << boost::format("Gain range %s: %.1f to %.1f step %.1f dB") % name % gain_range.start() % gain_range.stop() % gain_range.step() << std::endl;
+ if (gain_names.size() == 0)
+ ss << "Gain Elements: None" << std::endl;
+ for (const std::string& name : gain_names) {
+ meta_range_t gain_range =
+ tree->access<meta_range_t>(path / "gains" / name / "range").get();
+ ss << boost::format("Gain range %s: %.1f to %.1f step %.1f dB") % name
+ % gain_range.start() % gain_range.stop() % gain_range.step()
+ << std::endl;
}
}
return ss.str();
}
-static std::string get_dboard_pp_string(const std::string &type, property_tree::sptr tree, const fs_path &path){
+static std::string get_dboard_pp_string(
+ const std::string& type, property_tree::sptr tree, const fs_path& path)
+{
std::stringstream ss;
ss << boost::format("%s Dboard: %s") % type % path.leaf() << std::endl;
- //ss << std::endl;
- const std::string prefix = (type == "RX")? "rx" : "tx";
- if (tree->exists(path / (prefix + "_eeprom")))
- {
- usrp::dboard_eeprom_t db_eeprom = tree->access<usrp::dboard_eeprom_t>(path / (prefix + "_eeprom")).get();
- if (db_eeprom.id != usrp::dboard_id_t::none()) ss << boost::format("ID: %s") % db_eeprom.id.to_pp_string() << std::endl;
- if (not db_eeprom.serial.empty()) ss << boost::format("Serial: %s") % db_eeprom.serial << std::endl;
- if (type == "TX"){
- usrp::dboard_eeprom_t gdb_eeprom = tree->access<usrp::dboard_eeprom_t>(path / "gdb_eeprom").get();
- if (gdb_eeprom.id != usrp::dboard_id_t::none()) ss << boost::format("ID: %s") % gdb_eeprom.id.to_pp_string() << std::endl;
- if (not gdb_eeprom.serial.empty()) ss << boost::format("Serial: %s") % gdb_eeprom.serial << std::endl;
+ // ss << std::endl;
+ const std::string prefix = (type == "RX") ? "rx" : "tx";
+ if (tree->exists(path / (prefix + "_eeprom"))) {
+ usrp::dboard_eeprom_t db_eeprom =
+ tree->access<usrp::dboard_eeprom_t>(path / (prefix + "_eeprom")).get();
+ if (db_eeprom.id != usrp::dboard_id_t::none())
+ ss << boost::format("ID: %s") % db_eeprom.id.to_pp_string() << std::endl;
+ if (not db_eeprom.serial.empty())
+ ss << boost::format("Serial: %s") % db_eeprom.serial << std::endl;
+ if (type == "TX") {
+ usrp::dboard_eeprom_t gdb_eeprom =
+ tree->access<usrp::dboard_eeprom_t>(path / "gdb_eeprom").get();
+ if (gdb_eeprom.id != usrp::dboard_id_t::none())
+ ss << boost::format("ID: %s") % gdb_eeprom.id.to_pp_string() << std::endl;
+ if (not gdb_eeprom.serial.empty())
+ ss << boost::format("Serial: %s") % gdb_eeprom.serial << std::endl;
}
}
if (tree->exists(path / (prefix + "_frontends"))) {
- for(const std::string &name: tree->list(path / (prefix + "_frontends"))){
- ss << make_border(get_frontend_pp_string(type, tree, path / (prefix + "_frontends") / name));
+ for (const std::string& name : tree->list(path / (prefix + "_frontends"))) {
+ ss << make_border(get_frontend_pp_string(
+ type, tree, path / (prefix + "_frontends") / name));
}
}
- ss << make_border(get_codec_pp_string(type, tree, path.branch_path().branch_path() / (prefix + "_codecs") / path.leaf()));
+ ss << make_border(get_codec_pp_string(type,
+ tree,
+ path.branch_path().branch_path() / (prefix + "_codecs") / path.leaf()));
return ss.str();
}
-static std::string get_rfnoc_pp_string(property_tree::sptr tree, const fs_path &path){
+static std::string get_rfnoc_pp_string(property_tree::sptr tree, const fs_path& path)
+{
std::stringstream ss;
ss << "RFNoC blocks on this device:" << std::endl << std::endl;
- for(const std::string &name: tree->list(path)){
+ for (const std::string& name : tree->list(path)) {
ss << "* " << name << std::endl;
}
return ss.str();
}
-static std::string get_mboard_pp_string(property_tree::sptr tree, const fs_path &path){
+static std::string get_mboard_pp_string(property_tree::sptr tree, const fs_path& path)
+{
std::stringstream ss;
- ss << boost::format("Mboard: %s") % (tree->access<std::string>(path / "name").get()) << std::endl;
+ ss << boost::format("Mboard: %s") % (tree->access<std::string>(path / "name").get())
+ << std::endl;
- if (tree->exists(path / "eeprom")){
- usrp::mboard_eeprom_t mb_eeprom = tree->access<usrp::mboard_eeprom_t>(path / "eeprom").get();
- for(const std::string &key: mb_eeprom.keys()){
- if (not mb_eeprom[key].empty()) ss << boost::format("%s: %s") % key % mb_eeprom[key] << std::endl;
+ if (tree->exists(path / "eeprom")) {
+ usrp::mboard_eeprom_t mb_eeprom =
+ tree->access<usrp::mboard_eeprom_t>(path / "eeprom").get();
+ for (const std::string& key : mb_eeprom.keys()) {
+ if (not mb_eeprom[key].empty())
+ ss << boost::format("%s: %s") % key % mb_eeprom[key] << std::endl;
}
} else {
ss << "No mboard EEPROM found." << std::endl;
}
- if (tree->exists(path / "fw_version")){
- ss << "FW Version: " << tree->access<std::string>(path / "fw_version").get() << std::endl;
+ if (tree->exists(path / "fw_version")) {
+ ss << "FW Version: " << tree->access<std::string>(path / "fw_version").get()
+ << std::endl;
}
- if (tree->exists(path / "mpm_version")){
- ss << "MPM Version: " << tree->access<std::string>(path / "mpm_version").get() << std::endl;
+ if (tree->exists(path / "mpm_version")) {
+ ss << "MPM Version: " << tree->access<std::string>(path / "mpm_version").get()
+ << std::endl;
}
- if (tree->exists(path / "fpga_version")){
- ss << "FPGA Version: " << tree->access<std::string>(path / "fpga_version").get() << std::endl;
+ if (tree->exists(path / "fpga_version")) {
+ ss << "FPGA Version: " << tree->access<std::string>(path / "fpga_version").get()
+ << std::endl;
}
- if (tree->exists(path / "fpga_version_hash")){
- ss << "FPGA git hash: " << tree->access<std::string>(path / "fpga_version_hash").get() << std::endl;
+ if (tree->exists(path / "fpga_version_hash")) {
+ ss << "FPGA git hash: "
+ << tree->access<std::string>(path / "fpga_version_hash").get() << std::endl;
}
- if (tree->exists(path / "xbar")){
+ if (tree->exists(path / "xbar")) {
ss << "RFNoC capable: Yes" << std::endl;
}
ss << std::endl;
try {
- if (tree->exists(path / "time_source" / "options")){
- const std::vector< std::string > time_sources = tree->access<std::vector<std::string> >(path / "time_source" / "options").get();
- ss << "Time sources: " << prop_names_to_pp_string(time_sources) << std::endl;
+ if (tree->exists(path / "time_source" / "options")) {
+ const std::vector<std::string> time_sources =
+ tree->access<std::vector<std::string>>(path / "time_source" / "options")
+ .get();
+ ss << "Time sources: " << prop_names_to_pp_string(time_sources) << std::endl;
}
- if (tree->exists(path / "clock_source" / "options")){
- const std::vector< std::string > clock_sources = tree->access<std::vector<std::string> >(path / "clock_source" / "options").get();
- ss << "Clock sources: " << prop_names_to_pp_string(clock_sources) << std::endl;
+ if (tree->exists(path / "clock_source" / "options")) {
+ const std::vector<std::string> clock_sources =
+ tree->access<std::vector<std::string>>(path / "clock_source" / "options")
+ .get();
+ ss << "Clock sources: " << prop_names_to_pp_string(clock_sources)
+ << std::endl;
}
- if (tree->exists(path / "sensors")){
- ss << "Sensors: " << prop_names_to_pp_string(tree->list(path / "sensors")) << std::endl;
+ if (tree->exists(path / "sensors")) {
+ ss << "Sensors: " << prop_names_to_pp_string(tree->list(path / "sensors"))
+ << std::endl;
}
- if (tree->exists(path / "rx_dsps")){
- for(const std::string &name: tree->list(path / "rx_dsps")){
+ if (tree->exists(path / "rx_dsps")) {
+ for (const std::string& name : tree->list(path / "rx_dsps")) {
ss << make_border(get_dsp_pp_string("RX", tree, path / "rx_dsps" / name));
}
}
if (tree->exists(path / "dboards")) {
- for(const std::string &name: tree->list(path / "dboards")){
- ss << make_border(get_dboard_pp_string("RX", tree, path / "dboards" / name));
+ for (const std::string& name : tree->list(path / "dboards")) {
+ ss << make_border(
+ get_dboard_pp_string("RX", tree, path / "dboards" / name));
}
- if (tree->exists(path / "tx_dsps")){
- for(const std::string &name: tree->list(path / "tx_dsps")){
- ss << make_border(get_dsp_pp_string("TX", tree, path / "tx_dsps" / name));
+ if (tree->exists(path / "tx_dsps")) {
+ for (const std::string& name : tree->list(path / "tx_dsps")) {
+ ss << make_border(
+ get_dsp_pp_string("TX", tree, path / "tx_dsps" / name));
}
}
- for(const std::string &name: tree->list(path / "dboards")){
- ss << make_border(get_dboard_pp_string("TX", tree, path / "dboards" / name));
+ for (const std::string& name : tree->list(path / "dboards")) {
+ ss << make_border(
+ get_dboard_pp_string("TX", tree, path / "dboards" / name));
}
}
- if (tree->exists(path / "xbar")){
+ if (tree->exists(path / "xbar")) {
ss << make_border(get_rfnoc_pp_string(tree, path / "xbar"));
}
- }
- catch (const uhd::lookup_error& ex) {
+ } catch (const uhd::lookup_error& ex) {
std::cout << "Exited device probe on " << ex.what() << std::endl;
}
return ss.str();
}
-static std::string get_device_pp_string(property_tree::sptr tree){
+static std::string get_device_pp_string(property_tree::sptr tree)
+{
std::stringstream ss;
- ss << boost::format("Device: %s") % (tree->access<std::string>("/name").get()) << std::endl;
- //ss << std::endl;
- for(const std::string &name: tree->list("/mboards")){
+ ss << boost::format("Device: %s") % (tree->access<std::string>("/name").get())
+ << std::endl;
+ // ss << std::endl;
+ for (const std::string& name : tree->list("/mboards")) {
ss << make_border(get_mboard_pp_string(tree, "/mboards/" + name));
}
return ss.str();
}
-void print_tree(const uhd::fs_path &path, uhd::property_tree::sptr tree){
+void print_tree(const uhd::fs_path& path, uhd::property_tree::sptr tree)
+{
std::cout << path << std::endl;
- for(const std::string &name: tree->list(path)){
+ for (const std::string& name : tree->list(path)) {
print_tree(path / name, tree);
}
}
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
@@ -250,57 +323,69 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD USRP Probe %s") % desc << std::endl;
return EXIT_FAILURE;
}
- if (vm.count("version")){
+ if (vm.count("version")) {
std::cout << uhd::get_version_string() << std::endl;
return EXIT_SUCCESS;
}
- device::sptr dev = device::make(vm["args"].as<std::string>());
+ device::sptr dev = device::make(vm["args"].as<std::string>());
property_tree::sptr tree = dev->get_tree();
- if (vm.count("string")){
+ if (vm.count("string")) {
if (vm.count("vector")) {
- std::vector<std::string> str_vector = tree->access< std::vector<std::string> >(vm["string"].as<std::string>()).get();
+ std::vector<std::string> str_vector =
+ tree->access<std::vector<std::string>>(vm["string"].as<std::string>())
+ .get();
std::cout << "(";
- for(const std::string &str: str_vector) {
+ for (const std::string& str : str_vector) {
std::cout << str << ",";
}
std::cout << ")" << std::endl;
} else {
- std::cout << tree->access<std::string>(vm["string"].as<std::string>()).get() << std::endl;
+ std::cout << tree->access<std::string>(vm["string"].as<std::string>()).get()
+ << std::endl;
}
return EXIT_SUCCESS;
}
- if (vm.count("double")){
- std::cout << tree->access<double>(vm["double"].as<std::string>()).get() << std::endl;
+ if (vm.count("double")) {
+ std::cout << tree->access<double>(vm["double"].as<std::string>()).get()
+ << std::endl;
return EXIT_SUCCESS;
}
- if (vm.count("int")){
+ if (vm.count("int")) {
std::cout << tree->access<int>(vm["int"].as<std::string>()).get() << std::endl;
return EXIT_SUCCESS;
}
- if (vm.count("sensor")){
- std::cout << tree->access<uhd::sensor_value_t>(vm["sensor"].as<std::string>()).get().value << std::endl;
+ if (vm.count("sensor")) {
+ std::cout << tree->access<uhd::sensor_value_t>(vm["sensor"].as<std::string>())
+ .get()
+ .value
+ << std::endl;
return EXIT_SUCCESS;
}
- if (vm.count("range")){
- meta_range_t range = tree->access<meta_range_t>(vm["range"].as<std::string>()).get();
- std::cout << boost::format("%.1f:%.1f:%.1f") % range.start() % range.step() % range.stop() << std::endl;
+ if (vm.count("range")) {
+ meta_range_t range =
+ tree->access<meta_range_t>(vm["range"].as<std::string>()).get();
+ std::cout << boost::format("%.1f:%.1f:%.1f") % range.start() % range.step()
+ % range.stop()
+ << std::endl;
return EXIT_SUCCESS;
}
- if (vm.count("tree") != 0) print_tree("/", tree);
- else if (not vm.count("init-only")) std::cout << make_border(get_device_pp_string(tree)) << std::endl;
+ if (vm.count("tree") != 0)
+ print_tree("/", tree);
+ else if (not vm.count("init-only"))
+ std::cout << make_border(get_device_pp_string(tree)) << std::endl;
return EXIT_SUCCESS;
}
diff --git a/host/utils/usrp_burn_db_eeprom.cpp b/host/utils/usrp_burn_db_eeprom.cpp
index 391c35950..cfb80fd42 100644
--- a/host/utils/usrp_burn_db_eeprom.cpp
+++ b/host/utils/usrp_burn_db_eeprom.cpp
@@ -6,24 +6,25 @@
//
-#include <uhd/utils/safe_main.hpp>
#include <uhd/device.hpp>
-#include <uhd/types/dict.hpp>
-#include <uhd/utils/assert_has.hpp>
#include <uhd/property_tree.hpp>
+#include <uhd/types/dict.hpp>
#include <uhd/usrp/dboard_eeprom.hpp>
+#include <uhd/utils/assert_has.hpp>
+#include <uhd/utils/safe_main.hpp>
#include <boost/algorithm/string.hpp>
-#include <boost/program_options.hpp>
-#include <boost/format.hpp>
#include <boost/assign.hpp>
+#include <boost/format.hpp>
+#include <boost/program_options.hpp>
#include <iostream>
using namespace uhd;
using namespace uhd::usrp;
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
- //command line variables
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
+ // command line variables
std::string args, slot, unit;
po::options_description desc("Allowed options");
@@ -43,49 +44,54 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
- std::cout << boost::format("USRP Burn Daughterboard EEPROM %s") % desc << std::endl;
- std::cout << boost::format(
- "Omit the ID argument to perform readback,\n"
- "Or specify a new ID to burn into the EEPROM.\n"
- ) << std::endl;
+ // print the help message
+ if (vm.count("help")) {
+ std::cout << boost::format("USRP Burn Daughterboard EEPROM %s") % desc
+ << std::endl;
+ std::cout << boost::format("Omit the ID argument to perform readback,\n"
+ "Or specify a new ID to burn into the EEPROM.\n")
+ << std::endl;
return EXIT_FAILURE;
}
- //make the device and extract the dboard w/ property
- device::sptr dev = device::make(args, device::USRP);
- uhd::property_tree::sptr tree = dev->get_tree();
- const uhd::fs_path db_root = "/mboards/0/dboards";
+ // make the device and extract the dboard w/ property
+ device::sptr dev = device::make(args, device::USRP);
+ uhd::property_tree::sptr tree = dev->get_tree();
+ const uhd::fs_path db_root = "/mboards/0/dboards";
std::vector<std::string> dboard_names = tree->list(db_root);
- if (dboard_names.size() == 1 and slot.empty()) slot = dboard_names.front();
+ if (dboard_names.size() == 1 and slot.empty())
+ slot = dboard_names.front();
uhd::assert_has(dboard_names, slot, "dboard slot name");
- std::cout << boost::format("Reading %s EEPROM on %s dboard...") % unit % slot << std::endl;
+ std::cout << boost::format("Reading %s EEPROM on %s dboard...") % unit % slot
+ << std::endl;
boost::to_lower(unit);
const uhd::fs_path db_path = db_root / slot / (unit + "_eeprom");
- dboard_eeprom_t db_eeprom = tree->access<dboard_eeprom_t>(db_path).get();
+ dboard_eeprom_t db_eeprom = tree->access<dboard_eeprom_t>(db_path).get();
//------------- handle the dboard ID -----------------------------//
- if (vm.count("id")){
+ if (vm.count("id")) {
db_eeprom.id = dboard_id_t::from_string(vm["id"].as<std::string>());
tree->access<dboard_eeprom_t>(db_path).set(db_eeprom);
}
- std::cout << boost::format(" Current ID: %s") % db_eeprom.id.to_pp_string() << std::endl;
+ std::cout << boost::format(" Current ID: %s") % db_eeprom.id.to_pp_string()
+ << std::endl;
//------------- handle the dboard serial--------------------------//
- if (vm.count("ser")){
+ if (vm.count("ser")) {
db_eeprom.serial = vm["ser"].as<std::string>();
tree->access<dboard_eeprom_t>(db_path).set(db_eeprom);
}
- std::cout << boost::format(" Current serial: \"%s\"") % db_eeprom.serial << std::endl;
+ std::cout << boost::format(" Current serial: \"%s\"") % db_eeprom.serial
+ << std::endl;
//------------- handle the dboard revision------------------------//
- if (vm.count("rev")){
+ if (vm.count("rev")) {
db_eeprom.revision = vm["rev"].as<std::string>();
tree->access<dboard_eeprom_t>(db_path).set(db_eeprom);
}
- std::cout << boost::format(" Current revision: \"%s\"") % db_eeprom.revision << std::endl;
+ std::cout << boost::format(" Current revision: \"%s\"") % db_eeprom.revision
+ << std::endl;
std::cout << " Done" << std::endl << std::endl;
return EXIT_SUCCESS;
diff --git a/host/utils/usrp_burn_mb_eeprom.cpp b/host/utils/usrp_burn_mb_eeprom.cpp
index e2596d5c4..65b68f379 100644
--- a/host/utils/usrp_burn_mb_eeprom.cpp
+++ b/host/utils/usrp_burn_mb_eeprom.cpp
@@ -5,20 +5,21 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/safe_main.hpp>
#include <uhd/device.hpp>
#include <uhd/property_tree.hpp>
-#include <uhd/usrp/mboard_eeprom.hpp>
#include <uhd/types/device_addr.hpp>
+#include <uhd/usrp/mboard_eeprom.hpp>
+#include <uhd/utils/safe_main.hpp>
#include <boost/algorithm/string.hpp>
-#include <boost/program_options.hpp>
#include <boost/format.hpp>
+#include <boost/program_options.hpp>
#include <iostream>
#include <vector>
namespace po = boost::program_options;
-int UHD_SAFE_MAIN(int argc, char *argv[]){
+int UHD_SAFE_MAIN(int argc, char* argv[])
+{
std::string args, input_str;
po::options_description desc("Allowed options");
@@ -35,28 +36,31 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help") or (not vm.count("values") and not vm.count("read-all"))){
+ // print the help message
+ if (vm.count("help") or (not vm.count("values") and not vm.count("read-all"))) {
std::cout << boost::format("USRP Burn Motherboard EEPROM %s") % desc << std::endl;
- std::cout << boost::format(
- "Omit the value argument to perform a readback,\n"
- "Or specify a new value to burn into the EEPROM.\n"
- "Example (write to ip-addr0 and read out ip-addr1):\n"
- " usrp_burn_mb_eeprom --args=<device args> --values\"ip-addr0=192.168.10.3,ip-addr1\""
- ) << std::endl;
+ std::cout << boost::format("Omit the value argument to perform a readback,\n"
+ "Or specify a new value to burn into the EEPROM.\n"
+ "Example (write to ip-addr0 and read out ip-addr1):\n"
+ " usrp_burn_mb_eeprom --args=<device args> "
+ "--values\"ip-addr0=192.168.10.3,ip-addr1\"")
+ << std::endl;
return EXIT_FAILURE;
}
std::cout << "Creating USRP device from address: " + args << std::endl;
- uhd::device::sptr dev = uhd::device::make(args, uhd::device::USRP);
+ uhd::device::sptr dev = uhd::device::make(args, uhd::device::USRP);
uhd::property_tree::sptr tree = dev->get_tree();
- uhd::usrp::mboard_eeprom_t mb_eeprom = tree->access<uhd::usrp::mboard_eeprom_t>("/mboards/0/eeprom").get();
+ uhd::usrp::mboard_eeprom_t mb_eeprom =
+ tree->access<uhd::usrp::mboard_eeprom_t>("/mboards/0/eeprom").get();
std::cout << std::endl;
std::vector<std::string> keys_vec, vals_vec;
- if(vm.count("read-all")) keys_vec = mb_eeprom.keys(); //Leaving vals_vec empty will force utility to only read
- else if(vm.count("values")){
- //uhd::device_addr_t properly parses input values
+ if (vm.count("read-all"))
+ keys_vec =
+ mb_eeprom.keys(); // Leaving vals_vec empty will force utility to only read
+ else if (vm.count("values")) {
+ // uhd::device_addr_t properly parses input values
uhd::device_addr_t vals(input_str);
keys_vec = vals.keys();
vals_vec = vals.vals();
@@ -64,25 +68,31 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
// 1. Read out values
std::cout << "Fetching current settings from EEPROM..." << std::endl;
- for(size_t i = 0; i < keys_vec.size(); i++){
- if (not mb_eeprom.has_key(keys_vec[i])){
- std::cerr << boost::format("Cannot find value for EEPROM[%s]") % keys_vec[i] << std::endl;
+ for (size_t i = 0; i < keys_vec.size(); i++) {
+ if (not mb_eeprom.has_key(keys_vec[i])) {
+ std::cerr << boost::format("Cannot find value for EEPROM[%s]") % keys_vec[i]
+ << std::endl;
return EXIT_FAILURE;
}
- std::cout << boost::format(" EEPROM [\"%s\"] is \"%s\"") % keys_vec[i] % mb_eeprom[keys_vec[i]] << std::endl;
+ std::cout << boost::format(" EEPROM [\"%s\"] is \"%s\"") % keys_vec[i]
+ % mb_eeprom[keys_vec[i]]
+ << std::endl;
}
std::cout << std::endl;
// 2. Write new values if given
mb_eeprom = uhd::usrp::mboard_eeprom_t();
- for(size_t i = 0; i < vals_vec.size(); i++){
- if(vals_vec[i] != ""){
+ for (size_t i = 0; i < vals_vec.size(); i++) {
+ if (vals_vec[i] != "") {
mb_eeprom[keys_vec[i]] = vals_vec[i];
- std::cout << boost::format("Setting EEPROM [\"%s\"] to \"%s\"...") % keys_vec[i] % vals_vec[i] << std::endl;
+ std::cout << boost::format("Setting EEPROM [\"%s\"] to \"%s\"...")
+ % keys_vec[i] % vals_vec[i]
+ << std::endl;
}
}
tree->access<uhd::usrp::mboard_eeprom_t>("/mboards/0/eeprom").set(mb_eeprom);
- std::cout << "Power-cycle the USRP device for the changes to take effect." << std::endl;
+ std::cout << "Power-cycle the USRP device for the changes to take effect."
+ << std::endl;
std::cout << std::endl;
std::cout << "Done" << std::endl;
diff --git a/host/utils/usrp_cal_utils.hpp b/host/utils/usrp_cal_utils.hpp
index ebd1400b7..fe567c7de 100644
--- a/host/utils/usrp_cal_utils.hpp
+++ b/host/utils/usrp_cal_utils.hpp
@@ -5,38 +5,40 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/paths.hpp>
#include <uhd/property_tree.hpp>
-#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/usrp/dboard_eeprom.hpp>
-#include <uhd/utils/paths.hpp>
+#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/utils/algorithm.hpp>
+#include <uhd/utils/paths.hpp>
#include <boost/filesystem.hpp>
#include <boost/format.hpp>
-#include <iostream>
-#include <vector>
-#include <complex>
+#include <chrono>
#include <cmath>
+#include <complex>
#include <cstdlib>
#include <fstream>
-#include <chrono>
+#include <iostream>
#include <thread>
+#include <vector>
namespace fs = boost::filesystem;
-struct result_t{double freq, real_corr, imag_corr, best, delta;};
+struct result_t
+{
+ double freq, real_corr, imag_corr, best, delta;
+};
typedef std::complex<float> samp_type;
/***********************************************************************
* Constants
**********************************************************************/
-static const double tau = 6.28318531;
-static const size_t wave_table_len = 65536;
-static const size_t num_search_steps = 5;
-static const double default_precision = 0.0001;
-static const double default_freq_step = 7.3e6;
-static const size_t default_fft_bin_size = 1000;
+static const double tau = 6.28318531;
+static const size_t wave_table_len = 65536;
+static const size_t num_search_steps = 5;
+static const double default_precision = 0.0001;
+static const double default_freq_step = 7.3e6;
+static const size_t default_fft_bin_size = 1000;
static constexpr size_t MAX_NUM_TX_ERRORS = 10;
/***********************************************************************
@@ -49,51 +51,44 @@ static inline void set_optimum_defaults(uhd::usrp::multi_usrp::sptr usrp)
uhd::usrp::subdev_spec_t subdev_spec = usrp->get_rx_subdev_spec();
const uhd::fs_path mb_path = "/mboards/0";
- const std::string mb_name = tree->access<std::string>(mb_path / "name").get();
- if (mb_name.find("USRP2") != std::string::npos or
- mb_name.find("N200") != std::string::npos or
- mb_name.find("N210") != std::string::npos or
- mb_name.find("X300") != std::string::npos or
- mb_name.find("X310") != std::string::npos or
- mb_name.find("n3xx") != std::string::npos)
- {
+ const std::string mb_name = tree->access<std::string>(mb_path / "name").get();
+ if (mb_name.find("USRP2") != std::string::npos
+ or mb_name.find("N200") != std::string::npos
+ or mb_name.find("N210") != std::string::npos
+ or mb_name.find("X300") != std::string::npos
+ or mb_name.find("X310") != std::string::npos
+ or mb_name.find("n3xx") != std::string::npos) {
usrp->set_tx_rate(12.5e6);
usrp->set_rx_rate(12.5e6);
- }
- else if (mb_name.find("B100") != std::string::npos)
- {
+ } else if (mb_name.find("B100") != std::string::npos) {
usrp->set_tx_rate(4e6);
usrp->set_rx_rate(4e6);
- }
- else
- {
+ } else {
throw std::runtime_error("self-calibration is not supported for this device");
}
- const uhd::fs_path tx_fe_path = "/mboards/0/dboards/" + subdev_spec[0].db_name + "/tx_frontends/0";
+ const uhd::fs_path tx_fe_path =
+ "/mboards/0/dboards/" + subdev_spec[0].db_name + "/tx_frontends/0";
const std::string tx_name = tree->access<std::string>(tx_fe_path / "name").get();
- if (tx_name.find("WBX") == std::string::npos and
- tx_name.find("SBX") == std::string::npos and
- tx_name.find("CBX") == std::string::npos and
- tx_name.find("RFX") == std::string::npos and
- tx_name.find("UBX") == std::string::npos and
- tx_name.find("Rhodium") == std::string::npos
- )
- {
+ if (tx_name.find("WBX") == std::string::npos
+ and tx_name.find("SBX") == std::string::npos
+ and tx_name.find("CBX") == std::string::npos
+ and tx_name.find("RFX") == std::string::npos
+ and tx_name.find("UBX") == std::string::npos
+ and tx_name.find("Rhodium") == std::string::npos) {
throw std::runtime_error("self-calibration is not supported for this TX dboard");
}
usrp->set_tx_gain(0);
- const uhd::fs_path rx_fe_path = "/mboards/0/dboards/" + subdev_spec[0].db_name + "/rx_frontends/0";
+ const uhd::fs_path rx_fe_path =
+ "/mboards/0/dboards/" + subdev_spec[0].db_name + "/rx_frontends/0";
const std::string rx_name = tree->access<std::string>(rx_fe_path / "name").get();
- if (rx_name.find("WBX") == std::string::npos and
- rx_name.find("SBX") == std::string::npos and
- rx_name.find("CBX") == std::string::npos and
- rx_name.find("RFX") == std::string::npos and
- rx_name.find("UBX") == std::string::npos and
- rx_name.find("Rhodium") == std::string::npos
- )
- {
+ if (rx_name.find("WBX") == std::string::npos
+ and rx_name.find("SBX") == std::string::npos
+ and rx_name.find("CBX") == std::string::npos
+ and rx_name.find("RFX") == std::string::npos
+ and rx_name.find("UBX") == std::string::npos
+ and rx_name.find("Rhodium") == std::string::npos) {
throw std::runtime_error("self-calibration is not supported for this RX dboard");
}
usrp->set_rx_gain(0);
@@ -107,13 +102,16 @@ void check_for_empty_serial(uhd::usrp::multi_usrp::sptr usrp)
// Will work on 1st subdev, top-level must make sure it's the right one
uhd::usrp::subdev_spec_t subdev_spec = usrp->get_rx_subdev_spec();
- //extract eeprom
+ // extract eeprom
uhd::property_tree::sptr tree = usrp->get_device()->get_tree();
// This only works with transceiver boards, so we can always check rx side
- const uhd::fs_path db_path = "/mboards/0/dboards/" + subdev_spec[0].db_name + "/rx_eeprom";
- const uhd::usrp::dboard_eeprom_t db_eeprom = tree->access<uhd::usrp::dboard_eeprom_t>(db_path).get();
+ const uhd::fs_path db_path =
+ "/mboards/0/dboards/" + subdev_spec[0].db_name + "/rx_eeprom";
+ const uhd::usrp::dboard_eeprom_t db_eeprom =
+ tree->access<uhd::usrp::dboard_eeprom_t>(db_path).get();
- std::string error_string = "This dboard has no serial!\n\nPlease see the Calibration documentation for details on how to fix this.";
+ std::string error_string = "This dboard has no serial!\n\nPlease see the Calibration "
+ "documentation for details on how to fix this.";
if (db_eeprom.serial.empty())
throw std::runtime_error(error_string);
}
@@ -128,7 +126,7 @@ public:
{
_table.resize(wave_table_len);
for (size_t i = 0; i < wave_table_len; i++)
- _table[i] = samp_type(std::polar(ampl, (tau*i)/wave_table_len));
+ _table[i] = samp_type(std::polar(ampl, (tau * i) / wave_table_len));
}
inline samp_type operator()(const size_t index) const
@@ -137,33 +135,32 @@ public:
}
private:
- std::vector<samp_type > _table;
+ std::vector<samp_type> _table;
};
/***********************************************************************
* Compute power of a tone
**********************************************************************/
-static inline double compute_tone_dbrms(
- const std::vector<samp_type> &samples,
- const double freq) //freq is fractional
+static inline double compute_tone_dbrms(const std::vector<samp_type>& samples,
+ const double freq) // freq is fractional
{
- //shift the samples so the tone at freq is down at DC
- //and average the samples to measure the DC component
+ // shift the samples so the tone at freq is down at DC
+ // and average the samples to measure the DC component
samp_type average = 0;
for (size_t i = 0; i < samples.size(); i++)
- average += samp_type(std::polar(1.0, -freq*tau*i)) * samples[i];
+ average += samp_type(std::polar(1.0, -freq * tau * i)) * samples[i];
- return 20*std::log10(std::abs(average/float(samples.size())));
+ return 20 * std::log10(std::abs(average / float(samples.size())));
}
/***********************************************************************
* Write a dat file
**********************************************************************/
static inline void write_samples_to_file(
- const std::vector<samp_type > &samples, const std::string &file)
+ const std::vector<samp_type>& samples, const std::string& file)
{
std::ofstream outfile(file.c_str(), std::ofstream::binary);
- outfile.write((const char*)&samples.front(), samples.size()*sizeof(samp_type));
+ outfile.write((const char*)&samples.front(), samples.size() * sizeof(samp_type));
outfile.close();
}
@@ -171,38 +168,39 @@ static inline void write_samples_to_file(
/***********************************************************************
* Retrieve d'board serial
**********************************************************************/
-static std::string get_serial(
- uhd::usrp::multi_usrp::sptr usrp,
- const std::string &tx_rx)
+static std::string get_serial(uhd::usrp::multi_usrp::sptr usrp, const std::string& tx_rx)
{
uhd::property_tree::sptr tree = usrp->get_device()->get_tree();
// Will work on 1st subdev, top-level must make sure it's the right one
uhd::usrp::subdev_spec_t subdev_spec = usrp->get_rx_subdev_spec();
- const uhd::fs_path db_path = "/mboards/0/dboards/" + subdev_spec[0].db_name + "/" + tx_rx + "_eeprom";
- const uhd::usrp::dboard_eeprom_t db_eeprom = tree->access<uhd::usrp::dboard_eeprom_t>(db_path).get();
+ const uhd::fs_path db_path =
+ "/mboards/0/dboards/" + subdev_spec[0].db_name + "/" + tx_rx + "_eeprom";
+ const uhd::usrp::dboard_eeprom_t db_eeprom =
+ tree->access<uhd::usrp::dboard_eeprom_t>(db_path).get();
return db_eeprom.serial;
}
/***********************************************************************
* Store data to file
**********************************************************************/
-static void store_results(
- const std::vector<result_t> &results,
- const std::string &XX, // "TX" or "RX"
- const std::string &xx, // "tx" or "rx"
- const std::string &what, // Type of test, e.g. "iq",
- const std::string &serial)
+static void store_results(const std::vector<result_t>& results,
+ const std::string& XX, // "TX" or "RX"
+ const std::string& xx, // "tx" or "rx"
+ const std::string& what, // Type of test, e.g. "iq",
+ const std::string& serial)
{
- //make the calibration file path
+ // make the calibration file path
fs::path cal_data_path = fs::path(uhd::get_app_path()) / ".uhd";
fs::create_directory(cal_data_path);
cal_data_path = cal_data_path / "cal";
fs::create_directory(cal_data_path);
- cal_data_path = cal_data_path / str(boost::format("%s_%s_cal_v0.2_%s.csv") % xx % what % serial);
+ cal_data_path =
+ cal_data_path / str(boost::format("%s_%s_cal_v0.2_%s.csv") % xx % what % serial);
if (fs::exists(cal_data_path))
- fs::rename(cal_data_path, cal_data_path.string() + str(boost::format(".%d") % time(NULL)));
+ fs::rename(cal_data_path,
+ cal_data_path.string() + str(boost::format(".%d") % time(NULL)));
- //fill the calibration file
+ // fill the calibration file
std::ofstream cal_data(cal_data_path.string().c_str());
cal_data << boost::format("name, %s Frontend Calibration\n") % XX;
cal_data << boost::format("serial, %s\n") % serial;
@@ -211,15 +209,10 @@ static void store_results(
cal_data << boost::format("DATA STARTS HERE\n");
cal_data << "lo_frequency, correction_real, correction_imag, measured, delta\n";
- for (size_t i = 0; i < results.size(); i++)
- {
- cal_data
- << results[i].freq << ", "
- << results[i].real_corr << ", "
- << results[i].imag_corr << ", "
- << results[i].best << ", "
- << results[i].delta << "\n"
- ;
+ for (size_t i = 0; i < results.size(); i++) {
+ cal_data << results[i].freq << ", " << results[i].real_corr << ", "
+ << results[i].imag_corr << ", " << results[i].best << ", "
+ << results[i].delta << "\n";
}
std::cout << "wrote cal data to " << cal_data_path << std::endl;
@@ -228,10 +221,9 @@ static void store_results(
/***********************************************************************
* Data capture routine
**********************************************************************/
-static void capture_samples(
- uhd::usrp::multi_usrp::sptr usrp,
+static void capture_samples(uhd::usrp::multi_usrp::sptr usrp,
uhd::rx_streamer::sptr rx_stream,
- std::vector<samp_type > &buff,
+ std::vector<samp_type>& buff,
const size_t nsamps_requested)
{
buff.resize(nsamps_requested);
@@ -243,34 +235,29 @@ static void capture_samples(
std::vector<samp_type> discard_buff(nsamps_to_discard);
uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
- stream_cmd.num_samps = buff.size() + nsamps_to_discard;
+ stream_cmd.num_samps = buff.size() + nsamps_to_discard;
stream_cmd.stream_now = true;
usrp->issue_stream_cmd(stream_cmd);
size_t num_rx_samps = 0;
// Discard the transient samples.
rx_stream->recv(&discard_buff.front(), discard_buff.size(), md);
- if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE)
- {
- throw std::runtime_error(str(boost::format(
- "Receiver error: %s"
- ) % md.strerror()));
+ if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
+ throw std::runtime_error(
+ str(boost::format("Receiver error: %s") % md.strerror()));
}
// Now capture the data we want
num_rx_samps = rx_stream->recv(&buff.front(), buff.size(), md);
- //validate the received data
- if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE)
- {
- throw std::runtime_error(str(boost::format(
- "Receiver error: %s"
- ) % md.strerror()));
+ // validate the received data
+ if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) {
+ throw std::runtime_error(
+ str(boost::format("Receiver error: %s") % md.strerror()));
}
- //we can live if all the data didnt come in
- if (num_rx_samps > buff.size()/2)
- {
+ // we can live if all the data didnt come in
+ if (num_rx_samps > buff.size() / 2) {
buff.resize(num_rx_samps);
return;
}
@@ -281,15 +268,16 @@ static void capture_samples(
/***********************************************************************
* Setup function
**********************************************************************/
-static uhd::usrp::multi_usrp::sptr setup_usrp_for_cal(std::string &args, std::string &subdev, std::string &serial)
+static uhd::usrp::multi_usrp::sptr setup_usrp_for_cal(
+ std::string& args, std::string& subdev, std::string& serial)
{
std::cout << std::endl;
- std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args
+ << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);
// Configure subdev
- if (!subdev.empty())
- {
+ if (!subdev.empty()) {
usrp->set_tx_subdev_spec(subdev);
usrp->set_rx_subdev_spec(subdev);
}
@@ -297,16 +285,18 @@ static uhd::usrp::multi_usrp::sptr setup_usrp_for_cal(std::string &args, std::st
serial = get_serial(usrp, "tx");
std::cout << "Daughterboard serial: " << serial;
- //set the antennas to cal
- if (not uhd::has(usrp->get_rx_antennas(), "CAL") or not uhd::has(usrp->get_tx_antennas(), "CAL"))
- throw std::runtime_error("This board does not have the CAL antenna option, cannot self-calibrate.");
+ // set the antennas to cal
+ if (not uhd::has(usrp->get_rx_antennas(), "CAL")
+ or not uhd::has(usrp->get_tx_antennas(), "CAL"))
+ throw std::runtime_error(
+ "This board does not have the CAL antenna option, cannot self-calibrate.");
usrp->set_rx_antenna("CAL");
usrp->set_tx_antenna("CAL");
- //fail if daughterboard has no serial
+ // fail if daughterboard has no serial
check_for_empty_serial(usrp);
- //set optimum defaults
+ // set optimum defaults
set_optimum_defaults(usrp);
return usrp;
@@ -315,25 +305,24 @@ static uhd::usrp::multi_usrp::sptr setup_usrp_for_cal(std::string &args, std::st
/***********************************************************************
* Function to find optimal RX gain setting (for the current frequency)
**********************************************************************/
-UHD_INLINE void set_optimal_rx_gain(
- uhd::usrp::multi_usrp::sptr usrp,
+UHD_INLINE void set_optimal_rx_gain(uhd::usrp::multi_usrp::sptr usrp,
uhd::rx_streamer::sptr rx_stream,
double wave_freq = 0.0)
{
- const double gain_step = 3.0;
+ const double gain_step = 3.0;
const double gain_compression_threshold = gain_step * 0.5;
- const double actual_rx_rate = usrp->get_rx_rate();
- const double actual_tx_freq = usrp->get_tx_freq();
- const double actual_rx_freq = usrp->get_rx_freq();
- const double bb_tone_freq = actual_tx_freq - actual_rx_freq + wave_freq;
+ const double actual_rx_rate = usrp->get_rx_rate();
+ const double actual_tx_freq = usrp->get_tx_freq();
+ const double actual_rx_freq = usrp->get_rx_freq();
+ const double bb_tone_freq = actual_tx_freq - actual_rx_freq + wave_freq;
const size_t nsamps = size_t(actual_rx_rate / default_fft_bin_size);
std::vector<samp_type> buff(nsamps);
uhd::gain_range_t rx_gain_range = usrp->get_rx_gain_range();
- double rx_gain = rx_gain_range.start() + gain_step;
- double curr_dbrms = 0.0;
- double prev_dbrms = 0.0;
- double delta = 0.0;
+ double rx_gain = rx_gain_range.start() + gain_step;
+ double curr_dbrms = 0.0;
+ double prev_dbrms = 0.0;
+ double delta = 0.0;
// No sense in setting the gain where this is no gain range
if (rx_gain_range.stop() - rx_gain_range.start() < gain_step)
@@ -349,20 +338,19 @@ UHD_INLINE void set_optimal_rx_gain(
// Initialize prev_dbrms value
usrp->set_rx_gain(rx_gain);
capture_samples(usrp, rx_stream, buff, nsamps);
- prev_dbrms = compute_tone_dbrms(buff, bb_tone_freq/actual_rx_rate);
+ prev_dbrms = compute_tone_dbrms(buff, bb_tone_freq / actual_rx_rate);
rx_gain += gain_step;
// Find RX gain where signal begins to clip
- while (rx_gain <= rx_gain_range.stop())
- {
+ while (rx_gain <= rx_gain_range.stop()) {
usrp->set_rx_gain(rx_gain);
capture_samples(usrp, rx_stream, buff, nsamps);
- curr_dbrms = compute_tone_dbrms(buff, bb_tone_freq/actual_rx_rate);
- delta = curr_dbrms - prev_dbrms;
+ curr_dbrms = compute_tone_dbrms(buff, bb_tone_freq / actual_rx_rate);
+ delta = curr_dbrms - prev_dbrms;
// check if the gain is compressed beyone the threshold
if (delta < gain_step - gain_compression_threshold)
- break; // if so, we are done
+ break; // if so, we are done
prev_dbrms = curr_dbrms;
rx_gain += gain_step;
@@ -391,14 +379,14 @@ bool has_tx_error(uhd::tx_streamer::sptr tx_stream)
return false;
}
- return async_md.event_code & (0
- // Any of these errors are considered a problematic TX error:
- | uhd::async_metadata_t::EVENT_CODE_UNDERFLOW
- | uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR
- | uhd::async_metadata_t::EVENT_CODE_TIME_ERROR
- | uhd::async_metadata_t::EVENT_CODE_UNDERFLOW_IN_PACKET
- | uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR_IN_BURST
- );
+ return async_md.event_code
+ & (0
+ // Any of these errors are considered a problematic TX error:
+ | uhd::async_metadata_t::EVENT_CODE_UNDERFLOW
+ | uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR
+ | uhd::async_metadata_t::EVENT_CODE_TIME_ERROR
+ | uhd::async_metadata_t::EVENT_CODE_UNDERFLOW_IN_PACKET
+ | uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR_IN_BURST);
}
void wait_for_lo_lock(uhd::usrp::multi_usrp::sptr usrp)
@@ -407,10 +395,9 @@ void wait_for_lo_lock(uhd::usrp::multi_usrp::sptr usrp)
const auto timeout =
std::chrono::steady_clock::now() + std::chrono::milliseconds(100);
while (not usrp->get_tx_sensor("lo_locked").to_bool()
- or not usrp->get_rx_sensor("lo_locked").to_bool()) {
+ or not usrp->get_rx_sensor("lo_locked").to_bool()) {
if (std::chrono::steady_clock::now() > timeout) {
- throw std::runtime_error(
- "timed out waiting for TX and/or RX LO to lock");
+ throw std::runtime_error("timed out waiting for TX and/or RX LO to lock");
}
}
}
diff --git a/host/utils/usrp_e3x0_network_mode.cpp b/host/utils/usrp_e3x0_network_mode.cpp
index ac4f47e4d..fbc8aeb28 100644
--- a/host/utils/usrp_e3x0_network_mode.cpp
+++ b/host/utils/usrp_e3x0_network_mode.cpp
@@ -8,13 +8,10 @@
#include "../lib/usrp/e300/e300_network.hpp"
#include <uhd/device.hpp>
#include <uhd/exception.hpp>
-
#include <uhd/transport/if_addrs.hpp>
-
-#include <boost/program_options.hpp>
-#include <boost/format.hpp>
#include <boost/asio.hpp>
-
+#include <boost/format.hpp>
+#include <boost/program_options.hpp>
#include <iostream>
namespace po = boost::program_options;
@@ -25,13 +22,13 @@ static void check_network_ok(void)
using namespace boost::asio::ip;
std::vector<if_addrs_t> addrs = get_if_addrs();
- if(addrs.size() == 1 and addrs.at(0).inet == address_v4::loopback().to_string())
+ if (addrs.size() == 1 and addrs.at(0).inet == address_v4::loopback().to_string())
throw uhd::runtime_error(
"No network address except for loopback found.\n"
"Make sure your DHCP server is working or configure a static IP");
}
-int main(int argc, char *argv[])
+int main(int argc, char* argv[])
{
po::options_description desc("Allowed options");
// clang-format off
@@ -45,25 +42,29 @@ int main(int argc, char *argv[])
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
- //print the help message
- if (vm.count("help")){
+ // print the help message
+ if (vm.count("help")) {
std::cout << boost::format("UHD E3x0 Network Mode %s") % desc << std::endl;
return EXIT_FAILURE;
}
uhd::device_addr_t args;
- if(vm.count("fpga")) {
+ if (vm.count("fpga")) {
args["fpga"] = vm["fpga"].as<std::string>();
}
try {
check_network_ok();
- uhd::usrp::e300::network_server::sptr server = uhd::usrp::e300::network_server::make(args);
+ uhd::usrp::e300::network_server::sptr server =
+ uhd::usrp::e300::network_server::make(args);
server->run();
- } catch (uhd::assertion_error &e) {
- std::cout << "This executable is supposed to run on the device, not on the host." << std::endl
- << "Please refer to the manual section on operating your e3x0 device in network mode." << std::endl;
+ } catch (uhd::assertion_error& e) {
+ std::cout << "This executable is supposed to run on the device, not on the host."
+ << std::endl
+ << "Please refer to the manual section on operating your e3x0 device "
+ "in network mode."
+ << std::endl;
return EXIT_FAILURE;
- } catch (uhd::runtime_error &e) {
+ } catch (uhd::runtime_error& e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}
diff --git a/mpm/include/mpm/ad9361/ad9361_ctrl.hpp b/mpm/include/mpm/ad9361/ad9361_ctrl.hpp
index f79502add..8bcd7f7c4 100644
--- a/mpm/include/mpm/ad9361/ad9361_ctrl.hpp
+++ b/mpm/include/mpm/ad9361/ad9361_ctrl.hpp
@@ -8,24 +8,24 @@
// Relative to uhd/host/lib/usrp/common/ad9361_driver/
#include "../../../include/uhdlib/usrp/common/ad9361_ctrl.hpp"
-
#include <boost/make_shared.hpp>
#include <boost/noncopyable.hpp>
-
#include <functional>
#include <string>
#include <vector>
namespace mpm { namespace chips {
- using uhd::usrp::ad9361_ctrl;
-}};
+using uhd::usrp::ad9361_ctrl;
+}}; // namespace mpm::chips
-//TODO: pull in filter_info_base
+// TODO: pull in filter_info_base
#ifdef LIBMPM_PYTHON
-void export_catalina(){
+void export_catalina()
+{
LIBMPM_BOOST_PREAMBLE("ad9361")
using namespace mpm::chips;
- bp::class_<ad9361_ctrl, boost::noncopyable, boost::shared_ptr<ad9361_ctrl>>("ad9361_ctrl", bp::no_init)
+ bp::class_<ad9361_ctrl, boost::noncopyable, boost::shared_ptr<ad9361_ctrl>>(
+ "ad9361_ctrl", bp::no_init)
.def("get_gain_names", &ad9361_ctrl::get_gain_names)
.staticmethod("get_gain_names")
// Make this "Python private" because the return value can't be serialized
@@ -51,19 +51,17 @@ void export_catalina(){
.def("set_iq_balance_auto", &ad9361_ctrl::set_iq_balance_auto)
.def("get_freq", &ad9361_ctrl::get_freq)
.def("data_port_loopback", &ad9361_ctrl::data_port_loopback)
- .def("get_rssi", +[](ad9361_ctrl& self, std::string which) {
- return self.get_rssi(which).to_real();
- })
- .def("get_temperature", +[](ad9361_ctrl& self) {
- return self.get_temperature().to_real();
- })
+ .def("get_rssi",
+ +[](ad9361_ctrl& self, std::string which) {
+ return self.get_rssi(which).to_real();
+ })
+ .def("get_temperature",
+ +[](ad9361_ctrl& self) { return self.get_temperature().to_real(); })
.def("get_filter_names", &ad9361_ctrl::get_filter_names)
// Make this "Python private" because the return value can't be serialized.
.def("_get_filter", &ad9361_ctrl::get_filter)
.def("set_filter", &ad9361_ctrl::set_filter)
- .def("output_digital_test_tone", &ad9361_ctrl::output_digital_test_tone)
- ;
+ .def("output_digital_test_tone", &ad9361_ctrl::output_digital_test_tone);
}
#endif
-
diff --git a/mpm/include/mpm/ad9361/e320_defaults.hpp b/mpm/include/mpm/ad9361/e320_defaults.hpp
index 558aed375..3ce510059 100644
--- a/mpm/include/mpm/ad9361/e320_defaults.hpp
+++ b/mpm/include/mpm/ad9361/e320_defaults.hpp
@@ -13,33 +13,42 @@ namespace mpm { namespace types { namespace e320 {
using namespace uhd::usrp;
-class e320_ad9361_client_t : public uhd::usrp::ad9361_params {
+class e320_ad9361_client_t : public uhd::usrp::ad9361_params
+{
public:
~e320_ad9361_client_t() {}
- double get_band_edge(frequency_band_t band) {
+ double get_band_edge(frequency_band_t band)
+ {
switch (band) {
- case AD9361_RX_BAND0: return 0.0;
- case AD9361_RX_BAND1: return 2.6e9;
- case AD9361_TX_BAND0: return 2940.0e6;
- default: return 0;
+ case AD9361_RX_BAND0:
+ return 0.0;
+ case AD9361_RX_BAND1:
+ return 2.6e9;
+ case AD9361_TX_BAND0:
+ return 2940.0e6;
+ default:
+ return 0;
}
}
- clocking_mode_t get_clocking_mode() {
+ clocking_mode_t get_clocking_mode()
+ {
return clocking_mode_t::AD9361_XTAL_N_CLK_PATH;
}
- digital_interface_mode_t get_digital_interface_mode() {
+ digital_interface_mode_t get_digital_interface_mode()
+ {
return AD9361_DDR_FDD_LVDS;
}
- digital_interface_delays_t get_digital_interface_timing() {
+ digital_interface_delays_t get_digital_interface_timing()
+ {
digital_interface_delays_t delays;
- delays.rx_clk_delay = 0;
+ delays.rx_clk_delay = 0;
delays.rx_data_delay = 0;
- delays.tx_clk_delay = 0;
+ delays.tx_clk_delay = 0;
delays.tx_data_delay = 0;
return delays;
}
};
-}}} // namespace
+}}} // namespace mpm::types::e320
#endif // INCLUDED_E320_DEFAULTS_HPP
diff --git a/mpm/include/mpm/ad937x/ad937x_ctrl.hpp b/mpm/include/mpm/ad937x/ad937x_ctrl.hpp
index 762bd2e0e..7274c433a 100644
--- a/mpm/include/mpm/ad937x/ad937x_ctrl.hpp
+++ b/mpm/include/mpm/ad937x/ad937x_ctrl.hpp
@@ -7,40 +7,36 @@
#pragma once
#include "ad937x_ctrl_types.hpp"
-
-#include <mpm/exception.hpp>
-#include <mpm/spi/spi_iface.hpp>
-
#include <uhd/types/direction.hpp>
#include <uhd/types/ranges.hpp>
-
+#include <mpm/exception.hpp>
+#include <mpm/spi/spi_iface.hpp>
#include <boost/noncopyable.hpp>
-
-#include <memory>
#include <functional>
-#include <set>
-#include <mutex>
#include <future>
+#include <memory>
+#include <mutex>
+#include <set>
namespace mpm { namespace chips {
/*! AD937x Control Interface
-*
-* A sane API for configuring AD937x chips.
-*
-* \section ad937x_which The `which` parameter
-*
-* Many function calls require a `which` string parameter to select
-* the RF frontend. Valid values for `which` are:
-* - RX1, RX2
-* - TX1, TX2
-*
-* Frontend numbering is as designed by the AD9371.
-*
-* While all functions that use `which` specify an individual channel,
-* certain functions affect more than one channel due to the limitations of
-* the AD9371.
-*/
+ *
+ * A sane API for configuring AD937x chips.
+ *
+ * \section ad937x_which The `which` parameter
+ *
+ * Many function calls require a `which` string parameter to select
+ * the RF frontend. Valid values for `which` are:
+ * - RX1, RX2
+ * - TX1, TX2
+ *
+ * Frontend numbering is as designed by the AD9371.
+ *
+ * While all functions that use `which` specify an individual channel,
+ * certain functions affect more than one channel due to the limitations of
+ * the AD9371.
+ */
class ad937x_ctrl : public boost::noncopyable
{
public:
@@ -55,7 +51,7 @@ public:
static const uint32_t FLASH_CAL;
static const uint32_t PATH_DELAY;
static const uint32_t TX_LO_LEAKAGE_INTERNAL;
- static const uint32_t TX_LO_LEAKAGE_EXTERNAL ;
+ static const uint32_t TX_LO_LEAKAGE_EXTERNAL;
static const uint32_t TX_QEC_INIT;
static const uint32_t LOOPBACK_RX_LO_DELAY;
static const uint32_t LOOPBACK_RX_RX_QEC_INIT;
@@ -95,40 +91,37 @@ public:
* \param iface the spi_iface for accessing the AD9371
* \param gain_pins a struct defining the usage of gain pins by this device
*/
- static sptr make(
- std::shared_ptr<std::mutex> spi_mutex,
+ static sptr make(std::shared_ptr<std::mutex> spi_mutex,
const size_t deserializer_lane_xbar,
mpm::types::regs_iface::sptr iface,
mpm::ad937x::gpio::gain_pins_t gain_pins);
virtual ~ad937x_ctrl(void) {}
- //! initializes the AD9371, checks basic functionality, and prepares the chip to receive a SYSREF pulse
+ //! initializes the AD9371, checks basic functionality, and prepares the chip to
+ //! receive a SYSREF pulse
virtual void begin_initialization() = 0;
- //! finishes initialization of the AD9371 by loading the ARM binary and setting a default RF configuration
+ //! finishes initialization of the AD9371 by loading the ARM binary and setting a
+ //! default RF configuration
virtual void finish_initialization() = 0;
/*! \setup initialization and tracking calibration
- *
- *\param init_cals_mask bit masking field for init calibration default to 0x4DFF
- * NOTE: this init cals mask need to be at least 0x4F.
- *\param tracking_cals_mask bit masking field for tracking calibration default to 0xC3
- *\param timeout init calibration timeout. default to 10s
- */
- virtual void setup_cal(
- const uint32_t init_cals_mask,
- const uint32_t tracking_cals_mask,
- const uint32_t timeout
- ) = 0;
+ *
+ *\param init_cals_mask bit masking field for init calibration default to 0x4DFF
+ * NOTE: this init cals mask need to be at least 0x4F.
+ *\param tracking_cals_mask bit masking field for tracking calibration default to 0xC3
+ *\param timeout init calibration timeout. default to 10s
+ */
+ virtual void setup_cal(const uint32_t init_cals_mask,
+ const uint32_t tracking_cals_mask,
+ const uint32_t timeout) = 0;
//! set LO source
virtual std::string set_lo_source(
- const std::string &which,
- const std::string &source
- ) = 0;
+ const std::string& which, const std::string& source) = 0;
//! get LO source
- virtual std::string get_lo_source(const std::string &which) = 0;
+ virtual std::string get_lo_source(const std::string& which) = 0;
//! resets and start the JESD deframer (JESD Rx, for RF Tx)
virtual void start_jesd_rx() = 0;
@@ -154,7 +147,8 @@ public:
//! get the ilas config status bytes, see AD9371 data sheet for more information
virtual uint16_t get_ilas_config_match() = 0;
- //! enable or disable JESD loopback, when enabled JESD Rx will be directly connected to JESD Tx
+ //! enable or disable JESD loopback, when enabled JESD Rx will be directly connected
+ //! to JESD Tx
virtual void enable_jesd_loopback(const uint8_t enable) = 0;
//! get the RF frequency range for the AD9371
@@ -167,7 +161,7 @@ public:
static std::vector<double> get_clock_rates(void);
//! get the gain range for a frontend (RX, TX)
- static uhd::meta_range_t get_gain_range(const std::string &which);
+ static uhd::meta_range_t get_gain_range(const std::string& which);
//! read the product ID from the device
virtual uint8_t get_product_id() = 0;
@@ -188,10 +182,7 @@ public:
virtual std::string get_arm_version() = 0;
//! set the BW filter for the frontend which
- virtual double set_bw_filter(
- const std::string &which,
- const double value
- ) = 0;
+ virtual double set_bw_filter(const std::string& which, const double value) = 0;
/*! \brief set the gain for the frontend which
*
@@ -199,21 +190,21 @@ public:
* \param value target gain value
* \return actual gain value
*/
- virtual double set_gain(const std::string &which, const double value) = 0;
+ virtual double set_gain(const std::string& which, const double value) = 0;
/*! \brief get the gain for the frontend which
- *
- * \param which frontend string
- * \return actual gain value
- */
- virtual double get_gain(const std::string &which) = 0;
+ *
+ * \param which frontend string
+ * \return actual gain value
+ */
+ virtual double get_gain(const std::string& which) = 0;
/*! \brief set the agc mode for all RX channels
*
* \param which frontend string
* \param mode requested mode (automatic, manual, hybrid)
*/
- virtual void set_agc_mode(const std::string &which, const std::string &mode) = 0;
+ virtual void set_agc_mode(const std::string& which, const std::string& mode) = 0;
/*! \brief set the clock rate for the device
*
@@ -223,7 +214,7 @@ public:
virtual double set_clock_rate(double value) = 0;
//! enable the frontend which
- virtual void enable_channel(const std::string &which, const bool enable) = 0;
+ virtual void enable_channel(const std::string& which, const bool enable) = 0;
/*! \brief set the RF frequency for the direction specified in which
* Sets the RF frequency. This is a per direction setting.
@@ -233,10 +224,7 @@ public:
* \return actual frequency
*/
virtual double set_freq(
- const std::string &which,
- const double value,
- const bool wait_for_lock
- ) = 0;
+ const std::string& which, const double value, const bool wait_for_lock) = 0;
/*! \brief get the RF frequency for the direction specified in which
*
@@ -244,7 +232,7 @@ public:
* \param which frontend string to specify direction to get
* \return actual frequency
*/
- virtual double get_freq(const std::string &which) = 0;
+ virtual double get_freq(const std::string& which) = 0;
/*! \brief Returns the LO lock status
*
@@ -253,40 +241,28 @@ public:
* This does not check the PLL lock status for the main clock, the sniffer,
* or the CAL PLL.
*/
- virtual bool get_lo_locked(const std::string &which) = 0;
+ virtual bool get_lo_locked(const std::string& which) = 0;
//! set master clock rate
virtual void set_master_clock_rate(const double rate) = 0;
//! set the FIR filter for the frontend which
virtual void set_fir(
- const std::string &which,
- const int8_t gain,
- const std::vector<int16_t> & fir
- ) = 0;
+ const std::string& which, const int8_t gain, const std::vector<int16_t>& fir) = 0;
//! get the FIR filter for the frontend which
- virtual std::vector<int16_t> get_fir(
- const std::string &which,
- int8_t &gain
- ) = 0;
+ virtual std::vector<int16_t> get_fir(const std::string& which, int8_t& gain) = 0;
// TODO: update docstring with temperature unit and calibration information
//! get the device temperature
virtual int16_t get_temperature() = 0;
//! enable or disable gain ctrl pins for one channel
- virtual void set_enable_gain_pins(
- const std::string &which,
- const bool enable
- ) = 0;
+ virtual void set_enable_gain_pins(const std::string& which, const bool enable) = 0;
//! set step sizes for gain ctrl pins for one channel
virtual void set_gain_pin_step_sizes(
- const std::string &which,
- double inc_step,
- double dec_step
- ) = 0;
+ const std::string& which, double inc_step, double dec_step) = 0;
//! Direct register read access
virtual uint8_t peek8(const uint32_t addr) = 0;
@@ -298,54 +274,51 @@ public:
}}; /* namespace mpm::chips */
#ifdef LIBMPM_PYTHON
-void export_mykonos(){
+void export_mykonos()
+{
LIBMPM_BOOST_PREAMBLE("ad937x")
using namespace mpm::chips;
- bp::class_<ad937x_ctrl, boost::noncopyable, std::shared_ptr<ad937x_ctrl>>("ad937x_ctrl", bp::no_init)
+ bp::class_<ad937x_ctrl, boost::noncopyable, std::shared_ptr<ad937x_ctrl>>(
+ "ad937x_ctrl", bp::no_init)
.def("set_master_clock_rate", &ad937x_ctrl::set_master_clock_rate)
.def("begin_initialization", &ad937x_ctrl::begin_initialization)
- .def("async__finish_initialization", +[](
- ad937x_ctrl& self
- ){
- self.handle_finish_initialization = std::async(std::launch::async,
- &ad937x_ctrl::finish_initialization,
- &self
- );
- })
- .def("await__finish_initialization", +[](
- ad937x_ctrl& self
- )->bool{
- if (self.handle_finish_initialization.wait_for(std::chrono::seconds(0)) == std::future_status::ready){
+ .def("async__finish_initialization",
+ +[](ad937x_ctrl& self) {
+ self.handle_finish_initialization = std::async(
+ std::launch::async, &ad937x_ctrl::finish_initialization, &self);
+ })
+ .def("await__finish_initialization",
+ +[](ad937x_ctrl& self) -> bool {
+ if (self.handle_finish_initialization.wait_for(std::chrono::seconds(0))
+ == std::future_status::ready) {
self.handle_finish_initialization.get();
return true;
}
return false;
- })
+ })
.def("set_lo_source", &ad937x_ctrl::set_lo_source)
.def("get_lo_source", &ad937x_ctrl::get_lo_source)
- .def("async__setup_cal", +[](
- ad937x_ctrl& self,
- const uint32_t init_cals_mask,
- const uint32_t timeout,
- const uint32_t tracking_cals_mask
- ){
+ .def("async__setup_cal",
+ +[](ad937x_ctrl& self,
+ const uint32_t init_cals_mask,
+ const uint32_t timeout,
+ const uint32_t tracking_cals_mask) {
self.handle_setup_cal = std::async(std::launch::async,
&ad937x_ctrl::setup_cal,
&self,
init_cals_mask,
timeout,
- tracking_cals_mask
- );
- })
- .def("await__setup_cal", +[](
- ad937x_ctrl& self
- )->bool{
- if (self.handle_setup_cal.wait_for(std::chrono::seconds(0)) == std::future_status::ready){
+ tracking_cals_mask);
+ })
+ .def("await__setup_cal",
+ +[](ad937x_ctrl& self) -> bool {
+ if (self.handle_setup_cal.wait_for(std::chrono::seconds(0))
+ == std::future_status::ready) {
self.handle_setup_cal.get();
return true;
}
return false;
- })
+ })
.def("start_jesd_rx", &ad937x_ctrl::start_jesd_rx)
.def("start_jesd_tx", &ad937x_ctrl::start_jesd_tx)
.def("start_radio", &ad937x_ctrl::start_radio)
@@ -411,9 +384,9 @@ void export_mykonos(){
.def_readonly("TRACK_ORX2_QEC_SNLO", &ad937x_ctrl::TRACK_ORX2_QEC_SNLO)
.def_readonly("TRACK_SRX_QEC", &ad937x_ctrl::TRACK_SRX_QEC)
.def_readonly("DEFAULT_INIT_CALS_MASKS", &ad937x_ctrl::DEFAULT_INIT_CALS_MASKS)
- .def_readonly("DEFAULT_TRACKING_CALS_MASKS", &ad937x_ctrl::DEFAULT_TRACKING_CALS_MASKS)
- .def_readonly("DEFAULT_INIT_CALS_TIMEOUT", &ad937x_ctrl::DEFAULT_INIT_CALS_TIMEOUT)
- ;
+ .def_readonly(
+ "DEFAULT_TRACKING_CALS_MASKS", &ad937x_ctrl::DEFAULT_TRACKING_CALS_MASKS)
+ .def_readonly(
+ "DEFAULT_INIT_CALS_TIMEOUT", &ad937x_ctrl::DEFAULT_INIT_CALS_TIMEOUT);
}
#endif
-
diff --git a/mpm/include/mpm/ad937x/ad937x_ctrl_types.hpp b/mpm/include/mpm/ad937x/ad937x_ctrl_types.hpp
index 89c539739..3f308e361 100644
--- a/mpm/include/mpm/ad937x/ad937x_ctrl_types.hpp
+++ b/mpm/include/mpm/ad937x/ad937x_ctrl_types.hpp
@@ -6,43 +6,39 @@
#pragma once
-namespace mpm {
- namespace ad937x {
- namespace gpio {
- enum class gain_pin_t {
- NONE,
- PIN0,
- PIN1,
- PIN2,
- PIN3,
- PIN4,
- PIN5,
- PIN6,
- PIN7,
- PIN8,
- PIN9,
- PIN10,
- PIN11,
- PIN12,
- PIN13,
- PIN14,
- PIN15,
- PIN16,
- PIN17,
- PIN18,
- };
+namespace mpm { namespace ad937x { namespace gpio {
+enum class gain_pin_t {
+ NONE,
+ PIN0,
+ PIN1,
+ PIN2,
+ PIN3,
+ PIN4,
+ PIN5,
+ PIN6,
+ PIN7,
+ PIN8,
+ PIN9,
+ PIN10,
+ PIN11,
+ PIN12,
+ PIN13,
+ PIN14,
+ PIN15,
+ PIN16,
+ PIN17,
+ PIN18,
+};
- struct gain_pins_t
- {
- gain_pin_t rx1_inc_gain_pin;
- gain_pin_t rx1_dec_gain_pin;
- gain_pin_t rx2_inc_gain_pin;
- gain_pin_t rx2_dec_gain_pin;
- gain_pin_t tx1_inc_gain_pin;
- gain_pin_t tx1_dec_gain_pin;
- gain_pin_t tx2_inc_gain_pin;
- gain_pin_t tx2_dec_gain_pin;
- };
- }
- }
-}
+struct gain_pins_t
+{
+ gain_pin_t rx1_inc_gain_pin;
+ gain_pin_t rx1_dec_gain_pin;
+ gain_pin_t rx2_inc_gain_pin;
+ gain_pin_t rx2_dec_gain_pin;
+ gain_pin_t tx1_inc_gain_pin;
+ gain_pin_t tx1_dec_gain_pin;
+ gain_pin_t tx2_inc_gain_pin;
+ gain_pin_t tx2_dec_gain_pin;
+};
+}}} // namespace mpm::ad937x::gpio
diff --git a/mpm/include/mpm/ad937x/ad937x_spi_iface.hpp b/mpm/include/mpm/ad937x/ad937x_spi_iface.hpp
index 042c55265..26a51e20b 100644
--- a/mpm/include/mpm/ad937x/ad937x_spi_iface.hpp
+++ b/mpm/include/mpm/ad937x/ad937x_spi_iface.hpp
@@ -10,13 +10,10 @@
namespace mpm { namespace chips {
- /*! Return a peek/poke interface to the LMK04828
- *
- * Assumption is it is attached to a spidev
- */
- mpm::types::regs_iface::sptr make_ad937x_iface(
- const std::string &spi_device
- );
+/*! Return a peek/poke interface to the LMK04828
+ *
+ * Assumption is it is attached to a spidev
+ */
+mpm::types::regs_iface::sptr make_ad937x_iface(const std::string& spi_device);
}}; /* namespace mpm::chips */
-
diff --git a/mpm/include/mpm/ad937x/adi_ctrl.hpp b/mpm/include/mpm/ad937x/adi_ctrl.hpp
index f6b8aa89b..caf8ad191 100644
--- a/mpm/include/mpm/ad937x/adi_ctrl.hpp
+++ b/mpm/include/mpm/ad937x/adi_ctrl.hpp
@@ -11,8 +11,9 @@
struct ad9371_spiSettings_t
{
- static ad9371_spiSettings_t* make(spiSettings_t *sps) {
- return reinterpret_cast<ad9371_spiSettings_t *>(sps);
+ static ad9371_spiSettings_t* make(spiSettings_t* sps)
+ {
+ return reinterpret_cast<ad9371_spiSettings_t*>(sps);
}
explicit ad9371_spiSettings_t(mpm::types::regs_iface*);
@@ -25,9 +26,7 @@ struct ad9371_spiSettings_t
std::chrono::microseconds timeout_duration;
};
-enum ad9371_spi_errors_t : uint32_t
-{
+enum ad9371_spi_errors_t : uint32_t {
SPI_READ_ERROR = 4096,
SPI_WRITE_ERROR = 4097,
};
-
diff --git a/mpm/include/mpm/dboards/magnesium_manager.hpp b/mpm/include/mpm/dboards/magnesium_manager.hpp
index 200de90b3..ab2a20864 100644
--- a/mpm/include/mpm/dboards/magnesium_manager.hpp
+++ b/mpm/include/mpm/dboards/magnesium_manager.hpp
@@ -6,47 +6,52 @@
#pragma once
+#include <mpm/ad937x/ad937x_ctrl.hpp>
#include <mpm/types/lockable.hpp>
#include <mpm/types/regs_iface.hpp>
-#include <mpm/ad937x/ad937x_ctrl.hpp>
#include <memory>
#include <mutex>
namespace mpm { namespace dboards {
- class magnesium_manager// : public dboard_periph_manager
+class magnesium_manager // : public dboard_periph_manager
+{
+public:
+ magnesium_manager(
+ const std::string& mykonos_spidev, const size_t deserializer_lane_xbar);
+
+ /*! Return a reference to the SPI mutex
+ */
+ mpm::types::lockable::sptr get_spi_lock()
{
- public:
- magnesium_manager(
- const std::string &mykonos_spidev,
- const size_t deserializer_lane_xbar
- );
+ return _spi_lock;
+ }
- /*! Return a reference to the SPI mutex
- */
- mpm::types::lockable::sptr get_spi_lock() { return _spi_lock; }
-
- /*! Return a reference to the radio chip controls
- */
- mpm::chips::ad937x_ctrl::sptr get_radio_ctrl(){ return _mykonos_ctrl; }
+ /*! Return a reference to the radio chip controls
+ */
+ mpm::chips::ad937x_ctrl::sptr get_radio_ctrl()
+ {
+ return _mykonos_ctrl;
+ }
- private:
- std::shared_ptr<std::mutex> _spi_mutex;
+private:
+ std::shared_ptr<std::mutex> _spi_mutex;
- // TODO: cpld control, or maybe it goes into Python
+ // TODO: cpld control, or maybe it goes into Python
- mpm::types::lockable::sptr _spi_lock;
- mpm::chips::ad937x_ctrl::sptr _mykonos_ctrl;
- };
+ mpm::types::lockable::sptr _spi_lock;
+ mpm::chips::ad937x_ctrl::sptr _mykonos_ctrl;
+};
}}; /* namespace mpm::dboards */
#ifdef LIBMPM_PYTHON
-void export_magnesium(){
+void export_magnesium()
+{
LIBMPM_BOOST_PREAMBLE("dboards")
using namespace mpm::dboards;
- bp::class_<mpm::dboards::magnesium_manager>("magnesium_manager", bp::init<std::string,size_t>())
+ bp::class_<mpm::dboards::magnesium_manager>(
+ "magnesium_manager", bp::init<std::string, size_t>())
.def("get_spi_lock", &mpm::dboards::magnesium_manager::get_spi_lock)
- .def("get_radio_ctrl", &mpm::dboards::magnesium_manager::get_radio_ctrl)
- ;
+ .def("get_radio_ctrl", &mpm::dboards::magnesium_manager::get_radio_ctrl);
}
#endif
diff --git a/mpm/include/mpm/dboards/neon_manager.hpp b/mpm/include/mpm/dboards/neon_manager.hpp
index 706dbe7c4..580b9cd38 100644
--- a/mpm/include/mpm/dboards/neon_manager.hpp
+++ b/mpm/include/mpm/dboards/neon_manager.hpp
@@ -14,27 +14,30 @@
#include <mutex>
namespace mpm { namespace dboards {
- class neon_manager// : public dboard_periph_manager
- {
- public:
- neon_manager(const std::string &catalina_spidev);
+class neon_manager // : public dboard_periph_manager
+{
+public:
+ neon_manager(const std::string& catalina_spidev);
- /*! Return a reference to the radio chip controls
- */
- mpm::chips::ad9361_ctrl::sptr get_radio_ctrl(){ return _catalina_ctrl; }
+ /*! Return a reference to the radio chip controls
+ */
+ mpm::chips::ad9361_ctrl::sptr get_radio_ctrl()
+ {
+ return _catalina_ctrl;
+ }
- private:
- mpm::chips::ad9361_ctrl::sptr _catalina_ctrl;
- };
+private:
+ mpm::chips::ad9361_ctrl::sptr _catalina_ctrl;
+};
}}; /* namespace mpm::dboards */
#ifdef LIBMPM_PYTHON
-void export_neon(){
+void export_neon()
+{
LIBMPM_BOOST_PREAMBLE("dboards")
using namespace mpm::dboards;
bp::class_<mpm::dboards::neon_manager>("neon_manager", bp::init<std::string>())
- .def("get_radio_ctrl", &mpm::dboards::neon_manager::get_radio_ctrl)
- ;
+ .def("get_radio_ctrl", &mpm::dboards::neon_manager::get_radio_ctrl);
}
#endif
diff --git a/mpm/include/mpm/exception.hpp b/mpm/include/mpm/exception.hpp
index 876ca7714..15a4a2f11 100644
--- a/mpm/include/mpm/exception.hpp
+++ b/mpm/include/mpm/exception.hpp
@@ -11,131 +11,145 @@
namespace mpm {
- struct exception : std::runtime_error{
- exception(const std::string &what);
- virtual unsigned code(void) const = 0;
- virtual exception *dynamic_clone(void) const = 0;
- virtual void dynamic_throw(void) const = 0;
- };
-
- struct assertion_error : exception{
- assertion_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual assertion_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct lookup_error : exception{
- lookup_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual lookup_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct index_error : lookup_error{
- index_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual index_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct key_error : lookup_error{
- key_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual key_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct type_error : exception{
- type_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual type_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct value_error : exception{
- value_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual value_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct runtime_error : exception{
- runtime_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual runtime_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct not_implemented_error : runtime_error{
- not_implemented_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual not_implemented_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct environment_error : exception{
- environment_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual environment_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct io_error : environment_error{
- io_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual io_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct os_error : environment_error{
- os_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual os_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct system_error : exception{
- system_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual system_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- struct syntax_error : exception{
- syntax_error(const std::string &what);
- virtual unsigned code(void) const;
- virtual syntax_error *dynamic_clone(void) const;
- virtual void dynamic_throw(void) const;
- };
-
- /*!
- * Create a formatted string with throw-site information.
- * Fills in the function name, file name, and line number.
- * \param what the std::exception message
- * \return the formatted exception message
- */
- #define MPM_THROW_SITE_INFO(what) std::string( \
- std::string(what) + "\n" + \
- " in " + std::string(__PRETTY_FUNCTION__) + "\n" + \
- " at " + std::string(__FILE__) + ":" + BOOST_STRINGIZE(__LINE__) + "\n" \
- )
-
- /*!
- * Throws an invalid code path exception with throw-site information.
- * Use this macro in places that code execution is not supposed to go.
- */
- #define MPM_THROW_INVALID_CODE_PATH() \
- throw mpm::system_error(MPM_THROW_SITE_INFO("invalid code path"))
-
- /*!
- * Assert the result of the code evaluation.
- * If the code evaluates to false, throw an assertion error.
- * \param code the code that resolved to a boolean
- */
- #define MPM_ASSERT_THROW(code) {if (not (code)) \
- throw mpm::assertion_error(MPM_THROW_SITE_INFO(#code)); \
+struct exception : std::runtime_error
+{
+ exception(const std::string& what);
+ virtual unsigned code(void) const = 0;
+ virtual exception* dynamic_clone(void) const = 0;
+ virtual void dynamic_throw(void) const = 0;
+};
+
+struct assertion_error : exception
+{
+ assertion_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual assertion_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct lookup_error : exception
+{
+ lookup_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual lookup_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct index_error : lookup_error
+{
+ index_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual index_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct key_error : lookup_error
+{
+ key_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual key_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct type_error : exception
+{
+ type_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual type_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct value_error : exception
+{
+ value_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual value_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct runtime_error : exception
+{
+ runtime_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual runtime_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct not_implemented_error : runtime_error
+{
+ not_implemented_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual not_implemented_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct environment_error : exception
+{
+ environment_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual environment_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct io_error : environment_error
+{
+ io_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual io_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct os_error : environment_error
+{
+ os_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual os_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct system_error : exception
+{
+ system_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual system_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+struct syntax_error : exception
+{
+ syntax_error(const std::string& what);
+ virtual unsigned code(void) const;
+ virtual syntax_error* dynamic_clone(void) const;
+ virtual void dynamic_throw(void) const;
+};
+
+/*!
+ * Create a formatted string with throw-site information.
+ * Fills in the function name, file name, and line number.
+ * \param what the std::exception message
+ * \return the formatted exception message
+ */
+#define MPM_THROW_SITE_INFO(what) \
+ std::string(std::string(what) + "\n" + " in " + std::string(__PRETTY_FUNCTION__) \
+ + "\n" + " at " + std::string(__FILE__) + ":" \
+ + BOOST_STRINGIZE(__LINE__) + "\n")
+
+/*!
+ * Throws an invalid code path exception with throw-site information.
+ * Use this macro in places that code execution is not supposed to go.
+ */
+#define MPM_THROW_INVALID_CODE_PATH() \
+ throw mpm::system_error(MPM_THROW_SITE_INFO("invalid code path"))
+
+/*!
+ * Assert the result of the code evaluation.
+ * If the code evaluates to false, throw an assertion error.
+ * \param code the code that resolved to a boolean
+ */
+#define MPM_ASSERT_THROW(code) \
+ { \
+ if (not(code)) \
+ throw mpm::assertion_error(MPM_THROW_SITE_INFO(#code)); \
}
} /* namespace mpm */
-
diff --git a/mpm/include/mpm/i2c/i2c_iface.hpp b/mpm/include/mpm/i2c/i2c_iface.hpp
index e3fe9e8ed..c49a70b48 100644
--- a/mpm/include/mpm/i2c/i2c_iface.hpp
+++ b/mpm/include/mpm/i2c/i2c_iface.hpp
@@ -13,49 +13,46 @@
namespace mpm { namespace i2c {
- /*! Implementation of a uhd::i2c_iface that uses Linux's i2c-dev underneath.
+/*! Implementation of a uhd::i2c_iface that uses Linux's i2c-dev underneath.
+ */
+class i2c_iface : public boost::noncopyable
+{
+public:
+ using sptr = std::shared_ptr<i2c_iface>;
+
+ /*!
+ * \param bus The path to the i2c bus segment used (e.g. "/dev/i2c3")
+ * \param addr Address of the slave device on the bus segment
+ * \param ten_bit_addr Whether the slave device's address is 10 bits
+ * \param timeout_ms Time to wait for ACK from slave device
*/
- class i2c_iface : public boost::noncopyable
- {
- public:
- using sptr = std::shared_ptr<i2c_iface>;
-
- /*!
- * \param bus The path to the i2c bus segment used (e.g. "/dev/i2c3")
- * \param addr Address of the slave device on the bus segment
- * \param ten_bit_addr Whether the slave device's address is 10 bits
- * \param timeout_ms Time to wait for ACK from slave device
- */
- static sptr make_i2cdev(
- const std::string &bus,
- const uint16_t addr,
- const bool ten_bit_addr,
- const int timeout_ms
- );
-
- /*!
- * \param tx Buffer of data to send
- * \param tx_len Size (in bytes) of TX buffer
- * \param rx Buffer to hold read data
- * \param rx_len Number of bytes to read
- * \param do_close If true, close file descriptor at end of function
- */
- virtual int transfer(uint8_t *tx, size_t tx_len, uint8_t *rx,
- size_t rx_len, bool do_close = true) = 0;
-
- /*!
- * \param tx Buffer of data to send
- * \param rx Buffer to hold read data
- * \param do_close If true, close file descriptor at end of function
- *
- * All data in tx will be transmitted.
- * The amount of data read will be determined by the number of elements
- * in the rx vector. Those elements will be overwritten with the data.
- * Use the resize() function for a new rx vector.
- */
- virtual int transfer(std::vector<uint8_t> *tx, std::vector<uint8_t> *rx,
- bool do_close = true) = 0;
- };
+ static sptr make_i2cdev(const std::string& bus,
+ const uint16_t addr,
+ const bool ten_bit_addr,
+ const int timeout_ms);
+
+ /*!
+ * \param tx Buffer of data to send
+ * \param tx_len Size (in bytes) of TX buffer
+ * \param rx Buffer to hold read data
+ * \param rx_len Number of bytes to read
+ * \param do_close If true, close file descriptor at end of function
+ */
+ virtual int transfer(
+ uint8_t* tx, size_t tx_len, uint8_t* rx, size_t rx_len, bool do_close = true) = 0;
+
+ /*!
+ * \param tx Buffer of data to send
+ * \param rx Buffer to hold read data
+ * \param do_close If true, close file descriptor at end of function
+ *
+ * All data in tx will be transmitted.
+ * The amount of data read will be determined by the number of elements
+ * in the rx vector. Those elements will be overwritten with the data.
+ * Use the resize() function for a new rx vector.
+ */
+ virtual int transfer(
+ std::vector<uint8_t>* tx, std::vector<uint8_t>* rx, bool do_close = true) = 0;
+};
}}; /* namespace mpm::i2c */
-
diff --git a/mpm/include/mpm/i2c/i2c_python.hpp b/mpm/include/mpm/i2c/i2c_python.hpp
index d50b1d4d6..f358ea687 100644
--- a/mpm/include/mpm/i2c/i2c_python.hpp
+++ b/mpm/include/mpm/i2c/i2c_python.hpp
@@ -6,24 +6,24 @@
#pragma once
-#include "i2c_regs_iface.hpp"
#include "i2c_iface.hpp"
+#include "i2c_regs_iface.hpp"
-void export_i2c() {
+void export_i2c()
+{
LIBMPM_BOOST_PREAMBLE("i2c")
bp::def("make_i2cdev_regs_iface", &mpm::i2c::make_i2cdev_regs_iface);
-/*
- bp::def("make_i2cdev", &mpm::i2c::i2c_iface::make_i2cdev);
+ /*
+ bp::def("make_i2cdev", &mpm::i2c::i2c_iface::make_i2cdev);
- int (mpm::i2c::i2c_iface::*transfer_vec)(std::vector<uint8_t>*,
- std::vector<uint8_t>*) =
- &mpm::i2c::i2c_iface::transfer;
+ int (mpm::i2c::i2c_iface::*transfer_vec)(std::vector<uint8_t>*,
+ std::vector<uint8_t>*) =
+ &mpm::i2c::i2c_iface::transfer;
- bp::class_<mpm::i2c::i2c_iface, boost::noncopyable,
- std::shared_ptr<mpm::i2c::i2c_iface> >("i2c_iface", bp::no_init)
- .def("transfer", transfer_vec)
- ;
-*/
+ bp::class_<mpm::i2c::i2c_iface, boost::noncopyable,
+ std::shared_ptr<mpm::i2c::i2c_iface> >("i2c_iface", bp::no_init)
+ .def("transfer", transfer_vec)
+ ;
+ */
}
-
diff --git a/mpm/include/mpm/i2c/i2c_regs_iface.hpp b/mpm/include/mpm/i2c/i2c_regs_iface.hpp
index b63f00994..628a3bb10 100644
--- a/mpm/include/mpm/i2c/i2c_regs_iface.hpp
+++ b/mpm/include/mpm/i2c/i2c_regs_iface.hpp
@@ -6,29 +6,24 @@
#pragma once
-#include <mpm/types/regs_iface.hpp>
#include <mpm/i2c/i2c_iface.hpp>
+#include <mpm/types/regs_iface.hpp>
namespace mpm { namespace i2c {
- /*! The regs_iface class can only be used for certain i2c devices
- * For more control over the length of write and read data, use the lower-level
- * i2c_iface
- */
- mpm::types::regs_iface::sptr make_i2c_regs_iface(
- mpm::i2c::i2c_iface::sptr i2c_iface,
- const size_t reg_addr_size
- );
+/*! The regs_iface class can only be used for certain i2c devices
+ * For more control over the length of write and read data, use the lower-level
+ * i2c_iface
+ */
+mpm::types::regs_iface::sptr make_i2c_regs_iface(
+ mpm::i2c::i2c_iface::sptr i2c_iface, const size_t reg_addr_size);
- /*! Convenience factory for regs_iface based on i2c based on i2cdev
- */
- mpm::types::regs_iface::sptr make_i2cdev_regs_iface(
- const std::string &bus,
- const uint16_t addr,
- const bool ten_bit_addr,
- const int timeout_ms,
- const size_t reg_addr_size
- );
+/*! Convenience factory for regs_iface based on i2c based on i2cdev
+ */
+mpm::types::regs_iface::sptr make_i2cdev_regs_iface(const std::string& bus,
+ const uint16_t addr,
+ const bool ten_bit_addr,
+ const int timeout_ms,
+ const size_t reg_addr_size);
}}; /* namespace mpm::i2c */
-
diff --git a/mpm/include/mpm/spi/spi_iface.hpp b/mpm/include/mpm/spi/spi_iface.hpp
index c3e17c0f3..e295d1bb7 100644
--- a/mpm/include/mpm/spi/spi_iface.hpp
+++ b/mpm/include/mpm/spi/spi_iface.hpp
@@ -13,43 +13,35 @@
namespace mpm { namespace spi {
- /*! Implementation of a uhd::spi_iface that uses Linux' spidev underneath.
+/*! Implementation of a uhd::spi_iface that uses Linux' spidev underneath.
+ */
+class spi_iface : public boost::noncopyable
+{
+public:
+ using sptr = std::shared_ptr<spi_iface>;
+
+ /*! Convenience function: SPI xfer is 24 bits write, 8 bits read.
+ *
+ * \param data The write data for this xfer
+ *
+ * \return 8 bits worth of the return xfer
*/
- class spi_iface : public boost::noncopyable
- {
- public:
- using sptr = std::shared_ptr<spi_iface>;
-
- /*! Convenience function: SPI xfer is 24 bits write, 8 bits read.
- *
- * \param data The write data for this xfer
- *
- * \return 8 bits worth of the return xfer
- */
- virtual uint32_t transfer24_8(
- const uint32_t data
- ) = 0;
-
- /*! Convenience function: SPI xfer is 24 bits write, 16 bits read.
- *
- * \param data The write data for this xfer
- *
- * \return 16 bits worth of the return xfer
- */
- virtual uint32_t transfer24_16(
- const uint32_t data
- ) = 0;
-
- /*!
- * \param device The path to the spidev used (e.g. "/dev/spidev0.0")
- * \param speed_hz Transaction speed in Hz
- */
- static sptr make_spidev(
- const std::string &device,
- const int speed_hz,
- const int spi_mode=3
- );
- };
-
-}}; /* namespace mpm */
+ virtual uint32_t transfer24_8(const uint32_t data) = 0;
+ /*! Convenience function: SPI xfer is 24 bits write, 16 bits read.
+ *
+ * \param data The write data for this xfer
+ *
+ * \return 16 bits worth of the return xfer
+ */
+ virtual uint32_t transfer24_16(const uint32_t data) = 0;
+
+ /*!
+ * \param device The path to the spidev used (e.g. "/dev/spidev0.0")
+ * \param speed_hz Transaction speed in Hz
+ */
+ static sptr make_spidev(
+ const std::string& device, const int speed_hz, const int spi_mode = 3);
+};
+
+}}; // namespace mpm::spi
diff --git a/mpm/include/mpm/spi/spi_python.hpp b/mpm/include/mpm/spi/spi_python.hpp
index ab6a7a232..2b609c44a 100644
--- a/mpm/include/mpm/spi/spi_python.hpp
+++ b/mpm/include/mpm/spi/spi_python.hpp
@@ -6,18 +6,18 @@
#pragma once
-#include "spi_regs_iface.hpp"
#include "spi_iface.hpp"
+#include "spi_regs_iface.hpp"
-void export_spi() {
+void export_spi()
+{
LIBMPM_BOOST_PREAMBLE("spi")
bp::def("make_spidev_regs_iface", &mpm::spi::make_spidev_regs_iface);
bp::def("make_spidev", &mpm::spi::spi_iface::make_spidev);
- bp::class_<mpm::spi::spi_iface, boost::noncopyable, std::shared_ptr<mpm::spi::spi_iface> >("spi_iface", bp::no_init)
- .def("transfer24_8", &mpm::spi::spi_iface::transfer24_8)
- ;
-
+ bp::class_<mpm::spi::spi_iface,
+ boost::noncopyable,
+ std::shared_ptr<mpm::spi::spi_iface>>("spi_iface", bp::no_init)
+ .def("transfer24_8", &mpm::spi::spi_iface::transfer24_8);
}
-
diff --git a/mpm/include/mpm/spi/spi_regs_iface.hpp b/mpm/include/mpm/spi/spi_regs_iface.hpp
index a74d7ebb4..6351cf9b5 100644
--- a/mpm/include/mpm/spi/spi_regs_iface.hpp
+++ b/mpm/include/mpm/spi/spi_regs_iface.hpp
@@ -6,30 +6,25 @@
#pragma once
-#include <mpm/types/regs_iface.hpp>
#include <mpm/spi/spi_iface.hpp>
+#include <mpm/types/regs_iface.hpp>
namespace mpm { namespace spi {
- mpm::types::regs_iface::sptr make_spi_regs_iface(
- mpm::spi::spi_iface::sptr spi_iface,
- uint32_t addr_shift,
- uint32_t data_shift,
- uint32_t read_flags,
- uint32_t write_flags = 0
- );
+mpm::types::regs_iface::sptr make_spi_regs_iface(mpm::spi::spi_iface::sptr spi_iface,
+ uint32_t addr_shift,
+ uint32_t data_shift,
+ uint32_t read_flags,
+ uint32_t write_flags = 0);
- /*! Convenience factory for regs_iface based on SPI based on spidev
- */
- mpm::types::regs_iface::sptr make_spidev_regs_iface(
- const std::string &device,
- const int speed_hz,
- const int spi_mode,
- uint32_t addr_shift,
- uint32_t data_shift,
- uint32_t read_flags,
- uint32_t write_flags = 0
- );
+/*! Convenience factory for regs_iface based on SPI based on spidev
+ */
+mpm::types::regs_iface::sptr make_spidev_regs_iface(const std::string& device,
+ const int speed_hz,
+ const int spi_mode,
+ uint32_t addr_shift,
+ uint32_t data_shift,
+ uint32_t read_flags,
+ uint32_t write_flags = 0);
}}; /* namespace mpm::spi */
-
diff --git a/mpm/include/mpm/tests/tests_spi_iface.hpp b/mpm/include/mpm/tests/tests_spi_iface.hpp
index c30922747..71993ac46 100644
--- a/mpm/include/mpm/tests/tests_spi_iface.hpp
+++ b/mpm/include/mpm/tests/tests_spi_iface.hpp
@@ -9,50 +9,37 @@
#include <memory>
namespace mpm {
- class tests_spi_iface : public virtual spi_iface
+class tests_spi_iface : public virtual spi_iface
+{
+public:
+ /**************************************************************************
+ * spi_iface API calls
+ *************************************************************************/
+
+ typedef std::shared_ptr<tests_spi_iface> sptr;
+ static sptr make()
{
- public:
-
- /**************************************************************************
- * spi_iface API calls
- *************************************************************************/
-
- typedef std::shared_ptr<tests_spi_iface> sptr;
- static sptr make(){
- return std::make_shared<tests_spi_iface>();
- };
-
- void write_byte(
- const uint16_t addr,
- const uint8_t data
- );
-
- void write_bytes(
- const uint16_t *addr,
- const uint8_t *data,
- const uint32_t count
- );
-
- uint8_t read_byte(const uint16_t addr);
-
- void write_field(
- const uint16_t addr,
- const uint8_t field_val,
- const uint8_t mask,
- const uint8_t start_bit
- );
-
- uint8_t read_field(
- const uint16_t addr,
- const uint8_t mask,
- const uint8_t start_bit
- );
- spi_wire_mode_t get_wire_mode() const;
- spi_endianness_t get_endianness() const;
- size_t get_chip_select() const;
-
- private:
- std::unordered_map<uint16_t, uint8_t> _regs;
- uint8_t _default_val = 0;
+ return std::make_shared<tests_spi_iface>();
};
-}
+
+ void write_byte(const uint16_t addr, const uint8_t data);
+
+ void write_bytes(const uint16_t* addr, const uint8_t* data, const uint32_t count);
+
+ uint8_t read_byte(const uint16_t addr);
+
+ void write_field(const uint16_t addr,
+ const uint8_t field_val,
+ const uint8_t mask,
+ const uint8_t start_bit);
+
+ uint8_t read_field(const uint16_t addr, const uint8_t mask, const uint8_t start_bit);
+ spi_wire_mode_t get_wire_mode() const;
+ spi_endianness_t get_endianness() const;
+ size_t get_chip_select() const;
+
+private:
+ std::unordered_map<uint16_t, uint8_t> _regs;
+ uint8_t _default_val = 0;
+};
+} // namespace mpm
diff --git a/mpm/include/mpm/types/lockable.hpp b/mpm/include/mpm/types/lockable.hpp
index 848fdbd7e..36b96fa50 100644
--- a/mpm/include/mpm/types/lockable.hpp
+++ b/mpm/include/mpm/types/lockable.hpp
@@ -12,29 +12,26 @@
namespace mpm { namespace types {
- /*! A lockable object
- *
- * Don't tell anyone, but's really just a wrapper around a mutex. This
- * class is primarily to make it easy to safely expose that mutex into
- * Python.
+/*! A lockable object
+ *
+ * Don't tell anyone, but's really just a wrapper around a mutex. This
+ * class is primarily to make it easy to safely expose that mutex into
+ * Python.
+ */
+class lockable : public boost::noncopyable
+{
+public:
+ using sptr = std::shared_ptr<lockable>;
+
+ /*! Lock the lock
*/
- class lockable : public boost::noncopyable
- {
- public:
- using sptr = std::shared_ptr<lockable>;
+ virtual void lock() = 0;
- /*! Lock the lock
- */
- virtual void lock() = 0;
-
- /*! Unlock the lock
- */
- virtual void unlock() = 0;
+ /*! Unlock the lock
+ */
+ virtual void unlock() = 0;
- static sptr make(
- std::shared_ptr<std::mutex> spi_mutex
- );
- };
+ static sptr make(std::shared_ptr<std::mutex> spi_mutex);
+};
}}; /* namespace mpm::types */
-
diff --git a/mpm/include/mpm/types/log_buf.hpp b/mpm/include/mpm/types/log_buf.hpp
index df788ff6f..99ca71bcd 100644
--- a/mpm/include/mpm/types/log_buf.hpp
+++ b/mpm/include/mpm/types/log_buf.hpp
@@ -6,82 +6,75 @@
#pragma once
-#include <boost/noncopyable.hpp>
#include <boost/circular_buffer.hpp>
-#include <mutex>
+#include <boost/noncopyable.hpp>
+#include <functional>
#include <memory>
+#include <mutex>
#include <tuple>
-#include <functional>
namespace mpm { namespace types {
- //! Log levels, designed to match the ones in mpmlog.py
- enum class log_level_t {
- NONE = 0, //!< Use this when there's actually no message
- TRACE = 1,
- DEBUG = 10,
- INFO = 20,
- WARNING = 30,
- ERROR = 40,
- CRITICAL = 50
- };
-
- struct log_message {
- log_level_t log_level;
- std::string component;
- std::string message;
-
- log_message(
- const log_level_t log_level_,
- const std::string& component_,
- const std::string& message_
- ) : log_level(log_level_)
- , component(component_)
- , message(message_)
- {
- // nop
- }
- };
-
- class log_buf : public boost::noncopyable
+//! Log levels, designed to match the ones in mpmlog.py
+enum class log_level_t {
+ NONE = 0, //!< Use this when there's actually no message
+ TRACE = 1,
+ DEBUG = 10,
+ INFO = 20,
+ WARNING = 30,
+ ERROR = 40,
+ CRITICAL = 50
+};
+
+struct log_message
+{
+ log_level_t log_level;
+ std::string component;
+ std::string message;
+
+ log_message(const log_level_t log_level_,
+ const std::string& component_,
+ const std::string& message_)
+ : log_level(log_level_), component(component_), message(message_)
{
- public:
- using sptr = std::shared_ptr<log_buf>;
+ // nop
+ }
+};
- static const size_t BUFSIZE = 20;
+class log_buf : public boost::noncopyable
+{
+public:
+ using sptr = std::shared_ptr<log_buf>;
- log_buf() : _buf(BUFSIZE) {}
- ~log_buf() {}
+ static const size_t BUFSIZE = 20;
- static sptr make();
+ log_buf() : _buf(BUFSIZE) {}
+ ~log_buf() {}
- static sptr make_singleton();
+ static sptr make();
- /*! Post a message to the ring buffer
- *
- * \param log_level Log level
- * \param component The component where the message is originating from
- * \param message The actual log message
- */
- void post(
- const log_level_t log_level,
- const std::string &component,
- const std::string &message
- );
+ static sptr make_singleton();
- //! Use this to set a callback that gets called when a new message was
- // posted.
- void set_notify_callback(
- std::function<void(void)> callback
- );
+ /*! Post a message to the ring buffer
+ *
+ * \param log_level Log level
+ * \param component The component where the message is originating from
+ * \param message The actual log message
+ */
+ void post(const log_level_t log_level,
+ const std::string& component,
+ const std::string& message);
- std::tuple<log_level_t, std::string, std::string> pop();
+ //! Use this to set a callback that gets called when a new message was
+ // posted.
+ void set_notify_callback(std::function<void(void)> callback);
- private:
- std::mutex _buf_lock;
- boost::circular_buffer<log_message> _buf;
- std::function<void(void)> _notify_callback;
- };
+ std::tuple<log_level_t, std::string, std::string> pop();
-}} /* namespace mpm::types */
+private:
+ std::mutex _buf_lock;
+ boost::circular_buffer<log_message> _buf;
+ std::function<void(void)> _notify_callback;
+};
+}} /* namespace mpm::types */
diff --git a/mpm/include/mpm/types/mmap_regs_iface.hpp b/mpm/include/mpm/types/mmap_regs_iface.hpp
index ad76d54ee..375a5e8ed 100644
--- a/mpm/include/mpm/types/mmap_regs_iface.hpp
+++ b/mpm/include/mpm/types/mmap_regs_iface.hpp
@@ -8,51 +8,44 @@
#include <mpm/types/log_buf.hpp>
#include <boost/noncopyable.hpp>
-#include <string>
#include <cstdint>
+#include <string>
namespace mpm { namespace types {
- class mmap_regs_iface : public boost::noncopyable
- {
- public:
- mmap_regs_iface(
- const std::string &path,
- const size_t length,
- const size_t offset,
- const bool read_only = true,
- const bool open_now = true
- );
-
- //! Will call close()
- ~mmap_regs_iface();
-
- //! Open the file descriptor and mmap. Safe to call multiple times.
- void open();
-
- //! Close the file descriptor and mmap. Safe to call multiple times.
- void close();
-
- //! Write \p data to \p addr
- void poke32(const uint32_t addr, const uint32_t data);
-
- //! Read data from \p addr
- uint32_t peek32(const uint32_t addr);
-
- private:
- void log(
- mpm::types::log_level_t level,
- const std::string path,
- const char *comment
- );
-
- const std::string _path;
- const size_t _length;
- const size_t _offset;
- const bool _read_only;
- int _fd = -1;
- uint32_t *_mmap = NULL;
-
- };
+class mmap_regs_iface : public boost::noncopyable
+{
+public:
+ mmap_regs_iface(const std::string& path,
+ const size_t length,
+ const size_t offset,
+ const bool read_only = true,
+ const bool open_now = true);
+
+ //! Will call close()
+ ~mmap_regs_iface();
+
+ //! Open the file descriptor and mmap. Safe to call multiple times.
+ void open();
+
+ //! Close the file descriptor and mmap. Safe to call multiple times.
+ void close();
+
+ //! Write \p data to \p addr
+ void poke32(const uint32_t addr, const uint32_t data);
+
+ //! Read data from \p addr
+ uint32_t peek32(const uint32_t addr);
+
+private:
+ void log(mpm::types::log_level_t level, const std::string path, const char* comment);
+
+ const std::string _path;
+ const size_t _length;
+ const size_t _offset;
+ const bool _read_only;
+ int _fd = -1;
+ uint32_t* _mmap = NULL;
+};
}} /* namespace mpm::types */
diff --git a/mpm/include/mpm/types/regs_iface.hpp b/mpm/include/mpm/types/regs_iface.hpp
index 832e798da..b47c31821 100644
--- a/mpm/include/mpm/types/regs_iface.hpp
+++ b/mpm/include/mpm/types/regs_iface.hpp
@@ -11,39 +11,28 @@
namespace mpm { namespace types {
- /*! Interface to a register reader/writer interface
+/*! Interface to a register reader/writer interface
+ */
+class regs_iface : public boost::noncopyable
+{
+public:
+ using sptr = std::shared_ptr<regs_iface>;
+
+ /*! Return an 8-bit value from a given address
*/
- class regs_iface : public boost::noncopyable
- {
- public:
- using sptr = std::shared_ptr<regs_iface>;
-
- /*! Return an 8-bit value from a given address
- */
- virtual uint8_t peek8(
- const uint32_t addr
- ) = 0;
-
- /*! Write an 8-bit value to a given address
- */
- virtual void poke8(
- const uint32_t addr,
- const uint8_t data
- ) = 0;
-
- /*! Return a 16-bit value from a given address
- */
- virtual uint16_t peek16(
- const uint32_t addr
- ) = 0;
-
- /*! Write a 16-bit value to a given address
- */
- virtual void poke16(
- const uint32_t addr,
- const uint16_t data
- ) = 0;
- };
-
-}}; /* namespace mpm::regs */
+ virtual uint8_t peek8(const uint32_t addr) = 0;
+ /*! Write an 8-bit value to a given address
+ */
+ virtual void poke8(const uint32_t addr, const uint8_t data) = 0;
+
+ /*! Return a 16-bit value from a given address
+ */
+ virtual uint16_t peek16(const uint32_t addr) = 0;
+
+ /*! Write a 16-bit value to a given address
+ */
+ virtual void poke16(const uint32_t addr, const uint16_t data) = 0;
+};
+
+}}; // namespace mpm::types
diff --git a/mpm/include/mpm/types/types_python.hpp b/mpm/include/mpm/types/types_python.hpp
index 0dcc7e6ad..d523c2065 100644
--- a/mpm/include/mpm/types/types_python.hpp
+++ b/mpm/include/mpm/types/types_python.hpp
@@ -7,47 +7,45 @@
#pragma once
#include "lockable.hpp"
-#include "regs_iface.hpp"
#include "log_buf.hpp"
#include "mmap_regs_iface.hpp"
+#include "regs_iface.hpp"
-void export_types() {
+void export_types()
+{
LIBMPM_BOOST_PREAMBLE("types")
using namespace mpm::types;
- bp::class_<lockable, boost::noncopyable, std::shared_ptr<lockable> >("lockable", bp::no_init)
+ bp::class_<lockable, boost::noncopyable, std::shared_ptr<lockable>>(
+ "lockable", bp::no_init)
.def("lock", &lockable::lock)
- .def("unlock", &lockable::unlock)
- ;
+ .def("unlock", &lockable::unlock);
- bp::class_<regs_iface, boost::noncopyable, std::shared_ptr<regs_iface> >("regs_iface", bp::no_init)
+ bp::class_<regs_iface, boost::noncopyable, std::shared_ptr<regs_iface>>(
+ "regs_iface", bp::no_init)
.def("peek8", &regs_iface::peek8)
.def("poke8", &regs_iface::poke8)
.def("peek16", &regs_iface::peek16)
- .def("poke16", &regs_iface::poke16)
- ;
+ .def("poke16", &regs_iface::poke16);
- bp::class_<log_buf, boost::noncopyable, std::shared_ptr<log_buf> >("log_buf", bp::no_init)
+ bp::class_<log_buf, boost::noncopyable, std::shared_ptr<log_buf>>(
+ "log_buf", bp::no_init)
.def("make_singleton", &log_buf::make_singleton)
.staticmethod("make_singleton")
- .def("set_notify_callback", +[](log_buf& self,
- boost::python::object object) {
- self.set_notify_callback(object);
- })
- .def("pop", +[](log_buf& self){
+ .def("set_notify_callback",
+ +[](log_buf& self, boost::python::object object) {
+ self.set_notify_callback(object);
+ })
+ .def("pop", +[](log_buf& self) {
auto log_msg = self.pop();
- return bp::make_tuple(
- static_cast<int>(std::get<0>(log_msg)),
+ return bp::make_tuple(static_cast<int>(std::get<0>(log_msg)),
std::get<1>(log_msg),
- std::get<2>(log_msg)
- );
- })
- ;
+ std::get<2>(log_msg));
+ });
- bp::class_<mmap_regs_iface, boost::noncopyable, std::shared_ptr<mmap_regs_iface>>("mmap_regs_iface", bp::init<std::string, size_t, size_t, bool, bool>())
+ bp::class_<mmap_regs_iface, boost::noncopyable, std::shared_ptr<mmap_regs_iface>>(
+ "mmap_regs_iface", bp::init<std::string, size_t, size_t, bool, bool>())
.def("open", &mmap_regs_iface::open)
.def("close", &mmap_regs_iface::close)
.def("peek32", &mmap_regs_iface::peek32)
- .def("poke32", &mmap_regs_iface::poke32)
- ;
+ .def("poke32", &mmap_regs_iface::poke32);
}
-
diff --git a/mpm/include/mpm/xbar_iface.hpp b/mpm/include/mpm/xbar_iface.hpp
index 89751b115..c76aed640 100644
--- a/mpm/include/mpm/xbar_iface.hpp
+++ b/mpm/include/mpm/xbar_iface.hpp
@@ -5,20 +5,21 @@
//
#pragma once
#include <boost/noncopyable.hpp>
+#include <cstdint>
#include <memory>
#include <mutex>
-#include <cstdint>
-namespace mpm{
+namespace mpm {
/*!
* Crossbar route command
*/
-using rfnoc_crossbar_cmd = struct rfnoc_crossbar_cmd {
+using rfnoc_crossbar_cmd = struct rfnoc_crossbar_cmd
+{
/*! destination address */
- uint8_t dest_addr;
+ uint8_t dest_addr;
/*! destination port */
- uint8_t dest_port;
+ uint8_t dest_port;
};
#define RFNCBWROUTIOC _IOW('R', 1, struct rfnoc_crossbar_cmd)
@@ -27,32 +28,33 @@ using rfnoc_crossbar_cmd = struct rfnoc_crossbar_cmd {
/*!
* Crossbar interface class holding a crossbar context
*/
-class xbar_iface: boost::noncopyable{
+class xbar_iface : boost::noncopyable
+{
public:
// use static mutex! lock_guard
using sptr = std::shared_ptr<xbar_iface>;
- static sptr make(const std::string &device);
+ static sptr make(const std::string& device);
void set_route(uint8_t dst_addr, uint8_t dst_port);
void del_route(uint8_t dst_addr, uint8_t dst_port);
~xbar_iface();
- xbar_iface(const std::string &device);
+ xbar_iface(const std::string& device);
private:
static std::mutex _lock;
int _fd;
};
-}
+} // namespace mpm
#ifdef LIBMPM_PYTHON
-void export_xbar(){
+void export_xbar()
+{
LIBMPM_BOOST_PREAMBLE("xbar")
- bp::class_<mpm::xbar_iface, boost::noncopyable, std::shared_ptr<mpm::xbar_iface> >("xbar", bp::no_init)
+ bp::class_<mpm::xbar_iface, boost::noncopyable, std::shared_ptr<mpm::xbar_iface>>(
+ "xbar", bp::no_init)
.def("make", &mpm::xbar_iface::make)
.staticmethod("make")
.def("set_route", &mpm::xbar_iface::set_route)
- .def("del_route", &mpm::xbar_iface::del_route)
- ;
+ .def("del_route", &mpm::xbar_iface::del_route);
}
#endif
-
diff --git a/mpm/lib/dboards/magnesium_manager.cpp b/mpm/lib/dboards/magnesium_manager.cpp
index 49ab7f9ec..c9f9a93b6 100644
--- a/mpm/lib/dboards/magnesium_manager.cpp
+++ b/mpm/lib/dboards/magnesium_manager.cpp
@@ -4,23 +4,19 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <mpm/dboards/magnesium_manager.hpp>
#include <mpm/ad937x/ad937x_spi_iface.hpp>
+#include <mpm/dboards/magnesium_manager.hpp>
using namespace mpm::dboards;
using namespace mpm::chips;
magnesium_manager::magnesium_manager(
- const std::string &mykonos_spidev,
- const size_t deserializer_lane_xbar
-) : _spi_mutex(std::make_shared<std::mutex>())
- , _spi_lock(mpm::types::lockable::make(_spi_mutex))
- , _mykonos_ctrl(ad937x_ctrl::make(
- _spi_mutex,
- deserializer_lane_xbar,
- make_ad937x_iface(mykonos_spidev),
- mpm::ad937x::gpio::gain_pins_t()
- ))
+ const std::string& mykonos_spidev, const size_t deserializer_lane_xbar)
+ : _spi_mutex(std::make_shared<std::mutex>())
+ , _spi_lock(mpm::types::lockable::make(_spi_mutex))
+ , _mykonos_ctrl(ad937x_ctrl::make(_spi_mutex,
+ deserializer_lane_xbar,
+ make_ad937x_iface(mykonos_spidev),
+ mpm::ad937x::gpio::gain_pins_t()))
{
}
-
diff --git a/mpm/lib/dboards/neon_manager.cpp b/mpm/lib/dboards/neon_manager.cpp
index bdd82f0b7..671e44d8d 100644
--- a/mpm/lib/dboards/neon_manager.cpp
+++ b/mpm/lib/dboards/neon_manager.cpp
@@ -27,9 +27,9 @@ constexpr uint32_t AD9361_SPI_DATA_MASK = 0x000000FF;
constexpr uint32_t AD9361_SPI_DATA_SHIFT = 0;
constexpr uint32_t AD9361_SPI_NUM_BITS = 24;
constexpr uint32_t AD9361_SPI_SPEED_HZ = 2000000;
-constexpr int AD9361_SPI_MODE = 1;
+constexpr int AD9361_SPI_MODE = 1;
-} // namespace /*anon*/
+} // namespace
/*! MPM-style E320 SPI Iface for AD9361 CTRL
*
@@ -37,10 +37,14 @@ constexpr int AD9361_SPI_MODE = 1;
class e320_ad9361_io_spi : public ad9361_io
{
public:
- e320_ad9361_io_spi(regs_iface::sptr regs_iface, uint32_t slave_num) :
- _regs_iface(regs_iface), _slave_num(slave_num) { }
+ e320_ad9361_io_spi(regs_iface::sptr regs_iface, uint32_t slave_num)
+ : _regs_iface(regs_iface), _slave_num(slave_num)
+ {
+ }
- ~e320_ad9361_io_spi() {/*nop*/}
+ ~e320_ad9361_io_spi()
+ { /*nop*/
+ }
uint8_t peek8(uint32_t reg)
{
@@ -57,11 +61,12 @@ private:
uint32_t _slave_num;
};
-neon_manager::neon_manager(const std::string &catalina_spidev)
+neon_manager::neon_manager(const std::string& catalina_spidev)
{
// Make the MPM-style low level SPI Regs iface
- auto spi_iface = mpm::spi::make_spi_regs_iface(
- mpm::spi::spi_iface::make_spidev(catalina_spidev, AD9361_SPI_SPEED_HZ, AD9361_SPI_MODE),
+ auto spi_iface = mpm::spi::make_spi_regs_iface(
+ mpm::spi::spi_iface::make_spidev(
+ catalina_spidev, AD9361_SPI_SPEED_HZ, AD9361_SPI_MODE),
AD9361_SPI_ADDR_SHIFT,
AD9361_SPI_DATA_SHIFT,
AD9361_SPI_READ_CMD,
@@ -70,10 +75,8 @@ neon_manager::neon_manager(const std::string &catalina_spidev)
auto spi_io_iface = std::make_shared<e320_ad9361_io_spi>(spi_iface, 0);
// Translate from a std shared_ptr to Boost (for legacy compatability)
auto spi_io_iface_boost = boost::shared_ptr<e320_ad9361_io_spi>(
- spi_io_iface.get(),
- [spi_io_iface](...) mutable { spi_io_iface.reset(); });
+ spi_io_iface.get(), [spi_io_iface](...) mutable { spi_io_iface.reset(); });
// Make the actual Catalina Ctrl object
_catalina_ctrl = ad9361_ctrl::make_spi(
- boost::make_shared<e320_ad9361_client_t>(),
- spi_io_iface_boost);
+ boost::make_shared<e320_ad9361_client_t>(), spi_io_iface_boost);
}
diff --git a/mpm/lib/exception.cpp b/mpm/lib/exception.cpp
index 89883a980..9d3692933 100644
--- a/mpm/lib/exception.cpp
+++ b/mpm/lib/exception.cpp
@@ -10,26 +10,37 @@
using namespace mpm;
-exception::exception(const std::string &what):
- std::runtime_error(what){/* NOP */}
+exception::exception(const std::string& what) : std::runtime_error(what)
+{ /* NOP */
+}
-#define make_exception_impl(name, class, base) \
- class::class(const std::string &what): \
- base(str(boost::format("%s: %s") % name % what)){} \
- unsigned class::code(void) const{return std::hash<std::string>()(#class) & 0xfff;} \
- class *class::dynamic_clone(void) const{return new class(*this);} \
- void class::dynamic_throw(void) const{throw *this;}
-
-make_exception_impl("AssertionError", assertion_error, exception)
-make_exception_impl("LookupError", lookup_error, exception)
-make_exception_impl("IndexError", index_error, lookup_error)
-make_exception_impl("KeyError", key_error, lookup_error)
-make_exception_impl("TypeError", type_error, exception)
-make_exception_impl("ValueError", value_error, exception)
-make_exception_impl("RuntimeError", runtime_error, exception)
-make_exception_impl("NotImplementedError", not_implemented_error, runtime_error)
-make_exception_impl("EnvironmentError", environment_error, exception)
-make_exception_impl("IOError", io_error, environment_error)
-make_exception_impl("OSError", os_error, environment_error)
-make_exception_impl("SystemError", system_error, exception)
+#define make_exception_impl(name, class, base) \
+ class ::class(const std::string& what) \
+ : base(str(boost::format("%s: %s") % name % what)) \
+ { \
+ } \
+ unsigned class ::code(void) const \
+ { \
+ return std::hash<std::string>()(#class) & 0xfff; \
+ } \
+ class* class ::dynamic_clone(void) const \
+ { \
+ return new class(*this); \
+ } \
+ void class ::dynamic_throw(void) const \
+ { \
+ throw *this; \
+ }
+make_exception_impl("AssertionError", assertion_error, exception) make_exception_impl(
+ "LookupError", lookup_error, exception) make_exception_impl("IndexError",
+ index_error,
+ lookup_error) make_exception_impl("KeyError", key_error, lookup_error)
+ make_exception_impl("TypeError", type_error, exception) make_exception_impl(
+ "ValueError", value_error, exception)
+ make_exception_impl("RuntimeError", runtime_error, exception) make_exception_impl(
+ "NotImplementedError", not_implemented_error, runtime_error)
+ make_exception_impl("EnvironmentError", environment_error, exception)
+ make_exception_impl("IOError", io_error, environment_error)
+ make_exception_impl("OSError", os_error, environment_error)
+ make_exception_impl("SystemError", system_error, exception)
diff --git a/mpm/lib/i2c/i2c_regs_iface.cpp b/mpm/lib/i2c/i2c_regs_iface.cpp
index c476cf636..575e19d26 100644
--- a/mpm/lib/i2c/i2c_regs_iface.cpp
+++ b/mpm/lib/i2c/i2c_regs_iface.cpp
@@ -4,10 +4,10 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <mpm/types/regs_iface.hpp>
+#include <mpm/exception.hpp>
#include <mpm/i2c/i2c_iface.hpp>
#include <mpm/i2c/i2c_regs_iface.hpp>
-#include <mpm/exception.hpp>
+#include <mpm/types/regs_iface.hpp>
using mpm::types::regs_iface;
@@ -18,26 +18,21 @@ using mpm::types::regs_iface;
class i2c_regs_iface_impl : public regs_iface
{
public:
-
- i2c_regs_iface_impl(
- mpm::i2c::i2c_iface::sptr i2c_iface,
- const size_t reg_addr_size
- ) : _i2c_iface(i2c_iface),
- _reg_addr_size(reg_addr_size)
+ i2c_regs_iface_impl(mpm::i2c::i2c_iface::sptr i2c_iface, const size_t reg_addr_size)
+ : _i2c_iface(i2c_iface), _reg_addr_size(reg_addr_size)
{
if (reg_addr_size > 4) {
throw mpm::runtime_error("reg_addr_size too largs for i2c_regs_iface");
}
}
- uint8_t peek8(
- const uint32_t addr
- ) {
+ uint8_t peek8(const uint32_t addr)
+ {
uint8_t rx[1];
uint8_t tx[5];
int i = 0;
for (; i < _reg_addr_size; i++) {
- tx[i] = 0xff & (addr >> 8*(_reg_addr_size-i-1));
+ tx[i] = 0xff & (addr >> 8 * (_reg_addr_size - i - 1));
}
int err = _i2c_iface->transfer(tx, _reg_addr_size, rx, 1);
@@ -48,14 +43,12 @@ public:
return rx[0];
}
- void poke8(
- const uint32_t addr,
- const uint8_t data
- ) {
+ void poke8(const uint32_t addr, const uint8_t data)
+ {
uint8_t tx[5];
int i = 0;
for (; i < _reg_addr_size; i++) {
- tx[i] = 0xff & (addr >> 8*(_reg_addr_size-i-1));
+ tx[i] = 0xff & (addr >> 8 * (_reg_addr_size - i - 1));
}
tx[i] = data;
@@ -65,14 +58,13 @@ public:
}
}
- uint16_t peek16(
- const uint32_t addr
- ) {
+ uint16_t peek16(const uint32_t addr)
+ {
uint8_t rx[2];
uint8_t tx[5];
int i = 0;
for (; i < _reg_addr_size; i++) {
- tx[i] = 0xff & (addr >> 8*(_reg_addr_size-i-1));
+ tx[i] = 0xff & (addr >> 8 * (_reg_addr_size - i - 1));
}
int err = _i2c_iface->transfer(tx, _reg_addr_size, rx, 2);
@@ -81,21 +73,19 @@ public:
}
uint16_t data = rx[0];
- data = (data << 8) | rx[1];
+ data = (data << 8) | rx[1];
return data;
}
- void poke16(
- const uint32_t addr,
- const uint16_t data
- ) {
+ void poke16(const uint32_t addr, const uint16_t data)
+ {
uint8_t tx[6];
int i = 0;
for (; i < _reg_addr_size; i++) {
- tx[i] = 0xff & (addr >> 8*(_reg_addr_size-i-1));
+ tx[i] = 0xff & (addr >> 8 * (_reg_addr_size - i - 1));
}
- tx[i] = (data >> 8) & 0xff;
- tx[i+1] = data & 0xff;
+ tx[i] = (data >> 8) & 0xff;
+ tx[i + 1] = data & 0xff;
int err = _i2c_iface->transfer(tx, _reg_addr_size + 2, NULL, 0);
if (err) {
@@ -110,27 +100,18 @@ private:
};
regs_iface::sptr mpm::i2c::make_i2c_regs_iface(
- mpm::i2c::i2c_iface::sptr i2c_iface,
- const size_t reg_addr_size
-) {
- return std::make_shared<i2c_regs_iface_impl>(
- i2c_iface,
- reg_addr_size
- );
+ mpm::i2c::i2c_iface::sptr i2c_iface, const size_t reg_addr_size)
+{
+ return std::make_shared<i2c_regs_iface_impl>(i2c_iface, reg_addr_size);
}
-mpm::types::regs_iface::sptr mpm::i2c::make_i2cdev_regs_iface(
- const std::string &bus,
+mpm::types::regs_iface::sptr mpm::i2c::make_i2cdev_regs_iface(const std::string& bus,
const uint16_t addr,
const bool ten_bit_addr,
const int timeout_ms,
- const size_t reg_addr_size
-) {
- auto i2c_iface_sptr = mpm::i2c::i2c_iface::make_i2cdev(
- bus, addr, ten_bit_addr, timeout_ms
- );
- return std::make_shared<i2c_regs_iface_impl>(
- i2c_iface_sptr,
- reg_addr_size
- );
+ const size_t reg_addr_size)
+{
+ auto i2c_iface_sptr =
+ mpm::i2c::i2c_iface::make_i2cdev(bus, addr, ten_bit_addr, timeout_ms);
+ return std::make_shared<i2c_regs_iface_impl>(i2c_iface_sptr, reg_addr_size);
}
diff --git a/mpm/lib/i2c/i2cdev_iface.cpp b/mpm/lib/i2c/i2cdev_iface.cpp
index 5b59e06f8..b346597a8 100644
--- a/mpm/lib/i2c/i2cdev_iface.cpp
+++ b/mpm/lib/i2c/i2cdev_iface.cpp
@@ -5,15 +5,12 @@
//
-#include <mpm/i2c/i2c_iface.hpp>
-#include <mpm/exception.hpp>
-
#include "i2cdev.h"
-
#include <fcntl.h>
-#include <linux/i2c.h>
#include <linux/i2c-dev.h>
-
+#include <linux/i2c.h>
+#include <mpm/exception.hpp>
+#include <mpm/i2c/i2c_iface.hpp>
#include <boost/format.hpp>
#include <iostream>
@@ -25,17 +22,15 @@ using namespace mpm::i2c;
class i2cdev_iface_impl : public i2c_iface
{
public:
-
- i2cdev_iface_impl(
- const std::string &device,
- const uint16_t addr,
- const bool ten_bit_addr,
- const unsigned int timeout_ms,
- const bool do_open = false
- ) : _device(device),
- _addr(addr),
- _ten_bit_addr(ten_bit_addr),
- _timeout_ms(timeout_ms)
+ i2cdev_iface_impl(const std::string& device,
+ const uint16_t addr,
+ const bool ten_bit_addr,
+ const unsigned int timeout_ms,
+ const bool do_open = false)
+ : _device(device)
+ , _addr(addr)
+ , _ten_bit_addr(ten_bit_addr)
+ , _timeout_ms(timeout_ms)
{
if (do_open)
_open();
@@ -49,13 +44,12 @@ public:
close(_fd);
}
- int transfer(uint8_t *tx, size_t tx_len, uint8_t *rx, size_t rx_len, bool do_close)
+ int transfer(uint8_t* tx, size_t tx_len, uint8_t* rx, size_t rx_len, bool do_close)
{
if (_fd < 0)
_open();
- int ret = i2cdev_transfer(_fd, _addr, _ten_bit_addr,
- tx, tx_len, rx, rx_len);
+ int ret = i2cdev_transfer(_fd, _addr, _ten_bit_addr, tx, tx_len, rx, rx_len);
if (do_close) {
close(_fd);
@@ -63,27 +57,25 @@ public:
}
if (ret) {
- throw mpm::runtime_error(str(
- boost::format("I2C Transaction failed!")
- ));
+ throw mpm::runtime_error(str(boost::format("I2C Transaction failed!")));
}
return ret;
}
- int transfer(std::vector<uint8_t> *tx, std::vector<uint8_t> *rx, bool do_close)
+ int transfer(std::vector<uint8_t>* tx, std::vector<uint8_t>* rx, bool do_close)
{
uint8_t *tx_data = NULL, *rx_data = NULL;
size_t tx_len = 0, rx_len = 0;
if (tx) {
tx_data = tx->data();
- tx_len = tx->size();
+ tx_len = tx->size();
}
if (rx) {
rx_data = rx->data();
- rx_len = rx->size();
+ rx_len = rx->size();
}
int ret = transfer(tx_data, tx_len, rx_data, rx_len, do_close);
@@ -97,22 +89,16 @@ private:
const bool _ten_bit_addr;
const unsigned int _timeout_ms;
- int _open(void) {
- if (i2cdev_open(
- &_fd,
- _device.c_str(),
- _timeout_ms) < 0)
- {
- throw mpm::runtime_error(str(
- boost::format("Could not initialize i2cdev device %s")
- % _device));
+ int _open(void)
+ {
+ if (i2cdev_open(&_fd, _device.c_str(), _timeout_ms) < 0) {
+ throw mpm::runtime_error(
+ str(boost::format("Could not initialize i2cdev device %s") % _device));
}
- if (_fd < 0)
- {
- throw mpm::runtime_error(str(
- boost::format("Could not open i2cdev device %s")
- % _device));
+ if (_fd < 0) {
+ throw mpm::runtime_error(
+ str(boost::format("Could not open i2cdev device %s") % _device));
}
}
};
@@ -120,14 +106,10 @@ private:
/******************************************************************************
* Factory
*****************************************************************************/
-i2c_iface::sptr i2c_iface::make_i2cdev(
- const std::string &bus,
+i2c_iface::sptr i2c_iface::make_i2cdev(const std::string& bus,
const uint16_t addr,
const bool ten_bit_addr,
- const int timeout_ms
-) {
- return std::make_shared<i2cdev_iface_impl>(
- bus, addr, ten_bit_addr, timeout_ms
- );
+ const int timeout_ms)
+{
+ return std::make_shared<i2cdev_iface_impl>(bus, addr, ten_bit_addr, timeout_ms);
}
-
diff --git a/mpm/lib/mykonos/ad937x_ctrl.cpp b/mpm/lib/mykonos/ad937x_ctrl.cpp
index efb39c972..f4abae7a7 100644
--- a/mpm/lib/mykonos/ad937x_ctrl.cpp
+++ b/mpm/lib/mykonos/ad937x_ctrl.cpp
@@ -4,25 +4,24 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include "mpm/ad937x/ad937x_ctrl.hpp"
+#include "../../../host/include/uhd/utils/math.hpp"
#include "ad937x_device.hpp"
#include "adi/mykonos.h"
-#include "mpm/ad937x/ad937x_ctrl.hpp"
#include <mpm/exception.hpp>
-#include "../../../host/include/uhd/utils/math.hpp"
-
#include <boost/format.hpp>
-#include <sstream>
-#include <set>
+#include <algorithm>
+#include <chrono>
#include <functional>
#include <iostream>
-#include <algorithm>
+#include <set>
+#include <sstream>
#include <thread>
-#include <chrono>
using namespace mpm::chips;
using namespace mpm::ad937x::device;
-//Init cals mask
+// Init cals mask
const uint32_t ad937x_ctrl::TX_BB_FILTER = ::TX_BB_FILTER;
const uint32_t ad937x_ctrl::ADC_TUNER = ::ADC_TUNER;
const uint32_t ad937x_ctrl::TIA_3DB_CORNER = ::TIA_3DB_CORNER;
@@ -41,55 +40,42 @@ const uint32_t ad937x_ctrl::RX_QEC_INIT = ::RX_QEC_INIT;
const uint32_t ad937x_ctrl::DPD_INIT = ::DPD_INIT;
const uint32_t ad937x_ctrl::CLGC_INIT = ::CLGC_INIT;
const uint32_t ad937x_ctrl::VSWR_INIT = ::VSWR_INIT;
-//Tracking Cals mask
-const uint32_t ad937x_ctrl::TRACK_RX1_QEC = ::TRACK_RX1_QEC;
-const uint32_t ad937x_ctrl::TRACK_RX2_QEC = ::TRACK_RX2_QEC;
-const uint32_t ad937x_ctrl::TRACK_ORX1_QEC = ::TRACK_ORX1_QEC;
-const uint32_t ad937x_ctrl::TRACK_ORX2_QEC = ::TRACK_ORX2_QEC;
-const uint32_t ad937x_ctrl::TRACK_TX1_LOL = ::TRACK_TX1_LOL;
-const uint32_t ad937x_ctrl::TRACK_TX2_LOL = ::TRACK_TX2_LOL;
-const uint32_t ad937x_ctrl::TRACK_TX1_QEC = ::TRACK_TX1_QEC;
-const uint32_t ad937x_ctrl::TRACK_TX2_QEC = ::TRACK_TX2_QEC;
-const uint32_t ad937x_ctrl::TRACK_TX1_DPD = ::TRACK_TX1_DPD;
-const uint32_t ad937x_ctrl::TRACK_TX2_DPD = ::TRACK_TX2_DPD;
-const uint32_t ad937x_ctrl::TRACK_TX1_CLGC = ::TRACK_TX1_CLGC;
-const uint32_t ad937x_ctrl::TRACK_TX2_CLGC = ::TRACK_TX2_CLGC;
-const uint32_t ad937x_ctrl::TRACK_TX1_VSWR = ::TRACK_TX1_VSWR;
-const uint32_t ad937x_ctrl::TRACK_TX2_VSWR = ::TRACK_TX2_VSWR;
-const uint32_t ad937x_ctrl::TRACK_ORX1_QEC_SNLO = ::TRACK_ORX1_QEC_SNLO;
-const uint32_t ad937x_ctrl::TRACK_ORX2_QEC_SNLO = ::TRACK_ORX2_QEC_SNLO;
-const uint32_t ad937x_ctrl::TRACK_SRX_QEC = ::TRACK_SRX_QEC;
+// Tracking Cals mask
+const uint32_t ad937x_ctrl::TRACK_RX1_QEC = ::TRACK_RX1_QEC;
+const uint32_t ad937x_ctrl::TRACK_RX2_QEC = ::TRACK_RX2_QEC;
+const uint32_t ad937x_ctrl::TRACK_ORX1_QEC = ::TRACK_ORX1_QEC;
+const uint32_t ad937x_ctrl::TRACK_ORX2_QEC = ::TRACK_ORX2_QEC;
+const uint32_t ad937x_ctrl::TRACK_TX1_LOL = ::TRACK_TX1_LOL;
+const uint32_t ad937x_ctrl::TRACK_TX2_LOL = ::TRACK_TX2_LOL;
+const uint32_t ad937x_ctrl::TRACK_TX1_QEC = ::TRACK_TX1_QEC;
+const uint32_t ad937x_ctrl::TRACK_TX2_QEC = ::TRACK_TX2_QEC;
+const uint32_t ad937x_ctrl::TRACK_TX1_DPD = ::TRACK_TX1_DPD;
+const uint32_t ad937x_ctrl::TRACK_TX2_DPD = ::TRACK_TX2_DPD;
+const uint32_t ad937x_ctrl::TRACK_TX1_CLGC = ::TRACK_TX1_CLGC;
+const uint32_t ad937x_ctrl::TRACK_TX2_CLGC = ::TRACK_TX2_CLGC;
+const uint32_t ad937x_ctrl::TRACK_TX1_VSWR = ::TRACK_TX1_VSWR;
+const uint32_t ad937x_ctrl::TRACK_TX2_VSWR = ::TRACK_TX2_VSWR;
+const uint32_t ad937x_ctrl::TRACK_ORX1_QEC_SNLO = ::TRACK_ORX1_QEC_SNLO;
+const uint32_t ad937x_ctrl::TRACK_ORX2_QEC_SNLO = ::TRACK_ORX2_QEC_SNLO;
+const uint32_t ad937x_ctrl::TRACK_SRX_QEC = ::TRACK_SRX_QEC;
const uint32_t ad937x_ctrl::DEFAULT_INIT_CALS_MASKS =
- ad937x_ctrl::TX_BB_FILTER |
- ad937x_ctrl::ADC_TUNER |
- ad937x_ctrl::TIA_3DB_CORNER |
- ad937x_ctrl::DC_OFFSET |
- ad937x_ctrl::TX_ATTENUATION_DELAY |
- ad937x_ctrl::RX_GAIN_DELAY |
- ad937x_ctrl::FLASH_CAL |
- ad937x_ctrl::PATH_DELAY |
- ad937x_ctrl::TX_LO_LEAKAGE_INTERNAL |
- ad937x_ctrl::TX_QEC_INIT |
- ad937x_ctrl::LOOPBACK_RX_LO_DELAY |
- ad937x_ctrl::RX_QEC_INIT
- ;
+ ad937x_ctrl::TX_BB_FILTER | ad937x_ctrl::ADC_TUNER | ad937x_ctrl::TIA_3DB_CORNER
+ | ad937x_ctrl::DC_OFFSET | ad937x_ctrl::TX_ATTENUATION_DELAY
+ | ad937x_ctrl::RX_GAIN_DELAY | ad937x_ctrl::FLASH_CAL | ad937x_ctrl::PATH_DELAY
+ | ad937x_ctrl::TX_LO_LEAKAGE_INTERNAL | ad937x_ctrl::TX_QEC_INIT
+ | ad937x_ctrl::LOOPBACK_RX_LO_DELAY | ad937x_ctrl::RX_QEC_INIT;
const uint32_t ad937x_ctrl::DEFAULT_TRACKING_CALS_MASKS =
- ad937x_ctrl::TRACK_RX1_QEC |
- ad937x_ctrl::TRACK_RX2_QEC |
- ad937x_ctrl::TRACK_TX1_QEC |
- ad937x_ctrl::TRACK_TX2_QEC
- ;
+ ad937x_ctrl::TRACK_RX1_QEC | ad937x_ctrl::TRACK_RX2_QEC | ad937x_ctrl::TRACK_TX1_QEC
+ | ad937x_ctrl::TRACK_TX2_QEC;
const uint32_t ad937x_ctrl::DEFAULT_INIT_CALS_TIMEOUT = 60000;
static uhd::direction_t _get_direction_from_antenna(const std::string& antenna)
{
auto sub = antenna.substr(0, 2);
if (sub == "RX") {
return uhd::direction_t::RX_DIRECTION;
- }
- else if (sub == "TX") {
+ } else if (sub == "TX") {
return uhd::direction_t::TX_DIRECTION;
- }
- else {
+ } else {
throw mpm::runtime_error("ad937x_ctrl got an invalid channel string.");
}
return uhd::direction_t::RX_DIRECTION;
@@ -100,11 +86,9 @@ static chain_t _get_chain_from_antenna(const std::string& antenna)
auto sub = antenna.substr(2, 1);
if (sub == "1") {
return chain_t::ONE;
- }
- else if (sub == "2") {
+ } else if (sub == "2") {
return chain_t::TWO;
- }
- else {
+ } else {
throw mpm::runtime_error("ad937x_ctrl got an invalid channel string.");
}
return chain_t::ONE;
@@ -113,15 +97,14 @@ static chain_t _get_chain_from_antenna(const std::string& antenna)
std::set<size_t> _get_valid_fir_lengths(const std::string& which)
{
auto dir = _get_direction_from_antenna(which);
- switch (dir)
- {
- case uhd::direction_t::RX_DIRECTION:
- return{ 24, 48, 72 };
- case uhd::direction_t::TX_DIRECTION:
- return{ 16, 32, 48, 64, 80, 96 };
- default:
- MPM_THROW_INVALID_CODE_PATH();
- return std::set<size_t>();
+ switch (dir) {
+ case uhd::direction_t::RX_DIRECTION:
+ return {24, 48, 72};
+ case uhd::direction_t::TX_DIRECTION:
+ return {16, 32, 48, 64, 80, 96};
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
+ return std::set<size_t>();
}
}
@@ -152,43 +135,37 @@ uhd::meta_range_t ad937x_ctrl::get_bw_filter_range(void)
std::vector<double> ad937x_ctrl::get_clock_rates(void)
{
// TODO: fix
- return { 125e6 };
+ return {125e6};
}
-uhd::meta_range_t ad937x_ctrl::get_gain_range(const std::string &which)
+uhd::meta_range_t ad937x_ctrl::get_gain_range(const std::string& which)
{
auto dir = _get_direction_from_antenna(which);
- switch (dir)
- {
- case uhd::direction_t::RX_DIRECTION:
- return uhd::meta_range_t(
- ad937x_device::MIN_RX_GAIN,
+ switch (dir) {
+ case uhd::direction_t::RX_DIRECTION:
+ return uhd::meta_range_t(ad937x_device::MIN_RX_GAIN,
ad937x_device::MAX_RX_GAIN,
- ad937x_device::RX_GAIN_STEP
- );
- case uhd::direction_t::TX_DIRECTION:
- return uhd::meta_range_t(
- ad937x_device::MIN_TX_GAIN,
+ ad937x_device::RX_GAIN_STEP);
+ case uhd::direction_t::TX_DIRECTION:
+ return uhd::meta_range_t(ad937x_device::MIN_TX_GAIN,
ad937x_device::MAX_TX_GAIN,
- ad937x_device::TX_GAIN_STEP
- );
- default:
- MPM_THROW_INVALID_CODE_PATH();
- return uhd::meta_range_t();
+ ad937x_device::TX_GAIN_STEP);
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
+ return uhd::meta_range_t();
}
}
class ad937x_ctrl_impl : public ad937x_ctrl
{
public:
- ad937x_ctrl_impl(
- std::shared_ptr<std::mutex> spi_mutex,
+ ad937x_ctrl_impl(std::shared_ptr<std::mutex> spi_mutex,
const size_t deserializer_lane_xbar,
mpm::types::regs_iface::sptr iface,
- mpm::ad937x::gpio::gain_pins_t gain_pins) :
- spi_mutex(spi_mutex),
- device(iface.get(), deserializer_lane_xbar, gain_pins),
- _iface(iface)
+ mpm::ad937x::gpio::gain_pins_t gain_pins)
+ : spi_mutex(spi_mutex)
+ , device(iface.get(), deserializer_lane_xbar, gain_pins)
+ , _iface(iface)
{
/* nop */
}
@@ -205,49 +182,45 @@ public:
device.finish_initialization();
}
- virtual void setup_cal(
- const uint32_t init_cals_mask,
- const uint32_t tracking_cals_mask,
- const uint32_t timeout
- ) {
+ virtual void setup_cal(const uint32_t init_cals_mask,
+ const uint32_t tracking_cals_mask,
+ const uint32_t timeout)
+ {
std::lock_guard<std::mutex> lock(*spi_mutex);
device.setup_cal(init_cals_mask, tracking_cals_mask, timeout);
}
- virtual std::string set_lo_source(
- const std::string &which,
- const std::string &source
- ) {
+ virtual std::string set_lo_source(const std::string& which, const std::string& source)
+ {
const auto dir = _get_direction_from_antenna(which);
- uint8_t pll_source = 0 ;
- if (source == "internal"){
+ uint8_t pll_source = 0;
+ if (source == "internal") {
pll_source = 0;
- }
- else if (source == "external") {
+ } else if (source == "external") {
pll_source = 1;
- }
- else {
+ } else {
throw mpm::runtime_error("invalid LO source");
}
std::lock_guard<std::mutex> lock(*spi_mutex);
uint8_t retval = device.set_lo_source(dir, pll_source);
- if (retval == 0){
+ if (retval == 0) {
return "internal";
- } else if (retval == 1){
+ } else if (retval == 1) {
return "external";
- }else{
+ } else {
throw mpm::runtime_error("invalid return from set LO source");
}
}
- virtual std::string get_lo_source(const std::string &which){
+ virtual std::string get_lo_source(const std::string& which)
+ {
const auto dir = _get_direction_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
uint8_t retval = device.get_lo_source(dir);
- if (retval == 0){
+ if (retval == 0) {
return "internal";
} else if (retval == 1) {
return "external";
@@ -328,10 +301,8 @@ public:
std::lock_guard<std::mutex> lock(*spi_mutex);
const auto api = device.get_api_version();
std::ostringstream ss;
- ss << api.silicon_ver << "."
- << api.major_ver << "."
- << api.minor_ver << "."
- << api.build_ver;
+ ss << api.silicon_ver << "." << api.major_ver << "." << api.minor_ver << "."
+ << api.build_ver;
return ss.str();
}
@@ -341,45 +312,43 @@ public:
std::lock_guard<std::mutex> lock(*spi_mutex);
const auto arm = device.get_arm_version();
std::ostringstream ss;
- ss << (int)(arm.major_ver) << "."
- << (int)(arm.minor_ver) << "."
- << (int)(arm.rc_ver);
-
- switch (arm.build_type)
- {
- case mpm::ad937x::device::build_type_t::RELEASE:
- ss << " Release";
- break;
- case mpm::ad937x::device::build_type_t::DEBUG:
- ss << " Debug";
- break;
- case mpm::ad937x::device::build_type_t::TEST_OBJECT:
- ss << " Test Object";
- break;
+ ss << (int)(arm.major_ver) << "." << (int)(arm.minor_ver) << "."
+ << (int)(arm.rc_ver);
+
+ switch (arm.build_type) {
+ case mpm::ad937x::device::build_type_t::RELEASE:
+ ss << " Release";
+ break;
+ case mpm::ad937x::device::build_type_t::DEBUG:
+ ss << " Debug";
+ break;
+ case mpm::ad937x::device::build_type_t::TEST_OBJECT:
+ ss << " Test Object";
+ break;
}
return ss.str();
}
- virtual double set_bw_filter(const std::string &which, const double value)
+ virtual double set_bw_filter(const std::string& which, const double value)
{
const auto dir = _get_direction_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
return device.set_bw_filter(dir, value);
}
- virtual double set_gain(const std::string &which, const double value)
+ virtual double set_gain(const std::string& which, const double value)
{
- const auto dir = _get_direction_from_antenna(which);
+ const auto dir = _get_direction_from_antenna(which);
const auto chain = _get_chain_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
return device.set_gain(dir, chain, value);
}
- virtual double get_gain(const std::string &which)
+ virtual double get_gain(const std::string& which)
{
- const auto dir = _get_direction_from_antenna(which);
+ const auto dir = _get_direction_from_antenna(which);
const auto chain = _get_chain_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
@@ -388,27 +357,21 @@ public:
// TODO: does agc mode need to have a which parameter?
// this affects all RX channels on the device
- virtual void set_agc_mode(
- const std::string &which,
- const std::string &mode
- ) {
+ virtual void set_agc_mode(const std::string& which, const std::string& mode)
+ {
const auto dir = _get_direction_from_antenna(which);
- if (dir != uhd::direction_t::RX_DIRECTION)
- {
+ if (dir != uhd::direction_t::RX_DIRECTION) {
throw mpm::runtime_error("set_agc not valid for non-rx channels");
}
ad937x_device::gain_mode_t gain_mode;
if (mode == "automatic") {
gain_mode = ad937x_device::gain_mode_t::AUTOMATIC;
- }
- else if (mode == "manual") {
+ } else if (mode == "manual") {
gain_mode = ad937x_device::gain_mode_t::MANUAL;
- }
- else if (mode == "hybrid") {
+ } else if (mode == "hybrid") {
gain_mode = ad937x_device::gain_mode_t::HYBRID;
- }
- else {
+ } else {
throw mpm::runtime_error("invalid agc mode");
}
@@ -427,9 +390,9 @@ public:
return device.set_clock_rate(value);
}
- virtual void enable_channel(const std::string &which, const bool enable)
+ virtual void enable_channel(const std::string& which, const bool enable)
{
- const auto dir = _get_direction_from_antenna(which);
+ const auto dir = _get_direction_from_antenna(which);
const auto chain = _get_chain_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
@@ -437,18 +400,16 @@ public:
}
virtual double set_freq(
- const std::string &which,
- const double value,
- const bool wait_for_lock
- ) {
- const auto dir = _get_direction_from_antenna(which);
+ const std::string& which, const double value, const bool wait_for_lock)
+ {
+ const auto dir = _get_direction_from_antenna(which);
const auto clipped_value = get_rf_freq_range().clip(value);
std::lock_guard<std::mutex> lock(*spi_mutex);
return device.tune(dir, clipped_value, wait_for_lock);
}
- virtual double get_freq(const std::string &which)
+ virtual double get_freq(const std::string& which)
{
const auto dir = _get_direction_from_antenna(which);
@@ -456,27 +417,23 @@ public:
return device.get_freq(dir);
}
- virtual bool get_lo_locked(const std::string &which)
+ virtual bool get_lo_locked(const std::string& which)
{
- const auto dir = _get_direction_from_antenna(which);
- const uint8_t pll_select = (dir == uhd::RX_DIRECTION) ?
- ad937x_device::RX_SYNTH :
- ad937x_device::TX_SYNTH;
+ const auto dir = _get_direction_from_antenna(which);
+ const uint8_t pll_select = (dir == uhd::RX_DIRECTION) ? ad937x_device::RX_SYNTH
+ : ad937x_device::TX_SYNTH;
std::lock_guard<std::mutex> lock(*spi_mutex);
return device.get_pll_lock_status(pll_select);
}
virtual void set_fir(
- const std::string &which,
- const int8_t gain,
- const std::vector<int16_t>& fir
- ) {
- const auto dir = _get_direction_from_antenna(which);
+ const std::string& which, const int8_t gain, const std::vector<int16_t>& fir)
+ {
+ const auto dir = _get_direction_from_antenna(which);
const auto lengths = _get_valid_fir_lengths(which);
- if (std::find(lengths.begin(), lengths.end(), fir.size()) == lengths.end())
- {
+ if (std::find(lengths.begin(), lengths.end(), fir.size()) == lengths.end()) {
throw mpm::value_error("invalid filter length");
}
@@ -484,7 +441,7 @@ public:
device.set_fir(dir, gain, fir);
}
- virtual std::vector<int16_t> get_fir(const std::string &which, int8_t &gain)
+ virtual std::vector<int16_t> get_fir(const std::string& which, int8_t& gain)
{
auto dir = _get_direction_from_antenna(which);
@@ -504,28 +461,22 @@ public:
ad937x_device::mcr_t mcr;
if (uhd::math::frequencies_are_equal(rate, 122.88e6)) {
mcr = ad937x_device::MCR_122_88MHZ;
- }
- else if (uhd::math::frequencies_are_equal(rate, 125e6)) {
+ } else if (uhd::math::frequencies_are_equal(rate, 125e6)) {
mcr = ad937x_device::MCR_125_00MHZ;
- }
- else if (uhd::math::frequencies_are_equal(rate, 153.6e6)) {
+ } else if (uhd::math::frequencies_are_equal(rate, 153.6e6)) {
mcr = ad937x_device::MCR_153_60MHZ;
- }
- else {
- throw mpm::value_error(boost::str(
- boost::format("Requested invalid master clock rate: %f MHz")
- % (rate / 1e6)
- ));
+ } else {
+ throw mpm::value_error(
+ boost::str(boost::format("Requested invalid master clock rate: %f MHz")
+ % (rate / 1e6)));
}
device.set_master_clock_rate(mcr);
}
- virtual void set_enable_gain_pins(
- const std::string &which,
- const bool enable
- ) {
- const auto dir = _get_direction_from_antenna(which);
+ virtual void set_enable_gain_pins(const std::string& which, const bool enable)
+ {
+ const auto dir = _get_direction_from_antenna(which);
const auto chain = _get_chain_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
@@ -533,27 +484,24 @@ public:
}
virtual void set_gain_pin_step_sizes(
- const std::string &which,
- double inc_step,
- double dec_step
- ) {
- const auto dir = _get_direction_from_antenna(which);
+ const std::string& which, double inc_step, double dec_step)
+ {
+ const auto dir = _get_direction_from_antenna(which);
const auto chain = _get_chain_from_antenna(which);
if (dir == uhd::RX_DIRECTION) {
auto steps = _get_valid_rx_gain_steps();
- inc_step = steps.clip(inc_step);
- dec_step = steps.clip(dec_step);
- }
- else if (dir == uhd::TX_DIRECTION) {
+ inc_step = steps.clip(inc_step);
+ dec_step = steps.clip(dec_step);
+ } else if (dir == uhd::TX_DIRECTION) {
auto steps = _get_valid_tx_gain_steps();
- inc_step = steps.clip(inc_step);
- dec_step = steps.clip(dec_step);
+ inc_step = steps.clip(inc_step);
+ dec_step = steps.clip(dec_step);
// double comparison here should be okay because of clipping
if (inc_step != dec_step) {
throw mpm::value_error(
- "TX gain increment and decrement steps must be equal");
+ "TX gain increment and decrement steps must be equal");
}
}
@@ -579,17 +527,11 @@ private:
mpm::types::regs_iface::sptr _iface;
};
-ad937x_ctrl::sptr ad937x_ctrl::make(
- std::shared_ptr<std::mutex> spi_mutex,
- const size_t deserializer_lane_xbar,
- mpm::types::regs_iface::sptr iface,
- mpm::ad937x::gpio::gain_pins_t gain_pins
-) {
+ad937x_ctrl::sptr ad937x_ctrl::make(std::shared_ptr<std::mutex> spi_mutex,
+ const size_t deserializer_lane_xbar,
+ mpm::types::regs_iface::sptr iface,
+ mpm::ad937x::gpio::gain_pins_t gain_pins)
+{
return std::make_shared<ad937x_ctrl_impl>(
- spi_mutex,
- deserializer_lane_xbar,
- iface,
- gain_pins
- );
+ spi_mutex, deserializer_lane_xbar, iface, gain_pins);
}
-
diff --git a/mpm/lib/mykonos/ad937x_device.cpp b/mpm/lib/mykonos/ad937x_device.cpp
index ceaa0b93c..144b813ae 100644
--- a/mpm/lib/mykonos/ad937x_device.cpp
+++ b/mpm/lib/mykonos/ad937x_device.cpp
@@ -6,28 +6,27 @@
#include "ad937x_device.hpp"
#include "adi/mykonos.h"
-#include "adi/mykonos_gpio.h"
#include "adi/mykonos_debug/mykonos_dbgjesd.h"
+#include "adi/mykonos_gpio.h"
#include "config/ad937x_config_t.hpp"
#include "config/ad937x_default_config.hpp"
#include <boost/format.hpp>
-
+#include <fstream>
#include <functional>
#include <iostream>
#include <thread>
-#include <fstream>
using namespace mpm::ad937x::device;
using namespace mpm::ad937x::gpio;
using namespace uhd;
-const double ad937x_device::MIN_FREQ = 300e6;
-const double ad937x_device::MAX_FREQ = 6e9;
-const double ad937x_device::MIN_RX_GAIN = 0.0;
-const double ad937x_device::MAX_RX_GAIN = 30.0;
+const double ad937x_device::MIN_FREQ = 300e6;
+const double ad937x_device::MAX_FREQ = 6e9;
+const double ad937x_device::MIN_RX_GAIN = 0.0;
+const double ad937x_device::MAX_RX_GAIN = 30.0;
const double ad937x_device::RX_GAIN_STEP = 0.5;
-const double ad937x_device::MIN_TX_GAIN = 0.0;
-const double ad937x_device::MAX_TX_GAIN = 41.95;
+const double ad937x_device::MIN_TX_GAIN = 0.0;
+const double ad937x_device::MAX_TX_GAIN = 41.95;
const double ad937x_device::TX_GAIN_STEP = 0.05;
static const double RX_DEFAULT_FREQ = 2.5e9;
@@ -35,9 +34,9 @@ static const double TX_DEFAULT_FREQ = 2.5e9;
static const double RX_DEFAULT_GAIN = 0;
static const double TX_DEFAULT_GAIN = 0;
-static const uint32_t AD9371_PRODUCT_ID = 0x3;
+static const uint32_t AD9371_PRODUCT_ID = 0x3;
static const uint32_t AD9371_XBCZ_PRODUCT_ID = 0x1;
-static const size_t ARM_BINARY_SIZE = 98304;
+static const size_t ARM_BINARY_SIZE = 98304;
static const uint32_t PLL_LOCK_TIMEOUT_MS = 200;
@@ -46,29 +45,26 @@ Helper functions
******************************************************/
// Macro to call an API function via lambda
-#define CALL_API(function_call) \
- _call_api_function([&,this]{return function_call;})
+#define CALL_API(function_call) _call_api_function([&, this] { return function_call; })
// helper function to unify error handling
void ad937x_device::_call_api_function(const std::function<mykonosErr_t()>& func)
{
const auto error = func();
- if (error != MYKONOS_ERR_OK)
- {
+ if (error != MYKONOS_ERR_OK) {
throw mpm::runtime_error(getMykonosErrorMessage(error));
}
}
// Macro to call a GPIO API function via lambda
#define CALL_GPIO_API(function_call) \
- _call_gpio_api_function([&,this]{return function_call;})
+ _call_gpio_api_function([&, this] { return function_call; })
// helper function to unify error handling, GPIO version
void ad937x_device::_call_gpio_api_function(const std::function<mykonosGpioErr_t()>& func)
{
const auto error = func();
- if (error != MYKONOS_ERR_GPIO_OK)
- {
+ if (error != MYKONOS_ERR_GPIO_OK) {
throw mpm::runtime_error(getGpioMykonosErrorMessage(error));
}
}
@@ -84,23 +80,19 @@ ad937x_device::radio_state_t ad937x_device::_move_to_config_state()
{
uint32_t status;
CALL_API(MYKONOS_getRadioState(mykonos_config.device, &status));
- if ((status & 0x3) == 0x3)
- {
+ if ((status & 0x3) == 0x3) {
stop_radio();
return radio_state_t::ON;
- }
- else {
+ } else {
return radio_state_t::OFF;
}
}
// restores the state from before a call to _move_to_config_state
// if ON, move to radioOn, otherwise this function is a no-op
-void ad937x_device::_restore_from_config_state(
- const ad937x_device::radio_state_t state
-) {
- if (state == radio_state_t::ON)
- {
+void ad937x_device::_restore_from_config_state(const ad937x_device::radio_state_t state)
+{
+ if (state == radio_state_t::ON) {
start_radio();
}
}
@@ -117,17 +109,14 @@ std::vector<uint8_t> ad937x_device::_get_arm_binary()
const auto path = _get_arm_binary_path();
std::ifstream file(path, std::ios::binary);
if (!file.is_open()) {
- throw mpm::runtime_error(
- "Could not open AD9371 ARM binary at path " + path);
+ throw mpm::runtime_error("Could not open AD9371 ARM binary at path " + path);
}
// TODO: add check that opened file size is equal to ARM_BINARY_SIZE
std::vector<uint8_t> binary(ARM_BINARY_SIZE);
file.read(reinterpret_cast<char*>(binary.data()), ARM_BINARY_SIZE);
- if (file.bad())
- {
- throw mpm::runtime_error(
- "Error reading AD9371 ARM binary at path " + path);
+ if (file.bad()) {
+ throw mpm::runtime_error("Error reading AD9371 ARM binary at path " + path);
}
return binary;
}
@@ -135,31 +124,26 @@ std::vector<uint8_t> ad937x_device::_get_arm_binary()
void ad937x_device::_verify_product_id()
{
const uint8_t product_id = get_product_id();
- if (product_id != AD9371_PRODUCT_ID
- && product_id != AD9371_XBCZ_PRODUCT_ID) {
+ if (product_id != AD9371_PRODUCT_ID && product_id != AD9371_XBCZ_PRODUCT_ID) {
// The XBCZ code is an exception, so we don't print it as 'Expected'
// if this fails.
- throw mpm::runtime_error(str(
- boost::format("AD9371 product ID does not match expected ID! "
- "Read: %X Expected: %X")
- % int(product_id) % int(AD9371_PRODUCT_ID)
- ));
+ throw mpm::runtime_error(
+ str(boost::format("AD9371 product ID does not match expected ID! "
+ "Read: %X Expected: %X")
+ % int(product_id) % int(AD9371_PRODUCT_ID)));
}
}
void ad937x_device::_verify_multichip_sync_status(const multichip_sync_t mcs)
{
- const uint8_t status_expected =
- (mcs == multichip_sync_t::FULL) ? 0x0B : 0x0A;
- const uint8_t status_mask = status_expected; // all 1s expected, mask is the same
+ const uint8_t status_expected = (mcs == multichip_sync_t::FULL) ? 0x0B : 0x0A;
+ const uint8_t status_mask = status_expected; // all 1s expected, mask is the same
const uint8_t mcs_status = get_multichip_sync_status();
- if ((mcs_status & status_mask) != status_expected)
- {
- throw mpm::runtime_error(str(
- boost::format("Multichip sync failed! Read: %X Expected: %X")
- % int(mcs_status) % int(status_expected)
- ));
+ if ((mcs_status & status_mask) != status_expected) {
+ throw mpm::runtime_error(
+ str(boost::format("Multichip sync failed! Read: %X Expected: %X")
+ % int(mcs_status) % int(status_expected)));
}
}
@@ -193,10 +177,8 @@ double ad937x_device::_convert_tx_gain_from_mykonos(const uint16_t gain)
return (MAX_TX_GAIN - (static_cast<double>(gain) / 1e3));
}
-void ad937x_device::_apply_gain_pins(
- const direction_t direction,
- const chain_t chain
-) {
+void ad937x_device::_apply_gain_pins(const direction_t direction, const chain_t chain)
+{
// get this channels configuration
const auto chan = gain_ctrl.config.at(direction).at(chain);
@@ -207,51 +189,44 @@ void ad937x_device::_apply_gain_pins(
const auto state = _move_to_config_state();
- switch (direction)
- {
- case RX_DIRECTION:
- {
+ switch (direction) {
+ case RX_DIRECTION: {
std::function<decltype(MYKONOS_setRx1GainCtrlPin)> func;
- switch (chain)
- {
- case chain_t::ONE:
- func = MYKONOS_setRx1GainCtrlPin;
- break;
- case chain_t::TWO:
- func = MYKONOS_setRx2GainCtrlPin;
- break;
+ switch (chain) {
+ case chain_t::ONE:
+ func = MYKONOS_setRx1GainCtrlPin;
+ break;
+ case chain_t::TWO:
+ func = MYKONOS_setRx2GainCtrlPin;
+ break;
}
CALL_GPIO_API(func(mykonos_config.device,
- chan.inc_step,
- chan.dec_step,
- chan.inc_pin,
- chan.dec_pin,
- chan.enable));
+ chan.inc_step,
+ chan.dec_step,
+ chan.inc_pin,
+ chan.dec_pin,
+ chan.enable));
break;
}
- case TX_DIRECTION:
- {
+ case TX_DIRECTION: {
// TX sets attenuation, but the configuration should be stored correctly
- switch (chain)
- {
- case chain_t::ONE:
- // TX1 has an extra parameter "useTx1ForTx2" that we do not support
- CALL_GPIO_API(MYKONOS_setTx1AttenCtrlPin(
- mykonos_config.device,
+ switch (chain) {
+ case chain_t::ONE:
+ // TX1 has an extra parameter "useTx1ForTx2" that we do not support
+ CALL_GPIO_API(MYKONOS_setTx1AttenCtrlPin(mykonos_config.device,
chan.inc_step,
chan.inc_pin,
chan.dec_pin,
chan.enable,
0));
- break;
- case chain_t::TWO:
- CALL_GPIO_API(MYKONOS_setTx2AttenCtrlPin(
- mykonos_config.device,
+ break;
+ case chain_t::TWO:
+ CALL_GPIO_API(MYKONOS_setTx2AttenCtrlPin(mykonos_config.device,
chan.inc_step,
chan.inc_pin,
chan.dec_pin,
chan.enable));
- break;
+ break;
}
break;
}
@@ -260,29 +235,27 @@ void ad937x_device::_apply_gain_pins(
}
-
/******************************************************
Initialization functions
******************************************************/
-ad937x_device::ad937x_device(
- mpm::types::regs_iface* iface,
+ad937x_device::ad937x_device(mpm::types::regs_iface* iface,
const size_t deserializer_lane_xbar,
- const gain_pins_t gain_pins) :
- full_spi_settings(iface),
- mykonos_config(&full_spi_settings.spi_settings, deserializer_lane_xbar),
- gain_ctrl(gain_pins)
+ const gain_pins_t gain_pins)
+ : full_spi_settings(iface)
+ , mykonos_config(&full_spi_settings.spi_settings, deserializer_lane_xbar)
+ , gain_ctrl(gain_pins)
{
}
-void ad937x_device::_setup_rf(){
+void ad937x_device::_setup_rf()
+{
// TODO: add setRfPllLoopFilter here
// Set frequencies
tune(uhd::RX_DIRECTION, RX_DEFAULT_FREQ, false);
tune(uhd::TX_DIRECTION, TX_DEFAULT_FREQ, false);
- if (!get_pll_lock_status(CLK_SYNTH | RX_SYNTH | TX_SYNTH | SNIFF_SYNTH, true))
- {
+ if (!get_pll_lock_status(CLK_SYNTH | RX_SYNTH | TX_SYNTH | SNIFF_SYNTH, true)) {
throw mpm::runtime_error("PLLs did not lock after initial tuning!");
}
@@ -299,54 +272,50 @@ void ad937x_device::_setup_rf(){
set_gain(uhd::RX_DIRECTION, chain_t::TWO, RX_DEFAULT_GAIN);
set_gain(uhd::TX_DIRECTION, chain_t::ONE, TX_DEFAULT_GAIN);
set_gain(uhd::TX_DIRECTION, chain_t::TWO, TX_DEFAULT_GAIN);
-
-
}
-void ad937x_device::setup_cal(
- const uint32_t init_cals_mask,
+void ad937x_device::setup_cal(const uint32_t init_cals_mask,
const uint32_t tracking_cals_mask,
- const uint32_t timeout
-) {
+ const uint32_t timeout)
+{
// Run and wait for init cals
CALL_API(MYKONOS_runInitCals(mykonos_config.device, init_cals_mask));
uint8_t errorFlag = 0, errorCode = 0;
- CALL_API(MYKONOS_waitInitCals(mykonos_config.device,
- timeout, &errorFlag, &errorCode));
+ CALL_API(
+ MYKONOS_waitInitCals(mykonos_config.device, timeout, &errorFlag, &errorCode));
if ((errorFlag != 0) || (errorCode != 0)) {
throw mpm::runtime_error("Init cals failed!");
// TODO: add more debugging information here
}
- CALL_API(MYKONOS_enableTrackingCals(mykonos_config.device,
- tracking_cals_mask));
+ CALL_API(MYKONOS_enableTrackingCals(mykonos_config.device, tracking_cals_mask));
// ready for radioOn
}
uint8_t ad937x_device::set_lo_source(
- const uhd::direction_t direction,
- const uint8_t pll_source
-) {
- switch (direction){
+ const uhd::direction_t direction, const uint8_t pll_source)
+{
+ switch (direction) {
case TX_DIRECTION:
mykonos_config.device->tx->txPllUseExternalLo = pll_source;
return pll_source;
case RX_DIRECTION:
mykonos_config.device->rx->rxPllUseExternalLo = pll_source;
return pll_source;
- default:
- MPM_THROW_INVALID_CODE_PATH();
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
}
}
-uint8_t ad937x_device::get_lo_source(const uhd::direction_t direction) const {
- switch (direction){
+uint8_t ad937x_device::get_lo_source(const uhd::direction_t direction) const
+{
+ switch (direction) {
case TX_DIRECTION:
return mykonos_config.device->tx->txPllUseExternalLo;
case RX_DIRECTION:
return mykonos_config.device->rx->rxPllUseExternalLo;
- default:
- MPM_THROW_INVALID_CODE_PATH();
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
}
}
void ad937x_device::begin_initialization()
@@ -355,8 +324,7 @@ void ad937x_device::begin_initialization()
_verify_product_id();
- if (!get_pll_lock_status(CLK_SYNTH))
- {
+ if (!get_pll_lock_status(CLK_SYNTH)) {
throw mpm::runtime_error("AD937x CLK_SYNTH PLL failed to lock");
}
@@ -370,14 +338,12 @@ void ad937x_device::finish_initialization()
CALL_API(MYKONOS_initArm(mykonos_config.device));
auto binary = _get_arm_binary();
- CALL_API(MYKONOS_loadArmFromBinary(
- mykonos_config.device,
- binary.data(),
- binary.size()));
+ CALL_API(
+ MYKONOS_loadArmFromBinary(mykonos_config.device, binary.data(), binary.size()));
// TODO: check ARM version before or after the load of the ARM
// currently binary has no readable version number until after it's loaded
- //Run setup RF
+ // Run setup RF
_setup_rf();
}
@@ -404,7 +370,6 @@ void ad937x_device::stop_radio()
}
-
/******************************************************
Get status functions
******************************************************/
@@ -455,8 +420,7 @@ uint8_t ad937x_device::get_device_rev()
api_version_t ad937x_device::get_api_version()
{
api_version_t api;
- CALL_API(MYKONOS_getApiVersion(
- mykonos_config.device,
+ CALL_API(MYKONOS_getApiVersion(mykonos_config.device,
&api.silicon_ver,
&api.major_ver,
&api.minor_ver,
@@ -469,25 +433,20 @@ arm_version_t ad937x_device::get_arm_version()
arm_version_t arm;
mykonosBuild_t build;
CALL_API(MYKONOS_getArmVersion(
- mykonos_config.device,
- &arm.major_ver,
- &arm.minor_ver,
- &arm.rc_ver,
- &build));
-
- switch (build)
- {
- case MYK_BUILD_RELEASE:
- arm.build_type = mpm::ad937x::device::build_type_t::RELEASE;
- break;
- case MYK_BUILD_DEBUG:
- arm.build_type = mpm::ad937x::device::build_type_t::DEBUG;
- break;
- case MYK_BUILD_TEST_OBJECT:
- arm.build_type = mpm::ad937x::device::build_type_t::TEST_OBJECT;
- break;
- default:
- MPM_THROW_INVALID_CODE_PATH();
+ mykonos_config.device, &arm.major_ver, &arm.minor_ver, &arm.rc_ver, &build));
+
+ switch (build) {
+ case MYK_BUILD_RELEASE:
+ arm.build_type = mpm::ad937x::device::build_type_t::RELEASE;
+ break;
+ case MYK_BUILD_DEBUG:
+ arm.build_type = mpm::ad937x::device::build_type_t::DEBUG;
+ break;
+ case MYK_BUILD_TEST_OBJECT:
+ arm.build_type = mpm::ad937x::device::build_type_t::TEST_OBJECT;
+ break;
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
}
return arm;
@@ -509,7 +468,7 @@ double ad937x_device::set_clock_rate(const double req_rate)
{
const auto rate = static_cast<uint32_t>(req_rate / 1000.0);
- const auto state = _move_to_config_state();
+ const auto state = _move_to_config_state();
mykonos_config.device->clocks->deviceClock_kHz = rate;
CALL_API(MYKONOS_initDigitalClocks(mykonos_config.device));
_restore_from_config_state(state);
@@ -518,23 +477,19 @@ double ad937x_device::set_clock_rate(const double req_rate)
}
void ad937x_device::enable_channel(
- const direction_t direction,
- const chain_t chain,
- const bool enable
-) {
+ const direction_t direction, const chain_t chain, const bool enable)
+{
// TODO:
// Turns out the only code in the API that actually sets the channel enable settings
// is _initialize(). Need to figure out how to deal with this.
// mmeserve 8/24/2017
- // While it is possible to change the enable state after disabling the radio, we'll probably
- // always use the GPIO pins to do so. Delete this function at a later time.
+ // While it is possible to change the enable state after disabling the radio, we'll
+ // probably always use the GPIO pins to do so. Delete this function at a later time.
}
double ad937x_device::tune(
- const direction_t direction,
- const double value,
- const bool wait_for_lock = false
-) {
+ const direction_t direction, const double value, const bool wait_for_lock = false)
+{
// I'm not sure why we set the PLL value in the config AND as a function parameter
// but here it is
@@ -542,30 +497,27 @@ double ad937x_device::tune(
uint8_t locked_pll;
uint64_t* config_value;
const uint64_t integer_value = static_cast<uint64_t>(value);
- switch (direction)
- {
- case TX_DIRECTION:
- pll = TX_PLL;
- locked_pll = TX_SYNTH;
- config_value = &(mykonos_config.device->tx->txPllLoFrequency_Hz);
- break;
- case RX_DIRECTION:
- pll = RX_PLL;
- locked_pll = RX_SYNTH;
- config_value = &(mykonos_config.device->rx->rxPllLoFrequency_Hz);
- break;
- default:
- MPM_THROW_INVALID_CODE_PATH();
+ switch (direction) {
+ case TX_DIRECTION:
+ pll = TX_PLL;
+ locked_pll = TX_SYNTH;
+ config_value = &(mykonos_config.device->tx->txPllLoFrequency_Hz);
+ break;
+ case RX_DIRECTION:
+ pll = RX_PLL;
+ locked_pll = RX_SYNTH;
+ config_value = &(mykonos_config.device->rx->rxPllLoFrequency_Hz);
+ break;
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
}
const auto state = _move_to_config_state();
- *config_value = integer_value;
+ *config_value = integer_value;
CALL_API(MYKONOS_setRfPllFrequency(mykonos_config.device, pll, integer_value));
- if (wait_for_lock)
- {
- if (!get_pll_lock_status(locked_pll, true))
- {
+ if (wait_for_lock) {
+ if (!get_pll_lock_status(locked_pll, true)) {
throw mpm::runtime_error("PLL did not lock");
}
}
@@ -574,24 +526,18 @@ double ad937x_device::tune(
return get_freq(direction);
}
-double ad937x_device::set_bw_filter(
- const direction_t direction,
- const double value
-) {
-
- switch (direction)
- {
- case TX_DIRECTION:
- {
- mykonos_config.device->tx->txProfile->rfBandwidth_Hz = value;
- mykonos_config.device->tx->txProfile->txBbf3dBCorner_kHz = value/1000;
- mykonos_config.device->tx->txProfile->txDac3dBCorner_kHz = value/1000;
+double ad937x_device::set_bw_filter(const direction_t direction, const double value)
+{
+ switch (direction) {
+ case TX_DIRECTION: {
+ mykonos_config.device->tx->txProfile->rfBandwidth_Hz = value;
+ mykonos_config.device->tx->txProfile->txBbf3dBCorner_kHz = value / 1000;
+ mykonos_config.device->tx->txProfile->txDac3dBCorner_kHz = value / 1000;
break;
}
- case RX_DIRECTION:
- {
- mykonos_config.device->rx->rxProfile->rfBandwidth_Hz = value;
- mykonos_config.device->rx->rxProfile->rxBbf3dBCorner_kHz = value/1000;
+ case RX_DIRECTION: {
+ mykonos_config.device->rx->rxProfile->rfBandwidth_Hz = value;
+ mykonos_config.device->rx->rxProfile->rxBbf3dBCorner_kHz = value / 1000;
break;
}
}
@@ -603,87 +549,76 @@ double ad937x_device::set_bw_filter(
double ad937x_device::set_gain(
- const direction_t direction,
- const chain_t chain,
- const double value
-) {
+ const direction_t direction, const chain_t chain, const double value)
+{
double coerced_value;
const auto state = _move_to_config_state();
- switch (direction)
- {
- case TX_DIRECTION:
- {
- const uint16_t attenuation = _convert_tx_gain_to_mykonos(value);
- coerced_value = static_cast<double>(attenuation);
-
- std::function<mykonosErr_t(mykonosDevice_t*, uint16_t)> func;
- switch (chain)
- {
- case chain_t::ONE:
- func = MYKONOS_setTx1Attenuation;
- break;
- case chain_t::TWO:
- func = MYKONOS_setTx2Attenuation;
+ switch (direction) {
+ case TX_DIRECTION: {
+ const uint16_t attenuation = _convert_tx_gain_to_mykonos(value);
+ coerced_value = static_cast<double>(attenuation);
+
+ std::function<mykonosErr_t(mykonosDevice_t*, uint16_t)> func;
+ switch (chain) {
+ case chain_t::ONE:
+ func = MYKONOS_setTx1Attenuation;
+ break;
+ case chain_t::TWO:
+ func = MYKONOS_setTx2Attenuation;
+ break;
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
+ }
+ CALL_API(func(mykonos_config.device, attenuation));
break;
- default:
- MPM_THROW_INVALID_CODE_PATH();
}
- CALL_API(func(mykonos_config.device, attenuation));
- break;
- }
- case RX_DIRECTION:
- {
- const uint8_t gain = _convert_rx_gain_to_mykonos(value);
- coerced_value = static_cast<double>(gain);
-
- std::function<mykonosErr_t(mykonosDevice_t*, uint8_t)> func;
- switch (chain)
- {
- case chain_t::ONE:
- func = MYKONOS_setRx1ManualGain;
- break;
- case chain_t::TWO:
- func = MYKONOS_setRx2ManualGain;
+ case RX_DIRECTION: {
+ const uint8_t gain = _convert_rx_gain_to_mykonos(value);
+ coerced_value = static_cast<double>(gain);
+
+ std::function<mykonosErr_t(mykonosDevice_t*, uint8_t)> func;
+ switch (chain) {
+ case chain_t::ONE:
+ func = MYKONOS_setRx1ManualGain;
+ break;
+ case chain_t::TWO:
+ func = MYKONOS_setRx2ManualGain;
+ break;
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
+ }
+ CALL_API(func(mykonos_config.device, gain));
break;
+ }
default:
MPM_THROW_INVALID_CODE_PATH();
- }
- CALL_API(func(mykonos_config.device, gain));
- break;
- }
- default:
- MPM_THROW_INVALID_CODE_PATH();
}
_restore_from_config_state(state);
return get_gain(direction, chain);
}
-void ad937x_device::set_agc_mode(
- const direction_t direction,
- const gain_mode_t mode
-) {
+void ad937x_device::set_agc_mode(const direction_t direction, const gain_mode_t mode)
+{
mykonosGainMode_t mykonos_mode;
- switch (direction)
- {
- case RX_DIRECTION:
- switch (mode)
- {
- case gain_mode_t::MANUAL:
- mykonos_mode = MGC;
- break;
- case gain_mode_t::AUTOMATIC:
- mykonos_mode = AGC;
- break;
- case gain_mode_t::HYBRID:
- mykonos_mode = HYBRID;
+ switch (direction) {
+ case RX_DIRECTION:
+ switch (mode) {
+ case gain_mode_t::MANUAL:
+ mykonos_mode = MGC;
+ break;
+ case gain_mode_t::AUTOMATIC:
+ mykonos_mode = AGC;
+ break;
+ case gain_mode_t::HYBRID:
+ mykonos_mode = HYBRID;
+ break;
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
+ }
break;
default:
MPM_THROW_INVALID_CODE_PATH();
- }
- break;
- default:
- MPM_THROW_INVALID_CODE_PATH();
}
const auto state = _move_to_config_state();
@@ -692,74 +627,67 @@ void ad937x_device::set_agc_mode(
}
void ad937x_device::set_fir(
- const direction_t direction,
- int8_t gain,
- const std::vector<int16_t> & fir)
-{
- switch (direction)
- {
- case TX_DIRECTION:
- mykonos_config.tx_fir_config.set_fir(gain, fir);
- break;
- case RX_DIRECTION:
- mykonos_config.rx_fir_config.set_fir(gain, fir);
- break;
- default:
- MPM_THROW_INVALID_CODE_PATH();
+ const direction_t direction, int8_t gain, const std::vector<int16_t>& fir)
+{
+ switch (direction) {
+ case TX_DIRECTION:
+ mykonos_config.tx_fir_config.set_fir(gain, fir);
+ break;
+ case RX_DIRECTION:
+ mykonos_config.rx_fir_config.set_fir(gain, fir);
+ break;
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
}
// TODO: reload this on device
}
-void ad937x_device::set_gain_pin_step_sizes(
- const direction_t direction,
- const chain_t chain,
- const double inc_step,
- const double dec_step
-) {
- if (direction == RX_DIRECTION)
- {
+void ad937x_device::set_gain_pin_step_sizes(const direction_t direction,
+ const chain_t chain,
+ const double inc_step,
+ const double dec_step)
+{
+ if (direction == RX_DIRECTION) {
gain_ctrl.config.at(direction).at(chain).inc_step =
static_cast<uint8_t>(inc_step / 0.5);
gain_ctrl.config.at(direction).at(chain).dec_step =
static_cast<uint8_t>(dec_step / 0.5);
- }
- else if (direction == TX_DIRECTION) {
+ } else if (direction == TX_DIRECTION) {
// !!! TX is attenuation direction, so the pins are flipped !!!
gain_ctrl.config.at(direction).at(chain).dec_step =
static_cast<uint8_t>(inc_step / 0.05);
gain_ctrl.config.at(direction).at(chain).inc_step =
static_cast<uint8_t>(dec_step / 0.05);
- }
- else {
+ } else {
MPM_THROW_INVALID_CODE_PATH();
}
_apply_gain_pins(direction, chain);
}
void ad937x_device::set_enable_gain_pins(
- const direction_t direction,
- const chain_t chain,
- const bool enable
-) {
+ const direction_t direction, const chain_t chain, const bool enable)
+{
gain_ctrl.config.at(direction).at(chain).enable = enable;
_apply_gain_pins(direction, chain);
}
-
/******************************************************
Get configuration functions
******************************************************/
double ad937x_device::get_freq(const direction_t direction)
{
mykonosRfPllName_t pll;
- switch (direction)
- {
- case TX_DIRECTION: pll = TX_PLL; break;
- case RX_DIRECTION: pll = RX_PLL; break;
- default:
- MPM_THROW_INVALID_CODE_PATH();
+ switch (direction) {
+ case TX_DIRECTION:
+ pll = TX_PLL;
+ break;
+ case RX_DIRECTION:
+ pll = RX_PLL;
+ break;
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
}
// TODO: because coerced_pll is returned as an integer, it's not accurate
@@ -768,29 +696,22 @@ double ad937x_device::get_freq(const direction_t direction)
return static_cast<double>(coerced_pll);
}
-bool ad937x_device::get_pll_lock_status(
- const uint8_t pll,
- const bool wait_for_lock
-) {
+bool ad937x_device::get_pll_lock_status(const uint8_t pll, const bool wait_for_lock)
+{
uint8_t pll_status;
CALL_API(MYKONOS_checkPllsLockStatus(mykonos_config.device, &pll_status));
- if (not wait_for_lock)
- {
+ if (not wait_for_lock) {
return (pll_status & pll) == pll;
- }
- else {
- const auto lock_time =
- std::chrono::steady_clock::now()
- + std::chrono::milliseconds(PLL_LOCK_TIMEOUT_MS);
+ } else {
+ const auto lock_time = std::chrono::steady_clock::now()
+ + std::chrono::milliseconds(PLL_LOCK_TIMEOUT_MS);
bool locked = false;
- while (not locked and lock_time > std::chrono::steady_clock::now())
- {
+ while (not locked and lock_time > std::chrono::steady_clock::now()) {
locked = get_pll_lock_status(pll);
}
- if (!locked)
- {
+ if (!locked) {
// last chance
locked = get_pll_lock_status(pll);
}
@@ -798,39 +719,32 @@ bool ad937x_device::get_pll_lock_status(
}
}
-double ad937x_device::get_gain(
- const direction_t direction,
- const chain_t chain
-) {
- switch (direction)
- {
- case TX_DIRECTION:
- {
+double ad937x_device::get_gain(const direction_t direction, const chain_t chain)
+{
+ switch (direction) {
+ case TX_DIRECTION: {
std::function<mykonosErr_t(mykonosDevice_t*, uint16_t*)> func;
- switch (chain)
- {
- case chain_t::ONE:
- func = MYKONOS_getTx1Attenuation;
- break;
- case chain_t::TWO:
- func = MYKONOS_getTx2Attenuation;
- break;
+ switch (chain) {
+ case chain_t::ONE:
+ func = MYKONOS_getTx1Attenuation;
+ break;
+ case chain_t::TWO:
+ func = MYKONOS_getTx2Attenuation;
+ break;
}
uint16_t atten;
CALL_API(func(mykonos_config.device, &atten));
return _convert_tx_gain_from_mykonos(atten);
}
- case RX_DIRECTION:
- {
+ case RX_DIRECTION: {
std::function<mykonosErr_t(mykonosDevice_t*, uint8_t*)> func;
- switch (chain)
- {
- case chain_t::ONE:
- func = MYKONOS_getRx1Gain;
- break;
- case chain_t::TWO:
- func = MYKONOS_getRx2Gain;
- break;
+ switch (chain) {
+ case chain_t::ONE:
+ func = MYKONOS_getRx1Gain;
+ break;
+ case chain_t::TWO:
+ func = MYKONOS_getRx2Gain;
+ break;
}
uint8_t gain;
CALL_API(func(mykonos_config.device, &gain));
@@ -841,18 +755,15 @@ double ad937x_device::get_gain(
}
}
-std::vector<int16_t> ad937x_device::get_fir(
- const direction_t direction,
- int8_t &gain)
+std::vector<int16_t> ad937x_device::get_fir(const direction_t direction, int8_t& gain)
{
- switch (direction)
- {
- case TX_DIRECTION:
- return mykonos_config.tx_fir_config.get_fir(gain);
- case RX_DIRECTION:
- return mykonos_config.rx_fir_config.get_fir(gain);
- default:
- MPM_THROW_INVALID_CODE_PATH();
+ switch (direction) {
+ case TX_DIRECTION:
+ return mykonos_config.tx_fir_config.get_fir(gain);
+ case RX_DIRECTION:
+ return mykonos_config.rx_fir_config.get_fir(gain);
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
}
}
@@ -868,95 +779,89 @@ int16_t ad937x_device::get_temperature()
void ad937x_device::set_master_clock_rate(const mcr_t rate)
{
switch (rate) {
- case MCR_125_00MHZ: {
- mykonos_config.device->clocks->deviceClock_kHz = 125000;
- mykonos_config.device->clocks->clkPllVcoFreq_kHz = 10000000;
- mykonos_config.device->clocks->clkPllVcoDiv = ::VCODIV_2;
- set_fir(TX_DIRECTION,
- mykonos_config.device->tx->txProfile->txFir->gain_dB,
- std::vector<int16_t>(ad937x_config_t::DEFAULT_TX_FIR,
- ad937x_config_t::DEFAULT_TX_FIR
- + ad937x_config_t::DEFAULT_TX_FIR_SIZE)
- );
- mykonos_config.device->tx->txProfile->iqRate_kHz = 125000;
- mykonos_config.device->tx->txProfile->primarySigBandwidth_Hz = 20000000;
- mykonos_config.device->tx->txProfile->rfBandwidth_Hz = 102000000;
- mykonos_config.device->tx->txProfile->txDac3dBCorner_kHz = 722000;
- mykonos_config.device->tx->txProfile->txBbf3dBCorner_kHz = 51000;
-
- set_fir(RX_DIRECTION,
- mykonos_config.device->rx->rxProfile->rxFir->gain_dB,
- std::vector<int16_t>(ad937x_config_t::DEFAULT_RX_FIR,
- ad937x_config_t::DEFAULT_RX_FIR
- + ad937x_config_t::DEFAULT_RX_FIR_SIZE)
- );
-
- mykonos_config.device->rx->rxProfile->iqRate_kHz = 125000;
- mykonos_config.device->rx->rxProfile->rxBbf3dBCorner_kHz = 102000;
-
- mykonos_config.device->obsRx->orxProfile->iqRate_kHz = 125000;
- mykonos_config.device->obsRx->orxProfile->rxBbf3dBCorner_kHz = 102000;
- break;
- }
- case MCR_122_88MHZ: {
- mykonos_config.device->clocks->deviceClock_kHz = 122880;
- mykonos_config.device->clocks->clkPllVcoFreq_kHz = 9830400;
- mykonos_config.device->clocks->clkPllVcoDiv = ::VCODIV_2;
- set_fir(TX_DIRECTION,
- mykonos_config.device->tx->txProfile->txFir->gain_dB,
- std::vector<int16_t>(ad937x_config_t::DEFAULT_TX_FIR,
- ad937x_config_t::DEFAULT_TX_FIR
- + ad937x_config_t::DEFAULT_TX_FIR_SIZE)
- );
- mykonos_config.device->tx->txProfile->iqRate_kHz = 122880;
- mykonos_config.device->tx->txProfile->primarySigBandwidth_Hz = 20000000;
- mykonos_config.device->tx->txProfile->rfBandwidth_Hz = 100000000;
- mykonos_config.device->tx->txProfile->txDac3dBCorner_kHz = 710539;
- mykonos_config.device->tx->txProfile->txBbf3dBCorner_kHz = 50000;
-
- set_fir(RX_DIRECTION,
- mykonos_config.device->rx->rxProfile->rxFir->gain_dB,
- std::vector<int16_t>(ad937x_config_t::DEFAULT_RX_FIR,
- ad937x_config_t::DEFAULT_RX_FIR
- + ad937x_config_t::DEFAULT_RX_FIR_SIZE)
- );
- mykonos_config.device->rx->rxProfile->iqRate_kHz = 122880;
- mykonos_config.device->rx->rxProfile->rxBbf3dBCorner_kHz = 100000;
-
- mykonos_config.device->obsRx->orxProfile->iqRate_kHz = 122880;
- mykonos_config.device->obsRx->orxProfile->rxBbf3dBCorner_kHz = 100000;
- break;
- }
- case MCR_153_60MHZ: {
- mykonos_config.device->clocks->deviceClock_kHz = 153600;
- mykonos_config.device->clocks->clkPllVcoFreq_kHz = 6144000;
- mykonos_config.device->clocks->clkPllVcoDiv = ::VCODIV_1;
- set_fir(TX_DIRECTION,
- mykonos_config.device->tx->txProfile->txFir->gain_dB,
- std::vector<int16_t>(ad937x_config_t::DEFAULT_TX_FIR_15366,
- ad937x_config_t::DEFAULT_TX_FIR_15366
- + ad937x_config_t::DEFAULT_TX_FIR_SIZE)
- );
- mykonos_config.device->tx->txProfile->iqRate_kHz = 153600;
- mykonos_config.device->tx->txProfile->primarySigBandwidth_Hz = 10000000;
- mykonos_config.device->tx->txProfile->rfBandwidth_Hz = 100000000;
- mykonos_config.device->tx->txProfile->txDac3dBCorner_kHz = 100000;
- mykonos_config.device->tx->txProfile->txBbf3dBCorner_kHz = 100000;
-
- set_fir(RX_DIRECTION,
- mykonos_config.device->rx->rxProfile->rxFir->gain_dB,
- std::vector<int16_t>(ad937x_config_t::DEFAULT_RX_FIR_15366,
- ad937x_config_t::DEFAULT_RX_FIR_15366
- + ad937x_config_t::DEFAULT_RX_FIR_SIZE)
- );
- mykonos_config.device->rx->rxProfile->iqRate_kHz = 153600;
- mykonos_config.device->rx->rxProfile->rxBbf3dBCorner_kHz = 100000;
-
- mykonos_config.device->obsRx->orxProfile->iqRate_kHz = 153600;
- mykonos_config.device->obsRx->orxProfile->rxBbf3dBCorner_kHz = 225000;
- break;
- }
- default:
- MPM_THROW_INVALID_CODE_PATH();
+ case MCR_125_00MHZ: {
+ mykonos_config.device->clocks->deviceClock_kHz = 125000;
+ mykonos_config.device->clocks->clkPllVcoFreq_kHz = 10000000;
+ mykonos_config.device->clocks->clkPllVcoDiv = ::VCODIV_2;
+ set_fir(TX_DIRECTION,
+ mykonos_config.device->tx->txProfile->txFir->gain_dB,
+ std::vector<int16_t>(ad937x_config_t::DEFAULT_TX_FIR,
+ ad937x_config_t::DEFAULT_TX_FIR
+ + ad937x_config_t::DEFAULT_TX_FIR_SIZE));
+ mykonos_config.device->tx->txProfile->iqRate_kHz = 125000;
+ mykonos_config.device->tx->txProfile->primarySigBandwidth_Hz = 20000000;
+ mykonos_config.device->tx->txProfile->rfBandwidth_Hz = 102000000;
+ mykonos_config.device->tx->txProfile->txDac3dBCorner_kHz = 722000;
+ mykonos_config.device->tx->txProfile->txBbf3dBCorner_kHz = 51000;
+
+ set_fir(RX_DIRECTION,
+ mykonos_config.device->rx->rxProfile->rxFir->gain_dB,
+ std::vector<int16_t>(ad937x_config_t::DEFAULT_RX_FIR,
+ ad937x_config_t::DEFAULT_RX_FIR
+ + ad937x_config_t::DEFAULT_RX_FIR_SIZE));
+
+ mykonos_config.device->rx->rxProfile->iqRate_kHz = 125000;
+ mykonos_config.device->rx->rxProfile->rxBbf3dBCorner_kHz = 102000;
+
+ mykonos_config.device->obsRx->orxProfile->iqRate_kHz = 125000;
+ mykonos_config.device->obsRx->orxProfile->rxBbf3dBCorner_kHz = 102000;
+ break;
+ }
+ case MCR_122_88MHZ: {
+ mykonos_config.device->clocks->deviceClock_kHz = 122880;
+ mykonos_config.device->clocks->clkPllVcoFreq_kHz = 9830400;
+ mykonos_config.device->clocks->clkPllVcoDiv = ::VCODIV_2;
+ set_fir(TX_DIRECTION,
+ mykonos_config.device->tx->txProfile->txFir->gain_dB,
+ std::vector<int16_t>(ad937x_config_t::DEFAULT_TX_FIR,
+ ad937x_config_t::DEFAULT_TX_FIR
+ + ad937x_config_t::DEFAULT_TX_FIR_SIZE));
+ mykonos_config.device->tx->txProfile->iqRate_kHz = 122880;
+ mykonos_config.device->tx->txProfile->primarySigBandwidth_Hz = 20000000;
+ mykonos_config.device->tx->txProfile->rfBandwidth_Hz = 100000000;
+ mykonos_config.device->tx->txProfile->txDac3dBCorner_kHz = 710539;
+ mykonos_config.device->tx->txProfile->txBbf3dBCorner_kHz = 50000;
+
+ set_fir(RX_DIRECTION,
+ mykonos_config.device->rx->rxProfile->rxFir->gain_dB,
+ std::vector<int16_t>(ad937x_config_t::DEFAULT_RX_FIR,
+ ad937x_config_t::DEFAULT_RX_FIR
+ + ad937x_config_t::DEFAULT_RX_FIR_SIZE));
+ mykonos_config.device->rx->rxProfile->iqRate_kHz = 122880;
+ mykonos_config.device->rx->rxProfile->rxBbf3dBCorner_kHz = 100000;
+
+ mykonos_config.device->obsRx->orxProfile->iqRate_kHz = 122880;
+ mykonos_config.device->obsRx->orxProfile->rxBbf3dBCorner_kHz = 100000;
+ break;
+ }
+ case MCR_153_60MHZ: {
+ mykonos_config.device->clocks->deviceClock_kHz = 153600;
+ mykonos_config.device->clocks->clkPllVcoFreq_kHz = 6144000;
+ mykonos_config.device->clocks->clkPllVcoDiv = ::VCODIV_1;
+ set_fir(TX_DIRECTION,
+ mykonos_config.device->tx->txProfile->txFir->gain_dB,
+ std::vector<int16_t>(ad937x_config_t::DEFAULT_TX_FIR_15366,
+ ad937x_config_t::DEFAULT_TX_FIR_15366
+ + ad937x_config_t::DEFAULT_TX_FIR_SIZE));
+ mykonos_config.device->tx->txProfile->iqRate_kHz = 153600;
+ mykonos_config.device->tx->txProfile->primarySigBandwidth_Hz = 10000000;
+ mykonos_config.device->tx->txProfile->rfBandwidth_Hz = 100000000;
+ mykonos_config.device->tx->txProfile->txDac3dBCorner_kHz = 100000;
+ mykonos_config.device->tx->txProfile->txBbf3dBCorner_kHz = 100000;
+
+ set_fir(RX_DIRECTION,
+ mykonos_config.device->rx->rxProfile->rxFir->gain_dB,
+ std::vector<int16_t>(ad937x_config_t::DEFAULT_RX_FIR_15366,
+ ad937x_config_t::DEFAULT_RX_FIR_15366
+ + ad937x_config_t::DEFAULT_RX_FIR_SIZE));
+ mykonos_config.device->rx->rxProfile->iqRate_kHz = 153600;
+ mykonos_config.device->rx->rxProfile->rxBbf3dBCorner_kHz = 100000;
+
+ mykonos_config.device->obsRx->orxProfile->iqRate_kHz = 153600;
+ mykonos_config.device->obsRx->orxProfile->rxBbf3dBCorner_kHz = 225000;
+ break;
+ }
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
}
}
diff --git a/mpm/lib/mykonos/ad937x_device.hpp b/mpm/lib/mykonos/ad937x_device.hpp
index 55c6f0cad..8ee77db54 100644
--- a/mpm/lib/mykonos/ad937x_device.hpp
+++ b/mpm/lib/mykonos/ad937x_device.hpp
@@ -6,29 +6,27 @@
#pragma once
+#include "ad937x_device_types.hpp"
+#include "adi/mykonos_debug/t_mykonos_dbgjesd.h"
+#include "adi/t_mykonos.h"
+#include "adi/t_mykonos_gpio.h"
#include "config/ad937x_config_t.hpp"
#include "config/ad937x_fir.hpp"
#include "config/ad937x_gain_ctrl_config.hpp"
-#include "mpm/ad937x/adi_ctrl.hpp"
-#include "ad937x_device_types.hpp"
#include "mpm/ad937x/ad937x_ctrl_types.hpp"
-#include "adi/t_mykonos.h"
-#include "adi/t_mykonos_gpio.h"
-#include "adi/mykonos_debug/t_mykonos_dbgjesd.h"
-
-#include <mpm/spi/spi_iface.hpp>
+#include "mpm/ad937x/adi_ctrl.hpp"
#include <mpm/exception.hpp>
-#include <boost/noncopyable.hpp>
+#include <mpm/spi/spi_iface.hpp>
#include <boost/filesystem.hpp>
-#include <memory>
+#include <boost/noncopyable.hpp>
#include <functional>
+#include <memory>
class ad937x_device : public boost::noncopyable
{
public:
enum class gain_mode_t { MANUAL, AUTOMATIC, HYBRID };
- enum pll_t : uint8_t
- {
+ enum pll_t : uint8_t {
CLK_SYNTH = 0x01,
RX_SYNTH = 0x02,
TX_SYNTH = 0x04,
@@ -36,30 +34,18 @@ public:
CALPLL_SDM = 0x10,
};
- enum mcr_t
- {
- MCR_122_88MHZ,
- MCR_125_00MHZ,
- MCR_153_60MHZ
- };
+ enum mcr_t { MCR_122_88MHZ, MCR_125_00MHZ, MCR_153_60MHZ };
- ad937x_device(
- mpm::types::regs_iface* iface,
+ ad937x_device(mpm::types::regs_iface* iface,
const size_t deserializer_lane_xbar,
- mpm::ad937x::gpio::gain_pins_t gain_pins
- );
+ mpm::ad937x::gpio::gain_pins_t gain_pins);
void begin_initialization();
void finish_initialization();
- void setup_cal(
- const uint32_t init_cals_mask,
- const uint32_t tracking_cals_mask,
- const uint32_t timeout
- );
- uint8_t set_lo_source(
- const uhd::direction_t direction,
- const uint8_t pll_source
- );
+ void setup_cal(const uint32_t init_cals_mask,
+ const uint32_t tracking_cals_mask,
+ const uint32_t timeout);
+ uint8_t set_lo_source(const uhd::direction_t direction, const uint8_t pll_source);
uint8_t get_lo_source(const uhd::direction_t direction) const;
void start_jesd_rx();
void start_jesd_tx();
@@ -77,66 +63,38 @@ public:
mpm::ad937x::device::api_version_t get_api_version();
mpm::ad937x::device::arm_version_t get_arm_version();
- double set_bw_filter(
- const uhd::direction_t direction,
- const double value
- );
- void set_agc_mode(
- const uhd::direction_t direction,
- const gain_mode_t mode
- );
+ double set_bw_filter(const uhd::direction_t direction, const double value);
+ void set_agc_mode(const uhd::direction_t direction, const gain_mode_t mode);
double set_clock_rate(const double value);
- void enable_channel(
- const uhd::direction_t direction,
- const mpm::ad937x::device::chain_t chain,
- const bool enable
- );
-
- double set_gain(
- const uhd::direction_t direction,
- const mpm::ad937x::device::chain_t chain,
- const double value
- );
+ void enable_channel(const uhd::direction_t direction,
+ const mpm::ad937x::device::chain_t chain,
+ const bool enable);
+
+ double set_gain(const uhd::direction_t direction,
+ const mpm::ad937x::device::chain_t chain,
+ const double value);
double get_gain(
- const uhd::direction_t direction,
- const mpm::ad937x::device::chain_t chain
- );
+ const uhd::direction_t direction, const mpm::ad937x::device::chain_t chain);
double tune(
- const uhd::direction_t direction,
- const double value,
- const bool wait_for_lock
- );
+ const uhd::direction_t direction, const double value, const bool wait_for_lock);
double get_freq(const uhd::direction_t direction);
- bool get_pll_lock_status(
- const uint8_t pll,
- const bool wait_for_lock=false
- );
+ bool get_pll_lock_status(const uint8_t pll, const bool wait_for_lock = false);
void set_fir(
- const uhd::direction_t direction,
- int8_t gain,
- const std::vector<int16_t>& fir
- );
- std::vector<int16_t> get_fir(
- const uhd::direction_t direction,
- int8_t &gain
- );
+ const uhd::direction_t direction, int8_t gain, const std::vector<int16_t>& fir);
+ std::vector<int16_t> get_fir(const uhd::direction_t direction, int8_t& gain);
int16_t get_temperature();
- void set_enable_gain_pins(
- const uhd::direction_t direction,
- const mpm::ad937x::device::chain_t chain,
- const bool enable
- );
- void set_gain_pin_step_sizes(
- const uhd::direction_t direction,
- const mpm::ad937x::device::chain_t chain,
- const double inc_step,
- const double dec_step
- );
+ void set_enable_gain_pins(const uhd::direction_t direction,
+ const mpm::ad937x::device::chain_t chain,
+ const bool enable);
+ void set_gain_pin_step_sizes(const uhd::direction_t direction,
+ const mpm::ad937x::device::chain_t chain,
+ const double inc_step,
+ const double dec_step);
void update_rx_lo_source(uint8_t rxPllUseExternalLo);
void update_tx_lo_source(uint8_t rxPllUseExternalLo);
uint8_t get_rx_lo_source();
@@ -160,9 +118,7 @@ private:
ad937x_gain_ctrl_config_t gain_ctrl;
void _apply_gain_pins(
- const uhd::direction_t direction,
- mpm::ad937x::device::chain_t chain
- );
+ const uhd::direction_t direction, mpm::ad937x::device::chain_t chain);
void _setup_rf();
void _call_api_function(const std::function<mykonosErr_t()>& func);
void _call_gpio_api_function(const std::function<mykonosGpioErr_t()>& func);
diff --git a/mpm/lib/mykonos/ad937x_device_types.hpp b/mpm/lib/mykonos/ad937x_device_types.hpp
index e4330d278..bdf995c15 100644
--- a/mpm/lib/mykonos/ad937x_device_types.hpp
+++ b/mpm/lib/mykonos/ad937x_device_types.hpp
@@ -11,27 +11,24 @@
#include <uhd/types/direction.hpp>
#include <uhd/types/ranges.hpp>
-namespace mpm {
- namespace ad937x {
- namespace device {
- enum class build_type_t { RELEASE, DEBUG, TEST_OBJECT };
-
- struct api_version_t {
- uint32_t silicon_ver;
- uint32_t major_ver;
- uint32_t minor_ver;
- uint32_t build_ver;
- };
-
- struct arm_version_t {
- uint8_t major_ver;
- uint8_t minor_ver;
- uint8_t rc_ver;
- build_type_t build_type;
- };
-
- enum class chain_t { ONE, TWO };
- }
- }
-}
-
+namespace mpm { namespace ad937x { namespace device {
+enum class build_type_t { RELEASE, DEBUG, TEST_OBJECT };
+
+struct api_version_t
+{
+ uint32_t silicon_ver;
+ uint32_t major_ver;
+ uint32_t minor_ver;
+ uint32_t build_ver;
+};
+
+struct arm_version_t
+{
+ uint8_t major_ver;
+ uint8_t minor_ver;
+ uint8_t rc_ver;
+ build_type_t build_type;
+};
+
+enum class chain_t { ONE, TWO };
+}}} // namespace mpm::ad937x::device
diff --git a/mpm/lib/mykonos/ad937x_spi_iface.cpp b/mpm/lib/mykonos/ad937x_spi_iface.cpp
index d78f4951f..3944c2906 100644
--- a/mpm/lib/mykonos/ad937x_spi_iface.cpp
+++ b/mpm/lib/mykonos/ad937x_spi_iface.cpp
@@ -9,22 +9,17 @@
using namespace mpm::spi;
-static const int MYK_SPI_SPEED_HZ = 20000000;
+static const int MYK_SPI_SPEED_HZ = 20000000;
static const size_t MYK_ADDR_SHIFT = 8;
static const size_t MYK_DATA_SHIFT = 0;
-static const size_t MYK_READ_FLAG = 1 << 23;
+static const size_t MYK_READ_FLAG = 1 << 23;
static const size_t MYK_WRITE_FLAG = 0;
-mpm::types::regs_iface::sptr mpm::chips::make_ad937x_iface(
- const std::string &spi_device
-) {
- return make_spi_regs_iface(
- spi_iface::make_spidev(spi_device, MYK_SPI_SPEED_HZ),
+mpm::types::regs_iface::sptr mpm::chips::make_ad937x_iface(const std::string& spi_device)
+{
+ return make_spi_regs_iface(spi_iface::make_spidev(spi_device, MYK_SPI_SPEED_HZ),
MYK_ADDR_SHIFT,
MYK_DATA_SHIFT,
MYK_READ_FLAG,
- MYK_WRITE_FLAG
- );
+ MYK_WRITE_FLAG);
}
-
-
diff --git a/mpm/lib/mykonos/adi_ctrl.cpp b/mpm/lib/mykonos/adi_ctrl.cpp
index 2ae0ef663..83e363bc8 100644
--- a/mpm/lib/mykonos/adi_ctrl.cpp
+++ b/mpm/lib/mykonos/adi_ctrl.cpp
@@ -5,32 +5,28 @@
//
#include "adi/common.h"
-
+#include <uhd/exception.hpp>
#include <mpm/ad937x/adi_ctrl.hpp>
#include <mpm/types/log_buf.hpp>
-#include <uhd/exception.hpp>
#include <boost/format.hpp>
-
-#include <iostream>
#include <chrono>
-#include <thread>
+#include <iostream>
#include <sstream>
+#include <thread>
-ad9371_spiSettings_t::ad9371_spiSettings_t(
- mpm::types::regs_iface* spi_iface_
-) :
- spi_iface(spi_iface_)
+ad9371_spiSettings_t::ad9371_spiSettings_t(mpm::types::regs_iface* spi_iface_)
+ : spi_iface(spi_iface_)
{
- spi_settings.chipSelectIndex = 0; // set later
- spi_settings.writeBitPolarity = 1; // unused
+ spi_settings.chipSelectIndex = 0; // set later
+ spi_settings.writeBitPolarity = 1; // unused
spi_settings.longInstructionWord = 1;
- spi_settings.MSBFirst = 1;
- spi_settings.CPHA = 0;
- spi_settings.CPOL = 0;
- spi_settings.enSpiStreaming = 0; // unused
- spi_settings.autoIncAddrUp = 0; // unused
- spi_settings.fourWireMode = 1; // unused
- spi_settings.spiClkFreq_Hz = 250000000; // currently unused
+ spi_settings.MSBFirst = 1;
+ spi_settings.CPHA = 0;
+ spi_settings.CPOL = 0;
+ spi_settings.enSpiStreaming = 0; // unused
+ spi_settings.autoIncAddrUp = 0; // unused
+ spi_settings.fourWireMode = 1; // unused
+ spi_settings.spiClkFreq_Hz = 250000000; // currently unused
}
// TODO: change // not implemented to meaningful errors
@@ -61,7 +57,7 @@ commonErr_t CMB_hardReset(uint8_t spiChipSelectIndex)
//
// allows the platform HAL to work with devices with various SPI settings
-commonErr_t CMB_setSPIOptions(spiSettings_t *spiSettings)
+commonErr_t CMB_setSPIOptions(spiSettings_t* spiSettings)
{
// not implemented
return COMMONERR_OK;
@@ -75,22 +71,21 @@ commonErr_t CMB_setSPIChannel(uint16_t chipSelectIndex)
}
// single SPI byte write function
-commonErr_t CMB_SPIWriteByte(spiSettings_t *spiSettings, uint16_t addr, uint8_t data)
+commonErr_t CMB_SPIWriteByte(spiSettings_t* spiSettings, uint16_t addr, uint8_t data)
{
if (spiSettings == nullptr || spiSettings->MSBFirst == 0) {
return COMMONERR_FAILED;
}
- ad9371_spiSettings_t *spi = ad9371_spiSettings_t::make(spiSettings);
+ ad9371_spiSettings_t* spi = ad9371_spiSettings_t::make(spiSettings);
try {
spi->spi_iface->poke8(addr, data);
return COMMONERR_OK;
- } catch (const std::exception &e) {
+ } catch (const std::exception& e) {
// TODO: spit out a reasonable error here (that will survive the C API transition)
std::stringstream ss;
ss << "Error in CMB_SPIWriteByte: " << e.what();
- CMB_writeToLog(
- ADIHAL_LOG_ERROR,
+ CMB_writeToLog(ADIHAL_LOG_ERROR,
spiSettings->chipSelectIndex,
ad9371_spi_errors_t::SPI_WRITE_ERROR,
ss.str().c_str());
@@ -99,31 +94,27 @@ commonErr_t CMB_SPIWriteByte(spiSettings_t *spiSettings, uint16_t addr, uint8_t
}
// multi SPI byte write function (address, data pairs)
-commonErr_t CMB_SPIWriteBytes(spiSettings_t *spiSettings, uint16_t *addr, uint8_t *data, uint32_t count)
+commonErr_t CMB_SPIWriteBytes(
+ spiSettings_t* spiSettings, uint16_t* addr, uint8_t* data, uint32_t count)
{
- if (spiSettings == nullptr ||
- addr == nullptr ||
- data == nullptr ||
- spiSettings->MSBFirst == 0)
- {
+ if (spiSettings == nullptr || addr == nullptr || data == nullptr
+ || spiSettings->MSBFirst == 0) {
return COMMONERR_FAILED;
}
- ad9371_spiSettings_t *spi = ad9371_spiSettings_t::make(spiSettings);
+ ad9371_spiSettings_t* spi = ad9371_spiSettings_t::make(spiSettings);
try {
- for (size_t i = 0; i < count; ++i)
- {
+ for (size_t i = 0; i < count; ++i) {
uint32_t data_word = (0) | (addr[i] << 8) | (data[i]);
spi->spi_iface->poke8(addr[i], data[i]);
}
return COMMONERR_OK;
- } catch (const std::exception &e) {
+ } catch (const std::exception& e) {
// TODO: spit out a reasonable error here (that will survive the C API transition)
std::stringstream ss;
ss << "Error in CMB_SPIWriteBytes: " << e.what();
- CMB_writeToLog(
- ADIHAL_LOG_ERROR,
+ CMB_writeToLog(ADIHAL_LOG_ERROR,
spiSettings->chipSelectIndex,
ad9371_spi_errors_t::SPI_WRITE_ERROR,
ss.str().c_str());
@@ -132,25 +123,21 @@ commonErr_t CMB_SPIWriteBytes(spiSettings_t *spiSettings, uint16_t *addr, uint8_
}
// single SPI byte read function
-commonErr_t CMB_SPIReadByte (spiSettings_t *spiSettings, uint16_t addr, uint8_t *readdata)
+commonErr_t CMB_SPIReadByte(spiSettings_t* spiSettings, uint16_t addr, uint8_t* readdata)
{
- if (spiSettings == nullptr ||
- readdata == nullptr ||
- spiSettings->MSBFirst == 0)
- {
+ if (spiSettings == nullptr || readdata == nullptr || spiSettings->MSBFirst == 0) {
return COMMONERR_FAILED;
}
- ad9371_spiSettings_t *spi = ad9371_spiSettings_t::make(spiSettings);
+ ad9371_spiSettings_t* spi = ad9371_spiSettings_t::make(spiSettings);
try {
*readdata = spi->spi_iface->peek8(addr);
return COMMONERR_OK;
- } catch (const std::exception &e) {
+ } catch (const std::exception& e) {
// TODO: spit out a reasonable error here (that will survive the C API transition)
std::stringstream ss;
ss << "Error in CMB_SPIReadByte: " << e.what();
- CMB_writeToLog(
- ADIHAL_LOG_ERROR,
+ CMB_writeToLog(ADIHAL_LOG_ERROR,
spiSettings->chipSelectIndex,
ad9371_spi_errors_t::SPI_READ_ERROR,
ss.str().c_str());
@@ -159,24 +146,24 @@ commonErr_t CMB_SPIReadByte (spiSettings_t *spiSettings, uint16_t addr, uint8_t
}
// write a field in a single register
-commonErr_t CMB_SPIWriteField(
- spiSettings_t *spiSettings,
- uint16_t addr, uint8_t field_val,
- uint8_t mask, uint8_t start_bit
-) {
- ad9371_spiSettings_t *spi = ad9371_spiSettings_t::make(spiSettings);
+commonErr_t CMB_SPIWriteField(spiSettings_t* spiSettings,
+ uint16_t addr,
+ uint8_t field_val,
+ uint8_t mask,
+ uint8_t start_bit)
+{
+ ad9371_spiSettings_t* spi = ad9371_spiSettings_t::make(spiSettings);
try {
uint8_t current_value = spi->spi_iface->peek8(addr);
- uint8_t new_value = ((current_value & ~mask) | (field_val << start_bit));
+ uint8_t new_value = ((current_value & ~mask) | (field_val << start_bit));
spi->spi_iface->poke8(addr, new_value);
return COMMONERR_OK;
- } catch (const std::exception &e) {
+ } catch (const std::exception& e) {
// TODO: spit out a reasonable error here (that will survive the C API transition)
std::stringstream ss;
ss << "Error in CMB_SPIWriteField: " << e.what();
- CMB_writeToLog(
- ADIHAL_LOG_ERROR,
+ CMB_writeToLog(ADIHAL_LOG_ERROR,
spiSettings->chipSelectIndex,
ad9371_spi_errors_t::SPI_WRITE_ERROR,
ss.str().c_str());
@@ -186,23 +173,23 @@ commonErr_t CMB_SPIWriteField(
// read a field in a single register
-commonErr_t CMB_SPIReadField(
- spiSettings_t *spiSettings,
- uint16_t addr, uint8_t *field_val,
- uint8_t mask, uint8_t start_bit
-) {
- ad9371_spiSettings_t *spi = ad9371_spiSettings_t::make(spiSettings);
+commonErr_t CMB_SPIReadField(spiSettings_t* spiSettings,
+ uint16_t addr,
+ uint8_t* field_val,
+ uint8_t mask,
+ uint8_t start_bit)
+{
+ ad9371_spiSettings_t* spi = ad9371_spiSettings_t::make(spiSettings);
try {
uint8_t value = spi->spi_iface->peek8(addr);
- *field_val = static_cast<uint8_t>((value & mask) >> start_bit);
+ *field_val = static_cast<uint8_t>((value & mask) >> start_bit);
return COMMONERR_OK;
- } catch (const std::exception &e) {
+ } catch (const std::exception& e) {
// TODO: spit out a reasonable error here (that will survive the C API transition)
std::stringstream ss;
ss << "Error in CMB_SPIReadField: " << e.what();
- CMB_writeToLog(
- ADIHAL_LOG_ERROR,
+ CMB_writeToLog(ADIHAL_LOG_ERROR,
spiSettings->chipSelectIndex,
ad9371_spi_errors_t::SPI_READ_ERROR,
ss.str().c_str());
@@ -223,35 +210,34 @@ commonErr_t CMB_wait_us(uint32_t time_us)
return COMMONERR_OK;
}
-commonErr_t CMB_setTimeout_ms(spiSettings_t *spiSettings, uint32_t timeOut_ms)
+commonErr_t CMB_setTimeout_ms(spiSettings_t* spiSettings, uint32_t timeOut_ms)
{
- ad9371_spiSettings_t *mpm_spi = ad9371_spiSettings_t::make(spiSettings);
- mpm_spi->timeout_start = std::chrono::steady_clock::now();
- mpm_spi->timeout_duration = std::chrono::milliseconds(timeOut_ms);
+ ad9371_spiSettings_t* mpm_spi = ad9371_spiSettings_t::make(spiSettings);
+ mpm_spi->timeout_start = std::chrono::steady_clock::now();
+ mpm_spi->timeout_duration = std::chrono::milliseconds(timeOut_ms);
return COMMONERR_OK;
}
-commonErr_t CMB_setTimeout_us(spiSettings_t *spiSettings, uint32_t timeOut_us)
+commonErr_t CMB_setTimeout_us(spiSettings_t* spiSettings, uint32_t timeOut_us)
{
- ad9371_spiSettings_t *mpm_spi = ad9371_spiSettings_t::make(spiSettings);
- mpm_spi->timeout_start = std::chrono::steady_clock::now();
- mpm_spi->timeout_duration = std::chrono::microseconds(timeOut_us);
+ ad9371_spiSettings_t* mpm_spi = ad9371_spiSettings_t::make(spiSettings);
+ mpm_spi->timeout_start = std::chrono::steady_clock::now();
+ mpm_spi->timeout_duration = std::chrono::microseconds(timeOut_us);
return COMMONERR_OK;
}
-commonErr_t CMB_hasTimeoutExpired(spiSettings_t *spiSettings)
+commonErr_t CMB_hasTimeoutExpired(spiSettings_t* spiSettings)
{
- ad9371_spiSettings_t *mpm_spi = ad9371_spiSettings_t::make(spiSettings);
- auto current_time = std::chrono::steady_clock::now();
- if ((std::chrono::steady_clock::now() - mpm_spi->timeout_start) > mpm_spi->timeout_duration)
- {
+ ad9371_spiSettings_t* mpm_spi = ad9371_spiSettings_t::make(spiSettings);
+ auto current_time = std::chrono::steady_clock::now();
+ if ((std::chrono::steady_clock::now() - mpm_spi->timeout_start)
+ > mpm_spi->timeout_duration) {
return COMMONERR_FAILED;
- }
- else {
+ } else {
return COMMONERR_OK;
}
}
// platform logging functions
-commonErr_t CMB_openLog(const char *filename)
+commonErr_t CMB_openLog(const char* filename)
{
// not implemented
return COMMONERR_FAILED;
@@ -263,22 +249,17 @@ commonErr_t CMB_closeLog(void)
}
commonErr_t CMB_writeToLog(
- ADI_LOGLEVEL level,
- uint8_t deviceIndex,
- uint32_t errorCode,
- const char *comment
-) {
+ ADI_LOGLEVEL level, uint8_t deviceIndex, uint32_t errorCode, const char* comment)
+{
mpm::types::log_level_t mpm_log_level;
if (level & ADIHAL_LOG_ERROR) {
mpm_log_level = mpm::types::log_level_t::ERROR;
- }
- else if (level & ADIHAL_LOG_WARNING) {
+ } else if (level & ADIHAL_LOG_WARNING) {
mpm_log_level = mpm::types::log_level_t::WARNING;
- }
- else {
+ } else {
mpm_log_level = mpm::types::log_level_t::TRACE;
}
- //FIXME: This caused segfault with the async pattern call to c++ from boost python
+ // FIXME: This caused segfault with the async pattern call to c++ from boost python
// mpm::types::log_buf::make_singleton()->post(
// mpm_log_level,
// "AD937X",
@@ -295,7 +276,7 @@ commonErr_t CMB_flushLog(void)
}
/* platform FPGA AXI register read/write functions */
-commonErr_t CMB_regRead(uint32_t offset, uint32_t *data)
+commonErr_t CMB_regRead(uint32_t offset, uint32_t* data)
{
// not implemented
return COMMONERR_FAILED;
@@ -307,12 +288,12 @@ commonErr_t CMB_regWrite(uint32_t offset, uint32_t data)
}
/* platform DDR3 memory read/write functions */
-commonErr_t CMB_memRead(uint32_t offset, uint32_t *data, uint32_t len)
+commonErr_t CMB_memRead(uint32_t offset, uint32_t* data, uint32_t len)
{
// not implemented
return COMMONERR_FAILED;
}
-commonErr_t CMB_memWrite(uint32_t offset, uint32_t *data, uint32_t len)
+commonErr_t CMB_memWrite(uint32_t offset, uint32_t* data, uint32_t len)
{
// not implemented
return COMMONERR_FAILED;
diff --git a/mpm/lib/mykonos/config/ad937x_config_t.cpp b/mpm/lib/mykonos/config/ad937x_config_t.cpp
index 9bebeafad..97651b0b4 100644
--- a/mpm/lib/mykonos/config/ad937x_config_t.cpp
+++ b/mpm/lib/mykonos/config/ad937x_config_t.cpp
@@ -7,87 +7,421 @@
#include "ad937x_config_t.hpp"
#include "ad937x_default_config.hpp"
-const int16_t ad937x_config_t::DEFAULT_TX_FIR[DEFAULT_TX_FIR_SIZE] =
- { -94, -26, 282, 177, -438, -368, 756, 732,-1170,-1337, 1758, 2479,-2648,-5088, 4064,16760,
- 16759, 4110,-4881,-2247, 2888, 1917,-1440,-1296, 745, 828, -358, -474, 164, 298, -16, -94 };
-
-const int16_t ad937x_config_t::DEFAULT_TX_FIR_15366[DEFAULT_TX_FIR_SIZE] =
- { 4, -16, -5, 75, -13, -229, 85, 547, -293,-1158, 738, 2290,-1640,-4805, 3687,17108,
- 17108, 3687,-4805,-1640, 2290, 738,-1158, -293, 547, 85, -229, -13, 75, -5, -16, 4 };
-
-const int16_t ad937x_config_t::DEFAULT_RX_FIR[DEFAULT_RX_FIR_SIZE] =
- { -20, 6, 66, 22, -128, -54, 240, 126, -402, -248, 634, 444, -956, -756, 1400, 1244,
- -2028,-2050, 2978, 3538,-4646,-7046, 9536,30880,30880, 9536,-7046,-4646, 3538, 2978,-2050,-2028,
- 1244, 1400, -756, -956, 444, 634, -248, -402, 126, 240, -54, -128, 22, 66, 6, -20 };
-
-const int16_t ad937x_config_t::DEFAULT_RX_FIR_15366[DEFAULT_RX_FIR_SIZE] =
- { -16, -22, 18, 74, 24, -132, -152, 132, 372, 38, -598, -474, 638, 1178, -206,-1952,
- -984, 2362, 3152,-1612,-6544,-2164,12806,26836,26836,12806,-2164,-6544,-1612, 3152, 2362, -984,
- -1952, -206, 1178, 638, -474, -598, 38, 372, 132, -152, -132, 24, 74, 18, -22, -16 };
-
-const int16_t ad937x_config_t::DEFAULT_OBSRX_FIR[DEFAULT_RX_FIR_SIZE] =
- { -14, -19, 44, 41, -89, -95, 175, 178, -303, -317, 499, 527, -779, -843, 1184, 1317,
- -1781,-2059, 2760, 3350,-4962,-7433, 9822,32154,32154, 9822,-7433,-4962, 3350, 2760,-2059,-1781,
- 1317, 1184, -843, -779, 527, 499, -317, -303, 178, 175, -95, -89, 41, 44, -19, -14 };
-
-const int16_t ad937x_config_t::DEFAULT_OBSRX_FIR_15366[DEFAULT_RX_FIR_SIZE] =
- { -2, 3, 12, -19, -28, 44, 74, -92, -169, 150, 353, -203, -671, 203, 1179, -66,
- -1952, -347, 3153, 1307,-5595,-4820,11323,29525,29525,11323,-4820,-5595, 1307, 3153, -347,-1952,
- -66, 1179, 203, -671, -203, 353, 150, -169, -92, 74, 44, -28, -19, 12, 3, -2 };
-
-const int16_t ad937x_config_t::DEFAULT_SNIFFER_FIR[DEFAULT_RX_FIR_SIZE] =
- { -1, -5, -14, -23, -16, 24, 92, 137, 80, -120, -378, -471, -174, 507, 1174, 1183,
- 98,-1771,-3216,-2641, 942, 7027,13533,17738,17738,13533, 7027, 942,-2641,-3216,-1771, 98,
- 1183, 1174, 507, -174, -471, -378, -120, 80, 137, 92, 24, -16, -23, -14, -5, -1 };
-
-const int16_t ad937x_config_t::DEFAULT_SNIFFER_FIR_15366[DEFAULT_RX_FIR_SIZE] =
- { 10, 31, 59, 71, 30, -92, -283, -456, -466, -175, 440, 1192, 1683, 1444, 198,-1871,
- -3988, -4942,-3512, 958, 8118,16519,23993,28395,28395,23993,16519, 8118, 958,-3512,-4942,-3988,
- -1871, 198, 1444, 1683, 1192, 440, -175, -466, -456, -283, -92, 30, 71, 59, 31, 10 };
-
-ad937x_config_t::ad937x_config_t(spiSettings_t* sps, const size_t deserializer_lane_xbar) :
- _rx(DEFAULT_RX_SETTINGS),
- _rxProfile(DEFAULT_RX_PROFILE),
- _framer(DEFAULT_FRAMER),
- _rxGainCtrl(DEFAULT_RX_GAIN),
- _rxPeakAgc(DEFAULT_RX_PEAK_AGC),
- _rxPowerAgc(DEFAULT_RX_POWER_AGC),
- _rxAgcCtrl(DEFAULT_RX_AGC_CTRL),
-
- _tx(DEFAULT_TX_SETTINGS),
- _txProfile(DEFAULT_TX_PROFILE),
- _deframer(DEFAULT_DEFRAMER),
+const int16_t ad937x_config_t::DEFAULT_TX_FIR[DEFAULT_TX_FIR_SIZE] = {-94,
+ -26,
+ 282,
+ 177,
+ -438,
+ -368,
+ 756,
+ 732,
+ -1170,
+ -1337,
+ 1758,
+ 2479,
+ -2648,
+ -5088,
+ 4064,
+ 16760,
+ 16759,
+ 4110,
+ -4881,
+ -2247,
+ 2888,
+ 1917,
+ -1440,
+ -1296,
+ 745,
+ 828,
+ -358,
+ -474,
+ 164,
+ 298,
+ -16,
+ -94};
+
+const int16_t ad937x_config_t::DEFAULT_TX_FIR_15366[DEFAULT_TX_FIR_SIZE] = {4,
+ -16,
+ -5,
+ 75,
+ -13,
+ -229,
+ 85,
+ 547,
+ -293,
+ -1158,
+ 738,
+ 2290,
+ -1640,
+ -4805,
+ 3687,
+ 17108,
+ 17108,
+ 3687,
+ -4805,
+ -1640,
+ 2290,
+ 738,
+ -1158,
+ -293,
+ 547,
+ 85,
+ -229,
+ -13,
+ 75,
+ -5,
+ -16,
+ 4};
+
+const int16_t ad937x_config_t::DEFAULT_RX_FIR[DEFAULT_RX_FIR_SIZE] = {-20,
+ 6,
+ 66,
+ 22,
+ -128,
+ -54,
+ 240,
+ 126,
+ -402,
+ -248,
+ 634,
+ 444,
+ -956,
+ -756,
+ 1400,
+ 1244,
+ -2028,
+ -2050,
+ 2978,
+ 3538,
+ -4646,
+ -7046,
+ 9536,
+ 30880,
+ 30880,
+ 9536,
+ -7046,
+ -4646,
+ 3538,
+ 2978,
+ -2050,
+ -2028,
+ 1244,
+ 1400,
+ -756,
+ -956,
+ 444,
+ 634,
+ -248,
+ -402,
+ 126,
+ 240,
+ -54,
+ -128,
+ 22,
+ 66,
+ 6,
+ -20};
+
+const int16_t ad937x_config_t::DEFAULT_RX_FIR_15366[DEFAULT_RX_FIR_SIZE] = {-16,
+ -22,
+ 18,
+ 74,
+ 24,
+ -132,
+ -152,
+ 132,
+ 372,
+ 38,
+ -598,
+ -474,
+ 638,
+ 1178,
+ -206,
+ -1952,
+ -984,
+ 2362,
+ 3152,
+ -1612,
+ -6544,
+ -2164,
+ 12806,
+ 26836,
+ 26836,
+ 12806,
+ -2164,
+ -6544,
+ -1612,
+ 3152,
+ 2362,
+ -984,
+ -1952,
+ -206,
+ 1178,
+ 638,
+ -474,
+ -598,
+ 38,
+ 372,
+ 132,
+ -152,
+ -132,
+ 24,
+ 74,
+ 18,
+ -22,
+ -16};
+
+const int16_t ad937x_config_t::DEFAULT_OBSRX_FIR[DEFAULT_RX_FIR_SIZE] = {-14,
+ -19,
+ 44,
+ 41,
+ -89,
+ -95,
+ 175,
+ 178,
+ -303,
+ -317,
+ 499,
+ 527,
+ -779,
+ -843,
+ 1184,
+ 1317,
+ -1781,
+ -2059,
+ 2760,
+ 3350,
+ -4962,
+ -7433,
+ 9822,
+ 32154,
+ 32154,
+ 9822,
+ -7433,
+ -4962,
+ 3350,
+ 2760,
+ -2059,
+ -1781,
+ 1317,
+ 1184,
+ -843,
+ -779,
+ 527,
+ 499,
+ -317,
+ -303,
+ 178,
+ 175,
+ -95,
+ -89,
+ 41,
+ 44,
+ -19,
+ -14};
+
+const int16_t ad937x_config_t::DEFAULT_OBSRX_FIR_15366[DEFAULT_RX_FIR_SIZE] = {-2,
+ 3,
+ 12,
+ -19,
+ -28,
+ 44,
+ 74,
+ -92,
+ -169,
+ 150,
+ 353,
+ -203,
+ -671,
+ 203,
+ 1179,
+ -66,
+ -1952,
+ -347,
+ 3153,
+ 1307,
+ -5595,
+ -4820,
+ 11323,
+ 29525,
+ 29525,
+ 11323,
+ -4820,
+ -5595,
+ 1307,
+ 3153,
+ -347,
+ -1952,
+ -66,
+ 1179,
+ 203,
+ -671,
+ -203,
+ 353,
+ 150,
+ -169,
+ -92,
+ 74,
+ 44,
+ -28,
+ -19,
+ 12,
+ 3,
+ -2};
+
+const int16_t ad937x_config_t::DEFAULT_SNIFFER_FIR[DEFAULT_RX_FIR_SIZE] = {-1,
+ -5,
+ -14,
+ -23,
+ -16,
+ 24,
+ 92,
+ 137,
+ 80,
+ -120,
+ -378,
+ -471,
+ -174,
+ 507,
+ 1174,
+ 1183,
+ 98,
+ -1771,
+ -3216,
+ -2641,
+ 942,
+ 7027,
+ 13533,
+ 17738,
+ 17738,
+ 13533,
+ 7027,
+ 942,
+ -2641,
+ -3216,
+ -1771,
+ 98,
+ 1183,
+ 1174,
+ 507,
+ -174,
+ -471,
+ -378,
+ -120,
+ 80,
+ 137,
+ 92,
+ 24,
+ -16,
+ -23,
+ -14,
+ -5,
+ -1};
+
+const int16_t ad937x_config_t::DEFAULT_SNIFFER_FIR_15366[DEFAULT_RX_FIR_SIZE] = {10,
+ 31,
+ 59,
+ 71,
+ 30,
+ -92,
+ -283,
+ -456,
+ -466,
+ -175,
+ 440,
+ 1192,
+ 1683,
+ 1444,
+ 198,
+ -1871,
+ -3988,
+ -4942,
+ -3512,
+ 958,
+ 8118,
+ 16519,
+ 23993,
+ 28395,
+ 28395,
+ 23993,
+ 16519,
+ 8118,
+ 958,
+ -3512,
+ -4942,
+ -3988,
+ -1871,
+ 198,
+ 1444,
+ 1683,
+ 1192,
+ 440,
+ -175,
+ -466,
+ -456,
+ -283,
+ -92,
+ 30,
+ 71,
+ 59,
+ 31,
+ 10};
+
+ad937x_config_t::ad937x_config_t(spiSettings_t* sps, const size_t deserializer_lane_xbar)
+ : _rx(DEFAULT_RX_SETTINGS)
+ , _rxProfile(DEFAULT_RX_PROFILE)
+ , _framer(DEFAULT_FRAMER)
+ , _rxGainCtrl(DEFAULT_RX_GAIN)
+ , _rxPeakAgc(DEFAULT_RX_PEAK_AGC)
+ , _rxPowerAgc(DEFAULT_RX_POWER_AGC)
+ , _rxAgcCtrl(DEFAULT_RX_AGC_CTRL)
+ ,
+
+ _tx(DEFAULT_TX_SETTINGS)
+ , _txProfile(DEFAULT_TX_PROFILE)
+ , _deframer(DEFAULT_DEFRAMER)
+ ,
// TODO: Remove if ADI ever fixes this
// The TX bring up requires a valid ORX profile
// https://github.com/EttusResearch/uhddev/blob/f0f8f58471c3fed94279c32f00e9f8da7db40efd/mpm/lib/mykonos/adi/mykonos.c#L16590
- _obsRx(DEFAULT_ORX_SETTINGS),
- _orxFramer(DEFAULT_ORX_FRAMER),
- _orxProfile(DEFAULT_ORX_PROFILE),
- _orxGainCtrl(DEFAULT_ORX_GAIN),
- _orxPeakAgc(DEFAULT_ORX_PEAK_AGC),
- _orxPowerAgc(DEFAULT_ORX_POWER_AGC),
- _orxAgcCtrl(DEFAULT_ORX_AGC_CTRL),
+ _obsRx(DEFAULT_ORX_SETTINGS)
+ , _orxFramer(DEFAULT_ORX_FRAMER)
+ , _orxProfile(DEFAULT_ORX_PROFILE)
+ , _orxGainCtrl(DEFAULT_ORX_GAIN)
+ , _orxPeakAgc(DEFAULT_ORX_PEAK_AGC)
+ , _orxPowerAgc(DEFAULT_ORX_POWER_AGC)
+ , _orxAgcCtrl(DEFAULT_ORX_AGC_CTRL)
+ ,
// TODO: Remove if ADI ever fixes this
// ORX bring up requires a valid sniffer gain control struct
// https://github.com/EttusResearch/uhddev/blob/f0f8f58471c3fed94279c32f00e9f8da7db40efd/mpm/lib/mykonos/adi/mykonos.c#L5752
- _snifferGainCtrl(DEFAULT_SNIFFER_GAIN),
+ _snifferGainCtrl(DEFAULT_SNIFFER_GAIN)
+ ,
- _armGpio(DEFAULT_ARM_GPIO),
- _gpio3v3(DEFAULT_GPIO_3V3),
- _gpio(DEFAULT_GPIO),
+ _armGpio(DEFAULT_ARM_GPIO)
+ , _gpio3v3(DEFAULT_GPIO_3V3)
+ , _gpio(DEFAULT_GPIO)
+ ,
- _auxIo(DEFAULT_AUX_IO),
- _clocks(DEFAULT_CLOCKS),
+ _auxIo(DEFAULT_AUX_IO)
+ , _clocks(DEFAULT_CLOCKS)
+ ,
- tx_fir_config(DEFAULT_TX_FIR_GAIN, std::vector<int16_t>(DEFAULT_TX_FIR, DEFAULT_TX_FIR + DEFAULT_TX_FIR_SIZE)),
- rx_fir_config(DEFAULT_RX_FIR_GAIN, std::vector<int16_t>(DEFAULT_RX_FIR, DEFAULT_RX_FIR + DEFAULT_RX_FIR_SIZE)),
- _orx_fir_config(DEFAULT_RX_FIR_GAIN, std::vector<int16_t>(DEFAULT_OBSRX_FIR, DEFAULT_OBSRX_FIR + DEFAULT_RX_FIR_SIZE)),
- _sniffer_rx_fir_config(DEFAULT_RX_FIR_GAIN, std::vector<int16_t>(DEFAULT_SNIFFER_FIR, DEFAULT_SNIFFER_FIR + DEFAULT_RX_FIR_SIZE))
+ tx_fir_config(DEFAULT_TX_FIR_GAIN,
+ std::vector<int16_t>(DEFAULT_TX_FIR, DEFAULT_TX_FIR + DEFAULT_TX_FIR_SIZE))
+ , rx_fir_config(DEFAULT_RX_FIR_GAIN,
+ std::vector<int16_t>(DEFAULT_RX_FIR, DEFAULT_RX_FIR + DEFAULT_RX_FIR_SIZE))
+ , _orx_fir_config(DEFAULT_RX_FIR_GAIN,
+ std::vector<int16_t>(
+ DEFAULT_OBSRX_FIR, DEFAULT_OBSRX_FIR + DEFAULT_RX_FIR_SIZE))
+ , _sniffer_rx_fir_config(DEFAULT_RX_FIR_GAIN,
+ std::vector<int16_t>(
+ DEFAULT_SNIFFER_FIR, DEFAULT_SNIFFER_FIR + DEFAULT_RX_FIR_SIZE))
{
- _device.spiSettings = sps;
+ _device.spiSettings = sps;
_deframer.deserializerLaneCrossbar = deserializer_lane_xbar;
_init_pointers();
@@ -95,52 +429,51 @@ ad937x_config_t::ad937x_config_t(spiSettings_t* sps, const size_t deserializer_l
device = &_device;
}
-// This function sets up all the pointers in all of our local members that represent the device struct
-// This function should only be called during construction.
+// This function sets up all the pointers in all of our local members that represent the
+// device struct This function should only be called during construction.
void ad937x_config_t::_init_pointers()
{
- _device.rx = &_rx;
- _device.tx = &_tx;
- _device.obsRx = &_obsRx;
- _device.auxIo = &_auxIo;
+ _device.rx = &_rx;
+ _device.tx = &_tx;
+ _device.obsRx = &_obsRx;
+ _device.auxIo = &_auxIo;
_device.clocks = &_clocks;
- _rx.rxProfile = &_rxProfile;
- _rx.framer = &_framer;
- _rx.rxGainCtrl = &_rxGainCtrl;
- _rx.rxAgcCtrl = &_rxAgcCtrl;
- _rxProfile.rxFir = rx_fir_config.fir;
+ _rx.rxProfile = &_rxProfile;
+ _rx.framer = &_framer;
+ _rx.rxGainCtrl = &_rxGainCtrl;
+ _rx.rxAgcCtrl = &_rxAgcCtrl;
+ _rxProfile.rxFir = rx_fir_config.fir;
_rxProfile.customAdcProfile = nullptr;
- _rxAgcCtrl.peakAgc = &_rxPeakAgc;
- _rxAgcCtrl.powerAgc = &_rxPowerAgc;
+ _rxAgcCtrl.peakAgc = &_rxPeakAgc;
+ _rxAgcCtrl.powerAgc = &_rxPowerAgc;
- _tx.txProfile = &_txProfile;
+ _tx.txProfile = &_txProfile;
_txProfile.txFir = tx_fir_config.fir;
- _tx.deframer = &_deframer;
+ _tx.deframer = &_deframer;
// AD9373
- _tx.dpdConfig = nullptr;
+ _tx.dpdConfig = nullptr;
_tx.clgcConfig = nullptr;
_tx.vswrConfig = nullptr;
// TODO: ideally we set none of this information and leave the profile as nullptr
// Check that the API supports this
- _obsRx.orxProfile = &_orxProfile;
- _obsRx.orxGainCtrl = &_orxGainCtrl;
- _obsRx.orxAgcCtrl = &_orxAgcCtrl;
- _orxProfile.rxFir = _orx_fir_config.fir;
+ _obsRx.orxProfile = &_orxProfile;
+ _obsRx.orxGainCtrl = &_orxGainCtrl;
+ _obsRx.orxAgcCtrl = &_orxAgcCtrl;
+ _orxProfile.rxFir = _orx_fir_config.fir;
_orxProfile.customAdcProfile = nullptr;
- _orxAgcCtrl.peakAgc = &_orxPeakAgc;
- _orxAgcCtrl.powerAgc = &_orxPowerAgc;
+ _orxAgcCtrl.peakAgc = &_orxPeakAgc;
+ _orxAgcCtrl.powerAgc = &_orxPowerAgc;
- _obsRx.snifferProfile = &_snifferProfile;
- _snifferProfile.rxFir = _sniffer_rx_fir_config.fir;
+ _obsRx.snifferProfile = &_snifferProfile;
+ _snifferProfile.rxFir = _sniffer_rx_fir_config.fir;
_obsRx.snifferGainCtrl = &_snifferGainCtrl;
// sniffer has no AGC ctrl, so leave as null
_obsRx.framer = &_orxFramer;
_auxIo.gpio3v3 = &_gpio3v3;
- _auxIo.gpio = &_gpio;
+ _auxIo.gpio = &_gpio;
_auxIo.armGpio = &_armGpio;
}
-
diff --git a/mpm/lib/mykonos/config/ad937x_config_t.hpp b/mpm/lib/mykonos/config/ad937x_config_t.hpp
index 7cbabb9b5..ab5ddb894 100644
--- a/mpm/lib/mykonos/config/ad937x_config_t.hpp
+++ b/mpm/lib/mykonos/config/ad937x_config_t.hpp
@@ -10,11 +10,11 @@
#include "ad937x_fir.hpp"
#include <boost/noncopyable.hpp>
// Allocates and links the entire mykonos config struct in a single class
-class ad937x_config_t : public boost::noncopyable
+class ad937x_config_t : public boost::noncopyable
{
public:
ad937x_config_t(spiSettings_t* sps, const size_t deserializer_lane_xbar);
- mykonosDevice_t * device;
+ mykonosDevice_t* device;
ad937x_fir rx_fir_config;
ad937x_fir tx_fir_config;
@@ -35,8 +35,9 @@ public:
static const int16_t DEFAULT_SNIFFER_FIR_15366[DEFAULT_RX_FIR_SIZE];
private:
- // The top level device struct is non-const and contains all other structs, so everything is "public"
- // a user could technically modify the pointers in the structs, but we have no way of preventing that
+ // The top level device struct is non-const and contains all other structs, so
+ // everything is "public" a user could technically modify the pointers in the structs,
+ // but we have no way of preventing that
mykonosDevice_t _device;
ad937x_fir _orx_fir_config;
diff --git a/mpm/lib/mykonos/config/ad937x_default_config.hpp b/mpm/lib/mykonos/config/ad937x_default_config.hpp
index e01c0c6d3..72fbd6cf5 100644
--- a/mpm/lib/mykonos/config/ad937x_default_config.hpp
+++ b/mpm/lib/mykonos/config/ad937x_default_config.hpp
@@ -9,368 +9,396 @@
// This file is more or less the static config provided by a run of the eval software
// except all pointers have been changed to nullptr
// Hopefully this helps the compiler use these as purely constants
-// The pointers should be filled in if these data structures are to be actually used with the API
+// The pointers should be filled in if these data structures are to be actually used with
+// the API
-static const mykonosRxSettings_t DEFAULT_RX_SETTINGS =
-{
- nullptr, // Rx datapath profile, 3dB corner frequencies, and digital filter enables
- nullptr, // Rx JESD204b framer configuration structure
- nullptr, // Rx Gain control settings structure
- nullptr, // Rx AGC control settings structure
- RX1_RX2, // The desired Rx Channels to enable during initialization
- 0, // Internal LO = 0, external LO*2 = 1
- 3500000000U, // Rx PLL LO Frequency (internal or external LO)
- 0 // Flag to choose if complex baseband or real IF data are selected for Rx and ObsRx paths. Where, if > 0 = real IF data, '0' = zero IF (IQ) data
+static const mykonosRxSettings_t DEFAULT_RX_SETTINGS = {
+ nullptr, // Rx datapath profile, 3dB corner frequencies, and digital filter enables
+ nullptr, // Rx JESD204b framer configuration structure
+ nullptr, // Rx Gain control settings structure
+ nullptr, // Rx AGC control settings structure
+ RX1_RX2, // The desired Rx Channels to enable during initialization
+ 0, // Internal LO = 0, external LO*2 = 1
+ 3500000000U, // Rx PLL LO Frequency (internal or external LO)
+ 0 // Flag to choose if complex baseband or real IF data are selected for Rx and ObsRx
+ // paths. Where, if > 0 = real IF data, '0' = zero IF (IQ) data
};
-static const mykonosRxProfile_t DEFAULT_RX_PROFILE =
-{ // Rx 100MHz, IQrate 125MSPS, Dec5
- 1, // The divider used to generate the ADC clock
- nullptr, // Pointer to Rx FIR filter structure
- 2, // Rx FIR decimation (1,2,4)
- 5, // Decimation of Dec5 or Dec4 filter (5,4)
- 1, // If set, and DEC5 filter used, will use a higher rejection DEC5 FIR filter (1=Enabled, 0=Disabled)
- 1, // RX Half band 1 decimation (1 or 2)
- 125000, // Rx IQ data rate in kHz
- 100000000, // The Rx RF passband bandwidth for the profile
- 102000, // Rx BBF 3dB corner in kHz
- NULL // pointer to custom ADC profile
+static const mykonosRxProfile_t DEFAULT_RX_PROFILE = {
+ // Rx 100MHz, IQrate 125MSPS, Dec5
+ 1, // The divider used to generate the ADC clock
+ nullptr, // Pointer to Rx FIR filter structure
+ 2, // Rx FIR decimation (1,2,4)
+ 5, // Decimation of Dec5 or Dec4 filter (5,4)
+ 1, // If set, and DEC5 filter used, will use a higher rejection DEC5 FIR filter
+ // (1=Enabled, 0=Disabled)
+ 1, // RX Half band 1 decimation (1 or 2)
+ 125000, // Rx IQ data rate in kHz
+ 100000000, // The Rx RF passband bandwidth for the profile
+ 102000, // Rx BBF 3dB corner in kHz
+ NULL // pointer to custom ADC profile
};
-static const mykonosJesd204bFramerConfig_t DEFAULT_FRAMER =
-{
- 0, // JESD204B Configuration Bank ID -extension to Device ID (Valid 0..15)
- 0, // JESD204B Configuration Device ID - link identification number. (Valid 0..255)
- 0, // JESD204B Configuration starting Lane ID. If more than one lane used, each lane will increment from the Lane0 ID. (Valid 0..31)
- 4, // number of ADCs (0, 2, or 4) - 2 ADCs per receive chain
- 20, // number of frames in a multiframe (default=32), F*K must be a multiple of 4. (F=2*M/numberOfLanes)
- 1, // scrambling off if framerScramble= 0, if framerScramble>0 scramble is enabled.
- 1, // 0=use internal SYSREF, 1= use external SYSREF
- 0x0F, // serializerLanesEnabled - bit per lane, [0] = Lane0 enabled, [1] = Lane1 enabled
- 0x4B, // serializerLaneCrossbar
- 26, // serializerAmplitude - default 22 (valid (0-31)
- 0, // preEmphasis - < default 4 (valid 0 - 7)
- 0, // invertLanePolarity - default 0 ([0] will invert lane [0], bit1 will invert lane1)
- 0, // lmfcOffset - LMFC offset value for deterministic latency setting
- 0, // Flag for determining if SYSREF on relink should be set. Where, if > 0 = set, 0 = not set
- 0, // Flag for determining if auto channel select for the xbar should be set. Where, if > 0 = set, '0' = not set
- 0, // Selects SYNCb input source. Where, 0 = use RXSYNCB for this framer, 1 = use OBSRX_SYNCB for this framer
- 1, // Flag for determining if CMOS mode for RX Sync signal is used. Where, if > 0 = CMOS, '0' = LVDS
- 0, // Selects framer bit repeat or oversampling mode for lane rate matching. Where, 0 = bitRepeat mode (changes effective lanerate), 1 = overSample (maintains same lane rate between ObsRx framer and Rx framer and oversamples the ADC samples)
- 1 // Flag for determining if API will calculate the appropriate settings for framer lane outputs to physical lanes. Where, if '0' = API will set automatic lane crossbar, '1' = set to manual mode and the value in serializerLaneCrossbar will be used
+static const mykonosJesd204bFramerConfig_t DEFAULT_FRAMER = {
+ 0, // JESD204B Configuration Bank ID -extension to Device ID (Valid 0..15)
+ 0, // JESD204B Configuration Device ID - link identification number. (Valid 0..255)
+ 0, // JESD204B Configuration starting Lane ID. If more than one lane used, each lane
+ // will increment from the Lane0 ID. (Valid 0..31)
+ 4, // number of ADCs (0, 2, or 4) - 2 ADCs per receive chain
+ 20, // number of frames in a multiframe (default=32), F*K must be a multiple of 4.
+ // (F=2*M/numberOfLanes)
+ 1, // scrambling off if framerScramble= 0, if framerScramble>0 scramble is enabled.
+ 1, // 0=use internal SYSREF, 1= use external SYSREF
+ 0x0F, // serializerLanesEnabled - bit per lane, [0] = Lane0 enabled, [1] = Lane1
+ // enabled
+ 0x4B, // serializerLaneCrossbar
+ 26, // serializerAmplitude - default 22 (valid (0-31)
+ 0, // preEmphasis - < default 4 (valid 0 - 7)
+ 0, // invertLanePolarity - default 0 ([0] will invert lane [0], bit1 will invert
+ // lane1)
+ 0, // lmfcOffset - LMFC offset value for deterministic latency setting
+ 0, // Flag for determining if SYSREF on relink should be set. Where, if > 0 = set, 0 =
+ // not set
+ 0, // Flag for determining if auto channel select for the xbar should be set. Where,
+ // if > 0 = set, '0' = not set
+ 0, // Selects SYNCb input source. Where, 0 = use RXSYNCB for this framer, 1 = use
+ // OBSRX_SYNCB for this framer
+ 1, // Flag for determining if CMOS mode for RX Sync signal is used. Where, if > 0 =
+ // CMOS, '0' = LVDS
+ 0, // Selects framer bit repeat or oversampling mode for lane rate matching. Where, 0
+ // = bitRepeat mode (changes effective lanerate), 1 = overSample (maintains same
+ // lane rate between ObsRx framer and Rx framer and oversamples the ADC samples)
+ 1 // Flag for determining if API will calculate the appropriate settings for framer
+ // lane outputs to physical lanes. Where, if '0' = API will set automatic lane
+ // crossbar, '1' = set to manual mode and the value in serializerLaneCrossbar will
+ // be used
};
-static const mykonosRxGainControl_t DEFAULT_RX_GAIN =
-{
- MGC, // Current Rx gain control mode setting
- 255, // Rx1 Gain Index, can be used in different ways for manual and AGC gain control
- 255, // Rx2 Gain Index, can be used in different ways for manual and AGC gain control
- 255, // Max gain index for the currently loaded Rx1 Gain table
- 195, // Min gain index for the currently loaded Rx1 Gain table
- 255, // Max gain index for the currently loaded Rx2 Gain table
- 195, // Min gain index for the currently loaded Rx2 Gain table
- 0, // Stores Rx1 RSSI value read back from the Mykonos
- 0 // Stores Rx2 RSSI value read back from the Mykonos
+static const mykonosRxGainControl_t DEFAULT_RX_GAIN = {
+ MGC, // Current Rx gain control mode setting
+ 255, // Rx1 Gain Index, can be used in different ways for manual and AGC gain control
+ 255, // Rx2 Gain Index, can be used in different ways for manual and AGC gain control
+ 255, // Max gain index for the currently loaded Rx1 Gain table
+ 195, // Min gain index for the currently loaded Rx1 Gain table
+ 255, // Max gain index for the currently loaded Rx2 Gain table
+ 195, // Min gain index for the currently loaded Rx2 Gain table
+ 0, // Stores Rx1 RSSI value read back from the Mykonos
+ 0 // Stores Rx2 RSSI value read back from the Mykonos
};
-static const mykonosPeakDetAgcCfg_t DEFAULT_RX_PEAK_AGC =
-{
- 0x1F, // apdHighThresh:
- 0x16, // apdLowThresh
- 0xB5, // hb2HighThresh
- 0x80, // hb2LowThresh
- 0x40, // hb2VeryLowThresh
- 0x06, // apdHighThreshExceededCnt
- 0x04, // apdLowThreshExceededCnt
- 0x06, // hb2HighThreshExceededCnt
- 0x04, // hb2LowThreshExceededCnt
- 0x04, // hb2VeryLowThreshExceededCnt
- 0x4, // apdHighGainStepAttack
- 0x2, // apdLowGainStepRecovery
- 0x4, // hb2HighGainStepAttack
- 0x2, // hb2LowGainStepRecovery
- 0x4, // hb2VeryLowGainStepRecovery
- 0x1, // apdFastAttack
- 0x1, // hb2FastAttack
- 0x1, // hb2OverloadDetectEnable
- 0x1, // hb2OverloadDurationCnt
- 0x1 // hb2OverloadThreshCnt
+static const mykonosPeakDetAgcCfg_t DEFAULT_RX_PEAK_AGC = {
+ 0x1F, // apdHighThresh:
+ 0x16, // apdLowThresh
+ 0xB5, // hb2HighThresh
+ 0x80, // hb2LowThresh
+ 0x40, // hb2VeryLowThresh
+ 0x06, // apdHighThreshExceededCnt
+ 0x04, // apdLowThreshExceededCnt
+ 0x06, // hb2HighThreshExceededCnt
+ 0x04, // hb2LowThreshExceededCnt
+ 0x04, // hb2VeryLowThreshExceededCnt
+ 0x4, // apdHighGainStepAttack
+ 0x2, // apdLowGainStepRecovery
+ 0x4, // hb2HighGainStepAttack
+ 0x2, // hb2LowGainStepRecovery
+ 0x4, // hb2VeryLowGainStepRecovery
+ 0x1, // apdFastAttack
+ 0x1, // hb2FastAttack
+ 0x1, // hb2OverloadDetectEnable
+ 0x1, // hb2OverloadDurationCnt
+ 0x1 // hb2OverloadThreshCnt
};
-static const mykonosPowerMeasAgcCfg_t DEFAULT_RX_POWER_AGC =
-{
- 0x01, // pmdUpperHighThresh
- 0x03, // pmdUpperLowThresh
- 0x0C, // pmdLowerHighThresh
- 0x04, // pmdLowerLowThresh
- 0x4, // pmdUpperHighGainStepAttack
- 0x2, // pmdUpperLowGainStepAttack
- 0x2, // pmdLowerHighGainStepRecovery
- 0x4, // pmdLowerLowGainStepRecovery
- 0x08, // pmdMeasDuration
- 0x02 // pmdMeasConfig
+static const mykonosPowerMeasAgcCfg_t DEFAULT_RX_POWER_AGC = {
+ 0x01, // pmdUpperHighThresh
+ 0x03, // pmdUpperLowThresh
+ 0x0C, // pmdLowerHighThresh
+ 0x04, // pmdLowerLowThresh
+ 0x4, // pmdUpperHighGainStepAttack
+ 0x2, // pmdUpperLowGainStepAttack
+ 0x2, // pmdLowerHighGainStepRecovery
+ 0x4, // pmdLowerLowGainStepRecovery
+ 0x08, // pmdMeasDuration
+ 0x02 // pmdMeasConfig
};
-static const mykonosAgcCfg_t DEFAULT_RX_AGC_CTRL =
-{
- 255, // AGC peak wait time
- 195, // agcRx1MinGainIndex
- 255, // agcRx2MaxGainIndex
- 195, // agcRx2MinGainIndex:
- 255, // agcObsRxMaxGainIndex
- 203, // agcObsRxMinGainIndex
- 1, // agcObsRxSelect
- 1, // agcPeakThresholdMode
- 1, // agcLowThsPreventGainIncrease
- 30720, // agcGainUpdateCounter
- 3, // agcSlowLoopSettlingDelay
- 2, // agcPeakWaitTime
- 0, // agcResetOnRxEnable
- 0, // agcEnableSyncPulseForGainCounter
- nullptr,// *peakAgc
+static const mykonosAgcCfg_t DEFAULT_RX_AGC_CTRL = {
+ 255, // AGC peak wait time
+ 195, // agcRx1MinGainIndex
+ 255, // agcRx2MaxGainIndex
+ 195, // agcRx2MinGainIndex:
+ 255, // agcObsRxMaxGainIndex
+ 203, // agcObsRxMinGainIndex
+ 1, // agcObsRxSelect
+ 1, // agcPeakThresholdMode
+ 1, // agcLowThsPreventGainIncrease
+ 30720, // agcGainUpdateCounter
+ 3, // agcSlowLoopSettlingDelay
+ 2, // agcPeakWaitTime
+ 0, // agcResetOnRxEnable
+ 0, // agcEnableSyncPulseForGainCounter
+ nullptr, // *peakAgc
nullptr // *powerAgc
};
-static const mykonosTxSettings_t DEFAULT_TX_SETTINGS =
-{
- nullptr, // Tx datapath profile, 3dB corner frequencies, and digital filter enables
- nullptr, // Mykonos JESD204b deframer config for the Tx data path
- TX1_TX2, // The desired Tx channels to enable during initialization
- 0, // Internal LO=0, external LO*2 if =1
- 3500000000U, // Tx PLL LO frequency (internal or external LO)
- TXATTEN_0P05_DB,// Initial and current Tx1 Attenuation
- 10000, // Initial and current Tx1 Attenuation mdB
- 10000, // Initial and current Tx2 Attenuation mdB
- nullptr, // DPD,CLGC,VSWR settings. Only valid for AD9373 device, set pointer to NULL otherwise
- nullptr, // CLGC Config Structure. Only valid for AD9373 device, set pointer to NULL otherwise
- nullptr // VSWR Config Structure. Only valid for AD9373 device, set pointer to NULL otherwise
+static const mykonosTxSettings_t DEFAULT_TX_SETTINGS = {
+ nullptr, // Tx datapath profile, 3dB corner frequencies, and digital filter enables
+ nullptr, // Mykonos JESD204b deframer config for the Tx data path
+ TX1_TX2, // The desired Tx channels to enable during initialization
+ 0, // Internal LO=0, external LO*2 if =1
+ 3500000000U, // Tx PLL LO frequency (internal or external LO)
+ TXATTEN_0P05_DB, // Initial and current Tx1 Attenuation
+ 10000, // Initial and current Tx1 Attenuation mdB
+ 10000, // Initial and current Tx2 Attenuation mdB
+ nullptr, // DPD,CLGC,VSWR settings. Only valid for AD9373 device, set pointer to NULL
+ // otherwise
+ nullptr, // CLGC Config Structure. Only valid for AD9373 device, set pointer to NULL
+ // otherwise
+ nullptr // VSWR Config Structure. Only valid for AD9373 device, set pointer to NULL
+ // otherwise
};
-static const mykonosTxProfile_t DEFAULT_TX_PROFILE =
-{ // Tx 20/100MHz, IQrate 122.88MHz, Dec5
- DACDIV_2p5, // The divider used to generate the DAC clock
- nullptr, // Pointer to Tx FIR filter structure
- 2, // The Tx digital FIR filter interpolation (1,2,4)
- 2, // Tx Halfband1 filter interpolation (1,2)
- 1, // Tx Halfband2 filter interpolation (1,2)
- 1, // TxInputHbInterpolation (1,2)
- 125000, // Tx IQ data rate in kHz
- 20000000, // Primary Signal BW
- 102000000, // The Tx RF passband bandwidth for the profile
- 722000, // The DAC filter 3dB corner in kHz
- 51000, // Tx BBF 3dB corner in kHz
- 0 // Enable DPD, only valid for AD9373
+static const mykonosTxProfile_t DEFAULT_TX_PROFILE = {
+ // Tx 20/100MHz, IQrate 122.88MHz, Dec5
+ DACDIV_2p5, // The divider used to generate the DAC clock
+ nullptr, // Pointer to Tx FIR filter structure
+ 2, // The Tx digital FIR filter interpolation (1,2,4)
+ 2, // Tx Halfband1 filter interpolation (1,2)
+ 1, // Tx Halfband2 filter interpolation (1,2)
+ 1, // TxInputHbInterpolation (1,2)
+ 125000, // Tx IQ data rate in kHz
+ 20000000, // Primary Signal BW
+ 102000000, // The Tx RF passband bandwidth for the profile
+ 722000, // The DAC filter 3dB corner in kHz
+ 51000, // Tx BBF 3dB corner in kHz
+ 0 // Enable DPD, only valid for AD9373
};
-static const mykonosJesd204bDeframerConfig_t DEFAULT_DEFRAMER =
-{
- 0, // bankId extension to Device ID (Valid 0..15)
- 0, // deviceId link identification number. (Valid 0..255)
- 0, // lane0Id Lane0 ID. (Valid 0..31)
- 4, // M number of DACss (0, 2, or 4) - 2 DACs per transmit chain
- 20, // K #frames in a multiframe (default=32), F*K=multiple of 4. (F=2*M/numberOfLanes)
- 0, // Scrambling off if scramble = 0, if framerScramble > 0 scrambling is enabled
- 1, // External SYSREF select. 0 = use internal SYSREF, 1 = external SYSREF
- 0x0F, // Deserializer lane select bit field. Where, [0] = Lane0 enabled, [1] = Lane1 enabled, etc
- 0xD2, // Lane crossbar to map physical lanes to deframer lane inputs [1:0] = Deframer Input 0 Lane section, [3:2] = Deframer Input 1 lane select, etc
- 1, // Equalizer setting. Applied to all deserializer lanes. Range is 0..4
- 0, // PN inversion per each lane. bit[0] = 1 Invert PN of Lane 0, bit[1] = Invert PN of Lane 1, etc).
- 0, // LMFC offset value to adjust deterministic latency. Range is 0..31
- 0, // Flag for determining if SYSREF on relink should be set. Where, if > 0 = set, '0' = not set
- 0, // Flag for determining if auto channel select for the xbar should be set. Where, if > 0 = set, '0' = not set
- 1, // Flag for determining if CMOS mode for TX Sync signal is used. Where, if > 0 = CMOS, '0' = LVDS
- 1, // Flag for determining if API will calculate the appropriate settings for deframer lane in to physical lanes. Where, if '0' = API will set automatic lane crossbar, '1' = set to manual mode and the value in deserializerLaneCrossbar will be used
+static const mykonosJesd204bDeframerConfig_t DEFAULT_DEFRAMER = {
+ 0, // bankId extension to Device ID (Valid 0..15)
+ 0, // deviceId link identification number. (Valid 0..255)
+ 0, // lane0Id Lane0 ID. (Valid 0..31)
+ 4, // M number of DACss (0, 2, or 4) - 2 DACs per transmit chain
+ 20, // K #frames in a multiframe (default=32), F*K=multiple of 4.
+ // (F=2*M/numberOfLanes)
+ 0, // Scrambling off if scramble = 0, if framerScramble > 0 scrambling is enabled
+ 1, // External SYSREF select. 0 = use internal SYSREF, 1 = external SYSREF
+ 0x0F, // Deserializer lane select bit field. Where, [0] = Lane0 enabled, [1] = Lane1
+ // enabled, etc
+ 0xD2, // Lane crossbar to map physical lanes to deframer lane inputs [1:0] = Deframer
+ // Input 0 Lane section, [3:2] = Deframer Input 1 lane select, etc
+ 1, // Equalizer setting. Applied to all deserializer lanes. Range is 0..4
+ 0, // PN inversion per each lane. bit[0] = 1 Invert PN of Lane 0, bit[1] = Invert PN
+ // of Lane 1, etc).
+ 0, // LMFC offset value to adjust deterministic latency. Range is 0..31
+ 0, // Flag for determining if SYSREF on relink should be set. Where, if > 0 = set, '0'
+ // = not set
+ 0, // Flag for determining if auto channel select for the xbar should be set. Where,
+ // if > 0 = set, '0' = not set
+ 1, // Flag for determining if CMOS mode for TX Sync signal is used. Where, if > 0 =
+ // CMOS, '0' = LVDS
+ 1, // Flag for determining if API will calculate the appropriate settings for deframer
+ // lane in to physical lanes. Where, if '0' = API will set automatic lane crossbar,
+ // '1' = set to manual mode and the value in deserializerLaneCrossbar will be used
};
-static const mykonosObsRxSettings_t DEFAULT_ORX_SETTINGS =
-{
- nullptr, // ORx datapath profile, 3dB corner frequencies, and digital filter enables
- nullptr, // ObsRx gain control settings structure
- nullptr, // ORx AGC control settings structure
- nullptr, // Sniffer datapath profile, 3dB corner frequencies, and digital filter enables
- nullptr, // SnRx gain control settings structure
- nullptr, // ObsRx JESD204b framer configuration structure
- MYK_ORX1, // obsRxChannel TODO: fix this garbage please
- OBSLO_TX_PLL, // (obsRxLoSource) The Obs Rx mixer can use the Tx Synth(TX_PLL) or Sniffer Synth (SNIFFER_PLL)
- 2600000000U, // SnRx PLL LO frequency in Hz
- 0, // Flag to choose if complex baseband or real IF data are selected for Rx and ObsRx paths. Where if > 0 = real IF data, '0' = complex data
- nullptr, // Custom Loopback ADC profile to set the bandwidth of the ADC response
- OBS_RXOFF // Default ObsRx channel to enter when radioOn called
+static const mykonosObsRxSettings_t DEFAULT_ORX_SETTINGS = {
+ nullptr, // ORx datapath profile, 3dB corner frequencies, and digital filter enables
+ nullptr, // ObsRx gain control settings structure
+ nullptr, // ORx AGC control settings structure
+ nullptr, // Sniffer datapath profile, 3dB corner frequencies, and digital filter
+ // enables
+ nullptr, // SnRx gain control settings structure
+ nullptr, // ObsRx JESD204b framer configuration structure
+ MYK_ORX1, // obsRxChannel TODO: fix this garbage please
+ OBSLO_TX_PLL, // (obsRxLoSource) The Obs Rx mixer can use the Tx Synth(TX_PLL) or
+ // Sniffer Synth (SNIFFER_PLL)
+ 2600000000U, // SnRx PLL LO frequency in Hz
+ 0, // Flag to choose if complex baseband or real IF data are selected for Rx and ObsRx
+ // paths. Where if > 0 = real IF data, '0' = complex data
+ nullptr, // Custom Loopback ADC profile to set the bandwidth of the ADC response
+ OBS_RXOFF // Default ObsRx channel to enter when radioOn called
};
-static const mykonosJesd204bFramerConfig_t DEFAULT_ORX_FRAMER =
-{
- 0, // JESD204B Configuration Bank ID -extension to Device ID (Valid 0..15)
- 0, // JESD204B Configuration Device ID - link identification number. (Valid 0..255)
- 0, // JESD204B Configuration starting Lane ID. If more than one lane used, each lane will increment from the Lane0 ID. (Valid 0..31)
- 2, // number of ADCs (0, 2, or 4) - 2 ADCs per receive chain
- 32, // number of frames in a multiframe (default=32), F*K must be a multiple of 4. (F=2*M/numberOfLanes)
- 1, // scrambling off if framerScramble= 0, if framerScramble>0 scramble is enabled.
- 1, // 0=use internal SYSREF, 1= use external SYSREF
- 0x00, // serializerLanesEnabled - bit per lane, [0] = Lane0 enabled, [1] = Lane1 enabled
- 0xE4, // Lane crossbar to map framer lane outputs to physical lanes
- 22, // serializerAmplitude - default 22 (valid (0-31)
- 4, // preEmphasis - < default 4 (valid 0 - 7)
- 0, // invertLanePolarity - default 0 ([0] will invert lane [0], bit1 will invert lane1)
- 0, // lmfcOffset - LMFC_Offset offset value for deterministic latency setting
- 0, // Flag for determining if SYSREF on relink should be set. Where, if > 0 = set, 0 = not set
- 0, // Flag for determining if auto channel select for the xbar should be set. Where, if > 0 = set, '0' = not set
- 1, // Selects SYNCb input source. Where, 0 = use RXSYNCB for this framer, 1 = use OBSRX_SYNCB for this framer
- 0, // Flag for determining if CMOS mode for RX Sync signal is used. Where, if > 0 = CMOS, '0' = LVDS
- 1, // Selects framer bit repeat or oversampling mode for lane rate matching. Where, 0 = bitRepeat mode (changes effective lanerate), 1 = overSample (maintains same lane rate between ObsRx framer and Rx framer and oversamples the ADC samples)
- 1 // Flag for determining if API will calculate the appropriate settings for framer lane outputs to physical lanes. Where, if '0' = API will set automatic lane crossbar, '1' = set to manual mode and the value in serializerLaneCrossbar will be used
+static const mykonosJesd204bFramerConfig_t DEFAULT_ORX_FRAMER = {
+ 0, // JESD204B Configuration Bank ID -extension to Device ID (Valid 0..15)
+ 0, // JESD204B Configuration Device ID - link identification number. (Valid 0..255)
+ 0, // JESD204B Configuration starting Lane ID. If more than one lane used, each lane
+ // will increment from the Lane0 ID. (Valid 0..31)
+ 2, // number of ADCs (0, 2, or 4) - 2 ADCs per receive chain
+ 32, // number of frames in a multiframe (default=32), F*K must be a multiple of 4.
+ // (F=2*M/numberOfLanes)
+ 1, // scrambling off if framerScramble= 0, if framerScramble>0 scramble is enabled.
+ 1, // 0=use internal SYSREF, 1= use external SYSREF
+ 0x00, // serializerLanesEnabled - bit per lane, [0] = Lane0 enabled, [1] = Lane1
+ // enabled
+ 0xE4, // Lane crossbar to map framer lane outputs to physical lanes
+ 22, // serializerAmplitude - default 22 (valid (0-31)
+ 4, // preEmphasis - < default 4 (valid 0 - 7)
+ 0, // invertLanePolarity - default 0 ([0] will invert lane [0], bit1 will invert
+ // lane1)
+ 0, // lmfcOffset - LMFC_Offset offset value for deterministic latency setting
+ 0, // Flag for determining if SYSREF on relink should be set. Where, if > 0 = set, 0 =
+ // not set
+ 0, // Flag for determining if auto channel select for the xbar should be set. Where,
+ // if > 0 = set, '0' = not set
+ 1, // Selects SYNCb input source. Where, 0 = use RXSYNCB for this framer, 1 = use
+ // OBSRX_SYNCB for this framer
+ 0, // Flag for determining if CMOS mode for RX Sync signal is used. Where, if > 0 =
+ // CMOS, '0' = LVDS
+ 1, // Selects framer bit repeat or oversampling mode for lane rate matching. Where, 0
+ // = bitRepeat mode (changes effective lanerate), 1 = overSample (maintains same
+ // lane rate between ObsRx framer and Rx framer and oversamples the ADC samples)
+ 1 // Flag for determining if API will calculate the appropriate settings for framer
+ // lane outputs to physical lanes. Where, if '0' = API will set automatic lane
+ // crossbar, '1' = set to manual mode and the value in serializerLaneCrossbar will
+ // be used
};
-static const mykonosORxGainControl_t DEFAULT_ORX_GAIN =
-{
- MGC, // Current ORx gain control mode setting
- 255, // ORx1 Gain Index, can be used in different ways for manual and AGC gain control
- 255, // ORx2 Gain Index, can be used in different ways for manual and AGC gain control
- 255, // Max gain index for the currently loaded ORx Gain table
- 237 // Min gain index for the currently loaded ORx Gain table
+static const mykonosORxGainControl_t DEFAULT_ORX_GAIN = {
+ MGC, // Current ORx gain control mode setting
+ 255, // ORx1 Gain Index, can be used in different ways for manual and AGC gain control
+ 255, // ORx2 Gain Index, can be used in different ways for manual and AGC gain control
+ 255, // Max gain index for the currently loaded ORx Gain table
+ 237 // Min gain index for the currently loaded ORx Gain table
};
-static const mykonosAgcCfg_t DEFAULT_ORX_AGC_CTRL =
-{
- 255, // agcRx1MaxGainIndex
- 195, // agcRx1MinGainIndex
- 255, // agcRx2MaxGainIndex
- 195, // agcRx2MinGainIndex:
- 255, // agcObsRxMaxGainIndex
- 203, // agcObsRxMinGainIndex
- 1, // agcObsRxSelect
- 1, // agcPeakThresholdMode
- 1, // agcLowThsPreventGainIncrease
- 30720, // agcGainUpdateCounter
- 3, // agcSlowLoopSettlingDelay
- 4, // agcPeakWaitTime
- 0, // agcResetOnRxEnable
- 0, // agcEnableSyncPulseForGainCounter
- nullptr,// *peakAgc
+static const mykonosAgcCfg_t DEFAULT_ORX_AGC_CTRL = {
+ 255, // agcRx1MaxGainIndex
+ 195, // agcRx1MinGainIndex
+ 255, // agcRx2MaxGainIndex
+ 195, // agcRx2MinGainIndex:
+ 255, // agcObsRxMaxGainIndex
+ 203, // agcObsRxMinGainIndex
+ 1, // agcObsRxSelect
+ 1, // agcPeakThresholdMode
+ 1, // agcLowThsPreventGainIncrease
+ 30720, // agcGainUpdateCounter
+ 3, // agcSlowLoopSettlingDelay
+ 4, // agcPeakWaitTime
+ 0, // agcResetOnRxEnable
+ 0, // agcEnableSyncPulseForGainCounter
+ nullptr, // *peakAgc
nullptr // *powerAgc
};
-static const mykonosPeakDetAgcCfg_t DEFAULT_ORX_PEAK_AGC =
-{
- 0x2A, // apdHighThresh:
- 0x16, // apdLowThresh
- 0xB5, // hb2HighThresh
- 0x72, // hb2LowThresh
- 0x40, // hb2VeryLowThresh
- 0x03, // apdHighThreshExceededCnt
- 0x03, // apdLowThreshExceededCnt
- 0x03, // hb2HighThreshExceededCnt
- 0x03, // hb2LowThreshExceededCnt
- 0x03, // hb2VeryLowThreshExceededCnt
- 0x4, // apdHighGainStepAttack
- 0x2, // apdLowGainStepRecovery
- 0x4, // hb2HighGainStepAttack
- 0x2, // hb2LowGainStepRecovery
- 0x4, // hb2VeryLowGainStepRecovery
- 0x0, // apdFastAttack
- 0x0, // hb2FastAttack
- 0x1, // hb2OverloadDetectEnable
- 0x1, // hb2OverloadDurationCnt
- 0x1 // hb2OverloadThreshCnt
+static const mykonosPeakDetAgcCfg_t DEFAULT_ORX_PEAK_AGC = {
+ 0x2A, // apdHighThresh:
+ 0x16, // apdLowThresh
+ 0xB5, // hb2HighThresh
+ 0x72, // hb2LowThresh
+ 0x40, // hb2VeryLowThresh
+ 0x03, // apdHighThreshExceededCnt
+ 0x03, // apdLowThreshExceededCnt
+ 0x03, // hb2HighThreshExceededCnt
+ 0x03, // hb2LowThreshExceededCnt
+ 0x03, // hb2VeryLowThreshExceededCnt
+ 0x4, // apdHighGainStepAttack
+ 0x2, // apdLowGainStepRecovery
+ 0x4, // hb2HighGainStepAttack
+ 0x2, // hb2LowGainStepRecovery
+ 0x4, // hb2VeryLowGainStepRecovery
+ 0x0, // apdFastAttack
+ 0x0, // hb2FastAttack
+ 0x1, // hb2OverloadDetectEnable
+ 0x1, // hb2OverloadDurationCnt
+ 0x1 // hb2OverloadThreshCnt
};
-static const mykonosPowerMeasAgcCfg_t DEFAULT_ORX_POWER_AGC =
-{
- 0x01, // pmdUpperHighThresh
- 0x03, // pmdUpperLowThresh
- 0x0C, // pmdLowerHighThresh
- 0x04, // pmdLowerLowThresh
- 0x0, // pmdUpperHighGainStepAttack
- 0x0, // pmdUpperLowGainStepAttack
- 0x0, // pmdLowerHighGainStepRecovery
- 0x0, // pmdLowerLowGainStepRecovery
- 0x08, // pmdMeasDuration
- 0x02 // pmdMeasConfig
+static const mykonosPowerMeasAgcCfg_t DEFAULT_ORX_POWER_AGC = {
+ 0x01, // pmdUpperHighThresh
+ 0x03, // pmdUpperLowThresh
+ 0x0C, // pmdLowerHighThresh
+ 0x04, // pmdLowerLowThresh
+ 0x0, // pmdUpperHighGainStepAttack
+ 0x0, // pmdUpperLowGainStepAttack
+ 0x0, // pmdLowerHighGainStepRecovery
+ 0x0, // pmdLowerLowGainStepRecovery
+ 0x08, // pmdMeasDuration
+ 0x02 // pmdMeasConfig
};
-static const mykonosSnifferGainControl_t DEFAULT_SNIFFER_GAIN =
-{
- MGC, // Current Sniffer gain control mode setting
- 255, // Current Sniffer gain index. Can be used differently for Manual Gain control/AGC
- 255, // Max gain index for the currently loaded Sniffer Gain table
- 203 // Min gain index for the currently loaded Sniffer Gain table
+static const mykonosSnifferGainControl_t DEFAULT_SNIFFER_GAIN = {
+ MGC, // Current Sniffer gain control mode setting
+ 255, // Current Sniffer gain index. Can be used differently for Manual Gain
+ // control/AGC
+ 255, // Max gain index for the currently loaded Sniffer Gain table
+ 203 // Min gain index for the currently loaded Sniffer Gain table
};
-static const mykonosRxProfile_t DEFAULT_ORX_PROFILE =
-{// ORX 100MHz, IQrate 125MSPS, Dec5
- 1, // The divider used to generate the ADC clock
- nullptr, // Pointer to Rx FIR filter structure or NULL
- 2, // Rx FIR decimation (1,2,4)
- 5, // Decimation of Dec5 or Dec4 filter (5,4)
- 0, // If set, and DEC5 filter used, will use a higher rejection DEC5 FIR filter (1=Enabled, 0=Disabled)
- 1, // RX Half band 1 decimation (1 or 2)
- 125000, // Rx IQ data rate in kHz
- 100000000, // The Rx RF passband bandwidth for the profile
- 102000, // Rx BBF 3dB corner in kHz
- nullptr // pointer to custom ADC profile
+static const mykonosRxProfile_t DEFAULT_ORX_PROFILE = {
+ // ORX 100MHz, IQrate 125MSPS, Dec5
+ 1, // The divider used to generate the ADC clock
+ nullptr, // Pointer to Rx FIR filter structure or NULL
+ 2, // Rx FIR decimation (1,2,4)
+ 5, // Decimation of Dec5 or Dec4 filter (5,4)
+ 0, // If set, and DEC5 filter used, will use a higher rejection DEC5 FIR filter
+ // (1=Enabled, 0=Disabled)
+ 1, // RX Half band 1 decimation (1 or 2)
+ 125000, // Rx IQ data rate in kHz
+ 100000000, // The Rx RF passband bandwidth for the profile
+ 102000, // Rx BBF 3dB corner in kHz
+ nullptr // pointer to custom ADC profile
};
-static const mykonosArmGpioConfig_t DEFAULT_ARM_GPIO =
-{
- 1, // useRx2EnablePin; //!< 0= RX1_ENABLE controls RX1 and RX2, 1 = separate RX1_ENABLE/RX2_ENABLE pins
- 1, // useTx2EnablePin; //!< 0= TX1_ENABLE controls TX1 and TX2, 1 = separate TX1_ENABLE/TX2_ENABLE pins
- 0, // txRxPinMode; //!< 0= ARM command mode, 1 = Pin mode to power up Tx/Rx chains
- 0, // orxPinMode; //!< 0= ARM command mode, 1 = Pin mode to power up ObsRx receiver
+static const mykonosArmGpioConfig_t DEFAULT_ARM_GPIO = {
+ 1, // useRx2EnablePin; //!< 0= RX1_ENABLE controls RX1 and RX2, 1 = separate
+ // RX1_ENABLE/RX2_ENABLE pins
+ 1, // useTx2EnablePin; //!< 0= TX1_ENABLE controls TX1 and TX2, 1 = separate
+ // TX1_ENABLE/TX2_ENABLE pins
+ 0, // txRxPinMode; //!< 0= ARM command mode, 1 = Pin mode to power up Tx/Rx chains
+ 0, // orxPinMode; //!< 0= ARM command mode, 1 = Pin mode to power up ObsRx
+ // receiver
- //Mykonos ARM input GPIO pins -- Only valid if orxPinMode = 1
- 0, // orxTriggerPin; //!< Select desired GPIO pin (valid 4-15)
- 0, // orxMode2Pin; //!< Select desired GPIO pin (valid 0-18)
- 0, // orxMode1Pin; //!< Select desired GPIO pin (valid 0-18)
- 0, // orxMode0Pin; //!< Select desired GPIO pin (valid 0-18)
+ // Mykonos ARM input GPIO pins -- Only valid if orxPinMode = 1
+ 0, // orxTriggerPin; //!< Select desired GPIO pin (valid 4-15)
+ 0, // orxMode2Pin; //!< Select desired GPIO pin (valid 0-18)
+ 0, // orxMode1Pin; //!< Select desired GPIO pin (valid 0-18)
+ 0, // orxMode0Pin; //!< Select desired GPIO pin (valid 0-18)
// Mykonos ARM output GPIO pins -- always available, even when pin mode not enabled
- 0, // rx1EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
- 0, // rx2EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
- 0, // tx1EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
- 0, // tx2EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
- 0, // orx1EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
- 0, // orx2EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
- 0, // srxEnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
- 0 // txObsSelect; //!< Select desired GPIO pin (0-15), [4] = Output Enable
- // When 2Tx are used with only 1 ORx input, this GPIO tells the BBIC which Tx channel is
- // active for calibrations, so BBIC can route correct RF Tx path into the single ORx input
+ 0, // rx1EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
+ 0, // rx2EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
+ 0, // tx1EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
+ 0, // tx2EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
+ 0, // orx1EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
+ 0, // orx2EnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
+ 0, // srxEnableAck; //!< Select desired GPIO pin (0-15), [4] = Output Enable
+ 0 // txObsSelect; //!< Select desired GPIO pin (0-15), [4] = Output Enable
+ // When 2Tx are used with only 1 ORx input, this GPIO tells the BBIC which Tx
+ // channel is active for calibrations, so BBIC can route correct RF Tx path into the
+ // single ORx input
};
-static const mykonosGpio3v3_t DEFAULT_GPIO_3V3 =
-{
- 0, //!< Oe per pin, 1=output, 0 = input
- GPIO3V3_BITBANG_MODE, //!< Mode for GPIO3V3[3:0]
- GPIO3V3_BITBANG_MODE, //!< Mode for GPIO3V3[7:4]
- GPIO3V3_BITBANG_MODE, //!< Mode for GPIO3V3[11:8]
+static const mykonosGpio3v3_t DEFAULT_GPIO_3V3 = {
+ 0, //!< Oe per pin, 1=output, 0 = input
+ GPIO3V3_BITBANG_MODE, //!< Mode for GPIO3V3[3:0]
+ GPIO3V3_BITBANG_MODE, //!< Mode for GPIO3V3[7:4]
+ GPIO3V3_BITBANG_MODE, //!< Mode for GPIO3V3[11:8]
};
-static const mykonosGpioLowVoltage_t DEFAULT_GPIO =
-{
- 0, // Oe per pin, 1=output, 0 = input
- GPIO_MONITOR_MODE, // Mode for GPIO[3:0]
- GPIO_MONITOR_MODE, // Mode for GPIO[7:4]
- GPIO_MONITOR_MODE, // Mode for GPIO[11:8]
- GPIO_MONITOR_MODE, // Mode for GPIO[15:12]
- GPIO_MONITOR_MODE, // Mode for GPIO[18:16]
+static const mykonosGpioLowVoltage_t DEFAULT_GPIO = {
+ 0, // Oe per pin, 1=output, 0 = input
+ GPIO_MONITOR_MODE, // Mode for GPIO[3:0]
+ GPIO_MONITOR_MODE, // Mode for GPIO[7:4]
+ GPIO_MONITOR_MODE, // Mode for GPIO[11:8]
+ GPIO_MONITOR_MODE, // Mode for GPIO[15:12]
+ GPIO_MONITOR_MODE, // Mode for GPIO[18:16]
};
-static const mykonosAuxIo_t DEFAULT_AUX_IO =
-{
- 0, // auxDacEnable uint16_t
- { 0,0,0,0,0,0,0,0,0,0 }, // auxDacValue uint16[10]
- { 0,0,0,0,0,0,0,0,0,0 }, // auxDacSlope uint8[10]
- { 0,0,0,0,0,0,0,0,0,0 }, // auxDacVref uint8[10]
- nullptr, // *mykonosGpio3v3_t
- nullptr, // *mykonosGpioLowVoltage_t
- nullptr // *mykonosArmGpioConfig_t
+static const mykonosAuxIo_t DEFAULT_AUX_IO = {
+ 0, // auxDacEnable uint16_t
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // auxDacValue uint16[10]
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // auxDacSlope uint8[10]
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // auxDacVref uint8[10]
+ nullptr, // *mykonosGpio3v3_t
+ nullptr, // *mykonosGpioLowVoltage_t
+ nullptr // *mykonosArmGpioConfig_t
};
-static const mykonosDigClocks_t DEFAULT_CLOCKS =
-{
- 125000, // CLKPLL and device reference clock frequency in kHz
- 10000000, // CLKPLL VCO frequency in kHz
- VCODIV_2, // CLKPLL VCO divider
- 4 // CLKPLL high speed clock divider
+static const mykonosDigClocks_t DEFAULT_CLOCKS = {
+ 125000, // CLKPLL and device reference clock frequency in kHz
+ 10000000, // CLKPLL VCO frequency in kHz
+ VCODIV_2, // CLKPLL VCO divider
+ 4 // CLKPLL high speed clock divider
};
-
-
diff --git a/mpm/lib/mykonos/config/ad937x_fir.cpp b/mpm/lib/mykonos/config/ad937x_fir.cpp
index 01c8772eb..6803f5369 100644
--- a/mpm/lib/mykonos/config/ad937x_fir.cpp
+++ b/mpm/lib/mykonos/config/ad937x_fir.cpp
@@ -6,21 +6,16 @@
#include "ad937x_fir.hpp"
-ad937x_fir::ad937x_fir() :
- ad937x_fir(0, { 1, 0 })
+ad937x_fir::ad937x_fir() : ad937x_fir(0, {1, 0}) {}
+
+ad937x_fir::ad937x_fir(int8_t gain, const std::vector<int16_t>& coefficients)
+ : // These two constructors will be run in the order they are declared in the class
+ // definition see C++ standard 12.6.2 section 13.3
+ _fir_coefficients(coefficients)
+ , _fir({gain,
+ static_cast<uint8_t>(_fir_coefficients.size()),
+ _fir_coefficients.data()})
{
-
-}
-
-ad937x_fir::ad937x_fir(int8_t gain, const std::vector<int16_t>& coefficients) :
- // These two constructors will be run in the order they are declared in the class definition
- // see C++ standard 12.6.2 section 13.3
- _fir_coefficients(coefficients),
- _fir({gain,
- static_cast<uint8_t>(_fir_coefficients.size()),
- _fir_coefficients.data()})
-{
-
}
// ad937x_fir.fir should not be accessed during this operation
@@ -29,11 +24,11 @@ void ad937x_fir::set_fir(int8_t gain, const std::vector<int16_t>& coefficients)
_fir.gain_dB = gain;
_fir_coefficients = coefficients;
- _fir.coefs = _fir_coefficients.data();
- _fir.numFirCoefs = static_cast<uint8_t>(_fir_coefficients.size());
+ _fir.coefs = _fir_coefficients.data();
+ _fir.numFirCoefs = static_cast<uint8_t>(_fir_coefficients.size());
}
-std::vector<int16_t> ad937x_fir::get_fir(int8_t &gain) const
+std::vector<int16_t> ad937x_fir::get_fir(int8_t& gain) const
{
gain = _fir.gain_dB;
return _fir_coefficients;
diff --git a/mpm/lib/mykonos/config/ad937x_fir.hpp b/mpm/lib/mykonos/config/ad937x_fir.hpp
index c3fda6fb7..df122701d 100644
--- a/mpm/lib/mykonos/config/ad937x_fir.hpp
+++ b/mpm/lib/mykonos/config/ad937x_fir.hpp
@@ -15,11 +15,12 @@ class ad937x_fir
{
std::vector<int16_t> _fir_coefficients;
mykonosFir_t _fir;
+
public:
mykonosFir_t* const fir = &_fir;
ad937x_fir();
ad937x_fir(int8_t gain, const std::vector<int16_t>& coefficients);
void set_fir(int8_t gain, const std::vector<int16_t>& coefficients);
- std::vector<int16_t> get_fir(int8_t &gain) const;
+ std::vector<int16_t> get_fir(int8_t& gain) const;
};
diff --git a/mpm/lib/mykonos/config/ad937x_gain_ctrl_config.cpp b/mpm/lib/mykonos/config/ad937x_gain_ctrl_config.cpp
index d4fbef0ad..bc8dcb21a 100644
--- a/mpm/lib/mykonos/config/ad937x_gain_ctrl_config.cpp
+++ b/mpm/lib/mykonos/config/ad937x_gain_ctrl_config.cpp
@@ -11,121 +11,158 @@ using namespace mpm::ad937x::device;
using namespace uhd;
const uint8_t ad937x_gain_ctrl_channel_t::DEFAULT_GAIN_STEP = 1;
-const bool ad937x_gain_ctrl_channel_t::DEFAULT_ENABLE = 0;
+const bool ad937x_gain_ctrl_channel_t::DEFAULT_ENABLE = 0;
// rx uses gain, tx uses attenuation
-enum class pin_direction_t
-{
+enum class pin_direction_t {
INCREASE,
DECREASE,
};
mykonosGpioSelect_t _convert_gain_pin(gain_pin_t pin)
{
- switch (pin)
- {
- case gain_pin_t::PIN0: return MYKGPIO0;
- case gain_pin_t::PIN1: return MYKGPIO1;
- case gain_pin_t::PIN2: return MYKGPIO2;
- case gain_pin_t::PIN3: return MYKGPIO3;
- case gain_pin_t::PIN4: return MYKGPIO4;
- case gain_pin_t::PIN5: return MYKGPIO5;
- case gain_pin_t::PIN6: return MYKGPIO6;
- case gain_pin_t::PIN7: return MYKGPIO7;
- case gain_pin_t::PIN8: return MYKGPIO8;
- case gain_pin_t::PIN9: return MYKGPIO9;
- case gain_pin_t::PIN10: return MYKGPIO10;
- case gain_pin_t::PIN11: return MYKGPIO11;
- case gain_pin_t::PIN12: return MYKGPIO12;
- case gain_pin_t::PIN13: return MYKGPIO13;
- case gain_pin_t::PIN14: return MYKGPIO14;
- case gain_pin_t::PIN15: return MYKGPIO15;
- case gain_pin_t::PIN16: return MYKGPIO16;
- case gain_pin_t::PIN17: return MYKGPIO17;
- case gain_pin_t::PIN18: return MYKGPIO18;
- default: return MYKGPIONAN;
+ switch (pin) {
+ case gain_pin_t::PIN0:
+ return MYKGPIO0;
+ case gain_pin_t::PIN1:
+ return MYKGPIO1;
+ case gain_pin_t::PIN2:
+ return MYKGPIO2;
+ case gain_pin_t::PIN3:
+ return MYKGPIO3;
+ case gain_pin_t::PIN4:
+ return MYKGPIO4;
+ case gain_pin_t::PIN5:
+ return MYKGPIO5;
+ case gain_pin_t::PIN6:
+ return MYKGPIO6;
+ case gain_pin_t::PIN7:
+ return MYKGPIO7;
+ case gain_pin_t::PIN8:
+ return MYKGPIO8;
+ case gain_pin_t::PIN9:
+ return MYKGPIO9;
+ case gain_pin_t::PIN10:
+ return MYKGPIO10;
+ case gain_pin_t::PIN11:
+ return MYKGPIO11;
+ case gain_pin_t::PIN12:
+ return MYKGPIO12;
+ case gain_pin_t::PIN13:
+ return MYKGPIO13;
+ case gain_pin_t::PIN14:
+ return MYKGPIO14;
+ case gain_pin_t::PIN15:
+ return MYKGPIO15;
+ case gain_pin_t::PIN16:
+ return MYKGPIO16;
+ case gain_pin_t::PIN17:
+ return MYKGPIO17;
+ case gain_pin_t::PIN18:
+ return MYKGPIO18;
+ default:
+ return MYKGPIONAN;
}
}
-ad937x_gain_ctrl_channel_t::ad937x_gain_ctrl_channel_t(mykonosGpioSelect_t inc_pin, mykonosGpioSelect_t dec_pin) :
- enable(DEFAULT_ENABLE),
- inc_step(DEFAULT_GAIN_STEP),
- dec_step(DEFAULT_GAIN_STEP),
- inc_pin(inc_pin),
- dec_pin(dec_pin)
+ad937x_gain_ctrl_channel_t::ad937x_gain_ctrl_channel_t(
+ mykonosGpioSelect_t inc_pin, mykonosGpioSelect_t dec_pin)
+ : enable(DEFAULT_ENABLE)
+ , inc_step(DEFAULT_GAIN_STEP)
+ , dec_step(DEFAULT_GAIN_STEP)
+ , inc_pin(inc_pin)
+ , dec_pin(dec_pin)
{
-
}
-mykonosGpioSelect_t _get_gain_pin(
- direction_t direction,
+mykonosGpioSelect_t _get_gain_pin(direction_t direction,
chain_t chain,
pin_direction_t pin_direction,
- const gain_pins_t & gain_pins)
+ const gain_pins_t& gain_pins)
{
- switch (direction)
- {
- case RX_DIRECTION:
- switch (chain)
- {
- case chain_t::ONE:
- switch (pin_direction)
- {
- case pin_direction_t::INCREASE: return _convert_gain_pin(gain_pins.rx1_inc_gain_pin);
- case pin_direction_t::DECREASE: return _convert_gain_pin(gain_pins.rx1_dec_gain_pin);
- }
- case chain_t::TWO:
- switch (pin_direction)
- {
- case pin_direction_t::INCREASE: return _convert_gain_pin(gain_pins.rx2_inc_gain_pin);
- case pin_direction_t::DECREASE: return _convert_gain_pin(gain_pins.rx2_dec_gain_pin);
+ switch (direction) {
+ case RX_DIRECTION:
+ switch (chain) {
+ case chain_t::ONE:
+ switch (pin_direction) {
+ case pin_direction_t::INCREASE:
+ return _convert_gain_pin(gain_pins.rx1_inc_gain_pin);
+ case pin_direction_t::DECREASE:
+ return _convert_gain_pin(gain_pins.rx1_dec_gain_pin);
+ }
+ case chain_t::TWO:
+ switch (pin_direction) {
+ case pin_direction_t::INCREASE:
+ return _convert_gain_pin(gain_pins.rx2_inc_gain_pin);
+ case pin_direction_t::DECREASE:
+ return _convert_gain_pin(gain_pins.rx2_dec_gain_pin);
+ }
}
- }
- // !!! TX is attenuation direction, so the pins are flipped !!!
- case TX_DIRECTION:
- switch (chain)
- {
- case chain_t::ONE:
- switch (pin_direction)
- {
- case pin_direction_t::INCREASE: return _convert_gain_pin(gain_pins.tx1_dec_gain_pin);
- case pin_direction_t::DECREASE: return _convert_gain_pin(gain_pins.tx1_inc_gain_pin);
+ // !!! TX is attenuation direction, so the pins are flipped !!!
+ case TX_DIRECTION:
+ switch (chain) {
+ case chain_t::ONE:
+ switch (pin_direction) {
+ case pin_direction_t::INCREASE:
+ return _convert_gain_pin(gain_pins.tx1_dec_gain_pin);
+ case pin_direction_t::DECREASE:
+ return _convert_gain_pin(gain_pins.tx1_inc_gain_pin);
+ }
+ case chain_t::TWO:
+ switch (pin_direction) {
+ case pin_direction_t::INCREASE:
+ return _convert_gain_pin(gain_pins.tx2_dec_gain_pin);
+ case pin_direction_t::DECREASE:
+ return _convert_gain_pin(gain_pins.tx2_inc_gain_pin);
+ }
}
- case chain_t::TWO:
- switch (pin_direction)
- {
- case pin_direction_t::INCREASE: return _convert_gain_pin(gain_pins.tx2_dec_gain_pin);
- case pin_direction_t::DECREASE: return _convert_gain_pin(gain_pins.tx2_inc_gain_pin);
- }
- }
- default:
- return MYKGPIONAN;
+ default:
+ return MYKGPIONAN;
}
}
ad937x_gain_ctrl_config_t::ad937x_gain_ctrl_config_t(gain_pins_t gain_pins)
{
- config.emplace(std::piecewise_construct, std::forward_as_tuple(RX_DIRECTION), std::forward_as_tuple());
- config.emplace(std::piecewise_construct, std::forward_as_tuple(TX_DIRECTION), std::forward_as_tuple());
+ config.emplace(std::piecewise_construct,
+ std::forward_as_tuple(RX_DIRECTION),
+ std::forward_as_tuple());
+ config.emplace(std::piecewise_construct,
+ std::forward_as_tuple(TX_DIRECTION),
+ std::forward_as_tuple());
- config.at(RX_DIRECTION).emplace(std::piecewise_construct, std::forward_as_tuple(chain_t::ONE),
- std::forward_as_tuple(
- _get_gain_pin(RX_DIRECTION, chain_t::ONE, pin_direction_t::INCREASE, gain_pins),
- _get_gain_pin(RX_DIRECTION, chain_t::ONE, pin_direction_t::DECREASE, gain_pins)));
- config.at(RX_DIRECTION).emplace(std::piecewise_construct, std::forward_as_tuple(chain_t::TWO),
- std::forward_as_tuple(
- _get_gain_pin(RX_DIRECTION, chain_t::TWO, pin_direction_t::INCREASE, gain_pins),
- _get_gain_pin(RX_DIRECTION, chain_t::TWO, pin_direction_t::DECREASE, gain_pins)));
+ config.at(RX_DIRECTION)
+ .emplace(std::piecewise_construct,
+ std::forward_as_tuple(chain_t::ONE),
+ std::forward_as_tuple(
+ _get_gain_pin(
+ RX_DIRECTION, chain_t::ONE, pin_direction_t::INCREASE, gain_pins),
+ _get_gain_pin(
+ RX_DIRECTION, chain_t::ONE, pin_direction_t::DECREASE, gain_pins)));
+ config.at(RX_DIRECTION)
+ .emplace(std::piecewise_construct,
+ std::forward_as_tuple(chain_t::TWO),
+ std::forward_as_tuple(
+ _get_gain_pin(
+ RX_DIRECTION, chain_t::TWO, pin_direction_t::INCREASE, gain_pins),
+ _get_gain_pin(
+ RX_DIRECTION, chain_t::TWO, pin_direction_t::DECREASE, gain_pins)));
- config.at(TX_DIRECTION).emplace(std::piecewise_construct, std::forward_as_tuple(chain_t::ONE),
- std::forward_as_tuple(
- _get_gain_pin(TX_DIRECTION, chain_t::ONE, pin_direction_t::INCREASE, gain_pins),
- _get_gain_pin(TX_DIRECTION, chain_t::ONE, pin_direction_t::DECREASE, gain_pins)));
- config.at(TX_DIRECTION).emplace(std::piecewise_construct, std::forward_as_tuple(chain_t::TWO),
- std::forward_as_tuple(
- _get_gain_pin(TX_DIRECTION, chain_t::TWO, pin_direction_t::INCREASE, gain_pins),
- _get_gain_pin(TX_DIRECTION, chain_t::TWO, pin_direction_t::DECREASE, gain_pins)));
+ config.at(TX_DIRECTION)
+ .emplace(std::piecewise_construct,
+ std::forward_as_tuple(chain_t::ONE),
+ std::forward_as_tuple(
+ _get_gain_pin(
+ TX_DIRECTION, chain_t::ONE, pin_direction_t::INCREASE, gain_pins),
+ _get_gain_pin(
+ TX_DIRECTION, chain_t::ONE, pin_direction_t::DECREASE, gain_pins)));
+ config.at(TX_DIRECTION)
+ .emplace(std::piecewise_construct,
+ std::forward_as_tuple(chain_t::TWO),
+ std::forward_as_tuple(
+ _get_gain_pin(
+ TX_DIRECTION, chain_t::TWO, pin_direction_t::INCREASE, gain_pins),
+ _get_gain_pin(
+ TX_DIRECTION, chain_t::TWO, pin_direction_t::DECREASE, gain_pins)));
}
-
diff --git a/mpm/lib/mykonos/config/ad937x_gain_ctrl_config.hpp b/mpm/lib/mykonos/config/ad937x_gain_ctrl_config.hpp
index 380efb0de..12851af92 100644
--- a/mpm/lib/mykonos/config/ad937x_gain_ctrl_config.hpp
+++ b/mpm/lib/mykonos/config/ad937x_gain_ctrl_config.hpp
@@ -8,31 +8,29 @@
#include "../ad937x_device_types.hpp"
#include "../adi/t_mykonos.h"
-
#include "mpm/ad937x/ad937x_ctrl_types.hpp"
-
-#include <vector>
#include <unordered_map>
+#include <vector>
-// C++14 requires std::hash includes a specialization for enums, but gcc doesn't do that yet
-// Remove this when that happens
+// C++14 requires std::hash includes a specialization for enums, but gcc doesn't do that
+// yet Remove this when that happens
namespace std {
- template <> struct hash<uhd::direction_t>
+template <> struct hash<uhd::direction_t>
+{
+ size_t operator()(const uhd::direction_t& x) const
{
- size_t operator()(const uhd::direction_t & x) const
- {
- return static_cast<std::size_t>(x);
- }
- };
+ return static_cast<std::size_t>(x);
+ }
+};
- template <> struct hash<mpm::ad937x::device::chain_t>
+template <> struct hash<mpm::ad937x::device::chain_t>
+{
+ size_t operator()(const mpm::ad937x::device::chain_t& x) const
{
- size_t operator()(const mpm::ad937x::device::chain_t & x) const
- {
- return static_cast<std::size_t>(x);
- }
- };
-}
+ return static_cast<std::size_t>(x);
+ }
+};
+} // namespace std
// collection of the 5 attributes that define the gain pins for a channel in Mykonos
struct ad937x_gain_ctrl_channel_t
@@ -54,9 +52,8 @@ private:
struct ad937x_gain_ctrl_config_t
{
std::unordered_map<uhd::direction_t,
- std::unordered_map<mpm::ad937x::device::chain_t, ad937x_gain_ctrl_channel_t>> config;
+ std::unordered_map<mpm::ad937x::device::chain_t, ad937x_gain_ctrl_channel_t>>
+ config;
ad937x_gain_ctrl_config_t(mpm::ad937x::gpio::gain_pins_t gain_pins);
};
-
-
diff --git a/mpm/lib/spi/spi_regs_iface.cpp b/mpm/lib/spi/spi_regs_iface.cpp
index a1b5d29f8..842f45d42 100644
--- a/mpm/lib/spi/spi_regs_iface.cpp
+++ b/mpm/lib/spi/spi_regs_iface.cpp
@@ -4,10 +4,10 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <mpm/types/regs_iface.hpp>
+#include <mpm/exception.hpp>
#include <mpm/spi/spi_iface.hpp>
#include <mpm/spi/spi_regs_iface.hpp>
-#include <mpm/exception.hpp>
+#include <mpm/types/regs_iface.hpp>
using mpm::types::regs_iface;
@@ -18,29 +18,23 @@ using mpm::types::regs_iface;
class spi_regs_iface_impl : public regs_iface
{
public:
-
- spi_regs_iface_impl(
- mpm::spi::spi_iface::sptr spi_iface,
+ spi_regs_iface_impl(mpm::spi::spi_iface::sptr spi_iface,
uint32_t addr_shift,
uint32_t data_shift,
uint32_t read_flags,
- uint32_t write_flags = 0
- ) : _spi_iface(spi_iface),
- _addr_shift(addr_shift),
- _data_shift(data_shift),
- _read_flags(read_flags),
- _write_flags(write_flags)
+ uint32_t write_flags = 0)
+ : _spi_iface(spi_iface)
+ , _addr_shift(addr_shift)
+ , _data_shift(data_shift)
+ , _read_flags(read_flags)
+ , _write_flags(write_flags)
{
/* nop */
}
- uint8_t peek8(
- const uint32_t addr
- ) {
- uint32_t transaction = 0
- | (addr << _addr_shift)
- | _read_flags
- ;
+ uint8_t peek8(const uint32_t addr)
+ {
+ uint32_t transaction = 0 | (addr << _addr_shift) | _read_flags;
uint32_t data = _spi_iface->transfer24_8(transaction);
if ((data & 0xFFFFFF00) != 0) {
@@ -50,26 +44,17 @@ public:
return data;
}
- void poke8(
- const uint32_t addr,
- const uint8_t data
- ) {
- uint32_t transaction = 0
- | _write_flags
- | (addr << _addr_shift)
- | (data << _data_shift)
- ;
+ void poke8(const uint32_t addr, const uint8_t data)
+ {
+ uint32_t transaction = 0 | _write_flags | (addr << _addr_shift)
+ | (data << _data_shift);
_spi_iface->transfer24_8(transaction);
}
- uint16_t peek16(
- const uint32_t addr
- ) {
- uint32_t transaction = 0
- | (addr << _addr_shift)
- | _read_flags
- ;
+ uint16_t peek16(const uint32_t addr)
+ {
+ uint32_t transaction = 0 | (addr << _addr_shift) | _read_flags;
uint32_t data = _spi_iface->transfer24_16(transaction);
if ((data & 0xFFFF0000) != 0) {
@@ -79,15 +64,10 @@ public:
return data;
}
- void poke16(
- const uint32_t addr,
- const uint16_t data
- ) {
- uint32_t transaction = 0
- | _write_flags
- | (addr << _addr_shift)
- | (data << _data_shift)
- ;
+ void poke16(const uint32_t addr, const uint16_t data)
+ {
+ uint32_t transaction = 0 | _write_flags | (addr << _addr_shift)
+ | (data << _data_shift);
_spi_iface->transfer24_16(transaction);
}
@@ -101,39 +81,25 @@ private:
uint32_t _write_flags;
};
-regs_iface::sptr mpm::spi::make_spi_regs_iface(
- mpm::spi::spi_iface::sptr spi_iface,
+regs_iface::sptr mpm::spi::make_spi_regs_iface(mpm::spi::spi_iface::sptr spi_iface,
uint32_t addr_shift,
uint32_t data_shift,
uint32_t read_flags,
- uint32_t write_flags
-) {
+ uint32_t write_flags)
+{
return std::make_shared<spi_regs_iface_impl>(
- spi_iface,
- addr_shift,
- data_shift,
- read_flags,
- write_flags
- );
+ spi_iface, addr_shift, data_shift, read_flags, write_flags);
}
-mpm::types::regs_iface::sptr mpm::spi::make_spidev_regs_iface(
- const std::string &device,
+mpm::types::regs_iface::sptr mpm::spi::make_spidev_regs_iface(const std::string& device,
const int speed_hz,
const int spi_mode,
uint32_t addr_shift,
uint32_t data_shift,
uint32_t read_flags,
- uint32_t write_flags
-) {
- auto spi_iface_sptr = mpm::spi::spi_iface::make_spidev(
- device, speed_hz, spi_mode
- );
+ uint32_t write_flags)
+{
+ auto spi_iface_sptr = mpm::spi::spi_iface::make_spidev(device, speed_hz, spi_mode);
return std::make_shared<spi_regs_iface_impl>(
- spi_iface_sptr,
- addr_shift,
- data_shift,
- read_flags,
- write_flags
- );
+ spi_iface_sptr, addr_shift, data_shift, read_flags, write_flags);
}
diff --git a/mpm/lib/spi/spidev_iface.cpp b/mpm/lib/spi/spidev_iface.cpp
index 8b629e7b6..c8a2133e8 100644
--- a/mpm/lib/spi/spidev_iface.cpp
+++ b/mpm/lib/spi/spidev_iface.cpp
@@ -5,14 +5,13 @@
//
-#include <mpm/spi/spi_iface.hpp>
#include <mpm/exception.hpp>
+#include <mpm/spi/spi_iface.hpp>
extern "C" {
#include "spidev.h"
}
#include <fcntl.h>
#include <linux/spi/spidev.h>
-
#include <boost/format.hpp>
#include <iostream>
@@ -24,29 +23,18 @@ using namespace mpm::spi;
class spidev_iface_impl : public spi_iface
{
public:
-
spidev_iface_impl(
- const std::string &device,
- const int max_speed_hz,
- const int spi_mode
- ) : _speed(max_speed_hz),
- _mode(spi_mode)
+ const std::string& device, const int max_speed_hz, const int spi_mode)
+ : _speed(max_speed_hz), _mode(spi_mode)
{
- if (init_spi(
- &_fd,
- device.c_str(),
- _mode, _speed, _bits, _delay) < 0)
- {
- throw mpm::runtime_error(str(
- boost::format("Could not initialize spidev device %s")
- % device));
+ if (init_spi(&_fd, device.c_str(), _mode, _speed, _bits, _delay) < 0) {
+ throw mpm::runtime_error(
+ str(boost::format("Could not initialize spidev device %s") % device));
}
- if (_fd < 0)
- {
- throw mpm::runtime_error(str(
- boost::format("Could not open spidev device %s")
- % device));
+ if (_fd < 0) {
+ throw mpm::runtime_error(
+ str(boost::format("Could not open spidev device %s") % device));
}
}
@@ -55,53 +43,37 @@ public:
close(_fd);
}
- uint32_t transfer24_8(
- const uint32_t data_
- ) {
+ uint32_t transfer24_8(const uint32_t data_)
+ {
int ret(0);
- uint32_t data = data_;
- uint8_t *tx_data = reinterpret_cast<uint8_t *>(&data);
+ uint32_t data = data_;
+ uint8_t* tx_data = reinterpret_cast<uint8_t*>(&data);
// Create tx and rx buffers:
uint8_t tx[] = {tx_data[2], tx_data[1], tx_data[0]}; // FIXME guarantee endianness
uint8_t rx[3]; // Buffer length must match tx buffer
- if (transfer(
- _fd,
- &tx[0], &rx[0],
- 3,
- _speed, _bits, _delay
- ) != 0) {
- throw mpm::runtime_error(str(
- boost::format("SPI Transaction failed!")
- ));
+ if (transfer(_fd, &tx[0], &rx[0], 3, _speed, _bits, _delay) != 0) {
+ throw mpm::runtime_error(str(boost::format("SPI Transaction failed!")));
}
return uint32_t(rx[2]);
}
- uint32_t transfer24_16(
- const uint32_t data_
- ) {
+ uint32_t transfer24_16(const uint32_t data_)
+ {
int ret(0);
- uint32_t data = data_;
- uint8_t *tx_data = reinterpret_cast<uint8_t *>(&data);
+ uint32_t data = data_;
+ uint8_t* tx_data = reinterpret_cast<uint8_t*>(&data);
// Create tx and rx buffers:
uint8_t tx[] = {tx_data[2], tx_data[1], tx_data[0]}; // FIXME guarantee endianness
uint8_t rx[3]; // Buffer length must match tx buffer
- if (transfer(
- _fd,
- &tx[0], &rx[0],
- 3,
- _speed, _bits, _delay
- ) != 0) {
- throw mpm::runtime_error(str(
- boost::format("SPI Transaction failed!")
- ));
+ if (transfer(_fd, &tx[0], &rx[0], 3, _speed, _bits, _delay) != 0) {
+ throw mpm::runtime_error(str(boost::format("SPI Transaction failed!")));
}
return uint32_t(rx[1] << 8 | rx[2]);
@@ -111,7 +83,7 @@ private:
int _fd;
const uint32_t _mode;
uint32_t _speed = 2000000;
- uint8_t _bits = 8;
+ uint8_t _bits = 8;
uint16_t _delay = 0;
};
@@ -119,12 +91,7 @@ private:
* Factory
*****************************************************************************/
spi_iface::sptr spi_iface::make_spidev(
- const std::string &device,
- const int speed_hz,
- const int spi_mode
-) {
- return std::make_shared<spidev_iface_impl>(
- device, speed_hz, spi_mode
- );
+ const std::string& device, const int speed_hz, const int spi_mode)
+{
+ return std::make_shared<spidev_iface_impl>(device, speed_hz, spi_mode);
}
-
diff --git a/mpm/lib/types/lockable.cpp b/mpm/lib/types/lockable.cpp
index 8710e8752..cdba9e335 100644
--- a/mpm/lib/types/lockable.cpp
+++ b/mpm/lib/types/lockable.cpp
@@ -11,9 +11,7 @@ using namespace mpm::types;
class lockable_impl : public lockable
{
public:
- lockable_impl(
- std::shared_ptr<std::mutex> spi_mutex
- ) : _spi_mutex(spi_mutex)
+ lockable_impl(std::shared_ptr<std::mutex> spi_mutex) : _spi_mutex(spi_mutex)
{
/* nop */
}
@@ -32,11 +30,7 @@ private:
std::shared_ptr<std::mutex> _spi_mutex;
};
-lockable::sptr lockable::make(
- std::shared_ptr<std::mutex> spi_mutex
-) {
- return std::make_shared<lockable_impl>(
- spi_mutex
- );
+lockable::sptr lockable::make(std::shared_ptr<std::mutex> spi_mutex)
+{
+ return std::make_shared<lockable_impl>(spi_mutex);
}
-
diff --git a/mpm/lib/types/log_buf.cpp b/mpm/lib/types/log_buf.cpp
index f1ef0cbee..8e3f183cc 100644
--- a/mpm/lib/types/log_buf.cpp
+++ b/mpm/lib/types/log_buf.cpp
@@ -9,15 +9,11 @@
using namespace mpm::types;
void log_buf::post(
- const log_level_t log_level,
- const std::string &component,
- const std::string &message
-) {
+ const log_level_t log_level, const std::string& component, const std::string& message)
+{
{
std::lock_guard<std::mutex> l(_buf_lock);
- _buf.push_back(
- log_message(log_level, component, message)
- );
+ _buf.push_back(log_message(log_level, component, message));
}
if (bool(_notify_callback)) {
@@ -25,9 +21,8 @@ void log_buf::post(
}
}
-void log_buf::set_notify_callback(
- std::function<void(void)> callback
-) {
+void log_buf::set_notify_callback(std::function<void(void)> callback)
+{
_notify_callback = callback;
}
@@ -35,20 +30,12 @@ std::tuple<log_level_t, std::string, std::string> log_buf::pop()
{
std::lock_guard<std::mutex> l(_buf_lock);
if (_buf.empty()) {
- return std::make_tuple(
- log_level_t::NONE,
- "",
- ""
- );
+ return std::make_tuple(log_level_t::NONE, "", "");
}
auto last_msg = _buf.front();
_buf.pop_front();
- return std::make_tuple(
- last_msg.log_level,
- last_msg.component,
- last_msg.message
- );
+ return std::make_tuple(last_msg.log_level, last_msg.component, last_msg.message);
}
log_buf::sptr log_buf::make()
@@ -61,4 +48,3 @@ log_buf::sptr log_buf::make_singleton()
static auto log_sptr = log_buf::make();
return log_sptr;
}
-
diff --git a/mpm/lib/types/mmap_regs_iface.cpp b/mpm/lib/types/mmap_regs_iface.cpp
index 96457d7ad..18fa2abfa 100644
--- a/mpm/lib/types/mmap_regs_iface.cpp
+++ b/mpm/lib/types/mmap_regs_iface.cpp
@@ -4,30 +4,26 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <mpm/types/mmap_regs_iface.hpp>
+#include <fcntl.h>
#include <mpm/exception.hpp>
-#include <boost/format.hpp>
-#include <iostream>
-#include <sys/types.h>
-#include <sys/stat.h>
+#include <mpm/types/mmap_regs_iface.hpp>
#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
-#include <fcntl.h>
+#include <boost/format.hpp>
+#include <iostream>
#include <sstream>
using namespace mpm::types;
-mmap_regs_iface::mmap_regs_iface(
- const std::string &path,
+mmap_regs_iface::mmap_regs_iface(const std::string& path,
const size_t length,
const size_t offset,
const bool read_only,
- const bool open_now
-) : _path(path)
- , _length(length)
- , _offset(offset)
- , _read_only(read_only)
+ const bool open_now)
+ : _path(path), _length(length), _offset(offset), _read_only(read_only)
{
if (open_now) {
open();
@@ -53,26 +49,23 @@ void mmap_regs_iface::open()
}
if (!_mmap) {
- _mmap = (uint32_t *) ::mmap(
- NULL,
+ _mmap = (uint32_t*)::mmap(NULL,
_length,
PROT_READ | (_read_only ? 0 : PROT_WRITE),
MAP_SHARED,
_fd,
- (off_t) _offset
- );
- if (((void *) _mmap) == MAP_FAILED) {
+ (off_t)_offset);
+ if (((void*)_mmap) == MAP_FAILED) {
throw mpm::runtime_error("Failed to mmap!");
}
}
- log(mpm::types::log_level_t::TRACE, _path,
- "Opened mmap_regs_iface");
+ log(mpm::types::log_level_t::TRACE, _path, "Opened mmap_regs_iface");
}
void mmap_regs_iface::close()
{
if (_mmap) {
- int err = munmap((void *) _mmap, _length);
+ int err = munmap((void*)_mmap, _length);
if (err) {
throw mpm::runtime_error("Couldn't munmap!");
}
@@ -85,14 +78,11 @@ void mmap_regs_iface::close()
}
_fd = -1;
}
- log(mpm::types::log_level_t::TRACE, _path,
- "Closed mmap_regs_iface");
+ log(mpm::types::log_level_t::TRACE, _path, "Closed mmap_regs_iface");
}
-void mmap_regs_iface::poke32(
- const uint32_t addr,
- const uint32_t data
-) {
+void mmap_regs_iface::poke32(const uint32_t addr, const uint32_t data)
+{
MPM_ASSERT_THROW(_mmap);
_mmap[addr / sizeof(uint32_t)] = data;
}
@@ -104,14 +94,8 @@ uint32_t mmap_regs_iface::peek32(const uint32_t addr)
}
void mmap_regs_iface::log(
- mpm::types::log_level_t level,
- const std::string path,
- const char *comment
-) {
+ mpm::types::log_level_t level, const std::string path, const char* comment)
+{
mpm::types::log_buf::make_singleton()->post(
- level,
- "MMAP_REGS_IFACE",
- str(boost::format("[UIO %s] %s")
- % path % comment)
- );
+ level, "MMAP_REGS_IFACE", str(boost::format("[UIO %s] %s") % path % comment));
}
diff --git a/mpm/lib/xbar_iface.cpp b/mpm/lib/xbar_iface.cpp
index cff5ed2e7..05d1e2053 100644
--- a/mpm/lib/xbar_iface.cpp
+++ b/mpm/lib/xbar_iface.cpp
@@ -5,41 +5,48 @@
//
#include "mpm/xbar_iface.hpp"
+#include <fcntl.h>
#include <mpm/exception.hpp>
-#include <boost/format.hpp>
#include <sys/ioctl.h>
-#include <fcntl.h>
+#include <boost/format.hpp>
using namespace mpm;
std::mutex xbar_iface::_lock; // Initialize lock for all objects
-xbar_iface::xbar_iface(const std::string &device){
+xbar_iface::xbar_iface(const std::string& device)
+{
_fd = open(device.c_str(), O_RDWR);
}
-xbar_iface::~xbar_iface(){
+xbar_iface::~xbar_iface()
+{
close(_fd);
}
-void xbar_iface::set_route(uint8_t dst_addr, uint8_t dst_port) {
+void xbar_iface::set_route(uint8_t dst_addr, uint8_t dst_port)
+{
std::lock_guard<std::mutex> lock(_lock);
rfnoc_crossbar_cmd cmd = {.dest_addr = dst_addr, .dest_port = dst_port};
- int err = ioctl(_fd, RFNCBWROUTIOC, &cmd);
+ int err = ioctl(_fd, RFNCBWROUTIOC, &cmd);
if (err < 0) {
- throw mpm::os_error(str(boost::format("setting crossbar route failed! Error: %d") % err));
+ throw mpm::os_error(
+ str(boost::format("setting crossbar route failed! Error: %d") % err));
}
}
-void xbar_iface::del_route(uint8_t dst_addr, uint8_t dst_port){
+void xbar_iface::del_route(uint8_t dst_addr, uint8_t dst_port)
+{
std::lock_guard<std::mutex> lock(_lock);
rfnoc_crossbar_cmd cmd = {.dest_addr = dst_addr, .dest_port = dst_port};
- int err = ioctl(_fd, RFNCDELROUTIOC, &cmd);
- if (err < 0){
- throw mpm::os_error(str(boost::format("deleting crossbar route failed! Error: %d") % err));
+ int err = ioctl(_fd, RFNCDELROUTIOC, &cmd);
+ if (err < 0) {
+ throw mpm::os_error(
+ str(boost::format("deleting crossbar route failed! Error: %d") % err));
}
}
-xbar_iface::sptr xbar_iface::make(const std::string &device){
+xbar_iface::sptr xbar_iface::make(const std::string& device)
+{
return std::make_shared<xbar_iface>(device);
}
diff --git a/mpm/python/lib_helper.cpp b/mpm/python/lib_helper.cpp
index 2d533f073..f4ac7870d 100644
--- a/mpm/python/lib_helper.cpp
+++ b/mpm/python/lib_helper.cpp
@@ -5,22 +5,24 @@
//
#include "lib_helper.hpp"
-#include "converters.hpp"
-#include "../lib/udev_helper.hpp"
#include "../lib/net_helper.hpp"
+#include "../lib/udev_helper.hpp"
+#include "converters.hpp"
#include <boost/python.hpp>
namespace bp = boost::python;
-void export_helper(){
- //Register submodule types
- bp::object helper_module(bp::handle<>(bp::borrowed(PyImport_AddModule("libpyusrp_periphs.helper"))));
+void export_helper()
+{
+ // Register submodule types
+ bp::object helper_module(
+ bp::handle<>(bp::borrowed(PyImport_AddModule("libpyusrp_periphs.helper"))));
bp::scope().attr("helper") = helper_module;
- bp::scope io_scope = helper_module;
+ bp::scope io_scope = helper_module;
bp::class_<mpm::udev_helper>("udev_helper", bp::init<>())
- .def("get_eeprom", &mpm::udev_helper::get_eeprom)
- ;
- bp::to_python_converter<std::vector< std::string >, iterable_to_python_list<std::vector< std::string > >, false>();
+ .def("get_eeprom", &mpm::udev_helper::get_eeprom);
+ bp::to_python_converter<std::vector<std::string>,
+ iterable_to_python_list<std::vector<std::string>>,
+ false>();
}
-
diff --git a/mpm/python/pyusrp_periphs/converters.hpp b/mpm/python/pyusrp_periphs/converters.hpp
index ede9507a9..849e8b90e 100644
--- a/mpm/python/pyusrp_periphs/converters.hpp
+++ b/mpm/python/pyusrp_periphs/converters.hpp
@@ -8,32 +8,29 @@
#include <boost/python.hpp>
#include <boost/python/stl_iterator.hpp>
-#include <vector>
#include <string>
+#include <vector>
namespace bp = boost::python;
-template<typename MapType>
-struct map_to_python_dict
+template <typename MapType> struct map_to_python_dict
{
static PyObject* convert(MapType const& input_map)
{
bp::dict py_dict;
- for (const auto& element: input_map){
+ for (const auto& element : input_map) {
py_dict[element.first] = element.second;
}
return bp::incref(py_dict.ptr());
}
-
};
-template<typename Container>
-struct iterable_to_python_list
+template <typename Container> struct iterable_to_python_list
{
static PyObject* convert(Container const& input)
{
bp::list py_list;
- for (const auto& element: input){
+ for (const auto& element : input) {
py_list.append(element);
}
return bp::incref(py_list.ptr());
@@ -43,52 +40,48 @@ struct iterable_to_python_list
// Converter for std::vector / std::list arguments from python iterables
struct iterable_converter
{
- template <typename Container>
- iterable_converter&
- from_python()
- {
- bp::converter::registry::push_back(
- &iterable_converter::convertible,
- &iterable_converter::construct<Container>,
- bp::type_id<Container>());
- return *this;
- }
+ template <typename Container> iterable_converter& from_python()
+ {
+ bp::converter::registry::push_back(&iterable_converter::convertible,
+ &iterable_converter::construct<Container>,
+ bp::type_id<Container>());
+ return *this;
+ }
- static void* convertible(PyObject* object)
- {
- return PyObject_GetIter(object) ? object : NULL;
- }
+ static void* convertible(PyObject* object)
+ {
+ return PyObject_GetIter(object) ? object : NULL;
+ }
- template <typename Container>
- static void construct(
- PyObject* object,
- bp::converter::rvalue_from_python_stage1_data* data)
- {
- // Object is a borrowed reference, so create a handle indicting it is
- // borrowed for proper reference counting.
- bp::handle<> handle(bp::borrowed(object));
+ template <typename Container>
+ static void construct(
+ PyObject* object, bp::converter::rvalue_from_python_stage1_data* data)
+ {
+ // Object is a borrowed reference, so create a handle indicting it is
+ // borrowed for proper reference counting.
+ bp::handle<> handle(bp::borrowed(object));
- // Obtain a handle to the memory block that the converter has allocated
- // for the C++ type.
- typedef bp::converter::rvalue_from_python_storage<Container>
- storage_type;
- void* storage = reinterpret_cast<storage_type*>(data)->storage.bytes;
+ // Obtain a handle to the memory block that the converter has allocated
+ // for the C++ type.
+ typedef bp::converter::rvalue_from_python_storage<Container> storage_type;
+ void* storage = reinterpret_cast<storage_type*>(data)->storage.bytes;
- typedef bp::stl_input_iterator<typename Container::value_type>
- iterator;
+ typedef bp::stl_input_iterator<typename Container::value_type> iterator;
- // Allocate the C++ type into the converter's memory block, and assign
- // its handle to the converter's convertible variable. The C++
- // container is populated by passing the begin and end iterators of
- // the python object to the container's constructor.
- new (storage) Container(
- iterator(bp::object(handle)), // begin
- iterator()); // end
- data->convertible = storage;
- }
+ // Allocate the C++ type into the converter's memory block, and assign
+ // its handle to the converter's convertible variable. The C++
+ // container is populated by passing the begin and end iterators of
+ // the python object to the container's constructor.
+ new (storage) Container(iterator(bp::object(handle)), // begin
+ iterator()); // end
+ data->convertible = storage;
+ }
};
-void export_converter(){
+void export_converter()
+{
// LIBMPM_BOOST_PREAMBLE("helper")
- bp::to_python_converter<std::vector< std::string >, iterable_to_python_list<std::vector< std::string > >, false>();
+ bp::to_python_converter<std::vector<std::string>,
+ iterable_to_python_list<std::vector<std::string>>,
+ false>();
}
diff --git a/mpm/python/pyusrp_periphs/e320/pyusrp_periphs.cpp b/mpm/python/pyusrp_periphs/e320/pyusrp_periphs.cpp
index b045b5909..97ccfc864 100644
--- a/mpm/python/pyusrp_periphs/e320/pyusrp_periphs.cpp
+++ b/mpm/python/pyusrp_periphs/e320/pyusrp_periphs.cpp
@@ -7,26 +7,27 @@
// include hackery to only include boost python and define the macro here
#include <boost/python.hpp>
#define LIBMPM_PYTHON
-#define LIBMPM_BOOST_PREAMBLE(module) \
- /* Register submodule types */ \
- namespace bp = boost::python; \
- bp::object py_module(bp::handle<>(bp::borrowed(PyImport_AddModule("libpyusrp_periphs." module)))); \
- bp::scope().attr(module) = py_module; \
- bp::scope io_scope = py_module;
+#define LIBMPM_BOOST_PREAMBLE(module) \
+ /* Register submodule types */ \
+ namespace bp = boost::python; \
+ bp::object py_module( \
+ bp::handle<>(bp::borrowed(PyImport_AddModule("libpyusrp_periphs." module)))); \
+ bp::scope().attr(module) = py_module; \
+ bp::scope io_scope = py_module;
#include "../converters.hpp"
-#include <mpm/xbar_iface.hpp>
-#include <mpm/types/types_python.hpp>
-#include <mpm/spi/spi_python.hpp>
#include <mpm/ad9361/ad9361_ctrl.hpp>
#include <mpm/dboards/neon_manager.hpp>
+#include <mpm/spi/spi_python.hpp>
+#include <mpm/types/types_python.hpp>
+#include <mpm/xbar_iface.hpp>
#include <boost/noncopyable.hpp>
namespace bp = boost::python;
BOOST_PYTHON_MODULE(libpyusrp_periphs)
{
- bp::object package = bp::scope();
+ bp::object package = bp::scope();
package.attr("__path__") = "libpyusrp_periphs";
export_converter();
export_types();
diff --git a/mpm/python/pyusrp_periphs/n3xx/pyusrp_periphs.cpp b/mpm/python/pyusrp_periphs/n3xx/pyusrp_periphs.cpp
index d6e66ad1e..85851677f 100644
--- a/mpm/python/pyusrp_periphs/n3xx/pyusrp_periphs.cpp
+++ b/mpm/python/pyusrp_periphs/n3xx/pyusrp_periphs.cpp
@@ -7,12 +7,13 @@
// include hackery to only include boost python and define the macro here
#include <boost/python.hpp>
#define LIBMPM_PYTHON
-#define LIBMPM_BOOST_PREAMBLE(module) \
- /* Register submodule types */ \
- namespace bp = boost::python; \
- bp::object py_module(bp::handle<>(bp::borrowed(PyImport_AddModule("libpyusrp_periphs." module)))); \
- bp::scope().attr(module) = py_module; \
- bp::scope io_scope = py_module;
+#define LIBMPM_BOOST_PREAMBLE(module) \
+ /* Register submodule types */ \
+ namespace bp = boost::python; \
+ bp::object py_module( \
+ bp::handle<>(bp::borrowed(PyImport_AddModule("libpyusrp_periphs." module)))); \
+ bp::scope().attr(module) = py_module; \
+ bp::scope io_scope = py_module;
//! RAII-style GIL release method
//
@@ -42,19 +43,19 @@ private:
//#include "types.hpp"
#include "../converters.hpp"
-#include <mpm/xbar_iface.hpp>
-#include <mpm/types/types_python.hpp>
-#include <mpm/i2c/i2c_python.hpp>
-#include <mpm/spi/spi_python.hpp>
#include <mpm/ad937x/ad937x_ctrl.hpp>
#include <mpm/dboards/magnesium_manager.hpp>
+#include <mpm/i2c/i2c_python.hpp>
+#include <mpm/spi/spi_python.hpp>
+#include <mpm/types/types_python.hpp>
+#include <mpm/xbar_iface.hpp>
#include <boost/noncopyable.hpp>
namespace bp = boost::python;
BOOST_PYTHON_MODULE(libpyusrp_periphs)
{
- bp::object package = bp::scope();
+ bp::object package = bp::scope();
package.attr("__path__") = "libpyusrp_periphs";
export_converter();
export_types();
diff --git a/mpm/python/tests_periphs.cpp b/mpm/python/tests_periphs.cpp
index c0446d87a..5b4a7c24d 100644
--- a/mpm/python/tests_periphs.cpp
+++ b/mpm/python/tests_periphs.cpp
@@ -5,20 +5,23 @@
//
#include "tests_periphs.hpp"
-#include <mpm/tests/tests_spi_iface.hpp>
#include <mpm/spi_iface.hpp>
+#include <mpm/tests/tests_spi_iface.hpp>
#include <boost/python.hpp>
namespace bp = boost::python;
-void export_tests(){
- //Register submodule types
- bp::object tests_module(bp::handle<>(bp::borrowed(PyImport_AddModule("libpyusrp_periphs.tests"))));
+void export_tests()
+{
+ // Register submodule types
+ bp::object tests_module(
+ bp::handle<>(bp::borrowed(PyImport_AddModule("libpyusrp_periphs.tests"))));
bp::scope().attr("tests") = tests_module;
- bp::scope io_scope = tests_module;
+ bp::scope io_scope = tests_module;
- bp::class_<mpm::tests_spi_iface, bp::bases<mpm::spi_iface>, boost::shared_ptr<mpm::tests_spi_iface> >("test_spi_iface", bp::init<>())
+ bp::class_<mpm::tests_spi_iface,
+ bp::bases<mpm::spi_iface>,
+ boost::shared_ptr<mpm::tests_spi_iface>>("test_spi_iface", bp::init<>())
.def("make", &mpm::tests_spi_iface::make)
- .staticmethod("make")
- ;
+ .staticmethod("make");
}
diff --git a/mpm/tests/tests_device.hpp b/mpm/tests/tests_device.hpp
index 390575178..75cc05b95 100644
--- a/mpm/tests/tests_device.hpp
+++ b/mpm/tests/tests_device.hpp
@@ -4,20 +4,19 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <mpm/tests/tests_spi_iface.hpp>
#include <mpm/spi_iface.hpp>
+#include <mpm/tests/tests_spi_iface.hpp>
#include <memory>
namespace mpm { namespace tests {
- class tests_dboard_periph_manager
- {
- public:
- typedef std::shared_ptr<tests_dboard_periph_manager> sptr;
- static sptr make();
+class tests_dboard_periph_manager
+{
+public:
+ typedef std::shared_ptr<tests_dboard_periph_manager> sptr;
+ static sptr make();
- private:
- mpm::spi_iface::sptr _dev1_spi;
- mpm::spi_iface::sptr _dev2_spi;
- };
-}
-}
+private:
+ mpm::spi_iface::sptr _dev1_spi;
+ mpm::spi_iface::sptr _dev2_spi;
+};
+}} // namespace mpm::tests
diff --git a/mpm/tests/tests_spi_iface.cpp b/mpm/tests/tests_spi_iface.cpp
index 063002fa9..40636a8fa 100644
--- a/mpm/tests/tests_spi_iface.cpp
+++ b/mpm/tests/tests_spi_iface.cpp
@@ -6,63 +6,59 @@
#include <mpm/tests/tests_spi_iface.hpp>
- /**************************************************************************
- * spi_iface API calls
- *************************************************************************/
-namespace mpm{
+/**************************************************************************
+ * spi_iface API calls
+ *************************************************************************/
+namespace mpm {
- void tests_spi_iface::write_byte(
- const uint16_t addr,
- const uint8_t data
- ) {
- _regs[addr] = data;
- }
+void tests_spi_iface::write_byte(const uint16_t addr, const uint8_t data)
+{
+ _regs[addr] = data;
+}
- void tests_spi_iface::write_bytes(
- const uint16_t *addr,
- const uint8_t *data,
- const uint32_t count
- ) {
- for (size_t i = 0; i < count; i++) {
- _regs[addr[i]] = data[i];
- }
- }
+void tests_spi_iface::write_bytes(
+ const uint16_t* addr, const uint8_t* data, const uint32_t count)
+{
+ for (size_t i = 0; i < count; i++) {
+ _regs[addr[i]] = data[i];
+ }
+}
- uint8_t tests_spi_iface::read_byte(const uint16_t addr)
- {
- if (_regs.count(addr)) {
- return _regs.at(addr);
- }
- return _default_val;
- }
+uint8_t tests_spi_iface::read_byte(const uint16_t addr)
+{
+ if (_regs.count(addr)) {
+ return _regs.at(addr);
+ }
+ return _default_val;
+}
- void tests_spi_iface::write_field(
- const uint16_t addr,
- const uint8_t field_val,
- const uint8_t mask,
- const uint8_t start_bit
- ) {
- const uint8_t old_value = read_byte(addr);
- _regs[addr] = (old_value & ~mask) | ((field_val << start_bit) & mask);
- }
+void tests_spi_iface::write_field(const uint16_t addr,
+ const uint8_t field_val,
+ const uint8_t mask,
+ const uint8_t start_bit)
+{
+ const uint8_t old_value = read_byte(addr);
+ _regs[addr] = (old_value & ~mask) | ((field_val << start_bit) & mask);
+}
- uint8_t tests_spi_iface::read_field(
- const uint16_t addr,
- const uint8_t mask,
- const uint8_t start_bit
- ) {
- return (read_byte(addr) & mask) >> start_bit;
- }
+uint8_t tests_spi_iface::read_field(
+ const uint16_t addr, const uint8_t mask, const uint8_t start_bit)
+{
+ return (read_byte(addr) & mask) >> start_bit;
+}
- spi_iface::spi_wire_mode_t tests_spi_iface::get_wire_mode() const{
- return spi_iface::spi_wire_mode_t::THREE_WIRE_MODE;
- }
+spi_iface::spi_wire_mode_t tests_spi_iface::get_wire_mode() const
+{
+ return spi_iface::spi_wire_mode_t::THREE_WIRE_MODE;
+}
- spi_iface::spi_endianness_t tests_spi_iface::get_endianness() const{
- return spi_iface::spi_endianness_t::LSB_FIRST;
- }
- size_t tests_spi_iface::get_chip_select() const{
- return 0;
- }
+spi_iface::spi_endianness_t tests_spi_iface::get_endianness() const
+{
+ return spi_iface::spi_endianness_t::LSB_FIRST;
+}
+size_t tests_spi_iface::get_chip_select() const
+{
+ return 0;
}
+} // namespace mpm