summaryrefslogtreecommitdiff
path: root/tools/AmbSignalMapper/lib/Intel/IviPoc/templates
diff options
context:
space:
mode:
Diffstat (limited to 'tools/AmbSignalMapper/lib/Intel/IviPoc/templates')
-rw-r--r--tools/AmbSignalMapper/lib/Intel/IviPoc/templates/CMakeLists.txt31
-rw-r--r--tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl.in.json7
-rw-r--r--tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_cansignal.cpp12
-rw-r--r--tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_cansignal.h28
-rw-r--r--tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_plugin.cpp30
-rw-r--r--tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_plugin.h20
6 files changed, 108 insertions, 20 deletions
diff --git a/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/CMakeLists.txt b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/CMakeLists.txt
index 6d392eed..f5bfee92 100644
--- a/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/CMakeLists.txt
+++ b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/CMakeLists.txt
@@ -1,19 +1,27 @@
cmake_minimum_required(VERSION 2.8)
-set( CMAKE_VERBOSE_MAKEFILE on )
+set(CMAKE_VERBOSE_MAKEFILE on )
+set(PLUGIN_SEGMENT_INSTALL_PATH "/etc/ambd/plugins.d")
+set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)" )
+set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/${CMAKE_LIBRARY_ARCHITECTURE}" )
+set(PLUGIN_INSTALL_PATH "${LIB_INSTALL_DIR}/automotive-message-broker")
# to install plugin into /usr instead of /usr/local
set (CMAKE_INSTALL_PREFIX /usr)
-IF(CMAKE_BUILD_TYPE MATCHES DEBUG)
+# check that CAN interface is specified and use vcan0 by default
+if(NOT DEFINED ${DEFAULT_CAN_INTERFACE})
+ set(DEFAULT_CAN_INTERFACE "vcan0")
+endif(NOT DEFINED ${DEFAULT_CAN_INTERFACE})
+
+if(CMAKE_BUILD_TYPE MATCHES DEBUG)
message("debug mode")
+else(CMAKE_BUILD_TYPE MATCHES DEBUG)
+ # default is RELEASE mode
+ message("release mode, no logger")
+ add_definitions(-D_LOGGER_NO_LOG)
ENDIF(CMAKE_BUILD_TYPE MATCHES DEBUG)
-IF(CMAKE_BUILD_TYPE MATCHES RELEASE)
- message("release mode")
- add_definitions(-D_LOGGER_NO_LOG)
-ENDIF(CMAKE_BUILD_TYPE MATCHES RELEASE)
-
include(FindPkgConfig)
find_package(Boost REQUIRED)
@@ -21,7 +29,7 @@ find_package(Boost REQUIRED)
pkg_check_modules(glib REQUIRED glib-2.0)
pkg_check_modules(json REQUIRED json)
-add_definitions(-std=gnu++0x -fPIC -fPIE)
+add_definitions(-std=gnu++0x)
pkg_check_modules( amb REQUIRED automotive-message-broker )
pkg_check_modules( amb-plugins-common REQUIRED amb-plugins-common )
@@ -31,6 +39,8 @@ include_directories(${include_dirs} ${amb-plugins-common_INCLUDE_DIRS} ${amb_INC
set(ambtmpl_plugin_headers ambtmpl_plugin.h ambtmpl_cansignals.h ambtmpl_cansignal.h)
set(ambtmpl_plugin_sources ambtmpl_plugin.cpp ambtmpl_cansignal.cpp)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ambtmpl.in.json ${CMAKE_CURRENT_BINARY_DIR}/ambtmpl @ONLY)
+
if(ivipoc_tests)
#########################################
# ivipoc_tests START
@@ -63,6 +73,7 @@ add_library(ambtmpl_plugin MODULE ${ambtmpl_plugin_sources} ${ambtmpl_plugin_hea
set_target_properties(ambtmpl_plugin PROPERTIES PREFIX "")
target_link_libraries(ambtmpl_plugin ${link_libraries} ${libamb_LIBRARY} ${amb_LIBRARIES} ${amb-plugins-common_LIBRARIES})
-install(TARGETS ambtmpl_plugin LIBRARY DESTINATION lib/automotive-message-broker)
+install(TARGETS ambtmpl_plugin LIBRARY DESTINATION "lib/automotive-message-broker")
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ambtmpl DESTINATION ${PLUGIN_SEGMENT_INSTALL_PATH})
+
-############################################################################################################################################
diff --git a/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl.in.json b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl.in.json
new file mode 100644
index 00000000..15cdea99
--- /dev/null
+++ b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl.in.json
@@ -0,0 +1,7 @@
+{
+ "name" : "AmbTmpl",
+ "path" : "@PLUGIN_INSTALL_PATH@/ambtmpl_plugin.so",
+ "frequency" : "10",
+ "enabled" : true,
+ "interface" : "@DEFAULT_CAN_INTERFACE@"
+}
diff --git a/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_cansignal.cpp b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_cansignal.cpp
index b44f36ef..cd4b6d34 100644
--- a/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_cansignal.cpp
+++ b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_cansignal.cpp
@@ -84,6 +84,18 @@ void CANSignal::onMessage(const can_frame& frame, std::function<void (AbstractPr
}
}
+void CANSignal::onTimeout(const can_frame& frame, std::function<void (AbstractPropertyType*)> changeCallback)
+{
+ //TODO: implement <no-value> handling
+/* if (ambProperty->toString() != "none") {
+ ambProperty->setValue("none");
+ if(changeCallback)
+ changeCallback(ambProperty.get());
+ }
+*/
+}
+
+
void CANSignal::setAmbProperty(std::shared_ptr<AbstractPropertyType> ambProperty)
{
this->ambProperty = ambProperty;
diff --git a/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_cansignal.h b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_cansignal.h
index 2ea563fd..1201c3fb 100644
--- a/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_cansignal.h
+++ b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_cansignal.h
@@ -97,6 +97,7 @@ public:
virtual GVariant *processSignal( const can_frame& frame ) = 0;
virtual void onMessage( const can_frame& frame, std::function<void (AbstractPropertyType*)> changeCallback );
+ virtual void onTimeout( const can_frame& frame, std::function<void (AbstractPropertyType*)> changeCallback );
virtual bool updateFrame( can_frame* frame );
@@ -145,9 +146,10 @@ class CANMessage
public:
CANMessage() = delete;
- CANMessage(canid_t canId, __u8 canDlc) :
+ CANMessage(canid_t canId, __u8 canDlc, double CycleTime) :
canId(canId),
- canDlc(canDlc)
+ canDlc(canDlc),
+ CycleTime(CycleTime)
{
}
@@ -159,6 +161,7 @@ public:
void onMessage(const can_frame& frame, std::function<void (AbstractPropertyType*)> changeCallback)
{
+ // sanity check
if(frame.can_dlc != canDlc || frame.can_id != canId)
return;
@@ -171,6 +174,21 @@ public:
}
}
+ void onTimeout(const can_frame& frame, std::function<void (AbstractPropertyType*)> changeCallback)
+ {
+ // sanity check
+ if(frame.can_id != canId)
+ return;
+
+ for ( auto it = canSignals.begin(); it != canSignals.end(); ++it ) {
+ std::shared_ptr<CANSignal> signal(it->second);
+
+ if ( signal ) {
+ signal->onTimeout(frame, changeCallback);
+ }
+ }
+ }
+
void setupFrame(can_frame* frame)
{
if(!frame)
@@ -185,9 +203,15 @@ public:
}
}
+ bool registerOnCANBus(CANBus& canBus)
+ {
+ return canBus.registerCyclicMessageForReceive(canId, 0, CycleTime);
+ }
+
private:
canid_t canId;
__u8 canDlc;
+ double CycleTime;
std::map< VehicleProperty::Property , std::shared_ptr<CANSignal> > canSignals;
};
diff --git a/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_plugin.cpp b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_plugin.cpp
index 6f412742..3353c705 100644
--- a/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_plugin.cpp
+++ b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_plugin.cpp
@@ -25,6 +25,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#include <logger.h>
+#include <canbusimpl.h>
#include "ambtmpl_plugin.h"
#include "ambtmpl_cansignals.h"
@@ -81,10 +82,10 @@ gboolean AmbTmplPlugin::timeoutCallback(gpointer data)
// AmbTmplPlugin
//----------------------------------------------------------------------------
-AmbTmplPlugin::AmbTmplPlugin(AbstractRoutingEngine* re, const map<string, string>& config, AbstractSink& parent) :
+AmbTmplPlugin::AmbTmplPlugin(AbstractRoutingEngine* re, const map<string, string>& config, AbstractSource& parent) :
AmbPluginImpl(re, config, parent),
interface(DEFAULT_CAN_IF_NAME),
- canBus(new CANBus(*static_cast<CANObserver*>(this))),
+ canBus(new CANBusImpl(*static_cast<CANObserver*>(this))),
announcementIntervalTimer(1000),
announcementCount(20)
{
@@ -125,6 +126,11 @@ AmbTmplPlugin::~AmbTmplPlugin()
void AmbTmplPlugin::init()
{
canBus->start(interface.c_str());
+
+ for(auto iter = messages.begin(); iter != messages.end(); iter++) {
+ if (!iter->second.registerOnCANBus(*canBus))
+ LOG_ERROR("Cannot register a message with can_id=0x" << std::hex << iter->first);
+ }
}
AsyncPropertyReply *AmbTmplPlugin::setProperty(const AsyncSetPropertyRequest& request )
@@ -176,6 +182,18 @@ void AmbTmplPlugin::onMessage(const can_frame& frame)
message.onMessage( frame, [&re, &guid](AbstractPropertyType* value){re->updateProperty(value, guid);} );
}
+void AmbTmplPlugin::onTimeout(const can_frame& frame)
+{
+ auto messageIt = messages.find(frame.can_id);
+ if(messageIt == messages.end())
+ return;
+
+ CANMessage& message(messageIt->second);
+ const std::string guid = uuid();
+ AbstractRoutingEngine* re = routingEngine;
+ message.onTimeout( frame, [&re, &guid](AbstractPropertyType* value){re->updateProperty(value, guid);} );
+}
+
bool AmbTmplPlugin::sendValue(AbstractPropertyType* value)
{
if(!value)
@@ -214,6 +232,14 @@ void AmbTmplPlugin::extendedFrameReceived(const can_frame& frame)
onMessage(frame);
}
+void AmbTmplPlugin::timeoutDetected(const can_frame& frame)
+{
+ LOG_INFO("testPlugin::timeoutDetected()");
+ printFrame( frame );
+
+ onTimeout(frame);
+}
+
void AmbTmplPlugin::errorFrameReceived(const can_frame& frame)
{
LOG_INFO("AmbTmplPlugin::errorFrameReceived()");
diff --git a/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_plugin.h b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_plugin.h
index 9e22f554..2ce3b582 100644
--- a/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_plugin.h
+++ b/tools/AmbSignalMapper/lib/Intel/IviPoc/templates/ambtmpl_plugin.h
@@ -30,6 +30,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#include <canbus.h>
#include <canobserver.h>
+#include <ambplugin.h>
#include <ambpluginimpl.h>
#include "ambtmpl_cansignal.h"
@@ -42,7 +43,7 @@ class CANMessage;
class AmbTmplPlugin : public AmbPluginImpl, public CANObserver {
public:
- AmbTmplPlugin(AbstractRoutingEngine* re, const std::map<std::string, std::string>& config, AbstractSink& parent);
+ AmbTmplPlugin(AbstractRoutingEngine* re, const std::map<std::string, std::string>& config, AbstractSource& parent);
virtual ~AmbTmplPlugin(); // has to be virtual because of unit tests
// from AbstractSink
@@ -116,6 +117,12 @@ public:
* \return True if frame was sent
*/
bool sendExtendedFrame(const can_frame& frame);
+ /**
+ * Called when timeout was detected for a cyclic message.
+ * @fn timeoutDetected
+ * @param frame
+ */
+ virtual void timeoutDetected(const can_frame& frame);
/*!
* Second phase of the plugin initialization.
@@ -134,15 +141,15 @@ public:
protected:
- void registerMessage(const canid_t& canId, const __u8& canDlc)
+ void registerMessage(const canid_t& canId, const __u8& canDlc, const double CycleTime)
{
LOG_MESSAGE("registered message: " << canId);
}
template<typename Signal, typename... Rest>
- void registerMessage(const canid_t& canId, const __u8& canDlc, Signal* canSignal, Rest... rest)
+ void registerMessage(const canid_t& canId, const __u8& canDlc, const double CycleTime, Signal* canSignal, Rest... rest)
{
- static_assert(std::is_base_of<CANSignal, Signal>::value, "CANSignal has to be a base of Signal");
+ static_assert(std::is_base_of<CANSignal, Signal>::value, "CANSignal has to be a base class of Signal");
if(!canSignal)
return;
@@ -152,20 +159,21 @@ protected:
canSignal->setAmbProperty(prop);
auto messageIt = messages.find(canId);
if(messageIt == messages.end()){
- messageIt = messages.insert(make_pair(canId, CANMessage(canId, canDlc))).first;
+ messageIt = messages.insert(make_pair(canId, CANMessage(canId, canDlc, CycleTime))).first;
}
auto& message = messageIt->second;
message.addSignal(prop->name, std::shared_ptr<CANSignal>(canSignal));
propertyToMessage[prop->name] = &message;
}
- registerMessage(canId, canDlc, rest...);
+ registerMessage(canId, canDlc, CycleTime, rest...);
}
private:
void printFrame(const can_frame& frame) const;
void onMessage(const can_frame& frame);
+ void onTimeout(const can_frame& frame);
bool sendValue(AbstractPropertyType* value);
void registerMessages();