class BaseLoop: daemon command SET implemented.

This commit is contained in:
Roland Jax
2014-05-04 21:53:19 +02:00
parent b6ec718d34
commit 6a5bdd28c5
5 changed files with 75 additions and 21 deletions
+72 -20
View File
@@ -37,7 +37,7 @@ void BaseLoop::start()
data.erase(std::remove(data.begin(), data.end(), '\r'), data.end());
data.erase(std::remove(data.begin(), data.end(), '\n'), data.end());
L.log(bas, event, ">>> %s", data.c_str());
// decode message
@@ -59,31 +59,29 @@ std::string BaseLoop::decodeMessage(const std::string& data)
std::ostringstream result;
std::string cycdata;
int index;
BusCommand* busCommand;
// prepare data
std::string token;
std::istringstream stream(data);
std::vector<std::string> cmd;
while (std::getline(stream, token, ' ') != 0)
cmd.push_back(token);
if (cmd.size() == 0)
return "command missing";
switch (getCase(cmd[0])) {
case notfound:
result << "command not found";
break;
case get:
case set:
if (cmd.size() < 3) {
result << "format: type class cmd [sub]";
break;
}
index = m_commands->findCommand(data);
if (index >= 0) {
@@ -92,11 +90,11 @@ std::string BaseLoop::decodeMessage(const std::string& data)
std::string ebusCommand(A.getParam<const char*>("p_address"));
ebusCommand += m_commands->getEbusCommand(index);
std::transform(ebusCommand.begin(), ebusCommand.end(), ebusCommand.begin(), tolower);
L.log(bas, event, " type: %s msg: %s", type.c_str(), ebusCommand.c_str());
// send busCommand
m_ebusloop->addBusCommand(new BusCommand(type, ebusCommand));
busCommand = m_ebusloop->getBusCommand();
BusCommand* busCommand = m_ebusloop->getBusCommand();
if (busCommand->getResult().c_str()[0] != '-') {
// decode data
@@ -107,26 +105,80 @@ std::string BaseLoop::decodeMessage(const std::string& data)
delete command;
} else {
L.log(bas, error, " %s", busCommand->getResult().c_str());
result << busCommand->getResult().c_str();
}
delete busCommand;
} else {
result << "ebus command not found";
}
break;
case set:
if (cmd.size() != 4) {
result << "format: type class cmd value";
break;
}
index = m_commands->findCommand(data.substr(0, data.find(cmd[3])-1));
if (index >= 0) {
std::string type = m_commands->getType(index);
std::string ebusCommand(A.getParam<const char*>("p_address"));
ebusCommand += m_commands->getEbusCommand(index);
// encode data
Command* command = new Command(index, (*m_commands)[index], cmd[3]);
std::string value = command->calcData();
if (value[0] != '-') {
ebusCommand += value;
} else {
L.log(bas, error, " %s", value.c_str());
delete command;
break;
}
std::transform(ebusCommand.begin(), ebusCommand.end(), ebusCommand.begin(), tolower);
L.log(bas, event, " type: %s msg: %s", type.c_str(), ebusCommand.c_str());
// send busCommand
m_ebusloop->addBusCommand(new BusCommand(type, ebusCommand));
BusCommand* busCommand = m_ebusloop->getBusCommand();
if (busCommand->getResult().c_str()[0] != '-') {
// decode result
if (busCommand->getResult().substr(busCommand->getResult().length()-8) == "00000000")
result << "done";
else
result << "error";
} else {
L.log(bas, error, " %s", busCommand->getResult().c_str());
result << busCommand->getResult().c_str();
}
delete busCommand;
delete command;
} else {
result << "ebus command not found";
}
break;
case cyc:
if (cmd.size() < 3) {
result << "format: type class cmd [sub]";
break;
}
index = m_commands->findCommand(data);
if (index >= 0) {
// get cycdata
cycdata = m_cycdata->getData(index);
@@ -136,7 +188,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
// return result
result << command->calcResult(cmd);
delete command;
} else {
result << "no data stored";
@@ -144,9 +196,9 @@ std::string BaseLoop::decodeMessage(const std::string& data)
} else {
result << "ebus command not found";
}
break;
case dump:
if (cmd[1] == "on") m_ebusloop->dump(true);
if (cmd[1] == "off") m_ebusloop->dump(false);
@@ -160,7 +212,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
if (cmd[1] == "debug") L.getSink(0)->setLevel(debug);
result << "done";
break;
default:
break;
}
+1
View File
@@ -16,6 +16,7 @@
* You should have received a copy of the GNU General Public License
* along with ebus-daemon. If not, see http://www.gnu.org/licenses/.
*/
#include "libebus.h"
#include "logger.h"
#include "daemon.h"
+1 -1
View File
@@ -25,8 +25,8 @@
#include "thread.h"
#include "notify.h"
#include "baseloop.h"
#include <unistd.h>
#include <list>
#include <unistd.h>
class Connection : public Thread
{