ads1x15: fix a race condition

pull/1/head
Marc-Antoine Ruel 8 years ago
parent 41baeb565b
commit 641330bde8

@ -120,7 +120,7 @@ type Dev struct {
c i2c.Dev
name string
dataRates map[int]uint16
mu sync.Mutex
mu sync.Mutex // For executePreparedQuery()
}
// NewADS1015 creates a new driver for the ADS1015 (12-bit ADC).
@ -387,14 +387,17 @@ var (
)
type analogPin struct {
// Immutable.
adc *Dev
c Channel
query [3]byte
voltageMultiplier physic.ElectricPotential
waitTime time.Duration
requestedFrequency physic.Frequency
stop chan struct{}
mu sync.Mutex
// Mutable.
mu sync.Mutex
stop chan struct{}
}
// Range returns the maximum supported range [min, max] of the values.
@ -422,15 +425,14 @@ func (p *analogPin) ReadContinuous() <-chan analog.Reading {
}
reading := make(chan analog.Reading, 16)
p.stop = make(chan struct{})
t := time.NewTicker(p.requestedFrequency.Duration())
go func() {
t := time.NewTicker(p.requestedFrequency.Duration())
go func(s <-chan struct{}) {
defer t.Stop()
defer close(reading)
for {
select {
case <-p.stop:
case <-s:
return
case <-t.C:
value, err := p.Read()
@ -441,7 +443,7 @@ func (p *analogPin) ReadContinuous() <-chan analog.Reading {
reading <- value
}
}
}()
}(p.stop)
return reading
}

Loading…
Cancel
Save