rogue
Loading...
Searching...
No Matches
CoreV2.cpp
Go to the documentation of this file.
1
39
40#include <inttypes.h>
41#include <stdint.h>
42
43#include <cmath>
44#include <memory>
45#include <thread>
46
47#include "rogue/GeneralError.h"
51
54
56rpb::CoreV2Ptr rpb::CoreV2::create() {
57 rpb::CoreV2Ptr p = std::make_shared<rpb::CoreV2>();
58 return (p);
59}
60
62void rpb::CoreV2::setup_python() {}
63
65rpb::CoreV2::CoreV2() {
66 log_ = rogue::Logging::create("batcher.CoreV2");
67
68 headerSize_ = 2; // Always 2 byte header
69 tailSize_ = 7; // Always 7 byte tail
70 seq_ = 0;
71}
72
74rpb::CoreV2::~CoreV2() {}
75
77void rpb::CoreV2::initSize(uint32_t size) {
78 list_.reserve(size);
79 tails_.reserve(size);
80}
81
83uint32_t rpb::CoreV2::count() {
84 return list_.size();
85}
86
88uint32_t rpb::CoreV2::headerSize() {
89 return headerSize_;
90}
91
93ris::FrameIterator rpb::CoreV2::beginHeader() {
94 return frame_->begin();
95}
96
98ris::FrameIterator rpb::CoreV2::endHeader() {
99 return frame_->begin() + headerSize_;
100}
101
103uint32_t rpb::CoreV2::tailSize() {
104 return tailSize_;
105}
106
108ris::FrameIterator rpb::CoreV2::beginTail(uint32_t index) {
109 if (index >= tails_.size())
110 throw(rogue::GeneralError::create("bather::CoreV2::beginTail",
111 "Attempt to get tail index %" PRIu32 " in message with %" PRIu32 " tails",
112 index,
113 tails_.size()));
114
115 // Invert order on return
116 return tails_[(tails_.size() - 1) - index];
117}
118
120ris::FrameIterator rpb::CoreV2::endTail(uint32_t index) {
121 if (index >= tails_.size())
122 throw rogue::GeneralError::create("batcher::CoreV2::tail",
123 "Attempt to access tail %" PRIu32 " in frame with %" PRIu32 " tails",
124 index,
125 tails_.size());
126
127 // Invert order on return
128 return tails_[(tails_.size() - 1) - index] + tailSize_;
129}
130
132rpb::DataPtr& rpb::CoreV2::record(uint32_t index) {
133 if (index >= list_.size())
134 throw rogue::GeneralError::create("batcher::CoreV2::record",
135 "Attempt to access record %" PRIu32 " in frame with %" PRIu32 " records",
136 index,
137 tails_.size());
138
139 // Invert order on return
140 return list_[(list_.size() - 1) - index];
141}
142
144uint32_t rpb::CoreV2::sequence() {
145 return seq_;
146}
147
149bool rpb::CoreV2::processFrame(ris::FramePtr frame) {
150 uint8_t temp;
151 uint32_t rem;
152 uint32_t fSize;
153 uint8_t dest;
154 uint8_t fUser;
155 uint8_t lUser;
156
157 // Reset old data
158 reset();
159
163
164 // Drop errored frames
165 if ((frame->getError())) {
166 log_->warning("Dropping frame due to error: 0x%" PRIx8, frame->getError());
167 return false;
168 }
169
170 // Drop small frames: 10 = 2 byte header + 1 byte payload + 7 byte tail
171 if ((rem = frame->getPayload()) < 10) {
172 log_->warning("Dropping small frame size = %" PRIu32, frame->getPayload());
173 return false;
174 }
175
176 // Get version & size
177 beg = frame->begin();
178 ris::fromFrame(beg, 1, &temp);
179
181 // Super-Frame Header in firmware: 2 bytes
183 // v.txMaster.tValid := '1';
184 // v.txMaster.tData(3 downto 0) := x"2"; -- Version = 0x2
185 // v.txMaster.tData(7 downto 4) := Reserved
186 // v.txMaster.tData(15 downto 8) := r.seqCnt;
187 // ssiSetUserSof(AXIS_CONFIG_G, v.txMaster, '1');
189
190 // Check version, convert width
191 if ((temp & 0xF) != 2) {
192 log_->error("Version mismatch. Got %" PRIu8, (temp & 0xF));
193 return false;
194 }
195
196 // Get sequence #
197 ris::fromFrame(beg, 1, &seq_);
198
199 // Compute remaining frame size
200 rem -= headerSize_;
201
202 // Set marker to end of frame
203 mark = frame->end();
204
205 // Process each frame, stop when we have reached just after the header
206 while (mark != beg) {
207 // sanity check
208 if (rem < tailSize_) {
209 log_->error("Not enough space (%" PRIu32 ") for tail (%" PRIu32 ")", rem, tailSize_);
210 reset();
211 return false;
212 }
213
214 // Jump to start of the tail
215 mark -= tailSize_;
216 rem -= tailSize_;
217
218 // Add tail iterator to end of list
219 tails_.push_back(mark);
220
221 // Get tail data, use a new iterator
222 tail = mark;
223 ris::fromFrame(tail, 4, &fSize);
224 ris::fromFrame(tail, 1, &dest);
225 ris::fromFrame(tail, 1, &fUser);
226 ris::fromFrame(tail, 1, &lUser);
227
228 // Not enough data for rewind value
229 if (fSize > rem) {
230 log_->error("Not enough space (%" PRIu32 ") for frame (%" PRIu32 ")", rem, fSize);
231 reset();
232 return false;
233 }
234
235 // Set marker to start of data
236 mark -= fSize;
237 rem -= fSize;
238
239 // Create data record and add it to end of list
240 list_.push_back(rpb::Data::create(mark, fSize, dest, fUser, lUser));
241 }
242 return true;
243}
244
246void rpb::CoreV2::reset() {
247 frame_.reset();
248 list_.clear();
249 tails_.clear();
250}
static GeneralError create(std::string src, const char *fmt,...)
Creates a formatted error instance.
static std::shared_ptr< rogue::Logging > create(const std::string &name, bool quiet=false)
Creates a logger instance.
Definition Logging.cpp:60
Random-access byte iterator across a Frame payload.
static void fromFrame(rogue::interfaces::stream::FrameIterator &iter, uint32_t size, void *dst)
Copies bytes from a frame iterator to a destination pointer.
std::shared_ptr< rogue::interfaces::stream::Frame > FramePtr
Shared pointer alias for Frame.
Definition Frame.h:549
std::shared_ptr< rogue::protocols::batcher::CoreV2 > CoreV2Ptr
Definition CoreV2.h:188
std::shared_ptr< rogue::protocols::batcher::Data > DataPtr
Definition Data.h:148