Skip to content

Commit

Permalink
Select by commandline signature, which columns are exported in CSV. (#…
Browse files Browse the repository at this point in the history
…623)

Signed-off-by: Alexander Wenzel <[email protected]>
  • Loading branch information
alexmucde authored Feb 6, 2025
1 parent d11cc67 commit 8840a1c
Show file tree
Hide file tree
Showing 8 changed files with 184 additions and 53 deletions.
8 changes: 4 additions & 4 deletions commander/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ int main(int argc, char *argv[])
if(opt.get_convertionmode()==e_DLT)
{
qDebug() << "### Convert to DLT";
QDltExporter exporter(&dltFile,opt.getConvertDestFile(),0,QDltExporter::FormatDlt,QDltExporter::SelectionAll,0,1,0,0,opt.getDelimiter());
QDltExporter exporter(&dltFile,opt.getConvertDestFile(),0,QDltExporter::FormatDlt,QDltExporter::SelectionAll,0,1,0,0,opt.getDelimiter(),opt.getSignature());
if(opt.isMultifilter())
exporter.setMultifilterFilenames(opt.getFilterFiles());
else
Expand All @@ -138,7 +138,7 @@ int main(int argc, char *argv[])
if(opt.get_convertionmode()==e_ASCI)
{
qDebug() << "### Convert to ASCII";
QDltExporter exporter(&dltFile,opt.getConvertDestFile(),0,QDltExporter::FormatAscii,QDltExporter::SelectionAll,0,1,0,0,opt.getDelimiter());
QDltExporter exporter(&dltFile,opt.getConvertDestFile(),0,QDltExporter::FormatAscii,QDltExporter::SelectionAll,0,1,0,0,opt.getDelimiter(),opt.getSignature());
if(opt.isMultifilter())
exporter.setMultifilterFilenames(opt.getFilterFiles());
else
Expand All @@ -150,7 +150,7 @@ int main(int argc, char *argv[])
if(opt.get_convertionmode()==e_CSV)
{
qDebug() << "### Convert to CSV";
QDltExporter exporter(&dltFile,opt.getConvertDestFile(),0,QDltExporter::FormatCsv,QDltExporter::SelectionAll,0,1,0,0,opt.getDelimiter());
QDltExporter exporter(&dltFile,opt.getConvertDestFile(),0,QDltExporter::FormatCsv,QDltExporter::SelectionAll,0,1,0,0,opt.getDelimiter(),opt.getSignature());
if(opt.isMultifilter())
exporter.setMultifilterFilenames(opt.getFilterFiles());
else
Expand All @@ -162,7 +162,7 @@ int main(int argc, char *argv[])
if(opt.get_convertionmode()==e_UTF8)
{
qDebug() << "### Convert to UTF8";
QDltExporter exporter(&dltFile,opt.getConvertDestFile(),0,QDltExporter::FormatUTF8,QDltExporter::SelectionAll,0,1,0,0,opt.getDelimiter());
QDltExporter exporter(&dltFile,opt.getConvertDestFile(),0,QDltExporter::FormatUTF8,QDltExporter::SelectionAll,0,1,0,0,opt.getDelimiter(),opt.getSignature());
if(opt.isMultifilter())
exporter.setMultifilterFilenames(opt.getFilterFiles());
else
Expand Down
20 changes: 18 additions & 2 deletions commander/optmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@

#include "optmanager.h"
#include "../src/version.h"
#include "qdltexporter.h"

#include <QDebug>
#include <QFileInfo>
#include <iostream>
Expand All @@ -37,7 +39,8 @@ OptManager::OptManager()
convert = false;
filter = false;
convertionmode = e_ASCI;
delimiter = ',';
delimiter = QDLT_DEFAULT_EXPORT_DELIMITER;
signature = QDLT_DEFAULT_EXPORT_SIGNATURE;
multifilter = false;
}

Expand Down Expand Up @@ -92,14 +95,16 @@ void OptManager::printUsage()
qDebug()<<" -u\tConversion will be done in UTF8 instead of ASCII";
qDebug()<<" -csv\tConversion will be done in CSV format";
qDebug()<<" -d\tConversion will NOT be done, save in dlt file format again instead";
qDebug()<<" -delimiter <character>\tThe used delimiter for CSV export (Default: ,).";
qDebug()<<" -delimiter <character>\tThe used delimiter for CSV export (Default: "+QString(QDLT_DEFAULT_EXPORT_DELIMITER)+").";
qDebug()<<" -signature <string>\tThe used signature for CSV export, which columns are exported (Default: "+QString(QDLT_DEFAULT_EXPORT_SIGNATURE)+"). I=Index,T=Time,S=Timestamp,O=Count,E=Ecuid,A=Apid,C=Ctid,N=SessionId,Y=Type,U=Subtype,M=Mode,R=#Args,P=Payload";
qDebug()<<" -multifilter\tMultifilter will generate a separate export file with the name of the filter.";
qDebug()<<" \t-c will define the folder name, not the filename.";
qDebug()<<"\nExamples:\n";
qDebug().noquote() << executable << "-c .\\trace.txt c:\\trace\\trace.dlt";
qDebug().noquote() << executable << "-c -u .\\trace.txt c:\\trace\\trace.dlt";
qDebug().noquote() << executable << "-d -c .\\trace.dlt c:\\trace\\trace.dlt";
qDebug().noquote() << executable << "-csv -c .\\trace.csv c:\\trace\\trace.dlt";
qDebug().noquote() << executable << "-csv -delimiter ; -signature TSEACP -c c:\\trace\\trace.csv c:\\trace\\trace.dlt";
qDebug().noquote() << executable << "-d -c .\\filteredtrace.dlt c:\\filter\\filter.dlf c:\\trace\\trace.dlt";
qDebug().noquote() << executable << "trace_1.dlt trace_2.dlt";
qDebug().noquote() << executable << "input.pcap output.dlt";
Expand Down Expand Up @@ -153,6 +158,16 @@ void OptManager::parse(QStringList *opt)

i += 1;
}
else if(str.compare("-signature")==0)
{
QString c1 = opt->value(i+1);

signature = QString("%1").arg(c1).toLatin1();

qDebug() << "Signature:" << signature;

i += 1;
}
else if(str.compare("-u")==0)
{
qDebug() << "Convert to UTF8";
Expand Down Expand Up @@ -214,3 +229,4 @@ QStringList OptManager::getFilterFiles(){return filterFiles;}
QString OptManager::getConvertSourceFile(){return convertSourceFile;}
QString OptManager::getConvertDestFile(){return convertDestFile;}
char OptManager::getDelimiter(){return delimiter;}
QString OptManager::getSignature(){return signature;}
2 changes: 2 additions & 0 deletions commander/optmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class OptManager
QString getConvertSourceFile();
QString getConvertDestFile();
char getDelimiter();
QString getSignature();

const QStringList &getPcapFiles() const;
const QStringList &getMf4Files() const;
Expand All @@ -75,6 +76,7 @@ class OptManager
QString convertSourceFile;
QString convertDestFile;
char delimiter;
QString signature;
};

#endif // OPTMANAGER_H
162 changes: 128 additions & 34 deletions qdlt/qdltexporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

QDltExporter::QDltExporter(QDltFile *from, QString outputfileName, QDltPluginManager *pluginManager,
QDltExporter::DltExportFormat exportFormat,
QDltExporter::DltExportSelection exportSelection, QModelIndexList *selection, int _automaticTimeSettings,qlonglong _utcOffset,int _dst,char _delimiter,QObject *parent) :
QDltExporter::DltExportSelection exportSelection, QModelIndexList *selection, int _automaticTimeSettings,qlonglong _utcOffset,int _dst,char delimiter,QString signature,QObject *parent) :
QThread(parent)
{
size = 0;
Expand All @@ -18,7 +18,7 @@ QDltExporter::QDltExporter(QDltFile *from, QString outputfileName, QDltPluginMan
automaticTimeSettings=_automaticTimeSettings;
utcOffset=_utcOffset;
dst=_dst;
delimiter=_delimiter;
this->delimiter=delimiter;

this->from = from;
to.setFileName(outputfileName);
Expand All @@ -27,6 +27,8 @@ QDltExporter::QDltExporter(QDltFile *from, QString outputfileName, QDltPluginMan
this->exportFormat = exportFormat;
this->exportSelection = exportSelection;
this->selection = selection;

this->signature = signature;
}

void QDltExporter::run()
Expand All @@ -45,20 +47,78 @@ QString QDltExporter::escapeCSVValue(QString arg)

bool QDltExporter::writeCSVHeader()
{
QString header = QString("\"%1\"")+delimiter+QString("\"%2\"")+delimiter+QString("\"%3\"")+delimiter+QString("\"%4\"")+delimiter+QString("\"%5\"")+delimiter+QString("\"%6\"")+delimiter+QString("\"%7\"")+delimiter+QString("\"%8\"")+delimiter+QString("\"%9\"")+delimiter+QString("\"%10\"")+delimiter+QString("\"%11\"")+delimiter+QString("\"%12\"")+delimiter+QString("\"%13\"\n");
header = header.arg(FieldNames::getName(FieldNames::Index))
.arg(FieldNames::getName(FieldNames::Time))
.arg(FieldNames::getName(FieldNames::TimeStamp))
.arg(FieldNames::getName(FieldNames::Counter))
.arg(FieldNames::getName(FieldNames::EcuId))
.arg(FieldNames::getName(FieldNames::AppId))
.arg(FieldNames::getName(FieldNames::ContextId))
.arg(FieldNames::getName(FieldNames::SessionId))
.arg(FieldNames::getName(FieldNames::Type))
.arg(FieldNames::getName(FieldNames::Subtype))
.arg(FieldNames::getName(FieldNames::Mode))
.arg(FieldNames::getName(FieldNames::ArgCount))
.arg(FieldNames::getName(FieldNames::Payload));

/*
Used Signature:
I Index
T Time
S Timestamp
O Count
E Ecuid
A Apid
C Ctid
N SessionId
Y Type
U Subtype
M Mode
R #Args
P Payload
Default: ITSOEACNYUMRP
*/

QString header;
for(int num = 0; num < signature.size();num++)
{
if(num!=0)
header += delimiter;
switch(signature[num].toLatin1())
{
case 'I':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::Index));
break;
case 'T':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::Time));
break;
case 'S':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::TimeStamp));
break;
case 'O':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::Counter));
break;
case 'E':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::EcuId));
break;
case 'A':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::AppId));
break;
case 'C':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::ContextId));
break;
case 'N':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::SessionId));
break;
case 'Y':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::Type));
break;
case 'U':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::Subtype));
break;
case 'M':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::Mode));
break;
case 'R':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::ArgCount));
break;
case 'P':
header += QString("\"%1\"").arg(FieldNames::getName(FieldNames::Payload));
break;
}
}
header += "\n";

if(multifilterFilenames.isEmpty())
to.write(header.toLatin1().constData());
else
Expand All @@ -73,24 +133,58 @@ void QDltExporter::writeCSVLine(int index, QDltMsg msg,QFile &to)
{
QString text("");

text += escapeCSVValue(QString("%1").arg(index)).append(delimiter);
if( automaticTimeSettings == 0 )
text += escapeCSVValue(QString("%1.%2").arg(msg.getGmTimeWithOffsetString(utcOffset,dst)).arg(msg.getMicroseconds(),6,10,QLatin1Char('0'))).append(delimiter);
else
text += escapeCSVValue(QString("%1.%2").arg(msg.getTimeString()).arg(msg.getMicroseconds(),6,10,QLatin1Char('0'))).append(delimiter);
text += escapeCSVValue(QString("%1.%2").arg(msg.getTimestamp()/10000).arg(msg.getTimestamp()%10000,4,10,QLatin1Char('0'))).append(delimiter);
text += escapeCSVValue(QString("%1").arg(msg.getMessageCounter())).append(delimiter);
text += escapeCSVValue(QString("%1").arg(msg.getEcuid().simplified())).append(delimiter);
text += escapeCSVValue(QString("%1").arg(msg.getApid().simplified())).append(delimiter);
text += escapeCSVValue(QString("%1").arg(msg.getCtid().simplified())).append(delimiter);
text += escapeCSVValue(QString("%1").arg(msg.getSessionid())).append(delimiter);
text += escapeCSVValue(QString("%1").arg(msg.getTypeString())).append(delimiter);
text += escapeCSVValue(QString("%1").arg(msg.getSubtypeString())).append(delimiter);
text += escapeCSVValue(QString("%1").arg(msg.getModeString())).append(delimiter);
text += escapeCSVValue(QString("%1").arg(msg.getNumberOfArguments())).append(delimiter);
QString payload = msg.toStringPayload().simplified().remove(QChar::Null);
if(from) from->applyRegExString(msg,payload);
text += escapeCSVValue(payload);
for(int num = 0; num < signature.size();num++)
{
if(num!=0)
text += delimiter;
switch(signature[num].toLatin1())
{
case 'I':
text += escapeCSVValue(QString("%1").arg(index));
break;
case 'T':
if( automaticTimeSettings == 0 )
text += escapeCSVValue(QString("%1.%2").arg(msg.getGmTimeWithOffsetString(utcOffset,dst)).arg(msg.getMicroseconds(),6,10,QLatin1Char('0')));
else
text += escapeCSVValue(QString("%1.%2").arg(msg.getTimeString()).arg(msg.getMicroseconds(),6,10,QLatin1Char('0')));
break;
case 'S':
text += escapeCSVValue(QString("%1.%2").arg(msg.getTimestamp()/10000).arg(msg.getTimestamp()%10000,4,10,QLatin1Char('0')));
break;
case 'O':
text += escapeCSVValue(QString("%1").arg(msg.getMessageCounter()));
break;
case 'E':
text += escapeCSVValue(QString("%1").arg(msg.getEcuid().simplified()));
break;
case 'A':
text += escapeCSVValue(QString("%1").arg(msg.getApid().simplified()));
break;
case 'C':
text += escapeCSVValue(QString("%1").arg(msg.getCtid().simplified()));
break;
case 'N':
text += escapeCSVValue(QString("%1").arg(msg.getSessionid()));
break;
case 'Y':
text += escapeCSVValue(QString("%1").arg(msg.getTypeString()));
break;
case 'U':
text += escapeCSVValue(QString("%1").arg(msg.getSubtypeString()));
break;
case 'M':
text += escapeCSVValue(QString("%1").arg(msg.getModeString()));
break;
case 'R':
text += escapeCSVValue(QString("%1").arg(msg.getNumberOfArguments()));
break;
case 'P':
QString payload = msg.toStringPayload().simplified().remove(QChar::Null);
if(from) from->applyRegExString(msg,payload);
text += escapeCSVValue(payload);
break;
}
}
text += "\n";

to.write(text.toLatin1().constData());
Expand Down
7 changes: 6 additions & 1 deletion qdlt/qdltexporter.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
#include "qdltmsg.h"
#include "qdltpluginmanager.h"


#define QDLT_DEFAULT_EXPORT_SIGNATURE "ITSOEACNYUMRP"
#define QDLT_DEFAULT_EXPORT_DELIMITER ','

class QDLT_EXPORT QDltExporter : public QThread
{
Q_OBJECT
Expand Down Expand Up @@ -56,7 +60,7 @@ class QDLT_EXPORT QDltExporter : public QThread
*/
explicit QDltExporter(QDltFile *from, QString outputfileName, QDltPluginManager *pluginManager,
QDltExporter::DltExportFormat exportFormat,
QDltExporter::DltExportSelection exportSelection, QModelIndexList *selection, int _automaticTimeSettings,qlonglong _utcOffset,int _dst,char _delimiter,QObject *parent = 0);
QDltExporter::DltExportSelection exportSelection, QModelIndexList *selection, int _automaticTimeSettings,qlonglong _utcOffset,int _dst,char delimiter=QDLT_DEFAULT_EXPORT_DELIMITER,QString signature=QDLT_DEFAULT_EXPORT_SIGNATURE,QObject *parent = 0);

void run() override;

Expand Down Expand Up @@ -110,6 +114,7 @@ public slots:
QStringList multifilterFilenames;
QList<QFile*> multifilterFilesList;
QList<QDltFilterList*> multifilterFilterList;
QString signature;
};

#endif // QDLTEXPORTER_H
16 changes: 14 additions & 2 deletions qdlt/qdltoptmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

#include "qdltoptmanager.h"
#include "version.h"
#include "qdltexporter.h"

#include <QDebug>
#include <QFileInfo>
Expand All @@ -48,11 +49,14 @@ QDltOptManager::QDltOptManager()
{"stream", "Treat the input logfiles as DLT stream instead of DLT files."},
{QStringList() << "t" << "terminate", "Terminate DLT Viewer after command line execution."},
{"w", "Set the working directory", "workingdirectory"},
{"delimiter", "The used delimiter for CSV export (Default: ,).", "character"},
{"delimiter", "The used delimiter for CSV export (Default: "+QString(QDLT_DEFAULT_EXPORT_DELIMITER)+").", "string"},
{"signature", "The used signature for CSV export, which columns are exported (Default: "+QString(QDLT_DEFAULT_EXPORT_SIGNATURE)+"). I=Index,T=Time,S=Timestamp,O=Count,E=Ecuid,A=Apid,C=Ctid,N=SessionId,Y=Type,U=Subtype,M=Mode,R=#Args,P=Payload", "character"},
{QStringList() << "h" << "help", "Print this help message."},
{QStringList() << "v" << "version", "Print the version."}
});

delimiter = QDLT_DEFAULT_EXPORT_DELIMITER;
signature = QDLT_DEFAULT_EXPORT_SIGNATURE;
}

QDltOptManager* QDltOptManager::getInstance()
Expand Down Expand Up @@ -98,6 +102,7 @@ void QDltOptManager::printUsage(const QString& helpText)
qDebug() << " dlt-viewer.exe -t -s -d -c output.dlt input.dlt";
qDebug() << " dlt-viewer.exe -t -s decoded.dlp -dd -c output.dlt input.dlt ";
qDebug() << " dlt-viewer.exe -t -s -csv -c output.csv input.dlt";
qDebug() << " dlt-viewer.exe -t -s -csv -delimiter ; -signature TSEACP -c output.csv input.dlt";
qDebug() << " dlt-viewer.exe -t -s -d filter.dlf -c output.dlt input.dlt";
qDebug() << " dlt-viewer.exe -p export.dlp -e \"Filetransfer Plugin|export|ftransferdir\" input.dlt";
qDebug() << " dlt-viewer.exe input1.dlt input2.dlt";
Expand Down Expand Up @@ -188,6 +193,11 @@ void QDltOptManager::parse(const QStringList& args)
qDebug() << "Delimiter:" << delimiter;
}

if (m_parser.isSet("signature")) {
signature = m_parser.value("signature").toLatin1();
qDebug() << "Signature:" << signature;
}

if (m_parser.isSet("u")) {
convertionmode = e_UTF8;
}
Expand Down Expand Up @@ -289,6 +299,7 @@ QString QDltOptManager::getCommandName(){return commandName;}
QStringList QDltOptManager::getCommandParams(){return commandParams;}
QString QDltOptManager::getWorkingDirectory() const { return workingDirectory; }
char QDltOptManager::getDelimiter(){return delimiter;}
QString QDltOptManager::getSignature(){return signature;}

QString QDltOptManager::getHelpText() const
{
Expand All @@ -313,7 +324,8 @@ void QDltOptManager::reset()
prePluginCommands.clear();
postPluginCommands.clear();
workingDirectory.clear();
delimiter=',';
delimiter=QDLT_DEFAULT_EXPORT_DELIMITER;
signature=QDLT_DEFAULT_EXPORT_SIGNATURE;
pcapFiles.clear();
mf4Files.clear();
}
Loading

0 comments on commit 8840a1c

Please sign in to comment.