Device-FTDI

 view release on metacpan or  search on metacpan

FTDI.xs  view on Meta::CPAN

	    goto ERROR_EXIT;
	}

	if (ftdi_usb_get_strings(ftdi, curdev->dev, cur_strings->manufacturer, 256,
		cur_strings->description, 256, cur_strings->serial, 256) < 0)
	{
	    *error_str = ftdi_get_error_string(ftdi);
	    goto ERROR_EXIT;
	}

	if(strings_head == NULL) {
	    strings_head = cur_strings;
	}
	else {
	    last_strings->next = cur_strings;
	}
	last_strings = cur_strings;
    }

    goto EXIT;

ERROR_EXIT:
    if (strings_head != NULL)
        _dftdi_free_device_strings(strings_head);
    strings_head == NULL;
EXIT:
    if (devlist != NULL)
        ftdi_list_free(&devlist);
    if (ftdi)
        ftdi_free(ftdi);
    return strings_head;
}

void _dftdi_hv_store(HV* hv, char* key, char* value)
{
    SV *val, **ret;
    size_t len;
    if ((len = strnlen(value, 256)) > 0) {
        val = newSVpvn(value, len);
	ret = hv_store(hv, key, strnlen(key, 16), val, 0);
	if (ret == NULL) {
	    SvREFCNT_dec(val);
	}
    }
}

MODULE = Device::FTDI PACKAGE = Device::FTDI PREFIX = dftdi
PROTOTYPES: DISABLE

INCLUDE: const_xs.inc

void
dftdi_find_all(vendor, product)
	int vendor;
	int product;
    INIT:
        struct device_strings *devs, *curdev;
	char *error_str = NULL;
	HV *dev_descr;
	SV *descr_ref;
    PPCODE:
        devs = _dftdi_get_device_strings(vendor, product, &error_str);
	if (devs == NULL && error_str != NULL) {
	    croak("Failed to get list of devices: %s", error_str);
	}
	curdev = devs;
	while (curdev != NULL) {
	    dev_descr = newHV();
	    printf("Serial: %s\n", curdev->serial);
	    _dftdi_hv_store(dev_descr, "manufacturer", curdev->manufacturer);
	    _dftdi_hv_store(dev_descr, "description", curdev->description);
	    _dftdi_hv_store(dev_descr, "serial", curdev->serial);
	    descr_ref = newRV_noinc((SV*)dev_descr);
	    XPUSHs(sv_2mortal(descr_ref));
	    curdev = curdev->next;
	}

struct ftdi_context *
dftdi_open_device(vendor, product, description, serial, index)
	int vendor;
	int product;
	SV* description;
	SV* serial;
	int index;
    INIT:
        struct ftdi_context* ftdi;
	char *_description = NULL, *_serial = NULL;
	char *error_str;
    CODE:
	if(SvOK(description)) {
	    _description = SvPV_nolen(description);
	}
	if(SvOK(serial)) {
	    _serial = SvPV_nolen(serial);
	}
        if ((ftdi = ftdi_new()) == NULL) {
            croak("Couldn't initialize fdti context");
        }
	if (ftdi_usb_open_desc_index(ftdi, vendor, product, _description, _serial, index) < 0) {
	    error_str = ftdi_get_error_string(ftdi);
	    ftdi_free(ftdi);
	    croak("Couldn't open specified device: %s", error_str);
	}
	RETVAL = ftdi;
    OUTPUT:
        RETVAL

int
dftdi_set_interface(ftdi, interface)
	struct ftdi_context *ftdi;
	int interface;
    CODE:
        RETVAL = ftdi_set_interface(ftdi, interface);
    OUTPUT:
        RETVAL

void
dftdi_close_device(ftdi)
	struct ftdi_context *ftdi;
    CODE:
        ftdi_free(ftdi);



( run in 0.659 second using v1.01-cache-2.11-cpan-5511b514fd6 )