made the thing read the cards
evan suggested that computers have two cores, which I had neglected up until now bitbanging is way easier than figuring out how to use pin interrupts in embassy, mA be damned
This commit is contained in:
parent
311b0c1599
commit
249b8118aa
1 changed files with 61 additions and 47 deletions
|
@ -18,7 +18,9 @@ use bt_hci::cmd::info;
|
||||||
use critical_section::Mutex;
|
use critical_section::Mutex;
|
||||||
use cyw43_pio::PioSpi;
|
use cyw43_pio::PioSpi;
|
||||||
use embassy_futures::join::join;
|
use embassy_futures::join::join;
|
||||||
|
use embassy_futures::yield_now;
|
||||||
use embassy_rp::interrupt::typelevel::{Handler, Interrupt, IO_IRQ_BANK0};
|
use embassy_rp::interrupt::typelevel::{Handler, Interrupt, IO_IRQ_BANK0};
|
||||||
|
use embassy_rp::multicore::{spawn_core1, Stack};
|
||||||
use embassy_rp::pwm::{self, Pwm};
|
use embassy_rp::pwm::{self, Pwm};
|
||||||
use fixed::FixedU16;
|
use fixed::FixedU16;
|
||||||
use log::*;
|
use log::*;
|
||||||
|
@ -66,58 +68,42 @@ async fn net_task(mut runner: embassy_net::Runner<'static, cyw43::NetDriver<'sta
|
||||||
runner.run().await
|
runner.run().await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LAST_BIT: AtomicU8 = AtomicU8::new(0);
|
||||||
|
#[embassy_executor::task]
|
||||||
|
async fn print_task() -> ! {
|
||||||
|
let mut last_bit = 0;
|
||||||
|
loop {
|
||||||
|
Timer::after_millis(250).await;
|
||||||
|
let card = critical_section::with(|cs| {
|
||||||
|
READ_CARD.borrow(cs).clone().into_inner()
|
||||||
|
});
|
||||||
|
let bit = BIT.load(core::sync::atomic::Ordering::SeqCst);
|
||||||
|
if bit == last_bit {
|
||||||
|
if card !=0 {
|
||||||
|
info!("thi ting: {card:#x}");
|
||||||
|
}
|
||||||
|
critical_section::with(|cs| {
|
||||||
|
READ_CARD.replace(cs, 0);
|
||||||
|
});
|
||||||
|
BIT.store(0, core::sync::atomic::Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
last_bit = bit;
|
||||||
|
info!("ro: {card:#x}, bit: {bit}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[panic_handler]
|
#[panic_handler]
|
||||||
fn panic( info: &PanicInfo) -> ! {
|
fn panic( info: &PanicInfo) -> ! {
|
||||||
error!("{}", info);
|
error!("{}", info);
|
||||||
loop { }
|
loop { }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[embassy_executor::task]
|
|
||||||
async fn data_handler() {
|
|
||||||
info!("start");
|
|
||||||
let (data_0, data_1) = critical_section::with(|cs| {
|
|
||||||
let borrow_ref_mut = DATA_IN.take(cs);
|
|
||||||
borrow_ref_mut.unzip()
|
|
||||||
});
|
|
||||||
let mut data_0 = data_0.unwrap();
|
|
||||||
let mut data_1 = data_1.unwrap();
|
|
||||||
info!("gyatt");
|
|
||||||
loop {
|
|
||||||
join(data_0.wait_for_falling_edge(), data_1.wait_for_falling_edge()).await;
|
|
||||||
info!("happen");
|
|
||||||
|
|
||||||
critical_section::with(|cs| {
|
|
||||||
let mut partial = READ_CARD.borrow_ref_mut(cs);
|
|
||||||
let bit = BIT.load(core::sync::atomic::Ordering::SeqCst);
|
|
||||||
|
|
||||||
let borrow_ref_mut = DATA_IN.take(cs);
|
|
||||||
let (data_0, data_1) = borrow_ref_mut.as_ref().unwrap();
|
|
||||||
|
|
||||||
if data_1.is_low() {
|
|
||||||
*partial &= 1 << bit;
|
|
||||||
}
|
|
||||||
if data_0.is_low() {
|
|
||||||
*partial |= !1u64.rotate_left(bit as u32);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[embassy_executor::main]
|
#[embassy_executor::main]
|
||||||
async fn main(spawner: Spawner) {
|
async fn main(spawner: Spawner) {
|
||||||
|
|
||||||
|
|
||||||
let p = embassy_rp::init(Default::default());
|
let p = embassy_rp::init(Default::default());
|
||||||
let data_0= Input::new(p.PIN_21, embassy_rp::gpio::Pull::None);
|
let data_0= Input::new(p.PIN_21, embassy_rp::gpio::Pull::None);
|
||||||
let data_1= Input::new(p.PIN_16, embassy_rp::gpio::Pull::None);
|
let data_1= Input::new(p.PIN_16, embassy_rp::gpio::Pull::None);
|
||||||
|
|
||||||
critical_section::with(|cs| {
|
|
||||||
DATA_IN.replace(cs, Some((data_0, data_1)));
|
|
||||||
});
|
|
||||||
|
|
||||||
//spawner.spawn(data_handler()).unwrap();
|
|
||||||
|
|
||||||
|
|
||||||
let mut rng = RoscRng;
|
let mut rng = RoscRng;
|
||||||
|
|
||||||
let driver = Driver::new(p.USB, Irqs);
|
let driver = Driver::new(p.USB, Irqs);
|
||||||
|
@ -172,14 +158,42 @@ async fn main(spawner: Spawner) {
|
||||||
let mut tx_buffer = [0; 4096];
|
let mut tx_buffer = [0; 4096];
|
||||||
let mut buf = [0; 4096];
|
let mut buf = [0; 4096];
|
||||||
|
|
||||||
loop {
|
spawner.spawn(print_task()).unwrap();
|
||||||
|
|
||||||
|
let mut partial: u64 = 0;
|
||||||
|
let mut bit: u8 = 0;
|
||||||
|
let mut prev: (bool,bool) = (false,false);
|
||||||
|
|
||||||
|
static mut CORE1_STACK: Stack<4096> = Stack::new();
|
||||||
|
spawn_core1(p.CORE1, unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) }, move || {
|
||||||
|
loop {
|
||||||
|
let current = (data_0.is_low(), data_1.is_low());
|
||||||
|
if current.1 && !prev.1 {
|
||||||
|
partial |= 1 << bit;
|
||||||
|
bit += 1;
|
||||||
|
}
|
||||||
|
if current.0 && !prev.0 {
|
||||||
|
partial &= !(1u64).rotate_left(bit as u32);
|
||||||
|
bit += 1;
|
||||||
|
}
|
||||||
|
prev=current;
|
||||||
|
|
||||||
|
critical_section::with(|cs| {
|
||||||
|
let mut foreign_partial = READ_CARD.borrow_ref_mut(cs);
|
||||||
|
|
||||||
|
// may or may not be sound, should work fine given no noise on the signal
|
||||||
|
if *foreign_partial != partial && !current.0 && !current.1 {
|
||||||
|
bit = 0;
|
||||||
|
partial = *foreign_partial;
|
||||||
|
}
|
||||||
|
|
||||||
|
*foreign_partial = partial;
|
||||||
|
});
|
||||||
|
|
||||||
|
BIT.store(bit, core::sync::atomic::Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
let card = critical_section::with(|cs| {
|
|
||||||
READ_CARD.borrow_ref(cs).clone()
|
|
||||||
});
|
|
||||||
//info!("datah: {}", card);
|
|
||||||
Timer::after_millis(100).await;
|
|
||||||
}
|
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer);
|
let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer);
|
||||||
|
|
Loading…
Reference in a new issue