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  }