Merge branch 'master' of git://github.com/yuhu-/ebusd
This commit is contained in:
@@ -23,3 +23,6 @@ Makefile.in
|
|||||||
/src/lib/ebus/test/test_encode
|
/src/lib/ebus/test/test_encode
|
||||||
/src/lib/ebus/test/test_symbol
|
/src/lib/ebus/test/test_symbol
|
||||||
/src/lib/ebus/test/test_data
|
/src/lib/ebus/test/test_data
|
||||||
|
/docs/Doxyfile
|
||||||
|
/docs/doxyfile.stamp
|
||||||
|
/docs/html
|
||||||
|
|||||||
+6
-1
@@ -1,4 +1,9 @@
|
|||||||
SUBDIRS = src/lib/utils src/lib/ebus src/lib/ebus/test src/ebusd src/ebusctl
|
SUBDIRS = docs \
|
||||||
|
src/lib/utils \
|
||||||
|
src/lib/ebus \
|
||||||
|
src/lib/ebus/test \
|
||||||
|
src/ebusd \
|
||||||
|
src/ebusctl
|
||||||
|
|
||||||
distclean-local:
|
distclean-local:
|
||||||
-rm -rf autom4te.cache
|
-rm -rf autom4te.cache
|
||||||
|
|||||||
+15
-2
@@ -10,22 +10,35 @@ AC_CHECK_HEADERS([arpa/inet.h \
|
|||||||
poll.h \
|
poll.h \
|
||||||
pthread.h \
|
pthread.h \
|
||||||
sys/ioctl.h \
|
sys/ioctl.h \
|
||||||
|
sys/select.h \
|
||||||
termios.h])
|
termios.h])
|
||||||
|
|
||||||
AC_CHECK_LIB([pthread], [pthread_setname_np],
|
AC_CHECK_LIB([pthread], [pthread_setname_np],
|
||||||
AC_DEFINE([HAVE_PTHREAD_SETNAME_NP], [1], ["Define to 1 if pthread has pthread_setname_np"]),
|
AC_DEFINE([HAVE_PTHREAD_SETNAME_NP], [1], ["Define to 1 if pthread has pthread_setname_np."]),
|
||||||
AC_MSG_RESULT([Could not find pthread_setname_np in pthread]))
|
AC_MSG_RESULT([Could not find pthread_setname_np in pthread.]))
|
||||||
|
|
||||||
|
AC_CHECK_FUNC([pselect], [AC_DEFINE(HAVE_PSELECT, [1], [Define to 1 if pselect() is available.])])
|
||||||
|
AC_CHECK_FUNC([ppoll], [AC_DEFINE(HAVE_PPOLL, [1], [Define to 1 if ppoll() is available.])])
|
||||||
|
|
||||||
AC_CONFIG_AUX_DIR([build])
|
AC_CONFIG_AUX_DIR([build])
|
||||||
AC_CONFIG_SRCDIR([src/ebusd/ebusd.cpp])
|
AC_CONFIG_SRCDIR([src/ebusd/ebusd.cpp])
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_FILES([Makefile
|
AC_CONFIG_FILES([Makefile
|
||||||
|
docs/Makefile
|
||||||
src/lib/utils/Makefile
|
src/lib/utils/Makefile
|
||||||
src/lib/ebus/Makefile
|
src/lib/ebus/Makefile
|
||||||
src/lib/ebus/test/Makefile
|
src/lib/ebus/test/Makefile
|
||||||
src/ebusd/Makefile
|
src/ebusd/Makefile
|
||||||
src/ebusctl/Makefile])
|
src/ebusctl/Makefile])
|
||||||
|
|
||||||
|
AC_CHECK_PROGS([HAVE_DOXYGEN], [doxygen])
|
||||||
|
if test -z "$HAVE_DOXYGEN";
|
||||||
|
then AC_MSG_WARN([Doxygen not found - continuing without Doxygen support.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$HAVE_DOXYGEN"])
|
||||||
|
AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([docs/Doxyfile])])
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([1.11 -Wall -Werror foreign])
|
AM_INIT_AUTOMAKE([1.11 -Wall -Werror foreign])
|
||||||
|
|
||||||
AM_PROG_AR
|
AM_PROG_AR
|
||||||
|
|||||||
+2280
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,15 @@
|
|||||||
|
if HAVE_DOXYGEN
|
||||||
|
|
||||||
|
doxyfile.stamp:
|
||||||
|
$(HAVE_DOXYGEN) Doxyfile
|
||||||
|
echo Timestamp > doxyfile.stamp
|
||||||
|
|
||||||
|
CLEANFILES = doxyfile.stamp
|
||||||
|
|
||||||
|
all-local: doxyfile.stamp
|
||||||
|
|
||||||
|
distclean-local:
|
||||||
|
-rm -f Makefile.in
|
||||||
|
-rm -rf html
|
||||||
|
|
||||||
|
endif
|
||||||
+13
-13
@@ -28,7 +28,7 @@ extern Appl& A;
|
|||||||
BaseLoop::BaseLoop()
|
BaseLoop::BaseLoop()
|
||||||
{
|
{
|
||||||
// create commands DB
|
// create commands DB
|
||||||
m_commands = ConfigCommands(A.getOptVal<const char*>("ebusconfdir"), CSV).getCommands();
|
m_commands = ConfigCommands(A.getOptVal<const char*>("ebusconfdir"), ft_csv).getCommands();
|
||||||
L.log(bas, trace, "ebus configuration dir: %s", A.getOptVal<const char*>("ebusconfdir"));
|
L.log(bas, trace, "ebus configuration dir: %s", A.getOptVal<const char*>("ebusconfdir"));
|
||||||
L.log(bas, event, "commands DB: %d ", m_commands->sizeCmdDB());
|
L.log(bas, event, "commands DB: %d ", m_commands->sizeCmdDB());
|
||||||
L.log(bas, event, " cycle DB: %d ", m_commands->sizeCycDB());
|
L.log(bas, event, " cycle DB: %d ", m_commands->sizeCycDB());
|
||||||
@@ -112,11 +112,11 @@ std::string BaseLoop::decodeMessage(const std::string& data)
|
|||||||
return "command missing";
|
return "command missing";
|
||||||
|
|
||||||
switch (getCase(cmd[0])) {
|
switch (getCase(cmd[0])) {
|
||||||
case notfound:
|
case ct_invalid:
|
||||||
result << "command not found";
|
result << "command not found";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case get:
|
case ct_get:
|
||||||
if (cmd.size() < 3 || cmd.size() > 4) {
|
if (cmd.size() < 3 || cmd.size() > 4) {
|
||||||
result << "usage: 'get class cmd (sub)'";
|
result << "usage: 'get class cmd (sub)'";
|
||||||
break;
|
break;
|
||||||
@@ -176,7 +176,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case set:
|
case ct_set:
|
||||||
if (cmd.size() != 4) {
|
if (cmd.size() != 4) {
|
||||||
result << "usage: 'set class cmd value'";
|
result << "usage: 'set class cmd value'";
|
||||||
break;
|
break;
|
||||||
@@ -231,7 +231,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case cyc:
|
case ct_cyc:
|
||||||
if (cmd.size() < 3 || cmd.size() > 4) {
|
if (cmd.size() < 3 || cmd.size() > 4) {
|
||||||
result << "usage: 'cyc class cmd (sub)'";
|
result << "usage: 'cyc class cmd (sub)'";
|
||||||
break;
|
break;
|
||||||
@@ -259,7 +259,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case hex:
|
case ct_hex:
|
||||||
if (cmd.size() != 2) {
|
if (cmd.size() != 2) {
|
||||||
result << "usage: 'hex value' (value: ZZPBSBNNDx)";
|
result << "usage: 'hex value' (value: ZZPBSBNNDx)";
|
||||||
break;
|
break;
|
||||||
@@ -289,7 +289,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case scan:
|
case ct_scan:
|
||||||
if (cmd.size() == 1) {
|
if (cmd.size() == 1) {
|
||||||
m_busloop->scan();
|
m_busloop->scan();
|
||||||
result << "done";
|
result << "done";
|
||||||
@@ -315,7 +315,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
|
|||||||
<< " 'scan result'";
|
<< " 'scan result'";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case log:
|
case ct_log:
|
||||||
if (cmd.size() != 3 ) {
|
if (cmd.size() != 3 ) {
|
||||||
result << "usage: 'log areas area,area,..' (areas: bas|net|bus|cyc|all)" << std::endl
|
result << "usage: 'log areas area,area,..' (areas: bas|net|bus|cyc|all)" << std::endl
|
||||||
<< " 'log level level' (level: error|event|trace|debug)";
|
<< " 'log level level' (level: error|event|trace|debug)";
|
||||||
@@ -340,7 +340,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case raw:
|
case ct_raw:
|
||||||
if (cmd.size() != 1) {
|
if (cmd.size() != 1) {
|
||||||
result << "usage: 'raw'";
|
result << "usage: 'raw'";
|
||||||
break;
|
break;
|
||||||
@@ -350,7 +350,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
|
|||||||
result << "done";
|
result << "done";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case dump:
|
case ct_dump:
|
||||||
if (cmd.size() != 1) {
|
if (cmd.size() != 1) {
|
||||||
result << "usage: 'dump'";
|
result << "usage: 'dump'";
|
||||||
break;
|
break;
|
||||||
@@ -360,7 +360,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
|
|||||||
result << "done";
|
result << "done";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case reload:
|
case ct_reload:
|
||||||
if (cmd.size() != 1) {
|
if (cmd.size() != 1) {
|
||||||
result << "usage: 'reload'";
|
result << "usage: 'reload'";
|
||||||
break;
|
break;
|
||||||
@@ -368,7 +368,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
|
|||||||
|
|
||||||
{
|
{
|
||||||
// create commands DB
|
// create commands DB
|
||||||
Commands* commands = ConfigCommands(A.getOptVal<const char*>("ebusconfdir"), CSV).getCommands();
|
Commands* commands = ConfigCommands(A.getOptVal<const char*>("ebusconfdir"), ft_csv).getCommands();
|
||||||
L.log(bas, trace, "ebus configuration dir: %s", A.getOptVal<const char*>("ebusconfdir"));
|
L.log(bas, trace, "ebus configuration dir: %s", A.getOptVal<const char*>("ebusconfdir"));
|
||||||
L.log(bas, event, "commands DB: %d ", m_commands->sizeCmdDB());
|
L.log(bas, event, "commands DB: %d ", m_commands->sizeCmdDB());
|
||||||
L.log(bas, event, " cycle DB: %d ", m_commands->sizeCycDB());
|
L.log(bas, event, " cycle DB: %d ", m_commands->sizeCycDB());
|
||||||
@@ -382,7 +382,7 @@ std::string BaseLoop::decodeMessage(const std::string& data)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case help:
|
case ct_help:
|
||||||
result << "commands:" << std::endl
|
result << "commands:" << std::endl
|
||||||
<< " get - fetch ebus data 'get class cmd (sub)'" << std::endl
|
<< " get - fetch ebus data 'get class cmd (sub)'" << std::endl
|
||||||
<< " set - set ebus values 'set class cmd value'" << std::endl
|
<< " set - set ebus values 'set class cmd value'" << std::endl
|
||||||
|
|||||||
+60
-26
@@ -24,54 +24,88 @@
|
|||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "busloop.h"
|
#include "busloop.h"
|
||||||
|
|
||||||
|
/** possible client commands */
|
||||||
|
enum CommandType {
|
||||||
|
ct_get, // get ebus data
|
||||||
|
ct_set, // set ebus value
|
||||||
|
ct_cyc, // fetch cycle data
|
||||||
|
ct_hex, // send hex value
|
||||||
|
ct_scan, // scan ebus
|
||||||
|
ct_log, // logger settings
|
||||||
|
ct_raw, // toggle log raw data
|
||||||
|
ct_dump, // toggle dump state
|
||||||
|
ct_reload, // reload ebus configuration
|
||||||
|
ct_help, // print commands
|
||||||
|
ct_invalid, // invalid
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief class baseloop which handle client messages.
|
||||||
|
*/
|
||||||
class BaseLoop
|
class BaseLoop
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @brief construct the baseloop and creates commads, network and busloop subsystems.
|
||||||
|
*/
|
||||||
BaseLoop();
|
BaseLoop();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief destructor.
|
||||||
|
*/
|
||||||
~BaseLoop();
|
~BaseLoop();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief start baseloop instance.
|
||||||
|
*/
|
||||||
void start();
|
void start();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief add a new network message to internal message queue.
|
||||||
|
* @param message the network message.
|
||||||
|
*/
|
||||||
void addMessage(NetMessage* message) { m_netQueue.add(message); }
|
void addMessage(NetMessage* message) { m_netQueue.add(message); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/** the commands instance */
|
||||||
Commands* m_commands;
|
Commands* m_commands;
|
||||||
|
|
||||||
|
/** the busloop instance */
|
||||||
BusLoop* m_busloop;
|
BusLoop* m_busloop;
|
||||||
|
|
||||||
|
/** the network instance */
|
||||||
Network* m_network;
|
Network* m_network;
|
||||||
|
|
||||||
|
/** queue for network messages */
|
||||||
WQueue<NetMessage*> m_netQueue;
|
WQueue<NetMessage*> m_netQueue;
|
||||||
|
|
||||||
enum ClientCommand {
|
/**
|
||||||
get, // get ebus data
|
* @brief compare client command with defined.
|
||||||
set, // set ebus value
|
* @param item the client command to compare.
|
||||||
cyc, // fetch cycle data
|
* @return the founded client command type.
|
||||||
hex, // send hex value
|
*/
|
||||||
scan, // scan ebus
|
CommandType getCase(const std::string& item)
|
||||||
log, // logger settings
|
|
||||||
raw, // toggle log raw data
|
|
||||||
dump, // toggle dump state
|
|
||||||
reload, // reload ebus configuration
|
|
||||||
help, // print commands
|
|
||||||
notfound
|
|
||||||
};
|
|
||||||
|
|
||||||
ClientCommand getCase(const std::string& item)
|
|
||||||
{
|
{
|
||||||
if (strcasecmp(item.c_str(), "GET") == 0) return get;
|
if (strcasecmp(item.c_str(), "GET") == 0) return ct_get;
|
||||||
if (strcasecmp(item.c_str(), "SET") == 0) return set;
|
if (strcasecmp(item.c_str(), "SET") == 0) return ct_set;
|
||||||
if (strcasecmp(item.c_str(), "CYC") == 0) return cyc;
|
if (strcasecmp(item.c_str(), "CYC") == 0) return ct_cyc;
|
||||||
if (strcasecmp(item.c_str(), "HEX") == 0) return hex;
|
if (strcasecmp(item.c_str(), "HEX") == 0) return ct_hex;
|
||||||
if (strcasecmp(item.c_str(), "SCAN") == 0) return scan;
|
if (strcasecmp(item.c_str(), "SCAN") == 0) return ct_scan;
|
||||||
if (strcasecmp(item.c_str(), "LOG") == 0) return log;
|
if (strcasecmp(item.c_str(), "LOG") == 0) return ct_log;
|
||||||
if (strcasecmp(item.c_str(), "RAW") == 0) return raw;
|
if (strcasecmp(item.c_str(), "RAW") == 0) return ct_raw;
|
||||||
if (strcasecmp(item.c_str(), "DUMP") == 0) return dump;
|
if (strcasecmp(item.c_str(), "DUMP") == 0) return ct_dump;
|
||||||
if (strcasecmp(item.c_str(), "RELOAD") == 0) return reload;
|
if (strcasecmp(item.c_str(), "RELOAD") == 0) return ct_reload;
|
||||||
if (strcasecmp(item.c_str(), "HELP") == 0) return help;
|
if (strcasecmp(item.c_str(), "HELP") == 0) return ct_help;
|
||||||
|
|
||||||
return notfound;
|
return ct_invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief decode and execute client message
|
||||||
|
* @param data the data string to decode
|
||||||
|
* @return result string to send back to client
|
||||||
|
*/
|
||||||
std::string decodeMessage(const std::string& data);
|
std::string decodeMessage(const std::string& data);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -308,25 +308,25 @@ void BusLoop::analyseCycData()
|
|||||||
static bool skipfirst = false;
|
static bool skipfirst = false;
|
||||||
|
|
||||||
if (skipfirst == true) {
|
if (skipfirst == true) {
|
||||||
L.log(bus, trace, "%s", m_sstr.getDataStr().c_str());
|
L.log(cyc, trace, "%s", m_sstr.getDataStr().c_str());
|
||||||
|
|
||||||
int index = m_commands->storeCycData(m_sstr.getDataStr());
|
int index = m_commands->storeCycData(m_sstr.getDataStr());
|
||||||
|
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
L.log(bus, debug, " command not found");
|
L.log(cyc, debug, " command not found");
|
||||||
}
|
}
|
||||||
else if (index == -2) {
|
else if (index == -2) {
|
||||||
L.log(bus, debug, " no commands defined");
|
L.log(cyc, debug, " no commands defined");
|
||||||
}
|
}
|
||||||
else if (index == -3) {
|
else if (index == -3) {
|
||||||
L.log(bus, debug, " search skipped - string too short");
|
L.log(cyc, debug, " search skipped - string too short");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::string tmp;
|
std::string tmp;
|
||||||
tmp += (*m_commands)[index][1];
|
tmp += (*m_commands)[index][1];
|
||||||
tmp += " ";
|
tmp += " ";
|
||||||
tmp += (*m_commands)[index][2];
|
tmp += (*m_commands)[index][2];
|
||||||
L.log(bus, event, " cycle [%4d] %s", index, tmp.c_str());
|
L.log(cyc, event, " cycle [%4d] %s", index, tmp.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
// collect Slave address
|
// collect Slave address
|
||||||
|
|||||||
+13
-8
@@ -30,8 +30,13 @@
|
|||||||
/** the maximum time [us] allowed for retrieving a byte from an addressed slave */
|
/** the maximum time [us] allowed for retrieving a byte from an addressed slave */
|
||||||
#define RECV_TIMEOUT 10000
|
#define RECV_TIMEOUT 10000
|
||||||
|
|
||||||
/** possible command types */
|
/** possible bus command types */
|
||||||
enum CommandType { invalid, broadcast, masterMaster, masterSlave };
|
enum BusCommandType {
|
||||||
|
invalid, // invalid command type
|
||||||
|
broadcast, // broadcast
|
||||||
|
masterMaster, // master - master
|
||||||
|
masterSlave, // master - slave
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief class for data/message transfer between baseloop and busloop.
|
* @brief class for data/message transfer between baseloop and busloop.
|
||||||
@@ -41,7 +46,7 @@ class BusMessage
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @brief constructs a new bus message instance and determine command type.
|
* @brief construct a new bus message instance and determine command type.
|
||||||
* @param command the command data to write on bus.
|
* @param command the command data to write on bus.
|
||||||
* @param poll true if message type is polling.
|
* @param poll true if message type is polling.
|
||||||
* @param scan true if message type is scanning.
|
* @param scan true if message type is scanning.
|
||||||
@@ -58,10 +63,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief get the command type.
|
* @brief get the bus command type.
|
||||||
* @return the command type.
|
* @return the bus command type.
|
||||||
*/
|
*/
|
||||||
CommandType getType() const { return m_type; }
|
BusCommandType getType() const { return m_type; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief get the command string.
|
* @brief get the command string.
|
||||||
@@ -124,8 +129,8 @@ public:
|
|||||||
void sendSignal() { pthread_cond_signal(&m_cond); }
|
void sendSignal() { pthread_cond_signal(&m_cond); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** the command type */
|
/** the bus command type */
|
||||||
CommandType m_type;
|
BusCommandType m_type;
|
||||||
|
|
||||||
/** true if message is of type polling */
|
/** true if message is of type polling */
|
||||||
bool m_poll;
|
bool m_poll;
|
||||||
|
|||||||
+91
-6
@@ -17,11 +17,19 @@
|
|||||||
* along with ebusd. If not, see http://www.gnu.org/licenses/.
|
* along with ebusd. If not, see http://www.gnu.org/licenses/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "appl.h"
|
#include "appl.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
extern Logger& L;
|
extern Logger& L;
|
||||||
extern Appl& A;
|
extern Appl& A;
|
||||||
@@ -32,14 +40,17 @@ void* Connection::run()
|
|||||||
{
|
{
|
||||||
m_running = true;
|
m_running = true;
|
||||||
|
|
||||||
int ret, nfds = 2;
|
int ret;
|
||||||
struct pollfd fds[nfds];
|
|
||||||
struct timespec tdiff;
|
struct timespec tdiff;
|
||||||
|
|
||||||
// set select timeout 10 secs
|
// set select timeout 10 secs
|
||||||
tdiff.tv_sec = 10;
|
tdiff.tv_sec = 10;
|
||||||
tdiff.tv_nsec = 0;
|
tdiff.tv_nsec = 0;
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
|
int nfds = 2;
|
||||||
|
struct pollfd fds[nfds];
|
||||||
|
|
||||||
memset(fds, 0, sizeof(fds));
|
memset(fds, 0, sizeof(fds));
|
||||||
|
|
||||||
fds[0].fd = m_notify.notifyFD();
|
fds[0].fd = m_notify.notifyFD();
|
||||||
@@ -47,21 +58,55 @@ void* Connection::run()
|
|||||||
|
|
||||||
fds[1].fd = m_socket->getFD();
|
fds[1].fd = m_socket->getFD();
|
||||||
fds[1].events = POLLIN;
|
fds[1].events = POLLIN;
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_PSELECT
|
||||||
|
int maxfd;
|
||||||
|
fd_set checkfds;
|
||||||
|
|
||||||
|
FD_ZERO(&checkfds);
|
||||||
|
FD_SET(m_notify.notifyFD(), &checkfds);
|
||||||
|
FD_SET(m_socket->getFD(), &checkfds);
|
||||||
|
|
||||||
|
(m_notify.notifyFD() > m_socket->getFD()) ?
|
||||||
|
(maxfd = m_notify.notifyFD()) : (maxfd = m_socket->getFD());
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
// wait for new fd event
|
// wait for new fd event
|
||||||
ret = ppoll(fds, nfds, &tdiff, NULL);
|
ret = ppoll(fds, nfds, &tdiff, NULL);
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_PSELECT
|
||||||
|
// set readfds to inital checkfds
|
||||||
|
fd_set readfds = checkfds;
|
||||||
|
// wait for new fd event
|
||||||
|
ret = pselect(maxfd + 1, &readfds, NULL, NULL, &tdiff, NULL);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
if (ret == 0) {
|
if (ret == 0)
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
// new data from notify
|
// new data from notify
|
||||||
if (fds[0].revents & POLLIN)
|
if (fds[0].revents & POLLIN)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// new data from socket
|
// new data from socket
|
||||||
if (fds[1].revents & POLLIN) {
|
if (fds[1].revents & POLLIN) {
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_PSELECT
|
||||||
|
// new data from notify
|
||||||
|
if (FD_ISSET(m_notify.notifyFD(), &readfds))
|
||||||
|
break;
|
||||||
|
|
||||||
|
// new data from socket
|
||||||
|
if (FD_ISSET(m_socket->getFD(), &readfds)) {
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
char data[256];
|
char data[256];
|
||||||
size_t datalen;
|
size_t datalen;
|
||||||
|
|
||||||
@@ -139,14 +184,17 @@ void* Network::run()
|
|||||||
|
|
||||||
m_running = true;
|
m_running = true;
|
||||||
|
|
||||||
int ret, nfds = 2;
|
int ret;
|
||||||
struct pollfd fds[nfds];
|
|
||||||
struct timespec tdiff;
|
struct timespec tdiff;
|
||||||
|
|
||||||
// set select timeout 1 secs
|
// set select timeout 1 secs
|
||||||
tdiff.tv_sec = 1;
|
tdiff.tv_sec = 1;
|
||||||
tdiff.tv_nsec = 0;
|
tdiff.tv_nsec = 0;
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
|
int nfds = 2;
|
||||||
|
struct pollfd fds[nfds];
|
||||||
|
|
||||||
memset(fds, 0, sizeof(fds));
|
memset(fds, 0, sizeof(fds));
|
||||||
|
|
||||||
fds[0].fd = m_notify.notifyFD();
|
fds[0].fd = m_notify.notifyFD();
|
||||||
@@ -154,16 +202,40 @@ void* Network::run()
|
|||||||
|
|
||||||
fds[1].fd = m_tcpServer->getFD();
|
fds[1].fd = m_tcpServer->getFD();
|
||||||
fds[1].events = POLLIN;
|
fds[1].events = POLLIN;
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_PSELECT
|
||||||
|
int maxfd;
|
||||||
|
fd_set checkfds;
|
||||||
|
|
||||||
|
FD_ZERO(&checkfds);
|
||||||
|
FD_SET(m_notify.notifyFD(), &checkfds);
|
||||||
|
FD_SET(m_tcpServer->getFD(), &checkfds);
|
||||||
|
|
||||||
|
(m_notify.notifyFD() > m_tcpServer->getFD()) ?
|
||||||
|
(maxfd = m_notify.notifyFD()) : (maxfd = m_tcpServer->getFD());
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
// wait for new fd event
|
// wait for new fd event
|
||||||
ret = ppoll(fds, nfds, &tdiff, NULL);
|
ret = ppoll(fds, nfds, &tdiff, NULL);
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_PSELECT
|
||||||
|
// set readfds to inital checkfds
|
||||||
|
fd_set readfds = checkfds;
|
||||||
|
// wait for new fd event
|
||||||
|
ret = pselect(maxfd + 1, &readfds, NULL, NULL, &tdiff, NULL);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
cleanConnections();
|
cleanConnections();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
// new data from notify
|
// new data from notify
|
||||||
if (fds[0].revents & POLLIN) {
|
if (fds[0].revents & POLLIN) {
|
||||||
m_running = false;
|
m_running = false;
|
||||||
@@ -172,6 +244,19 @@ void* Network::run()
|
|||||||
|
|
||||||
// new data from socket
|
// new data from socket
|
||||||
if (fds[1].revents & POLLIN) {
|
if (fds[1].revents & POLLIN) {
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_PSELECT
|
||||||
|
// new data from notify
|
||||||
|
if (FD_ISSET(m_notify.notifyFD(), &readfds)) {
|
||||||
|
m_running = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// new data from socket
|
||||||
|
if (FD_ISSET(m_tcpServer->getFD(), &readfds)) {
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
TCPSocket* socket = m_tcpServer->newSocket();
|
TCPSocket* socket = m_tcpServer->newSocket();
|
||||||
if (socket == NULL)
|
if (socket == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ void ConfigCommands::setType(const FileType type)
|
|||||||
delete m_configfile;
|
delete m_configfile;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case CSV:
|
case ft_csv:
|
||||||
m_configfile = new ConfigFileCSV();
|
m_configfile = new ConfigFileCSV();
|
||||||
m_extension = "csv";
|
m_extension = "csv";
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -25,7 +25,9 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
/** available file endings / types. */
|
/** available file endings / types. */
|
||||||
enum FileType { CSV };
|
enum FileType {
|
||||||
|
ft_csv
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief base class for config files.
|
* @brief base class for config files.
|
||||||
|
|||||||
+26
-6
@@ -17,6 +17,10 @@
|
|||||||
* along with ebusd. If not, see http://www.gnu.org/licenses/.
|
* along with ebusd. If not, see http://www.gnu.org/licenses/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "port.h"
|
#include "port.h"
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
@@ -24,7 +28,10 @@
|
|||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
bool Device::isOpen()
|
bool Device::isOpen()
|
||||||
{
|
{
|
||||||
@@ -64,20 +71,33 @@ ssize_t Device::recvBytes(const long timeout, size_t maxCount)
|
|||||||
return -1; // TODO RESULT_ERR_DEVICE
|
return -1; // TODO RESULT_ERR_DEVICE
|
||||||
|
|
||||||
if (timeout > 0) {
|
if (timeout > 0) {
|
||||||
int ret, nfds = 1;
|
int ret;
|
||||||
struct pollfd fds[nfds];
|
|
||||||
struct timespec tdiff;
|
struct timespec tdiff;
|
||||||
|
|
||||||
// set select timeout
|
// set select timeout
|
||||||
tdiff.tv_sec = 0;
|
tdiff.tv_sec = 0;
|
||||||
tdiff.tv_nsec = timeout*1000;
|
tdiff.tv_nsec = timeout*1000;
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
|
int nfds = 1;
|
||||||
|
struct pollfd fds[nfds];
|
||||||
|
|
||||||
memset(fds, 0, sizeof(fds));
|
memset(fds, 0, sizeof(fds));
|
||||||
|
|
||||||
fds[0].fd = m_fd;
|
fds[0].fd = m_fd;
|
||||||
fds[0].events = POLLIN;
|
fds[0].events = POLLIN;
|
||||||
|
|
||||||
ret = ppoll(fds, nfds, &tdiff, NULL);
|
ret = ppoll(fds, nfds, &tdiff, NULL);
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_PSELECT
|
||||||
|
fd_set readfds;
|
||||||
|
|
||||||
|
FD_ZERO(&readfds);
|
||||||
|
FD_SET(m_fd, &readfds);
|
||||||
|
|
||||||
|
ret = pselect(m_fd + 1, &readfds, NULL, NULL, &tdiff, NULL);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
if (ret == -1) return -1; // TODO RESULT_ERR_DEVICE
|
if (ret == -1) return -1; // TODO RESULT_ERR_DEVICE
|
||||||
if (ret == 0) return -2; // TODO RESULT_ERR_TIMEOUT
|
if (ret == 0) return -2; // TODO RESULT_ERR_TIMEOUT
|
||||||
@@ -232,9 +252,9 @@ Port::Port(const std::string deviceName, const bool noDeviceCheck)
|
|||||||
|
|
||||||
if (strchr(deviceName.c_str(), '/') == NULL &&
|
if (strchr(deviceName.c_str(), '/') == NULL &&
|
||||||
strchr(deviceName.c_str(), ':') != NULL)
|
strchr(deviceName.c_str(), ':') != NULL)
|
||||||
setType(NETWORK);
|
setType(dt_network);
|
||||||
else
|
else
|
||||||
setType(SERIAL);
|
setType(dt_serial);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Port::setType(const DeviceType type)
|
void Port::setType(const DeviceType type)
|
||||||
@@ -243,10 +263,10 @@ void Port::setType(const DeviceType type)
|
|||||||
delete m_device;
|
delete m_device;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SERIAL:
|
case dt_serial:
|
||||||
m_device = new DeviceSerial();
|
m_device = new DeviceSerial();
|
||||||
break;
|
break;
|
||||||
case NETWORK:
|
case dt_network:
|
||||||
m_device = new DeviceNetwork();
|
m_device = new DeviceNetwork();
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|||||||
+4
-1
@@ -26,7 +26,10 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
/** available device types. */
|
/** available device types. */
|
||||||
enum DeviceType { SERIAL, NETWORK };
|
enum DeviceType {
|
||||||
|
dt_serial,
|
||||||
|
dt_network,
|
||||||
|
};
|
||||||
|
|
||||||
/** max bytes write to bus. */
|
/** max bytes write to bus. */
|
||||||
#define MAX_WRITE_SIZE 1
|
#define MAX_WRITE_SIZE 1
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ void readCSV(std::istream& is, Commands& commands){
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
Commands* commands = ConfigCommands("test", CSV).getCommands();
|
Commands* commands = ConfigCommands("test", ft_csv).getCommands();
|
||||||
std::cout << "Commands: " << commands->sizeCmdDB() << std::endl;
|
std::cout << "Commands: " << commands->sizeCmdDB() << std::endl;
|
||||||
|
|
||||||
//~ std::string data("g ci password pin1");
|
//~ std::string data("g ci password pin1");
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
std::string dir("test");
|
std::string dir("test");
|
||||||
ConfigCommands config(dir, CSV);
|
ConfigCommands config(dir, ft_csv);
|
||||||
|
|
||||||
Commands* commands = config.getCommands();
|
Commands* commands = config.getCommands();
|
||||||
|
|
||||||
|
|||||||
@@ -29,11 +29,14 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
/** static char array with logging area names */
|
/** static char array with logging area names */
|
||||||
static const char* AreaNames[Size_of_Areas] = { "bas", "net", "bus" };
|
static const char* AreaNames[Size_of_Areas] = { "bas", "net", "bus", "cyc" };
|
||||||
|
|
||||||
/** static char array with logging level names */
|
/** static char array with logging level names */
|
||||||
static const char* LevelNames[Size_of_Level] = { "error", "event", "trace", "debug" };
|
static const char* LevelNames[Size_of_Level] = { "error", "event", "trace", "debug" };
|
||||||
|
|
||||||
|
/** inline function of log2 */
|
||||||
|
inline double Log2(double n) { return log(n) / log(2); }
|
||||||
|
|
||||||
int calcAreas(const std::string areas)
|
int calcAreas(const std::string areas)
|
||||||
{
|
{
|
||||||
int m_areas = 0;
|
int m_areas = 0;
|
||||||
@@ -120,7 +123,7 @@ void* LogSink::run()
|
|||||||
void LogConsole::write(const LogMessage& message) const
|
void LogConsole::write(const LogMessage& message) const
|
||||||
{
|
{
|
||||||
std::cout << message.getTime() << " ["
|
std::cout << message.getTime() << " ["
|
||||||
<< AreaNames[(int)log2(message.getArea())] << " "
|
<< AreaNames[(int)Log2(message.getArea())] << " "
|
||||||
<< LevelNames[message.getLevel()] << "] "
|
<< LevelNames[message.getLevel()] << "] "
|
||||||
<< message.getText() << std::endl;
|
<< message.getText() << std::endl;
|
||||||
}
|
}
|
||||||
@@ -133,7 +136,7 @@ void LogFile::write(const LogMessage& message) const
|
|||||||
|
|
||||||
if (file.is_open() == true) {
|
if (file.is_open() == true) {
|
||||||
file << message.getTime() << " ["
|
file << message.getTime() << " ["
|
||||||
<< AreaNames[(int)log2(message.getArea())] << " "
|
<< AreaNames[(int)Log2(message.getArea())] << " "
|
||||||
<< LevelNames[message.getLevel()] << "] "
|
<< LevelNames[message.getLevel()] << "] "
|
||||||
<< message.getText() << std::endl;
|
<< message.getText() << std::endl;
|
||||||
file.close();
|
file.close();
|
||||||
|
|||||||
@@ -33,8 +33,9 @@ enum AreasType {
|
|||||||
bas=1, // basis
|
bas=1, // basis
|
||||||
net=2, // network
|
net=2, // network
|
||||||
bus=4, // ebus
|
bus=4, // ebus
|
||||||
all=7, // type for all subsystems
|
cyc=8, // cycle
|
||||||
Size_of_Areas=3, // number of possible areas
|
all=15, // type for all subsystems
|
||||||
|
Size_of_Areas=4, // number of possible areas
|
||||||
};
|
};
|
||||||
|
|
||||||
/** available logging levels */
|
/** available logging levels */
|
||||||
|
|||||||
@@ -137,6 +137,7 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief start listening of tcp socket.
|
* @brief start listening of tcp socket.
|
||||||
|
* @return result of low level functions.
|
||||||
*/
|
*/
|
||||||
int start();
|
int start();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user