mirror of
https://github.com/brmlab/brmdoor_libnfc.git
synced 2025-06-08 08:34:00 +02:00
Added unlocker classes concept
This commit is contained in:
parent
739c1a1e19
commit
5b77dff18d
3 changed files with 60 additions and 3 deletions
|
@ -4,9 +4,20 @@
|
||||||
# prevents too many messages
|
# prevents too many messages
|
||||||
# log_file - logs read UIDs and when was lock opened, use - for stderr
|
# log_file - logs read UIDs and when was lock opened, use - for stderr
|
||||||
# log_level - minimum log level - one of debug, info, warn, error, fatal, default info
|
# log_level - minimum log level - one of debug, info, warn, error, fatal, default info
|
||||||
|
# unlocker - which unlocker class to use - Unlocker or UnlockerWiringPi
|
||||||
|
# Unlocker is just dummy test class.
|
||||||
[brmdoor]
|
[brmdoor]
|
||||||
auth_db_filename = test_uids_db.sqlite
|
auth_db_filename = test_uids_db.sqlite
|
||||||
#lock_opened_secs = 5
|
#lock_opened_secs = 5
|
||||||
#unknown_uid_timeout_secs = 5
|
#unknown_uid_timeout_secs = 5
|
||||||
log_file = -
|
log_file = -
|
||||||
#log_level = info
|
#log_level = info
|
||||||
|
unlocker = Unlocker
|
||||||
|
|
||||||
|
# Config section for dummy unlocker. It has no options.
|
||||||
|
[Unlocker]
|
||||||
|
|
||||||
|
# Config for wiringPi-based unlocker
|
||||||
|
# lock_pin - which pin needs to be pulled high to disengage the lock
|
||||||
|
[UnlockerWiringPi]
|
||||||
|
lock_pin = 18
|
||||||
|
|
|
@ -10,6 +10,7 @@ from binascii import hexlify
|
||||||
|
|
||||||
from brmdoor_nfc import NFCDevice, NFCError
|
from brmdoor_nfc import NFCDevice, NFCError
|
||||||
from brmdoor_authenticator import UidAuthenticator
|
from brmdoor_authenticator import UidAuthenticator
|
||||||
|
import unlocker
|
||||||
|
|
||||||
class BrmdoorConfigError(ConfigParser.Error):
|
class BrmdoorConfigError(ConfigParser.Error):
|
||||||
"""
|
"""
|
||||||
|
@ -43,6 +44,7 @@ class BrmdoorConfig(object):
|
||||||
self.unknownUidTimeoutSecs = self.config.getint("brmdoor", "unknown_uid_timeout_secs")
|
self.unknownUidTimeoutSecs = self.config.getint("brmdoor", "unknown_uid_timeout_secs")
|
||||||
self.logFile = self.config.get("brmdoor", "log_file")
|
self.logFile = self.config.get("brmdoor", "log_file")
|
||||||
self.logLevel = self.convertLoglevel(self.config.get("brmdoor", "log_level"))
|
self.logLevel = self.convertLoglevel(self.config.get("brmdoor", "log_level"))
|
||||||
|
self.unlocker = self.config.get("brmdoor", "unlocker")
|
||||||
|
|
||||||
def convertLoglevel(self, levelString):
|
def convertLoglevel(self, levelString):
|
||||||
"""Converts string 'debug', 'info', etc. into corresponding
|
"""Converts string 'debug', 'info', etc. into corresponding
|
||||||
|
@ -65,6 +67,10 @@ class NFCScanner(object):
|
||||||
self.unknownUidTimeoutSecs = config.unknownUidTimeoutSecs
|
self.unknownUidTimeoutSecs = config.unknownUidTimeoutSecs
|
||||||
self.lockOpenedSecs = config.lockOpenedSecs
|
self.lockOpenedSecs = config.lockOpenedSecs
|
||||||
|
|
||||||
|
unlockerClassName = config.unlocker
|
||||||
|
unlockerClass = getattr(unlocker, unlockerClassName)
|
||||||
|
self.unlocker = unlockerClass(config)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
Waits for a card to get into reader field. Reads its UID and
|
Waits for a card to get into reader field. Reads its UID and
|
||||||
|
@ -107,7 +113,7 @@ class NFCScanner(object):
|
||||||
return
|
return
|
||||||
|
|
||||||
logging.info("Unlocking for UID %s", record)
|
logging.info("Unlocking for UID %s", record)
|
||||||
time.sleep(self.lockOpenedSecs)
|
self.unlocker.unlock()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@ -125,6 +131,6 @@ if __name__ == "__main__":
|
||||||
logging.basicConfig(filename=config.logFile, level=config.logLevel,
|
logging.basicConfig(filename=config.logFile, level=config.logLevel,
|
||||||
format="%(asctime)s %(levelname)s %(message)s [%(pathname)s:%(lineno)d]")
|
format="%(asctime)s %(levelname)s %(message)s [%(pathname)s:%(lineno)d]")
|
||||||
|
|
||||||
nfcUnlocker = NFCUnlocker(config)
|
nfcScanner = NFCScanner(config)
|
||||||
nfcUnlocker.run()
|
nfcScanner.run()
|
||||||
|
|
||||||
|
|
40
unlocker.py
Normal file
40
unlocker.py
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
import time
|
||||||
|
import wiringpi2 as wiringpi
|
||||||
|
|
||||||
|
class Unlocker(object):
|
||||||
|
"""Abstract class/interface for Unlocker object.
|
||||||
|
Unlocker useful for simulation, but does not actually unlock any lock.
|
||||||
|
"""
|
||||||
|
def __init__(self, config):
|
||||||
|
"""
|
||||||
|
Creates unlocked instance from config, where section named after
|
||||||
|
the class is supposed to exist.
|
||||||
|
|
||||||
|
@param config: BrmdoorConfig instance
|
||||||
|
"""
|
||||||
|
self.config = config.config
|
||||||
|
self.lockOpenedSecs = config.lockOpenedSecs
|
||||||
|
self.unlockerName = type(self).__name__
|
||||||
|
|
||||||
|
def unlock(self):
|
||||||
|
"""Unlock lock for given self.lockOpenedSecs.
|
||||||
|
In this class case, it's only simulated
|
||||||
|
"""
|
||||||
|
time.sleep(self.lockOpenedSecs)
|
||||||
|
|
||||||
|
|
||||||
|
class UnlockerWiringPi(Unlocker):
|
||||||
|
"""Uses configured pings via WiringPi to open lock.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, config):
|
||||||
|
Unlocker.__init__(self, config)
|
||||||
|
self.lockPin = self.config.getint("UnlockerWiringPi", "lock_pin")
|
||||||
|
wiringpi.pinMode(self.lockPin, 1) #output
|
||||||
|
|
||||||
|
def unlock(self):
|
||||||
|
"""Unlocks lock at configured pin by pulling it high.
|
||||||
|
"""
|
||||||
|
wiringpi.digitalWrite(self.lockPin, 1)
|
||||||
|
time.sleep(self.lockOpenedSecs)
|
||||||
|
wiringpi.digitalWrite(self.lockPin, 0)
|
Loading…
Add table
Add a link
Reference in a new issue