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  }