added Matterhorn data class

This commit is contained in:
2026-05-01 16:47:25 +02:00
parent ff9f7c2795
commit 008c09cf04
8 changed files with 99 additions and 21 deletions
@@ -53,6 +53,10 @@ class BaseMatterhornServer
ReturnCode get_receiver_parameters(ServerInterface &socket) const;
ReturnCode get_num_frames(ServerInterface &socket) const;
uint64_t get_frames() const;
/**
* @brief call function corresponding to the function ID received from the
* client and send back the result
@@ -150,7 +154,7 @@ ReturnCode BaseMatterhornServer<DerivedServer>::get_receiver_parameters(
rx_params.udp_dstmac = this->udpDetails[0].dstmac;
rx_params.frames = static_cast<const DerivedServer *>(this)->get_frames();
rx_params.frames = get_frames();
// rx_params.triggers = 0;
@@ -168,9 +172,17 @@ ReturnCode BaseMatterhornServer<DerivedServer>::get_receiver_parameters(
}
template <typename DerivedServer>
int64_t BaseMatterhornServer<DerivedServer>::getNumFrames() const {
// bus_r(Reg::MH_SM_Frames_Reg);
return 0; // TODO: implement
ReturnCode BaseMatterhornServer<DerivedServer>::get_num_frames(
ServerInterface &socket) const {
uint64_t num_frames = get_frames();
return static_cast<ReturnCode>(socket.sendResult(num_frames));
}
template <typename DerivedServer>
uint64_t BaseMatterhornServer<DerivedServer>::get_frames() const {
return static_cast<uint64_t>(
busCommunication.readRegister(Reg::MH_SM_Frames_Reg));
}
} // namespace sls
@@ -41,6 +41,10 @@ struct IpCoreRegisterBlock<IPCore, MemoryModel> {
return memoryblocks_;
}
const std::map<IPCore, MemoryModel> &operator()() const {
return memoryblocks_;
}
private:
std::map<IPCore, MemoryModel> memoryblocks_;
};
@@ -21,8 +21,6 @@ class VirtualMatterhornServer
ReturnCode initial_checks(ServerInterface &socket);
ReturnCode get_run_status(ServerInterface &socket) const;
size_t get_frames() const;
};
} // namespace sls
@@ -45,9 +45,4 @@ VirtualMatterhornServer::get_run_status(ServerInterface &socket) const {
return static_cast<ReturnCode>(socket.sendResult(status));
}
size_t VirtualMatterhornServer::get_frames() const {
// TODO: dummy implementation for now
return 0;
}
} // namespace sls
@@ -17,6 +17,10 @@ namespace sls {
template <typename IPCoreEnumType, typename MemoryModel>
struct IpCoreRegisterBlock {
const std::map<IPCoreEnumType, MemoryModel> &operator()() const {
return memoryblocks_;
}
std::map<IPCoreEnumType, MemoryModel> &operator()() {
return memoryblocks_;
}
@@ -40,10 +44,10 @@ class BusCommunication {
/// @brief stores register blocks for each IP core
IpCoreRegisterBlock<IPCoreEnumType, MemoryModel> ipcoreregisterblocks;
void bus_w(const uint32_t offset, const uint32_t baseadress,
void bus_w(const uint32_t offset, IPCoreEnumType baseadress,
const uint32_t data) const;
uint32_t bus_r(const uint32_t offset, const uint32_t baseadress) const;
uint32_t bus_r(const uint32_t offset, IPCoreEnumType baseadress) const;
};
template <typename IPCoreEnumType, typename MemoryModel>
@@ -57,30 +61,28 @@ void BusCommunication<IPCoreEnumType, MemoryModel>::mapToMemory() {
template <typename IPCoreEnumType, typename MemoryModel>
uint32_t BusCommunication<IPCoreEnumType, MemoryModel>::readRegister(
const Register &register_) const {
return bus_r(register_.offset_in_bytes,
static_cast<uint32_t>(register_.ip_core));
return bus_r(register_.offset_in_bytes, register_.ip_core);
}
template <typename IPCoreEnumType, typename MemoryModel>
void BusCommunication<IPCoreEnumType, MemoryModel>::writeRegister(
const Register &register_, const uint32_t data) const {
bus_w(register_.offset_in_bytes, static_cast<uint32_t>(register_.ip_core),
data);
bus_w(register_.offset_in_bytes, register_.ip_core, data);
}
template <typename IPCoreEnumType, typename MemoryModel>
uint32_t BusCommunication<IPCoreEnumType, MemoryModel>::bus_r(
const uint32_t offset, const uint32_t baseadress) const {
auto ptr1 = ipcoreregisterblocks()[baseadress].getMappedMemoryPtr() +
const uint32_t offset, const IPCoreEnumType baseadress) const {
auto ptr1 = ipcoreregisterblocks().at(baseadress).getMappedMemoryPtr() +
offset / (sizeof(uint32_t));
return *ptr1;
}
template <typename IPCoreEnumType, typename MemoryModel>
void BusCommunication<IPCoreEnumType, MemoryModel>::bus_w(
const uint32_t offset, const uint32_t baseadress,
const uint32_t offset, const IPCoreEnumType baseadress,
const uint32_t data) const {
auto ptr1 = ipcoreregisterblocks()[baseadress].getMappedMemoryPtr() +
auto ptr1 = ipcoreregisterblocks().at(baseadress).getMappedMemoryPtr() +
offset / (sizeof(uint32_t));
*ptr1 = data;
}
@@ -450,6 +450,7 @@ void ClientInterface::setDetectorType(detectorType arg) {
case MOENCH:
case MYTHEN3:
case GOTTHARD2:
case MATTERHORN:
break;
default:
throw RuntimeError("Unknown detector type: " + std::to_string(arg));
+62
View File
@@ -468,6 +468,68 @@ class Mythen3Data : public GeneralData {
};
};
class MatterhornData : public GeneralData {
public:
MatterhornData() {
detType = slsDetectorDefs::MATTERHORN;
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
framesPerFile = 10000; // TODO: dummy value
fifoDepth = 50000; // TODO: dummy value
standardheader = true;
// udpSocketBufferSize = 0; // TODO: dummy value
dynamicRange = 16; // default
tengigaEnable = true; // TODO: not sure
SetCounterMask(0xf); // default all 4 counters enabled
UpdateImageSize();
};
void SetDynamicRange(int dr) {
dynamicRange = dr;
UpdateImageSize();
};
void SetCounterMask(const int mask) {
int n = __builtin_popcount(mask);
if (n < 1 || n > 4) {
throw RuntimeError("Invalid number of counters " +
std::to_string(n) + ". Expected 1-4.");
}
counterMask = mask;
ncounters = n;
UpdateImageSize();
};
private:
void UpdateImageSize() {
nPixelsX = (nChannelsX * ncounters);
nPixelsY = (nChannelsY * ncounters);
imageSize = nPixelsX * nPixelsY * GetPixelDepth();
LOG(logINFO) << "imageSize: " << imageSize;
actualImageSize = imageSize;
// 10g
// TODO: dont know what to do here
/*
if (tengigaEnable) {
}
// 1g
else {
}
*/
LOG(logINFO) << "Packets Per Frame: " << packetsPerFrame;
packetSize = headerSizeinPacket + dataSize;
LOG(logINFO) << "PacketSize: " << packetSize;
};
private:
int ncounters{0};
int nChannelsX{1024};
int nChannelsY{512};
};
class Gotthard2Data : public GeneralData {
public:
Gotthard2Data() {
@@ -118,6 +118,7 @@ void Implementation::setDetectorType(const detectorType d) {
case XILINX_CHIPTESTBOARD:
case MYTHEN3:
case GOTTHARD2:
case MATTERHORN:
LOG(logINFO) << " ***** " << ToString(d) << " Receiver *****";
break;
default:
@@ -151,6 +152,9 @@ void Implementation::setDetectorType(const detectorType d) {
case GOTTHARD2:
generalData = new Gotthard2Data();
break;
case MATTERHORN:
generalData = new MatterhornData();
break;
default:
break;
}