Detect a hexpansion

The following demo app demonstrates how you can detect hexpansion insertions and removals:

import app

from machine import I2C

from app_components import clear_background
from events.input import Buttons, BUTTON_TYPES
from system.eventbus import eventbus
from system.hexpansion.events import \
    HexpansionRemovalEvent, HexpansionInsertionEvent
from system.hexpansion.util import read_hexpansion_header, detect_eeprom_addr


class ExampleApp(app.App):
    def __init__(self):
        self.button_states = Buttons(self)
        self.text = "No hexpansion found."
        self.color = (1, 0, 0)
        self.scan_for_hexpansion()

        eventbus.on(
            HexpansionInsertionEvent,
            self.handle_hexpansion_insertion,
            self)
        eventbus.on(
            HexpansionRemovalEvent,
            self.handle_hexpansion_removal,
            self)

    def handle_hexpansion_insertion(self, event):
        self.scan_for_hexpansion()

    def handle_hexpansion_removal(self, event):
        self.scan_for_hexpansion()

    def update(self, delta):
        if self.button_states.get(BUTTON_TYPES["CANCEL"]):
            self.minimise()

    def draw(self, ctx):
        ctx.save()
        clear_background(ctx)
        x, y, z = self.color
        ctx.rgb(x, y, z).move_to(-90, -40).text(self.text)
        ctx.restore()

    def scan_for_hexpansion(self):
        found = False
        for port in range(1, 7):
            print(f"Searching for hexpansion on port: {port}")
            i2c = I2C(port)
            addr = detect_eeprom_addr(i2c)

            if addr is None:
                continue
            else:
                print("Found EEPROM at addr " + hex(addr))

            header = read_hexpansion_header(i2c, addr)
            if header is None:
                continue
            else:
                print("Read header: " + str(header))
            self.text = "Hexp. found.\nvid: {}\npid: {}\nat port: {}".format(
                hex(header.vid), hex(header.pid), port)
            found = True

            # Swap 0xCAFE with your EEPROM header vid
            # Swap 0xCAFF with your EEPROM header pid
            if (header.vid == 0xCAFE) and (header.pid == 0xCAFF):
                print("Found the desired hexpansion in port " + str(port))
                self.color = (0, 1, 0)
            else:
                print()
        if not found:
            self.color = (1, 0, 0)
            self.text = "No hexpansion found."

        return None

The code is based on the Caffeine Jitter app which works with the Club Mate hexpansion to make it vibrate.