summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/dive.h1
-rw-r--r--core/file.c21
-rw-r--r--core/qthelper.cpp91
-rw-r--r--core/qthelper.h1
-rw-r--r--core/qthelperfromc.h1
-rw-r--r--desktop-widgets/divelogimportdialog.cpp51
6 files changed, 116 insertions, 50 deletions
diff --git a/core/dive.h b/core/dive.h
index fa6133bd3..4402788c2 100644
--- a/core/dive.h
+++ b/core/dive.h
@@ -704,6 +704,7 @@ extern int parse_dlf_buffer(unsigned char *buffer, size_t size);
extern int parse_file(const char *filename);
extern int parse_csv_file(const char *filename, char **params, int pnr, const char *csvtemplate);
+extern int parse_seabear_log(const char *filename);
extern int parse_seabear_csv_file(const char *filename, char **params, int pnr, const char *csvtemplate);
extern int parse_txt_file(const char *filename, const char *csv);
extern int parse_manual_file(const char *filename, char **params, int pnr);
diff --git a/core/file.c b/core/file.c
index ba2956d60..6dc082fc7 100644
--- a/core/file.c
+++ b/core/file.c
@@ -1055,6 +1055,27 @@ int parse_csv_file(const char *filename, char **params, int pnr, const char *csv
}
#define SBPARAMS 40
+int parse_seabear_log(const char *filename)
+{
+ char *params[SBPARAMS];
+ int pnr = 0;
+
+ pnr = parse_seabear_header(filename, params, pnr);
+
+ if (parse_seabear_csv_file(filename, params, pnr, "csv") < 0) {
+ return -1;
+ }
+ // Seabear CSV stores NDL and TTS in Minutes, not seconds
+ struct dive *dive = dive_table.dives[dive_table.nr - 1];
+ for(int s_nr = 0 ; s_nr < dive->dc.samples ; s_nr++) {
+ struct sample *sample = dive->dc.sample + s_nr;
+ sample->ndl.seconds *= 60;
+ sample->tts.seconds *= 60;
+ }
+
+ return 0;
+}
+
int parse_seabear_csv_file(const char *filename, char **params, int pnr, const char *csvtemplate)
{
int ret, i;
diff --git a/core/qthelper.cpp b/core/qthelper.cpp
index 993ecbf7d..0673a78ce 100644
--- a/core/qthelper.cpp
+++ b/core/qthelper.cpp
@@ -1510,6 +1510,97 @@ QString getUUID()
return uuidString;
}
+int parse_seabear_header(const char *filename, char **params, int pnr)
+{
+ QFile f(filename);
+
+ f.open(QFile::ReadOnly);
+ QString parseLine = f.readLine();
+
+ /*
+ * Parse header - currently only interested in sample
+ * interval and hardware version. If we have old format
+ * the interval value is missing from the header.
+ */
+
+ while ((parseLine = f.readLine().trimmed()).length() > 0 && !f.atEnd()) {
+ if (parseLine.contains("//Hardware Version: ")) {
+ params[pnr++] = strdup("hw");
+ params[pnr++] = strdup(parseLine.replace(QString::fromLatin1("//Hardware Version: "), QString::fromLatin1("\"Seabear ")).trimmed().append("\"").toUtf8().data());
+ break;
+ }
+ }
+
+ /*
+ * Note that we scan over the "Log interval" on purpose
+ */
+
+ while ((parseLine = f.readLine().trimmed()).length() > 0 && !f.atEnd()) {
+ if (parseLine.contains("//Log interval: ")) {
+ params[pnr++] = strdup("delta");
+ params[pnr++] = strdup(parseLine.remove(QString::fromLatin1("//Log interval: ")).trimmed().remove(QString::fromLatin1(" s")).toUtf8().data());
+ }
+ }
+
+ /*
+ * Parse CSV fields
+ */
+
+ parseLine = f.readLine().trimmed();
+
+ QStringList currColumns = parseLine.split(';');
+ unsigned short index = 0;
+ Q_FOREACH (QString columnText, currColumns) {
+ if (columnText == "Time") {
+ params[pnr++] = strdup("timeField");
+ params[pnr++] = intdup(index++);
+ } else if (columnText == "Depth") {
+ params[pnr++] = strdup("depthField");
+ params[pnr++] = intdup(index++);
+ } else if (columnText == "Temperature") {
+ params[pnr++] = strdup("tempField");
+ params[pnr++] = intdup(index++);
+ } else if (columnText == "NDT") {
+ params[pnr++] = strdup("ndlField");
+ params[pnr++] = intdup(index++);
+ } else if (columnText == "TTS") {
+ params[pnr++] = strdup("ttsField");
+ params[pnr++] = intdup(index++);
+ } else if (columnText == "pO2_1") {
+ params[pnr++] = strdup("o2sensor1Field");
+ params[pnr++] = intdup(index++);
+ } else if (columnText == "pO2_2") {
+ params[pnr++] = strdup("o2sensor2Field");
+ params[pnr++] = intdup(index++);
+ } else if (columnText == "pO2_3") {
+ params[pnr++] = strdup("o2sensor3Field");
+ params[pnr++] = intdup(index++);
+ } else if (columnText == "Ceiling") {
+ /* TODO: Add support for dive computer reported ceiling*/
+ params[pnr++] = strdup("ceilingField");
+ params[pnr++] = intdup(index++);
+ } else if (columnText == "Tank pressure") {
+ params[pnr++] = strdup("pressureField");
+ params[pnr++] = intdup(index++);
+ } else {
+ // We do not know about this value
+ qDebug() << "Seabear import found an un-handled field: " << columnText;
+ }
+ }
+
+ /* Separator is ';' and the index for that in DiveLogImportDialog constructor is 2 */
+ params[pnr++] = strdup("separatorIndex");
+ params[pnr++] = intdup(2);
+
+ /* And metric units */
+ params[pnr++] = strdup("units");
+ params[pnr++] = intdup(0);
+
+ params[pnr] = NULL;
+ f.close();
+ return pnr;
+}
+
char *intdup(int index)
{
char tmpbuf[21];
diff --git a/core/qthelper.h b/core/qthelper.h
index a85294963..8d06ce93e 100644
--- a/core/qthelper.h
+++ b/core/qthelper.h
@@ -47,5 +47,6 @@ extern "C" void subsurface_mkdir(const char *dir);
void init_proxy();
QString getUUID();
char *intdup(int index);
+extern "C" int parse_seabear_header(const char *filename, char **params, int pnr);
#endif // QTHELPER_H
diff --git a/core/qthelperfromc.h b/core/qthelperfromc.h
index 4b2ef3d53..91fbde415 100644
--- a/core/qthelperfromc.h
+++ b/core/qthelperfromc.h
@@ -20,5 +20,6 @@ char *hashfile_name_string();
char *picturedir_string();
const char *subsurface_user_agent();
enum deco_mode decoMode();
+int parse_seabear_header(const char *filename, char **params, int pnr);
#endif // QTHELPERFROMC_H
diff --git a/desktop-widgets/divelogimportdialog.cpp b/desktop-widgets/divelogimportdialog.cpp
index 9a455fcdb..51046216f 100644
--- a/desktop-widgets/divelogimportdialog.cpp
+++ b/desktop-widgets/divelogimportdialog.cpp
@@ -846,58 +846,9 @@ void DiveLogImportDialog::on_buttonBox_accepted()
if (ui->knownImports->currentText() != "Manual import") {
for (int i = 0; i < fileNames.size(); ++i) {
if (ui->knownImports->currentText() == "Seabear CSV") {
- char *params[40];
- int pnr = 0;
- params[pnr++] = strdup("timeField");
- params[pnr++] = intdup(r.indexOf(tr("Sample time")));
- params[pnr++] = strdup("depthField");
- params[pnr++] = intdup(r.indexOf(tr("Sample depth")));
- params[pnr++] = strdup("tempField");
- params[pnr++] = intdup(r.indexOf(tr("Sample temperature")));
- params[pnr++] = strdup("po2Field");
- params[pnr++] = intdup(r.indexOf(tr("Sample pO₂")));
- params[pnr++] = strdup("o2sensor1Field");
- params[pnr++] = intdup(r.indexOf(tr("Sample sensor1 pO₂")));
- params[pnr++] = strdup("o2sensor2Field");
- params[pnr++] = intdup(r.indexOf(tr("Sample sensor2 pO₂")));
- params[pnr++] = strdup("o2sensor3Field");
- params[pnr++] = intdup(r.indexOf(tr("Sample sensor3 pO₂")));
- params[pnr++] = strdup("cnsField");
- params[pnr++] = intdup(r.indexOf(tr("Sample CNS")));
- params[pnr++] = strdup("ndlField");
- params[pnr++] = intdup(r.indexOf(tr("Sample NDL")));
- params[pnr++] = strdup("ttsField");
- params[pnr++] = intdup(r.indexOf(tr("Sample TTS")));
- params[pnr++] = strdup("stopdepthField");
- params[pnr++] = intdup(r.indexOf(tr("Sample stopdepth")));
- params[pnr++] = strdup("pressureField");
- params[pnr++] = intdup(r.indexOf(tr("Sample pressure")));
- params[pnr++] = strdup("setpointFiend");
- params[pnr++] = intdup(-1);
- params[pnr++] = strdup("separatorIndex");
- params[pnr++] = intdup(ui->CSVSeparator->currentIndex());
- params[pnr++] = strdup("units");
- params[pnr++] = intdup(ui->CSVUnits->currentIndex());
- params[pnr++] = strdup("delta");
- params[pnr++] = strdup(delta.toUtf8().data());
- if (hw.length()) {
- params[pnr++] = strdup("hw");
- params[pnr++] = strdup(hw.toUtf8().data());
- }
- params[pnr++] = NULL;
+ parse_seabear_log(fileNames[i].toUtf8().data());
- if (parse_seabear_csv_file(fileNames[i].toUtf8().data(),
- params, pnr - 1, "csv") < 0) {
- return;
- }
- // Seabear CSV stores NDL and TTS in Minutes, not seconds
- struct dive *dive = dive_table.dives[dive_table.nr - 1];
- for(int s_nr = 0 ; s_nr < dive->dc.samples ; s_nr++) {
- struct sample *sample = dive->dc.sample + s_nr;
- sample->ndl.seconds *= 60;
- sample->tts.seconds *= 60;
- }
} else {
char *params[49];
int pnr = 0;