Here's fix for aes2501
aes2501 can be mounted 180 rotated (this happens on most part of laptops), so
driver should detetect whether sensor is 180degrees rotated and asseble
frames in right order.
Regards
Vasily
diff -Naur libfprint-0.0.1/libfprint/drivers/aes2501.c libfprint-0.0.1.new/libfprint/drivers/aes2501.c
--- libfprint-0.0.1/libfprint/drivers/aes2501.c 2007-11-15 11:54:39.000000000 +0200
+++ libfprint-0.0.1.new/libfprint/drivers/aes2501.c 2007-11-15 17:42:10.000000000 +0200
@@ -378,11 +378,11 @@
/* find overlapping parts of frames */
static unsigned int find_overlap(unsigned char *first_frame,
- unsigned char *second_frame)
+ unsigned char *second_frame, unsigned int *min_error)
{
unsigned int dy;
- unsigned int min_error = 255 * FRAME_SIZE;
unsigned int not_overlapped_height = 0;
+ *min_error = 255 * FRAME_SIZE;
for (dy = 0; dy < FRAME_HEIGHT; dy++) {
/* Calculating difference (error) between parts of frames */
unsigned int i;
@@ -397,8 +397,8 @@
/* Normalize error */
error *= 15;
error /= i;
- if (error < min_error) {
- min_error = error;
+ if (error < *min_error) {
+ *min_error = error;
not_overlapped_height = dy;
}
first_frame += FRAME_WIDTH;
@@ -409,11 +409,13 @@
/* assemble a series of frames into a single image */
static unsigned int assemble(unsigned char *input, unsigned char *output,
- int num_strips)
+ int num_strips, unsigned char reverse, unsigned int *errors_sum)
{
uint8_t *assembled = output;
int frame;
uint32_t image_height = FRAME_HEIGHT;
+ unsigned int min_error;
+ *errors_sum = 0;
if (num_strips < 1)
return 0;
@@ -422,6 +424,7 @@
* Taken from document describing aes2501 image format
* TODO: move reversing detection here */
+ if (reverse) output += (num_strips - 1) * FRAME_SIZE;
for (frame = 0; frame < num_strips; frame++) {
int column;
for (column = 0; column < FRAME_WIDTH; column++) {
@@ -433,7 +436,12 @@
}
}
- output += FRAME_SIZE;
+ if (reverse) {
+ output -= FRAME_SIZE;
+ }
+ else {
+ output += FRAME_SIZE;
+ }
}
/* Detecting where frames overlaped */
@@ -442,11 +450,12 @@
int not_overlapped;
output += FRAME_SIZE;
- not_overlapped = find_overlap(assembled, output);
+ not_overlapped = find_overlap(assembled, output, &min_error);
+ *errors_sum += min_error;
image_height += not_overlapped;
assembled += FRAME_WIDTH * not_overlapped;
memcpy(assembled, output, FRAME_SIZE);
- }
+ }
return image_height;
}
@@ -512,6 +521,7 @@
int r;
struct fp_img *img;
unsigned int nstrips;
+ unsigned int errors_sum, r_errors_sum;
unsigned char *cooked;
unsigned char *imgptr;
unsigned char buf[1705];
@@ -574,7 +584,14 @@
if (nstrips == MAX_FRAMES)
fp_warn("swiping finger too slow?");
- img->height = assemble(img->data, cooked, nstrips);
+ img->height = assemble(img->data, cooked, nstrips, 0, &errors_sum);
+ img->height = assemble(img->data, cooked, nstrips, 1, &r_errors_sum);
+
+ if (r_errors_sum > errors_sum) {
+ img->height = assemble(img->data, cooked, nstrips, 0, &errors_sum);
+
+ }
+
for (i = 0; i < img->height * FRAME_WIDTH; i++)
img->data[i] = (cooked[i] << 4) | 0xf;
_______________________________________________
fprint mailing list
[email protected]
http://lists.reactivated.net/mailman/listinfo/fprint