podbay/validate.py

104 lines
2.4 KiB
Python
Raw Normal View History

2018-01-10 07:36:32 +00:00
#!/usr/bin/python
import sys
from datetime import datetime
2018-01-10 21:19:31 +00:00
import time
2018-01-27 23:45:16 +00:00
import json
2018-01-10 21:19:31 +00:00
import RPi.GPIO as IO
import zmq
2018-01-10 21:19:31 +00:00
# Magic numbers for PWM activation
2018-01-10 21:19:31 +00:00
MOTOR_PIN = 19
FREQUENCY = 100
DUTYCYCLE = 100
DURATION = 1.0
# Address of the scanning service
SCANSERVADDRESS = "tcp://localhost:5000"
2018-01-10 07:36:32 +00:00
def timestamped(s):
"""
Prepends a timestamp to a string.
"""
return "[{:%Y-%m-%d %H:%M:%S}] {}".format(datetime.now(), s)
2018-01-10 21:19:31 +00:00
def setup_pwm():
"""
Performs initialization for pulse width modulation.
Returns the PWM object for the motor pin.
"""
IO.setwarnings(False)
IO.setmode(IO.BCM)
IO.setup(MOTOR_PIN, IO.OUT)
p = IO.PWM(MOTOR_PIN, FREQUENCY)
2018-01-10 21:19:31 +00:00
return p
def unlock_door(p):
"""
Uses PWM to turn the motor connected to the door handle.
"""
try:
p.start(DUTYCYCLE)
2018-01-27 23:58:11 +00:00
time.sleep(DURATION)
finally:
p.stop()
2018-01-10 21:19:31 +00:00
2018-01-10 07:36:32 +00:00
def read_loop():
"""
Simple REPL skeleton for validating scanned IDs.
"""
# Initialize zmq socket for reading in scanned barcodes
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.setsockopt(zmq.SUBSCRIBE, "")
socket.connect(SCANSERVADDRESS)
# Initialize the PWM pin for opening the door
pwm_pin = setup_pwm()
2018-01-10 07:36:32 +00:00
# Open the log file in append mode
log_file = open("./access.log", "a")
log_file.write(timestamped("=== Door security initiated ===\n"))
# Begin the loop
while True:
# Read in the ID
2018-01-27 23:48:32 +00:00
code = socket.recv()
2018-01-28 02:19:59 +00:00
# Load the access database
# As long as the access list is small and the speed is unimportant,
# the flexibility and update ability is worth reading from disk.
raw = open("access.json", "r").read()
try:
access = json.loads(raw)
except:
log_file.write(timestamped("Could not load access file!"))
sys.stderr.write("Could not load access file!")
access = {}
2018-01-27 23:45:16 +00:00
# Determine ID authorization
2018-01-27 23:58:11 +00:00
if code not in access:
authorized = False
user = "unknown barcode"
else:
authorized = "authorized" in access[code] and access[code]["authorized"]
2018-01-28 00:06:03 +00:00
user = access[code]["name"] if "name" in access[code] else code
2018-01-28 02:19:59 +00:00
2018-01-10 07:36:32 +00:00
# If the user is not authorized, deny access
if not authorized:
2018-01-27 23:48:32 +00:00
s = timestamped("Denied {} ({})\n".format(code, user))
2018-01-10 07:36:32 +00:00
log_file.write(s)
2018-01-27 23:45:16 +00:00
print s,
2018-01-28 02:19:59 +00:00
2018-01-10 07:36:32 +00:00
# If the user is authorized, perform the unlock procedure
else:
2018-01-28 00:06:03 +00:00
s = timestamped("Validated {} ({})\n".format(code, user))
2018-01-10 07:36:32 +00:00
log_file.write(s)
print s,
2018-01-10 07:36:32 +00:00
# TODO: Play open tone
2018-01-27 23:48:32 +00:00
if "sound" in access[code]:
2018-01-27 23:45:16 +00:00
pass
# Run unlock procedure
2018-01-10 21:19:31 +00:00
unlock_door(pwm_pin)
2018-01-10 07:36:32 +00:00
if __name__ == "__main__":
read_loop()