#[allow(unused_imports)]
use defmt::{debug, error, info, trace, warn};
use embedded_hal::blocking::delay::DelayMs;
use embedded_hal::blocking::i2c::{Read, SevenBitAddress, Write};
use serde::{Deserialize, Serialize};
use super::{FutureResponse, NoteError, Notecard};
pub struct NTN<'a, IOM: Write<SevenBitAddress> + Read<SevenBitAddress>, const BS: usize> {
note: &'a mut Notecard<IOM, BS>,
}
#[derive(Clone, Copy, defmt::Format)]
pub enum NtnSetGps {
Notecard,
Starnote,
}
impl<'a, IOM: Write<SevenBitAddress> + Read<SevenBitAddress>, const BS: usize> NTN<'a, IOM, BS> {
pub fn from(note: &mut Notecard<IOM, BS>) -> NTN<'_, IOM, BS> {
NTN { note }
}
pub fn reset<const PS: usize>(
self,
delay: &mut impl DelayMs<u16>,
) -> Result<FutureResponse<'a, res::Empty, IOM, BS>, NoteError> {
self.note.request_raw(delay, b"{\"req\":\"ntn.reset\"}\n")?;
Ok(FutureResponse::from(self.note))
}
pub fn status(
self,
delay: &mut impl DelayMs<u16>,
) -> Result<FutureResponse<'a, res::Status, IOM, BS>, NoteError> {
self.note
.request_raw(delay, b"{\"req\":\"ntn.status\"}\n")?;
Ok(FutureResponse::from(self.note))
}
pub fn gps(
self,
delay: &mut impl DelayMs<u16>,
gps: Option<NtnSetGps>,
) -> Result<FutureResponse<'a, res::Gps, IOM, BS>, NoteError> {
self.note.request(
delay,
req::Gps {
req: "ntn.gps",
on: gps.map(|g| matches!(g, NtnSetGps::Notecard)),
off: gps.map(|g| matches!(g, NtnSetGps::Starnote)),
},
)?;
Ok(FutureResponse::from(self.note))
}
}
pub mod req {
use super::*;
#[derive(Deserialize, Serialize, Debug, defmt::Format, Default)]
pub struct Gps {
pub req: &'static str,
#[serde(skip_serializing_if = "Option::is_none")]
pub on: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub off: Option<bool>,
}
}
pub mod res {
use super::*;
#[derive(Deserialize, Debug, defmt::Format)]
pub struct Empty {}
#[derive(Deserialize, Serialize, Debug, defmt::Format, Default)]
pub struct Gps {
#[serde(skip_serializing_if = "Option::is_none")]
pub on: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub off: Option<bool>,
}
#[derive(Deserialize, Debug, defmt::Format)]
pub struct Status {
pub err: Option<heapless::String<120>>,
pub status: Option<heapless::String<120>>,
}
}