From cd03692e92c0f44fbd45875a8782dd6febee0f68 Mon Sep 17 00:00:00 2001 From: Martin Braun Date: Thu, 1 Jun 2017 00:04:24 -0700 Subject: mpmd: Refactored code to allow multi-device initialization --- host/lib/usrp/mpmd/mpmd_mboard_impl.cpp | 111 ++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 host/lib/usrp/mpmd/mpmd_mboard_impl.cpp (limited to 'host/lib/usrp/mpmd/mpmd_mboard_impl.cpp') diff --git a/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp b/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp new file mode 100644 index 000000000..46e8d23a9 --- /dev/null +++ b/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp @@ -0,0 +1,111 @@ +// +// Copyright 2017 Ettus Research (National Instruments) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#include "mpmd_impl.hpp" +#include +#include + +namespace { + const size_t MPMD_RECLAIM_INTERVAL_MS = 1000; +} + +using namespace uhd; + +/***************************************************************************** + * Structors + ****************************************************************************/ +mpmd_mboard_impl::mpmd_mboard_impl(const std::string& ip_addr) + : rpc(uhd::rpc_client::make(ip_addr, MPM_RPC_PORT)) +{ + UHD_LOG_TRACE("MPMD", "Initializing mboard, IP address: " << ip_addr); + auto _dev_info = rpc->call("get_device_info"); + device_info = + dict(_dev_info.begin(), _dev_info.end()); + // Get initial claim on mboard + auto rpc_token = rpc->call("claim", "UHD - Session 01"); // TODO make this configurable with device_addr, and provide better defaults + if (rpc_token.empty()) { + throw uhd::value_error("mpmd device claiming failed!"); + } + rpc->set_token(rpc_token); + _claimer_task = task::make([this] { + if (not this->claim()) { + throw uhd::value_error("mpmd device reclaiming loop failed!"); + }; + std::this_thread::sleep_for( + std::chrono::milliseconds(MPMD_RECLAIM_INTERVAL_MS) + ); + }); + + // std::vector data_ifaces = + // rpc.call>("get_interfaces", rpc_token); + + // discover path to device and tell MPM our MAC address seen at the data + // interfaces + // move this into make_transport + //for (const auto& iface : data_ifaces) { + //std::vector addrs = rpc.call>( + //"get_interface_addrs", _rpc_token, iface); + //for (const auto& iface_addr : addrs) { + //if (rpc_client(iface_addr, MPM_RPC_PORT) + //.call("probe_interface", _rpc_token)) { + //data_interfaces.emplace(iface, iface_addr); + //break; + //} + //} + //} +} + +mpmd_mboard_impl::~mpmd_mboard_impl() +{ + /* nop */ +} + +/***************************************************************************** + * API + ****************************************************************************/ +uhd::sid_t mpmd_mboard_impl::allocate_sid(const uint16_t port, + const uhd::sid_t address, + const uint32_t xbar_src_addr, + const uint32_t xbar_src_port) +{ + const auto sid = rpc->call_with_token( + "allocate_sid", + port, address.get(), xbar_src_addr, xbar_src_port + ); + return uhd::sid_t(sid); +} + + +/***************************************************************************** + * Private methods + ****************************************************************************/ +bool mpmd_mboard_impl::claim() +{ + return rpc->call_with_token("reclaim"); +} + +/***************************************************************************** + * Factory + ****************************************************************************/ +mpmd_mboard_impl::uptr mpmd_mboard_impl::make(const std::string& addr) +{ + mpmd_mboard_impl::uptr mb = + mpmd_mboard_impl::uptr(new mpmd_mboard_impl(addr)); + // implicit move + return mb; +} + -- cgit v1.2.3