Skip to content

Commit 0f58ca3

Browse files
committed
Make use of special sensor helper functions defined in spec
1 parent a0c1441 commit 0f58ca3

File tree

2 files changed

+225
-49
lines changed

2 files changed

+225
-49
lines changed

ev3dev/core.py

Lines changed: 156 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1443,7 +1443,36 @@ def poll_ms(self, value):
14431443

14441444

14451445
# ~autogen
1446-
# ~autogen generic-class specialSensorTypes.colorSensor>currentClass
1446+
1447+
1448+
# ~autogen special-sensors
1449+
1450+
class TouchSensor(Sensor):
1451+
1452+
"""
1453+
Touch Sensor
1454+
"""
1455+
1456+
SYSTEM_CLASS_NAME = Sensor.SYSTEM_CLASS_NAME
1457+
SYSTEM_DEVICE_NAME_CONVENTION = Sensor.SYSTEM_DEVICE_NAME_CONVENTION
1458+
1459+
def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, name_exact=False, **kwargs):
1460+
if address is not None:
1461+
kwargs['address'] = address
1462+
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-touch', 'lego-nxt-touch'], **kwargs)
1463+
1464+
# Button state
1465+
MODE_TOUCH = 'TOUCH'
1466+
1467+
1468+
def is_pressed():
1469+
"""
1470+
A boolean indicating whether the current touch sensor is being
1471+
pressed.
1472+
"""
1473+
self.mode = MODE_TOUCH
1474+
return self.value(0)
1475+
14471476

14481477
class ColorSensor(Sensor):
14491478

@@ -1459,10 +1488,6 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
14591488
kwargs['address'] = address
14601489
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-color'], **kwargs)
14611490

1462-
1463-
# ~autogen
1464-
# ~autogen generic-property-value specialSensorTypes.colorSensor>currentClass
1465-
14661491
# Reflected light. Red LED on.
14671492
MODE_COL_REFLECT = 'COL-REFLECT'
14681493

@@ -1479,8 +1504,56 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
14791504
MODE_RGB_RAW = 'RGB-RAW'
14801505

14811506

1482-
# ~autogen
1483-
# ~autogen generic-class specialSensorTypes.ultrasonicSensor>currentClass
1507+
def reflected_light_intensity():
1508+
"""
1509+
Reflected light intensity as a percentage. Light on sensor is red.
1510+
"""
1511+
self.mode = MODE_COL_REFLECT
1512+
return self.value(0)
1513+
1514+
def ambient_light_intensity():
1515+
"""
1516+
Ambient light intensity. Light on sensor is dimly lit blue.
1517+
"""
1518+
self.mode = MODE_COL_AMBIENT
1519+
return self.value(0)
1520+
1521+
def color():
1522+
"""
1523+
Color detected by the sensor, categorized by overall value.
1524+
- 0: No color
1525+
- 1: Black
1526+
- 2: Blue
1527+
- 3: Green
1528+
- 4: Yellow
1529+
- 5: Red
1530+
- 6: White
1531+
- 7: Brown
1532+
"""
1533+
self.mode = MODE_COL_COLOR
1534+
return self.value(0)
1535+
1536+
def red():
1537+
"""
1538+
Red component of the detected color, in the range 0-1020.
1539+
"""
1540+
self.mode = MODE_RGB_RAW
1541+
return self.value(0)
1542+
1543+
def green():
1544+
"""
1545+
Green component of the detected color, in the range 0-1020.
1546+
"""
1547+
self.mode = MODE_RGB_RAW
1548+
return self.value(1)
1549+
1550+
def blue():
1551+
"""
1552+
Blue component of the detected color, in the range 0-1020.
1553+
"""
1554+
self.mode = MODE_RGB_RAW
1555+
return self.value(2)
1556+
14841557

14851558
class UltrasonicSensor(Sensor):
14861559

@@ -1496,10 +1569,6 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
14961569
kwargs['address'] = address
14971570
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-us', 'lego-nxt-us'], **kwargs)
14981571

1499-
1500-
# ~autogen
1501-
# ~autogen generic-property-value specialSensorTypes.ultrasonicSensor>currentClass
1502-
15031572
# Continuous measurement in centimeters.
15041573
MODE_US_DIST_CM = 'US-DIST-CM'
15051574

@@ -1516,8 +1585,30 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
15161585
MODE_US_SI_IN = 'US-SI-IN'
15171586

15181587

1519-
# ~autogen
1520-
# ~autogen generic-class specialSensorTypes.gyroSensor>currentClass
1588+
def distance_centimeters():
1589+
"""
1590+
Measurement of the distance detected by the sensor,
1591+
in centimeters.
1592+
"""
1593+
self.mode = MODE_US_DIST_CM
1594+
return self.value(0)
1595+
1596+
def distance_inches():
1597+
"""
1598+
Measurement of the distance detected by the sensor,
1599+
in inches.
1600+
"""
1601+
self.mode = MODE_US_DIST_IN
1602+
return self.value(0)
1603+
1604+
def other_sensor_present():
1605+
"""
1606+
Value indicating whether another ultrasonic sensor could
1607+
be heard nearby.
1608+
"""
1609+
self.mode = MODE_US_LISTEN
1610+
return self.value(0)
1611+
15211612

15221613
class GyroSensor(Sensor):
15231614

@@ -1533,10 +1624,6 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
15331624
kwargs['address'] = address
15341625
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-gyro'], **kwargs)
15351626

1536-
1537-
# ~autogen
1538-
# ~autogen generic-property-value specialSensorTypes.gyroSensor>currentClass
1539-
15401627
# Angle
15411628
MODE_GYRO_ANG = 'GYRO-ANG'
15421629

@@ -1553,8 +1640,21 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
15531640
MODE_GYRO_CAL = 'GYRO-CAL'
15541641

15551642

1556-
# ~autogen
1557-
# ~autogen generic-class specialSensorTypes.infraredSensor>currentClass
1643+
def angle():
1644+
"""
1645+
The number of degrees that the sensor has been rotated
1646+
since it was put into this mode.
1647+
"""
1648+
self.mode = MODE_GYRO_ANG
1649+
return self.value(0)
1650+
1651+
def rate():
1652+
"""
1653+
The rate at which the sensor is rotating, in degrees/second.
1654+
"""
1655+
self.mode = MODE_GYRO_RATE
1656+
return self.value(0)
1657+
15581658

15591659
class InfraredSensor(Sensor):
15601660

@@ -1570,10 +1670,6 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
15701670
kwargs['address'] = address
15711671
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-ir'], **kwargs)
15721672

1573-
1574-
# ~autogen
1575-
# ~autogen generic-property-value specialSensorTypes.infraredSensor>currentClass
1576-
15771673
# Proximity
15781674
MODE_IR_PROX = 'IR-PROX'
15791675

@@ -1590,8 +1686,14 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
15901686
MODE_IR_CAL = 'IR-CAL'
15911687

15921688

1593-
# ~autogen
1594-
# ~autogen generic-class specialSensorTypes.soundSensor>currentClass
1689+
def proximity():
1690+
"""
1691+
A measurement of the distance between the sensor and the remote,
1692+
as a percentage. 100% is approximately 70cm/27in.
1693+
"""
1694+
self.mode = MODE_IR_PROX
1695+
return self.value(0)
1696+
15951697

15961698
class SoundSensor(Sensor):
15971699

@@ -1607,19 +1709,29 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
16071709
kwargs['address'] = address
16081710
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-nxt-sound'], **kwargs)
16091711

1610-
1611-
# ~autogen
1612-
# ~autogen generic-property-value specialSensorTypes.soundSensor>currentClass
1613-
16141712
# Sound pressure level. Flat weighting
16151713
MODE_DB = 'DB'
16161714

16171715
# Sound pressure level. A weighting
16181716
MODE_DBA = 'DBA'
16191717

16201718

1621-
# ~autogen
1622-
# ~autogen generic-class specialSensorTypes.lightSensor>currentClass
1719+
def sound_pressure():
1720+
"""
1721+
A measurement of the measured sound pressure level, as a
1722+
percent. Uses a flat weighting.
1723+
"""
1724+
self.mode = MODE_DB
1725+
return self.value(0)
1726+
1727+
def sound_pressure_low():
1728+
"""
1729+
A measurement of the measured sound pressure level, as a
1730+
percent. Uses A-weighting, which focuses on levels up to 55 dB.
1731+
"""
1732+
self.mode = MODE_DBA
1733+
return self.value(0)
1734+
16231735

16241736
class LightSensor(Sensor):
16251737

@@ -1635,36 +1747,31 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
16351747
kwargs['address'] = address
16361748
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-nxt-light'], **kwargs)
16371749

1638-
1639-
# ~autogen
1640-
# ~autogen generic-property-value specialSensorTypes.lightSensor>currentClass
1641-
16421750
# Reflected light. LED on
16431751
MODE_REFLECT = 'REFLECT'
16441752

16451753
# Ambient light. LED off
16461754
MODE_AMBIENT = 'AMBIENT'
16471755

16481756

1649-
# ~autogen
1650-
# ~autogen generic-class specialSensorTypes.touchSensor>currentClass
1651-
1652-
class TouchSensor(Sensor):
1653-
1654-
"""
1655-
Touch Sensor
1656-
"""
1757+
def reflected_light_intensity():
1758+
"""
1759+
A measurement of the reflected light intensity, as a percentage.
1760+
"""
1761+
self.mode = MODE_REFLECT
1762+
return self.value(0)
16571763

1658-
SYSTEM_CLASS_NAME = Sensor.SYSTEM_CLASS_NAME
1659-
SYSTEM_DEVICE_NAME_CONVENTION = Sensor.SYSTEM_DEVICE_NAME_CONVENTION
1764+
def ambient_light_intensity():
1765+
"""
1766+
A measurement of the ambient light intensity, as a percentage.
1767+
"""
1768+
self.mode = MODE_AMBIENT
1769+
return self.value(0)
16601770

1661-
def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, name_exact=False, **kwargs):
1662-
if address is not None:
1663-
kwargs['address'] = address
1664-
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-touch', 'lego-nxt-touch'], **kwargs)
16651771

16661772

16671773
# ~autogen
1774+
16681775
# ~autogen generic-class classes.led>currentClass
16691776

16701777
class Led(Device):

templates/special-sensors.liquid

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
{% for currentClassMetadata in specialSensorTypes %}{%
2+
assign currentClass = currentClassMetadata[1] %}{%
3+
assign class_name = currentClass.friendlyName | camel_case | capitalize %}{%
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 %}
21+
class {{ class_name }}({{ base_class }}):
22+
23+
"""{%
24+
for line in currentClass.description %}{%
25+
if line %}
26+
{{ line }}{%
27+
else %}
28+
{% endif %}{%
29+
endfor %}
30+
"""
31+
{% if currentClass.inheritance %}
32+
SYSTEM_CLASS_NAME = {{ base_class }}.SYSTEM_CLASS_NAME
33+
SYSTEM_DEVICE_NAME_CONVENTION = {{ base_class }}.SYSTEM_DEVICE_NAME_CONVENTION
34+
{% else %}
35+
SYSTEM_CLASS_NAME = '{{ currentClass.systemClassName }}'
36+
SYSTEM_DEVICE_NAME_CONVENTION = '{{ device_name_convention }}'
37+
{% endif %}
38+
def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, name_exact=False, **kwargs):
39+
if address is not None:
40+
kwargs['address'] = address
41+
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact,{{ driver_name }} **kwargs)
42+
43+
{% for prop in currentClass.propertyValues %}{%
44+
assign className = currentClass.friendlyName | downcase | underscore_spaces %}{%
45+
assign propName = prop.propertyName | upcase | underscore_spaces %}{%
46+
for value in prop.values %}{%
47+
for line in value.description %}
48+
# {{ line }}{%
49+
endfor %}
50+
{{ propName }}_{{ value.name | upcase | underscore_non_wc }} = '{{ value.name }}'
51+
{% endfor %}{%
52+
endfor %}
53+
{% for mapping in currentClass.sensorValueMappings %}{%
54+
assign name = mapping.name | downcase | underscore_spaces %}{%
55+
assign mode = mapping.requiredMode | upcase | underscore_non_wc %}{%
56+
assign value_index = mapping.sourceValue %}
57+
def {{ name }}():
58+
"""{%
59+
for line in mapping.description %}{%
60+
if line %}
61+
{{ line }}{%
62+
else %}
63+
{% endif %}{%
64+
endfor %}
65+
"""
66+
self.mode = MODE_{{ mode }}
67+
return self.value({{ value_index }})
68+
{% endfor %}
69+
{% endfor %}

0 commit comments

Comments
 (0)