use core::marker::PhantomData;
#[derive(Debug)]
pub enum Error<E> {
I2C(E),
InvalidInputData,
SeekFailed,
}
#[derive(Debug)]
pub enum ErrorWithPin<CommE, PinE> {
I2C(CommE),
Pin(PinE),
InvalidInputData,
SeekFailed,
}
impl<CommE, PinE> From<Error<CommE>> for ErrorWithPin<CommE, PinE> {
fn from(error: Error<CommE>) -> Self {
match error {
Error::I2C(e) => ErrorWithPin::I2C(e),
Error::InvalidInputData => ErrorWithPin::InvalidInputData,
Error::SeekFailed => ErrorWithPin::SeekFailed,
}
}
}
#[doc(hidden)]
pub mod ic {
pub struct Si4702(());
pub struct Si4703(());
}
#[doc(hidden)]
pub mod marker {
use super::super::private;
pub trait WithRds: private::Sealed {}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum OperationState {
Idle,
Busy,
WaitingForStcToClear(bool),
}
#[derive(Debug)]
pub struct Si4703<I2C, IC> {
pub(crate) i2c: I2C,
pub(crate) seeking_state: OperationState,
pub(crate) tuning_state: OperationState,
pub(crate) _ic: PhantomData<IC>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SeekMode {
Wrap,
NoWrap,
}
impl Default for SeekMode {
fn default() -> Self {
SeekMode::Wrap
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SeekDirection {
Down,
Up,
}
impl Default for SeekDirection {
fn default() -> Self {
SeekDirection::Down
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum DeEmphasis {
Us75,
Us50,
}
impl Default for DeEmphasis {
fn default() -> Self {
DeEmphasis::Us75
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Gpio1Config {
HighImpedance,
High,
Low,
}
impl Default for Gpio1Config {
fn default() -> Self {
Gpio1Config::HighImpedance
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Gpio2Config {
HighImpedance,
StcRdsInterrupt,
High,
Low,
}
impl Default for Gpio2Config {
fn default() -> Self {
Gpio2Config::HighImpedance
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Gpio3Config {
HighImpedance,
MonoStereoIndicator,
High,
Low,
}
impl Default for Gpio3Config {
fn default() -> Self {
Gpio3Config::HighImpedance
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum RdsMode {
Standard,
Verbose,
}
impl Default for RdsMode {
fn default() -> Self {
RdsMode::Standard
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Band {
Mhz875_108,
Mhz76_108,
Mhz76_90,
}
impl Default for Band {
fn default() -> Self {
Band::Mhz875_108
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ChannelSpacing {
Khz200,
Khz100,
Khz50,
}
impl Default for ChannelSpacing {
fn default() -> Self {
ChannelSpacing::Khz200
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum OutputMode {
Stereo,
Mono,
}
impl Default for OutputMode {
fn default() -> Self {
OutputMode::Stereo
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum StereoToMonoBlendLevel {
Dbuv19_37,
Dbuv25_43,
Dbuv31_49,
Dbuv37_55,
}
impl Default for StereoToMonoBlendLevel {
fn default() -> Self {
StereoToMonoBlendLevel::Dbuv31_49
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Volume {
Mute,
Dbfsm58,
Dbfsm56,
Dbfsm54,
Dbfsm52,
Dbfsm50,
Dbfsm48,
Dbfsm46,
Dbfsm44,
Dbfsm42,
Dbfsm40,
Dbfsm38,
Dbfsm36,
Dbfsm34,
Dbfsm32,
Dbfsm30,
Dbfsm28,
Dbfsm26,
Dbfsm24,
Dbfsm22,
Dbfsm20,
Dbfsm18,
Dbfsm16,
Dbfsm14,
Dbfsm12,
Dbfsm10,
Dbfsm8,
Dbfsm6,
Dbfsm4,
Dbfsm2,
Dbfs0,
}
impl Default for Volume {
fn default() -> Self {
Volume::Mute
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SoftmuteRate {
Fastest,
Fast,
Slow,
Slowest,
}
impl Default for SoftmuteRate {
fn default() -> Self {
SoftmuteRate::Fastest
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SoftmuteAttenuation {
Db16,
Db14,
Db12,
Db10,
}
impl Default for SoftmuteAttenuation {
fn default() -> Self {
SoftmuteAttenuation::Db16
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SeekSnrThreshold {
Disabled,
Enabled(u8),
}
impl Default for SeekSnrThreshold {
fn default() -> Self {
SeekSnrThreshold::Disabled
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SeekFmImpulseThreshold {
Disabled,
Enabled(u8),
}
impl Default for SeekFmImpulseThreshold {
fn default() -> Self {
SeekFmImpulseThreshold::Disabled
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TuneChannel {
Raw(u16),
Mhz(f32),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum RdsBlockErrors {
None,
OneOrTwo,
ThreeToFive,
TooMany,
}
impl Default for RdsBlockErrors {
fn default() -> Self {
RdsBlockErrors::None
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq)]
pub struct RdsBlockData {
pub data: u16,
pub errors: RdsBlockErrors,
}
#[derive(Debug, Default, Clone, Copy, PartialEq)]
pub struct RdsData {
pub a: RdsBlockData,
pub b: RdsBlockData,
pub c: RdsBlockData,
pub d: RdsBlockData,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum RdsRadioTextData {
Two(char, char),
Four(char, char, char, char),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct RdsRadioText {
pub screen_clear: bool,
pub text: Option<(RdsRadioTextData, usize)>,
}
#[cfg(test)]
mod tests {
use super::*;
macro_rules! default_test {
($name:ident, $type:ident, $default:ident) => {
#[test]
fn $name() {
assert_eq!($type::$default, $type::default());
}
};
}
default_test!(default_seek_mode, SeekMode, Wrap);
default_test!(default_seek_direction, SeekDirection, Down);
default_test!(default_de, DeEmphasis, Us75);
default_test!(default_gpio1, Gpio1Config, HighImpedance);
default_test!(default_gpio2, Gpio2Config, HighImpedance);
default_test!(default_gpio3, Gpio3Config, HighImpedance);
default_test!(default_rds_mode, RdsMode, Standard);
default_test!(default_band, Band, Mhz875_108);
default_test!(default_spacing, ChannelSpacing, Khz200);
default_test!(default_output_mode, OutputMode, Stereo);
default_test!(default_volume, Volume, Mute);
default_test!(default_softmute_att, SoftmuteAttenuation, Db16);
default_test!(default_softmute_rate, SoftmuteRate, Fastest);
default_test!(default_blend, StereoToMonoBlendLevel, Dbuv31_49);
default_test!(default_snr, SeekSnrThreshold, Disabled);
default_test!(default_fm_impulse, SeekFmImpulseThreshold, Disabled);
default_test!(default_rds_block_err, RdsBlockErrors, None);
}