Задать вопрос
eegmak
@eegmak

Как стильно переписать подобный код?

код
let mut x = 24; // mut x: i32

while x>0 {
    x = x - 1;

        block!(timer.wait()).unwrap();
        led.set_high().unwrap();
        led.set_low().unwrap();
        led.set_low().unwrap();
        //led.set_low().unwrap();
        block!(timer.wait()).unwrap();

    
}
x=24;
while x>0 {
    x = x - 1;
        block!(timer.wait()).unwrap();
        led.set_high().unwrap();
        block!(timer.wait()).unwrap();
        led.set_low().unwrap();
    
}
x=24;
while x>0 {
    x = x - 1;

        block!(timer.wait()).unwrap();
        led.set_high().unwrap();
        led.set_low().unwrap();
        led.set_low().unwrap();
        //led.set_low().unwrap();
        block!(timer.wait()).unwrap();

    
}
x=24;
while x>0 {
    x = x - 1;
        block!(timer.wait()).unwrap();
        led.set_high().unwrap();
        block!(timer.wait()).unwrap();
        led.set_low().unwrap();
    
}

пояснение:
block!(timer.wait()).unwrap();
        led.set_high().unwrap();
        led.set_low().unwrap();
        led.set_low().unwrap();
        //led.set_low().unwrap();
        block!(timer.wait()).unwrap();
это единица
block!(timer.wait()).unwrap();
        led.set_high().unwrap();
        block!(timer.wait()).unwrap();
        led.set_low().unwrap();
это ноль
Мне необходимо отправлять по 24 бита (единицы или нуля) 64 раза (это матрица из 64 rgb светодиодов) как стильно это сделать на rust?
  • Вопрос задан
  • 103 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
bingo347
@bingo347
Crazy on performance...
Я бы как то так сделал:
macro_rules! low_high_wait {
    (low) => {
        led.set_low().unwrap();
    };
    (high) => {
        led.set_high().unwrap();
    };
    (wait) => {
        block!(timer.wait()).unwrap();
    };
    (low, $($rest:tt),+) => {
        low_high_wait!(low);
        low_high_wait!($($rest),+);
    };
    (high, $($rest:tt),+) => {
        low_high_wait!(high);
        low_high_wait!($($rest),+);
    };
    (wait, $($rest:tt),+) => {
        low_high_wait!(wait);
        low_high_wait!($($rest),+);
    };
}
for _ in 0..24 {
    low_high_wait!(wait, high, low, low, wait);
}
for _ in 0..24 {
    low_high_wait!(wait, high, wait, low);
}
for _ in 0..24 {
    low_high_wait!(wait, high, low, low, wait);
}
for _ in 0..24 {
    low_high_wait!(wait, high, wait, low);
}
Ответ написан
Комментировать
vabka
@vabka Куратор тега Rust
1. Прочитайте rustbook - там много советов по идеоматическому коду
2. Заверните в функции и сделайте какую-нибудь высокоуровневую абстракцию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы