aboutsummaryrefslogtreecommitdiff
path: root/embassy-hal-internal
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-hal-internal')
-rw-r--r--embassy-hal-internal/Cargo.toml3
-rw-r--r--embassy-hal-internal/src/atomic_ring_buffer.rs43
2 files changed, 44 insertions, 2 deletions
diff --git a/embassy-hal-internal/Cargo.toml b/embassy-hal-internal/Cargo.toml
index b4c52ccfa..11dcc2466 100644
--- a/embassy-hal-internal/Cargo.toml
+++ b/embassy-hal-internal/Cargo.toml
@@ -14,6 +14,9 @@ categories = [
14 14
15[features] 15[features]
16 16
17defmt = ["dep:defmt"]
18log = ["dep:log"]
19
17# Define the number of NVIC priority bits. 20# Define the number of NVIC priority bits.
18prio-bits-0 = [] 21prio-bits-0 = []
19prio-bits-1 = [] 22prio-bits-1 = []
diff --git a/embassy-hal-internal/src/atomic_ring_buffer.rs b/embassy-hal-internal/src/atomic_ring_buffer.rs
index 00b7a1249..8c3889b85 100644
--- a/embassy-hal-internal/src/atomic_ring_buffer.rs
+++ b/embassy-hal-internal/src/atomic_ring_buffer.rs
@@ -133,6 +133,18 @@ impl RingBuffer {
133 self.len.load(Ordering::Relaxed) 133 self.len.load(Ordering::Relaxed)
134 } 134 }
135 135
136 /// Return number of items available to read.
137 pub fn available(&self) -> usize {
138 let end = self.end.load(Ordering::Relaxed);
139 let len = self.len.load(Ordering::Relaxed);
140 let start = self.start.load(Ordering::Relaxed);
141 if end >= start {
142 end - start
143 } else {
144 2 * len - start + end
145 }
146 }
147
136 /// Check if buffer is full. 148 /// Check if buffer is full.
137 pub fn is_full(&self) -> bool { 149 pub fn is_full(&self) -> bool {
138 let len = self.len.load(Ordering::Relaxed); 150 let len = self.len.load(Ordering::Relaxed);
@@ -142,6 +154,11 @@ impl RingBuffer {
142 self.wrap(start + len) == end 154 self.wrap(start + len) == end
143 } 155 }
144 156
157 /// Check if buffer is at least half full.
158 pub fn is_half_full(&self) -> bool {
159 self.available() >= self.len.load(Ordering::Relaxed) / 2
160 }
161
145 /// Check if buffer is empty. 162 /// Check if buffer is empty.
146 pub fn is_empty(&self) -> bool { 163 pub fn is_empty(&self) -> bool {
147 let start = self.start.load(Ordering::Relaxed); 164 let start = self.start.load(Ordering::Relaxed);
@@ -394,6 +411,7 @@ mod tests {
394 rb.init(b.as_mut_ptr(), 4); 411 rb.init(b.as_mut_ptr(), 4);
395 412
396 assert_eq!(rb.is_empty(), true); 413 assert_eq!(rb.is_empty(), true);
414 assert_eq!(rb.is_half_full(), false);
397 assert_eq!(rb.is_full(), false); 415 assert_eq!(rb.is_full(), false);
398 416
399 rb.writer().push(|buf| { 417 rb.writer().push(|buf| {
@@ -406,6 +424,7 @@ mod tests {
406 }); 424 });
407 425
408 assert_eq!(rb.is_empty(), false); 426 assert_eq!(rb.is_empty(), false);
427 assert_eq!(rb.is_half_full(), true);
409 assert_eq!(rb.is_full(), true); 428 assert_eq!(rb.is_full(), true);
410 429
411 rb.writer().push(|buf| { 430 rb.writer().push(|buf| {
@@ -415,6 +434,7 @@ mod tests {
415 }); 434 });
416 435
417 assert_eq!(rb.is_empty(), false); 436 assert_eq!(rb.is_empty(), false);
437 assert_eq!(rb.is_half_full(), true);
418 assert_eq!(rb.is_full(), true); 438 assert_eq!(rb.is_full(), true);
419 439
420 rb.reader().pop(|buf| { 440 rb.reader().pop(|buf| {
@@ -424,6 +444,7 @@ mod tests {
424 }); 444 });
425 445
426 assert_eq!(rb.is_empty(), false); 446 assert_eq!(rb.is_empty(), false);
447 assert_eq!(rb.is_half_full(), true);
427 assert_eq!(rb.is_full(), false); 448 assert_eq!(rb.is_full(), false);
428 449
429 rb.reader().pop(|buf| { 450 rb.reader().pop(|buf| {
@@ -432,6 +453,7 @@ mod tests {
432 }); 453 });
433 454
434 assert_eq!(rb.is_empty(), false); 455 assert_eq!(rb.is_empty(), false);
456 assert_eq!(rb.is_half_full(), true);
435 assert_eq!(rb.is_full(), false); 457 assert_eq!(rb.is_full(), false);
436 458
437 rb.reader().pop(|buf| { 459 rb.reader().pop(|buf| {
@@ -447,6 +469,7 @@ mod tests {
447 }); 469 });
448 470
449 assert_eq!(rb.is_empty(), true); 471 assert_eq!(rb.is_empty(), true);
472 assert_eq!(rb.is_half_full(), false);
450 assert_eq!(rb.is_full(), false); 473 assert_eq!(rb.is_full(), false);
451 474
452 rb.reader().pop(|buf| { 475 rb.reader().pop(|buf| {
@@ -460,14 +483,28 @@ mod tests {
460 1 483 1
461 }); 484 });
462 485
486 assert_eq!(rb.is_empty(), false);
487 assert_eq!(rb.is_half_full(), false);
488 assert_eq!(rb.is_full(), false);
489
463 rb.writer().push(|buf| { 490 rb.writer().push(|buf| {
464 assert_eq!(3, buf.len()); 491 assert_eq!(3, buf.len());
465 buf[0] = 11; 492 buf[0] = 11;
466 buf[1] = 12; 493 1
467 2 494 });
495
496 assert_eq!(rb.is_empty(), false);
497 assert_eq!(rb.is_half_full(), true);
498 assert_eq!(rb.is_full(), false);
499
500 rb.writer().push(|buf| {
501 assert_eq!(2, buf.len());
502 buf[0] = 12;
503 1
468 }); 504 });
469 505
470 assert_eq!(rb.is_empty(), false); 506 assert_eq!(rb.is_empty(), false);
507 assert_eq!(rb.is_half_full(), true);
471 assert_eq!(rb.is_full(), false); 508 assert_eq!(rb.is_full(), false);
472 509
473 rb.writer().push(|buf| { 510 rb.writer().push(|buf| {
@@ -477,6 +514,7 @@ mod tests {
477 }); 514 });
478 515
479 assert_eq!(rb.is_empty(), false); 516 assert_eq!(rb.is_empty(), false);
517 assert_eq!(rb.is_half_full(), true);
480 assert_eq!(rb.is_full(), true); 518 assert_eq!(rb.is_full(), true);
481 } 519 }
482 } 520 }
@@ -490,6 +528,7 @@ mod tests {
490 rb.init(b.as_mut_ptr(), b.len()); 528 rb.init(b.as_mut_ptr(), b.len());
491 529
492 assert_eq!(rb.is_empty(), true); 530 assert_eq!(rb.is_empty(), true);
531 assert_eq!(rb.is_half_full(), true);
493 assert_eq!(rb.is_full(), true); 532 assert_eq!(rb.is_full(), true);
494 533
495 rb.writer().push(|buf| { 534 rb.writer().push(|buf| {