#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "nmea-v4-11")]
use crate::nmea_content::SystemId;
use crate::{
self as nmea0183_parser, NmeaParse,
nmea_content::{FixMode, SelectionMode},
};
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
#[derive(Debug, Default, Clone, PartialEq, NmeaParse)]
pub struct GSA {
pub selection_mode: SelectionMode,
pub fix_mode: FixMode,
#[nmea(map(|sats| sats.into_iter().flatten().collect()), parse_as([Option<u8>; 12]))]
pub fix_sats_prn: heapless::Vec<u8, 12>,
pub pdop: Option<f32>,
pub hdop: Option<f32>,
pub vdop: Option<f32>,
#[cfg(feature = "nmea-v4-11")]
#[cfg_attr(docsrs, doc(cfg(feature = "nmea-v4-11")))]
pub system_id: Option<SystemId>,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::IResult;
#[test]
fn test_gsa_parsing() {
let input = "A,3,1,2,3,,5,6,,8,9,,11,12,1.0,,3.0,";
let expected = GSA {
selection_mode: SelectionMode::Automatic,
fix_mode: FixMode::Fix3D,
fix_sats_prn: heapless::Vec::from_slice(&[1, 2, 3, 5, 6, 8, 9, 11, 12]).unwrap(),
pdop: Some(1.0),
hdop: None,
vdop: Some(3.0),
#[cfg(feature = "nmea-v4-11")]
system_id: None,
};
let result: IResult<_, _> = GSA::parse(input);
if cfg!(feature = "nmea-v4-11") {
assert_eq!(result, Ok(("", expected)));
} else {
assert_eq!(result, Ok((",", expected)));
}
}
}