|
|
|
@ -25,8 +25,8 @@
|
|
|
|
|
namespace sls {
|
|
|
|
|
|
|
|
|
|
// creating new shm
|
|
|
|
|
Module::Module(detectorType type, int det_id, int module_id, bool verify)
|
|
|
|
|
: moduleId(module_id), shm(det_id, module_id) {
|
|
|
|
|
Module::Module(detectorType type, int det_id, int module_index, bool verify)
|
|
|
|
|
: moduleIndex(module_index), shm(det_id, module_index) {
|
|
|
|
|
|
|
|
|
|
// ensure shared memory was not created before
|
|
|
|
|
if (shm.IsExisting()) {
|
|
|
|
@ -40,8 +40,8 @@ Module::Module(detectorType type, int det_id, int module_id, bool verify)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// opening existing shm
|
|
|
|
|
Module::Module(int det_id, int module_id, bool verify)
|
|
|
|
|
: moduleId(module_id), shm(det_id, module_id) {
|
|
|
|
|
Module::Module(int det_id, int module_index, bool verify)
|
|
|
|
|
: moduleIndex(module_index), shm(det_id, module_index) {
|
|
|
|
|
|
|
|
|
|
// getDetectorType From shm will check if existing
|
|
|
|
|
detectorType type = getDetectorTypeFromShm(det_id, verify);
|
|
|
|
@ -96,10 +96,6 @@ int64_t Module::getSerialNumber() const {
|
|
|
|
|
|
|
|
|
|
int Module::getModuleId() const { return sendToDetector<int>(F_GET_MODULE_ID); }
|
|
|
|
|
|
|
|
|
|
void Module::setModuleId(const int value) {
|
|
|
|
|
return sendToDetector(F_SET_MODULE_ID, value, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int64_t Module::getReceiverSoftwareVersion() const {
|
|
|
|
|
if (shm()->useReceiverFlag) {
|
|
|
|
|
return sendToReceiver<int64_t>(F_GET_RECEIVER_VERSION);
|
|
|
|
@ -142,7 +138,7 @@ slsDetectorDefs::xy Module::getNumberOfChannels() const {
|
|
|
|
|
|
|
|
|
|
void Module::updateNumberOfDetector(slsDetectorDefs::xy det) {
|
|
|
|
|
shm()->numberOfDetector = det;
|
|
|
|
|
int args[2] = {shm()->numberOfDetector.y, moduleId};
|
|
|
|
|
int args[2] = {shm()->numberOfDetector.y, moduleIndex};
|
|
|
|
|
sendToDetector(F_SET_POSITION, args, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -823,13 +819,13 @@ std::vector<uint64_t> Module::getNumMissingPackets() const {
|
|
|
|
|
auto client = ReceiverSocket(shm()->rxHostname, shm()->rxTCPPort);
|
|
|
|
|
client.Send(F_GET_NUM_MISSING_PACKETS);
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
throw RuntimeError("Receiver " + std::to_string(moduleId) +
|
|
|
|
|
throw RuntimeError("Receiver " + std::to_string(moduleIndex) +
|
|
|
|
|
" returned error: " + client.readErrorMessage());
|
|
|
|
|
} else {
|
|
|
|
|
auto nports = client.Receive<int>();
|
|
|
|
|
std::vector<uint64_t> retval(nports);
|
|
|
|
|
client.Receive(retval);
|
|
|
|
|
LOG(logDEBUG1) << "Missing packets of Receiver" << moduleId << ": "
|
|
|
|
|
LOG(logDEBUG1) << "Missing packets of Receiver" << moduleIndex << ": "
|
|
|
|
|
<< sls::ToString(retval);
|
|
|
|
|
return retval;
|
|
|
|
|
}
|
|
|
|
@ -997,7 +993,7 @@ void Module::setDestinationUDPIP(const IpAddr ip) {
|
|
|
|
|
if (shm()->useReceiverFlag) {
|
|
|
|
|
sls::MacAddr retval(0LU);
|
|
|
|
|
sendToReceiver(F_SET_RECEIVER_UDP_IP, ip, retval);
|
|
|
|
|
LOG(logINFO) << "Setting destination udp mac of detector " << moduleId
|
|
|
|
|
LOG(logINFO) << "Setting destination udp mac of detector " << moduleIndex
|
|
|
|
|
<< " to " << retval;
|
|
|
|
|
sendToDetector(F_SET_DEST_UDP_MAC, retval, nullptr);
|
|
|
|
|
}
|
|
|
|
@ -1017,7 +1013,7 @@ void Module::setDestinationUDPIP2(const IpAddr ip) {
|
|
|
|
|
if (shm()->useReceiverFlag) {
|
|
|
|
|
sls::MacAddr retval(0LU);
|
|
|
|
|
sendToReceiver(F_SET_RECEIVER_UDP_IP2, ip, retval);
|
|
|
|
|
LOG(logINFO) << "Setting destination udp mac2 of detector " << moduleId
|
|
|
|
|
LOG(logINFO) << "Setting destination udp mac2 of detector " << moduleIndex
|
|
|
|
|
<< " to " << retval;
|
|
|
|
|
sendToDetector(F_SET_DEST_UDP_MAC2, retval, nullptr);
|
|
|
|
|
}
|
|
|
|
@ -1075,7 +1071,7 @@ void Module::validateUDPConfiguration() {
|
|
|
|
|
|
|
|
|
|
std::string Module::printReceiverConfiguration() {
|
|
|
|
|
std::ostringstream os;
|
|
|
|
|
os << "\n\nDetector " << moduleId << "\nReceiver Hostname:\t"
|
|
|
|
|
os << "\n\nDetector " << moduleIndex << "\nReceiver Hostname:\t"
|
|
|
|
|
<< getReceiverHostname();
|
|
|
|
|
|
|
|
|
|
if (shm()->myDetectorType == JUNGFRAU) {
|
|
|
|
@ -1189,7 +1185,7 @@ void Module::setReceiverHostname(const std::string &receiverIP) {
|
|
|
|
|
retval.detType = shm()->myDetectorType;
|
|
|
|
|
retval.numberOfDetector.x = shm()->numberOfDetector.x;
|
|
|
|
|
retval.numberOfDetector.y = shm()->numberOfDetector.y;
|
|
|
|
|
retval.moduleId = moduleId;
|
|
|
|
|
retval.moduleIndex = moduleIndex;
|
|
|
|
|
memset(retval.hostname, 0, sizeof(retval.hostname));
|
|
|
|
|
strcpy_safe(retval.hostname, shm()->hostname);
|
|
|
|
|
|
|
|
|
@ -1199,13 +1195,13 @@ void Module::setReceiverHostname(const std::string &receiverIP) {
|
|
|
|
|
if (retval.udp_dstmac == 0 && retvals[0] != 0) {
|
|
|
|
|
LOG(logINFO) << "Setting destination udp mac of "
|
|
|
|
|
"detector "
|
|
|
|
|
<< moduleId << " to " << retvals[0];
|
|
|
|
|
<< moduleIndex << " to " << retvals[0];
|
|
|
|
|
sendToDetector(F_SET_DEST_UDP_MAC, retvals[0], nullptr);
|
|
|
|
|
}
|
|
|
|
|
if (retval.udp_dstmac2 == 0 && retvals[1] != 0) {
|
|
|
|
|
LOG(logINFO) << "Setting destination udp mac2 of "
|
|
|
|
|
"detector "
|
|
|
|
|
<< moduleId << " to " << retvals[1];
|
|
|
|
|
<< moduleIndex << " to " << retvals[1];
|
|
|
|
|
sendToDetector(F_SET_DEST_UDP_MAC2, retvals[1], nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1521,7 +1517,7 @@ void Module::sendReceiverRateCorrections(const std::vector<int64_t> &t) {
|
|
|
|
|
receiver.Send(static_cast<int>(t.size()));
|
|
|
|
|
receiver.Send(t);
|
|
|
|
|
if (receiver.Receive<int>() == FAIL) {
|
|
|
|
|
throw RuntimeError("Receiver " + std::to_string(moduleId) +
|
|
|
|
|
throw RuntimeError("Receiver " + std::to_string(moduleIndex) +
|
|
|
|
|
" returned error: " + receiver.readErrorMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1786,7 +1782,7 @@ void Module::sendVetoPhoton(const int chipIndex,
|
|
|
|
|
client.Send(gainIndices);
|
|
|
|
|
client.Send(values);
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
throw RuntimeError("Detector " + std::to_string(moduleId) +
|
|
|
|
|
throw RuntimeError("Detector " + std::to_string(moduleIndex) +
|
|
|
|
|
" returned error: " + client.readErrorMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1798,7 +1794,7 @@ void Module::getVetoPhoton(const int chipIndex,
|
|
|
|
|
client.Send(F_GET_VETO_PHOTON);
|
|
|
|
|
client.Send(chipIndex);
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
throw RuntimeError("Detector " + std::to_string(moduleId) +
|
|
|
|
|
throw RuntimeError("Detector " + std::to_string(moduleIndex) +
|
|
|
|
|
" returned error: " + client.readErrorMessage());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2033,7 +2029,7 @@ void Module::getBadChannels(const std::string &fname) const {
|
|
|
|
|
auto client = DetectorSocket(shm()->hostname, shm()->controlPort);
|
|
|
|
|
client.Send(F_GET_BAD_CHANNELS);
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
throw RuntimeError("Detector " + std::to_string(moduleId) +
|
|
|
|
|
throw RuntimeError("Detector " + std::to_string(moduleIndex) +
|
|
|
|
|
" returned error: " + client.readErrorMessage());
|
|
|
|
|
}
|
|
|
|
|
// receive badchannels
|
|
|
|
@ -2090,7 +2086,7 @@ void Module::setBadChannels(const std::string &fname) {
|
|
|
|
|
client.Send(badchannels);
|
|
|
|
|
}
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
throw RuntimeError("Detector " + std::to_string(moduleId) +
|
|
|
|
|
throw RuntimeError("Detector " + std::to_string(moduleIndex) +
|
|
|
|
|
" returned error: " + client.readErrorMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -2404,7 +2400,7 @@ std::map<std::string, std::string> Module::getAdditionalJsonHeader() const {
|
|
|
|
|
auto client = ReceiverSocket(shm()->rxHostname, shm()->rxTCPPort);
|
|
|
|
|
client.Send(F_GET_ADDITIONAL_JSON_HEADER);
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
throw RuntimeError("Receiver " + std::to_string(moduleId) +
|
|
|
|
|
throw RuntimeError("Receiver " + std::to_string(moduleIndex) +
|
|
|
|
|
" returned error: " + client.readErrorMessage());
|
|
|
|
|
} else {
|
|
|
|
|
auto size = client.Receive<int>();
|
|
|
|
@ -2453,7 +2449,7 @@ void Module::setAdditionalJsonHeader(
|
|
|
|
|
client.Send(&buff[0], buff.size());
|
|
|
|
|
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
throw RuntimeError("Receiver " + std::to_string(moduleId) +
|
|
|
|
|
throw RuntimeError("Receiver " + std::to_string(moduleIndex) +
|
|
|
|
|
" returned error: " + client.readErrorMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -3007,7 +3003,7 @@ slsDetectorDefs::detectorType Module::getDetectorTypeFromShm(int det_id,
|
|
|
|
|
shm.OpenSharedMemory();
|
|
|
|
|
if (verify && shm()->shmversion != SLS_SHMVERSION) {
|
|
|
|
|
std::ostringstream ss;
|
|
|
|
|
ss << "Single shared memory (" << det_id << "-" << moduleId
|
|
|
|
|
ss << "Single shared memory (" << det_id << "-" << moduleIndex
|
|
|
|
|
<< ":)version mismatch (expected 0x" << std::hex << SLS_SHMVERSION
|
|
|
|
|
<< " but got 0x" << shm()->shmversion << ")" << std::dec
|
|
|
|
|
<< ". Clear Shared memory to continue.";
|
|
|
|
@ -3018,7 +3014,7 @@ slsDetectorDefs::detectorType Module::getDetectorTypeFromShm(int det_id,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Module::initSharedMemory(detectorType type, int det_id, bool verify) {
|
|
|
|
|
shm = SharedMemory<sharedSlsDetector>(det_id, moduleId);
|
|
|
|
|
shm = SharedMemory<sharedSlsDetector>(det_id, moduleIndex);
|
|
|
|
|
if (!shm.IsExisting()) {
|
|
|
|
|
shm.CreateSharedMemory();
|
|
|
|
|
initializeDetectorStructure(type);
|
|
|
|
@ -3026,7 +3022,7 @@ void Module::initSharedMemory(detectorType type, int det_id, bool verify) {
|
|
|
|
|
shm.OpenSharedMemory();
|
|
|
|
|
if (verify && shm()->shmversion != SLS_SHMVERSION) {
|
|
|
|
|
std::ostringstream ss;
|
|
|
|
|
ss << "Single shared memory (" << det_id << "-" << moduleId
|
|
|
|
|
ss << "Single shared memory (" << det_id << "-" << moduleIndex
|
|
|
|
|
<< ":) version mismatch (expected 0x" << std::hex
|
|
|
|
|
<< SLS_SHMVERSION << " but got 0x" << shm()->shmversion << ")"
|
|
|
|
|
<< std::dec << ". Clear Shared memory to continue.";
|
|
|
|
@ -3048,7 +3044,7 @@ void Module::initializeDetectorStructure(detectorType type) {
|
|
|
|
|
shm()->rxTCPPort = DEFAULT_PORTNO + 2;
|
|
|
|
|
shm()->useReceiverFlag = false;
|
|
|
|
|
shm()->zmqport = DEFAULT_ZMQ_CL_PORTNO +
|
|
|
|
|
(moduleId * ((shm()->myDetectorType == EIGER) ? 2 : 1));
|
|
|
|
|
(moduleIndex * ((shm()->myDetectorType == EIGER) ? 2 : 1));
|
|
|
|
|
shm()->zmqip = IpAddr{};
|
|
|
|
|
shm()->numUDPInterfaces = 1;
|
|
|
|
|
shm()->stoppedFlag = false;
|
|
|
|
@ -3161,7 +3157,7 @@ void Module::setModule(sls_detector_module &module, bool trimbits) {
|
|
|
|
|
client.Send(F_SET_MODULE);
|
|
|
|
|
sendModule(&module, client);
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
throw RuntimeError("Detector " + std::to_string(moduleId) +
|
|
|
|
|
throw RuntimeError("Detector " + std::to_string(moduleIndex) +
|
|
|
|
|
" returned error: " + client.readErrorMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -3174,7 +3170,7 @@ void Module::updateReceiverStreamingIP() {
|
|
|
|
|
if (ip == 0) {
|
|
|
|
|
ip = HostnameToIp(shm()->rxHostname);
|
|
|
|
|
}
|
|
|
|
|
LOG(logINFO) << "Setting default receiver " << moduleId
|
|
|
|
|
LOG(logINFO) << "Setting default receiver " << moduleIndex
|
|
|
|
|
<< " streaming zmq ip to " << ip;
|
|
|
|
|
}
|
|
|
|
|
setReceiverStreamingIP(ip);
|
|
|
|
@ -3412,20 +3408,20 @@ void Module::programFPGAviaBlackfin(std::vector<char> buffer) {
|
|
|
|
|
uint64_t filesize = buffer.size();
|
|
|
|
|
// send program from memory to detector
|
|
|
|
|
LOG(logINFO) << "Sending programming binary (from pof) to detector "
|
|
|
|
|
<< moduleId << " (" << shm()->hostname << ")";
|
|
|
|
|
<< moduleIndex << " (" << shm()->hostname << ")";
|
|
|
|
|
auto client = DetectorSocket(shm()->hostname, shm()->controlPort);
|
|
|
|
|
client.Send(F_PROGRAM_FPGA);
|
|
|
|
|
client.Send(filesize);
|
|
|
|
|
// error in detector at opening file pointer to flash
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
std::ostringstream os;
|
|
|
|
|
os << "Detector " << moduleId << " (" << shm()->hostname << ")"
|
|
|
|
|
os << "Detector " << moduleIndex << " (" << shm()->hostname << ")"
|
|
|
|
|
<< " returned error: " << client.readErrorMessage();
|
|
|
|
|
throw RuntimeError(os.str());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// erasing flash
|
|
|
|
|
LOG(logINFO) << "Erasing Flash for detector " << moduleId << " ("
|
|
|
|
|
LOG(logINFO) << "Erasing Flash for detector " << moduleIndex << " ("
|
|
|
|
|
<< shm()->hostname << ")";
|
|
|
|
|
printf("%d%%\r", 0);
|
|
|
|
|
std::cout << std::flush;
|
|
|
|
@ -3443,7 +3439,7 @@ void Module::programFPGAviaBlackfin(std::vector<char> buffer) {
|
|
|
|
|
std::cout << std::flush;
|
|
|
|
|
}
|
|
|
|
|
printf("\n");
|
|
|
|
|
LOG(logINFO) << "Writing to Flash to detector " << moduleId << " ("
|
|
|
|
|
LOG(logINFO) << "Writing to Flash to detector " << moduleIndex << " ("
|
|
|
|
|
<< shm()->hostname << ")";
|
|
|
|
|
printf("%d%%\r", 0);
|
|
|
|
|
std::cout << std::flush;
|
|
|
|
@ -3464,7 +3460,7 @@ void Module::programFPGAviaBlackfin(std::vector<char> buffer) {
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
std::cout << '\n';
|
|
|
|
|
std::ostringstream os;
|
|
|
|
|
os << "Detector " << moduleId << " (" << shm()->hostname << ")"
|
|
|
|
|
os << "Detector " << moduleIndex << " (" << shm()->hostname << ")"
|
|
|
|
|
<< " returned error: " << client.readErrorMessage();
|
|
|
|
|
throw RuntimeError(os.str());
|
|
|
|
|
}
|
|
|
|
@ -3483,7 +3479,7 @@ void Module::programFPGAviaBlackfin(std::vector<char> buffer) {
|
|
|
|
|
// fpga has picked up from flash successfully
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
std::ostringstream os;
|
|
|
|
|
os << "Detector " << moduleId << " (" << shm()->hostname << ")"
|
|
|
|
|
os << "Detector " << moduleIndex << " (" << shm()->hostname << ")"
|
|
|
|
|
<< " returned error: " << client.readErrorMessage();
|
|
|
|
|
throw RuntimeError(os.str());
|
|
|
|
|
}
|
|
|
|
@ -3494,7 +3490,7 @@ void Module::programFPGAviaBlackfin(std::vector<char> buffer) {
|
|
|
|
|
|
|
|
|
|
void Module::programFPGAviaNios(std::vector<char> buffer) {
|
|
|
|
|
LOG(logINFO) << "Sending programming binary (from rbf) to detector "
|
|
|
|
|
<< moduleId << " (" << shm()->hostname << ")";
|
|
|
|
|
<< moduleIndex << " (" << shm()->hostname << ")";
|
|
|
|
|
|
|
|
|
|
auto client = DetectorSocket(shm()->hostname, shm()->controlPort);
|
|
|
|
|
client.Send(F_PROGRAM_FPGA);
|
|
|
|
@ -3502,14 +3498,14 @@ void Module::programFPGAviaNios(std::vector<char> buffer) {
|
|
|
|
|
client.Send(filesize);
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
std::ostringstream os;
|
|
|
|
|
os << "Detector " << moduleId << " (" << shm()->hostname << ")"
|
|
|
|
|
os << "Detector " << moduleIndex << " (" << shm()->hostname << ")"
|
|
|
|
|
<< " returned error: " << client.readErrorMessage();
|
|
|
|
|
throw RuntimeError(os.str());
|
|
|
|
|
}
|
|
|
|
|
client.Send(buffer);
|
|
|
|
|
if (client.Receive<int>() == FAIL) {
|
|
|
|
|
std::ostringstream os;
|
|
|
|
|
os << "Detector " << moduleId << " (" << shm()->hostname << ")"
|
|
|
|
|
os << "Detector " << moduleIndex << " (" << shm()->hostname << ")"
|
|
|
|
|
<< " returned error: " << client.readErrorMessage();
|
|
|
|
|
throw RuntimeError(os.str());
|
|
|
|
|
}
|
|
|
|
|