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