@@ -319,8 +319,16 @@ ASAM::CMP::DataContext StreamFb::createEncoderDataContext() const
319319 return {minFrameSize, maxFrameSize};
320320}
321321
322+ template <typename T>
323+ constexpr size_t maxCanDataSize = 64 ;
324+ template <>
325+ constexpr size_t maxCanDataSize<ASAM::CMP::CanPayload> = 8 ;
326+
327+ template <typename CanPayloadType>
322328void StreamFb::processCanPacket (const DataPacketPtr& packet)
323329{
330+ static_assert (std::is_base_of_v<ASAM::CMP::CanPayloadBase, CanPayloadType>);
331+
324332#pragma pack(push, 1)
325333 struct CANData
326334 {
@@ -345,9 +353,9 @@ void StreamFb::processCanPacket(const DataPacketPtr& packet)
345353
346354 for (size_t i = 0 ; i < sampleCount; i++)
347355 {
348- if (canData->length <= 8 )
356+ if (canData->length <= maxCanDataSize<CanPayloadType> )
349357 {
350- ASAM::CMP::CanPayload payload;
358+ CanPayloadType payload{} ;
351359 payload.setData (canData->data , canData->length );
352360 payload.setId (canData->arbId );
353361
@@ -364,46 +372,6 @@ void StreamFb::processCanPacket(const DataPacketPtr& packet)
364372 ethernetWrapper->sendPacket (rawFrame);
365373}
366374
367- void StreamFb::processCanFdPacket (const DataPacketPtr& packet)
368- {
369- #pragma pack(push, 1)
370- struct CANData
371- {
372- uint32_t arbId;
373- uint8_t length;
374- uint8_t data[64 ];
375- };
376- #pragma pack(pop)
377-
378- auto * canData = reinterpret_cast <CANData*>(packet.getData ());
379- const size_t sampleCount = packet.getSampleCount ();
380-
381- uint64_t * rawTimeBuffer = reinterpret_cast <uint64_t *>(packet.getDomainPacket ().getRawData ());
382- RatioPtr timeResolution = packet.getDomainPacket ().getDataDescriptor ().getTickResolution ();
383- size_t timeScale = 1'000'000'000 / timeResolution.getDenominator ();
384-
385- std::vector<ASAM::CMP::Packet> packets;
386- packets.reserve (sampleCount);
387-
388- for (size_t i = 0 ; i < sampleCount; i++)
389- {
390- ASAM::CMP::CanFdPayload payload;
391- payload.setData (canData->data , canData->length );
392- payload.setId (canData->arbId );
393-
394- packets.emplace_back ();
395- packets.back ().setInterfaceId (interfaceId);
396- packets.back ().setPayload (payload);
397- packets.back ().setTimestamp ((*rawTimeBuffer) * timeScale);
398-
399- canData++;
400- rawTimeBuffer++;
401- }
402-
403- for (auto & rawFrame : encoders->encode (streamId, packets.begin (), packets.end (), dataContext))
404- ethernetWrapper->sendPacket (rawFrame);
405- }
406-
407375template <SampleType SrcType>
408376void createAnalogPayloadWithInternalScaling (ASAM::CMP::AnalogPayload& payload,
409377 const daq::DataPacketPtr& packet,
@@ -505,10 +473,10 @@ void StreamFb::processDataPacket(const DataPacketPtr& packet)
505473 switch (payloadType.getType ())
506474 {
507475 case ASAM::CMP::PayloadType::can:
508- processCanPacket (packet);
476+ processCanPacket<ASAM::CMP::CanPayload> (packet);
509477 break ;
510478 case ASAM::CMP::PayloadType::canFd:
511- processCanFdPacket (packet);
479+ processCanPacket<ASAM::CMP::CanFdPayload> (packet);
512480 break ;
513481 case ASAM::CMP::PayloadType::analog:
514482 processAnalogPacket (packet);
0 commit comments