signal_generator: fix config conversion, clarify
This commit is contained in:
parent
0d6402e81a
commit
f4fd752d54
|
@ -55,28 +55,43 @@ impl Default for BasicConfig {
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
/// The provided amplitude is out-of-range.
|
/// The provided amplitude is out-of-range.
|
||||||
InvalidAmplitude,
|
InvalidAmplitude,
|
||||||
|
/// The provided symmetry is out of range.
|
||||||
|
InvalidSymmetry,
|
||||||
|
/// The provided frequency is out of range.
|
||||||
|
InvalidFrequency,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<BasicConfig> for Config {
|
impl TryFrom<BasicConfig> for Config {
|
||||||
type Error = Error;
|
type Error = Error;
|
||||||
|
|
||||||
fn try_from(config: BasicConfig) -> Result<Config, Error> {
|
fn try_from(config: BasicConfig) -> Result<Config, Error> {
|
||||||
// Calculate the frequency tuning words
|
// Validate symmetry
|
||||||
let frequency_tuning_word: [u32; 2] = {
|
if config.symmetry < 0.0 || config.symmetry > 1.0 {
|
||||||
|
return Err(Error::InvalidSymmetry);
|
||||||
|
}
|
||||||
|
|
||||||
const LSB_PER_HERTZ: f32 = (1u64 << (31 + ADC_SAMPLE_TICKS_LOG2))
|
const LSB_PER_HERTZ: f32 = (1u64 << (31 + ADC_SAMPLE_TICKS_LOG2))
|
||||||
as f32
|
as f32
|
||||||
/ (TIMER_FREQUENCY.0 * 1_000_000) as f32;
|
/ (TIMER_FREQUENCY.0 * 1_000_000) as f32;
|
||||||
let ftw = config.frequency * LSB_PER_HERTZ;
|
let ftw = config.frequency * LSB_PER_HERTZ;
|
||||||
|
|
||||||
if config.symmetry <= ftw / u32::MAX as f32 {
|
// Validate base frequency tuning word to be below Nyquist.
|
||||||
[1u32 << 31, ftw as u32]
|
const NYQUIST: f32 = (1u32 << 31) as _;
|
||||||
} else if 1. - config.symmetry <= ftw / u32::MAX as f32 {
|
if 2.0 * ftw > NYQUIST {
|
||||||
[ftw as u32, 1u32 << 31]
|
return Err(Error::InvalidFrequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate the frequency tuning words.
|
||||||
|
let frequency_tuning_word = {
|
||||||
|
let ftws = [ftw / config.symmetry, ftw / (1.0 - config.symmetry)];
|
||||||
|
|
||||||
|
// Clip both frequency tuning words to within Nyquist before rounding.
|
||||||
|
if ftws[0] > NYQUIST {
|
||||||
|
[1u32 << 31, ftws[1] as u32]
|
||||||
|
} else if ftws[1] > NYQUIST {
|
||||||
|
[ftws[0] as u32, 1u32 << 31]
|
||||||
} else {
|
} else {
|
||||||
[
|
[ftws[0] as u32, ftws[1] as u32]
|
||||||
(ftw / config.symmetry) as u32,
|
|
||||||
(ftw / (1.0 - config.symmetry)) as u32,
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue