#![no_std]
use embedded_shadow::prelude::*;
pub fn main() {
let storage = ShadowStorageBuilder::new()
.total_size::<512>()
.block_size::<32>()
.block_count::<16>()
.default_access()
.no_persist()
.build();
let staging_buffer = PatchStagingBuffer::<256, 16>::new();
let staged_storage = storage.with_staging(staging_buffer);
let host = staged_storage.host_shadow();
host.with_view(|view| {
view.write_range(0x00, &[0xAA; 8]).unwrap();
view.write_range_staged(0x00, &[0x11, 0x22, 0x33, 0x44])
.unwrap();
view.write_range_staged(0x10, &[0x55, 0x66, 0x77, 0x88])
.unwrap();
let mut buffer = [0u8; 8];
view.read_range_overlay(0x00, &mut buffer).unwrap();
assert_eq!(&buffer[0..4], &[0x11, 0x22, 0x33, 0x44]); assert_eq!(&buffer[4..8], &[0xAA; 4]);
view.read_range(0x00, &mut buffer).unwrap();
assert_eq!(buffer, [0xAA; 8]);
view.commit().unwrap();
view.read_range(0x00, &mut buffer).unwrap();
assert_eq!(&buffer[0..4], &[0x11, 0x22, 0x33, 0x44]); });
host.with_view(|view| {
view.write_range_staged(0x100, &[0x01, 0x02]).unwrap();
view.write_range_staged(0x102, &[0x03, 0x04]).unwrap();
view.write_range_staged(0x104, &[0x05, 0x06]).unwrap();
let mut buffer = [0u8; 6];
view.read_range_overlay(0x100, &mut buffer).unwrap();
assert_eq!(buffer, [0x01, 0x02, 0x03, 0x04, 0x05, 0x06]);
});
host.with_view(|view| {
let mut buffer = [0u8; 6];
view.read_range(0x100, &mut buffer).unwrap();
assert_eq!(buffer, [0u8; 6]); });
host.with_view(|view| {
view.write_range(0x180, &[0xFF; 16]).unwrap();
view.write_range_staged(0x180, &[0x01, 0x02, 0x03, 0x04])
.unwrap();
view.write_range_staged(0x182, &[0xAA, 0xBB]).unwrap();
let mut buffer = [0u8; 8];
view.read_range_overlay(0x180, &mut buffer).unwrap();
assert_eq!(&buffer[0..2], &[0x01, 0x02]); assert_eq!(&buffer[2..4], &[0xAA, 0xBB]); assert_eq!(&buffer[4..8], &[0xFF; 4]);
view.commit().unwrap();
});
host.with_view(|view| {
let mut total_staged = 0;
for i in 0..20 {
let addr = (i * 16) as u16;
let data = [(i + 1) as u8; 8];
match view.write_range_staged(addr, &data) {
Ok(()) => total_staged += 1,
Err(ShadowError::StageFull) => break,
Err(e) => panic!("Unexpected error: {:?}", e),
}
}
assert!(total_staged > 0);
assert!(total_staged < 20);
});
}
#[cfg(test)]
mod tests {
#[test]
fn test_staging_example() {
super::main();
}
}