Don't panic in get_sample_rate
This commit is contained in:
parent
b2f3f482bb
commit
68bfa54e72
1 changed files with 49 additions and 37 deletions
86
src/main.rs
86
src/main.rs
|
|
@ -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> {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue