-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
gpioutil.Debounce not actually implemented #5
Comments
There's historical reasons for this. 3 years ago I started looking at options to recreate the conn package as I don't feel the current interfaces are optimal. Then go modules were forced and I spent all my free time on splitting the repositories into real go packages. You can find a bit more at:
Because of the uncertainty with how the GPIO functions would look like, I didn't spend time to fix the Debounce code when I carried it over from experimental at https://github.com/google/periph/tree/main/experimental/conn/gpio/gpioutil when I removed experimental when I created the new repositories. There's more at https://periph.io/news/2020/a_new_start/. So that was a lot of words and links to say that help would be very appreciated. |
OK, at the very least I'll do the doc warning. |
Could you please hit the "Convert to issue" button on those tasks? (That should make it link up nicely and I can reference that in the pull request) |
#TIL |
After #10: |
I started multiple changes for v4 but given my current work workload it's unlikely for me to have a v4 in the next year. |
Understood. So after the docfix is in, I'll see if I can take a whack at implementing the logic for v3. |
Looking at the current documentation, the conn/gpio/gpioutil/debounce.go Lines 59 to 62 in 9ee6d81
This is significantly more complicated to implement than the func (d *debounced) WaitForEdge(timeout time.Duration) bool {
prev := d.PinIO.Read()
for {
if !d.PinIO.WaitForEdge(timeout) {
return false
}
time.Sleep(d.denoise)
if d.PinIO.Read() != prev {
return true
}
}
} Looking around, there's a C library called pigpio which has a Getting this to work for func (d *debounced) Read() gpio.Level {
for {
prev := d.PinIO.Read()
time.Sleep(d.denoise)
if d.PinIO.Read() == prev {
return prev
}
}
} Is that what you had in mind? |
My thinking was to save one read if the last read occurred within d.denoise, but in hindsight I'm not sure it was a good idea. |
I'm not sure how that would work... and I don't think it can work in the case of "user calls |
hence my "I'm not sure it was a good idea" :) |
Fair enough 😅 |
lgtm |
Alright, started on this in #12, LMK what you think. |
Apologies if I'm misreading. I have implemented manual debouncing and denoising for my own project, before realizing that
gpioutil.Debounce
exists. It would provide a cleaner API to do the same thing, so I looked into switching to using it. However, observing the current version ofdebounce.go
, it appears that:time
package is for referencing thetime.Duration
typedenoise
anddebounce
properties are only ever compared to 0 or copied aroundexperimental
path, so:gpio.BothEdges
In
on its own anyway.(I've tried to keep the checkbox entries in actual tasks, so they can be used with Task lists).
Am I missing something? I think, at least, that the documentation should clarify the state of this code.
Side-note: While I was aware of the importance of debouncing, denoising was newer to me, and I found out about it the annoying way (I have phantom GPIO "button presses" about every 8 hours; super annoying to debug). Once Debounce is implemented correctly, it's probably worth mentioning in the documentation of WaitForEdge.
The text was updated successfully, but these errors were encountered: