/
yeexzdev
/
frontiersystem
Обзор
Документация
Войти
/
yeexzdev
/
frontiersystem
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/reader.py
67 строк
2 KB
yeexzdev
initial commit
15 май 2026, 20:25
15 май 2026, 20:25
bc97861
Код
Авторство
О чём код?
import threading import time import queue import pigpio import logging logger = logging.getLogger(__name__) class WiegandReader: def __init__(self, pi, gpio_0, gpio_1, callback, timeout=0.05): self.pi = pi self.gpio_0 = gpio_0 self.gpio_1 = gpio_1 self.callback = callback self.timeout = timeout self.bits = "" self.last_tick = time.time() for pin in [gpio_0, gpio_1]: self.pi.set_mode(pin, pigpio.INPUT) self.pi.set_pull_up_down(pin, pigpio.PUD_UP) self.cb_0 = self.pi.callback(gpio_0, pigpio.FALLING_EDGE, self._on_bit) self.cb_1 = self.pi.callback(gpio_1, pigpio.FALLING_EDGE, self._on_bit) self.worker = threading.Thread(target=self._worker_loop, daemon=True) self.worker.start() def _on_bit(self, gpio, level, tick): if gpio == self.gpio_0: self.bits += "0" else: self.bits += "1" self.last_tick = time.time() def _worker_loop(self): while True: if self.bits and (time.time() - self.last_tick > self.timeout): raw_bits = self.bits self.bits = "" self._decode(raw_bits) time.sleep(0.01) def _decode(self, raw_bits): bit_count = len(raw_bits) data = None if bit_count == 4: val = int(raw_bits, 2) if val == 10: data = "*" elif val == 11: data = "#" else: data = str(val) elif bit_count == 34: data = hex(int(raw_bits[1:-1], 2)).upper().replace("0X", "") if data: logger.debug(f"Wiegand Raw: {raw_bits} | Decoded: {data}") self.callback(data) def cancel(self): self.cb_0.cancel() self.cb_1.cancel()