1use crate::error_codes::ErrorCode;
130use crate::flash_controller::FlashController;
131use crate::success_codes::SuccessCode;
132use crate::tickv::{State, TicKV};
133use core::cell::Cell;
134
135type ContinueReturn = (
137 Result<SuccessCode, ErrorCode>,
139 Option<&'static mut [u8]>,
141 usize,
143);
144
145pub struct AsyncTicKV<'a, C: FlashController<S>, const S: usize> {
147 pub tickv: TicKV<'a, C, S>,
149 key: Cell<Option<u64>>,
150 value: Cell<Option<&'static mut [u8]>>,
151 value_length: Cell<usize>,
152}
153
154impl<'a, C: FlashController<S>, const S: usize> AsyncTicKV<'a, C, S> {
155 pub fn new(controller: C, read_buffer: &'a mut [u8; S], flash_size: usize) -> Self {
162 Self {
163 tickv: TicKV::<C, S>::new(controller, read_buffer, flash_size),
164 key: Cell::new(None),
165 value: Cell::new(None),
166 value_length: Cell::new(0),
167 }
168 }
169
170 pub fn initialise(&self, hashed_main_key: u64) -> Result<SuccessCode, ErrorCode> {
181 self.key.replace(Some(hashed_main_key));
182 self.tickv.initialise(hashed_main_key)
183 }
184
185 pub fn append_key(
194 &self,
195 hash: u64,
196 value: &'static mut [u8],
197 length: usize,
198 ) -> Result<SuccessCode, (&'static mut [u8], ErrorCode)> {
199 match self.tickv.append_key(hash, &value[0..length]) {
200 Ok(_code) => {
201 Err((value, ErrorCode::WriteFail))
205 }
206 Err(e) => match e {
207 ErrorCode::ReadNotReady(_)
208 | ErrorCode::EraseNotReady(_)
209 | ErrorCode::WriteNotReady(_) => {
210 self.key.replace(Some(hash));
213 self.value.replace(Some(value));
214 self.value_length.set(length);
215 Ok(SuccessCode::Queued)
216 }
217 _ => {
218 Err((value, e))
220 }
221 },
222 }
223 }
224
225 pub fn get_key(
236 &self,
237 hash: u64,
238 buf: &'static mut [u8],
239 ) -> Result<SuccessCode, (&'static mut [u8], ErrorCode)> {
240 match self.tickv.get_key(hash, buf) {
241 Ok(_code) => {
242 Err((buf, ErrorCode::ReadFail))
246 }
247 Err(e) => match e {
248 ErrorCode::ReadNotReady(_)
249 | ErrorCode::EraseNotReady(_)
250 | ErrorCode::WriteNotReady(_) => {
251 self.key.replace(Some(hash));
252 self.value.replace(Some(buf));
253 Ok(SuccessCode::Queued)
254 }
255 _ => Err((buf, e)),
256 },
257 }
258 }
259
260 pub fn invalidate_key(&self, hash: u64) -> Result<SuccessCode, ErrorCode> {
271 match self.tickv.invalidate_key(hash) {
272 Ok(_code) => Err(ErrorCode::WriteFail),
273 Err(_e) => {
274 self.key.replace(Some(hash));
275 Ok(SuccessCode::Queued)
276 }
277 }
278 }
279
280 pub fn zeroise_key(&self, hash: u64) -> Result<SuccessCode, ErrorCode> {
291 match self.tickv.zeroise_key(hash) {
292 Ok(_code) => Err(ErrorCode::WriteFail),
293 Err(_e) => {
294 self.key.replace(Some(hash));
295 Ok(SuccessCode::Queued)
296 }
297 }
298 }
299
300 pub fn garbage_collect(&self) -> Result<SuccessCode, ErrorCode> {
305 match self.tickv.garbage_collect() {
306 Ok(_code) => Err(ErrorCode::EraseFail),
307 Err(_e) => Ok(SuccessCode::Queued),
308 }
309 }
310
311 pub fn set_read_buffer(&self, read_buffer: &[u8]) {
316 let buf = self.tickv.read_buffer.take().unwrap();
317 buf.copy_from_slice(read_buffer);
318 self.tickv.read_buffer.replace(Some(buf));
319 }
320
321 pub fn continue_operation(&self) -> ContinueReturn {
339 let (ret, length) = match self.tickv.state.get() {
340 State::Init(_) => (self.tickv.initialise(self.key.get().unwrap()), 0),
341 State::AppendKey(_) => {
342 let value = self.value.take().unwrap();
343 let value_length = self.value_length.get();
344 let ret = self
345 .tickv
346 .append_key(self.key.get().unwrap(), &value[0..value_length]);
347 self.value.replace(Some(value));
348 (ret, value_length)
349 }
350 State::GetKey(_) => {
351 let buf = self.value.take().unwrap();
352 let ret = self.tickv.get_key(self.key.get().unwrap(), buf);
353 self.value.replace(Some(buf));
354 match ret {
355 Ok((s, len)) => (Ok(s), len),
356 Err(e) => (Err(e), 0),
357 }
358 }
359 State::InvalidateKey(_) => (self.tickv.invalidate_key(self.key.get().unwrap()), 0),
360 State::ZeroiseKey(_) => (self.tickv.zeroise_key(self.key.get().unwrap()), 0),
361 State::GarbageCollect(_) => match self.tickv.garbage_collect() {
362 Ok(bytes_freed) => (Ok(SuccessCode::Complete), bytes_freed),
363 Err(e) => (Err(e), 0),
364 },
365 _ => unreachable!(),
366 };
367
368 match ret {
369 Ok(_) => {
370 self.tickv.state.set(State::None);
371 (ret, self.value.take(), length)
372 }
373 Err(e) => match e {
374 ErrorCode::ReadNotReady(_) | ErrorCode::EraseNotReady(_) => (ret, None, 0),
375 ErrorCode::WriteNotReady(_) => {
376 self.tickv.state.set(State::None);
377 (ret, None, 0)
378 }
379 _ => {
380 self.tickv.state.set(State::None);
381 (ret, self.value.take(), length)
382 }
383 },
384 }
385 }
386}
387
388#[cfg(test)]
389mod tests {
390 #![allow(unsafe_code)]
391
392 mod store_flast_ctrl {
394 use crate::async_ops::AsyncTicKV;
395 use crate::error_codes::ErrorCode;
396 use crate::flash_controller::FlashController;
397 use crate::success_codes::SuccessCode;
398 use crate::tickv::{HASH_OFFSET, LEN_OFFSET, MAIN_KEY, VERSION, VERSION_OFFSET};
399 use core::hash::{Hash, Hasher};
400 use core::ptr::addr_of_mut;
401 use std::cell::Cell;
402 use std::cell::RefCell;
403 use std::collections::hash_map::DefaultHasher;
404
405 fn check_region_main(buf: &[u8]) {
406 assert_eq!(buf[VERSION_OFFSET], VERSION);
408
409 assert_eq!(buf[LEN_OFFSET], 0x80);
411 assert_eq!(buf[LEN_OFFSET + 1], 15);
412
413 assert_eq!(buf[HASH_OFFSET + 0], 0x7b);
415 assert_eq!(buf[HASH_OFFSET + 1], 0xc9);
416 assert_eq!(buf[HASH_OFFSET + 2], 0xf7);
417 assert_eq!(buf[HASH_OFFSET + 3], 0xff);
418 assert_eq!(buf[HASH_OFFSET + 4], 0x4f);
419 assert_eq!(buf[HASH_OFFSET + 5], 0x76);
420 assert_eq!(buf[HASH_OFFSET + 6], 0xf2);
421 assert_eq!(buf[HASH_OFFSET + 7], 0x44);
422
423 assert_eq!(buf[HASH_OFFSET + 8], 0xbb);
425 assert_eq!(buf[HASH_OFFSET + 9], 0x32);
426 assert_eq!(buf[HASH_OFFSET + 10], 0x74);
427 assert_eq!(buf[HASH_OFFSET + 11], 0x1d);
428 }
429
430 fn check_region_one(buf: &[u8]) {
431 assert_eq!(buf[VERSION_OFFSET], VERSION);
433
434 assert_eq!(buf[LEN_OFFSET], 0x80);
436 assert_eq!(buf[LEN_OFFSET + 1], 47);
437
438 assert_eq!(buf[HASH_OFFSET + 0], 0x81);
440 assert_eq!(buf[HASH_OFFSET + 1], 0x13);
441 assert_eq!(buf[HASH_OFFSET + 2], 0x7e);
442 assert_eq!(buf[HASH_OFFSET + 3], 0x95);
443 assert_eq!(buf[HASH_OFFSET + 4], 0x9e);
444 assert_eq!(buf[HASH_OFFSET + 5], 0x93);
445 assert_eq!(buf[HASH_OFFSET + 6], 0xaa);
446 assert_eq!(buf[HASH_OFFSET + 7], 0x3d);
447
448 assert_eq!(buf[HASH_OFFSET + 8], 0x23);
450 assert_eq!(buf[28], 0x23);
451 assert_eq!(buf[42], 0x23);
452
453 assert_eq!(buf[43], 0xfd);
455 assert_eq!(buf[44], 0x24);
456 assert_eq!(buf[45], 0xf0);
457 assert_eq!(buf[46], 0x07);
458 }
459
460 fn check_region_two(buf: &[u8]) {
461 assert_eq!(buf[VERSION_OFFSET], VERSION);
463
464 assert_eq!(buf[LEN_OFFSET], 0x80);
466 assert_eq!(buf[LEN_OFFSET + 1], 47);
467
468 assert_eq!(buf[HASH_OFFSET + 0], 0x9d);
470 assert_eq!(buf[HASH_OFFSET + 1], 0xd3);
471 assert_eq!(buf[HASH_OFFSET + 2], 0x71);
472 assert_eq!(buf[HASH_OFFSET + 3], 0x45);
473 assert_eq!(buf[HASH_OFFSET + 4], 0x05);
474 assert_eq!(buf[HASH_OFFSET + 5], 0xc2);
475 assert_eq!(buf[HASH_OFFSET + 6], 0xf8);
476 assert_eq!(buf[HASH_OFFSET + 7], 0x66);
477
478 assert_eq!(buf[HASH_OFFSET + 8], 0x23);
480 assert_eq!(buf[28], 0x23);
481 assert_eq!(buf[42], 0x23);
482
483 assert_eq!(buf[43], 0x1b);
485 assert_eq!(buf[44], 0x53);
486 assert_eq!(buf[45], 0xf9);
487 assert_eq!(buf[46], 0x54);
488 }
489
490 fn get_hashed_key(unhashed_key: &[u8]) -> u64 {
491 let mut hash_function = DefaultHasher::new();
492 unhashed_key.hash(&mut hash_function);
493 hash_function.finish()
494 }
495
496 #[derive(Clone, Copy)]
497 enum FlashCtrlAction {
498 Idle,
499 Read,
500 Write,
501 Erase,
502 }
503
504 struct FlashCtrl<const S: usize> {
506 buf: RefCell<[[u8; S]; 64]>,
507 run: Cell<u8>,
508 async_read_region: Cell<usize>,
509 async_erase_region: Cell<usize>,
510 waiting_on: Cell<FlashCtrlAction>,
511 check_write_contents: bool,
512 }
513
514 impl<const S: usize> FlashCtrl<S> {
515 fn new(check_write_contents: bool) -> Self {
516 Self {
517 buf: RefCell::new([[0xFF; S]; 64]),
518 run: Cell::new(0),
519 async_read_region: Cell::new(100),
520 async_erase_region: Cell::new(100),
521 waiting_on: Cell::new(FlashCtrlAction::Idle),
522 check_write_contents,
523 }
524 }
525
526 fn get_waiting_action(&self) -> FlashCtrlAction {
527 self.waiting_on.get()
528 }
529 }
530
531 impl<const S: usize> FlashController<S> for FlashCtrl<S> {
532 fn read_region(
533 &self,
534 region_number: usize,
535 _buf: &mut [u8; S],
536 ) -> Result<(), ErrorCode> {
537 println!("Read from region: {}", region_number);
538
539 self.async_read_region.set(region_number);
541 println!(" Not ready");
542
543 self.waiting_on.set(FlashCtrlAction::Read);
544
545 Err(ErrorCode::ReadNotReady(region_number))
546 }
547
548 fn write(&self, address: usize, buf: &[u8]) -> Result<(), ErrorCode> {
549 println!(
550 "Write to address: {:#x}, region: {}",
551 address % S,
552 address / S
553 );
554
555 for (i, d) in buf.iter().enumerate() {
556 self.buf.borrow_mut()[address / S][(address % S) + i] = *d;
557 }
558
559 if buf.len() > 1 && self.check_write_contents {
561 if self.run.get() == 0 {
562 println!("Writing main key: {:#x?}", buf);
563 check_region_main(buf);
564 } else if self.run.get() == 1 {
565 println!("Writing key ONE: {:#x?}", buf);
566 check_region_one(buf);
567 } else if self.run.get() == 2 {
568 println!("Writing key TWO: {:#x?}", buf);
569 check_region_two(buf);
570 }
571 }
572
573 self.run.set(self.run.get() + 1);
574 self.waiting_on.set(FlashCtrlAction::Write);
575 Err(ErrorCode::WriteNotReady(address))
576 }
577
578 fn erase_region(&self, region_number: usize) -> Result<(), ErrorCode> {
579 println!("Erase region: {}", region_number);
580
581 let mut local_buf = self.buf.borrow_mut()[region_number];
582
583 for d in local_buf.iter_mut() {
584 *d = 0xFF;
585 }
586
587 self.async_erase_region.set(region_number);
589
590 self.waiting_on.set(FlashCtrlAction::Erase);
591 Err(ErrorCode::EraseNotReady(region_number))
592 }
593 }
594
595 fn flash_ctrl_callback<const S: usize>(tickv: &AsyncTicKV<FlashCtrl<S>, S>) {
601 match tickv.tickv.controller.get_waiting_action() {
602 FlashCtrlAction::Read => {
603 tickv.set_read_buffer(
606 &tickv.tickv.controller.buf.borrow()
607 [tickv.tickv.controller.async_read_region.get()],
608 );
609 }
610 _ => {
611 }
615 }
616 }
617
618 #[test]
619 fn test_simple_append() {
620 let mut read_buf: [u8; 1024] = [0; 1024];
621 let mut hash_function = DefaultHasher::new();
622 MAIN_KEY.hash(&mut hash_function);
623
624 let tickv = AsyncTicKV::<FlashCtrl<1024>, 1024>::new(
625 FlashCtrl::new(true),
626 &mut read_buf,
627 0x1000,
628 );
629
630 let mut ret = tickv.initialise(hash_function.finish());
631 while ret.is_err() {
632 flash_ctrl_callback(&tickv);
633
634 let (r, _buf, _len) = tickv.continue_operation();
636 ret = r;
637 }
638
639 static mut VALUE: [u8; 32] = [0x23; 32];
640
641 println!("HASHED KEY {:?}", get_hashed_key(b"ONE"));
642
643 let ret =
644 unsafe { tickv.append_key(get_hashed_key(b"ONE"), &mut *addr_of_mut!(VALUE), 32) };
645 match ret {
646 Ok(SuccessCode::Queued) => {
647 flash_ctrl_callback(&tickv);
649 tickv.continue_operation().0.unwrap();
650 }
651 Err(_) => {}
652 _ => unreachable!(),
653 }
654
655 let ret =
656 unsafe { tickv.append_key(get_hashed_key(b"TWO"), &mut *addr_of_mut!(VALUE), 32) };
657 match ret {
658 Ok(SuccessCode::Queued) => {
659 flash_ctrl_callback(&tickv);
661 tickv.continue_operation().0.unwrap();
662 }
663 Err(_) => {}
664 _ => unreachable!(),
665 }
666 }
667
668 #[test]
669 fn test_double_append() {
670 let mut read_buf: [u8; 1024] = [0; 1024];
671 let mut hash_function = DefaultHasher::new();
672 MAIN_KEY.hash(&mut hash_function);
673
674 let tickv = AsyncTicKV::<FlashCtrl<1024>, 1024>::new(
675 FlashCtrl::new(true),
676 &mut read_buf,
677 0x10000,
678 );
679
680 let mut ret = tickv.initialise(hash_function.finish());
681 while ret.is_err() {
682 flash_ctrl_callback(&tickv);
683
684 let (r, _buf, _len) = tickv.continue_operation();
686 ret = r;
687 }
688
689 static mut VALUE: [u8; 32] = [0x23; 32];
690 static mut BUF: [u8; 32] = [0; 32];
691
692 println!("Add key ONE");
693 let ret =
694 unsafe { tickv.append_key(get_hashed_key(b"ONE"), &mut *addr_of_mut!(VALUE), 32) };
695 match ret {
696 Ok(SuccessCode::Queued) => {
697 flash_ctrl_callback(&tickv);
699 tickv.continue_operation().0.unwrap();
700 }
701 Err(_) => {}
702 _ => unreachable!(),
703 }
704
705 println!("Get key ONE");
706
707 let ret = unsafe { tickv.get_key(get_hashed_key(b"ONE"), &mut *addr_of_mut!(BUF)) };
708 match ret {
709 Ok(SuccessCode::Queued) => {
710 flash_ctrl_callback(&tickv);
711 tickv.continue_operation().0.unwrap();
712 }
713 Err(_) => {}
714 _ => unreachable!(),
715 }
716
717 println!("Get non-existent key TWO");
718 let ret = unsafe { tickv.get_key(get_hashed_key(b"TWO"), &mut *addr_of_mut!(BUF)) };
719 match ret {
720 Ok(SuccessCode::Queued) => {
721 flash_ctrl_callback(&tickv);
723 assert_eq!(tickv.continue_operation().0, Err(ErrorCode::KeyNotFound));
724 }
725 Err((_, ErrorCode::KeyNotFound)) => {}
726 _ => unreachable!(),
727 }
728
729 println!("Add key ONE again");
730 let ret =
731 unsafe { tickv.append_key(get_hashed_key(b"ONE"), &mut *addr_of_mut!(VALUE), 32) };
732 match ret {
733 Ok(SuccessCode::Queued) => {
734 flash_ctrl_callback(&tickv);
736 assert_eq!(
737 tickv.continue_operation().0,
738 Err(ErrorCode::KeyAlreadyExists)
739 );
740 }
741 Err((_buf, ErrorCode::KeyAlreadyExists)) => {}
742 _ => unreachable!(),
743 }
744
745 println!("Add key TWO");
746 let ret =
747 unsafe { tickv.append_key(get_hashed_key(b"TWO"), &mut *addr_of_mut!(VALUE), 32) };
748 match ret {
749 Ok(SuccessCode::Queued) => {
750 flash_ctrl_callback(&tickv);
752 tickv.continue_operation().0.unwrap();
753 }
754 Err(_) => {}
755 _ => unreachable!(),
756 }
757
758 println!("Get key ONE");
759 let ret = unsafe { tickv.get_key(get_hashed_key(b"ONE"), &mut *addr_of_mut!(BUF)) };
760 match ret {
761 Ok(SuccessCode::Queued) => {
762 flash_ctrl_callback(&tickv);
764 tickv.continue_operation().0.unwrap();
765 }
766 Err(_) => {}
767 _ => unreachable!(),
768 }
769
770 println!("Get key TWO");
771 let ret = unsafe { tickv.get_key(get_hashed_key(b"TWO"), &mut *addr_of_mut!(BUF)) };
772 match ret {
773 Ok(SuccessCode::Queued) => {
774 flash_ctrl_callback(&tickv);
776 tickv.continue_operation().0.unwrap();
777 }
778 Err(_) => {}
779 _ => unreachable!(),
780 }
781
782 println!("Get non-existent key THREE");
783 let ret = unsafe { tickv.get_key(get_hashed_key(b"THREE"), &mut *addr_of_mut!(BUF)) };
784 match ret {
785 Ok(SuccessCode::Queued) => {
786 flash_ctrl_callback(&tickv);
788 assert_eq!(tickv.continue_operation().0, Err(ErrorCode::KeyNotFound));
789 }
790 _ => unreachable!(),
791 }
792
793 let ret = unsafe { tickv.get_key(get_hashed_key(b"THREE"), &mut *addr_of_mut!(BUF)) };
794 match ret {
795 Ok(SuccessCode::Queued) => {
796 flash_ctrl_callback(&tickv);
797 assert_eq!(tickv.continue_operation().0, Err(ErrorCode::KeyNotFound));
798 }
799 Err(_) => {}
800 _ => unreachable!(),
801 }
802 }
803
804 #[test]
805 fn test_spread_pages() {
806 let mut read_buf: [u8; 64] = [0; 64];
807 let mut hash_function = DefaultHasher::new();
808 MAIN_KEY.hash(&mut hash_function);
809
810 let tickv =
811 AsyncTicKV::<FlashCtrl<64>, 64>::new(FlashCtrl::new(false), &mut read_buf, 64 * 64);
812
813 let mut ret = tickv.initialise(hash_function.finish());
814 while ret.is_err() {
815 tickv.set_read_buffer(
816 &tickv.tickv.controller.buf.borrow()
817 [tickv.tickv.controller.async_read_region.get()],
818 );
819
820 let (r, _buf, _len) = tickv.continue_operation();
822 ret = r;
823 }
824
825 static mut VALUE: [u8; 32] = [0x23; 32];
826 static mut BUF: [u8; 32] = [0; 32];
827
828 println!("Add key 0x1000");
829 let ret = unsafe { tickv.append_key(0x1000, &mut *addr_of_mut!(VALUE), 32) };
830 match ret {
831 Ok(SuccessCode::Queued) => {
832 flash_ctrl_callback(&tickv);
834 tickv.continue_operation().0.unwrap();
835 }
836 Err(e) => panic!("Unable to add key 0x100: {e:?}"),
837 _ => unreachable!(),
838 }
839
840 println!("Add key 0x2000");
841 let ret = unsafe { tickv.append_key(0x2000, &mut *addr_of_mut!(VALUE), 32) };
842 match ret {
843 Ok(SuccessCode::Queued) => {
844 flash_ctrl_callback(&tickv);
846
847 assert_eq!(
848 tickv.continue_operation().0,
849 Err(ErrorCode::ReadNotReady(1))
850 );
851 flash_ctrl_callback(&tickv);
852
853 tickv.continue_operation().0.unwrap();
854 }
855 Err(e) => panic!("Unable to add key 0x200: {e:?}"),
856 _ => unreachable!(),
857 }
858
859 println!("Add key 0x3000");
860 let ret = unsafe { tickv.append_key(0x3000, &mut *addr_of_mut!(VALUE), 32) };
861 match ret {
862 Ok(SuccessCode::Queued) => {
863 flash_ctrl_callback(&tickv);
865 }
866 Err(e) => panic!("Unable to add key 0x3000: {e:?}"),
867 _ => unreachable!(),
868 }
869
870 loop {
871 let ret = tickv.continue_operation().0;
872 match ret {
873 Err(ErrorCode::ReadNotReady(_reg)) => {
874 flash_ctrl_callback(&tickv);
876 }
877 Err(e) => panic!("Unable to add key 0x3000: {e:?}"),
878 Ok(_) => break,
879 }
880 }
881
882 println!("Get key 0x1000");
883 let ret = unsafe { tickv.get_key(0x1000, &mut *addr_of_mut!(BUF)) };
884 match ret {
885 Ok(SuccessCode::Queued) => {
886 flash_ctrl_callback(&tickv);
888 }
889 _ => unreachable!(),
890 }
891
892 loop {
893 let ret = tickv.continue_operation().0;
894 match ret {
895 Err(ErrorCode::ReadNotReady(_reg)) => {
896 flash_ctrl_callback(&tickv);
898 }
899 Err(e) => panic!("Unable to get key 0x1000: {e:?}"),
900 Ok(_) => break,
901 }
902 }
903
904 println!("Get key 0x3000");
905 let ret = unsafe { tickv.get_key(0x3000, &mut *addr_of_mut!(BUF)) };
906 match ret {
907 Ok(_) => flash_ctrl_callback(&tickv),
908 Err(_) => unreachable!(),
909 }
910
911 loop {
912 let ret = tickv.continue_operation().0;
913 match ret {
914 Err(ErrorCode::ReadNotReady(reg)) => {
915 tickv.set_read_buffer(&tickv.tickv.controller.buf.borrow()[reg]);
917 }
918 Err(e) => panic!("Unable to get key 0x1000: {e:?}"),
919 Ok(_) => break,
920 }
921 }
922 }
923
924 #[test]
925 fn test_append_and_delete() {
926 let mut read_buf: [u8; 1024] = [0; 1024];
927 let mut hash_function = DefaultHasher::new();
928 MAIN_KEY.hash(&mut hash_function);
929
930 let tickv = AsyncTicKV::<FlashCtrl<1024>, 1024>::new(
931 FlashCtrl::new(true),
932 &mut read_buf,
933 0x10000,
934 );
935
936 let mut ret = tickv.initialise(hash_function.finish());
937 while ret.is_err() {
938 flash_ctrl_callback(&tickv);
939
940 let (r, _buf, _len) = tickv.continue_operation();
942 ret = r;
943 }
944
945 static mut VALUE: [u8; 32] = [0x23; 32];
946 static mut BUF: [u8; 32] = [0; 32];
947
948 println!("Add key ONE");
949 let ret =
950 unsafe { tickv.append_key(get_hashed_key(b"ONE"), &mut *addr_of_mut!(VALUE), 32) };
951 match ret {
952 Ok(SuccessCode::Queued) => {
953 flash_ctrl_callback(&tickv);
955 tickv.continue_operation().0.unwrap();
956 }
957 Err(_) => {}
958 _ => unreachable!(),
959 }
960
961 println!("Get key ONE");
962 let ret = unsafe { tickv.get_key(get_hashed_key(b"ONE"), &mut *addr_of_mut!(BUF)) };
963 match ret {
964 Ok(SuccessCode::Queued) => {
965 flash_ctrl_callback(&tickv);
967 tickv.continue_operation().0.unwrap();
968 }
969 Err(_) => {}
970 _ => unreachable!(),
971 }
972
973 println!("Delete Key ONE");
974 let ret = tickv.invalidate_key(get_hashed_key(b"ONE"));
975 match ret {
976 Ok(SuccessCode::Queued) => {
977 flash_ctrl_callback(&tickv);
978 tickv.continue_operation().0.unwrap();
979 }
980 Err(_) => {}
981 _ => unreachable!(),
982 }
983
984 println!("Get non-existent key ONE");
985 unsafe {
986 match tickv.get_key(get_hashed_key(b"ONE"), &mut *addr_of_mut!(BUF)) {
987 Ok(SuccessCode::Queued) => {
988 flash_ctrl_callback(&tickv);
989
990 assert_eq!(
991 tickv.continue_operation().0,
992 Err(ErrorCode::ReadNotReady(62))
993 );
994 flash_ctrl_callback(&tickv);
995
996 match tickv.continue_operation().0 {
997 Err(ErrorCode::ReadNotReady(reg)) => {
998 panic!("Searching too far for keys: {reg}");
999 }
1000 Err(ErrorCode::KeyNotFound) => {}
1001 e => {
1002 panic!("Expected ErrorCode::KeyNotFound, got {e:?}");
1003 }
1004 }
1005 }
1006 _ => unreachable!(),
1007 }
1008 }
1009
1010 println!("Try to delete Key ONE Again");
1011 match tickv.invalidate_key(get_hashed_key(b"ONE")) {
1012 Ok(SuccessCode::Queued) => {
1013 let reg = tickv.tickv.controller.async_read_region.get();
1014
1015 flash_ctrl_callback(&tickv);
1016 assert_eq!(
1017 tickv.continue_operation().0,
1018 Err(ErrorCode::ReadNotReady(reg + 1))
1019 );
1020
1021 assert_eq!(
1033 tickv.continue_operation().0,
1034 Err(ErrorCode::ReadNotReady(reg - 1))
1035 );
1036
1037 assert_eq!(
1038 tickv.continue_operation().0,
1039 Err(ErrorCode::ReadNotReady(reg + 2))
1040 );
1041
1042 assert_eq!(
1043 tickv.continue_operation().0,
1044 Err(ErrorCode::ReadNotReady(reg - 2))
1045 );
1046
1047 assert_eq!(
1048 tickv.continue_operation().0,
1049 Err(ErrorCode::ReadNotReady(reg - 3))
1050 );
1051
1052 tickv.set_read_buffer(&tickv.tickv.controller.buf.borrow()[reg - 1]);
1054
1055 match tickv.continue_operation().0 {
1056 Err(ErrorCode::ReadNotReady(reg)) => {
1057 panic!("Searching too far for keys: {reg}");
1058 }
1059 Err(ErrorCode::KeyNotFound) => {}
1060 e => {
1061 panic!("Expected ErrorCode::KeyNotFound, got {e:?}");
1062 }
1063 }
1064 }
1065 e => {
1066 panic!("Expected ErrorCode::KeyNotFound, got {e:?}");
1067 }
1068 }
1069 }
1070
1071 #[test]
1072 fn test_garbage_collect() {
1073 let mut read_buf: [u8; 1024] = [0; 1024];
1074 let mut hash_function = DefaultHasher::new();
1075 MAIN_KEY.hash(&mut hash_function);
1076
1077 let tickv = AsyncTicKV::<FlashCtrl<1024>, 1024>::new(
1078 FlashCtrl::new(true),
1079 &mut read_buf,
1080 0x10000,
1081 );
1082
1083 let mut ret = tickv.initialise(hash_function.finish());
1084 while ret.is_err() {
1085 flash_ctrl_callback(&tickv);
1086
1087 let (r, _buf, _len) = tickv.continue_operation();
1089 ret = r;
1090 }
1091
1092 static mut VALUE: [u8; 32] = [0x23; 32];
1093 static mut BUF: [u8; 32] = [0; 32];
1094
1095 println!("Garbage collect empty flash");
1096 let ret = tickv.garbage_collect();
1097 match ret {
1098 Ok(SuccessCode::Queued) => loop {
1099 flash_ctrl_callback(&tickv);
1100 let (res, _buf, len) = tickv.continue_operation();
1101 if res.is_ok() {
1102 assert_eq!(len, 0);
1103 break;
1104 }
1105 },
1106 Ok(_) => {}
1107 _ => unreachable!(),
1108 }
1109
1110 println!("Add key ONE");
1111 let ret =
1112 unsafe { tickv.append_key(get_hashed_key(b"ONE"), &mut *addr_of_mut!(VALUE), 32) };
1113 match ret {
1114 Ok(SuccessCode::Queued) => {
1115 flash_ctrl_callback(&tickv);
1117 tickv.continue_operation().0.unwrap();
1118 }
1119 Ok(_) => {}
1120 _ => unreachable!(),
1121 }
1122
1123 println!("Garbage collect flash with valid key");
1124 let ret = tickv.garbage_collect();
1125 match ret {
1126 Ok(SuccessCode::Queued) => loop {
1127 flash_ctrl_callback(&tickv);
1128 let (res, _buf, len) = tickv.continue_operation();
1129 if res.is_ok() {
1130 assert_eq!(len, 0);
1131 break;
1132 }
1133 },
1134 Ok(_) => {}
1135 _ => unreachable!(),
1136 }
1137
1138 println!("Delete Key ONE");
1139 let ret = tickv.invalidate_key(get_hashed_key(b"ONE"));
1140 match ret {
1141 Ok(SuccessCode::Queued) => {
1142 flash_ctrl_callback(&tickv);
1143 tickv.continue_operation().0.unwrap();
1144 }
1145 Err(_) => {}
1146 _ => unreachable!(),
1147 }
1148
1149 println!("Garbage collect flash with deleted key");
1150 let ret = tickv.garbage_collect();
1151 match ret {
1152 Ok(SuccessCode::Queued) => loop {
1153 flash_ctrl_callback(&tickv);
1154 let (res, _buf, len) = tickv.continue_operation();
1155 if res.is_ok() {
1156 assert_eq!(len, 1024);
1157 break;
1158 }
1159 },
1160 Ok(_) => {}
1161 _ => unreachable!(),
1162 }
1163
1164 println!("Get non-existent key ONE");
1165 match unsafe { tickv.get_key(get_hashed_key(b"ONE"), &mut *addr_of_mut!(BUF)) } {
1166 Ok(SuccessCode::Queued) => {
1167 flash_ctrl_callback(&tickv);
1168 assert_eq!(
1169 tickv.continue_operation().0,
1170 Err(ErrorCode::ReadNotReady(62))
1171 );
1172 flash_ctrl_callback(&tickv);
1173 assert_eq!(tickv.continue_operation().0, Err(ErrorCode::KeyNotFound));
1174 }
1175 _ => unreachable!(),
1176 }
1177
1178 println!("Add Key ONE");
1179 let ret =
1180 unsafe { tickv.append_key(get_hashed_key(b"ONE"), &mut *addr_of_mut!(VALUE), 32) };
1181 match ret {
1182 Ok(SuccessCode::Queued) => {
1183 flash_ctrl_callback(&tickv);
1185 tickv.continue_operation().0.unwrap();
1186 }
1187 _ => unreachable!("ret: {:?}", ret),
1188 }
1189 }
1190 }
1191}