summaryrefslogtreecommitdiff
path: root/gnuradio-core/src
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-core/src')
-rw-r--r--gnuradio-core/src/lib/general/gr_throttle.cc19
-rw-r--r--gnuradio-core/src/lib/general/gr_throttle.h1
-rw-r--r--gnuradio-core/src/lib/io/gr_message_debug.cc2
-rw-r--r--gnuradio-core/src/lib/runtime/gr_block_registry.h1
-rw-r--r--gnuradio-core/src/lib/runtime/rpcpmtconverters_ice.cc17
-rw-r--r--gnuradio-core/src/lib/runtime/rpcregisterhelpers.h86
6 files changed, 115 insertions, 11 deletions
diff --git a/gnuradio-core/src/lib/general/gr_throttle.cc b/gnuradio-core/src/lib/general/gr_throttle.cc
index 040ab52205..f1faf5cff1 100644
--- a/gnuradio-core/src/lib/general/gr_throttle.cc
+++ b/gnuradio-core/src/lib/general/gr_throttle.cc
@@ -40,6 +40,10 @@ public:
/* NOP */
}
+ double sample_rate(){
+ return d_samps_per_us*1e6;
+ }
+
void set_sample_rate(double rate){
//changing the sample rate performs a reset of state params
d_start = boost::get_system_time();
@@ -78,6 +82,21 @@ private:
size_t d_itemsize;
uint64_t d_total_samples;
double d_samps_per_tick, d_samps_per_us;
+
+ void setup_rpc(){
+#ifdef GR_CTRLPORT
+ d_rpc_vars.push_back(
+ rpcbasic_sptr(new rpcbasic_register_get<gr_throttle_impl, double>(
+ alias(), "sample_rate", &gr_throttle_impl::sample_rate,
+ pmt::mp(0.0), pmt::mp(100.0e6), pmt::mp(0.0),
+ "Hz", "Sample Rate", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+ d_rpc_vars.push_back(
+ rpcbasic_sptr(new rpcbasic_register_set<gr_throttle_impl, double>(
+ alias(), "sample_rate", &gr_throttle_impl::set_sample_rate,
+ pmt::mp(0.0), pmt::mp(100.0e6), pmt::mp(0.0),
+ "Hz", "Sample Rate", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+#endif
+ }
};
gr_throttle::sptr
diff --git a/gnuradio-core/src/lib/general/gr_throttle.h b/gnuradio-core/src/lib/general/gr_throttle.h
index 876d6d8269..2235ffacf1 100644
--- a/gnuradio-core/src/lib/general/gr_throttle.h
+++ b/gnuradio-core/src/lib/general/gr_throttle.h
@@ -42,6 +42,7 @@ public:
typedef boost::shared_ptr<gr_throttle> sptr;
//! Sets the sample rate in samples per second
+ virtual double sample_rate() = 0;
virtual void set_sample_rate(double rate) = 0;
};
diff --git a/gnuradio-core/src/lib/io/gr_message_debug.cc b/gnuradio-core/src/lib/io/gr_message_debug.cc
index a0abf4d093..5d889c9e05 100644
--- a/gnuradio-core/src/lib/io/gr_message_debug.cc
+++ b/gnuradio-core/src/lib/io/gr_message_debug.cc
@@ -71,7 +71,7 @@ gr_message_debug::print_verbose(pmt::pmt_t msg)
size_t offset(0);
const uint8_t* d = (const uint8_t*) uniform_vector_elements(vector, offset);
for(size_t i=0; i<len; i+=16){
- printf("%04x: ", i);
+ printf("%04x: ", ((unsigned int)i));
for(size_t j=i; j<std::min(i+16,len); j++){
printf("%02x ",d[j] );
}
diff --git a/gnuradio-core/src/lib/runtime/gr_block_registry.h b/gnuradio-core/src/lib/runtime/gr_block_registry.h
index 3ad457ee79..2e0a3b6d5c 100644
--- a/gnuradio-core/src/lib/runtime/gr_block_registry.h
+++ b/gnuradio-core/src/lib/runtime/gr_block_registry.h
@@ -3,6 +3,7 @@
#include <gr_core_api.h>
#include <map>
+#include <gr_basic_block.h>
#ifndef GR_BASIC_BLOCK_H
class gr_basic_block;
diff --git a/gnuradio-core/src/lib/runtime/rpcpmtconverters_ice.cc b/gnuradio-core/src/lib/runtime/rpcpmtconverters_ice.cc
index c5502c7362..5aa7bc7cbd 100644
--- a/gnuradio-core/src/lib/runtime/rpcpmtconverters_ice.cc
+++ b/gnuradio-core/src/lib/runtime/rpcpmtconverters_ice.cc
@@ -55,11 +55,21 @@ rpcpmtconverter::from_pmt(const pmt::pmt_t& knob, const Ice::Current& c)
size_t size(pmt::length(knob));
const float* start((const float*) pmt::c32vector_elements(knob,size));
return new GNURadio::KnobVecF(std::vector<float>(start,start+size*2));
+ }
+ else if (pmt::is_s32vector(knob)) {
+ size_t size(pmt::length(knob));
+ const int* start((const int*) pmt::s32vector_elements(knob,size));
+ return new GNURadio::KnobVecI(std::vector<int>(start,start+size));
}
else if(pmt::is_f32vector(knob)) {
size_t size(pmt::length(knob));
const float* start((const float*) pmt::f32vector_elements(knob,size));
return new GNURadio::KnobVecF(std::vector<float>(start,start+size));
+ }
+ else if (pmt::is_u8vector(knob)) {
+ size_t size(pmt::length(knob));
+ const uint8_t* start((const uint8_t*) pmt::u8vector_elements(knob,size));
+ return new GNURadio::KnobVecC(std::vector<Ice::Byte>(start,start+size));
}
else {
std::cerr << "Error: Don't know how to handle Knob Type (from): " << std::endl; assert(0);}
@@ -98,13 +108,18 @@ rpcpmtconverter::to_pmt(const GNURadio::KnobPtr& knob, const Ice::Current& c)
else if(id == "KnobL") {
GNURadio::KnobLPtr k(GNURadio::KnobLPtr::dynamicCast(knob));
return pmt::mp((long)k->value);
+ } else if(id == "KnobVecC") {
+ GNURadio::KnobVecCPtr k(GNURadio::KnobVecCPtr::dynamicCast(knob));
+ return pmt::init_u8vector(k->value.size(), &k->value[0]);
+ } else if(id == "KnobVecI") {
+ GNURadio::KnobVecIPtr k(GNURadio::KnobVecIPtr::dynamicCast(knob));
+ return pmt::init_s32vector(k->value.size(), &k->value[0]);
}
//else if(id == "KnobVecF") {
// GNURadio::KnobVecFPtr k(GNURadio::KnobVecFPtr::dynamicCast(knob));
// return pmt::mp(k->value);
//TODO: FLOAT!!!
//TODO: VECTORS!!!
-
else {
std::cerr << "Error: Don't know how to handle Knob Type: " << id << std::endl; assert(0);
}
diff --git a/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h b/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h
index 411b660eaa..1be3769ac8 100644
--- a/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h
+++ b/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h
@@ -221,6 +221,28 @@ public:
};
template<typename T>
+class rpcbasic_inserter<T,std::vector< int > >
+ : public virtual rpcinserter_base<T,std::vector< int > >
+{
+public:
+ rpcbasic_inserter(T* source, std::vector<int > (T::*func)() const)
+ : rpcinserter_base<T,std::vector<int > >(source, func)
+ {;}
+
+ rpcbasic_inserter(T* source, std::vector<int > (T::*func)())
+ : rpcinserter_base<T,std::vector<int > >(source, func)
+ {;}
+
+ pmt::pmt_t retrieve()
+ {
+ std::vector< int >
+ vec((rpcinserter_base<T,std::vector<int > >::
+ _source->*rpcinserter_base<T,std::vector< int > >::_func)());
+ return pmt::init_s32vector(vec.size(), &vec[0]);
+ }
+};
+
+template<typename T>
class rpcbasic_inserter<T,std::vector< std::complex<float> > >
: public virtual rpcinserter_base<T,std::vector< std::complex<float> > >
{
@@ -263,6 +285,26 @@ public:
}
};
+template<typename T>
+class rpcbasic_inserter<T,std::vector< uint8_t> >
+ : public virtual rpcinserter_base<T,std::vector< uint8_t > > {
+public:
+ rpcbasic_inserter(T* source, std::vector<uint8_t> (T::*func)() const)
+ : rpcinserter_base<T,std::vector<uint8_t > >(source, func)
+ {;}
+
+ rpcbasic_inserter(T* source, std::vector<uint8_t> (T::*func)())
+ : rpcinserter_base<T,std::vector<uint8_t> >(source, func)
+ {;}
+
+ pmt::pmt_t retrieve()
+ {
+ std::vector< uint8_t > vec((rpcinserter_base<T,std::vector<uint8_t> >::
+ _source->*rpcinserter_base<T,std::vector< uint8_t> >::_func)());
+ return pmt::init_u8vector(vec.size(), &vec[0]);
+ }
+};
+
template <typename T>
struct rpc_register_base
{
@@ -552,26 +594,22 @@ private:
template<typename Tfrom>
class rpcbasic_register_variable : public rpcbasic_base
{
-private:
+protected:
rpcbasic_register_get< rpcbasic_register_variable<Tfrom>, Tfrom > d_rpc_reg;
Tfrom *d_variable;
Tfrom get() { return *d_variable; }
-
public:
// empty constructor which should never be called but needs to exist for ues in varous STL data structures
+ void setptr(Tfrom* _variable){ rpcbasic_register_variable<Tfrom>::d_variable = _variable; }
rpcbasic_register_variable() :
- d_rpc_reg("FAIL", "FAIL", this, -1, &rpcbasic_register_variable::get,
+ d_rpc_reg("FAIL", "FAIL", this, &rpcbasic_register_variable::get,
pmt::PMT_NIL, pmt::PMT_NIL, pmt::PMT_NIL, DISPNULL,
"FAIL", "FAIL", RPC_PRIVLVL_MIN),
d_variable(NULL)
{
- std::cerr << "ERROR: rpcbasic_register_variable called with no args. "
- << "If this happens, someone has tried to use rpcbasic_register_variable incorrectly.\n";
- assert(0);
+ throw std::runtime_error("ERROR: rpcbasic_register_variable called with no args. If this happens, someone has tried to use rpcbasic_register_variable incorrectly.");
};
- void set(Tfrom* _variable) { d_variable = _variable; }
-
rpcbasic_register_variable(const std::string& namebase,
const char* functionbase,
Tfrom *variable,
@@ -584,8 +622,38 @@ public:
min, max, def, units_, desc_, minpriv_, display_),
d_variable(variable)
{
- //std::cerr << "REGISTERING VAR: " << serial << " " << desc_ << std::endl;
+ //std::cerr << "REGISTERING VAR: " << " " << desc_ << std::endl;
}
};
+template<typename Tfrom> class rpcbasic_register_variable_rw : public rpcbasic_register_variable<Tfrom> {
+ private:
+ rpcbasic_register_set< rpcbasic_register_variable_rw<Tfrom>, Tfrom > d_rpc_regset;
+ public:
+ // empty constructor which should never be called but needs to exist for ues in varous STL data structures
+ rpcbasic_register_variable_rw() :
+ d_rpc_regset("FAIL","FAIL",this,&rpcbasic_register_variable<Tfrom>::get,pmt::PMT_NIL,pmt::PMT_NIL,pmt::PMT_NIL,DISPNULL,"FAIL","FAIL",RPC_PRIVLVL_MIN)
+ {
+ throw std::runtime_error("ERROR: rpcbasic_register_variable_rw called with no args. if this happens someone used rpcbasic_register_variable_rw incorrectly.\n");
+ };
+ void set(Tfrom _variable){ *(rpcbasic_register_variable<Tfrom>::d_variable) = _variable; }
+ rpcbasic_register_variable_rw(
+ const std::string& namebase,
+ const char* functionbase,
+ Tfrom *variable,
+ const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def,
+ const char* units_ = "",
+ const char* desc_ = "",
+ priv_lvl_t minpriv = RPC_PRIVLVL_MIN,
+ DisplayType display_=DISPNULL) :
+ rpcbasic_register_variable<Tfrom>(namebase,functionbase,variable,min,max,def,units_,desc_),
+ d_rpc_regset(namebase,functionbase,this,&rpcbasic_register_variable_rw::set,min,max,def,units_,desc_,minpriv,display_)
+ {
+ // no action
+ }
+};
+
+
+
+
#endif