From 94f99476c21077c1c16c97bcd95dc37ecef3da0e Mon Sep 17 00:00:00 2001 From: Karan Misra Date: Fri, 11 Apr 2014 09:19:03 +0530 Subject: [PATCH] allow lazy initialisation of the drivers this allows brevity in the sample codes (and should not be misutilized in real world applications) --- gpio.go | 18 ++++++++++++++++++ i2c.go | 10 ++++++++++ led.go | 10 ++++++++++ 3 files changed, 38 insertions(+) diff --git a/gpio.go b/gpio.go index cc09dcd..7aae699 100644 --- a/gpio.go +++ b/gpio.go @@ -119,10 +119,15 @@ type GPIODriver interface { Close() error } +var gpioDriverInitialized bool var gpioDriverInstance GPIODriver // InitGPIO initializes the GPIO driver. func InitGPIO() error { + if gpioDriverInitialized { + return nil + } + desc, err := DescribeHost() if err != nil { return err @@ -133,6 +138,7 @@ func InitGPIO() error { } gpioDriverInstance = desc.GPIODriver() + gpioDriverInitialized = true return nil } @@ -145,6 +151,10 @@ func CloseGPIO() error { // NewDigitalPin returns a DigitalPin interface which allows control over // the digital GPIO pin. func NewDigitalPin(key interface{}) (DigitalPin, error) { + if err := InitGPIO(); err != nil { + return nil, err + } + return gpioDriverInstance.DigitalPin(key) } @@ -212,6 +222,10 @@ func PullDown(key interface{}) error { // NewAnalogPin returns a AnalogPin interface which allows control over // the analog GPIO pin. func NewAnalogPin(key interface{}) (AnalogPin, error) { + if err := InitGPIO(); err != nil { + return nil, err + } + return gpioDriverInstance.AnalogPin(key) } @@ -228,5 +242,9 @@ func AnalogRead(key interface{}) (int, error) { // NewPWMPin returns a PWMPin interface which allows PWM signal // generation over a the PWM pin. func NewPWMPin(key interface{}) (PWMPin, error) { + if err := InitGPIO(); err != nil { + return nil, err + } + return gpioDriverInstance.PWMPin(key) } diff --git a/i2c.go b/i2c.go index 3e2fd09..8bdb876 100644 --- a/i2c.go +++ b/i2c.go @@ -38,10 +38,15 @@ type I2CDriver interface { Close() error } +var i2cDriverInitialized bool var i2cDriverInstance I2CDriver // InitI2C initializes the I2C driver. func InitI2C() error { + if i2cDriverInitialized { + return nil + } + desc, err := DescribeHost() if err != nil { return err @@ -52,6 +57,7 @@ func InitI2C() error { } i2cDriverInstance = desc.I2CDriver() + i2cDriverInitialized = true return nil } @@ -63,5 +69,9 @@ func CloseI2C() error { // NewI2CBus returns a I2CBus. func NewI2CBus(l byte) I2CBus { + if err := InitI2C(); err != nil { + panic(err) + } + return i2cDriverInstance.Bus(l) } diff --git a/led.go b/led.go index b18423e..d9c309f 100644 --- a/led.go +++ b/led.go @@ -25,10 +25,15 @@ type LEDDriver interface { Close() error } +var ledDriverInitialized bool var ledDriverInstance LEDDriver // InitLED initializes the LED driver. func InitLED() error { + if ledDriverInitialized { + return nil + } + desc, err := DescribeHost() if err != nil { return err @@ -39,6 +44,7 @@ func InitLED() error { } ledDriverInstance = desc.LEDDriver() + ledDriverInitialized = true return nil } @@ -50,6 +56,10 @@ func CloseLED() error { // NewLED returns a LED interface which allows control over the LED. func NewLED(key interface{}) (LED, error) { + if err := InitLED(); err != nil { + return nil, err + } + return ledDriverInstance.LED(key) }