aboutsummaryrefslogtreecommitdiffstats
path: root/src/RemoteControl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/RemoteControl.cpp')
-rw-r--r--src/RemoteControl.cpp86
1 files changed, 54 insertions, 32 deletions
diff --git a/src/RemoteControl.cpp b/src/RemoteControl.cpp
index f0318a2..03cef2c 100644
--- a/src/RemoteControl.cpp
+++ b/src/RemoteControl.cpp
@@ -3,7 +3,8 @@
Her Majesty the Queen in Right of Canada (Communications Research
Center Canada)
- Written by Matthias P. Braendli, matthias.braendli@mpb.li, 2012
+ Copyright (C) 2014
+ Matthias P. Braendli, matthias.braendli@mpb.li
*/
/*
This file is part of ODR-DabMod.
@@ -26,13 +27,35 @@
#include <iostream>
#include <string>
#include <boost/asio.hpp>
+#include <boost/thread.hpp>
#include "RemoteControl.h"
using boost::asio::ip::tcp;
-void
-RemoteControllerTelnet::process(long)
+
+void RemoteControllerTelnet::restart()
+{
+ m_restarter_thread = boost::thread(&RemoteControllerTelnet::restart_thread,
+ this, 0);
+}
+
+// This runs in a separate thread, because
+// it would take too long to be done in the main loop
+// thread.
+void RemoteControllerTelnet::restart_thread(long)
+{
+ m_running = false;
+
+ if (m_port) {
+ m_child_thread.interrupt();
+ m_child_thread.join();
+ }
+
+ m_child_thread = boost::thread(&RemoteControllerTelnet::process, this, 0);
+}
+
+void RemoteControllerTelnet::process(long)
{
m_welcome = "ODR-DabMod Remote Control CLI\nWrite 'help' for help.\n**********\n";
m_prompt = "> ";
@@ -71,7 +94,7 @@ RemoteControllerTelnet::process(long)
std::getline(str, in_message);
if (length == 0) {
- std::cerr << "Connection terminated" << std::endl;
+ std::cerr << "RC: Connection terminated" << std::endl;
break;
}
@@ -85,22 +108,22 @@ RemoteControllerTelnet::process(long)
continue;
}
- std::cerr << "Got message '" << in_message << "'" << std::endl;
+ std::cerr << "RC: Got message '" << in_message << "'" << std::endl;
dispatch_command(socket, in_message);
}
- std::cerr << "Closing socket" << std::endl;
+ std::cerr << "RC: Closing socket" << std::endl;
socket.close();
}
}
catch (std::exception& e)
{
- std::cerr << e.what() << std::endl;
+ std::cerr << "Remote control caught exception: " << e.what() << std::endl;
+ m_fault = true;
}
}
-void
-RemoteControllerTelnet::dispatch_command(tcp::socket& socket, string command)
+void RemoteControllerTelnet::dispatch_command(tcp::socket& socket, string command)
{
vector<string> cmd = tokenise_(command);
@@ -108,9 +131,7 @@ RemoteControllerTelnet::dispatch_command(tcp::socket& socket, string command)
reply(socket,
"The following commands are supported:\n"
" list\n"
- " * Lists the modules that are loaded\n"
- " list MODULE\n"
- " * Lists the parameters exported by module MODULE\n"
+ " * Lists the modules that are loaded and their parameters\n"
" show MODULE\n"
" * Lists all parameters and their values from module MODULE\n"
" get MODULE PARAMETER\n"
@@ -127,22 +148,15 @@ RemoteControllerTelnet::dispatch_command(tcp::socket& socket, string command)
if (cmd.size() == 1) {
for (list<RemoteControllable*>::iterator it = m_cohort.begin();
it != m_cohort.end(); ++it) {
- ss << (*it)->get_rc_name() << " ";
- }
- }
- else if (cmd.size() == 2) {
- try {
- stringstream ss;
-
- list< vector<string> > params = get_parameter_descriptions_(cmd[1]);
- for (list< vector<string> >::iterator it = params.begin();
- it != params.end(); ++it) {
- ss << (*it)[0] << " : " << (*it)[1] << endl;
+ ss << (*it)->get_rc_name() << endl;
+
+ list< vector<string> >::iterator param;
+ list< vector<string> > params = (*it)->get_parameter_descriptions();
+ for (param = params.begin();
+ param != params.end();
+ ++param) {
+ ss << "\t" << (*param)[0] << " : " << (*param)[1] << endl;
}
- reply(socket, ss.str());
- }
- catch (ParameterError &e) {
- reply(socket, e.what());
}
}
else {
@@ -188,9 +202,18 @@ RemoteControllerTelnet::dispatch_command(tcp::socket& socket, string command)
}
}
else if (cmd[0] == "set") {
- if (cmd.size() == 4) {
+ if (cmd.size() >= 4) {
try {
- set_param_(cmd[1], cmd[2], cmd[3]);
+ stringstream new_param_value;
+ for (int i = 3; i < cmd.size(); i++) {
+ new_param_value << cmd[i];
+
+ if (i+1 < cmd.size()) {
+ new_param_value << " ";
+ }
+ }
+
+ set_param_(cmd[1], cmd[2], new_param_value.str());
reply(socket, "ok");
}
catch (ParameterError &e) {
@@ -202,7 +225,7 @@ RemoteControllerTelnet::dispatch_command(tcp::socket& socket, string command)
}
else
{
- reply(socket, "Incorrect parameters for command 'get'");
+ reply(socket, "Incorrect parameters for command 'set'");
}
}
else if (cmd[0] == "quit") {
@@ -213,8 +236,7 @@ RemoteControllerTelnet::dispatch_command(tcp::socket& socket, string command)
}
}
-void
-RemoteControllerTelnet::reply(tcp::socket& socket, string message)
+void RemoteControllerTelnet::reply(tcp::socket& socket, string message)
{
boost::system::error_code ignored_error;
stringstream ss;