реклама
Бургер менюБургер меню

Руслан Жук – Искра надежды 2 (страница 5)

18

impl PhotonicCore {

pub fn open() -> std::io::Result<Self> {

let fd = OpenOptions::new()

.read(true)

.write(true)

.open("/dev/photonic_core")?;

Ok(Self { fd })

}

pub fn set_modulation(&self, params: &ModulationParams) -> std::io::Result<()> {

let ret = unsafe {

ioctl(

self.fd.as_raw_fd(),

IOCTL_SET_MODULATION,

params as *const _ as *const libc::c_void,

)

};

if ret < 0 {

Err(std::io::Error::last_os_error())

} else {

Ok(())

}

}

pub fn get_gain(&self) -> std::io::Result<u32> {

let mut gain: u32 = 0;

let ret = unsafe {

ioctl(

self.fd.as_raw_fd(),

IOCTL_GET_GAIN,

&mut gain as *mut _ as *mut libc::c_void,

)

};

if ret < 0 {

Err(std::io::Error::last_os_error())

} else {

Ok(gain)

}

}

}

// Фрактальный генератор на Rust

pub struct FractalGenerator {

z_real: [u64; 4],

z_imag: [u64; 4],

c_real: [u64; 4],

c_imag: [u64; 4],

}

impl FractalGenerator {

pub fn new(key: &[u8; 64]) -> Self {

// Преобразование ключа в 60-ричные цифры

let mut c_real = [0u64; 4];

let mut c_imag = [0u64; 4];

for i in 0..8 {

// Простое преобразование для примера

c_real[i/2] |= (key[i] as u64) << (8 * (i % 2));

c_imag[i/2] |= (key[i+8] as u64) << (8 * (i % 2));

}

Self {

z_real: [0; 4],

z_imag: [0; 4],

c_real,

c_imag,

}

}

pub fn next(&mut self) -> (u64, u64) {

// Одна итерация Мандельброта

// Упрощённо: Z = Z^2 + C