mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 05:00:20 +00:00
Refactor Seabear import
Moving the GUI independent Seabear import functionality to Subsurface core. This will allow Robert to call it directly from download from DC. Tested with H3 against released and daily versions of Subsurface. The result differs somewhat, but it is actually fixing 2 bugs: - Temperature was mis-interpreted previously - Sample interval for a dive with 1 second interval was parsed incorrectly Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
This commit is contained in:
parent
ab1813a445
commit
0dfa448d8c
6 changed files with 116 additions and 50 deletions
|
@ -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);
|
||||
|
|
21
core/file.c
21
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;
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue