|
@@ -3,6 +3,7 @@ package gamepad
|
|
|
import (
|
|
|
"fmt"
|
|
|
"log"
|
|
|
+ "math"
|
|
|
|
|
|
"github.com/gvalkov/golang-evdev"
|
|
|
)
|
|
@@ -18,6 +19,7 @@ const (
|
|
|
type Event struct {
|
|
|
Type int
|
|
|
Value int32
|
|
|
+ Max int32
|
|
|
}
|
|
|
|
|
|
func (e Event) IsAxis() bool {
|
|
@@ -52,6 +54,17 @@ func (e Event) IsButtonPress() bool {
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
+func (e Event) Fraction() float64 {
|
|
|
+ if e.IsAxis() {
|
|
|
+ fraction := float64(e.Value) / float64(e.Max)
|
|
|
+ if math.Abs(fraction) < 0.01 {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ return fraction
|
|
|
+ }
|
|
|
+ return float64(e.Value)
|
|
|
+}
|
|
|
+
|
|
|
func (e Event) String() string {
|
|
|
var code string
|
|
|
switch e.Type {
|
|
@@ -84,6 +97,12 @@ const (
|
|
|
All = 0xfff
|
|
|
)
|
|
|
|
|
|
+const (
|
|
|
+ analogXYMax = 32767
|
|
|
+ analogZMax = 255
|
|
|
+ dpadMax = 1
|
|
|
+)
|
|
|
+
|
|
|
const channelBufferSize = 16
|
|
|
|
|
|
type Gamepad struct {
|
|
@@ -183,35 +202,35 @@ func (g *Gamepad) Read() error {
|
|
|
switch e.Code {
|
|
|
case leftAnalogX:
|
|
|
if g.channels&LeftAnalog != 0 {
|
|
|
- g.LeftAnalog <- Event{Type: AxisX, Value: e.Value}
|
|
|
+ g.LeftAnalog <- Event{Type: AxisX, Value: e.Value, Max: analogXYMax}
|
|
|
}
|
|
|
case leftAnalogY:
|
|
|
if g.channels&LeftAnalog != 0 {
|
|
|
- g.LeftAnalog <- Event{Type: AxisY, Value: e.Value}
|
|
|
+ g.LeftAnalog <- Event{Type: AxisY, Value: e.Value, Max: analogXYMax}
|
|
|
}
|
|
|
case leftAnalogZ:
|
|
|
if g.channels&LeftAnalog != 0 {
|
|
|
- g.LeftAnalog <- Event{Type: AxisZ, Value: e.Value}
|
|
|
+ g.LeftAnalog <- Event{Type: AxisZ, Value: e.Value, Max: analogZMax}
|
|
|
}
|
|
|
case rightAnalogX:
|
|
|
if g.channels&RightAnalog != 0 {
|
|
|
- g.RightAnalog <- Event{Type: AxisX, Value: e.Value}
|
|
|
+ g.RightAnalog <- Event{Type: AxisX, Value: e.Value, Max: analogXYMax}
|
|
|
}
|
|
|
case rightAnalogY:
|
|
|
if g.channels&RightAnalog != 0 {
|
|
|
- g.RightAnalog <- Event{Type: AxisY, Value: e.Value}
|
|
|
+ g.RightAnalog <- Event{Type: AxisY, Value: e.Value, Max: analogXYMax}
|
|
|
}
|
|
|
case rightAnalogZ:
|
|
|
if g.channels&RightAnalog != 0 {
|
|
|
- g.RightAnalog <- Event{Type: AxisZ, Value: e.Value}
|
|
|
+ g.RightAnalog <- Event{Type: AxisZ, Value: e.Value, Max: analogZMax}
|
|
|
}
|
|
|
case dPadX:
|
|
|
if g.channels&DPad != 0 {
|
|
|
- g.DPad <- Event{Type: AxisX, Value: e.Value}
|
|
|
+ g.DPad <- Event{Type: AxisX, Value: e.Value, Max: dpadMax}
|
|
|
}
|
|
|
case dPadY:
|
|
|
if g.channels&DPad != 0 {
|
|
|
- g.DPad <- Event{Type: AxisY, Value: e.Value}
|
|
|
+ g.DPad <- Event{Type: AxisY, Value: e.Value, Max: dpadMax}
|
|
|
}
|
|
|
}
|
|
|
case evdev.EV_KEY:
|