diff --git a/src/drivers/drv_disk.rs b/src/drivers/drv_disk.rs index 1935fb7..a824ad3 100644 --- a/src/drivers/drv_disk.rs +++ b/src/drivers/drv_disk.rs @@ -38,6 +38,34 @@ impl DrvDisk { _ => (), } } + + /// read inside the disk + /// + /// ### Parameters + /// + /// - **self** driver disk + /// - **sector_number** sector where to read the data + /// - **data** where the readed data will be stored + pub fn read_multiple_sector(&mut self, sector_number: i32, data: &mut [u8]) { + match Disk::read_multiple_request(&mut self.disk, sector_number, data) { + Err(e) => println!("{:?}", e), + _ => (), + } + } + + /// write inside the disk + /// + /// ### Parameters + /// + /// - **self** driver disk + /// - **sector_number** sector where to write the data + /// - **data** where the data to write is stored + pub fn write_multiple_sector(&mut self, sector_number: i32, data: &[u8]) { + match Disk::write_multiple_request(&mut self.disk, sector_number, data) { + Err(e) => println!("{:?}", e), + _ => (), + } + } } #[cfg(test)] diff --git a/src/simulator/disk.rs b/src/simulator/disk.rs index 0b2f131..a52cad3 100644 --- a/src/simulator/disk.rs +++ b/src/simulator/disk.rs @@ -132,12 +132,7 @@ impl Disk { /// - **sector_number** sector where to write the data /// - **data** where the data to write is stored /// - pub fn write_request( - disk: &mut Disk, - sector_number: i32, - //data: &mut Vec, - data: &[u8], - ) -> io::Result<()> { + pub fn write_request(disk: &mut Disk,sector_number: i32,data: &[u8]) -> io::Result<()> { if disk.active { panic!("Only one request at time"); } @@ -170,6 +165,61 @@ impl Disk { disk.active = false; Ok(()) } + + + /// read data from a disk, at a certain sector number + /// on lit de un à plusieurs secteurs + /// `panic!` when the disk is already active or the sector number is impossible + /// + /// ### parameters + /// + /// - **disk** to read from + /// - **sector_number** sector where to read the data + /// - **data** where the readed data will be stored + pub fn read_multiple_request(disk: &mut Disk, sector_number: i32, data: &mut [u8]) -> io::Result<()> { + + if data.len() < (SECTOR_SIZE as usize) { + panic!("disk::read_multiple_request, param slice smaller than one sector") + } + + //ex SECTOR_SIZE = 4, data.len = 27, number_sector_to_read = 27 - (27%4) = 27 - 3 = 24 = 6*4, soit 6 secteurs + let number_sector_to_read = data.len() - (data.len()%(SECTOR_SIZE as usize)); + + //ex on lit 4 secteurs ce qui donne data[0..4],data[4..8],data[8..12],data[12..16] + + for i in 0..number_sector_to_read { + Disk::read_request(disk, sector_number + (i as i32), &mut data[(i*(SECTOR_SIZE as usize))..((i+1)*(SECTOR_SIZE as usize))]); + } + + Ok(()) + } + + /// write data into a disk, at a certain sector number + /// on écrit de un à plusieurs secteurs + /// `panic!` when the disk is already active or the sector number is impossible + /// + /// ### parameters + /// + /// - **disk** to write data into + /// - **sector_number** sector where to write the data + /// - **data** where the data to write is stored + /// + pub fn write_multiple_request(disk: &mut Disk,sector_number: i32,data: &[u8]) -> io::Result<()> { + + if data.len() < (SECTOR_SIZE as usize) { + panic!("disk::read_multiple_request, param slice smaller than one sector") + } + + let number_sector_to_read = data.len() - (data.len()%(SECTOR_SIZE as usize)); + + //ex on ecrit 4 secteurs ce qui donne data[0..4],data[4..8],data[8..12],data[12..16] + + for i in 0..number_sector_to_read { + Disk::write_request(disk, sector_number + (i as i32), &data[(i*(SECTOR_SIZE as usize))..((i+1)*(SECTOR_SIZE as usize))]); + } + + Ok(()) + } } pub fn stupid_fct(buf: &[u8]) {