gobot.io/x/gobot@v1.16.0/drivers/aio/analog_actuator_driver.go (about) 1 package aio 2 3 import ( 4 "strconv" 5 6 "gobot.io/x/gobot" 7 ) 8 9 // AnalogActuatorDriver represents an analog actuator 10 type AnalogActuatorDriver struct { 11 name string 12 pin string 13 connection AnalogWriter 14 gobot.Eventer 15 gobot.Commander 16 scale func(input float64) (value int) 17 lastValue float64 18 lastRawValue int 19 } 20 21 // NewAnalogActuatorDriver returns a new AnalogActuatorDriver given by an AnalogWriter and pin. 22 // The driver supports customizable scaling from given float64 value to written int. 23 // The default scaling is 1:1. An adjustable linear scaler is provided by the driver. 24 // 25 // Adds the following API Commands: 26 // "Write" - See AnalogActuator.Write 27 // "RawWrite" - See AnalogActuator.RawWrite 28 func NewAnalogActuatorDriver(a AnalogWriter, pin string) *AnalogActuatorDriver { 29 d := &AnalogActuatorDriver{ 30 name: gobot.DefaultName("AnalogActuator"), 31 connection: a, 32 pin: pin, 33 Commander: gobot.NewCommander(), 34 scale: func(input float64) (value int) { return int(input) }, 35 } 36 37 d.AddCommand("Write", func(params map[string]interface{}) interface{} { 38 val, err := strconv.ParseFloat(params["val"].(string), 64) 39 if err != nil { 40 return err 41 } 42 return d.Write(val) 43 }) 44 45 d.AddCommand("RawWrite", func(params map[string]interface{}) interface{} { 46 val, _ := strconv.Atoi(params["val"].(string)) 47 return d.RawWrite(val) 48 }) 49 50 return d 51 } 52 53 // Start starts driver 54 func (a *AnalogActuatorDriver) Start() (err error) { return } 55 56 // Halt is for halt 57 func (a *AnalogActuatorDriver) Halt() (err error) { return } 58 59 // Name returns the drivers name 60 func (a *AnalogActuatorDriver) Name() string { return a.name } 61 62 // SetName sets the drivers name 63 func (a *AnalogActuatorDriver) SetName(n string) { a.name = n } 64 65 // Pin returns the drivers pin 66 func (a *AnalogActuatorDriver) Pin() string { return a.pin } 67 68 // Connection returns the drivers Connection 69 func (a *AnalogActuatorDriver) Connection() gobot.Connection { return a.connection.(gobot.Connection) } 70 71 // RawWrite write the given raw value to the actuator 72 func (a *AnalogActuatorDriver) RawWrite(val int) (err error) { 73 a.lastRawValue = val 74 return a.connection.AnalogWrite(a.Pin(), val) 75 } 76 77 // SetScaler substitute the default 1:1 return value function by a new scaling function 78 func (a *AnalogActuatorDriver) SetScaler(scaler func(float64) int) { 79 a.scale = scaler 80 } 81 82 // Write writes the given value to the actuator 83 func (a *AnalogActuatorDriver) Write(val float64) (err error) { 84 a.lastValue = val 85 rawValue := a.scale(val) 86 return a.RawWrite(rawValue) 87 } 88 89 // RawValue returns the last written raw value 90 func (a *AnalogActuatorDriver) RawValue() (val int) { 91 return a.lastRawValue 92 } 93 94 // Value returns the last written value 95 func (a *AnalogActuatorDriver) Value() (val float64) { 96 return a.lastValue 97 } 98 99 func AnalogActuatorLinearScaler(fromMin, fromMax float64, toMin, toMax int) func(input float64) (value int) { 100 m := float64(toMax-toMin) / (fromMax - fromMin) 101 n := float64(toMin) - m*fromMin 102 return func(input float64) (value int) { 103 if input <= fromMin { 104 return toMin 105 } 106 if input >= fromMax { 107 return toMax 108 } 109 return int(input*m + n) 110 } 111 }