[11526] | 1 | # A ctypes wrapper around libfprint, a C lib for fingerprint scanners. |
---|
| 2 | import ctypes |
---|
| 3 | |
---|
| 4 | lib = ctypes.cdll.LoadLibrary("libfprint.so") |
---|
| 5 | |
---|
| 6 | # |
---|
| 7 | # Enums... |
---|
| 8 | # |
---|
| 9 | |
---|
| 10 | # enum fp_driver_type |
---|
| 11 | ( |
---|
| 12 | DRIVER_PRIMITIVE, |
---|
| 13 | DRIVER_IMAGING, |
---|
| 14 | ) = map(ctypes.c_int, xrange(0, 2)) |
---|
| 15 | |
---|
| 16 | # enum fp_scan_type |
---|
| 17 | ( |
---|
| 18 | FP_SCAN_TYPE_PRESS, # press |
---|
| 19 | FP_SCAN_TYPE_SWIPE, # swipe |
---|
| 20 | ) = map(ctypes.c_int, xrange(0, 2)) |
---|
| 21 | |
---|
| 22 | |
---|
| 23 | class usb_id(ctypes.Structure): |
---|
| 24 | _fields_ = [ |
---|
| 25 | ('vendor', ctypes.c_uint16), |
---|
| 26 | ('product', ctypes.c_uint16), |
---|
| 27 | ('driver_data', ctypes.c_ulong), |
---|
| 28 | ] |
---|
| 29 | |
---|
| 30 | |
---|
| 31 | |
---|
| 32 | # |
---|
| 33 | # 'Hidden' types, i.e. types that should not be accessed internally by apps |
---|
| 34 | # (defined in fprint_internal.h) |
---|
| 35 | # |
---|
| 36 | fp_dscv_dev = None |
---|
| 37 | fp_dscv_print = None |
---|
| 38 | fp_dev = None |
---|
| 39 | class fp_driver(ctypes.Structure): |
---|
| 40 | _fields_ = [ |
---|
| 41 | ('id', ctypes.c_uint16), |
---|
| 42 | ('name', ctypes.c_char_p), |
---|
| 43 | ('full_name', ctypes.c_char_p), |
---|
| 44 | ('id_table', usb_id), |
---|
| 45 | ('type', ctypes.c_int), # fp_driver_type |
---|
| 46 | ('scan_type', ctypes.c_int), # fp_scan_type |
---|
| 47 | ('priv', ctypes.c_void_p), |
---|
| 48 | # Device operations |
---|
| 49 | ('discover', ctypes.CFUNCTYPE( |
---|
| 50 | c_int, # Returntype? |
---|
| 51 | POINTER(libusb_device_descriptor), ctypes.c_uint32_p), |
---|
| 52 | # int (*discover)(struct libusb_device_descriptor *dsc, uint32_t *devtype); |
---|
| 53 | # int (*open)(struct fp_dev *dev, unsigned long driver_data); |
---|
| 54 | # void (*close)(struct fp_dev *dev); |
---|
| 55 | # int (*enroll_start)(struct fp_dev *dev); |
---|
| 56 | # int (*enroll_stop)(struct fp_dev *dev); |
---|
| 57 | # int (*verify_start)(struct fp_dev *dev); |
---|
| 58 | # int (*verify_stop)(struct fp_dev *dev, gboolean iterating); |
---|
| 59 | # int (*identify_start)(struct fp_dev *dev); |
---|
| 60 | # int (*identify_stop)(struct fp_dev *dev, gboolean iterating); |
---|
| 61 | }; |
---|
| 62 | |
---|
| 63 | ] |
---|
| 64 | fp_print_data = None |
---|
| 65 | fp_img = None |
---|
| 66 | |
---|
| 67 | # enum fp_finger Some enum... |
---|
| 68 | ( |
---|
| 69 | LEFT_THUMB, # thumb (left hand) |
---|
| 70 | LEFT_INDEX, # index finger (left hand) |
---|
| 71 | LEFT_MIDDLE, # middle finger (left hand) |
---|
| 72 | LEFT_RING, # ring finger (left hand) |
---|
| 73 | LEFT_LITTLE, # little finger (left hand) |
---|
| 74 | RIGHT_THUMB, # thumb (right hand) |
---|
| 75 | RIGHT_INDEX, # index finger (right hand) |
---|
| 76 | RIGHT_MIDDLE, # middle finger (right hand) |
---|
| 77 | RIGHT_RING, # ring finger (right hand) |
---|
| 78 | RIGHT_LITTLE, # little finger (right hand) |
---|
| 79 | ) = map(ctypes.c_int, xrange(1, 11)) |
---|
| 80 | |
---|
| 81 | |
---|
| 82 | |
---|
| 83 | # Drivers |
---|
| 84 | |
---|
| 85 | lib.fp_driver_get_name.restype = ctypes.POINTER(ctypes.c_char) |
---|
| 86 | lib.fp_driver_get_name.argtypes = [ctypes.POINTER(fp_driver)] |
---|
| 87 | driver_get_name = lib.fp_driver_get_name |
---|
| 88 | |
---|
| 89 | |
---|
| 90 | discover_devs = lib.fp_discover_devs |
---|
| 91 | |
---|
| 92 | |
---|
| 93 | if __name__ == '__main__': |
---|
| 94 | print discover_devs() |
---|
| 95 | import pdb; pdb.set_trace() |
---|