108 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import keypad
 | 
						|
 | 
						|
from kmk.scanners import DiodeOrientation, Scanner
 | 
						|
 | 
						|
 | 
						|
class KeypadScanner(Scanner):
 | 
						|
    '''
 | 
						|
    Translation layer around a CircuitPython 7 keypad scanner.
 | 
						|
 | 
						|
    :param pin_map: A sequence of (row, column) tuples for each key.
 | 
						|
    :param kp: An instance of the keypad class.
 | 
						|
    '''
 | 
						|
 | 
						|
    @property
 | 
						|
    def key_count(self):
 | 
						|
        return self.keypad.key_count
 | 
						|
 | 
						|
    def scan_for_changes(self):
 | 
						|
        '''
 | 
						|
        Scan for key events and return a key report if an event exists.
 | 
						|
 | 
						|
        The key report is a byte array with contents [row, col, True if pressed else False]
 | 
						|
        '''
 | 
						|
        ev = self.keypad.events.get()
 | 
						|
        if ev and self.offset:
 | 
						|
            return keypad.Event(ev.key_number + self.offset, ev.pressed)
 | 
						|
        return ev
 | 
						|
 | 
						|
 | 
						|
class MatrixScanner(KeypadScanner):
 | 
						|
    '''
 | 
						|
    Row/Column matrix using the CircuitPython 7 keypad scanner.
 | 
						|
 | 
						|
    :param row_pins: A sequence of pins used for rows.
 | 
						|
    :param col_pins: A sequence of pins used for columns.
 | 
						|
    :param direction: The diode orientation of the matrix.
 | 
						|
    '''
 | 
						|
 | 
						|
    def __init__(
 | 
						|
        self,
 | 
						|
        row_pins,
 | 
						|
        column_pins,
 | 
						|
        *,
 | 
						|
        columns_to_anodes=DiodeOrientation.COL2ROW,
 | 
						|
        interval=0.02,
 | 
						|
        max_events=64,
 | 
						|
    ):
 | 
						|
        self.keypad = keypad.KeyMatrix(
 | 
						|
            row_pins,
 | 
						|
            column_pins,
 | 
						|
            columns_to_anodes=(columns_to_anodes == DiodeOrientation.COL2ROW),
 | 
						|
            interval=interval,
 | 
						|
            max_events=max_events,
 | 
						|
        )
 | 
						|
        super().__init__()
 | 
						|
 | 
						|
 | 
						|
class KeysScanner(KeypadScanner):
 | 
						|
    '''
 | 
						|
    GPIO-per-key 'matrix' using the native CircuitPython 7 keypad scanner.
 | 
						|
 | 
						|
    :param pins: An array of arrays of CircuitPython Pin objects, such that pins[r][c] is the pin for row r, column c.
 | 
						|
    '''
 | 
						|
 | 
						|
    def __init__(
 | 
						|
        self,
 | 
						|
        pins,
 | 
						|
        *,
 | 
						|
        value_when_pressed=False,
 | 
						|
        pull=True,
 | 
						|
        interval=0.02,
 | 
						|
        max_events=64,
 | 
						|
    ):
 | 
						|
        self.keypad = keypad.Keys(
 | 
						|
            pins,
 | 
						|
            value_when_pressed=value_when_pressed,
 | 
						|
            pull=pull,
 | 
						|
            interval=interval,
 | 
						|
            max_events=max_events,
 | 
						|
        )
 | 
						|
        super().__init__()
 | 
						|
 | 
						|
 | 
						|
class ShiftRegisterKeys(KeypadScanner):
 | 
						|
    def __init__(
 | 
						|
        self,
 | 
						|
        *,
 | 
						|
        clock,
 | 
						|
        data,
 | 
						|
        latch,
 | 
						|
        value_to_latch=True,
 | 
						|
        key_count,
 | 
						|
        value_when_pressed=False,
 | 
						|
        interval=0.02,
 | 
						|
        max_events=64,
 | 
						|
    ):
 | 
						|
        self.keypad = keypad.ShiftRegisterKeys(
 | 
						|
            clock=clock,
 | 
						|
            data=data,
 | 
						|
            latch=latch,
 | 
						|
            value_to_latch=value_to_latch,
 | 
						|
            key_count=key_count,
 | 
						|
            value_when_pressed=value_when_pressed,
 | 
						|
            interval=interval,
 | 
						|
            max_events=max_events,
 | 
						|
        )
 | 
						|
        super().__init__()
 |