195 lines
6.1 KiB
Python
195 lines
6.1 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, datetime.now())
|
|
# elif (value == 5 and self._last_sel != 4):
|
|
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel, datetime.now())
|
|
# elif (value == 7 and self._last_sel != 5):
|
|
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel, datetime.now())
|
|
# elif (value == 6 and self._last_sel != 7):
|
|
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel, datetime.now())
|
|
|
|
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:])
|