Skip to content

Commit 584ec6e

Browse files
committed
Change driver_name type from &str to &Vec<&str>
This allows alternative values for driver names, eg. the support for both ev3 and nxt hardware.
1 parent c1fcd43 commit 584ec6e

19 files changed

+41
-145
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ev3dev-lang-rust"
3-
version = "0.10.0"
3+
version = "0.10.1"
44
authors = ["Lars Westermann <lars-westermann@live.de>"]
55

66
description = "Rust language bindings for ev3dev"

examples/color-sensor/.dockerignore

Lines changed: 0 additions & 14 deletions
This file was deleted.

examples/color-sensor/Dockerfile

Lines changed: 0 additions & 26 deletions
This file was deleted.

examples/infrared-sensor/.dockerignore

Lines changed: 0 additions & 14 deletions
This file was deleted.

examples/infrared-sensor/Dockerfile

Lines changed: 0 additions & 26 deletions
This file was deleted.

examples/screen/.dockerignore

Lines changed: 0 additions & 14 deletions
This file was deleted.

examples/screen/Dockerfile

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/driver.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ impl Driver {
3838
pub fn find_name_by_port_and_driver(
3939
class_name: &str,
4040
port: &dyn Port,
41-
driver_name: &str,
41+
driver_name_vec: &Vec<&str>,
4242
) -> Ev3Result<String> {
4343
let port_address = port.address();
4444

@@ -52,15 +52,15 @@ impl Driver {
5252

5353
if address.get::<String>()?.contains(&port_address) {
5454
let driver = Attribute::new(class_name, name, "driver_name")?;
55-
56-
if driver.get::<String>()? == driver_name {
55+
let driver_name = driver.get::<String>()?;
56+
if driver_name_vec.iter().any(|n| &driver_name == n) {
5757
return Ok(name.to_owned());
5858
}
5959
}
6060
}
6161

6262
Err(Ev3Error::NotConnected {
63-
device: driver_name.to_owned(),
63+
device: format!("{:?}", driver_name_vec),
6464
port: Some(port.address()),
6565
})
6666
}
@@ -69,26 +69,26 @@ impl Driver {
6969
///
7070
/// Returns `Ev3Error::NotFound` if no such device exists.
7171
/// Returns `Ev3Error::MultipleMatches` if more then one matching device exists.
72-
pub fn find_name_by_driver(class_name: &str, driver_name: &str) -> Ev3Result<String> {
73-
let mut names = Driver::find_names_by_driver(class_name, driver_name)?;
72+
pub fn find_name_by_driver(class_name: &str, driver_name_vec: &Vec<&str>) -> Ev3Result<String> {
73+
let mut names = Driver::find_names_by_driver(class_name, &driver_name_vec)?;
7474

7575
match names.len() {
7676
0 => Err(Ev3Error::NotConnected {
77-
device: driver_name.to_owned(),
77+
device: format!("{:?}", driver_name_vec),
7878
port: None,
7979
}),
8080
1 => Ok(names
8181
.pop()
8282
.expect("Name vector should contains exactly one element")),
8383
_ => Err(Ev3Error::MultipleMatches {
84-
device: driver_name.to_owned(),
84+
device: format!("{:?}", driver_name_vec),
8585
ports: names,
8686
}),
8787
}
8888
}
8989

9090
/// Returns the names of the devices with the given `class_name`.
91-
pub fn find_names_by_driver(class_name: &str, driver_name: &str) -> Ev3Result<Vec<String>> {
91+
pub fn find_names_by_driver(class_name: &str, driver_name_vec: &Vec<&str>) -> Ev3Result<Vec<String>> {
9292
let paths = fs::read_dir(format!("{}{}", ROOT_PATH, class_name))?;
9393

9494
let mut found_names = Vec::new();
@@ -98,7 +98,8 @@ impl Driver {
9898

9999
let driver = Attribute::new(class_name, name, "driver_name")?;
100100

101-
if driver.get::<String>()? == driver_name {
101+
let driver_name = driver.get::<String>()?;
102+
if driver_name_vec.iter().any(|n| &driver_name == n) {
102103
found_names.push(name.to_owned());
103104
}
104105
}

src/findable.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
/// ```
2323
#[macro_export]
2424
macro_rules! findable {
25-
($class_name:expr, $driver_name:expr, $port: ty, $debug_name:expr, $port_prefix:expr) => {
25+
($class_name:expr, [$( $driver_name:expr ),*], $port: ty, $debug_name:expr, $port_prefix:expr) => {
2626
fn map_error(e: Ev3Error) -> Ev3Error {
2727
match e {
2828
e @ Ev3Error::InternalError { .. } => e,
@@ -42,23 +42,38 @@ macro_rules! findable {
4242

4343
/// Try to get a `Self` on the given port. Returns `None` if port is not used or another device is connected.
4444
pub fn get(port: $port) -> Ev3Result<Self> {
45-
let name = Driver::find_name_by_port_and_driver($class_name, &port, $driver_name)
45+
let mut driver_name_vec = Vec::new();
46+
$(
47+
driver_name_vec.push($driver_name);
48+
)*
49+
50+
let name = Driver::find_name_by_port_and_driver($class_name, &port, &driver_name_vec)
4651
.map_err(Self::map_error)?;
4752

4853
Ok(Self::new(Driver::new($class_name, &name)))
4954
}
5055

5156
/// Try to find a `Self`. Only returns a motor if their is exactly one connected, `Error::NotFound` otherwise.
5257
pub fn find() -> Ev3Result<Self> {
58+
let mut driver_name_vec = Vec::new();
59+
$(
60+
driver_name_vec.push($driver_name);
61+
)*
62+
5363
let name =
54-
Driver::find_name_by_driver($class_name, $driver_name).map_err(Self::map_error)?;
64+
Driver::find_name_by_driver($class_name, &driver_name_vec).map_err(Self::map_error)?;
5565

5666
Ok(Self::new(Driver::new($class_name, &name)))
5767
}
5868

5969
/// Extract list of connected 'Self'
6070
pub fn list() -> Ev3Result<Vec<Self>> {
61-
Ok(Driver::find_names_by_driver($class_name, $driver_name)?
71+
let mut driver_name_vec = Vec::new();
72+
$(
73+
driver_name_vec.push($driver_name);
74+
)*
75+
76+
Ok(Driver::find_names_by_driver($class_name, &driver_name_vec)?
6277
.iter()
6378
.map(|name| Self::new(Driver::new($class_name, &name)))
6479
.collect())

src/motors/large_motor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ impl LargeMotor {
1717

1818
findable!(
1919
"tacho-motor",
20-
"lego-ev3-l-motor",
20+
["lego-ev3-l-motor", "lego-nxt-motor"],
2121
MotorPort,
2222
"LargeMotor",
2323
"out"

0 commit comments

Comments
 (0)