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