RTOS Thread and EventQueue freezes the application when using Timeout

I probably don’t fully understanding how threads work, as this is my first adventure into RTOS - but at the same time I want to think this is valid code :thinking:.

What I am doing in my app is using an EventQueue to execute non-safe interrupt code everytime an interrupt occurs.

In other words, I have an interrupt which when “triggered”, will add a function to the EventQueue to be executed later via a separate Thread I invoked (in addition to the main() thread).

This was working all nice and dandy until I decided to use a Timeout object inside this function getting executed by the EventQueue.

Here is the code

class TouchyLighty
{
public:
    MPR121 *pads;
    IS31FL3736 *leds;
    EventQueue *queue;
    Timeout timout;
    volatile int row = 0;
    volatile uint8_t lastTouched;

    TouchyLighty(int _row, MPR121 *touch_ptr, IS31FL3736 *leds_ptr, EventQueue *queue_ptr)
    {
        pads = touch_ptr;
        leds = leds_ptr;
        queue = queue_ptr;
        row = _row;
        pads->attachInteruptCallback(queue->event(callback(pads, &MPR121::handleTouch)));
        pads->attachCallbackTouched(callback(this, &TouchyLighty::onTouch));
        pads->attachCallbackReleased(callback(this, &TouchyLighty::onRelease));
    };

    void init()
    {
        pads->init();
        pads->enable();
    }

    void deluminate() {
        leds->setLED(row, lastTouched, false);
    }

    void onTouch(uint8_t pad)
    {
        lastTouched = pad;
        leds->setLED(row, lastTouched, true);
    }

    void onRelease(uint8_t pad)
    {
        lastTouched = pad;
        // deluminate();
        timout.attach(this, &TouchyLighty::deluminate, 0.3);
    }
};

Without going to much into detail, the class uses touch pads, which when touched, triggers and interrupt routine which then adds a function to the EventQueue to then communicate with the touch IC, find out which pad was touched, and then turn on/off some corresponding LEDs.

If you look at the onRelease() method, I use the Timeout object to turn off the LED 0.3 seconds after my finger is released from the touch pad.

timout.attach(this, &TouchyLighty::deluminate, 0.3);

↑↑↑ This is what is freezing the app ↑↑↑

I kinda figured this would be safe to call in a function being executed by EventQueue, but I guess it is a little sketchy because I am asking the queue to execute something at a later time… :thinking:

Anyone have expertise on this? Should I be using another Thread perhaps? Which some Timer object or something?