use core::marker::PhantomData;
use core::ops::Deref;
use nrf52832_hal::target_constants::EASY_DMA_SIZE;
use heapless::{ArrayLength, Vec};
use postcard::to_vec_cobs;
use serde::Serialize;
use crate::private::*;
use crate::BinMessage;
use crate::LogOnLine;
use crate::Logger;
use crate::Receiver;
pub trait Sender: Default + Sealed {}
pub struct NullSender;
impl Sender for NullSender {}
pub struct RealSender<T, BUFSZ>
where
BUFSZ: ArrayLength<u8>,
{
_t: PhantomData<T>,
_b: PhantomData<BUFSZ>,
}
impl<T, BUFSZ> Sender for RealSender<T, BUFSZ>
where
T: Serialize,
BUFSZ: ArrayLength<u8>,
{
}
impl Default for NullSender {
fn default() -> Self {
NullSender
}
}
impl<T, BUFSZ> Default for RealSender<T, BUFSZ>
where
T: Serialize,
BUFSZ: ArrayLength<u8>,
{
fn default() -> Self {
RealSender {
_t: PhantomData,
_b: PhantomData,
}
}
}
impl<RECV, T, BUFSZ> Logger<RealSender<T, BUFSZ>, RECV>
where
T: Serialize,
BUFSZ: ArrayLength<u8>,
RECV: Receiver + Default,
{
pub fn log(&mut self, data: &str) -> Result<(), ()> {
self.send(&LogOnLine::Log(data))
}
pub fn warn(&mut self, data: &str) -> Result<(), ()> {
self.send(&LogOnLine::Warn(data))
}
pub fn error(&mut self, data: &str) -> Result<(), ()> {
self.send(&LogOnLine::Error(data))
}
pub fn raw_bin(&mut self, description: &str, data: &[u8]) -> Result<(), ()> {
self.send(&LogOnLine::BinaryRaw(BinMessage { description, data }))
}
pub fn data(&mut self, data: T) -> Result<(), ()> {
self.send(&LogOnLine::ProtocolMessage(data))
}
fn send(&mut self, msg: &LogOnLine<T>) -> Result<(), ()> {
let vec: Vec<u8, BUFSZ> = to_vec_cobs(msg).map_err(|_| ())?;
for c in vec.deref().chunks(EASY_DMA_SIZE) {
self.uart.write(c).map_err(|_| ())?;
}
Ok(())
}
}