31#ifndef DW_FRAMEWORK_PORT_H_
32#define DW_FRAMEWORK_PORT_H_
86 static_assert(std::is_copy_constructible<SpecimenT>::value,
"SpecimenT is not copy constructible");
88 static constexpr char LOG_TAG[] =
"PortOutput";
102 : m_reference(std::move(ref))
110 , m_waiterAttrs(waiterAttrs)
111 , m_signalerAttrs(signalerAttrs)
118 auto ref = make_specimen<T>(&m_reference);
129 FRWK_LOGE <<
"PortOutput: bindChannel: attempted to bind the same port twice, ignoring this bind!" << Logger::State::endl;
132 if (channel ==
nullptr)
134 throw Exception(DW_INVALID_ARGUMENT,
"PortOutput: bindChannel: expected channel != nullptr");
148 if (m_channelProducer ==
nullptr)
150 throw Exception(DW_INTERNAL_ERROR,
"PortOutput bindChannel: wrong channel implementations returned.");
159 throw Exception(DW_NOT_AVAILABLE,
"PortOutput: setOnDataReady: no bound channel");
166 return (m_channelProducer !=
nullptr);
169 dwStatus
wait(dwTime_t timeout)
173 throw Exception(DW_NOT_AVAILABLE,
"PortInput: wait: no bound channel");
176 return m_channelProducer->
wait(timeout);
183 dwStatus
status = DW_FAILURE;
185 if (m_channelProducer)
187 status = m_channelProducer->
get(&genericData);
200 return genericData.template getData<T>();
204 virtual dwStatus
send(T* frame)
206 if (!m_channelProducer)
208 throw Exception(DW_NOT_AVAILABLE,
"PortOutput: channel not bound");
216 return m_channelProducer->
send(frame);
221 if (!m_channelProducer)
223 throw Exception(DW_NOT_AVAILABLE,
"PortOutput: channel not bound");
242 if (!m_channelProducer)
244 throw Exception(DW_NOT_AVAILABLE,
"PortOutput: channel not bound");
276 static constexpr char LOG_TAG[] =
"PortInput";
284 static_assert(std::is_copy_constructible<SpecimenT>::value,
"SpecimenT is not copy constructible");
291 : m_reference(std::move(ref))
301 : m_waiterAttrs(waiterAttrs)
302 , m_signalerAttrs(signalerAttrs)
310 , m_waiterAttrs(waiterAttrs)
311 , m_signalerAttrs(signalerAttrs)
325 FRWK_LOGE <<
"PortInput: bindChannel: attempted to bind the same port twice, ignoring this bind!" << Logger::State::endl;
328 if (channel ==
nullptr)
330 throw Exception(DW_INVALID_ARGUMENT,
"PortInput: bindChannel: expected channel != nullptr");
334 auto ref = make_specimen<T>(
nullptr);
338 ref = make_specimen<T>(&m_reference.value());
346 ref.setWaiterAttributes = m_waiterAttrs;
347 ref.setSignalerAttributes = m_signalerAttrs;
350 if (m_channelConsumer ==
nullptr)
352 throw Exception(DW_INTERNAL_ERROR,
"PortInput bindChannel: wrong channel implementations returned.");
360 return !(m_channelConsumer ==
nullptr);
367 throw Exception(DW_NOT_AVAILABLE,
"PortInput: setOnDataReady: no bound channel");
373 dwStatus
wait(dwTime_t timeout)
377 throw Exception(DW_NOT_AVAILABLE,
"PortInput: wait: no bound channel");
389 return DW_NOT_AVAILABLE;
396 dwTime_t waitTime = m_last ? 0 : timeout;
397 dwStatus
status = m_channelConsumer->
wait(waitTime);
398 if (m_last && (
status == DW_TIME_OUT ||
status == DW_NOT_AVAILABLE))
407 virtual std::shared_ptr<T>
recv()
410 std::shared_ptr<T> result;
416 T* typedData =
nullptr;
417 void* releasePtr =
nullptr;
423 releasePtr =
data.getPointer();
436 if (m_last !=
nullptr)
445 releasePtr =
data.getPointer();
457 typedData =
data.template getData<T>();
462 auto* channelConsumer = m_channelConsumer;
463 result = std::shared_ptr<T>(typedData, [channelConsumer, releasePtr](T*) {
464 channelConsumer->release(releasePtr);
476 if (!m_channelConsumer)
478 throw Exception(DW_NOT_AVAILABLE,
"PortInput: channel not bound");
487 throw Exception(DW_NOT_SUPPORTED,
"PortInput: not supported");
497 if (!m_channelConsumer)
499 throw Exception(DW_NOT_AVAILABLE,
"PortInput: channel not bound");
508 throw Exception(DW_NOT_SUPPORTED,
"PortInput: not supported");
519 std::shared_ptr<T> m_last{};
520 dw::core::Optional<SpecimenT> m_reference{};
526constexpr 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
dwCalibrationStatus status
OnSetSyncAttrs setWaiterAttributes
ChannelPacketTypeID getNewPacketID(ChannelPacketTypeID packetTypeID)
virtual void parseDataSynced(const ChannelParams ¶ms)