30#ifndef DWFRAMEWORK_DWNODES_SENSORS_DWSENSORNODE_DWSENSORDRAINERTEMPLATE_HPP_
31#define DWFRAMEWORK_DWNODES_SENSORS_DWSENSORNODE_DWSENSORDRAINERTEMPLATE_HPP_
43#include <dw/core/base/Types.h>
44#include <dw/sensors/Sensors.h>
45#include <dw/sensors/canbus/CAN.h>
46#include <dw/sensors/radar/Radar.h>
51#if defined(DW_SDK_BUILD_EXPERIMENTAL) && defined(LINUX)
52#include <dwexperimental/sensors/lockstep/Lockstep.h>
53#include <dwexperimental/sensors/Sensors.h>
74template <
typename ProcessedDataType,
typename ReadProcessedDataFunc,
typename DataSourceType>
78 static constexpr char LOG_TAG[] =
"dwBaseDrainerTemplate";
115 if (status != DW_SUCCESS)
126 if (ret != DW_SUCCESS)
136 virtual dwStatus
getNextData(ProcessedDataType* outFrame, dwTime_t timeout)
144 if (status != DW_SUCCESS)
146 DW_LOGE <<
"getNextData: readNextData error!" << Logger::State::endl;
156 if (ret != DW_SUCCESS)
158 DW_LOGE <<
"getNextData: readNextData error!" << Logger::State::endl;
172 if (status != DW_SUCCESS)
184 virtual dwStatus
tryRead(ProcessedDataType* outFrame,
185 dwTime_t& latestTimestamp,
187 bool isDroppingData =
false)
189 dwStatus status = DW_FAILURE;
203 if (status != DW_SUCCESS)
217 if (status != DW_SUCCESS)
219 DW_LOGE <<
"tryRead: getNextData error!" << Logger::State::endl;
225 DW_LOGW <<
m_name <<
" Dropping data" << Logger::State::endl;
232 latestTimestamp = nextTime;
286 if (timeToNextData >= timeout)
294 DW_LOGD <<
"isVirtualDataReady: timeToNextData is larger than m_blockingTimeout, must read some data. "
295 <<
"timeToNextData: " << timeToNextData <<
", dataTime: " << dataTime << Logger::State::endl;
302 if (timeToNextData <= 0)
321 dwTime_t& timestampOutput,
322 dwTime_t& nextTimestampOutput,
323 dwTime_t virtualSyncTime)
327 dwStatus status = DW_SUCCESS;
332 int32_t drainCount = 0;
344 status =
readProcessedData(processedOutput, timestampOutput, readTimeout, drainCount > 0);
348#if defined(DW_SDK_BUILD_EXPERIMENTAL) && defined(LINUX)
355 DW_LOGE <<
m_name <<
" blockingTimeout not sufficient to successfully waitForNewData. No data available!" << Logger::State::endl;
367 virtual dwStatus
readProcessedData(ProcessedDataType* outFrame, dwTime_t& latestTimestamp, dwTime_t timeout,
bool isDroppingData =
false) = 0;
376 nextTimestampOutput = 0;
378 if (nextTimeStatus != DW_SUCCESS)
380 DW_LOGD <<
m_name <<
" Failed to get next timestamp: " << dwGetStatusName(nextTimeStatus);
411template <
typename ProcessedDataType,
typename ReadProcessedDataFunc>
415 static constexpr char LOG_TAG[] =
"dwSensorDrainerTemplate";
426 dwTime_t timeout)
override
428#if defined(DW_SDK_BUILD_EXPERIMENTAL) && defined(LINUX)
432 if (nextStatus == DW_SUCCESS || nextStatus == DW_END_OF_STREAM)
445 if (res != DW_SUCCESS)
461 dwTime_t& latestTimestamp,
463 bool isDroppingData =
false)
override
465 dwStatus status =
Base::tryRead(outFrame, latestTimestamp, timeout, isDroppingData);
492 if (!readCb(dataEvent))
494 DW_LOGW <<
"replayDroppedFrames: Trace cannot be read." << Logger::State::endl;
495 return DW_END_OF_STREAM;
502 dwTime_t timestampOutput{};
504 if (status == DW_END_OF_STREAM)
508 else if (status == DW_SUCCESS)
512 if (timestampOutput != dataEvent.
timestamp)
514 DW_LOGE <<
"replayDroppedFrames: Data/trace mismatch: current: " << timestampOutput <<
" recorded: " << dataEvent.
timestamp << Logger::State::endl;
515 throw Exception(DW_FAILURE,
"dwSensorDrainerTemplate: replayDroppedFrames: data/trace mismatch.");
520 DW_LOGE <<
"replayDroppedFrames: Cannot read next data." << Logger::State::endl;
521 throw Exception(DW_FAILURE,
"dwSensorDrainerTemplate: replayDroppedFrames: cannot read next data.");
524 }
while (isDropEvent);
535 dwTime_t& timestampOutput,
544 if (status == DW_END_OF_STREAM)
551 if (status != DW_SUCCESS)
566 if (status != DW_SUCCESS && status != DW_END_OF_STREAM)
568 DW_LOGE <<
"replayProcessedData: Cannot read next data." << Logger::State::endl;
569 throw Exception(DW_FAILURE,
"dwSensorDrainerTemplate: replayProcessedData: cannot read next data.");
573 if (timestampOutput != de.timestamp)
575 DW_LOGE <<
"replayProcessedData: Data/trace mismatch." << Logger::State::endl;
576 throw Exception(DW_FAILURE,
"dwSensorDrainerTemplate: replayProcessedData: data/trace mismatch.");
581 DW_LOGE <<
"replayProcessedData: UnhandledEventType." << Logger::State::endl;
582 throw Exception(DW_FAILURE,
"dwSensorDrainerTemplate: unhandled event type");
588#if defined(DW_SDK_BUILD_EXPERIMENTAL) && defined(LINUX)
593 bool isDataAvailable =
false;
596 char8_t const* protocol;
598 throw Exception(DW_FAILURE,
"dwSensorDrainerTemplate: can't get the data available flag from:", protocol,
" sensor");
601 if (!isDataAvailable && status != DW_SUCCESS)
603 status = DW_TIME_OUT;
619template <
typename ProcessedDataType,
typename ReadProcessedDataFunc,
typename DataSourceType>
622template <
typename ProcessedDataType,
typename ReadProcessedDataFunc>
DataEventType dataEventType
FixedString< MAX_NAME_LEN > Name_t
ISensorNode::DataEventReadCallback DataEventReadCallback
dwTime_t m_stashedNextTime
void populateNextTimestamp(dwTime_t &nextTimestampOutput)
virtual dwStatus tryRead(ProcessedDataType *outFrame, dwTime_t &latestTimestamp, dwTime_t timeout, bool isDroppingData=false)
static constexpr int32_t DRAIN_SENSOR_DATA_COUNT_MAX
void setOnDataDropped(OnDataDropped onDataDropped)
dwTime_t m_virtualSyncTime
dw::core::Function< void(dwTime_t const)> OnDataDropped
virtual dwStatus getNextTimestamp(dwTime_t ×tamp, dwTime_t timeout)
virtual dwTime_t getReadTimeout() const
virtual dwStatus getNextData(ProcessedDataType *outFrame, dwTime_t timeout)
dwTime_t m_nonBlockingTimeout
virtual void setLockstepDeterministicMode(bool enable)
dwBaseDrainerTemplate(dwSensorDrainerParams params, std::unique_ptr< ReadProcessedDataFunc > readProcessedDataFunc, DataSourceType dataSource)
virtual dwStatus drainProcessedData(ProcessedDataType *processedOutput, dwTime_t ×tampOutput, dwTime_t &nextTimestampOutput, dwTime_t virtualSyncTime)
bool m_lockstepDeterministicMode
DataSourceType m_dataSource
FixedString< 32 > m_frameReadMask
static constexpr char LOG_TAG[]
virtual void setVirtualSyncTime(dwTime_t virtualSyncTime)
virtual bool isVirtualDataReady(dwTime_t dataTime, dwTime_t timeout)
dwTime_t m_blockingTimeout
virtual void isLockstepDataAvailable(dwStatus &status, dwTime_t &readTimeout)
std::unique_ptr< ReadProcessedDataFunc > m_readProcessedDataFunc
virtual dwStatus readProcessedData(ProcessedDataType *outFrame, dwTime_t &latestTimestamp, dwTime_t timeout, bool isDroppingData=false)=0
static constexpr dwTime_t REPLAY_SENSOR_READ_TIMEOUT
OnDataDropped m_onDataDropped
dwStatus readNextWithFrameMask(dwTime_t timeout)
dwStatus readProcessedData(ProcessedDataType *outFrame, dwTime_t &latestTimestamp, dwTime_t timeout, bool isDroppingData=false) override
dwSensorDrainerTemplate(dwSensorDrainerParams params, std::unique_ptr< ReadProcessedDataFunc > readProcessedDataFunc, dwSensorHandle_t hsensor)
virtual dwStatus replayProcessedData(ProcessedDataType *processedOutput, dwTime_t ×tampOutput, SensorNode::DataEventReadCallback readCb)
static constexpr char LOG_TAG[]
virtual ~dwSensorDrainerTemplate()=default
virtual dwStatus reset() override
dwStatus getNextTimestamp(dwTime_t ×tamp, dwTime_t timeout) override
dwStatus replayDroppedFrames(ProcessedDataType *processedOutput, SensorNode::DataEvent &dataEvent, SensorNode::DataEventReadCallback readCb)
const char * frameReadMask
dwTime_t nonBlockingTimeout