diff options
Diffstat (limited to 'tools/AmbSignalMapper/lib/Intel/IviPoc/templates')
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(); |