Files
controller-wisetopdataserver/python/biopro/impl/selector.py
T

195 lines
6.0 KiB
Python

from typing import Tuple, Iterable, List
from time import time, sleep
from datetime import datetime
from biopro.impl.gpio import OutputPin, P3Pin
class Selector:
"""
**74LCX138**
== == == == == == == == == == == == == ==
E1 E2 E3 A0 A1 A2 O0 O1 O2 O3 O4 O5 O6 O7
== == == == == == == == == == == == == ==
H X X X X X H H H H H H H H
X H X X X X H H H H H H H H
X X L X X X H H H H H H H H
L L H L L L L H H H H H H H
L L H H L L H L H H H H H H
L L H L H L H H L H H H H H
L L H H H L H H H L H H H H
L L H L L H H H H H L H H H
L L H H L H H H H H H L H H
L L H L H H H H H H H H L H
L L H H H H H H H H H H H L
== == == == == == == == == == == == == ==
**74LS151**
== == == == == == == == == == == == == ==
E A0 A1 A2 I0 I1 I2 I3 I4 I5 I6 I7 O0 O1
== == == == == == == == == == == == == ==
H X X X X X X X X X X X H L
L L L L L X X X X X X X H L
L L L L H X X X X X X X L H
L L L H X L X X X X X X H L
L L L H X H X X X X X X L H
L L H L X X L X X X X X H L
L L H L X X H X X X X X L H
L L H H X X X L X X X X H L
L L H H X X X H X X X X L H
L H L L X X X X L X X X H L
L H L L X X X X H X X X L H
L H L H X X X X X L X X H L
L H L H X X X X X H X X L H
L H H L X X X X X X L X H L
L H H L X X X X X X H X L H
L H H H X X X X X X X L H L
L H H H X X X X X X X H L H
== == == == == == == == == == == == == ==
**74LV4051**
== == == == == == == == == == == == ===
IH C B A Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 COM
== == == == == == == == == == == == ===
L L L L L X X X X X X X L
L L L L H X X X X X X X H
L L L H X L X X X X X X L
L L L H X H X X X X X X H
L L H L X X L X X X X X L
L L H L X X H X X X X X H
L L H H X X X L X X X X L
L L H H X X X H X X X X H
L H L L X X X X L X X X L
L H L L X X X X H X X X H
L H L H X X X X X L X X L
L H L H X X X X X H X X H
L H H L X X X X X X L X L
L H H L X X X X X X H X H
L H H H X X X X X X X L L
L H H H X X X X X X X H H
H X X X X X X X X X X X L
== == == == == == == == == == == == ===
"""
UART_SELECTOR = 'UART'
MEM_SELECTOR = 'MEM'
__slots__ = ('_p', '_p0', '_p1', '_p2', '_channel', '_last_time', '_last_sel')
def __init__(self, a0: int, a1: int, a2: int):
self._p = (a0, a1, a2)
self._p0 = OutputPin.get_used(a0, False)
self._p1 = OutputPin.get_used(a1, False)
self._p2 = OutputPin.get_used(a2, False)
self._channel = 0
self._last_time = time()
self._last_sel = self._p[2] << 2 | self._p[1] << 1 | self._p[0]
@property
def pins(self) -> Tuple[int, int, int]:
return self._p
@property
def channel(self) -> int:
return self._channel
def close(self):
if self._p0 is not None:
self._p0.close()
self._p1.close()
self._p2.close()
self._p0: OutputPin = None
self._p1: OutputPin = None
self._p2: OutputPin = None
def _select(self, p: Tuple[bool, bool, bool]):
value = p[2] << 2 | p[1] << 1 | p[0]
self._p0.output(p[0])
self._p1.output(p[1])
self._p2.output(p[2])
# if (value == 4 and self._last_sel != 6):
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel)
# elif (value == 5 and self._last_sel != 4):
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel)
# elif (value == 7 and self._last_sel != 5):
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel)
# elif (value == 6 and self._last_sel != 7):
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel)
self._last_sel = value
# current_time = time()
# print('sel', value, current_time - self._last_time, ',', datetime.now())
# self._last_time = current_time
_TABLE = (
(False, False, False),
(True, False, False),
(False, True, False),
(True, True, False),
(False, False, True),
(True, False, True),
(False, True, True),
(True, True, True)
)
SIZE = len(_TABLE)
_SELECTOR = tuple(range(SIZE))
def select(self, channel: int):
if self._p0 is None or self._p1 is None or self._p2 is None:
return
if self._channel != channel:
self._select(self._TABLE[channel])
self._channel = channel
def foreach(self) -> Iterable[int]:
for i in self._SELECTOR:
self.select(self._SELECTOR[i])
yield i
@classmethod
def set_selector(cls, select: Tuple[int, ...]):
for i in select:
# all i in select should be presented in TABLE
# noinspection PyStatementEffect
cls._TABLE[i]
cls._SELECTOR = select
@classmethod
def get(cls, selector: str) -> 'Selector':
if selector == cls.UART_SELECTOR:
return Selector(P3Pin.UART_A0, P3Pin.UART_A1, P3Pin.UART_A2)
elif selector == cls.MEM_SELECTOR:
return Selector(P3Pin.MEM_A0, P3Pin.MEM_A1, P3Pin.MEM_A2)
else:
raise ValueError()
def _main(argv: List[str]):
t = argv[0]
s = int(argv[1])
Selector.get(t).select(s)
if __name__ == '__main__':
import sys
_main(sys.argv[1:])