rogue
Loading...
Searching...
No Matches
SplitterV2.cpp
Go to the documentation of this file.
1
17#include "rogue/Directives.h"
18
20
21#include <stdint.h>
22
23#include <cmath>
24#include <memory>
25#include <thread>
26
27#include "rogue/GilRelease.h"
28#include "rogue/Logging.h"
36
39
40#ifndef NO_PYTHON
41 #include <boost/python.hpp>
42namespace bp = boost::python;
43#endif
44
46rpb::SplitterV2Ptr rpb::SplitterV2::create() {
47 rpb::SplitterV2Ptr p = std::make_shared<rpb::SplitterV2>();
48 return (p);
49}
50
52void rpb::SplitterV2::setup_python() {
53#ifndef NO_PYTHON
54 bp::class_<rpb::SplitterV2, rpb::SplitterV2Ptr, bp::bases<ris::Master, ris::Slave>, boost::noncopyable>(
55 "SplitterV2",
56 bp::init<>());
57#endif
58}
59
61rpb::SplitterV2::SplitterV2() : ris::Master(), ris::Slave() {}
62
64rpb::SplitterV2::~SplitterV2() {}
65
67void rpb::SplitterV2::acceptFrame(ris::FramePtr frame) {
68 rpb::CoreV2 core;
69 ris::FramePtr nFrame;
70 rpb::DataPtr data;
71 uint32_t x;
72
73 // Lock frame
75 ris::FrameLockPtr lock = frame->lock();
76
77 core.processFrame(frame);
78
79 for (x = 0; x < core.count(); x++) {
80 data = core.record(x);
81
82 // Create a new frame
83 nFrame = reqFrame(data->size(), true);
84 nFrame->setPayload(data->size());
85
86 ris::FrameIterator fIter = nFrame->begin();
87 ris::FrameIterator dIter = data->begin();
88 ris::copyFrame(dIter, data->size(), fIter);
89
90 // Set flags
91 nFrame->setFirstUser(data->fUser());
92 nFrame->setLastUser(data->lUser());
93 nFrame->setChannel(data->dest());
94
95 sendFrame(nFrame);
96 }
97}
RAII helper that releases the Python GIL for a scope.
Definition GilRelease.h:36
Random-access byte iterator across a Frame payload.
Parser for SLAC AXI Batcher v2 super-frames.
Definition CoreV2.h:58
uint32_t count()
Returns number of parsed records.
Definition CoreV2.cpp:83
bool processFrame(std::shared_ptr< rogue::interfaces::stream::Frame > frame)
Parses a batched frame and populates parser state.
Definition CoreV2.cpp:149
std::shared_ptr< rogue::protocols::batcher::Data > & record(uint32_t index)
Returns parsed data record descriptor by index.
Definition CoreV2.cpp:132
static void copyFrame(rogue::interfaces::stream::FrameIterator &srcIter, uint32_t size, rogue::interfaces::stream::FrameIterator &dstIter)
Copies bytes between frame iterators.
std::shared_ptr< rogue::interfaces::stream::Frame > FramePtr
Shared pointer alias for Frame.
Definition Frame.h:549
std::shared_ptr< rogue::interfaces::stream::FrameLock > FrameLockPtr
Shared pointer alias for FrameLock.
Definition FrameLock.h:110
std::shared_ptr< rogue::protocols::batcher::SplitterV2 > SplitterV2Ptr
Definition SplitterV2.h:87
std::shared_ptr< rogue::protocols::batcher::Data > DataPtr
Definition Data.h:148