use crate::bus::memory_map::*;
use crate::error::Error;
use crate::Bus;
mod data;
use data::*;
pub struct Sensors<'a> {
pub bus: &'a Bus,
}
impl<'a> Sensors<'a> {
pub fn new(bus: &Bus) -> Sensors {
Sensors { bus }
}
pub fn read_uv(&mut self) -> f32 {
const BUFFER_LENGTH: usize = get_buffer_length(UV_BYTES);
let mut data: [i32; BUFFER_LENGTH] = [0; BUFFER_LENGTH];
self.bus.read(
fpga_address::MCU + (mcu_offset::UV >> 1),
&mut data,
UV_BYTES,
);
data[2] as f32 / 1000.0
}
pub fn read_pressure(&mut self) -> Pressure {
const BUFFER_LENGTH: usize = get_buffer_length(PRESSURE_BYTES);
let mut data: [i32; BUFFER_LENGTH] = [0; BUFFER_LENGTH];
self.bus.read(
fpga_address::MCU + (mcu_offset::PRESSURE >> 1),
&mut data,
PRESSURE_BYTES,
);
Pressure {
pressure: data[3] as f32 / 1000.0,
altitude: data[2] as f32 / 1000.0,
temperature: data[4] as f32 / 1000.0,
}
}
pub fn read_humidity(&mut self) -> Humidity {
const BUFFER_LENGTH: usize = get_buffer_length(HUMIDITY_BYTES);
let mut data: [i32; BUFFER_LENGTH] = [0; BUFFER_LENGTH];
self.bus.read(
fpga_address::MCU + (mcu_offset::HUMIDITY >> 1),
&mut data,
HUMIDITY_BYTES,
);
Humidity {
humidity: data[2] as f32 / 1000.0,
temperature: data[3] as f32 / 1000.0,
}
}
pub fn read_imu(&mut self) -> Imu {
const BUFFER_LENGTH: usize = get_buffer_length(IMU_BYTES);
let mut data: [i32; BUFFER_LENGTH] = [0; BUFFER_LENGTH];
self.bus.read(
fpga_address::MCU + (mcu_offset::IMU >> 1),
&mut data,
IMU_BYTES,
);
Imu {
accel_x: data[2] as f32 / 1000.0,
accel_y: data[3] as f32 / 1000.0,
accel_z: data[4] as f32 / 1000.0,
gyro_x: data[5] as f32 / 1000.0,
gyro_y: data[6] as f32 / 1000.0,
gyro_z: data[7] as f32 / 1000.0,
mag_x: data[8] as f32 / 1000.0,
mag_y: data[9] as f32 / 1000.0,
mag_z: data[10] as f32 / 1000.0,
mag_offset_x: data[11] as f32 / 1000.0,
mag_offset_y: data[12] as f32 / 1000.0,
mag_offset_z: data[13] as f32 / 1000.0,
yaw: data[14] as f32 / 1000.0,
pitch: data[15] as f32 / 1000.0,
roll: data[16] as f32 / 1000.0,
}
}
}
const fn get_buffer_length(sensor_bytes: i32) -> usize {
(sensor_bytes / 4 + 2) as usize
}