From 42d63292a8505f21cd77bd49db958801e1aae4d5 Mon Sep 17 00:00:00 2001 From: doryan Date: Tue, 22 Apr 2025 22:53:25 +0400 Subject: [PATCH] refactor!: use for loop instead while, use PhantomData>, rename method priv_write -> write_color_channel and etc --- src/lib.rs | 70 +++++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fd08dbf..790cc58 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,9 @@ #![no_std] #![feature(asm_experimental_arch)] +use core::{arch::asm, marker::PhantomData}; +use arduino_hal::port::{mode::Output, Pin, PinOps}; use avr_device::interrupt::free; use smart_leds::{SmartLedsWrite, RGB8}; @@ -11,7 +13,7 @@ const MSB: u8 = 0x80; #[repr(transparent)] pub struct Neopixel

{ - _pin: Pin, + _pin: PhantomData>, } impl

Neopixel

@@ -19,9 +21,38 @@ where P: PinOps + StaticPinOps, { #[inline] - pub const fn new(_pin: Pin) -> Self { - Self { _pin } + pub fn new(_pin: Pin) -> Self { + Self { + _pin: PhantomData {}, + } + } + + fn write_color_channel(&self, data: u8) { + let (mut data, port_data) = (data, P::read()); + unsafe { + for _ in 0..8 { + P::write(port_data | P::PIN_POS); + asm!("rjmp +0"); if data & MSB == 0 { + P::write(port_data & !P::PIN_POS); + } + asm!( + " + rjmp +0 + rjmp +0 + " + ); + P::write(port_data & !P::PIN_POS); + asm!( + " + rjmp +0 + rjmp +0 + rjmp +0 + " + ); + data <<= 1; + } + } } } @@ -40,7 +71,7 @@ where for i in iterator { let RGB8 { r, g, b } = i.into(); for value in [g, r, b] { - self.priv_write(value); + self.write_color_channel(value); } } }); @@ -48,34 +79,3 @@ where } } -impl

Neopixel

-where -{ - fn priv_write(&self, data: u8) { - let (mut count, mut data, port_data, pin_data) = (8, data, P::read(), 1 << P::PIN_NUM); - unsafe { - while count > 0 { - P::write(port_data | pin_data); - asm!("rjmp +0"); - P::write(port_data & !pin_data); - } - asm!( - " - rjmp +0 - rjmp +0 - " - ); - P::write(port_data & !pin_data); - asm!( - " - rjmp +0 - rjmp +0 - rjmp +0 - " - ); - data <<= 1; - count -= 1; - } - } - } -}