diff --git a/bbb.go b/bbb.go index bf0aef6..db4023a 100644 --- a/bbb.go +++ b/bbb.go @@ -16,7 +16,7 @@ import ( ) func init() { - Describers[HostBBB] = func(rev int) *Descriptor { + Register(HostBBB, func(rev int) *Descriptor { return &Descriptor{ GPIODriver: func() GPIODriver { return newGPIODriver(bbbPins, newDigitalPin, newBBBAnalogPin) @@ -26,7 +26,7 @@ func init() { return newLEDDriver(bbbLEDMap) }, } - } + }) } var bbbPins = PinMap{ diff --git a/descriptor.go b/descriptor.go index 2d161b9..275edaa 100644 --- a/descriptor.go +++ b/descriptor.go @@ -18,7 +18,17 @@ type Descriptor struct { type Describer func(rev int) *Descriptor // Describers is a global list of registered host Describers. -var Describers = map[Host]Describer{} +var describers = make(map[Host]Describer) + +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 +} // DescribeHost returns the detected host descriptor. func DescribeHost() (*Descriptor, error) { @@ -27,7 +37,7 @@ func DescribeHost() (*Descriptor, error) { return nil, err } - describer, ok := Describers[host] + describer, ok := describers[host] if !ok { return nil, fmt.Errorf("host: invalid host %q", host) } diff --git a/rpi.go b/rpi.go index 90ca61e..a5abc32 100644 --- a/rpi.go +++ b/rpi.go @@ -7,7 +7,7 @@ package embd func init() { - Describers[HostRPi] = func(rev int) *Descriptor { + Register(HostRPi, func(rev int) *Descriptor { var pins = rpiRev1Pins if rev > 1 { pins = rpiRev2Pins @@ -19,7 +19,7 @@ func init() { }, I2CDriver: newI2CDriver, } - } + }) } var rpiRev1Pins = PinMap{