Created
September 18, 2016 11:58
-
-
Save peterhellberg/5a1f66927972587ea3aef24375a1a89d to your computer and use it in GitHub Desktop.
How to use the Raspberry Pi Sense HAT Joystick using golang-evdev
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"flag" | |
"fmt" | |
"os" | |
"os/signal" | |
evdev "github.com/gvalkov/golang-evdev" | |
screen "github.com/nathany/bobblehat/sense/screen" | |
color "github.com/nathany/bobblehat/sense/screen/color" | |
) | |
var path = flag.String("path", "/dev/input/event0", "path to the event device") | |
func main() { | |
flag.Parse() | |
if !evdev.IsInputDevice(*path) { | |
os.Exit(1) | |
} | |
c := make(chan os.Signal, 1) | |
signal.Notify(c, os.Interrupt) | |
go func() { | |
for range c { | |
fmt.Println("Clearing the screen...") | |
screen.Clear() | |
os.Exit(0) | |
} | |
}() | |
device, err := evdev.Open(*path) | |
if err != nil { | |
fmt.Printf("Unable to open input device: %s\nError: %v\n", *path, err) | |
os.Exit(1) | |
} | |
fmt.Println(device) | |
// Clear the Sense HAT screen | |
screen.Clear() | |
for { | |
events, err := device.Read() | |
if err != nil { | |
fmt.Printf("device.Read() Error: %v\n", err) | |
os.Exit(1) | |
} | |
for _, ev := range events { | |
switch ev.Type { | |
case evdev.EV_KEY: | |
ke := evdev.NewKeyEvent(&ev) | |
if ke.State != evdev.KeyDown { | |
continue | |
} | |
// Create a new framebuffer | |
fb := screen.NewFrameBuffer() | |
switch ke.Scancode { | |
case evdev.KEY_ENTER: | |
fmt.Println("⏎ ") | |
case evdev.KEY_UP: | |
fmt.Println("↑") | |
draw(fb, 0, 0, 8, 4, color.New(255, 255, 0)) | |
case evdev.KEY_DOWN: | |
fmt.Println("↓") | |
draw(fb, 0, 4, 8, 8, color.New(255, 0, 0)) | |
case evdev.KEY_LEFT: | |
fmt.Println("←") | |
draw(fb, 0, 0, 4, 8, color.New(0, 0, 255)) | |
case evdev.KEY_RIGHT: | |
fmt.Println("→") | |
draw(fb, 4, 0, 8, 8, color.New(0, 255, 0)) | |
} | |
screen.Draw(fb) | |
} | |
} | |
} | |
} | |
func draw(fb *screen.FrameBuffer, a, b, m, n int, c color.Color) { | |
for i := a; i < m; i++ { | |
for j := b; j < n; j++ { | |
fb.SetPixel(i, j, c) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Example output: