Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
language: python
python:
- 2.7

sudo: false

install:
- pip install PIL --allow-external PIL --allow-unverified PIL

script:
- ./tests/api_tests.py
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
# ev3dev-lang-python

[![Build Status](https://travis-ci.org/ddemidov/ev3dev-lang-python-1.svg?branch=master)](https://travis-ci.org/ddemidov/ev3dev-lang-python-1)

Pure python bindings for ev3dev

25 changes: 13 additions & 12 deletions ev3dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,30 +75,29 @@ def file_handle( self, path, mode, reopen=False ):

return f

def read(self, path, size=-1):
def read(self, path):
f = self.file_handle(path, 'r')

try:
value = f.read(size)
f.seek(0)
value = f.read()
except IOError:
f = self.file_handle( path, 'w+', reopen=True )
value = f.read(size)
value = f.read()

if size < 0:
return value.strip()
else:
return value
return value.strip()

def write(self, path, value):
f = self.file_handle( path, 'w' )

try:
f.seek(0)
f.write( value )
f.flush()
except IOError:
f = self.file_handle( path, 'w+', reopen=True )
f.write( value )
f.flush()

f.flush()


#------------------------------------------------------------------------------
Expand Down Expand Up @@ -157,9 +156,9 @@ def _matches(self, attribute, pattern):
else:
return value.find(pattern) >= 0

def _get_attribute( self, attribute, size=-1 ):
def _get_attribute( self, attribute ):
"""Device attribute getter"""
return self._attribute_cache.read(abspath(self._path + '/' + attribute), size)
return self._attribute_cache.read(abspath(self._path + '/' + attribute))

def _set_attribute( self, attribute, value ):
"""Device attribute setter"""
Expand Down Expand Up @@ -1291,7 +1290,9 @@ def bin_data(self, fmt=None):
"float": 4
}.get(self.bin_data_format, 1) * self.num_values

raw = bytearray(self._get_attribute('bin_data', self._bin_data_size))
f = self._attribute_cache.file_handle(abspath(self._path + '/bin_data'), 'rb')
f.seek(0)
raw = bytearray(f.read(self._bin_data_size))

if fmt is None: return raw

Expand Down
8 changes: 8 additions & 0 deletions tests/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Commands used to copy the /sys/class node:

```sh
node=lego-sensor/sensor0
mkdir -p ./${node}
# Copy contents of special files, do not follow symlinks:
cp -P --copy-contents -r /sys/class/${node}/* ./${node}/
```
69 changes: 69 additions & 0 deletions tests/api_tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#!/usr/bin/env python
import unittest, sys, os

sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

import ev3dev

ev3dev.Device.DEVICE_ROOT_PATH = os.path.join(os.path.dirname(__file__), 'fake_sys_class')

class TestAPI(unittest.TestCase):
def test_device(self):
d = ev3dev.Device('tacho-motor', 'motor*')
self.assertTrue(d.connected)

d = ev3dev.Device('tacho-motor', 'motor0')
self.assertTrue(d.connected)

d = ev3dev.Device('tacho-motor', 'motor*', driver_name='lego-ev3-m-motor')
self.assertTrue(d.connected)

d = ev3dev.Device('tacho-motor', 'motor*', port_name='outA')
self.assertTrue(d.connected)

d = ev3dev.Device('tacho-motor', 'motor*', port_name='outA', driver_name='not-valid')
self.assertTrue(not d.connected)

d = ev3dev.Device('lego-sensor', 'sensor*')
self.assertTrue(d.connected)

def test_medium_motor(self):
m = ev3dev.MediumMotor()

self.assertTrue(m.connected);

self.assertEqual(m.count_per_rot, 360)
self.assertEqual(m.commands, ['run-forever', 'run-to-abs-pos', 'run-to-rel-pos', 'run-timed', 'run-direct', 'stop', 'reset'])
self.assertEqual(m.driver_name, 'lego-ev3-m-motor')
self.assertEqual(m.duty_cycle, 0)
self.assertEqual(m.duty_cycle_sp, 42)
self.assertEqual(m.encoder_polarity, 'normal')
self.assertEqual(m.polarity, 'normal')
self.assertEqual(m.port_name, 'outA')
self.assertEqual(m.position, 42)
self.assertEqual(m.position_sp, 42)
self.assertEqual(m.ramp_down_sp, 0)
self.assertEqual(m.ramp_up_sp, 0)
self.assertEqual(m.speed, 0)
self.assertEqual(m.speed_regulation_enabled, 'off')
self.assertEqual(m.speed_sp, 0)
self.assertEqual(m.state, [])
self.assertEqual(m.stop_command, 'coast')
self.assertEqual(m.time_sp, 1000)

with self.assertRaises(Exception):
c = m.command

def test_infrared_sensor(self):
s = ev3dev.InfraredSensor()

self.assertTrue(s.connected)

self.assertEqual(s.bin_data_format, 's8')
self.assertEqual(s.bin_data('<b'), (16,))
self.assertEqual(s.num_values, 1)
self.assertEqual(s.port_name, 'in1')
self.assertEqual(s.value(0), 16)

if __name__ == "__main__":
unittest.main()
Binary file added tests/fake_sys_class/lego-sensor/sensor0/bin_data
Binary file not shown.
1 change: 1 addition & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/bin_data_format
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
s8
Empty file.
Empty file.
1 change: 1 addition & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/decimals
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
Empty file.
1 change: 1 addition & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/driver_name
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lego-ev3-ir
1 change: 1 addition & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/fw_version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

1 change: 1 addition & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/mode
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
IR-PROX
1 change: 1 addition & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/modes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
IR-PROX IR-SEEK IR-REMOTE IR-REM-A IR-S-ALT IR-CAL
1 change: 1 addition & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/num_values
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1
Empty file.
1 change: 1 addition & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/port_name
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
in1
Empty file.
1 change: 1 addition & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/power/control
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
auto
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
unsupported
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
2 changes: 2 additions & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/uevent
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
LEGO_DRIVER_NAME=lego-ev3-ir
LEGO_PORT_NAME=in1
1 change: 1 addition & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/units
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pct
1 change: 1 addition & 0 deletions tests/fake_sys_class/lego-sensor/sensor0/value0
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
16
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/commands
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
run-forever run-to-abs-pos run-to-rel-pos run-timed run-direct stop reset
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/count_per_rot
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
360
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/driver_name
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lego-ev3-m-motor
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/duty_cycle
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/duty_cycle_sp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
42
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/encoder_polarity
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
normal
Empty file.
Empty file.
Empty file.
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/polarity
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
normal
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/port_name
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
outA
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/position
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
42
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/position_sp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
42
Empty file.
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/power/control
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
auto
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
unsupported
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/ramp_down_sp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/ramp_up_sp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/speed
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/speed_pid/Kd
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/speed_pid/Ki
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
60
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/speed_pid/Kp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1000
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/speed_regulation
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
off
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/speed_sp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/state
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/stop_command
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
coast
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/stop_commands
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
coast brake hold
1 change: 1 addition & 0 deletions tests/fake_sys_class/tacho-motor/motor0/time_sp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1000
2 changes: 2 additions & 0 deletions tests/fake_sys_class/tacho-motor/motor0/uevent
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
LEGO_DRIVER_NAME=lego-ev3-m-motor
LEGO_PORT_NAME=outA