-
Notifications
You must be signed in to change notification settings - Fork 0
/
fp_module.py
69 lines (55 loc) · 1.96 KB
/
fp_module.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import os
import io
import ctypes
import fingerprints
import imagehash
from PIL import Image
TIME_OUT = 60
DIR = os.path.dirname(__file__)
LIB_PATH = os.path.join(DIR, 'lib/FPModule_SDK.dll')
TEMP_FOLDER = os.path.join(DIR, 'temp')
TEMP_IMAGE = '%s/temp_image.jpeg' % TEMP_FOLDER
FP_LIB = ctypes.CDLL(LIB_PATH)
def start_detection_flow():
if not open_device():
return { "error" : "Unable to initialise the fingerprint scanner", "code": 500 }
if not is_finger_detected():
return { "error": "Finger not inserted on scanner", "code": 404 }
response = capture_image()
response["error"] = None
close_device()
return response
def open_device():
return FP_LIB.FPModule_OpenDevice() == 0
def close_device():
return FP_LIB.FPModule_CloseDevice() == 0
def capture_image():
pdwWidth = ctypes.pointer(ctypes.c_int())
pdwHeight = ctypes.pointer(ctypes.c_int())
pbyImageData = (ctypes.c_char * (3024*3024))()
FP_LIB.FPModule_CaptureImage(pbyImageData, pdwWidth, pdwHeight)
return {
"raw" : bytes(pbyImageData),
"size": (pdwWidth.contents.value, pdwHeight.contents.value)
}
def is_finger_detected():
pdwStatus = ctypes.pointer(ctypes.c_long())
FP_LIB.FPModule_DetectFinger.argtypes = [ctypes.POINTER(ctypes.c_long)]
FP_LIB.FPModule_DetectFinger(pdwStatus)
return pdwStatus.contents.value == 1
def get_sdk_version():
pbySdkInfo = (ctypes.c_ubyte * 64)()
FP_LIB.FPModule_GetSDKVersion(pbySdkInfo)
return bytes(pbySdkInfo).decode('ascii')
def get_device_info():
pbyDeviceInfo = (ctypes.c_ubyte * 64)()
FP_LIB.FPModule_GetDeviceInfo(pbyDeviceInfo)
return bytes(pbyDeviceInfo).decode('ascii')
def save_temp_image(byte_image, imgsize):
image = Image.frombytes('L', imgsize, byte_image, 'raw')
image.save(TEMP_IMAGE)
return image
def get_temp_image_hash():
return imagehash.average_hash(Image.open(TEMP_IMAGE))
if __name__ == '__main__':
print(get_sdk_version())