fp_internal.h 6.56 KB
Newer Older
1 2
/*
 * Internal/private definitions for libfprint
3
 * Copyright (C) 2007-2008 Daniel Drake <dsd@gentoo.org>
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef __FPRINT_INTERNAL_H__
#define __FPRINT_INTERNAL_H__

Daniel Drake's avatar
Daniel Drake committed
23
#include <config.h>
24

25
#include <stdint.h>
26
#include <errno.h>
Daniel Drake's avatar
Daniel Drake committed
27
#include <glib.h>
28
#include <libusb.h>
29

30
#include "fprint.h"
31
#include "fpi-log.h"
32
#include "fpi-dev.h"
33
#include "fpi-dev-img.h"
34
#include "fpi-data.h"
35
#include "fpi-img.h"
36
#include "drivers/driver_ids.h"
37

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
enum fp_dev_state {
	DEV_STATE_INITIAL = 0,
	DEV_STATE_ERROR,
	DEV_STATE_INITIALIZING,
	DEV_STATE_INITIALIZED,
	DEV_STATE_DEINITIALIZING,
	DEV_STATE_DEINITIALIZED,
	DEV_STATE_ENROLL_STARTING,
	DEV_STATE_ENROLLING,
	DEV_STATE_ENROLL_STOPPING,
	DEV_STATE_VERIFY_STARTING,
	DEV_STATE_VERIFYING,
	DEV_STATE_VERIFY_DONE,
	DEV_STATE_VERIFY_STOPPING,
	DEV_STATE_IDENTIFY_STARTING,
	DEV_STATE_IDENTIFYING,
	DEV_STATE_IDENTIFY_DONE,
	DEV_STATE_IDENTIFY_STOPPING,
56 57 58 59
	DEV_STATE_CAPTURE_STARTING,
	DEV_STATE_CAPTURING,
	DEV_STATE_CAPTURE_DONE,
	DEV_STATE_CAPTURE_STOPPING,
60 61
};

62 63
struct fp_driver **fprint_get_drivers (void);

64
struct fp_dev {
65
	struct fp_driver *drv;
66
	uint32_t devtype;
Daniel Drake's avatar
Daniel Drake committed
67

68 69
	/* only valid if drv->type == DRIVER_IMAGING */
	struct fp_img_dev *img_dev;
70 71
	/* Link to the instance specific struct */
	void *instance_data;
72

Daniel Drake's avatar
Daniel Drake committed
73
	int nr_enroll_stages;
Daniel Drake's avatar
Daniel Drake committed
74

75 76 77
	/* FIXME: This will eventually have a bus type */
	libusb_device_handle *udev;

78 79 80 81 82
	/* read-only to drivers */
	struct fp_print_data *verify_data;

	/* drivers should not mess with any of the below */
	enum fp_dev_state state;
Daniel Drake's avatar
Daniel Drake committed
83
	int __enroll_stage;
84
	int unconditional_capture;
85 86 87 88 89

	/* async I/O callbacks and data */
	/* FIXME: convert this to generic state operational data mechanism? */
	fp_dev_open_cb open_cb;
	void *open_cb_data;
90
	fp_operation_stop_cb close_cb;
91 92 93
	void *close_cb_data;
	fp_enroll_stage_cb enroll_stage_cb;
	void *enroll_stage_cb_data;
94
	fp_operation_stop_cb enroll_stop_cb;
95
	void *enroll_stop_cb_data;
96
	fp_img_operation_cb verify_cb;
97
	void *verify_cb_data;
98
	fp_operation_stop_cb verify_stop_cb;
99
	void *verify_stop_cb_data;
100
	fp_identify_cb identify_cb;
101
	void *identify_cb_data;
102
	fp_operation_stop_cb identify_stop_cb;
103
	void *identify_stop_cb_data;
104
	fp_img_operation_cb capture_cb;
105
	void *capture_cb_data;
106
	fp_operation_stop_cb capture_stop_cb;
107
	void *capture_stop_cb_data;
108 109 110

	/* FIXME: better place to put this? */
	struct fp_print_data **identify_gallery;
111 112
};

113
struct fp_img_dev {
114 115
	struct fp_dev *parent;

116 117 118 119
	enum fp_imgdev_action action;
	int action_state;

	struct fp_print_data *acquire_data;
120
	struct fp_print_data *enroll_data;
121
	struct fp_img *acquire_img;
122
	int enroll_stage;
123 124 125 126
	int action_result;

	/* FIXME: better place to put this? */
	size_t identify_match_offset;
127 128
};

129 130 131
int fpi_imgdev_get_img_width(struct fp_img_dev *imgdev);
int fpi_imgdev_get_img_height(struct fp_img_dev *imgdev);

132 133 134 135 136 137
struct usb_id {
	uint16_t vendor;
	uint16_t product;
	unsigned long driver_data;
};

138 139 140 141 142
enum fp_driver_type {
	DRIVER_PRIMITIVE = 0,
	DRIVER_IMAGING = 1,
};

143
struct fp_driver {
144
	const uint16_t id;
145 146 147
	const char *name;
	const char *full_name;
	const struct usb_id * const id_table;
148
	enum fp_driver_type type;
149
	enum fp_scan_type scan_type;
150

151
	/* Device operations */
152
	int (*discover)(struct libusb_device_descriptor *dsc, uint32_t *devtype);
153 154
	int (*open)(struct fp_dev *dev, unsigned long driver_data);
	void (*close)(struct fp_dev *dev);
155 156 157 158 159 160
	int (*enroll_start)(struct fp_dev *dev);
	int (*enroll_stop)(struct fp_dev *dev);
	int (*verify_start)(struct fp_dev *dev);
	int (*verify_stop)(struct fp_dev *dev, gboolean iterating);
	int (*identify_start)(struct fp_dev *dev);
	int (*identify_stop)(struct fp_dev *dev, gboolean iterating);
161 162
	int (*capture_start)(struct fp_dev *dev);
	int (*capture_stop)(struct fp_dev *dev);
163 164
};

Daniel Drake's avatar
Daniel Drake committed
165 166
enum fp_print_data_type fpi_driver_get_data_type(struct fp_driver *drv);

167 168 169
/* flags for fp_img_driver.flags */
#define FP_IMGDRV_SUPPORTS_UNCONDITIONAL_CAPTURE (1 << 0)

170 171
struct fp_img_driver {
	struct fp_driver driver;
172
	uint16_t flags;
173 174
	int img_width;
	int img_height;
175
	int bz3_threshold;
176 177

	/* Device operations */
178 179
	int (*open)(struct fp_img_dev *dev, unsigned long driver_data);
	void (*close)(struct fp_img_dev *dev);
180 181 182
	int (*activate)(struct fp_img_dev *dev, enum fp_imgdev_state state);
	int (*change_state)(struct fp_img_dev *dev, enum fp_imgdev_state state);
	void (*deactivate)(struct fp_img_dev *dev);
183 184
};

185
#include "drivers_definitions.h"
186

Daniel Drake's avatar
Daniel Drake committed
187
extern libusb_context *fpi_usb_ctx;
188 189
extern GSList *opened_devices;

190
void fpi_img_driver_setup(struct fp_img_driver *idriver);
191

192 193 194
#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})
195 196 197
#define fpi_driver_to_img_driver(drv) \
	container_of((drv), struct fp_img_driver, driver)

198
struct fp_dscv_dev {
199
	struct libusb_device *udev;
200
	struct fp_driver *drv;
201
	unsigned long driver_data;
202
	uint32_t devtype;
203 204
};

Daniel Drake's avatar
Daniel Drake committed
205 206 207 208 209 210 211
struct fp_dscv_print {
	uint16_t driver_id;
	uint32_t devtype;
	enum fp_finger finger;
	char *path;
};

212
void fpi_data_exit(void);
Daniel Drake's avatar
Daniel Drake committed
213 214 215
gboolean fpi_print_data_compatible(uint16_t driver_id1, uint32_t devtype1,
	enum fp_print_data_type type1, uint16_t driver_id2, uint32_t devtype2,
	enum fp_print_data_type type2);
216

217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
struct fp_minutia {
	int x;
	int y;
	int ex;
	int ey;
	int direction;
	double reliability;
	int type;
	int appearing;
	int feature_id;
	int *nbrs;
	int *ridge_counts;
	int num_nbrs;
};

232 233 234 235 236 237
struct fp_minutiae {
	int alloc;
	int num;
	struct fp_minutia **list;
};

238
gboolean fpi_img_is_sane(struct fp_img *img);
239
int fpi_img_to_print_data(struct fp_img_dev *imgdev, struct fp_img *img,
240
	struct fp_print_data **ret);
241 242
int fpi_img_compare_print_data(struct fp_print_data *enrolled_print,
	struct fp_print_data *new_print);
243
int fpi_img_compare_print_data_to_gallery(struct fp_print_data *print,
244
	struct fp_print_data **gallery, int match_threshold, size_t *match_offset);
245

246
/* polling */
247
void fpi_timeout_cancel_all_for_dev(struct fp_dev *dev);
Daniel Drake's avatar
Daniel Drake committed
248
void fpi_poll_init(void);
249 250
void fpi_poll_exit(void);

251
#endif