blob: 3d2e2833c2717930401a9c947bea55135e53c310 [file] [log] [blame]
Brian Silvermaneda63f32017-10-08 18:57:33 -04001#include "motors/usb/queue.h"
2
3#include <string.h>
4
Austin Schuhd9af8f52021-12-31 21:50:35 -08005#include <algorithm>
6
Stephan Pleinesf63bde82024-01-13 15:59:33 -08007namespace frc971::teensy {
Brian Silvermaneda63f32017-10-08 18:57:33 -04008
9size_t Queue::Read(char *out_data, size_t out_size) {
10 const size_t read_cursor = read_cursor_.load(::std::memory_order_relaxed);
11 const size_t write_cursor = write_cursor_.load(::std::memory_order_acquire);
12 const size_t r = ::std::min(out_size, space_used(read_cursor, write_cursor));
13 const size_t first_chunk = ::std::min(r, size_ - read_cursor);
14 memcpy(out_data, &data_[read_cursor], first_chunk);
15 memcpy(out_data + first_chunk, &data_[0], r - first_chunk);
16 read_cursor_.store(wrap(read_cursor + r), ::std::memory_order_release);
17 return r;
18}
19
20size_t Queue::Write(const char *in_data, size_t in_size) {
21 const size_t write_cursor = write_cursor_.load(::std::memory_order_relaxed);
22 const size_t read_cursor = read_cursor_.load(::std::memory_order_acquire);
23 const size_t r =
24 ::std::min(in_size, size_ - space_used(read_cursor, write_cursor) - 1);
25 const size_t first_chunk = ::std::min(r, size_ - write_cursor);
26 memcpy(&data_[write_cursor], in_data, first_chunk);
27 memcpy(&data_[0], in_data + first_chunk, r - first_chunk);
28 write_cursor_.store(wrap(write_cursor + r), ::std::memory_order_release);
29 return r;
30}
31
Stephan Pleinesf63bde82024-01-13 15:59:33 -080032} // namespace frc971::teensy