Changeset f604089 in subsurface


Ignore:
Timestamp:
May 27, 2017, 7:22:14 AM (4 weeks ago)
Author:
Dirk Hohndel <dirk@…>
Branches:
master
Children:
c293091
Parents:
c6bc88b
git-author:
John Van Ostrand <john@…> (05/26/17 16:58:06)
git-committer:
Dirk Hohndel <dirk@…> (05/27/17 07:22:14)
Message:

Added support for older Cochran models that have configurable sample intervals.

Corrected problem where dive profiles would include post dive
surface interval samples.

Added detection for corrupt dives.

Signed-off-by: John Van Ostrand <john@…>
Signed-off-by: Dirk Hohndel <dirk@…>

Location:
core
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • core/cochran.c

    r6399eaf rf604089  
    259259{
    260260        int x = 0;
    261         int gem_event_bytes[15][2] =  {{0x00, 10}, {0x02, 17}, {0x08, 18},
    262                                        {0x09, 18}, {0x0c, 18}, {0x0d, 18},
    263                                        {0x0e, 18},
    264                                        {-1,  0}};
    265261        int cmdr_event_bytes[15][2] = {{0x00, 16}, {0x01, 20}, {0x02, 17},
    266262                                       {0x03, 16}, {0x06, 18}, {0x07, 18},
    267263                                       {0x08, 18}, {0x09, 18}, {0x0a, 18},
    268                                        {0x0b, 20}, {0x0c, 18}, {0x0d, 18},
     264                                       {0x0b, 18}, {0x0c, 18}, {0x0d, 18},
    269265                                       {0x0e, 18}, {0x10, 20},
    270266                                       {-1,  0}};
     
    277273        switch (config.type) {
    278274        case TYPE_GEMINI:
    279                 while (gem_event_bytes[x][0] != code && gem_event_bytes[x][0] != -1)
    280                         x++;
    281                 return gem_event_bytes[x][1];
    282                 break;
    283275        case TYPE_COMMANDER:
    284276                while (cmdr_event_bytes[x][0] != code && cmdr_event_bytes[x][0] != -1)
     
    480472        // Skip past pre-dive events
    481473        unsigned int x = 0;
    482         if (samples[x] != 0x40) {
    483                 unsigned int c;
    484                 while ((samples[x] & 0x80) == 0 && samples[x] != 0x40 && x < size) {
    485                         c = cochran_predive_event_bytes(samples[x]) + 1;
    486 #ifdef COCHRAN_DEBUG
    487                         printf("Predive event: ", samples[x]);
    488                         for (int y = 0; y < c; y++) printf("%02x ", samples[x + y]);
    489                         putchar('\n');
    490 #endif
     474        unsigned int c;
     475        while (x < size && (samples[x] & 0x80) == 0 && samples[x] != 0x40) {
     476                c = cochran_predive_event_bytes(samples[x]) + 1;
     477//#ifdef COCHRAN_DEBUG
     478                printf("Predive event: ", samples[x]);
     479                for (int y = 0; y < c && x + y < size; y++) printf("%02x ", samples[x + y]);
     480                putchar('\n');
     481//#endif
    491482                        x += c;
    492                 }
    493483        }
    494484
    495485        // Now process samples
    496486        offset = x;
    497         while (offset < size) {
     487        while (offset + config.sample_size < size) {
    498488                s = samples + offset;
    499489
     
    557547                        switch (seconds % 24) {
    558548                        case 20:
    559                                 if (in_deco) {
    560                                         // Fist stop time
    561                                         //first_deco_time = (s[2] + s[5] * 256 + 1) * 60; // seconds
    562                                         ndl = 0;
    563                                 } else {
    564                                         // NDL
    565                                         ndl = (s[2] + s[5] * 256 + 1) * 60; // seconds
    566                                         deco_time = 0;
     549                                if (offset + 5 < size) {
     550                                        if (in_deco) {
     551                                                // Fist stop time
     552                                                //first_deco_time = (s[2] + s[5] * 256 + 1) * 60; // seconds
     553                                                ndl = 0;
     554                                        } else {
     555                                                // NDL
     556                                                ndl = (s[2] + s[5] * 256 + 1) * 60; // seconds
     557                                                deco_time = 0;
     558                                        }
    567559                                }
    568560                                break;
    569561                        case 22:
    570                                 if (in_deco) {
    571                                         // Total stop time
    572                                         deco_time = (s[2] + s[5] * 256 + 1) * 60; // seconds
    573                                         ndl = 0;
     562                                if (offset + 5 < size) {
     563                                        if (in_deco) {
     564                                                // Total stop time
     565                                                deco_time = (s[2] + s[5] * 256 + 1) * 60; // seconds
     566                                                ndl = 0;
     567                                        }
    574568                                }
    575569                                break;
     
    635629         * so this just descrambles part of it:
    636630         */
     631
     632        if (size < 0x4914 + config.logbook_size) {
     633                // Analyst calls this a "Corrupt Beginning Summary"
     634                free(buf);
     635                return;
     636        }
     637
    637638        // Decode log entry (512 bytes + random prefix)
    638639        partial_decode(0x48ff, 0x4914 + config.logbook_size, decode,
  • core/cochran.h

    r7be962b rf604089  
    66#define CMD_MON                         5
    77#define CMD_YEAR                        4
    8 #define CME_START_OFFSET                6               // 4 bytes
     8#define CMD_START_OFFSET                6               // 4 bytes
    99#define CMD_WATER_CONDUCTIVITY          25              // 1 byte, 0=low, 2=high
     10#define CMD_PREDIVE_OFFSET              30
    1011#define CMD_START_SGC                   42              // 2 bytes
    1112#define CMD_START_TEMP                  45              // 1 byte, F
     
    3132#define EMC_START_OFFSET                6               // 4 bytes
    3233#define EMC_WATER_CONDUCTIVITY          24              // 1 byte bits 0:1, 0=low, 2=high
     34#define EMC_PREDIVE_OFFSET              30
    3335#define EMC_START_DEPTH                 42              // 2 byte, /256=ft
    3436#define EMC_START_TEMP                  55              // 1 byte, F
Note: See TracChangeset for help on using the changeset viewer.