diff options
-rw-r--r-- | core/libdivecomputer.c | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/core/libdivecomputer.c b/core/libdivecomputer.c index 47480a5b4..9787ab826 100644 --- a/core/libdivecomputer.c +++ b/core/libdivecomputer.c @@ -434,6 +434,17 @@ static void dev_info(device_data_t *devdata, const char *fmt, ...) static int import_dive_number = 0; +static void download_error(const char *fmt, ...) +{ + static char buffer[1024]; + va_list ap; + + va_start(ap, fmt); + vsnprintf(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + report_error("Dive %d: %s", import_dive_number, buffer); +} + static int parse_samples(device_data_t *devdata, struct divecomputer *dc, dc_parser_t *parser) { UNUSED(devdata); @@ -611,7 +622,7 @@ static dc_status_t libdc_header_parser(dc_parser_t *parser, device_data_t *devda rc = dc_parser_get_datetime(parser, &dt); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { - dev_info(devdata, translate("gettextFromC", "Error parsing the datetime")); + download_error(translate("gettextFromC", "Error parsing the datetime")); return rc; } @@ -635,7 +646,7 @@ static dc_status_t libdc_header_parser(dc_parser_t *parser, device_data_t *devda unsigned int divetime = 0; rc = dc_parser_get_field(parser, DC_FIELD_DIVETIME, 0, &divetime); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { - dev_info(devdata, translate("gettextFromC", "Error parsing the divetime")); + download_error(translate("gettextFromC", "Error parsing the divetime")); return rc; } if (rc == DC_STATUS_SUCCESS) @@ -645,7 +656,7 @@ static dc_status_t libdc_header_parser(dc_parser_t *parser, device_data_t *devda double maxdepth = 0.0; rc = dc_parser_get_field(parser, DC_FIELD_MAXDEPTH, 0, &maxdepth); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { - dev_info(devdata, translate("gettextFromC", "Error parsing the maxdepth")); + download_error(translate("gettextFromC", "Error parsing the maxdepth")); return rc; } if (rc == DC_STATUS_SUCCESS) @@ -659,7 +670,7 @@ static dc_status_t libdc_header_parser(dc_parser_t *parser, device_data_t *devda for (int i = 0; i < 3; i++) { rc = dc_parser_get_field(parser, temp_fields[i], 0, &temperature); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { - dev_info(devdata, translate("gettextFromC", "Error parsing temperature")); + download_error(translate("gettextFromC", "Error parsing temperature")); return rc; } if (rc == DC_STATUS_SUCCESS) @@ -678,7 +689,7 @@ static dc_status_t libdc_header_parser(dc_parser_t *parser, device_data_t *devda unsigned int ngases = 0; rc = dc_parser_get_field(parser, DC_FIELD_GASMIX_COUNT, 0, &ngases); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { - dev_info(devdata, translate("gettextFromC", "Error parsing the gas mix count")); + download_error(translate("gettextFromC", "Error parsing the gas mix count")); return rc; } @@ -689,7 +700,7 @@ static dc_status_t libdc_header_parser(dc_parser_t *parser, device_data_t *devda }; rc = dc_parser_get_field(parser, DC_FIELD_SALINITY, 0, &salinity); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { - dev_info(devdata, translate("gettextFromC", "Error obtaining water salinity")); + download_error(translate("gettextFromC", "Error obtaining water salinity")); return rc; } if (rc == DC_STATUS_SUCCESS) @@ -698,7 +709,7 @@ static dc_status_t libdc_header_parser(dc_parser_t *parser, device_data_t *devda double surface_pressure = 0; rc = dc_parser_get_field(parser, DC_FIELD_ATMOSPHERIC, 0, &surface_pressure); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { - dev_info(devdata, translate("gettextFromC", "Error obtaining surface pressure")); + download_error(translate("gettextFromC", "Error obtaining surface pressure")); return rc; } if (rc == DC_STATUS_SUCCESS) @@ -721,7 +732,7 @@ static dc_status_t libdc_header_parser(dc_parser_t *parser, device_data_t *devda dc_divemode_t divemode; rc = dc_parser_get_field(parser, DC_FIELD_DIVEMODE, 0, &divemode); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { - dev_info(devdata, translate("gettextFromC", "Error obtaining dive mode")); + download_error(translate("gettextFromC", "Error obtaining dive mode")); return rc; } if (rc == DC_STATUS_SUCCESS) @@ -743,7 +754,7 @@ static dc_status_t libdc_header_parser(dc_parser_t *parser, device_data_t *devda rc = parse_gasmixes(devdata, dive, parser, ngases); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { - dev_info(devdata, translate("gettextFromC", "Error parsing the gas mix")); + download_error(translate("gettextFromC", "Error parsing the gas mix")); return rc; } @@ -767,19 +778,20 @@ static int dive_cb(const unsigned char *data, unsigned int size, in_deco = false; current_gas_index = -1; + import_dive_number++; + rc = create_parser(devdata, &parser); if (rc != DC_STATUS_SUCCESS) { - dev_info(devdata, translate("gettextFromC", "Unable to create parser for %s %s"), devdata->vendor, devdata->product); + download_error(translate("gettextFromC", "Unable to create parser for %s %s"), devdata->vendor, devdata->product); return true; } rc = dc_parser_set_data(parser, data, size); if (rc != DC_STATUS_SUCCESS) { - dev_info(devdata, translate("gettextFromC", "Error registering the data")); + download_error(translate("gettextFromC", "Error registering the data")); goto error_exit; } - import_dive_number++; dive = alloc_dive(); // Fill in basic fields @@ -799,14 +811,14 @@ static int dive_cb(const unsigned char *data, unsigned int size, // Parse the dive's header data rc = libdc_header_parser (parser, devdata, dive); if (rc != DC_STATUS_SUCCESS) { - dev_info(devdata, translate("getextFromC", "Error parsing the header")); + download_error(translate("getextFromC", "Error parsing the header")); goto error_exit; } // Initialize the sample data. rc = parse_samples(devdata, &dive->dc, parser); if (rc != DC_STATUS_SUCCESS) { - dev_info(devdata, translate("gettextFromC", "Error parsing the samples")); + download_error(translate("gettextFromC", "Error parsing the samples")); goto error_exit; } @@ -1259,6 +1271,7 @@ dc_status_t divecomputer_device_open(device_data_t *data) #ifdef BT_SUPPORT if (transports & DC_TRANSPORT_BLUETOOTH) { + dev_info(data, "Opening rfcomm stream %s", data->devname); rc = rfcomm_stream_open(&data->iostream, context, data->devname); if (rc == DC_STATUS_SUCCESS) return rc; @@ -1267,6 +1280,7 @@ dc_status_t divecomputer_device_open(device_data_t *data) #ifdef BLE_SUPPORT if (transports & DC_TRANSPORT_BLE) { + dev_info(data, "Connecting to BLE device %s", data->devname); rc = ble_packet_open(&data->iostream, context, data->devname, data); if (rc == DC_STATUS_SUCCESS) return rc; @@ -1283,6 +1297,9 @@ dc_status_t divecomputer_device_open(device_data_t *data) dc_iterator_free (iterator); if (device) { + dev_info(data, "Opening USB HID device for %04x:%04x", + dc_usbhid_device_get_vid(device), + dc_usbhid_device_get_pid(device)); rc = dc_usbhid_open(&data->iostream, context, device); dc_usbhid_device_free(device); if (rc == DC_STATUS_SUCCESS) @@ -1291,10 +1308,13 @@ dc_status_t divecomputer_device_open(device_data_t *data) } /* The dive computer backend does this all internally */ - if (transports & DC_TRANSPORT_USB) + if (transports & DC_TRANSPORT_USB) { + dev_info(data, "Opening native USB device"); return DC_STATUS_SUCCESS; + } if (transports & DC_TRANSPORT_SERIAL) { + dev_info(data, "Opening serial device %s", data->devname); #ifdef SERIAL_FTDI if (!strcasecmp(data->devname, "ftdi")) return ftdi_open(&data->iostream, context); @@ -1321,12 +1341,14 @@ dc_status_t divecomputer_device_open(device_data_t *data) if (!address) address = strtoul(data->devname, NULL, 0); + dev_info(data, "Opening IRDA address %u", address); rc = dc_irda_open(&data->iostream, context, address, 1); if (rc == DC_STATUS_SUCCESS) return rc; } if (transports & DC_TRANSPORT_USBSTORAGE) { + dev_info(data, "Opening USB storage at %s", data->devname); rc = dc_usb_storage_open(&data->iostream, context, data->devname); if (rc == DC_STATUS_SUCCESS) return rc; @@ -1372,6 +1394,7 @@ const char *do_libdivecomputer_import(device_data_t *data) if (rc != DC_STATUS_SUCCESS) { report_error(errmsg(rc)); } else { + dev_info(data, "Connecting ..."); rc = dc_device_open(&data->device, data->context, data->descriptor, data->iostream); INFO(0, "dc_device_open error value of %d", rc); if (rc != DC_STATUS_SUCCESS && subsurface_access(data->devname, R_OK | W_OK) != 0) @@ -1381,6 +1404,7 @@ const char *do_libdivecomputer_import(device_data_t *data) err = translate("gettextFromC", "Error opening the device %s %s (%s).\nIn most cases, in order to debug this issue, a libdivecomputer logfile will be useful.\nYou can create this logfile by selecting the corresponding checkbox in the download dialog."); #endif if (rc == DC_STATUS_SUCCESS) { + dev_info(data, "Starting import ..."); err = do_device_import(data); /* TODO: Show the logfile to the user on error. */ dc_device_close(data->device); |