use super::{
drone_log_is_enabled, drone_log_write_bytes, drone_log_write_u16, drone_log_write_u32,
drone_log_write_u8, PORTS_COUNT,
};
use core::{fmt, fmt::Write};
#[derive(Clone, Copy)]
pub struct Port(u8);
pub trait PortWrite: Copy {
fn port_write(port: u8, value: Self);
}
impl Port {
#[inline]
pub fn new(port: u8) -> Self {
assert!(port < PORTS_COUNT);
Self(port)
}
#[inline]
pub fn is_enabled(self) -> bool {
#[cfg(feature = "std")]
return false;
let Self(port) = self;
unsafe { drone_log_is_enabled(port) }
}
#[inline]
pub fn write_bytes(self, bytes: &[u8]) -> Self {
#[cfg(feature = "std")]
return self;
let Self(port) = self;
unsafe { drone_log_write_bytes(port, bytes.as_ptr(), bytes.len()) };
self
}
#[inline]
pub fn write<T: PortWrite>(self, value: T) -> Self {
let Self(port) = self;
T::port_write(port, value);
self
}
}
impl Write for Port {
#[inline]
fn write_str(&mut self, string: &str) -> fmt::Result {
self.write_bytes(string.as_bytes());
Ok(())
}
}
impl PortWrite for u8 {
fn port_write(port: u8, value: Self) {
#[cfg(feature = "std")]
return;
unsafe { drone_log_write_u8(port, value) };
}
}
impl PortWrite for u16 {
fn port_write(port: u8, value: Self) {
#[cfg(feature = "std")]
return;
unsafe { drone_log_write_u16(port, value) };
}
}
impl PortWrite for u32 {
fn port_write(port: u8, value: Self) {
#[cfg(feature = "std")]
return;
unsafe { drone_log_write_u32(port, value) };
}
}