From 9525bc804796f72a45e9b5eadafeab114791d316 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Tue, 12 May 2020 19:10:17 +0200 Subject: [PATCH 1/7] Fix the hwOS ppO2 bug for firmware v3.08 The hwOS ppO2 firmware bug is also present in firmware 3.08. See commit b9a3606f379c3c9f57bbf561bdcb52fb76b711db for more details. --- src/hw_ostc_parser.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hw_ostc_parser.c b/src/hw_ostc_parser.c index 0f96b90..79920b9 100644 --- a/src/hw_ostc_parser.c +++ b/src/hw_ostc_parser.c @@ -880,12 +880,12 @@ hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t call for (unsigned int i = 0; i < nconfig; ++i) { if (info[i].divisor && (nsamples % info[i].divisor) == 0) { if (length < info[i].size) { - // Due to a bug in the hwOS Tech firmware v3.03 to v3.07, and + // Due to a bug in the hwOS Tech firmware v3.03 to v3.08, and // the hwOS Sport firmware v10.57 to v10.63, the ppO2 divisor // is sometimes not correctly reset to zero when no ppO2 // samples are being recorded. if (info[i].type == PPO2 && parser->hwos && parser->model != OSTC4 && - ((firmware >= OSTC3FW(3,3) && firmware <= OSTC3FW(3,7)) || + ((firmware >= OSTC3FW(3,3) && firmware <= OSTC3FW(3,8)) || (firmware >= OSTC3FW(10,57) && firmware <= OSTC3FW(10,63)))) { WARNING (abstract->context, "Reset invalid ppO2 divisor to zero."); info[i].divisor = 0; From cac0eb7d812bb8ad383709a72be493e77f799bb7 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Wed, 3 Jun 2020 14:08:02 +0200 Subject: [PATCH 2/7] Remove the salinity compensation In recent hwos firmware versions, the depth is no longer stored as pressure (in millibar), but directly as depth (in meters) with the salinity and gravity factor already applied. --- src/hw_ostc_parser.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/hw_ostc_parser.c b/src/hw_ostc_parser.c index 79920b9..117064b 100644 --- a/src/hw_ostc_parser.c +++ b/src/hw_ostc_parser.c @@ -617,14 +617,6 @@ hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t call else samplerate = data[36]; - // Get the salinity factor. - unsigned int salinity = data[layout->salinity]; - if (version == 0x23 || version == 0x24) - salinity += 100; - if (salinity < 100 || salinity > 104) - salinity = 100; - double hydrostatic = GRAVITY * salinity * 10.0; - // Get the number of sample descriptors. unsigned int nconfig = 0; if (version == 0x23 || version == 0x24) @@ -728,9 +720,9 @@ hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t call if (callback) callback (DC_SAMPLE_CNS, sample, userdata); } - // Depth (mbar). + // Depth (1/100 m). unsigned int depth = array_uint16_le (data + offset); - sample.depth = (depth * BAR / 1000.0) / hydrostatic; + sample.depth = depth / 100.0; if (callback) callback (DC_SAMPLE_DEPTH, sample, userdata); offset += 2; From 9e6035f98a68b56292b04c087b46f40cc3242f36 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Thu, 7 May 2020 13:29:38 -0700 Subject: [PATCH 3/7] Suunto Eon Steel: sort the dive list properly Instead of assuming that the dive list is presented in a sorted circular list, sort it properly alphabetically (which also ends up being a numerical sort for the HEX ascii dive names). The "search for most recent dive, then splice the list around" case doesn't work in the general case. It happens to work if you don't delete any dives, and dives only disappear as they are being overwritten by new dives when the storage overflows. But if you delete dives and then create new ones, the dive list will not be sorted at all, and we should sort it properly when downloading. Signed-off-by: Linus Torvalds --- src/suunto_eonsteel.c | 77 +++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 36 deletions(-) diff --git a/src/suunto_eonsteel.c b/src/suunto_eonsteel.c index 336877b..2d8122c 100644 --- a/src/suunto_eonsteel.c +++ b/src/suunto_eonsteel.c @@ -641,12 +641,35 @@ read_file(suunto_eonsteel_device_t *eon, const char *filename, dc_buffer_t *buf) return DC_STATUS_SUCCESS; } +/* + * Insert a directory entry in the sorted list, most recent entry + * first. + * + * The directory entry names are the timestamps as hex, so ordering + * in alphabetical order ends up also ordering in date order! + */ +static struct directory_entry *insert_dirent(struct directory_entry *entry, struct directory_entry *list) +{ + struct directory_entry **pos = &list, *next; + + while ((next = *pos) != NULL) { + /* Is this bigger (more recent) than the next entry? We're good! */ + if (strcmp(entry->name, next->name) > 0) + break; + pos = &next->next; + } + entry->next = next; + *pos = entry; + + return list; +} + /* * NOTE! This will create the list of dirent's in reverse order, * with the last dirent first. That's intentional: for dives, * we will want to look up the last dive first. */ -static struct directory_entry *parse_dirent(suunto_eonsteel_device_t *eon, int nr, const unsigned char *p, unsigned int len, struct directory_entry *old) +static struct directory_entry *parse_dirent(suunto_eonsteel_device_t *eon, int nr, const unsigned char *p, unsigned int len, struct directory_entry *list) { while (len > 8) { unsigned int type = array_uint32_le(p); @@ -667,10 +690,9 @@ static struct directory_entry *parse_dirent(suunto_eonsteel_device_t *eon, int n ERROR(eon->base.context, "out of memory"); break; } - entry->next = old; - old = entry; + list = insert_dirent(entry, list); } - return old; + return list; } static dc_status_t @@ -731,6 +753,19 @@ get_file_list(suunto_eonsteel_device_t *eon, struct directory_entry **res) return DC_STATUS_SUCCESS; } +static int +count_file_list(struct directory_entry *list) +{ + int count = 0; + + while (list) { + count++; + list = list->next; + } + + return count; +} + dc_status_t suunto_eonsteel_device_open(dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream, unsigned int model) { @@ -802,7 +837,6 @@ suunto_eonsteel_device_foreach(dc_device_t *abstract, dc_dive_callback_t callbac dc_buffer_t *file; char pathname[64]; unsigned int time; - unsigned int count = 0; dc_event_progress_t progress = EVENT_PROGRESS_INITIALIZER; // Emit a device info event. @@ -820,46 +854,17 @@ suunto_eonsteel_device_foreach(dc_device_t *abstract, dc_dive_callback_t callbac return DC_STATUS_SUCCESS; } - // Locate the most recent dive. - // The filename represent the time of the dive, encoded as a hexadecimal - // number. Thus the most recent dive can be found by simply sorting the - // filenames alphabetically. - struct directory_entry *head = de, *tail = de, *latest = de; - while (de) { - if (strcmp (de->name, latest->name) > 0) { - latest = de; - } - tail = de; - count++; - de = de->next; - } - - // Make the most recent dive the head of the list. - // The linked list is made circular, by attaching the head to the tail and - // then cut open again just before the most recent dive. - de = head; - while (de) { - if (de->next == latest) { - de->next = NULL; - tail->next = head; - break; - } - - de = de->next; - } - file = dc_buffer_new (16384); if (file == NULL) { ERROR (abstract->context, "Insufficient buffer space available."); - file_list_free (latest); + file_list_free(de); return DC_STATUS_NOMEMORY; } - progress.maximum = count; + progress.maximum = count_file_list(de); progress.current = 0; device_event_emit(abstract, DC_EVENT_PROGRESS, &progress); - de = latest; while (de) { int len; struct directory_entry *next = de->next; From 8d35ee697849877538dc81ca8b21520e7892da75 Mon Sep 17 00:00:00 2001 From: David Carron Date: Mon, 18 May 2020 08:54:15 +0200 Subject: [PATCH 4/7] Add support for the McLean Extreme --- examples/common.c | 1 + include/libdivecomputer/common.h | 2 + msvc/libdivecomputer.vcproj | 12 + src/Makefile.am | 1 + src/descriptor.c | 18 + src/device.c | 4 + src/mclean_extreme.c | 591 +++++++++++++++++++++++++++++++ src/mclean_extreme.h | 43 +++ src/mclean_extreme_parser.c | 316 +++++++++++++++++ src/parser.c | 4 + 10 files changed, 992 insertions(+) create mode 100644 src/mclean_extreme.c create mode 100644 src/mclean_extreme.h create mode 100644 src/mclean_extreme_parser.c diff --git a/examples/common.c b/examples/common.c index d8c7262..e305536 100644 --- a/examples/common.c +++ b/examples/common.c @@ -90,6 +90,7 @@ static const backend_table_t g_backends[] = { {"idive", DC_FAMILY_DIVESYSTEM_IDIVE, 0x03}, {"cochran", DC_FAMILY_COCHRAN_COMMANDER, 0}, {"divecomputereu", DC_FAMILY_TECDIVING_DIVECOMPUTEREU, 0}, + {"mclean", DC_FAMILY_MCLEAN_EXTREME, 0}, }; static const transport_table_t g_transports[] = { diff --git a/include/libdivecomputer/common.h b/include/libdivecomputer/common.h index 7f94f14..a8703ab 100644 --- a/include/libdivecomputer/common.h +++ b/include/libdivecomputer/common.h @@ -104,6 +104,8 @@ typedef enum dc_family_t { DC_FAMILY_COCHRAN_COMMANDER = (14 << 16), /* Tecdiving */ DC_FAMILY_TECDIVING_DIVECOMPUTEREU = (15 << 16), + /* McLean */ + DC_FAMILY_MCLEAN_EXTREME = (16 << 16), } dc_family_t; #ifdef __cplusplus diff --git a/msvc/libdivecomputer.vcproj b/msvc/libdivecomputer.vcproj index 507140e..1c8b772 100644 --- a/msvc/libdivecomputer.vcproj +++ b/msvc/libdivecomputer.vcproj @@ -350,6 +350,14 @@ RelativePath="..\src\mares_puck.c" > + + + + @@ -696,6 +704,10 @@ RelativePath="..\src\mares_puck.h" > + + diff --git a/src/Makefile.am b/src/Makefile.am index 4d19b48..f2bcd46 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -72,6 +72,7 @@ libdivecomputer_la_SOURCES = \ buffer.c \ cochran_commander.h cochran_commander.c cochran_commander_parser.c \ tecdiving_divecomputereu.h tecdiving_divecomputereu.c tecdiving_divecomputereu_parser.c \ + mclean_extreme.h mclean_extreme.c mclean_extreme_parser.c \ socket.h socket.c \ irda.c \ usbhid.c \ diff --git a/src/descriptor.c b/src/descriptor.c index 74d0f8a..54ae5c9 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -48,6 +48,7 @@ static int dc_filter_tecdiving (dc_transport_t transport, const void *userdata); static int dc_filter_mares (dc_transport_t transport, const void *userdata); static int dc_filter_divesystem (dc_transport_t transport, const void *userdata); static int dc_filter_oceanic (dc_transport_t transport, const void *userdata); +static int dc_filter_mclean (dc_transport_t transport, const void *userdata); static dc_status_t dc_descriptor_iterator_next (dc_iterator_t *iterator, void *item); @@ -376,6 +377,8 @@ static const dc_descriptor_t g_descriptors[] = { {"Cochran", "EMC-20H", DC_FAMILY_COCHRAN_COMMANDER, 5, DC_TRANSPORT_SERIAL, NULL}, /* Tecdiving DiveComputer.eu */ {"Tecdiving", "DiveComputer.eu", DC_FAMILY_TECDIVING_DIVECOMPUTEREU, 0, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLUETOOTH, dc_filter_tecdiving}, + /* McLean Extreme */ + { "McLean", "Extreme", DC_FAMILY_MCLEAN_EXTREME, 0, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLUETOOTH, dc_filter_mclean}, }; static int @@ -629,6 +632,21 @@ static int dc_filter_oceanic (dc_transport_t transport, const void *userdata) return 1; } +static int dc_filter_mclean(dc_transport_t transport, const void *userdata) +{ + static const char * const bluetooth[] = { + "Extreme", + }; + + if (transport == DC_TRANSPORT_BLUETOOTH) { + return DC_FILTER_INTERNAL (userdata, bluetooth, 0, dc_match_name); + } else if (transport == DC_TRANSPORT_SERIAL) { + return DC_FILTER_INTERNAL(userdata, rfcomm, 1, dc_match_devname); + } + + return 1; +} + dc_status_t dc_descriptor_iterator (dc_iterator_t **out) { diff --git a/src/device.c b/src/device.c index 9da9cd9..92cfa36 100644 --- a/src/device.c +++ b/src/device.c @@ -57,6 +57,7 @@ #include "divesystem_idive.h" #include "cochran_commander.h" #include "tecdiving_divecomputereu.h" +#include "mclean_extreme.h" #include "device-private.h" #include "context-private.h" @@ -211,6 +212,9 @@ dc_device_open (dc_device_t **out, dc_context_t *context, dc_descriptor_t *descr case DC_FAMILY_TECDIVING_DIVECOMPUTEREU: rc = tecdiving_divecomputereu_device_open (&device, context, iostream); break; + case DC_FAMILY_MCLEAN_EXTREME: + rc = mclean_extreme_device_open (&device, context, iostream); + break; default: return DC_STATUS_INVALIDARGS; } diff --git a/src/mclean_extreme.c b/src/mclean_extreme.c new file mode 100644 index 0000000..5785a24 --- /dev/null +++ b/src/mclean_extreme.c @@ -0,0 +1,591 @@ +/* + * libdivecomputer + * + * Copyright (C) 2020 Jef Driesen, David Carron + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#include // memcmp, memcpy +#include // malloc, free + +#include "mclean_extreme.h" +#include "context-private.h" +#include "device-private.h" +#include "array.h" + +#define ISINSTANCE(device) dc_device_isinstance((device), &mclean_extreme_device_vtable) + +#define MAXRETRIES 14 + +#define STX 0x7E + +#define CMD_SERIALNUMBER 0x91 +#define CMD_COMPUTER 0xA0 +#define CMD_SET_COMPUTER 0xA1 +#define CMD_DIVE 0xA3 +#define CMD_CLOSE 0xAA +#define CMD_SET_TIME 0xAC +#define CMD_FIRMWARE 0xAD + +#define SZ_PACKET 512 +#define SZ_FINGERPRINT 7 +#define SZ_CFG 0x002D +#define SZ_COMPUTER (SZ_CFG + 0x6A) +#define SZ_HEADER (SZ_CFG + 0x31) +#define SZ_SAMPLE 0x0004 + +#define EPOCH 946684800 // 2000-01-01 00:00:00 UTC + +#define NSTEPS 1000 +#define STEP(i,n) (NSTEPS * (i) / (n)) + +typedef struct mclean_extreme_device_t { + dc_device_t base; + dc_iostream_t *iostream; + unsigned char fingerprint[SZ_FINGERPRINT]; +} mclean_extreme_device_t; + +static dc_status_t mclean_extreme_device_set_fingerprint(dc_device_t *abstract, const unsigned char data[], unsigned int size); +static dc_status_t mclean_extreme_device_timesync(dc_device_t *abstract, const dc_datetime_t *datetime); +static dc_status_t mclean_extreme_device_foreach(dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); +static dc_status_t mclean_extreme_device_close(dc_device_t *abstract); + +static const dc_device_vtable_t mclean_extreme_device_vtable = { + sizeof(mclean_extreme_device_t), + DC_FAMILY_MCLEAN_EXTREME, + mclean_extreme_device_set_fingerprint, /* set_fingerprint */ + NULL, /* read */ + NULL, /* write */ + NULL, /* dump */ + mclean_extreme_device_foreach, /* foreach */ + mclean_extreme_device_timesync, /* timesync */ + mclean_extreme_device_close, /* close */ +}; + +static unsigned int +hashcode (const unsigned char data[], size_t size) +{ + unsigned int result = 0; + + for (size_t i = 0; i < size; ++i) { + result *= 31; + result += data[i]; + } + + return result; +} + +static unsigned short +checksum_crc(const unsigned char data[], unsigned int size, unsigned short init) +{ + unsigned short crc = init; + for (unsigned int i = 0; i < size; ++i) { + crc ^= data[i] << 8; + if (crc & 0x8000) { + crc <<= 1; + crc ^= 0x1021; + } else { + crc <<= 1; + } + } + + return crc; +} + +static dc_status_t +mclean_extreme_send(mclean_extreme_device_t *device, unsigned char cmd, const unsigned char data[], size_t size) +{ + dc_status_t status = DC_STATUS_SUCCESS; + dc_device_t *abstract = (dc_device_t *)device; + unsigned short crc = 0; + + if (device_is_cancelled(abstract)) + return DC_STATUS_CANCELLED; + + if (size > SZ_PACKET) + return DC_STATUS_INVALIDARGS; + + // Setup the data packet + unsigned char packet[SZ_PACKET + 11] = { + STX, + 0x00, + (size >> 0) & 0xFF, + (size >> 8) & 0xFF, + (size >> 16) & 0xFF, + (size >> 24) & 0xFF, + cmd, + }; + if (size) { + memcpy(packet + 7, data, size); + } + crc = checksum_crc(packet + 1, size + 6, 0); + packet[size + 7] = (crc >> 8) & 0xFF; + packet[size + 8] = (crc) & 0xFF; + packet[size + 9] = 0x00; + packet[size + 10] = 0x00; + + // Give the dive computer some extra time. + dc_iostream_sleep(device->iostream, 300); + + // Send the data packet. + status = dc_iostream_write(device->iostream, packet, size + 11, NULL); + if (status != DC_STATUS_SUCCESS) { + ERROR(abstract->context, "Failed to send the command."); + return status; + } + + return DC_STATUS_SUCCESS; +} + +static dc_status_t +mclean_extreme_receive(mclean_extreme_device_t *device, unsigned char rsp, unsigned char data[], size_t size, size_t *actual) +{ + dc_status_t status = DC_STATUS_SUCCESS; + dc_device_t *abstract = (dc_device_t *)device; + unsigned char header[7]; + unsigned int nretries = 0; + + // Read the packet start byte. + // Unfortunately it takes a relative long time, about 6-8 seconds, + // before the STX byte arrives. Hence the standard timeout of one + // second is not sufficient, and we need to retry a few times on + // timeout. The advantage over using a single read operation with a + // large timeout is that we can give the user a chance to cancel the + // operation. + while (1) { + status = dc_iostream_read(device->iostream, header + 0, 1, NULL); + if (status != DC_STATUS_SUCCESS) { + if (status != DC_STATUS_TIMEOUT) { + ERROR(abstract->context, "Failed to receive the packet start byte."); + return status; + } + + // Abort if the maximum number of retries is reached. + if (nretries++ >= MAXRETRIES) + return status; + + // Cancel if requested by the user. + if (device_is_cancelled(abstract)) + return DC_STATUS_CANCELLED; + + // Try again. + continue; + } + + if (header[0] == STX) + break; + + // Reset the retry counter. + nretries = 0; + } + + // Read the packet header. + status = dc_iostream_read(device->iostream, header + 1, sizeof(header) - 1, NULL); + if (status != DC_STATUS_SUCCESS) { + ERROR(abstract->context, "Failed to receive the packet header."); + return status; + } + + // Verify the type byte. + unsigned int type = header[1]; + if (type != 0x00) { + ERROR(abstract->context, "Unexpected type byte (%02x).", type); + return DC_STATUS_PROTOCOL; + } + + // Verify the length. + unsigned int length = array_uint32_le(header + 2); + if (length > size) { + ERROR(abstract->context, "Unexpected packet length (%u).", length); + return DC_STATUS_PROTOCOL; + } + + // Get the command type. + unsigned int cmd = header[6]; + if (cmd != rsp) { + ERROR(abstract->context, "Unexpected command byte (%02x).", cmd); + return DC_STATUS_PROTOCOL; + } + + size_t nbytes = 0; + while (nbytes < length) { + // Set the maximum packet size. + size_t len = 1000; + + // Limit the packet size to the total size. + if (nbytes + len > length) + len = length - nbytes; + + // Read the packet payload. + status = dc_iostream_read(device->iostream, data + nbytes, len, NULL); + if (status != DC_STATUS_SUCCESS) { + ERROR(abstract->context, "Failed to receive the packet payload."); + return status; + } + + nbytes += len; + } + + // Read the packet checksum. + unsigned char checksum[4]; + status = dc_iostream_read(device->iostream, checksum, sizeof(checksum), NULL); + if (status != DC_STATUS_SUCCESS) { + ERROR(abstract->context, "Failed to receive the packet checksum."); + return status; + } + + // Verify the checksum. + unsigned short crc = array_uint16_be(checksum); + unsigned short ccrc = 0; + ccrc = checksum_crc(header + 1, sizeof(header) - 1, ccrc); + ccrc = checksum_crc(data, length, ccrc); + if (crc != ccrc || checksum[2] != 0x00 || checksum[3] != 0) { + ERROR(abstract->context, "Unexpected packet checksum."); + return DC_STATUS_PROTOCOL; + } + + if (actual == NULL) { + // Verify the actual length. + if (length != size) { + ERROR (abstract->context, "Unexpected packet length (%u).", length); + return DC_STATUS_PROTOCOL; + } + } else { + // Return the actual length. + *actual = length; + } + + return DC_STATUS_SUCCESS; +} + +static dc_status_t +mclean_extreme_transfer(mclean_extreme_device_t *device, unsigned char cmd, const unsigned char data[], size_t size, unsigned char answer[], size_t asize, size_t *actual) +{ + dc_status_t status = DC_STATUS_SUCCESS; + + // Send the command + status = mclean_extreme_send(device, cmd, data, size); + if (status != DC_STATUS_SUCCESS) { + return status; + } + + // Receive the answer + if (asize) { + status = mclean_extreme_receive(device, cmd, answer, asize, actual); + if (status != DC_STATUS_SUCCESS) { + return status; + } + } + + return DC_STATUS_SUCCESS; +} + +static dc_status_t +mclean_extreme_readdive (dc_device_t *abstract, dc_event_progress_t *progress, unsigned int idx, dc_buffer_t *buffer) +{ + dc_status_t status = DC_STATUS_SUCCESS; + mclean_extreme_device_t *device = (mclean_extreme_device_t *) abstract; + + // Erase the buffer. + dc_buffer_clear (buffer); + + // Encode the logbook ID. + unsigned char id[] = { + (idx ) & 0xFF, + (idx >> 8) & 0xFF, + }; + + // Update and emit a progress event. + unsigned int initial = 0; + if (progress) { + initial = progress->current; + device_event_emit (abstract, DC_EVENT_PROGRESS, progress); + } + + // Request the dive. + status = mclean_extreme_send (device, CMD_DIVE, id, sizeof(id)); + if (status != DC_STATUS_SUCCESS) { + ERROR (abstract->context, "Failed to send the dive command."); + return status; + } + + // Read the dive header. + unsigned char header[SZ_HEADER]; + status = mclean_extreme_receive (device, CMD_DIVE, header, sizeof(header), NULL); + if (status != DC_STATUS_SUCCESS) { + ERROR (abstract->context, "Failed to receive the dive header."); + return status; + } + + // Verify the format version. + unsigned int format = header[0x0000]; + if (format != 0) { + ERROR(abstract->context, "Unrecognised dive format."); + return DC_STATUS_DATAFORMAT; + } + + // Get the number of samples. + unsigned int nsamples = array_uint16_le (header + 0x005C); + + // Calculate the total size. + unsigned int size = sizeof(header) + nsamples * SZ_SAMPLE; + + // Update and emit a progress event. + if (progress) { + progress->current = initial + STEP(sizeof(header), size); + device_event_emit (abstract, DC_EVENT_PROGRESS, progress); + } + + // Allocate memory for the dive. + if (!dc_buffer_resize (buffer, size)) { + ERROR (abstract->context, "Insufficient buffer space available."); + return DC_STATUS_NOMEMORY; + } + + // Cache the pointer. + unsigned char *data = dc_buffer_get_data(buffer); + + // Append the header. + memcpy (data, header, sizeof(header)); + + unsigned int nbytes = sizeof(header); + while (nbytes < size) { + // Get the maximum packet size. + size_t len = size - nbytes; + + // Read the dive samples. + status = mclean_extreme_receive (device, CMD_DIVE, data + nbytes, len, &len); + if (status != DC_STATUS_SUCCESS) { + ERROR (abstract->context, "Failed to receive the dive samples."); + return status; + } + + nbytes += len; + + // Update and emit a progress event. + if (progress) { + progress->current = initial + STEP(nbytes, size); + device_event_emit (abstract, DC_EVENT_PROGRESS, progress); + } + } + + return DC_STATUS_SUCCESS; +} + +dc_status_t +mclean_extreme_device_open(dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) +{ + dc_status_t status = DC_STATUS_SUCCESS; + mclean_extreme_device_t *device = NULL; + + if (out == NULL) + return DC_STATUS_INVALIDARGS; + + // Allocate memory. + device = (mclean_extreme_device_t *)dc_device_allocate(context, &mclean_extreme_device_vtable); + if (device == NULL) { + ERROR(context, "Failed to allocate memory."); + return DC_STATUS_NOMEMORY; + } + + // Set the default values. + device->iostream = iostream; + memset(device->fingerprint, 0, sizeof(device->fingerprint)); + + // Set the serial communication protocol (115200 8N1). + status = dc_iostream_configure(device->iostream, 115200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); + if (status != DC_STATUS_SUCCESS) { + ERROR(context, "Failed to set the terminal attributes."); + goto error_free; + } + + // Set the timeout for receiving data (1000ms). + status = dc_iostream_set_timeout(device->iostream, 1000); + if (status != DC_STATUS_SUCCESS) { + ERROR(context, "Failed to set the timeout."); + goto error_free; + } + + *out = (dc_device_t *)device; + + return DC_STATUS_SUCCESS; + +error_free: + dc_device_deallocate((dc_device_t *)device); + return status; +} + +static dc_status_t +mclean_extreme_device_close(dc_device_t *abstract) +{ + dc_status_t status = DC_STATUS_SUCCESS; + mclean_extreme_device_t *device = (mclean_extreme_device_t *)abstract; + + status = mclean_extreme_send(device, CMD_CLOSE, NULL, 0); + if (status != DC_STATUS_SUCCESS) { + ERROR(abstract->context, "Failed to send the exit command."); + return status; + } + + return DC_STATUS_SUCCESS; +} + +static dc_status_t +mclean_extreme_device_set_fingerprint(dc_device_t *abstract, const unsigned char data[], unsigned int size) +{ + mclean_extreme_device_t *device = (mclean_extreme_device_t *)abstract; + + if (size && size != sizeof(device->fingerprint)) { + return DC_STATUS_INVALIDARGS; + } + + if (size) { + memcpy(device->fingerprint, data, sizeof(device->fingerprint)); + } else { + memset(device->fingerprint, 0, sizeof(device->fingerprint)); + } + + return DC_STATUS_SUCCESS; +} + +static dc_status_t +mclean_extreme_device_timesync(dc_device_t *abstract, const dc_datetime_t *datetime) +{ + mclean_extreme_device_t *device = (mclean_extreme_device_t *)abstract; + + if (datetime == NULL) { + ERROR(abstract->context, "Invalid parameter specified."); + return DC_STATUS_INVALIDARGS; + } + + // Get the UTC timestamp. + dc_ticks_t ticks = dc_datetime_mktime(datetime); + if (ticks == -1 || ticks < EPOCH || ticks - EPOCH > 0xFFFFFFFF) { + ERROR (abstract->context, "Invalid date/time value specified."); + return DC_STATUS_INVALIDARGS; + } + + // Adjust the epoch. + unsigned int timestamp = ticks - EPOCH; + + // Send the command. + const unsigned char cmd[] = { + (timestamp ) & 0xFF, + (timestamp >> 8) & 0xFF, + (timestamp >> 16) & 0xFF, + (timestamp >> 24) & 0xFF + }; + dc_status_t status = mclean_extreme_send(device, CMD_SET_TIME, cmd, sizeof(cmd)); + if (status != DC_STATUS_SUCCESS) { + ERROR(abstract->context, "Failed to send the set time command."); + return status; + } + + return status; +} + +static dc_status_t +mclean_extreme_device_foreach(dc_device_t *abstract, dc_dive_callback_t callback, void *userdata) +{ + dc_status_t status = DC_STATUS_SUCCESS; + mclean_extreme_device_t *device = (mclean_extreme_device_t *)abstract; + + // Enable progress notifications. + dc_event_progress_t progress = EVENT_PROGRESS_INITIALIZER; + device_event_emit (abstract, DC_EVENT_PROGRESS, &progress); + + // Read the firmware version. + unsigned char firmware[4] = {0}; + status = mclean_extreme_transfer(device, CMD_FIRMWARE, NULL, 0, firmware, sizeof(firmware), NULL); + if (status != DC_STATUS_SUCCESS) { + ERROR(abstract->context, "Failed to read the firmware version."); + return status; + } + + // Read the serial number. + size_t serial_len = 0; + unsigned char serial[SZ_PACKET] = {0}; + status = mclean_extreme_transfer(device, CMD_SERIALNUMBER, NULL, 0, serial, sizeof(serial), &serial_len); + if (status != DC_STATUS_SUCCESS) { + ERROR(abstract->context, "Failed to read serial number."); + return status; + } + + // Emit a device info event. + dc_event_devinfo_t devinfo; + devinfo.model = 0; + devinfo.firmware = array_uint32_le (firmware); + devinfo.serial = hashcode (serial, serial_len); + device_event_emit (abstract, DC_EVENT_DEVINFO, &devinfo); + + // Read the computer configuration. + unsigned char computer[SZ_COMPUTER]; + status = mclean_extreme_transfer(device, CMD_COMPUTER, NULL, 0, computer, sizeof(computer), NULL); + if (status != DC_STATUS_SUCCESS) { + ERROR(abstract->context, "Failed to read the computer configuration."); + return status; + } + + // Verify the format version. + unsigned int format = computer[0x0000]; + if (format != 0) { + ERROR(abstract->context, "Unsupported device format."); + return DC_STATUS_DATAFORMAT; + } + + // Get the number of dives. + unsigned int ndives = array_uint16_le(computer + 0x0019); + + // Update and emit a progress event. + progress.current = 1 * NSTEPS; + progress.maximum = (ndives + 1) * NSTEPS; + device_event_emit (abstract, DC_EVENT_PROGRESS, &progress); + + // Allocate a memory buffer for a single dive. + dc_buffer_t *buffer = dc_buffer_new(0); + if (buffer == NULL) { + status = DC_STATUS_NOMEMORY; + goto error_exit; + } + + for (unsigned int i = 0; i < ndives; ++i) { + // Download in reverse order (newest first). + unsigned int idx = ndives - 1 - i; + + // Read the dive. + status = mclean_extreme_readdive (abstract, &progress, idx, buffer); + if (status != DC_STATUS_SUCCESS) { + goto error_buffer_free; + } + + // Cache the pointer. + unsigned char *data = dc_buffer_get_data(buffer); + unsigned int size = dc_buffer_get_size(buffer); + + if (memcmp(data, device->fingerprint, sizeof(device->fingerprint)) == 0) + break; + + if (callback && !callback (data, size, data, sizeof(device->fingerprint), userdata)) { + break; + } + } + +error_buffer_free: + dc_buffer_free (buffer); +error_exit: + return status; +} diff --git a/src/mclean_extreme.h b/src/mclean_extreme.h new file mode 100644 index 0000000..c388bd4 --- /dev/null +++ b/src/mclean_extreme.h @@ -0,0 +1,43 @@ +/* + * libdivecomputer + * + * Copyright (C) 2020 Jef Driesen, David Carron + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#ifndef MCLEAN_EXTREME_H +#define MCLEAN_EXTREME_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +dc_status_t +mclean_extreme_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); + +dc_status_t +mclean_extreme_parser_create (dc_parser_t **parser, dc_context_t *context); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* mclean_extreme_H */ diff --git a/src/mclean_extreme_parser.c b/src/mclean_extreme_parser.c new file mode 100644 index 0000000..e696ee8 --- /dev/null +++ b/src/mclean_extreme_parser.c @@ -0,0 +1,316 @@ +/* + * libdivecomputer + * + * Copyright (C) 2020 Jef Driesen, David Carron + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#include +#include + +#include "mclean_extreme.h" +#include "context-private.h" +#include "parser-private.h" +#include "array.h" + +#define ISINSTANCE(parser) dc_device_isinstance((parser), &mclean_extreme_parser_vtable) + +#define SZ_CFG 0x002D +#define SZ_COMPUTER (SZ_CFG + 0x6A) +#define SZ_HEADER (SZ_CFG + 0x31) +#define SZ_SAMPLE 0x0004 + +#define EPOCH 946684800 // 2000-01-01 00:00:00 UTC + +#define REC 0 +#define TEC 1 +#define CCR 2 +#define GAUGE 3 + +#define INVALID 0xFFFFFFFF + +#define NGASMIXES 8 + +typedef struct mclean_extreme_parser_t mclean_extreme_parser_t; + +struct mclean_extreme_parser_t { + dc_parser_t base; + + // Cached fields. + unsigned int cached; + unsigned int ngasmixes; + unsigned int gasmix[NGASMIXES]; +}; + +static dc_status_t mclean_extreme_parser_set_data(dc_parser_t *abstract, const unsigned char *data, unsigned int size); +static dc_status_t mclean_extreme_parser_get_datetime(dc_parser_t *abstract, dc_datetime_t *datetime); +static dc_status_t mclean_extreme_parser_get_field(dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); +static dc_status_t mclean_extreme_parser_samples_foreach(dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); + +static const dc_parser_vtable_t mclean_extreme_parser_vtable = { + sizeof(mclean_extreme_parser_t), + DC_FAMILY_MCLEAN_EXTREME, + mclean_extreme_parser_set_data, /* set_data */ + mclean_extreme_parser_get_datetime, /* datetime */ + mclean_extreme_parser_get_field, /* fields */ + mclean_extreme_parser_samples_foreach, /* samples_foreach */ + NULL /* destroy */ +}; + +dc_status_t +mclean_extreme_parser_create(dc_parser_t **out, dc_context_t *context) +{ + mclean_extreme_parser_t *parser = NULL; + + if (out == NULL) { + return DC_STATUS_INVALIDARGS; + } + + // Allocate memory. + parser = (mclean_extreme_parser_t *)dc_parser_allocate(context, &mclean_extreme_parser_vtable); + if (parser == NULL) { + ERROR(context, "Failed to allocate memory."); + return DC_STATUS_NOMEMORY; + } + + // Set the default values. + parser->cached = 0; + parser->ngasmixes = 0; + for (unsigned int i = 0; i < NGASMIXES; ++i) { + parser->gasmix[i] = INVALID; + } + + *out = (dc_parser_t *)parser; + + return DC_STATUS_SUCCESS; +} + +static dc_status_t +mclean_extreme_parser_set_data(dc_parser_t *abstract, const unsigned char *data, unsigned int size) +{ + mclean_extreme_parser_t *parser = (mclean_extreme_parser_t *)abstract; + + // Reset the cache. + parser->cached = 0; + parser->ngasmixes = 0; + for (unsigned int i = 0; i < NGASMIXES; ++i) { + parser->gasmix[i] = INVALID; + } + + return DC_STATUS_SUCCESS; +} + +static dc_status_t +mclean_extreme_parser_get_datetime(dc_parser_t *abstract, dc_datetime_t *datetime) +{ + if (abstract->size < SZ_HEADER) { + ERROR(abstract->context, "Corrupt dive data"); + return DC_STATUS_DATAFORMAT; + } + + unsigned int timestamp = array_uint32_le(abstract->data + SZ_CFG + 0x0000); + dc_ticks_t ticks = (dc_ticks_t) timestamp + EPOCH; + + if (!dc_datetime_gmtime (datetime, ticks)) + return DC_STATUS_DATAFORMAT; + + datetime->timezone = DC_TIMEZONE_NONE; + + return DC_STATUS_SUCCESS; +} + +static dc_status_t +mclean_extreme_parser_get_field(dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value) +{ + mclean_extreme_parser_t *parser = (mclean_extreme_parser_t *)abstract; + + if (abstract->size < SZ_HEADER) { + ERROR(abstract->context, "Corrupt dive data"); + return DC_STATUS_DATAFORMAT; + } + + if (!parser->cached) { + dc_status_t rc = mclean_extreme_parser_samples_foreach (abstract, NULL, NULL); + if (rc != DC_STATUS_SUCCESS) + return rc; + } + + dc_gasmix_t *gasmix = (dc_gasmix_t *)value; + dc_salinity_t *salinity = (dc_salinity_t *)value; + + const unsigned int psurf = array_uint16_le(abstract->data + 0x001E); + const unsigned int density_index = abstract->data[0x0023]; + double density = 0; + + switch (density_index) { + case 0: + density = 1.000; + break; + case 1: + density = 1.020; + break; + case 2: + density = 1.030; + break; + default: + ERROR(abstract->context, "Corrupt density index in dive data"); + return DC_STATUS_DATAFORMAT; + } + + if (value) { + switch (type) { + case DC_FIELD_DIVETIME: + *((unsigned int *)value) = array_uint32_le(abstract->data + SZ_CFG + 0x000C) - array_uint32_le(abstract->data + SZ_CFG + 0x0000); + break; + case DC_FIELD_MAXDEPTH: + *((double *)value) = 0.01 * (array_uint16_le(abstract->data + SZ_CFG + 0x0016) - psurf) / density; + break; + case DC_FIELD_AVGDEPTH: + *((double *)value) = 0.01 * (array_uint16_le(abstract->data + SZ_CFG + 0x0018) - psurf) / density; + break; + case DC_FIELD_SALINITY: + salinity->density = density * 1000.0; + salinity->type = density_index == 0 ? DC_WATER_FRESH : DC_WATER_SALT; + break; + case DC_FIELD_ATMOSPHERIC: + *((double *)value) = 0.001 * array_uint16_le(abstract->data + 0x001E); + break; + case DC_FIELD_TEMPERATURE_MINIMUM: + *((double *)value) = (double)abstract->data[SZ_CFG + 0x0010]; + break; + case DC_FIELD_TEMPERATURE_MAXIMUM: + *((double *)value) = (double)abstract->data[SZ_CFG + 0x0011]; + break; + case DC_FIELD_DIVEMODE: + switch (abstract->data[0x002C]) { + case REC: + case TEC: + *((dc_divemode_t *)value) = DC_DIVEMODE_OC; + break; + case CCR: + *((dc_divemode_t *)value) = DC_DIVEMODE_CCR; + break; + case GAUGE: + *((dc_divemode_t *)value) = DC_DIVEMODE_GAUGE; + break; + default: + ERROR(abstract->context, "Corrupt dive mode in dive data"); + return DC_STATUS_DATAFORMAT; + } + break; + case DC_FIELD_GASMIX_COUNT: + *((unsigned int *)value) = parser->ngasmixes; + break; + case DC_FIELD_GASMIX: + gasmix->helium = 0.01 * abstract->data[0x0001 + 1 + 2 * parser->gasmix[flags]]; + gasmix->oxygen = 0.01 * abstract->data[0x0001 + 0 + 2 * parser->gasmix[flags]]; + gasmix->nitrogen = 1.0 - gasmix->oxygen - gasmix->helium; + break; + default: + return DC_STATUS_UNSUPPORTED; + } + } + + return DC_STATUS_SUCCESS; +} + +static dc_status_t +mclean_extreme_parser_samples_foreach(dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata) +{ + mclean_extreme_parser_t *parser = (mclean_extreme_parser_t *)abstract; + + if (abstract->size < SZ_HEADER) { + ERROR(abstract->context, "Corrupt dive data"); + return DC_STATUS_DATAFORMAT; + } + + const unsigned int nsamples = array_uint16_le(abstract->data + 0x005C); + + if (abstract->size != SZ_HEADER + nsamples * SZ_SAMPLE) { + ERROR(abstract->context, "Corrupt dive data"); + return DC_STATUS_DATAFORMAT; + } + + unsigned int ngasmixes = 0; + unsigned int gasmix[NGASMIXES] = {0}; + unsigned int gasmix_previous = INVALID; + + const unsigned int interval = 20; + unsigned int time = 0; + size_t offset = SZ_HEADER; + for (unsigned int i = 0; i < nsamples; ++i) { + dc_sample_value_t sample = { 0 }; + + const unsigned int depth = array_uint16_le(abstract->data + offset + 0); + const unsigned int temperature = abstract->data[offset + 2]; + const unsigned int flags = abstract->data[offset + 3]; + const unsigned int ccr = flags & 0x80; + const unsigned int gasmix_id = (flags & 0x1C) >> 2; + const unsigned int sp_index = (flags & 0x60) >> 5; + const unsigned int setpoint = abstract->data[0x0013 + sp_index]; + + time += interval; + sample.time = time; + if (callback) callback(DC_SAMPLE_TIME, sample, userdata); + + sample.depth = 0.1 * depth; + if (callback) callback(DC_SAMPLE_DEPTH, sample, userdata); + + sample.temperature = temperature; + if (callback) callback(DC_SAMPLE_TEMPERATURE, sample, userdata); + + if (gasmix_id != gasmix_previous) { + // Find the gasmix in the list. + unsigned int idx = 0; + while (idx < ngasmixes) { + if (gasmix_id == gasmix[idx]) + break; + idx++; + } + + // Add it to list if not found. + if (idx >= ngasmixes) { + if (idx >= NGASMIXES) { + ERROR (abstract->context, "Maximum number of gas mixes reached."); + return DC_STATUS_DATAFORMAT; + } + gasmix[idx] = gasmix_id; + ngasmixes = idx + 1; + } + + sample.gasmix = idx; + if (callback) callback(DC_SAMPLE_GASMIX, sample, userdata); + gasmix_previous = gasmix_id; + } + + if (ccr) { + sample.setpoint = 0.01 * setpoint; + if (callback) callback(DC_SAMPLE_SETPOINT, sample, userdata); + } + + offset += SZ_SAMPLE; + } + + // Cache the data for later use. + for (unsigned int i = 0; i < ngasmixes; ++i) { + parser->gasmix[i] = gasmix[i]; + } + parser->ngasmixes = ngasmixes; + parser->cached = 1; + + return DC_STATUS_SUCCESS; +} diff --git a/src/parser.c b/src/parser.c index 9203490..977db14 100644 --- a/src/parser.c +++ b/src/parser.c @@ -57,6 +57,7 @@ #include "divesystem_idive.h" #include "cochran_commander.h" #include "tecdiving_divecomputereu.h" +#include "mclean_extreme.h" #include "context-private.h" #include "parser-private.h" @@ -172,6 +173,9 @@ dc_parser_new_internal (dc_parser_t **out, dc_context_t *context, dc_family_t fa case DC_FAMILY_TECDIVING_DIVECOMPUTEREU: rc = tecdiving_divecomputereu_parser_create (&parser, context); break; + case DC_FAMILY_MCLEAN_EXTREME: + rc = mclean_extreme_parser_create (&parser, context); + break; default: return DC_STATUS_INVALIDARGS; } From 85074dba40730a2d7dbdaf01d83c244719c29452 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Mon, 1 Jun 2020 19:15:49 +0200 Subject: [PATCH 5/7] Purge the serial port buffer during initialization --- src/mclean_extreme.c | 4 ++++ src/tecdiving_divecomputereu.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/mclean_extreme.c b/src/mclean_extreme.c index 5785a24..5c8060c 100644 --- a/src/mclean_extreme.c +++ b/src/mclean_extreme.c @@ -420,6 +420,10 @@ mclean_extreme_device_open(dc_device_t **out, dc_context_t *context, dc_iostream goto error_free; } + // Make sure everything is in a sane state. + dc_iostream_sleep (device->iostream, 100); + dc_iostream_purge (device->iostream, DC_DIRECTION_ALL); + *out = (dc_device_t *)device; return DC_STATUS_SUCCESS; diff --git a/src/tecdiving_divecomputereu.c b/src/tecdiving_divecomputereu.c index cf88b30..93190e2 100644 --- a/src/tecdiving_divecomputereu.c +++ b/src/tecdiving_divecomputereu.c @@ -376,6 +376,10 @@ tecdiving_divecomputereu_device_open (dc_device_t **out, dc_context_t *context, goto error_free; } + // Make sure everything is in a sane state. + dc_iostream_sleep (device->iostream, 100); + dc_iostream_purge (device->iostream, DC_DIRECTION_ALL); + // Send the init command. status = tecdiving_divecomputereu_send (device, CMD_INIT, NULL, 0); if (status != DC_STATUS_SUCCESS) { From 21742bd2ec0ce326102752af87b91b8f7757a1cb Mon Sep 17 00:00:00 2001 From: Vincent Hagen Date: Fri, 5 Jun 2020 12:05:26 +0200 Subject: [PATCH 6/7] Update the man pages for the new iostream functions - Added missing man pages for the new functions. - Updated the main libdivecomputer man page to reflect the new flow. - Fixed minor typos in the dc_parser_get_field and dc_parser_samples_foreach functions. --- doc/man/Makefile.am | 25 +++++- doc/man/dc_bluetooth_addr2str.3 | 61 +++++++++++++ doc/man/dc_bluetooth_device_free.3 | 52 +++++++++++ doc/man/dc_bluetooth_device_get_address.3 | 69 +++++++++++++++ doc/man/dc_bluetooth_device_get_name.3 | 61 +++++++++++++ doc/man/dc_bluetooth_iterator_new.3 | 102 ++++++++++++++++++++++ doc/man/dc_bluetooth_open.3 | 87 ++++++++++++++++++ doc/man/dc_bluetooth_str2addr.3 | 58 ++++++++++++ doc/man/dc_descriptor_get_transports.3 | 72 +++++++++++++++ doc/man/dc_device_open.3 | 27 +++--- doc/man/dc_iostream_close.3 | 60 +++++++++++++ doc/man/dc_irda_device_free.3 | 52 +++++++++++ doc/man/dc_irda_device_get_address.3 | 59 +++++++++++++ doc/man/dc_irda_device_get_name.3 | 58 ++++++++++++ doc/man/dc_irda_iterator_new.3 | 102 ++++++++++++++++++++++ doc/man/dc_irda_open.3 | 85 ++++++++++++++++++ doc/man/dc_parser_get_field.3 | 2 +- doc/man/dc_parser_samples_foreach.3 | 2 +- doc/man/dc_serial_device_free.3 | 52 +++++++++++ doc/man/dc_serial_device_get_name.3 | 59 +++++++++++++ doc/man/dc_serial_iterator_new.3 | 99 +++++++++++++++++++++ doc/man/dc_serial_open.3 | 80 +++++++++++++++++ doc/man/dc_usbhid_device_free.3 | 52 +++++++++++ doc/man/dc_usbhid_device_get_pid.3 | 58 ++++++++++++ doc/man/dc_usbhid_device_get_vid.3 | 58 ++++++++++++ doc/man/dc_usbhid_iterator_new.3 | 101 +++++++++++++++++++++ doc/man/dc_usbhid_open.3 | 77 ++++++++++++++++ doc/man/libdivecomputer.3 | 40 ++++++--- 28 files changed, 1683 insertions(+), 27 deletions(-) create mode 100644 doc/man/dc_bluetooth_addr2str.3 create mode 100644 doc/man/dc_bluetooth_device_free.3 create mode 100644 doc/man/dc_bluetooth_device_get_address.3 create mode 100644 doc/man/dc_bluetooth_device_get_name.3 create mode 100644 doc/man/dc_bluetooth_iterator_new.3 create mode 100644 doc/man/dc_bluetooth_open.3 create mode 100644 doc/man/dc_bluetooth_str2addr.3 create mode 100644 doc/man/dc_descriptor_get_transports.3 create mode 100644 doc/man/dc_iostream_close.3 create mode 100644 doc/man/dc_irda_device_free.3 create mode 100644 doc/man/dc_irda_device_get_address.3 create mode 100644 doc/man/dc_irda_device_get_name.3 create mode 100644 doc/man/dc_irda_iterator_new.3 create mode 100644 doc/man/dc_irda_open.3 create mode 100644 doc/man/dc_serial_device_free.3 create mode 100644 doc/man/dc_serial_device_get_name.3 create mode 100644 doc/man/dc_serial_iterator_new.3 create mode 100644 doc/man/dc_serial_open.3 create mode 100644 doc/man/dc_usbhid_device_free.3 create mode 100644 doc/man/dc_usbhid_device_get_pid.3 create mode 100644 doc/man/dc_usbhid_device_get_vid.3 create mode 100644 doc/man/dc_usbhid_iterator_new.3 create mode 100644 doc/man/dc_usbhid_open.3 diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am index 7108446..63f9e85 100644 --- a/doc/man/Makefile.am +++ b/doc/man/Makefile.am @@ -17,6 +17,7 @@ MANPAGES = \ dc_descriptor_get_model.3 \ dc_descriptor_get_product.3 \ dc_descriptor_get_vendor.3 \ + dc_descriptor_get_transports.3 \ dc_descriptor_iterator.3 \ dc_device_close.3 \ dc_device_foreach.3 \ @@ -32,7 +33,29 @@ MANPAGES = \ dc_parser_new.3 \ dc_parser_samples_foreach.3 \ dc_parser_set_data.3 \ - libdivecomputer.3 + dc_bluetooth_open.3 \ + dc_bluetooth_iterator_new.3 \ + dc_bluetooth_device_get_address.3 \ + dc_bluetooth_device_get_name.3 \ + dc_bluetooth_addr2str.3 \ + dc_bluetooth_str2addr.3 \ + dc_bluetooth_device_free.3 \ + dc_usbhid_open.3 \ + dc_usbhid_device_get_pid.3 \ + dc_usbhid_device_get_vid.3 \ + dc_usbhid_iterator_new.3 \ + dc_usbhid_device_free.3 \ + dc_serial_open.3 \ + dc_serial_device_get_name.3 \ + dc_serial_iterator_new.3 \ + dc_serial_device_free.3 \ + dc_irda_open.3 \ + dc_irda_device_get_name.3 \ + dc_irda_device_get_address.3 \ + dc_irda_iterator_new.3 \ + dc_irda_device_free.3 \ + dc_iostream_close.3 \ + libdivecomputer.3 HTMLPAGES = $(MANPAGES:%=%.html) diff --git a/doc/man/dc_bluetooth_addr2str.3 b/doc/man/dc_bluetooth_addr2str.3 new file mode 100644 index 0000000..ea073c3 --- /dev/null +++ b/doc/man/dc_bluetooth_addr2str.3 @@ -0,0 +1,61 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_BLUETOOTH_ADDR2STR 3 +.Os +.Sh NAME +.Nm dc_bluetooth_addr2str +.Nd Convert a bluetooth address to a string. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/bluetooth.h +.Ft "const char*" +.Fo dc_bluetooth_addr2str +.Fa "dc_bluetooth_address_t address" +.Fa "char *str" +.Fa "size_t size" +.Fc +.Sh DESCRIPTION +Convert a bluetooth address to a string. +.Pp +The bluetooth address is formatted as XX:XX:XX:XX:XX:XX, where each XX is a +hexadecimal number specifying an octet of the 48-bit address. +The minimum size for the buffer is +.Dv DC_BLUETOOTH_SIZE +bytes. +.Pp +The reverse can be done with +.Xr dc_bluetooth_str2addr 3 . +.Sh RETURN VALUES +Returns the bluetooth address represented as a string. +.Sh SEE ALSO +.Xr dc_bluetooth_str2addr 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_bluetooth_device_free.3 b/doc/man/dc_bluetooth_device_free.3 new file mode 100644 index 0000000..fd29096 --- /dev/null +++ b/doc/man/dc_bluetooth_device_free.3 @@ -0,0 +1,52 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_BLUETOOTH_DEVICE_FREE 3 +.Os +.Sh NAME +.Nm dc_bluetooth_device_free +.Nd Destroy the bluetooth device and free all resources. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/bluetooth.h +.Ft void +.Fo dc_bluetooth_device_free +.Fa "dc_bluetooth_device_t *device" +.Fc +.Sh DESCRIPTION +Destroy the bluetooth device and free all resources. +The bluetooth +.Fa device +usually found by searching through +.Xr dc_bluetooth_iterator_new 3 . +.Sh SEE ALSO +.Xr dc_bluetooth_iterator_new 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_bluetooth_device_get_address.3 b/doc/man/dc_bluetooth_device_get_address.3 new file mode 100644 index 0000000..c7c1c63 --- /dev/null +++ b/doc/man/dc_bluetooth_device_get_address.3 @@ -0,0 +1,69 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_BLUETOOTH_DEVICE_GET_ADDRESS 3 +.Os +.Sh NAME +.Nm dc_bluetooth_device_get_address +.Nd Get the address of a bluetooth device. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/bluetooth.h +.Ft "dc_bluetooth_address_t" +.Fo dc_bluetooth_device_get_address +.Fa "dc_bluetooth_device_t *device" +.Fc +.Sh DESCRIPTION +Get the bluetooth device address of given bluetooth +.Fa device . +Required when opening transport communication with +.Xr dc_bluetooth_open 3 . +Requires a valid +.Fa device +of type +.Ft dc_bluetooth_device_t +which can be retrieved using +.Xr dc_bluetooth_iterator_new 3 . +.Sh RETURN VALUES +Returns the bluetooth address of +.Fa device +as +.Ft dc_bluetooth_address_t +which is a 64bit integer holding the bluetooth address. + +The address can be formatted as a string by using +.Xr dc_bluetooth_addr2str 3 . +.Sh SEE ALSO +.Xr dc_bluetooth_open 3 , +.Xr dc_bluetooth_iterator_new 3 , +.Xr dc_bluetooth_device_get_name 3 , +.Xr dc_bluetooth_addr2str 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_bluetooth_device_get_name.3 b/doc/man/dc_bluetooth_device_get_name.3 new file mode 100644 index 0000000..c7f7da6 --- /dev/null +++ b/doc/man/dc_bluetooth_device_get_name.3 @@ -0,0 +1,61 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_BLUETOOTH_DEVICE_GET_NAME 3 +.Os +.Sh NAME +.Nm dc_bluetooth_device_get_name +.Nd Get the name of a bluetooth device. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/bluetooth.h +.Ft "const char *" +.Fo dc_bluetooth_device_get_name +.Fa "dc_bluetooth_device_t *device" +.Fc +.Sh DESCRIPTION +Get the name of given bluetooth +.Fa device . +Used for displaying. +Requires a valid +.Fa bluetooth_device +of type +.Ft dc_bluetooth_device_t +which can be retrieved using +.Xr dc_bluetooth_iterator_new 3 . +.Sh RETURN VALUES +Returns the bluetooth device of +.Fa device . +.Sh SEE ALSO +.Xr dc_bluetooth_open 3 , +.Xr dc_bluetooth_iterator_new 3 , +.Xr dc_bluetooth_device_get_address 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_bluetooth_iterator_new.3 b/doc/man/dc_bluetooth_iterator_new.3 new file mode 100644 index 0000000..e532206 --- /dev/null +++ b/doc/man/dc_bluetooth_iterator_new.3 @@ -0,0 +1,102 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_BLUETOOTH_ITERATOR_NEW 3 +.Os +.Sh NAME +.Nm dc_bluetooth_iterator_new +.Nd Create an iterator to enumerate the bluetooth devices. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/bluetooth.h +.Ft dc_status_t +.Fo dc_bluetooth_iterator_new +.Fa "dc_iterator_t **iterator" +.Fa "dc_context_t *context" +.Fa "dc_descriptor_t *descriptor" +.Fc +.Sh DESCRIPTION +Iterates through the available bluetooth devices which matches the given +.Fa descriptor . +Accepts a +.Fa context +opened with +.Xr dc_context_new 3 +and a +.Fa descriptor +usually found by searching through +.Xr dc_descriptor_iterator 3 . +.Pp +On returning +.Dv DC_STATUS_SUCCESS +the +.Fa iterator +will be set to an +.Ft dc_iterator_t +which can be used to iterate the available bluetooth devices using +.Xr dc_iterator_next 3 . +.Pp +The value type of the iterator is of type +.Ft dc_bluetooth_device_t . +This value can be used in functions to extract information about this specific bluetooth device, namely +.Xr dc_bluetooth_device_get_name 3 +and +.Xr dc_bluetooth_device_get_address 3 . +When done the bluetooth device needs to be freed with +.Xr dc_bluetooth_device_free 3 . +.Pp +After iterating the +.Fa iterator +needs to be freed using +.Xr dc_iterator_free 3 . + +.Sh RETURN VALUES +Returns +.Dv DC_STATUS_SUCCESS +on success, or another +.Ft dc_status_t +code on failure. + +On +.Dv DC_STATUS_SUCCESS +the returned +.Fa iterator +needs to be freed when done using +.Xr dc_iterator_free 3 . +.Sh SEE ALSO +.Xr dc_context_new 3 , +.Xr dc_usbhid_iterator_new 3 , +.Xr dc_serial_iterator_new 3 , +.Xr dc_irda_iterator_new 3 , +.Xr dc_bluetooth_device_get_name 3 , +.Xr dc_bluetooth_device_get_address 3 , +.Xr dc_bluetooth_device_free 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_bluetooth_open.3 b/doc/man/dc_bluetooth_open.3 new file mode 100644 index 0000000..6764ece --- /dev/null +++ b/doc/man/dc_bluetooth_open.3 @@ -0,0 +1,87 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_BLUETOOTH_OPEN 3 +.Os +.Sh NAME +.Nm dc_bluetooth_open +.Nd Opens an iostream for a bluetooth device +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/bluetooth.h +.Ft dc_status_t +.Fo dc_bluetooth_open +.Fa "dc_iostream_t **iostream" +.Fa "dc_context_t *context" +.Fa "dc_bluetooth_address_t address" +.Fa "unsigned int port" +.Fc +.Sh DESCRIPTION +Opens an iostream for a bluetooth device. +Accepts a +.Fa context +opened with +.Xr dc_context_new 3 , +a 48-bit bluetooth +.Fa address +given by +.Xr dc_bluetooth_iterator_new 3 +together with +.Xr dc_bluetooth_device_get_address 3 +or +.Xr dc_bluetooth_str2addr 3 +and a bluetooth rfcomm +.Fa port +number (use 0 for autodetection). +.Pp +Upon returning +.Dv DC_STATUS_SUCCESS , +the +.Fa iostream +pointer must be freed with +.Xr dc_iostream_close 3 . +.Sh RETURN VALUES +Returns +.Dv DC_STATUS_SUCCESS +on success or one of several error values on error. +On success, the +.Fa iostream +pointer is filled in with an open handle. +.Sh SEE ALSO +.Xr dc_context_new 3 , +.Xr dc_iostream_close 3 , +.Xr dc_serial_open 3 , +.Xr dc_irda_open 3 , +.Xr dc_usbhid_open 3 , +.Xr dc_bluetooth_iterator_new 3 , +.Xr dc_bluetooth_device_get_address 3 , +.Xr dc_bluetooth_str2addr 3 , +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_bluetooth_str2addr.3 b/doc/man/dc_bluetooth_str2addr.3 new file mode 100644 index 0000000..19ad357 --- /dev/null +++ b/doc/man/dc_bluetooth_str2addr.3 @@ -0,0 +1,58 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_BLUETOOTH_STR2ADDR 3 +.Os +.Sh NAME +.Nm dc_bluetooth_str2addr +.Nd Convert a string to a bluetooth address. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/bluetooth.h +.Ft "dc_bluetooth_address_t" +.Fo dc_bluetooth_addr2str +.Fa "const char *address" +.Fc +.Sh DESCRIPTION +Convert a string to a bluetooth address. +.Pp +The string +.Fa address +is expected to be in the format XX:XX:XX:XX:XX:XX, +where each XX is a hexadecimal number specifying an octet of the 48-bit address. +.Pp +The reverse can be done with +.Xr dc_bluetooth_addr2str 3 . +.Sh RETURN VALUES +Returns the bluetooth address represented as a 48-bit number. +.Sh SEE ALSO +.Xr dc_bluetooth_addr2str 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_descriptor_get_transports.3 b/doc/man/dc_descriptor_get_transports.3 new file mode 100644 index 0000000..93bef41 --- /dev/null +++ b/doc/man/dc_descriptor_get_transports.3 @@ -0,0 +1,72 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_DESCRIPTOR_GET_TRANSPORTS 3 +.Os +.Sh NAME +.Nm dc_descriptor_get_transports +.Nd Gets the transports supported by the given descriptor. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/descriptor.h +.Ft "unsigned int" +.Fo dc_descriptor_get_transports +.Fa "dc_descriptor_t *descriptor" +.Fc +.Sh DESCRIPTION +Gets the transports supported by the given +.Fa descriptor . +The +.Fa descriptor +usually found by searching through +.Xr dc_descriptor_iterator 3 . +.Sh RETURN VALUES +Returns a union (bitwise OR) of the transports supported by the given +.Fa descriptor . +.Pp +The result is combination of +.Dv DC_TRANSPORT_USB , +.Dv DC_TRANSPORT_USBHID , +.Dv DC_TRANSPORT_BLE , +.Dv DC_TRANSPORT_BLUETOOTH , +.Dv DC_TRANSPORT_SERIAL , +.Dv DC_TRANSPORT_IRDA +.Pp +To determine if a specific transport is supported use the following code +.Bd -literal -offset indent +unsigned int transports = dc_descriptor_get_transports(descriptor); +if(transports & DC_TRANSPORT_USBHID) { + // Device supports USB HID as transport +} +.Ed +.Sh SEE ALSO +.Xr dc_descriptor_iterator 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_device_open.3 b/doc/man/dc_device_open.3 index 265d129..3ba335f 100644 --- a/doc/man/dc_device_open.3 +++ b/doc/man/dc_device_open.3 @@ -18,7 +18,7 @@ .\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, .\" MA 02110-1301 USA .\" -.Dd January 5, 2017 +.Dd June 5, 2020 .Dt DC_DEVICE_OPEN 3 .Os .Sh NAME @@ -33,7 +33,7 @@ .Fa "dc_device_t **device" .Fa "dc_context_t *context" .Fa "dc_descriptor_t *descriptor" -.Fa "const char *name" +.Fa "dc_iostream_t *iostream" .Fc .Sh DESCRIPTION Open a dive computer device for processing. @@ -45,19 +45,14 @@ a dive computer .Fa descriptor usually found by searching through .Xr dc_descriptor_iterator 3 , -and a platform-specific device -.Fa name -.Po -such as -.Pa /dev/ttyUSBx -on Linux, -.Pa /dev/tty.xxx -on Mac OS X, -.Pa /dev/ttyUx -on the BSDs, +and a +.Fa iostream +opened with a transport specific open function like +.Xr dc_usbhid_open 3 , +.Xr dc_irda_open 3 , +.Xr dc_serial_open 3 , or -.Pa COMx -on Microsoft Windows +.Xr dc_bluetooth_open 3 .Pc . .Pp Upon returning @@ -83,6 +78,10 @@ The library was written by .An Jef Driesen , .Mt jef@libdivecomputer.org . +.br The manpages were written by .An Kristaps Dzonsons , .Mt kristaps@bsd.lv . +and +.An Vincent Hagen , +.Mt vinnie@script4web.nl \ No newline at end of file diff --git a/doc/man/dc_iostream_close.3 b/doc/man/dc_iostream_close.3 new file mode 100644 index 0000000..2f3b67b --- /dev/null +++ b/doc/man/dc_iostream_close.3 @@ -0,0 +1,60 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_IOSTREAM_CLOSE 3 +.Os +.Sh NAME +.Nm dc_iostream_close +.Nd Close the I/O stream and free all resources. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/iostream.h +.Ft dc_status_t +.Fo dc_iostream_close +.Fa "dc_iostream_t *iostream" +.Fc +.Sh DESCRIPTION +Close the I/O stream and free all resources. +Accepts the +.Fa iostream +to close and free. +.Sh RETURN VALUES +Returns +.Dv DC_STATUS_SUCCESS +on success, or another +.Ft dc_status_t +code on failure. +.Sh SEE ALSO +.Xr dc_usbhid_open 3 , +.Xr dc_serial_open 3 , +.Xr dc_irda_open 3 , +.Xr dc_bluetooth_open 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_irda_device_free.3 b/doc/man/dc_irda_device_free.3 new file mode 100644 index 0000000..bf0926f --- /dev/null +++ b/doc/man/dc_irda_device_free.3 @@ -0,0 +1,52 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_IRDA_DEVICE_FREE 3 +.Os +.Sh NAME +.Nm dc_irda_device_free +.Nd Destroy the irda device and free all resources. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/irda.h +.Ft void +.Fo dc_irda_device_free +.Fa "dc_irda_device_t *device" +.Fc +.Sh DESCRIPTION +Destroy the irda device and free all resources. +The irda +.Fa device +usually found by searching through +.Xr dc_irda_iterator_new 3 . +.Sh SEE ALSO +.Xr dc_irda_iterator_new 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_irda_device_get_address.3 b/doc/man/dc_irda_device_get_address.3 new file mode 100644 index 0000000..6cf4323 --- /dev/null +++ b/doc/man/dc_irda_device_get_address.3 @@ -0,0 +1,59 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_IRDA_DEVICE_GET_ADDRESS 3 +.Os +.Sh NAME +.Nm dc_irda_device_get_address +.Nd Get the address of the IrDA device. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/irda.h +.Ft "unsigned int" +.Fo dc_irda_device_get_address +.Fa "dc_irda_device_t *device" +.Fc +.Sh DESCRIPTION +Get the address of the IrDA device. Return value used for opening a IrDA device using +.Xr dc_irda_open 3 . +Requires a valid irda +.Fa device +of type +.Ft dc_irda_device_t +which can be retrieved using +.Xr dc_irda_iterator_new 3 . +.Sh RETURN VALUES +Returns the IrDA address of given IrDA +.Fa device +.Sh SEE ALSO +.Xr dc_irda_open 3 , +.Xr dc_irda_device_get_name 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_irda_device_get_name.3 b/doc/man/dc_irda_device_get_name.3 new file mode 100644 index 0000000..942ea6d --- /dev/null +++ b/doc/man/dc_irda_device_get_name.3 @@ -0,0 +1,58 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_IRDA_DEVICE_GET_NAME 3 +.Os +.Sh NAME +.Nm dc_irda_device_get_name +.Nd Get the address of the IrDA device. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/irda.h +.Ft "const char *" +.Fo dc_irda_device_get_name +.Fa "dc_irda_device_t *device" +.Fc +.Sh DESCRIPTION +Get the name of the IrDA device. Used for displaying. +Requires a valid irda +.Fa device +of type +.Ft dc_irda_device_t +which can be retrieved using +.Xr dc_irda_iterator_new 3 . +.Sh RETURN VALUES +Returns the IrDA name of given +.Fa irda_device +.Sh SEE ALSO +.Xr dc_irda_device_get_address 3 . +.Xr dc_irda_iterator_new 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_irda_iterator_new.3 b/doc/man/dc_irda_iterator_new.3 new file mode 100644 index 0000000..b24f73d --- /dev/null +++ b/doc/man/dc_irda_iterator_new.3 @@ -0,0 +1,102 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_IRDA_ITERATOR_NEW 3 +.Os +.Sh NAME +.Nm dc_irda_iterator_new +.Nd Create an iterator to enumerate the IrDA devices. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/irda.h +.Ft dc_status_t +.Fo dc_irda_iterator_new +.Fa "dc_iterator_t **iterator" +.Fa "dc_context_t *context" +.Fa "dc_descriptor_t *descriptor" +.Fc +.Sh DESCRIPTION +Iterates through the available IrDA devices which matches the given +.Fa descriptor . +Accepts a +.Fa context +opened with +.Xr dc_context_new 3 +and a +.Fa descriptor +usually found by searching through +.Xr dc_descriptor_iterator 3 . +.Pp +On returning +.Dv DC_STATUS_SUCCESS +the +.Fa iterator +will be set to an +.Ft dc_iterator_t +which can be used to iterate the available IrDA devices using +.Xr dc_iterator_next 3 . +.Pp +The value type of the iterator is of type +.Ft dc_irda_device_t . +This value can be used in functions to extract information about this specific IrDA device, namely +.Xr dc_irda_device_get_name 3 +and +.Xr dc_irda_device_get_address 3 . +When done the IrDA device needs to be freed with +.Xr dc_irda_device_free 3 . +.Pp +After iterating the +.Fa iterator +needs to be freed using +.Xr dc_iterator_free 3 . + +.Sh RETURN VALUES +Returns +.Dv DC_STATUS_SUCCESS +on success, or another +.Ft dc_status_t +code on failure. + +On +.Dv DC_STATUS_SUCCESS +the returned +.Fa iterator +needs to be freed when done using +.Xr dc_iterator_free 3 . +.Sh SEE ALSO +.Xr dc_context_new 3 , +.Xr dc_usbhid_iterator_new 3 , +.Xr dc_serial_iterator_new 3 , +.Xr dc_bluetooth_iterator_new 3 , +.Xr dc_irda_device_get_name 3 , +.Xr dc_irda_device_get_address 3 , +.Xr dc_irda_device_free 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_irda_open.3 b/doc/man/dc_irda_open.3 new file mode 100644 index 0000000..53d92df --- /dev/null +++ b/doc/man/dc_irda_open.3 @@ -0,0 +1,85 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_IRDA_OPEN 3 +.Os +.Sh NAME +.Nm dc_irda_open +.Nd Opens an iostream for a IrDA device +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/irda.h +.Ft dc_status_t +.Fo dc_irda_open +.Fa "dc_iostream_t **iostream" +.Fa "dc_context_t *context" +.Fa "unsigned int address" +.Fa "unsigned int lsap" +.Fc +.Sh DESCRIPTION +Opens an iostream for a IrDA (Infra Red) device. +Accepts a +.Fa context +opened with +.Xr dc_context_new 3 , +.Fa address +given through +.Xr dc_irda_iterator_new 3 +together with +.Xr dc_irda_device_get_address 3 +, the last argument +.Fa lsap +is a port number used during the communication. Currently only Uwatec computers use IrDA comminication and for those the +.Fa lsap +can be hardcoded to 1 +.Pp +Upon returning +.Dv DC_STATUS_SUCCESS , +the +.Fa iostream +pointer must be freed with +.Xr dc_iostream_close 3 . +.Sh RETURN VALUES +Returns +.Dv DC_STATUS_SUCCESS +on success or one of several error values on error. +On success, the +.Fa iostream +pointer is filled in with an open handle. +.Sh SEE ALSO +.Xr dc_context_new 3 , +.Xr dc_iostream_close 3 , +.Xr dc_serial_open 3 , +.Xr dc_usbhid_open 3 , +.Xr dc_bluetooth_open 3 , +.Xr dc_irda_iterator_new 3 , +.Xr dc_irda_device_get_address 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . \ No newline at end of file diff --git a/doc/man/dc_parser_get_field.3 b/doc/man/dc_parser_get_field.3 index 2b276a1..a4c33f2 100644 --- a/doc/man/dc_parser_get_field.3 +++ b/doc/man/dc_parser_get_field.3 @@ -149,7 +149,7 @@ the tank volume units as or .Dv DC_TANKVOLUME_METRIC ; .Va volume , -the tank volume in bar or zero if the tank is +the tank volume in litres or zero if the tank is .Dv DC_TANKVOLUME_NONE ; .Va workpressure , the work pressure in bar or zero if diff --git a/doc/man/dc_parser_samples_foreach.3 b/doc/man/dc_parser_samples_foreach.3 index 5a92011..5ac5554 100644 --- a/doc/man/dc_parser_samples_foreach.3 +++ b/doc/man/dc_parser_samples_foreach.3 @@ -126,7 +126,7 @@ Sets the .Fa rbt field. .It Dv DC_SAMPLE_HEARTBEAT -The diver's heartbeet in beats per minute. +The diver's heartbeat in beats per minute. Sets the .Fa heartbeat field. diff --git a/doc/man/dc_serial_device_free.3 b/doc/man/dc_serial_device_free.3 new file mode 100644 index 0000000..5ee78b5 --- /dev/null +++ b/doc/man/dc_serial_device_free.3 @@ -0,0 +1,52 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_SERIAL_DEVICE_FREE 3 +.Os +.Sh NAME +.Nm dc_serial_device_free +.Nd Destroy the serial device and free all resources. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/serial.h +.Ft void +.Fo dc_serial_device_free +.Fa "dc_serial_device_t *device" +.Fc +.Sh DESCRIPTION +Destroy the serial device and free all resources. +The serial +.Fa device +usually found by searching through +.Xr dc_serial_iterator_new 3 . +.Sh SEE ALSO +.Xr dc_serial_iterator_new 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_serial_device_get_name.3 b/doc/man/dc_serial_device_get_name.3 new file mode 100644 index 0000000..88c4e68 --- /dev/null +++ b/doc/man/dc_serial_device_get_name.3 @@ -0,0 +1,59 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_SERIAL_DEVICE_GET_NAME 3 +.Os +.Sh NAME +.Nm dc_serial_device_get_name +.Nd Get the device name of the serial device. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/serial.h +.Ft "const char *" +.Fo dc_serial_device_get_name +.Fa "dc_serial_device_t *device" +.Fc +.Sh DESCRIPTION +Get the device node of the serial device. Used when opening serial transport with +.Xr dc_serial_open 3 . +Requires a valid serial +.Fa device +of type +.Ft dc_serial_device_t +which can be retrieved using +.Xr dc_serial_iterator_new 3 . +.Sh RETURN VALUES +Returns the device name of given serial +.Fa device +.Sh SEE ALSO +.Xr dc_serial_open 3 , +.Xr dc_serial_iterator_new 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_serial_iterator_new.3 b/doc/man/dc_serial_iterator_new.3 new file mode 100644 index 0000000..91ad54c --- /dev/null +++ b/doc/man/dc_serial_iterator_new.3 @@ -0,0 +1,99 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_SERIAL_ITERATOR_NEW 3 +.Os +.Sh NAME +.Nm dc_serial_iterator_new +.Nd Create an iterator to enumerate the serial devices. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/serial.h +.Ft dc_status_t +.Fo dc_serial_iterator_new +.Fa "dc_iterator_t **iterator" +.Fa "dc_context_t *context" +.Fa "dc_descriptor_t *descriptor" +.Fc +.Sh DESCRIPTION +Iterates through the available serial devices matching the given +.Fa descriptor . +Accepts a +.Fa context +opened with +.Xr dc_context_new 3 +and a +.Fa descriptor +usually found by searching through +.Xr dc_descriptor_iterator 3 . +.Pp +On returning +.Dv DC_STATUS_SUCCESS +the +.Fa iterator +will be set to an +.Ft dc_iterator_t +which can be used to iterate the available serial devices using +.Xr dc_iterator_next 3 . +.Pp +The value type of the iterator is of type +.Ft dc_serial_device_t . +This value can be used in functions to extract information about this specific serial device, namely +.Xr dc_serial_device_get_name 3 +When done the serial device needs to be freed with +.Xr dc_serial_device_free 3 . +.Pp +After iterating the +.Fa iterator +needs to be freed using +.Xr dc_iterator_free 3 . + +.Sh RETURN VALUES +Returns +.Dv DC_STATUS_SUCCESS +on success, or another +.Ft dc_status_t +code on failure. + +On +.Dv DC_STATUS_SUCCESS +the returned +.Fa iterator +needs to be freed when done using +.Xr dc_iterator_free 3 . +.Sh SEE ALSO +.Xr dc_context_new 3 , +.Xr dc_usbhid_iterator_new 3 , +.Xr dc_irda_iterator_new 3 , +.Xr dc_bluetooth_iterator_new 3 , +.Xr dc_serial_device_get_name 3 , +.Xr dc_serial_device_free 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_serial_open.3 b/doc/man/dc_serial_open.3 new file mode 100644 index 0000000..df8547c --- /dev/null +++ b/doc/man/dc_serial_open.3 @@ -0,0 +1,80 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_SERIAL_OPEN 3 +.Os +.Sh NAME +.Nm dc_serial_open +.Nd Opens an iostream for a serial device +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/serial.h +.Ft dc_status_t +.Fo dc_serial_open +.Fa "dc_iostream_t **iostream" +.Fa "dc_context_t *context" +.Fa "const char *name" +.Fc +.Sh DESCRIPTION +Opens an iostream for a serial device. +Accepts a +.Fa context +opened with +.Xr dc_context_new 3 +and a +.Fa name +device name, usually found through +.Xr dc_serial_iterator_new 3 +with +.Xr dc_serial_device_get_name 3 . +.Pp +Upon returning +.Dv DC_STATUS_SUCCESS , +the +.Fa iostream +pointer must be freed with +.Xr dc_iostream_close 3 . +.Sh RETURN VALUES +Returns +.Dv DC_STATUS_SUCCESS +on success or one of several error values on error. +On success, the +.Fa iostream +pointer is filled in with an open handle. +.Sh SEE ALSO +.Xr dc_context_new 3 , +.Xr dc_iostream_close 3 , +.Xr dc_usbhid_open 3 , +.Xr dc_irda_open 3 , +.Xr dc_bluetooth_open 3 , +.Xr dc_serial_iterator_new 3 , +.Xr dc_serial_device_get_name 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_usbhid_device_free.3 b/doc/man/dc_usbhid_device_free.3 new file mode 100644 index 0000000..a4bb94a --- /dev/null +++ b/doc/man/dc_usbhid_device_free.3 @@ -0,0 +1,52 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_USBHID_DEVICE_FREE 3 +.Os +.Sh NAME +.Nm dc_usbhid_device_free +.Nd Destroy the USB HID device and free all resources. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/usbhid.h +.Ft void +.Fo dc_usbhid_device_free +.Fa "dc_usbhid_device_t *device" +.Fc +.Sh DESCRIPTION +Destroy the USB HID device and free all resources. +The usbhid +.Fa device +usually found by searching through +.Xr dc_usbhid_iterator_new 3 . +.Sh SEE ALSO +.Xr dc_usbhid_iterator_new 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_usbhid_device_get_pid.3 b/doc/man/dc_usbhid_device_get_pid.3 new file mode 100644 index 0000000..6a371c5 --- /dev/null +++ b/doc/man/dc_usbhid_device_get_pid.3 @@ -0,0 +1,58 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_USBHID_DEVICE_GET_PID 3 +.Os +.Sh NAME +.Nm dc_usbhid_device_get_pid +.Nd Get the product id (PID) of the USB HID device. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/usbhid.h +.Ft "unsigned int" +.Fo dc_usbhid_device_get_pid +.Fa "dc_usbhid_device_t *device" +.Fc +.Sh DESCRIPTION +Get the product id (PID) of the USB HID device. Used for displaying. +Requires a valid usbhid +.Fa device +of type +.Ft dc_usbhid_device_t +which can be retrieved using +.Xr dc_usbhid_iterator_new 3 . +.Sh RETURN VALUES +Returns the product id (PID) of given +.Fa usbhid_device +.Sh SEE ALSO +.Xr dc_usbhid_device_get_vid 3 , +.Xr dc_usbhid_iterator_new 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_usbhid_device_get_vid.3 b/doc/man/dc_usbhid_device_get_vid.3 new file mode 100644 index 0000000..e82ac53 --- /dev/null +++ b/doc/man/dc_usbhid_device_get_vid.3 @@ -0,0 +1,58 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_USBHID_DEVICE_GET_VID 3 +.Os +.Sh NAME +.Nm dc_usbhid_device_get_vid +.Nd Get the vendor id (VID) of the USB HID device. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/usbhid.h +.Ft "unsigned int" +.Fo dc_usbhid_device_get_vid +.Fa "dc_usbhid_device_t *device" +.Fc +.Sh DESCRIPTION +Get the vendor id (VID) of the USB HID device. Used for displaying. +Requires a valid usbhid +.Fa device +of type +.Ft dc_usbhid_device_t +which can be retrieved using +.Xr dc_usbhid_iterator_new 3 . +.Sh RETURN VALUES +Returns the vendor id (VID) of given usbhid +.Fa device +.Sh SEE ALSO +.Xr dc_usbhid_device_get_vid 3 , +.Xr dc_usbhid_iterator_new 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_usbhid_iterator_new.3 b/doc/man/dc_usbhid_iterator_new.3 new file mode 100644 index 0000000..0778d38 --- /dev/null +++ b/doc/man/dc_usbhid_iterator_new.3 @@ -0,0 +1,101 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_USBHID_ITERATOR_NEW 3 +.Os +.Sh NAME +.Nm dc_usbhid_iterator_new +.Nd Create an iterator to enumerate the USB HID devices. +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/usbhid.h +.Ft dc_status_t +.Fo dc_usbhid_iterator_new +.Fa "dc_iterator_t **iterator" +.Fa "dc_context_t *context" +.Fa "dc_descriptor_t *descriptor" +.Fc +.Sh DESCRIPTION +Iterates through the available USB HID devices matching the given +.Fa descriptor . +Accepts a +.Fa context +opened with +.Xr dc_context_new 3 +and a +.Fa descriptor +usually found by searching through +.Xr dc_descriptor_iterator 3 . +.Pp +On returning +.Dv DC_STATUS_SUCCESS +the +.Fa iterator +will be set to an +.Ft dc_iterator_t +which can be used to iterate the available USB HID devices using +.Xr dc_iterator_next 3 . +.Pp +The value type of the iterator is of type +.Ft dc_usbhid_device_t . +This value can be used in functions to extract information about this specific USB HID device, namely +.Xr dc_usbhid_device_get_pid 3 +and +.Xr dc_usbhid_device_get_vid 3 . +When done the USB HID device needs to be freed with +.Xr dc_usbhid_device_free 3 . +.Pp +After iterating the +.Fa iterator +needs to be freed using +.Xr dc_iterator_free 3 . + +.Sh RETURN VALUES +Returns +.Dv DC_STATUS_SUCCESS +on success, or another +.Ft dc_status_t +code on failure. + +On +.Dv DC_STATUS_SUCCESS +the returned +.Fa iterator +needs to be freed when done using +.Xr dc_iterator_free 3 . +.Sh SEE ALSO +.Xr dc_context_new 3 , +.Xr dc_bluetooth_iterator_new 3 , +.Xr dc_serial_iterator_new 3 , +.Xr dc_irda_iterator_new 3 , +.Xr dc_usbhid_device_get_pid 3 , +.Xr dc_usbhid_device_get_vid 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . diff --git a/doc/man/dc_usbhid_open.3 b/doc/man/dc_usbhid_open.3 new file mode 100644 index 0000000..e7dce39 --- /dev/null +++ b/doc/man/dc_usbhid_open.3 @@ -0,0 +1,77 @@ +.\" +.\" libdivecomputer +.\" +.\" Copyright (C) 2020 Vincent Hagen +.\" +.\" This library is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU Lesser General Public +.\" License as published by the Free Software Foundation; either +.\" version 2.1 of the License, or (at your option) any later version. +.\" +.\" This library is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +.\" Lesser General Public License for more details. +.\" +.\" You should have received a copy of the GNU Lesser General Public +.\" License along with this library; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +.Dd June 5, 2020 +.Dt DC_USBHID_OPEN 3 +.Os +.Sh NAME +.Nm dc_usbhid_open +.Nd Opens an iostream for a USB HID device +.Sh LIBRARY +.Lb libdivecomputer +.Sh SYNOPSIS +.In libdivecomputer/usbhid.h +.Ft dc_status_t +.Fo dc_usbhid_open +.Fa "dc_iostream_t **iostream" +.Fa "dc_context_t *context" +.Fa "dc_usbhid_device_t *device" +.Fc +.Sh DESCRIPTION +Opens an iostream for a USB HID device. +Accepts a +.Fa context +opened with +.Xr dc_context_new 3 +and a +.Fa device +usually found by searching through +.Xr dc_usbhid_iterator_new 3 . +.Pp +Upon returning +.Dv DC_STATUS_SUCCESS , +the +.Fa iostream +pointer must be freed with +.Xr dc_iostream_close 3 . +.Sh RETURN VALUES +Returns +.Dv DC_STATUS_SUCCESS +on success or one of several error values on error. +On success, the +.Fa iostream +pointer is filled in with an open handle. +.Sh SEE ALSO +.Xr dc_context_new 3 , +.Xr dc_usbhid_iterator_new 3 , +.Xr dc_iostream_close 3 , +.Xr dc_serial_open 3 , +.Xr dc_irda_open 3 , +.Xr dc_bluetooth_open 3 . +.Sh AUTHORS +The +.Lb libdivecomputer +library was written by +.An Jef Driesen , +.Mt jef@libdivecomputer.org . +.br +This manpage is written by +.An Vincent Hagen , +.Mt vinnie@script4web.nl . \ No newline at end of file diff --git a/doc/man/libdivecomputer.3 b/doc/man/libdivecomputer.3 index c85f140..4e1f601 100644 --- a/doc/man/libdivecomputer.3 +++ b/doc/man/libdivecomputer.3 @@ -41,9 +41,8 @@ these steps: .Bl -enum .It Create a new context with -.Xr dc_context_new 3 . -This supplies a parse context: logging, error handling, etc. -Override the values with +.Xr dc_context_new 3 +to initialize the library. Logging can be controlled with .Xr dc_context_set_logfunc 3 and .Xr dc_context_set_loglevel 3 . @@ -52,11 +51,28 @@ Find a descriptor for their dive computer by iterating through .Xr dc_descriptor_iterator 3 and searching by name, vendor, or product family. .It -Open the hardware device to which the dive computer is connected with -.Xr dc_device_open 3 , -then invoke +Find the transport to use for the communication. To determine the supported transports use +.Xr dc_descriptor_get_transports 3 . +.It +Find the hardware device corresponding to the connected dive computer by iterating through +.Xr dc_usbhid_iterator_new 3 , +.Xr dc_serial_iterator_new 3 , +.Xr dc_irda_iterator_new 3 +or +.Xr dc_bluetooth_iterator_new 3 . +.It +Open the transport communcations with +.Xr dc_usbhid_open 3 , +.Xr dc_serial_open 3 , +.Xr dc_irda_open 3 +or +.Xr dc_bluetooth_open 3 . +.It +Open a connection to the dive computer with +.Xr dc_device_open 3 . +Optionally use .Xr dc_device_set_events 3 , -.Xr dc_device_set_fingerprint 3 , +.Xr dc_device_set_fingerprint 3 and .Xr dc_device_set_cancel 3 to set the logging events, last-seen fingerprint, and cancel routine, @@ -71,8 +87,9 @@ and set the parsed data with .Xr dc_parser_set_data 3 . .It Get attributes of the parsed dive with -.Xr dc_parser_get_field 3 , -then iterate through the dive's samples (recorded data) with +.Xr dc_parser_get_field 3 . +.It +Iterate through the dive's samples (recorded data) with .Xr dc_parser_samples_foreach 3 . .El .Sh RETURN VALUES @@ -129,7 +146,10 @@ return .Dv DC_STATUS_SUCCESS . .El .Sh SEE ALSO -.Xr dc_buffer_new 3 +.Xr dc_context_new 3 , +.Xr dc_descriptor_iterator 3 +.Xr dc_device_open 3 +.Xr dc_parser_new 3 .Sh AUTHORS The .Lb libdivecomputer From c065a784021784b05a9a1979252cfd65e237f1ac Mon Sep 17 00:00:00 2001 From: Vincent Hagen Date: Fri, 5 Jun 2020 13:21:40 +0200 Subject: [PATCH 7/7] Update the gitignore file --- .gitignore | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index 09c89bf..85901e8 100644 --- a/.gitignore +++ b/.gitignore @@ -37,32 +37,7 @@ Makefile.in /doc/html/ /doc/latex/ -/examples/aladin -/examples/atom2 -/examples/d9 -/examples/darwin -/examples/edy -/examples/eon -/examples/frog -/examples/iconhd -/examples/leonardo -/examples/memomouse -/examples/n2ition3 -/examples/nemo -/examples/ostc -/examples/ostc-fwupdate -/examples/predator -/examples/puck -/examples/sensus -/examples/sensuspro -/examples/sensusultra -/examples/smart -/examples/solution -/examples/universal -/examples/veo250 -/examples/vtpro -/examples/vyper -/examples/vyper2 +/examples/dctool /include/libdivecomputer/version.h