H&W introduced some changes in dc's data structures with FROG and OSTC3
families (types 0x22 and 0x23 in H&W's terms) that I didn't take into
account as we lacked of .dive files to test.

BTW I previously set the model to "0" as it was not stored in the file
but wasn't relevant for the data parsing in MK2, OSTC and OSTC2N/2C
models.

Thanks to Anton's advice we have got some OSTC3 dives to test, so this
patch takes into account the different data structures for different
families, and try to stablish a model number based on device's serial
number, as libdc does.

Signed-off-by: Salvador Cuñat <salvador.cu...@gmail.com>
---
 ostctools.c | 50 +++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 37 insertions(+), 13 deletions(-)

diff --git a/ostctools.c b/ostctools.c
index 0bb00ee..fa7cb65 100644
--- a/ostctools.c
+++ b/ostctools.c
@@ -108,20 +108,44 @@ void ostctools_import(const char *file, struct dive_table 
*divetable)
        }
 
        // Try to determine the dc family based on the header type
-       switch (buffer[2]) {
-       case 0x20:
-       case 0x21:
+       if (buffer[2] == 0x20 || buffer[2] == 0x21)
                dc_fam = DC_FAMILY_HW_OSTC;
-               break;
-       case 0x22:
-               dc_fam = DC_FAMILY_HW_FROG;
-               break;
-       case 0x23:
-               dc_fam = DC_FAMILY_HW_OSTC3;
-               break;
-       default:
-               fprintf(stderr, "got unknown dc family %x\n", buffer[2]);
-               dc_fam = DC_FAMILY_NULL;
+       else {
+               switch (buffer[8]) {
+                       case 0x22:
+                               dc_fam = DC_FAMILY_HW_FROG;
+                               break;
+                       case 0x23:
+                               dc_fam = DC_FAMILY_HW_OSTC3;
+                               break;
+                       default:
+                               report_error(translate("gettextFromC", "Unknown 
DC in dive %d"), ostcdive->number);
+                               free(ostcdive);
+                               fclose(archive);
+                               goto out;
+               }
+       }
+
+       // Try to determine the model based on serial number
+       switch (dc_fam) {
+               case DC_FAMILY_HW_OSTC:
+                       if (serial > 7000)
+                               model = 3; //2C
+                       else if (serial > 2048)
+                               model = 2; //2N
+                       else if (serial > 300)
+                               model = 1; //MK2
+                       else
+                               model = 0; //OSTC
+                       break;
+               case DC_FAMILY_HW_FROG:
+                       model = 0;
+                       break;
+               default:
+                       if (serial > 10000)
+                               model = 0x12; //Sport
+                       else
+                               model = 0x0A; //OSTC3
        }
 
        // Prepare data to pass to libdivecomputer.
-- 
2.1.4

_______________________________________________
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to