Skip to content
Snippets Groups Projects
Commit 67854c3a authored by zdmx's avatar zdmx :crab:
Browse files

add main menu, imu demo

parent dcd5d69d
Branches
No related tags found
No related merge requests found
...@@ -53,13 +53,13 @@ where ...@@ -53,13 +53,13 @@ where
let data_idx = (i * 8) + 1; let data_idx = (i * 8) + 1;
data[data_idx..data_idx + 8].copy_from_slice(&stage.to_reg_value()); data[data_idx..data_idx + 8].copy_from_slice(&stage.to_reg_value());
} }
println!("writing to device: addr: {:016b} stage0: {:016b}, stage0: {:016b}", data[0], data[1], data[2]); //println!("writing to device: addr: {:016b} stage0: {:016b}, stage0: {:016b}", data[0], data[1], data[2]);
self.i2c.write(self.address, to_be_array(data).as_byte_slice())?; self.i2c.write(self.address, to_be_array(data).as_byte_slice())?;
let mut data = [0u16; 9]; let mut data = [0u16; 9];
data[0] = 0x000; data[0] = 0x000;
data[1..9].copy_from_slice(&configuration.0.to_reg_value_for_init()); data[1..9].copy_from_slice(&configuration.0.to_reg_value_for_init());
println!("writing to device: addr: {:016b} pwr_cfg: {:016b}, stage_cal: {:016b}, amb_comp_1: {:016b}, amb_comp_2: {:016b}, amb_comp_3: {:016b}, stage_low_int: {:016b}, stage_high_int: {:016b}, stage_complete_int: {:016b}", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8]); //println!("writing to device: addr: {:016b} pwr_cfg: {:016b}, stage_cal: {:016b}, amb_comp_1: {:016b}, amb_comp_2: {:016b}, amb_comp_3: {:016b}, stage_low_int: {:016b}, stage_high_int: {:016b}, stage_complete_int: {:016b}", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8]);
self.i2c.write(self.address, to_be_array(data).as_byte_slice())?; self.i2c.write(self.address, to_be_array(data).as_byte_slice())?;
delay.delay_ms(100); delay.delay_ms(100);
...@@ -67,7 +67,7 @@ where ...@@ -67,7 +67,7 @@ where
let mut data = [0u16; 2]; let mut data = [0u16; 2];
data[0] = CalibrationEnable::REGISTER; data[0] = CalibrationEnable::REGISTER;
data[1] = configuration.0.calibration_enable.to_reg_value(); data[1] = configuration.0.calibration_enable.to_reg_value();
println!("writing to device: addr: {:016b} stage_cal: {:016b}", data[0], data[1]); //println!("writing to device: addr: {:016b} stage_cal: {:016b}", data[0], data[1]);
self.i2c.write(self.address, to_be_array(data).as_byte_slice())?; self.i2c.write(self.address, to_be_array(data).as_byte_slice())?;
Ok(Ad7147 { Ok(Ad7147 {
...@@ -87,7 +87,7 @@ where ...@@ -87,7 +87,7 @@ where
let mut result = [0u8; 12*2]; let mut result = [0u8; 12*2];
self.i2c self.i2c
.write_read(self.address, to_be_array([STAGE_CONVERSION_RESULT_REGISTER]).as_byte_slice(), &mut result)?; .write_read(self.address, to_be_array([STAGE_CONVERSION_RESULT_REGISTER]).as_byte_slice(), &mut result)?;
println!("read from device {:x?}", result); //println!("read from device {:x?}", result);
Ok(to_le_u16_array(&result)) Ok(to_le_u16_array(&result))
} }
...@@ -95,7 +95,7 @@ where ...@@ -95,7 +95,7 @@ where
let mut data = [0u8; 6]; let mut data = [0u8; 6];
self.i2c self.i2c
.write_read(self.address, to_be_array([STAGE_COMPLETED_INTERRUPT_RESULT_REGISTER]).as_byte_slice(), &mut data)?; .write_read(self.address, to_be_array([STAGE_COMPLETED_INTERRUPT_RESULT_REGISTER]).as_byte_slice(), &mut data)?;
println!("read from device {:x?}", data); //println!("read from device {:x?}", data);
Ok(InterruptStatus::from_registers(to_le_u16_array(&data))) Ok(InterruptStatus::from_registers(to_le_u16_array(&data)))
} }
......
use crate::flow3r::display::Display; use crate::flow3r::{display::Display, imu::ImuHandler};
use embassy_futures::select::{select, Either}; use bmi270::AxisData;
use embassy_futures::select::{select, Either, select3, Either3};
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use embedded_graphics::{ use embedded_graphics::{
image::Image, image::Image,
mono_font::{ascii::FONT_6X10, MonoTextStyle}, mono_font::{ascii::FONT_6X10, MonoTextStyle},
pixelcolor::Rgb565, pixelcolor::Rgb565,
prelude::*, prelude::*,
primitives::{PrimitiveStyle, Rectangle, StyledDrawable}, primitives::{Circle, PrimitiveStyle, Rectangle, StyledDrawable},
text::Text, text::Text,
}; };
use esp_backtrace as _; use esp_backtrace as _;
...@@ -33,12 +34,10 @@ pub async fn leds_fade(mut leds: crate::flow3r::leds::Leds) -> ! { ...@@ -33,12 +34,10 @@ pub async fn leds_fade(mut leds: crate::flow3r::leds::Leds) -> ! {
} }
} }
#[embassy_executor::task] pub async fn display_demo(display: &mut crate::flow3r::display::Display) {
pub async fn display_demo(mut display: crate::flow3r::display::Display) -> ! {
let input = InputHandler; let input = InputHandler;
let mut inputs = input.split(); let mut inputs = input.split();
println!("running display demo");
display.set_backlight(100).unwrap(); display.set_backlight(100).unwrap();
let mut rect = Rectangle::with_center(Point { x: 120, y: 120 }, Size::new(50, 50)); let mut rect = Rectangle::with_center(Point { x: 120, y: 120 }, Size::new(50, 50));
...@@ -52,23 +51,21 @@ pub async fn display_demo(mut display: crate::flow3r::display::Display) -> ! { ...@@ -52,23 +51,21 @@ pub async fn display_demo(mut display: crate::flow3r::display::Display) -> ! {
display display
.fill_solid(&display.bounding_box(), Rgb565::BLACK) .fill_solid(&display.bounding_box(), Rgb565::BLACK)
.unwrap(); .unwrap();
text.draw(&mut display).unwrap(); text.draw(display).unwrap();
rect.draw_styled(&rect_style, &mut display).unwrap(); rect.draw_styled(&rect_style, display).unwrap();
display.flush().await.unwrap(); display.flush().await.unwrap();
loop { loop {
match select( match select3(
inputs.sw1_left.wait_for_press(), inputs.sw1_left.wait_for_press(),
inputs.sw1_right.wait_for_press(), inputs.sw1_right.wait_for_press(),
inputs.sw2_center.wait_for_press(),
) )
.await .await
{ {
Either::First(_) => { Either3::First(_) => move_rectangle(&mut rect, &text, display, &rect_style, -5).await,
move_rectangle(&mut rect, &text, &mut display, &rect_style, -5).await Either3::Second(_) => move_rectangle(&mut rect, &text, display, &rect_style, 5).await,
} Either3::Third(_) => break
Either::Second(_) => {
move_rectangle(&mut rect, &text, &mut display, &rect_style, 5).await
}
} }
} }
} }
...@@ -111,3 +108,44 @@ pub async fn draw_start_screen(display: &mut Display) { ...@@ -111,3 +108,44 @@ pub async fn draw_start_screen(display: &mut Display) {
display.flush().await.unwrap(); display.flush().await.unwrap();
display.set_backlight(100).unwrap(); display.set_backlight(100).unwrap();
} }
pub async fn imu_demo(display: &mut Display /*imu: &mut ImuHandler*/) {
let input = InputHandler;
let mut inputs = input.split();
let circle = Circle::with_center(display.bounding_box().center(), 20);
let circle_style = PrimitiveStyle::with_fill(Rgb565::YELLOW);
display
.fill_solid(&display.bounding_box(), Rgb565::BLACK)
.unwrap();
circle.draw_styled(&circle_style, display).unwrap();
display.flush().await.unwrap();
let mut offset = (0i32, 0i32);
loop {
match select(inputs.sw2_center.wait_for_press(), async {
//let imu_value = imu.rotation().unwrap();
let imu_value = AxisData { x: 5, y: 5, z: 0 };
offset = (
(-80).max(80.min(offset.0 + imu_value.x as i32)),
(-80).max(80.min(offset.1 + imu_value.y as i32)),
);
display
.fill_solid(&display.bounding_box(), Rgb565::BLACK)
.unwrap();
println!("offset: {}, {}", offset.0, offset.1);
circle
.translate(Point::new(offset.0, offset.1))
.draw_styled(&circle_style, display)
.unwrap();
display.flush().await.unwrap();
Timer::after(Duration::from_millis(20)).await;
})
.await
{
Either::First(_) => break,
Either::Second(_) => (),
}
}
}
...@@ -283,7 +283,7 @@ pub async fn captouch_controller( ...@@ -283,7 +283,7 @@ pub async fn captouch_controller(
let _ = ad7147_top.read_interrupt_registers().unwrap(); let _ = ad7147_top.read_interrupt_registers().unwrap();
//println!("ints: {:?}", ints); //println!("ints: {:?}", ints);
let measurement = ad7147_bot.read_all_stages().unwrap(); let measurement = ad7147_bot.read_all_stages().unwrap();
println!( /*println!(
"{} {} {} {} {} {} {} {} {} {} {} {}", "{} {} {} {} {} {} {} {} {} {} {} {}",
measurement[0], measurement[0],
measurement[1], measurement[1],
...@@ -297,9 +297,9 @@ pub async fn captouch_controller( ...@@ -297,9 +297,9 @@ pub async fn captouch_controller(
measurement[9], measurement[9],
measurement[10], measurement[10],
measurement[11] measurement[11]
); );*/
let measurement = ad7147_top.read_all_stages().unwrap(); let measurement = ad7147_top.read_all_stages().unwrap();
println!( /*println!(
"{} {} {} {} {} {} {} {} {} {} {} {}", "{} {} {} {} {} {} {} {} {} {} {} {}",
measurement[0], measurement[0],
measurement[1], measurement[1],
...@@ -313,7 +313,7 @@ pub async fn captouch_controller( ...@@ -313,7 +313,7 @@ pub async fn captouch_controller(
measurement[9], measurement[9],
measurement[10], measurement[10],
measurement[11] measurement[11]
); );*/
Timer::after(Duration::from_millis(1000)).await; Timer::after(Duration::from_millis(1000)).await;
} }
} }
...@@ -12,12 +12,13 @@ pub mod imu; ...@@ -12,12 +12,13 @@ pub mod imu;
pub mod input; pub mod input;
pub mod leds; pub mod leds;
pub mod sdcard; pub mod sdcard;
pub mod ui;
pub struct Flow3r { pub struct Flow3r {
pub badgelink: BadgeLink, pub badgelink: BadgeLink,
pub captouch: CapTouchHandler, pub captouch: CapTouchHandler,
pub display: Display, pub display: Display,
pub imu: ImuHandler, //pub imu: ImuHandler,
pub inputs: InputHandler, pub inputs: InputHandler,
pub leds: Leds, pub leds: Leds,
} }
...@@ -27,7 +28,7 @@ impl Flow3r { ...@@ -27,7 +28,7 @@ impl Flow3r {
badgelink: BadgeLink, badgelink: BadgeLink,
captouch: CapTouchHandler, captouch: CapTouchHandler,
display: Display, display: Display,
imu: ImuHandler, //imu: ImuHandler,
inputs: InputHandler, inputs: InputHandler,
leds: Leds, leds: Leds,
) -> Self { ) -> Self {
...@@ -35,7 +36,7 @@ impl Flow3r { ...@@ -35,7 +36,7 @@ impl Flow3r {
badgelink, badgelink,
captouch, captouch,
display, display,
imu, //imu,
inputs, inputs,
leds, leds,
} }
......
use embassy_futures::select::{select3, Either3};
use embassy_time::{Duration, Timer};
use embedded_graphics::{
mono_font::{ascii::FONT_10X20, MonoTextStyle},
pixelcolor::Rgb565,
prelude::*,
text::Text,
};
use esp_println::println;
use crate::{
demo_tasks::{display_demo, imu_demo},
flow3r::{display::Display, input::InputHandler},
};
pub async fn main_menu(mut display: Display, inputs: InputHandler) -> ! {
let mut inputs = inputs.split();
let apps = ["input_test", "imu_test", "captouch_test"];
let mut selected = 0usize;
display
.fill_solid(&display.bounding_box(), Rgb565::BLACK)
.unwrap();
let mut text = Text::with_alignment(
apps[selected],
Point { x: 120, y: 120 },
MonoTextStyle::new(&FONT_10X20, Rgb565::WHITE),
embedded_graphics::text::Alignment::Center,
);
text.draw(&mut display).unwrap();
display.flush().await.unwrap();
loop {
match select3(
inputs.sw1_center.wait_for_press(),
inputs.sw1_right.wait_for_press(),
inputs.sw1_left.wait_for_press(),
)
.await
{
Either3::First(_) => {
start_current_app(apps[selected], &mut display).await;
display
.fill_solid(&display.bounding_box(), Rgb565::BLACK)
.unwrap();
text.draw(&mut display).unwrap();
display.flush().await.unwrap();
}
Either3::Second(_) => {
let selected_new = (apps.len() - 1).min(selected + 1);
if selected != selected_new {
play_transition_animation(&mut display, apps[selected_new], &mut text, false)
.await;
}
selected = selected_new;
}
Either3::Third(_) => {
let selected_new = if selected > 0 { selected - 1 } else { selected };
if selected != selected_new {
play_transition_animation(&mut display, apps[selected_new], &mut text, true)
.await;
}
selected = selected_new;
}
}
}
}
async fn play_transition_animation<'a>(
display: &mut Display,
app: &'a str,
text: &mut Text<'a, MonoTextStyle<'a, Rgb565>>,
direction: bool,
) {
let mut offset = 0i32;
while offset < text.bounding_box().size.width as i32 / 2 + 120 {
offset += 20;
display
.fill_solid(&display.bounding_box(), Rgb565::BLACK)
.unwrap();
text.translate(Point::new(if direction { offset } else { -offset }, 0))
.draw(display)
.unwrap();
display.flush().await.unwrap();
Timer::after(Duration::from_millis(1)).await;
}
text.text = app;
let mut offset = text.bounding_box().size.width as i32 / 2 + 120;
while offset > 0 {
offset -= 20;
display
.fill_solid(&display.bounding_box(), Rgb565::BLACK)
.unwrap();
text.translate(Point::new(if direction { -offset } else { offset }, 0))
.draw(display)
.unwrap();
display.flush().await.unwrap();
Timer::after(Duration::from_millis(1)).await;
}
}
async fn start_current_app(app: &str, display: &mut Display) {
match app {
"input_test" => display_demo(display).await,
"imu_test" => imu_demo(display).await,
"captouch_test" => {}
_ => (),
}
}
pub mod main_menu;
...@@ -13,7 +13,7 @@ use embassy_executor::Spawner; ...@@ -13,7 +13,7 @@ use embassy_executor::Spawner;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use flow3r::Flow3r; use flow3r::{ui::main_menu::main_menu, Flow3r};
use hal::prelude::*; use hal::prelude::*;
use runtime::start_runtime; use runtime::start_runtime;
...@@ -26,13 +26,12 @@ fn runtime() -> ! { ...@@ -26,13 +26,12 @@ fn runtime() -> ! {
#[embassy_executor::task] #[embassy_executor::task]
async fn main(mut flow3r: Flow3r) -> ! { async fn main(mut flow3r: Flow3r) -> ! {
draw_start_screen(&mut flow3r.display).await; draw_start_screen(&mut flow3r.display).await;
Timer::after(Duration::from_secs(10)).await;
let spawner = Spawner::for_current_executor().await; let spawner = Spawner::for_current_executor().await;
spawner.spawn(demo_tasks::leds_fade(flow3r.leds)).ok(); spawner.spawn(demo_tasks::leds_fade(flow3r.leds)).ok();
spawner.spawn(demo_tasks::display_demo(flow3r.display)).ok(); // spawner.spawn(demo_tasks::display_demo(flow3r.display)).ok();
loop { Timer::after(Duration::from_secs(3)).await;
Timer::after(Duration::from_secs(10)).await
} main_menu(flow3r.display, flow3r.inputs).await
} }
...@@ -176,12 +176,12 @@ async fn init_runtime() { ...@@ -176,12 +176,12 @@ async fn init_runtime() {
// Init Flow3r components // Init Flow3r components
let badgelink = BadgeLink::new(i2c_busmanager.acquire_i2c()); let badgelink = BadgeLink::new(i2c_busmanager.acquire_i2c());
let imu = ImuHandler::new(i2c_busmanager.acquire_i2c()); //let imu = ImuHandler::new(i2c_busmanager.acquire_i2c());
let inputs = InputHandler; let inputs = InputHandler;
let captouch = CapTouchHandler; let captouch = CapTouchHandler;
let leds = init_leds(pulse.channel0, io.pins.gpio14); let leds = init_leds(pulse.channel0, io.pins.gpio14);
let flow3r = Flow3r::new(badgelink, captouch, display, imu, inputs, leds); let flow3r = Flow3r::new(badgelink, captouch, display, inputs, leds);
// Spawn background tasks // Spawn background tasks
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment