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:])