diff --git a/examples/universal.c b/examples/universal.c index 9818e43..397ae41 100644 --- a/examples/universal.c +++ b/examples/universal.c @@ -455,6 +455,7 @@ event_cb (dc_device_t *device, dc_event_type_t event, const void *data, void *us const dc_event_progress_t *progress = (dc_event_progress_t *) data; const dc_event_devinfo_t *devinfo = (dc_event_devinfo_t *) data; const dc_event_clock_t *clock = (dc_event_clock_t *) data; + const dc_event_vendor_t *vendor = (dc_event_vendor_t *) data; device_data_t *devdata = (device_data_t *) userdata; @@ -486,6 +487,12 @@ event_cb (dc_device_t *device, dc_event_type_t event, const void *data, void *us message ("Event: systime=" DC_TICKS_FORMAT ", devtime=%u\n", clock->systime, clock->devtime); break; + case DC_EVENT_VENDOR: + message ("Event: vendor="); + for (unsigned int i = 0; i < vendor->size; ++i) + message ("%02X", vendor->data[i]); + message ("\n"); + break; default: break; } @@ -654,7 +661,7 @@ dowork (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, // Register the event handler. message ("Registering the event handler.\n"); - int events = DC_EVENT_WAITING | DC_EVENT_PROGRESS | DC_EVENT_DEVINFO | DC_EVENT_CLOCK; + int events = DC_EVENT_WAITING | DC_EVENT_PROGRESS | DC_EVENT_DEVINFO | DC_EVENT_CLOCK | DC_EVENT_VENDOR; rc = dc_device_set_events (device, events, event_cb, &devdata); if (rc != DC_STATUS_SUCCESS) { WARNING ("Error registering the event handler."); diff --git a/include/libdivecomputer/device.h b/include/libdivecomputer/device.h index 60fd203..5dc57b3 100644 --- a/include/libdivecomputer/device.h +++ b/include/libdivecomputer/device.h @@ -36,7 +36,8 @@ typedef enum dc_event_type_t { DC_EVENT_WAITING = (1 << 0), DC_EVENT_PROGRESS = (1 << 1), DC_EVENT_DEVINFO = (1 << 2), - DC_EVENT_CLOCK = (1 << 3) + DC_EVENT_CLOCK = (1 << 3), + DC_EVENT_VENDOR = (1 << 4) } dc_event_type_t; typedef struct dc_device_t dc_device_t; @@ -57,6 +58,11 @@ typedef struct dc_event_clock_t { dc_ticks_t systime; } dc_event_clock_t; +typedef struct dc_event_vendor_t { + const unsigned char *data; + unsigned int size; +} dc_event_vendor_t; + typedef int (*dc_cancel_callback_t) (void *userdata); typedef void (*dc_event_callback_t) (dc_device_t *device, dc_event_type_t event, const void *data, void *userdata); diff --git a/src/atomics_cobalt.c b/src/atomics_cobalt.c index c4f4c08..0515983 100644 --- a/src/atomics_cobalt.c +++ b/src/atomics_cobalt.c @@ -358,6 +358,12 @@ atomics_cobalt_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac progress.maximum = SZ_MEMORY + 2; device_event_emit (abstract, DC_EVENT_PROGRESS, &progress); + // Emit a vendor event. + dc_event_vendor_t vendor; + vendor.data = device->version; + vendor.size = sizeof (device->version); + device_event_emit (abstract, DC_EVENT_VENDOR, &vendor); + // Emit a device info event. dc_event_devinfo_t devinfo; devinfo.model = array_uint16_le (device->version + 12); diff --git a/src/mares_iconhd.c b/src/mares_iconhd.c index b03f7c6..980efba 100644 --- a/src/mares_iconhd.c +++ b/src/mares_iconhd.c @@ -368,6 +368,12 @@ mares_iconhd_device_dump (dc_device_t *abstract, dc_buffer_t *buffer) progress.maximum = SZ_MEMORY; device_event_emit (abstract, DC_EVENT_PROGRESS, &progress); + // Emit a vendor event. + dc_event_vendor_t vendor; + vendor.data = device->version; + vendor.size = sizeof (device->version); + device_event_emit (abstract, DC_EVENT_VENDOR, &vendor); + return mares_iconhd_read (device, 0, dc_buffer_get_data (buffer), dc_buffer_get_size (buffer), &progress); } diff --git a/src/oceanic_common.c b/src/oceanic_common.c index dcaa11d..d91f542 100644 --- a/src/oceanic_common.c +++ b/src/oceanic_common.c @@ -170,6 +170,12 @@ oceanic_common_device_dump (dc_device_t *abstract, dc_buffer_t *buffer) return DC_STATUS_NOMEMORY; } + // Emit a vendor event. + dc_event_vendor_t vendor; + vendor.data = device->version; + vendor.size = sizeof (device->version); + device_event_emit (abstract, DC_EVENT_VENDOR, &vendor); + return device_dump_read (abstract, dc_buffer_get_data (buffer), dc_buffer_get_size (buffer), PAGESIZE * device->multipage); } @@ -193,6 +199,12 @@ oceanic_common_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac (layout->rb_logbook_end - layout->rb_logbook_begin); device_event_emit (abstract, DC_EVENT_PROGRESS, &progress); + // Emit a vendor event. + dc_event_vendor_t vendor; + vendor.data = device->version; + vendor.size = sizeof (device->version); + device_event_emit (abstract, DC_EVENT_VENDOR, &vendor); + // Read the device id. unsigned char id[PAGESIZE] = {0}; dc_status_t rc = dc_device_read (abstract, layout->cf_devinfo, id, sizeof (id)); diff --git a/src/reefnet_sensus.c b/src/reefnet_sensus.c index 9a7a2a3..a4197f5 100644 --- a/src/reefnet_sensus.c +++ b/src/reefnet_sensus.c @@ -266,6 +266,12 @@ reefnet_sensus_handshake (reefnet_sensus_device_t *device) devinfo.serial = array_uint16_le (handshake + 6); device_event_emit (&device->base, DC_EVENT_DEVINFO, &devinfo); + // Emit a vendor event. + dc_event_vendor_t vendor; + vendor.data = device->handshake; + vendor.size = sizeof (device->handshake); + device_event_emit (abstract, DC_EVENT_VENDOR, &vendor); + // Wait at least 10 ms to ensures the data line is // clear before transmission from the host begins. diff --git a/src/reefnet_sensuspro.c b/src/reefnet_sensuspro.c index be49850..b82557f 100644 --- a/src/reefnet_sensuspro.c +++ b/src/reefnet_sensuspro.c @@ -236,6 +236,12 @@ reefnet_sensuspro_handshake (reefnet_sensuspro_device_t *device) devinfo.serial = array_uint16_le (handshake + 4); device_event_emit (&device->base, DC_EVENT_DEVINFO, &devinfo); + // Emit a vendor event. + dc_event_vendor_t vendor; + vendor.data = device->handshake; + vendor.size = sizeof (device->handshake); + device_event_emit (abstract, DC_EVENT_VENDOR, &vendor); + serial_sleep (device->port, 10); return DC_STATUS_SUCCESS; diff --git a/src/reefnet_sensusultra.c b/src/reefnet_sensusultra.c index 97a1603..9944f64 100644 --- a/src/reefnet_sensusultra.c +++ b/src/reefnet_sensusultra.c @@ -305,6 +305,12 @@ reefnet_sensusultra_handshake (reefnet_sensusultra_device_t *device, unsigned sh devinfo.serial = array_uint16_le (handshake + 2); device_event_emit (&device->base, DC_EVENT_DEVINFO, &devinfo); + // Emit a vendor event. + dc_event_vendor_t vendor; + vendor.data = device->handshake; + vendor.size = sizeof (device->handshake); + device_event_emit (&device->base, DC_EVENT_VENDOR, &vendor); + // Send the instruction code to the device. rc = reefnet_sensusultra_send_ushort (device, value); if (rc != DC_STATUS_SUCCESS) diff --git a/src/suunto_common2.c b/src/suunto_common2.c index 7f519b2..28b3858 100644 --- a/src/suunto_common2.c +++ b/src/suunto_common2.c @@ -216,6 +216,12 @@ suunto_common2_device_dump (dc_device_t *abstract, dc_buffer_t *buffer) return DC_STATUS_NOMEMORY; } + // Emit a vendor event. + dc_event_vendor_t vendor; + vendor.data = device->version; + vendor.size = sizeof (device->version); + device_event_emit (abstract, DC_EVENT_VENDOR, &vendor); + return device_dump_read (abstract, dc_buffer_get_data (buffer), dc_buffer_get_size (buffer), SZ_PACKET); } @@ -240,6 +246,12 @@ suunto_common2_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac 8 + (SZ_MINIMUM > 4 ? SZ_MINIMUM : 4); device_event_emit (abstract, DC_EVENT_PROGRESS, &progress); + // Emit a vendor event. + dc_event_vendor_t vendor; + vendor.data = device->version; + vendor.size = sizeof (device->version); + device_event_emit (abstract, DC_EVENT_VENDOR, &vendor); + // Read the serial number. unsigned char serial[SZ_MINIMUM > 4 ? SZ_MINIMUM : 4] = {0}; dc_status_t rc = suunto_common2_device_read (abstract, layout->serial, serial, sizeof (serial));