gobot.io/x/gobot@v1.16.0/drivers/gpio/relay_driver.go (about)

     1  package gpio
     2  
     3  import "gobot.io/x/gobot"
     4  
     5  // RelayDriver represents a digital relay
     6  type RelayDriver struct {
     7  	pin        string
     8  	name       string
     9  	connection DigitalWriter
    10  	high       bool
    11  	Inverted   bool
    12  	gobot.Commander
    13  }
    14  
    15  // NewRelayDriver return a new RelayDriver given a DigitalWriter and pin.
    16  //
    17  // Adds the following API Commands:
    18  //	"Toggle" - See RelayDriver.Toggle
    19  //	"On" - See RelayDriver.On
    20  //	"Off" - See RelayDriver.Off
    21  func NewRelayDriver(a DigitalWriter, pin string) *RelayDriver {
    22  	l := &RelayDriver{
    23  		name:       gobot.DefaultName("Relay"),
    24  		pin:        pin,
    25  		connection: a,
    26  		high:       false,
    27  		Inverted:   false,
    28  		Commander:  gobot.NewCommander(),
    29  	}
    30  
    31  	l.AddCommand("Toggle", func(params map[string]interface{}) interface{} {
    32  		return l.Toggle()
    33  	})
    34  
    35  	l.AddCommand("On", func(params map[string]interface{}) interface{} {
    36  		return l.On()
    37  	})
    38  
    39  	l.AddCommand("Off", func(params map[string]interface{}) interface{} {
    40  		return l.Off()
    41  	})
    42  
    43  	return l
    44  }
    45  
    46  // Start implements the Driver interface
    47  func (l *RelayDriver) Start() (err error) { return }
    48  
    49  // Halt implements the Driver interface
    50  func (l *RelayDriver) Halt() (err error) { return }
    51  
    52  // Name returns the RelayDrivers name
    53  func (l *RelayDriver) Name() string { return l.name }
    54  
    55  // SetName sets the RelayDrivers name
    56  func (l *RelayDriver) SetName(n string) { l.name = n }
    57  
    58  // Pin returns the RelayDrivers name
    59  func (l *RelayDriver) Pin() string { return l.pin }
    60  
    61  // Connection returns the RelayDrivers Connection
    62  func (l *RelayDriver) Connection() gobot.Connection {
    63  	return l.connection.(gobot.Connection)
    64  }
    65  
    66  // State return true if the relay is On and false if the relay is Off
    67  func (l *RelayDriver) State() bool {
    68  	if l.Inverted {
    69  		return !l.high
    70  	}
    71  	return l.high
    72  }
    73  
    74  // On sets the relay to a high state.
    75  func (l *RelayDriver) On() (err error) {
    76  	newValue := byte(1)
    77  	if l.Inverted {
    78  		newValue = 0
    79  	}
    80  	if err = l.connection.DigitalWrite(l.Pin(), newValue); err != nil {
    81  		return
    82  	}
    83  
    84  	if l.Inverted {
    85  		l.high = false
    86  	} else {
    87  		l.high = true
    88  	}
    89  
    90  	return
    91  }
    92  
    93  // Off sets the relay to a low state.
    94  func (l *RelayDriver) Off() (err error) {
    95  	newValue := byte(0)
    96  	if l.Inverted {
    97  		newValue = 1
    98  	}
    99  	if err = l.connection.DigitalWrite(l.Pin(), newValue); err != nil {
   100  		return
   101  	}
   102  
   103  	if l.Inverted {
   104  		l.high = true
   105  	} else {
   106  		l.high = false
   107  	}
   108  
   109  	return
   110  }
   111  
   112  // Toggle sets the relay to the opposite of it's current state
   113  func (l *RelayDriver) Toggle() (err error) {
   114  	if l.State() {
   115  		err = l.Off()
   116  	} else {
   117  		err = l.On()
   118  	}
   119  	return
   120  }