diff --git a/slsDetectorServers/matterhornServer/include/BaseMatterhornServer.h b/slsDetectorServers/matterhornServer/include/BaseMatterhornServer.h index dbd4c400a..c3122b8c2 100644 --- a/slsDetectorServers/matterhornServer/include/BaseMatterhornServer.h +++ b/slsDetectorServers/matterhornServer/include/BaseMatterhornServer.h @@ -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::get_receiver_parameters( rx_params.udp_dstmac = this->udpDetails[0].dstmac; - rx_params.frames = static_cast(this)->get_frames(); + rx_params.frames = get_frames(); // rx_params.triggers = 0; @@ -168,9 +172,17 @@ ReturnCode BaseMatterhornServer::get_receiver_parameters( } template -int64_t BaseMatterhornServer::getNumFrames() const { - // bus_r(Reg::MH_SM_Frames_Reg); - return 0; // TODO: implement +ReturnCode BaseMatterhornServer::get_num_frames( + ServerInterface &socket) const { + + uint64_t num_frames = get_frames(); + return static_cast(socket.sendResult(num_frames)); +} + +template +uint64_t BaseMatterhornServer::get_frames() const { + return static_cast( + busCommunication.readRegister(Reg::MH_SM_Frames_Reg)); } } // namespace sls \ No newline at end of file diff --git a/slsDetectorServers/matterhornServer/include/SpecializedTemplates.h b/slsDetectorServers/matterhornServer/include/SpecializedTemplates.h index 00e27cd2e..6dd2eefaa 100644 --- a/slsDetectorServers/matterhornServer/include/SpecializedTemplates.h +++ b/slsDetectorServers/matterhornServer/include/SpecializedTemplates.h @@ -41,6 +41,10 @@ struct IpCoreRegisterBlock { return memoryblocks_; } + const std::map &operator()() const { + return memoryblocks_; + } + private: std::map memoryblocks_; }; diff --git a/slsDetectorServers/matterhornServer/include/VirtualMatterhornServer.h b/slsDetectorServers/matterhornServer/include/VirtualMatterhornServer.h index 1d5c54765..00377bf50 100644 --- a/slsDetectorServers/matterhornServer/include/VirtualMatterhornServer.h +++ b/slsDetectorServers/matterhornServer/include/VirtualMatterhornServer.h @@ -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 \ No newline at end of file diff --git a/slsDetectorServers/matterhornServer/src/VirtualMatterhornServer.cpp b/slsDetectorServers/matterhornServer/src/VirtualMatterhornServer.cpp index f044ec9b1..4adc1e1b0 100644 --- a/slsDetectorServers/matterhornServer/src/VirtualMatterhornServer.cpp +++ b/slsDetectorServers/matterhornServer/src/VirtualMatterhornServer.cpp @@ -45,9 +45,4 @@ VirtualMatterhornServer::get_run_status(ServerInterface &socket) const { return static_cast(socket.sendResult(status)); } -size_t VirtualMatterhornServer::get_frames() const { - // TODO: dummy implementation for now - return 0; -} - } // namespace sls \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer_cpp/include/ArmBusCommunication.hpp b/slsDetectorServers/slsDetectorServer_cpp/include/ArmBusCommunication.hpp index 4e2c82936..f1a80947d 100644 --- a/slsDetectorServers/slsDetectorServer_cpp/include/ArmBusCommunication.hpp +++ b/slsDetectorServers/slsDetectorServer_cpp/include/ArmBusCommunication.hpp @@ -17,6 +17,10 @@ namespace sls { template struct IpCoreRegisterBlock { + const std::map &operator()() const { + return memoryblocks_; + } + std::map &operator()() { return memoryblocks_; } @@ -40,10 +44,10 @@ class BusCommunication { /// @brief stores register blocks for each IP core IpCoreRegisterBlock 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 @@ -57,30 +61,28 @@ void BusCommunication::mapToMemory() { template uint32_t BusCommunication::readRegister( const Register ®ister_) const { - return bus_r(register_.offset_in_bytes, - static_cast(register_.ip_core)); + return bus_r(register_.offset_in_bytes, register_.ip_core); } template void BusCommunication::writeRegister( const Register ®ister_, const uint32_t data) const { - bus_w(register_.offset_in_bytes, static_cast(register_.ip_core), - data); + bus_w(register_.offset_in_bytes, register_.ip_core, data); } template uint32_t BusCommunication::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 void BusCommunication::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; } diff --git a/slsReceiverSoftware/src/ClientInterface.cpp b/slsReceiverSoftware/src/ClientInterface.cpp index 0c08534a8..32093a73d 100644 --- a/slsReceiverSoftware/src/ClientInterface.cpp +++ b/slsReceiverSoftware/src/ClientInterface.cpp @@ -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)); diff --git a/slsReceiverSoftware/src/GeneralData.h b/slsReceiverSoftware/src/GeneralData.h index b5b6e0b26..a17a452b8 100644 --- a/slsReceiverSoftware/src/GeneralData.h +++ b/slsReceiverSoftware/src/GeneralData.h @@ -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() { diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index 292c5df29..6fff07b23 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -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; }