266 lines
6.7 KiB
Python
266 lines
6.7 KiB
Python
|
"""Low-level wrapper around zbar's interface
|
||
|
"""
|
||
|
from ctypes import (
|
||
|
c_ubyte, c_char_p, c_int, c_uint, c_ulong, c_void_p, Structure,
|
||
|
CFUNCTYPE, POINTER
|
||
|
)
|
||
|
from enum import IntEnum, unique
|
||
|
|
||
|
from . import zbar_library
|
||
|
|
||
|
|
||
|
__all__ = [
|
||
|
'EXTERNAL_DEPENDENCIES', 'LIBZBAR', 'ZBarConfig', 'ZBarSymbol',
|
||
|
'zbar_image_create', 'zbar_image_destroy', 'zbar_image_first_symbol',
|
||
|
'zbar_image_scanner_create', 'zbar_image_scanner_destroy',
|
||
|
'zbar_image_scanner_set_config', 'zbar_image_set_data',
|
||
|
'zbar_image_set_format', 'zbar_image_set_size', 'zbar_scan_image',
|
||
|
'zbar_symbol_get_data', 'zbar_symbol_get_loc_size',
|
||
|
'zbar_symbol_get_loc_x', 'zbar_symbol_get_loc_y', 'zbar_symbol_next'
|
||
|
]
|
||
|
|
||
|
# Globals populated in load_libzbar
|
||
|
LIBZBAR = None
|
||
|
"""ctypes.CDLL
|
||
|
"""
|
||
|
|
||
|
EXTERNAL_DEPENDENCIES = []
|
||
|
"""List of instances of ctypes.CDLL. Helpful when freezing.
|
||
|
"""
|
||
|
|
||
|
# Types
|
||
|
c_ubyte_p = POINTER(c_ubyte)
|
||
|
c_uint_p = POINTER(c_uint)
|
||
|
c_ulong_p = POINTER(c_ulong)
|
||
|
"""unsigned char* type
|
||
|
"""
|
||
|
|
||
|
|
||
|
# Defines and enums
|
||
|
@unique
|
||
|
class ZBarSymbol(IntEnum):
|
||
|
NONE = 0 # /**< no symbol decoded */
|
||
|
PARTIAL = 1 # /**< intermediate status */
|
||
|
EAN2 = 2 # /**< GS1 2-digit add-on */
|
||
|
EAN5 = 5 # /**< GS1 5-digit add-on */
|
||
|
EAN8 = 8 # /**< EAN-8 */
|
||
|
UPCE = 9 # /**< UPC-E */
|
||
|
ISBN10 = 10 # /**< ISBN-10 (from EAN-13). @since 0.4 */
|
||
|
UPCA = 12 # /**< UPC-A */
|
||
|
EAN13 = 13 # /**< EAN-13 */
|
||
|
ISBN13 = 14 # /**< ISBN-13 (from EAN-13). @since 0.4 */
|
||
|
COMPOSITE = 15 # /**< EAN/UPC composite */
|
||
|
I25 = 25 # /**< Interleaved 2 of 5. @since 0.4 */
|
||
|
DATABAR = 34 # /**< GS1 DataBar (RSS). @since 0.11 */
|
||
|
DATABAR_EXP = 35 # /**< GS1 DataBar Expanded. @since 0.11 */
|
||
|
CODABAR = 38 # /**< Codabar. @since 0.11 */
|
||
|
CODE39 = 39 # /**< Code 39. @since 0.4 */
|
||
|
PDF417 = 57 # /**< PDF417. @since 0.6 */
|
||
|
QRCODE = 64 # /**< QR Code. @since 0.10 */
|
||
|
CODE93 = 93 # /**< Code 93. @since 0.11 */
|
||
|
CODE128 = 128 # /**< Code 128 */
|
||
|
|
||
|
|
||
|
@unique
|
||
|
class ZBarConfig(IntEnum):
|
||
|
CFG_ENABLE = 0 # /**< enable symbology/feature */
|
||
|
CFG_ADD_CHECK = 1 # /**< enable check digit when optional */
|
||
|
CFG_EMIT_CHECK = 2 # /**< return check digit when present */
|
||
|
CFG_ASCII = 3 # /**< enable full ASCII character set */
|
||
|
CFG_NUM = 4 # /**< number of boolean decoder configs */
|
||
|
|
||
|
CFG_MIN_LEN = 0x20 # /**< minimum data length for valid decode */
|
||
|
CFG_MAX_LEN = 0x21 # /**< maximum data length for valid decode */
|
||
|
|
||
|
CFG_UNCERTAINTY = 0x40 # /**< required video consistency frames */
|
||
|
|
||
|
CFG_POSITION = 0x80 # /**< enable scanner to collect position data */
|
||
|
|
||
|
CFG_X_DENSITY = 0x100 # /**< image scanner vertical scan density */
|
||
|
CFG_Y_DENSITY = 0x101 # /**< image scanner horizontal scan density */
|
||
|
|
||
|
|
||
|
# Structs
|
||
|
class zbar_image_scanner(Structure):
|
||
|
"""Opaque C++ class with private implementation
|
||
|
"""
|
||
|
pass
|
||
|
|
||
|
|
||
|
class zbar_image(Structure):
|
||
|
"""Opaque C++ class with private implementation
|
||
|
"""
|
||
|
pass
|
||
|
|
||
|
|
||
|
class zbar_symbol(Structure):
|
||
|
"""Opaque C++ class with private implementation
|
||
|
|
||
|
The first item in the structure is an integeger value in the ZBarSymbol
|
||
|
enumeration.
|
||
|
"""
|
||
|
_fields_ = [
|
||
|
('type', c_int),
|
||
|
]
|
||
|
|
||
|
|
||
|
def load_libzbar():
|
||
|
"""Loads the zbar shared library and its dependencies.
|
||
|
|
||
|
Populates the globals LIBZBAR and EXTERNAL_DEPENDENCIES.
|
||
|
"""
|
||
|
global LIBZBAR
|
||
|
global EXTERNAL_DEPENDENCIES
|
||
|
if not LIBZBAR:
|
||
|
libzbar, dependencies = zbar_library.load()
|
||
|
LIBZBAR = libzbar
|
||
|
EXTERNAL_DEPENDENCIES = [LIBZBAR] + dependencies
|
||
|
|
||
|
return LIBZBAR
|
||
|
|
||
|
|
||
|
# Function signatures
|
||
|
def zbar_function(fname, restype, *args):
|
||
|
"""Returns a foreign function exported by `zbar`.
|
||
|
|
||
|
Args:
|
||
|
fname (:obj:`str`): Name of the exported function as string.
|
||
|
restype (:obj:): Return type - one of the `ctypes` primitive C data
|
||
|
types.
|
||
|
*args: Arguments - a sequence of `ctypes` primitive C data types.
|
||
|
|
||
|
Returns:
|
||
|
cddl.CFunctionType: A wrapper around the function.
|
||
|
"""
|
||
|
prototype = CFUNCTYPE(restype, *args)
|
||
|
return prototype((fname, load_libzbar()))
|
||
|
|
||
|
|
||
|
zbar_version = zbar_function(
|
||
|
'zbar_version',
|
||
|
c_int,
|
||
|
c_uint_p, # major,
|
||
|
c_uint_p, # minor
|
||
|
)
|
||
|
|
||
|
zbar_set_verbosity = zbar_function(
|
||
|
'zbar_set_verbosity',
|
||
|
None,
|
||
|
c_int
|
||
|
)
|
||
|
|
||
|
zbar_image_scanner_create = zbar_function(
|
||
|
'zbar_image_scanner_create',
|
||
|
POINTER(zbar_image_scanner)
|
||
|
)
|
||
|
|
||
|
zbar_image_scanner_destroy = zbar_function(
|
||
|
'zbar_image_scanner_destroy',
|
||
|
None,
|
||
|
POINTER(zbar_image_scanner)
|
||
|
)
|
||
|
|
||
|
zbar_parse_config = zbar_function(
|
||
|
'zbar_parse_config',
|
||
|
c_int,
|
||
|
c_char_p, # config_string,
|
||
|
POINTER(c_int), # symbology - values in ZBarSymbol
|
||
|
POINTER(c_int), # config - values in ZBarConfig
|
||
|
POINTER(c_int), # value
|
||
|
)
|
||
|
|
||
|
zbar_image_scanner_set_config = zbar_function(
|
||
|
'zbar_image_scanner_set_config',
|
||
|
c_int,
|
||
|
POINTER(zbar_image_scanner), # scanner
|
||
|
c_int, # symbology - values in ZBarSymbol
|
||
|
c_int, # config - values in ZBarConfig
|
||
|
c_int # value
|
||
|
)
|
||
|
|
||
|
zbar_image_create = zbar_function(
|
||
|
'zbar_image_create',
|
||
|
POINTER(zbar_image)
|
||
|
)
|
||
|
|
||
|
zbar_image_destroy = zbar_function(
|
||
|
'zbar_image_destroy',
|
||
|
None,
|
||
|
POINTER(zbar_image)
|
||
|
)
|
||
|
|
||
|
zbar_image_set_format = zbar_function(
|
||
|
'zbar_image_set_format',
|
||
|
None,
|
||
|
POINTER(zbar_image),
|
||
|
c_uint
|
||
|
)
|
||
|
|
||
|
zbar_image_set_size = zbar_function(
|
||
|
'zbar_image_set_size',
|
||
|
None,
|
||
|
POINTER(zbar_image),
|
||
|
c_uint, # width
|
||
|
c_uint # height
|
||
|
)
|
||
|
|
||
|
zbar_image_set_data = zbar_function(
|
||
|
'zbar_image_set_data',
|
||
|
None,
|
||
|
POINTER(zbar_image),
|
||
|
c_void_p, # data
|
||
|
c_ulong, # raw_image_data_length
|
||
|
c_void_p # A function pointer(!)
|
||
|
)
|
||
|
|
||
|
zbar_scan_image = zbar_function(
|
||
|
'zbar_scan_image',
|
||
|
c_int,
|
||
|
POINTER(zbar_image_scanner),
|
||
|
POINTER(zbar_image)
|
||
|
)
|
||
|
|
||
|
zbar_image_first_symbol = zbar_function(
|
||
|
'zbar_image_first_symbol',
|
||
|
POINTER(zbar_symbol),
|
||
|
POINTER(zbar_image)
|
||
|
)
|
||
|
|
||
|
zbar_symbol_get_data_length = zbar_function(
|
||
|
'zbar_symbol_get_data_length',
|
||
|
c_uint,
|
||
|
POINTER(zbar_symbol)
|
||
|
)
|
||
|
|
||
|
zbar_symbol_get_data = zbar_function(
|
||
|
'zbar_symbol_get_data',
|
||
|
c_char_p,
|
||
|
POINTER(zbar_symbol)
|
||
|
)
|
||
|
|
||
|
zbar_symbol_get_loc_size = zbar_function(
|
||
|
'zbar_symbol_get_loc_size',
|
||
|
c_uint,
|
||
|
POINTER(zbar_symbol)
|
||
|
)
|
||
|
|
||
|
zbar_symbol_get_loc_x = zbar_function(
|
||
|
'zbar_symbol_get_loc_x',
|
||
|
c_int,
|
||
|
POINTER(zbar_symbol),
|
||
|
c_uint
|
||
|
)
|
||
|
|
||
|
zbar_symbol_get_loc_y = zbar_function(
|
||
|
'zbar_symbol_get_loc_y',
|
||
|
c_int,
|
||
|
POINTER(zbar_symbol),
|
||
|
c_uint
|
||
|
)
|
||
|
|
||
|
zbar_symbol_next = zbar_function(
|
||
|
'zbar_symbol_next',
|
||
|
POINTER(zbar_symbol),
|
||
|
POINTER(zbar_symbol)
|
||
|
)
|