libftdi Archives

Subject: Re: ftdi_read_chipid cannot be used from python due to TypeError

From: Flynn Marquardt <ftdi@xxxxxxxxxx>
To: libftdi@xxxxxxxxxxxxxxxxxxxxxxx
Date: Wed, 14 Jul 2010 06:52:44 +0200
Am 13.07.2010 17:27, schrieb Thomas Jarosch:
> Hello Flynn,
>
> On Saturday, 10. July 2010 17:06:35 Flynn Marquardt wrote:
>   
>> I tried to read the chipid in python:
>>
>> import ftdi
>> ftdic = ftdi.ftdi_context()
>> ret = ftdi.ftdi_usb_open(ftdic, 0x0403, 0x6001)
>> chipid = 0
>> ftdi.ftdi_read_chipid(ftdic, chipid)
>>
>> results in a TypeError:
>>
>> TypeError: in method 'ftdi_read_chipid', argument 2 of type 'unsigned
>> int *'
>>
>> Without help from Swig it is not possible to create the correct object.
>>
>> Inserting in bindings/ftdi.i the line
>>
>> %pointer_functions(unsigned int, uintp);
>>
>> after %include "cpointer.i" helps (pointer_class could also be used).
>>
>> With a little modification in python:
>>
>> import ftdi
>> ftdic = ftdi.ftdi_context()
>> ret = ftdi.ftdi_usb_open(ftdic, 0x0403, 0x6001)
>> chipid = ftdi.new_uintp()
>> ftdi.ftdi_read_chipid(ftdic, chipid)
>> hex(ftdi.uintp_value(chipid))
>>
>> the correct chipid is printed.
>>
>> It seems (I'm not an expert in swig), that the *OUTPUT directives are
>> not correct for
>> ftdi_read_chipid, otherwise this patch woud not be needed.
>>     
> Thanks for the info. Care to send a proper patch
> as I'm not too familiar with swig?
>
> Cheers,
> Thomas
>   
Here it is, it's only a oneliner:

--- libftdi-0.17-orig/bindings/ftdi.i    2009-04-07 18:58:14.000000000 +0200
+++ libftdi-0.17/bindings/ftdi.i    2010-07-10 16:49:35.981446841 +0200
@@ -2,6 +2,8 @@
 %module ftdi
 %include "typemaps.i"
 %include "cpointer.i"
+%pointer_functions(unsigned int, uintp);
+
 %typemap(in) unsigned char* = char*;
 %ignore ftdi_write_data_async;
 %ignore ftdi_async_complete;

and should apply clean also to version 0.18.

Maybe the example code

import ftdi
ftdic = ftdi.ftdi_context()
ret = ftdi.ftdi_usb_open(ftdic, 0x0403, 0x6001)
chipid = ftdi.new_uintp()
ftdi.ftdi_read_chipid(ftdic, chipid)
hex(ftdi.uintp_value(chipid))

should be put in a README, because the method initializing an unsigned int
pointer (chipid = ftdi.new_uintp()) is not very common to python
programmers.

Flynn


--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx   

Current Thread