Руслан Жук – Искра надежды 2 (страница 5)
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