use std::{ path::Component, sync::{ Arc, mpsc::{Receiver, Sender}, }, }; use crate::{MemoryBank, SharedState, backend::memory::PhysAddr}; pub struct Serial { pub receiver: Receiver, pub buffer: Vec, pub visible: bool, } impl Serial { fn uart_io_thread(mem: MemoryBank, uart_base: PhysAddr, tx: Sender) { loop { let word = mem.read_word(uart_base); // println!("word {:#010X}", word); if word >> 24 == 0x01 { let byte = ((word >> 16) & 0xFF) as u8; let _ = tx.send(byte); mem.write_word(uart_base, 0x00_00_00_00); // clear valid flag } std::hint::spin_loop(); } } pub fn new(uart_base: PhysAddr, state: Arc, mem_handle: MemoryBank) -> Self { let (sender, receiver) = std::sync::mpsc::channel(); let _ = std::thread::spawn(move || Self::uart_io_thread(mem_handle, uart_base, sender)); Self { visible: false, receiver, buffer: Vec::new(), } } pub fn update(&mut self) { while let Ok(byte) = self.receiver.try_recv() { self.buffer.push(byte); } } }