From d0857c49ec80c8e7074e6a44cfdf1b14f96c52b2 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Fri, 30 Dec 2022 16:09:21 +0100 Subject: [PATCH] Add the model number to the version table With the model number in the version table, the version string can be mapped to the corresponding model number. This allows to implement some model specific behaviour already before being able to read the model number. In most cases, there is a simple one to one relationship between the version string and the model number, but there are also a few exceptions: * For the Sherwood Wisdom 2 and 3, and the Beuchat Mundial 2 and 3, each variant has a different model number, but the first part of the version string is identical. The difference is in the firmware version part. Handling this correctly requires two entries in the table. * For the Oceanic OC1 there are 3 different model numbers, and only 2 different version strings. That means there is no correct mapping possible. --- src/oceanic_atom2.c | 158 ++++++++++++++++++++++--------------------- src/oceanic_common.c | 5 +- src/oceanic_common.h | 4 +- src/oceanic_veo250.c | 24 ++++--- src/oceanic_vtpro.c | 23 ++++--- 5 files changed, 116 insertions(+), 98 deletions(-) diff --git a/src/oceanic_atom2.c b/src/oceanic_atom2.c index 9f5cc17..de52e96 100644 --- a/src/oceanic_atom2.c +++ b/src/oceanic_atom2.c @@ -402,101 +402,103 @@ static const oceanic_common_layout_t aqualung_i450t_layout = { }; static const oceanic_common_version_t versions[] = { - {"OCEVEO10 \0\0 8K", 0, &oceanic_veo1_layout}, - {"AERIS XR1 NX R\0\0", 0, &oceanic_veo1_layout}, + {"OCEVEO10 \0\0 8K", 0, VEO10, &oceanic_veo1_layout}, + {"AERIS XR1 NX R\0\0", 0, XR1NX, &oceanic_veo1_layout}, - {"ATOM rev\0\0 256K", 0, &oceanic_atom1_layout}, + {"ATOM rev\0\0 256K", 0, ATOM1, &oceanic_atom1_layout}, - {"MANTA R\0\0 512K", 0x3242, &oceanic_atom2a_layout}, - {"MANTA R\0\0 512K", 0, &oceanic_atom2c_layout}, - {"2M ATOM r\0\0 512K", 0x3349, &oceanic_atom2a_layout}, - {"2M ATOM r\0\0 512K", 0, &oceanic_atom2c_layout}, + {"MANTA R\0\0 512K", 0x3242, MANTA, &oceanic_atom2a_layout}, + {"MANTA R\0\0 512K", 0, MANTA, &oceanic_atom2c_layout}, + {"2M ATOM r\0\0 512K", 0x3349, ATOM2, &oceanic_atom2a_layout}, + {"2M ATOM r\0\0 512K", 0, ATOM2, &oceanic_atom2c_layout}, - {"INSIGHT2 \0\0 512K", 0, &oceanic_atom2a_layout}, - {"OCEVEO30 \0\0 512K", 0, &oceanic_atom2a_layout}, - {"ATMOSAI R\0\0 512K", 0, &oceanic_atom2a_layout}, - {"PROPLUS2 \0\0 512K", 0, &oceanic_atom2a_layout}, - {"OCEGEO20 \0\0 512K", 0, &oceanic_atom2a_layout}, - {"OCE GEO R\0\0 512K", 0, &oceanic_atom2a_layout}, - {"AQUAI200 \0\0 512K", 0, &oceanic_atom2a_layout}, - {"AQUA200C \0\0 512K", 0, &oceanic_atom2a_layout}, + {"INSIGHT2 \0\0 512K", 0, INSIGHT2, &oceanic_atom2a_layout}, + {"OCEVEO30 \0\0 512K", 0, VEO30, &oceanic_atom2a_layout}, + {"ATMOSAI R\0\0 512K", 0, ATMOSAI2, &oceanic_atom2a_layout}, + {"PROPLUS2 \0\0 512K", 0, PROPLUS21, &oceanic_atom2a_layout}, + {"OCEGEO20 \0\0 512K", 0, GEO20, &oceanic_atom2a_layout}, + {"OCE GEO R\0\0 512K", 0, GEO, &oceanic_atom2a_layout}, + {"AQUAI200 \0\0 512K", 0, I200, &oceanic_atom2a_layout}, + {"AQUA200C \0\0 512K", 0, I200C, &oceanic_atom2a_layout}, - {"ELEMENT2 \0\0 512K", 0, &oceanic_atom2b_layout}, - {"OCEVEO20 \0\0 512K", 0, &oceanic_atom2b_layout}, - {"TUSAZEN \0\0 512K", 0, &oceanic_atom2b_layout}, - {"AQUAI300 \0\0 512K", 0, &oceanic_atom2b_layout}, - {"HOLLDG03 \0\0 512K", 0, &oceanic_atom2b_layout}, - {"AQUAI100 \0\0 512K", 0, &oceanic_atom2b_layout}, - {"AQUA300C \0\0 512K", 0, &oceanic_atom2b_layout}, - {"OCEGEO40 \0\0 512K", 0, &oceanic_atom2b_layout}, - {"VEOSMART \0\0 512K", 0, &oceanic_atom2b_layout}, + {"ELEMENT2 \0\0 512K", 0, ELEMENT2, &oceanic_atom2b_layout}, + {"OCEVEO20 \0\0 512K", 0, VEO20, &oceanic_atom2b_layout}, + {"TUSAZEN \0\0 512K", 0, ZEN, &oceanic_atom2b_layout}, + {"AQUAI300 \0\0 512K", 0, I300, &oceanic_atom2b_layout}, + {"HOLLDG03 \0\0 512K", 0, DG03, &oceanic_atom2b_layout}, + {"AQUAI100 \0\0 512K", 0, I100, &oceanic_atom2b_layout}, + {"AQUA300C \0\0 512K", 0, I300C, &oceanic_atom2b_layout}, + {"OCEGEO40 \0\0 512K", 0, GEO40, &oceanic_atom2b_layout}, + {"VEOSMART \0\0 512K", 0, VEO40, &oceanic_atom2b_layout}, - {"2M EPIC r\0\0 512K", 0, &oceanic_atom2c_layout}, - {"EPIC1 R\0\0 512K", 0, &oceanic_atom2c_layout}, - {"AERIA300 \0\0 512K", 0, &oceanic_atom2c_layout}, + {"2M EPIC r\0\0 512K", 0, EPICA, &oceanic_atom2c_layout}, + {"EPIC1 R\0\0 512K", 0, EPICB, &oceanic_atom2c_layout}, + {"AERIA300 \0\0 512K", 0, A300, &oceanic_atom2c_layout}, - {"OCE VT3 R\0\0 512K", 0, &oceanic_default_layout}, - {"ELITET3 R\0\0 512K", 0, &oceanic_default_layout}, - {"ELITET31 \0\0 512K", 0, &oceanic_default_layout}, - {"DATAMASK \0\0 512K", 0, &oceanic_default_layout}, - {"COMPMASK \0\0 512K", 0, &oceanic_default_layout}, + {"OCE VT3 R\0\0 512K", 0, VT3, &oceanic_default_layout}, + {"ELITET3 R\0\0 512K", 0, T3A, &oceanic_default_layout}, + {"ELITET31 \0\0 512K", 0, T3B, &oceanic_default_layout}, + {"DATAMASK \0\0 512K", 0, DATAMASK, &oceanic_default_layout}, + {"COMPMASK \0\0 512K", 0, COMPUMASK, &oceanic_default_layout}, - {"WISDOM R\0\0 512K", 0, &sherwood_wisdom_layout}, + {"WISDOM R\0\0 512K", 0x3342, WISDOM3, &sherwood_wisdom_layout}, + {"WISDOM R\0\0 512K", 0, WISDOM2, &sherwood_wisdom_layout}, - {"PROPLUS3 \0\0 512K", 0, &oceanic_proplus3_layout}, - {"PROPLUS4 \0\0 512K", 0, &oceanic_proplus3_layout}, + {"PROPLUS3 \0\0 512K", 0, PROPLUS3, &oceanic_proplus3_layout}, + {"PROPLUS4 \0\0 512K", 0, PROPLUS4, &oceanic_proplus3_layout}, - {"TUZENAIR \0\0 512K", 0, &tusa_zenair_layout}, - {"AMPHOSSW \0\0 512K", 0, &tusa_zenair_layout}, - {"AMPHOAIR \0\0 512K", 0, &tusa_zenair_layout}, - {"VOYAGE2G \0\0 512K", 0, &tusa_zenair_layout}, - {"TUSTALIS \0\0 512K", 0, &tusa_zenair_layout}, - {"AMPHOS20 \0\0 512K", 0, &tusa_zenair_layout}, - {"AMPAIR20 \0\0 512K", 0, &tusa_zenair_layout}, + {"TUZENAIR \0\0 512K", 0, ZENAIR, &tusa_zenair_layout}, + {"AMPHOSSW \0\0 512K", 0, AMPHOS, &tusa_zenair_layout}, + {"AMPHOAIR \0\0 512K", 0, AMPHOSAIR, &tusa_zenair_layout}, + {"VOYAGE2G \0\0 512K", 0, VOYAGER2G, &tusa_zenair_layout}, + {"TUSTALIS \0\0 512K", 0, TALIS, &tusa_zenair_layout}, + {"AMPHOS20 \0\0 512K", 0, AMPHOS2, &tusa_zenair_layout}, + {"AMPAIR20 \0\0 512K", 0, AMPHOSAIR2, &tusa_zenair_layout}, - {"REACPRO2 \0\0 512K", 0, &oceanic_reactpro_layout}, + {"REACPRO2 \0\0 512K", 0, REACTPROWHITE, &oceanic_reactpro_layout}, - {"FREEWAER \0\0 512K", 0, &aeris_f10_layout}, - {"OCEANF10 \0\0 512K", 0, &aeris_f10_layout}, - {"MUNDIAL R\0\0 512K", 0, &aeris_f10_layout}, + {"FREEWAER \0\0 512K", 0, F10A, &aeris_f10_layout}, + {"OCEANF10 \0\0 512K", 0, F10B, &aeris_f10_layout}, + {"MUNDIAL R\0\0 512K", 0x3300, MUNDIAL3, &aeris_f10_layout}, + {"MUNDIAL R\0\0 512K", 0, MUNDIAL2, &aeris_f10_layout}, - {"AERISF11 \0\0 1024", 0, &aeris_f11_layout}, - {"OCEANF11 \0\0 1024", 0, &aeris_f11_layout}, + {"AERISF11 \0\0 1024", 0, F11A, &aeris_f11_layout}, + {"OCEANF11 \0\0 1024", 0, F11B, &aeris_f11_layout}, - {"OCWATCH R\0\0 1024", 0, &oceanic_oc1_layout}, - {"OC1WATCH \0\0 1024", 0, &oceanic_oc1_layout}, - {"OCSWATCH \0\0 1024", 0, &oceanic_oc1_layout}, - {"AQUAI550 \0\0 1024", 0, &oceanic_oc1_layout}, - {"AQUA550C \0\0 1024", 0, &oceanic_oc1_layout}, - {"WISDOM04 \0\0 1024", 0, &oceanic_oc1_layout}, - {"AQUA470C \0\0 1024", 0, &oceanic_oc1_layout}, - {"AQUA200C \0\0 1024", 0, &oceanic_oc1_layout}, - {"GEOAIR \0\0 1024", 0, &oceanic_oc1_layout}, + {"OCWATCH R\0\0 1024", 0, OC1A, &oceanic_oc1_layout}, + {"OC1WATCH \0\0 1024", 0, OC1B, &oceanic_oc1_layout}, + {"OCSWATCH \0\0 1024", 0, OCS, &oceanic_oc1_layout}, + {"AQUAI550 \0\0 1024", 0, I550, &oceanic_oc1_layout}, + {"AQUA550C \0\0 1024", 0, I550C, &oceanic_oc1_layout}, + {"WISDOM04 \0\0 1024", 0, WISDOM4, &oceanic_oc1_layout}, + {"AQUA470C \0\0 1024", 0, I470TC, &oceanic_oc1_layout}, + {"AQUA200C \0\0 1024", 0, I200CV2, &oceanic_oc1_layout}, + {"GEOAIR \0\0 1024", 0, GEOAIR, &oceanic_oc1_layout}, - {"OCEANOCI \0\0 1024", 0, &oceanic_oci_layout}, + {"OCEANOCI \0\0 1024", 0, OCI, &oceanic_oci_layout}, - {"OCEATOM3 \0\0 1024", 0, &oceanic_atom3_layout}, - {"ATOM31 \0\0 1024", 0, &oceanic_atom3_layout}, + {"OCEATOM3 \0\0 1024", 0, ATOM3, &oceanic_atom3_layout}, + {"ATOM31 \0\0 1024", 0, ATOM31, &oceanic_atom3_layout}, - {"OCEANVT4 \0\0 1024", 0, &oceanic_vt4_layout}, - {"OCEAVT41 \0\0 1024", 0, &oceanic_vt4_layout}, - {"AERISAIR \0\0 1024", 0, &oceanic_vt4_layout}, - {"SWVISION \0\0 1024", 0, &oceanic_vt4_layout}, - {"XPSUBAIR \0\0 1024", 0, &oceanic_vt4_layout}, + {"OCEANVT4 \0\0 1024", 0, VT4, &oceanic_vt4_layout}, + {"OCEAVT41 \0\0 1024", 0, VT41, &oceanic_vt4_layout}, + {"AERISAIR \0\0 1024", 0, A300AI, &oceanic_vt4_layout}, + {"SWVISION \0\0 1024", 0, VISION, &oceanic_vt4_layout}, + {"XPSUBAIR \0\0 1024", 0, XPAIR, &oceanic_vt4_layout}, - {"HOLLDG04 \0\0 2048", 0, &hollis_tx1_layout}, + {"HOLLDG04 \0\0 2048", 0, TX1, &hollis_tx1_layout}, - {"AER300CS \0\0 2048", 0, &aeris_a300cs_layout}, - {"OCEANVTX \0\0 2048", 0, &aeris_a300cs_layout}, - {"AQUAI750 \0\0 2048", 0, &aeris_a300cs_layout}, - {"SWDRAGON \0\0 2048", 0, &aeris_a300cs_layout}, - {"SWBEACON \0\0 2048", 0, &aeris_a300cs_layout}, + {"AER300CS \0\0 2048", 0, A300CS, &aeris_a300cs_layout}, + {"OCEANVTX \0\0 2048", 0, VTX, &aeris_a300cs_layout}, + {"AQUAI750 \0\0 2048", 0, I750TC, &aeris_a300cs_layout}, + {"SWDRAGON \0\0 2048", 0, SAGE, &aeris_a300cs_layout}, + {"SWBEACON \0\0 2048", 0, BEACON, &aeris_a300cs_layout}, - {"AQUAI450 \0\0 2048", 0, &aqualung_i450t_layout}, + {"AQUAI450 \0\0 2048", 0, I450T, &aqualung_i450t_layout}, - {"OCEANOCX \0\0 \0\0\0\0", 0, &oceanic_proplusx_layout}, + {"OCEANOCX \0\0 \0\0\0\0", 0, PROPLUSX, &oceanic_proplusx_layout}, - {"AQUA770R \0\0 \0\0\0\0", 0, &aqualung_i770r_layout}, + {"AQUA770R \0\0 \0\0\0\0", 0, I770R, &aqualung_i770r_layout}, }; /* @@ -925,8 +927,8 @@ oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, dc_iostream } // Detect the memory layout. - device->base.layout = OCEANIC_COMMON_MATCH(device->base.version, versions, &device->base.firmware); - if (device->base.layout == NULL) { + const oceanic_common_version_t *version = OCEANIC_COMMON_MATCH(device->base.version, versions, &device->base.firmware); + if (version == NULL) { WARNING (context, "Unsupported device detected!"); if (memcmp(device->base.version + 12, "256K", 4) == 0) { device->base.layout = &oceanic_atom1_layout; @@ -939,6 +941,10 @@ oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, dc_iostream } else { device->base.layout = &oceanic_default_layout; } + device->base.model = 0; + } else { + device->base.layout = version->layout; + device->base.model = version->model; } // Set the big page support. diff --git a/src/oceanic_common.c b/src/oceanic_common.c index f876d28..62f5f74 100644 --- a/src/oceanic_common.c +++ b/src/oceanic_common.c @@ -132,7 +132,7 @@ oceanic_common_match_pattern (const unsigned char *string, const unsigned char * return 1; } -const oceanic_common_layout_t * +const oceanic_common_version_t * oceanic_common_match (const unsigned char *version, const oceanic_common_version_t patterns[], size_t n, unsigned int *firmware) { for (size_t i = 0; i < n; ++i) { @@ -143,7 +143,7 @@ oceanic_common_match (const unsigned char *version, const oceanic_common_version if (firmware) { *firmware = fw; } - return patterns[i].layout; + return patterns + i; } } @@ -160,6 +160,7 @@ oceanic_common_device_init (oceanic_common_device_t *device) device->firmware = 0; memset (device->version, 0, sizeof (device->version)); memset (device->fingerprint, 0, sizeof (device->fingerprint)); + device->model = 0; device->layout = NULL; device->multipage = 1; } diff --git a/src/oceanic_common.h b/src/oceanic_common.h index 16fd976..045dca4 100644 --- a/src/oceanic_common.h +++ b/src/oceanic_common.h @@ -161,6 +161,7 @@ typedef struct oceanic_common_device_t { unsigned int firmware; unsigned char version[PAGESIZE]; unsigned char fingerprint[FPMAXSIZE]; + unsigned int model; const oceanic_common_layout_t *layout; unsigned int multipage; } oceanic_common_device_t; @@ -174,10 +175,11 @@ typedef struct oceanic_common_device_vtable_t { typedef struct oceanic_common_version_t { unsigned char pattern[PAGESIZE + 1]; unsigned int firmware; + unsigned int model; const oceanic_common_layout_t *layout; } oceanic_common_version_t; -const oceanic_common_layout_t * +const oceanic_common_version_t * oceanic_common_match (const unsigned char *version, const oceanic_common_version_t patterns[], size_t n, unsigned int *firmware); void diff --git a/src/oceanic_veo250.c b/src/oceanic_veo250.c index db323db..58a9ceb 100644 --- a/src/oceanic_veo250.c +++ b/src/oceanic_veo250.c @@ -78,14 +78,14 @@ static const oceanic_common_layout_t oceanic_veo250_layout = { }; static const oceanic_common_version_t versions[] = { - {"GENREACT \0\0 256K", 0, &oceanic_veo250_layout}, - {"VEO 200 R\0\0 256K", 0, &oceanic_veo250_layout}, - {"VEO 250 R\0\0 256K", 0, &oceanic_veo250_layout}, - {"SEEMANN R\0\0 256K", 0, &oceanic_veo250_layout}, - {"VEO 180 R\0\0 256K", 0, &oceanic_veo250_layout}, - {"AERISXR2 \0\0 256K", 0, &oceanic_veo250_layout}, - {"INSIGHT R\0\0 256K", 0, &oceanic_veo250_layout}, - {"HO DGO2 R\0\0 256K", 0, &oceanic_veo250_layout}, + {"GENREACT \0\0 256K", 0, REACTPRO, &oceanic_veo250_layout}, + {"VEO 200 R\0\0 256K", 0, VEO200, &oceanic_veo250_layout}, + {"VEO 250 R\0\0 256K", 0, VEO250, &oceanic_veo250_layout}, + {"SEEMANN R\0\0 256K", 0, XP5, &oceanic_veo250_layout}, + {"VEO 180 R\0\0 256K", 0, VEO180, &oceanic_veo250_layout}, + {"AERISXR2 \0\0 256K", 0, XR2, &oceanic_veo250_layout}, + {"INSIGHT R\0\0 256K", 0, INSIGHT, &oceanic_veo250_layout}, + {"HO DGO2 R\0\0 256K", 0, DG02, &oceanic_veo250_layout}, }; static dc_status_t @@ -316,10 +316,14 @@ oceanic_veo250_device_open (dc_device_t **out, dc_context_t *context, dc_iostrea } // Detect the memory layout. - device->base.layout = OCEANIC_COMMON_MATCH(device->base.version, versions, &device->base.firmware); - if (device->base.layout == NULL) { + const oceanic_common_version_t *version = OCEANIC_COMMON_MATCH(device->base.version, versions, &device->base.firmware); + if (version == NULL) { WARNING (context, "Unsupported device detected!"); device->base.layout = &oceanic_veo250_layout; + device->base.model = 0; + } else { + device->base.layout = version->layout; + device->base.model = version->model; } *out = (dc_device_t*) device; diff --git a/src/oceanic_vtpro.c b/src/oceanic_vtpro.c index 4cb85f1..5e11115 100644 --- a/src/oceanic_vtpro.c +++ b/src/oceanic_vtpro.c @@ -118,14 +118,14 @@ static const oceanic_common_layout_t aeris_500ai_layout = { }; static const oceanic_common_version_t versions[] = { - {"VERSAPRO \0\0 256K", 0, &oceanic_vtpro_layout}, - {"ATMOSTWO \0\0 256K", 0, &oceanic_vtpro_layout}, - {"PROPLUS2 \0\0 256K", 0, &oceanic_vtpro_layout}, - {"ATMOSAIR \0\0 256K", 0, &oceanic_vtpro_layout}, - {"VTPRO r\0\0 256K", 0, &oceanic_vtpro_layout}, - {"ELITE r\0\0 256K", 0, &oceanic_vtpro_layout}, + {"VERSAPRO \0\0 256K", 0, VERSAPRO, &oceanic_vtpro_layout}, + {"ATMOSTWO \0\0 256K", 0, ATMOS2, &oceanic_vtpro_layout}, + {"PROPLUS2 \0\0 256K", 0, PROPLUS2, &oceanic_vtpro_layout}, + {"ATMOSAIR \0\0 256K", 0, ATMOSAI, &oceanic_vtpro_layout}, + {"VTPRO r\0\0 256K", 0, VTPRO, &oceanic_vtpro_layout}, + {"ELITE r\0\0 256K", 0, ELITE, &oceanic_vtpro_layout}, - {"WISDOM r\0\0 256K", 0, &oceanic_wisdom_layout}, + {"WISDOM r\0\0 256K", 0, WISDOM, &oceanic_wisdom_layout}, }; static dc_status_t @@ -490,11 +490,16 @@ oceanic_vtpro_device_open (dc_device_t **out, dc_context_t *context, dc_iostream // Detect the memory layout. if (model == AERIS500AI) { device->base.layout = &aeris_500ai_layout; + device->base.model = AERIS500AI; } else { - device->base.layout = OCEANIC_COMMON_MATCH(device->base.version, versions, &device->base.firmware); - if (device->base.layout == NULL) { + const oceanic_common_version_t * version = OCEANIC_COMMON_MATCH(device->base.version, versions, &device->base.firmware); + if (version == NULL) { WARNING (context, "Unsupported device detected!"); device->base.layout = &oceanic_vtpro_layout; + device->base.model = 0; + } else { + device->base.layout = version->layout; + device->base.model = version->model; } }