diff options
Diffstat (limited to 'gnuradio-core/src')
-rw-r--r-- | gnuradio-core/src/lib/general/gr_throttle.cc | 19 | ||||
-rw-r--r-- | gnuradio-core/src/lib/general/gr_throttle.h | 1 | ||||
-rw-r--r-- | gnuradio-core/src/lib/io/gr_message_debug.cc | 2 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_block_registry.h | 1 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/rpcpmtconverters_ice.cc | 17 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/rpcregisterhelpers.h | 86 |
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 |