forked from DangerKlippers/danger-klipper
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
adxl345: Move sample timestamp calculation to reusable code
Add a new extract_samples() method to the ChipClockUpdater class that calculates the sample timestamp for each sample in a list of bulk sensor reports. Update the adxl345 code to use that extract_samples() code. Signed-off-by: Kevin O'Connor <[email protected]>
- Loading branch information
1 parent
c106955
commit 95fdb68
Showing
2 changed files
with
44 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,7 +3,7 @@ | |
# Copyright (C) 2020-2023 Kevin O'Connor <[email protected]> | ||
# | ||
# This file may be distributed under the terms of the GNU GPLv3 license. | ||
import logging, threading | ||
import logging, threading, struct | ||
|
||
# This "bulk sensor" module facilitates the processing of sensor chip | ||
# measurements that do not require the host to respond with low | ||
|
@@ -255,3 +255,28 @@ def update_clock(self, is_reset=False): | |
self.clock_sync.reset(avg_mcu_clock, chip_clock) | ||
else: | ||
self.clock_sync.update(avg_mcu_clock, chip_clock) | ||
# Convert a list of sensor_bulk_data responses into list of samples | ||
def extract_samples(self, unpack_fmt, raw_samples): | ||
unpack_from = struct.Struct(unpack_fmt).unpack_from | ||
# Load variables to optimize inner loop below | ||
last_sequence = self.get_last_sequence() | ||
time_base, chip_base, inv_freq = self.clock_sync.get_time_translation() | ||
bytes_per_sample = self.bytes_per_sample | ||
samples_per_block = self.samples_per_block | ||
# Process every message in raw_samples | ||
count = seq = 0 | ||
samples = [None] * (len(raw_samples) * samples_per_block) | ||
for params in raw_samples: | ||
seq_diff = (params['sequence'] - last_sequence) & 0xffff | ||
seq_diff -= (seq_diff & 0x8000) << 1 | ||
seq = last_sequence + seq_diff | ||
msg_cdiff = seq * samples_per_block - chip_base | ||
data = params['data'] | ||
for i in range(len(data) // bytes_per_sample): | ||
ptime = time_base + (msg_cdiff + i) * inv_freq | ||
udata = unpack_from(data, i * bytes_per_sample) | ||
samples[count] = (ptime,) + udata | ||
count += 1 | ||
self.clock_sync.set_last_chip_clock(seq * samples_per_block + i) | ||
del samples[count:] | ||
return samples |