use crate::status::Status;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum GnssScanMode {
Single = 0,
Multi = 3,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum ContextError {
None = 0,
AlmanacOld = 1,
AlmanacCrc = 2,
FlashIntegrity = 3,
AlmanacLocked = 4,
}
impl From<u8> for ContextError {
fn from(value: u8) -> Self {
match value {
4 => ContextError::AlmanacLocked,
3 => ContextError::FlashIntegrity,
2 => ContextError::AlmanacCrc,
1 => ContextError::AlmanacOld,
_ => ContextError::None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum FreqSearchSpace {
F250 = 0,
F500 = 1,
F1000 = 2,
F2000 = 3,
}
impl From<u8> for FreqSearchSpace {
fn from(value: u8) -> Self {
match value {
3 => FreqSearchSpace::F2000,
2 => FreqSearchSpace::F1000,
1 => FreqSearchSpace::F500,
_ => FreqSearchSpace::F250,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum GnssScanType {
Assisted = 3,
ColdStart = 4,
TimeKnown = 5,
FetchTime = 6,
AlmanacUpdt0 = 7,
KeepSync = 8,
AlmanacUpdt1 = 9,
AlmanacUpdt2 = 10,
}
impl From<u8> for GnssScanType {
fn from(value: u8) -> Self {
match value {
10 => GnssScanType::AlmanacUpdt2,
9 => GnssScanType::AlmanacUpdt1,
8 => GnssScanType::KeepSync,
7 => GnssScanType::AlmanacUpdt0,
6 => GnssScanType::FetchTime,
5 => GnssScanType::TimeKnown,
4 => GnssScanType::ColdStart,
_ => GnssScanType::Assisted,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum FetchTimeMode {
TowOnly = 0,
TowWn = 1,
Rollover = 2,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum SolverError {
None = 0,
ResidueHigh = 1,
NotConverged = 2,
NotEnoughSv = 3,
IllegalMatrix = 4,
TimeError = 5,
PartialAlamanacOld = 6,
Inconsistent = 7,
FullAlamanacOld = 8,
}
impl From<u8> for SolverError {
fn from(value: u8) -> Self {
match value {
8 => SolverError::FullAlamanacOld,
7 => SolverError::Inconsistent,
6 => SolverError::PartialAlamanacOld,
5 => SolverError::TimeError,
4 => SolverError::IllegalMatrix,
3 => SolverError::NotEnoughSv,
2 => SolverError::NotConverged,
1 => SolverError::ResidueHigh,
_ => SolverError::None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum WnSource {
NotSet = 0,
Scan = 1,
Time = 2,
}
impl From<u8> for WnSource {
fn from(value: u8) -> Self {
match value {
2 => WnSource::Time,
1 => WnSource::Scan,
_ => WnSource::NotSet,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum AlmanacStatus {
LowAccuracy = 252,
NoTimeSet = 253,
NextTimeUnknown = 254,
PageIdUnknown = 255,
NothingTodo = 0,
Success = 1,
}
impl From<u8> for AlmanacStatus {
fn from(value: u8) -> Self {
match value {
1 => AlmanacStatus::Success,
0 => AlmanacStatus::NothingTodo,
255 => AlmanacStatus::PageIdUnknown,
254 => AlmanacStatus::NextTimeUnknown,
253 => AlmanacStatus::NoTimeSet,
_ => AlmanacStatus::LowAccuracy,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum BeidouType {
Meo = 0,
Igso = 1,
}
pub fn gnss_set_constellation_to_use_cmd(gps_en: bool, beidou_en: bool) -> [u8; 3] {
let mut cmd = [0u8; 3];
cmd[0] = 0x04;
cmd[1] = 0x00;
if gps_en { cmd[2] |= 1; }
if beidou_en { cmd[2] |= 2; }
cmd
}
pub fn gnss_read_constellation_to_use_req() -> [u8; 2] {
[0x04, 0x01]
}
pub fn gnss_read_supported_constellations_req() -> [u8; 2] {
[0x04, 0x07]
}
pub fn gnss_set_mode_cmd(gnss_scan_mode: GnssScanMode) -> [u8; 3] {
let mut cmd = [0u8; 3];
cmd[0] = 0x04;
cmd[1] = 0x08;
cmd[2] |= gnss_scan_mode as u8;
cmd
}
pub fn gnss_autonomous_cmd(time: u32, best_effort: bool, pseudo_range_en: bool, doppler_info_en: bool, bit_changes_en: bool, nb_sv_max: u8) -> [u8; 9] {
let mut cmd = [0u8; 9];
cmd[0] = 0x04;
cmd[1] = 0x09;
cmd[2] |= ((time >> 24) & 0xFF) as u8;
cmd[3] |= ((time >> 16) & 0xFF) as u8;
cmd[4] |= ((time >> 8) & 0xFF) as u8;
cmd[5] |= (time & 0xFF) as u8;
if best_effort { cmd[6] |= 1; }
if pseudo_range_en { cmd[7] |= 1; }
if doppler_info_en { cmd[7] |= 2; }
if bit_changes_en { cmd[7] |= 4; }
cmd[8] |= nb_sv_max;
cmd
}
pub fn gnss_assisted_cmd(time: u32, best_effort: bool, pseudo_range_en: bool, doppler_info_en: bool, bit_changes_en: bool, nb_sv_max: u8) -> [u8; 9] {
let mut cmd = [0u8; 9];
cmd[0] = 0x04;
cmd[1] = 0x0A;
cmd[2] |= ((time >> 24) & 0xFF) as u8;
cmd[3] |= ((time >> 16) & 0xFF) as u8;
cmd[4] |= ((time >> 8) & 0xFF) as u8;
cmd[5] |= (time & 0xFF) as u8;
if best_effort { cmd[6] |= 1; }
if pseudo_range_en { cmd[7] |= 1; }
if doppler_info_en { cmd[7] |= 2; }
if bit_changes_en { cmd[7] |= 4; }
cmd[8] |= nb_sv_max;
cmd
}
pub fn gnss_scan_cmd(best_effort: bool, pseudo_range_en: bool, doppler_info_en: bool, bit_changes_en: bool, nb_sv_max: u8) -> [u8; 5] {
let mut cmd = [0u8; 5];
cmd[0] = 0x04;
cmd[1] = 0x0B;
if best_effort { cmd[2] |= 1; }
if pseudo_range_en { cmd[3] |= 1; }
if doppler_info_en { cmd[3] |= 2; }
if bit_changes_en { cmd[3] |= 4; }
cmd[4] |= nb_sv_max;
cmd
}
pub fn gnss_set_assistance_position_cmd(latitude: u16, longitude: u16) -> [u8; 6] {
let mut cmd = [0u8; 6];
cmd[0] = 0x04;
cmd[1] = 0x10;
cmd[2] |= ((latitude >> 8) & 0xFF) as u8;
cmd[3] |= (latitude & 0xFF) as u8;
cmd[4] |= ((longitude >> 8) & 0xFF) as u8;
cmd[5] |= (longitude & 0xFF) as u8;
cmd
}
pub fn gnss_read_assistance_position_req() -> [u8; 2] {
[0x04, 0x11]
}
pub fn gnss_get_context_status_req() -> [u8; 2] {
[0x04, 0x16]
}
pub fn gnss_read_version_req() -> [u8; 2] {
[0x04, 0x06]
}
pub fn gnss_set_almanac_update_cmd(gps_en: bool, beidou_en: bool) -> [u8; 9] {
let mut cmd = [0u8; 9];
cmd[0] = 0x04;
cmd[1] = 0x02;
if gps_en { cmd[8] |= 2; }
if beidou_en { cmd[8] |= 4; }
cmd
}
pub fn gnss_read_almanac_update_req() -> [u8; 2] {
[0x04, 0x03]
}
pub fn gnss_get_result_size_req() -> [u8; 2] {
[0x04, 0x0C]
}
pub fn gnss_read_results_cmd() -> [u8; 2] {
[0x04, 0x0D]
}
pub fn gnss_push_solver_msg_cmd() -> [u8; 2] {
[0x04, 0x14]
}
pub fn gnss_push_dm_msg_cmd() -> [u8; 2] {
[0x04, 0x15]
}
pub fn gnss_get_nb_sv_detected_req() -> [u8; 2] {
[0x04, 0x17]
}
pub fn gnss_get_sv_detected_req() -> [u8; 2] {
[0x04, 0x18]
}
pub fn gnss_get_consumption_req() -> [u8; 2] {
[0x04, 0x19]
}
pub fn gnss_get_sv_visible_req(time: u32, latitude: u16, longitude: u16, gps_en: bool, beidou_en: bool) -> [u8; 11] {
let mut cmd = [0u8; 11];
cmd[0] = 0x04;
cmd[1] = 0x1F;
cmd[2] |= ((time >> 24) & 0xFF) as u8;
cmd[3] |= ((time >> 16) & 0xFF) as u8;
cmd[4] |= ((time >> 8) & 0xFF) as u8;
cmd[5] |= (time & 0xFF) as u8;
cmd[6] |= ((latitude >> 8) & 0xFF) as u8;
cmd[7] |= (latitude & 0xFF) as u8;
cmd[8] |= ((longitude >> 8) & 0xFF) as u8;
cmd[9] |= (longitude & 0xFF) as u8;
if gps_en { cmd[10] |= 1; }
if beidou_en { cmd[10] |= 2; }
cmd
}
pub fn gnss_config_delay_reset_ap_cmd(delay: u32) -> [u8; 5] {
let mut cmd = [0u8; 5];
cmd[0] = 0x04;
cmd[1] = 0x65;
cmd[2] |= ((delay >> 16) & 0xFF) as u8;
cmd[3] |= ((delay >> 8) & 0xFF) as u8;
cmd[4] |= (delay & 0xFF) as u8;
cmd
}
pub fn gnss_read_last_scan_mode_launched_req() -> [u8; 2] {
[0x04, 0x26]
}
pub fn gnss_fetch_time_cmd(best_effort: bool, fetch_time_mode: FetchTimeMode) -> [u8; 4] {
let mut cmd = [0u8; 4];
cmd[0] = 0x04;
cmd[1] = 0x32;
if best_effort { cmd[2] |= 1; }
cmd[3] |= fetch_time_mode as u8;
cmd
}
pub fn gnss_read_time_req() -> [u8; 2] {
[0x04, 0x34]
}
pub fn gnss_reset_time_cmd() -> [u8; 2] {
[0x04, 0x35]
}
pub fn gnss_reset_position_cmd() -> [u8; 2] {
[0x04, 0x37]
}
pub fn gnss_set_time_cmd(gps_time: u32, time_accuracy: u16) -> [u8; 8] {
let mut cmd = [0u8; 8];
cmd[0] = 0x04;
cmd[1] = 0x4B;
cmd[2] |= ((gps_time >> 24) & 0xFF) as u8;
cmd[3] |= ((gps_time >> 16) & 0xFF) as u8;
cmd[4] |= ((gps_time >> 8) & 0xFF) as u8;
cmd[5] |= (gps_time & 0xFF) as u8;
cmd[6] |= ((time_accuracy >> 8) & 0xFF) as u8;
cmd[7] |= (time_accuracy & 0xFF) as u8;
cmd
}
pub fn gnss_read_doppler_solver_res_req() -> [u8; 2] {
[0x04, 0x4F]
}
pub fn gnss_read_delay_reset_ap_req() -> [u8; 2] {
[0x04, 0x53]
}
pub fn gnss_read_wn_rollover_req() -> [u8; 2] {
[0x04, 0x67]
}
pub fn gnss_read_warm_start_status_req(gps_en: bool, beidou_en: bool) -> [u8; 3] {
let mut cmd = [0u8; 3];
cmd[0] = 0x04;
cmd[1] = 0x69;
if gps_en { cmd[2] |= 1; }
if beidou_en { cmd[2] |= 2; }
cmd
}
pub fn gnss_get_sv_warm_start_req(gps_en: bool, beidou_en: bool) -> [u8; 3] {
let mut cmd = [0u8; 3];
cmd[0] = 0x04;
cmd[1] = 0x66;
if gps_en { cmd[2] |= 1; }
if beidou_en { cmd[2] |= 2; }
cmd
}
pub fn gnss_write_bit_mask_sat_activated_cmd(gps_en: bool, beidou_en: bool, bit_mask_activated_0: u32) -> [u8; 7] {
let mut cmd = [0u8; 7];
cmd[0] = 0x04;
cmd[1] = 0x72;
if gps_en { cmd[2] |= 1; }
if beidou_en { cmd[2] |= 2; }
cmd[3] |= ((bit_mask_activated_0 >> 24) & 0xFF) as u8;
cmd[4] |= ((bit_mask_activated_0 >> 16) & 0xFF) as u8;
cmd[5] |= ((bit_mask_activated_0 >> 8) & 0xFF) as u8;
cmd[6] |= (bit_mask_activated_0 & 0xFF) as u8;
cmd
}
pub fn gnss_write_bit_mask_sat_activated_adv_cmd(gps_en: bool, beidou_en: bool, bit_mask_activated_0: u32, bit_mask_activated_1: u32) -> [u8; 11] {
let mut cmd = [0u8; 11];
cmd[0] = 0x04;
cmd[1] = 0x72;
if gps_en { cmd[2] |= 1; }
if beidou_en { cmd[2] |= 2; }
cmd[3] |= ((bit_mask_activated_0 >> 24) & 0xFF) as u8;
cmd[4] |= ((bit_mask_activated_0 >> 16) & 0xFF) as u8;
cmd[5] |= ((bit_mask_activated_0 >> 8) & 0xFF) as u8;
cmd[6] |= (bit_mask_activated_0 & 0xFF) as u8;
cmd[7] |= ((bit_mask_activated_1 >> 24) & 0xFF) as u8;
cmd[8] |= ((bit_mask_activated_1 >> 16) & 0xFF) as u8;
cmd[9] |= ((bit_mask_activated_1 >> 8) & 0xFF) as u8;
cmd[10] |= (bit_mask_activated_1 & 0xFF) as u8;
cmd
}
pub fn gnss_almanac_update_from_sat_cmd(best_effort: bool, gps_en: bool, beidou_en: bool) -> [u8; 4] {
let mut cmd = [0u8; 4];
cmd[0] = 0x04;
cmd[1] = 0x55;
if best_effort { cmd[2] |= 1; }
if gps_en { cmd[3] |= 1; }
if beidou_en { cmd[3] |= 2; }
cmd
}
pub fn gnss_read_almanac_status_req() -> [u8; 2] {
[0x04, 0x57]
}
pub fn gnss_config_almanac_update_period_cmd(gps_en: bool, beidou_en: bool, beidou_type: BeidouType, period: u16) -> [u8; 6] {
let mut cmd = [0u8; 6];
cmd[0] = 0x04;
cmd[1] = 0x63;
if gps_en { cmd[2] |= 1; }
if beidou_en { cmd[2] |= 2; }
cmd[3] |= beidou_type as u8;
cmd[4] |= ((period >> 8) & 0xFF) as u8;
cmd[5] |= (period & 0xFF) as u8;
cmd
}
pub fn gnss_read_almanac_update_period_req(gps_en: bool, beidou_en: bool, beidou_type: BeidouType) -> [u8; 4] {
let mut cmd = [0u8; 4];
cmd[0] = 0x04;
cmd[1] = 0x64;
if gps_en { cmd[2] |= 1; }
if beidou_en { cmd[2] |= 2; }
cmd[3] |= beidou_type as u8;
cmd
}
pub fn gnss_almanac_full_update_cmd() -> [u8; 2] {
[0x04, 0x0E]
}
#[derive(Default)]
pub struct GnssReadConstellationToUseRsp([u8; 2]);
impl GnssReadConstellationToUseRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn gps_en(&self) -> bool {
self.0[1] & 0x1 != 0
}
pub fn beidou_en(&self) -> bool {
(self.0[1] >> 1) & 0x1 != 0
}
}
impl AsMut<[u8]> for GnssReadConstellationToUseRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssReadSupportedConstellationsRsp([u8; 2]);
impl GnssReadSupportedConstellationsRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn gps_en(&self) -> bool {
self.0[1] & 0x1 != 0
}
pub fn beidou_en(&self) -> bool {
(self.0[1] >> 1) & 0x1 != 0
}
}
impl AsMut<[u8]> for GnssReadSupportedConstellationsRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssReadAssistancePositionRsp([u8; 5]);
impl GnssReadAssistancePositionRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn latitude(&self) -> u16 {
(self.0[2] as u16) |
((self.0[1] as u16) << 8)
}
pub fn longitude(&self) -> u16 {
(self.0[4] as u16) |
((self.0[3] as u16) << 8)
}
}
impl AsMut<[u8]> for GnssReadAssistancePositionRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssGetContextStatusRsp([u8; 10]);
impl GnssGetContextStatusRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn gnss_fw_version(&self) -> u8 {
self.0[3]
}
pub fn global_almanac_crc(&self) -> u32 {
(self.0[7] as u32) |
((self.0[6] as u32) << 8) |
((self.0[5] as u32) << 16) |
((self.0[4] as u32) << 24)
}
pub fn context_error(&self) -> ContextError {
((self.0[8] >> 4) & 0xF).into()
}
pub fn gps_en(&self) -> bool {
(self.0[8] >> 1) & 0x1 != 0
}
pub fn beidou_en(&self) -> bool {
(self.0[8] >> 2) & 0x1 != 0
}
pub fn freq_search_space(&self) -> FreqSearchSpace {
((self.0[9] >> 7) |
((self.0[8] & 0x1) << 1)).into()
}
}
impl AsMut<[u8]> for GnssGetContextStatusRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssReadVersionRsp([u8; 3]);
impl GnssReadVersionRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn firmware_version(&self) -> u8 {
self.0[1]
}
pub fn almanac_version(&self) -> u8 {
self.0[2]
}
}
impl AsMut<[u8]> for GnssReadVersionRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssReadAlmanacUpdateRsp([u8; 2]);
impl GnssReadAlmanacUpdateRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn gps_en(&self) -> bool {
(self.0[1] >> 1) & 0x1 != 0
}
pub fn beidou_en(&self) -> bool {
(self.0[1] >> 2) & 0x1 != 0
}
}
impl AsMut<[u8]> for GnssReadAlmanacUpdateRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssGetResultSizeRsp([u8; 3]);
impl GnssGetResultSizeRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn result_size(&self) -> u16 {
(self.0[2] as u16) |
((self.0[1] as u16) << 8)
}
}
impl AsMut<[u8]> for GnssGetResultSizeRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssGetNbSvDetectedRsp([u8; 2]);
impl GnssGetNbSvDetectedRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn nb_sv(&self) -> u8 {
self.0[1]
}
}
impl AsMut<[u8]> for GnssGetNbSvDetectedRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
pub struct GnssGetSvDetectedRsp([u8; 4]);
impl GnssGetSvDetectedRsp {
pub fn from_slice(buffer: &[u8]) -> Self {
let raw : [u8; 4] = buffer.try_into().expect("Buffer size should match response size !");
Self(raw)
}
pub fn sv_id(&self) -> u8 {
self.0[0]
}
pub fn snr(&self) -> u8 {
self.0[1]
}
pub fn doppler(&self) -> i16 {
let raw = (self.0[3] as u16) |
((self.0[2] as u16) << 8);
raw as i16
}
}
impl AsMut<[u8]> for GnssGetSvDetectedRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssGetConsumptionRsp([u8; 9]);
impl GnssGetConsumptionRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn radio_ms(&self) -> u32 {
(self.0[4] as u32) |
((self.0[3] as u32) << 8) |
((self.0[2] as u32) << 16) |
((self.0[1] as u32) << 24)
}
pub fn computation_ms(&self) -> u32 {
(self.0[8] as u32) |
((self.0[7] as u32) << 8) |
((self.0[6] as u32) << 16) |
((self.0[5] as u32) << 24)
}
}
impl AsMut<[u8]> for GnssGetConsumptionRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssGetSvVisibleRsp([u8; 2]);
impl GnssGetSvVisibleRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn nb_sv_visible(&self) -> u8 {
self.0[1]
}
}
impl AsMut<[u8]> for GnssGetSvVisibleRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssReadLastScanModeLaunchedRsp([u8; 2]);
impl GnssReadLastScanModeLaunchedRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn gnss_scan_type(&self) -> GnssScanType {
self.0[1].into()
}
}
impl AsMut<[u8]> for GnssReadLastScanModeLaunchedRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssReadTimeRsp([u8; 9]);
impl GnssReadTimeRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn gps_time(&self) -> u32 {
(self.0[4] as u32) |
((self.0[3] as u32) << 8) |
((self.0[2] as u32) << 16) |
((self.0[1] as u32) << 24)
}
pub fn accuracy(&self) -> u32 {
(self.0[8] as u32) |
((self.0[7] as u32) << 8) |
((self.0[6] as u32) << 16) |
((self.0[5] as u32) << 24)
}
}
impl AsMut<[u8]> for GnssReadTimeRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssReadDopplerSolverResRsp([u8; 19]);
impl GnssReadDopplerSolverResRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn solver_error(&self) -> SolverError {
self.0[1].into()
}
pub fn nb_sv_used(&self) -> u8 {
self.0[2]
}
pub fn latitude(&self) -> u16 {
(self.0[4] as u16) |
((self.0[3] as u16) << 8)
}
pub fn longitude(&self) -> u16 {
(self.0[6] as u16) |
((self.0[5] as u16) << 8)
}
pub fn accuracy(&self) -> u16 {
(self.0[8] as u16) |
((self.0[7] as u16) << 8)
}
pub fn xtal(&self) -> u16 {
(self.0[10] as u16) |
((self.0[9] as u16) << 8)
}
pub fn filtered_latitude(&self) -> u16 {
(self.0[12] as u16) |
((self.0[11] as u16) << 8)
}
pub fn filtered_longitude(&self) -> u16 {
(self.0[14] as u16) |
((self.0[13] as u16) << 8)
}
pub fn filtered_accuracy(&self) -> u16 {
(self.0[16] as u16) |
((self.0[15] as u16) << 8)
}
pub fn filtered_xtal(&self) -> u16 {
(self.0[18] as u16) |
((self.0[17] as u16) << 8)
}
}
impl AsMut<[u8]> for GnssReadDopplerSolverResRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssReadDelayResetAPRsp([u8; 4]);
impl GnssReadDelayResetAPRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn delay(&self) -> u32 {
(self.0[3] as u32) |
((self.0[2] as u32) << 8) |
((self.0[1] as u32) << 16)
}
}
impl AsMut<[u8]> for GnssReadDelayResetAPRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssReadWNRolloverRsp([u8; 3]);
impl GnssReadWNRolloverRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn wn_source(&self) -> WnSource {
self.0[1].into()
}
pub fn wn_rollover(&self) -> u8 {
self.0[2]
}
}
impl AsMut<[u8]> for GnssReadWNRolloverRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssReadWarmStartStatusRsp([u8; 6]);
impl GnssReadWarmStartStatusRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn nb_sv(&self) -> u8 {
self.0[1]
}
pub fn time_elapsed(&self) -> u32 {
(self.0[5] as u32) |
((self.0[4] as u32) << 8) |
((self.0[3] as u32) << 16) |
((self.0[2] as u32) << 24)
}
}
impl AsMut<[u8]> for GnssReadWarmStartStatusRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct GnssGetSvWarmStartRsp([u8; 2]);
impl GnssGetSvWarmStartRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
}
impl AsMut<[u8]> for GnssGetSvWarmStartRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
pub struct GnssReadAlmanacStatusRsp([u8; 54]);
impl GnssReadAlmanacStatusRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn gps_status(&self) -> AlmanacStatus {
self.0[1].into()
}
pub fn gps_time_to_next_subframe(&self) -> u32 {
(self.0[5] as u32) |
((self.0[4] as u32) << 8) |
((self.0[3] as u32) << 16) |
((self.0[2] as u32) << 24)
}
pub fn gps_next_subframes_to_demod(&self) -> u8 {
self.0[6]
}
pub fn gps_sv_in_subframe_4(&self) -> u8 {
self.0[7]
}
pub fn gps_sv_in_subframe_5(&self) -> u8 {
self.0[8]
}
pub fn gps_next_subframe_id(&self) -> u8 {
self.0[9]
}
pub fn gps_total_sv_to_update(&self) -> u8 {
self.0[10]
}
pub fn gps_sv_almanac_to_update_mask(&self) -> u32 {
(self.0[14] as u32) |
((self.0[13] as u32) << 8) |
((self.0[12] as u32) << 16) |
((self.0[11] as u32) << 24)
}
pub fn gps_sv_activated_mask(&self) -> u32 {
(self.0[18] as u32) |
((self.0[17] as u32) << 8) |
((self.0[16] as u32) << 16) |
((self.0[15] as u32) << 24)
}
pub fn beidou_status(&self) -> AlmanacStatus {
self.0[19].into()
}
pub fn beidou_time_to_next_subframe(&self) -> u32 {
(self.0[23] as u32) |
((self.0[22] as u32) << 8) |
((self.0[21] as u32) << 16) |
((self.0[20] as u32) << 24)
}
pub fn beidou_next_subframes_to_demod(&self) -> u8 {
self.0[24]
}
pub fn beidou_sv_in_subframe_4(&self) -> u8 {
self.0[25]
}
pub fn beidou_sv_in_subframe_5(&self) -> u8 {
self.0[26]
}
pub fn beidou_next_subframe_id(&self) -> u8 {
self.0[27]
}
pub fn beidou_total_sv_to_update(&self) -> u8 {
self.0[28]
}
pub fn beidou_sv_almanac_to_update_mask(&self) -> u64 {
(self.0[36] as u64) |
((self.0[35] as u64) << 8) |
((self.0[34] as u64) << 16) |
((self.0[33] as u64) << 24) |
((self.0[32] as u64) << 32) |
((self.0[31] as u64) << 40) |
((self.0[30] as u64) << 48) |
((self.0[29] as u64) << 56)
}
pub fn beidou_sv_activated_mask(&self) -> u64 {
(self.0[44] as u64) |
((self.0[43] as u64) << 8) |
((self.0[42] as u64) << 16) |
((self.0[41] as u64) << 24) |
((self.0[40] as u64) << 32) |
((self.0[39] as u64) << 40) |
((self.0[38] as u64) << 48) |
((self.0[37] as u64) << 56)
}
pub fn beidou_sv_blacklist_mask(&self) -> u64 {
(self.0[52] as u64) |
((self.0[51] as u64) << 8) |
((self.0[50] as u64) << 16) |
((self.0[49] as u64) << 24) |
((self.0[48] as u64) << 32) |
((self.0[47] as u64) << 40) |
((self.0[46] as u64) << 48) |
((self.0[45] as u64) << 56)
}
pub fn beidou_next_almanac_id(&self) -> u8 {
self.0[53]
}
}
impl AsMut<[u8]> for GnssReadAlmanacStatusRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
impl Default for GnssReadAlmanacStatusRsp {
fn default() -> Self {
let content : [u8; 54] = core::array::repeat(0);
Self(content)
}
}
#[derive(Default)]
pub struct GnssReadAlmanacUpdatePeriodRsp([u8; 3]);
impl GnssReadAlmanacUpdatePeriodRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
self.0[0].into()
}
pub fn period(&self) -> u16 {
(self.0[2] as u16) |
((self.0[1] as u16) << 8)
}
}
impl AsMut<[u8]> for GnssReadAlmanacUpdatePeriodRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}