⑧無限loop、ログ出力、LED PinのON/OFF、delay処理

このコード部分の話

loop {
    info!("green");
    green_led.set_high().unwrap();
    timer.delay_ms(2000);
    green_led.set_low().unwrap();

    info!("orange");
    for _ in 1..4 {
        orange_led.set_high().unwrap();
        timer.delay_ms(500);
        orange_led.set_low().unwrap();
        timer.delay_ms(500);
    }
    orange_led.set_low().unwrap();

    info!("red");
    red_led.set_high().unwrap();
    timer.delay_ms(2000);
    red_led.set_low().unwrap();
}

Loop

loopは、文字通り無限に繰り返されるという意味です。 今回のコードでは、breakがないのでloop{}の中の処理が無限に繰り返されます。

LEDのHigh、Low

green_led.set_high().unwrap();
...
green_led.set_low().unwrap();

.set_high()で、GPIOをHighにします。

unwrap()

.set_high()の後ろに.unwrap()がついていますが、これりは意味があります。

set_high()は、返り値にResultを持つため次のようにエラー処理を書く必要があります。

match green_led.set_high(){
    Ok(_) => {},
    Err(e) => {
        // Error
    },
};

重要な箇所においては、このエラー処理は適切に記述するべきだと思います。 しかし、カジュアルにコーディングを楽しみたい、それほど重要でない場所にはunwrap()という文法を用いることで、Okの時はその中身を取り出してくれます。(これがunwrapの意味です)

一方で、Errの時はpanicになるので使い方には注意が必要です。

タイマーのDelay

timer.delay_ms(500);

500msで待つ処理です。文字通りです。

for文

for _ in 1..4 {
    ...
}

forは、決まった回数繰り返すという文法です。 このforは、1..4つまり1,2,3(4より小さいという意味です)の値を_に入れて繰り返し処理をするというものです。

また_は、その値を使わずに_に入れておくという意味になりますので、今回は3回処理を繰り返すというforになります。