summaryrefslogtreecommitdiffstats
path: root/ble/src/i2c.rs
blob: 13f5a5aaa7e0e9db8c0295673cea35586b2ebc89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use log::{error, info, trace};
use nrf52840_hal::twis::{self, Twis, TwisInterrupt};

pub fn setup<T>(mut twis: Twis<T>) -> impl FnMut()
where
    T: twis::Instance,
{
    // TODO: we only care about `Write` and `Stopped`.
    twis.enable_interrupt(TwisInterrupt::Stopped);
    twis.enable_interrupt(TwisInterrupt::Error);
    twis.enable_interrupt(TwisInterrupt::RxStarted);
    twis.enable_interrupt(TwisInterrupt::TxStarted);
    twis.enable_interrupt(TwisInterrupt::Write);
    twis.enable_interrupt(TwisInterrupt::Read);

    let mut buf: [u8; 255] = [0; 255];
    move || handler(&mut twis, &mut buf)
}

fn handler<T>(twis: &mut Twis<T>, buf: &mut [u8])
where
    T: twis::Instance,
{
    if twis.get_event_triggered(TwisInterrupt::Stopped, true) {
        trace!("i²c stopped: {}", twis.amount());
    } else if twis.get_event_triggered(TwisInterrupt::Error, true) {
        trace!("i²c error");
    } else if twis.get_event_triggered(TwisInterrupt::RxStarted, true) {
        trace!("i²c rxstarted");
    } else if twis.get_event_triggered(TwisInterrupt::TxStarted, true) {
        trace!("i²c txstarted");
    } else if twis.get_event_triggered(TwisInterrupt::Write, true) {
        trace!("i²c write");
        match twis.read(buf) {
            Ok(len) => info!("buf {}: {:?}", len, &buf[..len]),
            Err(e) => error!("{:?}", e),
        }
    } else if twis.get_event_triggered(TwisInterrupt::Read, true) {
        trace!("i²c read");
    } else {
        trace!("i²c unknown");
    }
}