Add support for circuitry using "real hardware" connected to a Pi.

This commit adds support for using the RaspberryPi's GPIO pins to
detect the state of the lock using a magnetic switch and change the
state of a lock using a relay (well, for now using a "buzzer").
See README.md for the circuit "diagram".

For testing on machines without the GPIO pins, a dummy implementation is
provided that prints status to STDOUT.

Currently, all this is placed in an "internal" package just so that
we can have a separate binary (hwtest) to test out the circuitry.
We might want to get rid of that binary and the "internal" package
altogether - folding the contents into "package main" for "lockd".

Change-Id: Ie8f3d72a8166ce81d80b6771a49591f2f3f17b4f
6 files changed
tree: 0236ab80cb9fb6f448d0817092b34a170871ab41
  1. go/
  2. .gitignore
  3. AUTHORS
  4. CONTRIBUTORS
  5. LICENSE
  6. PATENTS
  7. README.md
  8. VERSION
README.md

Physical lock

This is an example application built on the Vanadium stack.

Development

Features to add to the Lock server:

  1. Auditing: This is one of the strong features of our model, so I‘d imagine that we’d want a:
AuditLog(startTime, endTime time.Time) []AuditLog | error
type AuditLog struct {
  Blessing string
  Action LockStatus
  Timestamp time.Time
}

We'd also have to work out how to control access to this AuditLog. One option is to use caveats - so when “making” a new key one can choose to insert the “noadmin” caveat?

Features to add to the Lock client:

  1. sendkey <lockname> <email> sendkey sends a key for the specified lock and any principal with the specified <email> who is currently running a recvkey command.

Circuitry with the RaspberryPi

Equipment

  • 10KΩ resistor
  • 1KΩ resistor
  • Magnetic switch (normally open circuit - closed when the sensor moves away) (e.g. P/N 8601 Magnetic Switch)
  • For now, an active buzzer to simulate a relay. Will fill in the relay details here once we have that setup.
  • Breadboard, jumper cables, ribbon cable - or whatever is needed to connect to the RPi's GPIO pins

Circuitry

Apologies for this unconventional, possibly unreadable circuit representation. Putting it down so that the author can remember! TODO(ashankar): Clean it up!

The pin number assignments here work both for RaspberryPi Model B/B+ and RaspberryPi2-ModelB.

---(Pin 1)-------/\/\(10KΩ)/\/\---------(COM port of magnetic switch)
                                  \
                                   \----/\/\(1KΩ)/\/\---------(Pin 15 = GPIO22)
                                                          \
                                                           \----(LED)-----|
                                                                          |
                                                                          |
                                          (N.O. port of magnetic switch)--|
                                                                          |
                                                                          |
                                         (-ve terminal of active buzzer)--|
                                                                          |
                                                                          |
                                                                          |
                                                           (Pin 6 = GND)--|

---(Pin 11 = GPIO17)-----------(+ terminal of active buzzer)

Deployment

To build for the RaspberryPi setup with the circuitry mentioned above:

v23 go get -u github.com/davecheney/gpio
V23_PROFILE=arm v23 go install v.io/x/lock/lockd
scp $V23_ROOT/release/projects/physical-lock/go/bin/lockd <rpi_scp_location>

If building without the arm profile, there are no physical switches/relays and instead a simulated hardware is used that uses the interrupt signal (SIGINT) to simulate locking/unlocking externally.