Skip to content
This repository has been archived by the owner on Sep 20, 2023. It is now read-only.

Commit

Permalink
devices: Add Environmental.SenseContinuous(); implement for bme280 (#150
Browse files Browse the repository at this point in the history
)

- devices: Add SenseContinuous() to Environmental.
- devices: Add Device to Display and Environmental.
- devices: Remove fmt.Stringer from Device.
- devices: Add more type assertions to variaous devices and corresponding unit test.
- bme280: Unexport the Standby parameter.
- bme280: Have SenseContinuous accept time.Duration period instead.
- bme280: Do not enable automatic sensing upon initialization.
- bme280: Use forced mode by default.
- bme280smoketest: improved.
  • Loading branch information
maruel committed Aug 20, 2017
1 parent 5bafcc7 commit af3fbce
Show file tree
Hide file tree
Showing 28 changed files with 849 additions and 152 deletions.
79 changes: 51 additions & 28 deletions cmd/bme280/main.go
Expand Up @@ -6,11 +6,13 @@
package main

import (
"errors"
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"os/signal"
"time"

"periph.io/x/periph/conn/i2c"
Expand All @@ -33,28 +35,45 @@ func printPin(fn string, p pin.Pin) {
}
}

func read(e devices.Environmental, interval time.Duration) error {
var t *time.Ticker
if interval != 0 {
t = time.NewTicker(interval)
}
for {
var env devices.Environment
if err := e.Sense(&env); err != nil {
func printEnv(env *devices.Environment) {
fmt.Printf("%8s %10s %9s\n", env.Temperature, env.Pressure, env.Humidity)
}

func run(dev devices.Environmental, interval time.Duration) (err error) {
defer func() {
if err2 := dev.Halt(); err == nil {
err = err2
}
}()

if interval == 0 {
e := devices.Environment{}
if err = dev.Sense(&e); err != nil {
return err
}
fmt.Printf("%8s %10s %9s\n", env.Temperature, env.Pressure, env.Humidity)
if t == nil {
break
printEnv(&e)
return nil
}

c, err2 := dev.SenseContinuous(interval)
if err2 != nil {
return err2
}
chanSignal := make(chan os.Signal)
signal.Notify(chanSignal, os.Interrupt)
for {
select {
case <-chanSignal:
return nil
case e := <-c:
printEnv(&e)
}
<-t.C
}
return nil
}

func mainImpl() error {
i2cID := flag.String("i2c", "", "I²C bus to use")
i2cADDR := flag.Uint("ia", 0, "I²C bus address to use")
i2cID := flag.String("i2c", "", "I²C bus to use (default)")
i2cADDR := flag.Uint("ia", 0, "I²C bus address to use; either 0x76 or 0x77")
spiID := flag.String("spi", "", "SPI port to use")
hz := flag.Int("hz", 0, "I²C bus/SPI port speed")
sample1x := flag.Bool("s1", false, "sample at 1x")
Expand All @@ -74,7 +93,6 @@ func mainImpl() error {
}
log.SetFlags(log.Lmicroseconds)

opts := bme280.Opts{Standby: bme280.S20ms}
s := bme280.O4x
if *sample1x {
s = bme280.O1x
Expand All @@ -87,21 +105,32 @@ func mainImpl() error {
} else if *sample16x {
s = bme280.O16x
}
opts.Temperature = s
opts.Pressure = s
opts.Humidity = s
opts := bme280.Opts{Temperature: s, Pressure: s, Humidity: s}
if *filter2x {
if *interval == 0 {
return errors.New("-f2 only makes sense with -i")
}
opts.Filter = bme280.F2
} else if *filter4x {
if *interval == 0 {
return errors.New("-f4 only makes sense with -i")
}
opts.Filter = bme280.F4
} else if *filter8x {
if *interval == 0 {
return errors.New("-f8 only makes sense with -i")
}
opts.Filter = bme280.F8
} else if *filter16x {
if *interval == 0 {
return errors.New("-f16 only makes sense with -i")
}
opts.Filter = bme280.F16
}
if *i2cADDR != 0 {
opts.Address = uint16(*i2cADDR)
if *i2cADDR != 0x76 && *i2cADDR > 0x77 {
return errors.New("-ia must be either 0x76 or 0x77")
}
opts.Address = uint16(*i2cADDR)

if _, err := host.Init(); err != nil {
return err
Expand Down Expand Up @@ -147,13 +176,7 @@ func mainImpl() error {
return err
}
}

err := read(dev, *interval)
err2 := dev.Halt()
if err != nil {
return err
}
return err2
return run(dev, *interval)
}

func main() {
Expand Down
3 changes: 3 additions & 0 deletions conn/i2c/i2ctest/i2ctest.go
Expand Up @@ -7,6 +7,7 @@ package i2ctest

import (
"bytes"
"fmt"
"sync"

"periph.io/x/periph/conn/conntest"
Expand Down Expand Up @@ -171,3 +172,5 @@ var _ i2c.Bus = &Record{}
var _ i2c.Pins = &Record{}
var _ i2c.Bus = &Playback{}
var _ i2c.Pins = &Playback{}
var _ fmt.Stringer = &Record{}
var _ fmt.Stringer = &Playback{}
11 changes: 11 additions & 0 deletions conn/mmr/mmr.go
Expand Up @@ -31,6 +31,10 @@ type Dev8 struct {
Order binary.ByteOrder
}

func (d *Dev8) String() string {
return fmt.Sprintf("%s", d.Conn)
}

// ReadUint8 reads a 8 bit register.
func (d *Dev8) ReadUint8(reg uint8) (uint8, error) {
if err := d.check(); err != nil {
Expand Down Expand Up @@ -162,6 +166,10 @@ type Dev16 struct {
Order binary.ByteOrder
}

func (d *Dev16) String() string {
return fmt.Sprintf("%s", d.Conn)
}

// ReadUint8 reads a 8 bit register.
func (d *Dev16) ReadUint8(reg uint16) (uint8, error) {
if err := d.check(); err != nil {
Expand Down Expand Up @@ -392,3 +400,6 @@ func isAcceptableInner(t reflect.Type) bool {
return false
}
}

var _ fmt.Stringer = &Dev8{}
var _ fmt.Stringer = &Dev16{}
14 changes: 14 additions & 0 deletions conn/mmr/mmr_test.go
Expand Up @@ -84,6 +84,13 @@ func ExampleDev8_WriteStruct() {

//

func TestDev8_String(t *testing.T) {
d := Dev8{Conn: &conntest.Discard{D: conn.Full}, Order: nil}
if s := d.String(); s != "discard" {
t.Fatal(s)
}
}

func TestDev8_ReadUint_Duplex(t *testing.T) {
d := Dev8{Conn: &conntest.Discard{D: conn.Full}, Order: nil}
if v, err := d.ReadUint8(34); err == nil || v != 0 {
Expand Down Expand Up @@ -323,6 +330,13 @@ func TestDev8_WriteStruct_uint16(t *testing.T) {

//

func TestDev16_String(t *testing.T) {
d := Dev16{Conn: &conntest.Discard{D: conn.Full}, Order: nil}
if s := d.String(); s != "discard" {
t.Fatal(s)
}
}

func TestDev16_ReadUint_Duplex(t *testing.T) {
d := Dev16{Conn: &conntest.Discard{D: conn.Full}, Order: nil}
if v, err := d.ReadUint8(34); err == nil || v != 0 {
Expand Down
1 change: 1 addition & 0 deletions devices/apa102/apa102.go
Expand Up @@ -322,3 +322,4 @@ var errLength = errors.New("apa102: invalid RGB stream length")

var _ devices.Display = &Dev{}
var _ devices.Device = &Dev{}
var _ fmt.Stringer = &Dev{}

0 comments on commit af3fbce

Please sign in to comment.