Skip to content

Commit 13bc88f

Browse files
committed
Merge pull request #111 from ddemidov/special-sensor-classes
Make use of special sensor helper functions defined in spec
2 parents 1a74a30 + 0f58ca3 commit 13bc88f

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
@@ -1434,7 +1434,36 @@ def poll_ms(self, value):
14341434

14351435

14361436
# ~autogen
1437-
# ~autogen generic-class specialSensorTypes.colorSensor>currentClass
1437+
1438+
1439+
# ~autogen special-sensors
1440+
1441+
class TouchSensor(Sensor):
1442+
1443+
"""
1444+
Touch Sensor
1445+
"""
1446+
1447+
SYSTEM_CLASS_NAME = Sensor.SYSTEM_CLASS_NAME
1448+
SYSTEM_DEVICE_NAME_CONVENTION = Sensor.SYSTEM_DEVICE_NAME_CONVENTION
1449+
1450+
def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, name_exact=False, **kwargs):
1451+
if address is not None:
1452+
kwargs['address'] = address
1453+
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-touch', 'lego-nxt-touch'], **kwargs)
1454+
1455+
# Button state
1456+
MODE_TOUCH = 'TOUCH'
1457+
1458+
1459+
def is_pressed():
1460+
"""
1461+
A boolean indicating whether the current touch sensor is being
1462+
pressed.
1463+
"""
1464+
self.mode = MODE_TOUCH
1465+
return self.value(0)
1466+
14381467

14391468
class ColorSensor(Sensor):
14401469

@@ -1450,10 +1479,6 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
14501479
kwargs['address'] = address
14511480
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-color'], **kwargs)
14521481

1453-
1454-
# ~autogen
1455-
# ~autogen generic-property-value specialSensorTypes.colorSensor>currentClass
1456-
14571482
# Reflected light. Red LED on.
14581483
MODE_COL_REFLECT = 'COL-REFLECT'
14591484

@@ -1470,8 +1495,56 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
14701495
MODE_RGB_RAW = 'RGB-RAW'
14711496

14721497

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

14761549
class UltrasonicSensor(Sensor):
14771550

@@ -1487,10 +1560,6 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
14871560
kwargs['address'] = address
14881561
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-us', 'lego-nxt-us'], **kwargs)
14891562

1490-
1491-
# ~autogen
1492-
# ~autogen generic-property-value specialSensorTypes.ultrasonicSensor>currentClass
1493-
14941563
# Continuous measurement in centimeters.
14951564
MODE_US_DIST_CM = 'US-DIST-CM'
14961565

@@ -1507,8 +1576,30 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
15071576
MODE_US_SI_IN = 'US-SI-IN'
15081577

15091578

1510-
# ~autogen
1511-
# ~autogen generic-class specialSensorTypes.gyroSensor>currentClass
1579+
def distance_centimeters():
1580+
"""
1581+
Measurement of the distance detected by the sensor,
1582+
in centimeters.
1583+
"""
1584+
self.mode = MODE_US_DIST_CM
1585+
return self.value(0)
1586+
1587+
def distance_inches():
1588+
"""
1589+
Measurement of the distance detected by the sensor,
1590+
in inches.
1591+
"""
1592+
self.mode = MODE_US_DIST_IN
1593+
return self.value(0)
1594+
1595+
def other_sensor_present():
1596+
"""
1597+
Value indicating whether another ultrasonic sensor could
1598+
be heard nearby.
1599+
"""
1600+
self.mode = MODE_US_LISTEN
1601+
return self.value(0)
1602+
15121603

15131604
class GyroSensor(Sensor):
15141605

@@ -1524,10 +1615,6 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
15241615
kwargs['address'] = address
15251616
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-gyro'], **kwargs)
15261617

1527-
1528-
# ~autogen
1529-
# ~autogen generic-property-value specialSensorTypes.gyroSensor>currentClass
1530-
15311618
# Angle
15321619
MODE_GYRO_ANG = 'GYRO-ANG'
15331620

@@ -1544,8 +1631,21 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
15441631
MODE_GYRO_CAL = 'GYRO-CAL'
15451632

15461633

1547-
# ~autogen
1548-
# ~autogen generic-class specialSensorTypes.infraredSensor>currentClass
1634+
def angle():
1635+
"""
1636+
The number of degrees that the sensor has been rotated
1637+
since it was put into this mode.
1638+
"""
1639+
self.mode = MODE_GYRO_ANG
1640+
return self.value(0)
1641+
1642+
def rate():
1643+
"""
1644+
The rate at which the sensor is rotating, in degrees/second.
1645+
"""
1646+
self.mode = MODE_GYRO_RATE
1647+
return self.value(0)
1648+
15491649

15501650
class InfraredSensor(Sensor):
15511651

@@ -1561,10 +1661,6 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
15611661
kwargs['address'] = address
15621662
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-ir'], **kwargs)
15631663

1564-
1565-
# ~autogen
1566-
# ~autogen generic-property-value specialSensorTypes.infraredSensor>currentClass
1567-
15681664
# Proximity
15691665
MODE_IR_PROX = 'IR-PROX'
15701666

@@ -1581,8 +1677,14 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
15811677
MODE_IR_CAL = 'IR-CAL'
15821678

15831679

1584-
# ~autogen
1585-
# ~autogen generic-class specialSensorTypes.soundSensor>currentClass
1680+
def proximity():
1681+
"""
1682+
A measurement of the distance between the sensor and the remote,
1683+
as a percentage. 100% is approximately 70cm/27in.
1684+
"""
1685+
self.mode = MODE_IR_PROX
1686+
return self.value(0)
1687+
15861688

15871689
class SoundSensor(Sensor):
15881690

@@ -1598,19 +1700,29 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
15981700
kwargs['address'] = address
15991701
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-nxt-sound'], **kwargs)
16001702

1601-
1602-
# ~autogen
1603-
# ~autogen generic-property-value specialSensorTypes.soundSensor>currentClass
1604-
16051703
# Sound pressure level. Flat weighting
16061704
MODE_DB = 'DB'
16071705

16081706
# Sound pressure level. A weighting
16091707
MODE_DBA = 'DBA'
16101708

16111709

1612-
# ~autogen
1613-
# ~autogen generic-class specialSensorTypes.lightSensor>currentClass
1710+
def sound_pressure():
1711+
"""
1712+
A measurement of the measured sound pressure level, as a
1713+
percent. Uses a flat weighting.
1714+
"""
1715+
self.mode = MODE_DB
1716+
return self.value(0)
1717+
1718+
def sound_pressure_low():
1719+
"""
1720+
A measurement of the measured sound pressure level, as a
1721+
percent. Uses A-weighting, which focuses on levels up to 55 dB.
1722+
"""
1723+
self.mode = MODE_DBA
1724+
return self.value(0)
1725+
16141726

16151727
class LightSensor(Sensor):
16161728

@@ -1626,36 +1738,31 @@ def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, nam
16261738
kwargs['address'] = address
16271739
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-nxt-light'], **kwargs)
16281740

1629-
1630-
# ~autogen
1631-
# ~autogen generic-property-value specialSensorTypes.lightSensor>currentClass
1632-
16331741
# Reflected light. LED on
16341742
MODE_REFLECT = 'REFLECT'
16351743

16361744
# Ambient light. LED off
16371745
MODE_AMBIENT = 'AMBIENT'
16381746

16391747

1640-
# ~autogen
1641-
# ~autogen generic-class specialSensorTypes.touchSensor>currentClass
1642-
1643-
class TouchSensor(Sensor):
1644-
1645-
"""
1646-
Touch Sensor
1647-
"""
1748+
def reflected_light_intensity():
1749+
"""
1750+
A measurement of the reflected light intensity, as a percentage.
1751+
"""
1752+
self.mode = MODE_REFLECT
1753+
return self.value(0)
16481754

1649-
SYSTEM_CLASS_NAME = Sensor.SYSTEM_CLASS_NAME
1650-
SYSTEM_DEVICE_NAME_CONVENTION = Sensor.SYSTEM_DEVICE_NAME_CONVENTION
1755+
def ambient_light_intensity():
1756+
"""
1757+
A measurement of the ambient light intensity, as a percentage.
1758+
"""
1759+
self.mode = MODE_AMBIENT
1760+
return self.value(0)
16511761

1652-
def __init__(self, address=None, name_pattern=SYSTEM_DEVICE_NAME_CONVENTION, name_exact=False, **kwargs):
1653-
if address is not None:
1654-
kwargs['address'] = address
1655-
Device.__init__(self, self.SYSTEM_CLASS_NAME, name_pattern, name_exact, driver_name=['lego-ev3-touch', 'lego-nxt-touch'], **kwargs)
16561762

16571763

16581764
# ~autogen
1765+
16591766
# ~autogen generic-class classes.led>currentClass
16601767

16611768
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)