key.To/FromChar
parent
5d30297ec4
commit
5f59054366
|
|
@ -22,7 +22,7 @@ func NewRandom(start, stop byte) *Random {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Random) Read() []Button {
|
func (r *Random) Read() []Button {
|
||||||
if rand.Int()%2 == 0 {
|
if len(r.down) > 0 && rand.Int()%2 == 0 {
|
||||||
was := r.down
|
was := r.down
|
||||||
for i := range was {
|
for i := range was {
|
||||||
was[i].Down = false
|
was[i].Down = false
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
package key
|
||||||
|
|
||||||
|
var (
|
||||||
|
charToKey = map[byte]Key{
|
||||||
|
'a': A,
|
||||||
|
'b': B,
|
||||||
|
'c': C,
|
||||||
|
'd': D,
|
||||||
|
'e': E,
|
||||||
|
'f': F,
|
||||||
|
'g': G,
|
||||||
|
'h': H,
|
||||||
|
'i': I,
|
||||||
|
'j': J,
|
||||||
|
'k': K,
|
||||||
|
'l': L,
|
||||||
|
'm': M,
|
||||||
|
'n': N,
|
||||||
|
'o': O,
|
||||||
|
'p': P,
|
||||||
|
'q': Q,
|
||||||
|
'r': R,
|
||||||
|
's': S,
|
||||||
|
't': T,
|
||||||
|
'u': U,
|
||||||
|
'v': V,
|
||||||
|
'w': W,
|
||||||
|
'x': X,
|
||||||
|
'y': Y,
|
||||||
|
'z': Z,
|
||||||
|
}
|
||||||
|
keyToChar = func() map[Key]byte {
|
||||||
|
result := map[Key]byte{}
|
||||||
|
for k, v := range charToKey {
|
||||||
|
result[v] = k
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}()
|
||||||
|
)
|
||||||
|
|
||||||
|
func ToChar(k Key) byte {
|
||||||
|
v, ok := keyToChar[k]
|
||||||
|
if !ok {
|
||||||
|
return '?'
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func FromChar(b byte) Key {
|
||||||
|
if b < 'a' {
|
||||||
|
b += 'a' - 'A'
|
||||||
|
}
|
||||||
|
v, ok := charToKey[b]
|
||||||
|
if !ok {
|
||||||
|
return Undef
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
package key
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestFromChar(t *testing.T) {
|
||||||
|
if got := FromChar('a'); got != A {
|
||||||
|
t.Error(got)
|
||||||
|
}
|
||||||
|
if got := FromChar('A'); got != A {
|
||||||
|
t.Error(got)
|
||||||
|
}
|
||||||
|
if got := FromChar('!'); got != Undef {
|
||||||
|
t.Error(got)
|
||||||
|
}
|
||||||
|
if got := ToChar(A); got != 'a' {
|
||||||
|
t.Error(got)
|
||||||
|
}
|
||||||
|
if got := ToChar(-1); got != '?' {
|
||||||
|
t.Error(got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
package key
|
||||||
|
|
||||||
|
import "github.com/micmonay/keybd_event"
|
||||||
|
|
||||||
|
type Key int
|
||||||
|
|
||||||
|
const (
|
||||||
|
Undef = Key(keybd_event.VK_SP11)
|
||||||
|
A = Key(keybd_event.VK_A)
|
||||||
|
B = Key(keybd_event.VK_B)
|
||||||
|
C = Key(keybd_event.VK_C)
|
||||||
|
D = Key(keybd_event.VK_D)
|
||||||
|
E = Key(keybd_event.VK_E)
|
||||||
|
F = Key(keybd_event.VK_F)
|
||||||
|
G = Key(keybd_event.VK_G)
|
||||||
|
H = Key(keybd_event.VK_H)
|
||||||
|
I = Key(keybd_event.VK_I)
|
||||||
|
J = Key(keybd_event.VK_J)
|
||||||
|
K = Key(keybd_event.VK_K)
|
||||||
|
L = Key(keybd_event.VK_L)
|
||||||
|
M = Key(keybd_event.VK_M)
|
||||||
|
N = Key(keybd_event.VK_N)
|
||||||
|
O = Key(keybd_event.VK_O)
|
||||||
|
P = Key(keybd_event.VK_P)
|
||||||
|
Q = Key(keybd_event.VK_Q)
|
||||||
|
R = Key(keybd_event.VK_R)
|
||||||
|
S = Key(keybd_event.VK_S)
|
||||||
|
T = Key(keybd_event.VK_T)
|
||||||
|
U = Key(keybd_event.VK_U)
|
||||||
|
V = Key(keybd_event.VK_V)
|
||||||
|
W = Key(keybd_event.VK_W)
|
||||||
|
X = Key(keybd_event.VK_X)
|
||||||
|
Y = Key(keybd_event.VK_Y)
|
||||||
|
Z = Key(keybd_event.VK_Z)
|
||||||
|
)
|
||||||
|
|
@ -2,6 +2,7 @@ package output
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
"mayhem-party/src/device/output/key"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/micmonay/keybd_event"
|
"github.com/micmonay/keybd_event"
|
||||||
|
|
@ -29,7 +30,7 @@ func (kb Keyboard) wait() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (kb Keyboard) Press(keys ...Key) {
|
func (kb Keyboard) Press(keys ...key.Key) {
|
||||||
kb.wait()
|
kb.wait()
|
||||||
|
|
||||||
kb.release()
|
kb.release()
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ package output_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"mayhem-party/src/device/output"
|
"mayhem-party/src/device/output"
|
||||||
|
"mayhem-party/src/device/output/key"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
@ -13,7 +14,7 @@ func TestKeyboardIntegration(t *testing.T) {
|
||||||
t.Cleanup(kb.Close)
|
t.Cleanup(kb.Close)
|
||||||
|
|
||||||
t.Log("pressing 'a' for 5 seconds")
|
t.Log("pressing 'a' for 5 seconds")
|
||||||
kb.Press(output.A)
|
kb.Press(key.A)
|
||||||
for i := 0; i < 5; i++ {
|
for i := 0; i < 5; i++ {
|
||||||
t.Logf("\t%d...", 5-i)
|
t.Logf("\t%d...", 5-i)
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
|
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
package output
|
|
||||||
|
|
||||||
import "github.com/micmonay/keybd_event"
|
|
||||||
|
|
||||||
type Key int
|
|
||||||
|
|
||||||
const (
|
|
||||||
A = Key(keybd_event.VK_A)
|
|
||||||
B = Key(keybd_event.VK_B)
|
|
||||||
C = Key(keybd_event.VK_C)
|
|
||||||
D = Key(keybd_event.VK_D)
|
|
||||||
E = Key(keybd_event.VK_E)
|
|
||||||
F = Key(keybd_event.VK_F)
|
|
||||||
G = Key(keybd_event.VK_G)
|
|
||||||
H = Key(keybd_event.VK_H)
|
|
||||||
I = Key(keybd_event.VK_I)
|
|
||||||
J = Key(keybd_event.VK_J)
|
|
||||||
K = Key(keybd_event.VK_K)
|
|
||||||
L = Key(keybd_event.VK_L)
|
|
||||||
M = Key(keybd_event.VK_M)
|
|
||||||
N = Key(keybd_event.VK_N)
|
|
||||||
O = Key(keybd_event.VK_O)
|
|
||||||
P = Key(keybd_event.VK_P)
|
|
||||||
Q = Key(keybd_event.VK_Q)
|
|
||||||
R = Key(keybd_event.VK_R)
|
|
||||||
S = Key(keybd_event.VK_S)
|
|
||||||
T = Key(keybd_event.VK_T)
|
|
||||||
U = Key(keybd_event.VK_U)
|
|
||||||
V = Key(keybd_event.VK_V)
|
|
||||||
W = Key(keybd_event.VK_W)
|
|
||||||
X = Key(keybd_event.VK_X)
|
|
||||||
Y = Key(keybd_event.VK_Y)
|
|
||||||
Z = Key(keybd_event.VK_Z)
|
|
||||||
)
|
|
||||||
|
|
@ -1,10 +1,13 @@
|
||||||
package output
|
package output
|
||||||
|
|
||||||
import "os"
|
import (
|
||||||
|
"mayhem-party/src/device/output/key"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
type Output interface {
|
type Output interface {
|
||||||
Close()
|
Close()
|
||||||
Press(...Key)
|
Press(...key.Key)
|
||||||
}
|
}
|
||||||
|
|
||||||
func New() Output {
|
func New() Output {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package output
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"mayhem-party/src/device/output/key"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Writer struct {
|
type Writer struct {
|
||||||
|
|
@ -19,6 +20,10 @@ func (w Writer) Close() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w Writer) Press(keys ...Key) {
|
func (w Writer) Press(keys ...key.Key) {
|
||||||
fmt.Fprintf(w.w, "%+v\n", keys)
|
result := make([]byte, len(keys))
|
||||||
|
for i := range keys {
|
||||||
|
result[i] = key.ToChar(keys[i])
|
||||||
|
}
|
||||||
|
fmt.Fprintf(w.w, "%s\n", result)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"mayhem-party/src/device/input"
|
"mayhem-party/src/device/input"
|
||||||
"mayhem-party/src/device/output"
|
"mayhem-party/src/device/output"
|
||||||
|
"mayhem-party/src/device/output/key"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -22,13 +23,13 @@ func Main(ctx context.Context) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
state := map[output.Key]bool{}
|
state := map[key.Key]bool{}
|
||||||
for block() {
|
for block() {
|
||||||
delta := reader.Read()
|
delta := reader.Read()
|
||||||
for _, button := range delta {
|
for _, button := range delta {
|
||||||
state[output.Key(button.Char)] = button.Down
|
state[key.FromChar(button.Char)] = button.Down
|
||||||
}
|
}
|
||||||
keys := make([]output.Key, 0)
|
keys := make([]key.Key, 0)
|
||||||
for k, v := range state {
|
for k, v := range state {
|
||||||
if v {
|
if v {
|
||||||
keys = append(keys, k)
|
keys = append(keys, k)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue