Device-FTDI
view release on metacpan or search on metacpan
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 )