From 3d4a6ba72ddddc93d67a0cacbfd77d60d74561d5 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Fri, 21 Nov 2025 13:44:56 +0800 Subject: [PATCH 1/4] examples: linux: Add sleep between refreshes Doing it too quickly results in: called `Result::unwrap()` on an `Err` value: I2c(I2CError { err: Errno(121) }) Signed-off-by: Daniel Schaefer --- examples/linux.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/linux.rs b/examples/linux.rs index 056b0f5..f6152db 100644 --- a/examples/linux.rs +++ b/examples/linux.rs @@ -20,9 +20,10 @@ fn main() { } println!(); println!(); + sensor.refresh().unwrap(); + thread::sleep(Duration::from_millis(100)); sensor.refresh_v().unwrap(); - thread::sleep(Duration::from_millis(100)); } } From 64e7c626026b629a2a121708863e783f6620b0af Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Thu, 20 Nov 2025 11:18:24 +0800 Subject: [PATCH 2/4] Add example with multiple devices on the same bus > cargo build --examples && sudo ./target/debug/examples/linux-shared Signed-off-by: Daniel Schaefer --- Cargo.toml | 1 + examples/linux-shared.rs | 52 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 examples/linux-shared.rs diff --git a/Cargo.toml b/Cargo.toml index 32d6fef..3b406a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ pastey = "0.2" # For the example [dev-dependencies] +embedded-hal-bus = "0.3.0" linux-embedded-hal = "0.4.1" [dependencies.packed_struct] diff --git a/examples/linux-shared.rs b/examples/linux-shared.rs new file mode 100644 index 0000000..071e2bf --- /dev/null +++ b/examples/linux-shared.rs @@ -0,0 +1,52 @@ +use embedded_hal_bus::i2c::RefCellDevice; +use linux_embedded_hal::I2cdev; +use pac194x::{AddrSelect, PAC194X}; +use std::cell::RefCell; +use std::{thread, time::Duration}; + +const SENSE_RESISTOR: f32 = 0.5; + +fn main() { + let i2c = RefCell::new(I2cdev::new("/dev/i2c-3").unwrap()); + + let bus_handle1 = RefCellDevice::new(&i2c); + let mut sensor1 = PAC194X::new(bus_handle1, AddrSelect::GND).unwrap(); + + let bus_handle2 = RefCellDevice::new(&i2c); + let mut sensor2 = PAC194X::new(bus_handle2, AddrSelect::_499).unwrap(); + + loop { + print!("Sensor 1 "); + for channel in 1..5 { + let bus_voltage = sensor1.read_bus_voltage_n(channel).unwrap(); + let sense_voltage = sensor1.read_sense_voltage_n(channel).unwrap(); + print!( + "CH{} {:5.2}V, {:5.2}A, ", + channel, + bus_voltage, + sense_voltage / SENSE_RESISTOR + ); + } + println!(); + print!("Sensor 2 "); + for channel in 1..5 { + let bus_voltage = sensor2.read_bus_voltage_n(channel).unwrap(); + let sense_voltage = sensor2.read_sense_voltage_n(channel).unwrap(); + print!( + "CH{} {:5.2}V, {:5.2}A, ", + channel, + bus_voltage, + sense_voltage / SENSE_RESISTOR + ); + } + println!(); + println!(); + sensor1.refresh().unwrap(); + thread::sleep(Duration::from_millis(100)); + sensor1.refresh_v().unwrap(); + thread::sleep(Duration::from_millis(100)); + sensor2.refresh().unwrap(); + thread::sleep(Duration::from_millis(100)); + sensor2.refresh_v().unwrap(); + } +} From a90d39efcb35ee36d9541baca44f5de3f2e3710b Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Fri, 21 Nov 2025 13:54:58 +0800 Subject: [PATCH 3/4] examples: Use different sense resistors for each rail Signed-off-by: Daniel Schaefer --- examples/linux-shared.rs | 6 +++--- examples/linux.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/linux-shared.rs b/examples/linux-shared.rs index 071e2bf..ab366e9 100644 --- a/examples/linux-shared.rs +++ b/examples/linux-shared.rs @@ -4,7 +4,7 @@ use pac194x::{AddrSelect, PAC194X}; use std::cell::RefCell; use std::{thread, time::Duration}; -const SENSE_RESISTOR: f32 = 0.5; +const SENSE_RESISTORS: [f32; 8] = [0.005, 0.010, 0.010, 0.010, 0.002, 0.010, 0.010, 0.010]; fn main() { let i2c = RefCell::new(I2cdev::new("/dev/i2c-3").unwrap()); @@ -24,7 +24,7 @@ fn main() { "CH{} {:5.2}V, {:5.2}A, ", channel, bus_voltage, - sense_voltage / SENSE_RESISTOR + sense_voltage / SENSE_RESISTORS[(channel - 1) as usize] ); } println!(); @@ -36,7 +36,7 @@ fn main() { "CH{} {:5.2}V, {:5.2}A, ", channel, bus_voltage, - sense_voltage / SENSE_RESISTOR + sense_voltage / SENSE_RESISTORS[(channel - 1 + 4) as usize] ); } println!(); diff --git a/examples/linux.rs b/examples/linux.rs index f6152db..ce26b30 100644 --- a/examples/linux.rs +++ b/examples/linux.rs @@ -2,7 +2,7 @@ use linux_embedded_hal::I2cdev; use pac194x::{AddrSelect, PAC194X}; use std::{thread, time::Duration}; -const SENSE_RESISTOR: f32 = 0.5; +const SENSE_RESISTORS: [f32; 4] = [0.005, 0.010, 0.010, 0.010]; fn main() { let i2c = I2cdev::new("/dev/i2c-3").unwrap(); @@ -15,7 +15,7 @@ fn main() { "CH{} {:.2}V, {:.2}A, ", channel, bus_voltage, - sense_voltage / SENSE_RESISTOR + sense_voltage / SENSE_RESISTORS[(channel - 1) as usize] ); } println!(); From 48c4fae93b01c92dc551998771ed7a795e2fddfd Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Fri, 21 Nov 2025 13:56:37 +0800 Subject: [PATCH 4/4] Run github actions on pull request Signed-off-by: Daniel Schaefer --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0865241..cf698c1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,6 +2,7 @@ name: CI Build on: push: + pull_request: env: CARGO_TERM_COLOR: always