use avr_oxide::concurrency::util::ThreadId;
use avr_oxide::deviceconsts::oxide;
use avr_oxide::concurrency::stack;
#[cfg(feature="panicout")]
use avr_oxide::hal::generic::serial::SerialNoInterruptTx;
pub fn print(string: &str){
#[cfg(all(feature="panicout",target_arch="avr"))]
if avr_oxide::panic_stdout!().can_write() {
avr_oxide::panic_stdout!().blocking_write_slice(string.as_bytes());
}
}
pub fn print_u16(val: u16){
if val > 9 {
print_u16(val/10);
}
#[cfg(all(feature="panicout",target_arch="avr"))]
if avr_oxide::panic_stdout!().can_write() {
avr_oxide::panic_stdout!().blocking_write_u8(((val % 10) + 0x30) as u8);
}
}
pub fn print_u32(val: u32){
if val > 9 {
print_u32(val/10);
}
#[cfg(all(feature="panicout",target_arch="avr"))]
if avr_oxide::panic_stdout!().can_write() {
avr_oxide::panic_stdout!().blocking_write_u8(((val % 10) + 0x30) as u8);
}
}
pub fn print_thread_state() {
use avr_oxide::concurrency::scheduler;
#[cfg(all(feature="panicout",target_arch="avr"))]
avr_oxide::concurrency::interrupt::isolated(|isotoken|{
if avr_oxide::panic_stdout!().can_write() {
unsafe {
print("\r\nKRNL");
if stack::kernel::is_stack_guard_valid() {
print("\r\n OK");
} else {
print("\r\n BAD");
}
print("\r\n S: ");
print_u16(stack::kernel::get_size() as u16);
print(" @ ");
print_u16(stack::kernel::get_stack_top() as u16);
print("\r\n F: ");
print_u16(stack::kernel::get_stack_free() as u16);
for thread_id in ThreadId::MIN..oxide::MAX_THREADS {
match scheduler::try_get_thread_by_id(thread_id){
None => {},
Some(thread) => {
print("\r\n\nT");
print_u16(thread_id as u16);
print(":\r\n ");
print(thread.state.to_debug_str());
print("\r\n RC: ");
print_u16(thread.returncode as u16);
print("\r\n Wt: ");
thread.waiting_threads.do_each(isotoken, |_isotoken,waiting_id|{
print_u16(waiting_id as u16);
print(" ");
true
});
print("\r\n ST:");
match &thread.stack {
None => {
print("\r\n DISP");
},
Some(stack) => {
if stack.is_stack_guard_valid() {
print("\r\n OK");
} else {
print("\r\n BAD");
}
print("\r\n S: ");
print_u16(stack.get_size() as u16);
print(" @ ");
print_u16(stack.get_stack_top() as u16);
print("\r\n F: ");
print_u16(stack.get_stack_free() as u16);
}
}
}
}
}
print("\r\n\n");
}
}
});
}