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 }