1.0.0-rc2: Fixes in preview
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
#include <random>
|
||||
#include <catch2/catch_all.hpp>
|
||||
#include "../writer/ZMQImagePuller.h"
|
||||
#include "../frame_serialize/ZMQStream2PusherGroup.h"
|
||||
#include "../frame_serialize/ZMQStream2Pusher.h"
|
||||
|
||||
void test_puller(ZMQImagePuller *puller,
|
||||
const DiffractionExperiment& x,
|
||||
@@ -53,7 +53,6 @@ void test_puller(ZMQImagePuller *puller,
|
||||
TEST_CASE("ZMQImageCommTest_1Writer","[ZeroMQ]") {
|
||||
const size_t nframes = 256;
|
||||
|
||||
ZMQContext context;
|
||||
Logger logger("test");
|
||||
DiffractionExperiment x(DetectorGeometry(1));
|
||||
x.Mode(DetectorMode::Raw);
|
||||
@@ -71,12 +70,10 @@ TEST_CASE("ZMQImageCommTest_1Writer","[ZeroMQ]") {
|
||||
std::vector<uint16_t> image1(x.GetPixelsNum()*nframes);
|
||||
for (auto &i: image1) i = dist(g1);
|
||||
|
||||
std::string zmq_addr = "ipc://*";
|
||||
|
||||
// Puller needs to be declared first, but both objects need to exist till communication finished
|
||||
// TODO: ImageSender should not allow if there are still completions to be done
|
||||
ZMQImagePuller puller(context);
|
||||
ZMQStream2PusherGroup pusher(context, {zmq_addr});
|
||||
ZMQImagePuller puller;
|
||||
ZMQStream2Pusher pusher({"ipc://*"});
|
||||
|
||||
std::vector<size_t> diff_size(1), diff_content(1), diff_split(1), nimages(1);
|
||||
|
||||
@@ -119,11 +116,87 @@ TEST_CASE("ZMQImageCommTest_1Writer","[ZeroMQ]") {
|
||||
REQUIRE(diff_content[0] == 0);
|
||||
}
|
||||
|
||||
TEST_CASE("ZMQImageCommTest_1Writer_Preview","[ZeroMQ]") {
|
||||
const size_t nframes = 1;
|
||||
|
||||
Logger logger("test");
|
||||
DiffractionExperiment x(DetectorGeometry(1));
|
||||
x.Mode(DetectorMode::Raw);
|
||||
x.PedestalG0Frames(0).NumTriggers(1).UseInternalPacketGenerator(false).PhotonEnergy_keV(12.4)
|
||||
.ImagesPerTrigger(nframes);
|
||||
|
||||
std::vector<DiffractionSpot> empty_spot_vector;
|
||||
std::vector<float> empty_rad_int_profile;
|
||||
|
||||
REQUIRE(x.GetImageNum() == nframes);
|
||||
|
||||
std::mt19937 g1(1387);
|
||||
std::uniform_int_distribution<uint16_t> dist;
|
||||
|
||||
std::vector<uint16_t> image1(x.GetPixelsNum()*nframes);
|
||||
for (auto &i: image1) i = dist(g1);
|
||||
|
||||
// Puller needs to be declared first, but both objects need to exist till communication finished
|
||||
ZMQImagePuller puller;
|
||||
ZMQStream2Pusher pusher({"ipc://*"});
|
||||
REQUIRE(pusher.GetPreviewAddress().empty());
|
||||
|
||||
pusher.PreviewSocket("ipc://*");
|
||||
REQUIRE(!pusher.GetPreviewAddress().empty());
|
||||
|
||||
ZMQSocket preview_sub_socket(ZMQSocketType::Sub);
|
||||
preview_sub_socket.Connect(pusher.GetPreviewAddress());
|
||||
preview_sub_socket.Subscribe("");
|
||||
|
||||
std::vector<size_t> diff_size(1), diff_content(1), diff_split(1), nimages(1);
|
||||
|
||||
auto pusher_addr = pusher.GetAddress();
|
||||
puller.Connect(pusher_addr[0]);
|
||||
|
||||
std::thread sender_thread = std::thread([&] {
|
||||
std::vector<uint8_t> serialization_buffer(16*1024*1024);
|
||||
CBORStream2Serializer serializer(serialization_buffer.data(), serialization_buffer.size());
|
||||
|
||||
StartMessage message {
|
||||
.images_per_file = 16,
|
||||
.write_master_file = true
|
||||
};
|
||||
EndMessage end_message{};
|
||||
|
||||
pusher.StartDataCollection(message);
|
||||
for (int i = 0; i < nframes; i++) {
|
||||
DataMessage data_message;
|
||||
data_message.number = i;
|
||||
PrepareCBORImage(data_message, x, image1.data() + i * x.GetPixelsNum(), x.GetPixelsNum() * sizeof(uint16_t));
|
||||
serializer.SerializeImage(data_message);
|
||||
pusher.SendImage(serialization_buffer.data(), serializer.GetBufferSize(), i);
|
||||
}
|
||||
|
||||
pusher.EndDataCollection(end_message);
|
||||
});
|
||||
|
||||
std::thread puller_thread(test_puller, &puller, std::cref(x), std::cref(image1), 1, 0,
|
||||
std::ref(diff_split), std::ref(diff_size), std::ref(diff_content),
|
||||
std::ref(nimages));
|
||||
|
||||
sender_thread.join();
|
||||
puller_thread.join();
|
||||
|
||||
puller.Disconnect();
|
||||
|
||||
REQUIRE(nimages[0] == nframes);
|
||||
REQUIRE(diff_size[0] == 0);
|
||||
REQUIRE(diff_content[0] == 0);
|
||||
|
||||
ZMQMessage msg;
|
||||
REQUIRE(preview_sub_socket.Receive(msg));
|
||||
REQUIRE(preview_sub_socket.Receive(msg));
|
||||
REQUIRE(preview_sub_socket.Receive(msg));
|
||||
}
|
||||
|
||||
TEST_CASE("ZMQImageCommTest_2Writers","[ZeroMQ]") {
|
||||
const size_t nframes = 256;
|
||||
|
||||
ZMQContext context;
|
||||
Logger logger("test");
|
||||
DiffractionExperiment x(DetectorGeometry(1));
|
||||
x.Mode(DetectorMode::Raw);
|
||||
@@ -148,7 +221,7 @@ TEST_CASE("ZMQImageCommTest_2Writers","[ZeroMQ]") {
|
||||
for (int i = 0; i < npullers; i++)
|
||||
zmq_addr.push_back("ipc://*");
|
||||
|
||||
ZMQStream2PusherGroup pusher(context, zmq_addr);
|
||||
ZMQStream2Pusher pusher(zmq_addr);
|
||||
|
||||
// Puller needs to be declared first, but both objects need to exist till communication finished
|
||||
// TODO: ImageSender should not allow if there are still completions to be done
|
||||
@@ -156,7 +229,7 @@ TEST_CASE("ZMQImageCommTest_2Writers","[ZeroMQ]") {
|
||||
auto pusher_addr = pusher.GetAddress();
|
||||
REQUIRE(pusher_addr.size() == 2);
|
||||
for (int i = 0; i < npullers; i++) {
|
||||
puller.push_back(std::make_unique<ZMQImagePuller>(context));
|
||||
puller.push_back(std::make_unique<ZMQImagePuller>());
|
||||
puller[i]->Connect(pusher_addr[i]);
|
||||
}
|
||||
|
||||
@@ -213,7 +286,6 @@ TEST_CASE("ZMQImageCommTest_2Writers","[ZeroMQ]") {
|
||||
TEST_CASE("ZMQImageCommTest_4Writers","[ZeroMQ]") {
|
||||
const size_t nframes = 255;
|
||||
|
||||
ZMQContext context;
|
||||
Logger logger("test");
|
||||
DiffractionExperiment x(DetectorGeometry(1));
|
||||
x.Mode(DetectorMode::Raw);
|
||||
@@ -238,14 +310,14 @@ TEST_CASE("ZMQImageCommTest_4Writers","[ZeroMQ]") {
|
||||
for (int i = 0; i < npullers; i++)
|
||||
zmq_addr.push_back("ipc://*");
|
||||
|
||||
ZMQStream2PusherGroup pusher(context, zmq_addr);
|
||||
ZMQStream2Pusher pusher(zmq_addr);
|
||||
auto pusher_addr = pusher.GetAddress();
|
||||
REQUIRE(pusher_addr.size() == npullers);
|
||||
// Puller needs to be declared first, but both objects need to exist till communication finished
|
||||
// TODO: ImageSender should not allow if there are still completions to be done
|
||||
std::vector<std::unique_ptr<ZMQImagePuller> > puller;
|
||||
for (int i = 0; i < npullers; i++) {
|
||||
puller.push_back(std::make_unique<ZMQImagePuller>(context));
|
||||
puller.push_back(std::make_unique<ZMQImagePuller>());
|
||||
puller[i]->Connect(pusher_addr[i]);
|
||||
}
|
||||
|
||||
@@ -310,8 +382,7 @@ TEST_CASE("ZMQImagePuller_abort","[ZeroMQ]") {
|
||||
x.PedestalG0Frames(0).NumTriggers(1).UseInternalPacketGenerator(false).PhotonEnergy_keV(12.4)
|
||||
.ImagesPerTrigger(nframes);
|
||||
|
||||
ZMQContext context;
|
||||
ZMQImagePuller puller(context);
|
||||
ZMQImagePuller puller;
|
||||
|
||||
std::vector<size_t> diff_size(1), diff_content(1), diff_split(1), nimages(1);
|
||||
std::vector<uint16_t> image1(x.GetPixelsNum());
|
||||
@@ -325,7 +396,7 @@ TEST_CASE("ZMQImagePuller_abort","[ZeroMQ]") {
|
||||
}
|
||||
|
||||
TEST_CASE("ZMQImageCommTest_NoWriter","[ZeroMQ]") {
|
||||
ZMQStream2PusherGroup pusher({"ipc://*"});
|
||||
ZMQStream2Pusher pusher({"ipc://*"});
|
||||
StartMessage msg;
|
||||
REQUIRE_THROWS(pusher.StartDataCollection(msg));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user