diff options
-rw-r--r-- | src/OutputUHD.cpp | 38 | ||||
-rw-r--r-- | src/OutputUHD.h | 21 | ||||
-rw-r--r-- | src/RemoteControl.cpp | 3 | ||||
-rw-r--r-- | src/RemoteControl.h | 12 | ||||
-rw-r--r-- | src/testremotecontrol/test.cpp | 41 |
5 files changed, 54 insertions, 61 deletions
diff --git a/src/OutputUHD.cpp b/src/OutputUHD.cpp index 971f33b..0195841 100644 --- a/src/OutputUHD.cpp +++ b/src/OutputUHD.cpp @@ -27,6 +27,7 @@ #include "OutputUHD.h" #include "PcDebug.h" #include "Log.h" +#include "RemoteControl.h" #include <iostream> #include <assert.h> @@ -42,6 +43,7 @@ OutputUHD::OutputUHD(const char* device, unsigned sampleRate, double frequency, int txgain, bool enableSync, bool muteNoTimestamps, Logger& logger) : ModOutput(ModFormat(1), ModFormat(0)), + RemoteControl("uhd"), myLogger(logger), mySampleRate(sampleRate), myTxGain(txgain), @@ -52,6 +54,9 @@ OutputUHD::OutputUHD(const char* device, unsigned sampleRate, MDEBUG("OutputUHD::OutputUHD(device: %s) @ %p\n", device, this); + /* register the parameters that can be remote controlled */ + RC_ADD_PARAMETER("txgain", "UHD analog daughterboard TX gain") + myDevice = device; #if ENABLE_UHD @@ -499,3 +504,36 @@ loopend: workerbuffer = (workerbuffer + 1) % 2; } } + + +virtual void OutputUHD::set_parameter(string parameter, string value) +{ + stringstream ss(value); + ss.exceptions ( stringstream::failbit | stringstream::badbit ); + + if (parameter == "txgain") { + ss >> myTxStream; +#if ENABLE_UHD + myUsrp->set_tx_gain(myTxGain); +#endif + } + else { + stringstream ss; + ss << "Parameter '" << parameter << "' is not exported by controllable " << get_rc_name(); + throw ParameterError(ss.str()); + } +} + +virtual string OutputUHD::get_parameter(string parameter) +{ + stringstream ss; + if (parameter == "txgain") { + ss << myTxGain; + } + else { + ss << "Parameter '" << parameter << "' is not exported by controllable " << get_rc_name(); + throw ParameterError(ss.str()); + } + return ss.str(); +} + diff --git a/src/OutputUHD.h b/src/OutputUHD.h index 6d2df55..1a53804 100644 --- a/src/OutputUHD.h +++ b/src/OutputUHD.h @@ -159,32 +159,14 @@ class OutputUHD: public ModOutput, public RemoteControl { } /*********** REMOTE CONTROL ***************/ - virtual std::string get_rc_name() { return "uhd"; } - /* Tell the controllable to enrol at the given controller / virtual void enrol_at(BaseRemoteController& controller) { controller.enrol(this); } // */ - /* Return a list of possible parameters that can be set */ - list<string> get_supported_parameters() { - list<string> parameterlist; - for (list< vector<string> >::iterator it = parameters_.begin(); it != parameters_.end(); it++) { - parameterlist.push_back((*it)[0]); - } - return parameterlist; - } - - /* Return a mapping of the descriptions of all parameters */ - virtual std::list< std::vector<std::string> > get_parameter_descriptions() = 0; - /* Base function to set parameters. */ virtual void set_parameter(string parameter, string value) = 0; - /* Convenience functions for other common types */ - virtual void set_parameter(string parameter, double value) = 0; - virtual void set_parameter(string parameter, long value) = 0; - /* Getting a parameter always returns a string. */ virtual string get_parameter(string parameter) = 0; @@ -206,9 +188,6 @@ class OutputUHD: public ModOutput, public RemoteControl { bool enable_sync; size_t lastLen; - - - /*********** REMOTE CONTROL ***************/ }; diff --git a/src/RemoteControl.cpp b/src/RemoteControl.cpp index 53b7204..ad745db 100644 --- a/src/RemoteControl.cpp +++ b/src/RemoteControl.cpp @@ -191,6 +191,9 @@ RemoteControllerTelnet::dispatch_command(tcp::socket& socket, string command) catch (ParameterError &e) { reply(socket, e.what()); } + catch (exception &e) { + reply(socket, "Error: Invalid parameter value. "); + } } else { diff --git a/src/RemoteControl.h b/src/RemoteControl.h index 2830210..53fc912 100644 --- a/src/RemoteControl.h +++ b/src/RemoteControl.h @@ -40,7 +40,7 @@ #include <stdexcept> -#define ADD_PARAMETER(p, desc) { \ +#define RC_ADD_PARAMETER(p, desc) { \ vector<string> p; \ p.push_back(#p); \ p.push_back(desc); \ @@ -81,7 +81,7 @@ class RemoteControllable { * It might be used in the commands the user has to type, so keep * it short */ - virtual std::string get_rc_name() = 0; + virtual std::string get_rc_name() { return name_; } /* Tell the controllable to enrol at the given controller */ virtual void enrol_at(BaseRemoteController& controller) { @@ -99,15 +99,13 @@ class RemoteControllable { } /* Return a mapping of the descriptions of all parameters */ - virtual std::list< std::vector<std::string> > get_parameter_descriptions() = 0; + virtual std::list< std::vector<std::string> > get_parameter_descriptions() { + return parameters_; + } /* Base function to set parameters. */ virtual void set_parameter(string parameter, string value) = 0; - /* Convenience functions for other common types */ - virtual void set_parameter(string parameter, double value) = 0; - virtual void set_parameter(string parameter, long value) = 0; - /* Getting a parameter always returns a string. */ virtual string get_parameter(string parameter) = 0; diff --git a/src/testremotecontrol/test.cpp b/src/testremotecontrol/test.cpp index 07b761f..40f0e25 100644 --- a/src/testremotecontrol/test.cpp +++ b/src/testremotecontrol/test.cpp @@ -1,6 +1,7 @@ #include <string> #include <map> #include <unistd.h> + #include "RemoteControl.h" using namespace std; @@ -10,23 +11,22 @@ class TestControllable : public RemoteControllable public: TestControllable(string name) : RemoteControllable(name) { - ADD_PARAMETER(foo, "That's the foo"); - ADD_PARAMETER(bar, "That's the bar"); - ADD_PARAMETER(baz, "That's the baz"); + RC_ADD_PARAMETER(foo, "That's the foo"); + RC_ADD_PARAMETER(bar, "That's the bar"); + RC_ADD_PARAMETER(baz, "That's the baz"); } - string get_rc_name() { return name_; }; - void set_parameter(string parameter, string value) { + stringstream ss(value); + ss.exceptions ( stringstream::failbit | stringstream::badbit ); + if (parameter == "foo") { - stringstream ss(value); ss >> foo_; } else if (parameter == "bar") { bar_ = value; } else if (parameter == "baz") { - stringstream ss(value); ss >> baz_; } else { @@ -36,30 +36,9 @@ class TestControllable : public RemoteControllable } } - void set_parameter(string parameter, double value) { - if (parameter == "baz") { - baz_ = value; - } - else { - stringstream ss; - ss << "Parameter '" << parameter << "' is not a double in controllable " << get_rc_name(); - throw ParameterError(ss.str()); - } - } - - void set_parameter(string parameter, long value) { - if (parameter == "foo") { - foo_ = value; - } - else { - stringstream ss; - ss << "Parameter '" << parameter << "' is not a long in controllable " << get_rc_name(); - throw ParameterError(ss.str()); - } - } - string get_parameter(string parameter) { stringstream ss; + if (parameter == "foo") { ss << foo_; } @@ -77,10 +56,6 @@ class TestControllable : public RemoteControllable return ss.str(); } - std::list< std::vector<std::string> > get_parameter_descriptions() { - return parameters_; - } - private: long foo_; std::string bar_; |