ZT/sources/GuiElements/LogsListPage.cpp
jfmartel fcfa86a27b Ajout des infos Modbus aux fichiers de passage
-Modification des fichiers de passage pour inclure les infos
supplémentaires obtenus par Modbus (type et composition du train)
2018-02-07 11:44:52 -05:00

877 lines
28 KiB
C++

/*******************************************************************************
* *
* Société de Transports de Montréal. *
* 2012 *
* *
* Projet Zones Tests *
* *
* *
* *
*******************************************************************************/
/*
Description:
Page affichant la liste des passages de train.
*/
/* ************************************************************************** */
/* Revision:
### 20131021 JFM
Verision d'origine.
### YYYMMDD Description du besoin ou du bug
Description du changement.
*/
/* ************************************************************************** */
#include "LogsListPage.h"
#include <QGraphicsProxyWidget>
#include "Zonetest.h"
#include "TrainLogFileMgr.h"
#include <QString>
#include "ZTLog.h"
CLogsListPage::~CLogsListPage()
{
// delete mListParsingTimer;
delete mLogArchiverThread;
delete mLogArchiverWorkerThread;
}
CLogsListPage::CLogsListPage(QGraphicsWidget *Parent)
{
setParentItem(Parent);
mProgramHandle = 0;
mUSBDetected = false;
mShowZT1Items = mShowZT2Items = mShowNoDetections = true;
mBackgroundRect = new QGraphicsRectItem(boundingRect(), this);
QBrush BackgroundBrush(QColor(245, 245, 255));
mBackgroundRect->setBrush(BackgroundBrush);
mCancelButton = new CTextButtonWidget("Fermer");
mCancelButton->setParentItem(this);
mCancelButton->setPos(810,550);
connect(mCancelButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*)));
mLogsTable = new QTableWidget(0,3);
QGraphicsProxyWidget *TableProxy = new QGraphicsProxyWidget(this);
TableProxy->setWidget(mLogsTable);
TableProxy->setPos(3,20);
TableProxy->resize(300,550);
mLogsTable->resize(300,550);
mLogsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
mLogsTable->setSelectionMode(QAbstractItemView::SingleSelection);
mLogsTable->setHorizontalHeaderLabels(QStringList() << "Date du passage" << "Décl." << "Type");
// connect(mLogsTable,SIGNAL(cellClicked(int,int)),this,SLOT(LogsTableCellClicked(int,int)));
connect(mLogsTable,SIGNAL(cellDoubleClicked(int,int)),SLOT(TableDoubleClicked(int,int)));
//connect(mLogsTable,SIGNAL(currentItemChanged(QTableWidgetItem*,QTableWidgetItem*)),this,SLOT(TableCurItemChanged(QTableWidgetItem*,QTableWidgetItem*)));
connect(mLogsTable,SIGNAL(itemSelectionChanged()),this,SLOT(LogsTableCellSelected(/*int,int*/)));
mSummaryText = new QGraphicsTextItem(this);
QFont textfont;
textfont.setPointSize(12);
mSummaryText->setFont(textfont);
mSummaryText->setPlainText("Statistiques du passage:");
mSummaryText->setPos(350,20);
QGraphicsProxyWidget *CheckBoxProxy = new QGraphicsProxyWidget(this);
mShowZT1ItemsChkBx = new QCheckBox("Masquer ZT1");
CheckBoxProxy->setWidget(mShowZT1ItemsChkBx);
CheckBoxProxy->setPos(320,550);
mShowZT1ItemsChkBx->setChecked(false);
connect(mShowZT1ItemsChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int)));
CheckBoxProxy = new QGraphicsProxyWidget(this);
mShowZT2ItemsChkBx = new QCheckBox("Masquer ZT2");
CheckBoxProxy->setWidget(mShowZT2ItemsChkBx);
//CheckBoxProxy->setPos(410,550);
CheckBoxProxy->setPos(320,570);
mShowZT2ItemsChkBx->setChecked(false);
connect(mShowZT2ItemsChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int)));
CheckBoxProxy = new QGraphicsProxyWidget(this);
mShowNoDetectionsChkBx = new QCheckBox("Seulement\ndéclenchements");
CheckBoxProxy->setWidget(mShowNoDetectionsChkBx);
CheckBoxProxy->setPos(450,550);
mShowNoDetectionsChkBx->setChecked(false);
connect(mShowNoDetectionsChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int)));
mListParsingTimer = new QTimer();
connect(mListParsingTimer,SIGNAL(timeout()),this,SLOT(ParsingTimerExipred()));
mUSBRefreshTimer = new QTimer();
mUSBRefreshTimer->setSingleShot(false);
connect(mUSBRefreshTimer,SIGNAL(timeout()),this,SLOT(CheckUSBKey()));
QGraphicsRectItem *Frame = new QGraphicsRectItem(650,50,200,80,this);
QPen FramePen;
FramePen.setWidth(3);
Frame->setPen(FramePen);
QGraphicsTextItem *Label = new QGraphicsTextItem(this);
Label->setPlainText("Sélection");
Label->setPos(650,25);
Label->setFont(textfont);
mViewLogDataButton = new CTextButtonWidget("Voir");
mViewLogDataButton->setParentItem(this);
mViewLogDataButton->setPos(730,60);
connect(mViewLogDataButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*)));
mExportCSVLogButton = new CTextButtonWidget("Générer CSV");
mExportCSVLogButton->setParentItem(this);
mExportCSVLogButton->setPos(700,95);
connect(mExportCSVLogButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*)));
mExportCSVLogButton->hide();
Label = new QGraphicsTextItem(this);
Label->setPlainText("Sauvegarde des passages");
Label->setPos(650,150);
Label->setFont(textfont);
Frame = new QGraphicsRectItem(650,175,200,80,this);
Frame->setPen(FramePen);
mArchiveFilesButton = new CTextButtonWidget("Archiver tout");
mArchiveFilesButton->setParentItem(this);
mArchiveFilesButton->setPos(700,185);
connect(mArchiveFilesButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*)));
mArchiveFilesButton->hide();
mEraseFilesCheckbox = new QCheckBox("Conserver les passages");
CheckBoxProxy = new QGraphicsProxyWidget(this);
CheckBoxProxy->setWidget(mEraseFilesCheckbox);
CheckBoxProxy->setPos(660,220);
mEraseFilesCheckbox->hide();
mInsertUSBKeyText = new QGraphicsTextItem("Veuillez insérer\nune clef USB",this);
mInsertUSBKeyText->setPos(675,190);
mInsertUSBKeyText->setFont(textfont);
mLogArchiverWorkerThread = new CLogFileArchiverThread();
mLogArchiverThread = new QThread();
mLogArchiverWorkerThread->moveToThread(mLogArchiverThread);
connect(mLogArchiverThread,SIGNAL(started()),mLogArchiverWorkerThread,SLOT(ArchiveLogs()));
connect(mLogArchiverWorkerThread,SIGNAL(LogArchivingFinished()),this,SLOT(LogsArchivingFinished()));
}
unsigned int CLogsListPage::ArchiveAllFiles()
{
// QString PathName = mUSBDrivePtr->GetDrivePath();
// PathName += "/ArchiveLogZT_";
// PathName += mProgramHandle->GetStationShortName();
// PathName += QDateTime::currentDateTime().toString("_yyyyMMdd");
// QDir TargetDir(PathName);
// TargetDir.mkdir(PathName); //If the directory does not exist, it will be created.
// //copy files
// QStringList LogFilters;
// LogFilters << "*.bin" << "*.csv";
// QDir LogDir("./Trains/");
// int NbFiles = 0;
// LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
// LogDir.setNameFilters(LogFilters);
// LogDir.setSorting(QDir::Name);
// for(int i = 0; i < LogDir.entryInfoList().size(); i++)
// {
// QString DestFileName = PathName;
// DestFileName += "/";
// DestFileName += LogDir.entryInfoList().at(i).fileName();
// if(QFile::copy(LogDir.entryInfoList().at(i).absoluteFilePath(),DestFileName))
// {
// NbFiles++;
// }
// }
// //Copy the ZTLog file each time.
// QString DestFileName = PathName;
// DestFileName += "/ZTLog.txt";
// CZTLog::instance()->CopyLogFile(DestFileName,true);
// system("sync");
// CZTLog::instance()->AddLogString(QString().sprintf("%d fichiers de passage archivés dans le répertoire %s",NbFiles,PathName.toUtf8().data()),true);
// if(mEraseFilesCheckbox->checkState() == Qt::Checked)
// {
// DeleteAllFiles();
// system("sync");
// mEraseFilesCheckbox->setChecked(false);
// }
mArchiveFilesButton->hide();
mInsertUSBKeyText->setPlainText("Copie en cours\nN'enlevez pas la clef");
mInsertUSBKeyText->show();
mEraseFilesCheckbox->hide();
mLogArchiverWorkerThread->SetPathInfo(mUSBDrivePtr->GetDrivePath(),mProgramHandle->GetStationShortName());
QString PathName = mUSBDrivePtr->GetDrivePath();
PathName += "/ArchiveLogZT_";
PathName += mProgramHandle->GetStationShortName();
PathName += QDateTime::currentDateTime().toString("_yyyyMMdd");
QDir TargetDir(PathName);
TargetDir.mkdir(PathName); //If the directory does not exist, it will be created.
QString DestFileName = PathName;
DestFileName += "/ZTLog.txt";
CZTLog::instance()->CopyLogFile(DestFileName,true);
mLogArchiverThread->start();
return RET_OK;
}
unsigned int CLogsListPage::DeleteAllFiles()
{
QStringList LogFilters;
LogFilters << "*.bin" << "*.csv";
QDir LogDir("./Trains/");
LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
LogDir.setNameFilters(LogFilters);
LogDir.setSorting(QDir::Name);
for(int i = 0; i < LogDir.entryInfoList().size(); i++)
{
QFile::remove(LogDir.entryInfoList().at(i).absoluteFilePath());
}
CZTLog::instance()->AddLogString("Tous les fichiers de passages ont été effacés",true);
mLogMgrHandle->ParseLogs();
RefreshList();
return RET_OK;
}
void CLogsListPage::NewTrainLogFileSaved()
{
RefreshList(true);
}
void CLogsListPage::resizeEvent(QGraphicsSceneResizeEvent *event)
{
Q_UNUSED(event)
mBackgroundRect->setRect(boundingRect());
}
void CLogsListPage::ButtonClicked(CTextButtonWidget *BtnPtr)
{
if(BtnPtr == mCancelButton)
{
mSummaryText->setPlainText("Statistiques du passage:");
hide();
}
else if(BtnPtr == mViewLogDataButton)
{
if(mLogMgrHandle->GetLogsCount() == 0)
return;
//int cursel = mLogsTable->currentItem()->data(Qt::UserRole).toInt();
int cursel = GetCurSelectedItemIndexInTable();
if(cursel == -1)
return;
CLogElement* Element = mLogMgrHandle->GetLogsList()->at(cursel);
//qDebug("Sel: %d, Type : %d",cursel,Element->mZTLogType);
mProgramHandle->LogViewRequest(mLogMgrHandle->LoadLogData(Element));
mLogMgrHandle->FreeLogData(Element);
}
else if(BtnPtr == mExportCSVLogButton)
{
if(mLogMgrHandle->GetLogsCount() == 0)
return;
QString Filename;
//int cursel = mLogsTable->currentItem()->data(Qt::UserRole).toInt();
int cursel = GetCurSelectedItemIndexInTable();
if(cursel == -1)
return;
CLogElement* Element = mLogMgrHandle->GetLogsList()->at(cursel);
mLogMgrHandle->LoadLogData(Element);
if(Element->mZTLogType == ZT1_LOG_TYPE)
{
CZT1LogElement *temp = (CZT1LogElement*)Element;
Filename = temp->mLogFileName.replace("bin","csv");
CTrainLogFileMgr::instance()->SaveCSVFile(Filename,&temp->mZTLogData,&temp->mFlags,&temp->mZTDetections,temp->mStationName);
}
else
{
CZT2LogElement *temp = (CZT2LogElement*)Element;
Filename = temp->mLogFileName.replace("bin","csv");
CTrainLogFileMgr::instance()->SaveCSVFile(Filename,&temp->mZTLogData,&temp->mZTDetections,temp->mStationName);
}
mLogMgrHandle->FreeLogData(Element);
}
else if(BtnPtr == mArchiveFilesButton)
{
ArchiveAllFiles();
}
}
unsigned int CLogsListPage::BindPointers(CUSBDriveInterface *USBDriveIF)
{
mUSBDrivePtr = USBDriveIF;
mUSBRefreshTimer->start(1000);
mLogArchiverWorkerThread->mLogMgrHandle = mLogMgrHandle;
return RET_OK;
}
unsigned int CLogsListPage::RefreshList(bool KeepSelectedCell)
{
QString SelectedCellText;
if(KeepSelectedCell == true)
{
QList<QTableWidgetItem*> list = mLogsTable->selectedItems();
if(list.size() == 0)
{
KeepSelectedCell = false;
}
for(int i = 0; i < list.size(); i++)
{
if(list.at(i)->column() == 0)
{
SelectedCellText = list.at(i)->text();
qDebug("Selected cell text: %s",SelectedCellText.toAscii().data());
break;
}
}
}
ClearTable();
mShowZT1Items = (mShowZT1ItemsChkBx->checkState() == Qt::Unchecked);
mShowZT2Items = (mShowZT2ItemsChkBx->checkState() == Qt::Unchecked);
mShowNoDetections = (mShowNoDetectionsChkBx->checkState() == Qt::Unchecked);
mLogsTable->setRowCount(mLogMgrHandle->GetLogsCount());
if(mLogMgrHandle->GetLogsCount() == 0)
return RET_OK;
int CurRow = 0;
QList<CLogElement*> *LogsList = mLogMgrHandle->GetLogsList();
for(unsigned int i = 0; i < mLogMgrHandle->GetLogsCount(); i++)
{
if(LogsList->at(i)->mZTLogType == ZT1_LOG_TYPE && mShowZT1Items == true)
{
CZT1LogElement *ZT1LogElement = (CZT1LogElement*)LogsList->at(i);
int NbDetections = ZT1LogElement->mZTDetections.size();
if(mShowNoDetections == false && NbDetections == 0)
{
}
else
{
QTableWidgetItem * NewItem = new QTableWidgetItem(ZT1LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss"));
QVariant ID(QVariant::Int);
ID.setValue(i);
NewItem->setData(Qt::UserRole,ID);
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,0,NewItem);
NewItem = new QTableWidgetItem(QString().sprintf("%d",NbDetections));
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,1,NewItem);
NewItem = new QTableWidgetItem(QString().sprintf("ZT1"));
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,2,NewItem);
CurRow++;
}
}
else if(LogsList->at(i)->mZTLogType == ZT2_LOG_TYPE && mShowZT2Items == true)
{
CZT2LogElement *ZT2LogElement = (CZT2LogElement*)LogsList->at(i);
int NbDetections = ZT2LogElement->mZTDetections.size();
if(mShowNoDetections == false && NbDetections == 0)
{
}
else
{
QTableWidgetItem * NewItem = new QTableWidgetItem(ZT2LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss"));
QVariant ID(QVariant::Int);
ID.setValue(i);
NewItem->setData(Qt::UserRole,ID);
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,0,NewItem);
NewItem = new QTableWidgetItem(QString().sprintf("%d",ZT2LogElement->mZTDetections.size()));
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,1,NewItem);
NewItem = new QTableWidgetItem(QString().sprintf("ZT2"));
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,2,NewItem);
CurRow++;
}
}
}
mLogsTable->setRowCount(CurRow);
mLogsTable->setColumnWidth(0,150);
mLogsTable->setColumnWidth(1,50);
mLogsTable->setColumnWidth(2,50);
mLogsTable->sortItems(0,Qt::DescendingOrder);
if(KeepSelectedCell == true)
{
QList<QTableWidgetItem *> Items = mLogsTable->findItems(SelectedCellText,Qt::MatchFixedString);
if(Items.size() != 0)
{
mLogsTable->setCurrentCell(Items.at(0)->row(),0);
qDebug("Found cell text: %s",Items.at(0)->text().toAscii().data());
}
else
{
mLogsTable->setCurrentCell(0,0);
}
}
else
{
mLogsTable->setCurrentCell(0,0);
}
// LogsTableCellClicked(0,0);
return RET_OK;
}
void CLogsListPage::ClearTable()
{
for(int Col = 0; Col < mLogsTable->columnCount(); Col++)
{
for(int Row = 0; Row < mLogsTable->rowCount(); Row++)
{
delete mLogsTable->item(Row,Col);
}
}
mLogsTable->clearContents();
mLogsTable->setRowCount(0);
}
//void CLogsListPage::LogsTableCellClicked(int row, int column)
//{
// return;
// Q_UNUSED(column);
// Q_UNUSED(row);
//// int rowcount = mLogsTable->rowCount();
//// if(rowcount == 0)
//// return;
////// qDebug("Selection : %d",row);
//// QList<CLogElement*> *LogsList = mLogMgrHandle->GetLogsList();
//// float MeanSpeed = 0.0;
//// QString Summary;
//// int ItemIndex = mLogsTable->item(row,0)->data(Qt::UserRole).toInt();
//// ShowItemSummary(LogsList->at(ItemIndex));
//}
void CLogsListPage::ShowItemSummary(CLogElement *Element)
{
float MeanSpeed;
QString Summary;
if(Element->mZTLogType == ZT1_LOG_TYPE)
{
// //CZT1LogElement *ZT1LogElement = (CZT1LogElement*) LogsList->at(row);
CZT1LogElement *ZT1LogElement = (CZT1LogElement*) Element;
MeanSpeed = ZT1LogElement->mMeanSpeed;
QString Problem = "Non";
if(ZT1LogElement->mFlags.mIsProblematicPassage == 1)
{
Problem = "Oui";
}
QString Composition("Inconnue");
if(ZT1LogElement->mFlags.mTrainCompo1 != 0) //if compo is valid, this will be != 0...
{
Composition = QString("%1 - %2 - %3").arg(ZT1LogElement->mFlags.mTrainCompo1).arg(ZT1LogElement->mFlags.mTrainCompo2).arg(ZT1LogElement->mFlags.mTrainCompo3);
}
QString TrainType = CZTData::GetTrainTypeString(ZT1LogElement->mTrainType);
if(ZT1LogElement->mFlags.mModbusTrainType != MODBUS_CC_TRAIN_TYPE_INVALID_NOT_UPDATED)
{
TrainType = CZTData::GetModbusTrainTypeString(ZT1LogElement->mFlags.mModbusTrainType);
}
// Summary.sprintf("Statistiques du passage:\n\nDate: %s\nHeure: %s\nTrain : %s\nNombre d'éléments: %d\nVitesse moyenne : %f mph\nPassage problématique: %s\n\nDéclenchements: \n",
// ZT1LogElement->mPassageDateTime.toString("yyyy/MM/dd").toAscii().data(),
// ZT1LogElement->mPassageDateTime.toString("hh:mm:ss").toAscii().data(),
// CZTData::GetTrainTypeString(ZT1LogElement->mTrainType),
// ZT1LogElement->mNbElements,
// MeanSpeed,
// Problem.toUtf8().data());
Summary = QString("Statistiques du passage:\n\nDate: %1\nHeure: %2\nTrain : %3\nNombre d'éléments: %4\nComposition : %5\nPassage problématique: %6\n\nDéclenchements: \n")\
.arg(ZT1LogElement->mPassageDateTime.toString("yyyy/MM/dd"))\
.arg(ZT1LogElement->mPassageDateTime.toString("hh:mm:ss"))\
.arg(TrainType)\
.arg(ZT1LogElement->mNbElements)\
.arg(Composition)\
.arg(Problem.toUtf8().data());
if(ZT1LogElement->mZTDetections.size() > 0)
{
for(int i = 0; i < ZT1LogElement->mZTDetections.size(); i++)
{
QString temp;
if(ZT1LogElement->mZTDetections.at(i)->mDetectionID == DETECTION_FN_DETECTION)
{
temp.sprintf("%s au bogie %d\n",CZTData::GetErrorString(ZT1LogElement->mZTDetections.at(i)->mDetectionID),ZT1LogElement->mZTDetections.at(i)->mRank);
}
else
{
temp.sprintf("%s au rang %d\n",CZTData::GetErrorString(ZT1LogElement->mZTDetections.at(i)->mDetectionID),ZT1LogElement->mZTDetections.at(i)->mRank);
}
Summary += temp;
if(i >= MAX_DETECTION_LIST_NBR - 1)
{
temp = " -- Autres déclenchements non affichés --";
Summary += temp;
break;
}
}
}
else
Summary += "Aucun déclenchement";
}
//else if(LogsList->at(row)->mZTLogType == ZT2_LOG_TYPE)
else if(Element->mZTLogType == ZT2_LOG_TYPE)
{
//CZT2LogElement *ZT2LogElement = (CZT2LogElement*) LogsList->at(row);
CZT2LogElement *ZT2LogElement = (CZT2LogElement*) Element;
QString Problem = "Non";
if(ZT2LogElement->mFlags.mIsProblematicPassage == 1)
{
Problem = "Oui";
}
Summary.sprintf("Statistiques du passage:\n\nDate: %s\nHeure: %s\nNombre d'éléments: %d\nPassage problématique: %s\n\n\n\nDéclenchements: \n",
ZT2LogElement->mPassageDateTime.toString("yyyy/MM/dd").toAscii().data(),
ZT2LogElement->mPassageDateTime.toString("hh:mm:ss").toAscii().data(),
ZT2LogElement->mNbElements,
Problem.toUtf8().data());
if(ZT2LogElement->mZTDetections.size() > 0)
{
for(int i = 0; i < ZT2LogElement->mZTDetections.size(); i++)
{
QString temp;
temp.sprintf("%s au rang %d\n",CZTData::GetErrorString(ZT2LogElement->mZTDetections.at(i)->mDetectionID),ZT2LogElement->mZTDetections.at(i)->mRank);
Summary += temp;
if(i >= MAX_DETECTION_LIST_NBR-1)
{
temp = " -- Autres déclenchements non affichés --";
Summary += temp;
break;
}
}
}
else
Summary += "Aucun déclenchement";
}
mSummaryText->setPlainText(Summary);
}
void CLogsListPage::ParsingTimerExipred()
{
if(mLogMgrHandle->ParseNextLog() == false)
{
mListParsingTimer->stop();
}
else
{
int CurRow = mLogsTable->rowCount();
mLogsTable->setRowCount(CurRow+1);
QList<CLogElement*> *LogsList = mLogMgrHandle->GetLogsList();
//for(unsigned int i = 0; i < mLogMgrHandle->GetLogsCount(); i++)
{
if(LogsList->last()->mZTLogType == ZT1_LOG_TYPE && mShowZT1Items == true)
{
CZT1LogElement *ZT1LogElement = (CZT1LogElement*)LogsList->last();
int NbDetections = ZT1LogElement->mZTDetections.size();
if(mShowNoDetections == false && NbDetections == 0)
{
}
else
{
QTableWidgetItem * NewItem = new QTableWidgetItem(ZT1LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss"));
NewItem->setData(Qt::UserRole,QVariant(LogsList->size()-1));
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,0,NewItem);
NewItem = new QTableWidgetItem(QString().sprintf("%d",NbDetections));
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,1,NewItem);
NewItem = new QTableWidgetItem(QString().sprintf("ZT1"));
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,2,NewItem);
}
}
else if(LogsList->last()->mZTLogType == ZT2_LOG_TYPE && mShowZT2Items == true)
{
CZT2LogElement *ZT2LogElement = (CZT2LogElement*)LogsList->last();
int NbDetections = ZT2LogElement->mZTDetections.size();
if(mShowNoDetections == false && NbDetections == 0)
{
}
else
{
QTableWidgetItem * NewItem = new QTableWidgetItem(ZT2LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss"));
NewItem->setData(Qt::UserRole,QVariant(LogsList->size()-1));
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,0,NewItem);
NewItem = new QTableWidgetItem(QString().sprintf("%d",ZT2LogElement->mZTDetections.size()));
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,1,NewItem);
NewItem = new QTableWidgetItem(QString().sprintf("ZT2"));
NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
mLogsTable->setItem(CurRow,2,NewItem);
}
}
}
// mLogsTable->setRowCount(CurRow+1);
mLogsTable->setColumnWidth(0,150);
mLogsTable->setColumnWidth(1,50);
mLogsTable->setColumnWidth(2,50);
mLogsTable->sortItems(0);
mListParsingTimer->start(20);
// mLogsTable->setCurrentCell(0,0);
// LogsTableCellClicked(0,0);
}
}
void CLogsListPage::CheckUSBKey()
{
if(mUSBDrivePtr->IsDriveDetected() != mUSBDetected)
{
mUSBDetected = mUSBDrivePtr->IsDriveDetected();
if(mUSBDetected == true)
{
mInsertUSBKeyText->hide();
mArchiveFilesButton->show();
mEraseFilesCheckbox->setCheckState(Qt::Unchecked);
mEraseFilesCheckbox->show();
}
else
{
mInsertUSBKeyText->setPlainText("Veuillez insérer\nune clef USB");
mInsertUSBKeyText->show();
mArchiveFilesButton->hide();
mEraseFilesCheckbox->hide();
}
}
}
//Grab the mouse if the user clicks outside buttons
void CLogsListPage::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Q_UNUSED(event)
}
void CLogsListPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
Q_UNUSED(event)
}
void CLogsListPage::CheckBoxClicked(int state)
{
Q_UNUSED(state)
RefreshList();
}
void CLogsListPage::TableDoubleClicked(int row, int col)
{
Q_UNUSED(col)
Q_UNUSED(row)
ButtonClicked(mViewLogDataButton);
}
//void CLogsListPage::TableCurItemChanged(QTableWidgetItem *Current, QTableWidgetItem *Prev)
//{
// int rowcount = mLogsTable->rowCount();
// if(rowcount == 0)
// return;
// if(Prev == Current)
// return;
// QList<CLogElement*> *LogsList = mLogMgrHandle->GetLogsList();
// int Selection = Current->data(Qt::UserRole).toInt();
// CLogElement *SelectedElement = LogsList->at(Selection);
// ShowItemSummary(SelectedElement);
//// qDebug("Changed %d",Selection);
//}
void CLogsListPage::LogsTableCellSelected(/*int row, int col*/)
{
int Selection = GetCurSelectedItemIndexInTable();
if(Selection == -1)
return;
QList<CLogElement*> *LogsList = mLogMgrHandle->GetLogsList();
CLogElement *SelectedElement = LogsList->at(Selection);
ShowItemSummary(SelectedElement);
}
int CLogsListPage::GetCurSelectedItemIndexInTable()
{
QList<QTableWidgetItem*> list = mLogsTable->selectedItems();
if(list.size() == 0)
return - 1;
int Selection = -1;
for(int i = 0; i < list.size(); i++)
{
if(list.at(i)->column() == 0)
{
Selection = list.at(i)->data(Qt::UserRole).toInt();
break;
}
}
return Selection;
}
void CLogsListPage::LogsArchivingFinished()
{
// CZTLog::instance()->DeleteLogFile();
if(mEraseFilesCheckbox->checkState() == Qt::Unchecked)
{
mLogMgrHandle->DeleteErrorLogs();
}
//The "sync" command has been moved in the thread instead of pausing the watchdog...
// The file syncing can take a lot of time (the "sync" command syncs ALL of the file system).
// So we must disable the watchdog to avoid a computer reboot.
// mProgramHandle->PauseInternalWatchdog();
// system("sync");
// mProgramHandle->ResumeInternalWatchdog();
RefreshList();
mLogArchiverThread->quit();
if(mEraseFilesCheckbox->checkState() == Qt::Unchecked)
{
mProgramHandle->ResetTriggerCount();
mProgramHandle->ResetNbPassages();
}
mInsertUSBKeyText->hide();
mArchiveFilesButton->show();
mEraseFilesCheckbox->show();
CZTLog::instance()->DeleteLogFile();
}
////// Thread implementation //////////////
CLogFileArchiverThread::CLogFileArchiverThread()
{
mDrivePath = "";
}
void CLogFileArchiverThread::SetPathInfo(QString DrivePath,QString StationName)
{
mDrivePath = DrivePath;
mStationName = StationName;
}
void CLogFileArchiverThread::ArchiveLogs()
{
QString PathName = mDrivePath;
PathName += "/ArchiveLogZT_";
PathName += mStationName;
PathName += QDateTime::currentDateTime().toString("_yyyyMMdd");
QDir TargetDir(PathName);
TargetDir.mkdir(PathName); //If the directory does not exist, it will be created.
//copy files
QStringList LogFilters;
LogFilters << "*.bin" << "*.csv";
QDir LogDir("./Trains/");
int NbFiles = 0;
LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
LogDir.setNameFilters(LogFilters);
LogDir.setSorting(QDir::Name);
for(int i = 0; i < LogDir.entryInfoList().size(); i++)
{
QString DestFileName = PathName;
DestFileName += "/";
DestFileName += LogDir.entryInfoList().at(i).fileName();
if(QFile::copy(LogDir.entryInfoList().at(i).absoluteFilePath(),DestFileName))
{
NbFiles++;
}
}
///JFM: Is it dangerous to access these from the thread ?
// CZTLog::instance()->DeleteLogFile();
// mLogMgrHandle->DeleteErrorLogs();
/// Moved outside of threads
system("sync");
CZTLog::instance()->AddLogString(QString().sprintf("%d fichiers de passage archivés dans le répertoire %s",NbFiles,PathName.toUtf8().data()),true);
emit LogArchivingFinished();
}