summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Nechaev <petr.nechaev@cogentembedded.com>2015-04-03 19:55:31 +0300
committerPetr Nechaev <petr.nechaev@cogentembedded.com>2015-04-03 19:55:31 +0300
commit947be368482abf6f5d38a79213d9ba9d1c5debd4 (patch)
tree2ce3ddbadc565979ceede201645d1d27c8d425d1
parent572541c5bcac6ef4e1fda5b31b364d3330816f84 (diff)
downloadautomotive-message-broker-947be368482abf6f5d38a79213d9ba9d1c5debd4.tar.gz
Fixed tabbing issues
-rw-r--r--plugins/common/canobserver.h91
-rw-r--r--plugins/common/cansocketadapter.cpp78
-rw-r--r--plugins/common/cansocketadapter.h116
-rw-r--r--plugins/common/thread.cpp206
-rw-r--r--tools/AmbSignalMapper/lib/Intel/IviPoc/AmbPluginGenerator.pm858
5 files changed, 674 insertions, 675 deletions
diff --git a/plugins/common/canobserver.h b/plugins/common/canobserver.h
index 876998ed..549f0700 100644
--- a/plugins/common/canobserver.h
+++ b/plugins/common/canobserver.h
@@ -39,53 +39,52 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
class CANObserver
{
public:
- /**
- * General CAN bus error. Currently only GENERAL_ERROR is specified.
- * @enum CANError
- * @public
- */
- enum CANError {
- GENERAL_ERROR = 0
- };
-
- virtual ~CANObserver(){} /*LCOV_EXCL_LINE*/
- /**
- * Called when error occurred on the bus.
- * @fn errorOccured
- * @param error Bus error code
- */
- virtual void errorOccured(CANObserver::CANError error) = 0; /* socket error */
- /**
- * Called when standard frame was is received from the bus.
- * @fn standardFrameReceived
- * @param frame Received frame
- */
- virtual void standardFrameReceived(const can_frame& frame) = 0; /* SFF was present */
- /**
- * Called when extended frame was is received from the bus.
- * @fn extendedFrameReceived
- * @param frame Received frame
- */
- virtual void extendedFrameReceived(const can_frame& frame) = 0; /* EFF was present */
- /**
- * Called when error frame was received from the bus.
- * @fn errorFrameReceived
- * @param frame Error frame
- */
- virtual void errorFrameReceived(const can_frame& frame) = 0; /* error frame */
- /**
- * Called when remote transmission frame was received from the bus.
- * @fn remoteTransmissionRequest
- * @param frame RTR frame
- */
- virtual void remoteTransmissionRequest(const can_frame& frame) = 0; /* remote transmission request (SFF/EFF is still present)*/
- /**
- * Called when timeout was detected for a cyclic message.
- * @fn timeoutDetected
- * @param frame
- */
- virtual void timeoutDetected(const can_frame& frame) = 0; /* timeout */
+ /**
+ * General CAN bus error. Currently only GENERAL_ERROR is specified.
+ * @enum CANError
+ * @public
+ */
+ enum CANError {
+ GENERAL_ERROR = 0
+ };
+ virtual ~CANObserver(){} /*LCOV_EXCL_LINE*/
+ /**
+ * Called when error occurred on the bus.
+ * @fn errorOccured
+ * @param error Bus error code
+ */
+ virtual void errorOccured(CANObserver::CANError error) = 0; /* socket error */
+ /**
+ * Called when standard frame was is received from the bus.
+ * @fn standardFrameReceived
+ * @param frame Received frame
+ */
+ virtual void standardFrameReceived(const can_frame& frame) = 0; /* SFF was present */
+ /**
+ * Called when extended frame was is received from the bus.
+ * @fn extendedFrameReceived
+ * @param frame Received frame
+ */
+ virtual void extendedFrameReceived(const can_frame& frame) = 0; /* EFF was present */
+ /**
+ * Called when error frame was received from the bus.
+ * @fn errorFrameReceived
+ * @param frame Error frame
+ */
+ virtual void errorFrameReceived(const can_frame& frame) = 0; /* error frame */
+ /**
+ * Called when remote transmission frame was received from the bus.
+ * @fn remoteTransmissionRequest
+ * @param frame RTR frame
+ */
+ virtual void remoteTransmissionRequest(const can_frame& frame) = 0; /* remote transmission request (SFF/EFF is still present)*/
+ /**
+ * Called when timeout was detected for a cyclic message.
+ * @fn timeoutDetected
+ * @param frame
+ */
+ virtual void timeoutDetected(const can_frame& frame) = 0; /* timeout */
};
#endif // CANOBSERVER_H
diff --git a/plugins/common/cansocketadapter.cpp b/plugins/common/cansocketadapter.cpp
index df92bb7d..3395038b 100644
--- a/plugins/common/cansocketadapter.cpp
+++ b/plugins/common/cansocketadapter.cpp
@@ -27,83 +27,83 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
// TODO: handle socket errors
CANSocketAdapter::CANSocketAdapter(CANObserver& observer) :
- CANAdapter(observer),
- mSocket(NULL),
- mReader(NULL)
+ CANAdapter(observer),
+ mSocket(NULL),
+ mReader(NULL)
{
- LOG_TRACE("");
+ LOG_TRACE("");
}
CANSocketAdapter::~CANSocketAdapter()
{
- LOG_TRACE("");
+ LOG_TRACE("");
- stop();
+ stop();
}
bool CANSocketAdapter::start(const char* ifName)
{
- LOG_TRACE("");
+ LOG_TRACE("");
- if(!mSocket || !mReader) {
- init();
- }
+ if(!mSocket || !mReader) {
+ init();
+ }
- if(mSocket && mReader && mSocket->start(ifName) && mReader->start()) {
+ if(mSocket && mReader && mSocket->start(ifName) && mReader->start()) {
return true;
}
stop();
- return false;
+ return false;
}
void CANSocketAdapter::stop()
{
- LOG_TRACE("");
-
- if(mReader) {
- mReader->stop();
- delete mReader;
- mReader = 0;
- }
- if(mSocket) {
- mSocket->stop();
- delete mSocket;
- mSocket = 0;
- }
+ LOG_TRACE("");
+
+ if(mReader) {
+ mReader->stop();
+ delete mReader;
+ mReader = 0;
+ }
+ if(mSocket) {
+ mSocket->stop();
+ delete mSocket;
+ mSocket = 0;
+ }
}
bool CANSocketAdapter::sendFrame(const can_frame& frame)
{
- LOG_TRACE("");
+ LOG_TRACE("");
- if(mSocket) {
+ if(mSocket) {
CANFrameInfo message(frame);
return mSocket->write(message);
- }
- return false;
+ }
+ return false;
}
void CANSocketAdapter::init()
{
- if(!mSocket)
- mSocket = new CANSocketBCM();
- if(!mReader)
- mReader = new CANSocketReader(mObserver, *mSocket);
+ if(!mSocket)
+ mSocket = new CANSocketBCM();
+ if(!mReader)
+ mReader = new CANSocketReader(mObserver, *mSocket);
}
bool CANSocketAdapter::registerCyclicMessageForReceive(int canId, double minCycleTime, double maxCycleTime)
{
- if(mSocket) {
+ if(mSocket)
return mSocket->registerCyclicMessageForReceive(canId, minCycleTime, maxCycleTime);
- }
- return false;
+ else
+ return false;
}
bool CANSocketAdapter::unregisterMessageForReceive(int canId)
{
- if(mSocket) {
- return mSocket->unregisterMessageForReceive(canId);
- }
- return false;
+ if(mSocket)
+ return mSocket->unregisterMessageForReceive(canId);
+ else
+ return false;
}
diff --git a/plugins/common/cansocketadapter.h b/plugins/common/cansocketadapter.h
index 334e523e..811d26a7 100644
--- a/plugins/common/cansocketadapter.h
+++ b/plugins/common/cansocketadapter.h
@@ -38,69 +38,69 @@ class CANSocketReader;
class CANSocketAdapter : public CANAdapter
{
public:
- /**
- * @param observer @link CANObserver Observer @endlink that will receives CAN bus frames
- */
- CANSocketAdapter(CANObserver& observer);
- virtual ~CANSocketAdapter();
+ /**
+ * @param observer @link CANObserver Observer @endlink that will receives CAN bus frames
+ */
+ CANSocketAdapter(CANObserver& observer);
+ virtual ~CANSocketAdapter();
- /**
- * Creates connection the specified network interface and starts listening on it.
- * @fn start
- * @param ifName Name of the CAN bus network interface
- * @return True if no error occurs.
- */
- virtual bool start(const char* ifName);
- /**
- * Closes socket connection and exits listening thread.
- * @fn stop
- */
- virtual void stop();
- /**
- * Sends CAN frame over the socket CAN interface
- * @fn sendFrame
- * @param frame CAN frame to be sent
- * @return True if frame was sent
- */
- virtual bool sendFrame(const can_frame& frame);
- /**
- * Registers CAN ID of a cyclic message for receiving
- * @fn registerCyclicMessageForReceive
- * @param canId CAN ID of the message.
- * @param minCycleTime Minimal interval between messages in seconds. Set to 0 if not used.
- * @param maxCycleTime Maximum interval between messages for timeout detection in seconds. Set to 0 if no timeout detection is necessary.
- * @return True if registration succeeds.
- */
- virtual bool registerCyclicMessageForReceive(int canId, double minCycleTime, double maxCycleTime);
- /**
- * Un-registers CAN ID of a message used of receiving. Valid for cyclic and sporadic messages.
- * @fn unregisterMessageForReceive
- * @param canId CAN ID of the message.
- * @return True if de-registration succeeds.
- */
- virtual bool unregisterMessageForReceive(int canId);
+ /**
+ * Creates connection the specified network interface and starts listening on it.
+ * @fn start
+ * @param ifName Name of the CAN bus network interface
+ * @return True if no error occurs.
+ */
+ virtual bool start(const char* ifName);
+ /**
+ * Closes socket connection and exits listening thread.
+ * @fn stop
+ */
+ virtual void stop();
+ /**
+ * Sends CAN frame over the socket CAN interface
+ * @fn sendFrame
+ * @param frame CAN frame to be sent
+ * @return True if frame was sent
+ */
+ virtual bool sendFrame(const can_frame& frame);
+ /**
+ * Registers CAN ID of a cyclic message for receiving
+ * @fn registerCyclicMessageForReceive
+ * @param canId CAN ID of the message.
+ * @param minCycleTime Minimal interval between messages in seconds. Set to 0 if not used.
+ * @param maxCycleTime Maximum interval between messages for timeout detection in seconds. Set to 0 if no timeout detection is necessary.
+ * @return True if registration succeeds.
+ */
+ virtual bool registerCyclicMessageForReceive(int canId, double minCycleTime, double maxCycleTime);
+ /**
+ * Un-registers CAN ID of a message used of receiving. Valid for cyclic and sporadic messages.
+ * @fn unregisterMessageForReceive
+ * @param canId CAN ID of the message.
+ * @return True if de-registration succeeds.
+ */
+ virtual bool unregisterMessageForReceive(int canId);
protected:
- /**
- * Socket initialization and starts reading thread
- * @fn init
- * @protected
- */
- virtual void init();
+ /**
+ * Socket initialization and starts reading thread
+ * @fn init
+ * @protected
+ */
+ virtual void init();
private:
- /**
- * @link CANSocket CAN Socket wrapper @endlink instance reference
- * @property mSocket
- * @protected
- */
- CANSocket* mSocket;
- /**
- * @link CANSocketReader CANSocket reader @endlink instance reference
- * @property mReader
- * @protected
- */
- CANSocketReader* mReader;
+ /**
+ * @link CANSocket CAN Socket wrapper @endlink instance reference
+ * @property mSocket
+ * @protected
+ */
+ CANSocket* mSocket;
+ /**
+ * @link CANSocketReader CANSocket reader @endlink instance reference
+ * @property mReader
+ * @protected
+ */
+ CANSocketReader* mReader;
};
#endif // CANSOCKETADAPTER_H
diff --git a/plugins/common/thread.cpp b/plugins/common/thread.cpp
index 34f98754..504feb38 100644
--- a/plugins/common/thread.cpp
+++ b/plugins/common/thread.cpp
@@ -44,18 +44,18 @@ static int gActiveThreadCount(0);
static void *PosixThreadProc(void *param)
{
- gMutex.lock();
- ++gActiveThreadCount;
- gMutex.unlock();
-
- CUtil::Thread *thread = (CUtil::Thread *)param;
- thread->run();
-
- gMutex.lock();
- --gActiveThreadCount;
- LOG_INFO("PosixThreadProc() - active threads: " << gActiveThreadCount);
- gMutex.unlock();
- return 0;
+ gMutex.lock();
+ ++gActiveThreadCount;
+ gMutex.unlock();
+
+ CUtil::Thread *thread = (CUtil::Thread *)param;
+ thread->run();
+
+ gMutex.lock();
+ --gActiveThreadCount;
+ LOG_INFO("PosixThreadProc() - active threads: " << gActiveThreadCount);
+ gMutex.unlock();
+ return 0;
}
namespace CUtil{
@@ -64,129 +64,129 @@ namespace CUtil{
////////////////////////////////////////////////
Thread::Thread() :
- thread(0),
- runnableFlag(false)
+ thread(0),
+ runnableFlag(false)
{
- pthread_cond_init( &cond, NULL );
- pthread_mutex_init( &mutex, NULL );
+ pthread_cond_init( &cond, NULL );
+ pthread_mutex_init( &mutex, NULL );
}
bool Thread::start()
{
- pthread_mutex_lock(&mutex);
- if (runnableFlag) {// already running
- pthread_mutex_unlock(&mutex);
- return false;
- }
- // try to run
- if (pthread_create(&thread, NULL/*&thread_attr*/, PosixThreadProc, this) != 0) {
- //pthread_attr_destroy(&thread_attr);
- pthread_mutex_unlock(&mutex);
- return false;
- }
- //pthread_attr_destroy(&thread_attr);
- runnableFlag = true;
- pthread_mutex_unlock(&mutex);
- return true;
+ pthread_mutex_lock(&mutex);
+ if (runnableFlag) {// already running
+ pthread_mutex_unlock(&mutex);
+ return false;
+ }
+ // try to run
+ if (pthread_create(&thread, NULL/*&thread_attr*/, PosixThreadProc, this) != 0) {
+ //pthread_attr_destroy(&thread_attr);
+ pthread_mutex_unlock(&mutex);
+ return false;
+ }
+ //pthread_attr_destroy(&thread_attr);
+ runnableFlag = true;
+ pthread_mutex_unlock(&mutex);
+ return true;
}
bool Thread::setPriority(int priority)
{
- pthread_mutex_lock(&mutex);
- if (!runnableFlag) {// not running yet or terminated already
- pthread_mutex_unlock(&mutex);
- return false;
- }
-
- priority = priority < 1 ? 1 : priority;
- priority = priority < 99 ? priority : 99;
-
- // set priority
- struct sched_param pr;
- pr.__sched_priority = priority;
- if (pthread_setschedparam(thread, SCHED_FIFO, &pr) < 0)
- {
- pthread_mutex_unlock(&mutex);
- return false;
- }
-
- pthread_mutex_unlock(&mutex);
- return true;
+ pthread_mutex_lock(&mutex);
+ if (!runnableFlag) {// not running yet or terminated already
+ pthread_mutex_unlock(&mutex);
+ return false;
+ }
+
+ priority = priority < 1 ? 1 : priority;
+ priority = priority < 99 ? priority : 99;
+
+ // set priority
+ struct sched_param pr;
+ pr.__sched_priority = priority;
+ if (pthread_setschedparam(thread, SCHED_FIFO, &pr) < 0)
+ {
+ pthread_mutex_unlock(&mutex);
+ return false;
+ }
+
+ pthread_mutex_unlock(&mutex);
+ return true;
}
Thread::~Thread()
{
- stop();
- pthread_cond_destroy( &cond );
- pthread_mutex_destroy( &mutex );
- thread = 0;
+ stop();
+ pthread_cond_destroy( &cond );
+ pthread_mutex_destroy( &mutex );
+ thread = 0;
}
void Thread::stop()
{
- if (setRunnableFlag(false) == true) {
- if( thread != 0 ){
- if (thread == pthread_self()){
- int s = pthread_detach(thread);
- ((void)s);// prevent compiler warning in RELEASE build
- LOG_MESSAGE("Thread::stop() - thread " << std::hex << int(thread) << std::dec << " detached, returned value was " << s);
- }
- else{
- int s = pthread_join(thread, NULL);
- if (s != 0){
- LOG_ERROR("Thread::stop() - Joined with thread " << std::hex << int(thread) << std::dec << ", returned value was " << s);
- }
- else{
- LOG_MESSAGE("Thread::stop() - Joined with thread " << std::hex << int(thread) << std::dec << ", returned value was " << s);
- }
- }
- thread = 0;
- }
- }
- return;
+ if (setRunnableFlag(false) == true) {
+ if( thread != 0 ){
+ if (thread == pthread_self()){
+ int s = pthread_detach(thread);
+ ((void)s);// prevent compiler warning in RELEASE build
+ LOG_MESSAGE("Thread::stop() - thread " << std::hex << int(thread) << std::dec << " detached, returned value was " << s);
+ }
+ else{
+ int s = pthread_join(thread, NULL);
+ if (s != 0){
+ LOG_ERROR("Thread::stop() - Joined with thread " << std::hex << int(thread) << std::dec << ", returned value was " << s);
+ }
+ else{
+ LOG_MESSAGE("Thread::stop() - Joined with thread " << std::hex << int(thread) << std::dec << ", returned value was " << s);
+ }
+ }
+ thread = 0;
+ }
+ }
+ return;
}
bool Thread::setRunnableFlag(bool flag)
{
- pthread_mutex_lock(&mutex);
- bool retval(runnableFlag);
- runnableFlag = flag;
-
- if(!runnableFlag)
- pthread_cond_signal(&cond);
- pthread_mutex_unlock(&mutex);
- return retval;
+ pthread_mutex_lock(&mutex);
+ bool retval(runnableFlag);
+ runnableFlag = flag;
+
+ if(!runnableFlag)
+ pthread_cond_signal(&cond);
+ pthread_mutex_unlock(&mutex);
+ return retval;
}
bool Thread::isRunnable(long miliseconds)
{
- bool runnable(false);
+ bool runnable(false);
- pthread_mutex_lock(&mutex);
- if (miliseconds != 0){
- wait(miliseconds);
- }
- runnable = runnableFlag;
+ pthread_mutex_lock(&mutex);
+ if (miliseconds != 0){
+ wait(miliseconds);
+ }
+ runnable = runnableFlag;
- pthread_mutex_unlock(&mutex);
- return runnable;
+ pthread_mutex_unlock(&mutex);
+ return runnable;
}
bool Thread::wait( long miliseconds )
{
- struct timespec abstime;
- clock_gettime(CLOCK_REALTIME, &abstime);
- abstime.tv_sec += ( miliseconds / 1000 );
- miliseconds %= 1000;
- abstime.tv_nsec += ( miliseconds * 1000000L ); // in nanoseconds
- if ( abstime.tv_nsec > 1000000000L /* > 1s */ ){
- abstime.tv_sec += 1; // +1s
- abstime.tv_nsec -= 1000000000L; // -1s
- }
-
- int status = pthread_cond_timedwait( &cond, &mutex, &abstime );
- return ( status == ETIMEDOUT );
+ struct timespec abstime;
+ clock_gettime(CLOCK_REALTIME, &abstime);
+ abstime.tv_sec += ( miliseconds / 1000 );
+ miliseconds %= 1000;
+ abstime.tv_nsec += ( miliseconds * 1000000L ); // in nanoseconds
+ if ( abstime.tv_nsec > 1000000000L /* > 1s */ ){
+ abstime.tv_sec += 1; // +1s
+ abstime.tv_nsec -= 1000000000L; // -1s
+ }
+
+ int status = pthread_cond_timedwait( &cond, &mutex, &abstime );
+ return ( status == ETIMEDOUT );
}
}
diff --git a/tools/AmbSignalMapper/lib/Intel/IviPoc/AmbPluginGenerator.pm b/tools/AmbSignalMapper/lib/Intel/IviPoc/AmbPluginGenerator.pm
index e208c84d..d4e33d34 100644
--- a/tools/AmbSignalMapper/lib/Intel/IviPoc/AmbPluginGenerator.pm
+++ b/tools/AmbSignalMapper/lib/Intel/IviPoc/AmbPluginGenerator.pm
@@ -49,13 +49,13 @@ plugin project.
The following little code snippet shows the module usage.
- use Intel::IviPoc::AmbPluginGenerator qw(processPlugin);
+ use Intel::IviPoc::AmbPluginGenerator qw(processPlugin);
- my $hashingAllowed = "E";
- my $inputfile = "myfile.json";
- my $targetDir = '/home/user/project/automotive-message-broker/plugins';
- processPlugin ( $hashingAllowed, $inputfile, $targetDir );
- ...
+ my $hashingAllowed = "E";
+ my $inputfile = "myfile.json";
+ my $targetDir = '/home/user/project/automotive-message-broker/plugins';
+ processPlugin ( $hashingAllowed, $inputfile, $targetDir );
+ ...
=head1 EXPORT
@@ -80,68 +80,68 @@ based on information comming from input JSON file.
=cut
-my $hashingAllowed = 'E'; # Enabled by default
+my $hashingAllowed = 'E'; # Enabled by default
sub processPlugin {
- $hashingAllowed = $_[0];
- my $dbcjson = $_[1];
- my $targetDir = $_[2];
-
- if ($hashingAllowed eq 'E' ) {
- &encryptAmbPropertyNames( $dbcjson );
- }
-
- my $pluginName = $dbcjson->{'pluginName'};
-
- my $templatesDir = 'templates/';
- my $pluginDir = File::Spec->catdir( ($targetDir, lc($pluginName). '_plugin/') );
-
- # make new folder
- &createDirectory( $pluginDir );
-
- my @templatesFiles = ( "CMakeLists.txt"
- , "ambtmpl_cansignal.h"
- , "ambtmpl_cansignal.cpp"
- , "ambtmpl_plugin.h"
- , "ambtmpl_plugin.cpp"
- , "ambtmpl_cansignals.h"
- , "ambtmpl_plugin.idl"
- , "ambtmpl.in.json"
- );
-
- my @pluginFiles = ( "CMakeLists.txt"
- , lc ($pluginName) . "_cansignal.h"
- , lc ($pluginName) . "_cansignal.cpp"
- , lc ($pluginName) . "_plugin.h"
- , lc ($pluginName) . "_plugin.cpp"
- , lc ($pluginName) . "_cansignals.h"
- , lc ($pluginName) . "_plugin.idl"
- , lc ($pluginName) . ".in.json"
- );
-
- my @generationSubs = ( undef
- , undef
- , undef
- , \&generateUuid
- , \&generateCppImplTypes
- , \&generateSignalsTypes
- , \&generateIdlTypes
- , undef
- );
-
- my $templateFile = '';
- my $pluginFile = '';
- my ($volume, $directory) = File::Spec->splitpath(__FILE__);
- for my $i (0..scalar(@pluginFiles)-1) {
- # First join templates folder and filename
- $templateFile = File::Spec->catfile( ($templatesDir), $templatesFiles[$i] );
- # Now prepend the module full path
- $templateFile = File::Spec->catpath( $volume, $directory, $templateFile );
- # Join target directory with target filename
- $pluginFile = File::Spec->catfile( ($pluginDir), $pluginFiles[$i] );
- # Generate each plugin files
- &generatePluginFile( $templateFile, $pluginFile, $dbcjson, $generationSubs[$i]);
- }
+ $hashingAllowed = $_[0];
+ my $dbcjson = $_[1];
+ my $targetDir = $_[2];
+
+ if ($hashingAllowed eq 'E' ) {
+ &encryptAmbPropertyNames( $dbcjson );
+ }
+
+ my $pluginName = $dbcjson->{'pluginName'};
+
+ my $templatesDir = 'templates/';
+ my $pluginDir = File::Spec->catdir( ($targetDir, lc($pluginName). '_plugin/') );
+
+ # make new folder
+ &createDirectory( $pluginDir );
+
+ my @templatesFiles = ( "CMakeLists.txt"
+ , "ambtmpl_cansignal.h"
+ , "ambtmpl_cansignal.cpp"
+ , "ambtmpl_plugin.h"
+ , "ambtmpl_plugin.cpp"
+ , "ambtmpl_cansignals.h"
+ , "ambtmpl_plugin.idl"
+ , "ambtmpl.in.json"
+ );
+
+ my @pluginFiles = ( "CMakeLists.txt"
+ , lc ($pluginName) . "_cansignal.h"
+ , lc ($pluginName) . "_cansignal.cpp"
+ , lc ($pluginName) . "_plugin.h"
+ , lc ($pluginName) . "_plugin.cpp"
+ , lc ($pluginName) . "_cansignals.h"
+ , lc ($pluginName) . "_plugin.idl"
+ , lc ($pluginName) . ".in.json"
+ );
+
+ my @generationSubs = ( undef
+ , undef
+ , undef
+ , \&generateUuid
+ , \&generateCppImplTypes
+ , \&generateSignalsTypes
+ , \&generateIdlTypes
+ , undef
+ );
+
+ my $templateFile = '';
+ my $pluginFile = '';
+ my ($volume, $directory) = File::Spec->splitpath(__FILE__);
+ for my $i (0..scalar(@pluginFiles)-1) {
+ # First join templates folder and filename
+ $templateFile = File::Spec->catfile( ($templatesDir), $templatesFiles[$i] );
+ # Now prepend the module full path
+ $templateFile = File::Spec->catpath( $volume, $directory, $templateFile );
+ # Join target directory with target filename
+ $pluginFile = File::Spec->catfile( ($pluginDir), $pluginFiles[$i] );
+ # Generate each plugin files
+ &generatePluginFile( $templateFile, $pluginFile, $dbcjson, $generationSubs[$i]);
+ }
}
=head2 generatePluginFile
@@ -153,31 +153,31 @@ based on information comming from input JSON file.
=cut
sub generatePluginFile {
- my $srcFileName = $_[0];
- my $dstFileName = $_[1];
- my $dbcjson = $_[2];
- my $generationSub = $_[3];
+ my $srcFileName = $_[0];
+ my $dstFileName = $_[1];
+ my $dbcjson = $_[2];
+ my $generationSub = $_[3];
- my $pluginName = $dbcjson->{'pluginName'};
+ my $pluginName = $dbcjson->{'pluginName'};
- # Open template file
- my $content = &readFileContent( $srcFileName );
- $content = &replaceTemplateStrings( $content, $pluginName );
+ # Open template file
+ my $content = &readFileContent( $srcFileName );
+ $content = &replaceTemplateStrings( $content, $pluginName );
- if (defined $generationSub) {
- my $generatedCode = $generationSub->( $dbcjson );
- my $place = '\/\*GENERATED_CODE\*\/';
- $content =~ s/$place/$generatedCode/g;
- }
+ if (defined $generationSub) {
+ my $generatedCode = $generationSub->( $dbcjson );
+ my $place = '\/\*GENERATED_CODE\*\/';
+ $content =~ s/$place/$generatedCode/g;
+ }
- # Create new file
- my $pluginFileHandle = &createFile( $dstFileName );
+ # Create new file
+ my $pluginFileHandle = &createFile( $dstFileName );
- # Copy data from one file to another.
- print $pluginFileHandle $content;
+ # Copy data from one file to another.
+ print $pluginFileHandle $content;
- # close the file
- close ($pluginFileHandle);
+ # close the file
+ close ($pluginFileHandle);
}
=head2 createDirectory
@@ -187,11 +187,11 @@ Creates directory for plugin.
=cut
sub createDirectory {
- my $dirName = $_[0];
+ my $dirName = $_[0];
- unless(-e $dirName or mkdir $dirName) {
- die "Unable to create directory '$dirName' $!";
- }
+ unless(-e $dirName or mkdir $dirName) {
+ die "Unable to create directory '$dirName' $!";
+ }
}
=head2 createFile
@@ -201,13 +201,13 @@ Creates file and returns a file handle to it.
=cut
sub createFile {
- my $fileName = $_[0];
+ my $fileName = $_[0];
- # Open file or die
- open(my $fileHandle, '>', $fileName)
- or die "Could not open file '$fileName' $!";
+ # Open file or die
+ open(my $fileHandle, '>', $fileName)
+ or die "Could not open file '$fileName' $!";
- return $fileHandle;
+ return $fileHandle;
}
=head2 replaceTemplateStrings
@@ -217,15 +217,15 @@ Replaces all occurencies of template specific symbols with plugin name.
=cut
sub replaceTemplateStrings {
- my $text = $_[0];
- my $pluginName = $_[1];
-
- $text =~ s/AmbTmpl/$pluginName/g;
- $pluginName = lc ($pluginName);
- $text =~ s/ambtmpl/$pluginName/g;
- $pluginName = uc ($pluginName);
- $text =~ s/AMBTMPL/$pluginName/g;
- return $text;
+ my $text = $_[0];
+ my $pluginName = $_[1];
+
+ $text =~ s/AmbTmpl/$pluginName/g;
+ $pluginName = lc ($pluginName);
+ $text =~ s/ambtmpl/$pluginName/g;
+ $pluginName = uc ($pluginName);
+ $text =~ s/AMBTMPL/$pluginName/g;
+ return $text;
}
=head2 generateUuid
@@ -236,12 +236,12 @@ Returns C++ code to be placed into the target plugin.
=cut
sub generateUuid {
- my $dbcjson = $_[0];
+ my $dbcjson = $_[0];
- my $ug = new Data::UUID;
- my $uuidText = $ug->create_str();
+ my $ug = new Data::UUID;
+ my $uuidText = $ug->create_str();
- return $uuidText;
+ return $uuidText;
}
=head2 generateCppImplTypes
@@ -252,31 +252,31 @@ Returns C++ code to be placed into the target plugin.
=cut
sub generateCppImplTypes {
- my $dbcjson = $_[0];
-
- my $registerMessageText = '';
- my $hexValue = ();
-
- my @engineControlUnits = @{$dbcjson->{'electronicControlUnits'}};
- for my $ecui (0..scalar(@engineControlUnits)-1) {
- if ( exists( $engineControlUnits[$ecui]{'messages'} ) ) {
- my @messages = @{$engineControlUnits[$ecui]{'messages'}};
- for my $msgi (0..scalar(@messages)-1) {
- $hexValue = '0x' . uc ( sprintf( "%x", $messages[$msgi]{'canId'} ) );
- $registerMessageText .= " registerMessage($hexValue, $messages[$msgi]{'canDlc'}, $messages[$msgi]{'cycle'}";
-
- my @signals = @{$messages[$msgi]{'signals'}};
- foreach my $signal ( @signals ) {
- my $type = $signal->{'AMBPropertyType'};
- $registerMessageText .= &generateCppProperty( $signal, $type);
- }
-
- $registerMessageText .= "\n );\n";
- }
- }
- }
-
- return $registerMessageText;
+ my $dbcjson = $_[0];
+
+ my $registerMessageText = '';
+ my $hexValue = ();
+
+ my @engineControlUnits = @{$dbcjson->{'electronicControlUnits'}};
+ for my $ecui (0..scalar(@engineControlUnits)-1) {
+ if ( exists( $engineControlUnits[$ecui]{'messages'} ) ) {
+ my @messages = @{$engineControlUnits[$ecui]{'messages'}};
+ for my $msgi (0..scalar(@messages)-1) {
+ $hexValue = '0x' . uc ( sprintf( "%x", $messages[$msgi]{'canId'} ) );
+ $registerMessageText .= " registerMessage($hexValue, $messages[$msgi]{'canDlc'}, $messages[$msgi]{'cycle'}";
+
+ my @signals = @{$messages[$msgi]{'signals'}};
+ foreach my $signal ( @signals ) {
+ my $type = $signal->{'AMBPropertyType'};
+ $registerMessageText .= &generateCppProperty( $signal, $type);
+ }
+
+ $registerMessageText .= "\n );\n";
+ }
+ }
+ }
+
+ return $registerMessageText;
}
=head2 generateCppProperty
@@ -287,23 +287,23 @@ definitions.
=cut
sub generateCppProperty {
- my $signal = $_[0];
- my $type = $_[1];
-
- my $generatedText = '';
- my $zonesInUse = 0; # TODO this needs to be in config file
-
- if ( exists( $signal->{'AMBPropertyName'} ) ) {
- my $ambPropertyName = $signal->{'AMBPropertyName'};
-
- # TODO CANSignal needs to take zone as argument
- #my $zone = 'Zone::None';
- #if ($zonesInUse) {
- # $zone = &calculateZone( $ambPropertyName );
- #}
- $generatedText .= "\n , new ${ambPropertyName}Type()";
- }
- return $generatedText;
+ my $signal = $_[0];
+ my $type = $_[1];
+
+ my $generatedText = '';
+ my $zonesInUse = 0; # TODO this needs to be in config file
+
+ if ( exists( $signal->{'AMBPropertyName'} ) ) {
+ my $ambPropertyName = $signal->{'AMBPropertyName'};
+
+ # TODO CANSignal needs to take zone as argument
+ #my $zone = 'Zone::None';
+ #if ($zonesInUse) {
+ # $zone = &calculateZone( $ambPropertyName );
+ #}
+ $generatedText .= "\n , new ${ambPropertyName}Type()";
+ }
+ return $generatedText;
}
=head2 generateSignalsTypes
@@ -314,27 +314,27 @@ Returns C++ code to be placed into the target plugin.
=cut
sub generateSignalsTypes {
- my $dbcjson = $_[0];
-
- my $enumsText = '';
- my $propertiesText = '';
-
- # First generate the c++ enums from signals with values
- my @engineControlUnits = @{$dbcjson->{'electronicControlUnits'}};
- for my $ecui (0..scalar(@engineControlUnits)-1) {
- if ( exists( $engineControlUnits[$ecui]{'messages'} ) ) {
- my @messages = @{$engineControlUnits[$ecui]{'messages'}};
- for my $msgi (0..scalar(@messages)-1) {
- my @signals = @{$messages[$msgi]{'signals'}};
- foreach my $signal ( @signals ) {
- my $type = $signal->{'AMBPropertyType'};
- $enumsText .= &generateEnumOrValues( $signal, $type);
- $propertiesText .= &generatePropertyClasses( $signal, $type );
- }
- }
- }
- }
- return $enumsText . $propertiesText;
+ my $dbcjson = $_[0];
+
+ my $enumsText = '';
+ my $propertiesText = '';
+
+ # First generate the c++ enums from signals with values
+ my @engineControlUnits = @{$dbcjson->{'electronicControlUnits'}};
+ for my $ecui (0..scalar(@engineControlUnits)-1) {
+ if ( exists( $engineControlUnits[$ecui]{'messages'} ) ) {
+ my @messages = @{$engineControlUnits[$ecui]{'messages'}};
+ for my $msgi (0..scalar(@messages)-1) {
+ my @signals = @{$messages[$msgi]{'signals'}};
+ foreach my $signal ( @signals ) {
+ my $type = $signal->{'AMBPropertyType'};
+ $enumsText .= &generateEnumOrValues( $signal, $type);
+ $propertiesText .= &generatePropertyClasses( $signal, $type );
+ }
+ }
+ }
+ }
+ return $enumsText . $propertiesText;
}
=head2 generateEnumOrValues
@@ -345,60 +345,60 @@ definitions.
=cut
sub generateEnumOrValues {
- my $signal = $_[0];
- my $type = $_[1];
-
- my $generatedText = "";
-
- my $ambPropertyName = $signal->{'canId'};
- if ( exists( $signal->{'AMBPropertyName'} ) ) {
- $ambPropertyName = $signal->{'AMBPropertyName'};
- }
-
- if ( exists( $signal->{'values'} ) ) {
- my @dupvalues = @{$signal->{'values'}};
- my @values = sort { $$a{'value'} <=> $$b{'value'} } (&removeDuplicates (\@dupvalues));
- my $hexValue = ();
-
- if ( $type eq 'enum' or $type =~ m/int/) {
- # Start with comments
- $generatedText .= "/**< $ambPropertyName\n";
- for my $vali (0..scalar(@values) -1 ) {
- $hexValue = '0x' . uc ( sprintf( "%x", $values[$vali]->{'value'} ) );
- $generatedText .= " * $hexValue = $values[$vali]->{'description'}\n";
- }
- $generatedText .= " */\n";
- }
-
- if ( $type eq 'enum' ) {
- # Enum definition
- $generatedText .= "namespace ${ambPropertyName}s {\n";
- $generatedText .= "enum ${ambPropertyName}Type {\n";
-
- # Generate enum values
- for my $vali (0..scalar(@values) -1 ) {
- $hexValue = '0x' . uc ( sprintf( "%x", $values[$vali]->{'value'} ) );
- $generatedText .= " $values[$vali]->{'name'} = $hexValue";
- if ($vali != scalar(@values)-1 ) {
- $generatedText .= ",";
- }
- $generatedText .= "\n";
- }
- $generatedText .= "};\n";
- $generatedText .= "}\n\n";
- } elsif ( $type =~ m/int/ ) {
- $generatedText .= "namespace ${ambPropertyName}s {\n";
- # Generate values
- for my $vali (0..scalar(@values) -1 ) {
- $hexValue = '0x' . uc ( sprintf( "%x", $values[$vali]->{'value'} ) );
- $generatedText .= "static const $type $values[$vali]->{'name'} = $hexValue;";
- $generatedText .= "\n";
- }
- $generatedText .= "}\n\n";
- }
- }
-
- return $generatedText;
+ my $signal = $_[0];
+ my $type = $_[1];
+
+ my $generatedText = "";
+
+ my $ambPropertyName = $signal->{'canId'};
+ if ( exists( $signal->{'AMBPropertyName'} ) ) {
+ $ambPropertyName = $signal->{'AMBPropertyName'};
+ }
+
+ if ( exists( $signal->{'values'} ) ) {
+ my @dupvalues = @{$signal->{'values'}};
+ my @values = sort { $$a{'value'} <=> $$b{'value'} } (&removeDuplicates (\@dupvalues));
+ my $hexValue = ();
+
+ if ( $type eq 'enum' or $type =~ m/int/) {
+ # Start with comments
+ $generatedText .= "/**< $ambPropertyName\n";
+ for my $vali (0..scalar(@values) -1 ) {
+ $hexValue = '0x' . uc ( sprintf( "%x", $values[$vali]->{'value'} ) );
+ $generatedText .= " * $hexValue = $values[$vali]->{'description'}\n";
+ }
+ $generatedText .= " */\n";
+ }
+
+ if ( $type eq 'enum' ) {
+ # Enum definition
+ $generatedText .= "namespace ${ambPropertyName}s {\n";
+ $generatedText .= "enum ${ambPropertyName}Type {\n";
+
+ # Generate enum values
+ for my $vali (0..scalar(@values) -1 ) {
+ $hexValue = '0x' . uc ( sprintf( "%x", $values[$vali]->{'value'} ) );
+ $generatedText .= " $values[$vali]->{'name'} = $hexValue";
+ if ($vali != scalar(@values)-1 ) {
+ $generatedText .= ",";
+ }
+ $generatedText .= "\n";
+ }
+ $generatedText .= "};\n";
+ $generatedText .= "}\n\n";
+ } elsif ( $type =~ m/int/ ) {
+ $generatedText .= "namespace ${ambPropertyName}s {\n";
+ # Generate values
+ for my $vali (0..scalar(@values) -1 ) {
+ $hexValue = '0x' . uc ( sprintf( "%x", $values[$vali]->{'value'} ) );
+ $generatedText .= "static const $type $values[$vali]->{'name'} = $hexValue;";
+ $generatedText .= "\n";
+ }
+ $generatedText .= "}\n\n";
+ }
+ }
+
+ return $generatedText;
}
=head2 generatePropertyClasses
@@ -413,83 +413,83 @@ Returns C++ definitions of one signal property.
=cut
sub generatePropertyClasses {
- my $signal = $_[0];
- my $type = $_[1];
+ my $signal = $_[0];
+ my $type = $_[1];
- my $generatedText = '';
+ my $generatedText = '';
- my $ambPropertyName = $signal->{'canId'};
- if ( exists( $signal->{'AMBPropertyName'} ) ) {
+ my $ambPropertyName = $signal->{'canId'};
+ if ( exists( $signal->{'AMBPropertyName'} ) ) {
$ambPropertyName = $signal->{'AMBPropertyName'};
- }
-
- my $byteOrdering = "Endian::Intel"; # LittleEndian by default
- if ( exists( $signal->{'byteOrdering'} ) and $signal->{'byteOrdering'} eq '0') {
- $byteOrdering = "Endian::Motorola"; # BigEndian
- }
-
- my $signedness;
- if ($signal->{'signedness'} eq '+') {
- $signedness = "Signedness::Unsigned"; # Unsigned
- } else {
- $signedness = "Signedness::Signed"; # Signed
- }
-
- my $convertFromFunction = "nullptr";
- if ( exists( $signal->{'AMBConversionFrom'} ) ) {
- $convertFromFunction = $signal->{'AMBConversionFrom'};
- }
-
- my $convertToFunction = "nullptr";
- if ( exists( $signal->{'AMBConversionTo'} ) ) {
- $convertToFunction = $signal->{'AMBConversionTo'};
- }
-
- $generatedText .= "\n";
- $generatedText .= "/**< $ambPropertyName.\n";
-
- my $typeBasedText = '';
- my $cppType;
-
- if ( $type =~ m/enum/ ) {
- if ( exists( $signal->{'values'} ) ) {
- $generatedText .= " *\@see ${ambPropertyName}s::${ambPropertyName}Type\n";
- $cppType = "${ambPropertyName}s::${ambPropertyName}Type";
- }
- } elsif ( $type =~ m/bool/ ) {
- if ( exists( $signal->{'values'} ) ) {
- my @dupvalues = @{$signal->{'values'}};
- my @values = sort { $$a{'value'} <=> $$b{'value'} } (&removeDuplicates (\@dupvalues));
- my $hexValue = ();
- for my $vali (0..scalar(@values) -1 ) {
- $hexValue = '0x' . uc ( sprintf( "%x", $values[$vali]->{'value'} ) );
- $generatedText .= " * $hexValue = $values[$vali]->{'description'}\n";
- }
- }
- $cppType = "$type";
- } elsif ( $type =~ m/int8/ ) {
- $cppType = "char";
- } elsif ( $type =~ m/int32/ ) {
- if ( $type eq 'uint32_t' ) {
- $cppType = "$type";
- } else {
- $cppType = "int";
- }
- } else { # (u)int16, (u)int64
- $cppType = "$type";
- }
-
- $typeBasedText .= "CANSIGNAL($ambPropertyName, $cppType, $signal->{'startBit'}, $signal->{'length'}, $byteOrdering, $signedness, $signal->{'factor'}, $signal->{'offset'}, static_cast<$cppType>($signal->{'minValue'}), static_cast<$cppType>($signal->{'maxValue'}), $convertFromFunction, $convertToFunction)\n";
-
- $generatedText .= " */\n";
- my $shownPropertyName = $ambPropertyName;
- if ($hashingAllowed eq 'E' ) {
- $shownPropertyName = $signal->{'AMBPropertyNameEnc'};
- }
- $generatedText .= "const VehicleProperty::Property $ambPropertyName = \"$shownPropertyName\";\n";
- $generatedText .= $typeBasedText;
-
- return $generatedText;
+ }
+
+ my $byteOrdering = "Endian::Intel"; # LittleEndian by default
+ if ( exists( $signal->{'byteOrdering'} ) and $signal->{'byteOrdering'} eq '0') {
+ $byteOrdering = "Endian::Motorola"; # BigEndian
+ }
+
+ my $signedness;
+ if ($signal->{'signedness'} eq '+') {
+ $signedness = "Signedness::Unsigned"; # Unsigned
+ } else {
+ $signedness = "Signedness::Signed"; # Signed
+ }
+
+ my $convertFromFunction = "nullptr";
+ if ( exists( $signal->{'AMBConversionFrom'} ) ) {
+ $convertFromFunction = $signal->{'AMBConversionFrom'};
+ }
+
+ my $convertToFunction = "nullptr";
+ if ( exists( $signal->{'AMBConversionTo'} ) ) {
+ $convertToFunction = $signal->{'AMBConversionTo'};
+ }
+
+ $generatedText .= "\n";
+ $generatedText .= "/**< $ambPropertyName.\n";
+
+ my $typeBasedText = '';
+ my $cppType;
+
+ if ( $type =~ m/enum/ ) {
+ if ( exists( $signal->{'values'} ) ) {
+ $generatedText .= " *\@see ${ambPropertyName}s::${ambPropertyName}Type\n";
+ $cppType = "${ambPropertyName}s::${ambPropertyName}Type";
+ }
+ } elsif ( $type =~ m/bool/ ) {
+ if ( exists( $signal->{'values'} ) ) {
+ my @dupvalues = @{$signal->{'values'}};
+ my @values = sort { $$a{'value'} <=> $$b{'value'} } (&removeDuplicates (\@dupvalues));
+ my $hexValue = ();
+ for my $vali (0..scalar(@values) -1 ) {
+ $hexValue = '0x' . uc ( sprintf( "%x", $values[$vali]->{'value'} ) );
+ $generatedText .= " * $hexValue = $values[$vali]->{'description'}\n";
+ }
+ }
+ $cppType = "$type";
+ } elsif ( $type =~ m/int8/ ) {
+ $cppType = "char";
+ } elsif ( $type =~ m/int32/ ) {
+ if ( $type eq 'uint32_t' ) {
+ $cppType = "$type";
+ } else {
+ $cppType = "int";
+ }
+ } else { # (u)int16, (u)int64
+ $cppType = "$type";
+ }
+
+ $typeBasedText .= "CANSIGNAL($ambPropertyName, $cppType, $signal->{'startBit'}, $signal->{'length'}, $byteOrdering, $signedness, $signal->{'factor'}, $signal->{'offset'}, static_cast<$cppType>($signal->{'minValue'}), static_cast<$cppType>($signal->{'maxValue'}), $convertFromFunction, $convertToFunction)\n";
+
+ $generatedText .= " */\n";
+ my $shownPropertyName = $ambPropertyName;
+ if ($hashingAllowed eq 'E' ) {
+ $shownPropertyName = $signal->{'AMBPropertyNameEnc'};
+ }
+ $generatedText .= "const VehicleProperty::Property $ambPropertyName = \"$shownPropertyName\";\n";
+ $generatedText .= $typeBasedText;
+
+ return $generatedText;
}
=head2 generateIdlTypes
@@ -500,24 +500,24 @@ Returns IDL code to be placed into the target plugin.
=cut
sub generateIdlTypes {
- my $dbcjson = $_[0];
-
- my $generatedText = '';
-
- my @engineControlUnits = @{$dbcjson->{'electronicControlUnits'}};
- for my $ecui (0..scalar(@engineControlUnits)-1) {
- if ( exists( $engineControlUnits[$ecui]{'messages'} ) ) {
- my @messages = @{$engineControlUnits[$ecui]{'messages'}};
- for my $msgi (0..scalar(@messages)-1) {
- my @signals = @{$messages[$msgi]{'signals'}};
- foreach my $signal ( @signals ) {
- my $type = $signal->{'AMBPropertyType'};
- $generatedText .= &generateIdlProperty( $signal, $type);
- }
- }
- }
- }
- return $generatedText;
+ my $dbcjson = $_[0];
+
+ my $generatedText = '';
+
+ my @engineControlUnits = @{$dbcjson->{'electronicControlUnits'}};
+ for my $ecui (0..scalar(@engineControlUnits)-1) {
+ if ( exists( $engineControlUnits[$ecui]{'messages'} ) ) {
+ my @messages = @{$engineControlUnits[$ecui]{'messages'}};
+ for my $msgi (0..scalar(@messages)-1) {
+ my @signals = @{$messages[$msgi]{'signals'}};
+ foreach my $signal ( @signals ) {
+ my $type = $signal->{'AMBPropertyType'};
+ $generatedText .= &generateIdlProperty( $signal, $type);
+ }
+ }
+ }
+ }
+ return $generatedText;
}
=head2 generateIdlProperty
@@ -528,58 +528,58 @@ definitions of one signal property.
=cut
sub generateIdlProperty {
- my $signal = $_[0];
- my $type = $_[1];
- my $generatedText = '';
-
- my $ambPropertyName = $signal->{'canId'};
- if ( exists( $signal->{'AMBPropertyName'} ) ) {
- $ambPropertyName = $signal->{'AMBPropertyName'};
- }
-
- $generatedText .= "[NoInterfaceObject]\n";
- $generatedText .= "interface org.automotive.${ambPropertyName} : VehiclePropertyType {\n";
- if ( $type eq 'enum' ) {
- if ( exists( $signal->{'values'} ) ) {
- my @dupvalues = @{$signal->{'values'}};
- my @values = sort { $$a{'value'} <=> $$b{'value'} } (&removeDuplicates (\@dupvalues));
-
- my $hexValue = ();
- for my $vali (0..scalar(@values) -1 ) {
- # TODO const unsigned short migth be not enough, guess type based on values
- $hexValue = '0x' . uc (sprintf( "%x", $values[$vali]->{'value'} ) );
- $generatedText .= " const unsigned short " . uc($values[$vali]->{'name'}) . " = $hexValue;\n";
- }
- }
- }
-
- $generatedText .= "\n";
- $generatedText .= " /** ${ambPropertyName}\n";
- $generatedText .= " * \\brief Returns ${ambPropertyName}\n";
- $generatedText .= " **/\n";
-
- my $unsigned = '';
- if ( $type =~ m/uint/ ) {
- $unsigned = 'unsigned ';
- }
-
- if ( $type =~ m/enum/ ) {
- # TODO const unsigned short migth be not enough, guess type based on values
- $generatedText .= " readonly attribute octet ${ambPropertyName};\n";
- } elsif ( $type =~ m/bool/ ) {
- $generatedText .= " readonly attribute boolean ${ambPropertyName};\n";
- } elsif ( $type =~ m/int8/ ) {
- $generatedText .= " readonly attribute ${unsigned}octet ${ambPropertyName};\n";
- } elsif ( $type =~ m/int16/ ) {
- $generatedText .= " readonly attribute ${unsigned}short ${ambPropertyName};\n";
- } elsif ( $type =~ m/int32/ ) {
- $generatedText .= " readonly attribute ${unsigned}long ${ambPropertyName};\n";
- } else {
- $generatedText .= " readonly attribute double ${ambPropertyName};\n";
- }
- $generatedText .= "};\n\n";
-
- return $generatedText;
+ my $signal = $_[0];
+ my $type = $_[1];
+ my $generatedText = '';
+
+ my $ambPropertyName = $signal->{'canId'};
+ if ( exists( $signal->{'AMBPropertyName'} ) ) {
+ $ambPropertyName = $signal->{'AMBPropertyName'};
+ }
+
+ $generatedText .= "[NoInterfaceObject]\n";
+ $generatedText .= "interface org.automotive.${ambPropertyName} : VehiclePropertyType {\n";
+ if ( $type eq 'enum' ) {
+ if ( exists( $signal->{'values'} ) ) {
+ my @dupvalues = @{$signal->{'values'}};
+ my @values = sort { $$a{'value'} <=> $$b{'value'} } (&removeDuplicates (\@dupvalues));
+
+ my $hexValue = ();
+ for my $vali (0..scalar(@values) -1 ) {
+ # TODO const unsigned short migth be not enough, guess type based on values
+ $hexValue = '0x' . uc (sprintf( "%x", $values[$vali]->{'value'} ) );
+ $generatedText .= " const unsigned short " . uc($values[$vali]->{'name'}) . " = $hexValue;\n";
+ }
+ }
+ }
+
+ $generatedText .= "\n";
+ $generatedText .= " /** ${ambPropertyName}\n";
+ $generatedText .= " * \\brief Returns ${ambPropertyName}\n";
+ $generatedText .= " **/\n";
+
+ my $unsigned = '';
+ if ( $type =~ m/uint/ ) {
+ $unsigned = 'unsigned ';
+ }
+
+ if ( $type =~ m/enum/ ) {
+ # TODO const unsigned short migth be not enough, guess type based on values
+ $generatedText .= " readonly attribute octet ${ambPropertyName};\n";
+ } elsif ( $type =~ m/bool/ ) {
+ $generatedText .= " readonly attribute boolean ${ambPropertyName};\n";
+ } elsif ( $type =~ m/int8/ ) {
+ $generatedText .= " readonly attribute ${unsigned}octet ${ambPropertyName};\n";
+ } elsif ( $type =~ m/int16/ ) {
+ $generatedText .= " readonly attribute ${unsigned}short ${ambPropertyName};\n";
+ } elsif ( $type =~ m/int32/ ) {
+ $generatedText .= " readonly attribute ${unsigned}long ${ambPropertyName};\n";
+ } else {
+ $generatedText .= " readonly attribute double ${ambPropertyName};\n";
+ }
+ $generatedText .= "};\n\n";
+
+ return $generatedText;
}
=head2 encryptAmbPropertyNames
@@ -589,21 +589,21 @@ Encrypt AmbPropertyNames.
=cut
sub encryptAmbPropertyNames {
- my $dbcjson = $_[0];
-
- my @engineControlUnits = @{$dbcjson->{'electronicControlUnits'}};
- for my $ecui (0..scalar(@engineControlUnits)-1) {
- if ( exists( $engineControlUnits[$ecui]{'messages'} ) ) {
- my @messages = @{$engineControlUnits[$ecui]{'messages'}};
- for my $msgi (0..scalar(@messages)-1) {
- my @signals = @{$messages[$msgi]{'signals'}};
- foreach my $signal ( @signals ) {
- my $shownPropertyName = sha1_hex( $signal->{'AMBPropertyName'} );
- $signal->{'AMBPropertyNameEnc'} = 'S' . sha1_hex( $shownPropertyName );
- }
- }
- }
- }
+ my $dbcjson = $_[0];
+
+ my @engineControlUnits = @{$dbcjson->{'electronicControlUnits'}};
+ for my $ecui (0..scalar(@engineControlUnits)-1) {
+ if ( exists( $engineControlUnits[$ecui]{'messages'} ) ) {
+ my @messages = @{$engineControlUnits[$ecui]{'messages'}};
+ for my $msgi (0..scalar(@messages)-1) {
+ my @signals = @{$messages[$msgi]{'signals'}};
+ foreach my $signal ( @signals ) {
+ my $shownPropertyName = sha1_hex( $signal->{'AMBPropertyName'} );
+ $signal->{'AMBPropertyNameEnc'} = 'S' . sha1_hex( $shownPropertyName );
+ }
+ }
+ }
+ }
}
=head2 removeDuplicates
@@ -613,38 +613,38 @@ Returns array of values witout duplicates.
=cut
sub removeDuplicates {
- my @arr = sort { $a->{'name'} cmp $b->{'name'} } @{$_[0]};
-
- my @duplicates;
- my $prev = pop @arr;
-
- while (defined(my $x = pop @arr)) {
- if ($prev->{'name'} eq $x->{'name'}) {
- push @duplicates, $x;
- while (defined(my $y = pop @arr)) {
- if ($y->{'name'} ne $x->{'name'}) {
- $prev = $y;
- last;
- }
- }
- }
- else {
- $prev = $x;
- }
- }
- # Typically very small arrays
- @arr = sort @{$_[0]};
- if (scalar @duplicates > 0) {
- foreach my $x (@arr) {
- foreach my $y (@duplicates) {
- if ($x->{'name'} eq $y->{'name'}) {
- $x->{'name'} .= '_' . $x->{'value'};
- }
- }
- }
- }
-
- return @arr;
+ my @arr = sort { $a->{'name'} cmp $b->{'name'} } @{$_[0]};
+
+ my @duplicates;
+ my $prev = pop @arr;
+
+ while (defined(my $x = pop @arr)) {
+ if ($prev->{'name'} eq $x->{'name'}) {
+ push @duplicates, $x;
+ while (defined(my $y = pop @arr)) {
+ if ($y->{'name'} ne $x->{'name'}) {
+ $prev = $y;
+ last;
+ }
+ }
+ }
+ else {
+ $prev = $x;
+ }
+ }
+ # Typically very small arrays
+ @arr = sort @{$_[0]};
+ if (scalar @duplicates > 0) {
+ foreach my $x (@arr) {
+ foreach my $y (@duplicates) {
+ if ($x->{'name'} eq $y->{'name'}) {
+ $x->{'name'} .= '_' . $x->{'value'};
+ }
+ }
+ }
+ }
+
+ return @arr;
}
=head2 calculateZone
@@ -654,19 +654,19 @@ Returns calculated Zone for given signal.
=cut
sub calculateZone {
- my $ambPropertyName = $_[0];
- my $zone = 'Zone::None';
-
- if ( $ambPropertyName =~ m/FrL/) {
- $zone = 'Zone::FrontLeft';
- } elsif ( $ambPropertyName =~ m/FrR/) {
- $zone = 'Zone::FrontRight';
- } elsif ( $ambPropertyName =~ m/ReL/) {
- $zone = 'Zone::RearLeft';
- } elsif ( $ambPropertyName =~ m/ReR/) {
- $zone = 'Zone::RearRight';
- }
- return $zone;
+ my $ambPropertyName = $_[0];
+ my $zone = 'Zone::None';
+
+ if ( $ambPropertyName =~ m/FrL/) {
+ $zone = 'Zone::FrontLeft';
+ } elsif ( $ambPropertyName =~ m/FrR/) {
+ $zone = 'Zone::FrontRight';
+ } elsif ( $ambPropertyName =~ m/ReL/) {
+ $zone = 'Zone::RearLeft';
+ } elsif ( $ambPropertyName =~ m/ReR/) {
+ $zone = 'Zone::RearRight';
+ }
+ return $zone;
}
##############################################################################
@@ -679,7 +679,7 @@ IntelIVIPoc, C<< <ivipoc at intel.com> >>
You can find documentation for this module with the perldoc command.
- perldoc Intel::IVIPoc::AMBPluginGenerator
+ perldoc Intel::IVIPoc::AMBPluginGenerator
=head1 ACKNOWLEDGEMENTS