import smbus
import time
import json

# Adressen der beiden MCP23017 Chips
MP = 0x20  # Ausgang rechte Hälfte


# Register-Adressen für den MCP23017
IODIRA = 0x00  # Eingang / Ausgang A
IODIRB = 0x01  # Eingang / Ausgang B
GPIOA = 0x12   # GPIO A
GPIOB = 0x13   # GPIO B

# Initialisiere den I2C Bus
bus = smbus.SMBus(1)


def default():
    # Schleife für alle Registeradressen (0x00 bis 0x15)
    for register in range(0x00, 0x16):
        bus.write_byte_data(MP, register, 0x00)

# Konfiguriere alle Pins auf Chip 1 als Ausgang (A und B)
def configure_chip1_as_output():
    bus.write_byte_data(MP, IODIRA, 0x00)  # Setze alle Pins von A als Ausgang
    bus.write_byte_data(MP, IODIRB, 0x00)  # Setze alle Pins von B als Ausgang



# Hauptprogramm
def main():
    default()
    time.sleep(0.5)
    configure_chip1_as_output()

    # Teste alle Pins auf Chip 1 (A0-A7, B0-B7)
    for pin in range(32):  # 0 bis 31
        #print(f"Setze Pin {pin} auf HIGH auf Chip 1")
        

        bus.write_byte_data(MP, GPIOA, 0x00)
        
        
        if pin < 16:
            # Setze den gewählten Pin auf HIGH
            if pin < 8:  # Pins A0-
            
                bus.write_byte_data(MP, IODIRA, ~(1 << pin))
                
                bus.write_byte_data(MP, GPIOA, 1 << pin)
   
            
        print("====================" + str(pin) + "==========================")

        time.sleep(0.2)  # Kurze Pause, damit die Änderung sichtbar wird
        
        wert = bus.read_byte_data(MP, GPIOA)
        


        for j in range(8): # Lese 4*8=32 Pins
            bitmaske = 1 << j  # Erstelle eine Maske: 1, 2, 4, 8, 16, ...
            
            wert_bitweise = bool(wert & bitmaske)  # Isoliere das entsprechende Bit
          
            
            if wert_bitweise == True:
                print("Gefunden: " + str(j))
           


if __name__ == "__main__":
    main()

