summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Cully <bjc@kublai.com>2019-08-13 14:17:49 -0400
committerBrian Cully <bjc@kublai.com>2019-08-13 15:33:41 -0400
commite158425081f1bce61051969c3059f09546c31dc7 (patch)
tree6b83a89ad0ddd99dbc1e051770f853c322871eb7
parentd23ecf5ed4632f75d239e0e3858a94234baa90cd (diff)
downloadbleusb-e158425081f1bce61051969c3059f09546c31dc7.tar.gz
bleusb-e158425081f1bce61051969c3059f09546c31dc7.zip
Put I²C data on ringbuffer for main thread consumption.
-rw-r--r--ble/src/i2c.rs45
1 files 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<T>(mut twis: Twis<T>) -> impl FnMut()
+static mut RB: RingBuffer<u8> = RingBuffer::new(0);
+
+pub fn setup<T>(mut twis: Twis<T>) -> (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<T>(twis: &mut Twis<T>, buf: &mut [u8])
+fn handler<T>(twis: &mut Twis<T>, writer: &mut Writer<u8>)
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");
}