gobot.io/x/gobot@v1.16.0/platforms/keyboard/keyboard_driver.go (about) 1 package keyboard 2 3 import ( 4 "log" 5 "os" 6 7 "gobot.io/x/gobot" 8 ) 9 10 const ( 11 // Key board event 12 Key = "key" 13 ) 14 15 // Driver is gobot software device to the keyboard 16 type Driver struct { 17 name string 18 connect func(*Driver) (err error) 19 listen func(*Driver) 20 stdin *os.File 21 gobot.Eventer 22 } 23 24 // NewDriver returns a new keyboard Driver. 25 // 26 func NewDriver() *Driver { 27 k := &Driver{ 28 name: gobot.DefaultName("Keyboard"), 29 connect: func(k *Driver) (err error) { 30 if err := configure(); err != nil { 31 return err 32 } 33 34 k.stdin = os.Stdin 35 return 36 }, 37 listen: func(k *Driver) { 38 ctrlc := bytes{3} 39 40 for { 41 var keybuf bytes 42 k.stdin.Read(keybuf[0:3]) 43 44 if keybuf == ctrlc { 45 proc, err := os.FindProcess(os.Getpid()) 46 if err != nil { 47 log.Fatal(err) 48 } 49 50 proc.Signal(os.Interrupt) 51 break 52 } 53 54 k.Publish(Key, Parse(keybuf)) 55 56 } 57 }, 58 Eventer: gobot.NewEventer(), 59 } 60 61 k.AddEvent(Key) 62 63 return k 64 } 65 66 // Name returns the Driver Name 67 func (k *Driver) Name() string { return k.name } 68 69 // SetName sets the Driver Name 70 func (k *Driver) SetName(n string) { k.name = n } 71 72 // Connection returns the Driver Connection 73 func (k *Driver) Connection() gobot.Connection { return nil } 74 75 // Start initializes keyboard by grabbing key events as they come in and 76 // publishing each as a key event 77 func (k *Driver) Start() (err error) { 78 if err = k.connect(k); err != nil { 79 return err 80 } 81 82 go k.listen(k) 83 84 return 85 } 86 87 // Halt stops keyboard driver 88 func (k *Driver) Halt() (err error) { 89 if originalState != "" { 90 return restore() 91 } 92 return 93 }