En Wed, 29 Apr 2009 05:05:52 -0300, luca72 <lucabe...@libero.it> escribió:

can you explain how to use this function :
this is the api documentation :
PREF0 short usb_tc08_get_single (
  short   handle,
  float * temp,
  short * overflow_flags,
  short   units);

This is the sample made in c:
int main(void)
{
        short handle = 0;     /* The handle to a TC-08 returned by
usb_tc08_open_unit() */
        char selection = 0;   /* User selection from teh main menu */
        float temp[9];        /* Buffer to store temperature readings
from
the TC-08 */
        int channel, reading; /* Loop counters */
        int retVal = 0;       /* Return value from driver calls
indication
success / error */
        USBTC08_INFO unitInfo;/* Struct to hold unit information */

usb_tc08_get_single(handle, temp, NULL, USBTC08_UNITS_CENTIGRADE);

i do
strumento = ctypes.cdll.LoadLibrary('/home/luca/Desktop/luca/
progetti_eric/Pico/libusbtc08-1.7.2/src/.libs/libusbtc08.so')
strumento.usb_tc08_get_single.argtypes = [ctypes.c_short,
ctypes.c_float, ctypes.c_short, ctypes.c_short] is this correct?

That's wrong. Second and third parameters are pointers:

# define a pointer type
c_float_p = ctypes.POINTER(ctypes.c_float)
c_short_p = ctypes.POINTER(ctypes.c_short)

usb_tc08_get_single = strumento.usb_tc08_get_single
usb_tc08_get_single.argtypes = [
  ctypes.c_short,
  c_float_p,
  c_short_p,
  ctypes.c_short]
usb_tc08_get_single.restype = ctypes.c_short

now how i can use the function?
leggo = strumento.usb_tc08_get_single(0, temp,
'NULL','USBTC08_UNITS_CENTIGRADE')

That's wrong too. In the C code, the third parameter is NULL - this corresponds to None in Python, not the string 'NULL'. Also, they define a temporary float array of size 9 and use it as the second argument - we have to do the same in Python. (Note that ctypes accepts an array in place of a pointer argument, same as C). Last, you have to search for the value of USBTC08_UNITS_CENTIGRADE, likely it's a #define in a .h header file. Suppose you find the corresponding value is 42:

USBTC08_UNITS_CENTIGRADE = 42
temp = (ctypes.c_float * 9)()
handle = 0
leggo = usb_tc08_get_single(handle, temp, None, USBTC08_UNITS_CENTIGRADE)

Hope it helps,
--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to