diff --git a/components/board/board.go b/components/board/board.go index f7b293ec476..c61e6ab37b1 100644 --- a/components/board/board.go +++ b/components/board/board.go @@ -11,6 +11,7 @@ import ( commonpb "go.viam.com/api/common/v1" pb "go.viam.com/api/component/board/v1" + "go.viam.com/rdk/components/board/pinwrappers" "go.viam.com/rdk/data" "go.viam.com/rdk/resource" "go.viam.com/rdk/robot" diff --git a/components/board/pinwrappers/digital_interrupts.go b/components/board/pinwrappers/digital_interrupts.go index 756e2e793bb..384e84ac449 100644 --- a/components/board/pinwrappers/digital_interrupts.go +++ b/components/board/pinwrappers/digital_interrupts.go @@ -115,3 +115,19 @@ func (i *BasicDigitalInterrupt) Reconfigure(conf board.DigitalInterruptConfig) e i.cfg = conf return nil } + +// RemoveCallback removes a listener for interrupts. +func RemoveCallback(di board.DigitalInterrupt, c chan board.Tick) { + i := di.(*BasicDigitalInterrupt) + i.mu.Lock() + defer i.mu.Unlock() + for id := range i.callbacks { + if i.callbacks[id] == c { + // To remove this item, we replace it with the last item in the list, then truncate the + // list by 1. + i.callbacks[id] = i.callbacks[len(i.callbacks)-1] + i.callbacks = i.callbacks[:len(i.callbacks)-1] + break + } + } +} diff --git a/components/board/pinwrappers/digital_interrupts_test.go b/components/board/pinwrappers/digital_interrupts_test.go index 09e7e9c0f63..e4054ca2c42 100644 --- a/components/board/pinwrappers/digital_interrupts_test.go +++ b/components/board/pinwrappers/digital_interrupts_test.go @@ -51,7 +51,7 @@ func TestBasicDigitalInterrupt1(t *testing.T) { test.That(t, v.High, test.ShouldBeTrue) test.That(t, v.TimestampNanosec, test.ShouldEqual, timeNanoSec) - i.RemoveCallback(c) + RemoveCallback(i, c) c = make(chan board.Tick, 2) i.AddCallback(c) @@ -111,8 +111,8 @@ func TestRemoveCallbackDigitalInterrupt(t *testing.T) { i.AddCallback(c2) test.That(t, ret, test.ShouldBeTrue) - i.RemoveCallback(c1) - i.RemoveCallback(c1) + RemoveCallback(i, c1) + RemoveCallback(i, c1) ret2 := false result := make(chan bool, 1)