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.
This commit is contained in:
Jef Driesen 2022-12-30 16:09:21 +01:00
parent f59cbf0fe5
commit d0857c49ec
5 changed files with 116 additions and 98 deletions

View File

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

View File

@ -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;
}

View File

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

View File

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

View File

@ -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;
}
}