From 089b8dccab218b43ec37cce31d4b2a722030579b Mon Sep 17 00:00:00 2001 From: Marc-Antoine Ruel Date: Thu, 21 Dec 2017 21:51:50 -0500 Subject: [PATCH] Reduce number of errcheck lint messages from 117 to 2. - Ran github.com/kisielk/errcheck on the code base, and either trapped errors or marked them as ignored explicitly. The stats was calculated via: errcheck ./... | grep -v defer | wc -l - Stop registering gpio.INVALID, it can't be registered. - Fix a go vet issue in cap1188. --- .../bmxx80/bmx280smoketest/bmx280smoketest.go | 4 +- devices/ds18b20/ds18b20.go | 62 +++++++++++-------- devices/lirc/lirc.go | 2 +- .../ssd1306smoketest/ssd1306smoketest.go | 4 +- devices/tm1637/tm1637.go | 40 +++++++----- experimental/devices/bitbang/i2c.go | 22 +++---- experimental/devices/bitbang/spi.go | 10 +-- experimental/devices/cap1188/cap1188.go | 36 ++++++----- 8 files changed, 102 insertions(+), 78 deletions(-) diff --git a/devices/bmxx80/bmx280smoketest/bmx280smoketest.go b/devices/bmxx80/bmx280smoketest/bmx280smoketest.go index ea8f1de..3e72571 100644 --- a/devices/bmxx80/bmx280smoketest/bmx280smoketest.go +++ b/devices/bmxx80/bmx280smoketest/bmx280smoketest.go @@ -42,7 +42,9 @@ func (s *SmokeTest) Run(f *flag.FlagSet, args []string) (err error) { i2cAddr := f.Uint("ia", 0x76, "I²C bus address to use; either 0x76 (BMx280, the default) or 0x77 (BMP180)") spiID := f.String("spi", "", "SPI port to use") record := f.Bool("r", false, "record operation (for playback unit testing)") - f.Parse(args) + if err := f.Parse(args); err != nil { + return err + } if f.NArg() != 0 { f.Usage() return errors.New("unrecognized arguments") diff --git a/devices/ds18b20/ds18b20.go b/devices/ds18b20/ds18b20.go index caa0fa9..9380fa5 100644 --- a/devices/ds18b20/ds18b20.go +++ b/devices/ds18b20/ds18b20.go @@ -31,15 +31,16 @@ import ( "periph.io/x/periph/devices" ) -// New returns an object that communicates over 1-wire to the DS18B20 sensor with the -// specified 64-bit address. +// New returns an object that communicates over 1-wire to the DS18B20 sensor +// with the specified 64-bit address. // -// resolutionBits must be in the range 9..12 and determines how many bits of precision -// the readings have. The resolution affects the conversion time: 9bits:94ms, 10bits:188ms, -// 11bits:375ms, 12bits:750ms. +// resolutionBits must be in the range 9..12 and determines how many bits of +// precision the readings have. The resolution affects the conversion time: +// 9bits:94ms, 10bits:188ms, 11bits:375ms, 12bits:750ms. // -// A resolution of 10 bits corresponds to 0.25C and tends to be a good compromise between -// conversion time and the device's inherent accuracy of +/-0.5C. +// A resolution of 10 bits corresponds to 0.25C and tends to be a good +// compromise between conversion time and the device's inherent accuracy of +// +/-0.5C. func New(o onewire.Bus, addr onewire.Address, resolutionBits int) (*Dev, error) { if resolutionBits < 9 || resolutionBits > 12 { return nil, errors.New("ds18b20: invalid resolutionBits") @@ -47,8 +48,8 @@ func New(o onewire.Bus, addr onewire.Address, resolutionBits int) (*Dev, error) d := &Dev{onewire: onewire.Dev{Bus: o, Addr: addr}, resolution: resolutionBits} - // Start by reading the scratchpad memory, this will tell us whether we can talk to the - // device correctly and also how it's configured. + // Start by reading the scratchpad memory, this will tell us whether we can + // talk to the device correctly and also how it's configured. spad, err := d.readScratchpad() if err != nil { return nil, err @@ -57,10 +58,14 @@ func New(o onewire.Bus, addr onewire.Address, resolutionBits int) (*Dev, error) // Change the resolution, if necessary (datasheet p.6). if int(spad[4]>>5) != resolutionBits-9 { // Set the value in the configuration register. - d.onewire.Tx([]byte{0x4e, 0, 0, byte((resolutionBits-9)<<5) | 0x1f}, nil) + if err := d.onewire.Tx([]byte{0x4e, 0, 0, byte((resolutionBits-9)<<5) | 0x1f}, nil); err != nil { + return nil, err + } // Copy the scratchpad to EEPROM to save the values. - d.onewire.TxPower([]byte{0x48}, nil) - // Wait for the write to complete + if err := d.onewire.TxPower([]byte{0x48}, nil); err != nil { + return nil, err + } + // Wait for the write to complete. time.Sleep(10 * time.Millisecond) } @@ -69,13 +74,13 @@ func New(o onewire.Bus, addr onewire.Address, resolutionBits int) (*Dev, error) // ConvertAll performs a conversion on all DS18B20 devices on the bus. // -// During the conversion it places the bus in strong pull-up mode to -// power parasitic devices and returns when the conversions have -// completed. This time period is determined by the maximum -// resolution of all devices on the bus and must be provided. +// During the conversion it places the bus in strong pull-up mode to power +// parasitic devices and returns when the conversions have completed. This time +// period is determined by the maximum resolution of all devices on the bus and +// must be provided. // -// ConvertAll uses time.Sleep to wait for the conversion to finish, -// which takes from 94ms to 752ms. +// ConvertAll uses time.Sleep to wait for the conversion to finish, which takes +// from 94ms to 752ms. func ConvertAll(o onewire.Bus, maxResolutionBits int) error { if maxResolutionBits < 9 || maxResolutionBits > 12 { return errors.New("ds18b20: invalid maxResolutionBits") @@ -89,7 +94,8 @@ func ConvertAll(o onewire.Bus, maxResolutionBits int) error { //===== Dev -// Dev is a handle to a Dallas Semi / Maxim DS18B20 temperature sensor on a 1-wire bus. +// Dev is a handle to a Dallas Semi / Maxim DS18B20 temperature sensor on a +// 1-wire bus. type Dev struct { onewire onewire.Dev // device on 1-wire bus resolution int // resolution in bits (9..12) @@ -113,7 +119,9 @@ func (d *Dev) Temperature() (devices.Celsius, error) { return d.LastTemp() } -// LastTemp reads the temperature resulting from the last conversion from the device. +// LastTemp reads the temperature resulting from the last conversion from the +// device. +// // It is useful in combination with ConvertAll. func (d *Dev) LastTemp() (devices.Celsius, error) { // Read the scratchpad memory. @@ -122,15 +130,15 @@ func (d *Dev) LastTemp() (devices.Celsius, error) { return 0, err } - // spad[1] is MSB, spad[0] is LSB and has 4 fractional bits. Need to do sign extension - // multiply by 1000 to get devices.Millis, divide by 16 due to 4 fractional bits. - // Datasheet p.4. + // spad[1] is MSB, spad[0] is LSB and has 4 fractional bits. Need to do sign + // extension multiply by 1000 to get devices.Millis, divide by 16 due to 4 + // fractional bits. Datasheet p.4. c := (devices.Celsius(int8(spad[1]))<<8 + devices.Celsius(spad[0])) * 1000 / 16 - // The device powers up with a value of 85°C, so if we read that odds are very high - // that either no conversion was performed or that the conversion failed due to lack of - // power. This prevents reading a temp of exactly 85°C, but that seems like the right - // tradeoff. + // The device powers up with a value of 85°C, so if we read that odds are + // very high that either no conversion was performed or that the conversion + // failed due to lack of power. This prevents reading a temp of exactly 85°C, + // but that seems like the right tradeoff. if c == 85000 { return 0, busError("ds18b20: has not performed a temperature conversion (insufficient pull-up?)") } diff --git a/devices/lirc/lirc.go b/devices/lirc/lirc.go index 0f72962..e4343b8 100644 --- a/devices/lirc/lirc.go +++ b/devices/lirc/lirc.go @@ -37,7 +37,7 @@ func New() (*Conn, error) { c := &Conn{w: w, c: make(chan ir.Message), list: map[string][]string{}} // Unconditionally retrieve the list of all known keys at start. if _, err := w.Write([]byte("LIST\n")); err != nil { - w.Close() + _ = w.Close() return nil, err } go c.loop(bufio.NewReader(w)) diff --git a/devices/ssd1306/ssd1306smoketest/ssd1306smoketest.go b/devices/ssd1306/ssd1306smoketest/ssd1306smoketest.go index 8392452..2eab1b9 100644 --- a/devices/ssd1306/ssd1306smoketest/ssd1306smoketest.go +++ b/devices/ssd1306/ssd1306smoketest/ssd1306smoketest.go @@ -62,7 +62,9 @@ func (s *SmokeTest) Run(f *flag.FlagSet, args []string) (err error) { rotated := f.Bool("rotated", false, "Rotate the displays by 180°") record := f.Bool("record", false, "record operation (for playback unit testing)") - f.Parse(args) + if err := f.Parse(args); err != nil { + return err + } if f.NArg() != 0 { f.Usage() return errors.New("unrecognized arguments") diff --git a/devices/tm1637/tm1637.go b/devices/tm1637/tm1637.go index 793a3e2..bf84909 100644 --- a/devices/tm1637/tm1637.go +++ b/devices/tm1637/tm1637.go @@ -79,7 +79,9 @@ func (d *Dev) SetBrightness(b Brightness) error { runtime.LockOSThread() defer runtime.UnlockOSThread() d.start() - d.writeByte(byte(b)) + if _, err := d.writeByte(byte(b)); err != nil { + return err + } d.stop() return nil } @@ -104,15 +106,23 @@ func (d *Dev) Write(seg []byte) (int, error) { // Use auto-incrementing address. It is possible to write to a single // segment but there isn't much point. d.start() - d.writeByte(0x40) + if _, err := d.writeByte(0x40); err != nil { + return 0, err + } d.stop() d.start() - d.writeByte(0xC0) + if _, err := d.writeByte(0xC0); err != nil { + return 0, err + } for i := 0; i < 6; i++ { if len(seg) <= i { - d.writeByte(0) + if _, err := d.writeByte(0); err != nil { + return i, err + } } else { - d.writeByte(seg[i]) + if _, err := d.writeByte(seg[i]); err != nil { + return i, err + } } } d.stop() @@ -153,16 +163,16 @@ var digitToSegment = []byte{ } func (d *Dev) start() { - d.data.Out(gpio.Low) + _ = d.data.Out(gpio.Low) d.sleepHalfCycle() - d.clk.Out(gpio.Low) + _ = d.clk.Out(gpio.Low) } func (d *Dev) stop() { d.sleepHalfCycle() - d.clk.Out(gpio.High) + _ = d.clk.Out(gpio.High) d.sleepHalfCycle() - d.data.Out(gpio.High) + _ = d.data.Out(gpio.High) d.sleepHalfCycle() } @@ -171,27 +181,27 @@ func (d *Dev) stop() { func (d *Dev) writeByte(b byte) (bool, error) { for i := 0; i < 8; i++ { // LSB (!) - d.data.Out(b&(1<