summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnuradio-runtime/lib/controlport/CMakeLists.txt28
-rw-r--r--gnuradio-runtime/lib/controlport/gnuradio.thrift97
-rw-r--r--gnuradio-runtime/lib/controlport/rpcpmtconverters_thrift.cc109
-rw-r--r--gnuradio-runtime/lib/controlport/rpcserver_thrift.cc202
-rw-r--r--gnuradio-runtime/python/gnuradio/ctrlport/CMakeLists.txt10
-rw-r--r--gnuradio-runtime/python/gnuradio/ctrlport/GrDataPlotter.py3
6 files changed, 33 insertions, 416 deletions
diff --git a/gnuradio-runtime/lib/controlport/CMakeLists.txt b/gnuradio-runtime/lib/controlport/CMakeLists.txt
index 9963362582..65d5ebf846 100644
--- a/gnuradio-runtime/lib/controlport/CMakeLists.txt
+++ b/gnuradio-runtime/lib/controlport/CMakeLists.txt
@@ -29,15 +29,29 @@ list(APPEND gnuradio_ctrlport_sources
${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_aggregator.cc
${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_booter_aggregator.cc
${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_selector.cc
- ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_thrift.cc
- ${CMAKE_CURRENT_SOURCE_DIR}/rpcpmtconverters_thrift.cc
- ${CMAKE_CURRENT_SOURCE_DIR}/thrift_application_base.cc
- ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_booter_thrift.cc
- ${CMAKE_CURRENT_SOURCE_DIR}/gnuradio_types.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/gnuradio_constants.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/ControlPort.cpp
)
+# FIXME: create actual cmake test to find and enable Thrift
+set(ENABLE_THRIFT "True")
+
+if(ENABLE_THRIFT)
+list(APPEND gnuradio_ctrlport_sources
+ ${CMAKE_CURRENT_SOURCE_DIR}/thrift/rpcserver_thrift.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/thrift/rpcpmtconverters_thrift.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/thrift/rpcserver_booter_thrift.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/thrift/thrift_application_base.cc
+)
+
+# add files built by compiling gnuradio.thrift
+# FIXME: Add cmake execute_process to do this for cpp and py
+list(APPEND gnuradio_ctrlport_sources
+ ${CMAKE_CURRENT_BINARY_DIR}/gnuradio_types.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/gnuradio_constants.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/ControlPort.cpp
+)
+
+endif(ENABLE_THRIFT)
+
########################################################################
# Add controlport stuff to gnuradio-runtime
########################################################################
diff --git a/gnuradio-runtime/lib/controlport/gnuradio.thrift b/gnuradio-runtime/lib/controlport/gnuradio.thrift
deleted file mode 100644
index bc1c809e33..0000000000
--- a/gnuradio-runtime/lib/controlport/gnuradio.thrift
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2014 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio 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, or (at your option)
- * any later version.
- *
- * GNU Radio 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 GNU Radio see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-namespace cpp GNURadio
-namespace py GNURadio
-
-struct complex {
- 1: double re;
- 2: double im;
-}
-
-enum BaseTypes { BOOL, BYTE, SHORT, LONG, DOUBLE, STRING, COMPLEX }
-
-union KnobBase {
- 1: bool a_bool;
- 2: byte a_byte;
- 3: i32 a_short;
- 4: i64 a_long;
- 5: double a_double;
- 6: string a_string;
- 7: complex a_complex;
-}
-
-struct Knob {
- 1: BaseTypes type;
- 2: KnobBase value;
-}
-
-typedef list<bool> VectorB
-typedef list<byte> VectorC
-typedef list<i32> VectorI
-typedef list<double> VectorF
-typedef list<double> VectorD
-typedef list<string> VectorS
-typedef list<i64> VectorL
-typedef list<i32> VectorT
-
-enum KnobType { KNOBBOOL, KNOBCHAR, KNOBINT, KNOBDOUBLE, KNOBSTRING,
- KNOBLONG, KNOBVECBOOL, KNOBVECCHAR, KNOBVECINT,
- KNOBVECDOUBLE, KNOBVECSTRING, KNOBVECLONG, KNOBSHORT}
-
-const i32 DISPNULL = 0x0000
-const i32 DISPTIME = 0x0001
-const i32 DISPXY = 0x0002
-const i32 DISPPSD = 0x0004
-const i32 DISPSPEC = 0x0008
-const i32 DISPRAST = 0x0010
-const i32 DISPOPTCPLX = 0x0100
-const i32 DISPOPTLOG = 0x0200
-const i32 DISPOPTSTEM = 0x0400
-const i32 DISPOPTSTRIP = 0x0800
-const i32 DISPOPTSCATTER = 0x1000
-
-struct KnobProp {
- 1: KnobType type,
- 2: string units,
- 3: string description,
- 4: i32 display,
- 5: Knob min,
- 6: Knob max,
- 7: Knob defaultvalue
-}
-
-typedef list<string> KnobIDList
-typedef map<string, Knob> KnobMap
-typedef map<string, KnobProp> KnobPropMap
-typedef map<string, string> WaveformArgMap
-
-service StreamReceiver {
- void push(1:VectorC data);
-}
-
-service ControlPort {
- void setKnobs(1:KnobMap knobs);
- KnobMap getKnobs(1:KnobIDList knobs);
- KnobMap getRe(1:KnobIDList knobs);
- KnobPropMap properties(1:KnobIDList knobs);
- void shutdown();
-}
diff --git a/gnuradio-runtime/lib/controlport/rpcpmtconverters_thrift.cc b/gnuradio-runtime/lib/controlport/rpcpmtconverters_thrift.cc
deleted file mode 100644
index bb2da6260d..0000000000
--- a/gnuradio-runtime/lib/controlport/rpcpmtconverters_thrift.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2014 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio 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, or (at your option)
- * any later version.
- *
- * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-#include <gnuradio/rpcpmtconverters_thrift.h>
-#include "gnuradio_types.h"
-#include <iostream>
-
-GNURadio::Knob
-rpcpmtconverter::from_pmt(const pmt::pmt_t& knob)
-{
- if(pmt::is_real(knob)) {
-
- GNURadio::Knob result;
- result.type = GNURadio::BaseTypes::DOUBLE;
- result.value.__set_a_double(pmt::to_double(knob));
- return result;
- }
- else if(pmt::is_symbol(knob)) {
- std::string value = pmt::symbol_to_string(knob);
- GNURadio::Knob result;
- result.type = GNURadio::BaseTypes::STRING;
- result.value.__set_a_string(value);
- return result;
- }
- else if(pmt::is_integer(knob)) {
- GNURadio::Knob result;
- result.type = GNURadio::BaseTypes::LONG;
- result.value.__set_a_long(pmt::to_long(knob));
- return result;
- }
- else if(pmt::is_bool(knob)) {
- GNURadio::Knob result;
- result.type = GNURadio::BaseTypes::BOOL;
- result.value.__set_a_bool(pmt::to_bool(knob));
- return result;
- }
- else if(pmt::is_uint64(knob)) {
- GNURadio::Knob result;
- result.type = GNURadio::BaseTypes::LONG;
- result.value.__set_a_long(pmt::to_uint64(knob));
- return result;
- }
- else if(pmt::is_complex(knob)) {
- GNURadio::Knob result;
- result.type = GNURadio::BaseTypes::COMPLEX;
- std::complex<double> tmp = pmt::to_complex(knob);
- GNURadio::complex cpx;
- cpx.re = tmp.real();
- cpx.im = tmp.imag();
- result.value.__set_a_complex(cpx);
- return result;
- } //TODO Vectors
- else {
- std::cerr << "Error: Don't know how to handle Knob Type (from): " << std::endl; assert(0);}
- return GNURadio::Knob();
-}
-
-pmt::pmt_t
-rpcpmtconverter::to_pmt(const GNURadio::Knob& knob)
-{
-
- if(knob.type == GNURadio::BaseTypes::BYTE) {
- return pmt::mp(knob.value.a_byte);
- }
- else if(knob.type == GNURadio::BaseTypes::SHORT) {
- return pmt::mp(knob.value.a_short);
- }
- else if(knob.type == GNURadio::BaseTypes::LONG) {
- return pmt::mp(knob.value.a_long);
- }
- else if(knob.type == GNURadio::BaseTypes::DOUBLE) {
- return pmt::mp(knob.value.a_double);
- }
- else if(knob.type == GNURadio::BaseTypes::STRING) {
- return pmt::string_to_symbol(knob.value.a_string);
- }
- else if(knob.type == GNURadio::BaseTypes::BOOL) {
- if (knob.value.a_bool)
- return pmt::PMT_T;
- else
- return pmt::PMT_F;
- }
- else if(knob.type == GNURadio::BaseTypes::COMPLEX) {
- std::complex<double> cpx(knob.value.a_complex.re, knob.value.a_complex.im);
- return pmt::from_complex(cpx);
- }
- else {
- std::cerr << "Error: Don't know how to handle Knob Type: " << knob.type << std::endl; assert(0);
- }
- return pmt::pmt_t();
-}
diff --git a/gnuradio-runtime/lib/controlport/rpcserver_thrift.cc b/gnuradio-runtime/lib/controlport/rpcserver_thrift.cc
deleted file mode 100644
index 664305085f..0000000000
--- a/gnuradio-runtime/lib/controlport/rpcserver_thrift.cc
+++ /dev/null
@@ -1,202 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2014 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio 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, or (at your option)
- * any later version.
- *
- * GNU Radio 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 GNU Radio see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-#include <gnuradio/rpcserver_thrift.h>
-#include <iostream>
-#include <sstream>
-#include <stdexcept>
-#include <pmt/pmt.h>
-#include <thrift/protocol/TBinaryProtocol.h>
-#include <thrift/transport/TSocket.h>
-#include <thrift/transport/TTransportUtils.h>
-#include <boost/xpressive/xpressive.hpp>
-#include "ControlPort.h"
-
-#define DEBUG 0
-
-using namespace rpcpmtconverter;
-
-rpcserver_thrift::rpcserver_thrift()
-{
- std::cout << "rpcserver_thrift::ctor" << std::endl;
-}
-
-rpcserver_thrift::~rpcserver_thrift()
-{
- std::cout << "rpcserver_thrift::dtor" << std::endl;
-}
-
-void
-rpcserver_thrift::registerConfigureCallback(const std::string &id, const configureCallback_t callback)
-{
- {
- std::cout << "thrift::registerConfigureCallback: " << id << std::endl;
- ConfigureCallbackMap_t::const_iterator iter(d_setcallbackmap.find(id));
- if(iter != d_setcallbackmap.end()) {
- std::stringstream s;
- s << "rpcserver_thrift:: rpcserver_thrift ERROR registering set, already registered: "
- << id << std::endl;
- throw std::runtime_error(s.str().c_str());
- }
- }
-
- if(DEBUG) {
- std::cout << "rpcserver_thrift registering set: " << id << std::endl;
- }
- d_setcallbackmap.insert(ConfigureCallbackMap_t::value_type(id, callback));
-}
-
-void
-rpcserver_thrift::unregisterConfigureCallback(const std::string &id)
-{
- std::cout << "thrift::unregisterConfigureCallback: " << id << std::endl;
- ConfigureCallbackMap_t::iterator iter(d_setcallbackmap.find(id));
- if(iter == d_setcallbackmap.end()) {
- std::stringstream s;
- s << "rpcserver_thrift:: rpcserver_thrift ERROR unregistering set, not registered: "
- << id << std::endl;
- throw std::runtime_error(s.str().c_str());
- }
-
- if(DEBUG)
- std::cout << "rpcserver_thrift unregistering set: " << id << std::endl;
-
- d_setcallbackmap.erase(iter);
-}
-
-void
-rpcserver_thrift::registerQueryCallback(const std::string &id,
- const queryCallback_t callback)
-{
- {
- std::cout << "thrift::registerQueryCallback: " << id << std::endl;
- QueryCallbackMap_t::const_iterator iter(d_getcallbackmap.find(id));
- if(iter != d_getcallbackmap.end()) {
- std::stringstream s;
- s << "rpcserver_thrift:: rpcserver_thrift ERROR registering get, already registered: "
- << id << std::endl;
- throw std::runtime_error(s.str().c_str());
- }
- }
-
- if(DEBUG) {
- std::cout << "rpcserver_thrift registering get: " << id << std::endl;
- }
- d_getcallbackmap.insert(QueryCallbackMap_t::value_type(id, callback));
-}
-
-void
-rpcserver_thrift::unregisterQueryCallback(const std::string &id)
-{
- std::cout << "thrift::unregisterQueryCallback: " << id << std::endl;
- QueryCallbackMap_t::iterator iter(d_getcallbackmap.find(id));
- if(iter == d_getcallbackmap.end()) {
- std::stringstream s;
- s << "rpcserver_thrift:: rpcserver_thrift ERROR unregistering get, registered: "
- << id << std::endl;
- throw std::runtime_error(s.str().c_str());
- }
-
- if(DEBUG) {
- std::cout << "rpcserver_thrift unregistering get: " << id << std::endl;
- }
-
- d_getcallbackmap.erase(iter);
-}
-
-void
-rpcserver_thrift::setKnobs(const GNURadio::KnobMap& knobs)
-{
- std::for_each(knobs.begin(), knobs.end(),
- set_f<GNURadio::KnobMap::value_type,ConfigureCallbackMap_t>
- (d_setcallbackmap, cur_priv));
-}
-
-
-void
-rpcserver_thrift::getKnobs(GNURadio::KnobMap& _return, const GNURadio::KnobIDList& knobs)
-{
- GNURadio::KnobMap outknobs;
-
- if(knobs.size() == 0) {
- std::for_each(d_getcallbackmap.begin(), d_getcallbackmap.end(),
- get_all_f<QueryCallbackMap_t::value_type, QueryCallbackMap_t, GNURadio::KnobMap>
- (d_getcallbackmap, cur_priv, outknobs));
- }
- else {
- std::for_each(knobs.begin(), knobs.end(),
- get_f<GNURadio::KnobIDList::value_type, QueryCallbackMap_t>
- (d_getcallbackmap, cur_priv, outknobs));
- }
- _return = outknobs;
-}
-
-void
-rpcserver_thrift::getRe(GNURadio::KnobMap& _return, const GNURadio::KnobIDList& knobs)
-{
- GNURadio::KnobMap outknobs;
-
- if(knobs.size() == 0) {
- std::for_each(d_getcallbackmap.begin(), d_getcallbackmap.end(),
- get_all_f<QueryCallbackMap_t::value_type, QueryCallbackMap_t, GNURadio::KnobMap>
- (d_getcallbackmap, cur_priv, outknobs));
- }
- else {
- QueryCallbackMap_t::iterator it;
- for(it = d_getcallbackmap.begin(); it != d_getcallbackmap.end(); it++){
- for(size_t j=0; j<knobs.size(); j++){
- const boost::xpressive::sregex re(boost::xpressive::sregex::compile(knobs[j]));
- if(boost::xpressive::regex_match(it->first, re)){
- get_f<GNURadio::KnobIDList::value_type, QueryCallbackMap_t>
- (d_getcallbackmap, cur_priv, outknobs)(it->first);
- break;
- }
- }
- }
- }
- _return = outknobs;
-}
-
-void
-rpcserver_thrift::properties(GNURadio::KnobPropMap& _return, const GNURadio::KnobIDList& knobs)
-{
- GNURadio::KnobPropMap outknobs;
-
- if(knobs.size() == 0) {
- std::for_each(d_getcallbackmap.begin(), d_getcallbackmap.end(),
- properties_all_f<QueryCallbackMap_t::value_type,
- QueryCallbackMap_t, GNURadio::KnobPropMap>(d_getcallbackmap, cur_priv, outknobs));
- }
- else {
- std::for_each(knobs.begin(), knobs.end(),
- properties_f<GNURadio::KnobIDList::value_type,
- QueryCallbackMap_t, GNURadio::KnobPropMap>(d_getcallbackmap, cur_priv, outknobs));
- }
- _return = outknobs;
-}
-
-void
-rpcserver_thrift::shutdown() {
- if (DEBUG) {
- std::cout << "Shutting down..." << std::endl;
- }
-}
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/CMakeLists.txt b/gnuradio-runtime/python/gnuradio/ctrlport/CMakeLists.txt
index 1d5a292429..d208763a90 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/CMakeLists.txt
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/CMakeLists.txt
@@ -29,8 +29,18 @@ install(
GR_PYTHON_INSTALL(
FILES
+ ${CMAKE_CURRENT_SOURCE_DIR}/__init__.py
${CMAKE_CURRENT_SOURCE_DIR}/GrDataPlotter.py
${CMAKE_CURRENT_SOURCE_DIR}/monitor.py
+ ${CMAKE_CURRENT_SOURCE_DIR}/ThriftRadioClient.py
DESTINATION ${GR_PYTHON_DIR}/gnuradio/ctrlport/
COMPONENT "runtime_python"
)
+
+GR_PYTHON_INSTALL(
+ FILES
+ ${CMAKE_CURRENT_SOURCE_DIR}/gr-perf-monitorx
+ DESTINATION ${GR_RUNTIME_DIR}
+ PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
+ COMPONENT "runtime_python"
+)
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/GrDataPlotter.py b/gnuradio-runtime/python/gnuradio/ctrlport/GrDataPlotter.py
index 661705d613..5d75197966 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/GrDataPlotter.py
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/GrDataPlotter.py
@@ -23,7 +23,8 @@
from gnuradio import gr
from gnuradio import blocks
from gnuradio import filter
-from gnuradio.ctrlport import GNURadio
+#from gnuradio.ctrlport import GNURadio
+from gnuradio.ControlPort import GNURadio
import sys, time, struct
try: