dc_status_t dc_parser_new2 (dc_parser_t **out, dc_context_t *context, dc_descriptor_t *descriptor, unsigned int devtime, dc_ticks_t systime) { return dc_parser_new_internal (out, context, dc_descriptor_get_type (descriptor), dc_descriptor_get_model (descriptor), devtime, systime); }
static dc_descriptor_t *ostc_get_data_descriptor(int data_model, dc_family_t data_fam) { dc_descriptor_t *descriptor = NULL, *current = NULL;; dc_iterator_t *iterator = NULL; dc_status_t rc; rc = dc_descriptor_iterator(&iterator); if (rc != DC_STATUS_SUCCESS) { fprintf(stderr,"Error creating the device descriptor iterator.\n"); return current; } while ((dc_iterator_next(iterator, &descriptor)) == DC_STATUS_SUCCESS) { int desc_model = dc_descriptor_get_model(descriptor); dc_family_t desc_fam = dc_descriptor_get_type(descriptor); if (data_model == desc_model && data_fam == desc_fam) { current = descriptor; break; } dc_descriptor_free(descriptor); } dc_iterator_free(iterator); return current; }
dc_status_t dc_device_open (dc_device_t **out, dc_context_t *context, dc_descriptor_t *descriptor, const char *name) { dc_status_t rc = DC_STATUS_SUCCESS; dc_device_t *device = NULL; if (out == NULL || descriptor == NULL) return DC_STATUS_INVALIDARGS; switch (dc_descriptor_get_type (descriptor)) { case DC_FAMILY_SUUNTO_SOLUTION: rc = suunto_solution_device_open (&device, context, name); break; case DC_FAMILY_SUUNTO_EON: rc = suunto_eon_device_open (&device, context, name); break; case DC_FAMILY_SUUNTO_VYPER: rc = suunto_vyper_device_open (&device, context, name); break; case DC_FAMILY_SUUNTO_VYPER2: rc = suunto_vyper2_device_open (&device, context, name); break; case DC_FAMILY_SUUNTO_D9: rc = suunto_d9_device_open (&device, context, name, dc_descriptor_get_model (descriptor)); break; case DC_FAMILY_UWATEC_ALADIN: rc = uwatec_aladin_device_open (&device, context, name); break; case DC_FAMILY_UWATEC_MEMOMOUSE: rc = uwatec_memomouse_device_open (&device, context, name); break; case DC_FAMILY_UWATEC_SMART: rc = uwatec_smart_device_open (&device, context); break; case DC_FAMILY_REEFNET_SENSUS: rc = reefnet_sensus_device_open (&device, context, name); break; case DC_FAMILY_REEFNET_SENSUSPRO: rc = reefnet_sensuspro_device_open (&device, context, name); break; case DC_FAMILY_REEFNET_SENSUSULTRA: rc = reefnet_sensusultra_device_open (&device, context, name); break; case DC_FAMILY_OCEANIC_VTPRO: rc = oceanic_vtpro_device_open (&device, context, name); break; case DC_FAMILY_OCEANIC_VEO250: rc = oceanic_veo250_device_open (&device, context, name); break; case DC_FAMILY_OCEANIC_ATOM2: rc = oceanic_atom2_device_open (&device, context, name); break; case DC_FAMILY_MARES_NEMO: rc = mares_nemo_device_open (&device, context, name); break; case DC_FAMILY_MARES_PUCK: rc = mares_puck_device_open (&device, context, name); break; case DC_FAMILY_MARES_DARWIN: rc = mares_darwin_device_open (&device, context, name, dc_descriptor_get_model (descriptor)); break; case DC_FAMILY_MARES_ICONHD: rc = mares_iconhd_device_open (&device, context, name, dc_descriptor_get_model (descriptor)); break; case DC_FAMILY_HW_OSTC: rc = hw_ostc_device_open (&device, context, name); break; case DC_FAMILY_HW_FROG: rc = hw_frog_device_open (&device, context, name); break; case DC_FAMILY_HW_OSTC3: rc = hw_ostc3_device_open (&device, context, name); break; case DC_FAMILY_CRESSI_EDY: rc = cressi_edy_device_open (&device, context, name); break; case DC_FAMILY_CRESSI_LEONARDO: rc = cressi_leonardo_device_open (&device, context, name); break; case DC_FAMILY_ZEAGLE_N2ITION3: rc = zeagle_n2ition3_device_open (&device, context, name); break; case DC_FAMILY_ATOMICS_COBALT: rc = atomics_cobalt_device_open (&device, context); break; case DC_FAMILY_SHEARWATER_PREDATOR: rc = shearwater_predator_device_open (&device, context, name); break; case DC_FAMILY_SHEARWATER_PETREL: rc = shearwater_petrel_device_open (&device, context, name); break; default: return DC_STATUS_INVALIDARGS; } *out = device; return rc; }
int libdc_driver_open(dev_handle_t abstract, const char * devpath, const char * args) { libdc_device_t dev = (libdc_device_t)(abstract); if (dev == NULL) { errno = EINVAL; return -1; } // Parse the Argument List arglist_t arglist; int rc = arglist_parse(& arglist, args); if (rc != 0) { dev->errcode = DRIVER_ERR_INVALID; dev->errmsg = "Invalid Argument String"; return -1; } // Load a Device Descriptor based on the Model argument rc = arglist_read_uint(arglist, "model", & dev->modelid); if (rc != 0) { dev->errcode = DRIVER_ERR_INVALID; dev->errmsg = "Missing 'model' Argument"; return -1; } int i, found = 0; for (i = 0; g_libdc_plugin_devtable[i].id != -1; ++i) { if (g_libdc_plugin_devtable[i].id == dev->modelid) { found = 1; dev->family = g_libdc_plugin_devtable[i].family; dev->model = g_libdc_plugin_devtable[i].model; } } if (! found) { dev->errcode = DRIVER_ERR_UNSUPPORTED; dev->errmsg = "Unsupported 'model' Argument"; return -1; } dc_iterator_t * iterator = NULL; dc_descriptor_t * descriptor = NULL; dc_descriptor_iterator(& iterator); while (dc_iterator_next(iterator, &descriptor) == DC_STATUS_SUCCESS) { if ((dc_descriptor_get_type(descriptor) == dev->family) && (dc_descriptor_get_model(descriptor) == dev->model)) { dev->descriptor = descriptor; } } dc_iterator_free(iterator); if (dev->descriptor == NULL) { dev->errcode = DRIVER_ERR_UNSUPPORTED; dev->errmsg = "Could not load descriptor for model"; return -1; } // Open the Device dc_status_t ret = dc_device_open(& dev->device, dev->context, dev->descriptor, devpath); if (ret != DC_STATUS_SUCCESS) { dev->errcode = DRIVER_ERR_NO_DEVICE; dev->errmsg = "Failed to connect to device"; return -1; } // Register the Event and Cancel Handlers int events = DC_EVENT_PROGRESS | DC_EVENT_DEVINFO | DC_EVENT_CLOCK; dc_device_set_events (dev->device, events, libdc_event_cb, dev); dc_device_set_cancel (dev->device, libdc_cancel_cb, dev); return DRIVER_ERR_SUCCESS; }
static dc_status_t search(dc_descriptor_t **out, const char *name, dc_family_t backend, unsigned int model) { dc_status_t rc = DC_STATUS_SUCCESS; dc_iterator_t *iterator = NULL; rc = dc_descriptor_iterator(&iterator); if (rc != DC_STATUS_SUCCESS) { WARNING("Error creating the device descriptor iterator."); return rc; } dc_descriptor_t *descriptor = NULL, *current = NULL; while ((rc = dc_iterator_next(iterator, &descriptor)) == DC_STATUS_SUCCESS) { if (name) { const char *vendor = dc_descriptor_get_vendor(descriptor); const char *product = dc_descriptor_get_product(descriptor); size_t n = strlen(vendor); if (strncasecmp(name, vendor, n) == 0 && name[n] == ' ' && strcasecmp(name + n + 1, product) == 0) { current = descriptor; break; } else if (strcasecmp(name, product) == 0) { current = descriptor; break; } } else { if (backend == dc_descriptor_get_type(descriptor)) { if (model == dc_descriptor_get_model(descriptor)) { /* Exact match found. Return immediately */ dc_descriptor_free(current); current = descriptor; break; } else { /* Possible match found. Keep searching for an exact match. * If no exact match is found, return the first match found. */ if (current == NULL) { current = descriptor; descriptor = NULL; } } } } dc_descriptor_free(descriptor); } if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_DONE) { dc_descriptor_free(current); dc_iterator_free(iterator); WARNING("Error iterating the device descriptor."); return rc; } dc_iterator_free(iterator); *out = current; return DC_STATUS_SUCCESS; }