#![no_std]
mod command;
use command::Command;
mod version;
use embedded_hal::i2c::Operation;
pub use version::Version;
mod status;
pub use status::Status;
#[repr(u8)]
#[derive(Copy, Clone, Debug, Default)]
pub enum DeviceAddr {
#[default]
ADDR1 = 0x2A,
ADDR2 = 0x29,
}
#[derive(Debug)]
pub struct OpenLogger<I2C> {
address: DeviceAddr,
i2c: I2C,
}
impl<I2C> OpenLogger<I2C>
where
I2C: embedded_hal::i2c::I2c,
{
pub fn new(address: DeviceAddr, i2c: I2C) -> Self {
Self { i2c, address }
}
pub fn new_and_validate(address: DeviceAddr, i2c: I2C) -> Result<Self, I2C::Error> {
let mut logger = Self::new(address, i2c);
let status = logger.get_status()?;
if !status.init_ok() {
todo!("find the correct error type");
}
Ok(logger)
}
pub fn get_version(&mut self) -> Result<Version, I2C::Error> {
let mut major = [0u8; 2];
self.i2c.write_read(
self.address as u8,
&Command::FirmwareMajor.as_bytes(),
&mut major,
)?;
let mut minor = [0u8; 2];
self.i2c.write_read(
self.address as u8,
&Command::FirmwareMinor.as_bytes(),
&mut minor,
)?;
Ok(Version {
major: major[0],
minor: minor[0],
})
}
pub fn get_status(&mut self) -> Result<Status, I2C::Error> {
let mut result = [0u8; 1];
self.i2c
.write_read(self.address as u8, &Command::Status.as_bytes(), &mut result)?;
Ok(Status::from(result[0]))
}
pub fn make_directory(&mut self, directory: &str) -> Result<(), I2C::Error> {
let command = Command::MkDir.as_bytes();
let mut operations = [
Operation::Write(&command),
Operation::Write(directory.as_bytes()),
];
self.i2c.transaction(self.address as u8, &mut operations)
}
pub fn append(&mut self, file: &str) -> Result<(), I2C::Error> {
let command = Command::OpenFile.as_bytes();
let mut operations = [
Operation::Write(&command),
Operation::Write(file.as_bytes()),
];
self.i2c.transaction(self.address as u8, &mut operations)
}
pub fn create(&mut self, file: &str) -> Result<(), I2C::Error> {
let command = Command::CreateFile.as_bytes();
let mut operations = [
Operation::Write(&command),
Operation::Write(file.as_bytes()),
];
self.i2c.transaction(self.address as u8, &mut operations)
}
}