1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
use super::{
consts::{OS_1_BEAM_ALTITUDE_DEGREES, OS_1_BEAM_AZIMUTH_DEGREE_CORRECTIONS, PIXELS_PER_COLUMN},
enums::LidarMode,
};
use anyhow::Result;
use derivative::Derivative;
use serde::{Deserialize, Serialize};
use serde_big_array::big_array;
use std::{
fmt::{Debug, Error as FormatError, Formatter},
fs::File,
io::Read,
path::Path,
};
big_array! { BigArray; }
#[derive(Clone, Serialize, Deserialize, Derivative)]
#[derivative(Debug)]
pub struct Config {
#[serde(with = "BigArray")]
#[derivative(Debug(format_with = "self::large_array_fmt"))]
pub beam_altitude_angles: [f64; PIXELS_PER_COLUMN],
#[serde(with = "BigArray", rename = "beam_azimuth_angles")]
#[derivative(Debug(format_with = "self::large_array_fmt"))]
pub beam_azimuth_angle_corrections: [f64; PIXELS_PER_COLUMN],
pub lidar_mode: LidarMode,
}
impl Config {
pub fn new(
beam_altitude_angles: [f64; PIXELS_PER_COLUMN],
beam_azimuth_angle_corrections: [f64; PIXELS_PER_COLUMN],
lidar_mode: LidarMode,
) -> Config {
Config {
beam_altitude_angles,
beam_azimuth_angle_corrections,
lidar_mode,
}
}
pub fn from_path<P: AsRef<Path>>(path: P) -> Result<Config> {
let file = File::open(path.as_ref())?;
let ret = Self::from_reader(file)?;
Ok(ret)
}
pub fn from_reader<R: Read>(reader: R) -> Result<Config> {
let ret = serde_json::de::from_reader(reader)?;
Ok(ret)
}
pub fn from_json_str(data: &str) -> Result<Config> {
let ret = serde_json::from_str(data)?;
Ok(ret)
}
pub fn beam_azimuth_angle_corrections(
&mut self,
beam_azimuth_angle_corrections: [f64; PIXELS_PER_COLUMN],
) {
self.beam_azimuth_angle_corrections = beam_azimuth_angle_corrections;
}
pub fn beam_altitude_angles(&mut self, beam_altitude_angles: [f64; PIXELS_PER_COLUMN]) {
self.beam_altitude_angles = beam_altitude_angles;
}
pub fn lidar_mode(&mut self, lidar_mode: LidarMode) {
self.lidar_mode = lidar_mode;
}
pub fn os_1_config() -> Self {
let beam_altitude_angles = OS_1_BEAM_ALTITUDE_DEGREES;
let beam_azimuth_angle_corrections = OS_1_BEAM_AZIMUTH_DEGREE_CORRECTIONS;
Self {
beam_altitude_angles,
beam_azimuth_angle_corrections,
lidar_mode: LidarMode::Mode1024x10,
}
}
}
pub(crate) fn large_array_fmt<T: Debug>(
array: &[T; PIXELS_PER_COLUMN],
formatter: &mut Formatter,
) -> Result<(), FormatError> {
write!(formatter, "{:?}", array as &[_])
}