From 8d3a68c5ae5ae89f222575cb85c10473c4e87d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Mon, 2 Dec 2024 15:00:10 -0300 Subject: [PATCH 01/13] wip 0.5.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- Cargo.toml | 2 +- examples/cpp/simple.cpp | 5 +- src/lib.rs | 180 +++++++++------------------------------- 3 files changed, 44 insertions(+), 143 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d594cd65d..2bd47b8c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ crate-type = ["cdylib"] cpy-binder = "1.0" libc = "0.2" pyo3 = { version = "0.18", features = ["extension-module", "abi3-py39"], optional = true } -navigator-rs = { version = "0.4.0" } +navigator-rs = { version = "0.5.0" } rand = "0.8" lazy_static = "1.4.0" diff --git a/examples/cpp/simple.cpp b/examples/cpp/simple.cpp index c70a5c288..760ca80b5 100644 --- a/examples/cpp/simple.cpp +++ b/examples/cpp/simple.cpp @@ -34,9 +34,10 @@ int main() { printf("Leak sensor: %s\n", read_leak() ? "true" : "false"); - ADCData adc = read_adc_all(); + float adc[4]; + read_adc_all(adc, 4); printf("Reading ADC Channels: 1 = %f, 2 = %f, 3 = %f, 4 = %f\n", - adc.channel[0], adc.channel[1], adc.channel[2], adc.channel[3]); + adc[0], adc[1], adc[2], adc[3]); printf("Data ADC Channels: 1 = %f\n", read_adc(AdcChannel::Ch1)); diff --git a/src/lib.rs b/src/lib.rs index cf31f71c6..65e1d619c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,7 +45,7 @@ impl NavigatorManager { *NAVIGATOR.lock().unwrap() = Some(NavigatorManager { navigator: navigator_rs::Navigator::create() .with_rgb_led_strip_size(with_navigator_builder!().rgb_led_strip_size) - .build(), + .build_navigator_v1_pi4(), }); } &NAVIGATOR @@ -79,27 +79,6 @@ macro_rules! impl_from_enum { // Help with conversion from navigator enum API to our stable API impl_from_enum!(AdcChannel, navigator_rs::AdcChannel, Ch0, Ch1, Ch2, Ch3); -impl_from_enum!( - PwmChannel, - navigator_rs::PwmChannel, - Ch1, - Ch2, - Ch3, - Ch4, - Ch5, - Ch6, - Ch7, - Ch8, - Ch9, - Ch10, - Ch11, - Ch12, - Ch13, - Ch14, - Ch15, - Ch16, - All -); impl_from_enum!(UserLed, navigator_rs::UserLed, Led1, Led2, Led3); impl From for AxisData { @@ -112,19 +91,6 @@ impl From for AxisData { } } -impl From for ADCData { - fn from(read_adc: navigator_rs::ADCData) -> Self { - Self { - channel: [ - read_adc.channel[0], - read_adc.channel[1], - read_adc.channel[2], - read_adc.channel[3], - ], - } - } -} - #[cpy_enum] #[comment = "Available ADC channels to read from."] enum AdcChannel { @@ -142,28 +108,6 @@ enum UserLed { Led3, } -#[cpy_enum] -#[comment = "Controllable PWM output channels."] -enum PwmChannel { - Ch1, - Ch2, - Ch3, - Ch4, - Ch5, - Ch6, - Ch7, - Ch8, - Ch9, - Ch10, - Ch11, - Ch12, - Ch13, - Ch14, - Ch15, - Ch16, - All, -} - #[cpy_struct] #[comment = "Board-oriented direction axes (x is forwards, y is right, z is down)."] struct AxisData { @@ -172,12 +116,6 @@ struct AxisData { z: f32, } -#[cpy_struct] -#[comment = "An array of readings from the different ADC channels."] -struct ADCData { - channel: [f32; 4], -} - #[cpy_fn] #[comment_c = "Initializes the Navigator module with default settings."] #[comment_py = "Initializes the Navigator module with default settings.\n @@ -185,7 +123,7 @@ struct ADCData { >>> import bluerobotics_navigator as navigator\n >>> navigator.init()"] fn init() { - with_navigator!().init(); + // Keep to avoid API break } #[cpy_fn] @@ -197,7 +135,8 @@ fn init() { >>> import bluerobotics_navigator as navigator\n >>> sensors_ok = navigator.self_test()"] fn self_test() -> bool { - with_navigator!().self_test() + // Keep to avoid API break + true } #[cpy_fn] @@ -242,18 +181,6 @@ fn set_led_toggle(select: UserLed) { with_navigator!().set_led_toggle(select.into()) } -#[cpy_fn] -#[comment_c = "Sets all user LEDs to the desired state ( Blue, Green, and Red )."] -#[comment_py = "Sets all user LEDs to the desired state ( Blue, Green, and Red ).\n - Args:\n - state (bool): The desired output state. `True` -> ON, `False` -> OFF.\n - Examples:\n - >>> import bluerobotics_navigator as navigator\n - >>> navigator.set_led_all(True)"] -fn set_led_all(state: bool) { - with_navigator!().set_led_all(state) -} - #[cpy_fn_c] #[comment = "Set the color brightnesses of a connected NeoPixel LED array."] fn set_neopixel_c(rgb_array: *const [u8; 3], length: usize) { @@ -298,8 +225,7 @@ fn set_neopixel_rgbw_py(rgb_array: Vec<[u8; 4]>) { with_navigator!().set_neopixel_rgbw(&rgb_array) } -#[cpy_fn] -#[comment_c = "Reads the ADC channel values (from the ADS1115 chip)."] +#[cpy_fn_py] #[comment_py = "Reads the ADC channel values (from the ADS1115 chip).\n Same as :py:func:`read_adc`, but it returns an array with all channel readings.\n Returns:\n @@ -307,8 +233,22 @@ fn set_neopixel_rgbw_py(rgb_array: Vec<[u8; 4]>) { Examples:\n >>> import bluerobotics_navigator as navigator\n >>> adc_measurements = navigator.read_adc_all().channel"] -fn read_adc_all() -> ADCData { - with_navigator!().read_adc_all().into() +fn read_adc_all_py() -> Vec { + with_navigator!().read_adc_all() +} + +#[cpy_fn_c] +#[comment_c = "Reads the ADC channel values (from the ADS1115 chip)."] +fn read_adc_all_c(mut adc_array: *mut f32, length: usize) { + let mut array = unsafe { + assert!(!adc_array.is_null()); + std::slice::from_raw_parts_mut::(adc_array, length) + }; + + let values = with_navigator!().read_adc_all(); + for i in 0..length { + array[i] = values[i]; + } } #[cpy_fn] @@ -414,46 +354,6 @@ fn set_pwm_enable(state: bool) { with_navigator!().set_pwm_enable(state) } -#[cpy_fn] -#[comment_c = "Get the PWM chip (PCA9685)'s OE_pin state"] -#[comment_py = "Get the PWM chip (PCA9685)'s OE_pin state.\n - Returns:\n - bool: `True` -> ON, `False` -> OFF.\n - Examples:\n - Please check :py:func:`set_pwm_channel_value`\n - >>> navigator.get_pwm_enable()"] -fn get_pwm_enable() -> bool { - with_navigator!().get_pwm_enable() -} - -#[cpy_fn] -#[comment_c = "LOW_LEVEL: Sets the PWM frequency of the PCA9685 chip. All channels use the same frequency."] -#[comment_py = "LOW_LEVEL: Sets the PWM frequency of the PCA9685 chip. All channels use the same frequency.\n\n - This directly sets the PRE_SCALE value on the PCA9685 - it is generally easier to use - :py:func:`set_pwm_freq_hz` instead.\n - The desired prescaler value can be calculated for an update rate using the formula:\n - `prescale_value = round(clock_freq / (4096 * desired_freq)) - 1`,\n - where `clock_freq` is 24_576_000 to match the Navigator's 24.5760 MHz clock.\n - Notes:\n - Changing the pre-scaler affects the channel outputs, so they need to be re-configured afterwards - (e.g. using :py:func:`set_pwm_channel_value`).\n - The minimum prescaler value is 3, which corresponds to 1526 Hz.\n - The maximum prescaler value is 255, which corresponds to 24 Hz.\n - Servo motors generally work best with PWM frequencies between 50-200 Hz, - which corresponds to prescalar values of 119-29.\n - Internally, this function stops the oscillator and restarts it (if it was already running) - after setting the prescalar value.\n - Args:\n - value (uint8): The desired prescaler value (3..255).\n - Examples:\n - >>> import bluerobotics_navigator as navigator\n - >>> navigator.set_pwm_freq_prescale(119)\n - >>> navigator.set_pwm_channel_value(PwmChannel.Ch1, 2000)\n - >>> navigator.set_pwm_enable(True)"] -fn set_pwm_freq_prescale(value: u8) { - with_navigator!().set_pwm_freq_prescale(value) -} - #[cpy_fn] #[comment_c = "Sets the PWM frequency of the PCA9685 chip. All channels use the same frequency."] #[comment_py = "Sets the PWM frequency of the PCA9685 chip. All channels use the same frequency.\n @@ -468,10 +368,10 @@ fn set_pwm_freq_prescale(value: u8) { Examples:\n >>> import bluerobotics_navigator as navigator\n >>> navigator.set_pwm_freq_hz(60)\n - >>> navigator.set_pwm_channel_value(PwmChannel.Ch1, 2000)\n + >>> navigator.set_pwm_channel_value(1, 2000)\n >>> navigator.set_pwm_enable(True)"] fn set_pwm_freq_hz(freq: f32) { - with_navigator!().set_pwm_freq_hz(freq) + with_navigator!().set_pwm_frequency(freq) } #[cpy_fn] @@ -498,8 +398,8 @@ fn set_pwm_freq_hz(freq: f32) { >>> navigator.set_pwm_freq_hz(1000)\n >>> navigator.set_pwm_channel_value(PwmChannel.Ch1, 2000)\n >>> navigator.set_pwm_enable(True)"] -fn set_pwm_channel_value(channel: PwmChannel, value: u16) { - with_navigator!().set_pwm_channel_value(channel.into(), value) +fn set_pwm_channel_value(channel: usize, value: f32) { + with_navigator!().set_pwm_duty_cycle(channel, value) } #[cpy_fn] @@ -520,31 +420,31 @@ fn set_pwm_channel_value(channel: PwmChannel, value: u16) { >>> navigator.set_pwm_freq_hz(1000)\n >>> navigator.set_pwm_channel_duty_cycle(PwmChannel.Ch1, 0.5)\n >>> navigator.set_pwm_enable(True)"] -fn set_pwm_channel_duty_cycle(channel: PwmChannel, duty_cycle: f32) { - with_navigator!().set_pwm_channel_duty_cycle(channel.into(), duty_cycle) +fn set_pwm_channel_duty_cycle(channel: usize, duty_cycle: f32) { + with_navigator!().set_pwm_duty_cycle(channel, duty_cycle) } #[cpy_fn_c] -#[comment = "Sets the duty cycle (based on OFF counter from 0 to 4096) for a list of multiple PWM channels."] -fn set_pwm_channels_value_c(channels: *const PwmChannel, value: u16, length: usize) { +#[comment = "Sets the duty cycle (based on OFF counter from 0 to 1) for a list of multiple PWM channels."] +fn set_pwm_channels_value_c(channels: *const usize, value: f32, length: usize) { let array_channels = unsafe { assert!(!channels.is_null()); std::slice::from_raw_parts(channels, length) }; for channel in array_channels.iter().take(length) { - with_navigator!().set_pwm_channel_value(channel.clone().into(), value); + with_navigator!().set_pwm_duty_cycle(channel.clone(), value); } } #[cpy_fn_c] #[comment = "Sets the duty cycle (from 0.0 to 1.0) for a list of multiple PWM channels."] -fn set_pwm_channels_duty_cycle_c(channels: *const PwmChannel, duty_cycle: f32, length: usize) { +fn set_pwm_channels_duty_cycle_c(channels: *const usize, duty_cycle: f32, length: usize) { let array_channels = unsafe { assert!(!channels.is_null()); std::slice::from_raw_parts(channels, length) }; for channel in array_channels.iter().take(length) { - with_navigator!().set_pwm_channel_duty_cycle(channel.clone().into(), duty_cycle); + with_navigator!().set_pwm_duty_cycle(channel.clone().into(), duty_cycle); } } @@ -572,13 +472,13 @@ fn set_pwm_channels_value_py(channels: Vec, value: u16) { >>> navigator.set_pwm_channels_value([PwmChannel.Ch1, PwmChannel.Ch16], 0.5)"] fn set_pwm_channels_duty_cycle_py(channels: Vec, duty_cycle: f32) { for channel in channels { - with_navigator!().set_pwm_channel_duty_cycle(channel.into(), duty_cycle); + with_navigator!().set_pwm_duty_cycle(channel.into(), duty_cycle); } } #[cpy_fn_c] #[comment = "Sets the duty cycle (from 0 to 4096) for a list of multiple channels with multiple values."] -fn set_pwm_channels_values_c(channels: *const PwmChannel, values: *const u16, length: usize) { +fn set_pwm_channels_values_c(channels: *const usize, values: *const f32, length: usize) { let array_channels = unsafe { assert!(!channels.is_null()); std::slice::from_raw_parts(channels, length) @@ -588,14 +488,14 @@ fn set_pwm_channels_values_c(channels: *const PwmChannel, values: *const u16, le std::slice::from_raw_parts(values, length) }; for i in 0..length { - with_navigator!().set_pwm_channel_value(array_channels[i].clone().into(), array_values[i]); + with_navigator!().set_pwm_duty_cycle(array_channels[i].clone(), array_values[i]); } } #[cpy_fn_c] #[comment = "Sets the duty cycle (from 0.0 to 1.0) for a list of multiple channels with multiple values."] fn set_pwm_channels_duty_cycle_values_c( - channels: *const PwmChannel, + channels: *const usize, duty_cycle: *const f32, length: usize, ) { @@ -609,7 +509,7 @@ fn set_pwm_channels_duty_cycle_values_c( }; for i in 0..length { with_navigator!() - .set_pwm_channel_duty_cycle(array_channels[i].clone().into(), array_values[i]); + .set_pwm_duty_cycle(array_channels[i].clone().into(), array_values[i]); } } @@ -629,7 +529,7 @@ fn set_pwm_channels_values_py(channels: Vec, values: Vec) { } for i in 0..channels.len() { - with_navigator!().set_pwm_channel_value(channels[i].clone().into(), values[i]); + with_navigator!().set_pwm_duty_cycle(channels[i].clone().into(), values[i]); } } @@ -650,12 +550,12 @@ fn set_pwm_channels_duty_cycle_values_py(channels: Vec, duty_cycle_v for i in 0..channels.len() { with_navigator!() - .set_pwm_channel_duty_cycle(channels[i].clone().into(), duty_cycle_values[i]); + .set_pwm_duty_cycle(channels[i].clone().into(), duty_cycle_values[i]); } } cpy_module!( name = bluerobotics_navigator, - types = [AdcChannel, UserLed, PwmChannel, AxisData, ADCData], + types = [AdcChannel, UserLed, PwmChannel, AxisData], functions = [ init, self_test, From dcf5dbe8a14f3e2e371ca51fc7a2c1c2ada36560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Mon, 2 Dec 2024 15:03:30 -0300 Subject: [PATCH 02/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 65e1d619c..d09cfb71a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -555,7 +555,7 @@ fn set_pwm_channels_duty_cycle_values_py(channels: Vec, duty_cycle_v } cpy_module!( name = bluerobotics_navigator, - types = [AdcChannel, UserLed, PwmChannel, AxisData], + types = [AdcChannel, UserLed, AxisData], functions = [ init, self_test, From b3158d741130f0d68b6178a9f44e3d7635bf5ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 11 Dec 2024 06:15:55 -0300 Subject: [PATCH 03/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/lib.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index d09cfb71a..ff58f3404 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -508,8 +508,7 @@ fn set_pwm_channels_duty_cycle_values_c( std::slice::from_raw_parts(duty_cycle, length) }; for i in 0..length { - with_navigator!() - .set_pwm_duty_cycle(array_channels[i].clone().into(), array_values[i]); + with_navigator!().set_pwm_duty_cycle(array_channels[i].clone().into(), array_values[i]); } } @@ -549,8 +548,7 @@ fn set_pwm_channels_duty_cycle_values_py(channels: Vec, duty_cycle_v } for i in 0..channels.len() { - with_navigator!() - .set_pwm_duty_cycle(channels[i].clone().into(), duty_cycle_values[i]); + with_navigator!().set_pwm_duty_cycle(channels[i].clone().into(), duty_cycle_values[i]); } } cpy_module!( From 24aac7424e93b96dcf785057b6732f5bd4eeba12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 11 Dec 2024 06:33:30 -0300 Subject: [PATCH 04/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/lib.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index ff58f3404..15bf69ded 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -181,6 +181,20 @@ fn set_led_toggle(select: UserLed) { with_navigator!().set_led_toggle(select.into()) } +#[cpy_fn] +#[comment_c = "Sets all user LEDs to the desired state ( Blue, Green, and Red )."] +#[comment_py = "Sets all user LEDs to the desired state ( Blue, Green, and Red ).\n + Args:\n + state (bool): The desired output state. `True` -> ON, `False` -> OFF.\n + Examples:\n + >>> import bluerobotics_navigator as navigator\n + >>> navigator.set_led_all(True)"] +fn set_led_all(state: bool) { + for led in [UserLed::Led1, UserLed::Led2, UserLed::Led3] { + with_navigator!().set_led(led.into(), state); + } +} + #[cpy_fn_c] #[comment = "Set the color brightnesses of a connected NeoPixel LED array."] fn set_neopixel_c(rgb_array: *const [u8; 3], length: usize) { From c6bba0674ca373bbbdc0c0f9bbbe720352b0bedd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 11 Dec 2024 06:34:25 -0300 Subject: [PATCH 05/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 15bf69ded..c3001f64f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -253,8 +253,8 @@ fn read_adc_all_py() -> Vec { #[cpy_fn_c] #[comment_c = "Reads the ADC channel values (from the ADS1115 chip)."] -fn read_adc_all_c(mut adc_array: *mut f32, length: usize) { - let mut array = unsafe { +fn read_adc_all_c(adc_array: *mut f32, length: usize) { + let array = unsafe { assert!(!adc_array.is_null()); std::slice::from_raw_parts_mut::(adc_array, length) }; From cfac752abcc9de56ef7a7bbcb111e371871145fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 11 Dec 2024 06:37:24 -0300 Subject: [PATCH 06/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 2bd47b8c9..6f911f274 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,8 @@ crate-type = ["cdylib"] cpy-binder = "1.0" libc = "0.2" pyo3 = { version = "0.18", features = ["extension-module", "abi3-py39"], optional = true } -navigator-rs = { version = "0.5.0" } +# navigator-rs = { version = "0.5.0" } +navigator-rs = { git = "https://github.com/patrickelectric/navigator-rs.git", branch = "pi5" } rand = "0.8" lazy_static = "1.4.0" From 1aa1e8c16face68b32e552d373537e3a8227f374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 11 Dec 2024 06:49:19 -0300 Subject: [PATCH 07/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/lib.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c3001f64f..a5d33211c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -260,9 +260,7 @@ fn read_adc_all_c(adc_array: *mut f32, length: usize) { }; let values = with_navigator!().read_adc_all(); - for i in 0..length { - array[i] = values[i]; - } + array[..length].copy_from_slice(&values[..length]); } #[cpy_fn] @@ -413,7 +411,7 @@ fn set_pwm_freq_hz(freq: f32) { >>> navigator.set_pwm_channel_value(PwmChannel.Ch1, 2000)\n >>> navigator.set_pwm_enable(True)"] fn set_pwm_channel_value(channel: usize, value: f32) { - with_navigator!().set_pwm_duty_cycle(channel, value) + with_navigator!().set_pwm_duty_cycle(channel, value / 4096) } #[cpy_fn] @@ -458,7 +456,7 @@ fn set_pwm_channels_duty_cycle_c(channels: *const usize, duty_cycle: f32, length std::slice::from_raw_parts(channels, length) }; for channel in array_channels.iter().take(length) { - with_navigator!().set_pwm_duty_cycle(channel.clone().into(), duty_cycle); + with_navigator!().set_pwm_duty_cycle(channel.clone(), duty_cycle); } } @@ -472,7 +470,7 @@ fn set_pwm_channels_duty_cycle_c(channels: *const usize, duty_cycle: f32, length >>> navigator.set_pwm_channels_value([PwmChannel.Ch1, PwmChannel.Ch16], 1000)"] fn set_pwm_channels_value_py(channels: Vec, value: u16) { for i in 0..channels.len() { - with_navigator!().set_pwm_channel_value(channels[i].clone().into(), value); + with_navigator!().set_pwm_channel_value(channels[i].clone(), value); } } @@ -502,7 +500,7 @@ fn set_pwm_channels_values_c(channels: *const usize, values: *const f32, length: std::slice::from_raw_parts(values, length) }; for i in 0..length { - with_navigator!().set_pwm_duty_cycle(array_channels[i].clone(), array_values[i]); + with_navigator!().set_pwm_duty_cycle(array_channels[i].into(), array_values[i]); } } @@ -522,7 +520,7 @@ fn set_pwm_channels_duty_cycle_values_c( std::slice::from_raw_parts(duty_cycle, length) }; for i in 0..length { - with_navigator!().set_pwm_duty_cycle(array_channels[i].clone().into(), array_values[i]); + with_navigator!().set_pwm_duty_cycle(array_channels[i].into(), array_values[i]); } } From eb8691c3a58cbc05382131a40ed26809667855f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 11 Dec 2024 06:53:05 -0300 Subject: [PATCH 08/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index a5d33211c..f6818402a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -411,7 +411,7 @@ fn set_pwm_freq_hz(freq: f32) { >>> navigator.set_pwm_channel_value(PwmChannel.Ch1, 2000)\n >>> navigator.set_pwm_enable(True)"] fn set_pwm_channel_value(channel: usize, value: f32) { - with_navigator!().set_pwm_duty_cycle(channel, value / 4096) + with_navigator!().set_pwm_duty_cycle(channel, value / 4096.0) } #[cpy_fn] From 8d76d906f03d3d76dae68c8a7f9cf43a68d13231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 11 Dec 2024 06:55:46 -0300 Subject: [PATCH 09/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index f6818402a..15704bb99 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -444,7 +444,7 @@ fn set_pwm_channels_value_c(channels: *const usize, value: f32, length: usize) { std::slice::from_raw_parts(channels, length) }; for channel in array_channels.iter().take(length) { - with_navigator!().set_pwm_duty_cycle(channel.clone(), value); + with_navigator!().set_pwm_duty_cycle(*channel, value); } } @@ -456,7 +456,7 @@ fn set_pwm_channels_duty_cycle_c(channels: *const usize, duty_cycle: f32, length std::slice::from_raw_parts(channels, length) }; for channel in array_channels.iter().take(length) { - with_navigator!().set_pwm_duty_cycle(channel.clone(), duty_cycle); + with_navigator!().set_pwm_duty_cycle(*channel, duty_cycle); } } @@ -470,7 +470,7 @@ fn set_pwm_channels_duty_cycle_c(channels: *const usize, duty_cycle: f32, length >>> navigator.set_pwm_channels_value([PwmChannel.Ch1, PwmChannel.Ch16], 1000)"] fn set_pwm_channels_value_py(channels: Vec, value: u16) { for i in 0..channels.len() { - with_navigator!().set_pwm_channel_value(channels[i].clone(), value); + with_navigator!().set_pwm_channel_value(channels[i], value); } } From 4ee916396e011c273d08220aa2a1ef90ca1b0047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 11 Dec 2024 06:57:27 -0300 Subject: [PATCH 10/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 15704bb99..7073c3ab5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -500,7 +500,7 @@ fn set_pwm_channels_values_c(channels: *const usize, values: *const f32, length: std::slice::from_raw_parts(values, length) }; for i in 0..length { - with_navigator!().set_pwm_duty_cycle(array_channels[i].into(), array_values[i]); + with_navigator!().set_pwm_duty_cycle(array_channels[i], array_values[i]); } } @@ -520,7 +520,7 @@ fn set_pwm_channels_duty_cycle_values_c( std::slice::from_raw_parts(duty_cycle, length) }; for i in 0..length { - with_navigator!().set_pwm_duty_cycle(array_channels[i].into(), array_values[i]); + with_navigator!().set_pwm_duty_cycle(array_channels[i], array_values[i]); } } From 509a96aba141d251da65d4110440e9e28efe00a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 11 Dec 2024 07:47:25 -0300 Subject: [PATCH 11/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/lib.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 7073c3ab5..ecc8c9887 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -468,9 +468,9 @@ fn set_pwm_channels_duty_cycle_c(channels: *const usize, duty_cycle: f32, length Examples:\n You can use this method like :py:func:`set_pwm_channel_value`.\n >>> navigator.set_pwm_channels_value([PwmChannel.Ch1, PwmChannel.Ch16], 1000)"] -fn set_pwm_channels_value_py(channels: Vec, value: u16) { +fn set_pwm_channels_value_py(channels: Vec, value: u16) { for i in 0..channels.len() { - with_navigator!().set_pwm_channel_value(channels[i], value); + with_navigator!().set_pwm_duty_cycle(channels[i], value as f32 / 4096.0); } } @@ -482,7 +482,7 @@ fn set_pwm_channels_value_py(channels: Vec, value: u16) { Examples:\n You can use this method like :py:func:`set_pwm_channel_duty_cycle`.\n >>> navigator.set_pwm_channels_value([PwmChannel.Ch1, PwmChannel.Ch16], 0.5)"] -fn set_pwm_channels_duty_cycle_py(channels: Vec, duty_cycle: f32) { +fn set_pwm_channels_duty_cycle_py(channels: Vec, duty_cycle: f32) { for channel in channels { with_navigator!().set_pwm_duty_cycle(channel.into(), duty_cycle); } @@ -500,7 +500,7 @@ fn set_pwm_channels_values_c(channels: *const usize, values: *const f32, length: std::slice::from_raw_parts(values, length) }; for i in 0..length { - with_navigator!().set_pwm_duty_cycle(array_channels[i], array_values[i]); + with_navigator!().set_pwm_duty_cycle(array_channels[i], array_values[i] as f32 / 4096.0); } } @@ -533,14 +533,14 @@ fn set_pwm_channels_duty_cycle_values_c( Examples:\n You can use this method like :py:func:`set_pwm_channel_value`.\n >>> navigator.set_pwm_channels_values([PwmChannel.Ch1, PwmChannel.Ch5], [1000, 500])"] -fn set_pwm_channels_values_py(channels: Vec, values: Vec) { +fn set_pwm_channels_values_py(channels: Vec, values: Vec) { if channels.len() != values.len() { println!("The number of values is different from the number of PWM channels."); return; } for i in 0..channels.len() { - with_navigator!().set_pwm_duty_cycle(channels[i].clone().into(), values[i]); + with_navigator!().set_pwm_duty_cycle(channels[i].clone().into(), values[i] as f32 / 4096.0); } } @@ -553,7 +553,7 @@ fn set_pwm_channels_values_py(channels: Vec, values: Vec) { Examples:\n You can use this method like :py:func:`set_pwm_channel_duty_cycle`.\n >>> navigator.set_pwm_channels_duty_cycle_values([PwmChannel.Ch1, PwmChannel.Ch5], [0.25, 0.75])"] -fn set_pwm_channels_duty_cycle_values_py(channels: Vec, duty_cycle_values: Vec) { +fn set_pwm_channels_duty_cycle_values_py(channels: Vec, duty_cycle_values: Vec) { if channels.len() != duty_cycle_values.len() { println!("The number of values is different from the number of PWM channels."); return; @@ -584,8 +584,6 @@ cpy_module!( read_accel, read_gyro, set_pwm_enable, - get_pwm_enable, - set_pwm_freq_prescale, set_pwm_freq_hz, set_pwm_channel_value, set_pwm_channel_duty_cycle, From 18a7ce0ef7e3c76cffb3716d21eccbacadeb7bff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 11 Dec 2024 07:49:36 -0300 Subject: [PATCH 12/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index ecc8c9887..75d0d56ad 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -500,7 +500,7 @@ fn set_pwm_channels_values_c(channels: *const usize, values: *const f32, length: std::slice::from_raw_parts(values, length) }; for i in 0..length { - with_navigator!().set_pwm_duty_cycle(array_channels[i], array_values[i] as f32 / 4096.0); + with_navigator!().set_pwm_duty_cycle(array_channels[i], array_values[i] / 4096.0); } } From b8cfce2922744c9fecdf406b57c9d74a1d4118af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 11 Dec 2024 07:52:39 -0300 Subject: [PATCH 13/13] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- examples/python/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/python/main.py b/examples/python/main.py index 4f30f2469..97b308275 100755 --- a/examples/python/main.py +++ b/examples/python/main.py @@ -2,7 +2,7 @@ import os import bluerobotics_navigator as navigator -from bluerobotics_navigator import AdcChannel, PwmChannel, UserLed +from bluerobotics_navigator import AdcChannel, UserLed def navigator_check():