Commit 1882f1aa authored by Jakob Moser's avatar Jakob Moser
Browse files

Merge branch 'backend/nfc/pirc522-library' into 'master'

Add pirc522 library to handle NFC

See merge request moser/poolpay!10
parents 2ddac9e8 4819df04
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
from collections.abc import Callable, Sequence

from pirc522 import RFID

from poolpay.card.CardReader import CardReader


class Pirc522CardReader(CardReader):
    def __init__(self) -> None:
        self._reader = RFID(pin_irq=None)

    def read_id(self) -> Sequence[int]:
        # TODO Cleanup implementation
        (error, anticoll_uid) = self._reader.anticoll()
        uid = tuple(self._reader.read_id())
        anticoll_uid = (0x88,) + uid[0:3] + (0x8A,)

        print("Card read UID: ", [hex(i) for i in uid])
        print("Anticoll UID: ", [hex(i) for i in anticoll_uid])
        print("Anticoll successful: ", not error)

        return uid

        # TODO See if we can do something with this code
        r = self._reader.select_tag(anticoll_uid)
        print(r)

        self._reader.card_auth(self._reader.auth_a, 10, [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], uid)
        print("Reading block 10: " + str(self._reader.read(10)))

    def on_card_presented(self, handle_card: Callable[[CardReader], None]) -> None:
        # TODO Do all this repeatedly in a background thread
        # TODO This only works if the interrupt pin (pin_irq) is correctly initialized
        self._reader.wait_for_tag()
        # TODO Call handle method

    def close(self) -> None:
        # TODO Maybe integrate this better
        # Always stop crypto1 when done working
        self._reader.stop_crypto()

        # Calls GPIO cleanup
        self._reader.cleanup()
+3 −1
Original line number Diff line number Diff line
@@ -2,12 +2,14 @@ import argparse

from poolpay.card.CardReader import CardReader
from poolpay.card.Mfrc522CardReader import Mfrc522CardReader
from poolpay.card.Pirc522CardReader import Pirc522CardReader

READERS = {
    "mfrc522": Mfrc522CardReader,
    "pirc522": Pirc522CardReader,
}

DEFAULT_READER = "mfrc522"
DEFAULT_READER = "pirc522"


def action_id(reader: CardReader) -> None:
+1 −0
Original line number Diff line number Diff line
babel~=2.17.0
mfrc522~=0.0.7
pi-rc522~=2.3.0
SQLAlchemy~=2.0.38