moved proto, moved logger, updated runtime
This commit is contained in:
parent
f170104304
commit
5e76f7c0b4
@ -1,20 +0,0 @@
|
|||||||
[package]
|
|
||||||
authors = ["M-Labs"]
|
|
||||||
name = "proto_artiq"
|
|
||||||
version = "0.0.0"
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
name = "proto_artiq"
|
|
||||||
path = "lib.rs"
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
failure = { version = "0.1", default-features = false }
|
|
||||||
failure_derive = { version = "0.1", default-features = false }
|
|
||||||
byteorder = { version = "1.0", default-features = false }
|
|
||||||
cslice = { version = "0.3" }
|
|
||||||
log = { version = "0.4", default-features = false, optional = true }
|
|
||||||
io = { path = "../libio", features = ["byteorder"] }
|
|
||||||
dyld = { path = "../libdyld" }
|
|
||||||
|
|
||||||
[features]
|
|
||||||
alloc = ["io/alloc"]
|
|
@ -1,18 +0,0 @@
|
|||||||
#![no_std]
|
|
||||||
#![cfg_attr(feature = "alloc", feature(alloc))]
|
|
||||||
|
|
||||||
extern crate failure;
|
|
||||||
#[macro_use]
|
|
||||||
extern crate failure_derive;
|
|
||||||
#[cfg(feature = "alloc")]
|
|
||||||
extern crate alloc;
|
|
||||||
extern crate cslice;
|
|
||||||
#[cfg(feature = "log")]
|
|
||||||
#[macro_use]
|
|
||||||
extern crate log;
|
|
||||||
|
|
||||||
extern crate io;
|
|
||||||
extern crate dyld;
|
|
||||||
|
|
||||||
// Internal protocols.
|
|
||||||
pub mod drtioaux_proto;
|
|
@ -1,123 +0,0 @@
|
|||||||
use core::cell::Cell;
|
|
||||||
use core::fmt::Write;
|
|
||||||
use log::{Log, LevelFilter};
|
|
||||||
use log_buffer::LogBuffer;
|
|
||||||
use libcortex_a9::mutex::{Mutex, MutexGuard};
|
|
||||||
use libboard_zynq::{println, timer::GlobalTimer};
|
|
||||||
|
|
||||||
pub struct LogBufferRef<'a> {
|
|
||||||
buffer: MutexGuard<'a, LogBuffer<&'static mut [u8]>>,
|
|
||||||
old_log_level: LevelFilter
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> LogBufferRef<'a> {
|
|
||||||
fn new(buffer: MutexGuard<'a, LogBuffer<&'static mut [u8]>>) -> LogBufferRef<'a> {
|
|
||||||
let old_log_level = log::max_level();
|
|
||||||
log::set_max_level(LevelFilter::Off);
|
|
||||||
LogBufferRef { buffer, old_log_level }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn is_empty(&self) -> bool {
|
|
||||||
self.buffer.is_empty()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn clear(&mut self) {
|
|
||||||
self.buffer.clear()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn extract(&mut self) -> &str {
|
|
||||||
self.buffer.extract()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Drop for LogBufferRef<'a> {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
log::set_max_level(self.old_log_level)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct BufferLogger {
|
|
||||||
buffer: Mutex<LogBuffer<&'static mut [u8]>>,
|
|
||||||
uart_filter: Cell<LevelFilter>,
|
|
||||||
buffer_filter: Cell<LevelFilter>,
|
|
||||||
}
|
|
||||||
|
|
||||||
static mut LOGGER: Option<BufferLogger> = None;
|
|
||||||
|
|
||||||
impl BufferLogger {
|
|
||||||
pub fn new(buffer: &'static mut [u8]) -> BufferLogger {
|
|
||||||
BufferLogger {
|
|
||||||
buffer: Mutex::new(LogBuffer::new(buffer)),
|
|
||||||
uart_filter: Cell::new(LevelFilter::Info),
|
|
||||||
buffer_filter: Cell::new(LevelFilter::Trace),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn register(self) {
|
|
||||||
unsafe {
|
|
||||||
LOGGER = Some(self);
|
|
||||||
log::set_logger(LOGGER.as_ref().unwrap())
|
|
||||||
.expect("global logger can only be initialized once");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn get_logger() -> &'static mut Option<BufferLogger> {
|
|
||||||
&mut LOGGER
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn buffer<'a>(&'a self) -> Option<LogBufferRef<'a>> {
|
|
||||||
self.buffer
|
|
||||||
.try_lock()
|
|
||||||
.map(LogBufferRef::new)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn uart_log_level(&self) -> LevelFilter {
|
|
||||||
self.uart_filter.get()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn set_uart_log_level(&self, max_level: LevelFilter) {
|
|
||||||
self.uart_filter.set(max_level)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn buffer_log_level(&self) -> LevelFilter {
|
|
||||||
self.buffer_filter.get()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// this should be reserved for mgmt module
|
|
||||||
pub fn set_buffer_log_level(&self, max_level: LevelFilter) {
|
|
||||||
self.buffer_filter.set(max_level)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// required for impl Log
|
|
||||||
unsafe impl Sync for BufferLogger {}
|
|
||||||
|
|
||||||
impl Log for BufferLogger {
|
|
||||||
fn enabled(&self, _metadata: &log::Metadata) -> bool {
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
fn log(&self, record: &log::Record) {
|
|
||||||
if self.enabled(record.metadata()) {
|
|
||||||
let timestamp = unsafe {
|
|
||||||
GlobalTimer::get()
|
|
||||||
}.get_us().0;
|
|
||||||
let seconds = timestamp / 1_000_000;
|
|
||||||
let micros = timestamp % 1_000_000;
|
|
||||||
|
|
||||||
if record.level() <= self.buffer_log_level() {
|
|
||||||
let mut buffer = self.buffer.lock();
|
|
||||||
writeln!(buffer, "[{:6}.{:06}s] {:>5}({}): {}", seconds, micros,
|
|
||||||
record.level(), record.target(), record.args()).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
if record.level() <= self.uart_log_level() {
|
|
||||||
println!("[{:6}.{:06}s] {:>5}({}): {}", seconds, micros,
|
|
||||||
record.level(), record.target(), record.args());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn flush(&self) {
|
|
||||||
}
|
|
||||||
}
|
|
@ -24,7 +24,7 @@ use libconfig::Config;
|
|||||||
use libregister::RegisterW;
|
use libregister::RegisterW;
|
||||||
use libcortex_a9::l2c::enable_l2_cache;
|
use libcortex_a9::l2c::enable_l2_cache;
|
||||||
#[cfg(feature = "target_kasli_soc")]
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
use libboard_artiq::si5324;
|
use libboard_artiq::{si5324, logger};
|
||||||
|
|
||||||
mod proto_core_io;
|
mod proto_core_io;
|
||||||
mod proto_async;
|
mod proto_async;
|
||||||
@ -42,7 +42,6 @@ mod kernel;
|
|||||||
mod moninj;
|
mod moninj;
|
||||||
mod eh_artiq;
|
mod eh_artiq;
|
||||||
mod panic;
|
mod panic;
|
||||||
mod logger;
|
|
||||||
mod mgmt;
|
mod mgmt;
|
||||||
mod analyzer;
|
mod analyzer;
|
||||||
mod irq;
|
mod irq;
|
||||||
|
@ -6,7 +6,7 @@ use core::cell::RefCell;
|
|||||||
use alloc::{rc::Rc, vec::Vec, string::String};
|
use alloc::{rc::Rc, vec::Vec, string::String};
|
||||||
use log::{self, info, debug, warn, error, LevelFilter};
|
use log::{self, info, debug, warn, error, LevelFilter};
|
||||||
|
|
||||||
use crate::logger::{BufferLogger, LogBufferRef};
|
use libboard_artiq::logger::{BufferLogger, LogBufferRef};
|
||||||
use crate::proto_async::*;
|
use crate::proto_async::*;
|
||||||
use num_derive::FromPrimitive;
|
use num_derive::FromPrimitive;
|
||||||
use num_traits::FromPrimitive;
|
use num_traits::FromPrimitive;
|
||||||
|
@ -14,5 +14,10 @@ build_misoc = { path = "../libbuild_misoc" }
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = { version = "0.4", default-features = false }
|
log = { version = "0.4", default-features = false }
|
||||||
board_misoc = { path = "../libboard_misoc", features = ["uart_console", "log"] }
|
libboard_zynq = { git = "https://git.m-labs.hk/M-Labs/zynq-rs.git", features = ["ipv6"]}
|
||||||
board_artiq = { path = "../libboard_artiq" }
|
libsupport_zynq = { default-features = false, features = ["alloc_core"], git = "https://git.m-labs.hk/M-Labs/zynq-rs.git" }
|
||||||
|
libcortex_a9 = { git = "https://git.m-labs.hk/M-Labs/zynq-rs.git" }
|
||||||
|
libasync = { git = "https://git.m-labs.hk/M-Labs/zynq-rs.git" }
|
||||||
|
libregister = { git = "https://git.m-labs.hk/M-Labs/zynq-rs.git" }
|
||||||
|
libconfig = { git = "https://git.m-labs.hk/M-Labs/zynq-rs.git", features = ["ipv6"] }
|
||||||
|
libboard_artiq = { path = "../libboard_artiq" }
|
||||||
|
Loading…
Reference in New Issue
Block a user