Skip to content

Commit 3f1cd06

Browse files
committed
Add extract interval
1 parent 3f0c190 commit 3f1cd06

2 files changed

Lines changed: 51 additions & 1 deletion

File tree

src/lib.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,55 @@ mod gps_data_codec {
107107
Ok(output)
108108
}
109109

110+
#[pyfunction]
111+
fn extract_encoded_interval(input: String, from_ts: i64, end_ts: i64) -> PyResult<(String, usize)> {
112+
let encoded = input.as_bytes();
113+
let mut encodedi = encoded.iter();
114+
let encoded_length: u32 = encoded.len() as u32;
115+
let mut bytes_consumed: u32 = 0;
116+
let mut timestamp: i64 = YEAR2010;
117+
let mut latitude: i64 = 0;
118+
let mut longitude: i64 = 0;
119+
let mut start_found = false;
120+
let mut prev_idx: u32 = 0;
121+
let mut output: Vec<u8> = vec![];
122+
let mut nb_pts = 0;
123+
while bytes_consumed < encoded_length {
124+
if bytes_consumed == 0 {
125+
let decoding_result = decode_signed_value_from_string(&mut encodedi);
126+
bytes_consumed += decoding_result.offset;
127+
timestamp += decoding_result.value;
128+
} else {
129+
let decoding_result = decode_unsigned_value_from_string(&mut encodedi);
130+
bytes_consumed += decoding_result.offset;
131+
timestamp += decoding_result.value;
132+
}
133+
134+
let lat_decoding_result = decode_signed_value_from_string(&mut encodedi);
135+
bytes_consumed += lat_decoding_result.offset;
136+
let lng_decoding_result = decode_signed_value_from_string(&mut encodedi);
137+
bytes_consumed += lng_decoding_result.offset;
138+
139+
if !start_found {
140+
latitude += lat_decoding_result.value;
141+
longitude += lng_decoding_result.value;
142+
if timestamp >= from_ts && end_ts >= timestamp {
143+
start_found = true;
144+
encode_signed_number(&mut output, timestamp - YEAR2010);
145+
encode_signed_number(&mut output, latitude);
146+
encode_signed_number(&mut output, longitude);
147+
prev_idx = bytes_consumed;
148+
nb_pts += 1;
149+
}
150+
151+
} else if end_ts >= timestamp {
152+
output.append(&mut encoded[prev_idx as usize..bytes_consumed as usize].to_vec());
153+
prev_idx = bytes_consumed;
154+
nb_pts += 1;
155+
}
156+
}
157+
Ok((unsafe { String::from_utf8_unchecked(output) }, nb_pts))
158+
}
110159
#[pyfunction]
111160
fn encode(data: Vec<(i64, f64, f64)>) -> PyResult<String> {
112161
let mut prev_timestamp: i64 = YEAR2010;

test.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
def test_lib():
66
input = [(-1,0,0),(1628667993, 4.56543, -110.53621), (1628667994, 4.56553, -110.53625)]
77
expected_encoded = '`o|sfjA??ya_fpo@}tzZhbtaT@SF'
8+
print(gps_data_codec.extract_encoded_interval(expected_encoded, -2, 1628667994))
89
encoded = gps_data_codec.encode(input)
910
print(encoded)
1011
assert(encoded == expected_encoded)
@@ -25,7 +26,7 @@ def test_lib():
2526
t0 = time.perf_counter()
2627
x2 = py_gps_data_codec.decode(data)
2728
t1 = time.perf_counter()
28-
s2 = py_gps_data_codec.encode(x1)
29+
s2 = py_gps_data_codec.encode(x2)
2930
t2 = time.perf_counter()
3031
assert(x1 == x2)
3132
assert(s1 == s2)

0 commit comments

Comments
 (0)