# Set all pins on the IO bus to be inputs with internal pull-ups disabled.

io.set_port_pullups(0, 0x00)
io.set_port_pullups(1, 0x00)
io.set_port_direction(0, 0xFF)
io.set_port_direction(1, 0xFF)

# Set the interrupt polarity to be active high and mirroring disabled, so
# pins 1 to 8 trigger INT A and pins 9 to 16 trigger INT B
io.set_interrupt_polarity(1)
io.mirror_interrupts(0)

# Set the interrupts default value to trigger when 5V is applied to pins 1
# and 16
io.set_interrupt_defaults(0, 0x01)
io.set_interrupt_defaults(0, 0x80)

# Set the interrupt type to be 1 for ports A and B so an interrupt is
# fired when the pin matches the default value
io.set_interrupt_type(0, 1)
io.set_interrupt_type(1, 1)

# Enable interrupts for pins 1 and 16
io.set_interrupt_on_pin(1, 1)
io.set_interrupt_on_pin(16, 1)

while True:

    # read the port value from the last capture for ports 0 and 1.  This will
    # reset the interrupts
io.set_port_pullups(0, 0xFF)
io.set_port_pullups(1, 0xFF)
io.set_port_direction(0, 0xFF)
io.set_port_direction(1, 0xFF)

# invert the ports so pulling a pin to ground will show as 1 instead of 0
io.invert_port(0,0xFF)
io.invert_port(1,0xFF)

# Set the interrupt polarity to be active high and mirroring enabled, so
# pin 1 will trigger both INT A and INT B when a pin is grounded
io.set_interrupt_polarity(1)
io.mirror_interrupts(1)

# Set the interrupts default value to 0
io.set_interrupt_defaults(0, 0x00)
io.set_interrupt_defaults(1, 0x00)

# Set the interrupt type to be 1 for ports A and B so an interrupt is
# fired when a state change occurs
io.set_interrupt_type(0, 0x00)
io.set_interrupt_type(1, 0x00)

# Enable interrupts for pin 1
io.set_interrupt_on_port(0, 0x01)
io.set_interrupt_on_port(1, 0x00)


t=threading.Thread(target=background_thread)
t.daemon = True  # set thread to daemon ('ok' won't be printed in this case)
t.start()