package main
import "core:os"
import "core:fmt"
import "./console"
import "../vendor/evdev"
print_debug :: proc(
con: ^console.Console,
x, y: int,
type: evdev.EventType,
code: u16,
value: uint,
stick_x, stick_y: int,
is_down: bool,
) {
con->write_at(console.CSI + "K", x, y)
con->write_at(
fmt.tprintf(
console.FORMAT_RGB + "%s",
38, // Foreground
2, // RGB mode
255,
0,
0,
fmt.tprintf("Type: %s - Code: %03d - Value: %03d", type, code, value),
),
x,
y,
)
con->write_at(console.CSI + "K", x, y + 1)
con->write_at(
fmt.tprintf(
console.FORMAT_RGB + "%s",
38, // Foreground
2, // RGB mode
255,
0,
0,
fmt.tprintf("LStick: %d v %d", stick_x, stick_y),
),
x,
y + 1,
)
con->write_at(console.CSI + "K", x, y + 2)
if type == .Key {
con->write_at(
fmt.tprintf(
console.FORMAT_RGB + "%s",
38, // Foreground
2, // RGB mode
255,
0,
0,
fmt.tprintf("%s(%d) => %t", evdev.Button(code), code, is_down),
),
x,
y + 2,
)
}
con->write(console.RESET_FORMAT)
}
draw_stick :: proc(con: ^console.Console, x, y: int, stick_x, stick_y: int, button: bool) {
con->write_at(" /---\\", x, y)
con->write_at("/ \\", x, y + 1)
con->write_at("| |", x, y + 2)
con->write_at("| |", x, y + 3)
con->write_at("| |", x, y + 4)
con->write_at("\\ /", x, y + 5)
con->write_at(" \\---/", x, y + 6)
x_offset := int((f32(stick_x) / 32000) * 2)
y_offset := int((f32(stick_y) / 32000) * 2)
if button {
con->write(
fmt.tprintf(
console.FORMAT_RGB,
48, // Background
2, // RGB mode
66,
66,
66,
),
)
} else {
con->write(console.RESET_FORMAT)
}
con->write_at(".+.", x + 2 + x_offset, y + 2 + y_offset)
con->write_at("+++", x + 2 + x_offset, y + 3 + y_offset)
con->write_at(".+.", x + 2 + x_offset, y + 4 + y_offset)
con->write(console.RESET_FORMAT)
}
draw_facebuttons :: proc(con: ^console.Console, x, y: int, but_a, but_b, but_x, but_y: bool) {
if but_y {
con->write(
fmt.tprintf(
console.FORMAT_RGB,
48, // Background
2, // RGB mode
66,
66,
66,
),
)
} else {
con->write(console.RESET_FORMAT)
}
con->write_at("( Y )", x + 3, y)
if but_x {
con->write(
fmt.tprintf(
console.FORMAT_RGB,
48, // Background
2, // RGB mode
66,
66,
66,
),
)
} else {
con->write(console.RESET_FORMAT)
}
con->write_at("( X )", x, y + 1)
if but_b {
con->write(
fmt.tprintf(
console.FORMAT_RGB,
48, // Background
2, // RGB mode
66,
66,
66,
),
)
} else {
con->write(console.RESET_FORMAT)
}
con->write_at("( B )", x + 6, y + 1)
if but_a {
con->write(
fmt.tprintf(
console.FORMAT_RGB,
48, // Background
2, // RGB mode
66,
66,
66,
),
)
} else {
con->write(console.RESET_FORMAT)
}
con->write_at("( A )", x + 3, y + 2)
con->write(console.RESET_FORMAT)
}
draw_dpad :: proc(con: ^console.Console, x, y: int, dpad_x, dpad_y: int) {
if dpad_y < 0 {
con->write(
fmt.tprintf(
console.FORMAT_RGB,
48, // Background
2, // RGB mode
66,
66,
66,
),
)
} else {
con->write(console.RESET_FORMAT)
}
con->write_at("[ ^ ]", x + 3, y)
if dpad_x < 0 {
con->write(
fmt.tprintf(
console.FORMAT_RGB,
48, // Background
2, // RGB mode
66,
66,
66,
),
)
} else {
con->write(console.RESET_FORMAT)
}
con->write_at("[ < ]", x, y + 1)
if dpad_x > 0 {
con->write(
fmt.tprintf(
console.FORMAT_RGB,
48, // Background
2, // RGB mode
66,
66,
66,
),
)
} else {
con->write(console.RESET_FORMAT)
}
con->write_at("[ > ]", x + 6, y + 1)
if dpad_y > 0 {
con->write(
fmt.tprintf(
console.FORMAT_RGB,
48, // Background
2, // RGB mode
66,
66,
66,
),
)
} else {
con->write(console.RESET_FORMAT)
}
con->write_at("[ v ]", x + 3, y + 2)
con->write(console.RESET_FORMAT)
}
draw_shoulder :: proc(con: ^console.Console, x, y: int, trigger: int, shoulder: bool) {
if shoulder {
con->write_at("*", x, y)
} else {
con->write_at(".", x, y)
}
con->write_at("^", x, y + 1)
steps := int((f32(trigger) / 1024) * 4)
for _, i in 0 ..< 4 {
if i <= steps {
con->write_at("#", x, y + 5 - i)
} else {
con->write_at(".", x, y + 5 - i)
}
}
con->write_at("v", x, y + 6)
}
main :: proc() {
if len(os.args) < 2 {
panic("no file")
}
con := console.create()
defer con->destroy()
// width, height := con->get_size()
lstick_x, lstick_y: int
lstick_but, rstick_but: bool
rstick_x, rstick_y: int
but_a, but_b, but_x, but_y: bool
dpad_x, dpad_y: int
ltrigger, rtrigger: int
lshoulder, rshoulder: bool
// select/start/power button
last_type: evdev.EventType
last_code: u16
last_value: uint
last_is_down: bool
filepath := os.args[1]
fd: os.Handle
errno: os.Errno
fd, errno = os.open(filepath, os.O_RDWR)
if errno != os.ERROR_NONE {
panic("could not open device")
}
defer os.close(fd)
con->clear()
for errno == os.ERROR_NONE {
print_debug(&con, 1, 1, last_type, last_code, last_value, lstick_x, lstick_y, last_is_down)
draw_stick(&con, 3, 9, lstick_x, lstick_y, lstick_but)
draw_stick(&con, 21, 12, rstick_x, rstick_y, rstick_but)
draw_dpad(&con, 3, 16, dpad_x, dpad_y)
draw_facebuttons(&con, 17, 9, but_a, but_b, but_x, but_y)
draw_shoulder(&con, 2, 9, ltrigger, lshoulder)
draw_shoulder(&con, 29, 9, rtrigger, rshoulder)
event: evdev.InputEvent
_, errno = os.read_ptr(fd, &event, size_of(event))
//fmt.printf("%#v\n", event)
if event.type != .Syn {
last_type = event.type
last_code = event.code
last_value = event.value
}
if event.type == .Key {
if event.code == u16(evdev.Button.Start) {
break
} else {
buffer := evdev.get_key(fd)
is_down := true if buffer[event.code / 8] & (1 << (event.code % 8)) > 0 else false
last_is_down = is_down
#partial switch evdev.Button(event.code) {
case .A:
but_a = is_down
case .B:
but_b = is_down
case .X:
but_x = is_down
case .Y:
but_y = is_down
case .Thumbl:
lstick_but = is_down
case .Thumbr:
rstick_but = is_down
case .Tl:
lshoulder = is_down
case .Tr:
rshoulder = is_down
case .Select:
case .Start:
}
}
} else if event.type == .Abs {
axis := evdev.AbsAxis(event.code)
absinfo := evdev.get_abs_axis(fd, axis)
value := int(absinfo.value)
#partial switch axis {
case .X:
lstick_x = value
case .Y:
lstick_y = value
case .Rx:
rstick_x = value
case .Ry:
rstick_y = value
case .Hat0X:
dpad_x = value
case .Hat0Y:
dpad_y = value
case .Z:
ltrigger = value
case .Rz:
rtrigger = value
}
}
}
}