[Discussion] `digital` marker traits, such as `digital::StronglyDriven`, `digital::OpenDrain`, `digital::OpenCollector`, etc.
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 20/100
- Issue type
- Feature
- Clarity
- Needs clarification
- Activity status
- Stale
- Tech stack
- rust
- Domain
- embedded-iot
Research direction
Start with the Rust BitBangedI2c example and the proposed digital marker traits in this discussion. No repository file or test is named, so first determine where the digital trait API belongs and whether the design has been decided. Done would require an agreed trait design rather than an isolated implementation.
Written by the indexing model from the issue text.
Description
Many MCUs (the STM32s especially) implement a plethora of different output options for their GPIO pins. A driver generally has specific output requirements for its pins -- but enforcing these with API traits will mean there will be many traits available, all implementing similar or identical APIs -- i.e. OutputStronglyDrivenPin, OutputOpenDrainPin, OutputOpenDrainPullupPin, etc.
Advantages
- One API for high-level pin mode (
IoPin,InputPin,OutputPin), with additional traits providing fine-grained configurability - Unusual combinations easy to express (
OutputPin + OpenDrain + PullUp)
Disadvantages
- Possible huge proliferation of implementer types
- The actual pin driving code will likely look similar for all, but initialization will be different. Does this force too much duplication/boilerplate?
- Could this be handled by a builder-like pattern? i.e. pin init functions which consume a type with/without the marker trait, change the config, and return a type without/with the trait?
- Possibility of expressing impossible bounds (i.e.
OutputPin + StronglyDriven + OpenDrain).- Mostly a problem from the driver writer's standpoint, and it will become quickly clear that no available HAL provides the type needed
Example driver usage
pub struct BitBangedI2c<D, C> {
sda: D,
scl: C,
}
impl<D, C> BitBangedI2c<D, C> {
pub fn new<D, C>(sda: D, scl: C) -> BitBangedI2c<D, C>
where
D: digital::IoPin + digital::OpenDrain,
C: digital::IoPin + digital::OpenDrain,
{
BitBangedI2c { sda, scl }
}
}
- Dominant language
- Rust
- Stars
- 2.7k
- Forks
- 282
- PR merge metrics
- No merged PRs in 30d
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from rust-embedded/embedded-hal
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
rust-embedded/embedded-hal#742 · 1 comment ·
-
Difficulty 5/5 Over a week Newbie friendliness 30/100
rust-embedded/embedded-hal#747 · 5 comments · 1 reaction ·
-
Difficulty 5/5 Over a week Newbie friendliness 35/100
rust-embedded/embedded-hal#746 · 2 comments · 1 reaction ·
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
rust-embedded/embedded-hal#745 · 1 reaction ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 55/100
rust-embedded/embedded-hal#744 · 1 comment ·
All issues in rust-embedded/embedded-hal
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
kwakseongjae/auto-hwp#319 ·
-
area:cli bug filter-quality good first issue priority:medium
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
-
Difficulty 1/5 Under an hour Newbie friendliness 72/100
bevyengine/bevy#25861 ·
-
comp-datalake
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
ClickHouse/ClickHouse#121222 ·
-
enhancement remote
Difficulty 2/5 1-3 hours Newbie friendliness 68/100