summaryrefslogtreecommitdiffstats
path: root/app/logfile/logplay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'app/logfile/logplay.cpp')
-rw-r--r--app/logfile/logplay.cpp290
1 files changed, 290 insertions, 0 deletions
diff --git a/app/logfile/logplay.cpp b/app/logfile/logplay.cpp
new file mode 100644
index 0000000..e13c3fc
--- /dev/null
+++ b/app/logfile/logplay.cpp
@@ -0,0 +1,290 @@
+/*
+ * Copyright (c) 2019 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "logplay.h"
+#include <QDir>
+#include <QDirIterator>
+#include <QDateTime>
+#include <QTextStream>
+#include <sys/wait.h>
+#include <unistd.h>
+
+const std::string LogPlayImpl::PlayUtilsExec = "/usr/bin/canplayer";
+
+LogPlayImpl::LogPlayImpl(QObject *parent) : QAbstractItemModel(parent)
+{
+ roles[nameRole] = "name";
+ roles[folderRole] = "folder";
+ roles[childrenRole] = "children";
+ roles[pathRole] = "path";
+
+ playUtils = -1;
+}
+
+LogPlayImpl::~LogPlayImpl()
+{
+ CANPlay(false);
+}
+
+int LogPlayImpl::rowCount(const QModelIndex &parent) const
+{
+ (void)parent;
+ return datas.size();
+}
+
+int LogPlayImpl::columnCount(const QModelIndex &parent) const
+{
+ (void)parent;
+ return 1;
+}
+
+QModelIndex LogPlayImpl::index(int row, int column, const QModelIndex &parent) const
+{
+ (void)parent;
+ if((row >= 0) && (row < datas.size()))
+ {
+ return createIndex(row,column);
+ }
+ else
+ {
+ return QModelIndex();
+ }
+}
+
+QVariant LogPlayImpl::data(const QModelIndex &index, int role) const
+{
+ if(index.isValid() && index.row()<datas.size())
+ {
+ return datas[index.row()][role];
+ }
+ else
+ {
+ QHash<int,QVariant> data;
+ data[nameRole] = "";
+ data[folderRole] = true;
+ data[childrenRole] = 0;
+ return data[role];
+ }
+}
+
+QModelIndex LogPlayImpl::parent(const QModelIndex &child) const
+{
+ (void)child;
+ return QModelIndex();
+}
+
+QHash<int,QByteArray> LogPlayImpl::roleNames() const
+{
+ return roles;
+}
+
+void LogPlayImpl::refresh()
+{
+ QDir dir(QDir::homePath() + "/" + "LogDataFile");
+
+ if(dir.exists())
+ {
+ beginResetModel();
+ dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
+ dir.setSorting(QDir::Name);
+
+ QFileInfoList list = dir.entryInfoList();
+ datas.clear();
+
+ for(int i = 0; i < list.size(); i++)
+ {
+ QHash<int,QVariant> parent;
+ QStringList children;
+
+ parent[nameRole] = list.at(i).fileName();
+ parent[folderRole] = true;
+ parent[pathRole] = list.at(i).absoluteFilePath();
+
+ children.clear();
+
+ QDirIterator it(list.at(i).filePath(), QStringList() << "*.log", QDir::Files | QDir::NoSymLinks, QDirIterator::Subdirectories);
+ while(it.hasNext())
+ {
+ children << it.next();
+ }
+
+ parent[childrenRole] = children.count();
+ datas.append(parent);
+
+ if(children.count() > 0)
+ {
+ children.sort();
+
+ for(int j = 0; j < children.count(); j++)
+ {
+ QHash<int,QVariant> child;
+
+ child[nameRole] = children.at(j).section("/", -1);
+ child[folderRole] = false;
+ child[childrenRole] = 0;
+ child[pathRole] = children.at(j);
+
+ datas.append(child);
+ }
+ }
+ }
+ endResetModel();
+ }
+}
+
+void LogPlayImpl::setLogFileIndex(int index)
+{
+ startTime.clear();
+ endTime.clear();
+ portsList.clear();
+
+ if(index > 0 && index < datas.size())
+ {
+ QFile file(datas[index][pathRole].toString());
+
+ if(file.exists() && file.open(QIODevice::ReadOnly | QIODevice::Text))
+ {
+ QTextStream filetxt(&file);
+ QString line = "";
+ QString port = "";
+ QDateTime datetime;
+
+ while(!filetxt.atEnd())
+ {
+ line = filetxt.readLine();
+ if(!line.isEmpty())
+ {
+ port = line.section(" ", 1, 1, QString::SectionSkipEmpty);
+ if(port.isEmpty())
+ {
+ port = line.section("\t", 1, 1, QString::SectionSkipEmpty);
+ }
+ datetime = QDateTime::fromTime_t(line.mid(line.indexOf("(")+1, line.indexOf(".")-line.indexOf("(")-1).toUInt());
+ if(!portsList.contains(port))
+ {
+ portsList << port;
+ startTime[port] << datetime.toString("yyyy") << datetime.toString("MM") << datetime.toString("dd")
+ << datetime.toString("hh") << datetime.toString("mm") << datetime.toString("ss");
+ }
+ if(endTime.find(port) != endTime.end())
+ {
+ endTime[port].clear();
+ }
+ endTime[port] << datetime.toString("yyyy") << datetime.toString("MM") << datetime.toString("dd")
+ << datetime.toString("hh") << datetime.toString("mm") << datetime.toString("ss");
+ }
+ }
+ file.close();
+ }
+ }
+}
+
+QStringList LogPlayImpl::getCanLogTime(QString port)
+{
+ if(startTime.find(port) != startTime.end() && endTime.find(port) != endTime.end())
+ {
+ return startTime[port] + endTime[port];
+ }
+ else
+ {
+ return QStringList();
+ }
+}
+
+QStringList LogPlayImpl::getPortsList()
+{
+ return portsList;
+}
+
+bool LogPlayImpl::CANPlay(bool play)
+{
+ if(play)
+ {
+ playUtils = fork();
+ switch(playUtils)
+ {
+ case 0:
+ execl(PlayUtilsExec.c_str(), basename(PlayUtilsExec.c_str()),
+ playUtilsArg["-p"].toStdString().c_str(),
+ "-I", playUtilsArg["-I"].toStdString().c_str(),
+ "-l", "i",
+ (char*)NULL);
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ if((playUtils > 0) && (kill(playUtils, SIGUSR1) == 0))
+ {
+ waitpid(playUtils, NULL, 0);
+ }
+ }
+
+ return true;
+}
+
+void LogPlayImpl::setCANProperty(int index, QString port, QString stime, QString etime)
+{
+ if(index > 0 && index < datas.size())
+ {
+ playUtilsArg["-p"] = "vcan0="+port;
+ playUtilsArg["-I"] = datas[index][pathRole].toString();
+ }
+}
+
+bool LogPlayImpl::checkTime(QString port, QString stime, QString etime)
+{
+ QString maxtime = "";
+ QString mintime = "";
+
+ if(startTime.find(port) == startTime.end() || endTime.find(port) == endTime.end())
+ {
+ return false;
+ }
+
+ for(int idx = 0; idx < startTime[port].length() && idx < endTime[port].length(); idx++)
+ {
+ mintime += startTime[port].at(idx) + (idx == startTime[port].length() - 1 ? "" : ",");
+ maxtime += endTime[port].at(idx) + (idx == endTime[port].length() - 1 ? "" : ",");
+ }
+
+ if((stime < mintime) || (stime > maxtime) || (etime < mintime) || (etime > maxtime) || (stime > etime))
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+QString LogPlayImpl::convertTimeFormat(QString time)
+{
+ QStringList sep;
+ QString convertstr = "";
+
+ sep << "-" << "-" << "." << ":" << ":";
+
+ //2016-02-08.09:41:59
+ for(int idx = 0; idx <= time.count(","); idx++)
+ {
+ convertstr += time.section(',' , idx, idx) + (idx < sep.length() ? sep.at(idx) : "");
+ }
+
+ return convertstr;
+}