Skip to content

Commit 15949f9

Browse files
committed
Add autogen of platform specific button properties
1 parent 1a0e62a commit 15949f9

File tree

3 files changed

+29
-66
lines changed

3 files changed

+29
-66
lines changed

ev3dev.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import fnmatch
3232
import numbers
3333
import platform
34+
import fcntl
35+
import array
3436

3537
#------------------------------------------------------------------------------
3638
# Guess platform we are running on
@@ -1707,13 +1709,17 @@ def Led_all_off():
17071709
import fcntl
17081710
import array
17091711

1710-
class Button():
1712+
class Button(object):
17111713

17121714
"""
17131715
Provides a generic button reading mechanism that can be adapted
17141716
to platform specific implementations. Each platform's specific
17151717
button capabilites are enumerated in the 'platforms' section
17161718
of this specification
1719+
1720+
This implementation depends on the availability of the EVIOCGKEY ioctl
1721+
to be able to read the button state buffer. See Linux kernel source
1722+
in /include/uapi/linux/input.h for details.
17171723
"""
17181724

17191725
KEY_MAX = 0x2FF
@@ -1733,36 +1739,39 @@ def _button_file(self, name):
17331739
return f
17341740

17351741
def read_button(self, name, button):
1736-
ret = fcntl.ioctl(self._button_file('/dev/input/by-path/platform-gpio-keys.0-event'), self.EVIOCGKEY, self._buf)
1742+
ret = fcntl.ioctl(self._button_file(name), self.EVIOCGKEY, self._buf)
17371743
if (ret < 0):
17381744
return None
17391745
else:
17401746
return not bool(self._buf[int(button / 8)] & 1 << button % 8)
17411747

1748+
#~autogen
1749+
if current_platform() == 'ev3':
1750+
#~autogen button-property platforms.ev3.button>currentClass
1751+
17421752
@property
17431753
def up(self):
1744-
return self.read_button( 'platform-gpio-keys.0-event', 103 )
1754+
return self.read_button('/dev/input/by-path/platform-gpio-keys.0-event', 103)
17451755

17461756
@property
17471757
def down(self):
1748-
return self.read_button( 'platform-gpio-keys.0-event', 108 )
1758+
return self.read_button('/dev/input/by-path/platform-gpio-keys.0-event', 108)
17491759

17501760
@property
17511761
def left(self):
1752-
return self.read_button( 'platform-gpio-keys.0-event', 105 )
1762+
return self.read_button('/dev/input/by-path/platform-gpio-keys.0-event', 105)
17531763

17541764
@property
17551765
def right(self):
1756-
return self.read_button( 'platform-gpio-keys.0-event', 106 )
1766+
return self.read_button('/dev/input/by-path/platform-gpio-keys.0-event', 106)
17571767

17581768
@property
17591769
def enter(self):
1760-
return self.read_button( 'platform-gpio-keys.0-event', 28 )
1770+
return self.read_button('/dev/input/by-path/platform-gpio-keys.0-event', 28)
17611771

17621772
@property
17631773
def backspace(self):
1764-
return self.read_button( 'platform-gpio-keys.0-event', 14 )
1765-
1774+
return self.read_button('/dev/input/by-path/platform-gpio-keys.0-event', 14)
17661775

17671776

17681777
#~autogen

templates/button-class.liquid

Lines changed: 6 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,17 @@
11
{%
22
assign class_name = currentClass.friendlyName | camel_case | capitalize %}{%
3-
comment %}{%
4-
if currentClass.systemDeviceNameConvention %}{%
5-
assign device_name_convention = currentClass.systemDeviceNameConvention | replace: '\{\d\}', '*' %}{%
6-
else %}{%
7-
assign device_name_convention = '*' %}{%
8-
endif %}{%
9-
if currentClass.inheritance %}{%
10-
assign base_class = currentClass.inheritance | camel_case | capitalize %}{%
11-
else %}{%
12-
assign base_class = 'Device' %}{%
13-
endif%}{%
14-
assign driver_name = "" %}{%
15-
if currentClass.driverName %}{%
16-
for name in currentClass.driverName %}{%
17-
capture driver_name %}{{ driver_name }}, '{{name}}'{% endcapture %}{%
18-
endfor %}{%
19-
capture driver_name %} driver_name=[{{ driver_name | remove_first:', ' }}],{% endcapture %}{%
20-
endif %}{% endcomment %}
3+
assign base_class = 'object' %}
214
import fcntl
225
import array
236

247
class {{ class_name }}({{ base_class }}):
258

269
"""{% for line in currentClass.description %}
2710
{{ line }}{% endfor %}
11+
12+
This implementation depends on the availability of the EVIOCGKEY ioctl
13+
to be able to read the button state buffer. See Linux kernel source
14+
in /include/uapi/linux/input.h for details.
2815
"""
2916

3017
KEY_MAX = 0x2FF
@@ -44,46 +31,8 @@ class {{ class_name }}({{ base_class }}):
4431
return f
4532

4633
def read_button(self, name, button):
47-
ret = fcntl.ioctl(self._button_file('/dev/input/by-path/platform-gpio-keys.0-event'), self.EVIOCGKEY, self._buf)
34+
ret = fcntl.ioctl(self._button_file(name), self.EVIOCGKEY, self._buf)
4835
if (ret < 0):
4936
return None
5037
else:
5138
return not bool(self._buf[int(button / 8)] & 1 << button % 8)
52-
53-
@property
54-
def up(self):
55-
return self.read_button( 'platform-gpio-keys.0-event', 103 )
56-
57-
@property
58-
def down(self):
59-
return self.read_button( 'platform-gpio-keys.0-event', 108 )
60-
61-
@property
62-
def left(self):
63-
return self.read_button( 'platform-gpio-keys.0-event', 105 )
64-
65-
@property
66-
def right(self):
67-
return self.read_button( 'platform-gpio-keys.0-event', 106 )
68-
69-
@property
70-
def enter(self):
71-
return self.read_button( 'platform-gpio-keys.0-event', 28 )
72-
73-
@property
74-
def backspace(self):
75-
return self.read_button( 'platform-gpio-keys.0-event', 14 )
76-
77-
{% comment %}
78-
{% if currentClass.inheritance %}
79-
SYSTEM_CLASS_NAME = {{ base_class }}.SYSTEM_CLASS_NAME
80-
SYSTEM_DEVICE_NAME_CONVENTION = {{ base_class }}.SYSTEM_DEVICE_NAME_CONVENTION
81-
{% else %}
82-
SYSTEM_CLASS_NAME = '{{ currentClass.systemClassName }}'
83-
SYSTEM_DEVICE_NAME_CONVENTION = '{{ device_name_convention }}'
84-
{% endif %}
85-
def __init__(self, port=None, name=SYSTEM_DEVICE_NAME_CONVENTION, **kwargs):
86-
if port is not None:
87-
kwargs['port_name'] = port
88-
Device.__init__(self, self.SYSTEM_CLASS_NAME, name,{{ driver_name }} **kwargs)
89-
{% endcomment %}

templates/button-property.liquid

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{% for instance in currentClass.instances %}
2+
@property
3+
def {{ instance.name }}(self):
4+
return self.read_button('{{ currentClass.systemPath }}/{{ instance.systemName }}', {{ instance.systemValue }})
5+
{% endfor %}

0 commit comments

Comments
 (0)