Skip to content

[BUG] Lick/proximity GPIO callbacks fire before Behavior.logger is set → AttributeError #7

@alexevag

Description

@alexevag

Environment:

  • OS: Linux (Raspberry Pi OS) — setup ef-rp18
  • Python version: 3.9
  • Ethopy version: 0.0.8.8
  • Database version:

Describe the bug
GPIO Lick/Proximity callbacks in RPPorts are armed in __init__, before Behavior.setup() runs and assigns beh.logger. A stray edge in that window triggers the callback while self.beh.logger is still None, raising AttributeError. RPi.GPIO swallows the exception, so the session continues but any real lick/proximity event in that window is silently lost.

To Reproduce

  1. Run an experiment on a Raspberry Pi setup using the RPPorts interface
  2. During startup, between _interface_setup() and beh.setup(self) in experiment.py:213-217, a kernel buffered GPIO edge fires the lick callback.

Expected behavior
GPIO callbacks should not be able to invoke Behavior.log_activity until Behavior.setup() has wired beh.logger. Either callback registration is deferred until after beh.setup(), or callbacks defensively guard against the unready state and log instead of crashing

Error message

2026-05-07 12:00:03 - datajoint - ERROR - Uncaught exception (logging.py:23)
Traceback (most recent call last):
  File "/home/eflab/github/ethopy_package/src/ethopy/interfaces/RPPorts.py", line 273, in _lick_port_activated
    self.beh.log_activity({**self.response.__dict__, 'time':self.resp_tmst})
  File "/home/eflab/github/ethopy_package/src/ethopy/core/behavior.py", line 205, in log_activity
    key = {**self.logger.trial_key,**activity.__dict__}
AttributeError: 'NoneType' object has no attribute 'trial_key'

Additional context
Experiment keeps running despite the error: RPi.GPIO callbacks run on a separate C-thread, an exception inside the callback is caught at the C/Python boundary and the thread loops back for the next edge. Datajoint's exception hook then downgrades the traceback to a log line, and Python doesn't propagate thread exceptions to the main thread. The state machine is oblivious, trials continue, and any lick/proximity events during the gap are silently dropped

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions