From 49d648edf50c4c0f9a7d23f6b27952f1361c47ef Mon Sep 17 00:00:00 2001
From: zdmx <hi@zdmx.me>
Date: Mon, 14 Aug 2023 11:42:24 +0200
Subject: [PATCH] implement badge link switching

---
 src/flow3r/badgelink/mod.rs        | 42 ++++++++++++++++++++++++++++--
 src/flow3r/badgelink/switch.rs     |  1 -
 src/flow3r/mod.rs                  |  7 ++---
 src/flow3r/peripherals/charging.rs |  4 ---
 src/flow3r/peripherals/mod.rs      |  1 -
 src/runtime.rs                     |  6 +++--
 6 files changed, 48 insertions(+), 13 deletions(-)
 delete mode 100644 src/flow3r/badgelink/switch.rs
 delete mode 100644 src/flow3r/peripherals/charging.rs
 delete mode 100644 src/flow3r/peripherals/mod.rs

diff --git a/src/flow3r/badgelink/mod.rs b/src/flow3r/badgelink/mod.rs
index 8e57ae5..ed5b031 100644
--- a/src/flow3r/badgelink/mod.rs
+++ b/src/flow3r/badgelink/mod.rs
@@ -1,4 +1,42 @@
+use hal::{i2c::I2C, peripherals::I2C0};
+use port_expander::{Max7321, dev::max7321::Driver};
+use shared_bus::{I2cProxy, XtensaMutex, NullMutex};
+
 pub mod badgenet;
-mod switch;
 
-pub struct BadgeLink;
+pub struct BadgeLink {
+    port_expander: Max7321<NullMutex<Driver<I2cProxy<'static, XtensaMutex<I2C<'static, I2C0>>>>>>
+}
+
+impl BadgeLink {
+    pub fn new(i2c: I2cProxy<'static, XtensaMutex<I2C<'static, I2C0>>>) -> Self {
+        let mut port_expander = port_expander::Max7321::new(i2c, true, true, true, false);
+        Self {
+            port_expander
+        }
+    }
+
+    pub fn left_audio(&mut self) {
+        let mut pes = self.port_expander.split();
+        pes.p3.set_low();
+        pes.p4.set_low();
+    }
+
+    pub fn left_badgelink(&mut self) {
+        let mut pes = self.port_expander.split();
+        pes.p3.set_high();
+        pes.p4.set_high();
+    }
+
+    pub fn right_audio(&mut self) {
+        let mut pes = self.port_expander.split();
+        pes.p5.set_low();
+        pes.p6.set_low();
+    }
+
+    pub fn right_badgelink(&mut self) {
+        let mut pes = self.port_expander.split();
+        pes.p5.set_high();
+        pes.p6.set_high();
+    }
+}
diff --git a/src/flow3r/badgelink/switch.rs b/src/flow3r/badgelink/switch.rs
deleted file mode 100644
index 8b13789..0000000
--- a/src/flow3r/badgelink/switch.rs
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/flow3r/mod.rs b/src/flow3r/mod.rs
index 4153e16..a252d08 100644
--- a/src/flow3r/mod.rs
+++ b/src/flow3r/mod.rs
@@ -1,3 +1,4 @@
+use self::badgelink::BadgeLink;
 use self::display::Display;
 use self::leds::Leds;
 
@@ -7,16 +8,16 @@ pub mod display;
 pub mod imu;
 pub mod input;
 pub mod leds;
-pub mod peripherals;
 pub mod sdcard;
 
 pub struct Flow3r {
     pub display: Display,
     pub leds: Leds,
+    pub badgelink: BadgeLink,
 }
 
 impl Flow3r {
-    pub fn new(display: Display, leds: Leds) -> Self {
-        Self { display, leds }
+    pub fn new(display: Display, leds: Leds, badgelink: BadgeLink) -> Self {
+        Self { display, leds, badgelink }
     }
 }
diff --git a/src/flow3r/peripherals/charging.rs b/src/flow3r/peripherals/charging.rs
deleted file mode 100644
index f0aeb29..0000000
--- a/src/flow3r/peripherals/charging.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-#[embassy_executor::task]
-pub async fn charging_status_manager() -> ! {
-    loop {}
-}
diff --git a/src/flow3r/peripherals/mod.rs b/src/flow3r/peripherals/mod.rs
deleted file mode 100644
index 78fed0f..0000000
--- a/src/flow3r/peripherals/mod.rs
+++ /dev/null
@@ -1 +0,0 @@
-mod charging;
diff --git a/src/runtime.rs b/src/runtime.rs
index 3eec15f..bc802f1 100644
--- a/src/runtime.rs
+++ b/src/runtime.rs
@@ -21,7 +21,7 @@ use crate::flow3r::{
     display::{display_refresh, Display},
     input::input_controller,
     leds::init_leds,
-    Flow3r,
+    Flow3r, badgelink::BadgeLink,
 };
 use crate::main;
 
@@ -161,7 +161,9 @@ async fn init_runtime() {
 
     let rng = RNG.init(Rng::new(peripherals.RNG));
 
-    let flow3r = Flow3r::new(display, leds);
+    let badgelink = BadgeLink::new(i2c_busmanager.acquire_i2c());
+
+    let flow3r = Flow3r::new(display, leds, badgelink);
 
     let spawner = Spawner::for_current_executor().await;
     spawner
-- 
GitLab