diff options
| author | Matteo Meluzzi <[email protected]> | 2025-10-02 10:53:31 +0200 |
|---|---|---|
| committer | Matteo Meluzzi <[email protected]> | 2025-10-02 10:53:31 +0200 |
| commit | 828a8df18d04877df1f55f04354980b28ff2f2f8 (patch) | |
| tree | c4fa405f5eba7a14b6d435d6cc746c9e0dc52632 /embassy-hal-internal/src/atomic_ring_buffer.rs | |
| parent | 176649e71ad442ca9856af6c11989b0b2f228c4b (diff) | |
| parent | 194a721d0eab929a2af0a2a4e45ca8e70e0d3f0a (diff) | |
Merge branch 'main' into 17-add-support-for-boot-protocol
Diffstat (limited to 'embassy-hal-internal/src/atomic_ring_buffer.rs')
| -rw-r--r-- | embassy-hal-internal/src/atomic_ring_buffer.rs | 43 |
1 files changed, 41 insertions, 2 deletions
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| { |
