i2c: phase 4 — WaitGroup interrupt loop + slave notification dispatch
Replace the single-channel object_wait with a WaitGroup that multiplexes
two sources on the i2c_server main loop:
user_data=0 IPC from client (Signals::READABLE on handle::I2C)
user_data=1 I2C2 hardware interrupt (signals::i2c2 on handle::I2C2_IRQ)
Server startup registers both sources once via wait_group_add, then
calls object_wait(WG, READABLE, Instant::MAX) as the single blocking
point. When the WaitGroup fires:
• user_data 1 (interrupt): call drain_slave_rx() for every
notification-enabled bus, interrupt_ack() the IRQ, then
raise_peer_user_signal() to wake the registered client.
• user_data 0 (IPC): dispatch as before; two new ops added:
- EnableSlaveNotification → backend.enable_slave_notification()
- DisableSlaveNotification → backend.disable_slave_notification()
SlaveReceive now calls get_buffered_slave_message() (non-blocking)
instead of the 10 000-iteration poll loop.
system.json5 changes (both i2c-slave and i2c targets):
- Add I2C2_IRQ interrupt object (IRQ 112, name "i2c2")
- Add WG wait_group object
channel_read/channel_respond remain synchronous: by the time the
WaitGroup fires with user_data=0 the channel is already READABLE, so
channel_read returns immediately without blocking.
The OpenPRoT Technical Charter can be found at https://github.com/OpenPRoT/.github/blob/main/GOVERNANCE.md
This project uses cargo-xtask for build automation and project management.
You can run tasks using cargo xtask <task-name>:
cargo xtask build - Build the projectcargo xtask test - Run all testscargo xtask check - Run cargo checkcargo xtask clippy - Run clippy lintscargo xtask fmt - Format code with rustfmtcargo xtask clean - Clean build artifactscargo xtask dist - Build a distribution (release build)cargo xtask docs - Build documentation with mdbookcargo xtask cargo-lock - Manage Cargo.lock filecargo xtask precheckin - Run all pre-checkin validation checkscargo xtask header-check - Check license headers in source filescargo xtask header-fix - Fix missing license headers in source files# Build the project cargo xtask build # Run tests cargo xtask test # Create a distribution cargo xtask dist # Format code cargo xtask fmt # Run clippy cargo xtask clippy # Build documentation cargo xtask docs # Run all pre-checkin validation checks cargo xtask precheckin # Check license headers cargo xtask header-check # Fix missing license headers cargo xtask header-fix
The project is structured as a Cargo workspace with two main components:
openprot/ - The main applicationxtask/ - Build automation scriptsThe xtask workflow allows you to add custom build steps, automation, and project management tasks written in Rust, making them cross-platform and easy to maintain.
No additional tools are required - everything is handled through Cargo and the xtask scripts.