fix some lints
This commit is contained in:
@@ -3,6 +3,11 @@ name = "picorom-rs"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
|
[lints.clippy]
|
||||||
|
pedantic = "warn"
|
||||||
|
nursery = "warn"
|
||||||
|
future-not-send = { level = "allow", priority = 10 }
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "picorom-rs"
|
name = "picorom-rs"
|
||||||
test = false
|
test = false
|
||||||
|
|||||||
36
src/main.rs
36
src/main.rs
@@ -11,7 +11,7 @@
|
|||||||
mod serial;
|
mod serial;
|
||||||
|
|
||||||
use core::{
|
use core::{
|
||||||
mem::{MaybeUninit, transmute},
|
mem::MaybeUninit,
|
||||||
sync::atomic::{AtomicU8, Ordering},
|
sync::atomic::{AtomicU8, Ordering},
|
||||||
task::Poll,
|
task::Poll,
|
||||||
};
|
};
|
||||||
@@ -342,12 +342,22 @@ async fn pio_task(
|
|||||||
fn store_rom(
|
fn store_rom(
|
||||||
flash: &mut Flash<'_, FLASH, impl flash::Mode, FLASH_SIZE>,
|
flash: &mut Flash<'_, FLASH, impl flash::Mode, FLASH_SIZE>,
|
||||||
) -> Result<(), flash::Error> {
|
) -> Result<(), flash::Error> {
|
||||||
let offset =
|
let offset = unsafe {
|
||||||
unsafe { (INIT_ROM_DATA.as_ptr() as *const u32).offset_from_unsigned(FLASH_BASE) as u32 };
|
u32::try_from(
|
||||||
|
INIT_ROM_DATA
|
||||||
|
.as_ptr()
|
||||||
|
.cast::<u8>()
|
||||||
|
.offset_from_unsigned(FLASH_BASE.cast::<u8>()),
|
||||||
|
)
|
||||||
|
.map_err(|_| flash::Error::OutOfBounds)?
|
||||||
|
};
|
||||||
let len = size_of_val(&INIT_ROM_DATA).min(ROM_DATA.len());
|
let len = size_of_val(&INIT_ROM_DATA).min(ROM_DATA.len());
|
||||||
defmt::info!("Erasing flash at offset {:#x} with size {:#x}", offset, len);
|
defmt::info!("Erasing flash at offset {:#x} with size {:#x}", offset, len);
|
||||||
flash.blocking_erase(offset, offset + len as u32)?;
|
flash.blocking_erase(
|
||||||
let rom_buffer = unsafe { transmute::<&[AtomicU8], &[u8]>(&ROM_DATA[..len]) };
|
offset,
|
||||||
|
offset + u32::try_from(len).map_err(|_| flash::Error::OutOfBounds)?,
|
||||||
|
)?;
|
||||||
|
let rom_buffer = unsafe { &*(&raw const ROM_DATA[..len] as *const [u8]) };
|
||||||
defmt::info!("Programming flash with buffer at {}", rom_buffer.as_ptr());
|
defmt::info!("Programming flash with buffer at {}", rom_buffer.as_ptr());
|
||||||
flash.blocking_write(offset, rom_buffer)?;
|
flash.blocking_write(offset, rom_buffer)?;
|
||||||
defmt::info!("Successfully commited rom to flash");
|
defmt::info!("Successfully commited rom to flash");
|
||||||
@@ -357,12 +367,22 @@ fn store_rom(
|
|||||||
fn load_rom(
|
fn load_rom(
|
||||||
flash: &mut Flash<'_, FLASH, impl flash::Mode, FLASH_SIZE>,
|
flash: &mut Flash<'_, FLASH, impl flash::Mode, FLASH_SIZE>,
|
||||||
) -> Result<(), flash::Error> {
|
) -> Result<(), flash::Error> {
|
||||||
let offset =
|
let offset = unsafe {
|
||||||
unsafe { (INIT_ROM_DATA.as_ptr() as *const u32).offset_from_unsigned(FLASH_BASE) as u32 };
|
u32::try_from(
|
||||||
|
INIT_ROM_DATA
|
||||||
|
.as_ptr()
|
||||||
|
.cast::<u8>()
|
||||||
|
.offset_from_unsigned(FLASH_BASE.cast::<u8>()),
|
||||||
|
)
|
||||||
|
.map_err(|_| flash::Error::OutOfBounds)?
|
||||||
|
};
|
||||||
let len = size_of_val(&INIT_ROM_DATA).min(ROM_DATA.len());
|
let len = size_of_val(&INIT_ROM_DATA).min(ROM_DATA.len());
|
||||||
for (i, rom) in ROM_DATA.iter().enumerate().take(len) {
|
for (i, rom) in ROM_DATA.iter().enumerate().take(len) {
|
||||||
let mut init = [0u8];
|
let mut init = [0u8];
|
||||||
flash.blocking_read(offset + i as u32, &mut init)?;
|
flash.blocking_read(
|
||||||
|
offset + u32::try_from(i).map_err(|_| flash::Error::OutOfBounds)?,
|
||||||
|
&mut init,
|
||||||
|
)?;
|
||||||
let init = init[0];
|
let init = init[0];
|
||||||
rom.store(init, Ordering::SeqCst);
|
rom.store(init, Ordering::SeqCst);
|
||||||
}
|
}
|
||||||
|
|||||||
176
src/serial.rs
176
src/serial.rs
@@ -197,91 +197,8 @@ impl Link {
|
|||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
Kind::ParameterGet => match &packet.payload[..] {
|
Kind::ParameterGet => Some(self.get_parameter(packet)),
|
||||||
b"name\0" => Some(Packet {
|
Kind::ParameterSet => Some(self.set_parameter(packet)),
|
||||||
kind: Kind::Parameter,
|
|
||||||
payload: self.name.clone().into_bytes(),
|
|
||||||
}),
|
|
||||||
b"addr_mask\0" => Some(Packet {
|
|
||||||
kind: Kind::Parameter,
|
|
||||||
payload: Vec::from_array(*b"0x7fff"),
|
|
||||||
}),
|
|
||||||
b"rom_name\0" => Some(Packet {
|
|
||||||
kind: Kind::Parameter,
|
|
||||||
payload: self.rom_name.clone().into_bytes(),
|
|
||||||
}),
|
|
||||||
payload => {
|
|
||||||
if let Ok(name) = str::from_utf8(payload) {
|
|
||||||
defmt::warn!("Got unknonwn parameter request: {}", name);
|
|
||||||
} else {
|
|
||||||
defmt::warn!("Got unknonw parameter request: {}", payload);
|
|
||||||
}
|
|
||||||
Some(Packet {
|
|
||||||
kind: Kind::ParameterError,
|
|
||||||
payload: Vec::new(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Kind::ParameterSet => {
|
|
||||||
let mut parts = packet.payload.split(|b| *b == b',');
|
|
||||||
let Some(name) = parts.next() else {
|
|
||||||
return Some(Packet {
|
|
||||||
kind: Kind::ParameterError,
|
|
||||||
payload: Vec::new(),
|
|
||||||
});
|
|
||||||
};
|
|
||||||
let Some(value) = parts.next() else {
|
|
||||||
return Some(Packet {
|
|
||||||
kind: Kind::ParameterError,
|
|
||||||
payload: Vec::new(),
|
|
||||||
});
|
|
||||||
};
|
|
||||||
match name {
|
|
||||||
b"name" => {
|
|
||||||
let Ok(value) = str::from_utf8(value) else {
|
|
||||||
return Some(Packet {
|
|
||||||
kind: Kind::ParameterError,
|
|
||||||
payload: Vec::new(),
|
|
||||||
});
|
|
||||||
};
|
|
||||||
self.name.clear();
|
|
||||||
let _ = self.name.push_str(value);
|
|
||||||
Some(Packet {
|
|
||||||
kind: Kind::Parameter,
|
|
||||||
payload: self.name.clone().into_bytes(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
b"addr_mask" => Some(Packet {
|
|
||||||
kind: Kind::Parameter,
|
|
||||||
payload: Vec::from_array(*b"0x7fff"),
|
|
||||||
}),
|
|
||||||
b"rom_name" => {
|
|
||||||
let Ok(value) = str::from_utf8(value) else {
|
|
||||||
return Some(Packet {
|
|
||||||
kind: Kind::ParameterError,
|
|
||||||
payload: Vec::new(),
|
|
||||||
});
|
|
||||||
};
|
|
||||||
self.rom_name.clear();
|
|
||||||
let _ = self.rom_name.push_str(value);
|
|
||||||
Some(Packet {
|
|
||||||
kind: Kind::Parameter,
|
|
||||||
payload: self.rom_name.clone().into_bytes(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
payload => {
|
|
||||||
if let Ok(name) = str::from_utf8(payload) {
|
|
||||||
defmt::warn!("Got unknonwn parameter request: {}", name);
|
|
||||||
} else {
|
|
||||||
defmt::warn!("Got unknonw parameter request: {}", payload);
|
|
||||||
}
|
|
||||||
Some(Packet {
|
|
||||||
kind: Kind::ParameterError,
|
|
||||||
payload: Vec::new(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Kind::CommitFlash => {
|
Kind::CommitFlash => {
|
||||||
if let Err(e) = store_rom(flash) {
|
if let Err(e) = store_rom(flash) {
|
||||||
defmt::error!("Unable to commit rom to flash: {}", e);
|
defmt::error!("Unable to commit rom to flash: {}", e);
|
||||||
@@ -296,4 +213,93 @@ impl Link {
|
|||||||
_ => Some(Packet::error(b"Unrecognized packet")),
|
_ => Some(Packet::error(b"Unrecognized packet")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn set_parameter(&mut self, packet: &Packet) -> Packet {
|
||||||
|
let mut parts = packet.payload.split(|b| *b == b',');
|
||||||
|
let Some(name) = parts.next() else {
|
||||||
|
return Packet {
|
||||||
|
kind: Kind::ParameterError,
|
||||||
|
payload: Vec::new(),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
let Some(value) = parts.next() else {
|
||||||
|
return Packet {
|
||||||
|
kind: Kind::ParameterError,
|
||||||
|
payload: Vec::new(),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
match name {
|
||||||
|
b"name" => {
|
||||||
|
let Ok(value) = str::from_utf8(value) else {
|
||||||
|
return Packet {
|
||||||
|
kind: Kind::ParameterError,
|
||||||
|
payload: Vec::new(),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
self.name.clear();
|
||||||
|
let _ = self.name.push_str(value);
|
||||||
|
Packet {
|
||||||
|
kind: Kind::Parameter,
|
||||||
|
payload: self.name.clone().into_bytes(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b"addr_mask" => Packet {
|
||||||
|
kind: Kind::Parameter,
|
||||||
|
payload: Vec::from_array(*b"0x7fff"),
|
||||||
|
},
|
||||||
|
b"rom_name" => {
|
||||||
|
let Ok(value) = str::from_utf8(value) else {
|
||||||
|
return Packet {
|
||||||
|
kind: Kind::ParameterError,
|
||||||
|
payload: Vec::new(),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
self.rom_name.clear();
|
||||||
|
let _ = self.rom_name.push_str(value);
|
||||||
|
Packet {
|
||||||
|
kind: Kind::Parameter,
|
||||||
|
payload: self.rom_name.clone().into_bytes(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
payload => {
|
||||||
|
if let Ok(name) = str::from_utf8(payload) {
|
||||||
|
defmt::warn!("Got unknonwn parameter request: {}", name);
|
||||||
|
} else {
|
||||||
|
defmt::warn!("Got unknonw parameter request: {}", payload);
|
||||||
|
}
|
||||||
|
Packet {
|
||||||
|
kind: Kind::ParameterError,
|
||||||
|
payload: Vec::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_parameter(&self, packet: &Packet) -> Packet {
|
||||||
|
match &packet.payload[..] {
|
||||||
|
b"name\0" => Packet {
|
||||||
|
kind: Kind::Parameter,
|
||||||
|
payload: self.name.clone().into_bytes(),
|
||||||
|
},
|
||||||
|
b"addr_mask\0" => Packet {
|
||||||
|
kind: Kind::Parameter,
|
||||||
|
payload: Vec::from_array(*b"0x7fff"),
|
||||||
|
},
|
||||||
|
b"rom_name\0" => Packet {
|
||||||
|
kind: Kind::Parameter,
|
||||||
|
payload: self.rom_name.clone().into_bytes(),
|
||||||
|
},
|
||||||
|
payload => {
|
||||||
|
if let Ok(name) = str::from_utf8(payload) {
|
||||||
|
defmt::warn!("Got unknonwn parameter request: {}", name);
|
||||||
|
} else {
|
||||||
|
defmt::warn!("Got unknonw parameter request: {}", payload);
|
||||||
|
}
|
||||||
|
Packet {
|
||||||
|
kind: Kind::ParameterError,
|
||||||
|
payload: Vec::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user