Don't panic in get_sample_rate

This commit is contained in:
Данила Горнушко 2024-06-06 17:57:01 +03:00
parent b2f3f482bb
commit 68bfa54e72

View file

@ -485,20 +485,23 @@ fn get_stats(port: &mut Box<dyn SerialPort>, id: u32) -> StatsOptions {
None => return StatsOptions::None,
};
let split: Vec<&str> = response.trim_matches(char::from(0)).split_whitespace().collect();
let split: Vec<&str> = response
.trim_matches(char::from(0))
.split_whitespace()
.collect();
let mut nums: Vec<u32> = Vec::with_capacity(5);
for i in split {
let num: Result<u32, _> = i.parse();
match num {
Ok(num) => nums.push(num),
Err(_) => {
debug!("Can't parse '{i}' as u32");
return StatsOptions::None
return StatsOptions::None;
}
}
}
match nums.len() {
2 => StatsOptions::Stats(Stats10Min {
hail: nums[0],
@ -544,19 +547,38 @@ fn get_set_param(
}
fn get_sample_rate(port: &mut Box<dyn SerialPort>, id: u32) -> u32 {
fn fallback() -> u32 {
let fallback_freq = 200_000;
info!(
"Using fallback ADC sample rate: {}",
nice_freq_string(fallback_freq)
);
fallback_freq
}
let command = format!("@{} srate\n", id);
let response = process_command(port, command).unwrap_or_default();
let mut split = response.split_whitespace();
let adc_div: u32 = split
.next()
.expect("Failed to parse adc_div")
.parse()
.expect("Failed to parse adc_div");
let adc_sample_time: i32 = split
.next()
.expect("Failed to parse adc_sample_time")
.parse()
.expect("Failed to parse adc_sample_time");
let response: String;
if let Some(res) = process_command(port, command) {
response = res;
} else {
return fallback();
}
let response_vec: Vec<&str> = response.split_whitespace().collect();
if response_vec.len() != 2 {
return fallback();
}
let adc_div: u32;
let adc_sample_time: i32;
if let Ok(res) = response_vec[0].parse() {
adc_div = res;
} else {
return fallback();
}
if let Ok(res) = response_vec[1].parse() {
adc_sample_time = res;
} else {
return fallback();
}
let sample_times: HashMap<i32, Option<f64>> = [
(-1, None),
(0, Some(1.5)),
@ -581,34 +603,24 @@ fn get_sample_rate(port: &mut Box<dyn SerialPort>, id: u32) -> u32 {
.iter()
.cloned()
.collect();
let fallback_freq = 200_000;
let mut use_fallback = false;
if !sample_times.contains_key(&adc_sample_time) {
error!("Received invalid ADC sample time!");
use_fallback = true;
return fallback();
} else if sample_times[&adc_sample_time].is_none() {
error!("ADC sample time not supported");
use_fallback = true;
return fallback();
} else if !adc_div_dict.contains_key(&adc_div) {
error!("Received invalid ADC divider");
use_fallback = true;
}
if use_fallback {
info!(
"Using fallback ADC sample rate: {}",
nice_freq_string(fallback_freq)
);
fallback_freq
} else {
let adc_div_val = adc_div_dict[&adc_div];
let adc_sample_time_val = sample_times[&adc_sample_time].unwrap_or_default();
let res = ((16_000_000.0 / adc_div_val as f64) / (adc_sample_time_val + 12.5)) as u32;
info!(
"Using calculated ADC sample rate: {}",
nice_freq_string(res)
);
res
return fallback();
}
let adc_div_val = adc_div_dict[&adc_div];
let adc_sample_time_val = sample_times[&adc_sample_time].unwrap_or_default();
let res = ((16_000_000.0 / adc_div_val as f64) / (adc_sample_time_val + 12.5)) as u32;
info!(
"Using calculated ADC sample rate: {}",
nice_freq_string(res)
);
res
}
fn process_command(port: &mut Box<dyn SerialPort>, command: String) -> Option<String> {