// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package gpio allows users to communicate with GPIO pins.
package gpio

import "golang.org/x/exp/io/gpio/driver"

type Device struct {
	conn driver.Conn
}

// Direction determines the direction of the pin. A pin could be
// configured to be an input or an output.
type Direction string

const (
	In  = Direction("in")
	Out = Direction("out")
	// TODO(jbd): Out but initially high or initially low?
)

// TODO(jbd): Allow users to set active value.
// TODO(jbd): How to support analog pins?

// TODO(jbd): Allow users to configure edge trigger type.

// Open opens a connection to the GPIO device with the given driver.
// If a nil driver is provided, it uses the Devfs implementation with
// the default settings.
// Opened devices should be closed by calling Close.
func Open(d driver.Opener) (*Device, error) {
	// TODO(jbd): Open pin rather than GPIO device? It would help
	// some driver implementations such as sysfs.
	// TODO(jbd): Default to devfs if nothing is set?
	conn, err := d.Open()
	if err != nil {
		return nil, err
	}
	return &Device{conn: conn}, nil
}

// Value returns the value for the pin. 0 for low, 1 for high values.
func (d *Device) Value(pin int) (int, error) {
	return d.conn.Value(pin)
}

// SetValue sets the value of the pin. 0 for low, 1 for high values.
func (d *Device) SetValue(pin int, v int) error {
	return d.conn.SetValue(pin, v)
}

// SetDirection configures the direction of the pin.
func (d *Device) SetDirection(pin int, dir Direction) error {
	return d.conn.SetDirection(pin, driver.Direction(dir))
}

// Close closes the device and frees the resources.
func (d *Device) Close() error {
	return d.conn.Close()
}
