Slimmed down template significantly
This commit is contained in:
1
firmware/film-scanner-fw/COPYING.md
Normal file
1
firmware/film-scanner-fw/COPYING.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
This is based on João Nuno Carvalho's template at https://github.com/joaocarvalhoopen/Raspberry_Pi_Pico_in_Rust__Proj_Template_with_RTIC_USB-Serial_UF2
|
||||||
@@ -9,16 +9,15 @@ edition = "2021"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
||||||
|
|
||||||
cortex-m = "0.7.3"
|
cortex-m = "0.7.4"
|
||||||
cortex-m-rt = "0.7.0"
|
cortex-m-rt = "0.7.1"
|
||||||
cortex-m-rtic = "1.0.0"
|
cortex-m-rtic = "1.0.0"
|
||||||
embedded-hal = { version = "0.2.5", features=["unproven"] }
|
embedded-hal = { version = "0.2.7", features=["unproven"] }
|
||||||
embedded-time = "0.12.0"
|
embedded-time = "0.12.0"
|
||||||
|
|
||||||
# jnc
|
# jnc
|
||||||
usb-device = "0.2.8"
|
usb-device = "0.2.8"
|
||||||
usbd-serial = "0.1.1"
|
usbd-serial = "0.1.1"
|
||||||
usbd-hid = "0.5.1"
|
|
||||||
futures = { version = "0.3", default-features = false, optional = true }
|
futures = { version = "0.3", default-features = false, optional = true }
|
||||||
|
|
||||||
defmt = "0.3.0"
|
defmt = "0.3.0"
|
||||||
@@ -26,7 +25,7 @@ defmt-rtt = "0.3.1"
|
|||||||
panic-probe = { version = "0.3.0", features = ["print-defmt"] }
|
panic-probe = { version = "0.3.0", features = ["print-defmt"] }
|
||||||
|
|
||||||
# We're using a Pico by default on this template
|
# We're using a Pico by default on this template
|
||||||
rp-pico = "0.2.0"
|
rp-pico = "0.3.0"
|
||||||
|
|
||||||
# but you can use any BSP. Uncomment this to use the pro_micro_rp2040 BSP instead
|
# but you can use any BSP. Uncomment this to use the pro_micro_rp2040 BSP instead
|
||||||
# sparkfun-pro-micro-rp2040 = "0.1.0"
|
# sparkfun-pro-micro-rp2040 = "0.1.0"
|
||||||
@@ -36,54 +35,3 @@ rp2040-hal = { version="0.4.0", features=["rt"] }
|
|||||||
|
|
||||||
rp2040-boot2 = {version="0.2.0", optional = true }
|
rp2040-boot2 = {version="0.2.0", optional = true }
|
||||||
|
|
||||||
# cargo build/run
|
|
||||||
[profile.dev]
|
|
||||||
codegen-units = 1
|
|
||||||
debug = 2
|
|
||||||
debug-assertions = true
|
|
||||||
incremental = false
|
|
||||||
opt-level = 3
|
|
||||||
overflow-checks = true
|
|
||||||
|
|
||||||
# cargo build/run --release
|
|
||||||
[profile.release]
|
|
||||||
codegen-units = 1
|
|
||||||
debug = 2
|
|
||||||
debug-assertions = false
|
|
||||||
incremental = false
|
|
||||||
lto = 'fat'
|
|
||||||
opt-level = 3
|
|
||||||
overflow-checks = false
|
|
||||||
|
|
||||||
# do not optimize proc-macro crates = faster builds from scratch
|
|
||||||
[profile.dev.build-override]
|
|
||||||
codegen-units = 8
|
|
||||||
debug = false
|
|
||||||
debug-assertions = false
|
|
||||||
opt-level = 0
|
|
||||||
overflow-checks = false
|
|
||||||
|
|
||||||
[profile.release.build-override]
|
|
||||||
codegen-units = 8
|
|
||||||
debug = false
|
|
||||||
debug-assertions = false
|
|
||||||
opt-level = 0
|
|
||||||
overflow-checks = false
|
|
||||||
|
|
||||||
# cargo test
|
|
||||||
[profile.test]
|
|
||||||
codegen-units = 1
|
|
||||||
debug = 2
|
|
||||||
debug-assertions = true
|
|
||||||
incremental = false
|
|
||||||
opt-level = 3
|
|
||||||
overflow-checks = true
|
|
||||||
|
|
||||||
# cargo test --release
|
|
||||||
[profile.bench]
|
|
||||||
codegen-units = 1
|
|
||||||
debug = 2
|
|
||||||
debug-assertions = false
|
|
||||||
incremental = false
|
|
||||||
lto = 'fat'
|
|
||||||
opt-level = 3
|
|
||||||
0
firmware/film-scanner-fw/README.md
Normal file
0
firmware/film-scanner-fw/README.md
Normal file
@@ -17,6 +17,7 @@ mod app {
|
|||||||
use rp_pico::hal;
|
use rp_pico::hal;
|
||||||
use rp_pico::pac;
|
use rp_pico::pac;
|
||||||
use rp_pico::XOSC_CRYSTAL_FREQ;
|
use rp_pico::XOSC_CRYSTAL_FREQ;
|
||||||
|
use rtic::mutex_prelude::{TupleExt04, TupleExt05};
|
||||||
|
|
||||||
// USB Device support
|
// USB Device support
|
||||||
use usb_device::{class_prelude::*, prelude::*};
|
use usb_device::{class_prelude::*, prelude::*};
|
||||||
@@ -52,38 +53,12 @@ mod app {
|
|||||||
// Global Static variable, has to be written inside unsafe blocks.
|
// Global Static variable, has to be written inside unsafe blocks.
|
||||||
// A reference can be obtained with as_ref() method.
|
// A reference can be obtained with as_ref() method.
|
||||||
|
|
||||||
pub struct Counter {
|
|
||||||
counter: u32,
|
|
||||||
enable: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Counter {
|
|
||||||
fn new() -> Self {
|
|
||||||
Counter {
|
|
||||||
counter: 0_u32,
|
|
||||||
enable: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get(&self) -> u32 {
|
|
||||||
self.counter
|
|
||||||
}
|
|
||||||
|
|
||||||
fn reset(&mut self) {
|
|
||||||
self.counter = 0_u32;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn increment(&mut self) {
|
|
||||||
self.counter += 1_u32;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn enable(&mut self, state: bool) {
|
|
||||||
self.enable = state;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[shared]
|
#[shared]
|
||||||
struct Shared {
|
struct Shared {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
timer: hal::Timer,
|
timer: hal::Timer,
|
||||||
alarm: hal::timer::Alarm0,
|
alarm: hal::timer::Alarm0,
|
||||||
led: hal::gpio::Pin<hal::gpio::pin::bank0::Gpio25, hal::gpio::PushPullOutput>,
|
led: hal::gpio::Pin<hal::gpio::pin::bank0::Gpio25, hal::gpio::PushPullOutput>,
|
||||||
@@ -92,7 +67,6 @@ mod app {
|
|||||||
serial: SerialPort<'static, hal::usb::UsbBus>,
|
serial: SerialPort<'static, hal::usb::UsbBus>,
|
||||||
usb_dev: usb_device::device::UsbDevice<'static, hal::usb::UsbBus>,
|
usb_dev: usb_device::device::UsbDevice<'static, hal::usb::UsbBus>,
|
||||||
|
|
||||||
counter: Counter,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[local]
|
#[local]
|
||||||
@@ -164,14 +138,11 @@ mod app {
|
|||||||
let mut timer = hal::Timer::new(c.device.TIMER, &mut resets);
|
let mut timer = hal::Timer::new(c.device.TIMER, &mut resets);
|
||||||
let mut alarm = timer.alarm_0().unwrap();
|
let mut alarm = timer.alarm_0().unwrap();
|
||||||
let _ = alarm.schedule(SCAN_TIME_US.microseconds());
|
let _ = alarm.schedule(SCAN_TIME_US.microseconds());
|
||||||
alarm.enable_interrupt(&mut timer);
|
alarm.enable_interrupt();
|
||||||
|
|
||||||
// Enable led_blink.
|
// Enable led_blink.
|
||||||
let led_blink_enable = true;
|
let led_blink_enable = true;
|
||||||
|
|
||||||
// Reset the counter
|
|
||||||
let counter = Counter::new();
|
|
||||||
|
|
||||||
//********
|
//********
|
||||||
// Return the Shared variables struct, the Local variables struct and the XPTO Monitonics
|
// Return the Shared variables struct, the Local variables struct and the XPTO Monitonics
|
||||||
// (Note: Read again the RTIC book in the section of Monotonics timers)
|
// (Note: Read again the RTIC book in the section of Monotonics timers)
|
||||||
@@ -184,8 +155,6 @@ mod app {
|
|||||||
|
|
||||||
serial,
|
serial,
|
||||||
usb_dev,
|
usb_dev,
|
||||||
|
|
||||||
counter,
|
|
||||||
},
|
},
|
||||||
Local {},
|
Local {},
|
||||||
init::Monotonics(),
|
init::Monotonics(),
|
||||||
@@ -196,82 +165,23 @@ mod app {
|
|||||||
#[task(
|
#[task(
|
||||||
binds = TIMER_IRQ_0,
|
binds = TIMER_IRQ_0,
|
||||||
priority = 1,
|
priority = 1,
|
||||||
shared = [timer, alarm, led, led_blink_enable, serial, counter],
|
shared = [timer, alarm, serial],
|
||||||
local = [tog: bool = true],
|
local = [tog: bool = true],
|
||||||
)]
|
)]
|
||||||
fn timer_irq(mut cx: timer_irq::Context) {
|
fn timer_irq(mut _cx: timer_irq::Context) {
|
||||||
let mut buf = [0u8; 64];
|
|
||||||
|
|
||||||
let led = cx.shared.led;
|
|
||||||
let led_blink_enable = cx.shared.led_blink_enable;
|
|
||||||
let counter = cx.shared.counter;
|
|
||||||
|
|
||||||
let tog = cx.local.tog;
|
|
||||||
|
|
||||||
// Blinks the LED ON / OFF.
|
|
||||||
(led, led_blink_enable, counter).lock(|led_a, led_blink_enable_a, counter_a| {
|
|
||||||
let led_state_str: &str;
|
|
||||||
if *led_blink_enable_a {
|
|
||||||
if *tog {
|
|
||||||
led_a.set_high().unwrap();
|
|
||||||
led_state_str = "ON ";
|
|
||||||
} else {
|
|
||||||
led_a.set_low().unwrap();
|
|
||||||
led_state_str = "OFF";
|
|
||||||
}
|
|
||||||
let _ = writeln!(
|
|
||||||
Wrapper::new(&mut buf),
|
|
||||||
"LED {}! counter = {}",
|
|
||||||
led_state_str,
|
|
||||||
counter_a.get()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if counter_a.enable {
|
|
||||||
counter_a.increment();
|
|
||||||
}
|
|
||||||
|
|
||||||
if *led_blink_enable_a {
|
|
||||||
*tog = !*tog;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Clears the timer interrupt and Set's the new delta_time in the future.
|
|
||||||
let mut timer = cx.shared.timer;
|
|
||||||
let mut alarm = cx.shared.alarm;
|
|
||||||
(alarm).lock(|a| {
|
|
||||||
(timer).lock(|timer_a| {
|
|
||||||
a.clear_interrupt(timer_a);
|
|
||||||
let _ = a.schedule(SCAN_TIME_US.microseconds());
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Write the message "blabla! 2" do USB-Serial.
|
|
||||||
cx.shared.serial.lock(|s| {
|
|
||||||
write_serial(s, unsafe { core::str::from_utf8_unchecked(&buf) }, false);
|
|
||||||
});
|
|
||||||
|
|
||||||
/*
|
|
||||||
// Write the message "blabla! 2" do USB-Serial.
|
|
||||||
c.shared.serial.lock(|s| {
|
|
||||||
let mut buf = [0u8; 64];
|
|
||||||
let _ = writeln!(Wrapper::new(&mut buf), "blabla! {}", 2); /*"{:?}"*/
|
|
||||||
write_serial(s, unsafe { core::str::from_utf8_unchecked(&buf) }, false);
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Usb interrupt handler. Runs every time the host requests new data.
|
/// Usb interrupt handler. Runs every time the host requests new data.
|
||||||
#[task(binds = USBCTRL_IRQ, priority = 3, shared = [led, led_blink_enable, serial, usb_dev, counter])]
|
#[task(binds = USBCTRL_IRQ, priority = 3, shared = [led, led_blink_enable, serial, usb_dev])]
|
||||||
fn usb_rx(cx: usb_rx::Context) {
|
fn usb_rx(cx: usb_rx::Context) {
|
||||||
let led = cx.shared.led;
|
let led = cx.shared.led;
|
||||||
let led_blink_enable = cx.shared.led_blink_enable;
|
let led_blink_enable = cx.shared.led_blink_enable;
|
||||||
|
|
||||||
let usb_dev = cx.shared.usb_dev;
|
let usb_dev = cx.shared.usb_dev;
|
||||||
let serial = cx.shared.serial;
|
let serial = cx.shared.serial;
|
||||||
let counter = cx.shared.counter;
|
|
||||||
|
|
||||||
(led, led_blink_enable, usb_dev, serial, counter).lock(
|
(led, led_blink_enable, usb_dev, serial).lock(
|
||||||
|led_a, led_blink_enable_a, usb_dev_a, serial_a, counter_a| {
|
|led_a, led_blink_enable_a, usb_dev_a, serial_a| {
|
||||||
// Check for new data
|
// Check for new data
|
||||||
if usb_dev_a.poll(&mut [serial_a]) {
|
if usb_dev_a.poll(&mut [serial_a]) {
|
||||||
let mut buf = [0u8; 64];
|
let mut buf = [0u8; 64];
|
||||||
@@ -292,40 +202,8 @@ mod app {
|
|||||||
led_a,
|
led_a,
|
||||||
led_blink_enable_a,
|
led_blink_enable_a,
|
||||||
serial_a,
|
serial_a,
|
||||||
counter_a,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/*
|
|
||||||
// Code to echo the characters in Upper Case.
|
|
||||||
|
|
||||||
// Convert to upper case
|
|
||||||
buf.iter_mut().take(count).for_each(|b| {
|
|
||||||
b.make_ascii_uppercase();
|
|
||||||
});
|
|
||||||
if count > 0 {
|
|
||||||
let _ = serial_a.write(b"Received data! ");
|
|
||||||
let _ = serial_a.flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send back to the host
|
|
||||||
let mut wr_ptr = &buf[..count];
|
|
||||||
while !wr_ptr.is_empty() {
|
|
||||||
match serial_a.write(wr_ptr) {
|
|
||||||
Ok(len) => {
|
|
||||||
wr_ptr = &wr_ptr[len..];
|
|
||||||
// if wr_ptr.len() == 0 {
|
|
||||||
// let _ = serial_a.write(b"");
|
|
||||||
let _ = serial_a.flush();
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
// On error, just drop unwritten data.
|
|
||||||
// One possible error is Err(WouldBlock), meaning the USB
|
|
||||||
// write buffer is full.
|
|
||||||
Err(_) => break,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -385,7 +263,6 @@ mod app {
|
|||||||
led: &mut hal::gpio::Pin<hal::gpio::pin::bank0::Gpio25, hal::gpio::PushPullOutput>,
|
led: &mut hal::gpio::Pin<hal::gpio::pin::bank0::Gpio25, hal::gpio::PushPullOutput>,
|
||||||
led_blink_enable: &mut bool,
|
led_blink_enable: &mut bool,
|
||||||
serial: &mut SerialPort<'static, hal::usb::UsbBus>,
|
serial: &mut SerialPort<'static, hal::usb::UsbBus>,
|
||||||
counter: &mut Counter,
|
|
||||||
) {
|
) {
|
||||||
let _buf_len = buf.len();
|
let _buf_len = buf.len();
|
||||||
match buf[0] {
|
match buf[0] {
|
||||||
@@ -397,22 +274,18 @@ mod app {
|
|||||||
// 0 - Reset counter
|
// 0 - Reset counter
|
||||||
b'0' => {
|
b'0' => {
|
||||||
write_serial(serial, "M - Print Menu\n", false);
|
write_serial(serial, "M - Print Menu\n", false);
|
||||||
counter.reset();
|
|
||||||
}
|
}
|
||||||
// 1 - Increment counter
|
// 1 - Increment counter
|
||||||
b'1' => {
|
b'1' => {
|
||||||
write_serial(serial, "1 - Increment counter\n", false);
|
write_serial(serial, "1 - Increment counter\n", false);
|
||||||
counter.increment();
|
|
||||||
}
|
}
|
||||||
// 2 - Start continues counter
|
// 2 - Start continues counter
|
||||||
b'2' => {
|
b'2' => {
|
||||||
write_serial(serial, "2 - Start continues counter\n", false);
|
write_serial(serial, "2 - Start continues counter\n", false);
|
||||||
counter.enable(true);
|
|
||||||
}
|
}
|
||||||
// 3 - Stop continues counter
|
// 3 - Stop continues counter
|
||||||
b'3' => {
|
b'3' => {
|
||||||
write_serial(serial, "3 - Stop continues counter\n", false);
|
write_serial(serial, "3 - Stop continues counter\n", false);
|
||||||
counter.enable(false);
|
|
||||||
}
|
}
|
||||||
// 4 - Get switch and LED state
|
// 4 - Get switch and LED state
|
||||||
b'4' => {
|
b'4' => {
|
||||||
|
|||||||
Reference in New Issue
Block a user