1use embedded_storage::nor_flash::NorFlash;
2
3use crate::{
4 fdb_blob, fdb_blob__bindgen_ty_1, fdb_tsl, fdb_tsl_status_FDB_TSL_DELETED, fdb_tsl_status_FDB_TSL_PRE_WRITE, fdb_tsl_status_FDB_TSL_UNUSED, fdb_tsl_status_FDB_TSL_USER_STATUS1, fdb_tsl_status_FDB_TSL_USER_STATUS2, fdb_tsl_status_FDB_TSL_WRITE, fdb_tsl_status_t, fdb_tsl_t, RawHandle, TSDB
5};
6
7#[repr(u32)]
8#[derive(Debug, PartialEq, Eq, Clone, Copy)]
9pub enum TSLStatus {
10 UNUSED = fdb_tsl_status_FDB_TSL_UNUSED,
11 PRE_WRITE = fdb_tsl_status_FDB_TSL_PRE_WRITE,
12 Write = fdb_tsl_status_FDB_TSL_WRITE, UserStatus1 = fdb_tsl_status_FDB_TSL_USER_STATUS1, Deleted = fdb_tsl_status_FDB_TSL_DELETED, UserStatus2 = fdb_tsl_status_FDB_TSL_USER_STATUS2, }
17
18impl From<fdb_tsl_status_t> for TSLStatus {
19 fn from(value: fdb_tsl_status_t) -> Self {
20 unsafe { core::mem::transmute(value) }
21 }
22}
23
24#[derive(Debug, Clone, Default)]
25pub struct TSLEntry {
26 pub(super) inner: fdb_tsl,
27}
28
29impl TSLEntry {
30 pub fn status(&self) -> TSLStatus {
31 self.inner.status.into()
32 }
33
34 pub fn value_len(&self) -> usize {
35 self.inner.log_len as usize
36 }
37
38 pub fn time(&self) -> i64 {
39 self.inner.time as i64
40 }
41}
42
43impl RawHandle for TSLEntry {
44 type Handle = fdb_tsl_t;
45 fn handle(&self) -> Self::Handle {
46 &self.inner as *const _ as *mut _
47 }
48}
49
50impl From<fdb_tsl> for TSLEntry {
51 fn from(value: fdb_tsl) -> Self {
52 Self { inner: value }
53 }
54}
55
56pub(super) struct CallbackData<'a, S: NorFlash, F> {
58 pub(super) callback: F, pub(super) db: &'a mut TSDB<S>, }
61
62pub(super) unsafe extern "C" fn iter_callback<
68 S: NorFlash,
69 F: FnMut(&mut TSDB<S>, &mut TSLEntry) -> bool + Send,
70>(
71 tsl: fdb_tsl_t,
72 arg: *mut core::ffi::c_void,
73) -> bool {
74 let callback_data: &mut CallbackData<'_, S, F> = unsafe { core::mem::transmute(arg) };
76 !(callback_data.callback)(callback_data.db, unsafe { core::mem::transmute(tsl) })
80}
81
82
83pub fn fdb_blob_make_by_tsl(v: &mut [u8], tsl:& TSLEntry, offset: usize) -> fdb_blob {
84 fdb_blob {
85 buf: v.as_mut_ptr() as *mut _,
86 size: v.len(),
87 saved: fdb_blob__bindgen_ty_1 {
88 meta_addr: tsl.inner.addr.index,
89 addr: tsl.inner.addr.log + offset as u32,
90 len: tsl.inner.log_len as usize - offset,
91 },
92 }
93}