1
0
mirror of https://github.com/kidoman/embd synced 2024-06-13 14:19:52 +02:00
embd/descriptor.go

103 lines
3.1 KiB
Go
Raw Normal View History

2017-05-22 06:25:30 +02:00
/*
* Copyright (c) Karan Misra 2014
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
2014-03-23 02:51:22 +01:00
// Host descriptor data structures.
2014-03-02 20:21:23 +01:00
package embd
import (
"errors"
"fmt"
2014-04-11 10:29:58 +02:00
"github.com/golang/glog"
)
2014-03-23 02:51:22 +01:00
// Descriptor represents a host descriptor.
type Descriptor struct {
GPIODriver func() GPIODriver
I2CDriver func() I2CDriver
LEDDriver func() LEDDriver
SPIDriver func() SPIDriver
}
2014-03-23 02:51:22 +01:00
// The Describer type is a Descriptor provider.
type Describer func(rev int) *Descriptor
2014-03-23 02:51:22 +01:00
// Describers is a global list of registered host Describers.
2014-03-23 22:20:24 +01:00
var describers = make(map[Host]Describer)
// Register makes a host describer available by the provided host key.
// If Register is called twice with the same host or if describer is nil,
// it panics.
2014-03-23 22:20:24 +01:00
func Register(host Host, describer Describer) {
if describer == nil {
panic("embd: describer is nil")
}
if _, dup := describers[host]; dup {
panic("embd: describer already registered")
}
describers[host] = describer
2014-04-11 10:29:58 +02:00
glog.V(1).Infof("embd: host %v is registered", host)
2014-03-23 22:20:24 +01:00
}
var hostOverride Host
var hostRevOverride int
var hostOverriden bool
// SetHost overrides the host and revision no.
func SetHost(host Host, rev int) {
hostOverride = host
hostRevOverride = rev
hostOverriden = true
}
2014-03-23 02:51:22 +01:00
// DescribeHost returns the detected host descriptor.
// Can be overriden by calling SetHost though.
2014-03-02 20:21:23 +01:00
func DescribeHost() (*Descriptor, error) {
var host Host
var rev int
if hostOverriden {
host, rev = hostOverride, hostRevOverride
} else {
var err error
host, rev, err = DetectHost()
if err != nil {
return nil, err
}
}
2014-03-23 22:20:24 +01:00
describer, ok := describers[host]
if !ok {
2014-03-02 15:09:30 +01:00
return nil, fmt.Errorf("host: invalid host %q", host)
}
return describer(rev), nil
}
2014-03-23 02:51:22 +01:00
// ErrFeatureNotSupported is returned when the host does not support a
// particular feature.
2014-03-23 02:11:51 +01:00
var ErrFeatureNotSupported = errors.New("embd: requested feature is not supported")
2014-03-23 02:51:22 +01:00
// ErrFeatureNotImplemented is returned when a particular feature is supported
// by the host but not implemented yet.
2014-03-23 02:11:51 +01:00
var ErrFeatureNotImplemented = errors.New("embd: requested feature is not implemented")