Import: import Poseidon MkVI logs via DiveLogImportDialog

Poseidon MkVI logs (.txt) were special cased in MainWindow.cpp,
which led to a user-interface inconsistency. In some cases
[user chooses ".txt" (non-Poseidon) and ".csv"], *two*
import-dialogs were shown.

Move handling of Poseidon MkVI logs into DiveLogImportDialog.
There are already other "special" cases handled in this dialog.

At the moment, this shows the first 10 depth-values, which is
kind of useless, as this will all be at surface level. We
might think about something more useful.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2018-10-01 14:17:38 +02:00 committed by Dirk Hohndel
parent 9788d73d48
commit a4051749fd
4 changed files with 72 additions and 48 deletions

View file

@ -27,6 +27,7 @@ const DiveLogImportDialog::CSVAppConfig DiveLogImportDialog::CSVApps[CSVAPPS] =
{ "Seabear CSV", 0, 1, 5, -1, -1, -1, -1, -1, 2, 3, 4, 6, -1, ";" },
{ "SubsurfaceCSV", -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, "Tab" },
{ "AV1", 0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, " " },
{ "Poseidon MkVI", 0, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, "," },
{ NULL, SILENCE_WARNING }
};
@ -39,7 +40,8 @@ enum Known {
SENSUS,
SEABEAR,
SUBSURFACE,
AV1
AV1,
POSEIDON
};
ColumnNameProvider::ColumnNameProvider(QObject *parent) : QAbstractListModel(parent)
@ -107,8 +109,6 @@ int ColumnNameProvider::mymatch(QString value) const
return -1;
}
ColumnNameView::ColumnNameView(QWidget*)
{
setAcceptDrops(true);
@ -345,6 +345,7 @@ DiveLogImportDialog::DiveLogImportDialog(QStringList fn, QWidget *parent) : QDia
specialCSV << SUBSURFACE;
specialCSV << DL7;
specialCSV << AV1;
specialCSV << POSEIDON;
for (int i = 0; !CSVApps[i].name.isNull(); ++i)
ui->knownImports->addItem(CSVApps[i].name);
@ -378,9 +379,24 @@ void DiveLogImportDialog::loadFileContentsKnownTypesSelected(int value)
loadFileContents(value, KNOWNTYPES);
}
// Turn a "*.csv" or "*.txt" filename into a pair of both, "*.csv" and "*.txt".
// If the input wasn't either "*.csv" or "*.txt", then both returned strings
// are empty
static QPair<QString, QString> poseidonFileNames(const QString &fn)
{
if (fn.endsWith(".csv", Qt::CaseInsensitive)) {
QString txt = fn.left(fn.size() - 3) + "txt";
return { fn, txt };
} else if (fn.endsWith(".txt", Qt::CaseInsensitive)) {
QString csv = fn.left(fn.size() - 3) + "csv";
return { csv, fn };
} else {
return { QString(), QString() };
}
}
void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy)
{
QFile f(fileNames.first());
QList<QStringList> fileColumns;
QStringList currColumns;
QStringList headers;
@ -389,6 +405,7 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy)
bool xp5 = false;
bool apd = false;
bool dl7 = false;
bool poseidon = false;
// reset everything
ColumnNameProvider *provider = new ColumnNameProvider(this);
@ -397,6 +414,26 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy)
resultModel = new ColumnNameResult(this);
ui->tableView->setModel(resultModel);
// Poseidon MkVI is special: it is made up of a .csv *and* a .txt file.
// If the user specified one, we'll try to check for the other.
QString fileName = fileNames.first();
QPair<QString, QString> pair = poseidonFileNames(fileName);
if (!pair.second.isEmpty()) {
QFile f_txt(pair.second);
f_txt.open(QFile::ReadOnly);
QString firstLine = f_txt.readLine();
if (firstLine.startsWith("MkVI_Config ")) {
poseidon = true;
fileName = pair.first; // Read data from CSV
headers.append("Time");
headers.append("Depth");
blockSignals(true);
ui->knownImports->setCurrentText("Poseidon MkVI");
blockSignals(false);
}
}
QFile f(fileName);
f.open(QFile::ReadOnly);
QString firstLine = f.readLine();
if (firstLine.contains("SEABEAR")) {
@ -497,11 +534,8 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy)
}
}
firstLine = f.readLine().trimmed();
}
// Special handling for APD Log Viewer
if ((triggeredBy == KNOWNTYPES && (value == APD || value == APD2)) || (triggeredBy == INITIAL && fileNames.first().endsWith(".apd", Qt::CaseInsensitive))) {
QString apdseparator;
@ -726,6 +760,12 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy)
while (rows < 10 && !f.atEnd()) {
QString currLine = f.readLine().trimmed();
currColumns = currLine.split(separator);
// For Poseidon, read only columns where the second value is 8 (=depth)
if (poseidon) {
if (currColumns.size() < 3 || currColumns[1] != "8")
continue;
currColumns.removeAt(1);
}
fileColumns.append(currColumns);
rows += 1;
}
@ -845,6 +885,9 @@ void DiveLogImportDialog::on_buttonBox_accepted()
for (int i = 0; i < fileNames.size(); ++i) {
if (ui->knownImports->currentText() == "Seabear CSV") {
parse_seabear_log(qPrintable(fileNames[i]), &dive_table);
} else if (ui->knownImports->currentText() == "Poseidon MkVI") {
QPair<QString, QString> pair = poseidonFileNames(fileNames[i]);
parse_txt_file(qPrintable(pair.second), qPrintable(pair.first), &dive_table);
} else {
char *params[49];
int pnr = 0;