lrwn: Replace Duration with u32 in applayer timesync.

This commit is contained in:
Orne Brocaar 2025-01-08 11:41:41 +00:00
parent bcb8aaad4f
commit bf21297a42

View File

@ -1,5 +1,3 @@
use std::time::Duration;
use anyhow::Result; use anyhow::Result;
use crate::applayer::PayloadCodec; use crate::applayer::PayloadCodec;
@ -134,7 +132,7 @@ impl PayloadCodec for PackageVersionAnsPayload {
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub struct AppTimeReqPayload { pub struct AppTimeReqPayload {
pub device_time: Duration, // Duration since GPS Epoch pub device_time: u32,
pub param: AppTimeReqPayloadParam, pub param: AppTimeReqPayloadParam,
} }
@ -144,12 +142,12 @@ impl PayloadCodec for AppTimeReqPayload {
return Err(anyhow!("Expected 5 bytes")); return Err(anyhow!("Expected 5 bytes"));
} }
let mut device_time: [u8; 4] = [0; 4];
device_time.copy_from_slice(&b[0..4]);
let device_time_secs = u32::from_le_bytes(device_time);
Ok(AppTimeReqPayload { Ok(AppTimeReqPayload {
device_time: Duration::new(device_time_secs.into(), 0), device_time: {
let mut bytes = [0; 4];
bytes.copy_from_slice(&b[0..4]);
u32::from_le_bytes(bytes)
},
param: AppTimeReqPayloadParam { param: AppTimeReqPayloadParam {
token_req: b[4] & 0x0f, token_req: b[4] & 0x0f,
ans_required: b[4] & 0x10 != 0, ans_required: b[4] & 0x10 != 0,
@ -163,7 +161,7 @@ impl PayloadCodec for AppTimeReqPayload {
} }
let mut b = vec![0; 5]; let mut b = vec![0; 5];
b[0..4].copy_from_slice(&(self.device_time.as_secs() as u32).to_le_bytes()); b[0..4].copy_from_slice(&self.device_time.to_le_bytes());
b[4] = self.param.token_req; b[4] = self.param.token_req;
if self.param.ans_required { if self.param.ans_required {
@ -182,7 +180,7 @@ pub struct AppTimeReqPayloadParam {
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub struct AppTimeAnsPayload { pub struct AppTimeAnsPayload {
pub time_correction: Duration, pub time_correction: u32,
pub param: AppTimeAnsPayloadParam, pub param: AppTimeAnsPayloadParam,
} }
@ -192,12 +190,12 @@ impl PayloadCodec for AppTimeAnsPayload {
return Err(anyhow!("Expected 5 bytes")); return Err(anyhow!("Expected 5 bytes"));
} }
let mut time_correction: [u8; 4] = [0; 4];
time_correction.copy_from_slice(&b[0..4]);
let time_correction_secs = u32::from_le_bytes(time_correction);
Ok(AppTimeAnsPayload { Ok(AppTimeAnsPayload {
time_correction: Duration::new(time_correction_secs.into(), 0), time_correction: {
let mut bytes = [0; 4];
bytes.copy_from_slice(&b[0..4]);
u32::from_le_bytes(bytes)
},
param: AppTimeAnsPayloadParam { param: AppTimeAnsPayloadParam {
token_ans: b[4] & 0x0f, token_ans: b[4] & 0x0f,
}, },
@ -210,7 +208,7 @@ impl PayloadCodec for AppTimeAnsPayload {
} }
let mut b = vec![0; 5]; let mut b = vec![0; 5];
b[0..4].copy_from_slice(&(self.time_correction.as_secs() as u32).to_le_bytes()); b[0..4].copy_from_slice(&self.time_correction.to_le_bytes());
b[4] = self.param.token_ans; b[4] = self.param.token_ans;
Ok(b) Ok(b)
@ -250,7 +248,7 @@ impl PayloadCodec for DeviceAppTimePeriodicityReqPayload {
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub struct DeviceAppTimePeriodicityAnsPayload { pub struct DeviceAppTimePeriodicityAnsPayload {
pub status: DeviceAppTimePeriodicityAnsPayloadStatus, pub status: DeviceAppTimePeriodicityAnsPayloadStatus,
pub time: Duration, pub time: u32,
} }
impl PayloadCodec for DeviceAppTimePeriodicityAnsPayload { impl PayloadCodec for DeviceAppTimePeriodicityAnsPayload {
@ -259,15 +257,15 @@ impl PayloadCodec for DeviceAppTimePeriodicityAnsPayload {
return Err(anyhow!("Expected 5 bytes")); return Err(anyhow!("Expected 5 bytes"));
} }
let mut time: [u8; 4] = [0; 4];
time.copy_from_slice(&b[1..5]);
let time_secs = u32::from_le_bytes(time);
Ok(DeviceAppTimePeriodicityAnsPayload { Ok(DeviceAppTimePeriodicityAnsPayload {
status: DeviceAppTimePeriodicityAnsPayloadStatus { status: DeviceAppTimePeriodicityAnsPayloadStatus {
not_supported: b[0] & 0x01 != 0, not_supported: b[0] & 0x01 != 0,
}, },
time: Duration::new(time_secs.into(), 0), time: {
let mut bytes = [0; 4];
bytes.copy_from_slice(&b[1..5]);
u32::from_le_bytes(bytes)
},
}) })
} }
@ -277,7 +275,7 @@ impl PayloadCodec for DeviceAppTimePeriodicityAnsPayload {
b[0] |= 0x01; b[0] |= 0x01;
} }
b[1..5].copy_from_slice(&(self.time.as_secs() as u32).to_le_bytes()); b[1..5].copy_from_slice(&self.time.to_le_bytes());
Ok(b) Ok(b)
} }
} }
@ -387,7 +385,7 @@ mod test {
name: "encode AppTimeReq".into(), name: "encode AppTimeReq".into(),
uplink: true, uplink: true,
command: Payload::AppTimeReq(AppTimeReqPayload { command: Payload::AppTimeReq(AppTimeReqPayload {
device_time: Duration::from_secs(1024), device_time: 1024,
param: AppTimeReqPayloadParam { param: AppTimeReqPayloadParam {
token_req: 15, token_req: 15,
ans_required: true, ans_required: true,
@ -401,7 +399,7 @@ mod test {
name: "decode AppTimeReq".into(), name: "decode AppTimeReq".into(),
uplink: true, uplink: true,
command: Payload::AppTimeReq(AppTimeReqPayload { command: Payload::AppTimeReq(AppTimeReqPayload {
device_time: Duration::from_secs(1024), device_time: 1024,
param: AppTimeReqPayloadParam { param: AppTimeReqPayloadParam {
token_req: 15, token_req: 15,
ans_required: true, ans_required: true,
@ -421,7 +419,7 @@ mod test {
name: "encode AppTimeAns".into(), name: "encode AppTimeAns".into(),
uplink: false, uplink: false,
command: Payload::AppTimeAns(AppTimeAnsPayload { command: Payload::AppTimeAns(AppTimeAnsPayload {
time_correction: Duration::from_secs(1024), time_correction: 1024,
param: AppTimeAnsPayloadParam { token_ans: 15 }, param: AppTimeAnsPayloadParam { token_ans: 15 },
}), }),
bytes: vec![0x01, 0x00, 0x04, 0x00, 0x00, 0x0f], bytes: vec![0x01, 0x00, 0x04, 0x00, 0x00, 0x0f],
@ -432,7 +430,7 @@ mod test {
name: "decode AppTimeAns".into(), name: "decode AppTimeAns".into(),
uplink: false, uplink: false,
command: Payload::AppTimeAns(AppTimeAnsPayload { command: Payload::AppTimeAns(AppTimeAnsPayload {
time_correction: Duration::from_secs(1024), time_correction: 1024,
param: AppTimeAnsPayloadParam { token_ans: 15 }, param: AppTimeAnsPayloadParam { token_ans: 15 },
}), }),
bytes: vec![0x01, 0x00, 0x04, 0x00, 0x00, 0x0f], bytes: vec![0x01, 0x00, 0x04, 0x00, 0x00, 0x0f],
@ -478,7 +476,7 @@ mod test {
status: DeviceAppTimePeriodicityAnsPayloadStatus { status: DeviceAppTimePeriodicityAnsPayloadStatus {
not_supported: true, not_supported: true,
}, },
time: Duration::from_secs(1024), time: 1024,
}), }),
bytes: vec![0x02, 0x01, 0x00, 0x04, 0x00, 0x00], bytes: vec![0x02, 0x01, 0x00, 0x04, 0x00, 0x00],
expected_error: None, expected_error: None,
@ -491,7 +489,7 @@ mod test {
status: DeviceAppTimePeriodicityAnsPayloadStatus { status: DeviceAppTimePeriodicityAnsPayloadStatus {
not_supported: true, not_supported: true,
}, },
time: Duration::from_secs(1024), time: 1024,
}), }),
bytes: vec![0x02, 0x01, 0x00, 0x04, 0x00, 0x00], bytes: vec![0x02, 0x01, 0x00, 0x04, 0x00, 0x00],
expected_error: None, expected_error: None,