refactor!: use for loop instead while, use PhantomData<Pin<PINMODE, P>>, rename method priv_write -> write_color_channel and etc

This commit is contained in:
doryan 2025-04-22 22:53:25 +04:00
parent 0a668af6e4
commit 42d63292a8

View File

@ -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<P> {
_pin: Pin<Output, P>,
_pin: PhantomData<Pin<Output, P>>,
}
impl<P> Neopixel<P>
@ -19,9 +21,38 @@ where
P: PinOps + StaticPinOps,
{
#[inline]
pub const fn new(_pin: Pin<Output, P>) -> Self {
Self { _pin }
pub fn new(_pin: Pin<Output, P>) -> 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<P> Neopixel<P>
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;
}
}
}
}