Source code for adafruit_fingerprint.core

"""Core module for serial communication of module data package format

This module implements methods to read and write packets in the data
package format. When communicating, the transferring and receiving of
command/data/result are all wrapped in data package format. The packets
take the shape of package to be sent and received as specified by the
adafruit fingerprint module.

Classes
________
Package
    Contain methods for serial read and write of module package

"""


from time import sleep
from struct import unpack, pack


[docs]class Package: """Implemets data package format for adafruit fingerprint module Contain methods to read and write module package data format to and from the serial buffer. Before every read and write, the package (packet to be read or written) has to be deconstructed and constructed respectively before the read/write operation, to be able to pick out the "package content" which is important to the AdafruitFingerprint class. Attributes __________ port : serial.Serial Instance of the Serial class from the serial module. The serial port passed down to allow serial communication (Default is None) header : int Pakcage data header value (Default is 0xEF01) address : int Package data address value (Default is 0xFFFFFFFF) identifier : int Package data identifier value. Values can be 01H, 02H or 07H package_head : list a list containing package `header`, `address` and `identifier` Methods _______ read() read package (packet) from the serial buffer write(data) write package (data packet) from the serail buffer read_template() read fingerprint template from the serial buffer write_template(data) write fingerprint template to the serial buffer """ CHECKSUM_LENGTH = 2 WAIT_TIME = 1 def __init__(self, port): """Initialize package with serial port for serial communication Set default package header values Attributes __________ header : int Pakcage data header value (Default is 0xEF01) address : int Package data address value (Default is 0xFFFFFFFF) identifier : int Package data identifier value. (Default is 0x01) package_head : list a list containing package `header`, `address` and `identifier` """ self.port = port self.header = 0xEF01 self.address = 0xFFFFFFFF self.identifier = 0x01 self.package_head = [self.header, self.address, self.identifier]
[docs] def read(self): """read package data (packet) from the serial buffer Returns _______ package A list of integers. Unpacked via a specified format from a string of hex bytes """ sleep(self.WAIT_TIME) package = [] # Perform partial read to get package length i.e content length if self.port.in_waiting >= 9: serial_data = self.port.read(9) # Unpack bytes in big endian format for easy formatting package.extend(unpack('!HIBH', serial_data)) package_length = package[-1] # Wait to read rest of package sleep(self.WAIT_TIME) if self.port.in_waiting >= package_length: serial_data = self.port.read(package_length) content_format = '!' + 'B' * \ (package_length - self.CHECKSUM_LENGTH) + 'H' package.extend(unpack(content_format, serial_data)) return package
[docs] def write(self, data): """write package data (data packet) from the serail buffer""" # Get package_length package_length = [(len(data) + self.CHECKSUM_LENGTH)] # Create checksum checksum = [sum(self.package_head[-1:] + package_length + data)] package_format = '!HIBH' + 'B' * len(data) + 'H' package = self.package_head + package_length + data + checksum serial_data = pack(package_format, *package) self.port.write(serial_data)
[docs] def read_template(self): """Read fiingerprint template from serial buffer Returns _______ template : string if fingerprint template is read successfully None if no fingerprint template is read from serial buffer """ if self.port.in_waiting > 0: serial_data = self.port.read(self.port.in_waiting) template = serial_data.hex() return template return None
[docs] def write_template(self, data): """Write fingerprint template to serial buffer""" template = bytes.fromhex(data) self.port.write(template)
def __repr__(self): return f'Package Header: {self.package_head}'