31#ifndef DW_FRAMEWORK_PORT_H_
32#define DW_FRAMEWORK_PORT_H_
86 static constexpr char LOG_TAG[] =
"PortOutput";
100 : m_reference(std::move(ref))
108 , m_waiterAttrs(waiterAttrs)
109 , m_signalerAttrs(signalerAttrs)
116 auto ref = make_specimen<T>(&m_reference);
127 FRWK_LOGE <<
"PortOutput: bindChannel: attempted to bind the same port twice, ignoring this bind!" << Logger::State::endl;
130 if (channel ==
nullptr)
132 throw Exception(DW_INVALID_ARGUMENT,
"PortOutput: bindChannel: expected channel != nullptr");
146 if (m_channelProducer ==
nullptr)
148 throw Exception(DW_INTERNAL_ERROR,
"PortOutput bindChannel: wrong channel implementations returned.");
157 throw Exception(DW_NOT_AVAILABLE,
"PortOutput: setOnDataReady: no bound channel");
164 return (m_channelProducer !=
nullptr);
167 dwStatus
wait(dwTime_t timeout)
171 throw Exception(DW_NOT_AVAILABLE,
"PortInput: wait: no bound channel");
174 return m_channelProducer->
wait(timeout);
181 dwStatus status = DW_FAILURE;
183 if (m_channelProducer)
185 status = m_channelProducer->
get(&genericData);
188 if (status != DW_SUCCESS)
198 return genericData.template getData<T>();
202 virtual dwStatus
send(T* frame)
204 if (!m_channelProducer)
206 throw Exception(DW_NOT_AVAILABLE,
"PortOutput: channel not bound");
214 return m_channelProducer->
send(frame);
219 if (!m_channelProducer)
221 throw Exception(DW_NOT_AVAILABLE,
"PortOutput: channel not bound");
240 if (!m_channelProducer)
242 throw Exception(DW_NOT_AVAILABLE,
"PortOutput: channel not bound");
274 static constexpr char LOG_TAG[] =
"PortInput";
287 : m_reference(std::move(ref))
297 : m_waiterAttrs(waiterAttrs)
298 , m_signalerAttrs(signalerAttrs)
306 , m_waiterAttrs(waiterAttrs)
307 , m_signalerAttrs(signalerAttrs)
321 FRWK_LOGE <<
"PortInput: bindChannel: attempted to bind the same port twice, ignoring this bind!" << Logger::State::endl;
324 if (channel ==
nullptr)
326 throw Exception(DW_INVALID_ARGUMENT,
"PortInput: bindChannel: expected channel != nullptr");
330 auto ref = make_specimen<T>(
nullptr);
334 ref = make_specimen<T>(&m_reference.value());
342 ref.setWaiterAttributes = m_waiterAttrs;
343 ref.setSignalerAttributes = m_signalerAttrs;
346 if (m_channelConsumer ==
nullptr)
348 throw Exception(DW_INTERNAL_ERROR,
"PortInput bindChannel: wrong channel implementations returned.");
356 return !(m_channelConsumer ==
nullptr);
363 throw Exception(DW_NOT_AVAILABLE,
"PortInput: setOnDataReady: no bound channel");
369 dwStatus
wait(dwTime_t timeout)
373 throw Exception(DW_NOT_AVAILABLE,
"PortInput: wait: no bound channel");
385 return DW_NOT_AVAILABLE;
392 dwTime_t waitTime = m_last ? 0 : timeout;
393 dwStatus status = m_channelConsumer->
wait(waitTime);
394 if (m_last && (status == DW_TIME_OUT || status == DW_NOT_AVAILABLE))
403 virtual std::shared_ptr<T>
recv()
406 std::shared_ptr<T> result;
412 T* typedData =
nullptr;
413 void* releasePtr =
nullptr;
419 releasePtr = data.getPointer();
429 dwStatus status = m_channelConsumer->
recv(&data);
430 if (status != DW_SUCCESS)
432 if (m_last !=
nullptr)
441 releasePtr = data.getPointer();
453 typedData = data.template getData<T>();
458 auto* channelConsumer = m_channelConsumer;
459 result = std::shared_ptr<T>(typedData, [channelConsumer, releasePtr](T*) {
460 channelConsumer->release(releasePtr);
472 if (!m_channelConsumer)
474 throw Exception(DW_NOT_AVAILABLE,
"PortInput: channel not bound");
483 throw Exception(DW_NOT_SUPPORTED,
"PortInput: not supported");
493 if (!m_channelConsumer)
495 throw Exception(DW_NOT_AVAILABLE,
"PortInput: channel not bound");
504 throw Exception(DW_NOT_SUPPORTED,
"PortInput: not supported");
515 std::shared_ptr<T> m_last{};
516 dw::core::Optional<SpecimenT> m_reference{};
522constexpr char PortInput<T>::LOG_TAG[];
virtual dwStatus recv(GenericData *data)=0
virtual dwStatus wait(dwTime_t timeout)=0
virtual void setOnDataReady(void *opaque, OnDataReady onDataReady)=0
dw::core::Function< void()> OnDataReady
SyncWaiter & getSyncWaiter()
SyncSignaler & getSyncSignaler()
virtual dwStatus get(GenericData *data)=0
virtual dwStatus send(void *data)=0
virtual void setSignalFences(void *data, dw::core::span< const NvSciSyncFence > postFences)=0
virtual void getWaitFences(void *data, dw::core::span< NvSciSyncFence > &waitFences)=0
virtual Producer * getProducer(GenericDataReference ref)=0
virtual const ChannelParams & getParams() const =0
virtual Consumer * getConsumer(GenericDataReference ref)=0
bool getReuseEnabled() const
static dwStatus guard(TryBlock tryBlock, dw::core::Logger::Verbosity verbosity=dw::core::Logger::Verbosity::DEBUG)
virtual ~PortBase()=default
dwStatus wait(dwTime_t timeout)
static constexpr char LOG_TAG[]
dwStatus bindChannelWithReference(ChannelObject *channel, GenericDataReference &ref)
dwStatus bindChannel(ChannelObject *channel) override
void setOnDataReady(void *opaque, ChannelObject::PacketPool::OnDataReady onDataReady)
PortOutput(SpecimenT const &ref)
typename parameter_traits< T >::SpecimenT SpecimenT
ChannelObject::SyncSignaler & getSyncSignaler()
PortOutput(SpecimenT const &ref, OnSetSyncAttrs signalerAttrs, OnSetSyncAttrs waiterAttrs={})
void setSignalFences(T *frame, dw::core::span< NvSciSyncFence > fences)
ChannelObject::SyncWaiter & getSyncWaiter()
void getWaitFences(T *frame, dw::core::span< NvSciSyncFence > fences)
static constexpr PortDirection DIRECTION
PortOutput(SpecimenT &&ref)
virtual dwStatus send(T *frame)
virtual dwStatus bindChannel(ChannelObject *channel)=0
virtual dwStatus initialize()
T * extractInternalPacket(GenericData genericData)
SyncedPacketPayload * getSyncPacket(T *frame)
void parseDataSynced(const ChannelParams ¶ms) override
dw::core::Function< void(NvSciSyncAttrList)> OnSetSyncAttrs
OnSetSyncAttrs setSignalerAttributes
ChannelPacketTypeID packetTypeID
OnSetSyncAttrs setWaiterAttributes
ChannelPacketTypeID getNewPacketID(ChannelPacketTypeID packetTypeID)
virtual void parseDataSynced(const ChannelParams ¶ms)