OneWire bus impl

This commit is contained in:
Max Matveev 2016-02-05 22:16:51 -08:00
parent bfcd1345fe
commit 82f119fadb
72 changed files with 568 additions and 174 deletions

View File

@ -3,7 +3,7 @@
This actually is really simple. A few simple guidelines and we can break for dinner:
* EMBD is designed with a lot of affection, with utmost importance given to the dev experience (read: the API feel and style.) So always think from that angle when creating the pull request
* [Documentation](https://godoc.org/github.com/kidoman/embd) helps drive adoption. No exceptions
* [Documentation](https://godoc.org/github.com/zlowred/embd) helps drive adoption. No exceptions
When it comes to the code:

View File

@ -1,4 +1,4 @@
# embd [![Build Status](https://travis-ci.org/kidoman/embd.svg?branch=master)](https://travis-ci.org/kidoman/embd) [![GoDoc](http://godoc.org/github.com/kidoman/embd?status.png)](http://godoc.org/github.com/kidoman/embd)
# embd [![Build Status](https://travis-ci.org/kidoman/embd.svg?branch=master)](https://travis-ci.org/kidoman/embd) [![GoDoc](http://godoc.org/github.com/zlowred/embd?status.png)](http://godoc.org/github.com/zlowred/embd)
**embd** is a hardware abstraction layer (HAL) for embedded systems.
@ -6,7 +6,7 @@ It allows you to start your hardware hack on easily available hobby boards (like
Development supported and sponsored by [**SoStronk**](https://www.sostronk.com) and [**ThoughtWorks**](http://www.thoughtworks.com/)
Also, you might be interested in: [Why Golang?](https://github.com/kidoman/embd/wiki/Why-Go)
Also, you might be interested in: [Why Golang?](https://github.com/zlowred/embd/wiki/Why-Go)
[Blog post introducing EMBD](http://kidoman.io/framework/embd.html)
@ -20,8 +20,8 @@ package main
import (
"time"
"github.com/kidoman/embd"
_ "github.com/kidoman/embd/host/rpi" // This loads the RPi driver
"github.com/zlowred/embd"
_ "github.com/zlowred/embd/host/rpi" // This loads the RPi driver
)
func main() {
@ -34,7 +34,7 @@ func main() {
Then install the EMBD package (go1.2 and greater is required):
$ go get github.com/kidoman/embd
$ go get github.com/zlowred/embd
Build the binary*:
@ -58,7 +58,7 @@ Then run the program with ```sudo```*:
* We are instructing the ```go``` compiler to create a binary which will run on the RaspberryPi processor
* Assuming your RaspberryPi has an IP address of ```192.168.2.2```. Substitute as necessary
* ```sudo``` (root) permission is required as we are controlling the hardware by writing to special files
* This sample program is optimized for brevity and does not clean up after itself. Click here to see the [full version](https://github.com/kidoman/embd/blob/master/samples/fullblinker.go)
* This sample program is optimized for brevity and does not clean up after itself. Click here to see the [full version](https://github.com/zlowred/embd/blob/master/samples/fullblinker.go)
## Getting Help
@ -76,7 +76,7 @@ Join the [mailing list](https://groups.google.com/forum/#!forum/go-embd)
## The command line tool
go get github.com/kidoman/embd/embd
go get github.com/zlowred/embd/embd
will install a command line utility ```embd``` which will allow you to quickly get started with prototyping. The binary should be available in your ```$GOPATH/bin```. However, to be able to run this on a ARM based device, you will need to build it with ```GOOS=linux``` and ```GOARCH=arm``` environment variables set.
@ -96,14 +96,14 @@ Package **embd** provides a hardware abstraction layer for doing embedded progra
on supported platforms like the Raspberry Pi and BeagleBone Black. Most of the examples below
will work without change (i.e. the same binary) on all supported platforms. How cool is that?
Although samples are all present in the [samples](https://github.com/kidoman/embd/tree/master/samples) folder,
Although samples are all present in the [samples](https://github.com/zlowred/embd/tree/master/samples) folder,
we will show a few choice examples here.
Use the **LED** driver to toggle LEDs on the BBB:
```go
import "github.com/kidoman/embd"
import _ "github.com/kidoman/embd/host/all"
import "github.com/zlowred/embd"
import _ "github.com/zlowred/embd/host/all"
...
embd.InitLED()
defer embd.CloseLED()
@ -116,8 +116,8 @@ led.Toggle()
Even shorter when quickly trying things out:
```go
import "github.com/kidoman/embd"
import _ "github.com/kidoman/embd/host/all"
import "github.com/zlowred/embd"
import _ "github.com/zlowred/embd/host/all"
...
embd.InitLED()
defer embd.CloseLED()
@ -130,8 +130,8 @@ embd.ToggleLED(3)
BBB + **PWM**:
```go
import "github.com/kidoman/embd"
import _ "github.com/kidoman/embd/host/all"
import "github.com/zlowred/embd"
import _ "github.com/zlowred/embd/host/all"
...
embd.InitGPIO()
defer embd.CloseGPIO()
@ -145,8 +145,8 @@ pwm.SetDuty(1000)
Control **GPIO** pins on the RaspberryPi / BeagleBone Black:
```go
import "github.com/kidoman/embd"
import _ "github.com/kidoman/embd/host/all"
import "github.com/zlowred/embd"
import _ "github.com/zlowred/embd/host/all"
...
embd.InitGPIO()
defer embd.CloseGPIO()
@ -158,8 +158,8 @@ embd.DigitalWrite(10, embd.High)
Could also do:
```go
import "github.com/kidoman/embd"
import _ "github.com/kidoman/embd/host/all"
import "github.com/zlowred/embd"
import _ "github.com/zlowred/embd/host/all"
...
embd.InitGPIO()
defer embd.CloseGPIO()
@ -173,9 +173,9 @@ pin.Write(embd.High)
Or read data from the **Bosch BMP085** barometric sensor:
```go
import "github.com/kidoman/embd"
import "github.com/kidoman/embd/sensor/bmp085"
import _ "github.com/kidoman/embd/host/all"
import "github.com/zlowred/embd"
import "github.com/zlowred/embd/sensor/bmp085"
import _ "github.com/zlowred/embd/host/all"
...
bus := embd.NewI2CBus(1)
...
@ -188,9 +188,9 @@ altitude, err := baro.Altitude()
Even find out the heading from the **LSM303** magnetometer:
```go
import "github.com/kidoman/embd"
import "github.com/kidoman/embd/sensor/lsm303"
import _ "github.com/kidoman/embd/host/all"
import "github.com/zlowred/embd"
import "github.com/zlowred/embd/sensor/lsm303"
import _ "github.com/zlowred/embd/host/all"
...
bus := embd.NewI2CBus(1)
...
@ -204,28 +204,28 @@ platforms.
## Protocols Supported
* **Digital GPIO** [Documentation](http://godoc.org/github.com/kidoman/embd#DigitalPin)
* **Analog GPIO** [Documentation](http://godoc.org/github.com/kidoman/embd#AnalogPin)
* **PWM** [Documentation](http://godoc.org/github.com/kidoman/embd#PWMPin)
* **I2C** [Documentation](http://godoc.org/github.com/kidoman/embd#I2CBus)
* **LED** [Documentation](http://godoc.org/github.com/kidoman/embd#LED)
* **SPI** [Documentation](http://godoc.org/github.com/kidoman/embd#SPIBus)
* **Digital GPIO** [Documentation](http://godoc.org/github.com/zlowred/embd#DigitalPin)
* **Analog GPIO** [Documentation](http://godoc.org/github.com/zlowred/embd#AnalogPin)
* **PWM** [Documentation](http://godoc.org/github.com/zlowred/embd#PWMPin)
* **I2C** [Documentation](http://godoc.org/github.com/zlowred/embd#I2CBus)
* **LED** [Documentation](http://godoc.org/github.com/zlowred/embd#LED)
* **SPI** [Documentation](http://godoc.org/github.com/zlowred/embd#SPIBus)
## Sensors Supported
* **TMP006** Thermopile sensor [Documentation](http://godoc.org/github.com/kidoman/embd/sensor/tmp006), [Datasheet](http://www.adafruit.com/datasheets/tmp006.pdf), [Userguide](http://www.adafruit.com/datasheets/tmp006ug.pdf)
* **TMP006** Thermopile sensor [Documentation](http://godoc.org/github.com/zlowred/embd/sensor/tmp006), [Datasheet](http://www.adafruit.com/datasheets/tmp006.pdf), [Userguide](http://www.adafruit.com/datasheets/tmp006ug.pdf)
* **BMP085** Barometric pressure sensor [Documentation](http://godoc.org/github.com/kidoman/embd/sensor/bmp085), [Datasheet](https://www.sparkfun.com/datasheets/Components/General/BST-BMP085-DS000-05.pdf)
* **BMP085** Barometric pressure sensor [Documentation](http://godoc.org/github.com/zlowred/embd/sensor/bmp085), [Datasheet](https://www.sparkfun.com/datasheets/Components/General/BST-BMP085-DS000-05.pdf)
* **BMP180** Barometric pressure sensor [Documentation](http://godoc.org/github.com/kidoman/embd/sensor/bmp180), [Datasheet](http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf)
* **BMP180** Barometric pressure sensor [Documentation](http://godoc.org/github.com/zlowred/embd/sensor/bmp180), [Datasheet](http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf)
* **LSM303** Accelerometer and magnetometer [Documentation](http://godoc.org/github.com/kidoman/embd/sensor/lsm303), [Datasheet](https://www.sparkfun.com/datasheets/Sensors/Magneto/LSM303%20Datasheet.pdf)
* **LSM303** Accelerometer and magnetometer [Documentation](http://godoc.org/github.com/zlowred/embd/sensor/lsm303), [Datasheet](https://www.sparkfun.com/datasheets/Sensors/Magneto/LSM303%20Datasheet.pdf)
* **L3GD20** Gyroscope [Documentation](http://godoc.org/github.com/kidoman/embd/sensor/l3gd20), [Datasheet](http://www.adafruit.com/datasheets/L3GD20.pdf)
* **L3GD20** Gyroscope [Documentation](http://godoc.org/github.com/zlowred/embd/sensor/l3gd20), [Datasheet](http://www.adafruit.com/datasheets/L3GD20.pdf)
* **US020** Ultrasonic proximity sensor [Documentation](http://godoc.org/github.com/kidoman/embd/sensor/us020), [Product Page](http://www.digibay.in/sensor/object-detection-and-proximity?product_id=239)
* **US020** Ultrasonic proximity sensor [Documentation](http://godoc.org/github.com/zlowred/embd/sensor/us020), [Product Page](http://www.digibay.in/sensor/object-detection-and-proximity?product_id=239)
* **BH1750FVI** Luminosity sensor [Documentation](http://godoc.org/github.com/kidoman/embd/sensor/bh1750fvi), [Datasheet](http://www.elechouse.com/elechouse/images/product/Digital%20light%20Sensor/bh1750fvi-e.pdf)
* **BH1750FVI** Luminosity sensor [Documentation](http://godoc.org/github.com/zlowred/embd/sensor/bh1750fvi), [Datasheet](http://www.elechouse.com/elechouse/images/product/Digital%20light%20Sensor/bh1750fvi-e.pdf)
## Interfaces
@ -233,11 +233,11 @@ platforms.
## Controllers
* **PCA9685** 16-channel, 12-bit PWM Controller with I2C protocol [Documentation](http://godoc.org/github.com/kidoman/embd/controller/pca9685), [Datasheet](http://www.adafruit.com/datasheets/PCA9685.pdf), [Product Page](http://www.adafruit.com/products/815)
* **PCA9685** 16-channel, 12-bit PWM Controller with I2C protocol [Documentation](http://godoc.org/github.com/zlowred/embd/controller/pca9685), [Datasheet](http://www.adafruit.com/datasheets/PCA9685.pdf), [Product Page](http://www.adafruit.com/products/815)
* **MCP4725** 12-bit DAC [Documentation](http://godoc.org/github.com/kidoman/embd/controller/mcp4725), [Datasheet](http://www.adafruit.com/datasheets/mcp4725.pdf), [Product Page](http://www.adafruit.com/products/935)
* **MCP4725** 12-bit DAC [Documentation](http://godoc.org/github.com/zlowred/embd/controller/mcp4725), [Datasheet](http://www.adafruit.com/datasheets/mcp4725.pdf), [Product Page](http://www.adafruit.com/products/935)
* **ServoBlaster** RPi PWM/PCM based PWM controller [Documentation](http://godoc.org/github.com/kidoman/embd/controller/servoblaster), [Product Page](https://github.com/richardghirst/PiBits/tree/master/ServoBlaster)
* **ServoBlaster** RPi PWM/PCM based PWM controller [Documentation](http://godoc.org/github.com/zlowred/embd/controller/servoblaster), [Product Page](https://github.com/richardghirst/PiBits/tree/master/ServoBlaster)
## Convertors
@ -245,10 +245,10 @@ platforms.
## Contributing
We look forward to your pull requests, but contributions which abide by the [guidelines](https://github.com/kidoman/embd/blob/master/CONTRIBUTING.md) will get a free beer!
We look forward to your pull requests, but contributions which abide by the [guidelines](https://github.com/zlowred/embd/blob/master/CONTRIBUTING.md) will get a free beer!
File an [issue](https://github.com/kidoman/embd/issues), open a [pull request](https://github.com/kidoman/embd/pulls). We are waiting.
File an [issue](https://github.com/zlowred/embd/issues), open a [pull request](https://github.com/zlowred/embd/pulls). We are waiting.
## About
EMBD is affectionately designed/developed by Karan Misra ([kidoman](https://github.com/kidoman)), Kunal Powar ([kunalpowar](https://github.com/kunalpowar)) and [FRIENDS](https://github.com/kidoman/embd/blob/master/AUTHORS). We also have a list of [CONTRIBUTORS](https://github.com/kidoman/embd/blob/master/CONTRIBUTORS).
EMBD is affectionately designed/developed by Karan Misra ([kidoman](https://github.com/kidoman)), Kunal Powar ([kunalpowar](https://github.com/kunalpowar)) and [FRIENDS](https://github.com/zlowred/embd/blob/master/AUTHORS). We also have a list of [CONTRIBUTORS](https://github.com/zlowred/embd/blob/master/CONTRIBUTORS).

View File

@ -16,7 +16,7 @@ import (
"time"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
type entryMode byte

View File

@ -6,7 +6,7 @@ import (
"testing"
"time"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
const (

View File

@ -5,7 +5,7 @@ import (
"sync"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
const (

View File

@ -7,8 +7,8 @@ import (
"time"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/kidoman/embd/util"
"github.com/zlowred/embd"
"github.com/zlowred/embd/util"
)
const (

View File

@ -3,7 +3,7 @@ package mcp3008
import (
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
// MCP3008 represents a mcp3008 8bit DAC.

View File

@ -15,6 +15,7 @@ type Descriptor struct {
I2CDriver func() I2CDriver
LEDDriver func() LEDDriver
SPIDriver func() SPIDriver
W1Driver func() W1Driver
}
// The Describer type is a Descriptor provider.

View File

@ -122,6 +122,6 @@ func DetectHost() (host Host, rev int, err error) {
case strings.Contains(hardware, "BCM2708") || strings.Contains(hardware, "BCM2709"):
return HostRPi, rev, nil
default:
return HostNull, 0, fmt.Errorf(`embd: your host "%v:%v" is not supported at this moment. request support at https://github.com/kidoman/embd/issues`, host, model)
return HostNull, 0, fmt.Errorf(`embd: your host "%v:%v" is not supported at this moment. request support at https://github.com/zlowred/embd/issues`, host, model)
}
}

18
doc.go
View File

@ -7,7 +7,7 @@
Use the LED driver to toggle LEDs on the BBB:
import "github.com/kidoman/embd"
import "github.com/zlowred/embd"
...
embd.InitLED()
defer embd.CloseLED()
@ -18,7 +18,7 @@
Even shorter while prototyping:
import "github.com/kidoman/embd"
import "github.com/zlowred/embd"
...
embd.InitLED()
defer embd.CloseLED()
@ -27,7 +27,7 @@
BBB + PWM:
import "github.com/kidoman/embd"
import "github.com/zlowred/embd"
...
embd.InitGPIO()
defer embd.CloseGPIO()
@ -39,7 +39,7 @@
Control GPIO pins on the RaspberryPi / BeagleBone Black:
import "github.com/kidoman/embd"
import "github.com/zlowred/embd"
...
embd.InitGPIO()
defer embd.CloseGPIO()
@ -49,7 +49,7 @@
Could also do:
import "github.com/kidoman/embd"
import "github.com/zlowred/embd"
...
embd.InitGPIO()
defer embd.CloseGPIO()
@ -61,8 +61,8 @@
Or read data from the Bosch BMP085 barometric sensor:
import "github.com/kidoman/embd"
import "github.com/kidoman/embd/sensor/bmp085"
import "github.com/zlowred/embd"
import "github.com/zlowred/embd/sensor/bmp085"
...
bus := embd.NewI2CBus(1)
...
@ -73,8 +73,8 @@
Even find out the heading from the LSM303 magnetometer:
import "github.com/kidoman/embd"
import "github.com/kidoman/embd/sensor/lsm303"
import "github.com/zlowred/embd"
import "github.com/zlowred/embd/sensor/lsm303"
...
bus := embd.NewI2CBus(1)
...

View File

@ -5,7 +5,7 @@ import (
"os"
"github.com/codegangsta/cli"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
func detect(c *cli.Context) {

View File

@ -4,7 +4,7 @@ import (
"os"
"github.com/codegangsta/cli"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
var version = "0.1.0"

View File

@ -2,6 +2,6 @@
package all
import (
_ "github.com/kidoman/embd/host/bbb"
_ "github.com/kidoman/embd/host/rpi"
_ "github.com/zlowred/embd/host/bbb"
_ "github.com/zlowred/embd/host/rpi"
)

View File

@ -9,7 +9,7 @@ import (
"strconv"
"strings"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
type analogPin struct {

View File

@ -3,7 +3,7 @@ package bbb
import (
"testing"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
func TestAnalogPinClose(t *testing.T) {

View File

@ -16,8 +16,8 @@ import (
"strings"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/kidoman/embd/host/generic"
"github.com/zlowred/embd"
"github.com/zlowred/embd/host/generic"
)
var pins = embd.PinMap{

View File

@ -11,8 +11,8 @@ import (
"time"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/kidoman/embd/util"
"github.com/zlowred/embd"
"github.com/zlowred/embd/util"
)
const (

View File

@ -3,7 +3,7 @@ package bbb
import (
"testing"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
func TestPWMPinClose(t *testing.T) {

View File

@ -12,7 +12,7 @@ import (
"strconv"
"time"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
type digitalPin struct {

View File

@ -3,7 +3,7 @@ package generic
import (
"testing"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
func TestDigitalPinClose(t *testing.T) {

View File

@ -12,7 +12,7 @@ import (
"unsafe"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
const (

View File

@ -8,7 +8,7 @@ import (
"sync"
"syscall"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
const (

View File

@ -8,7 +8,7 @@ import (
"os"
"strings"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
type led struct {

View File

@ -8,7 +8,7 @@ import (
"unsafe"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
const (

192
host/rpi/onewirebus.go Normal file
View File

@ -0,0 +1,192 @@
// I²C support.
package rpi
import (
"fmt"
"os"
"sync"
"github.com/golang/glog"
"github.com/zlowred/embd"
"io/ioutil"
)
type w1Bus struct {
l byte
busMap map[string]embd.W1Device
mu sync.Mutex
initialized bool
}
type w1Device struct {
file *os.File
addr string
mu sync.Mutex
initialized bool
}
func NewW1Bus(l byte) embd.W1Bus {
fmt.Println("new w1 bus")
return &w1Bus{l: l, busMap: make(map[string]embd.W1Device)}
}
func (b *w1Bus) init() error {
if b.initialized {
return nil
}
var err error
if _, err = os.Stat("/sys/bus/w1"); os.IsNotExist(err) {
return err
}
glog.V(2).Infof("onewire: bus %v initialized", b.l)
b.initialized = true
return nil
}
func (d *w1Device) init() error {
if d.initialized {
return nil
}
var err error
if d.file, err = os.OpenFile(fmt.Sprintf("/sys/bus/w1/devices/%s/rw", d.addr), os.O_RDWR, os.ModeExclusive); err != nil {
return err
}
glog.V(2).Infof("onewire: device %s initialized", d.addr)
d.initialized = true
return nil
}
func (d *w1Device) ReadByte() (byte, error) {
d.mu.Lock()
defer d.mu.Unlock()
if err := d.init(); err != nil {
return 0, err
}
bytes := make([]byte, 1)
n, _ := d.file.Read(bytes)
if n != 1 {
return 0, fmt.Errorf("onewire: Unexpected number (%v) of bytes read in ReadByte", n)
}
return bytes[0], nil
}
func (d *w1Device) WriteByte(value byte) error {
d.mu.Lock()
defer d.mu.Unlock()
if err := d.init(); err != nil {
return err
}
n, err := d.file.Write([]byte{value})
if n != 1 {
err = fmt.Errorf("onewire: Unexpected number (%v) of bytes written in WriteByte", n)
}
return err
}
func (d *w1Device) WriteBytes(value []byte) error {
d.mu.Lock()
defer d.mu.Unlock()
if err := d.init(); err != nil {
return err
}
for i := range value {
n, err := d.file.Write([]byte{value[i]})
if n != 1 {
return fmt.Errorf("onewire: Unexpected number (%v) of bytes written in WriteBytes", n)
}
if err != nil {
return err
}
}
return nil
}
func (d *w1Device) ReadBytes(number int) (value []byte, err error) {
d.mu.Lock()
defer d.mu.Unlock()
if err := d.init(); err != nil {
return nil, err
}
bytes := make([]byte, number)
n, _ := d.file.Read(bytes)
if n != number {
return nil, fmt.Errorf("onewire: Unexpected number (%v) of bytes read in ReadBytes", n)
}
return bytes, nil
}
func (b *w1Bus) ListDevices() (devices []string, err error) {
dir, err := ioutil.ReadDir("/sys/bus/w1/devices/")
if err != nil {
return nil, err
}
devs := make([]string, len(dir))
for index, element := range dir {
devs[index] = element.Name()
}
return devs, nil
}
func (b *w1Bus) Open(address string) (device embd.W1Device, err error) {
b.mu.Lock()
defer b.mu.Unlock()
if d, ok := b.busMap[address]; ok {
return d, nil
}
d := &w1Device{addr: address}
b.busMap[address] = d
return d, nil
}
func (b *w1Bus) Close() error {
b.mu.Lock()
defer b.mu.Unlock()
for _, b := range b.busMap {
b.Close()
}
return nil
}
func (b *w1Device) Close() error {
b.mu.Lock()
defer b.mu.Unlock()
if !b.initialized {
return nil
}
return b.file.Close()
}

View File

@ -5,12 +5,14 @@
GPIO (digital (rw))
I²C
LED
W1 - make sure that w1-gpio kernel module is loaded. If you wish to use it with sensors directly (e.g. DS18B20 etc) make sure to disable respective kernel modules (e.g. w1-therm) in /etc/modprobe.d/blacklist.conf.
*/
package rpi
import (
"github.com/kidoman/embd"
"github.com/kidoman/embd/host/generic"
"github.com/zlowred/embd"
"github.com/zlowred/embd/host/generic"
"fmt"
)
var spiDeviceMinor = byte(0)
@ -73,6 +75,7 @@ var ledMap = embd.LEDMap{
}
func init() {
fmt.Println("registering RPI")
embd.Register(embd.HostRPi, func(rev int) *embd.Descriptor {
// Refer to http://elinux.org/RPi_HardwareHistory#Board_Revision_History
// for details.
@ -97,6 +100,10 @@ func init() {
SPIDriver: func() embd.SPIDriver {
return embd.NewSPIDriver(spiDeviceMinor, generic.NewSPIBus, nil)
},
W1Driver: func() embd.W1Driver {
return embd.NewW1Driver(NewW1Bus)
},
}
})
fmt.Println("registered")
}

View File

@ -6,7 +6,7 @@ import (
"sync"
"time"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
type Key int

View File

@ -3,7 +3,7 @@ package servo
import (
"github.com/golang/glog"
"github.com/kidoman/embd/util"
"github.com/zlowred/embd/util"
)
const (

78
onewire.go Normal file
View File

@ -0,0 +1,78 @@
//OneWire support.
package embd
// W1Bus interface is used to interact with the OneWire bus.
type W1Bus interface {
// List devices on the bus
ListDevices() (devices []string, err error)
// Open a device
Open(address string) (device W1Device, err error)
// Close releases the resources associated with the bus.
Close() error
}
// W1Device interface is user to interact with the OneWire device.
type W1Device interface {
// ReadByte reads a byte from the device.
ReadByte() (value byte, err error)
// ReadByte number of bytes from the device.
ReadBytes(number int) (value []byte, err error)
// WriteByte writes a byte to the device.
WriteByte(value byte) error
// WriteBytes writes a slice bytes to the device.
WriteBytes(value []byte) error
// Close releases the resources associated with the device.
Close() error
}
// W1Driver interface interacts with the host descriptors to allow us
// control of OneWire communication.
type W1Driver interface {
Bus(l byte) W1Bus
// Close releases the resources associated with the driver.
Close() error
}
var w1DriverInitialized bool
var w1DriverInstance W1Driver
// InitW1 initializes the W1 driver.
func InitW1() error {
if w1DriverInitialized {
return nil
}
desc, err := DescribeHost()
if err != nil {
return err
}
if desc.W1Driver == nil {
return ErrFeatureNotSupported
}
w1DriverInstance = desc.W1Driver()
w1DriverInitialized = true
return nil
}
// CloseW1 releases resources associated with the OneWire driver.
func CloseW1() error {
return w1DriverInstance.Close()
}
// NewW1Bus returns a W1Bus.
func NewW1Bus(l byte) W1Bus {
if err := InitW1(); err != nil {
panic(err)
}
return w1DriverInstance.Bus(l)
}

44
onewiredriver.go Normal file
View File

@ -0,0 +1,44 @@
// Generic OneWire driver.
package embd
import "sync"
type w1BusFactory func(byte) W1Bus
type w1Driver struct {
busMap map[byte]W1Bus
busMapLock sync.Mutex
ibf w1BusFactory
}
// NewW1Driver returns a W1Driver interface which allows control
// over the OneWire subsystem.
func NewW1Driver(ibf w1BusFactory) W1Driver {
return &w1Driver{
busMap: make(map[byte]W1Bus),
ibf: ibf,
}
}
func (i *w1Driver) Bus(l byte) W1Bus {
i.busMapLock.Lock()
defer i.busMapLock.Unlock()
if b, ok := i.busMap[l]; ok {
return b
}
b := i.ibf(l)
i.busMap[l] = b
return b
}
func (i *w1Driver) Close() error {
for _, b := range i.busMap {
b.Close()
}
return nil
}

View File

@ -18,8 +18,8 @@ import (
"os/signal"
"time"
"github.com/kidoman/embd"
_ "github.com/kidoman/embd/host/rpi"
"github.com/zlowred/embd"
_ "github.com/zlowred/embd/host/rpi"
)
func main() {

View File

@ -9,9 +9,9 @@ import (
"os/signal"
"time"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -6,9 +6,9 @@ import (
"flag"
"fmt"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -7,10 +7,10 @@ import (
"fmt"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/sensor/bh1750fvi"
"github.com/zlowred/embd"
"github.com/zlowred/embd/sensor/bh1750fvi"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -7,10 +7,10 @@ import (
"fmt"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/sensor/bmp085"
"github.com/zlowred/embd"
"github.com/zlowred/embd/sensor/bmp085"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -7,10 +7,10 @@ import (
"fmt"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/sensor/bmp180"
"github.com/zlowred/embd"
"github.com/zlowred/embd/sensor/bmp180"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -6,11 +6,11 @@ import (
"flag"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/controller/hd44780"
"github.com/kidoman/embd/interface/display/characterdisplay"
"github.com/zlowred/embd"
"github.com/zlowred/embd/controller/hd44780"
"github.com/zlowred/embd/interface/display/characterdisplay"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -11,8 +11,8 @@ import (
"os/signal"
"time"
"github.com/kidoman/embd"
_ "github.com/kidoman/embd/host/rpi"
"github.com/zlowred/embd"
_ "github.com/zlowred/embd/host/rpi"
)
func main() {

View File

@ -6,9 +6,9 @@ import (
"flag"
"time"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -6,9 +6,9 @@ import (
"flag"
"time"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -6,9 +6,9 @@ import (
"flag"
"time"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -6,9 +6,9 @@ import (
"flag"
"fmt"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -5,9 +5,9 @@ package main
import (
"flag"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -6,10 +6,10 @@ import (
"flag"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/controller/hd44780"
"github.com/zlowred/embd"
"github.com/zlowred/embd/controller/hd44780"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -5,8 +5,8 @@ package main
import (
"fmt"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/interface/keypad/matrix4x3"
"github.com/zlowred/embd"
"github.com/zlowred/embd/interface/keypad/matrix4x3"
)
func main() {

View File

@ -9,10 +9,10 @@ import (
"os/signal"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/sensor/l3gd20"
"github.com/zlowred/embd"
"github.com/zlowred/embd/sensor/l3gd20"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -11,9 +11,9 @@ import (
"os/signal"
"time"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
_ "github.com/kidoman/embd/host/bbb"
_ "github.com/zlowred/embd/host/bbb"
)
func main() {

View File

@ -8,9 +8,9 @@ import (
"flag"
"time"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
_ "github.com/kidoman/embd/host/bbb"
_ "github.com/zlowred/embd/host/bbb"
)
func main() {

View File

@ -7,10 +7,10 @@ import (
"fmt"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/sensor/lsm303"
"github.com/zlowred/embd"
"github.com/zlowred/embd/sensor/lsm303"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -8,9 +8,9 @@ import (
"fmt"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/convertors/mcp3008"
_ "github.com/kidoman/embd/host/all"
"github.com/zlowred/embd"
"github.com/zlowred/embd/convertors/mcp3008"
_ "github.com/zlowred/embd/host/all"
)
const (

View File

@ -9,10 +9,10 @@ import (
"os"
"os/signal"
"github.com/kidoman/embd"
"github.com/kidoman/embd/controller/mcp4725"
"github.com/zlowred/embd"
"github.com/zlowred/embd/controller/mcp4725"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

72
samples/onewire.go Normal file
View File

@ -0,0 +1,72 @@
// +build ignore
package main
import (
"fmt"
"github.com/zlowred/embd"
_ "github.com/zlowred/embd/host/all"
)
func main() {
if err := embd.InitW1(); err != nil {
panic(err)
}
defer embd.CloseW1()
w1 := embd.NewW1Bus(0)
devs, err := w1.ListDevices()
if err != nil {
panic(err)
}
for _, dev := range devs {
fmt.Println("OneWire device: %s", dev)
}
w1d, err := w1.Open("28-011572120bff")
if err != nil {
panic(err)
}
fmt.Printf("%v\n", w1d)
err = w1d.WriteByte(0x44)
if err != nil {
panic(err)
}
for ret, err := w1d.ReadByte(); ret == 0 && err != nil; {}
if err != nil {
panic(err)
}
err = w1d.WriteByte(0xBE)
if err != nil {
panic(err)
}
res, err := w1d.ReadBytes(9)
if err != nil {
panic(err)
}
fmt.Print("res: ")
for _, val := range res {
fmt.Printf("0x%02X ", val)
}
fmt.Println()
var temp float64 = float64(float64(res[1]) * 256. + float64(res[0])) / 16.
fmt.Printf("%f\n", temp)
fmt.Println("Done")
}

View File

@ -8,10 +8,10 @@ import (
"os/signal"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/controller/pca9685"
"github.com/zlowred/embd"
"github.com/zlowred/embd/controller/pca9685"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -8,10 +8,10 @@ import (
"flag"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/host/bbb"
"github.com/zlowred/embd"
"github.com/zlowred/embd/host/bbb"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -8,11 +8,11 @@ import (
"os/signal"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/controller/pca9685"
"github.com/kidoman/embd/motion/servo"
"github.com/zlowred/embd"
"github.com/zlowred/embd/controller/pca9685"
"github.com/zlowred/embd/motion/servo"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -8,10 +8,10 @@ import (
"os/signal"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/motion/servo"
"github.com/zlowred/embd"
"github.com/zlowred/embd/motion/servo"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -8,10 +8,10 @@ import (
"os/signal"
"time"
"github.com/kidoman/embd/controller/servoblaster"
"github.com/kidoman/embd/motion/servo"
"github.com/zlowred/embd/controller/servoblaster"
"github.com/zlowred/embd/motion/servo"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -8,8 +8,8 @@ package main
import (
"time"
"github.com/kidoman/embd"
_ "github.com/kidoman/embd/host/rpi" // This loads the RPi driver
"github.com/zlowred/embd"
_ "github.com/zlowred/embd/host/rpi" // This loads the RPi driver
)
func main() {

View File

@ -5,8 +5,8 @@ package main
import (
"fmt"
"github.com/kidoman/embd"
_ "github.com/kidoman/embd/host/all"
"github.com/zlowred/embd"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -7,8 +7,8 @@ import (
"fmt"
"time"
"github.com/kidoman/embd"
_ "github.com/kidoman/embd/host/all"
"github.com/zlowred/embd"
_ "github.com/zlowred/embd/host/all"
)
const (

View File

@ -8,10 +8,10 @@ import (
"os"
"os/signal"
"github.com/kidoman/embd"
"github.com/kidoman/embd/sensor/tmp006"
"github.com/zlowred/embd"
"github.com/zlowred/embd/sensor/tmp006"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -10,8 +10,8 @@ import (
"os/signal"
"time"
"github.com/kidoman/embd"
_ "github.com/kidoman/embd/host/all"
"github.com/zlowred/embd"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -9,10 +9,10 @@ import (
"os/signal"
"time"
"github.com/kidoman/embd"
"github.com/kidoman/embd/sensor/us020"
"github.com/zlowred/embd"
"github.com/zlowred/embd/sensor/us020"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -7,10 +7,10 @@ import (
"time"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/kidoman/embd/sensor/watersensor"
"github.com/zlowred/embd"
"github.com/zlowred/embd/sensor/watersensor"
_ "github.com/kidoman/embd/host/all"
_ "github.com/zlowred/embd/host/all"
)
func main() {

View File

@ -5,7 +5,7 @@ import (
"sync"
"time"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
//accuracy = sensorValue/actualValue] (min = 0.96, typ = 1.2, max = 1.44

View File

@ -8,7 +8,7 @@ import (
"time"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
const (

View File

@ -8,7 +8,7 @@ import (
"time"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
const (

View File

@ -8,7 +8,7 @@ import (
"time"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
const (

View File

@ -7,7 +7,7 @@ import (
"time"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
const (

View File

@ -9,7 +9,7 @@ import (
"time"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
const (

View File

@ -6,7 +6,7 @@ import (
"time"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
const (

View File

@ -5,7 +5,7 @@ import (
"sync"
"github.com/golang/glog"
"github.com/kidoman/embd"
"github.com/zlowred/embd"
)
// WaterSensor represents a water sensor.