@@ -73,33 +73,39 @@ class SignalHelper
7373 return data;
7474 }
7575
76- void send (const std::vector<std::pair<T, uint64_t >>& data, size_t packSize = 3 ) const
76+ auto send (const std::vector<std::pair<T, uint64_t >>& data, uint32_t delay = 0 , size_t packSize = 3 ) const
7777 {
78- if (packSize == 0 )
79- packSize = 1 ;
80- auto sendPacket = [this ](SignalConfigPtr signal, const std::vector<T>& data, DataPacketPtr domainPacket)
81- {
82- auto dataPacket = DataPacketWithDomain (domainPacket, signal0.getDescriptor (), data.size ());
83- copyData (dataPacket, data);
84- signal.sendPacket (dataPacket);
85- };
86- for (size_t i = 0 ; i < data.size (); i += packSize)
87- {
88- std::vector<T> dataPack;
89- std::vector<uint64_t > tsPack;
90- for (size_t j = 0 ; j < packSize && (j + i) < data.size (); j++)
91- {
92- dataPack.push_back (data[j + i].first );
93- tsPack.push_back (data[j + i].second );
94- }
95-
96- auto domainPacket = DataPacket (signal0.getDomainSignal ().getDescriptor (), tsPack.size (), i);
97- memcpy (domainPacket.getData (), tsPack.data (), sizeof (uint64_t ) * tsPack.size ());
98- SignalConfigPtr dSignal = signal0.getDomainSignal ();
99- dSignal.sendPacket (domainPacket);
100- sendPacket (signal0, dataPack, domainPacket);
101- sendPacket (signal1, dataPack, domainPacket);
102- }
78+ return std::async (std::launch::async,
79+ [this , &data, packSize, delay]() mutable
80+ {
81+ if (packSize == 0 )
82+ packSize = 1 ;
83+ auto sendPacket = [this ](SignalConfigPtr signal, const std::vector<T>& data, DataPacketPtr domainPacket)
84+ {
85+ auto dataPacket = DataPacketWithDomain (domainPacket, signal0.getDescriptor (), data.size ());
86+ copyData (dataPacket, data);
87+ signal.sendPacket (std::move (dataPacket));
88+ };
89+ for (size_t i = 0 ; i < data.size (); i += packSize)
90+ {
91+ if (i != 0 && delay != 0 )
92+ std::this_thread::sleep_for (std::chrono::milliseconds (delay));
93+ std::vector<T> dataPack;
94+ std::vector<uint64_t > tsPack;
95+ for (size_t j = 0 ; j < packSize && (j + i) < data.size (); j++)
96+ {
97+ dataPack.push_back (data[j + i].first );
98+ tsPack.push_back (data[j + i].second );
99+ }
100+
101+ auto domainPacket = DataPacket (signal0.getDomainSignal ().getDescriptor (), tsPack.size (), i);
102+ memcpy (domainPacket.getData (), tsPack.data (), sizeof (uint64_t ) * tsPack.size ());
103+ SignalConfigPtr dSignal = signal0.getDomainSignal ();
104+ dSignal.sendPacket (domainPacket);
105+ sendPacket (signal0, dataPack, domainPacket);
106+ sendPacket (signal1, dataPack, domainPacket);
107+ }
108+ });
103109 }
104110
105111protected:
@@ -493,6 +499,8 @@ class MqttPublisherFbHelper : public DaqTestHelper
493499 SignalHelper<T>& helper,
494500 const std::vector<std::pair<T, uint64_t >>& data, bool isMultimessage = false )
495501 {
502+ constexpr uint32_t DELAY_BETWEEN_PACKS= 20 ;
503+ constexpr uint32_t BASE_TIMEOUT = 5000 ;
496504 std::promise<bool > receivedPromise;
497505 auto receivedFuture = receivedPromise.get_future ();
498506 std::atomic<bool > done{false };
@@ -501,12 +509,13 @@ class MqttPublisherFbHelper : public DaqTestHelper
501509 else
502510 subscriber->expectMsgs (topic, messages, receivedPromise, done);
503511
504- helper::utils::Timer receiveTimer (5000 );
512+ helper::utils::Timer receiveTimer (BASE_TIMEOUT + data. size () * DELAY_BETWEEN_PACKS );
505513 bool ok = subscriber->subscribe (topic, 2 );
506514 if (!ok)
507515 return false ;
508- helper.send (data);
516+ auto future = helper.send (data, DELAY_BETWEEN_PACKS );
509517 auto status = receivedFuture.wait_for (receiveTimer.remain ());
518+ future.wait ();
510519 subscriber = nullptr ;
511520 ok = (status == std::future_status::ready) && receivedFuture.get ();
512521 return ok;
0 commit comments