diff --git a/src/descriptor.c b/src/descriptor.c index 52186f4..b8106a6 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -287,10 +287,12 @@ static const dc_descriptor_t g_descriptors[] = { /* Shearwater Predator */ {"Shearwater", "Predator", DC_FAMILY_SHEARWATER_PREDATOR, 2}, /* Shearwater Petrel */ - {"Shearwater", "Petrel", DC_FAMILY_SHEARWATER_PETREL, 3}, - {"Shearwater", "Petrel 2", DC_FAMILY_SHEARWATER_PETREL, 3}, - {"Shearwater", "Nerd", DC_FAMILY_SHEARWATER_PETREL, 3}, - {"Shearwater", "Perdix", DC_FAMILY_SHEARWATER_PETREL, 3}, + {"Shearwater", "Petrel", DC_FAMILY_SHEARWATER_PETREL, 3}, + {"Shearwater", "Petrel 2", DC_FAMILY_SHEARWATER_PETREL, 3}, + {"Shearwater", "Nerd", DC_FAMILY_SHEARWATER_PETREL, 4}, + {"Shearwater", "Nerd 2", DC_FAMILY_SHEARWATER_PETREL, 4}, + {"Shearwater", "Perdix", DC_FAMILY_SHEARWATER_PETREL, 5}, + {"Shearwater", "Perdix AI", DC_FAMILY_SHEARWATER_PETREL, 6}, /* Dive Rite NiTek Q */ {"Dive Rite", "NiTek Q", DC_FAMILY_DIVERITE_NITEKQ, 0}, /* Citizen Hyper Aqualand */ diff --git a/src/shearwater_common.h b/src/shearwater_common.h index b93f973..2283154 100644 --- a/src/shearwater_common.h +++ b/src/shearwater_common.h @@ -31,6 +31,13 @@ extern "C" { #define ID_SERIAL 0x8010 #define ID_FIRMWARE 0x8011 +#define ID_HARDWARE 0x8050 + +#define PREDATOR 2 +#define PETREL 3 +#define NERD 4 +#define PERDIX 5 +#define PERDIXAI 6 typedef struct shearwater_common_device_t { dc_device_t base; diff --git a/src/shearwater_petrel.c b/src/shearwater_petrel.c index 71f507e..3b60bf4 100644 --- a/src/shearwater_petrel.c +++ b/src/shearwater_petrel.c @@ -200,9 +200,41 @@ shearwater_petrel_device_foreach (dc_device_t *abstract, dc_dive_callback_t call // Convert to a number. unsigned int firmware = str2num (dc_buffer_get_data (buffer), dc_buffer_get_size (buffer), 1); + // Read the hardware type. + rc = shearwater_common_identifier (&device->base, buffer, ID_HARDWARE); + if (rc != DC_STATUS_SUCCESS) { + ERROR (abstract->context, "Failed to read the hardware type."); + dc_buffer_free (buffer); + dc_buffer_free (manifests); + return rc; + } + + // Convert and map to the model number. + unsigned int hardware = array_uint_be (dc_buffer_get_data (buffer), dc_buffer_get_size (buffer)); + unsigned int model = 0; + switch (hardware) { + case 0x0808: // Petrel 2 + case 0x0909: // Petrel 1 + case 0x0B0B: // Petrel 1 (newer hardware) + model = PETREL; + break; + case 0x0A0A: // Nerd 1 + case 0x0E0D: // Nerd 2 + model = NERD; + break; + case 0x0707: + model = PERDIX; + break; + case 0x0C0D: + model = PERDIXAI; + break; + default: + WARNING (abstract->context, "Unknown hardware type %04x.", hardware); + } + // Emit a device info event. dc_event_devinfo_t devinfo; - devinfo.model = 3; + devinfo.model = model; devinfo.firmware = firmware; devinfo.serial = array_uint32_be (serial); device_event_emit (abstract, DC_EVENT_DEVINFO, &devinfo); diff --git a/src/shearwater_predator.c b/src/shearwater_predator.c index 42a579b..3cc79f1 100644 --- a/src/shearwater_predator.c +++ b/src/shearwater_predator.c @@ -30,9 +30,6 @@ #define ISINSTANCE(device) dc_device_isinstance((device), &shearwater_predator_device_vtable) -#define PREDATOR 2 -#define PETREL 3 - #define SZ_BLOCK 0x80 #define SZ_MEMORY 0x20080