2026-10-01 18:42:31 +02:00
|
|
|
use uuid::Uuid;
|
|
|
|
|
|
2026-10-03 10:03:22 +02:00
|
|
|
use crate::{Trackpoint, Waypoint};
|
2026-09-23 19:53:39 +02:00
|
|
|
|
|
|
|
|
static MAX_TRKPT_CHUNK_SIZE: usize = 4096;
|
|
|
|
|
|
2026-10-02 18:06:45 +02:00
|
|
|
#[derive(Debug, PartialEq, Eq)]
|
|
|
|
|
pub struct TrackpointChunkId(Uuid);
|
|
|
|
|
|
|
|
|
|
impl Default for TrackpointChunkId {
|
|
|
|
|
fn default() -> Self {
|
|
|
|
|
Self(Uuid::new_v4())
|
|
|
|
|
}
|
2026-09-23 19:53:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-10-02 18:06:45 +02:00
|
|
|
#[derive(Debug, Default)]
|
|
|
|
|
pub struct TrackpointChunk {
|
|
|
|
|
pub id: TrackpointChunkId,
|
|
|
|
|
pub trkpt: Vec<Trackpoint>,
|
2026-10-01 18:42:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl PartialEq for TrackpointChunk {
|
|
|
|
|
fn eq(&self, other: &Self) -> bool {
|
|
|
|
|
self.id == other.id
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-09-23 19:53:39 +02:00
|
|
|
impl TrackpointChunk {
|
|
|
|
|
pub fn is_full(&self) -> bool {
|
|
|
|
|
self.trkpt.len() == MAX_TRKPT_CHUNK_SIZE
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-10-02 18:06:45 +02:00
|
|
|
#[derive(Debug, PartialEq, Eq)]
|
|
|
|
|
pub struct WaypointChunkId(Uuid);
|
2026-09-23 19:53:39 +02:00
|
|
|
|
2026-10-02 18:06:45 +02:00
|
|
|
impl Default for WaypointChunkId {
|
|
|
|
|
fn default() -> Self {
|
|
|
|
|
Self(Uuid::new_v4())
|
|
|
|
|
}
|
2026-09-23 19:53:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-10-02 18:06:45 +02:00
|
|
|
static MAX_WPT_CHUNK_SIZE: usize = 128;
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Default)]
|
|
|
|
|
pub struct WaypointChunk {
|
|
|
|
|
pub id: WaypointChunkId,
|
|
|
|
|
pub wpt: Vec<Waypoint>,
|
2026-10-01 18:42:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl PartialEq for WaypointChunk {
|
|
|
|
|
fn eq(&self, other: &Self) -> bool {
|
|
|
|
|
self.id == other.id
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-09-23 19:53:39 +02:00
|
|
|
impl WaypointChunk {
|
|
|
|
|
pub fn is_full(&self) -> bool {
|
|
|
|
|
self.wpt.len() == MAX_WPT_CHUNK_SIZE
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-10-03 16:16:47 +02:00
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod tests {
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_trackpoint_chunk_full() {
|
|
|
|
|
let mut chunk = TrackpointChunk::default();
|
|
|
|
|
assert!(!chunk.is_full());
|
|
|
|
|
for _ in 0..MAX_TRKPT_CHUNK_SIZE - 1 {
|
|
|
|
|
chunk.trkpt.push(Trackpoint::default());
|
|
|
|
|
}
|
|
|
|
|
assert!(!chunk.is_full());
|
|
|
|
|
chunk.trkpt.push(Trackpoint::default());
|
|
|
|
|
assert!(chunk.is_full());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_waypoint_chunk_full() {
|
|
|
|
|
let mut chunk = WaypointChunk::default();
|
|
|
|
|
assert!(!chunk.is_full());
|
|
|
|
|
for _ in 0..MAX_WPT_CHUNK_SIZE {
|
|
|
|
|
chunk.wpt.push(Waypoint::default());
|
|
|
|
|
}
|
|
|
|
|
assert!(chunk.is_full());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_chunk_equality_is_by_id() {
|
|
|
|
|
let a = TrackpointChunk::default();
|
|
|
|
|
let b = TrackpointChunk::default();
|
|
|
|
|
assert_ne!(a, b);
|
|
|
|
|
let mut c = TrackpointChunk::default();
|
|
|
|
|
c.id = TrackpointChunkId(a.id.0);
|
|
|
|
|
c.trkpt.push(Trackpoint::default());
|
|
|
|
|
assert_eq!(a, c);
|
|
|
|
|
}
|
|
|
|
|
}
|