import threading
from iowp import IowFactory, I2C
from iowp.i2c_devices import I2CLCD

# Die gekapselte Methode fuer die LCD-Ausgabe
def update_lcd(lcd, device_name):
    try:
        print(f"Starting update for {device_name}...")
        
        # 1. LCD loeschen
        lcd.clearLCD()

        # 2. Text schreiben
        lcd.setCursor(0, 0)
        lcd.writeString(f"Hello iowp ")
        lcd.writeString(device_name)
        
        lcd.setCursor(1, 0)
        lcd.writeString("LCD 2x16 Ready")

        # 3. Sonderzeichen (Smiley) erstellen und schreiben
        smiley = [
            0b00000,
            0b01010,
            0b01010,
            0b00000,
            0b10001,
            0b01110,
            0b00000,
            0b00000
        ]
        lcd.createChar(0, smiley)
        lcd.setCursor(1, 15)
        lcd.writeString(chr(0))
        
        print(f"Finished update for {device_name}.")
        
    except Exception as e:
        print(f"Error on {device_name}: {e}")

def main():
    factory = IowFactory.get_instance()
    if len(factory.get_devices()) < 2:
        print("Not enough IO-Warrior devices found. Need at least 2.")
        return
    
    # --- Setup Device 1 ---
    iow_dev_1 = factory.get_iow_device(0)
    i2c_1 = I2C(I2C.I2C_SPEED_100KHZ)
    iow_dev_1.add_special_mode_function_impl(i2c_1)
    lcd_1 = I2CLCD(device_address=0x07, rows=2, cols=16)
    i2c_1.add_i2c_device(lcd_1)

    # --- Setup Device 2 ---
    iow_dev_2 = factory.get_iow_device(1)
    i2c_2 = I2C(I2C.I2C_SPEED_100KHZ)
    iow_dev_2.add_special_mode_function_impl(i2c_2)
    lcd_2 = I2CLCD(device_address=0x07, rows=2, cols=16)
    i2c_2.add_i2c_device(lcd_2)

    # --- Threads erstellen ---
    # Wir uebergeben die LCD-Instanz und den Namen als Argumente (args)
    thread1 = threading.Thread(target=update_lcd, args=(lcd_1, iow_dev_1.name))
    thread2 = threading.Thread(target=update_lcd, args=(lcd_2, iow_dev_2.name))

    # Threads starten (laufen jetzt parallel)
    thread1.start()
    thread2.start()

    # Warten, bis beide fertig sind
    thread1.join()
    thread2.join()

    print("Both LCDs updated simultaneously.")

if __name__ == "__main__":
    main()