string path = json_reader_get_string_value(reader);
json_reader_end_member(reader);
- AbstractSource* plugin = loadPlugin<AbstractSource*>(path);
+ AbstractSource* plugin = loadPlugin<AbstractSource*>(path,configurationMap);
if(plugin != nullptr)
{
mSources.push_back(plugin);
- plugin->setConfiguration(configurationMap);
}
json_reader_end_element(reader);
string path = json_reader_get_string_value(reader);
json_reader_end_member(reader);
- AbstractSinkManager* plugin = loadPlugin<AbstractSinkManager*>(path);
+ AbstractSinkManager* plugin = loadPlugin<AbstractSinkManager*>(path, configurationMap);
if(plugin == nullptr)
{
throw std::runtime_error("plugin is not a SinkManager");
}
- plugin->setConfiguration(configurationMap);
-
json_reader_end_element(reader);
}
using namespace std;
-typedef void* create_t(AbstractRoutingEngine*);
+typedef void* create_t(AbstractRoutingEngine*, map<string, string> );
class PluginLoader
private: ///methods:
template<class T>
- T loadPlugin(string pluginName)
+ T loadPlugin(string pluginName, map<string, string> config)
{
DebugOut()<<"Loading plugin: "<<pluginName<<endl;
if(f_create)
{
- void* obj = f_create(routingEngine);
+ void* obj = f_create(routingEngine, config);
return static_cast<T>( obj );
}
"sources" : [
{
"name" : "WheelSource",
- "path" : "/usr/lib/automotive-message-broker/wheelsourceplugin.so"
+ "path" : "/usr/lib/automotive-message-broker/wheelsourceplugin.so",
+ "device" : "/dev/input/js1"
}
],
"sinks": [
"sources" : [
{
"name" : "WheelSource",
- "path" : "/usr/lib/automotive-message-broker/wheelsourceplugin.so"
+ "path" : "/usr/lib/automotive-message-broker/wheelsourceplugin.so",
+ "device" : "/dev/input/js1"
}
],
"sinks": [
{
"name" : "WebSocketSink",
- "path" : "/usr/lib/automotive-message-broker/websocketsinkplugin.so"
+ "path" : "/usr/lib/automotive-message-broker/websocketsinkplugin.so",
+ "interface" : "lo"
} ,
{
"path" : "/usr/lib/automotive-message-broker/demosinkplugin.so",
#include "abstractsink.h"
#include "abstractroutingengine.h"
-AbstractSink::AbstractSink(AbstractRoutingEngine* engine)
-:routingEngine(engine)
+AbstractSink::AbstractSink(AbstractRoutingEngine* engine, map<string, string> config)
+ :routingEngine(engine), configuration(config)
{
routingEngine->registerSink(this);
}
configuration = config;
}
-AbstractSinkManager::AbstractSinkManager(AbstractRoutingEngine* engine)
+AbstractSinkManager::AbstractSinkManager(AbstractRoutingEngine* engine, map<string, string> config)
:routingEngine(engine)
{
-
-}
-
-void AbstractSinkManager::setConfiguration(map<string, string> config)
-{
configuration = config;
}
+
{
public:
- AbstractSink(AbstractRoutingEngine* engine);
+ AbstractSink(AbstractRoutingEngine* engine, map<string, string> config);
virtual ~AbstractSink();
///Pure virtual methods:
{
public:
- AbstractSinkManager(AbstractRoutingEngine* engine);
-
- virtual void setConfiguration(map<string, string> config);
+ AbstractSinkManager(AbstractRoutingEngine* engine, map<string, string> config);
protected:
AbstractRoutingEngine* routingEngine;
#include "abstractsource.h"
-AbstractSource::AbstractSource(AbstractRoutingEngine* engine)
-: AbstractSink(engine), routingEngine(engine)
+AbstractSource::AbstractSource(AbstractRoutingEngine* engine, map<string, string> config)
+ : AbstractSink(engine,config), routingEngine(engine)
{
}
{
public:
- AbstractSource(AbstractRoutingEngine* engine);
+ AbstractSource(AbstractRoutingEngine* engine, map<string, string> config);
virtual ~AbstractSource();
///pure virtual methods:
AbstractRoutingEngine* routingEngine;
private:
- AbstractSource():AbstractSink(nullptr) { }
+ AbstractSource():AbstractSink(nullptr, map<string,string>()) { }
};
#endif // ABSTRACTSOURCE_H
#include "listplusplus.h"
AccelerationPropertyInterface::AccelerationPropertyInterface(AbstractRoutingEngine *re, GDBusConnection* connection)
- :DBusSink("org.automotive.acceleration","/org/automotive/acceleration", re, connection),
+ :DBusSink("org.automotive.acceleration","/org/automotive/acceleration", re, connection, map<string, string> ()),
accelerationX(nullptr), accelerationY(nullptr), accelerationZ(nullptr)
{
supportedChanged(re->supported());
#include "debugout.h"
#include "listplusplus.h"
-extern "C" AbstractSinkManager * create(AbstractRoutingEngine* routingengine)
+extern "C" AbstractSinkManager * create(AbstractRoutingEngine* routingengine, map<string, string> config)
{
- return new DBusSinkManager(routingengine);
+ return new DBusSinkManager(routingengine, config);
}
-DBusSink::DBusSink(string interface, string path, AbstractRoutingEngine* engine, GDBusConnection* connection)
+DBusSink::DBusSink(string interface, string path, AbstractRoutingEngine* engine, GDBusConnection* connection, map<string, string> config)
:AbstractDBusInterface(interface, path, connection),
- AbstractSink(engine), supported(false)
+ AbstractSink(engine, config), supported(false)
{
}
return "c2e6cafa-eef5-4b8a-99a0-0f2c9be1057d";
}
-DBusSinkManager::DBusSinkManager(AbstractRoutingEngine *engine)
- :AbstractSinkManager(engine)
+DBusSinkManager::DBusSinkManager(AbstractRoutingEngine *engine, map<string, string> config)
+ :AbstractSinkManager(engine, config)
{
DBusInterfaceManager* manager = new DBusInterfaceManager(engine);
}
{
public:
- DBusSink(std::string interface, std::string path, AbstractRoutingEngine* engine, GDBusConnection* connection);
+ DBusSink(std::string interface, std::string path, AbstractRoutingEngine* engine, GDBusConnection* connection, map<string, string> config);
virtual void supportedChanged(PropertyList supportedProperties);
virtual void propertyChanged(VehicleProperty::Property property, AbstractPropertyType *value, std::string uuid);
virtual std::string uuid();
class DBusSinkManager: public AbstractSinkManager
{
public:
- DBusSinkManager(AbstractRoutingEngine* engine);
+ DBusSinkManager(AbstractRoutingEngine* engine, map<string, string> config);
};
#endif
{
public:
VehicleSpeedProperty(AbstractRoutingEngine* re, GDBusConnection* connection)
- :DBusSink("org.automotive.vehicleSpeed","/org/automotive/vehiclespeed", re, connection)
+ :DBusSink("org.automotive.vehicleSpeed","/org/automotive/vehiclespeed", re, connection, map<string, string>())
{
wantProperty<uint16_t>(VehicleProperty::VehicleSpeed,"VehicleSpeed", "i", AbstractProperty::Read);
supportedChanged(re->supported());
}
-DemoSink::DemoSink(AbstractRoutingEngine* re)
-:AbstractSink(re)
+DemoSink::DemoSink(AbstractRoutingEngine* re, map<string, string> config)
+:AbstractSink(re, config)
{
routingEngine->subscribeToProperty(VehicleProperty::ButtonEvent, this);
routingEngine->subscribeToProperty(VehicleProperty::TurnSignal, this);
}
-extern "C" AbstractSinkManager * create(AbstractRoutingEngine* routingengine)
+extern "C" AbstractSinkManager * create(AbstractRoutingEngine* routingengine, map<string, string> config)
{
- return new DemoSinkManager(routingengine);
+ return new DemoSinkManager(routingengine, config);
}
string DemoSink::uuid()
{
public:
- DemoSink(AbstractRoutingEngine* re);
+ DemoSink(AbstractRoutingEngine* re, map<string, string> config);
~DemoSink();
string uuid();
class DemoSinkManager: public AbstractSinkManager
{
public:
- DemoSinkManager(AbstractRoutingEngine* engine)
- :AbstractSinkManager(engine)
+ DemoSinkManager(AbstractRoutingEngine* engine, map<string, string> config)
+ :AbstractSinkManager(engine, config)
{
}
void setConfiguration(map<string, string> config)
{
- DemoSink* sink = new DemoSink(routingEngine);
+ DemoSink* sink = new DemoSink(routingEngine, config);
sink->setConfiguration(config);
}
};
return true;
}
-ExampleSourcePlugin::ExampleSourcePlugin(AbstractRoutingEngine* re)
-:AbstractSource(re), velocity(0), engineSpeed(0)
+ExampleSourcePlugin::ExampleSourcePlugin(AbstractRoutingEngine* re, map<string, string> config)
+:AbstractSource(re, config), velocity(0), engineSpeed(0)
{
re->setSupported(supported(), this);
debugOut("setting timeout");
-extern "C" AbstractSource * create(AbstractRoutingEngine* routingengine)
+extern "C" AbstractSource * create(AbstractRoutingEngine* routingengine, map<string, string> config)
{
- return new ExampleSourcePlugin(routingengine);
+ return new ExampleSourcePlugin(routingengine, config);
}
{
public:
- ExampleSourcePlugin(AbstractRoutingEngine* re);
+ ExampleSourcePlugin(AbstractRoutingEngine* re, map<string, string> config);
string uuid();
void getPropertyAsync(AsyncPropertyReply *reply);
#include "abstractroutingengine.h"
#include "debugout.h"
-extern "C" AbstractSinkManager * create(AbstractRoutingEngine* routingengine)
+extern "C" AbstractSinkManager * create(AbstractRoutingEngine* routingengine, map<string, string> config)
{
- return new ExampleSinkManager(routingengine);
+ return new ExampleSinkManager(routingengine, config);
}
-ExampleSink::ExampleSink(AbstractRoutingEngine* engine): AbstractSink(engine)
+ExampleSink::ExampleSink(AbstractRoutingEngine* engine, map<string, string> config): AbstractSink(engine, config)
{
routingEngine->subscribeToProperty(VehicleProperty::EngineSpeed, this);
routingEngine->subscribeToProperty(VehicleProperty::VehicleSpeed, this);
{
public:
- ExampleSink(AbstractRoutingEngine* engine);
+ ExampleSink(AbstractRoutingEngine* engine, map<string, string> config);
virtual PropertyList subscriptions();
virtual void supportedChanged(PropertyList supportedProperties);
virtual void propertyChanged(VehicleProperty::Property property, AbstractPropertyType* value, std::string uuid);
class ExampleSinkManager: public AbstractSinkManager
{
public:
- ExampleSinkManager(AbstractRoutingEngine* engine)
- :AbstractSinkManager(engine)
+ ExampleSinkManager(AbstractRoutingEngine* engine, map<string, string> config)
+ :AbstractSinkManager(engine, config)
{
-
- }
-
- void setConfiguration(map<string, string> config)
- {
- ExampleSink* sink = new ExampleSink(routingEngine);
- sink->setConfiguration(config);
+ new ExampleSink(routingEngine, config);
}
};
requ->arg = port + ":" + baud;
g_async_queue_push(commandQueue,requ);
}
-OBD2Source::OBD2Source(AbstractRoutingEngine *re) : AbstractSource(re)
+OBD2Source::OBD2Source(AbstractRoutingEngine *re, map<string, string> config) : AbstractSource(re, config)
{
g_timeout_add(50, updateProperties, this );
clientConnected = false;
{
return m_supportedProperties;
}
-extern "C" AbstractSource * create(AbstractRoutingEngine* routingengine)
+extern "C" AbstractSource * create(AbstractRoutingEngine* routingengine, map<string, string> config)
{
- return new OBD2Source(routingengine);
+ return new OBD2Source(routingengine, config);
}
string OBD2Source::uuid()
{
public:
- OBD2Source(AbstractRoutingEngine* re);
+ OBD2Source(AbstractRoutingEngine* re, map<string, string> config);
string uuid();
int portHandle;
void getPropertyAsync(AsyncPropertyReply *reply);
-WebSocketSink::WebSocketSink(AbstractRoutingEngine* re,libwebsocket *wsi,string uuid,VehicleProperty::Property property,std::string ambdproperty) : AbstractSink(re)
+WebSocketSink::WebSocketSink(AbstractRoutingEngine* re,libwebsocket *wsi,string uuid,VehicleProperty::Property property,std::string ambdproperty) : AbstractSink(re,map<string, string> ())
{
m_amdbproperty = ambdproperty;
m_uuid = uuid;
-WebSocketSinkManager::WebSocketSinkManager(AbstractRoutingEngine* engine):AbstractSinkManager(engine)
+WebSocketSinkManager::WebSocketSinkManager(AbstractRoutingEngine* engine, map<string, string> config):AbstractSinkManager(engine, config)
{
m_engine = engine;
//Create a listening socket on port 23000 on localhost.
-
+
}
void WebSocketSinkManager::init()
{
protocollist[1] = { NULL, NULL, 0 };
-
+ setConfiguration(configuration);
}
void WebSocketSinkManager::setConfiguration(map<string, string> config)
{
WebSocketSink *sink = new WebSocketSink(m_engine,socket,uuid,property,tmpstr);
m_sinkMap[property] = sink;
}
-extern "C" AbstractSinkManager * create(AbstractRoutingEngine* routingengine)
+extern "C" AbstractSinkManager * create(AbstractRoutingEngine* routingengine, map<string, string> config)
{
- sinkManager = new WebSocketSinkManager(routingengine);
+ sinkManager = new WebSocketSinkManager(routingengine, config);
sinkManager->init();
return sinkManager;
}
class WebSocketSinkManager: public AbstractSinkManager
{
public:
- WebSocketSinkManager(AbstractRoutingEngine* engine);
+ WebSocketSinkManager(AbstractRoutingEngine* engine, map<string, string> config);
void addSingleShotSink(libwebsocket* socket, VehicleProperty::Property property,string id);
void addSink(libwebsocket* socket, VehicleProperty::Property property,string uuid);
void disconnectAll(libwebsocket* socket);
m_re->updateSupported(list,PropertyList());
}
-WebSocketSource::WebSocketSource(AbstractRoutingEngine *re) : AbstractSource(re)
+WebSocketSource::WebSocketSource(AbstractRoutingEngine *re, map<string, string> config) : AbstractSource(re, config)
{
clientConnected = false;
source = this;
{
return m_supportedProperties;
}
-extern "C" AbstractSource * create(AbstractRoutingEngine* routingengine)
+extern "C" AbstractSource * create(AbstractRoutingEngine* routingengine, map<string, string> config)
{
- return new WebSocketSource(routingengine);
+ return new WebSocketSource(routingengine, config);
}
string WebSocketSource::uuid()
{
public:
- WebSocketSource(AbstractRoutingEngine* re);
+ WebSocketSource(AbstractRoutingEngine* re, map<string, string> config);
string uuid();
boost::any getProperty(VehicleProperty::Property property);
void getPropertyAsync(AsyncPropertyReply *reply);
};
-WheelSourcePlugin::WheelSourcePlugin(AbstractRoutingEngine* re)
-:AbstractSource(re)
+WheelSourcePlugin::WheelSourcePlugin(AbstractRoutingEngine* re, map<string, string> config)
+:AbstractSource(re, config)
{
re->setSupported(supported(), this);
this->mWheel = new WheelPrivate(this, re);
-extern "C" AbstractSource * create(AbstractRoutingEngine* routingengine)
+extern "C" AbstractSource * create(AbstractRoutingEngine* routingengine, map<string, string> config)
{
- return new WheelSourcePlugin(routingengine);
+ return new WheelSourcePlugin(routingengine, config);
}
string WheelSourcePlugin::uuid()
//FIXME: Support config file with joystick device mapping, button/axis mappings, etc.
- if ((fd = open("/dev/input/js0", O_RDONLY)) < 0) {
+ std::string jsdev = parent->getConfiguration()["device"];
+
+ DebugOut(0)<<"JSDev: "<<jsdev<<endl;
+
+ if(jsdev == "")
+ jsdev = "/dev/input/js0";
+
+ if ((fd = open(jsdev.c_str(), O_RDONLY)) < 0) {
throw std::runtime_error("Could not find a joystick class device!"); //FIXME: Later, don't throw, watch input devices, and jump on to any JS devices that appear
return;
}
{
public:
- WheelSourcePlugin(AbstractRoutingEngine* re);
+ WheelSourcePlugin(AbstractRoutingEngine* re, map<string, string> config);
~WheelSourcePlugin();
string uuid();
void propertyChanged(VehicleProperty::Property property, AbstractPropertyType* value, string uuid) {}
void supportedChanged(PropertyList) {}
+ map<string, string> getConfiguration() { return configuration; }
+
friend class WheelPrivate;
private: