From e158425081f1bce61051969c3059f09546c31dc7 Mon Sep 17 00:00:00 2001 From: Brian Cully Date: Tue, 13 Aug 2019 14:17:49 -0400 Subject: =?UTF-8?q?Put=20I=C2=B2C=20data=20on=20ringbuffer=20for=20main=20?= =?UTF-8?q?thread=20consumption.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ble/src/i2c.rs | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/ble/src/i2c.rs b/ble/src/i2c.rs index 13f5a5a..0f7fe5e 100644 --- a/ble/src/i2c.rs +++ b/ble/src/i2c.rs @@ -1,23 +1,28 @@ -use log::{error, info, trace}; +use log::{error, trace}; use nrf52840_hal::twis::{self, Twis, TwisInterrupt}; +use starb::{Reader, RingBuffer, Writer}; -pub fn setup(mut twis: Twis) -> impl FnMut() +static mut RB: RingBuffer = RingBuffer::new(0); + +pub fn setup(mut twis: Twis) -> (Reader<'static, u8>, 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::RxStarted); + //twis.enable_interrupt(TwisInterrupt::TxStarted); twis.enable_interrupt(TwisInterrupt::Write); - twis.enable_interrupt(TwisInterrupt::Read); + //twis.enable_interrupt(TwisInterrupt::Read); + + let (rbr, mut rbw) = unsafe { RB.split() }; - let mut buf: [u8; 255] = [0; 255]; - move || handler(&mut twis, &mut buf) + let cl = move || handler(&mut twis, &mut rbw); + (rbr, cl) } -fn handler(twis: &mut Twis, buf: &mut [u8]) +fn handler(twis: &mut Twis, writer: &mut Writer) where T: twis::Instance, { @@ -25,18 +30,26 @@ where 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::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]), + let mut buf: [u8; 255] = [0; 255]; + match twis.read(&mut buf) { + Ok(len) => { + for b in &buf[0..len] { + // Ignore unshift errors for now, as I don't think + // there's much we can do about it. + writer.unshift(*b).ok(); + } + trace!("write done"); + } Err(e) => error!("{:?}", e), } - } else if twis.get_event_triggered(TwisInterrupt::Read, true) { - trace!("i²c read"); + //} else if twis.get_event_triggered(TwisInterrupt::Read, true) { + //trace!("i²c read"); } else { trace!("i²c unknown"); } -- cgit v1.2.3