mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2026-06-19 14:50:50 +02:00
added Matterhorn data class
This commit is contained in:
@@ -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 ®ister_) 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 ®ister_, 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));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user