Skip to content
David Lechner edited this page May 17, 2014 · 4 revisions

The buttons on the EV3 are mapped as regular keyboard keys. UP, DOWN, LEFT, RIGHT, ENTER and ESC.

TODO: add photo.

Polling Key States

If you would rather poll the button states instead of using regular keyboard input methods, you can do that via the EVIOCGKEY ioctl on /dev/input/eventX. Key codes and ioctl definitions are in linux/input.h.

Here is an example using python:

#!/usr/bin/env python

import array
import fcntl
import sys

# from linux/input.h

KEY_UP = 103
KEY_DOWN = 108
KEY_LEFT = 105
KEY_RIGHT = 106
KEY_ENTER = 28
KEY_ESC = 1

KEY_MAX = 0x2ff

def EVIOCGKEY(length):
    return 2 << (14+8+8) | length << (8+8) | ord('E') << 8 | 0x18

# end of stuff from linux/input.h

BUF_LEN = (KEY_MAX + 7) / 8

def test_bit(bit, bytes):
    # bit in bytes is 1 when released and 0 when pressed
    return not bool(bytes[bit / 8] & 1 << bit % 8)

def main():
    buf = array.array('B', [0] * BUF_LEN)
    with open('/dev/input/by-path/platform-gpio-keys.0-event', 'r') as fd:
        ret = fcntl.ioctl(fd, EVIOCGKEY(len(buf)), buf)

    if ret < 0:
        print "ioctl error", ret
        sys.exit(1)

    for key in ['UP', 'DOWN', 'LEFT', 'RIGHT', 'ENTER', 'ESC']:
        key_code = globals()['KEY_' + key]
        key_state = test_bit(key_code, buf) and "pressed" or "released"
        print '%s:' % key, key_state

if __name__ == "__main__":
    main()

Directly Reading the Event Device

If you want your program to be event driven, you can read the /dev/input/by-path/platform-gpio-keys.0-event file. It will block until a key is pressed. The data is in 16 byte blocks. The first 8 bytes are the time stamp (2 unsigned 64-bit integers, seconds and microseconds), the next 2 bytes are the type (unsigned 16-bit integer), the next 2 bytes are the code (unsigned 16-bit integer) and the last 4 bytes are the value (unsigned 32-bit integer).

Here is an example. It prints out 2 lines each time you press a button on the EV3 and 2 more lines each time you release a button. And of course, press CTRL+C to end.

root@ev3dev:/sys/class/leds# hexdump -e \
'"timestamp:%d.%6d""\t""" 1/2 "type:%i""\t"""  1/2 "code:%3i""\t"""  "value:%d\n"' \
< /dev/input/by-path/platform-gpio-keys.0-event 
timestamp:1391366282.119886	type:1	code:  1	value:0
timestamp:1391366282.120100	type:0	code:  0	value:0
timestamp:1391366282.829942	type:1	code:  1	value:1
timestamp:1391366282.830179	type:0	code:  0	value:0
timestamp:1391366284.300099	type:1	code:105	value:0
timestamp:1391366284.300319	type:0	code:  0	value:0
timestamp:1391366284.829989	type:1	code:105	value:1
timestamp:1391366284.830223	type:0	code:  0	value:0
timestamp:1391366286.019866	type:1	code:103	value:0
timestamp:1391366286.020076	type:0	code:  0	value:0
timestamp:1391366286.319967	type:1	code:103	value:1
timestamp:1391366286.320202	type:0	code:  0	value:0
timestamp:1391366287.169925	type:1	code:106	value:0
timestamp:1391366287.169973	type:0	code:  0	value:0
timestamp:1391366287.479994	type:1	code:106	value:1
timestamp:1391366287.480234	type:0	code:  0	value:0
timestamp:1391366288.339882	type:1	code: 28	value:0
timestamp:1391366288.340092	type:0	code:  0	value:0
timestamp:1391366288.699929	type:1	code: 28	value:1
timestamp:1391366288.700291	type:0	code:  0	value:0
timestamp:1391366289.470046	type:1	code:108	value:0
timestamp:1391366289.470263	type:0	code:  0	value:0
timestamp:1391366289.829943	type:1	code:108	value:1
timestamp:1391366289.830176	type:0	code:  0	value:0
^C
Clone this wiki locally