Changeset 0dfa448 in subsurface


Ignore:
Timestamp:
May 7, 2017, 3:53:52 AM (5 months ago)
Author:
Miika Turkia <miika.turkia@…>
Branches:
master
Children:
cef56c6
Parents:
ab1813a
git-author:
Miika Turkia <miika.turkia@…> (05/07/17 03:41:09)
git-committer:
Miika Turkia <miika.turkia@…> (05/07/17 03:53:52)
Message:

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@…>

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • core/dive.h

    rb368ecd r0dfa448  
    705705extern int parse_file(const char *filename);
    706706extern int parse_csv_file(const char *filename, char **params, int pnr, const char *csvtemplate);
     707extern int parse_seabear_log(const char *filename);
    707708extern int parse_seabear_csv_file(const char *filename, char **params, int pnr, const char *csvtemplate);
    708709extern int parse_txt_file(const char *filename, const char *csv);
  • core/file.c

    r6399eaf r0dfa448  
    10561056
    10571057#define SBPARAMS 40
     1058int parse_seabear_log(const char *filename)
     1059{
     1060        char *params[SBPARAMS];
     1061        int pnr = 0;
     1062
     1063        pnr = parse_seabear_header(filename, params, pnr);
     1064
     1065        if (parse_seabear_csv_file(filename, params, pnr, "csv") < 0) {
     1066                return -1;
     1067        }
     1068        // Seabear CSV stores NDL and TTS in Minutes, not seconds
     1069        struct dive *dive = dive_table.dives[dive_table.nr - 1];
     1070        for(int s_nr = 0 ; s_nr < dive->dc.samples ; s_nr++) {
     1071                struct sample *sample = dive->dc.sample + s_nr;
     1072                sample->ndl.seconds *= 60;
     1073                sample->tts.seconds *= 60;
     1074        }
     1075
     1076        return 0;
     1077}
     1078
    10581079int parse_seabear_csv_file(const char *filename, char **params, int pnr, const char *csvtemplate)
    10591080{
  • core/qthelper.cpp

    rab1813a r0dfa448  
    15111511}
    15121512
     1513int parse_seabear_header(const char *filename, char **params, int pnr)
     1514{
     1515        QFile f(filename);
     1516
     1517        f.open(QFile::ReadOnly);
     1518        QString parseLine = f.readLine();
     1519
     1520        /*
     1521         * Parse header - currently only interested in sample
     1522         * interval and hardware version. If we have old format
     1523         * the interval value is missing from the header.
     1524         */
     1525
     1526        while ((parseLine = f.readLine().trimmed()).length() > 0 && !f.atEnd()) {
     1527                if (parseLine.contains("//Hardware Version: ")) {
     1528                        params[pnr++] = strdup("hw");
     1529                        params[pnr++] = strdup(parseLine.replace(QString::fromLatin1("//Hardware Version: "), QString::fromLatin1("\"Seabear ")).trimmed().append("\"").toUtf8().data());
     1530                        break;
     1531                }
     1532        }
     1533
     1534        /*
     1535         * Note that we scan over the "Log interval" on purpose
     1536         */
     1537
     1538        while ((parseLine = f.readLine().trimmed()).length() > 0 && !f.atEnd()) {
     1539                if (parseLine.contains("//Log interval: ")) {
     1540                        params[pnr++] = strdup("delta");
     1541                        params[pnr++] = strdup(parseLine.remove(QString::fromLatin1("//Log interval: ")).trimmed().remove(QString::fromLatin1(" s")).toUtf8().data());
     1542                }
     1543        }
     1544
     1545        /*
     1546         * Parse CSV fields
     1547         */
     1548
     1549        parseLine = f.readLine().trimmed();
     1550
     1551        QStringList currColumns = parseLine.split(';');
     1552        unsigned short index = 0;
     1553        Q_FOREACH (QString columnText, currColumns) {
     1554                if (columnText == "Time") {
     1555                        params[pnr++] = strdup("timeField");
     1556                        params[pnr++] = intdup(index++);
     1557                } else if (columnText == "Depth") {
     1558                        params[pnr++] = strdup("depthField");
     1559                        params[pnr++] = intdup(index++);
     1560                } else if (columnText == "Temperature") {
     1561                        params[pnr++] = strdup("tempField");
     1562                        params[pnr++] = intdup(index++);
     1563                } else if (columnText == "NDT") {
     1564                        params[pnr++] = strdup("ndlField");
     1565                        params[pnr++] = intdup(index++);
     1566                } else if (columnText == "TTS") {
     1567                        params[pnr++] = strdup("ttsField");
     1568                        params[pnr++] = intdup(index++);
     1569                } else if (columnText == "pO2_1") {
     1570                        params[pnr++] = strdup("o2sensor1Field");
     1571                        params[pnr++] = intdup(index++);
     1572                } else if (columnText == "pO2_2") {
     1573                        params[pnr++] = strdup("o2sensor2Field");
     1574                        params[pnr++] = intdup(index++);
     1575                } else if (columnText == "pO2_3") {
     1576                        params[pnr++] = strdup("o2sensor3Field");
     1577                        params[pnr++] = intdup(index++);
     1578                } else if (columnText == "Ceiling") {
     1579                        /* TODO: Add support for dive computer reported ceiling*/
     1580                        params[pnr++] = strdup("ceilingField");
     1581                        params[pnr++] = intdup(index++);
     1582                } else if (columnText == "Tank pressure") {
     1583                        params[pnr++] = strdup("pressureField");
     1584                        params[pnr++] = intdup(index++);
     1585                } else {
     1586                        // We do not know about this value
     1587                        qDebug() << "Seabear import found an un-handled field: " << columnText;
     1588                }
     1589        }
     1590
     1591        /* Separator is ';' and the index for that in DiveLogImportDialog constructor is 2 */
     1592        params[pnr++] = strdup("separatorIndex");
     1593        params[pnr++] = intdup(2);
     1594
     1595        /* And metric units */
     1596        params[pnr++] = strdup("units");
     1597        params[pnr++] = intdup(0);
     1598
     1599        params[pnr] = NULL;
     1600        f.close();
     1601        return pnr;
     1602}
     1603
    15131604char *intdup(int index)
    15141605{
  • core/qthelper.h

    rab1813a r0dfa448  
    4848QString getUUID();
    4949char *intdup(int index);
     50extern "C" int parse_seabear_header(const char *filename, char **params, int pnr);
    5051
    5152#endif // QTHELPER_H
  • core/qthelperfromc.h

    rb368ecd r0dfa448  
    2121const char *subsurface_user_agent();
    2222enum deco_mode decoMode();
     23int parse_seabear_header(const char *filename, char **params, int pnr);
    2324
    2425#endif // QTHELPERFROMC_H
  • desktop-widgets/divelogimportdialog.cpp

    rab1813a r0dfa448  
    847847                for (int i = 0; i < fileNames.size(); ++i) {
    848848                        if (ui->knownImports->currentText() == "Seabear CSV") {
    849                                 char *params[40];
    850                                 int pnr = 0;
    851 
    852                                 params[pnr++] = strdup("timeField");
    853                                 params[pnr++] = intdup(r.indexOf(tr("Sample time")));
    854                                 params[pnr++] = strdup("depthField");
    855                                 params[pnr++] = intdup(r.indexOf(tr("Sample depth")));
    856                                 params[pnr++] = strdup("tempField");
    857                                 params[pnr++] = intdup(r.indexOf(tr("Sample temperature")));
    858                                 params[pnr++] = strdup("po2Field");
    859                                 params[pnr++] = intdup(r.indexOf(tr("Sample pO₂")));
    860                                 params[pnr++] = strdup("o2sensor1Field");
    861                                 params[pnr++] = intdup(r.indexOf(tr("Sample sensor1 pO₂")));
    862                                 params[pnr++] = strdup("o2sensor2Field");
    863                                 params[pnr++] = intdup(r.indexOf(tr("Sample sensor2 pO₂")));
    864                                 params[pnr++] = strdup("o2sensor3Field");
    865                                 params[pnr++] = intdup(r.indexOf(tr("Sample sensor3 pO₂")));
    866                                 params[pnr++] = strdup("cnsField");
    867                                 params[pnr++] = intdup(r.indexOf(tr("Sample CNS")));
    868                                 params[pnr++] = strdup("ndlField");
    869                                 params[pnr++] = intdup(r.indexOf(tr("Sample NDL")));
    870                                 params[pnr++] = strdup("ttsField");
    871                                 params[pnr++] = intdup(r.indexOf(tr("Sample TTS")));
    872                                 params[pnr++] = strdup("stopdepthField");
    873                                 params[pnr++] = intdup(r.indexOf(tr("Sample stopdepth")));
    874                                 params[pnr++] = strdup("pressureField");
    875                                 params[pnr++] = intdup(r.indexOf(tr("Sample pressure")));
    876                                 params[pnr++] = strdup("setpointFiend");
    877                                 params[pnr++] = intdup(-1);
    878                                 params[pnr++] = strdup("separatorIndex");
    879                                 params[pnr++] = intdup(ui->CSVSeparator->currentIndex());
    880                                 params[pnr++] = strdup("units");
    881                                 params[pnr++] = intdup(ui->CSVUnits->currentIndex());
    882                                 params[pnr++] = strdup("delta");
    883                                 params[pnr++] = strdup(delta.toUtf8().data());
    884                                 if (hw.length()) {
    885                                         params[pnr++] = strdup("hw");
    886                                         params[pnr++] = strdup(hw.toUtf8().data());
    887                                 }
    888                                 params[pnr++] = NULL;
    889 
    890                                 if (parse_seabear_csv_file(fileNames[i].toUtf8().data(),
    891                                                         params, pnr - 1, "csv") < 0) {
    892                                         return;
    893                                 }
    894                                 // Seabear CSV stores NDL and TTS in Minutes, not seconds
    895                                 struct dive *dive = dive_table.dives[dive_table.nr - 1];
    896                                 for(int s_nr = 0 ; s_nr < dive->dc.samples ; s_nr++) {
    897                                         struct sample *sample = dive->dc.sample + s_nr;
    898                                         sample->ndl.seconds *= 60;
    899                                         sample->tts.seconds *= 60;
    900                                 }
     849
     850                                parse_seabear_log(fileNames[i].toUtf8().data());
     851
    901852                        } else {
    902853                                char *params[49];
Note: See TracChangeset for help on using the changeset viewer.